@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,431 @@
|
|
|
1
|
+
// @logix/core subpath bundles for @logix/sandbox
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
isDevEnv
|
|
5
|
+
} from "./chunk-GP37MEGJ.js";
|
|
6
|
+
import {
|
|
7
|
+
record,
|
|
8
|
+
toSerializableErrorSummary
|
|
9
|
+
} from "./chunk-CVZPRIDB.js";
|
|
10
|
+
|
|
11
|
+
// ../logix-core/src/internal/runtime/core/Lifecycle.ts
|
|
12
|
+
import { Cause, Context, Effect, Ref } from "../effect.js";
|
|
13
|
+
var LifecycleContext = Context.GenericTag(
|
|
14
|
+
"@logix/LifecycleManager"
|
|
15
|
+
);
|
|
16
|
+
var safeRun = (label, eff) => eff.pipe(
|
|
17
|
+
Effect.matchCauseEffect({
|
|
18
|
+
onSuccess: () => Effect.void,
|
|
19
|
+
onFailure: (cause) => Effect.logError(`[${label}] failed: ${Cause.pretty(cause)}`)
|
|
20
|
+
})
|
|
21
|
+
);
|
|
22
|
+
var makeTaskId = (kind, order) => `${kind}:${order}`;
|
|
23
|
+
var makeLifecycleManager = (identity) => Effect.gen(function* () {
|
|
24
|
+
const budgets = {
|
|
25
|
+
maxEventsPerInstance: 20,
|
|
26
|
+
maxEventBytes: 4 * 1024
|
|
27
|
+
};
|
|
28
|
+
const statusRef = yield* Ref.make({
|
|
29
|
+
identity,
|
|
30
|
+
status: "creating"
|
|
31
|
+
});
|
|
32
|
+
const initRequired = [];
|
|
33
|
+
const start = [];
|
|
34
|
+
const destroy = [];
|
|
35
|
+
const platformSuspend = [];
|
|
36
|
+
const platformResume = [];
|
|
37
|
+
const platformReset = [];
|
|
38
|
+
const onErrorHandlers = [];
|
|
39
|
+
const getStatus = Ref.get(statusRef);
|
|
40
|
+
const recordPhase = (phase, name, payload) => record({
|
|
41
|
+
type: "lifecycle:phase",
|
|
42
|
+
moduleId: identity.moduleId,
|
|
43
|
+
instanceId: identity.instanceId,
|
|
44
|
+
phase,
|
|
45
|
+
name,
|
|
46
|
+
payload
|
|
47
|
+
});
|
|
48
|
+
const setStatus = (status, patch) => Ref.update(statusRef, (prev) => ({
|
|
49
|
+
...prev,
|
|
50
|
+
identity: {
|
|
51
|
+
...prev.identity,
|
|
52
|
+
...patch?.runtimeLabel ? { runtimeLabel: patch.runtimeLabel } : null
|
|
53
|
+
},
|
|
54
|
+
status,
|
|
55
|
+
...patch?.initOutcome !== void 0 ? { initOutcome: patch.initOutcome } : null,
|
|
56
|
+
...patch?.initProgress !== void 0 ? { initProgress: patch.initProgress } : null
|
|
57
|
+
}));
|
|
58
|
+
const registerInitRequired = (effect, options) => {
|
|
59
|
+
const order = initRequired.length;
|
|
60
|
+
initRequired.push({
|
|
61
|
+
taskId: makeTaskId("initRequired", order),
|
|
62
|
+
kind: "initRequired",
|
|
63
|
+
order,
|
|
64
|
+
name: options?.name,
|
|
65
|
+
effect
|
|
66
|
+
});
|
|
67
|
+
};
|
|
68
|
+
const registerStart = (effect, options) => {
|
|
69
|
+
const order = start.length;
|
|
70
|
+
start.push({
|
|
71
|
+
taskId: makeTaskId("start", order),
|
|
72
|
+
kind: "start",
|
|
73
|
+
order,
|
|
74
|
+
name: options?.name,
|
|
75
|
+
fatalOnFailure: options?.fatalOnFailure,
|
|
76
|
+
effect
|
|
77
|
+
});
|
|
78
|
+
};
|
|
79
|
+
const registerDestroy = (effect, options) => {
|
|
80
|
+
const order = destroy.length;
|
|
81
|
+
destroy.push({
|
|
82
|
+
taskId: makeTaskId("destroy", order),
|
|
83
|
+
kind: "destroy",
|
|
84
|
+
order,
|
|
85
|
+
name: options?.name,
|
|
86
|
+
effect
|
|
87
|
+
});
|
|
88
|
+
};
|
|
89
|
+
const registerOnError = (handler) => {
|
|
90
|
+
onErrorHandlers.push(handler);
|
|
91
|
+
};
|
|
92
|
+
const registerPlatformSuspend = (effect, options) => {
|
|
93
|
+
const order = platformSuspend.length;
|
|
94
|
+
platformSuspend.push({
|
|
95
|
+
taskId: makeTaskId("platformSuspend", order),
|
|
96
|
+
kind: "platformSuspend",
|
|
97
|
+
order,
|
|
98
|
+
name: options?.name,
|
|
99
|
+
effect
|
|
100
|
+
});
|
|
101
|
+
};
|
|
102
|
+
const registerPlatformResume = (effect, options) => {
|
|
103
|
+
const order = platformResume.length;
|
|
104
|
+
platformResume.push({
|
|
105
|
+
taskId: makeTaskId("platformResume", order),
|
|
106
|
+
kind: "platformResume",
|
|
107
|
+
order,
|
|
108
|
+
name: options?.name,
|
|
109
|
+
effect
|
|
110
|
+
});
|
|
111
|
+
};
|
|
112
|
+
const registerPlatformReset = (effect, options) => {
|
|
113
|
+
const order = platformReset.length;
|
|
114
|
+
platformReset.push({
|
|
115
|
+
taskId: makeTaskId("platformReset", order),
|
|
116
|
+
kind: "platformReset",
|
|
117
|
+
order,
|
|
118
|
+
name: options?.name,
|
|
119
|
+
effect
|
|
120
|
+
});
|
|
121
|
+
};
|
|
122
|
+
const notifyError = (cause, context) => {
|
|
123
|
+
if (Cause.isInterrupted(cause)) {
|
|
124
|
+
return Effect.void;
|
|
125
|
+
}
|
|
126
|
+
return record({
|
|
127
|
+
type: "lifecycle:error",
|
|
128
|
+
moduleId: context.moduleId,
|
|
129
|
+
instanceId: context.instanceId,
|
|
130
|
+
cause,
|
|
131
|
+
phase: context.phase,
|
|
132
|
+
hook: context.hook,
|
|
133
|
+
taskId: context.taskId,
|
|
134
|
+
txnSeq: context.txnSeq,
|
|
135
|
+
opSeq: context.opSeq,
|
|
136
|
+
origin: context.origin
|
|
137
|
+
}).pipe(
|
|
138
|
+
Effect.zipRight(
|
|
139
|
+
Effect.forEach(
|
|
140
|
+
onErrorHandlers,
|
|
141
|
+
(handler) => handler(cause, context).pipe(
|
|
142
|
+
Effect.catchAllCause(
|
|
143
|
+
(inner) => Effect.logError(
|
|
144
|
+
`[lifecycle.onError] failed: ${Cause.pretty(inner)}`
|
|
145
|
+
)
|
|
146
|
+
)
|
|
147
|
+
),
|
|
148
|
+
{ discard: true }
|
|
149
|
+
)
|
|
150
|
+
)
|
|
151
|
+
);
|
|
152
|
+
};
|
|
153
|
+
const runInitRequired = Effect.gen(function* () {
|
|
154
|
+
const total = initRequired.length;
|
|
155
|
+
if (total === 0) {
|
|
156
|
+
yield* setStatus("ready", {
|
|
157
|
+
initProgress: { total: 0, completed: 0 },
|
|
158
|
+
initOutcome: { status: "success" }
|
|
159
|
+
});
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
const startedAt = Date.now();
|
|
163
|
+
yield* recordPhase("init", "initRequired:start", { total });
|
|
164
|
+
yield* setStatus("initializing", {
|
|
165
|
+
initProgress: { total, completed: 0, current: 0, startedAt }
|
|
166
|
+
});
|
|
167
|
+
let completed = 0;
|
|
168
|
+
for (let i = 0; i < initRequired.length; i++) {
|
|
169
|
+
yield* setStatus("initializing", {
|
|
170
|
+
initProgress: { total, completed, current: i, startedAt }
|
|
171
|
+
});
|
|
172
|
+
const task = initRequired[i];
|
|
173
|
+
const exit = yield* Effect.exit(task.effect);
|
|
174
|
+
if (exit._tag === "Success") {
|
|
175
|
+
completed += 1;
|
|
176
|
+
yield* setStatus("initializing", {
|
|
177
|
+
initProgress: { total, completed, current: i + 1, startedAt }
|
|
178
|
+
});
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
const summary = toSerializableErrorSummary(exit.cause);
|
|
182
|
+
yield* notifyError(exit.cause, {
|
|
183
|
+
phase: "init",
|
|
184
|
+
hook: "initRequired",
|
|
185
|
+
moduleId: identity.moduleId,
|
|
186
|
+
instanceId: identity.instanceId,
|
|
187
|
+
taskId: task.taskId,
|
|
188
|
+
origin: "initRequired"
|
|
189
|
+
});
|
|
190
|
+
yield* setStatus("failed", {
|
|
191
|
+
initProgress: { total, completed, current: i, startedAt },
|
|
192
|
+
initOutcome: { status: "failure", error: summary.errorSummary }
|
|
193
|
+
});
|
|
194
|
+
return yield* Effect.failCause(exit.cause);
|
|
195
|
+
}
|
|
196
|
+
yield* recordPhase("init", "initRequired:success", { total });
|
|
197
|
+
yield* setStatus("ready", {
|
|
198
|
+
initProgress: { total, completed, current: total, startedAt },
|
|
199
|
+
initOutcome: { status: "success" }
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
const runStart = recordPhase("run", "start:schedule", {
|
|
203
|
+
total: start.length
|
|
204
|
+
}).pipe(
|
|
205
|
+
Effect.zipRight(
|
|
206
|
+
Effect.forEach(
|
|
207
|
+
start,
|
|
208
|
+
(task) => Effect.forkScoped(
|
|
209
|
+
task.effect.pipe(
|
|
210
|
+
Effect.catchAllCause(
|
|
211
|
+
(cause) => notifyError(cause, {
|
|
212
|
+
phase: "run",
|
|
213
|
+
hook: "start",
|
|
214
|
+
moduleId: identity.moduleId,
|
|
215
|
+
instanceId: identity.instanceId,
|
|
216
|
+
taskId: task.taskId,
|
|
217
|
+
origin: "start"
|
|
218
|
+
})
|
|
219
|
+
)
|
|
220
|
+
)
|
|
221
|
+
).pipe(Effect.asVoid),
|
|
222
|
+
{ discard: true, concurrency: "unbounded" }
|
|
223
|
+
)
|
|
224
|
+
)
|
|
225
|
+
);
|
|
226
|
+
const runDestroy = Effect.gen(function* () {
|
|
227
|
+
yield* recordPhase("destroy", "destroy:start", { total: destroy.length });
|
|
228
|
+
yield* setStatus("terminating");
|
|
229
|
+
for (let i = destroy.length - 1; i >= 0; i--) {
|
|
230
|
+
const task = destroy[i];
|
|
231
|
+
yield* safeRun(
|
|
232
|
+
"lifecycle.onDestroy",
|
|
233
|
+
task.effect.pipe(
|
|
234
|
+
Effect.catchAllCause(
|
|
235
|
+
(cause) => notifyError(cause, {
|
|
236
|
+
phase: "destroy",
|
|
237
|
+
hook: "destroy",
|
|
238
|
+
moduleId: identity.moduleId,
|
|
239
|
+
instanceId: identity.instanceId,
|
|
240
|
+
taskId: task.taskId,
|
|
241
|
+
origin: "destroy"
|
|
242
|
+
})
|
|
243
|
+
)
|
|
244
|
+
)
|
|
245
|
+
);
|
|
246
|
+
}
|
|
247
|
+
yield* setStatus("terminated");
|
|
248
|
+
yield* recordPhase("destroy", "destroy:done", { total: destroy.length });
|
|
249
|
+
});
|
|
250
|
+
const runPlatformSuspend = Effect.gen(function* () {
|
|
251
|
+
if (platformSuspend.length === 0) return;
|
|
252
|
+
yield* recordPhase("platform", "signal:suspend", { total: platformSuspend.length });
|
|
253
|
+
for (const task of platformSuspend) {
|
|
254
|
+
yield* safeRun(
|
|
255
|
+
"lifecycle.onSuspend",
|
|
256
|
+
task.effect.pipe(
|
|
257
|
+
Effect.catchAllCause(
|
|
258
|
+
(cause) => notifyError(cause, {
|
|
259
|
+
phase: "platform",
|
|
260
|
+
hook: "suspend",
|
|
261
|
+
moduleId: identity.moduleId,
|
|
262
|
+
instanceId: identity.instanceId,
|
|
263
|
+
taskId: task.taskId,
|
|
264
|
+
origin: "platform.suspend"
|
|
265
|
+
})
|
|
266
|
+
)
|
|
267
|
+
)
|
|
268
|
+
);
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
const runPlatformResume = Effect.gen(function* () {
|
|
272
|
+
if (platformResume.length === 0) return;
|
|
273
|
+
yield* recordPhase("platform", "signal:resume", { total: platformResume.length });
|
|
274
|
+
for (const task of platformResume) {
|
|
275
|
+
yield* safeRun(
|
|
276
|
+
"lifecycle.onResume",
|
|
277
|
+
task.effect.pipe(
|
|
278
|
+
Effect.catchAllCause(
|
|
279
|
+
(cause) => notifyError(cause, {
|
|
280
|
+
phase: "platform",
|
|
281
|
+
hook: "resume",
|
|
282
|
+
moduleId: identity.moduleId,
|
|
283
|
+
instanceId: identity.instanceId,
|
|
284
|
+
taskId: task.taskId,
|
|
285
|
+
origin: "platform.resume"
|
|
286
|
+
})
|
|
287
|
+
)
|
|
288
|
+
)
|
|
289
|
+
);
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
const runPlatformReset = Effect.gen(function* () {
|
|
293
|
+
if (platformReset.length === 0) return;
|
|
294
|
+
yield* recordPhase("platform", "signal:reset", { total: platformReset.length });
|
|
295
|
+
for (const task of platformReset) {
|
|
296
|
+
yield* safeRun(
|
|
297
|
+
"lifecycle.onReset",
|
|
298
|
+
task.effect.pipe(
|
|
299
|
+
Effect.catchAllCause(
|
|
300
|
+
(cause) => notifyError(cause, {
|
|
301
|
+
phase: "platform",
|
|
302
|
+
hook: "reset",
|
|
303
|
+
moduleId: identity.moduleId,
|
|
304
|
+
instanceId: identity.instanceId,
|
|
305
|
+
taskId: task.taskId,
|
|
306
|
+
origin: "platform.reset"
|
|
307
|
+
})
|
|
308
|
+
)
|
|
309
|
+
)
|
|
310
|
+
);
|
|
311
|
+
}
|
|
312
|
+
});
|
|
313
|
+
const getTaskSnapshot = Effect.sync(() => ({
|
|
314
|
+
initRequired: initRequired.map(({ effect: _eff, ...rest }) => rest),
|
|
315
|
+
start: start.map(({ effect: _eff, ...rest }) => rest),
|
|
316
|
+
destroy: destroy.map(({ effect: _eff, ...rest }) => rest),
|
|
317
|
+
platformSuspend: platformSuspend.map(({ effect: _eff, ...rest }) => rest),
|
|
318
|
+
platformResume: platformResume.map(({ effect: _eff, ...rest }) => rest),
|
|
319
|
+
platformReset: platformReset.map(({ effect: _eff, ...rest }) => rest)
|
|
320
|
+
}));
|
|
321
|
+
const hasOnErrorHandlers = Effect.sync(() => onErrorHandlers.length > 0);
|
|
322
|
+
return {
|
|
323
|
+
identity,
|
|
324
|
+
budgets,
|
|
325
|
+
registerPlatformSuspend,
|
|
326
|
+
registerPlatformResume,
|
|
327
|
+
registerPlatformReset,
|
|
328
|
+
registerInitRequired,
|
|
329
|
+
registerStart,
|
|
330
|
+
registerDestroy,
|
|
331
|
+
registerOnError,
|
|
332
|
+
getStatus,
|
|
333
|
+
setStatus,
|
|
334
|
+
notifyError,
|
|
335
|
+
runPlatformSuspend,
|
|
336
|
+
runPlatformResume,
|
|
337
|
+
runPlatformReset,
|
|
338
|
+
runInitRequired,
|
|
339
|
+
runStart,
|
|
340
|
+
runDestroy,
|
|
341
|
+
hasOnErrorHandlers,
|
|
342
|
+
getTaskSnapshot
|
|
343
|
+
};
|
|
344
|
+
});
|
|
345
|
+
|
|
346
|
+
// ../logix-core/src/internal/runtime/core/LogicDiagnostics.ts
|
|
347
|
+
import { Cause as Cause2, Context as Context2, Effect as Effect2 } from "../effect.js";
|
|
348
|
+
var phaseDiagnosticsEnabled = () => isDevEnv();
|
|
349
|
+
var SERVICE_NOT_FOUND_PREFIX = "Service not found:";
|
|
350
|
+
var emitEnvServiceNotFoundDiagnosticIfNeeded = (cause, moduleId) => Effect2.gen(function* () {
|
|
351
|
+
let pretty;
|
|
352
|
+
try {
|
|
353
|
+
pretty = Cause2.pretty(cause, { renderErrorCause: true });
|
|
354
|
+
} catch {
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
if (!pretty.includes(SERVICE_NOT_FOUND_PREFIX)) {
|
|
358
|
+
return;
|
|
359
|
+
}
|
|
360
|
+
yield* record({
|
|
361
|
+
type: "diagnostic",
|
|
362
|
+
moduleId,
|
|
363
|
+
code: "logic::env_service_not_found",
|
|
364
|
+
severity: "warning",
|
|
365
|
+
message: pretty,
|
|
366
|
+
hint: "Logic \u5728\u521D\u59CB\u5316\u9636\u6BB5\u5C1D\u8BD5\u8BBF\u95EE\u5C1A\u672A\u63D0\u4F9B\u7684 Env Service\uFF0C\u901A\u5E38\u662F Runtime / React \u96C6\u6210\u4E2D\u7684\u5DF2\u77E5\u521D\u59CB\u5316\u566A\u97F3\u3002\u82E5\u53EA\u5728\u5E94\u7528\u542F\u52A8\u65E9\u671F\u51FA\u73B0\u4E00\u6B21\u4E14\u540E\u7EED\u72B6\u6001\u4E0E Env \u5747\u6B63\u5E38\uFF0C\u53EF\u6682\u89C6\u4E3A\u65E0\u5BB3\uFF1B\u82E5\u6301\u7EED\u51FA\u73B0\u6216\u4F34\u968F\u4E1A\u52A1\u5F02\u5E38\uFF0C\u8BF7\u68C0\u67E5 Runtime.make / RuntimeProvider.layer \u662F\u5426\u6B63\u786E\u63D0\u4F9B\u4E86\u5BF9\u5E94 Service\u3002"
|
|
367
|
+
});
|
|
368
|
+
yield* record({
|
|
369
|
+
type: "diagnostic",
|
|
370
|
+
moduleId,
|
|
371
|
+
code: "logic::invalid_phase",
|
|
372
|
+
severity: "error",
|
|
373
|
+
message: "$.use is not allowed before Env is fully ready.",
|
|
374
|
+
hint: "setup \u6BB5\u6216 Env \u672A\u5B8C\u5168\u5C31\u7EEA\u65F6\u8BF7\u907F\u514D\u76F4\u63A5\u8BFB\u53D6 Service\uFF1B\u5EFA\u8BAE\u5C06\u5BF9 Env \u7684\u8BBF\u95EE\u79FB\u52A8\u5230 Logic \u7684 run \u6BB5\uFF0C\u6216\u901A\u8FC7 $.lifecycle.onInitRequired \u5305\u88C5\u521D\u59CB\u5316\u6D41\u7A0B\u3002",
|
|
375
|
+
kind: "env_service_not_ready"
|
|
376
|
+
});
|
|
377
|
+
});
|
|
378
|
+
var LogicPhaseServiceTag = Context2.GenericTag(
|
|
379
|
+
"@logix/LogicPhaseService"
|
|
380
|
+
);
|
|
381
|
+
var LogicUnitServiceTag = class extends Context2.Tag("@logix/LogicUnitService")() {
|
|
382
|
+
};
|
|
383
|
+
var makeLogicPhaseError = (kind, api, phase, moduleId) => Object.assign(
|
|
384
|
+
new Error(
|
|
385
|
+
`[LogicPhaseError] ${api} is not allowed in ${phase} phase (kind=${kind}).`
|
|
386
|
+
),
|
|
387
|
+
{
|
|
388
|
+
_tag: "LogicPhaseError",
|
|
389
|
+
kind,
|
|
390
|
+
api,
|
|
391
|
+
phase,
|
|
392
|
+
moduleId
|
|
393
|
+
}
|
|
394
|
+
);
|
|
395
|
+
var emitInvalidPhaseDiagnosticIfNeeded = (cause, moduleId) => Effect2.gen(function* () {
|
|
396
|
+
if (!phaseDiagnosticsEnabled()) {
|
|
397
|
+
return;
|
|
398
|
+
}
|
|
399
|
+
const allErrors = [
|
|
400
|
+
...Cause2.failures(cause),
|
|
401
|
+
...Cause2.defects(cause)
|
|
402
|
+
];
|
|
403
|
+
for (const err of allErrors) {
|
|
404
|
+
const logicErr = err;
|
|
405
|
+
if (logicErr && logicErr._tag === "LogicPhaseError") {
|
|
406
|
+
const phaseErr = logicErr;
|
|
407
|
+
const hint = phaseErr.kind === "use_in_setup" || phaseErr.kind === "lifecycle_in_setup" ? "setup \u6BB5\u7981\u6B62\u8BFB\u53D6 Env/Service \u6216\u6267\u884C\u957F\u751F\u547D\u5468\u671F\u903B\u8F91\uFF0C\u8BF7\u5C06\u76F8\u5173\u8C03\u7528\u79FB\u52A8\u5230 run \u6BB5\u3002" : phaseErr.kind === "lifecycle_in_run" ? "run \u6BB5\u7981\u6B62\u6CE8\u518C $.lifecycle.*\uFF08setup-only\uFF09\u3002\u8BF7\u5C06\u751F\u547D\u5468\u671F\u6CE8\u518C\u79FB\u52A8\u5230 Module.logic builder \u7684\u540C\u6B65\u90E8\u5206\uFF08return \u4E4B\u524D\uFF09\u3002" : phaseErr.kind === "traits_in_run" || phaseErr.kind === "traits_declare_in_run" ? "setup \u7ED3\u675F\u540E traits \u5DF2\u51BB\u7ED3\uFF1B\u8BF7\u5C06 $.traits.declare \u79FB\u52A8\u5230 LogicPlan.setup \u6216 Module.logic builder \u7684 setup \u6CE8\u518C\u9636\u6BB5\u3002" : "\u8C03\u6574\u903B\u8F91\u5230 run \u6BB5\uFF0Csetup \u4EC5\u505A\u6CE8\u518C\u7C7B\u64CD\u4F5C\u3002";
|
|
408
|
+
yield* record({
|
|
409
|
+
type: "diagnostic",
|
|
410
|
+
moduleId: phaseErr.moduleId ?? moduleId,
|
|
411
|
+
code: "logic::invalid_phase",
|
|
412
|
+
severity: "error",
|
|
413
|
+
message: `${phaseErr.api ?? phaseErr.kind} is not allowed in ${phaseErr.phase} phase.`,
|
|
414
|
+
hint,
|
|
415
|
+
kind: phaseErr.kind
|
|
416
|
+
});
|
|
417
|
+
return;
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
});
|
|
421
|
+
|
|
422
|
+
export {
|
|
423
|
+
LifecycleContext,
|
|
424
|
+
makeLifecycleManager,
|
|
425
|
+
emitEnvServiceNotFoundDiagnosticIfNeeded,
|
|
426
|
+
LogicPhaseServiceTag,
|
|
427
|
+
LogicUnitServiceTag,
|
|
428
|
+
makeLogicPhaseError,
|
|
429
|
+
emitInvalidPhaseDiagnosticIfNeeded
|
|
430
|
+
};
|
|
431
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL0xpZmVjeWNsZS50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9ydW50aW1lL2NvcmUvTG9naWNEaWFnbm9zdGljcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgQ2F1c2UsIENvbnRleHQsIEVmZmVjdCwgUmVmIH0gZnJvbSBcImVmZmVjdFwiXG5pbXBvcnQgeyB0b1NlcmlhbGl6YWJsZUVycm9yU3VtbWFyeSB9IGZyb20gXCIuL2Vycm9yU3VtbWFyeS5qc1wiXG5pbXBvcnQgKiBhcyBEZWJ1ZyBmcm9tIFwiLi9EZWJ1Z1NpbmsuanNcIlxuXG5leHBvcnQgdHlwZSBQaGFzZSA9IFwiaW5pdFwiIHwgXCJydW5cIiB8IFwiZGVzdHJveVwiIHwgXCJwbGF0Zm9ybVwiXG5cbmV4cG9ydCB0eXBlIEhvb2sgPVxuICB8IFwiaW5pdFJlcXVpcmVkXCJcbiAgfCBcInN0YXJ0XCJcbiAgfCBcImRlc3Ryb3lcIlxuICB8IFwic3VzcGVuZFwiXG4gIHwgXCJyZXN1bWVcIlxuICB8IFwicmVzZXRcIlxuICB8IFwidW5rbm93blwiXG5cbmV4cG9ydCB0eXBlIFRhc2tLaW5kID1cbiAgfCBcImluaXRSZXF1aXJlZFwiXG4gIHwgXCJzdGFydFwiXG4gIHwgXCJkZXN0cm95XCJcbiAgfCBcInBsYXRmb3JtU3VzcGVuZFwiXG4gIHwgXCJwbGF0Zm9ybVJlc3VtZVwiXG4gIHwgXCJwbGF0Zm9ybVJlc2V0XCJcblxuZXhwb3J0IGludGVyZmFjZSBFcnJvckNvbnRleHQge1xuICByZWFkb25seSBwaGFzZTogUGhhc2VcbiAgcmVhZG9ubHkgaG9vazogSG9va1xuICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGluc3RhbmNlSWQ6IHN0cmluZ1xuICByZWFkb25seSB0YXNrSWQ/OiBzdHJpbmdcbiAgcmVhZG9ubHkgdHhuU2VxPzogbnVtYmVyXG4gIHJlYWRvbmx5IG9wU2VxPzogbnVtYmVyXG4gIC8qKlxuICAgKiBcdTRFQzVcdTc1MjhcdTRFOEVcdThCQ0FcdTY1QURcdTg5RTNcdTkxQ0FcdUZGMUFcdThCQjBcdTVGNTVcdTIwMUNcdTk1MTlcdThCRUZcdTRFQ0VcdTU0RUFcdTkxQ0NcdTUxOTJcdTUxRkFcdTY3NjVcdTIwMURcdTc2ODRcdTVCOUVcdTczQjBcdTRGQTdcdTY4MDdcdThCQzZcdUZGMENcbiAgICogXHU0RjhCXHU1OTgyIFwibG9naWMuZm9ya1wiIC8gXCJpbml0UmVxdWlyZWRcIiAvIFwic3RhcnRcIlx1MzAwMlxuICAgKlxuICAgKiBcdTZDRThcdTYxMEZcdUZGMUFcdThCRTVcdTVCNTdcdTZCQjVcdTVGQzVcdTk4N0JcdTUzRUZcdTVFOEZcdTUyMTdcdTUzMTZcdUZGMENcdTRFMTRcdTRFMERcdTVFOTRcdTYyMTBcdTRFM0FcdTUzNEZcdThCQUVcdTk1MUFcdTcwQjlcdTMwMDJcbiAgICovXG4gIHJlYWRvbmx5IG9yaWdpbj86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vZHVsZVJ1bnRpbWVJZGVudGl0eSB7XG4gIHJlYWRvbmx5IG1vZHVsZUlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgaW5zdGFuY2VJZDogc3RyaW5nXG4gIHJlYWRvbmx5IHJ1bnRpbWVMYWJlbD86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBJbnN0YW5jZVN0YXR1cyA9XG4gIHwgXCJjcmVhdGluZ1wiXG4gIHwgXCJpbml0aWFsaXppbmdcIlxuICB8IFwicmVhZHlcIlxuICB8IFwiZmFpbGVkXCJcbiAgfCBcInRlcm1pbmF0aW5nXCJcbiAgfCBcInRlcm1pbmF0ZWRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIEluaXRQcm9ncmVzcyB7XG4gIHJlYWRvbmx5IHRvdGFsOiBudW1iZXJcbiAgcmVhZG9ubHkgY29tcGxldGVkOiBudW1iZXJcbiAgcmVhZG9ubHkgY3VycmVudD86IG51bWJlclxuICByZWFkb25seSBzdGFydGVkQXQ/OiBudW1iZXJcbn1cblxuZXhwb3J0IHR5cGUgTGlmZWN5Y2xlT3V0Y29tZSA9XG4gIHwgeyByZWFkb25seSBzdGF0dXM6IFwic3VjY2Vzc1wiIH1cbiAgfCB7XG4gICAgICByZWFkb25seSBzdGF0dXM6IFwiZmFpbHVyZVwiXG4gICAgICByZWFkb25seSBlcnJvcjogaW1wb3J0KFwiLi9lcnJvclN1bW1hcnkuanNcIikuU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5XG4gICAgfVxuXG5leHBvcnQgaW50ZXJmYWNlIExpZmVjeWNsZVN0YXR1cyB7XG4gIHJlYWRvbmx5IGlkZW50aXR5OiBNb2R1bGVSdW50aW1lSWRlbnRpdHlcbiAgcmVhZG9ubHkgc3RhdHVzOiBJbnN0YW5jZVN0YXR1c1xuICByZWFkb25seSBpbml0T3V0Y29tZT86IExpZmVjeWNsZU91dGNvbWVcbiAgcmVhZG9ubHkgaW5pdFByb2dyZXNzPzogSW5pdFByb2dyZXNzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFza1JlZiB7XG4gIHJlYWRvbmx5IHRhc2tJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGtpbmQ6IFRhc2tLaW5kXG4gIHJlYWRvbmx5IG9yZGVyOiBudW1iZXJcbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZ1xuICByZWFkb25seSBmYXRhbE9uRmFpbHVyZT86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaWZlY3ljbGVUYXNrIGV4dGVuZHMgVGFza1JlZiB7XG4gIHJlYWRvbmx5IGVmZmVjdDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1ZGdldHMge1xuICAvKiogXHU1MzU1XHU1QjlFXHU0RjhCXHU3NTFGXHU1NDdEXHU1NDY4XHU2NzFGXHU0RThCXHU0RUY2XHU5ODg0XHU3Qjk3XHVGRjFBXHU1QkY5XHU5RjUwIHNwZWNzLzAxMSBkYXRhLW1vZGVsXHVGRjA4XHU5RUQ4XHU4QkE0IFx1MjI2NDIwXHVGRjA5XHUzMDAyICovXG4gIHJlYWRvbmx5IG1heEV2ZW50c1Blckluc3RhbmNlOiBudW1iZXJcbiAgLyoqIFx1NTM1NVx1NEU4Qlx1NEVGNlx1NEY1M1x1NzlFRlx1OTg4NFx1N0I5N1x1RkYxQVx1NUJGOVx1OUY1MCBzcGVjcy8wMTEgZGF0YS1tb2RlbFx1RkYwOFx1OUVEOFx1OEJBNCBcdTIyNjQ0S0JcdUZGMDlcdTMwMDIgKi9cbiAgcmVhZG9ubHkgbWF4RXZlbnRCeXRlczogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlmZWN5Y2xlTWFuYWdlciB7XG4gIHJlYWRvbmx5IGlkZW50aXR5OiBNb2R1bGVSdW50aW1lSWRlbnRpdHlcbiAgcmVhZG9ubHkgYnVkZ2V0czogQnVkZ2V0c1xuXG4gIHJlYWRvbmx5IHJlZ2lzdGVyUGxhdGZvcm1TdXNwZW5kOiAoXG4gICAgZWZmZWN0OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+LFxuICAgIG9wdGlvbnM/OiB7IHJlYWRvbmx5IG5hbWU/OiBzdHJpbmcgfVxuICApID0+IHZvaWRcbiAgcmVhZG9ubHkgcmVnaXN0ZXJQbGF0Zm9ybVJlc3VtZTogKFxuICAgIGVmZmVjdDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PixcbiAgICBvcHRpb25zPzogeyByZWFkb25seSBuYW1lPzogc3RyaW5nIH1cbiAgKSA9PiB2b2lkXG4gIHJlYWRvbmx5IHJlZ2lzdGVyUGxhdGZvcm1SZXNldDogKFxuICAgIGVmZmVjdDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PixcbiAgICBvcHRpb25zPzogeyByZWFkb25seSBuYW1lPzogc3RyaW5nIH1cbiAgKSA9PiB2b2lkXG5cbiAgcmVhZG9ubHkgcmVnaXN0ZXJJbml0UmVxdWlyZWQ6IChcbiAgICBlZmZlY3Q6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4sXG4gICAgb3B0aW9ucz86IHsgcmVhZG9ubHkgbmFtZT86IHN0cmluZyB9XG4gICkgPT4gdm9pZFxuICByZWFkb25seSByZWdpc3RlclN0YXJ0OiAoXG4gICAgZWZmZWN0OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+LFxuICAgIG9wdGlvbnM/OiB7IHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7IHJlYWRvbmx5IGZhdGFsT25GYWlsdXJlPzogYm9vbGVhbiB9XG4gICkgPT4gdm9pZFxuICByZWFkb25seSByZWdpc3RlckRlc3Ryb3k6IChcbiAgICBlZmZlY3Q6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4sXG4gICAgb3B0aW9ucz86IHsgcmVhZG9ubHkgbmFtZT86IHN0cmluZyB9XG4gICkgPT4gdm9pZFxuICByZWFkb25seSByZWdpc3Rlck9uRXJyb3I6IChcbiAgICBoYW5kbGVyOiAoXG4gICAgICBjYXVzZTogQ2F1c2UuQ2F1c2U8dW5rbm93bj4sXG4gICAgICBjb250ZXh0OiBFcnJvckNvbnRleHRcbiAgICApID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT5cbiAgKSA9PiB2b2lkXG5cbiAgcmVhZG9ubHkgZ2V0U3RhdHVzOiBFZmZlY3QuRWZmZWN0PExpZmVjeWNsZVN0YXR1cz5cbiAgcmVhZG9ubHkgc2V0U3RhdHVzOiAoXG4gICAgc3RhdHVzOiBJbnN0YW5jZVN0YXR1cyxcbiAgICBwYXRjaD86IHtcbiAgICAgIHJlYWRvbmx5IGluaXRPdXRjb21lPzogTGlmZWN5Y2xlT3V0Y29tZSB8IHVuZGVmaW5lZFxuICAgICAgcmVhZG9ubHkgaW5pdFByb2dyZXNzPzogSW5pdFByb2dyZXNzIHwgdW5kZWZpbmVkXG4gICAgICByZWFkb25seSBydW50aW1lTGFiZWw/OiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICB9XG4gICkgPT4gRWZmZWN0LkVmZmVjdDx2b2lkPlxuXG4gIHJlYWRvbmx5IG5vdGlmeUVycm9yOiAoXG4gICAgY2F1c2U6IENhdXNlLkNhdXNlPHVua25vd24+LFxuICAgIGNvbnRleHQ6IEVycm9yQ29udGV4dFxuICApID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT5cblxuICByZWFkb25seSBydW5QbGF0Zm9ybVN1c3BlbmQ6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT5cbiAgcmVhZG9ubHkgcnVuUGxhdGZvcm1SZXN1bWU6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT5cbiAgcmVhZG9ubHkgcnVuUGxhdGZvcm1SZXNldDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PlxuXG4gIHJlYWRvbmx5IHJ1bkluaXRSZXF1aXJlZDogRWZmZWN0LkVmZmVjdDx2b2lkLCB1bmtub3duLCBhbnk+XG4gIHJlYWRvbmx5IHJ1blN0YXJ0OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+XG4gIHJlYWRvbmx5IHJ1bkRlc3Ryb3k6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT5cblxuICAvKiogXHU0RUM1XHU3NTI4XHU0RThFXHU4QkNBXHU2NUFEXHU3NkVFXHU3Njg0XHVGRjFBXHU2NjJGXHU1NDI2XHU1REYyXHU2Q0U4XHU1MThDXHU0RUZCXHU2MTBGIG9uRXJyb3IgXHU1OTA0XHU3NDA2XHU1NjY4XHUzMDAyICovXG4gIHJlYWRvbmx5IGhhc09uRXJyb3JIYW5kbGVyczogRWZmZWN0LkVmZmVjdDxib29sZWFuPlxuXG4gIC8qKiBcdTRFQzVcdTc1MjhcdTRFOEVcdTZENEJcdThCRDUvXHU4QkNBXHU2NUFEXHVGRjFBXHU4QkZCXHU1M0Q2XHU1REYyXHU2Q0U4XHU1MThDXHU3Njg0XHU0RUZCXHU1MkExXHU1RkVCXHU3MTY3XHVGRjA4XHU0RTBEXHU1M0VGXHU1M0Q4XHU4OUM2XHU1NkZFXHVGRjA5XHUzMDAyICovXG4gIHJlYWRvbmx5IGdldFRhc2tTbmFwc2hvdDogRWZmZWN0LkVmZmVjdDxcbiAgICBSZWFkb25seTx7XG4gICAgICByZWFkb25seSBpbml0UmVxdWlyZWQ6IFJlYWRvbmx5QXJyYXk8VGFza1JlZj5cbiAgICAgIHJlYWRvbmx5IHN0YXJ0OiBSZWFkb25seUFycmF5PFRhc2tSZWY+XG4gICAgICByZWFkb25seSBkZXN0cm95OiBSZWFkb25seUFycmF5PFRhc2tSZWY+XG4gICAgICByZWFkb25seSBwbGF0Zm9ybVN1c3BlbmQ6IFJlYWRvbmx5QXJyYXk8VGFza1JlZj5cbiAgICAgIHJlYWRvbmx5IHBsYXRmb3JtUmVzdW1lOiBSZWFkb25seUFycmF5PFRhc2tSZWY+XG4gICAgICByZWFkb25seSBwbGF0Zm9ybVJlc2V0OiBSZWFkb25seUFycmF5PFRhc2tSZWY+XG4gICAgfT4sXG4gICAgbmV2ZXIsXG4gICAgbmV2ZXJcbiAgPlxufVxuXG5leHBvcnQgY29uc3QgTGlmZWN5Y2xlQ29udGV4dCA9IENvbnRleHQuR2VuZXJpY1RhZzxMaWZlY3ljbGVNYW5hZ2VyPihcbiAgXCJAbG9naXgvTGlmZWN5Y2xlTWFuYWdlclwiXG4pXG5cbmNvbnN0IHNhZmVSdW4gPSAobGFiZWw6IHN0cmluZywgZWZmOiBFZmZlY3QuRWZmZWN0PHZvaWQsIGFueSwgYW55PikgPT5cbiAgZWZmLnBpcGUoXG4gICAgRWZmZWN0Lm1hdGNoQ2F1c2VFZmZlY3Qoe1xuICAgICAgb25TdWNjZXNzOiAoKSA9PiBFZmZlY3Qudm9pZCxcbiAgICAgIG9uRmFpbHVyZTogKGNhdXNlKSA9PlxuICAgICAgICBFZmZlY3QubG9nRXJyb3IoYFske2xhYmVsfV0gZmFpbGVkOiAke0NhdXNlLnByZXR0eShjYXVzZSl9YCksXG4gICAgfSlcbiAgKVxuXG5jb25zdCBtYWtlVGFza0lkID0gKGtpbmQ6IFRhc2tLaW5kLCBvcmRlcjogbnVtYmVyKTogc3RyaW5nID0+IGAke2tpbmR9OiR7b3JkZXJ9YFxuXG5leHBvcnQgY29uc3QgbWFrZUxpZmVjeWNsZU1hbmFnZXIgPSAoXG4gIGlkZW50aXR5OiBNb2R1bGVSdW50aW1lSWRlbnRpdHksXG4pOiBFZmZlY3QuRWZmZWN0PExpZmVjeWNsZU1hbmFnZXI+ID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBjb25zdCBidWRnZXRzOiBCdWRnZXRzID0ge1xuICAgICAgbWF4RXZlbnRzUGVySW5zdGFuY2U6IDIwLFxuICAgICAgbWF4RXZlbnRCeXRlczogNCAqIDEwMjQsXG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdHVzUmVmID0geWllbGQqIFJlZi5tYWtlPExpZmVjeWNsZVN0YXR1cz4oe1xuICAgICAgaWRlbnRpdHksXG4gICAgICBzdGF0dXM6IFwiY3JlYXRpbmdcIixcbiAgICB9KVxuXG4gICAgY29uc3QgaW5pdFJlcXVpcmVkOiBMaWZlY3ljbGVUYXNrW10gPSBbXVxuICAgIGNvbnN0IHN0YXJ0OiBMaWZlY3ljbGVUYXNrW10gPSBbXVxuICAgIGNvbnN0IGRlc3Ryb3k6IExpZmVjeWNsZVRhc2tbXSA9IFtdXG4gICAgY29uc3QgcGxhdGZvcm1TdXNwZW5kOiBMaWZlY3ljbGVUYXNrW10gPSBbXVxuICAgIGNvbnN0IHBsYXRmb3JtUmVzdW1lOiBMaWZlY3ljbGVUYXNrW10gPSBbXVxuICAgIGNvbnN0IHBsYXRmb3JtUmVzZXQ6IExpZmVjeWNsZVRhc2tbXSA9IFtdXG4gICAgY29uc3Qgb25FcnJvckhhbmRsZXJzOiBBcnJheTxcbiAgICAgIChcbiAgICAgICAgY2F1c2U6IENhdXNlLkNhdXNlPHVua25vd24+LFxuICAgICAgICBjb250ZXh0OiBFcnJvckNvbnRleHRcbiAgICAgICkgPT4gRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PlxuICAgID4gPSBbXVxuXG4gICAgY29uc3QgZ2V0U3RhdHVzOiBFZmZlY3QuRWZmZWN0PExpZmVjeWNsZVN0YXR1cz4gPSBSZWYuZ2V0KHN0YXR1c1JlZilcblxuICAgIGNvbnN0IHJlY29yZFBoYXNlID0gKFxuICAgICAgcGhhc2U6IFBoYXNlLFxuICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgcGF5bG9hZD86IHVua25vd24sXG4gICAgKTogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PiA9PlxuICAgICAgRGVidWcucmVjb3JkKHtcbiAgICAgICAgdHlwZTogXCJsaWZlY3ljbGU6cGhhc2VcIixcbiAgICAgICAgbW9kdWxlSWQ6IGlkZW50aXR5Lm1vZHVsZUlkLFxuICAgICAgICBpbnN0YW5jZUlkOiBpZGVudGl0eS5pbnN0YW5jZUlkLFxuICAgICAgICBwaGFzZSxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgIH0pXG5cbiAgICBjb25zdCBzZXRTdGF0dXMgPSAoXG4gICAgICBzdGF0dXM6IEluc3RhbmNlU3RhdHVzLFxuICAgICAgcGF0Y2g/OiB7XG4gICAgICAgIHJlYWRvbmx5IGluaXRPdXRjb21lPzogTGlmZWN5Y2xlT3V0Y29tZSB8IHVuZGVmaW5lZFxuICAgICAgICByZWFkb25seSBpbml0UHJvZ3Jlc3M/OiBJbml0UHJvZ3Jlc3MgfCB1bmRlZmluZWRcbiAgICAgICAgcmVhZG9ubHkgcnVudGltZUxhYmVsPzogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICB9XG4gICAgKSA9PlxuICAgICAgUmVmLnVwZGF0ZShzdGF0dXNSZWYsIChwcmV2KSA9PiAoe1xuICAgICAgICAuLi5wcmV2LFxuICAgICAgICBpZGVudGl0eToge1xuICAgICAgICAgIC4uLnByZXYuaWRlbnRpdHksXG4gICAgICAgICAgLi4uKHBhdGNoPy5ydW50aW1lTGFiZWwgPyB7IHJ1bnRpbWVMYWJlbDogcGF0Y2gucnVudGltZUxhYmVsIH0gOiBudWxsKSxcbiAgICAgICAgfSxcbiAgICAgICAgc3RhdHVzLFxuICAgICAgICAuLi4ocGF0Y2g/LmluaXRPdXRjb21lICE9PSB1bmRlZmluZWQgPyB7IGluaXRPdXRjb21lOiBwYXRjaC5pbml0T3V0Y29tZSB9IDogbnVsbCksXG4gICAgICAgIC4uLihwYXRjaD8uaW5pdFByb2dyZXNzICE9PSB1bmRlZmluZWQgPyB7IGluaXRQcm9ncmVzczogcGF0Y2guaW5pdFByb2dyZXNzIH0gOiBudWxsKSxcbiAgICAgIH0pKVxuXG4gICAgY29uc3QgcmVnaXN0ZXJJbml0UmVxdWlyZWQgPSAoXG4gICAgICBlZmZlY3Q6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4sXG4gICAgICBvcHRpb25zPzogeyByZWFkb25seSBuYW1lPzogc3RyaW5nIH1cbiAgICApID0+IHtcbiAgICAgIGNvbnN0IG9yZGVyID0gaW5pdFJlcXVpcmVkLmxlbmd0aFxuICAgICAgaW5pdFJlcXVpcmVkLnB1c2goe1xuICAgICAgICB0YXNrSWQ6IG1ha2VUYXNrSWQoXCJpbml0UmVxdWlyZWRcIiwgb3JkZXIpLFxuICAgICAgICBraW5kOiBcImluaXRSZXF1aXJlZFwiLFxuICAgICAgICBvcmRlcixcbiAgICAgICAgbmFtZTogb3B0aW9ucz8ubmFtZSxcbiAgICAgICAgZWZmZWN0LFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25zdCByZWdpc3RlclN0YXJ0ID0gKFxuICAgICAgZWZmZWN0OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+LFxuICAgICAgb3B0aW9ucz86IHsgcmVhZG9ubHkgbmFtZT86IHN0cmluZzsgcmVhZG9ubHkgZmF0YWxPbkZhaWx1cmU/OiBib29sZWFuIH1cbiAgICApID0+IHtcbiAgICAgIGNvbnN0IG9yZGVyID0gc3RhcnQubGVuZ3RoXG4gICAgICBzdGFydC5wdXNoKHtcbiAgICAgICAgdGFza0lkOiBtYWtlVGFza0lkKFwic3RhcnRcIiwgb3JkZXIpLFxuICAgICAgICBraW5kOiBcInN0YXJ0XCIsXG4gICAgICAgIG9yZGVyLFxuICAgICAgICBuYW1lOiBvcHRpb25zPy5uYW1lLFxuICAgICAgICBmYXRhbE9uRmFpbHVyZTogb3B0aW9ucz8uZmF0YWxPbkZhaWx1cmUsXG4gICAgICAgIGVmZmVjdCxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29uc3QgcmVnaXN0ZXJEZXN0cm95ID0gKFxuICAgICAgZWZmZWN0OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+LFxuICAgICAgb3B0aW9ucz86IHsgcmVhZG9ubHkgbmFtZT86IHN0cmluZyB9XG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBvcmRlciA9IGRlc3Ryb3kubGVuZ3RoXG4gICAgICBkZXN0cm95LnB1c2goe1xuICAgICAgICB0YXNrSWQ6IG1ha2VUYXNrSWQoXCJkZXN0cm95XCIsIG9yZGVyKSxcbiAgICAgICAga2luZDogXCJkZXN0cm95XCIsXG4gICAgICAgIG9yZGVyLFxuICAgICAgICBuYW1lOiBvcHRpb25zPy5uYW1lLFxuICAgICAgICBlZmZlY3QsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IHJlZ2lzdGVyT25FcnJvciA9IChcbiAgICAgIGhhbmRsZXI6IChcbiAgICAgICAgY2F1c2U6IENhdXNlLkNhdXNlPHVua25vd24+LFxuICAgICAgICBjb250ZXh0OiBFcnJvckNvbnRleHRcbiAgICAgICkgPT4gRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PlxuICAgICkgPT4ge1xuICAgICAgb25FcnJvckhhbmRsZXJzLnB1c2goaGFuZGxlcilcbiAgICB9XG5cbiAgICBjb25zdCByZWdpc3RlclBsYXRmb3JtU3VzcGVuZCA9IChcbiAgICAgIGVmZmVjdDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PixcbiAgICAgIG9wdGlvbnM/OiB7IHJlYWRvbmx5IG5hbWU/OiBzdHJpbmcgfVxuICAgICkgPT4ge1xuICAgICAgY29uc3Qgb3JkZXIgPSBwbGF0Zm9ybVN1c3BlbmQubGVuZ3RoXG4gICAgICBwbGF0Zm9ybVN1c3BlbmQucHVzaCh7XG4gICAgICAgIHRhc2tJZDogbWFrZVRhc2tJZChcInBsYXRmb3JtU3VzcGVuZFwiLCBvcmRlciksXG4gICAgICAgIGtpbmQ6IFwicGxhdGZvcm1TdXNwZW5kXCIsXG4gICAgICAgIG9yZGVyLFxuICAgICAgICBuYW1lOiBvcHRpb25zPy5uYW1lLFxuICAgICAgICBlZmZlY3QsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IHJlZ2lzdGVyUGxhdGZvcm1SZXN1bWUgPSAoXG4gICAgICBlZmZlY3Q6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4sXG4gICAgICBvcHRpb25zPzogeyByZWFkb25seSBuYW1lPzogc3RyaW5nIH1cbiAgICApID0+IHtcbiAgICAgIGNvbnN0IG9yZGVyID0gcGxhdGZvcm1SZXN1bWUubGVuZ3RoXG4gICAgICBwbGF0Zm9ybVJlc3VtZS5wdXNoKHtcbiAgICAgICAgdGFza0lkOiBtYWtlVGFza0lkKFwicGxhdGZvcm1SZXN1bWVcIiwgb3JkZXIpLFxuICAgICAgICBraW5kOiBcInBsYXRmb3JtUmVzdW1lXCIsXG4gICAgICAgIG9yZGVyLFxuICAgICAgICBuYW1lOiBvcHRpb25zPy5uYW1lLFxuICAgICAgICBlZmZlY3QsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IHJlZ2lzdGVyUGxhdGZvcm1SZXNldCA9IChcbiAgICAgIGVmZmVjdDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PixcbiAgICAgIG9wdGlvbnM/OiB7IHJlYWRvbmx5IG5hbWU/OiBzdHJpbmcgfVxuICAgICkgPT4ge1xuICAgICAgY29uc3Qgb3JkZXIgPSBwbGF0Zm9ybVJlc2V0Lmxlbmd0aFxuICAgICAgcGxhdGZvcm1SZXNldC5wdXNoKHtcbiAgICAgICAgdGFza0lkOiBtYWtlVGFza0lkKFwicGxhdGZvcm1SZXNldFwiLCBvcmRlciksXG4gICAgICAgIGtpbmQ6IFwicGxhdGZvcm1SZXNldFwiLFxuICAgICAgICBvcmRlcixcbiAgICAgICAgbmFtZTogb3B0aW9ucz8ubmFtZSxcbiAgICAgICAgZWZmZWN0LFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25zdCBub3RpZnlFcnJvciA9IChjYXVzZTogQ2F1c2UuQ2F1c2U8dW5rbm93bj4sIGNvbnRleHQ6IEVycm9yQ29udGV4dCkgPT4ge1xuICAgICAgLy8gXHU0RTJEXHU2NUFEL1x1NTNENlx1NkQ4OFx1NEUwRFx1NUU5NFx1ODhBQlx1NUY1M1x1NEY1Q1x1OTUxOVx1OEJFRlx1NEUwQVx1NjJBNVx1MzAwMlxuICAgICAgaWYgKENhdXNlLmlzSW50ZXJydXB0ZWQoY2F1c2UpKSB7XG4gICAgICAgIHJldHVybiBFZmZlY3Qudm9pZFxuICAgICAgfVxuXG4gICAgICByZXR1cm4gRGVidWcucmVjb3JkKHtcbiAgICAgICAgdHlwZTogXCJsaWZlY3ljbGU6ZXJyb3JcIixcbiAgICAgICAgbW9kdWxlSWQ6IGNvbnRleHQubW9kdWxlSWQsXG4gICAgICAgIGluc3RhbmNlSWQ6IGNvbnRleHQuaW5zdGFuY2VJZCxcbiAgICAgICAgY2F1c2UsXG4gICAgICAgIHBoYXNlOiBjb250ZXh0LnBoYXNlLFxuICAgICAgICBob29rOiBjb250ZXh0Lmhvb2ssXG4gICAgICAgIHRhc2tJZDogY29udGV4dC50YXNrSWQsXG4gICAgICAgIHR4blNlcTogY29udGV4dC50eG5TZXEsXG4gICAgICAgIG9wU2VxOiBjb250ZXh0Lm9wU2VxLFxuICAgICAgICBvcmlnaW46IGNvbnRleHQub3JpZ2luLFxuICAgICAgfSkucGlwZShcbiAgICAgICAgRWZmZWN0LnppcFJpZ2h0KFxuICAgICAgICAgIEVmZmVjdC5mb3JFYWNoKFxuICAgICAgICAgICAgb25FcnJvckhhbmRsZXJzLFxuICAgICAgICAgICAgKGhhbmRsZXIpID0+XG4gICAgICAgICAgICAgIGhhbmRsZXIoY2F1c2UsIGNvbnRleHQpLnBpcGUoXG4gICAgICAgICAgICAgICAgRWZmZWN0LmNhdGNoQWxsQ2F1c2UoKGlubmVyKSA9PlxuICAgICAgICAgICAgICAgICAgRWZmZWN0LmxvZ0Vycm9yKFxuICAgICAgICAgICAgICAgICAgICBgW2xpZmVjeWNsZS5vbkVycm9yXSBmYWlsZWQ6ICR7Q2F1c2UucHJldHR5KGlubmVyKX1gXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgeyBkaXNjYXJkOiB0cnVlIH1cbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb25zdCBydW5Jbml0UmVxdWlyZWQ6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgdW5rbm93biwgYW55PiA9IEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgIGNvbnN0IHRvdGFsID0gaW5pdFJlcXVpcmVkLmxlbmd0aFxuICAgICAgaWYgKHRvdGFsID09PSAwKSB7XG4gICAgICAgIHlpZWxkKiBzZXRTdGF0dXMoXCJyZWFkeVwiLCB7XG4gICAgICAgICAgaW5pdFByb2dyZXNzOiB7IHRvdGFsOiAwLCBjb21wbGV0ZWQ6IDAgfSxcbiAgICAgICAgICBpbml0T3V0Y29tZTogeyBzdGF0dXM6IFwic3VjY2Vzc1wiIH0sXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpXG4gICAgICB5aWVsZCogcmVjb3JkUGhhc2UoXCJpbml0XCIsIFwiaW5pdFJlcXVpcmVkOnN0YXJ0XCIsIHsgdG90YWwgfSlcbiAgICAgIHlpZWxkKiBzZXRTdGF0dXMoXCJpbml0aWFsaXppbmdcIiwge1xuICAgICAgICBpbml0UHJvZ3Jlc3M6IHsgdG90YWwsIGNvbXBsZXRlZDogMCwgY3VycmVudDogMCwgc3RhcnRlZEF0IH0sXG4gICAgICB9KVxuXG4gICAgICBsZXQgY29tcGxldGVkID0gMFxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbml0UmVxdWlyZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgeWllbGQqIHNldFN0YXR1cyhcImluaXRpYWxpemluZ1wiLCB7XG4gICAgICAgICAgaW5pdFByb2dyZXNzOiB7IHRvdGFsLCBjb21wbGV0ZWQsIGN1cnJlbnQ6IGksIHN0YXJ0ZWRBdCB9LFxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IHRhc2sgPSBpbml0UmVxdWlyZWRbaV1cbiAgICAgICAgY29uc3QgZXhpdCA9IHlpZWxkKiBFZmZlY3QuZXhpdCh0YXNrLmVmZmVjdClcblxuICAgICAgICBpZiAoZXhpdC5fdGFnID09PSBcIlN1Y2Nlc3NcIikge1xuICAgICAgICAgIGNvbXBsZXRlZCArPSAxXG4gICAgICAgICAgeWllbGQqIHNldFN0YXR1cyhcImluaXRpYWxpemluZ1wiLCB7XG4gICAgICAgICAgICBpbml0UHJvZ3Jlc3M6IHsgdG90YWwsIGNvbXBsZXRlZCwgY3VycmVudDogaSArIDEsIHN0YXJ0ZWRBdCB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1bW1hcnkgPSB0b1NlcmlhbGl6YWJsZUVycm9yU3VtbWFyeShleGl0LmNhdXNlKVxuICAgICAgICB5aWVsZCogbm90aWZ5RXJyb3IoZXhpdC5jYXVzZSwge1xuICAgICAgICAgIHBoYXNlOiBcImluaXRcIixcbiAgICAgICAgICBob29rOiBcImluaXRSZXF1aXJlZFwiLFxuICAgICAgICAgIG1vZHVsZUlkOiBpZGVudGl0eS5tb2R1bGVJZCxcbiAgICAgICAgICBpbnN0YW5jZUlkOiBpZGVudGl0eS5pbnN0YW5jZUlkLFxuICAgICAgICAgIHRhc2tJZDogdGFzay50YXNrSWQsXG4gICAgICAgICAgb3JpZ2luOiBcImluaXRSZXF1aXJlZFwiLFxuICAgICAgICB9KVxuXG4gICAgICAgIHlpZWxkKiBzZXRTdGF0dXMoXCJmYWlsZWRcIiwge1xuICAgICAgICAgIGluaXRQcm9ncmVzczogeyB0b3RhbCwgY29tcGxldGVkLCBjdXJyZW50OiBpLCBzdGFydGVkQXQgfSxcbiAgICAgICAgICBpbml0T3V0Y29tZTogeyBzdGF0dXM6IFwiZmFpbHVyZVwiLCBlcnJvcjogc3VtbWFyeS5lcnJvclN1bW1hcnkgfSxcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4geWllbGQqIEVmZmVjdC5mYWlsQ2F1c2UoZXhpdC5jYXVzZSlcbiAgICAgIH1cblxuICAgICAgeWllbGQqIHJlY29yZFBoYXNlKFwiaW5pdFwiLCBcImluaXRSZXF1aXJlZDpzdWNjZXNzXCIsIHsgdG90YWwgfSlcbiAgICAgIHlpZWxkKiBzZXRTdGF0dXMoXCJyZWFkeVwiLCB7XG4gICAgICAgIGluaXRQcm9ncmVzczogeyB0b3RhbCwgY29tcGxldGVkLCBjdXJyZW50OiB0b3RhbCwgc3RhcnRlZEF0IH0sXG4gICAgICAgIGluaXRPdXRjb21lOiB7IHN0YXR1czogXCJzdWNjZXNzXCIgfSxcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGNvbnN0IHJ1blN0YXJ0OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+ID0gcmVjb3JkUGhhc2UoXCJydW5cIiwgXCJzdGFydDpzY2hlZHVsZVwiLCB7XG4gICAgICB0b3RhbDogc3RhcnQubGVuZ3RoLFxuICAgIH0pLnBpcGUoXG4gICAgICBFZmZlY3QuemlwUmlnaHQoXG4gICAgICAgIEVmZmVjdC5mb3JFYWNoKFxuICAgICAgICAgIHN0YXJ0LFxuICAgICAgICAgICh0YXNrKSA9PlxuICAgICAgICAgICAgRWZmZWN0LmZvcmtTY29wZWQoXG4gICAgICAgICAgICAgIHRhc2suZWZmZWN0LnBpcGUoXG4gICAgICAgICAgICAgICAgRWZmZWN0LmNhdGNoQWxsQ2F1c2UoKGNhdXNlKSA9PlxuICAgICAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoY2F1c2UsIHtcbiAgICAgICAgICAgICAgICAgICAgcGhhc2U6IFwicnVuXCIsXG4gICAgICAgICAgICAgICAgICAgIGhvb2s6IFwic3RhcnRcIixcbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlSWQ6IGlkZW50aXR5Lm1vZHVsZUlkLFxuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUlkOiBpZGVudGl0eS5pbnN0YW5jZUlkLFxuICAgICAgICAgICAgICAgICAgICB0YXNrSWQ6IHRhc2sudGFza0lkLFxuICAgICAgICAgICAgICAgICAgICBvcmlnaW46IFwic3RhcnRcIixcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApLnBpcGUoRWZmZWN0LmFzVm9pZCksXG4gICAgICAgICAgeyBkaXNjYXJkOiB0cnVlLCBjb25jdXJyZW5jeTogXCJ1bmJvdW5kZWRcIiB9XG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG5cbiAgICBjb25zdCBydW5EZXN0cm95OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+ID0gRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgeWllbGQqIHJlY29yZFBoYXNlKFwiZGVzdHJveVwiLCBcImRlc3Ryb3k6c3RhcnRcIiwgeyB0b3RhbDogZGVzdHJveS5sZW5ndGggfSlcbiAgICAgIHlpZWxkKiBzZXRTdGF0dXMoXCJ0ZXJtaW5hdGluZ1wiKVxuXG4gICAgICAvLyBkZXN0cm95XHVGRjFBXHU1NDBFXHU2Q0U4XHU1MThDXHU1MTQ4XHU2MjY3XHU4ODRDXHVGRjA4TElGT1x1RkYwOVx1RkYwQ1x1NEUxNCBiZXN0LWVmZm9ydFx1RkYwOFx1NTM1NVx1NEUyQVx1NTkzMVx1OEQyNVx1NEUwRFx1OTYzQlx1NTg1RVx1NTQwRVx1N0VFRFx1RkYwOVx1MzAwMlxuICAgICAgZm9yIChsZXQgaSA9IGRlc3Ryb3kubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgdGFzayA9IGRlc3Ryb3lbaV1cbiAgICAgICAgeWllbGQqIHNhZmVSdW4oXG4gICAgICAgICAgXCJsaWZlY3ljbGUub25EZXN0cm95XCIsXG4gICAgICAgICAgdGFzay5lZmZlY3QucGlwZShcbiAgICAgICAgICAgIEVmZmVjdC5jYXRjaEFsbENhdXNlKChjYXVzZSkgPT5cbiAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoY2F1c2UsIHtcbiAgICAgICAgICAgICAgICBwaGFzZTogXCJkZXN0cm95XCIsXG4gICAgICAgICAgICAgICAgaG9vazogXCJkZXN0cm95XCIsXG4gICAgICAgICAgICAgICAgbW9kdWxlSWQ6IGlkZW50aXR5Lm1vZHVsZUlkLFxuICAgICAgICAgICAgICAgIGluc3RhbmNlSWQ6IGlkZW50aXR5Lmluc3RhbmNlSWQsXG4gICAgICAgICAgICAgICAgdGFza0lkOiB0YXNrLnRhc2tJZCxcbiAgICAgICAgICAgICAgICBvcmlnaW46IFwiZGVzdHJveVwiLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICB5aWVsZCogc2V0U3RhdHVzKFwidGVybWluYXRlZFwiKVxuICAgICAgeWllbGQqIHJlY29yZFBoYXNlKFwiZGVzdHJveVwiLCBcImRlc3Ryb3k6ZG9uZVwiLCB7IHRvdGFsOiBkZXN0cm95Lmxlbmd0aCB9KVxuICAgIH0pXG5cbiAgICBjb25zdCBydW5QbGF0Zm9ybVN1c3BlbmQ6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4gPSBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICBpZiAocGxhdGZvcm1TdXNwZW5kLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICAgIHlpZWxkKiByZWNvcmRQaGFzZShcInBsYXRmb3JtXCIsIFwic2lnbmFsOnN1c3BlbmRcIiwgeyB0b3RhbDogcGxhdGZvcm1TdXNwZW5kLmxlbmd0aCB9KVxuICAgICAgZm9yIChjb25zdCB0YXNrIG9mIHBsYXRmb3JtU3VzcGVuZCkge1xuICAgICAgICB5aWVsZCogc2FmZVJ1bihcbiAgICAgICAgICBcImxpZmVjeWNsZS5vblN1c3BlbmRcIixcbiAgICAgICAgICB0YXNrLmVmZmVjdC5waXBlKFxuICAgICAgICAgICAgRWZmZWN0LmNhdGNoQWxsQ2F1c2UoKGNhdXNlKSA9PlxuICAgICAgICAgICAgICBub3RpZnlFcnJvcihjYXVzZSwge1xuICAgICAgICAgICAgICAgIHBoYXNlOiBcInBsYXRmb3JtXCIsXG4gICAgICAgICAgICAgICAgaG9vazogXCJzdXNwZW5kXCIsXG4gICAgICAgICAgICAgICAgbW9kdWxlSWQ6IGlkZW50aXR5Lm1vZHVsZUlkLFxuICAgICAgICAgICAgICAgIGluc3RhbmNlSWQ6IGlkZW50aXR5Lmluc3RhbmNlSWQsXG4gICAgICAgICAgICAgICAgdGFza0lkOiB0YXNrLnRhc2tJZCxcbiAgICAgICAgICAgICAgICBvcmlnaW46IFwicGxhdGZvcm0uc3VzcGVuZFwiLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBjb25zdCBydW5QbGF0Zm9ybVJlc3VtZTogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PiA9IEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgIGlmIChwbGF0Zm9ybVJlc3VtZS5sZW5ndGggPT09IDApIHJldHVyblxuXG4gICAgICB5aWVsZCogcmVjb3JkUGhhc2UoXCJwbGF0Zm9ybVwiLCBcInNpZ25hbDpyZXN1bWVcIiwgeyB0b3RhbDogcGxhdGZvcm1SZXN1bWUubGVuZ3RoIH0pXG4gICAgICBmb3IgKGNvbnN0IHRhc2sgb2YgcGxhdGZvcm1SZXN1bWUpIHtcbiAgICAgICAgeWllbGQqIHNhZmVSdW4oXG4gICAgICAgICAgXCJsaWZlY3ljbGUub25SZXN1bWVcIixcbiAgICAgICAgICB0YXNrLmVmZmVjdC5waXBlKFxuICAgICAgICAgICAgRWZmZWN0LmNhdGNoQWxsQ2F1c2UoKGNhdXNlKSA9PlxuICAgICAgICAgICAgICBub3RpZnlFcnJvcihjYXVzZSwge1xuICAgICAgICAgICAgICAgIHBoYXNlOiBcInBsYXRmb3JtXCIsXG4gICAgICAgICAgICAgICAgaG9vazogXCJyZXN1bWVcIixcbiAgICAgICAgICAgICAgICBtb2R1bGVJZDogaWRlbnRpdHkubW9kdWxlSWQsXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VJZDogaWRlbnRpdHkuaW5zdGFuY2VJZCxcbiAgICAgICAgICAgICAgICB0YXNrSWQ6IHRhc2sudGFza0lkLFxuICAgICAgICAgICAgICAgIG9yaWdpbjogXCJwbGF0Zm9ybS5yZXN1bWVcIixcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3QgcnVuUGxhdGZvcm1SZXNldDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PiA9IEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgIGlmIChwbGF0Zm9ybVJlc2V0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICAgIHlpZWxkKiByZWNvcmRQaGFzZShcInBsYXRmb3JtXCIsIFwic2lnbmFsOnJlc2V0XCIsIHsgdG90YWw6IHBsYXRmb3JtUmVzZXQubGVuZ3RoIH0pXG4gICAgICBmb3IgKGNvbnN0IHRhc2sgb2YgcGxhdGZvcm1SZXNldCkge1xuICAgICAgICB5aWVsZCogc2FmZVJ1bihcbiAgICAgICAgICBcImxpZmVjeWNsZS5vblJlc2V0XCIsXG4gICAgICAgICAgdGFzay5lZmZlY3QucGlwZShcbiAgICAgICAgICAgIEVmZmVjdC5jYXRjaEFsbENhdXNlKChjYXVzZSkgPT5cbiAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoY2F1c2UsIHtcbiAgICAgICAgICAgICAgICBwaGFzZTogXCJwbGF0Zm9ybVwiLFxuICAgICAgICAgICAgICAgIGhvb2s6IFwicmVzZXRcIixcbiAgICAgICAgICAgICAgICBtb2R1bGVJZDogaWRlbnRpdHkubW9kdWxlSWQsXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VJZDogaWRlbnRpdHkuaW5zdGFuY2VJZCxcbiAgICAgICAgICAgICAgICB0YXNrSWQ6IHRhc2sudGFza0lkLFxuICAgICAgICAgICAgICAgIG9yaWdpbjogXCJwbGF0Zm9ybS5yZXNldFwiLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBjb25zdCBnZXRUYXNrU25hcHNob3Q6IExpZmVjeWNsZU1hbmFnZXJbXCJnZXRUYXNrU25hcHNob3RcIl0gPSBFZmZlY3Quc3luYygoKSA9PiAoe1xuICAgICAgaW5pdFJlcXVpcmVkOiBpbml0UmVxdWlyZWQubWFwKCh7IGVmZmVjdDogX2VmZiwgLi4ucmVzdCB9KSA9PiByZXN0KSxcbiAgICAgIHN0YXJ0OiBzdGFydC5tYXAoKHsgZWZmZWN0OiBfZWZmLCAuLi5yZXN0IH0pID0+IHJlc3QpLFxuICAgICAgZGVzdHJveTogZGVzdHJveS5tYXAoKHsgZWZmZWN0OiBfZWZmLCAuLi5yZXN0IH0pID0+IHJlc3QpLFxuICAgICAgcGxhdGZvcm1TdXNwZW5kOiBwbGF0Zm9ybVN1c3BlbmQubWFwKCh7IGVmZmVjdDogX2VmZiwgLi4ucmVzdCB9KSA9PiByZXN0KSxcbiAgICAgIHBsYXRmb3JtUmVzdW1lOiBwbGF0Zm9ybVJlc3VtZS5tYXAoKHsgZWZmZWN0OiBfZWZmLCAuLi5yZXN0IH0pID0+IHJlc3QpLFxuICAgICAgcGxhdGZvcm1SZXNldDogcGxhdGZvcm1SZXNldC5tYXAoKHsgZWZmZWN0OiBfZWZmLCAuLi5yZXN0IH0pID0+IHJlc3QpLFxuICAgIH0pKVxuXG4gICAgY29uc3QgaGFzT25FcnJvckhhbmRsZXJzOiBMaWZlY3ljbGVNYW5hZ2VyW1wiaGFzT25FcnJvckhhbmRsZXJzXCJdID0gRWZmZWN0LnN5bmMoKCkgPT4gb25FcnJvckhhbmRsZXJzLmxlbmd0aCA+IDApXG5cbiAgICByZXR1cm4ge1xuICAgICAgaWRlbnRpdHksXG4gICAgICBidWRnZXRzLFxuICAgICAgcmVnaXN0ZXJQbGF0Zm9ybVN1c3BlbmQsXG4gICAgICByZWdpc3RlclBsYXRmb3JtUmVzdW1lLFxuICAgICAgcmVnaXN0ZXJQbGF0Zm9ybVJlc2V0LFxuICAgICAgcmVnaXN0ZXJJbml0UmVxdWlyZWQsXG4gICAgICByZWdpc3RlclN0YXJ0LFxuICAgICAgcmVnaXN0ZXJEZXN0cm95LFxuICAgICAgcmVnaXN0ZXJPbkVycm9yLFxuICAgICAgZ2V0U3RhdHVzLFxuICAgICAgc2V0U3RhdHVzLFxuICAgICAgbm90aWZ5RXJyb3IsXG4gICAgICBydW5QbGF0Zm9ybVN1c3BlbmQsXG4gICAgICBydW5QbGF0Zm9ybVJlc3VtZSxcbiAgICAgIHJ1blBsYXRmb3JtUmVzZXQsXG4gICAgICBydW5Jbml0UmVxdWlyZWQsXG4gICAgICBydW5TdGFydCxcbiAgICAgIHJ1bkRlc3Ryb3ksXG4gICAgICBoYXNPbkVycm9ySGFuZGxlcnMsXG4gICAgICBnZXRUYXNrU25hcHNob3QsXG4gICAgfVxuICB9KVxuIiwgImltcG9ydCB7IENhdXNlLCBDb250ZXh0LCBFZmZlY3QgfSBmcm9tIFwiZWZmZWN0XCJcbmltcG9ydCAqIGFzIERlYnVnIGZyb20gXCIuL0RlYnVnU2luay5qc1wiXG5pbXBvcnQgeyBpc0RldkVudiB9IGZyb20gXCIuL2Vudi5qc1wiXG5cbmNvbnN0IHBoYXNlRGlhZ25vc3RpY3NFbmFibGVkID0gKCk6IGJvb2xlYW4gPT4gaXNEZXZFbnYoKVxuXG4vKipcbiAqIExvZ2ljIFx1NzZGOFx1NTE3M1x1OEJDQVx1NjVBRFx1RkYxQVxuICogLSBcdTVGNTNcdTUyNERcdTgwNUFcdTcxMjZcdTRFOEUgRW52IFNlcnZpY2UgXHU3RjNBXHU1OTMxXHU1QkZDXHU4MUY0XHU3Njg0XHU1MjFEXHU1OUNCXHU1MzE2XHU1NjZBXHU5N0YzXHVGRjA4U2VydmljZSBub3QgZm91bmRcdUZGMDlcdTMwMDJcbiAqXG4gKiBcdThCQkVcdThCQTFcdTYxMEZcdTU2RkVcdUZGMUFcbiAqIC0gXHU1NzI4XHU2M0E4XHU4MzUwXHU3NTI4XHU2Q0Q1XHU0RTBCXHVGRjBDUnVudGltZSAvIFJlYWN0IFx1NUM0Mlx1NEYxQVx1NkI2M1x1Nzg2RVx1NjNEMFx1NEY5QiBFbnZcdUZGMUJcbiAqIC0gXHU0RjQ2XHU1NzI4XHU2N0QwXHU0RTlCXHU1MjFEXHU1OUNCXHU1MzE2XHU2NUY2XHU1RThGXHU0RTBCXHVGRjBDTG9naWMgXHU1M0VGXHU4MEZEXHU1NzI4IEVudiBcdTk0RkFcdTZFRTFcdTUyNERcdTVDMzFcdTVDMURcdThCRDVcdThCRkJcdTUzRDYgU2VydmljZVx1RkYxQlxuICogLSBcdThGRDlcdTdDN0JcdTk1MTlcdThCRUZcdTkwMUFcdTVFMzhcdTUzRUFcdTUxRkFcdTczQjBcdTRFMDBcdTZCMjFcdUZGMENcdTRFMERcdTY1MzlcdTUzRDhcdTY3MDBcdTdFQzhcdThCRURcdTRFNDlcdUZGMENcdTUzNzRcdTRGMUFcdTZDNjFcdTY3RDNcdTY1RTVcdTVGRDdcdTMwMDJcbiAqXG4gKiBcdTU2RTBcdTZCNjRcdThGRDlcdTkxQ0NcdTU3MjggRGVidWcgXHU0RkE3XHU1M0QxXHU1MUZBXHU0RTAwXHU2NzYxIHdhcm5pbmcgXHU3RUE3IGRpYWdub3N0aWNcdUZGMENcdTg5RTNcdTkxQ0FcdTUzRUZcdTgwRkRcdTUzOUZcdTU2RTBcdTRFMEVcdTYzOTJcdTY3RTVcdThERUZcdTVGODRcdUZGMENcbiAqIFx1NzcxRlx1NkI2M1x1NzY4NFx1OTUxOVx1OEJFRlx1OEJFRFx1NEU0OVx1NEVDRFx1NzUzMSBsaWZlY3ljbGUub25FcnJvciAvIEFwcFJ1bnRpbWUub25FcnJvciBcdTU5MDRcdTc0MDZcdTMwMDJcbiAqL1xuXG5jb25zdCBTRVJWSUNFX05PVF9GT1VORF9QUkVGSVggPSBcIlNlcnZpY2Ugbm90IGZvdW5kOlwiXG5cbi8qKlxuICogXHU4MkU1IENhdXNlIFx1NEUyRFx1NTMwNVx1NTQyQiBgU2VydmljZSBub3QgZm91bmQ6IC4uLmAgXHU5NTE5XHU4QkVGXHVGRjBDXHU1MjE5XHU1M0QxXHU1MUZBXHU0RTAwXHU2NzYxIHdhcm5pbmcgXHU3RUE3IGRpYWdub3N0aWNcdUZGMUFcbiAqIC0gY29kZTogbG9naWM6OmVudl9zZXJ2aWNlX25vdF9mb3VuZFxuICogLSBtZXNzYWdlOiBcdTUzOUZcdTU5Q0JcdTk1MTlcdThCRUYgbWVzc2FnZVx1RkYxQlxuICogLSBoaW50OiBcdThCRjRcdTY2MEVcdThGRDlcdTY2MkZcdTVERjJcdTc3RTVcdTc2ODRcdTUyMURcdTU5Q0JcdTUzMTZcdTY1RjZcdTVFOEZcdTU2NkFcdTk3RjNcdUZGMENcdTVFNzZcdTdFRDlcdTUxRkFcdTYzOTJcdTY3RTVcdTVFRkFcdThCQUVcdTMwMDJcbiAqL1xuZXhwb3J0IGNvbnN0IGVtaXRFbnZTZXJ2aWNlTm90Rm91bmREaWFnbm9zdGljSWZOZWVkZWQgPSAoXG4gIGNhdXNlOiBDYXVzZS5DYXVzZTx1bmtub3duPixcbiAgbW9kdWxlSWQ/OiBzdHJpbmdcbik6IEVmZmVjdC5FZmZlY3Q8dm9pZD4gPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIGxldCBwcmV0dHk6IHN0cmluZ1xuICAgIHRyeSB7XG4gICAgICBwcmV0dHkgPSBDYXVzZS5wcmV0dHkoY2F1c2UsIHsgcmVuZGVyRXJyb3JDYXVzZTogdHJ1ZSB9KVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCFwcmV0dHkuaW5jbHVkZXMoU0VSVklDRV9OT1RfRk9VTkRfUFJFRklYKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gMSkgRW52IFNlcnZpY2UgXHU3RjNBXHU1OTMxXHU2NzJDXHU4RUFCXHU3Njg0IHdhcm5pbmcgXHU4QkNBXHU2NUFEXG4gICAgeWllbGQqIERlYnVnLnJlY29yZCh7XG4gICAgICB0eXBlOiBcImRpYWdub3N0aWNcIixcbiAgICAgIG1vZHVsZUlkLFxuICAgICAgY29kZTogXCJsb2dpYzo6ZW52X3NlcnZpY2Vfbm90X2ZvdW5kXCIsXG4gICAgICBzZXZlcml0eTogXCJ3YXJuaW5nXCIsXG4gICAgICBtZXNzYWdlOiBwcmV0dHksXG4gICAgICBoaW50OlxuICAgICAgICBcIkxvZ2ljIFx1NTcyOFx1NTIxRFx1NTlDQlx1NTMxNlx1OTYzNlx1NkJCNVx1NUMxRFx1OEJENVx1OEJCRlx1OTVFRVx1NUMxQVx1NjcyQVx1NjNEMFx1NEY5Qlx1NzY4NCBFbnYgU2VydmljZVx1RkYwQ1x1OTAxQVx1NUUzOFx1NjYyRiBSdW50aW1lIC8gUmVhY3QgXHU5NkM2XHU2MjEwXHU0RTJEXHU3Njg0XHU1REYyXHU3N0U1XHU1MjFEXHU1OUNCXHU1MzE2XHU1NjZBXHU5N0YzXHUzMDAyXCIgK1xuICAgICAgICBcIlx1ODJFNVx1NTNFQVx1NTcyOFx1NUU5NFx1NzUyOFx1NTQyRlx1NTJBOFx1NjVFOVx1NjcxRlx1NTFGQVx1NzNCMFx1NEUwMFx1NkIyMVx1NEUxNFx1NTQwRVx1N0VFRFx1NzJCNlx1NjAwMVx1NEUwRSBFbnYgXHU1NzQ3XHU2QjYzXHU1RTM4XHVGRjBDXHU1M0VGXHU2NjgyXHU4OUM2XHU0RTNBXHU2NUUwXHU1QkIzXHVGRjFCXCIgK1xuICAgICAgICBcIlx1ODJFNVx1NjMwMVx1N0VFRFx1NTFGQVx1NzNCMFx1NjIxNlx1NEYzNFx1OTY4Rlx1NEUxQVx1NTJBMVx1NUYwMlx1NUUzOFx1RkYwQ1x1OEJGN1x1NjhDMFx1NjdFNSBSdW50aW1lLm1ha2UgLyBSdW50aW1lUHJvdmlkZXIubGF5ZXIgXHU2NjJGXHU1NDI2XHU2QjYzXHU3ODZFXHU2M0QwXHU0RjlCXHU0RTg2XHU1QkY5XHU1RTk0IFNlcnZpY2VcdTMwMDJcIixcbiAgICB9KVxuXG4gICAgLy8gMikgXHU1NzI4XHU2N0QwXHU0RTlCXHU1NzNBXHU2NjZGXHU0RTBCXHVGRjA4XHU0RjhCXHU1OTgyIExvZ2ljIHNldHVwIFx1NkJCNVx1OEZDN1x1NjVFOVx1OEJCRlx1OTVFRSBFbnZcdUZGMDlcdUZGMENcdTYyMTFcdTRFRUNcdTRFNUZcdTVFMENcdTY3MUJcdTkwMUFcdThGQzdcbiAgICAvLyAgICBsb2dpYzo6aW52YWxpZF9waGFzZSBcdTYzRDBcdTkxOTJcdTIwMUNcdThCRjdcdTVDMDYgRW52IFx1OEJCRlx1OTVFRVx1NzlGQlx1NTJBOFx1NTIzMCBydW4gXHU2QkI1XHUyMDFEXHUzMDAyXG4gICAgLy9cbiAgICAvLyBcdTc1MzFcdTRFOEVcdTVGNTNcdTUyNERcdTVCOUVcdTczQjBcdTY1RTBcdTZDRDVcdTU3MjhcdTZCNjRcdTU5MDRcdTUzRUZcdTk3NjBcdTUyMjRcdTY1QURcdThDMDNcdTc1MjhcdTUzRDFcdTc1MUZcdTc2ODQgcGhhc2VcdUZGMENcdThGRDlcdTkxQ0NcdTUzRUFcdTY2MkZcdTYzRDBcdTRGOUJcdTRFMDBcdTRFMkFcdTg4NjVcdTUxNDVcdTYwMjdcdTc2ODRcbiAgICAvLyBcdThCQ0FcdTY1QURcdTRGRTFcdTUzRjdcdUZGMENcdTc3MUZcdTZCNjNcdTc2ODQgcGhhc2UgXHU1Qjg4XHU1MzZCXHU0RUNEXHU3NTMxIExvZ2ljUGhhc2VFcnJvciArIGVtaXRJbnZhbGlkUGhhc2VEaWFnbm9zdGljSWZOZWVkZWQgXHU2MjdGXHU2MkM1XHUzMDAyXG4gICAgeWllbGQqIERlYnVnLnJlY29yZCh7XG4gICAgICB0eXBlOiBcImRpYWdub3N0aWNcIixcbiAgICAgIG1vZHVsZUlkLFxuICAgICAgY29kZTogXCJsb2dpYzo6aW52YWxpZF9waGFzZVwiLFxuICAgICAgc2V2ZXJpdHk6IFwiZXJyb3JcIixcbiAgICAgIG1lc3NhZ2U6IFwiJC51c2UgaXMgbm90IGFsbG93ZWQgYmVmb3JlIEVudiBpcyBmdWxseSByZWFkeS5cIixcbiAgICAgIGhpbnQ6XG4gICAgICAgIFwic2V0dXAgXHU2QkI1XHU2MjE2IEVudiBcdTY3MkFcdTVCOENcdTUxNjhcdTVDMzFcdTdFRUFcdTY1RjZcdThCRjdcdTkwN0ZcdTUxNERcdTc2RjRcdTYzQTVcdThCRkJcdTUzRDYgU2VydmljZVx1RkYxQlwiICtcbiAgICAgICAgXCJcdTVFRkFcdThCQUVcdTVDMDZcdTVCRjkgRW52IFx1NzY4NFx1OEJCRlx1OTVFRVx1NzlGQlx1NTJBOFx1NTIzMCBMb2dpYyBcdTc2ODQgcnVuIFx1NkJCNVx1RkYwQ1x1NjIxNlx1OTAxQVx1OEZDNyAkLmxpZmVjeWNsZS5vbkluaXRSZXF1aXJlZCBcdTUzMDVcdTg4QzVcdTUyMURcdTU5Q0JcdTUzMTZcdTZENDFcdTdBMEJcdTMwMDJcIixcbiAgICAgIGtpbmQ6IFwiZW52X3NlcnZpY2Vfbm90X3JlYWR5XCIsXG4gICAgfSlcbiAgfSlcblxuZXhwb3J0IGludGVyZmFjZSBMb2dpY1BoYXNlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IF90YWc6IFwiTG9naWNQaGFzZUVycm9yXCJcbiAgcmVhZG9ubHkga2luZDogc3RyaW5nXG4gIHJlYWRvbmx5IGFwaT86IHN0cmluZ1xuICByZWFkb25seSBwaGFzZTogXCJzZXR1cFwiIHwgXCJydW5cIlxuICByZWFkb25seSBtb2R1bGVJZD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvZ2ljUGhhc2VTZXJ2aWNlIHtcbiAgcmVhZG9ubHkgY3VycmVudDogXCJzZXR1cFwiIHwgXCJydW5cIlxufVxuXG5leHBvcnQgY29uc3QgTG9naWNQaGFzZVNlcnZpY2VUYWcgPSBDb250ZXh0LkdlbmVyaWNUYWc8TG9naWNQaGFzZVNlcnZpY2U+KFxuICBcIkBsb2dpeC9Mb2dpY1BoYXNlU2VydmljZVwiXG4pXG5cbi8qKlxuICogTG9naWNVbml0U2VydmljZVx1RkYxQVxuICogLSBcdTU3MjhcdTYyNjdcdTg4NENcdTZCQ0ZcdTRFMkEgbW91bnRlZCBsb2dpYyBcdTY1RjZcdTZDRThcdTUxNjVcdUZGMDhzY29wZSA9IFx1NTM1NVx1NEUyQSBsb2dpYyBcdTc2ODQgc2V0dXAvcnVuIGZpYmVyXHVGRjA5XHVGRjFCXG4gKiAtIFx1NzUyOFx1NEU4RSB0cmFpdHMgcHJvdmVuYW5jZSBcdTdCNDlcdTIwMUNcdTRFMEVcdTVGNTNcdTUyNERcdTkwM0JcdThGOTFcdTUzNTVcdTUxNDNcdTdFRDFcdTVCOUFcdTIwMURcdTc2ODRcdTRGRTFcdTYwNkZcdUZGMDhcdTVCRjlcdTlGNTAgMDIyLW1vZHVsZSBcdTc2ODQgbG9naWNVbml0SWRcdUZGMDlcdTMwMDJcbiAqXG4gKiBcdTdFQTZcdTY3NUZcdUZGMUFcbiAqIC0gXHU3RUFGXHU1M0VBXHU4QkZCXHVGRjA4XHU0RTBEXHU1Rjk3XHU1MTk5XHU1MTY1IHJ1bnRpbWUgc3RhdGVcdUZGMDlcdUZGMUJcdTRFQzVcdTRGNUNcdTRFM0EgcHJvdmVuYW5jZS9cdThCQ0FcdTY1QURcdTk1MUFcdTcwQjlcdTMwMDJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2dpY1VuaXRTZXJ2aWNlIHtcbiAgcmVhZG9ubHkgbG9naWNVbml0SWQ6IHN0cmluZ1xuICByZWFkb25seSBsb2dpY1VuaXRJZEtpbmQ6IFwiZXhwbGljaXRcIiB8IFwiZGVyaXZlZFwiXG4gIHJlYWRvbmx5IGxvZ2ljVW5pdExhYmVsOiBzdHJpbmdcbiAgcmVhZG9ubHkgcGF0aD86IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgTG9naWNVbml0U2VydmljZVRhZyBleHRlbmRzIENvbnRleHQuVGFnKFwiQGxvZ2l4L0xvZ2ljVW5pdFNlcnZpY2VcIik8XG4gIExvZ2ljVW5pdFNlcnZpY2VUYWcsXG4gIExvZ2ljVW5pdFNlcnZpY2Vcbj4oKSB7fVxuXG5leHBvcnQgY29uc3QgbWFrZUxvZ2ljUGhhc2VFcnJvciA9IChcbiAga2luZDogc3RyaW5nLFxuICBhcGk6IHN0cmluZyxcbiAgcGhhc2U6IFwic2V0dXBcIiB8IFwicnVuXCIsXG4gIG1vZHVsZUlkPzogc3RyaW5nXG4pOiBMb2dpY1BoYXNlRXJyb3IgPT5cbiAgT2JqZWN0LmFzc2lnbihcbiAgICBuZXcgRXJyb3IoXG4gICAgICBgW0xvZ2ljUGhhc2VFcnJvcl0gJHthcGl9IGlzIG5vdCBhbGxvd2VkIGluICR7cGhhc2V9IHBoYXNlIChraW5kPSR7a2luZH0pLmBcbiAgICApLFxuICAgIHtcbiAgICAgIF90YWc6IFwiTG9naWNQaGFzZUVycm9yXCIsXG4gICAgICBraW5kLFxuICAgICAgYXBpLFxuICAgICAgcGhhc2UsXG4gICAgICBtb2R1bGVJZCxcbiAgICB9XG4gICkgYXMgTG9naWNQaGFzZUVycm9yXG5cbi8qKlxuICogXHU0RUNFIENhdXNlIFx1NEUyRFx1NjNEMFx1NTNENiBMb2dpY1BoYXNlRXJyb3JcdUZGMENcdTVFNzZcdTRFRTUgZGlhZ25vc3RpYyBcdTVGNjJcdTVGMEZcdTUzRDFcdTUxRkFcdUZGMUFcbiAqIC0gY29kZTogbG9naWM6OmludmFsaWRfcGhhc2VcbiAqIC0ga2luZDogXHU1MTc3XHU0RjUzXHU4RkREXHU4OUM0XHU3QzdCXHU1NzhCXHVGRjA4XHU1OTgyIHVzZV9pbl9zZXR1cFx1RkYwOVxuICovXG5leHBvcnQgY29uc3QgZW1pdEludmFsaWRQaGFzZURpYWdub3N0aWNJZk5lZWRlZCA9IChcbiAgY2F1c2U6IENhdXNlLkNhdXNlPHVua25vd24+LFxuICBtb2R1bGVJZD86IHN0cmluZ1xuKTogRWZmZWN0LkVmZmVjdDx2b2lkPiA9PlxuICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgaWYgKCFwaGFzZURpYWdub3N0aWNzRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBhbGxFcnJvcnMgPSBbXG4gICAgICAuLi5DYXVzZS5mYWlsdXJlcyhjYXVzZSksXG4gICAgICAuLi5DYXVzZS5kZWZlY3RzKGNhdXNlKSxcbiAgICBdXG5cbiAgICBmb3IgKGNvbnN0IGVyciBvZiBhbGxFcnJvcnMpIHtcbiAgICAgIGNvbnN0IGxvZ2ljRXJyID0gZXJyIGFzIGFueVxuICAgICAgaWYgKGxvZ2ljRXJyICYmIGxvZ2ljRXJyLl90YWcgPT09IFwiTG9naWNQaGFzZUVycm9yXCIpIHtcbiAgICAgICAgY29uc3QgcGhhc2VFcnIgPSBsb2dpY0VyciBhcyBMb2dpY1BoYXNlRXJyb3JcbiAgICAgICAgY29uc3QgaGludCA9XG4gICAgICAgICAgcGhhc2VFcnIua2luZCA9PT0gXCJ1c2VfaW5fc2V0dXBcIiB8fFxuICAgICAgICAgIHBoYXNlRXJyLmtpbmQgPT09IFwibGlmZWN5Y2xlX2luX3NldHVwXCJcbiAgICAgICAgICAgID8gXCJzZXR1cCBcdTZCQjVcdTc5ODFcdTZCNjJcdThCRkJcdTUzRDYgRW52L1NlcnZpY2UgXHU2MjE2XHU2MjY3XHU4ODRDXHU5NTdGXHU3NTFGXHU1NDdEXHU1NDY4XHU2NzFGXHU5MDNCXHU4RjkxXHVGRjBDXHU4QkY3XHU1QzA2XHU3NkY4XHU1MTczXHU4QzAzXHU3NTI4XHU3OUZCXHU1MkE4XHU1MjMwIHJ1biBcdTZCQjVcdTMwMDJcIlxuICAgICAgICAgICAgOiBwaGFzZUVyci5raW5kID09PSBcImxpZmVjeWNsZV9pbl9ydW5cIlxuICAgICAgICAgICAgICA/IFwicnVuIFx1NkJCNVx1Nzk4MVx1NkI2Mlx1NkNFOFx1NTE4QyAkLmxpZmVjeWNsZS4qXHVGRjA4c2V0dXAtb25seVx1RkYwOVx1MzAwMlx1OEJGN1x1NUMwNlx1NzUxRlx1NTQ3RFx1NTQ2OFx1NjcxRlx1NkNFOFx1NTE4Q1x1NzlGQlx1NTJBOFx1NTIzMCBNb2R1bGUubG9naWMgYnVpbGRlciBcdTc2ODRcdTU0MENcdTZCNjVcdTkwRThcdTUyMDZcdUZGMDhyZXR1cm4gXHU0RTRCXHU1MjREXHVGRjA5XHUzMDAyXCJcbiAgICAgICAgICAgIDogcGhhc2VFcnIua2luZCA9PT0gXCJ0cmFpdHNfaW5fcnVuXCIgfHwgcGhhc2VFcnIua2luZCA9PT0gXCJ0cmFpdHNfZGVjbGFyZV9pbl9ydW5cIlxuICAgICAgICAgICAgICA/IFwic2V0dXAgXHU3RUQzXHU2NzVGXHU1NDBFIHRyYWl0cyBcdTVERjJcdTUxQkJcdTdFRDNcdUZGMUJcdThCRjdcdTVDMDYgJC50cmFpdHMuZGVjbGFyZSBcdTc5RkJcdTUyQThcdTUyMzAgTG9naWNQbGFuLnNldHVwIFx1NjIxNiBNb2R1bGUubG9naWMgYnVpbGRlciBcdTc2ODQgc2V0dXAgXHU2Q0U4XHU1MThDXHU5NjM2XHU2QkI1XHUzMDAyXCJcbiAgICAgICAgICAgIDogXCJcdThDMDNcdTY1NzRcdTkwM0JcdThGOTFcdTUyMzAgcnVuIFx1NkJCNVx1RkYwQ3NldHVwIFx1NEVDNVx1NTA1QVx1NkNFOFx1NTE4Q1x1N0M3Qlx1NjRDRFx1NEY1Q1x1MzAwMlwiXG5cbiAgICAgICAgeWllbGQqIERlYnVnLnJlY29yZCh7XG4gICAgICAgICAgdHlwZTogXCJkaWFnbm9zdGljXCIsXG4gICAgICAgICAgbW9kdWxlSWQ6IHBoYXNlRXJyLm1vZHVsZUlkID8/IG1vZHVsZUlkLFxuICAgICAgICAgIGNvZGU6IFwibG9naWM6OmludmFsaWRfcGhhc2VcIixcbiAgICAgICAgICBzZXZlcml0eTogXCJlcnJvclwiLFxuICAgICAgICAgIG1lc3NhZ2U6IGAke3BoYXNlRXJyLmFwaSA/PyBwaGFzZUVyci5raW5kfSBpcyBub3QgYWxsb3dlZCBpbiAke3BoYXNlRXJyLnBoYXNlfSBwaGFzZS5gLFxuICAgICAgICAgIGhpbnQsXG4gICAgICAgICAga2luZDogcGhhc2VFcnIua2luZCxcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBcdTU0N0RcdTRFMkRcdTk5OTZcdTRFMkEgTG9naWNQaGFzZUVycm9yIFx1NTM3M1x1NTNFRlx1OEZENFx1NTZERVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG4gIH0pXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7OztBQUFBLFNBQVMsT0FBTyxTQUFTLFFBQVEsV0FBVztBQTJLckMsSUFBTSxtQkFBbUIsUUFBUTtBQUFBLEVBQ3RDO0FBQ0Y7QUFFQSxJQUFNLFVBQVUsQ0FBQyxPQUFlLFFBQzlCLElBQUk7QUFBQSxFQUNGLE9BQU8saUJBQWlCO0FBQUEsSUFDdEIsV0FBVyxNQUFNLE9BQU87QUFBQSxJQUN4QixXQUFXLENBQUMsVUFDVixPQUFPLFNBQVMsSUFBSSxLQUFLLGFBQWEsTUFBTSxPQUFPLEtBQUssQ0FBQyxFQUFFO0FBQUEsRUFDL0QsQ0FBQztBQUNIO0FBRUYsSUFBTSxhQUFhLENBQUMsTUFBZ0IsVUFBMEIsR0FBRyxJQUFJLElBQUksS0FBSztBQUV2RSxJQUFNLHVCQUF1QixDQUNsQyxhQUVBLE9BQU8sSUFBSSxhQUFhO0FBQ3RCLFFBQU0sVUFBbUI7QUFBQSxJQUN2QixzQkFBc0I7QUFBQSxJQUN0QixlQUFlLElBQUk7QUFBQSxFQUNyQjtBQUVBLFFBQU0sWUFBWSxPQUFPLElBQUksS0FBc0I7QUFBQSxJQUNqRDtBQUFBLElBQ0EsUUFBUTtBQUFBLEVBQ1YsQ0FBQztBQUVELFFBQU0sZUFBZ0MsQ0FBQztBQUN2QyxRQUFNLFFBQXlCLENBQUM7QUFDaEMsUUFBTSxVQUEyQixDQUFDO0FBQ2xDLFFBQU0sa0JBQW1DLENBQUM7QUFDMUMsUUFBTSxpQkFBa0MsQ0FBQztBQUN6QyxRQUFNLGdCQUFpQyxDQUFDO0FBQ3hDLFFBQU0sa0JBS0YsQ0FBQztBQUVMLFFBQU0sWUFBNEMsSUFBSSxJQUFJLFNBQVM7QUFFbkUsUUFBTSxjQUFjLENBQ2xCLE9BQ0EsTUFDQSxZQUVNLE9BQU87QUFBQSxJQUNY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QUF3QixHQUFHO0FBQzlCO0FBQUEsRUFDRjtBQUVBLFFBQU0sWUFBWTtBQUFBLElBQ2hCLEdBQUdDLE9BQU0sU0FBUyxLQUFLO0FBQUEsSUFDdkIsR0FBR0EsT0FBTSxRQUFRLEtBQUs7QUFBQSxFQUN4QjtBQUVBLGFBQVcsT0FBTyxXQUFXO0FBQzNCLFVBQU0sV0FBVztBQUNqQixRQUFJLFlBQVksU0FBUyxTQUFTLG1CQUFtQjtBQUNuRCxZQUFNLFdBQVc7QUFDakIsWUFBTSxPQUNKLFNBQVMsU0FBUyxrQkFDbEIsU0FBUyxTQUFTLHVCQUNkLCtMQUNBLFNBQVMsU0FBUyxxQkFDaEIsNE9BQ0YsU0FBUyxTQUFTLG1CQUFtQixTQUFTLFNBQVMsMEJBQ3JELHFNQUNGO0FBRU4sYUFBYSxPQUFPO0FBQUEsUUFDbEIsTUFBTTtBQUFBLFFBQ04sVUFBVSxTQUFTLFlBQVk7QUFBQSxRQUMvQixNQUFNO0FBQUEsUUFDTixVQUFVO0FBQUEsUUFDVixTQUFTLEdBQUcsU0FBUyxPQUFPLFNBQVMsSUFBSSxzQkFBc0IsU0FBUyxLQUFLO0FBQUEsUUFDN0U7QUFBQSxRQUNBLE1BQU0sU0FBUztBQUFBLE1BQ2pCLENBQUM7QUFHRDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0YsQ0FBQzsiLAogICJuYW1lcyI6IFsiQ2F1c2UiLCAiQ29udGV4dCIsICJFZmZlY3QiLCAiRWZmZWN0IiwgIkNhdXNlIiwgIkNvbnRleHQiXQp9Cg==
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// @logix/core subpath bundles for @logix/sandbox
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
// ../logix-core/src/internal/runtime/core/Platform.ts
|
|
5
|
+
import { Context } from "../effect.js";
|
|
6
|
+
var Tag = Context.GenericTag("@logix/Platform");
|
|
7
|
+
|
|
8
|
+
export {
|
|
9
|
+
Tag
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL1BsYXRmb3JtLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBDb250ZXh0LCBFZmZlY3QgfSBmcm9tICdlZmZlY3QnXG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZSB7XG4gIHJlYWRvbmx5IGxpZmVjeWNsZToge1xuICAgIHJlYWRvbmx5IG9uU3VzcGVuZDogKGVmZjogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PikgPT4gRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PlxuICAgIHJlYWRvbmx5IG9uUmVzdW1lOiAoZWZmOiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+KSA9PiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+XG4gICAgcmVhZG9ubHkgb25SZXNldD86IChlZmY6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4pID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT5cbiAgfVxuXG4gIC8qKlxuICAgKiBcdTVFNzNcdTUzRjBcdTRGRTFcdTUzRjdcdTVFN0ZcdTY0QURcdTUxNjVcdTUzRTNcdUZGMDhcdTc1MjhcdTRFOEVcdTVCQkZcdTRFM0JcdTk2QzZcdTYyMTBcdTRFMEVcdTZENEJcdThCRDVcdUZGMDlcdUZGMUFcdTg5RTZcdTUzRDFcdTVERjJcdTZDRThcdTUxOENcdTc2ODQgbGlmZWN5Y2xlIGhhbmRsZXJzXHUzMDAyXG4gICAqXG4gICAqIFx1OEJGNFx1NjYwRVx1RkYxQVxuICAgKiAtIFx1OUVEOFx1OEJBNFx1NUI5RVx1NzNCMFx1NUU5NFx1NEUzQVx1NUI4OVx1NTE2OCBuby1vcFx1RkYxQlxuICAgKiAtIFx1NTkzMVx1OEQyNVx1N0I1Nlx1NzU2NVx1NzUzMVx1NUU3M1x1NTNGMFx1NUI5RVx1NzNCMFx1NTFCM1x1NUI5QVx1RkYxQlx1OEZEMFx1ODg0Q1x1NjVGNlx1NEZBN1x1NUU5NFx1NEZERFx1OEJDMVx1MjAxQ1x1OUVEOFx1OEJBNFx1NEUwRFx1N0VDOFx1NkI2Mlx1NUI5RVx1NEY4Qlx1MjAxRFx1MzAwMlxuICAgKi9cbiAgcmVhZG9ubHkgZW1pdFN1c3BlbmQ6ICgpID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT5cbiAgcmVhZG9ubHkgZW1pdFJlc3VtZTogKCkgPT4gRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PlxuICByZWFkb25seSBlbWl0UmVzZXQ6ICgpID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT5cbn1cblxuZXhwb3J0IGNvbnN0IFRhZyA9IENvbnRleHQuR2VuZXJpY1RhZzxTZXJ2aWNlPignQGxvZ2l4L1BsYXRmb3JtJylcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7QUFBQSxTQUFTLGVBQXVCO0FBcUJ6QixJQUFNLE1BQU0sUUFBUSxXQUFvQixpQkFBaUI7IiwKICAibmFtZXMiOiBbXQp9Cg==
|