@logixjs/sandbox 0.0.1 → 0.0.2
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/LICENSE +201 -0
- package/package.json +3 -1
- package/public/sandbox/chunks/chunk-2AUQRESB.js +1114 -0
- package/public/sandbox/chunks/chunk-2F72LQKW.js +194 -0
- package/public/sandbox/chunks/chunk-2PYDGDD3.js +4071 -0
- package/public/sandbox/chunks/chunk-2UGKSXDZ.js +16 -0
- package/public/sandbox/chunks/chunk-2XVE7F26.js +153 -0
- package/public/sandbox/chunks/chunk-3A7TFNZN.js +219 -0
- package/public/sandbox/chunks/chunk-3BHC6JAV.js +1070 -0
- package/public/sandbox/chunks/chunk-3U4CAKCX.js +61 -0
- package/public/sandbox/chunks/chunk-3VU3JLZO.js +272 -0
- package/public/sandbox/chunks/chunk-4CPONKWY.js +1170 -0
- package/public/sandbox/chunks/chunk-4GMUQTWH.js +850 -0
- package/public/sandbox/chunks/chunk-4KIYG5E4.js +749 -0
- package/public/sandbox/chunks/chunk-4MY35XR3.js +175 -0
- package/public/sandbox/chunks/chunk-5DNHJMHA.js +69 -0
- package/public/sandbox/chunks/chunk-5EC4S7X6.js +42 -0
- package/public/sandbox/chunks/chunk-5FB7QFSH.js +227 -0
- package/public/sandbox/chunks/chunk-5GEYCJW2.js +206 -0
- package/public/sandbox/chunks/chunk-5PT7Q5SS.js +373 -0
- package/public/sandbox/chunks/chunk-5WN5IGKA.js +166 -0
- package/public/sandbox/chunks/chunk-5XOBKSOT.js +213 -0
- package/public/sandbox/chunks/chunk-67RVISUC.js +313 -0
- package/public/sandbox/chunks/chunk-6ELJEKZS.js +12 -0
- package/public/sandbox/chunks/chunk-6FKWRVP4.js +85 -0
- package/public/sandbox/chunks/chunk-6JRP52YT.js +34 -0
- package/public/sandbox/chunks/chunk-6JYAC3G6.js +42 -0
- package/public/sandbox/chunks/chunk-6TUOP63Q.js +86 -0
- package/public/sandbox/chunks/{chunk-A6JFUNQQ.js → chunk-74C5VW7Z.js} +2 -2
- package/public/sandbox/chunks/chunk-75DQFC5M.js +16 -0
- package/public/sandbox/chunks/{chunk-UCFEP3BH.js → chunk-7GPAF2UK.js} +1 -1
- package/public/sandbox/chunks/chunk-7KQFTS2Y.js +135 -0
- package/public/sandbox/chunks/chunk-7POKWYE3.js +112 -0
- package/public/sandbox/chunks/chunk-7VUEF5F3.js +395 -0
- package/public/sandbox/chunks/chunk-7W5APZS2.js +77 -0
- package/public/sandbox/chunks/chunk-A6OFCXDQ.js +397 -0
- package/public/sandbox/chunks/chunk-A7HLOSO6.js +216 -0
- package/public/sandbox/chunks/chunk-AGF4RRCB.js +408 -0
- package/public/sandbox/chunks/chunk-ASJSJAAL.js +122 -0
- package/public/sandbox/chunks/chunk-ASVMK364.js +283 -0
- package/public/sandbox/chunks/chunk-AUDTI2BQ.js +895 -0
- package/public/sandbox/chunks/chunk-B2SZTA3M.js +16 -0
- package/public/sandbox/chunks/chunk-B6YS2UMV.js +372 -0
- package/public/sandbox/chunks/chunk-BCEO3MGD.js +244 -0
- package/public/sandbox/chunks/chunk-BCOO65D4.js +373 -0
- package/public/sandbox/chunks/chunk-BJOWSSEL.js +38 -0
- package/public/sandbox/chunks/chunk-BS2WBFW4.js +373 -0
- package/public/sandbox/chunks/chunk-BUVHG3NJ.js +439 -0
- package/public/sandbox/chunks/chunk-BVE33AN6.js +42 -0
- package/public/sandbox/chunks/chunk-BWTGJZVP.js +19 -0
- package/public/sandbox/chunks/chunk-BXD7GZC3.js +1025 -0
- package/public/sandbox/chunks/chunk-BZH4EUUD.js +164 -0
- package/public/sandbox/chunks/{chunk-HFV5GJPK.js → chunk-C2MYMMO4.js} +3 -3
- package/public/sandbox/chunks/chunk-CRE4NJJ6.js +271 -0
- package/public/sandbox/chunks/chunk-CVZPRIDB.js +706 -0
- package/public/sandbox/chunks/chunk-CWOXD5NG.js +991 -0
- package/public/sandbox/chunks/chunk-D6DOC3BJ.js +373 -0
- package/public/sandbox/chunks/chunk-DEPSGFSY.js +1698 -0
- package/public/sandbox/chunks/chunk-DM7C5NP5.js +819 -0
- package/public/sandbox/chunks/chunk-DN33LMOF.js +1112 -0
- package/public/sandbox/chunks/{chunk-S46P7MC6.js → chunk-DT7YIIWE.js} +2 -2
- package/public/sandbox/chunks/chunk-DVB5WRCI.js +260 -0
- package/public/sandbox/chunks/{chunk-TOHCFMQS.js → chunk-E3EVW7NR.js} +11 -18
- package/public/sandbox/chunks/chunk-E5BV567Q.js +417 -0
- package/public/sandbox/chunks/chunk-E7BIWMQQ.js +203 -0
- package/public/sandbox/chunks/chunk-EAKGPSOQ.js +83 -0
- package/public/sandbox/chunks/chunk-EGUYL2ER.js +75 -0
- package/public/sandbox/chunks/chunk-EP5GQYZ5.js +85 -0
- package/public/sandbox/chunks/chunk-ET6CJEHC.js +221 -0
- package/public/sandbox/chunks/chunk-EU67YZHZ.js +1070 -0
- package/public/sandbox/chunks/{chunk-PTSJJANP.js → chunk-EYNDQLSB.js} +1 -1
- package/public/sandbox/chunks/{chunk-CEGSWZ5S.js → chunk-EZTMVCJF.js} +1 -1
- package/public/sandbox/chunks/chunk-F5CLVIS6.js +907 -0
- package/public/sandbox/chunks/chunk-F743SKYD.js +85 -0
- package/public/sandbox/chunks/chunk-FEGFZ5OX.js +86 -0
- package/public/sandbox/chunks/chunk-FG5B7ZX3.js +373 -0
- package/public/sandbox/chunks/chunk-FKZPYMDG.js +373 -0
- package/public/sandbox/chunks/chunk-FNLXHWIU.js +220 -0
- package/public/sandbox/chunks/chunk-FQRUTYAD.js +1991 -0
- package/public/sandbox/chunks/{chunk-VLYP4WUS.js → chunk-FY5A73NK.js} +5 -5
- package/public/sandbox/chunks/chunk-G7FAOG3O.js +221 -0
- package/public/sandbox/chunks/chunk-GFXHUC7Y.js +73 -0
- package/public/sandbox/chunks/chunk-GIPXUIZQ.js +534 -0
- package/public/sandbox/chunks/chunk-GP37MEGJ.js +52 -0
- package/public/sandbox/chunks/chunk-GXL5QCMF.js +4511 -0
- package/public/sandbox/chunks/chunk-GZ2NSE6A.js +177 -0
- package/public/sandbox/chunks/chunk-GZATW4YD.js +69 -0
- package/public/sandbox/chunks/chunk-H4EBXROQ.js +166 -0
- package/public/sandbox/chunks/chunk-HETCPK6Z.js +153 -0
- package/public/sandbox/chunks/chunk-HGUFQ2QC.js +4431 -0
- package/public/sandbox/chunks/chunk-HGV3VNH3.js +255 -0
- package/public/sandbox/chunks/chunk-HIJ67QWR.js +5397 -0
- package/public/sandbox/chunks/chunk-IDHERBKW.js +1114 -0
- package/public/sandbox/chunks/chunk-IDTK4FIY.js +102 -0
- package/public/sandbox/chunks/chunk-ILFVY7H5.js +164 -0
- package/public/sandbox/chunks/chunk-ISGSRYGO.js +57 -0
- package/public/sandbox/chunks/chunk-J45VPU24.js +408 -0
- package/public/sandbox/chunks/chunk-JAUIM3O5.js +42 -0
- package/public/sandbox/chunks/chunk-JB7OQEM6.js +373 -0
- package/public/sandbox/chunks/chunk-JCKW6NHD.js +15 -0
- package/public/sandbox/chunks/chunk-JMA7GY7Z.js +221 -0
- package/public/sandbox/chunks/chunk-JY46J6IL.js +836 -0
- package/public/sandbox/chunks/{chunk-X72PZOFA.js → chunk-K2MQ66O7.js} +1 -1
- package/public/sandbox/chunks/chunk-KA7PZA6F.js +464 -0
- package/public/sandbox/chunks/chunk-KDEQTUID.js +102 -0
- package/public/sandbox/chunks/chunk-KDJR27JV.js +1696 -0
- package/public/sandbox/chunks/chunk-KFE3JO6N.js +77 -0
- package/public/sandbox/chunks/chunk-KLDSYWT5.js +536 -0
- package/public/sandbox/chunks/chunk-KQWWFYBF.js +203 -0
- package/public/sandbox/chunks/chunk-KTFZSXOW.js +6473 -0
- package/public/sandbox/chunks/chunk-KXVIC55U.js +108 -0
- package/public/sandbox/chunks/{chunk-HNEDTEGQ.js → chunk-L4PNO2H6.js} +1 -1
- package/public/sandbox/chunks/{chunk-WE4STGO2.js → chunk-L4ZNW5DI.js} +2 -2
- package/public/sandbox/chunks/chunk-LBUINGZ4.js +836 -0
- package/public/sandbox/chunks/chunk-LIYPPU6I.js +112 -0
- package/public/sandbox/chunks/chunk-LJHTOJXW.js +221 -0
- package/public/sandbox/chunks/{chunk-BWSNPKO5.js → chunk-LQL23SWJ.js} +2 -2
- package/public/sandbox/chunks/chunk-LTFCYZQ6.js +46 -0
- package/public/sandbox/chunks/chunk-LTWLVCKQ.js +166 -0
- package/public/sandbox/chunks/chunk-LWI7BXFN.js +395 -0
- package/public/sandbox/chunks/chunk-LYBBX6WM.js +225 -0
- package/public/sandbox/chunks/chunk-MXE7HIBM.js +474 -0
- package/public/sandbox/chunks/chunk-MYBDYNK4.js +6004 -0
- package/public/sandbox/chunks/chunk-NC2MIWZX.js +732 -0
- package/public/sandbox/chunks/chunk-NE447XAF.js +597 -0
- package/public/sandbox/chunks/chunk-NEAYV5C2.js +255 -0
- package/public/sandbox/chunks/chunk-NMGFJZ4I.js +26 -0
- package/public/sandbox/chunks/chunk-NWCJJZNQ.js +71 -0
- package/public/sandbox/chunks/chunk-O57OZBDR.js +214 -0
- package/public/sandbox/chunks/chunk-OJJT664Q.js +731 -0
- package/public/sandbox/chunks/chunk-OKTBUTCH.js +1175 -0
- package/public/sandbox/chunks/chunk-OQ4SYV5D.js +534 -0
- package/public/sandbox/chunks/chunk-OTVVIHJD.js +219 -0
- package/public/sandbox/chunks/chunk-OWTMSCF7.js +1052 -0
- package/public/sandbox/chunks/chunk-P5ZQNFC3.js +122 -0
- package/public/sandbox/chunks/chunk-PBPT2U2N.js +1698 -0
- package/public/sandbox/chunks/chunk-PHBJLCP3.js +836 -0
- package/public/sandbox/chunks/chunk-PHV4HYHB.js +397 -0
- package/public/sandbox/chunks/chunk-PIXQ6SOX.js +4071 -0
- package/public/sandbox/chunks/chunk-PKJL6YLK.js +73 -0
- package/public/sandbox/chunks/chunk-PKPOITIU.js +221 -0
- package/public/sandbox/chunks/{chunk-NQW73ACJ.js → chunk-PMXBOYQI.js} +1 -1
- package/public/sandbox/chunks/chunk-PQLZD7NR.js +836 -0
- package/public/sandbox/chunks/chunk-QEESVOZU.js +16 -0
- package/public/sandbox/chunks/chunk-QGIM3FQK.js +159 -0
- package/public/sandbox/chunks/chunk-QL5JNEDO.js +69 -0
- package/public/sandbox/chunks/chunk-QQOZ3RMH.js +867 -0
- package/public/sandbox/chunks/chunk-QUMEVT2F.js +194 -0
- package/public/sandbox/chunks/chunk-QVZBXYVY.js +102 -0
- package/public/sandbox/chunks/chunk-R5HQS6RB.js +135 -0
- package/public/sandbox/chunks/chunk-R75Q2CTT.js +900 -0
- package/public/sandbox/chunks/chunk-RBB6SHW2.js +253 -0
- package/public/sandbox/chunks/chunk-RDHNRWQP.js +383 -0
- package/public/sandbox/chunks/chunk-RIWOEI3T.js +1101 -0
- package/public/sandbox/chunks/chunk-RS5FFPUV.js +103 -0
- package/public/sandbox/chunks/chunk-RYSSJBGX.js +203 -0
- package/public/sandbox/chunks/chunk-S3KBAE5Z.js +1114 -0
- package/public/sandbox/chunks/chunk-S6ZZHV6G.js +244 -0
- package/public/sandbox/chunks/chunk-SFXJ24HY.js +499 -0
- package/public/sandbox/chunks/chunk-SH7TP5CJ.js +1109 -0
- package/public/sandbox/chunks/chunk-SI5OKFFY.js +317 -0
- package/public/sandbox/chunks/chunk-SIXNQNIR.js +86 -0
- package/public/sandbox/chunks/chunk-ST353BOX.js +42 -0
- package/public/sandbox/chunks/chunk-SYEHKMLP.js +1140 -0
- package/public/sandbox/chunks/chunk-SZ4KQUJU.js +69 -0
- package/public/sandbox/chunks/{chunk-5SOP6EKV.js → chunk-SZI65PSP.js} +5 -10
- package/public/sandbox/chunks/chunk-T7RLTSMX.js +78 -0
- package/public/sandbox/chunks/chunk-TJ2RLUTW.js +57 -0
- package/public/sandbox/chunks/chunk-TJB73XPN.js +4071 -0
- package/public/sandbox/chunks/chunk-TXJCYO56.js +4046 -0
- package/public/sandbox/chunks/chunk-U5J3LCYI.js +731 -0
- package/public/sandbox/chunks/chunk-UABFN3NH.js +208 -0
- package/public/sandbox/chunks/chunk-UBMUY7WO.js +13 -0
- package/public/sandbox/chunks/chunk-UC27CE32.js +69 -0
- package/public/sandbox/chunks/chunk-UJGVDFZN.js +147 -0
- package/public/sandbox/chunks/chunk-UNVLTK4N.js +122 -0
- package/public/sandbox/chunks/chunk-UQKQ6V3V.js +208 -0
- package/public/sandbox/chunks/chunk-UZZBHWIO.js +703 -0
- package/public/sandbox/chunks/chunk-VKZIJERL.js +1114 -0
- package/public/sandbox/chunks/chunk-VQQEAGID.js +372 -0
- package/public/sandbox/chunks/{chunk-3LX3KIQQ.js → chunk-W365QUZ5.js} +3 -5
- package/public/sandbox/chunks/chunk-WJY2LSWG.js +1052 -0
- package/public/sandbox/chunks/chunk-WNOBN3DX.js +391 -0
- package/public/sandbox/chunks/chunk-X2Z5VYG3.js +245 -0
- package/public/sandbox/chunks/chunk-X74KU74D.js +959 -0
- package/public/sandbox/chunks/chunk-XE7ULSGQ.js +46 -0
- package/public/sandbox/chunks/chunk-XRXUJZ3X.js +431 -0
- package/public/sandbox/chunks/chunk-XWHIN7CC.js +85 -0
- package/public/sandbox/chunks/chunk-Y2TVGGVL.js +527 -0
- package/public/sandbox/chunks/chunk-YMVMZA3U.js +1395 -0
- package/public/sandbox/chunks/chunk-YOBLFWDV.js +431 -0
- package/public/sandbox/chunks/chunk-YR2RFEZA.js +11 -0
- package/public/sandbox/chunks/chunk-YTD6A35P.js +836 -0
- package/public/sandbox/chunks/chunk-Z5L7EZXS.js +81 -0
- package/public/sandbox/chunks/chunk-Z65I5ET2.js +108 -0
- package/public/sandbox/chunks/chunk-Z6LV34RO.js +390 -0
- package/public/sandbox/chunks/chunk-ZAKUP6QG.js +1634 -0
- package/public/sandbox/chunks/chunk-ZHNYE2YH.js +731 -0
- package/public/sandbox/chunks/chunk-ZHQX3B3Y.js +867 -0
- package/public/sandbox/chunks/chunk-ZIXDFRHJ.js +731 -0
- package/public/sandbox/chunks/chunk-ZPZ2MZ4D.js +528 -0
- package/public/sandbox/chunks/chunk-ZQD6NZXB.js +373 -0
- package/public/sandbox/chunks/chunk-ZVVBP7ON.js +16 -0
- package/public/sandbox/chunks/chunk-ZWE3P6X2.js +11 -0
- package/public/sandbox/logix-core/Bound.js +14 -14
- package/public/sandbox/logix-core/Debug.js +12 -10
- package/public/sandbox/logix-core/EffectOp.js +3 -4
- package/public/sandbox/logix-core/Env.js +5 -2
- package/public/sandbox/logix-core/ExternalStore.js +239 -0
- package/public/sandbox/logix-core/Flow.js +7 -8
- package/public/sandbox/logix-core/Kernel.js +7 -4
- package/public/sandbox/logix-core/Link.js +33 -25
- package/public/sandbox/logix-core/Middleware.js +13 -11
- package/public/sandbox/logix-core/Module.js +93 -30
- package/public/sandbox/logix-core/ModuleTag.js +28 -25
- package/public/sandbox/logix-core/Observability.js +21 -19
- package/public/sandbox/logix-core/Process.js +27 -22
- package/public/sandbox/logix-core/ReadQuery.js +7 -11
- package/public/sandbox/logix-core/Reflection.js +173 -53
- package/public/sandbox/logix-core/Resource.js +6 -3
- package/public/sandbox/logix-core/Root.js +7 -3
- package/public/sandbox/logix-core/Runtime.js +54 -40
- package/public/sandbox/logix-core/ScopeRegistry.js +6 -3
- package/public/sandbox/logix-core/StateTrait.js +17 -14
- package/public/sandbox/logix-core/TraitLifecycle.js +8 -8
- package/public/sandbox/logix-core/Workflow.js +332 -0
- package/public/sandbox/logix-core.js +11133 -6622
- package/public/sandbox/logix-core.manifest.json +4 -2
- package/public/sandbox/worker.js +3 -3
- package/public/sandbox/chunks/chunk-4LRLOTMA.js +0 -1698
- package/public/sandbox/chunks/chunk-CDLXJHXY.js +0 -120
- package/public/sandbox/chunks/chunk-CZRI7MHA.js +0 -46
- package/public/sandbox/chunks/chunk-EJDFUZ4B.js +0 -408
- package/public/sandbox/chunks/chunk-IP63FME6.js +0 -282
- package/public/sandbox/chunks/chunk-JIXTOQXJ.js +0 -1103
- package/public/sandbox/chunks/chunk-MPUSOFJ3.js +0 -1928
- package/public/sandbox/chunks/chunk-ON2LY6HJ.js +0 -135
- package/public/sandbox/chunks/chunk-POIBXAH5.js +0 -995
- package/public/sandbox/chunks/chunk-PQ652ULI.js +0 -6359
- package/public/sandbox/chunks/chunk-RJQ4PG2F.js +0 -77
- package/public/sandbox/chunks/chunk-S4EXG3OS.js +0 -533
- package/public/sandbox/chunks/chunk-SUXDGXVE.js +0 -390
- package/public/sandbox/chunks/chunk-TOQ6SJ6O.js +0 -244
- package/public/sandbox/chunks/chunk-UKYAF3NL.js +0 -1036
- package/public/sandbox/chunks/chunk-UMVN3AWO.js +0 -395
- package/public/sandbox/chunks/chunk-WFV5PPWJ.js +0 -194
- package/public/sandbox/chunks/chunk-YF6IO732.js +0 -206
- package/public/sandbox/chunks/chunk-ZUBABAAO.js +0 -86
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
// @logix/core subpath bundles for @logix/sandbox
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
build,
|
|
5
|
+
install
|
|
6
|
+
} from "./chunk-YTD6A35P.js";
|
|
7
|
+
import {
|
|
8
|
+
registerModuleProgram
|
|
9
|
+
} from "./chunk-ST353BOX.js";
|
|
10
|
+
import {
|
|
11
|
+
fnv1a32,
|
|
12
|
+
stableStringify
|
|
13
|
+
} from "./chunk-QGIM3FQK.js";
|
|
14
|
+
import {
|
|
15
|
+
Module
|
|
16
|
+
} from "./chunk-JMA7GY7Z.js";
|
|
17
|
+
import {
|
|
18
|
+
attachLogicUnitMeta
|
|
19
|
+
} from "./chunk-TXJCYO56.js";
|
|
20
|
+
import {
|
|
21
|
+
mutateWithPatchPaths
|
|
22
|
+
} from "./chunk-ZHNYE2YH.js";
|
|
23
|
+
import {
|
|
24
|
+
getBoundInternals,
|
|
25
|
+
setModuleTraitsProgram
|
|
26
|
+
} from "./chunk-6FKWRVP4.js";
|
|
27
|
+
import {
|
|
28
|
+
currentDiagnosticsLevel,
|
|
29
|
+
record
|
|
30
|
+
} from "./chunk-CVZPRIDB.js";
|
|
31
|
+
|
|
32
|
+
// ../logix-core/src/ModuleTag.ts
|
|
33
|
+
import { Effect, FiberRef } from "../effect.js";
|
|
34
|
+
|
|
35
|
+
// ../logix-core/src/internal/runtime/core/ModuleTraits.ts
|
|
36
|
+
var ModuleTraitsConflictError = class extends Error {
|
|
37
|
+
constructor(moduleId, conflicts) {
|
|
38
|
+
super(
|
|
39
|
+
[
|
|
40
|
+
`[ModuleTraitsConflictError] Conflicting traitIds found (moduleId=${moduleId}).`,
|
|
41
|
+
...conflicts.map(
|
|
42
|
+
(c) => c.kind === "duplicate_traitId" ? `- duplicate ${c.traitId}: ${c.sources.map((s) => `${s.originType}:${s.originId}`).join(", ")}` : c.kind === "missing_requires" ? `- missing requires for ${c.traitId}: ${(c.missing ?? []).join(", ")}; sources=${c.sources.map((s) => `${s.originType}:${s.originId}`).join(", ")}` : `- excludes violation for ${c.traitId}: present=${(c.present ?? []).join(", ")}; sources=${c.sources.map((s) => `${s.originType}:${s.originId}`).join(", ")}`
|
|
43
|
+
)
|
|
44
|
+
].join("\n")
|
|
45
|
+
);
|
|
46
|
+
this.moduleId = moduleId;
|
|
47
|
+
this.conflicts = conflicts;
|
|
48
|
+
this._tag = "ModuleTraitsConflictError";
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
var toProvenanceKey = (p) => `${p.originType}:${p.originId}:${p.originIdKind}:${p.originLabel}:${p.path ?? ""}`;
|
|
52
|
+
var compareProvenance = (a, b) => {
|
|
53
|
+
const type = a.originType.localeCompare(b.originType);
|
|
54
|
+
if (type !== 0) return type;
|
|
55
|
+
const id = a.originId.localeCompare(b.originId);
|
|
56
|
+
if (id !== 0) return id;
|
|
57
|
+
const kind = a.originIdKind.localeCompare(b.originIdKind);
|
|
58
|
+
if (kind !== 0) return kind;
|
|
59
|
+
const label = a.originLabel.localeCompare(b.originLabel);
|
|
60
|
+
if (label !== 0) return label;
|
|
61
|
+
return String(a.path ?? "").localeCompare(String(b.path ?? ""));
|
|
62
|
+
};
|
|
63
|
+
var originTypeOrder = (t) => t === "module" ? 0 : 1;
|
|
64
|
+
var compareTraitIdByProvenance = (a, b) => {
|
|
65
|
+
const ta = originTypeOrder(a.provenance.originType) - originTypeOrder(b.provenance.originType);
|
|
66
|
+
if (ta !== 0) return ta;
|
|
67
|
+
const oa = a.provenance.originId.localeCompare(b.provenance.originId);
|
|
68
|
+
if (oa !== 0) return oa;
|
|
69
|
+
return a.traitId.localeCompare(b.traitId);
|
|
70
|
+
};
|
|
71
|
+
var extractStringArray = (value) => {
|
|
72
|
+
if (!Array.isArray(value)) return [];
|
|
73
|
+
const out = [];
|
|
74
|
+
for (const v of value) {
|
|
75
|
+
if (typeof v !== "string") continue;
|
|
76
|
+
const s = v.trim();
|
|
77
|
+
if (!s) continue;
|
|
78
|
+
out.push(s);
|
|
79
|
+
}
|
|
80
|
+
return out;
|
|
81
|
+
};
|
|
82
|
+
var getTraitRequires = (value) => {
|
|
83
|
+
if (!value || typeof value !== "object") return [];
|
|
84
|
+
const direct = extractStringArray(value.requires);
|
|
85
|
+
return direct;
|
|
86
|
+
};
|
|
87
|
+
var getTraitExcludes = (value) => {
|
|
88
|
+
if (!value || typeof value !== "object") return [];
|
|
89
|
+
const direct = extractStringArray(value.excludes);
|
|
90
|
+
return direct;
|
|
91
|
+
};
|
|
92
|
+
var getTraitName = (traitId, value) => {
|
|
93
|
+
if (value && typeof value === "object") {
|
|
94
|
+
const n = value.name;
|
|
95
|
+
if (typeof n === "string" && n.trim().length > 0) return n.trim();
|
|
96
|
+
}
|
|
97
|
+
return traitId;
|
|
98
|
+
};
|
|
99
|
+
var getTraitDescription = (value) => {
|
|
100
|
+
if (value && typeof value === "object") {
|
|
101
|
+
const d = value.description;
|
|
102
|
+
if (typeof d === "string" && d.trim().length > 0) return d.trim();
|
|
103
|
+
}
|
|
104
|
+
return void 0;
|
|
105
|
+
};
|
|
106
|
+
var finalizeTraitContributions = (args) => {
|
|
107
|
+
const traitById = /* @__PURE__ */ new Map();
|
|
108
|
+
const duplicateSources = /* @__PURE__ */ new Map();
|
|
109
|
+
const contributions = [...args.contributions].sort(
|
|
110
|
+
(a, b) => compareProvenance(a.provenance, b.provenance)
|
|
111
|
+
);
|
|
112
|
+
for (const c of contributions) {
|
|
113
|
+
const traits2 = c.traits;
|
|
114
|
+
if (!traits2 || typeof traits2 !== "object") continue;
|
|
115
|
+
for (const traitId of Object.keys(traits2).sort((a, b) => a.localeCompare(b))) {
|
|
116
|
+
const value = traits2[traitId];
|
|
117
|
+
if (value === void 0) continue;
|
|
118
|
+
const prev = traitById.get(traitId);
|
|
119
|
+
if (!prev) {
|
|
120
|
+
traitById.set(traitId, { value, provenance: c.provenance });
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
const sources = duplicateSources.get(traitId) ?? [prev.provenance];
|
|
124
|
+
sources.push(c.provenance);
|
|
125
|
+
duplicateSources.set(traitId, sources);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const conflicts = [];
|
|
129
|
+
const registerConflict = (conflict) => {
|
|
130
|
+
const unique = /* @__PURE__ */ new Map();
|
|
131
|
+
for (const s of conflict.sources) {
|
|
132
|
+
unique.set(toProvenanceKey(s), s);
|
|
133
|
+
}
|
|
134
|
+
conflicts.push({
|
|
135
|
+
...conflict,
|
|
136
|
+
sources: Array.from(unique.values()).sort(compareProvenance)
|
|
137
|
+
});
|
|
138
|
+
};
|
|
139
|
+
for (const traitId of Array.from(duplicateSources.keys()).sort((a, b) => a.localeCompare(b))) {
|
|
140
|
+
registerConflict({
|
|
141
|
+
kind: "duplicate_traitId",
|
|
142
|
+
traitId,
|
|
143
|
+
sources: duplicateSources.get(traitId) ?? []
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
const merged = {};
|
|
147
|
+
const provenanceIndex = {};
|
|
148
|
+
const traits = [];
|
|
149
|
+
const entries = [];
|
|
150
|
+
for (const traitId of traitById.keys()) {
|
|
151
|
+
const entry = traitById.get(traitId);
|
|
152
|
+
if (!entry) continue;
|
|
153
|
+
entries.push({ traitId, value: entry.value, provenance: entry.provenance });
|
|
154
|
+
}
|
|
155
|
+
const ids = entries.slice().sort(compareTraitIdByProvenance).map((e) => e.traitId);
|
|
156
|
+
for (const traitId of ids) {
|
|
157
|
+
const entry = traitById.get(traitId);
|
|
158
|
+
if (!entry) continue;
|
|
159
|
+
merged[traitId] = entry.value;
|
|
160
|
+
provenanceIndex[traitId] = entry.provenance;
|
|
161
|
+
traits.push({
|
|
162
|
+
traitId,
|
|
163
|
+
name: getTraitName(traitId, entry.value),
|
|
164
|
+
description: getTraitDescription(entry.value)
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
const present = new Set(ids);
|
|
168
|
+
for (const traitId of ids) {
|
|
169
|
+
const entry = traitById.get(traitId);
|
|
170
|
+
if (!entry) continue;
|
|
171
|
+
const requires = getTraitRequires(entry.value);
|
|
172
|
+
if (requires.length > 0) {
|
|
173
|
+
const missing = requires.filter((r) => !present.has(r));
|
|
174
|
+
if (missing.length > 0) {
|
|
175
|
+
registerConflict({
|
|
176
|
+
kind: "missing_requires",
|
|
177
|
+
traitId,
|
|
178
|
+
missing: Array.from(new Set(missing)).sort((a, b) => a.localeCompare(b)),
|
|
179
|
+
sources: [entry.provenance]
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
const excludes = getTraitExcludes(entry.value);
|
|
184
|
+
if (excludes.length > 0) {
|
|
185
|
+
const presentExcluded = excludes.filter((e) => present.has(e));
|
|
186
|
+
if (presentExcluded.length > 0) {
|
|
187
|
+
const otherSources = [];
|
|
188
|
+
for (const otherId of presentExcluded) {
|
|
189
|
+
const other = traitById.get(otherId);
|
|
190
|
+
if (other) otherSources.push(other.provenance);
|
|
191
|
+
}
|
|
192
|
+
registerConflict({
|
|
193
|
+
kind: "excludes_violation",
|
|
194
|
+
traitId,
|
|
195
|
+
present: Array.from(new Set(presentExcluded)).sort((a, b) => a.localeCompare(b)),
|
|
196
|
+
sources: [entry.provenance, ...otherSources]
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
if (conflicts.length > 0) {
|
|
202
|
+
const kindOrder = {
|
|
203
|
+
duplicate_traitId: 0,
|
|
204
|
+
missing_requires: 1,
|
|
205
|
+
excludes_violation: 2
|
|
206
|
+
};
|
|
207
|
+
conflicts.sort((a, b) => {
|
|
208
|
+
const k = kindOrder[a.kind] - kindOrder[b.kind];
|
|
209
|
+
if (k !== 0) return k;
|
|
210
|
+
return a.traitId.localeCompare(b.traitId);
|
|
211
|
+
});
|
|
212
|
+
throw new ModuleTraitsConflictError(args.moduleId, conflicts);
|
|
213
|
+
}
|
|
214
|
+
const digestBase = {
|
|
215
|
+
moduleId: args.moduleId,
|
|
216
|
+
traits,
|
|
217
|
+
provenanceIndex
|
|
218
|
+
};
|
|
219
|
+
const digest = `mtraits:023:${fnv1a32(stableStringify(digestBase))}`;
|
|
220
|
+
return {
|
|
221
|
+
merged,
|
|
222
|
+
snapshot: {
|
|
223
|
+
moduleId: args.moduleId,
|
|
224
|
+
digest,
|
|
225
|
+
traits,
|
|
226
|
+
provenanceIndex
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
// ../logix-core/src/ModuleTag.ts
|
|
232
|
+
var Reducer = {
|
|
233
|
+
mutate: (mutator) => (state, action, sink) => {
|
|
234
|
+
const { nextState, patchPaths } = mutateWithPatchPaths(
|
|
235
|
+
state,
|
|
236
|
+
(draft) => {
|
|
237
|
+
mutator(draft, action);
|
|
238
|
+
}
|
|
239
|
+
);
|
|
240
|
+
if (sink) {
|
|
241
|
+
for (const path of patchPaths) {
|
|
242
|
+
sink(path);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return nextState;
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
var makeImpl = (id, def) => Module(id, def);
|
|
249
|
+
var make = (id, def) => {
|
|
250
|
+
const moduleTag = makeImpl(id, def);
|
|
251
|
+
const stateSchema = def.state;
|
|
252
|
+
const moduleTraitsSpec = def.traits;
|
|
253
|
+
const baseProgram = moduleTraitsSpec ? build(stateSchema, moduleTraitsSpec) : void 0;
|
|
254
|
+
if (baseProgram) {
|
|
255
|
+
setModuleTraitsProgram(moduleTag, baseProgram);
|
|
256
|
+
registerModuleProgram(id, baseProgram);
|
|
257
|
+
}
|
|
258
|
+
const makeModuleTraitsContributionLogic = (traits) => {
|
|
259
|
+
const logic = moduleTag.logic(($) => ({
|
|
260
|
+
setup: Effect.sync(() => {
|
|
261
|
+
if (!traits || typeof traits !== "object") return;
|
|
262
|
+
const internals = getBoundInternals($);
|
|
263
|
+
internals.traits.registerModuleTraitsContribution({
|
|
264
|
+
traits,
|
|
265
|
+
provenance: {
|
|
266
|
+
originType: "module",
|
|
267
|
+
originId: id,
|
|
268
|
+
originIdKind: "explicit",
|
|
269
|
+
originLabel: `module:${id}`
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
}),
|
|
273
|
+
run: Effect.void
|
|
274
|
+
}));
|
|
275
|
+
attachLogicUnitMeta(logic, {
|
|
276
|
+
id: "__logix_internal:traits:module_contrib",
|
|
277
|
+
kind: "internal",
|
|
278
|
+
name: "traits:module_contrib",
|
|
279
|
+
moduleId: id
|
|
280
|
+
});
|
|
281
|
+
return logic;
|
|
282
|
+
};
|
|
283
|
+
const makeFinalizeTraitsLogic = () => {
|
|
284
|
+
const logic = moduleTag.logic(($) => ({
|
|
285
|
+
setup: Effect.gen(function* () {
|
|
286
|
+
const internals = getBoundInternals($);
|
|
287
|
+
const diagnosticsLevel = yield* FiberRef.get(currentDiagnosticsLevel);
|
|
288
|
+
const contributions = internals.traits.getModuleTraitsContributions();
|
|
289
|
+
let merged;
|
|
290
|
+
let snapshot;
|
|
291
|
+
try {
|
|
292
|
+
;
|
|
293
|
+
({ merged, snapshot } = finalizeTraitContributions({
|
|
294
|
+
moduleId: id,
|
|
295
|
+
contributions
|
|
296
|
+
}));
|
|
297
|
+
} catch (cause) {
|
|
298
|
+
if (diagnosticsLevel !== "off" && cause && typeof cause === "object" && cause._tag === "ModuleTraitsConflictError") {
|
|
299
|
+
const conflicts = Array.isArray(cause.conflicts) ? cause.conflicts : [];
|
|
300
|
+
const traitIds = conflicts.map((c) => c && typeof c === "object" ? c.traitId : void 0).filter((t) => typeof t === "string" && t.length > 0).slice(0, 20);
|
|
301
|
+
const data = diagnosticsLevel === "full" ? {
|
|
302
|
+
conflictCount: conflicts.length,
|
|
303
|
+
conflicts
|
|
304
|
+
} : {
|
|
305
|
+
conflictCount: conflicts.length,
|
|
306
|
+
traitIds
|
|
307
|
+
};
|
|
308
|
+
yield* record({
|
|
309
|
+
type: "trace:module:traits:conflict",
|
|
310
|
+
moduleId: id,
|
|
311
|
+
instanceId: internals.instanceId,
|
|
312
|
+
data
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
throw cause;
|
|
316
|
+
}
|
|
317
|
+
internals.traits.setModuleTraitsSnapshot(snapshot);
|
|
318
|
+
internals.traits.freezeModuleTraits();
|
|
319
|
+
if (diagnosticsLevel !== "off") {
|
|
320
|
+
const data = diagnosticsLevel === "full" ? {
|
|
321
|
+
digest: snapshot.digest,
|
|
322
|
+
count: snapshot.traits.length,
|
|
323
|
+
traits: snapshot.traits,
|
|
324
|
+
provenanceIndex: snapshot.provenanceIndex
|
|
325
|
+
} : {
|
|
326
|
+
digest: snapshot.digest,
|
|
327
|
+
count: snapshot.traits.length
|
|
328
|
+
};
|
|
329
|
+
yield* record({
|
|
330
|
+
type: "trace:module:traits",
|
|
331
|
+
moduleId: id,
|
|
332
|
+
instanceId: internals.instanceId,
|
|
333
|
+
data
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
if (Object.keys(merged).length === 0) {
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
const onlyModuleLevel = contributions.length === 1 && contributions[0]?.provenance?.originType === "module";
|
|
340
|
+
const program = onlyModuleLevel && baseProgram ? baseProgram : build(stateSchema, merged);
|
|
341
|
+
setModuleTraitsProgram(moduleTag, program);
|
|
342
|
+
registerModuleProgram(id, program);
|
|
343
|
+
yield* install($, program);
|
|
344
|
+
}),
|
|
345
|
+
run: Effect.void
|
|
346
|
+
}));
|
|
347
|
+
attachLogicUnitMeta(logic, {
|
|
348
|
+
id: "__logix_internal:traits:finalize",
|
|
349
|
+
kind: "internal",
|
|
350
|
+
name: "traits:finalize",
|
|
351
|
+
moduleId: id
|
|
352
|
+
});
|
|
353
|
+
return logic;
|
|
354
|
+
};
|
|
355
|
+
const originalImplement = moduleTag.implement;
|
|
356
|
+
moduleTag.implement = ((config) => {
|
|
357
|
+
const userLogics = config.logics ?? [];
|
|
358
|
+
const moduleLevel = def.traits ? [makeModuleTraitsContributionLogic(def.traits)] : [];
|
|
359
|
+
const finalize = makeFinalizeTraitsLogic();
|
|
360
|
+
const mergedLogics = [...moduleLevel, ...userLogics, finalize];
|
|
361
|
+
return originalImplement({
|
|
362
|
+
...config,
|
|
363
|
+
logics: mergedLogics
|
|
364
|
+
});
|
|
365
|
+
});
|
|
366
|
+
return moduleTag;
|
|
367
|
+
};
|
|
368
|
+
|
|
369
|
+
export {
|
|
370
|
+
Reducer,
|
|
371
|
+
make
|
|
372
|
+
};
|
|
373
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvTW9kdWxlVGFnLnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL3J1bnRpbWUvY29yZS9Nb2R1bGVUcmFpdHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IEVmZmVjdCwgRmliZXJSZWYsIExheWVyLCBTY2hlbWEgfSBmcm9tIFwiZWZmZWN0XCJcbmltcG9ydCAqIGFzIExvZ2ljIGZyb20gXCIuL0xvZ2ljLmpzXCJcbmltcG9ydCAqIGFzIE1vZHVsZUZhY3RvcnkgZnJvbSBcIi4vaW50ZXJuYWwvcnVudGltZS9Nb2R1bGVGYWN0b3J5LmpzXCJcbmltcG9ydCB7IG11dGF0ZVdpdGhQYXRjaFBhdGhzIH0gZnJvbSBcIi4vaW50ZXJuYWwvcnVudGltZS9jb3JlL211dGF0aXZlUGF0Y2hlcy5qc1wiXG5pbXBvcnQge1xuICBnZXRCb3VuZEludGVybmFscyxcbiAgc2V0TW9kdWxlVHJhaXRzUHJvZ3JhbSxcbn0gZnJvbSBcIi4vaW50ZXJuYWwvcnVudGltZS9jb3JlL3J1bnRpbWVJbnRlcm5hbHNBY2Nlc3Nvci5qc1wiXG5pbXBvcnQgKiBhcyBEZWJ1ZyBmcm9tIFwiLi9pbnRlcm5hbC9ydW50aW1lL2NvcmUvRGVidWdTaW5rLmpzXCJcbmltcG9ydCAqIGFzIExvZ2ljVW5pdE1ldGEgZnJvbSBcIi4vaW50ZXJuYWwvcnVudGltZS9jb3JlL0xvZ2ljVW5pdE1ldGEuanNcIlxuaW1wb3J0IHR5cGUge1xuICBBY3Rpb25zRnJvbU1hcCxcbiAgQW55TW9kdWxlU2hhcGUsXG4gIEFueVNjaGVtYSxcbiAgQm91bmRBcGksXG4gIEFjdGlvbk9mLFxuICBNb2R1bGVJbXBsLFxuICBNb2R1bGVMb2dpYyxcbiAgTW9kdWxlU2hhcGUsXG4gIE1vZHVsZVJ1bnRpbWUsXG4gIE1vZHVsZVRhZyxcbiAgTW9kdWxlSGFuZGxlLFxuICBNb2R1bGVIYW5kbGVVbmlvbixcbiAgU3RhdGVDaGFuZ2VXaXRoTWV0YSxcbiAgU3RhdGVDb21taXRNZXRhLFxuICBTdGF0ZUNvbW1pdE1vZGUsXG4gIFN0YXRlQ29tbWl0UHJpb3JpdHksXG4gIFJlZHVjZXJzRnJvbU1hcCxcbiAgU3RhdGVPZixcbn0gZnJvbSBcIi4vaW50ZXJuYWwvbW9kdWxlLmpzXCJcbmltcG9ydCAqIGFzIFN0YXRlVHJhaXQgZnJvbSBcIi4vc3RhdGUtdHJhaXQuanNcIlxuaW1wb3J0IHR5cGUgeyBTdGF0ZVRyYWl0UHJvZ3JhbSB9IGZyb20gXCIuL3N0YXRlLXRyYWl0LmpzXCJcbmltcG9ydCAqIGFzIE1vZHVsZVRyYWl0c1JlZ2lzdHJ5IGZyb20gXCIuL2ludGVybmFsL2RlYnVnL01vZHVsZVRyYWl0c1JlZ2lzdHJ5LmpzXCJcbmltcG9ydCAqIGFzIE1vZHVsZVRyYWl0cyBmcm9tIFwiLi9pbnRlcm5hbC9ydW50aW1lL2NvcmUvTW9kdWxlVHJhaXRzLmpzXCJcblxuLyoqXG4gKiBNb2R1bGVUYWcgLyBNb2R1bGVSdW50aW1lIC8gTW9kdWxlSW1wbCBcdTdCNDlcdTY4MzhcdTVGQzNcdTdDN0JcdTU3OEJcdTVCOUFcdTRFNDlcdTc2ODRcdTUxNkNcdTVGMDBcdTUxRkFcdTUzRTNcdTMwMDJcbiAqXG4gKiBcdTRFMEUgLmNvZGV4L3NraWxscy9wcm9qZWN0LWd1aWRlL3JlZmVyZW5jZXMvcnVudGltZS1sb2dpeC9sb2dpeC1jb3JlL2FwaS8wMi1tb2R1bGUtYW5kLWxvZ2ljLWFwaS5tZCBcdTRGRERcdTYzMDFcdTVCRjlcdTlGNTBcdTMwMDJcbiAqIFx1NTE3N1x1NEY1M1x1N0M3Qlx1NTc4Qlx1NUI5QVx1NEU0OVx1OTZDNlx1NEUyRFx1NTcyOCBpbnRlcm5hbC9tb2R1bGUudHMgXHU0RTJEXHVGRjBDXHU2NzJDXHU2QTIxXHU1NzU3XHU4RDFGXHU4RDIzXHU3RUM0XHU1NDA4XHU1REU1XHU1MzgyXHU1QjlFXHU3M0IwXHUzMDAyXG4gKi9cbmV4cG9ydCB0eXBlIHtcbiAgQW55U2NoZW1hLFxuICBBbnlNb2R1bGVTaGFwZSxcbiAgTW9kdWxlU2hhcGUsXG4gIE1vZHVsZUxvZ2ljLFxuICBNb2R1bGVJbXBsLFxuICBNb2R1bGVSdW50aW1lLFxuICBNb2R1bGVUYWcsXG4gIE1vZHVsZUhhbmRsZSxcbiAgTW9kdWxlSGFuZGxlVW5pb24sXG4gIFN0YXRlT2YsXG4gIEFjdGlvbnNGcm9tTWFwLFxuICBSZWR1Y2Vyc0Zyb21NYXAsXG4gIEJvdW5kQXBpLFxuICBBY3Rpb25PZixcbiAgU3RhdGVDb21taXRNb2RlLFxuICBTdGF0ZUNvbW1pdFByaW9yaXR5LFxuICBTdGF0ZUNvbW1pdE1ldGEsXG4gIFN0YXRlQ2hhbmdlV2l0aE1ldGEsXG59IGZyb20gXCIuL2ludGVybmFsL21vZHVsZS5qc1wiXG5cbi8qKlxuICogUmVkdWNlciBcdTVFMkVcdTUyQTlcdTVERTVcdTUxNzdcdUZGMUFcbiAqIC0gYFJlZHVjZXIubXV0YXRlYCBcdTYzRDBcdTRGOUJcdTRFMEUgYCQuc3RhdGUubXV0YXRlYCBcdTRFMDBcdTgxRjRcdTc2ODQgbXV0YXRpdmUgXHU5OENFXHU2ODNDXHU1MTk5XHU2Q0Q1XHVGRjFCXG4gKiAtIFx1OTAxQVx1OEZDN1x1NTE4NVx1OTBFOFx1NTdGQVx1NEU4RSBtdXRhdGl2ZSBcdTc2ODRcdTRFMERcdTUzRUZcdTUzRDhcdTY2RjRcdTY1QjBcdUZGMENcdTVDMDZcdTMwMENcdTVDMzFcdTU3MzBcdTRGRUVcdTY1MzkgZHJhZnRcdTMwMERcdTY2MjBcdTVDMDRcdTRFM0FcdTdFQUYgYChzdGF0ZSwgYWN0aW9uKSA9PiBzdGF0ZWAgXHU1MUZEXHU2NTcwXHUzMDAyXG4gKlxuICogXHU3NTI4XHU2Q0Q1XHU3OTNBXHU0RjhCXHVGRjFBXG4gKlxuICogICBjb25zdCBDb3VudGVyID0gTG9naXguTW9kdWxlVGFnLm1ha2UoXCJDb3VudGVyXCIsIHtcbiAqICAgICBzdGF0ZTogQ291bnRlclN0YXRlLFxuICogICAgIGFjdGlvbnM6IENvdW50ZXJBY3Rpb25zLFxuICogICAgIHJlZHVjZXJzOiB7XG4gKiAgICAgICBpbmM6IExvZ2l4Lk1vZHVsZVRhZy5SZWR1Y2VyLm11dGF0ZSgoZHJhZnQsIF9hY3Rpb24pID0+IHtcbiAqICAgICAgICAgZHJhZnQuY291bnQgKz0gMVxuICogICAgICAgfSksXG4gKiAgICAgfSxcbiAqICAgfSlcbiAqXG4gKiAgIHlpZWxkKiAkLnJlZHVjZXIoXG4gKiAgICAgXCJzZXRWYWx1ZVwiLFxuICogICAgIExvZ2l4Lk1vZHVsZVRhZy5SZWR1Y2VyLm11dGF0ZSgoZHJhZnQsIGFjdGlvbikgPT4ge1xuICogICAgICAgZHJhZnQudmFsdWUgPSBhY3Rpb24ucGF5bG9hZFxuICogICAgIH0pLFxuICogICApXG4gKi9cbmV4cG9ydCBjb25zdCBSZWR1Y2VyID0ge1xuICBtdXRhdGU6IDxTLCBBPihcbiAgICBtdXRhdG9yOiAoZHJhZnQ6IExvZ2ljLkRyYWZ0PFM+LCBhY3Rpb246IEEpID0+IHZvaWRcbiAgKTogKChzdGF0ZTogUywgYWN0aW9uOiBBLCBzaW5rPzogKHBhdGg6IHN0cmluZykgPT4gdm9pZCkgPT4gUykgPT5cbiAgICAoc3RhdGUsIGFjdGlvbiwgc2luaykgPT4ge1xuICAgICAgY29uc3QgeyBuZXh0U3RhdGUsIHBhdGNoUGF0aHMgfSA9IG11dGF0ZVdpdGhQYXRjaFBhdGhzKFxuICAgICAgICBzdGF0ZSBhcyBTLFxuICAgICAgICAoZHJhZnQpID0+IHtcbiAgICAgICAgICBtdXRhdG9yKGRyYWZ0IGFzIExvZ2ljLkRyYWZ0PFM+LCBhY3Rpb24pXG4gICAgICAgIH0sXG4gICAgICApXG5cbiAgICAgIGlmIChzaW5rKSB7XG4gICAgICAgIGZvciAoY29uc3QgcGF0aCBvZiBwYXRjaFBhdGhzKSB7XG4gICAgICAgICAgc2luayhwYXRoKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXh0U3RhdGVcbiAgICB9LFxufVxuXG4vKipcbiAqIFx1N0I4MFx1NTMxNlx1NzY4NCBTaGFwZSBcdTVCOUFcdTRFNDlcdTUyQTlcdTYyNEJcdUZGMENcdTRFMTNcdTRFM0EgQWN0aW9uIE1hcCBcdThCQkVcdThCQTFcdTMwMDJcbiAqIEBleGFtcGxlIHR5cGUgTXlTaGFwZSA9IFNoYXBlPHR5cGVvZiBNeVN0YXRlLCB0eXBlb2YgTXlBY3Rpb25NYXA+XG4gKi9cbmV4cG9ydCB0eXBlIFNoYXBlPFxuICBTIGV4dGVuZHMgQW55U2NoZW1hLFxuICBNIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgQW55U2NoZW1hPlxuPiA9IE1vZHVsZVNoYXBlPFMsIFNjaGVtYS5TY2hlbWE8QWN0aW9uc0Zyb21NYXA8TT4+LCBNPlxuXG5jb25zdCBtYWtlSW1wbCA9IDxcbiAgSWQgZXh0ZW5kcyBzdHJpbmcsXG4gIFNTY2hlbWEgZXh0ZW5kcyBBbnlTY2hlbWEsXG4gIEFNYXAgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBBbnlTY2hlbWE+XG4+KFxuICBpZDogSWQsXG4gIGRlZjoge1xuICAgIHJlYWRvbmx5IHN0YXRlOiBTU2NoZW1hXG4gICAgcmVhZG9ubHkgYWN0aW9uczogQU1hcFxuICAgIHJlYWRvbmx5IHJlZHVjZXJzPzogUmVkdWNlcnNGcm9tTWFwPFNTY2hlbWEsIEFNYXA+XG4gIH1cbik6IE1vZHVsZVRhZzxcbiAgSWQsXG4gIE1vZHVsZVNoYXBlPFNTY2hlbWEsIFNjaGVtYS5TY2hlbWE8QWN0aW9uc0Zyb21NYXA8QU1hcD4+LCBBTWFwPlxuPiA9PiBNb2R1bGVGYWN0b3J5Lk1vZHVsZShpZCwgZGVmKSBhcyBNb2R1bGVUYWc8XG4gIElkLFxuICBNb2R1bGVTaGFwZTxTU2NoZW1hLCBTY2hlbWEuU2NoZW1hPEFjdGlvbnNGcm9tTWFwPEFNYXA+PiwgQU1hcD5cbj5cblxuLyoqXG4gKiBNb2R1bGVUYWcubWFrZVx1RkYxQVxuICogLSBcdTRFRTVcdTdFRDlcdTVCOUEgaWQgXHU0RTBFIHN0YXRlL2FjdGlvbnMvcmVkdWNlcnMgXHU1QjlBXHU0RTQ5XHU0RTAwXHU0RTJBXHU5ODg2XHU1N0RGXHU2QTIxXHU1NzU3IFRhZ1x1RkYxQlxuICogLSBcdThGRDRcdTU2REVcdTc2ODQgTW9kdWxlVGFnIFx1NjVFMlx1NjYyRiBDb250ZXh0LlRhZ1x1RkYwQ1x1NTNDOFx1NjQzQVx1NUUyNiBTaGFwZSBcdTRFMEVcdTVERTVcdTUzODJcdTgwRkRcdTUyOUJcdTMwMDJcbiAqXG4gKiBcdThCRjRcdTY2MEVcdUZGMUEwMjIgXHU4RDc3XHU2NUU3IGBNb2R1bGVgXHVGRjA4VGFnIGlkZW50aXR5XHVGRjA5XHU2NkY0XHU1NDBEXHU0RTNBIGBNb2R1bGVUYWdgXHVGRjFCXHU5ODg2XHU1N0RGXHU1QjlBXHU0RTQ5XHU1QkY5XHU4QzYxXHU4QkY3XHU0RjdGXHU3NTI4IGBMb2dpeC5Nb2R1bGVgXHUzMDAyXG4gKi9cbmV4cG9ydCBjb25zdCBtYWtlID0gPFxuICBJZCBleHRlbmRzIHN0cmluZyxcbiAgU1NjaGVtYSBleHRlbmRzIEFueVNjaGVtYSxcbiAgQU1hcCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIEFueVNjaGVtYT5cbj4oXG4gIGlkOiBJZCxcbiAgZGVmOiB7XG4gICAgcmVhZG9ubHkgc3RhdGU6IFNTY2hlbWFcbiAgICByZWFkb25seSBhY3Rpb25zOiBBTWFwXG4gICAgcmVhZG9ubHkgcmVkdWNlcnM/OiBSZWR1Y2Vyc0Zyb21NYXA8U1NjaGVtYSwgQU1hcD5cbiAgICAvKipcbiAgICAgKiB0cmFpdHNcdUZGMUFcbiAgICAgKiAtIFx1NzUyOFx1NEU4RVx1NjMwMlx1OEY3RCBTdGF0ZVRyYWl0U3BlY1x1RkYwOFx1OEJFNlx1ODlDMSBzcGVjcy8wMDAtbW9kdWxlLXRyYWl0cy1ydW50aW1lXHVGRjA5XHUzMDAyXG4gICAgICogLSBcdTVGNTNcdTUyNERcdTVCOUVcdTczQjBcdTRGMUFcdTU3MjggTW9kdWxlVGFnLm1ha2UgXHU5NjM2XHU2QkI1IGJ1aWxkIFByb2dyYW1cdUZGMENcdTVFNzZcdTU3MjggYE1vZHVsZVRhZy5pbXBsZW1lbnRgIFx1NkNFOFx1NTE2NVx1NEUwMFx1NkJCNSBzZXR1cC1vbmx5IExvZ2ljIFx1Njc2NVx1OEMwM1x1NzUyOCBgU3RhdGVUcmFpdC5pbnN0YWxsYFx1MzAwMlxuICAgICAqICAgXHVGRjA4XHU2Q0U4XHVGRjFBXHU4MkU1XHU0RjdGXHU3NTI4IGBNb2R1bGVUYWcubGl2ZWAgXHU3NkY0XHU1MUZBIExheWVyIFx1NEUxNFx1NUUwQ1x1NjcxQlx1NTQyRlx1NzUyOCB0cmFpdHMgXHU4ODRDXHU0RTNBXHVGRjBDXHU4QkY3XHU2NjNFXHU1RjBGXHU1NzI4IGxvZ2ljcyBcdTRFMkRcdThDMDNcdTc1MjggYFN0YXRlVHJhaXQuaW5zdGFsbGBcdUZGMENcdTYyMTZcdTY1MzlcdTc1MjggYE1vZHVsZVRhZy5pbXBsZW1lbnRgXHUzMDAyXHVGRjA5XG4gICAgICovXG4gICAgcmVhZG9ubHkgdHJhaXRzPzogdW5rbm93blxuICB9XG4pOiBNb2R1bGVUYWc8XG4gIElkLFxuICBNb2R1bGVTaGFwZTxTU2NoZW1hLCBTY2hlbWEuU2NoZW1hPEFjdGlvbnNGcm9tTWFwPEFNYXA+PiwgQU1hcD5cbj4gPT4ge1xuICBjb25zdCBtb2R1bGVUYWcgPSBtYWtlSW1wbChpZCwgZGVmKVxuXG4gIHR5cGUgU2ggPSBNb2R1bGVTaGFwZTxTU2NoZW1hLCBTY2hlbWEuU2NoZW1hPEFjdGlvbnNGcm9tTWFwPEFNYXA+PiwgQU1hcD5cblxuICBjb25zdCBzdGF0ZVNjaGVtYSA9IGRlZi5zdGF0ZSBhcyBTY2hlbWEuU2NoZW1hPGFueSwgYW55PlxuICBjb25zdCBtb2R1bGVUcmFpdHNTcGVjID0gZGVmLnRyYWl0cyBhcyBTdGF0ZVRyYWl0LlN0YXRlVHJhaXRTcGVjPGFueT4gfCB1bmRlZmluZWRcbiAgY29uc3QgYmFzZVByb2dyYW06IFN0YXRlVHJhaXRQcm9ncmFtPGFueT4gfCB1bmRlZmluZWQgPSBtb2R1bGVUcmFpdHNTcGVjXG4gICAgPyBTdGF0ZVRyYWl0LmJ1aWxkKHN0YXRlU2NoZW1hIGFzIGFueSwgbW9kdWxlVHJhaXRzU3BlYyBhcyBhbnkpXG4gICAgOiB1bmRlZmluZWRcblxuICBpZiAoYmFzZVByb2dyYW0pIHtcbiAgICAvLyBcdTRGOUIgVHJhaXRMaWZlY3ljbGUvRGVidWcvRGV2dG9vbHMgXHU4QkZCXHU1M0Q2XHVGRjA4XHU1QjlBXHU0RTQ5XHU0RkE3XHU5NjkwXHU4NUNGXHU2OUZEXHU0RjREXHVGRjA5XHUzMDAyXG4gICAgc2V0TW9kdWxlVHJhaXRzUHJvZ3JhbShtb2R1bGVUYWcgYXMgYW55LCBiYXNlUHJvZ3JhbSlcbiAgICBNb2R1bGVUcmFpdHNSZWdpc3RyeS5yZWdpc3Rlck1vZHVsZVByb2dyYW0oaWQsIGJhc2VQcm9ncmFtIGFzIFN0YXRlVHJhaXRQcm9ncmFtPGFueT4pXG4gIH1cblxuICAvLyAwMjNcdUZGMUF0cmFpdHMgXHU3Njg0XHUyMDFDXHU1OEYwXHU2NjBFXHU1MTY1XHU1M0UzL1x1NTQwOFx1NUU3Nlx1NTE2NVx1NTNFM1x1MjAxRFx1N0VERlx1NEUwMFx1NjUzNlx1NjU1Qlx1NTIzMCBzZXR1cCBcdTk2MzZcdTZCQjVcdUZGMUFcbiAgLy8gLSBtb2R1bGUtbGV2ZWwgdHJhaXRzIFx1NTE0OFx1NEY1Q1x1NEUzQSBjb250cmlidXRpb24gXHU2Q0U4XHU1MThDXHVGRjFCXG4gIC8vIC0gbG9naWMtbGV2ZWwgXHU5MDFBXHU4RkM3ICQudHJhaXRzLmRlY2xhcmUgXHU2Q0U4XHU1MThDXHVGRjFCXG4gIC8vIC0gXHU2NzAwXHU1NDBFXHU0RTAwXHU2QjIxXHU2MDI3IGZpbmFsaXplIFx1MjE5MiBmcmVlemUgXHUyMTkyIGJ1aWxkL2luc3RhbGxcdTMwMDJcblxuICBjb25zdCBtYWtlTW9kdWxlVHJhaXRzQ29udHJpYnV0aW9uTG9naWMgPSAoXG4gICAgdHJhaXRzOiB1bmtub3duLFxuICApOiBNb2R1bGVMb2dpYzxTaCwgbmV2ZXIsIG5ldmVyPiA9PiB7XG4gICAgY29uc3QgbG9naWMgPSBtb2R1bGVUYWcubG9naWMoKCQpID0+ICh7XG4gICAgICBzZXR1cDogRWZmZWN0LnN5bmMoKCkgPT4ge1xuICAgICAgICBpZiAoIXRyYWl0cyB8fCB0eXBlb2YgdHJhaXRzICE9PSBcIm9iamVjdFwiKSByZXR1cm5cbiAgICAgICAgLy8gbW9kdWxlLWxldmVsIHByb3ZlbmFuY2VcdUZGMUFcdTRFRTUgbW9kdWxlSWQgXHU0RjVDXHU0RTNBXHU3QTMzXHU1QjlBXHU5NTFBXHU3MEI5XG4gICAgICAgIC8vXHVGRjA4XHU1QkY5XHU5RjUwIDAyMyBkYXRhLW1vZGVsXHVGRjFBb3JpZ2luVHlwZT1tb2R1bGUsIG9yaWdpbklkPW1vZHVsZUlkXHVGRjA5XHUzMDAyXG4gICAgICAgIC8vIFx1NkNFOFx1NjEwRlx1RkYxQXRyYWl0c1NwZWMgXHU0RUNEXHU1OTBEXHU3NTI4IFN0YXRlVHJhaXRTcGVjIFx1N0VEM1x1Njc4NFx1RkYwQ1x1NEUwRFx1NUYxNVx1NTE2NVx1N0IyQ1x1NEU4Q1x1NTk1NyBJUlx1MzAwMlxuICAgICAgICBjb25zdCBpbnRlcm5hbHMgPSBnZXRCb3VuZEludGVybmFscygkIGFzIGFueSlcbiAgICAgICAgaW50ZXJuYWxzLnRyYWl0cy5yZWdpc3Rlck1vZHVsZVRyYWl0c0NvbnRyaWJ1dGlvbih7XG4gICAgICAgICAgdHJhaXRzLFxuICAgICAgICAgIHByb3ZlbmFuY2U6IHtcbiAgICAgICAgICAgIG9yaWdpblR5cGU6IFwibW9kdWxlXCIsXG4gICAgICAgICAgICBvcmlnaW5JZDogaWQsXG4gICAgICAgICAgICBvcmlnaW5JZEtpbmQ6IFwiZXhwbGljaXRcIixcbiAgICAgICAgICAgIG9yaWdpbkxhYmVsOiBgbW9kdWxlOiR7aWR9YCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgfSksXG4gICAgICBydW46IEVmZmVjdC52b2lkLFxuICAgIH0pKSBhcyBNb2R1bGVMb2dpYzxTaCwgbmV2ZXIsIG5ldmVyPlxuXG4gICAgTG9naWNVbml0TWV0YS5hdHRhY2hMb2dpY1VuaXRNZXRhKGxvZ2ljIGFzIGFueSwge1xuICAgICAgaWQ6IFwiX19sb2dpeF9pbnRlcm5hbDp0cmFpdHM6bW9kdWxlX2NvbnRyaWJcIixcbiAgICAgIGtpbmQ6IFwiaW50ZXJuYWxcIixcbiAgICAgIG5hbWU6IFwidHJhaXRzOm1vZHVsZV9jb250cmliXCIsXG4gICAgICBtb2R1bGVJZDogaWQsXG4gICAgfSlcbiAgICByZXR1cm4gbG9naWNcbiAgfVxuXG4gIGNvbnN0IG1ha2VGaW5hbGl6ZVRyYWl0c0xvZ2ljID0gKCk6IE1vZHVsZUxvZ2ljPFNoLCBuZXZlciwgbmV2ZXI+ID0+IHtcbiAgICBjb25zdCBsb2dpYyA9IG1vZHVsZVRhZy5sb2dpYygoJCkgPT4gKHtcbiAgICAgIHNldHVwOiBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGludGVybmFscyA9IGdldEJvdW5kSW50ZXJuYWxzKCQgYXMgYW55KVxuICAgICAgICBjb25zdCBkaWFnbm9zdGljc0xldmVsID0geWllbGQqIEZpYmVyUmVmLmdldChEZWJ1Zy5jdXJyZW50RGlhZ25vc3RpY3NMZXZlbClcblxuICAgICAgICBjb25zdCBjb250cmlidXRpb25zID0gaW50ZXJuYWxzLnRyYWl0cy5nZXRNb2R1bGVUcmFpdHNDb250cmlidXRpb25zKClcbiAgICAgICAgbGV0IG1lcmdlZDogTW9kdWxlVHJhaXRzLlRyYWl0U3BlY1xuICAgICAgICBsZXQgc25hcHNob3Q6IE1vZHVsZVRyYWl0cy5Nb2R1bGVUcmFpdHNTbmFwc2hvdFxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgOyh7IG1lcmdlZCwgc25hcHNob3QgfSA9IE1vZHVsZVRyYWl0cy5maW5hbGl6ZVRyYWl0Q29udHJpYnV0aW9ucyh7XG4gICAgICAgICAgICBtb2R1bGVJZDogaWQsXG4gICAgICAgICAgICBjb250cmlidXRpb25zLFxuICAgICAgICAgIH0pKVxuICAgICAgICB9IGNhdGNoIChjYXVzZSkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGRpYWdub3N0aWNzTGV2ZWwgIT09IFwib2ZmXCIgJiZcbiAgICAgICAgICAgIGNhdXNlICYmXG4gICAgICAgICAgICB0eXBlb2YgY2F1c2UgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIChjYXVzZSBhcyBhbnkpLl90YWcgPT09IFwiTW9kdWxlVHJhaXRzQ29uZmxpY3RFcnJvclwiXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBjb25mbGljdHMgPSBBcnJheS5pc0FycmF5KChjYXVzZSBhcyBhbnkpLmNvbmZsaWN0cylcbiAgICAgICAgICAgICAgPyAoKGNhdXNlIGFzIGFueSkuY29uZmxpY3RzIGFzIFJlYWRvbmx5QXJyYXk8dW5rbm93bj4pXG4gICAgICAgICAgICAgIDogW11cbiAgICAgICAgICAgIGNvbnN0IHRyYWl0SWRzID0gY29uZmxpY3RzXG4gICAgICAgICAgICAgIC5tYXAoKGM6IGFueSkgPT4gKGMgJiYgdHlwZW9mIGMgPT09IFwib2JqZWN0XCIgPyAoYyBhcyBhbnkpLnRyYWl0SWQgOiB1bmRlZmluZWQpKVxuICAgICAgICAgICAgICAuZmlsdGVyKCh0KTogdCBpcyBzdHJpbmcgPT4gdHlwZW9mIHQgPT09IFwic3RyaW5nXCIgJiYgdC5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAuc2xpY2UoMCwgMjApXG5cbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPVxuICAgICAgICAgICAgICBkaWFnbm9zdGljc0xldmVsID09PSBcImZ1bGxcIlxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICBjb25mbGljdENvdW50OiBjb25mbGljdHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICBjb25mbGljdHMsXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0Q291bnQ6IGNvbmZsaWN0cy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIHRyYWl0SWRzLFxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB5aWVsZCogRGVidWcucmVjb3JkKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0cmFjZTptb2R1bGU6dHJhaXRzOmNvbmZsaWN0XCIsXG4gICAgICAgICAgICAgIG1vZHVsZUlkOiBpZCxcbiAgICAgICAgICAgICAgaW5zdGFuY2VJZDogaW50ZXJuYWxzLmluc3RhbmNlSWQsXG4gICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICB9IGFzIGFueSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aHJvdyBjYXVzZVxuICAgICAgICB9XG5cbiAgICAgICAgaW50ZXJuYWxzLnRyYWl0cy5zZXRNb2R1bGVUcmFpdHNTbmFwc2hvdChzbmFwc2hvdClcbiAgICAgICAgaW50ZXJuYWxzLnRyYWl0cy5mcmVlemVNb2R1bGVUcmFpdHMoKVxuXG4gICAgICAgIGlmIChkaWFnbm9zdGljc0xldmVsICE9PSBcIm9mZlwiKSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9XG4gICAgICAgICAgICBkaWFnbm9zdGljc0xldmVsID09PSBcImZ1bGxcIlxuICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgIGRpZ2VzdDogc25hcHNob3QuZGlnZXN0LFxuICAgICAgICAgICAgICAgICAgY291bnQ6IHNuYXBzaG90LnRyYWl0cy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICB0cmFpdHM6IHNuYXBzaG90LnRyYWl0cyxcbiAgICAgICAgICAgICAgICAgIHByb3ZlbmFuY2VJbmRleDogc25hcHNob3QucHJvdmVuYW5jZUluZGV4LFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICBkaWdlc3Q6IHNuYXBzaG90LmRpZ2VzdCxcbiAgICAgICAgICAgICAgICAgIGNvdW50OiBzbmFwc2hvdC50cmFpdHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgIHlpZWxkKiBEZWJ1Zy5yZWNvcmQoe1xuICAgICAgICAgICAgdHlwZTogXCJ0cmFjZTptb2R1bGU6dHJhaXRzXCIsXG4gICAgICAgICAgICBtb2R1bGVJZDogaWQsXG4gICAgICAgICAgICBpbnN0YW5jZUlkOiBpbnRlcm5hbHMuaW5zdGFuY2VJZCxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgfSBhcyBhbnkpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMobWVyZ2VkKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9ubHlNb2R1bGVMZXZlbCA9XG4gICAgICAgICAgY29udHJpYnV0aW9ucy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICBjb250cmlidXRpb25zWzBdPy5wcm92ZW5hbmNlPy5vcmlnaW5UeXBlID09PSBcIm1vZHVsZVwiXG5cbiAgICAgICAgLy8gXHU1N0ZBXHU0RThFXHU2NzAwXHU3RUM4XHU1NDA4XHU1RTc2XHU1NDBFXHU3Njg0IFNwZWMgXHU2Nzg0XHU5MDIwXHU0RTAwXHU2QjIxXHU2MDI3IFByb2dyYW1cdUZGMENcdTVFNzZcdTU3MjhcdTUyMURcdTU5Q0JcdTUzMTZcdTk2MzZcdTZCQjVcdTVCODlcdTg4QzVcdTMwMDJcbiAgICAgICAgLy8gLSBcdTgyRTVcdTUzRUFcdTY3MDkgbW9kdWxlLWxldmVsIGNvbnRyaWJ1dGlvblx1RkYwQ1x1NTIxOVx1NTkwRFx1NzUyOCBNb2R1bGVUYWcubWFrZSBcdTk2MzZcdTZCQjVcdTk4ODRcdTY3ODRcdTVFRkFcdTc2ODQgcHJvZ3JhbVx1RkYwOFx1NEZCRlx1NEU4RSBEZWJ1Zy9UcmFpdExpZmVjeWNsZVx1RkYwOVx1MzAwMlxuICAgICAgICBjb25zdCBwcm9ncmFtID1cbiAgICAgICAgICBvbmx5TW9kdWxlTGV2ZWwgJiYgYmFzZVByb2dyYW1cbiAgICAgICAgICAgID8gYmFzZVByb2dyYW1cbiAgICAgICAgICAgIDogU3RhdGVUcmFpdC5idWlsZChzdGF0ZVNjaGVtYSBhcyBhbnksIG1lcmdlZCBhcyBhbnkpXG5cbiAgICAgICAgLy8gXHU0RjlCIFRyYWl0TGlmZWN5Y2xlL0RlYnVnL0RldnRvb2xzIFx1OEJGQlx1NTNENlx1RkYwOFx1NUI5QVx1NEU0OVx1NEZBN1x1OTY5MFx1ODVDRlx1NjlGRFx1NEY0RFx1RkYwOVx1MzAwMlxuICAgICAgICBzZXRNb2R1bGVUcmFpdHNQcm9ncmFtKG1vZHVsZVRhZyBhcyBhbnksIHByb2dyYW0pXG4gICAgICAgIE1vZHVsZVRyYWl0c1JlZ2lzdHJ5LnJlZ2lzdGVyTW9kdWxlUHJvZ3JhbShpZCwgcHJvZ3JhbSBhcyBTdGF0ZVRyYWl0UHJvZ3JhbTxhbnk+KVxuXG4gICAgICAgIHlpZWxkKiBTdGF0ZVRyYWl0Lmluc3RhbGwoJCBhcyB1bmtub3duIGFzIEJvdW5kQXBpPGFueSwgYW55PiwgcHJvZ3JhbSlcbiAgICAgIH0pLFxuICAgICAgcnVuOiBFZmZlY3Qudm9pZCxcbiAgICB9KSkgYXMgTW9kdWxlTG9naWM8U2gsIG5ldmVyLCBuZXZlcj5cblxuICAgIExvZ2ljVW5pdE1ldGEuYXR0YWNoTG9naWNVbml0TWV0YShsb2dpYyBhcyBhbnksIHtcbiAgICAgIGlkOiBcIl9fbG9naXhfaW50ZXJuYWw6dHJhaXRzOmZpbmFsaXplXCIsXG4gICAgICBraW5kOiBcImludGVybmFsXCIsXG4gICAgICBuYW1lOiBcInRyYWl0czpmaW5hbGl6ZVwiLFxuICAgICAgbW9kdWxlSWQ6IGlkLFxuICAgIH0pXG5cbiAgICByZXR1cm4gbG9naWNcbiAgfVxuXG4gIC8vIFx1NTMwNVx1ODhDNSBpbXBsZW1lbnRcdUZGMUFcdTU3MjhcdTVCOUVcdTczQjBcdTVDNDJcdTZDRThcdTUxNjVcdUZGMDgxXHVGRjA5bW9kdWxlLWxldmVsIGNvbnRyaWJ1dGlvbiBsb2dpY1x1RkYwOFx1NTNFRlx1OTAwOVx1RkYwOVx1RkYwODJcdUZGMDlmaW5hbGl6ZStpbnN0YWxsIGxvZ2ljXHVGRjA4XHU1RkM1XHU5MDA5XHVGRjA5XHUzMDAyXG4gIGNvbnN0IG9yaWdpbmFsSW1wbGVtZW50ID0gbW9kdWxlVGFnLmltcGxlbWVudFxuICA7KG1vZHVsZVRhZyBhcyBhbnkpLmltcGxlbWVudCA9ICg8UiA9IG5ldmVyPihjb25maWc6IHtcbiAgICBpbml0aWFsOiBTdGF0ZU9mPHR5cGVvZiBtb2R1bGVUYWcuc2hhcGU+XG4gICAgbG9naWNzPzogQXJyYXk8TW9kdWxlTG9naWM8dHlwZW9mIG1vZHVsZVRhZy5zaGFwZSwgUiwgYW55Pj5cbiAgICBpbXBvcnRzPzogUmVhZG9ubHlBcnJheTxcbiAgICAgIExheWVyLkxheWVyPGFueSwgYW55LCBhbnk+IHwgTW9kdWxlSW1wbDxhbnksIEFueU1vZHVsZVNoYXBlLCBhbnk+XG4gICAgPlxuICAgIHByb2Nlc3Nlcz86IFJlYWRvbmx5QXJyYXk8RWZmZWN0LkVmZmVjdDx2b2lkLCBhbnksIGFueT4+XG4gIH0pID0+IHtcbiAgICBjb25zdCB1c2VyTG9naWNzID0gKGNvbmZpZy5sb2dpY3MgPz8gW10pIGFzIEFycmF5PE1vZHVsZUxvZ2ljPFxuICAgICAgdHlwZW9mIG1vZHVsZVRhZy5zaGFwZSxcbiAgICAgIFIsXG4gICAgICBhbnlcbiAgICA+PlxuXG4gICAgY29uc3QgbW9kdWxlTGV2ZWwgPVxuICAgICAgZGVmLnRyYWl0cyA/IFttYWtlTW9kdWxlVHJhaXRzQ29udHJpYnV0aW9uTG9naWMoZGVmLnRyYWl0cykgYXMgYW55XSA6IFtdXG5cbiAgICBjb25zdCBmaW5hbGl6ZSA9IG1ha2VGaW5hbGl6ZVRyYWl0c0xvZ2ljKCkgYXMgTW9kdWxlTG9naWM8XG4gICAgICB0eXBlb2YgbW9kdWxlVGFnLnNoYXBlLFxuICAgICAgUixcbiAgICAgIGFueVxuICAgID5cblxuICAgIGNvbnN0IG1lcmdlZExvZ2ljcyA9IFsuLi5tb2R1bGVMZXZlbCwgLi4udXNlckxvZ2ljcywgZmluYWxpemVdXG5cbiAgICByZXR1cm4gb3JpZ2luYWxJbXBsZW1lbnQ8Uj4oe1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgbG9naWNzOiBtZXJnZWRMb2dpY3MsXG4gICAgfSlcbiAgfSkgYXMgdHlwZW9mIG1vZHVsZVRhZy5pbXBsZW1lbnRcblxuICByZXR1cm4gbW9kdWxlVGFnXG59XG4iLCAiaW1wb3J0IHsgZm52MWEzMiwgc3RhYmxlU3RyaW5naWZ5IH0gZnJvbSBcIi4uLy4uL2RpZ2VzdC5qc1wiXG5cbmV4cG9ydCB0eXBlIFRyYWl0SWQgPSBzdHJpbmdcblxuZXhwb3J0IHR5cGUgVHJhaXRPcmlnaW5UeXBlID0gXCJtb2R1bGVcIiB8IFwibG9naWNVbml0XCJcbmV4cG9ydCB0eXBlIFRyYWl0T3JpZ2luSWRLaW5kID0gXCJleHBsaWNpdFwiIHwgXCJkZXJpdmVkXCJcblxuZXhwb3J0IGludGVyZmFjZSBUcmFpdFByb3ZlbmFuY2Uge1xuICByZWFkb25seSBvcmlnaW5UeXBlOiBUcmFpdE9yaWdpblR5cGVcbiAgcmVhZG9ubHkgb3JpZ2luSWQ6IHN0cmluZ1xuICByZWFkb25seSBvcmlnaW5JZEtpbmQ6IFRyYWl0T3JpZ2luSWRLaW5kXG4gIC8qKlxuICAgKiBcdTdFRDkgRGV2dG9vbHMvXHU5NTE5XHU4QkVGXHU0RkUxXHU2MDZGXHU1QzU1XHU3OTNBXHU3Njg0XHU1M0VGXHU4QkZCXHU2ODA3XHU3QjdFXHVGRjA4XHU0RjhCXHU1OTgyIFwibG9naWNVbml0OlByb2ZpbGUjMVwiXHVGRjA5XHUzMDAyXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5MYWJlbDogc3RyaW5nXG4gIC8qKlxuICAgKiBcdTUzRUZcdTkwMDlcdUZGMUFcdTU4RjBcdTY2MEVcdTRGNERcdTdGNkVcdTY0NThcdTg5ODFcdUZGMDhcdTRGOEJcdTU5ODJcdTY1ODdcdTRFRjZcdThERUZcdTVGODQvXHU4QzAzXHU3NTI4XHU3MEI5XHVGRjA5XHVGRjBDXHU0RUM1XHU3NTI4XHU0RThFXHU1QjlBXHU0RjREXHVGRjBDXHU0RTBEXHU1M0MyXHU0RTBFXHU4QkVEXHU0RTQ5XHU4OEMxXHU1MUIzXHUzMDAyXG4gICAqL1xuICByZWFkb25seSBwYXRoPzogc3RyaW5nXG59XG5cbi8qKlxuICogVHJhaXRTcGVjXHVGRjFBXG4gKiAtIFx1NEY1Q1x1NEUzQVx1MjAxQ3RyYWl0cyBcdTU4RjBcdTY2MEVcdTIwMURcdTc2ODRcdTY3MDBcdTVDMEZcdTVGNjJcdTYwMDFcdUZGMUFcdTRFMDBcdTdFQzRcdTRFRTUgdHJhaXRJZCBcdTRFM0Ega2V5IFx1NzY4NFx1NThGMFx1NjYwRVx1NUJGOVx1OEM2MVx1RkYxQlxuICogLSBcdTUxNzdcdTRGNTMgdmFsdWUgXHU1RjYyXHU2MDAxXHU3NTMxXHU1MTc3XHU0RjUzIHRyYWl0IFx1N0NGQlx1N0VERlx1RkYwOFx1NTk4MiBTdGF0ZVRyYWl0U3BlY1x1RkYwOVx1NTFCM1x1NUI5QVx1RkYxQlxuICogLSBcdThGRDlcdTkxQ0NcdTRFMERcdTdFQTZcdTY3NUYgdmFsdWUgXHU3Njg0XHU1M0VGXHU1RThGXHU1MjE3XHU1MzE2XHU2MDI3XHVGRjA4XHU4RkQwXHU4ODRDXHU2NzFGIGluc3RhbGwgXHU1M0VGXHU4MEZEXHU0RjlEXHU4RDU2XHU1MUZEXHU2NTcwXHVGRjA5XHVGRjBDXHU0RjQ2IFNuYXBzaG90L1x1OEJDMVx1NjM2RVx1NUJGQ1x1NTFGQVx1NUZDNVx1OTg3Qlx1NTNFQVx1NTNENlx1NTNFRlx1NUU4Rlx1NTIxN1x1NTMxNlx1NUI1MFx1OTZDNlx1MzAwMlxuICovXG5leHBvcnQgdHlwZSBUcmFpdFNwZWMgPSBvYmplY3RcblxuZXhwb3J0IGludGVyZmFjZSBUcmFpdENvbnRyaWJ1dGlvbiB7XG4gIHJlYWRvbmx5IHRyYWl0czogVHJhaXRTcGVjXG4gIHJlYWRvbmx5IHByb3ZlbmFuY2U6IFRyYWl0UHJvdmVuYW5jZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vZHVsZVRyYWl0SXRlbSB7XG4gIHJlYWRvbmx5IHRyYWl0SWQ6IFRyYWl0SWRcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIFRyYWl0Q29uZmxpY3RLaW5kID1cbiAgfCBcImR1cGxpY2F0ZV90cmFpdElkXCJcbiAgfCBcIm1pc3NpbmdfcmVxdWlyZXNcIlxuICB8IFwiZXhjbHVkZXNfdmlvbGF0aW9uXCJcblxuZXhwb3J0IGludGVyZmFjZSBUcmFpdENvbmZsaWN0IHtcbiAgcmVhZG9ubHkga2luZDogVHJhaXRDb25mbGljdEtpbmRcbiAgcmVhZG9ubHkgdHJhaXRJZDogVHJhaXRJZFxuICByZWFkb25seSBzb3VyY2VzOiBSZWFkb25seUFycmF5PFRyYWl0UHJvdmVuYW5jZT5cbiAgcmVhZG9ubHkgbWlzc2luZz86IFJlYWRvbmx5QXJyYXk8VHJhaXRJZD5cbiAgcmVhZG9ubHkgcHJlc2VudD86IFJlYWRvbmx5QXJyYXk8VHJhaXRJZD5cbn1cblxuZXhwb3J0IGNsYXNzIE1vZHVsZVRyYWl0c0NvbmZsaWN0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IF90YWcgPSBcIk1vZHVsZVRyYWl0c0NvbmZsaWN0RXJyb3JcIlxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IG1vZHVsZUlkOiBzdHJpbmcsXG4gICAgcmVhZG9ubHkgY29uZmxpY3RzOiBSZWFkb25seUFycmF5PFRyYWl0Q29uZmxpY3Q+LFxuICApIHtcbiAgICBzdXBlcihcbiAgICAgIFtcbiAgICAgICAgYFtNb2R1bGVUcmFpdHNDb25mbGljdEVycm9yXSBDb25mbGljdGluZyB0cmFpdElkcyBmb3VuZCAobW9kdWxlSWQ9JHttb2R1bGVJZH0pLmAsXG4gICAgICAgIC4uLmNvbmZsaWN0cy5tYXAoXG4gICAgICAgICAgKGMpID0+XG4gICAgICAgICAgICBjLmtpbmQgPT09IFwiZHVwbGljYXRlX3RyYWl0SWRcIlxuICAgICAgICAgICAgICA/IGAtIGR1cGxpY2F0ZSAke2MudHJhaXRJZH06ICR7Yy5zb3VyY2VzXG4gICAgICAgICAgICAgICAgICAubWFwKChzKSA9PiBgJHtzLm9yaWdpblR5cGV9OiR7cy5vcmlnaW5JZH1gKVxuICAgICAgICAgICAgICAgICAgLmpvaW4oXCIsIFwiKX1gXG4gICAgICAgICAgICAgIDogYy5raW5kID09PSBcIm1pc3NpbmdfcmVxdWlyZXNcIlxuICAgICAgICAgICAgICAgID8gYC0gbWlzc2luZyByZXF1aXJlcyBmb3IgJHtjLnRyYWl0SWR9OiAkeyhjLm1pc3NpbmcgPz8gW10pLmpvaW4oXCIsIFwiKX07IHNvdXJjZXM9JHtjLnNvdXJjZXNcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgocykgPT4gYCR7cy5vcmlnaW5UeXBlfToke3Mub3JpZ2luSWR9YClcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oXCIsIFwiKX1gXG4gICAgICAgICAgICAgICAgOiBgLSBleGNsdWRlcyB2aW9sYXRpb24gZm9yICR7Yy50cmFpdElkfTogcHJlc2VudD0keyhjLnByZXNlbnQgPz8gW10pLmpvaW4oXCIsIFwiKX07IHNvdXJjZXM9JHtjLnNvdXJjZXNcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgocykgPT4gYCR7cy5vcmlnaW5UeXBlfToke3Mub3JpZ2luSWR9YClcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oXCIsIFwiKX1gLFxuICAgICAgICApLFxuICAgICAgXS5qb2luKFwiXFxuXCIpLFxuICAgIClcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vZHVsZVRyYWl0c1NuYXBzaG90IHtcbiAgcmVhZG9ubHkgbW9kdWxlSWQ6IHN0cmluZ1xuICByZWFkb25seSBkaWdlc3Q6IHN0cmluZ1xuICByZWFkb25seSB0cmFpdHM6IFJlYWRvbmx5QXJyYXk8TW9kdWxlVHJhaXRJdGVtPlxuICByZWFkb25seSBwcm92ZW5hbmNlSW5kZXg6IFJlY29yZDxUcmFpdElkLCBUcmFpdFByb3ZlbmFuY2U+XG59XG5cbmNvbnN0IHRvUHJvdmVuYW5jZUtleSA9IChwOiBUcmFpdFByb3ZlbmFuY2UpOiBzdHJpbmcgPT5cbiAgYCR7cC5vcmlnaW5UeXBlfToke3Aub3JpZ2luSWR9OiR7cC5vcmlnaW5JZEtpbmR9OiR7cC5vcmlnaW5MYWJlbH06JHtwLnBhdGggPz8gXCJcIn1gXG5cbmNvbnN0IGNvbXBhcmVQcm92ZW5hbmNlID0gKGE6IFRyYWl0UHJvdmVuYW5jZSwgYjogVHJhaXRQcm92ZW5hbmNlKTogbnVtYmVyID0+IHtcbiAgY29uc3QgdHlwZSA9IGEub3JpZ2luVHlwZS5sb2NhbGVDb21wYXJlKGIub3JpZ2luVHlwZSlcbiAgaWYgKHR5cGUgIT09IDApIHJldHVybiB0eXBlXG4gIGNvbnN0IGlkID0gYS5vcmlnaW5JZC5sb2NhbGVDb21wYXJlKGIub3JpZ2luSWQpXG4gIGlmIChpZCAhPT0gMCkgcmV0dXJuIGlkXG4gIGNvbnN0IGtpbmQgPSBhLm9yaWdpbklkS2luZC5sb2NhbGVDb21wYXJlKGIub3JpZ2luSWRLaW5kKVxuICBpZiAoa2luZCAhPT0gMCkgcmV0dXJuIGtpbmRcbiAgY29uc3QgbGFiZWwgPSBhLm9yaWdpbkxhYmVsLmxvY2FsZUNvbXBhcmUoYi5vcmlnaW5MYWJlbClcbiAgaWYgKGxhYmVsICE9PSAwKSByZXR1cm4gbGFiZWxcbiAgcmV0dXJuIFN0cmluZyhhLnBhdGggPz8gXCJcIikubG9jYWxlQ29tcGFyZShTdHJpbmcoYi5wYXRoID8/IFwiXCIpKVxufVxuXG5jb25zdCBvcmlnaW5UeXBlT3JkZXIgPSAodDogVHJhaXRPcmlnaW5UeXBlKTogbnVtYmVyID0+XG4gIHQgPT09IFwibW9kdWxlXCIgPyAwIDogMVxuXG5jb25zdCBjb21wYXJlVHJhaXRJZEJ5UHJvdmVuYW5jZSA9IChcbiAgYTogeyByZWFkb25seSB0cmFpdElkOiBUcmFpdElkOyByZWFkb25seSBwcm92ZW5hbmNlOiBUcmFpdFByb3ZlbmFuY2UgfSxcbiAgYjogeyByZWFkb25seSB0cmFpdElkOiBUcmFpdElkOyByZWFkb25seSBwcm92ZW5hbmNlOiBUcmFpdFByb3ZlbmFuY2UgfSxcbik6IG51bWJlciA9PiB7XG4gIGNvbnN0IHRhID0gb3JpZ2luVHlwZU9yZGVyKGEucHJvdmVuYW5jZS5vcmlnaW5UeXBlKSAtIG9yaWdpblR5cGVPcmRlcihiLnByb3ZlbmFuY2Uub3JpZ2luVHlwZSlcbiAgaWYgKHRhICE9PSAwKSByZXR1cm4gdGFcbiAgY29uc3Qgb2EgPSBhLnByb3ZlbmFuY2Uub3JpZ2luSWQubG9jYWxlQ29tcGFyZShiLnByb3ZlbmFuY2Uub3JpZ2luSWQpXG4gIGlmIChvYSAhPT0gMCkgcmV0dXJuIG9hXG4gIHJldHVybiBhLnRyYWl0SWQubG9jYWxlQ29tcGFyZShiLnRyYWl0SWQpXG59XG5cbmNvbnN0IGV4dHJhY3RTdHJpbmdBcnJheSA9ICh2YWx1ZTogdW5rbm93bik6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiA9PiB7XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBbXVxuICBjb25zdCBvdXQ6IEFycmF5PHN0cmluZz4gPSBbXVxuICBmb3IgKGNvbnN0IHYgb2YgdmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHYgIT09IFwic3RyaW5nXCIpIGNvbnRpbnVlXG4gICAgY29uc3QgcyA9IHYudHJpbSgpXG4gICAgaWYgKCFzKSBjb250aW51ZVxuICAgIG91dC5wdXNoKHMpXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG5jb25zdCBnZXRUcmFpdFJlcXVpcmVzID0gKHZhbHVlOiB1bmtub3duKTogUmVhZG9ubHlBcnJheTxUcmFpdElkPiA9PiB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSByZXR1cm4gW11cbiAgY29uc3QgZGlyZWN0ID0gZXh0cmFjdFN0cmluZ0FycmF5KCh2YWx1ZSBhcyBhbnkpLnJlcXVpcmVzKVxuICByZXR1cm4gZGlyZWN0XG59XG5cbmNvbnN0IGdldFRyYWl0RXhjbHVkZXMgPSAodmFsdWU6IHVua25vd24pOiBSZWFkb25seUFycmF5PFRyYWl0SWQ+ID0+IHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHJldHVybiBbXVxuICBjb25zdCBkaXJlY3QgPSBleHRyYWN0U3RyaW5nQXJyYXkoKHZhbHVlIGFzIGFueSkuZXhjbHVkZXMpXG4gIHJldHVybiBkaXJlY3Rcbn1cblxuY29uc3QgZ2V0VHJhaXROYW1lID0gKHRyYWl0SWQ6IFRyYWl0SWQsIHZhbHVlOiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IG4gPSAodmFsdWUgYXMgYW55KS5uYW1lXG4gICAgaWYgKHR5cGVvZiBuID09PSBcInN0cmluZ1wiICYmIG4udHJpbSgpLmxlbmd0aCA+IDApIHJldHVybiBuLnRyaW0oKVxuICB9XG4gIHJldHVybiB0cmFpdElkXG59XG5cbmNvbnN0IGdldFRyYWl0RGVzY3JpcHRpb24gPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3QgZCA9ICh2YWx1ZSBhcyBhbnkpLmRlc2NyaXB0aW9uXG4gICAgaWYgKHR5cGVvZiBkID09PSBcInN0cmluZ1wiICYmIGQudHJpbSgpLmxlbmd0aCA+IDApIHJldHVybiBkLnRyaW0oKVxuICB9XG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuZXhwb3J0IGNvbnN0IGZpbmFsaXplVHJhaXRDb250cmlidXRpb25zID0gKGFyZ3M6IHtcbiAgcmVhZG9ubHkgbW9kdWxlSWQ6IHN0cmluZ1xuICByZWFkb25seSBjb250cmlidXRpb25zOiBSZWFkb25seUFycmF5PFRyYWl0Q29udHJpYnV0aW9uPlxufSk6IHsgcmVhZG9ubHkgbWVyZ2VkOiBUcmFpdFNwZWM7IHJlYWRvbmx5IHNuYXBzaG90OiBNb2R1bGVUcmFpdHNTbmFwc2hvdCB9ID0+IHtcbiAgY29uc3QgdHJhaXRCeUlkID0gbmV3IE1hcDxcbiAgICBUcmFpdElkLFxuICAgIHsgcmVhZG9ubHkgdmFsdWU6IHVua25vd247IHJlYWRvbmx5IHByb3ZlbmFuY2U6IFRyYWl0UHJvdmVuYW5jZSB9XG4gID4oKVxuXG4gIGNvbnN0IGR1cGxpY2F0ZVNvdXJjZXMgPSBuZXcgTWFwPFRyYWl0SWQsIEFycmF5PFRyYWl0UHJvdmVuYW5jZT4+KClcblxuICBjb25zdCBjb250cmlidXRpb25zID0gWy4uLmFyZ3MuY29udHJpYnV0aW9uc10uc29ydCgoYSwgYikgPT5cbiAgICBjb21wYXJlUHJvdmVuYW5jZShhLnByb3ZlbmFuY2UsIGIucHJvdmVuYW5jZSksXG4gIClcblxuICBmb3IgKGNvbnN0IGMgb2YgY29udHJpYnV0aW9ucykge1xuICAgIGNvbnN0IHRyYWl0cyA9IGMudHJhaXRzXG4gICAgaWYgKCF0cmFpdHMgfHwgdHlwZW9mIHRyYWl0cyAhPT0gXCJvYmplY3RcIikgY29udGludWVcbiAgICBmb3IgKGNvbnN0IHRyYWl0SWQgb2YgT2JqZWN0LmtleXModHJhaXRzKS5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9ICh0cmFpdHMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3RyYWl0SWRdXG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWVcblxuICAgICAgY29uc3QgcHJldiA9IHRyYWl0QnlJZC5nZXQodHJhaXRJZClcbiAgICAgIGlmICghcHJldikge1xuICAgICAgICB0cmFpdEJ5SWQuc2V0KHRyYWl0SWQsIHsgdmFsdWUsIHByb3ZlbmFuY2U6IGMucHJvdmVuYW5jZSB9KVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzb3VyY2VzID0gZHVwbGljYXRlU291cmNlcy5nZXQodHJhaXRJZCkgPz8gW3ByZXYucHJvdmVuYW5jZV1cbiAgICAgIHNvdXJjZXMucHVzaChjLnByb3ZlbmFuY2UpXG4gICAgICBkdXBsaWNhdGVTb3VyY2VzLnNldCh0cmFpdElkLCBzb3VyY2VzKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNvbmZsaWN0czogQXJyYXk8VHJhaXRDb25mbGljdD4gPSBbXVxuICBjb25zdCByZWdpc3RlckNvbmZsaWN0ID0gKGNvbmZsaWN0OiBUcmFpdENvbmZsaWN0KSA9PiB7XG4gICAgY29uc3QgdW5pcXVlID0gbmV3IE1hcDxzdHJpbmcsIFRyYWl0UHJvdmVuYW5jZT4oKVxuICAgIGZvciAoY29uc3QgcyBvZiBjb25mbGljdC5zb3VyY2VzKSB7XG4gICAgICB1bmlxdWUuc2V0KHRvUHJvdmVuYW5jZUtleShzKSwgcylcbiAgICB9XG4gICAgY29uZmxpY3RzLnB1c2goe1xuICAgICAgLi4uY29uZmxpY3QsXG4gICAgICBzb3VyY2VzOiBBcnJheS5mcm9tKHVuaXF1ZS52YWx1ZXMoKSkuc29ydChjb21wYXJlUHJvdmVuYW5jZSksXG4gICAgfSlcbiAgfVxuXG4gIC8vIDEpIGR1cGxpY2F0ZSB0cmFpdElkIGNvbmZsaWN0c1xuICBmb3IgKGNvbnN0IHRyYWl0SWQgb2YgQXJyYXkuZnJvbShkdXBsaWNhdGVTb3VyY2VzLmtleXMoKSkuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKSkge1xuICAgIHJlZ2lzdGVyQ29uZmxpY3Qoe1xuICAgICAga2luZDogXCJkdXBsaWNhdGVfdHJhaXRJZFwiLFxuICAgICAgdHJhaXRJZCxcbiAgICAgIHNvdXJjZXM6IGR1cGxpY2F0ZVNvdXJjZXMuZ2V0KHRyYWl0SWQpID8/IFtdLFxuICAgIH0pXG4gIH1cblxuICBjb25zdCBtZXJnZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbiAgY29uc3QgcHJvdmVuYW5jZUluZGV4OiBSZWNvcmQ8c3RyaW5nLCBUcmFpdFByb3ZlbmFuY2U+ID0ge31cbiAgY29uc3QgdHJhaXRzOiBBcnJheTxNb2R1bGVUcmFpdEl0ZW0+ID0gW11cblxuICBjb25zdCBlbnRyaWVzOiBBcnJheTx7IHJlYWRvbmx5IHRyYWl0SWQ6IFRyYWl0SWQ7IHJlYWRvbmx5IHZhbHVlOiB1bmtub3duOyByZWFkb25seSBwcm92ZW5hbmNlOiBUcmFpdFByb3ZlbmFuY2UgfT4gPSBbXVxuICBmb3IgKGNvbnN0IHRyYWl0SWQgb2YgdHJhaXRCeUlkLmtleXMoKSkge1xuICAgIGNvbnN0IGVudHJ5ID0gdHJhaXRCeUlkLmdldCh0cmFpdElkKVxuICAgIGlmICghZW50cnkpIGNvbnRpbnVlXG4gICAgZW50cmllcy5wdXNoKHsgdHJhaXRJZCwgdmFsdWU6IGVudHJ5LnZhbHVlLCBwcm92ZW5hbmNlOiBlbnRyeS5wcm92ZW5hbmNlIH0pXG4gIH1cblxuICBjb25zdCBpZHMgPSBlbnRyaWVzXG4gICAgLnNsaWNlKClcbiAgICAuc29ydChjb21wYXJlVHJhaXRJZEJ5UHJvdmVuYW5jZSlcbiAgICAubWFwKChlKSA9PiBlLnRyYWl0SWQpXG5cbiAgZm9yIChjb25zdCB0cmFpdElkIG9mIGlkcykge1xuICAgIGNvbnN0IGVudHJ5ID0gdHJhaXRCeUlkLmdldCh0cmFpdElkKVxuICAgIGlmICghZW50cnkpIGNvbnRpbnVlXG4gICAgbWVyZ2VkW3RyYWl0SWRdID0gZW50cnkudmFsdWVcbiAgICBwcm92ZW5hbmNlSW5kZXhbdHJhaXRJZF0gPSBlbnRyeS5wcm92ZW5hbmNlXG4gICAgdHJhaXRzLnB1c2goe1xuICAgICAgdHJhaXRJZCxcbiAgICAgIG5hbWU6IGdldFRyYWl0TmFtZSh0cmFpdElkLCBlbnRyeS52YWx1ZSksXG4gICAgICBkZXNjcmlwdGlvbjogZ2V0VHJhaXREZXNjcmlwdGlvbihlbnRyeS52YWx1ZSksXG4gICAgfSlcbiAgfVxuXG4gIC8vIDIpIGNvbnNpc3RlbmN5IGNoZWNrcyAoRlItMDA3KTogcmVxdWlyZXMgLyBleGNsdWRlc1xuICBjb25zdCBwcmVzZW50ID0gbmV3IFNldChpZHMpXG5cbiAgZm9yIChjb25zdCB0cmFpdElkIG9mIGlkcykge1xuICAgIGNvbnN0IGVudHJ5ID0gdHJhaXRCeUlkLmdldCh0cmFpdElkKVxuICAgIGlmICghZW50cnkpIGNvbnRpbnVlXG5cbiAgICBjb25zdCByZXF1aXJlcyA9IGdldFRyYWl0UmVxdWlyZXMoZW50cnkudmFsdWUpXG4gICAgaWYgKHJlcXVpcmVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG1pc3NpbmcgPSByZXF1aXJlcy5maWx0ZXIoKHIpID0+ICFwcmVzZW50LmhhcyhyKSlcbiAgICAgIGlmIChtaXNzaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVnaXN0ZXJDb25mbGljdCh7XG4gICAgICAgICAga2luZDogXCJtaXNzaW5nX3JlcXVpcmVzXCIsXG4gICAgICAgICAgdHJhaXRJZCxcbiAgICAgICAgICBtaXNzaW5nOiBBcnJheS5mcm9tKG5ldyBTZXQobWlzc2luZykpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSksXG4gICAgICAgICAgc291cmNlczogW2VudHJ5LnByb3ZlbmFuY2VdLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGV4Y2x1ZGVzID0gZ2V0VHJhaXRFeGNsdWRlcyhlbnRyeS52YWx1ZSlcbiAgICBpZiAoZXhjbHVkZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcHJlc2VudEV4Y2x1ZGVkID0gZXhjbHVkZXMuZmlsdGVyKChlKSA9PiBwcmVzZW50LmhhcyhlKSlcbiAgICAgIGlmIChwcmVzZW50RXhjbHVkZWQubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBvdGhlclNvdXJjZXM6IEFycmF5PFRyYWl0UHJvdmVuYW5jZT4gPSBbXVxuICAgICAgICBmb3IgKGNvbnN0IG90aGVySWQgb2YgcHJlc2VudEV4Y2x1ZGVkKSB7XG4gICAgICAgICAgY29uc3Qgb3RoZXIgPSB0cmFpdEJ5SWQuZ2V0KG90aGVySWQpXG4gICAgICAgICAgaWYgKG90aGVyKSBvdGhlclNvdXJjZXMucHVzaChvdGhlci5wcm92ZW5hbmNlKVxuICAgICAgICB9XG4gICAgICAgIHJlZ2lzdGVyQ29uZmxpY3Qoe1xuICAgICAgICAgIGtpbmQ6IFwiZXhjbHVkZXNfdmlvbGF0aW9uXCIsXG4gICAgICAgICAgdHJhaXRJZCxcbiAgICAgICAgICBwcmVzZW50OiBBcnJheS5mcm9tKG5ldyBTZXQocHJlc2VudEV4Y2x1ZGVkKSkuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKSxcbiAgICAgICAgICBzb3VyY2VzOiBbZW50cnkucHJvdmVuYW5jZSwgLi4ub3RoZXJTb3VyY2VzXSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmxpY3RzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBraW5kT3JkZXI6IFJlY29yZDxUcmFpdENvbmZsaWN0S2luZCwgbnVtYmVyPiA9IHtcbiAgICAgIGR1cGxpY2F0ZV90cmFpdElkOiAwLFxuICAgICAgbWlzc2luZ19yZXF1aXJlczogMSxcbiAgICAgIGV4Y2x1ZGVzX3Zpb2xhdGlvbjogMixcbiAgICB9XG4gICAgY29uZmxpY3RzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGsgPSBraW5kT3JkZXJbYS5raW5kXSAtIGtpbmRPcmRlcltiLmtpbmRdXG4gICAgICBpZiAoayAhPT0gMCkgcmV0dXJuIGtcbiAgICAgIHJldHVybiBhLnRyYWl0SWQubG9jYWxlQ29tcGFyZShiLnRyYWl0SWQpXG4gICAgfSlcbiAgICB0aHJvdyBuZXcgTW9kdWxlVHJhaXRzQ29uZmxpY3RFcnJvcihhcmdzLm1vZHVsZUlkLCBjb25mbGljdHMpXG4gIH1cblxuICBjb25zdCBkaWdlc3RCYXNlID0ge1xuICAgIG1vZHVsZUlkOiBhcmdzLm1vZHVsZUlkLFxuICAgIHRyYWl0cyxcbiAgICBwcm92ZW5hbmNlSW5kZXgsXG4gIH0gYXMgY29uc3RcblxuICBjb25zdCBkaWdlc3QgPSBgbXRyYWl0czowMjM6JHtmbnYxYTMyKHN0YWJsZVN0cmluZ2lmeShkaWdlc3RCYXNlKSl9YFxuXG4gIHJldHVybiB7XG4gICAgbWVyZ2VkLFxuICAgIHNuYXBzaG90OiB7XG4gICAgICBtb2R1bGVJZDogYXJncy5tb2R1bGVJZCxcbiAgICAgIGRpZ2VzdCxcbiAgICAgIHRyYWl0cyxcbiAgICAgIHByb3ZlbmFuY2VJbmRleCxcbiAgICB9LFxuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLFNBQVMsUUFBUSxnQkFBK0I7OztBQ3FEekMsSUFBTSw0QkFBTixjQUF3QyxNQUFNO0FBQUEsRUFHbkQsWUFDVyxVQUNBLFdBQ1Q7QUFDQTtBQUFBLE1BQ0U7QUFBQSxRQUNFLG9FQUFvRSxRQUFRO0FBQUEsUUFDNUUsR0FBRyxVQUFVO0FBQUEsVUFDWCxDQUFDLE1BQ0Ms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
|