@sonarwatch/portfolio-plugins 0.11.93 → 0.11.95

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.
Files changed (55) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/package.json +2 -2
  3. package/src/index.js +8 -0
  4. package/src/index.js.map +1 -1
  5. package/src/plugins/aurory/constants.d.ts +9 -0
  6. package/src/plugins/aurory/constants.js +19 -0
  7. package/src/plugins/aurory/constants.js.map +1 -0
  8. package/src/plugins/aurory/helpers.d.ts +2 -0
  9. package/src/plugins/aurory/helpers.js +21 -0
  10. package/src/plugins/aurory/helpers.js.map +1 -0
  11. package/src/plugins/aurory/index.d.ts +6 -0
  12. package/src/plugins/aurory/index.js +12 -0
  13. package/src/plugins/aurory/index.js.map +1 -0
  14. package/src/plugins/aurory/stakingFetcher.d.ts +3 -0
  15. package/src/plugins/aurory/stakingFetcher.js +47 -0
  16. package/src/plugins/aurory/stakingFetcher.js.map +1 -0
  17. package/src/plugins/aurory/structs.d.ts +10 -0
  18. package/src/plugins/aurory/structs.js +11 -0
  19. package/src/plugins/aurory/structs.js.map +1 -0
  20. package/src/plugins/flash/constants.js +1 -0
  21. package/src/plugins/flash/constants.js.map +1 -1
  22. package/src/plugins/flash/poolJob.js +3 -2
  23. package/src/plugins/flash/poolJob.js.map +1 -1
  24. package/src/plugins/flash/stakeFetcher.js +2 -0
  25. package/src/plugins/flash/stakeFetcher.js.map +1 -1
  26. package/src/plugins/flash/structs.d.ts +1 -0
  27. package/src/plugins/flash/structs.js +26 -1
  28. package/src/plugins/flash/structs.js.map +1 -1
  29. package/src/plugins/flowmatic/stakingFetcher.js +4 -0
  30. package/src/plugins/flowmatic/stakingFetcher.js.map +1 -1
  31. package/src/plugins/genesysgo/stakingFetcher.js +4 -0
  32. package/src/plugins/genesysgo/stakingFetcher.js.map +1 -1
  33. package/src/plugins/kamino/constants.d.ts +3 -3
  34. package/src/plugins/kamino/constants.js +53 -44
  35. package/src/plugins/kamino/constants.js.map +1 -1
  36. package/src/plugins/kamino/helpers/pdas.d.ts +2 -2
  37. package/src/plugins/kamino/helpers/pdas.js +28 -15
  38. package/src/plugins/kamino/helpers/pdas.js.map +1 -1
  39. package/src/plugins/kamino/index.js +2 -1
  40. package/src/plugins/kamino/index.js.map +1 -1
  41. package/src/plugins/kamino/lendsFetcher.js +158 -140
  42. package/src/plugins/kamino/lendsFetcher.js.map +1 -1
  43. package/src/plugins/kamino/marketsJob.d.ts +3 -0
  44. package/src/plugins/kamino/marketsJob.js +29 -0
  45. package/src/plugins/kamino/marketsJob.js.map +1 -0
  46. package/src/plugins/kamino/types.d.ts +5 -0
  47. package/src/plugins/x-staking-solana/constants.d.ts +16 -0
  48. package/src/plugins/x-staking-solana/constants.js +64 -0
  49. package/src/plugins/x-staking-solana/constants.js.map +1 -0
  50. package/src/plugins/x-staking-solana/index.d.ts +6 -0
  51. package/src/plugins/x-staking-solana/index.js +15 -0
  52. package/src/plugins/x-staking-solana/index.js.map +1 -0
  53. package/src/plugins/x-staking-solana/stakingJob.d.ts +3 -0
  54. package/src/plugins/x-staking-solana/stakingJob.js +49 -0
  55. package/src/plugins/x-staking-solana/stakingJob.js.map +1 -0
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const portfolio_core_1 = require("@sonarwatch/portfolio-core");
13
+ const clients_1 = require("../../utils/clients");
14
+ const solana_1 = require("../../utils/solana");
15
+ const filters_1 = require("../../utils/solana/filters");
16
+ const constants_1 = require("./constants");
17
+ const klend_1 = require("./structs/klend");
18
+ const executor = (cache) => __awaiter(void 0, void 0, void 0, function* () {
19
+ const client = (0, clients_1.getClientSolana)();
20
+ const lendingMarketAccounts = yield (0, solana_1.getParsedProgramAccounts)(client, klend_1.lendingMarketStruct, constants_1.klendProgramId, (0, filters_1.dataSizeFilter)(klend_1.lendingMarketStruct.byteSize));
21
+ yield cache.setItem(constants_1.marketsKey, lendingMarketAccounts.map((acc) => acc.pubkey.toString()), { prefix: constants_1.platformId, networkId: portfolio_core_1.NetworkId.solana });
22
+ });
23
+ const job = {
24
+ id: `${constants_1.platformId}-markets`,
25
+ executor,
26
+ label: 'normal',
27
+ };
28
+ exports.default = job;
29
+ //# sourceMappingURL=marketsJob.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketsJob.js","sourceRoot":"","sources":["../../../../../../packages/plugins/src/plugins/kamino/marketsJob.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,+DAAuD;AAGvD,iDAAsD;AACtD,+CAA8D;AAC9D,wDAA4D;AAC5D,2CAAqE;AACrE,2CAAsD;AAEtD,MAAM,QAAQ,GAAgB,CAAO,KAAY,EAAE,EAAE;IACnD,MAAM,MAAM,GAAG,IAAA,yBAAe,GAAE,CAAC;IAEjC,MAAM,qBAAqB,GAAG,MAAM,IAAA,iCAAwB,EAC1D,MAAM,EACN,2BAAmB,EACnB,0BAAc,EACd,IAAA,wBAAc,EAAC,2BAAmB,CAAC,QAAQ,CAAC,CAC7C,CAAC;IAEF,MAAM,KAAK,CAAC,OAAO,CACjB,sBAAU,EACV,qBAAqB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EACzD,EAAE,MAAM,EAAE,sBAAU,EAAE,SAAS,EAAE,0BAAS,CAAC,MAAM,EAAE,CACpD,CAAC;AACJ,CAAC,CAAA,CAAC;AAEF,MAAM,GAAG,GAAQ;IACf,EAAE,EAAE,GAAG,sBAAU,UAAU;IAC3B,QAAQ;IACR,KAAK,EAAE,QAAQ;CAChB,CAAC;AACF,kBAAe,GAAG,CAAC"}
@@ -86,3 +86,8 @@ export type FarmInfo = {
86
86
  lockingStart: number;
87
87
  lockingDuration: number;
88
88
  };
