@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-F5CLVIS6.js";
|
|
7
|
+
import {
|
|
8
|
+
registerModuleProgram
|
|
9
|
+
} from "./chunk-BVE33AN6.js";
|
|
10
|
+
import {
|
|
11
|
+
fnv1a32,
|
|
12
|
+
stableStringify
|
|
13
|
+
} from "./chunk-QGIM3FQK.js";
|
|
14
|
+
import {
|
|
15
|
+
Module
|
|
16
|
+
} from "./chunk-FNLXHWIU.js";
|
|
17
|
+
import {
|
|
18
|
+
attachLogicUnitMeta
|
|
19
|
+
} from "./chunk-HGUFQ2QC.js";
|
|
20
|
+
import {
|
|
21
|
+
mutateWithPatchPaths
|
|
22
|
+
} from "./chunk-OKTBUTCH.js";
|
|
23
|
+
import {
|
|
24
|
+
getBoundInternals,
|
|
25
|
+
setModuleTraitsProgram
|
|
26
|
+
} from "./chunk-6FKWRVP4.js";
|
|
27
|
+
import {
|
|
28
|
+
currentDiagnosticsLevel,
|
|
29
|
+
record
|
|
30
|
+
} from "./chunk-4KIYG5E4.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,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvTW9kdWxlVGFnLnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL3J1bnRpbWUvY29yZS9Nb2R1bGVUcmFpdHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IEVmZmVjdCwgRmliZXJSZWYsIExheWVyLCBTY2hlbWEgfSBmcm9tIFwiZWZmZWN0XCJcbmltcG9ydCAqIGFzIExvZ2ljIGZyb20gXCIuL0xvZ2ljLmpzXCJcbmltcG9ydCAqIGFzIE1vZHVsZUZhY3RvcnkgZnJvbSBcIi4vaW50ZXJuYWwvcnVudGltZS9Nb2R1bGVGYWN0b3J5LmpzXCJcbmltcG9ydCB7IG11dGF0ZVdpdGhQYXRjaFBhdGhzIH0gZnJvbSBcIi4vaW50ZXJuYWwvcnVudGltZS9jb3JlL211dGF0aXZlUGF0Y2hlcy5qc1wiXG5pbXBvcnQge1xuICBnZXRCb3VuZEludGVybmFscyxcbiAgc2V0TW9kdWxlVHJhaXRzUHJvZ3JhbSxcbn0gZnJvbSBcIi4vaW50ZXJuYWwvcnVudGltZS9jb3JlL3J1bnRpbWVJbnRlcm5hbHNBY2Nlc3Nvci5qc1wiXG5pbXBvcnQgKiBhcyBEZWJ1ZyBmcm9tIFwiLi9pbnRlcm5hbC9ydW50aW1lL2NvcmUvRGVidWdTaW5rLmpzXCJcbmltcG9ydCAqIGFzIExvZ2ljVW5pdE1ldGEgZnJvbSBcIi4vaW50ZXJuYWwvcnVudGltZS9jb3JlL0xvZ2ljVW5pdE1ldGEuanNcIlxuaW1wb3J0IHR5cGUge1xuICBBY3Rpb25zRnJvbU1hcCxcbiAgQW55TW9kdWxlU2hhcGUsXG4gIEFueVNjaGVtYSxcbiAgQm91bmRBcGksXG4gIEFjdGlvbk9mLFxuICBNb2R1bGVJbXBsLFxuICBNb2R1bGVMb2dpYyxcbiAgTW9kdWxlU2hhcGUsXG4gIE1vZHVsZVJ1bnRpbWUsXG4gIE1vZHVsZVRhZyxcbiAgTW9kdWxlSGFuZGxlLFxuICBNb2R1bGVIYW5kbGVVbmlvbixcbiAgU3RhdGVDaGFuZ2VXaXRoTWV0YSxcbiAgU3RhdGVDb21taXRNZXRhLFxuICBTdGF0ZUNvbW1pdE1vZGUsXG4gIFN0YXRlQ29tbWl0UHJpb3JpdHksXG4gIFJlZHVjZXJzRnJvbU1hcCxcbiAgU3RhdGVPZixcbn0gZnJvbSBcIi4vaW50ZXJuYWwvbW9kdWxlLmpzXCJcbmltcG9ydCAqIGFzIFN0YXRlVHJhaXQgZnJvbSBcIi4vU3RhdGVUcmFpdC5qc1wiXG5pbXBvcnQgdHlwZSB7IFN0YXRlVHJhaXRQcm9ncmFtIH0gZnJvbSBcIi4vU3RhdGVUcmFpdC5qc1wiXG5pbXBvcnQgKiBhcyBNb2R1bGVUcmFpdHNSZWdpc3RyeSBmcm9tIFwiLi9pbnRlcm5hbC9kZWJ1Zy9Nb2R1bGVUcmFpdHNSZWdpc3RyeS5qc1wiXG5pbXBvcnQgKiBhcyBNb2R1bGVUcmFpdHMgZnJvbSBcIi4vaW50ZXJuYWwvcnVudGltZS9jb3JlL01vZHVsZVRyYWl0cy5qc1wiXG5cbi8qKlxuICogTW9kdWxlVGFnIC8gTW9kdWxlUnVudGltZSAvIE1vZHVsZUltcGwgXHU3QjQ5XHU2ODM4XHU1RkMzXHU3QzdCXHU1NzhCXHU1QjlBXHU0RTQ5XHU3Njg0XHU1MTZDXHU1RjAwXHU1MUZBXHU1M0UzXHUzMDAyXG4gKlxuICogXHU0RTBFIC5jb2RleC9za2lsbHMvcHJvamVjdC1ndWlkZS9yZWZlcmVuY2VzL3J1bnRpbWUtbG9naXgvbG9naXgtY29yZS9hcGkvMDItbW9kdWxlLWFuZC1sb2dpYy1hcGkubWQgXHU0RkREXHU2MzAxXHU1QkY5XHU5RjUwXHUzMDAyXG4gKiBcdTUxNzdcdTRGNTNcdTdDN0JcdTU3OEJcdTVCOUFcdTRFNDlcdTk2QzZcdTRFMkRcdTU3MjggaW50ZXJuYWwvbW9kdWxlLnRzIFx1NEUyRFx1RkYwQ1x1NjcyQ1x1NkEyMVx1NTc1N1x1OEQxRlx1OEQyM1x1N0VDNFx1NTQwOFx1NURFNVx1NTM4Mlx1NUI5RVx1NzNCMFx1MzAwMlxuICovXG5leHBvcnQgdHlwZSB7XG4gIEFueVNjaGVtYSxcbiAgQW55TW9kdWxlU2hhcGUsXG4gIE1vZHVsZVNoYXBlLFxuICBNb2R1bGVMb2dpYyxcbiAgTW9kdWxlSW1wbCxcbiAgTW9kdWxlUnVudGltZSxcbiAgTW9kdWxlVGFnLFxuICBNb2R1bGVIYW5kbGUsXG4gIE1vZHVsZUhhbmRsZVVuaW9uLFxuICBTdGF0ZU9mLFxuICBBY3Rpb25zRnJvbU1hcCxcbiAgUmVkdWNlcnNGcm9tTWFwLFxuICBCb3VuZEFwaSxcbiAgQWN0aW9uT2YsXG4gIFN0YXRlQ29tbWl0TW9kZSxcbiAgU3RhdGVDb21taXRQcmlvcml0eSxcbiAgU3RhdGVDb21taXRNZXRhLFxuICBTdGF0ZUNoYW5nZVdpdGhNZXRhLFxufSBmcm9tIFwiLi9pbnRlcm5hbC9tb2R1bGUuanNcIlxuXG4vKipcbiAqIFJlZHVjZXIgXHU1RTJFXHU1MkE5XHU1REU1XHU1MTc3XHVGRjFBXG4gKiAtIGBSZWR1Y2VyLm11dGF0ZWAgXHU2M0QwXHU0RjlCXHU0RTBFIGAkLnN0YXRlLm11dGF0ZWAgXHU0RTAwXHU4MUY0XHU3Njg0IG11dGF0aXZlIFx1OThDRVx1NjgzQ1x1NTE5OVx1NkNENVx1RkYxQlxuICogLSBcdTkwMUFcdThGQzdcdTUxODVcdTkwRThcdTU3RkFcdTRFOEUgbXV0YXRpdmUgXHU3Njg0XHU0RTBEXHU1M0VGXHU1M0Q4XHU2NkY0XHU2NUIwXHVGRjBDXHU1QzA2XHUzMDBDXHU1QzMxXHU1NzMwXHU0RkVFXHU2NTM5IGRyYWZ0XHUzMDBEXHU2NjIwXHU1QzA0XHU0RTNBXHU3RUFGIGAoc3RhdGUsIGFjdGlvbikgPT4gc3RhdGVgIFx1NTFGRFx1NjU3MFx1MzAwMlxuICpcbiAqIFx1NzUyOFx1NkNENVx1NzkzQVx1NEY4Qlx1RkYxQVxuICpcbiAqICAgY29uc3QgQ291bnRlciA9IExvZ2l4Lk1vZHVsZVRhZy5tYWtlKFwiQ291bnRlclwiLCB7XG4gKiAgICAgc3RhdGU6IENvdW50ZXJTdGF0ZSxcbiAqICAgICBhY3Rpb25zOiBDb3VudGVyQWN0aW9ucyxcbiAqICAgICByZWR1Y2Vyczoge1xuICogICAgICAgaW5jOiBMb2dpeC5Nb2R1bGVUYWcuUmVkdWNlci5tdXRhdGUoKGRyYWZ0LCBfYWN0aW9uKSA9PiB7XG4gKiAgICAgICAgIGRyYWZ0LmNvdW50ICs9IDFcbiAqICAgICAgIH0pLFxuICogICAgIH0sXG4gKiAgIH0pXG4gKlxuICogICB5aWVsZCogJC5yZWR1Y2VyKFxuICogICAgIFwic2V0VmFsdWVcIixcbiAqICAgICBMb2dpeC5Nb2R1bGVUYWcuUmVkdWNlci5tdXRhdGUoKGRyYWZ0LCBhY3Rpb24pID0+IHtcbiAqICAgICAgIGRyYWZ0LnZhbHVlID0gYWN0aW9uLnBheWxvYWRcbiAqICAgICB9KSxcbiAqICAgKVxuICovXG5leHBvcnQgY29uc3QgUmVkdWNlciA9IHtcbiAgbXV0YXRlOiA8UywgQT4oXG4gICAgbXV0YXRvcjogKGRyYWZ0OiBMb2dpYy5EcmFmdDxTPiwgYWN0aW9uOiBBKSA9PiB2b2lkXG4gICk6ICgoc3RhdGU6IFMsIGFjdGlvbjogQSwgc2luaz86IChwYXRoOiBzdHJpbmcpID0+IHZvaWQpID0+IFMpID0+XG4gICAgKHN0YXRlLCBhY3Rpb24sIHNpbmspID0+IHtcbiAgICAgIGNvbnN0IHsgbmV4dFN0YXRlLCBwYXRjaFBhdGhzIH0gPSBtdXRhdGVXaXRoUGF0Y2hQYXRocyhcbiAgICAgICAgc3RhdGUgYXMgUyxcbiAgICAgICAgKGRyYWZ0KSA9PiB7XG4gICAgICAgICAgbXV0YXRvcihkcmFmdCBhcyBMb2dpYy5EcmFmdDxTPiwgYWN0aW9uKVxuICAgICAgICB9LFxuICAgICAgKVxuXG4gICAgICBpZiAoc2luaykge1xuICAgICAgICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0Y2hQYXRocykge1xuICAgICAgICAgIHNpbmsocGF0aClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV4dFN0YXRlXG4gICAgfSxcbn1cblxuLyoqXG4gKiBcdTdCODBcdTUzMTZcdTc2ODQgU2hhcGUgXHU1QjlBXHU0RTQ5XHU1MkE5XHU2MjRCXHVGRjBDXHU0RTEzXHU0RTNBIEFjdGlvbiBNYXAgXHU4QkJFXHU4QkExXHUzMDAyXG4gKiBAZXhhbXBsZSB0eXBlIE15U2hhcGUgPSBTaGFwZTx0eXBlb2YgTXlTdGF0ZSwgdHlwZW9mIE15QWN0aW9uTWFwPlxuICovXG5leHBvcnQgdHlwZSBTaGFwZTxcbiAgUyBleHRlbmRzIEFueVNjaGVtYSxcbiAgTSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIEFueVNjaGVtYT5cbj4gPSBNb2R1bGVTaGFwZTxTLCBTY2hlbWEuU2NoZW1hPEFjdGlvbnNGcm9tTWFwPE0+PiwgTT5cblxuY29uc3QgbWFrZUltcGwgPSA8XG4gIElkIGV4dGVuZHMgc3RyaW5nLFxuICBTU2NoZW1hIGV4dGVuZHMgQW55U2NoZW1hLFxuICBBTWFwIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgQW55U2NoZW1hPlxuPihcbiAgaWQ6IElkLFxuICBkZWY6IHtcbiAgICByZWFkb25seSBzdGF0ZTogU1NjaGVtYVxuICAgIHJlYWRvbmx5IGFjdGlvbnM6IEFNYXBcbiAgICByZWFkb25seSByZWR1Y2Vycz86IFJlZHVjZXJzRnJvbU1hcDxTU2NoZW1hLCBBTWFwPlxuICB9XG4pOiBNb2R1bGVUYWc8XG4gIElkLFxuICBNb2R1bGVTaGFwZTxTU2NoZW1hLCBTY2hlbWEuU2NoZW1hPEFjdGlvbnNGcm9tTWFwPEFNYXA+PiwgQU1hcD5cbj4gPT4gTW9kdWxlRmFjdG9yeS5Nb2R1bGUoaWQsIGRlZikgYXMgTW9kdWxlVGFnPFxuICBJZCxcbiAgTW9kdWxlU2hhcGU8U1NjaGVtYSwgU2NoZW1hLlNjaGVtYTxBY3Rpb25zRnJvbU1hcDxBTWFwPj4sIEFNYXA+XG4+XG5cbi8qKlxuICogTW9kdWxlVGFnLm1ha2VcdUZGMUFcbiAqIC0gXHU0RUU1XHU3RUQ5XHU1QjlBIGlkIFx1NEUwRSBzdGF0ZS9hY3Rpb25zL3JlZHVjZXJzIFx1NUI5QVx1NEU0OVx1NEUwMFx1NEUyQVx1OTg4Nlx1NTdERlx1NkEyMVx1NTc1NyBUYWdcdUZGMUJcbiAqIC0gXHU4RkQ0XHU1NkRFXHU3Njg0IE1vZHVsZVRhZyBcdTY1RTJcdTY2MkYgQ29udGV4dC5UYWdcdUZGMENcdTUzQzhcdTY0M0FcdTVFMjYgU2hhcGUgXHU0RTBFXHU1REU1XHU1MzgyXHU4MEZEXHU1MjlCXHUzMDAyXG4gKlxuICogXHU4QkY0XHU2NjBFXHVGRjFBMDIyIFx1OEQ3N1x1NjVFNyBgTW9kdWxlYFx1RkYwOFRhZyBpZGVudGl0eVx1RkYwOVx1NjZGNFx1NTQwRFx1NEUzQSBgTW9kdWxlVGFnYFx1RkYxQlx1OTg4Nlx1NTdERlx1NUI5QVx1NEU0OVx1NUJGOVx1OEM2MVx1OEJGN1x1NEY3Rlx1NzUyOCBgTG9naXguTW9kdWxlYFx1MzAwMlxuICovXG5leHBvcnQgY29uc3QgbWFrZSA9IDxcbiAgSWQgZXh0ZW5kcyBzdHJpbmcsXG4gIFNTY2hlbWEgZXh0ZW5kcyBBbnlTY2hlbWEsXG4gIEFNYXAgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBBbnlTY2hlbWE+XG4+KFxuICBpZDogSWQsXG4gIGRlZjoge1xuICAgIHJlYWRvbmx5IHN0YXRlOiBTU2NoZW1hXG4gICAgcmVhZG9ubHkgYWN0aW9uczogQU1hcFxuICAgIHJlYWRvbmx5IHJlZHVjZXJzPzogUmVkdWNlcnNGcm9tTWFwPFNTY2hlbWEsIEFNYXA+XG4gICAgLyoqXG4gICAgICogdHJhaXRzXHVGRjFBXG4gICAgICogLSBcdTc1MjhcdTRFOEVcdTYzMDJcdThGN0QgU3RhdGVUcmFpdFNwZWNcdUZGMDhcdThCRTZcdTg5QzEgc3BlY3MvMDAwLW1vZHVsZS10cmFpdHMtcnVudGltZVx1RkYwOVx1MzAwMlxuICAgICAqIC0gXHU1RjUzXHU1MjREXHU1QjlFXHU3M0IwXHU0RjFBXHU1NzI4IE1vZHVsZVRhZy5tYWtlIFx1OTYzNlx1NkJCNSBidWlsZCBQcm9ncmFtXHVGRjBDXHU1RTc2XHU1NzI4IGBNb2R1bGVUYWcuaW1wbGVtZW50YCBcdTZDRThcdTUxNjVcdTRFMDBcdTZCQjUgc2V0dXAtb25seSBMb2dpYyBcdTY3NjVcdThDMDNcdTc1MjggYFN0YXRlVHJhaXQuaW5zdGFsbGBcdTMwMDJcbiAgICAgKiAgIFx1RkYwOFx1NkNFOFx1RkYxQVx1ODJFNVx1NEY3Rlx1NzUyOCBgTW9kdWxlVGFnLmxpdmVgIFx1NzZGNFx1NTFGQSBMYXllciBcdTRFMTRcdTVFMENcdTY3MUJcdTU0MkZcdTc1MjggdHJhaXRzIFx1ODg0Q1x1NEUzQVx1RkYwQ1x1OEJGN1x1NjYzRVx1NUYwRlx1NTcyOCBsb2dpY3MgXHU0RTJEXHU4QzAzXHU3NTI4IGBTdGF0ZVRyYWl0Lmluc3RhbGxgXHVGRjBDXHU2MjE2XHU2NTM5XHU3NTI4IGBNb2R1bGVUYWcuaW1wbGVtZW50YFx1MzAwMlx1RkYwOVxuICAgICAqL1xuICAgIHJlYWRvbmx5IHRyYWl0cz86IHVua25vd25cbiAgfVxuKTogTW9kdWxlVGFnPFxuICBJZCxcbiAgTW9kdWxlU2hhcGU8U1NjaGVtYSwgU2NoZW1hLlNjaGVtYTxBY3Rpb25zRnJvbU1hcDxBTWFwPj4sIEFNYXA+XG4+ID0+IHtcbiAgY29uc3QgbW9kdWxlVGFnID0gbWFrZUltcGwoaWQsIGRlZilcblxuICB0eXBlIFNoID0gTW9kdWxlU2hhcGU8U1NjaGVtYSwgU2NoZW1hLlNjaGVtYTxBY3Rpb25zRnJvbU1hcDxBTWFwPj4sIEFNYXA+XG5cbiAgY29uc3Qgc3RhdGVTY2hlbWEgPSBkZWYuc3RhdGUgYXMgU2NoZW1hLlNjaGVtYTxhbnksIGFueT5cbiAgY29uc3QgbW9kdWxlVHJhaXRzU3BlYyA9IGRlZi50cmFpdHMgYXMgU3RhdGVUcmFpdC5TdGF0ZVRyYWl0U3BlYzxhbnk+IHwgdW5kZWZpbmVkXG4gIGNvbnN0IGJhc2VQcm9ncmFtOiBTdGF0ZVRyYWl0UHJvZ3JhbTxhbnk+IHwgdW5kZWZpbmVkID0gbW9kdWxlVHJhaXRzU3BlY1xuICAgID8gU3RhdGVUcmFpdC5idWlsZChzdGF0ZVNjaGVtYSBhcyBhbnksIG1vZHVsZVRyYWl0c1NwZWMgYXMgYW55KVxuICAgIDogdW5kZWZpbmVkXG5cbiAgaWYgKGJhc2VQcm9ncmFtKSB7XG4gICAgLy8gXHU0RjlCIFRyYWl0TGlmZWN5Y2xlL0RlYnVnL0RldnRvb2xzIFx1OEJGQlx1NTNENlx1RkYwOFx1NUI5QVx1NEU0OVx1NEZBN1x1OTY5MFx1ODVDRlx1NjlGRFx1NEY0RFx1RkYwOVx1MzAwMlxuICAgIHNldE1vZHVsZVRyYWl0c1Byb2dyYW0obW9kdWxlVGFnIGFzIGFueSwgYmFzZVByb2dyYW0pXG4gICAgTW9kdWxlVHJhaXRzUmVnaXN0cnkucmVnaXN0ZXJNb2R1bGVQcm9ncmFtKGlkLCBiYXNlUHJvZ3JhbSBhcyBTdGF0ZVRyYWl0UHJvZ3JhbTxhbnk+KVxuICB9XG5cbiAgLy8gMDIzXHVGRjFBdHJhaXRzIFx1NzY4NFx1MjAxQ1x1NThGMFx1NjYwRVx1NTE2NVx1NTNFMy9cdTU0MDhcdTVFNzZcdTUxNjVcdTUzRTNcdTIwMURcdTdFREZcdTRFMDBcdTY1MzZcdTY1NUJcdTUyMzAgc2V0dXAgXHU5NjM2XHU2QkI1XHVGRjFBXG4gIC8vIC0gbW9kdWxlLWxldmVsIHRyYWl0cyBcdTUxNDhcdTRGNUNcdTRFM0EgY29udHJpYnV0aW9uIFx1NkNFOFx1NTE4Q1x1RkYxQlxuICAvLyAtIGxvZ2ljLWxldmVsIFx1OTAxQVx1OEZDNyAkLnRyYWl0cy5kZWNsYXJlIFx1NkNFOFx1NTE4Q1x1RkYxQlxuICAvLyAtIFx1NjcwMFx1NTQwRVx1NEUwMFx1NkIyMVx1NjAyNyBmaW5hbGl6ZSBcdTIxOTIgZnJlZXplIFx1MjE5MiBidWlsZC9pbnN0YWxsXHUzMDAyXG5cbiAgY29uc3QgbWFrZU1vZHVsZVRyYWl0c0NvbnRyaWJ1dGlvbkxvZ2ljID0gKFxuICAgIHRyYWl0czogdW5rbm93bixcbiAgKTogTW9kdWxlTG9naWM8U2gsIG5ldmVyLCBuZXZlcj4gPT4ge1xuICAgIGNvbnN0IGxvZ2ljID0gbW9kdWxlVGFnLmxvZ2ljKCgkKSA9PiAoe1xuICAgICAgc2V0dXA6IEVmZmVjdC5zeW5jKCgpID0+IHtcbiAgICAgICAgaWYgKCF0cmFpdHMgfHwgdHlwZW9mIHRyYWl0cyAhPT0gXCJvYmplY3RcIikgcmV0dXJuXG4gICAgICAgIC8vIG1vZHVsZS1sZXZlbCBwcm92ZW5hbmNlXHVGRjFBXHU0RUU1IG1vZHVsZUlkIFx1NEY1Q1x1NEUzQVx1N0EzM1x1NUI5QVx1OTUxQVx1NzBCOVxuICAgICAgICAvL1x1RkYwOFx1NUJGOVx1OUY1MCAwMjMgZGF0YS1tb2RlbFx1RkYxQW9yaWdpblR5cGU9bW9kdWxlLCBvcmlnaW5JZD1tb2R1bGVJZFx1RkYwOVx1MzAwMlxuICAgICAgICAvLyBcdTZDRThcdTYxMEZcdUZGMUF0cmFpdHNTcGVjIFx1NEVDRFx1NTkwRFx1NzUyOCBTdGF0ZVRyYWl0U3BlYyBcdTdFRDNcdTY3ODRcdUZGMENcdTRFMERcdTVGMTVcdTUxNjVcdTdCMkNcdTRFOENcdTU5NTcgSVJcdTMwMDJcbiAgICAgICAgY29uc3QgaW50ZXJuYWxzID0gZ2V0Qm91bmRJbnRlcm5hbHMoJCBhcyBhbnkpXG4gICAgICAgIGludGVybmFscy50cmFpdHMucmVnaXN0ZXJNb2R1bGVUcmFpdHNDb250cmlidXRpb24oe1xuICAgICAgICAgIHRyYWl0cyxcbiAgICAgICAgICBwcm92ZW5hbmNlOiB7XG4gICAgICAgICAgICBvcmlnaW5UeXBlOiBcIm1vZHVsZVwiLFxuICAgICAgICAgICAgb3JpZ2luSWQ6IGlkLFxuICAgICAgICAgICAgb3JpZ2luSWRLaW5kOiBcImV4cGxpY2l0XCIsXG4gICAgICAgICAgICBvcmlnaW5MYWJlbDogYG1vZHVsZToke2lkfWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgIH0pLFxuICAgICAgcnVuOiBFZmZlY3Qudm9pZCxcbiAgICB9KSkgYXMgTW9kdWxlTG9naWM8U2gsIG5ldmVyLCBuZXZlcj5cblxuICAgIExvZ2ljVW5pdE1ldGEuYXR0YWNoTG9naWNVbml0TWV0YShsb2dpYyBhcyBhbnksIHtcbiAgICAgIGlkOiBcIl9fbG9naXhfaW50ZXJuYWw6dHJhaXRzOm1vZHVsZV9jb250cmliXCIsXG4gICAgICBraW5kOiBcImludGVybmFsXCIsXG4gICAgICBuYW1lOiBcInRyYWl0czptb2R1bGVfY29udHJpYlwiLFxuICAgICAgbW9kdWxlSWQ6IGlkLFxuICAgIH0pXG4gICAgcmV0dXJuIGxvZ2ljXG4gIH1cblxuICBjb25zdCBtYWtlRmluYWxpemVUcmFpdHNMb2dpYyA9ICgpOiBNb2R1bGVMb2dpYzxTaCwgbmV2ZXIsIG5ldmVyPiA9PiB7XG4gICAgY29uc3QgbG9naWMgPSBtb2R1bGVUYWcubG9naWMoKCQpID0+ICh7XG4gICAgICBzZXR1cDogRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBpbnRlcm5hbHMgPSBnZXRCb3VuZEludGVybmFscygkIGFzIGFueSlcbiAgICAgICAgY29uc3QgZGlhZ25vc3RpY3NMZXZlbCA9IHlpZWxkKiBGaWJlclJlZi5nZXQoRGVidWcuY3VycmVudERpYWdub3N0aWNzTGV2ZWwpXG5cbiAgICAgICAgY29uc3QgY29udHJpYnV0aW9ucyA9IGludGVybmFscy50cmFpdHMuZ2V0TW9kdWxlVHJhaXRzQ29udHJpYnV0aW9ucygpXG4gICAgICAgIGxldCBtZXJnZWQ6IE1vZHVsZVRyYWl0cy5UcmFpdFNwZWNcbiAgICAgICAgbGV0IHNuYXBzaG90OiBNb2R1bGVUcmFpdHMuTW9kdWxlVHJhaXRzU25hcHNob3RcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIDsoeyBtZXJnZWQsIHNuYXBzaG90IH0gPSBNb2R1bGVUcmFpdHMuZmluYWxpemVUcmFpdENvbnRyaWJ1dGlvbnMoe1xuICAgICAgICAgICAgbW9kdWxlSWQ6IGlkLFxuICAgICAgICAgICAgY29udHJpYnV0aW9ucyxcbiAgICAgICAgICB9KSlcbiAgICAgICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBkaWFnbm9zdGljc0xldmVsICE9PSBcIm9mZlwiICYmXG4gICAgICAgICAgICBjYXVzZSAmJlxuICAgICAgICAgICAgdHlwZW9mIGNhdXNlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICAoY2F1c2UgYXMgYW55KS5fdGFnID09PSBcIk1vZHVsZVRyYWl0c0NvbmZsaWN0RXJyb3JcIlxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgY29uZmxpY3RzID0gQXJyYXkuaXNBcnJheSgoY2F1c2UgYXMgYW55KS5jb25mbGljdHMpXG4gICAgICAgICAgICAgID8gKChjYXVzZSBhcyBhbnkpLmNvbmZsaWN0cyBhcyBSZWFkb25seUFycmF5PHVua25vd24+KVxuICAgICAgICAgICAgICA6IFtdXG4gICAgICAgICAgICBjb25zdCB0cmFpdElkcyA9IGNvbmZsaWN0c1xuICAgICAgICAgICAgICAubWFwKChjOiBhbnkpID0+IChjICYmIHR5cGVvZiBjID09PSBcIm9iamVjdFwiID8gKGMgYXMgYW55KS50cmFpdElkIDogdW5kZWZpbmVkKSlcbiAgICAgICAgICAgICAgLmZpbHRlcigodCk6IHQgaXMgc3RyaW5nID0+IHR5cGVvZiB0ID09PSBcInN0cmluZ1wiICYmIHQubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgLnNsaWNlKDAsIDIwKVxuXG4gICAgICAgICAgICBjb25zdCBkYXRhID1cbiAgICAgICAgICAgICAgZGlhZ25vc3RpY3NMZXZlbCA9PT0gXCJmdWxsXCJcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmxpY3RDb3VudDogY29uZmxpY3RzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgY29uZmxpY3RzLFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICBjb25mbGljdENvdW50OiBjb25mbGljdHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICB0cmFpdElkcyxcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgeWllbGQqIERlYnVnLnJlY29yZCh7XG4gICAgICAgICAgICAgIHR5cGU6IFwidHJhY2U6bW9kdWxlOnRyYWl0czpjb25mbGljdFwiLFxuICAgICAgICAgICAgICBtb2R1bGVJZDogaWQsXG4gICAgICAgICAgICAgIGluc3RhbmNlSWQ6IGludGVybmFscy5pbnN0YW5jZUlkLFxuICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgfSBhcyBhbnkpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhyb3cgY2F1c2VcbiAgICAgICAgfVxuXG4gICAgICAgIGludGVybmFscy50cmFpdHMuc2V0TW9kdWxlVHJhaXRzU25hcHNob3Qoc25hcHNob3QpXG4gICAgICAgIGludGVybmFscy50cmFpdHMuZnJlZXplTW9kdWxlVHJhaXRzKClcblxuICAgICAgICBpZiAoZGlhZ25vc3RpY3NMZXZlbCAhPT0gXCJvZmZcIikge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPVxuICAgICAgICAgICAgZGlhZ25vc3RpY3NMZXZlbCA9PT0gXCJmdWxsXCJcbiAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICBkaWdlc3Q6IHNuYXBzaG90LmRpZ2VzdCxcbiAgICAgICAgICAgICAgICAgIGNvdW50OiBzbmFwc2hvdC50cmFpdHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgdHJhaXRzOiBzbmFwc2hvdC50cmFpdHMsXG4gICAgICAgICAgICAgICAgICBwcm92ZW5hbmNlSW5kZXg6IHNuYXBzaG90LnByb3ZlbmFuY2VJbmRleCxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgZGlnZXN0OiBzbmFwc2hvdC5kaWdlc3QsXG4gICAgICAgICAgICAgICAgICBjb3VudDogc25hcHNob3QudHJhaXRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICB5aWVsZCogRGVidWcucmVjb3JkKHtcbiAgICAgICAgICAgIHR5cGU6IFwidHJhY2U6bW9kdWxlOnRyYWl0c1wiLFxuICAgICAgICAgICAgbW9kdWxlSWQ6IGlkLFxuICAgICAgICAgICAgaW5zdGFuY2VJZDogaW50ZXJuYWxzLmluc3RhbmNlSWQsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgIH0gYXMgYW55KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKG1lcmdlZCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvbmx5TW9kdWxlTGV2ZWwgPVxuICAgICAgICAgIGNvbnRyaWJ1dGlvbnMubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgY29udHJpYnV0aW9uc1swXT8ucHJvdmVuYW5jZT8ub3JpZ2luVHlwZSA9PT0gXCJtb2R1bGVcIlxuXG4gICAgICAgIC8vIFx1NTdGQVx1NEU4RVx1NjcwMFx1N0VDOFx1NTQwOFx1NUU3Nlx1NTQwRVx1NzY4NCBTcGVjIFx1Njc4NFx1OTAyMFx1NEUwMFx1NkIyMVx1NjAyNyBQcm9ncmFtXHVGRjBDXHU1RTc2XHU1NzI4XHU1MjFEXHU1OUNCXHU1MzE2XHU5NjM2XHU2QkI1XHU1Qjg5XHU4OEM1XHUzMDAyXG4gICAgICAgIC8vIC0gXHU4MkU1XHU1M0VBXHU2NzA5IG1vZHVsZS1sZXZlbCBjb250cmlidXRpb25cdUZGMENcdTUyMTlcdTU5MERcdTc1MjggTW9kdWxlVGFnLm1ha2UgXHU5NjM2XHU2QkI1XHU5ODg0XHU2Nzg0XHU1RUZBXHU3Njg0IHByb2dyYW1cdUZGMDhcdTRGQkZcdTRFOEUgRGVidWcvVHJhaXRMaWZlY3ljbGVcdUZGMDlcdTMwMDJcbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9XG4gICAgICAgICAgb25seU1vZHVsZUxldmVsICYmIGJhc2VQcm9ncmFtXG4gICAgICAgICAgICA/IGJhc2VQcm9ncmFtXG4gICAgICAgICAgICA6IFN0YXRlVHJhaXQuYnVpbGQoc3RhdGVTY2hlbWEgYXMgYW55LCBtZXJnZWQgYXMgYW55KVxuXG4gICAgICAgIC8vIFx1NEY5QiBUcmFpdExpZmVjeWNsZS9EZWJ1Zy9EZXZ0b29scyBcdThCRkJcdTUzRDZcdUZGMDhcdTVCOUFcdTRFNDlcdTRGQTdcdTk2OTBcdTg1Q0ZcdTY5RkRcdTRGNERcdUZGMDlcdTMwMDJcbiAgICAgICAgc2V0TW9kdWxlVHJhaXRzUHJvZ3JhbShtb2R1bGVUYWcgYXMgYW55LCBwcm9ncmFtKVxuICAgICAgICBNb2R1bGVUcmFpdHNSZWdpc3RyeS5yZWdpc3Rlck1vZHVsZVByb2dyYW0oaWQsIHByb2dyYW0gYXMgU3RhdGVUcmFpdFByb2dyYW08YW55PilcblxuICAgICAgICB5aWVsZCogU3RhdGVUcmFpdC5pbnN0YWxsKCQgYXMgdW5rbm93biBhcyBCb3VuZEFwaTxhbnksIGFueT4sIHByb2dyYW0pXG4gICAgICB9KSxcbiAgICAgIHJ1bjogRWZmZWN0LnZvaWQsXG4gICAgfSkpIGFzIE1vZHVsZUxvZ2ljPFNoLCBuZXZlciwgbmV2ZXI+XG5cbiAgICBMb2dpY1VuaXRNZXRhLmF0dGFjaExvZ2ljVW5pdE1ldGEobG9naWMgYXMgYW55LCB7XG4gICAgICBpZDogXCJfX2xvZ2l4X2ludGVybmFsOnRyYWl0czpmaW5hbGl6ZVwiLFxuICAgICAga2luZDogXCJpbnRlcm5hbFwiLFxuICAgICAgbmFtZTogXCJ0cmFpdHM6ZmluYWxpemVcIixcbiAgICAgIG1vZHVsZUlkOiBpZCxcbiAgICB9KVxuXG4gICAgcmV0dXJuIGxvZ2ljXG4gIH1cblxuICAvLyBcdTUzMDVcdTg4QzUgaW1wbGVtZW50XHVGRjFBXHU1NzI4XHU1QjlFXHU3M0IwXHU1QzQyXHU2Q0U4XHU1MTY1XHVGRjA4MVx1RkYwOW1vZHVsZS1sZXZlbCBjb250cmlidXRpb24gbG9naWNcdUZGMDhcdTUzRUZcdTkwMDlcdUZGMDlcdUZGMDgyXHVGRjA5ZmluYWxpemUraW5zdGFsbCBsb2dpY1x1RkYwOFx1NUZDNVx1OTAwOVx1RkYwOVx1MzAwMlxuICBjb25zdCBvcmlnaW5hbEltcGxlbWVudCA9IG1vZHVsZVRhZy5pbXBsZW1lbnRcbiAgOyhtb2R1bGVUYWcgYXMgYW55KS5pbXBsZW1lbnQgPSAoPFIgPSBuZXZlcj4oY29uZmlnOiB7XG4gICAgaW5pdGlhbDogU3RhdGVPZjx0eXBlb2YgbW9kdWxlVGFnLnNoYXBlPlxuICAgIGxvZ2ljcz86IEFycmF5PE1vZHVsZUxvZ2ljPHR5cGVvZiBtb2R1bGVUYWcuc2hhcGUsIFIsIGFueT4+XG4gICAgaW1wb3J0cz86IFJlYWRvbmx5QXJyYXk8XG4gICAgICBMYXllci5MYXllcjxhbnksIGFueSwgYW55PiB8IE1vZHVsZUltcGw8YW55LCBBbnlNb2R1bGVTaGFwZSwgYW55PlxuICAgID5cbiAgICBwcm9jZXNzZXM/OiBSZWFkb25seUFycmF5PEVmZmVjdC5FZmZlY3Q8dm9pZCwgYW55LCBhbnk+PlxuICB9KSA9PiB7XG4gICAgY29uc3QgdXNlckxvZ2ljcyA9IChjb25maWcubG9naWNzID8/IFtdKSBhcyBBcnJheTxNb2R1bGVMb2dpYzxcbiAgICAgIHR5cGVvZiBtb2R1bGVUYWcuc2hhcGUsXG4gICAgICBSLFxuICAgICAgYW55XG4gICAgPj5cblxuICAgIGNvbnN0IG1vZHVsZUxldmVsID1cbiAgICAgIGRlZi50cmFpdHMgPyBbbWFrZU1vZHVsZVRyYWl0c0NvbnRyaWJ1dGlvbkxvZ2ljKGRlZi50cmFpdHMpIGFzIGFueV0gOiBbXVxuXG4gICAgY29uc3QgZmluYWxpemUgPSBtYWtlRmluYWxpemVUcmFpdHNMb2dpYygpIGFzIE1vZHVsZUxvZ2ljPFxuICAgICAgdHlwZW9mIG1vZHVsZVRhZy5zaGFwZSxcbiAgICAgIFIsXG4gICAgICBhbnlcbiAgICA+XG5cbiAgICBjb25zdCBtZXJnZWRMb2dpY3MgPSBbLi4ubW9kdWxlTGV2ZWwsIC4uLnVzZXJMb2dpY3MsIGZpbmFsaXplXVxuXG4gICAgcmV0dXJuIG9yaWdpbmFsSW1wbGVtZW50PFI+KHtcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIGxvZ2ljczogbWVyZ2VkTG9naWNzLFxuICAgIH0pXG4gIH0pIGFzIHR5cGVvZiBtb2R1bGVUYWcuaW1wbGVtZW50XG5cbiAgcmV0dXJuIG1vZHVsZVRhZ1xufVxuIiwgImltcG9ydCB7IGZudjFhMzIsIHN0YWJsZVN0cmluZ2lmeSB9IGZyb20gXCIuLi8uLi9kaWdlc3QuanNcIlxuXG5leHBvcnQgdHlwZSBUcmFpdElkID0gc3RyaW5nXG5cbmV4cG9ydCB0eXBlIFRyYWl0T3JpZ2luVHlwZSA9IFwibW9kdWxlXCIgfCBcImxvZ2ljVW5pdFwiXG5leHBvcnQgdHlwZSBUcmFpdE9yaWdpbklkS2luZCA9IFwiZXhwbGljaXRcIiB8IFwiZGVyaXZlZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhaXRQcm92ZW5hbmNlIHtcbiAgcmVhZG9ubHkgb3JpZ2luVHlwZTogVHJhaXRPcmlnaW5UeXBlXG4gIHJlYWRvbmx5IG9yaWdpbklkOiBzdHJpbmdcbiAgcmVhZG9ubHkgb3JpZ2luSWRLaW5kOiBUcmFpdE9yaWdpbklkS2luZFxuICAvKipcbiAgICogXHU3RUQ5IERldnRvb2xzL1x1OTUxOVx1OEJFRlx1NEZFMVx1NjA2Rlx1NUM1NVx1NzkzQVx1NzY4NFx1NTNFRlx1OEJGQlx1NjgwN1x1N0I3RVx1RkYwOFx1NEY4Qlx1NTk4MiBcImxvZ2ljVW5pdDpQcm9maWxlIzFcIlx1RkYwOVx1MzAwMlxuICAgKi9cbiAgcmVhZG9ubHkgb3JpZ2luTGFiZWw6IHN0cmluZ1xuICAvKipcbiAgICogXHU1M0VGXHU5MDA5XHVGRjFBXHU1OEYwXHU2NjBFXHU0RjREXHU3RjZFXHU2NDU4XHU4OTgxXHVGRjA4XHU0RjhCXHU1OTgyXHU2NTg3XHU0RUY2XHU4REVGXHU1Rjg0L1x1OEMwM1x1NzUyOFx1NzBCOVx1RkYwOVx1RkYwQ1x1NEVDNVx1NzUyOFx1NEU4RVx1NUI5QVx1NEY0RFx1RkYwQ1x1NEUwRFx1NTNDMlx1NEUwRVx1OEJFRFx1NEU0OVx1ODhDMVx1NTFCM1x1MzAwMlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aD86IHN0cmluZ1xufVxuXG4vKipcbiAqIFRyYWl0U3BlY1x1RkYxQVxuICogLSBcdTRGNUNcdTRFM0FcdTIwMUN0cmFpdHMgXHU1OEYwXHU2NjBFXHUyMDFEXHU3Njg0XHU2NzAwXHU1QzBGXHU1RjYyXHU2MDAxXHVGRjFBXHU0RTAwXHU3RUM0XHU0RUU1IHRyYWl0SWQgXHU0RTNBIGtleSBcdTc2ODRcdTU4RjBcdTY2MEVcdTVCRjlcdThDNjFcdUZGMUJcbiAqIC0gXHU1MTc3XHU0RjUzIHZhbHVlIFx1NUY2Mlx1NjAwMVx1NzUzMVx1NTE3N1x1NEY1MyB0cmFpdCBcdTdDRkJcdTdFREZcdUZGMDhcdTU5ODIgU3RhdGVUcmFpdFNwZWNcdUZGMDlcdTUxQjNcdTVCOUFcdUZGMUJcbiAqIC0gXHU4RkQ5XHU5MUNDXHU0RTBEXHU3RUE2XHU2NzVGIHZhbHVlIFx1NzY4NFx1NTNFRlx1NUU4Rlx1NTIxN1x1NTMxNlx1NjAyN1x1RkYwOFx1OEZEMFx1ODg0Q1x1NjcxRiBpbnN0YWxsIFx1NTNFRlx1ODBGRFx1NEY5RFx1OEQ1Nlx1NTFGRFx1NjU3MFx1RkYwOVx1RkYwQ1x1NEY0NiBTbmFwc2hvdC9cdThCQzFcdTYzNkVcdTVCRkNcdTUxRkFcdTVGQzVcdTk4N0JcdTUzRUFcdTUzRDZcdTUzRUZcdTVFOEZcdTUyMTdcdTUzMTZcdTVCNTBcdTk2QzZcdTMwMDJcbiAqL1xuZXhwb3J0IHR5cGUgVHJhaXRTcGVjID0gb2JqZWN0XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhaXRDb250cmlidXRpb24ge1xuICByZWFkb25seSB0cmFpdHM6IFRyYWl0U3BlY1xuICByZWFkb25seSBwcm92ZW5hbmNlOiBUcmFpdFByb3ZlbmFuY2Vcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb2R1bGVUcmFpdEl0ZW0ge1xuICByZWFkb25seSB0cmFpdElkOiBUcmFpdElkXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZ1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBUcmFpdENvbmZsaWN0S2luZCA9XG4gIHwgXCJkdXBsaWNhdGVfdHJhaXRJZFwiXG4gIHwgXCJtaXNzaW5nX3JlcXVpcmVzXCJcbiAgfCBcImV4Y2x1ZGVzX3Zpb2xhdGlvblwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhaXRDb25mbGljdCB7XG4gIHJlYWRvbmx5IGtpbmQ6IFRyYWl0Q29uZmxpY3RLaW5kXG4gIHJlYWRvbmx5IHRyYWl0SWQ6IFRyYWl0SWRcbiAgcmVhZG9ubHkgc291cmNlczogUmVhZG9ubHlBcnJheTxUcmFpdFByb3ZlbmFuY2U+XG4gIHJlYWRvbmx5IG1pc3Npbmc/OiBSZWFkb25seUFycmF5PFRyYWl0SWQ+XG4gIHJlYWRvbmx5IHByZXNlbnQ/OiBSZWFkb25seUFycmF5PFRyYWl0SWQ+XG59XG5cbmV4cG9ydCBjbGFzcyBNb2R1bGVUcmFpdHNDb25mbGljdEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICByZWFkb25seSBfdGFnID0gXCJNb2R1bGVUcmFpdHNDb25mbGljdEVycm9yXCJcblxuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nLFxuICAgIHJlYWRvbmx5IGNvbmZsaWN0czogUmVhZG9ubHlBcnJheTxUcmFpdENvbmZsaWN0PixcbiAgKSB7XG4gICAgc3VwZXIoXG4gICAgICBbXG4gICAgICAgIGBbTW9kdWxlVHJhaXRzQ29uZmxpY3RFcnJvcl0gQ29uZmxpY3RpbmcgdHJhaXRJZHMgZm91bmQgKG1vZHVsZUlkPSR7bW9kdWxlSWR9KS5gLFxuICAgICAgICAuLi5jb25mbGljdHMubWFwKFxuICAgICAgICAgIChjKSA9PlxuICAgICAgICAgICAgYy5raW5kID09PSBcImR1cGxpY2F0ZV90cmFpdElkXCJcbiAgICAgICAgICAgICAgPyBgLSBkdXBsaWNhdGUgJHtjLnRyYWl0SWR9OiAke2Muc291cmNlc1xuICAgICAgICAgICAgICAgICAgLm1hcCgocykgPT4gYCR7cy5vcmlnaW5UeXBlfToke3Mub3JpZ2luSWR9YClcbiAgICAgICAgICAgICAgICAgIC5qb2luKFwiLCBcIil9YFxuICAgICAgICAgICAgICA6IGMua2luZCA9PT0gXCJtaXNzaW5nX3JlcXVpcmVzXCJcbiAgICAgICAgICAgICAgICA/IGAtIG1pc3NpbmcgcmVxdWlyZXMgZm9yICR7Yy50cmFpdElkfTogJHsoYy5taXNzaW5nID8/IFtdKS5qb2luKFwiLCBcIil9OyBzb3VyY2VzPSR7Yy5zb3VyY2VzXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKHMpID0+IGAke3Mub3JpZ2luVHlwZX06JHtzLm9yaWdpbklkfWApXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKFwiLCBcIil9YFxuICAgICAgICAgICAgICAgIDogYC0gZXhjbHVkZXMgdmlvbGF0aW9uIGZvciAke2MudHJhaXRJZH06IHByZXNlbnQ9JHsoYy5wcmVzZW50ID8/IFtdKS5qb2luKFwiLCBcIil9OyBzb3VyY2VzPSR7Yy5zb3VyY2VzXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKHMpID0+IGAke3Mub3JpZ2luVHlwZX06JHtzLm9yaWdpbklkfWApXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKFwiLCBcIil9YCxcbiAgICAgICAgKSxcbiAgICAgIF0uam9pbihcIlxcblwiKSxcbiAgICApXG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb2R1bGVUcmFpdHNTbmFwc2hvdCB7XG4gIHJlYWRvbmx5IG1vZHVsZUlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgZGlnZXN0OiBzdHJpbmdcbiAgcmVhZG9ubHkgdHJhaXRzOiBSZWFkb25seUFycmF5PE1vZHVsZVRyYWl0SXRlbT5cbiAgcmVhZG9ubHkgcHJvdmVuYW5jZUluZGV4OiBSZWNvcmQ8VHJhaXRJZCwgVHJhaXRQcm92ZW5hbmNlPlxufVxuXG5jb25zdCB0b1Byb3ZlbmFuY2VLZXkgPSAocDogVHJhaXRQcm92ZW5hbmNlKTogc3RyaW5nID0+XG4gIGAke3Aub3JpZ2luVHlwZX06JHtwLm9yaWdpbklkfToke3Aub3JpZ2luSWRLaW5kfToke3Aub3JpZ2luTGFiZWx9OiR7cC5wYXRoID8/IFwiXCJ9YFxuXG5jb25zdCBjb21wYXJlUHJvdmVuYW5jZSA9IChhOiBUcmFpdFByb3ZlbmFuY2UsIGI6IFRyYWl0UHJvdmVuYW5jZSk6IG51bWJlciA9PiB7XG4gIGNvbnN0IHR5cGUgPSBhLm9yaWdpblR5cGUubG9jYWxlQ29tcGFyZShiLm9yaWdpblR5cGUpXG4gIGlmICh0eXBlICE9PSAwKSByZXR1cm4gdHlwZVxuICBjb25zdCBpZCA9IGEub3JpZ2luSWQubG9jYWxlQ29tcGFyZShiLm9yaWdpbklkKVxuICBpZiAoaWQgIT09IDApIHJldHVybiBpZFxuICBjb25zdCBraW5kID0gYS5vcmlnaW5JZEtpbmQubG9jYWxlQ29tcGFyZShiLm9yaWdpbklkS2luZClcbiAgaWYgKGtpbmQgIT09IDApIHJldHVybiBraW5kXG4gIGNvbnN0IGxhYmVsID0gYS5vcmlnaW5MYWJlbC5sb2NhbGVDb21wYXJlKGIub3JpZ2luTGFiZWwpXG4gIGlmIChsYWJlbCAhPT0gMCkgcmV0dXJuIGxhYmVsXG4gIHJldHVybiBTdHJpbmcoYS5wYXRoID8/IFwiXCIpLmxvY2FsZUNvbXBhcmUoU3RyaW5nKGIucGF0aCA/PyBcIlwiKSlcbn1cblxuY29uc3Qgb3JpZ2luVHlwZU9yZGVyID0gKHQ6IFRyYWl0T3JpZ2luVHlwZSk6IG51bWJlciA9PlxuICB0ID09PSBcIm1vZHVsZVwiID8gMCA6IDFcblxuY29uc3QgY29tcGFyZVRyYWl0SWRCeVByb3ZlbmFuY2UgPSAoXG4gIGE6IHsgcmVhZG9ubHkgdHJhaXRJZDogVHJhaXRJZDsgcmVhZG9ubHkgcHJvdmVuYW5jZTogVHJhaXRQcm92ZW5hbmNlIH0sXG4gIGI6IHsgcmVhZG9ubHkgdHJhaXRJZDogVHJhaXRJZDsgcmVhZG9ubHkgcHJvdmVuYW5jZTogVHJhaXRQcm92ZW5hbmNlIH0sXG4pOiBudW1iZXIgPT4ge1xuICBjb25zdCB0YSA9IG9yaWdpblR5cGVPcmRlcihhLnByb3ZlbmFuY2Uub3JpZ2luVHlwZSkgLSBvcmlnaW5UeXBlT3JkZXIoYi5wcm92ZW5hbmNlLm9yaWdpblR5cGUpXG4gIGlmICh0YSAhPT0gMCkgcmV0dXJuIHRhXG4gIGNvbnN0IG9hID0gYS5wcm92ZW5hbmNlLm9yaWdpbklkLmxvY2FsZUNvbXBhcmUoYi5wcm92ZW5hbmNlLm9yaWdpbklkKVxuICBpZiAob2EgIT09IDApIHJldHVybiBvYVxuICByZXR1cm4gYS50cmFpdElkLmxvY2FsZUNvbXBhcmUoYi50cmFpdElkKVxufVxuXG5jb25zdCBleHRyYWN0U3RyaW5nQXJyYXkgPSAodmFsdWU6IHVua25vd24pOiBSZWFkb25seUFycmF5PHN0cmluZz4gPT4ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gW11cbiAgY29uc3Qgb3V0OiBBcnJheTxzdHJpbmc+ID0gW11cbiAgZm9yIChjb25zdCB2IG9mIHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2ICE9PSBcInN0cmluZ1wiKSBjb250aW51ZVxuICAgIGNvbnN0IHMgPSB2LnRyaW0oKVxuICAgIGlmICghcykgY29udGludWVcbiAgICBvdXQucHVzaChzKVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuY29uc3QgZ2V0VHJhaXRSZXF1aXJlcyA9ICh2YWx1ZTogdW5rbm93bik6IFJlYWRvbmx5QXJyYXk8VHJhaXRJZD4gPT4ge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIFtdXG4gIGNvbnN0IGRpcmVjdCA9IGV4dHJhY3RTdHJpbmdBcnJheSgodmFsdWUgYXMgYW55KS5yZXF1aXJlcylcbiAgcmV0dXJuIGRpcmVjdFxufVxuXG5jb25zdCBnZXRUcmFpdEV4Y2x1ZGVzID0gKHZhbHVlOiB1bmtub3duKTogUmVhZG9ubHlBcnJheTxUcmFpdElkPiA9PiB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSByZXR1cm4gW11cbiAgY29uc3QgZGlyZWN0ID0gZXh0cmFjdFN0cmluZ0FycmF5KCh2YWx1ZSBhcyBhbnkpLmV4Y2x1ZGVzKVxuICByZXR1cm4gZGlyZWN0XG59XG5cbmNvbnN0IGdldFRyYWl0TmFtZSA9ICh0cmFpdElkOiBUcmFpdElkLCB2YWx1ZTogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICBjb25zdCBuID0gKHZhbHVlIGFzIGFueSkubmFtZVxuICAgIGlmICh0eXBlb2YgbiA9PT0gXCJzdHJpbmdcIiAmJiBuLnRyaW0oKS5sZW5ndGggPiAwKSByZXR1cm4gbi50cmltKClcbiAgfVxuICByZXR1cm4gdHJhaXRJZFxufVxuXG5jb25zdCBnZXRUcmFpdERlc2NyaXB0aW9uID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IGQgPSAodmFsdWUgYXMgYW55KS5kZXNjcmlwdGlvblxuICAgIGlmICh0eXBlb2YgZCA9PT0gXCJzdHJpbmdcIiAmJiBkLnRyaW0oKS5sZW5ndGggPiAwKSByZXR1cm4gZC50cmltKClcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBjb25zdCBmaW5hbGl6ZVRyYWl0Q29udHJpYnV0aW9ucyA9IChhcmdzOiB7XG4gIHJlYWRvbmx5IG1vZHVsZUlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgY29udHJpYnV0aW9uczogUmVhZG9ubHlBcnJheTxUcmFpdENvbnRyaWJ1dGlvbj5cbn0pOiB7IHJlYWRvbmx5IG1lcmdlZDogVHJhaXRTcGVjOyByZWFkb25seSBzbmFwc2hvdDogTW9kdWxlVHJhaXRzU25hcHNob3QgfSA9PiB7XG4gIGNvbnN0IHRyYWl0QnlJZCA9IG5ldyBNYXA8XG4gICAgVHJhaXRJZCxcbiAgICB7IHJlYWRvbmx5IHZhbHVlOiB1bmtub3duOyByZWFkb25seSBwcm92ZW5hbmNlOiBUcmFpdFByb3ZlbmFuY2UgfVxuICA+KClcblxuICBjb25zdCBkdXBsaWNhdGVTb3VyY2VzID0gbmV3IE1hcDxUcmFpdElkLCBBcnJheTxUcmFpdFByb3ZlbmFuY2U+PigpXG5cbiAgY29uc3QgY29udHJpYnV0aW9ucyA9IFsuLi5hcmdzLmNvbnRyaWJ1dGlvbnNdLnNvcnQoKGEsIGIpID0+XG4gICAgY29tcGFyZVByb3ZlbmFuY2UoYS5wcm92ZW5hbmNlLCBiLnByb3ZlbmFuY2UpLFxuICApXG5cbiAgZm9yIChjb25zdCBjIG9mIGNvbnRyaWJ1dGlvbnMpIHtcbiAgICBjb25zdCB0cmFpdHMgPSBjLnRyYWl0c1xuICAgIGlmICghdHJhaXRzIHx8IHR5cGVvZiB0cmFpdHMgIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlXG4gICAgZm9yIChjb25zdCB0cmFpdElkIG9mIE9iamVjdC5rZXlzKHRyYWl0cykuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKSkge1xuICAgICAgY29uc3QgdmFsdWUgPSAodHJhaXRzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVt0cmFpdElkXVxuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IHByZXYgPSB0cmFpdEJ5SWQuZ2V0KHRyYWl0SWQpXG4gICAgICBpZiAoIXByZXYpIHtcbiAgICAgICAgdHJhaXRCeUlkLnNldCh0cmFpdElkLCB7IHZhbHVlLCBwcm92ZW5hbmNlOiBjLnByb3ZlbmFuY2UgfSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc291cmNlcyA9IGR1cGxpY2F0ZVNvdXJjZXMuZ2V0KHRyYWl0SWQpID8/IFtwcmV2LnByb3ZlbmFuY2VdXG4gICAgICBzb3VyY2VzLnB1c2goYy5wcm92ZW5hbmNlKVxuICAgICAgZHVwbGljYXRlU291cmNlcy5zZXQodHJhaXRJZCwgc291cmNlcylcbiAgICB9XG4gIH1cblxuICBjb25zdCBjb25mbGljdHM6IEFycmF5PFRyYWl0Q29uZmxpY3Q+ID0gW11cbiAgY29uc3QgcmVnaXN0ZXJDb25mbGljdCA9IChjb25mbGljdDogVHJhaXRDb25mbGljdCkgPT4ge1xuICAgIGNvbnN0IHVuaXF1ZSA9IG5ldyBNYXA8c3RyaW5nLCBUcmFpdFByb3ZlbmFuY2U+KClcbiAgICBmb3IgKGNvbnN0IHMgb2YgY29uZmxpY3Quc291cmNlcykge1xuICAgICAgdW5pcXVlLnNldCh0b1Byb3ZlbmFuY2VLZXkocyksIHMpXG4gICAgfVxuICAgIGNvbmZsaWN0cy5wdXNoKHtcbiAgICAgIC4uLmNvbmZsaWN0LFxuICAgICAgc291cmNlczogQXJyYXkuZnJvbSh1bmlxdWUudmFsdWVzKCkpLnNvcnQoY29tcGFyZVByb3ZlbmFuY2UpLFxuICAgIH0pXG4gIH1cblxuICAvLyAxKSBkdXBsaWNhdGUgdHJhaXRJZCBjb25mbGljdHNcbiAgZm9yIChjb25zdCB0cmFpdElkIG9mIEFycmF5LmZyb20oZHVwbGljYXRlU291cmNlcy5rZXlzKCkpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSkpIHtcbiAgICByZWdpc3RlckNvbmZsaWN0KHtcbiAgICAgIGtpbmQ6IFwiZHVwbGljYXRlX3RyYWl0SWRcIixcbiAgICAgIHRyYWl0SWQsXG4gICAgICBzb3VyY2VzOiBkdXBsaWNhdGVTb3VyY2VzLmdldCh0cmFpdElkKSA/PyBbXSxcbiAgICB9KVxuICB9XG5cbiAgY29uc3QgbWVyZ2VkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4gIGNvbnN0IHByb3ZlbmFuY2VJbmRleDogUmVjb3JkPHN0cmluZywgVHJhaXRQcm92ZW5hbmNlPiA9IHt9XG4gIGNvbnN0IHRyYWl0czogQXJyYXk8TW9kdWxlVHJhaXRJdGVtPiA9IFtdXG5cbiAgY29uc3QgZW50cmllczogQXJyYXk8eyByZWFkb25seSB0cmFpdElkOiBUcmFpdElkOyByZWFkb25seSB2YWx1ZTogdW5rbm93bjsgcmVhZG9ubHkgcHJvdmVuYW5jZTogVHJhaXRQcm92ZW5hbmNlIH0+ID0gW11cbiAgZm9yIChjb25zdCB0cmFpdElkIG9mIHRyYWl0QnlJZC5rZXlzKCkpIHtcbiAgICBjb25zdCBlbnRyeSA9IHRyYWl0QnlJZC5nZXQodHJhaXRJZClcbiAgICBpZiAoIWVudHJ5KSBjb250aW51ZVxuICAgIGVudHJpZXMucHVzaCh7IHRyYWl0SWQsIHZhbHVlOiBlbnRyeS52YWx1ZSwgcHJvdmVuYW5jZTogZW50cnkucHJvdmVuYW5jZSB9KVxuICB9XG5cbiAgY29uc3QgaWRzID0gZW50cmllc1xuICAgIC5zbGljZSgpXG4gICAgLnNvcnQoY29tcGFyZVRyYWl0SWRCeVByb3ZlbmFuY2UpXG4gICAgLm1hcCgoZSkgPT4gZS50cmFpdElkKVxuXG4gIGZvciAoY29uc3QgdHJhaXRJZCBvZiBpZHMpIHtcbiAgICBjb25zdCBlbnRyeSA9IHRyYWl0QnlJZC5nZXQodHJhaXRJZClcbiAgICBpZiAoIWVudHJ5KSBjb250aW51ZVxuICAgIG1lcmdlZFt0cmFpdElkXSA9IGVudHJ5LnZhbHVlXG4gICAgcHJvdmVuYW5jZUluZGV4W3RyYWl0SWRdID0gZW50cnkucHJvdmVuYW5jZVxuICAgIHRyYWl0cy5wdXNoKHtcbiAgICAgIHRyYWl0SWQsXG4gICAgICBuYW1lOiBnZXRUcmFpdE5hbWUodHJhaXRJZCwgZW50cnkudmFsdWUpLFxuICAgICAgZGVzY3JpcHRpb246IGdldFRyYWl0RGVzY3JpcHRpb24oZW50cnkudmFsdWUpLFxuICAgIH0pXG4gIH1cblxuICAvLyAyKSBjb25zaXN0ZW5jeSBjaGVja3MgKEZSLTAwNyk6IHJlcXVpcmVzIC8gZXhjbHVkZXNcbiAgY29uc3QgcHJlc2VudCA9IG5ldyBTZXQoaWRzKVxuXG4gIGZvciAoY29uc3QgdHJhaXRJZCBvZiBpZHMpIHtcbiAgICBjb25zdCBlbnRyeSA9IHRyYWl0QnlJZC5nZXQodHJhaXRJZClcbiAgICBpZiAoIWVudHJ5KSBjb250aW51ZVxuXG4gICAgY29uc3QgcmVxdWlyZXMgPSBnZXRUcmFpdFJlcXVpcmVzKGVudHJ5LnZhbHVlKVxuICAgIGlmIChyZXF1aXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBtaXNzaW5nID0gcmVxdWlyZXMuZmlsdGVyKChyKSA9PiAhcHJlc2VudC5oYXMocikpXG4gICAgICBpZiAobWlzc2luZy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlZ2lzdGVyQ29uZmxpY3Qoe1xuICAgICAgICAgIGtpbmQ6IFwibWlzc2luZ19yZXF1aXJlc1wiLFxuICAgICAgICAgIHRyYWl0SWQsXG4gICAgICAgICAgbWlzc2luZzogQXJyYXkuZnJvbShuZXcgU2V0KG1pc3NpbmcpKS5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpLFxuICAgICAgICAgIHNvdXJjZXM6IFtlbnRyeS5wcm92ZW5hbmNlXSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBleGNsdWRlcyA9IGdldFRyYWl0RXhjbHVkZXMoZW50cnkudmFsdWUpXG4gICAgaWYgKGV4Y2x1ZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHByZXNlbnRFeGNsdWRlZCA9IGV4Y2x1ZGVzLmZpbHRlcigoZSkgPT4gcHJlc2VudC5oYXMoZSkpXG4gICAgICBpZiAocHJlc2VudEV4Y2x1ZGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgb3RoZXJTb3VyY2VzOiBBcnJheTxUcmFpdFByb3ZlbmFuY2U+ID0gW11cbiAgICAgICAgZm9yIChjb25zdCBvdGhlcklkIG9mIHByZXNlbnRFeGNsdWRlZCkge1xuICAgICAgICAgIGNvbnN0IG90aGVyID0gdHJhaXRCeUlkLmdldChvdGhlcklkKVxuICAgICAgICAgIGlmIChvdGhlcikgb3RoZXJTb3VyY2VzLnB1c2gob3RoZXIucHJvdmVuYW5jZSlcbiAgICAgICAgfVxuICAgICAgICByZWdpc3RlckNvbmZsaWN0KHtcbiAgICAgICAgICBraW5kOiBcImV4Y2x1ZGVzX3Zpb2xhdGlvblwiLFxuICAgICAgICAgIHRyYWl0SWQsXG4gICAgICAgICAgcHJlc2VudDogQXJyYXkuZnJvbShuZXcgU2V0KHByZXNlbnRFeGNsdWRlZCkpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSksXG4gICAgICAgICAgc291cmNlczogW2VudHJ5LnByb3ZlbmFuY2UsIC4uLm90aGVyU291cmNlc10sXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZsaWN0cy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qga2luZE9yZGVyOiBSZWNvcmQ8VHJhaXRDb25mbGljdEtpbmQsIG51bWJlcj4gPSB7XG4gICAgICBkdXBsaWNhdGVfdHJhaXRJZDogMCxcbiAgICAgIG1pc3NpbmdfcmVxdWlyZXM6IDEsXG4gICAgICBleGNsdWRlc192aW9sYXRpb246IDIsXG4gICAgfVxuICAgIGNvbmZsaWN0cy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBrID0ga2luZE9yZGVyW2Eua2luZF0gLSBraW5kT3JkZXJbYi5raW5kXVxuICAgICAgaWYgKGsgIT09IDApIHJldHVybiBrXG4gICAgICByZXR1cm4gYS50cmFpdElkLmxvY2FsZUNvbXBhcmUoYi50cmFpdElkKVxuICAgIH0pXG4gICAgdGhyb3cgbmV3IE1vZHVsZVRyYWl0c0NvbmZsaWN0RXJyb3IoYXJncy5tb2R1bGVJZCwgY29uZmxpY3RzKVxuICB9XG5cbiAgY29uc3QgZGlnZXN0QmFzZSA9IHtcbiAgICBtb2R1bGVJZDogYXJncy5tb2R1bGVJZCxcbiAgICB0cmFpdHMsXG4gICAgcHJvdmVuYW5jZUluZGV4LFxuICB9IGFzIGNvbnN0XG5cbiAgY29uc3QgZGlnZXN0ID0gYG10cmFpdHM6MDIzOiR7Zm52MWEzMihzdGFibGVTdHJpbmdpZnkoZGlnZXN0QmFzZSkpfWBcblxuICByZXR1cm4ge1xuICAgIG1lcmdlZCxcbiAgICBzbmFwc2hvdDoge1xuICAgICAgbW9kdWxlSWQ6IGFyZ3MubW9kdWxlSWQsXG4gICAgICBkaWdlc3QsXG4gICAgICB0cmFpdHMsXG4gICAgICBwcm92ZW5hbmNlSW5kZXgsXG4gICAgfSxcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxTQUFTLFFBQVEsZ0JBQStCOzs7QUNxRHpDLElBQU0sNEJBQU4sY0FBd0MsTUFBTTtBQUFBLEVBR25ELFlBQ1csVUFDQSxXQUNUO0FBQ0E7QUFBQSxNQUNFO0FBQUEsUUFDRSxvRUFBb0UsUUFBUTtBQUFBLFFBQzVFLEdBQUcsVUFBVTtBQUFBLFVBQ1gsQ0FBQyxNQUNDLEVB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
|