@zivis/mcp 0.1.0-alpha.19 → 0.1.0-alpha.20
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/dist/auth/keychain.js +35 -27
- package/dist/auth/keychain.js.map +1 -1
- package/package.json +1 -1
package/dist/auth/keychain.js
CHANGED
|
@@ -45,23 +45,39 @@ function getFallbackPath(account, storage) {
|
|
|
45
45
|
return path.join(getFallbackDir(storage.configDir), `${account}.enc`);
|
|
46
46
|
}
|
|
47
47
|
// ── macOS Keychain ──
|
|
48
|
+
/**
|
|
49
|
+
* Drains every entry that matches `-a zivis-mcp -s <service>`. The macOS
|
|
50
|
+
* keychain happily keeps duplicate entries for the same service+account pair
|
|
51
|
+
* (different creation timestamps), so a single delete leaves stragglers behind.
|
|
52
|
+
* Loop until the command errors (no entries left).
|
|
53
|
+
*/
|
|
54
|
+
async function macosDeleteAll(service) {
|
|
55
|
+
for (let i = 0; i < 100; i++) {
|
|
56
|
+
try {
|
|
57
|
+
await execFileAsync("security", [
|
|
58
|
+
"delete-generic-password",
|
|
59
|
+
"-a",
|
|
60
|
+
"zivis-mcp",
|
|
61
|
+
"-s",
|
|
62
|
+
service,
|
|
63
|
+
]);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return; // No more entries.
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
48
70
|
async function macosStore(account, value, keychainPrefix) {
|
|
49
71
|
const service = getServiceName(account, keychainPrefix);
|
|
50
|
-
//
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
"-s",
|
|
57
|
-
service,
|
|
58
|
-
]);
|
|
59
|
-
}
|
|
60
|
-
catch {
|
|
61
|
-
// Entry didn't exist, that's fine
|
|
62
|
-
}
|
|
72
|
+
// Drain stale duplicates before writing — guards against history left by
|
|
73
|
+
// older builds that didn't clean up after themselves.
|
|
74
|
+
await macosDeleteAll(service);
|
|
75
|
+
// -U updates in place if a matching entry exists, otherwise creates one.
|
|
76
|
+
// Belt-and-braces with the drain above; together they keep the keychain
|
|
77
|
+
// from accumulating duplicate generic-password entries.
|
|
63
78
|
await execFileAsync("security", [
|
|
64
79
|
"add-generic-password",
|
|
80
|
+
"-U",
|
|
65
81
|
"-a",
|
|
66
82
|
"zivis-mcp",
|
|
67
83
|
"-s",
|
|
@@ -88,19 +104,7 @@ async function macosRead(account, keychainPrefix) {
|
|
|
88
104
|
}
|
|
89
105
|
}
|
|
90
106
|
async function macosDelete(account, keychainPrefix) {
|
|
91
|
-
|
|
92
|
-
try {
|
|
93
|
-
await execFileAsync("security", [
|
|
94
|
-
"delete-generic-password",
|
|
95
|
-
"-a",
|
|
96
|
-
"zivis-mcp",
|
|
97
|
-
"-s",
|
|
98
|
-
service,
|
|
99
|
-
]);
|
|
100
|
-
}
|
|
101
|
-
catch {
|
|
102
|
-
// Entry didn't exist
|
|
103
|
-
}
|
|
107
|
+
await macosDeleteAll(getServiceName(account, keychainPrefix));
|
|
104
108
|
}
|
|
105
109
|
// ── Linux Secret Service ──
|
|
106
110
|
async function linuxStore(account, value, keychainPrefix) {
|
|
@@ -240,13 +244,17 @@ export async function keychainRead(account, storage) {
|
|
|
240
244
|
}
|
|
241
245
|
export async function keychainDelete(account, storage) {
|
|
242
246
|
const st = resolvedStorage(storage);
|
|
247
|
+
// keychainStore writes to BOTH the native keychain AND the encrypted file
|
|
248
|
+
// fallback (so MCP servers spawned by IDEs can still read credentials when
|
|
249
|
+
// the `security` CLI is unreachable on $PATH). Delete must wipe both, or
|
|
250
|
+
// a stale OAuth/api-key file silently outlives a logout.
|
|
251
|
+
await fileDelete(account, st);
|
|
243
252
|
if (await useKeychain()) {
|
|
244
253
|
if (process.platform === "darwin")
|
|
245
254
|
return macosDelete(account, st.keychainPrefix);
|
|
246
255
|
if (process.platform === "linux")
|
|
247
256
|
return linuxDelete(account, st.keychainPrefix);
|
|
248
257
|
}
|
|
249
|
-
return fileDelete(account, st);
|
|
250
258
|
}
|
|
251
259
|
/**
|
|
252
260
|
* Delete credentials for a specific session
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keychain.js","sourceRoot":"","sources":["../../src/auth/keychain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,UAAU,EAA0B,MAAM,aAAa,CAAC;AAEjE,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,SAAS,eAAe,CAAC,OAA2B;IAClD,OAAO,CACL,OAAO,IAAI;QACT,cAAc,EAAE,UAAU,CAAC,cAAc;QACzC,SAAS,EAAE,UAAU,CAAC,SAAS;KAChC,CACF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAChD,OAAO,OAAO,CAAC,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;AAChD,CAAC;AAED,SAAS,cAAc,CAAC,OAAe,EAAE,cAAsB;IAC7D,OAAO,GAAG,cAAc,IAAI,OAAO,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,cAAc,CAAC,SAAiB;IACvC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,eAAe,CAAC,OAAe,EAAE,OAA0B;IAClE,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,GAAG,OAAO,MAAM,CAAC,CAAC;AACxE,CAAC;AAED,uBAAuB;AAEvB,KAAK,UAAU,
|
|
1
|
+
{"version":3,"file":"keychain.js","sourceRoot":"","sources":["../../src/auth/keychain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,UAAU,EAA0B,MAAM,aAAa,CAAC;AAEjE,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,SAAS,eAAe,CAAC,OAA2B;IAClD,OAAO,CACL,OAAO,IAAI;QACT,cAAc,EAAE,UAAU,CAAC,cAAc;QACzC,SAAS,EAAE,UAAU,CAAC,SAAS;KAChC,CACF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAChD,OAAO,OAAO,CAAC,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;AAChD,CAAC;AAED,SAAS,cAAc,CAAC,OAAe,EAAE,cAAsB;IAC7D,OAAO,GAAG,cAAc,IAAI,OAAO,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,cAAc,CAAC,SAAiB;IACvC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,eAAe,CAAC,OAAe,EAAE,OAA0B;IAClE,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,GAAG,OAAO,MAAM,CAAC,CAAC;AACxE,CAAC;AAED,uBAAuB;AAEvB;;;;;GAKG;AACH,KAAK,UAAU,cAAc,CAAC,OAAe;IAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,UAAU,EAAE;gBAC9B,yBAAyB;gBACzB,IAAI;gBACJ,WAAW;gBACX,IAAI;gBACJ,OAAO;aACR,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,mBAAmB;QAC7B,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,OAAe,EACf,KAAa,EACb,cAAsB;IAEtB,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IACxD,yEAAyE;IACzE,sDAAsD;IACtD,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;IAC9B,yEAAyE;IACzE,wEAAwE;IACxE,wDAAwD;IACxD,MAAM,aAAa,CAAC,UAAU,EAAE;QAC9B,sBAAsB;QACtB,IAAI;QACJ,IAAI;QACJ,WAAW;QACX,IAAI;QACJ,OAAO;QACP,IAAI;QACJ,KAAK;KACN,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,OAAe,EACf,cAAsB;IAEtB,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IACxD,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE;YACjD,uBAAuB;YACvB,IAAI;YACJ,WAAW;YACX,IAAI;YACJ,OAAO;YACP,IAAI;SACL,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,OAAe,EACf,cAAsB;IAEtB,MAAM,cAAc,CAAC,cAAc,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,6BAA6B;AAE7B,KAAK,UAAU,UAAU,CACvB,OAAe,EACf,KAAa,EACb,cAAsB;IAEtB,MAAM,KAAK,GAAG,aAAa,CAAC,aAAa,EAAE;QACzC,OAAO;QACP,SAAS;QACT,aAAa,OAAO,EAAE;QACtB,SAAS;QACT,cAAc;QACd,SAAS;QACT,OAAO;KACR,CAAC,CAAC;IACH,qCAAqC;IACrC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAChC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;IACzB,MAAM,KAAK,CAAC;AACd,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,OAAe,EACf,cAAsB;IAEtB,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,aAAa,EAAE;YACpD,QAAQ;YACR,SAAS;YACT,cAAc;YACd,SAAS;YACT,OAAO;SACR,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,OAAe,EACf,cAAsB;IAEtB,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,aAAa,EAAE;YACjC,OAAO;YACP,SAAS;YACT,cAAc;YACd,SAAS;YACT,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,qBAAqB;IACvB,CAAC;AACH,CAAC;AAED,uEAAuE;AAEvE,SAAS,SAAS;IAChB,mDAAmD;IACnD,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC;IACpE,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;AAC3D,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,OAAe,EACf,KAAa,EACb,OAA0B;IAE1B,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;IACxB,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAClC,8DAA8D;IAC9D,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,aAAa,EAAE,GAAU,EAAE,EAAS,CAAC,CAAC;IAC3E,IAAI,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IACpD,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEjC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAEzE,MAAM,GAAG,GAAG,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,MAAM,EAAE,CAAC,SAAS,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC/E,CAAC;AAED,KAAK,UAAU,QAAQ,CACrB,OAAe,EACf,OAA0B;IAE1B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;QACzE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;QACxB,8DAA8D;QAC9D,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CACtC,aAAa,EACb,GAAU,EACV,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAQ,CAC9B,CAAC;QACF,IAAI,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QACrD,SAAS,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACpC,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,OAAe,EACf,OAA0B;IAE1B,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,oBAAoB;IACtB,CAAC;AACH,CAAC;AAED,sCAAsC;AAEtC,KAAK,UAAU,mBAAmB;IAChC,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAClC,MAAM,aAAa,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,MAAM,aAAa,CAAC,OAAO,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;YAC9C,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,IAAI,iBAAiB,GAAmB,IAAI,CAAC;AAE7C,KAAK,UAAU,WAAW;IACxB,IAAI,iBAAiB,KAAK,IAAI,EAAE,CAAC;QAC/B,iBAAiB,GAAG,MAAM,mBAAmB,EAAE,CAAC;IAClD,CAAC;IACD,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,mBAAmB;AAEnB,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAe,EACf,KAAa,EACb,OAA2B;IAE3B,MAAM,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACpC,kFAAkF;IAClF,gFAAgF;IAChF,MAAM,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IAEpC,6CAA6C;IAC7C,IAAI,MAAM,WAAW,EAAE,EAAE,CAAC;QACxB,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAClC,MAAM,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC;QACtD,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACxC,MAAM,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAe,EACf,OAA2B;IAE3B,MAAM,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,MAAM,WAAW,EAAE,EAAE,CAAC;QACxB,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ;YAC/B,OAAO,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC;QAC/C,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;YAAE,OAAO,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAe,EACf,OAA2B;IAE3B,MAAM,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACpC,0EAA0E;IAC1E,2EAA2E;IAC3E,yEAAyE;IACzE,yDAAyD;IACzD,MAAM,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC9B,IAAI,MAAM,WAAW,EAAE,EAAE,CAAC;QACxB,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC;QAClF,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;YAAE,OAAO,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC;IACnF,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAgB,EAChB,OAA2B;IAE3B,MAAM,cAAc,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;AAC5D,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAA2B;IAChE,MAAM,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACvC,MAAM,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,gBAAgB,CAAC;IAC3D,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,gBAAgB,CAAC;IAC1D,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,gBAAgB,CAAC;IAC1D,OAAO,gBAAgB,CAAC;AAC1B,CAAC"}
|