@nx/shared-fs-cache 1.3.0-beta.1 → 1.3.0-beta.10

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/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@nx/shared-fs-cache",
3
- "version": "1.3.0-beta.1",
3
+ "version": "1.3.0-beta.10",
4
4
  "description": "A Nx plugin to enable you to use a shared file system directory",
5
5
  "type": "commonjs",
6
6
  "main": "src/index.js",
7
7
  "types": "src/index.d.ts",
8
8
  "keywords": [],
9
9
  "license": "Commercial",
10
- "homepage": "https://nx.dev/nx-api/powerpack-shared-fs-cache",
10
+ "homepage": "https://nx.dev/nx-api/shared-fs-cache",
11
11
  "publishConfig": {
12
12
  "access": "public"
13
13
  },
@@ -21,7 +21,7 @@
21
21
  ],
22
22
  "dependencies": {
23
23
  "@nx/devkit": ">= 19 < 21",
24
- "@nx/key": "1.3.0-beta.1",
24
+ "@nx/key": "1.3.0-beta.10",
25
25
  "semver": "7.5.4"
26
26
  }
27
27
  }
@@ -0,0 +1,3 @@
1
+ import { Tree } from '@nx/devkit';
2
+ export declare function initGenerator(tree: Tree): Promise<() => void>;
3
+ export default initGenerator;
@@ -1 +1,44 @@
1
- 'use strict';const a0_0x3bbc46=a0_0xaa59;(function(_0x54f070,_0x261ed3){const _0x487a9e=a0_0xaa59,_0x5b1ed1=_0x54f070();while(!![]){try{const _0x9657be=-parseInt(_0x487a9e(0x119))/0x1*(-parseInt(_0x487a9e(0x117))/0x2)+-parseInt(_0x487a9e(0x11d))/0x3*(parseInt(_0x487a9e(0x124))/0x4)+-parseInt(_0x487a9e(0x123))/0x5+parseInt(_0x487a9e(0x126))/0x6*(-parseInt(_0x487a9e(0x125))/0x7)+parseInt(_0x487a9e(0x113))/0x8*(-parseInt(_0x487a9e(0x11a))/0x9)+-parseInt(_0x487a9e(0x12c))/0xa*(-parseInt(_0x487a9e(0x130))/0xb)+parseInt(_0x487a9e(0x11f))/0xc;if(_0x9657be===_0x261ed3)break;else _0x5b1ed1['push'](_0x5b1ed1['shift']());}catch(_0x13a5d7){_0x5b1ed1['push'](_0x5b1ed1['shift']());}}}(a0_0x3c1e,0x9d041));function a0_0x3c1e(){const _0x52c1fb=['13JBLxjt','2592HfZGXh','initGenerator','exists','3shqkQx','package.json','15209304BQvhaN','formatFiles','default','@nx/devkit','1422190VmyAnS','1841908GDmrTP','3003BqIrCR','13962GnPYeN','__esModule','dependencies','readNxJson','name','../../../package.json','1470qlpalu','@nx/key','semver','updateJson','90299UBMMIr','getNxKeyInformationAsync','NX_VERSION','33392ofyKFp','20.0.0','gte','devDependencies','171428FQpPxC','updateNxJson'];a0_0x3c1e=function(){return _0x52c1fb;};return a0_0x3c1e();}Object['defineProperty'](exports,a0_0x3bbc46(0x127),{'value':!0x0}),exports[a0_0x3bbc46(0x11b)]=t;const e=require(a0_0x3bbc46(0x122)),n=require(a0_0x3bbc46(0x12d)),a=require(a0_0x3bbc46(0x12e)),s=require(a0_0x3bbc46(0x12b));function a0_0xaa59(_0x3030e7,_0x5ea856){const _0x3c1e46=a0_0x3c1e();return a0_0xaa59=function(_0xaa596b,_0x3722b8){_0xaa596b=_0xaa596b-0x112;let _0x126cd1=_0x3c1e46[_0xaa596b];return _0x126cd1;},a0_0xaa59(_0x3030e7,_0x5ea856);}async function t(_0x188207){const _0x215688=a0_0x3bbc46;let _0x1c59f7;if(!await(0x0,n[_0x215688(0x131)])(e['workspaceRoot']))throw Error('You\x20must\x20have\x20a\x20valid\x20Nx\x20key\x20to\x20use\x20@nx/shared-fs-cache,\x20read\x20more\x20about\x20Nx\x20keys\x20on\x20https://nx.dev/powerpack');!function(_0x562a60){const _0x26e461=_0x215688;if((0x0,a[_0x26e461(0x115)])(e[_0x26e461(0x112)],_0x26e461(0x114)))return;let _0x59fe45=(0x0,e[_0x26e461(0x129)])(_0x562a60);_0x59fe45['enableDbCache']=!0x0,(0x0,e[_0x26e461(0x118)])(_0x562a60,_0x59fe45);}(_0x188207);let _0x2fdd59=_0x188207[_0x215688(0x11c)](_0x215688(0x11e))?(_0x1c59f7=!0x1,(0x0,e[_0x215688(0x12f)])(_0x188207,'package.json',_0x5ef811=>(_0x5ef811['dependencies']=_0x5ef811[_0x215688(0x128)]||{},_0x5ef811[_0x215688(0x116)]=_0x5ef811[_0x215688(0x116)]||{},_0x5ef811[_0x215688(0x128)][s[_0x215688(0x12a)]]&&(_0x5ef811[_0x215688(0x116)][s[_0x215688(0x12a)]]=_0x5ef811['dependencies'][s[_0x215688(0x12a)]],delete _0x5ef811[_0x215688(0x128)][s[_0x215688(0x12a)]],_0x1c59f7=!0x0),_0x5ef811)),_0x1c59f7?()=>(0x0,e['installPackagesTask'])(_0x188207):()=>{}):()=>{};return await(0x0,e[_0x215688(0x120)])(_0x188207),_0x2fdd59;}exports[a0_0x3bbc46(0x121)]=t;
1
+ import { formatFiles, installPackagesTask, NX_VERSION, readNxJson, updateJson, updateNxJson, workspaceRoot, } from '@nx/devkit';
2
+ import { autoRegisterNxKey } from '@nx/key';
3
+ import { gte } from 'semver';
4
+ import { name as PACKAGE_NAME } from '../../../package.json';
5
+ export async function initGenerator(tree) {
6
+ await autoRegisterNxKey(workspaceRoot);
7
+ enableDbCache(tree);
8
+ const task = tree.exists('package.json')
9
+ ? updateDependencies(tree)
10
+ : () => {
11
+ // noop
12
+ };
13
+ await formatFiles(tree);
14
+ return task;
15
+ }
16
+ export default initGenerator;
17
+ function enableDbCache(tree) {
18
+ if (gte(NX_VERSION, '20.0.0')) {
19
+ return;
20
+ }
21
+ const nxJson = readNxJson(tree);
22
+ nxJson.enableDbCache = true;
23
+ updateNxJson(tree, nxJson);
24
+ }
25
+ function updateDependencies(tree) {
26
+ let wasUpdated = false;
27
+ updateJson(tree, 'package.json', (packageJson) => {
28
+ packageJson.dependencies = packageJson.dependencies || {};
29
+ packageJson.devDependencies = packageJson.devDependencies || {};
30
+ if (packageJson.dependencies[PACKAGE_NAME]) {
31
+ packageJson.devDependencies[PACKAGE_NAME] =
32
+ packageJson.dependencies[PACKAGE_NAME];
33
+ delete packageJson.dependencies[PACKAGE_NAME];
34
+ wasUpdated = true;
35
+ }
36
+ return packageJson;
37
+ });
38
+ return wasUpdated
39
+ ? () => installPackagesTask(tree)
40
+ : () => {
41
+ /* noop */
42
+ };
43
+ }
44
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../../libs/nx-packages/shared-fs-cache/src/generators/init/generator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,UAAU,EACV,UAAU,EAEV,UAAU,EACV,YAAY,EACZ,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAE7B,OAAO,EAAE,IAAI,IAAI,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE7D,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAU;IAC5C,MAAM,iBAAiB,CAAC,aAAa,CAAC,CAAC;IACvC,aAAa,CAAC,IAAI,CAAC,CAAC;IAEpB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;QACtC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC;QAC1B,CAAC,CAAC,GAAG,EAAE;YACH,OAAO;QACT,CAAC,CAAC;IAEN,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IAExB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,eAAe,aAAa,CAAC;AAE7B,SAAS,aAAa,CAAC,IAAU;IAC/B,IAAI,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC9B,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAQ,CAAC;IACvC,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC;IAE5B,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAU;IACpC,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,UAAU,CAAC,IAAI,EAAE,cAAc,EAAE,CAAC,WAAW,EAAE,EAAE;QAC/C,WAAW,CAAC,YAAY,GAAG,WAAW,CAAC,YAAY,IAAI,EAAE,CAAC;QAC1D,WAAW,CAAC,eAAe,GAAG,WAAW,CAAC,eAAe,IAAI,EAAE,CAAC;QAEhE,IAAI,WAAW,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC;YAC3C,WAAW,CAAC,eAAe,CAAC,YAAY,CAAC;gBACvC,WAAW,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;YACzC,OAAO,WAAW,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;YAC9C,UAAU,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,OAAO,UAAU;QACf,CAAC,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC;QACjC,CAAC,CAAC,GAAG,EAAE;YACH,UAAU;QACZ,CAAC,CAAC;AACR,CAAC"}
package/src/index.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ import type { RemoteCacheV2 } from 'nx/src/tasks-runner/default-tasks-runner';
2
+ export declare function getRemoteCache(): Promise<RemoteCacheV2 | null>;
package/src/index.js CHANGED
@@ -1 +1,23 @@
1
- 'use strict';const a1_0x2c7c99=a1_0x1011;function a1_0x5568(){const _0x51b0b1=['423840BjpAXK','FeaturePermission','3NUYGeg','SharedFsCache','SelfHostedCache','nx/src/utils/is-ci','4828054RYhsJp','__esModule','3354704vwjDFU','@nx/key','workspaceRoot','isCI','9234306NYZjrL','getNxKeyInformationAsync','getRemoteCache','7673776BvnsfM','12angvvt','2065042fRITup','106116VUYTrl'];a1_0x5568=function(){return _0x51b0b1;};return a1_0x5568();}(function(_0x2466a5,_0x74ef93){const _0x5021e6=a1_0x1011,_0x1dc3ea=_0x2466a5();while(!![]){try{const _0x370330=parseInt(_0x5021e6(0x142))/0x1+parseInt(_0x5021e6(0x141))/0x2*(parseInt(_0x5021e6(0x145))/0x3)+-parseInt(_0x5021e6(0x14b))/0x4+parseInt(_0x5021e6(0x143))/0x5*(-parseInt(_0x5021e6(0x140))/0x6)+parseInt(_0x5021e6(0x149))/0x7+parseInt(_0x5021e6(0x13f))/0x8+-parseInt(_0x5021e6(0x13c))/0x9;if(_0x370330===_0x74ef93)break;else _0x1dc3ea['push'](_0x1dc3ea['shift']());}catch(_0x4dc4c8){_0x1dc3ea['push'](_0x1dc3ea['shift']());}}}(a1_0x5568,0xb7eb7));Object['defineProperty'](exports,a1_0x2c7c99(0x14a),{'value':!0x0}),exports[a1_0x2c7c99(0x13e)]=i;const e=require('@nx/devkit'),r=require(a1_0x2c7c99(0x14c)),t=require(a1_0x2c7c99(0x148)),s=require('./remote-cache');function a1_0x1011(_0x5dc21b,_0x109ec7){const _0x556872=a1_0x5568();return a1_0x1011=function(_0x101144,_0x126975){_0x101144=_0x101144-0x13c;let _0x54cd19=_0x556872[_0x101144];return _0x54cd19;},a1_0x1011(_0x5dc21b,_0x109ec7);}async function i(){const _0x495319=a1_0x2c7c99;return(0x0,t[_0x495319(0x14e)])()&&await(0x0,r[_0x495319(0x13d)])(e[_0x495319(0x14d)],r[_0x495319(0x144)][_0x495319(0x147)])?new s[(_0x495319(0x146))]():null;}
1
+ import { output, workspaceRoot } from '@nx/devkit';
2
+ import { assertFeaturePermission, FeaturePermission, getNxKeyInformationAsync, } from '@nx/key';
3
+ import { isCI } from 'nx/src/utils/is-ci';
4
+ import { SharedFsCache } from './remote-cache';
5
+ export async function getRemoteCache() {
6
+ const key = await getNxKeyInformationAsync(workspaceRoot);
7
+ if (!key) {
8
+ output.warn({
9
+ title: 'No self-hosted cache key found. The shared fs cache will not be used.',
10
+ bodyLines: ['You can register a key for free by using `nx register`.'],
11
+ });
12
+ return null;
13
+ }
14
+ if (!isCI()) {
15
+ return null;
16
+ }
17
+ assertFeaturePermission(key, FeaturePermission.SelfHostedCache);
18
+ /**
19
+ * This is the same cache that is used by Nx but with a different database which is within the cache directory.
20
+ */
21
+ return new SharedFsCache();
22
+ }
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../libs/nx-packages/shared-fs-cache/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,GAAG,GAAG,MAAM,wBAAwB,CAAC,aAAa,CAAC,CAAC;IAE1D,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EACH,uEAAuE;YACzE,SAAS,EAAE,CAAC,yDAAyD,CAAC;SACvE,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IACD,uBAAuB,CAAC,GAAG,EAAE,iBAAiB,CAAC,eAAe,CAAC,CAAC;IAEhE;;OAEG;IACH,OAAO,IAAI,aAAa,EAAE,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { CachedResult } from 'nx/src/native';
2
+ import { RemoteCacheV2 } from 'nx/src/tasks-runner/default-tasks-runner';
3
+ export declare class SharedFsCache implements RemoteCacheV2 {
4
+ private cache;
5
+ retrieve(hash: string): Promise<CachedResult | null>;
6
+ store(hash: string, _: string, terminalOutput: string, code: number): Promise<boolean>;
7
+ }
@@ -1 +1,29 @@
1
- 'use strict';const a2_0x54a95e=a2_0x1b1c;(function(_0x46f9cc,_0x4894bc){const _0x2b4f76=a2_0x1b1c,_0x34c04c=_0x46f9cc();while(!![]){try{const _0x2d3c8d=-parseInt(_0x2b4f76(0x80))/0x1+-parseInt(_0x2b4f76(0x89))/0x2+-parseInt(_0x2b4f76(0x82))/0x3*(parseInt(_0x2b4f76(0x87))/0x4)+parseInt(_0x2b4f76(0x83))/0x5+-parseInt(_0x2b4f76(0x7e))/0x6+-parseInt(_0x2b4f76(0x7c))/0x7*(parseInt(_0x2b4f76(0x85))/0x8)+parseInt(_0x2b4f76(0x7f))/0x9;if(_0x2d3c8d===_0x4894bc)break;else _0x34c04c['push'](_0x34c04c['shift']());}catch(_0x2d8da8){_0x34c04c['push'](_0x34c04c['shift']());}}}(a2_0x9e7e,0x60eab));Object[a2_0x54a95e(0x84)](exports,'__esModule',{'value':!0x0}),exports[a2_0x54a95e(0x7d)]=void 0x0;function a2_0x9e7e(){const _0x304274=['store','path','cacheDir','cache','workspaceRoot','7WHExcf','SharedFsCache','2234442VYCpha','13779189mZwvgh','212383yINQel','retrieve','144JWUFwT','865385riYWJj','defineProperty','1281416lyNJgO','renameSync','33296gZxuzC','shared','325216fPBaZj','get','-backup','nx/src/utils/db-connection','@nx/devkit'];a2_0x9e7e=function(){return _0x304274;};return a2_0x9e7e();}const e=require(a2_0x54a95e(0x76)),r=require('fs'),c=require('nx/src/native'),t=require(a2_0x54a95e(0x8c)),a=require(a2_0x54a95e(0x78));function a2_0x1b1c(_0x18ae3b,_0x1d4e4c){const _0x9e7e10=a2_0x9e7e();return a2_0x1b1c=function(_0x1b1c19,_0x1d8d49){_0x1b1c19=_0x1b1c19-0x76;let _0x30f3f4=_0x9e7e10[_0x1b1c19];return _0x30f3f4;},a2_0x1b1c(_0x18ae3b,_0x1d4e4c);}class i{[a2_0x54a95e(0x7a)]=new c['NxCache'](e[a2_0x54a95e(0x7b)],e[a2_0x54a95e(0x79)],(0x0,t['getDbConnection'])({'directory':e['cacheDir'],'dbName':a2_0x54a95e(0x88)}),!0x1);async[a2_0x54a95e(0x81)](_0x56d218){const _0x1ec0b4=a2_0x54a95e;return this[_0x1ec0b4(0x7a)][_0x1ec0b4(0x8a)](_0x56d218);}async[a2_0x54a95e(0x77)](_0xd643f,_0x253f89,_0x9510f4,_0x577826){const _0x54895f=a2_0x54a95e;try{let _0xb69123=(0x0,a['join'])(this[_0x54895f(0x7a)]['cacheDirectory'],_0xd643f),_0x14fcfb=_0xb69123+_0x54895f(0x8b);return(0x0,r[_0x54895f(0x86)])(_0xb69123,_0x14fcfb),this[_0x54895f(0x7a)]['put'](_0xd643f,_0x9510f4,[],_0x577826),(0x0,r['rmdirSync'])(_0xb69123,{'recursive':!0x0}),(0x0,r['renameSync'])(_0x14fcfb,_0xb69123),!0x0;}catch(_0x33d078){return!0x1;}}}exports['SharedFsCache']=i;
1
+ import { cacheDir, workspaceRoot } from '@nx/devkit';
2
+ import { renameSync, rmdirSync } from 'fs';
3
+ import { NxCache } from 'nx/src/native';
4
+ import { getDbConnection } from 'nx/src/utils/db-connection';
5
+ import { join } from 'path';
6
+ export class SharedFsCache {
7
+ cache = new NxCache(workspaceRoot, cacheDir, getDbConnection({
8
+ directory: cacheDir,
9
+ dbName: 'shared',
10
+ }), false);
11
+ async retrieve(hash) {
12
+ return this.cache.get(hash);
13
+ }
14
+ async store(hash, _, terminalOutput, code) {
15
+ try {
16
+ const hashPath = join(this.cache.cacheDirectory, hash);
17
+ const tmpBackup = hashPath + '-backup';
18
+ renameSync(hashPath, tmpBackup);
19
+ this.cache.put(hash, terminalOutput, [], code);
20
+ rmdirSync(hashPath, { recursive: true });
21
+ renameSync(tmpBackup, hashPath);
22
+ return true;
23
+ }
24
+ catch (e) {
25
+ return false;
26
+ }
27
+ }
28
+ }
29
+ //# sourceMappingURL=remote-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-cache.js","sourceRoot":"","sources":["../../../../../libs/nx-packages/shared-fs-cache/src/remote-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC3C,OAAO,EAAgB,OAAO,EAAE,MAAM,eAAe,CAAC;AAEtD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,OAAO,aAAa;IAChB,KAAK,GAAG,IAAI,OAAO,CACzB,aAAa,EACb,QAAQ,EACR,eAAe,CAAC;QACd,SAAS,EAAE,QAAQ;QACnB,MAAM,EAAE,QAAQ;KACjB,CAAC,EACF,KAAK,CACN,CAAC;IAEF,KAAK,CAAC,QAAQ,CAAC,IAAY;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,KAAK,CACT,IAAY,EACZ,CAAS,EACT,cAAsB,EACtB,IAAY;QAEZ,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;YACvD,MAAM,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;YACvC,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAChC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;YAC/C,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzC,UAAU,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAChC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF"}