89
+ export type LendingMarketConfig = {
90
+ name: string;
91
+ multiplyPairs?: string[][];
92
+ leveragePairs?: string[][];
93
+ };
@@ -0,0 +1,16 @@
1
+ import { Platform } from '@sonarwatch/portfolio-core';
2
+ export declare const whalesMarketPlatformId = "whalesmarket";
3
+ export declare const whalesMarketPlatform: Platform;
4
+ export declare const stepFinancePlatformId = "stepfinance";
5
+ export declare const stepFinancePlatform: Platform;
6
+ export declare const allbridgePlatformId = "allbridge";
7
+ export declare const allbridgePlatform: Platform;
8
+ export declare const xStakingConfigs: StakingConfig[];
9
+ export type StakingConfig = {
10
+ mint: string;
11
+ decimals: number;
12
+ vault: string;
13
+ xMint: string;
14
+ xDecimals: number;
15
+ platformId: string;
16
+ };
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.xStakingConfigs = exports.allbridgePlatform = exports.allbridgePlatformId = exports.stepFinancePlatform = exports.stepFinancePlatformId = exports.whalesMarketPlatform = exports.whalesMarketPlatformId = void 0;
4
+ const constants_1 = require("../aurory/constants");
5
+ exports.whalesMarketPlatformId = 'whalesmarket';
6
+ exports.whalesMarketPlatform = {
7
+ id: exports.whalesMarketPlatformId,
8
+ name: 'Whales Market',
9
+ image: 'https://sonar.watch/img/platforms/whalesmarket.png',
10
+ // defiLlamaId: 'foo-finance', // from https://defillama.com/docs/api
11
+ website: 'https://app.whales.market/',
12
+ twitter: 'https://twitter.com/WhalesMarket',
13
+ };
14
+ exports.stepFinancePlatformId = 'stepfinance';
15
+ exports.stepFinancePlatform = {
16
+ id: exports.stepFinancePlatformId,
17
+ name: 'Step Finance',
18
+ image: 'https://sonar.watch/img/platforms/stepfinance.png',
19
+ website: 'https://app.step.finance/',
20
+ twitter: 'https://twitter.com/StepFinance_',
21
+ };
22
+ exports.allbridgePlatformId = 'allbridge';
23
+ exports.allbridgePlatform = {
24
+ id: exports.allbridgePlatformId,
25
+ name: 'Step Finance',
26
+ image: 'https://sonar.watch/img/platforms/allbridge.png',
27
+ website: 'https://stake.allbridge.io/?chain=SOL',
28
+ twitter: 'https://twitter.com/Allbridge_io',
29
+ };
30
+ exports.xStakingConfigs = [
31
+ {
32
+ mint: constants_1.auryMint,
33
+ decimals: constants_1.decimals,
34
+ vault: constants_1.vaultPubkey,
35
+ xMint: constants_1.xAuryMint,
36
+ xDecimals: 9,
37
+ platformId: constants_1.auroryPlatformId,
38
+ },
39
+ {
40
+ mint: 'GTH3wG3NErjwcf7VGCoXEXkgXSHvYhx5gtATeeM5JAS1',
41
+ decimals: 6,
42
+ vault: 'Cm1KT2iqQ3LoxbmLy4WrQ9wE7WByJx6R512A28LbjGh9',
43
+ xMint: '3wCoTb3TArUdzmeTBPzPFyPBUP6EJXaW5LAzGsWCpySu',
44
+ xDecimals: 6,
45
+ platformId: exports.whalesMarketPlatformId,
46
+ },
47
+ {
48
+ mint: 'StepAscQoEioFxxWGnh2sLBDFp9d8rvKz2Yp39iDpyT',
49
+ decimals: 9,
50
+ vault: 'ANYxxG365hutGYaTdtUQG8u2hC4dFX9mFHKuzy9ABQJi',
51
+ xMint: 'xStpgUCss9piqeFUk2iLVcvJEGhAdJxJQuwLkXP555G',
52
+ xDecimals: 9,
53
+ platformId: exports.stepFinancePlatformId,
54
+ },
55
+ {
56
+ mint: 'a11bdAAuV8iB2fu7X6AxAvDTo1QZ8FXB3kk5eecdasp',
57
+ decimals: 9,
58
+ vault: '51dd7AuT32b5VCK2rBVrjLGvfuvZ3kMayNrZZbWuvas2',
59
+ xMint: 'xAx6d1sjmBvpWkVZQEqgUvPmGBNndEXPxYpr3QVp61H',
60
+ xDecimals: 9,
61
+ platformId: exports.allbridgePlatformId,
62
+ },
63
+ ];
64
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../../../packages/plugins/src/plugins/x-staking-solana/constants.ts"],"names":[],"mappings":";;;AACA,mDAM6B;AAEhB,QAAA,sBAAsB,GAAG,cAAc,CAAC;AACxC,QAAA,oBAAoB,GAAa;IAC5C,EAAE,EAAE,8BAAsB;IAC1B,IAAI,EAAE,eAAe;IACrB,KAAK,EAAE,oDAAoD;IAC3D,qEAAqE;IACrE,OAAO,EAAE,4BAA4B;IACrC,OAAO,EAAE,kCAAkC;CAC5C,CAAC;AAEW,QAAA,qBAAqB,GAAG,aAAa,CAAC;AACtC,QAAA,mBAAmB,GAAa;IAC3C,EAAE,EAAE,6BAAqB;IACzB,IAAI,EAAE,cAAc;IACpB,KAAK,EAAE,mDAAmD;IAC1D,OAAO,EAAE,2BAA2B;IACpC,OAAO,EAAE,kCAAkC;CAC5C,CAAC;AAEW,QAAA,mBAAmB,GAAG,WAAW,CAAC;AAClC,QAAA,iBAAiB,GAAa;IACzC,EAAE,EAAE,2BAAmB;IACvB,IAAI,EAAE,cAAc;IACpB,KAAK,EAAE,iDAAiD;IACxD,OAAO,EAAE,uCAAuC;IAChD,OAAO,EAAE,kCAAkC;CAC5C,CAAC;AAEW,QAAA,eAAe,GAAoB;IAC9C;QACE,IAAI,EAAE,oBAAQ;QACd,QAAQ,EAAR,oBAAQ;QACR,KAAK,EAAE,uBAAW;QAClB,KAAK,EAAE,qBAAS;QAChB,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,4BAAgB;KAC7B;IACD;QACE,IAAI,EAAE,8CAA8C;QACpD,QAAQ,EAAE,CAAC;QACX,KAAK,EAAE,8CAA8C;QACrD,KAAK,EAAE,8CAA8C;QACrD,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,8BAAsB;KACnC;IACD;QACE,IAAI,EAAE,6CAA6C;QACnD,QAAQ,EAAE,CAAC;QACX,KAAK,EAAE,8CAA8C;QACrD,KAAK,EAAE,6CAA6C;QACpD,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,6BAAqB;KAClC;IACD;QACE,IAAI,EAAE,6CAA6C;QACnD,QAAQ,EAAE,CAAC;QACX,KAAK,EAAE,8CAA8C;QACrD,KAAK,EAAE,6CAA6C;QACpD,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,2BAAmB;KAChC;CACF,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Platform } from '@sonarwatch/portfolio-core';
2
+ import { Fetcher } from '../../Fetcher';
3
+ import { Job } from '../../Job';
4
+ export declare const platforms: Platform[];
5
+ export declare const jobs: Job[];
6
+ export declare const fetchers: Fetcher[];
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.fetchers = exports.jobs = exports.platforms = void 0;
7
+ const constants_1 = require("./constants");
8
+ const stakingJob_1 = __importDefault(require("./stakingJob"));
9
+ exports.platforms = [
10
+ constants_1.whalesMarketPlatform,
11
+ constants_1.stepFinancePlatform,
12
+ ];
13
+ exports.jobs = [stakingJob_1.default];
14
+ exports.fetchers = [];
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/plugins/src/plugins/x-staking-solana/index.ts"],"names":[],"mappings":";;;;;;AAGA,2CAAwE;AACxE,8DAAuC;AAE1B,QAAA,SAAS,GAAe;IACnC,gCAAoB;IACpB,+BAAmB;CACpB,CAAC;AACW,QAAA,IAAI,GAAU,CAAC,oBAAW,CAAC,CAAC;AAC5B,QAAA,QAAQ,GAAc,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Job } from '../../Job';
2
+ declare const job: Job;
3
+ export default job;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const web3_js_1 = require("@solana/web3.js");
13
+ const portfolio_core_1 = require("@sonarwatch/portfolio-core");
14
+ const clients_1 = require("../../utils/clients");
15
+ const solana_1 = require("../../utils/solana");
16
+ const constants_1 = require("./constants");
17
+ const executor = (cache) => __awaiter(void 0, void 0, void 0, function* () {
18
+ const client = (0, clients_1.getClientSolana)();
19
+ const vaultsAccounts = yield (0, solana_1.getParsedMultipleAccountsInfo)(client, solana_1.tokenAccountStruct, constants_1.xStakingConfigs.map((conf) => new web3_js_1.PublicKey(conf.vault)));
20
+ const tokensInfos = yield (0, solana_1.getParsedMultipleAccountsInfo)(client, solana_1.mintAccountStruct, constants_1.xStakingConfigs.map((conf) => new web3_js_1.PublicKey(conf.xMint)));
21
+ const tokensPricesMap = yield cache.getTokenPricesAsMap(constants_1.xStakingConfigs.map((conf) => conf.mint), portfolio_core_1.NetworkId.solana);
22
+ for (let i = 0; i < constants_1.xStakingConfigs.length; i++) {
23
+ const config = constants_1.xStakingConfigs[i];
24
+ const tokenPrice = tokensPricesMap.get(config.mint);
25
+ const [tokenInfo, vaultAccount] = [tokensInfos[i], vaultsAccounts[i]];
26
+ if (!tokenInfo || !vaultAccount || !tokenPrice)
27
+ continue;
28
+ const xSupply = tokenInfo.supply.dividedBy(Math.pow(10, tokenInfo.decimals));
29
+ const vaultTokenAmount = vaultAccount.amount.dividedBy(Math.pow(10, config.decimals));
30
+ const xPrice = vaultTokenAmount.dividedBy(xSupply).times(tokenPrice.price);
31
+ yield cache.setTokenPriceSource({
32
+ address: config.xMint,
33
+ decimals: config.xDecimals,
34
+ id: config.vault,
35
+ networkId: portfolio_core_1.NetworkId.solana,
36
+ platformId: config.platformId,
37
+ price: xPrice.toNumber(),
38
+ timestamp: Date.now(),
39
+ weight: 1,
40
+ });
41
+ }
42
+ });
43
+ const job = {
44
+ id: `x-staking-solana`,
45
+ executor,
46
+ label: 'normal',
47
+ };
48
+ exports.default = job;
49
+ //# sourceMappingURL=stakingJob.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stakingJob.js","sourceRoot":"","sources":["../../../../../../packages/plugins/src/plugins/x-staking-solana/stakingJob.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,6CAA4C;AAC5C,+DAAuD;AAGvD,iDAAsD;AACtD,+CAI4B;AAC5B,2CAA8C;AAE9C,MAAM,QAAQ,GAAgB,CAAO,KAAY,EAAE,EAAE;IACnD,MAAM,MAAM,GAAG,IAAA,yBAAe,GAAE,CAAC;IAEjC,MAAM,cAAc,GAAG,MAAM,IAAA,sCAA6B,EACxD,MAAM,EACN,2BAAkB,EAClB,2BAAe,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,mBAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CACzD,CAAC;IAEF,MAAM,WAAW,GAAG,MAAM,IAAA,sCAA6B,EACrD,MAAM,EACN,0BAAiB,EACjB,2BAAe,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,mBAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CACzD,CAAC;IAEF,MAAM,eAAe,GAAG,MAAM,KAAK,CAAC,mBAAmB,CACrD,2BAAe,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EACxC,0BAAS,CAAC,MAAM,CACjB,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,2BAAe,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChD,MAAM,MAAM,GAAG,2BAAe,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;QAEtE,IAAI,CAAC,SAAS,IAAI,CAAC,YAAY,IAAI,CAAC,UAAU;YAAE,SAAS;QAEzD,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,SAAA,EAAE,EAAI,SAAS,CAAC,QAAQ,CAAA,CAAC,CAAC;QAErE,MAAM,gBAAgB,GAAG,YAAY,CAAC,MAAM,CAAC,SAAS,CACpD,SAAA,EAAE,EAAI,MAAM,CAAC,QAAQ,CAAA,CACtB,CAAC;QAEF,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAE3E,MAAM,KAAK,CAAC,mBAAmB,CAAC;YAC9B,OAAO,EAAE,MAAM,CAAC,KAAK;YACrB,QAAQ,EAAE,MAAM,CAAC,SAAS;YAC1B,EAAE,EAAE,MAAM,CAAC,KAAK;YAChB,SAAS,EAAE,0BAAS,CAAC,MAAM;YAC3B,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE;YACxB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,MAAM,EAAE,CAAC;SACV,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAA,CAAC;AAEF,MAAM,GAAG,GAAQ;IACf,EAAE,EAAE,kBAAkB;IACtB,QAAQ;IACR,KAAK,EAAE,QAAQ;CAChB,CAAC;AACF,kBAAe,GAAG,CAAC"}