@kehtus/proportion-sdk 0.4.2 → 1.1.0

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 (96) hide show
  1. package/LICENSE +21 -21
  2. package/dist/abi/challengeAccount.d.ts +1855 -0
  3. package/dist/abi/challengeAccount.d.ts.map +1 -0
  4. package/dist/abi/challengeAccount.js +2365 -0
  5. package/dist/abi/challengeAccount.js.map +1 -0
  6. package/dist/abi/challengeFactory.d.ts +1351 -0
  7. package/dist/abi/challengeFactory.d.ts.map +1 -0
  8. package/dist/abi/challengeFactory.js +1727 -0
  9. package/dist/abi/challengeFactory.js.map +1 -0
  10. package/dist/abi/challengeVault.d.ts +1392 -0
  11. package/dist/abi/challengeVault.d.ts.map +1 -0
  12. package/dist/abi/challengeVault.js +1793 -0
  13. package/dist/abi/challengeVault.js.map +1 -0
  14. package/dist/abi/factory.d.ts +4 -0
  15. package/dist/abi/factory.d.ts.map +1 -1
  16. package/dist/abi/factory.js +5 -0
  17. package/dist/abi/factory.js.map +1 -1
  18. package/dist/abi/fundedAccount.d.ts +49 -20
  19. package/dist/abi/fundedAccount.d.ts.map +1 -1
  20. package/dist/abi/fundedAccount.js +62 -26
  21. package/dist/abi/fundedAccount.js.map +1 -1
  22. package/dist/abi/mainVault.d.ts +409 -64
  23. package/dist/abi/mainVault.d.ts.map +1 -1
  24. package/dist/abi/mainVault.js +523 -75
  25. package/dist/abi/mainVault.js.map +1 -1
  26. package/dist/abi/priceOracle.d.ts +497 -0
  27. package/dist/abi/priceOracle.d.ts.map +1 -0
  28. package/dist/abi/priceOracle.js +644 -0
  29. package/dist/abi/priceOracle.js.map +1 -0
  30. package/dist/account.d.ts.map +1 -1
  31. package/dist/account.js +6 -0
  32. package/dist/account.js.map +1 -1
  33. package/dist/challenge/account.d.ts +95 -0
  34. package/dist/challenge/account.d.ts.map +1 -0
  35. package/dist/challenge/account.js +375 -0
  36. package/dist/challenge/account.js.map +1 -0
  37. package/dist/challenge/api.d.ts +49 -0
  38. package/dist/challenge/api.d.ts.map +1 -0
  39. package/dist/challenge/api.js +173 -0
  40. package/dist/challenge/api.js.map +1 -0
  41. package/dist/challenge/factory.d.ts +151 -0
  42. package/dist/challenge/factory.d.ts.map +1 -0
  43. package/dist/challenge/factory.js +355 -0
  44. package/dist/challenge/factory.js.map +1 -0
  45. package/dist/challenge/intents.d.ts +137 -0
  46. package/dist/challenge/intents.d.ts.map +1 -0
  47. package/dist/challenge/intents.js +218 -0
  48. package/dist/challenge/intents.js.map +1 -0
  49. package/dist/challenge/oracle.d.ts +50 -0
  50. package/dist/challenge/oracle.d.ts.map +1 -0
  51. package/dist/challenge/oracle.js +117 -0
  52. package/dist/challenge/oracle.js.map +1 -0
  53. package/dist/challenge/types.d.ts +652 -0
  54. package/dist/challenge/types.d.ts.map +1 -0
  55. package/dist/challenge/types.js +64 -0
  56. package/dist/challenge/types.js.map +1 -0
  57. package/dist/challenge/vault.d.ts +87 -0
  58. package/dist/challenge/vault.d.ts.map +1 -0
  59. package/dist/challenge/vault.js +299 -0
  60. package/dist/challenge/vault.js.map +1 -0
  61. package/dist/constants.d.ts +14 -4
  62. package/dist/constants.d.ts.map +1 -1
  63. package/dist/constants.js +23 -4
  64. package/dist/constants.js.map +1 -1
  65. package/dist/factory.d.ts +1 -1
  66. package/dist/factory.d.ts.map +1 -1
  67. package/dist/factory.js +12 -0
  68. package/dist/factory.js.map +1 -1
  69. package/dist/forwarder.d.ts +58 -0
  70. package/dist/forwarder.d.ts.map +1 -0
  71. package/dist/forwarder.js +145 -0
  72. package/dist/forwarder.js.map +1 -0
  73. package/dist/index.d.ts +13 -0
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +14 -0
  76. package/dist/index.js.map +1 -1
  77. package/dist/indexer.d.ts +52 -0
  78. package/dist/indexer.d.ts.map +1 -1
  79. package/dist/indexer.js +349 -145
  80. package/dist/indexer.js.map +1 -1
  81. package/dist/sdk.d.ts +18 -1
  82. package/dist/sdk.d.ts.map +1 -1
  83. package/dist/sdk.js +85 -32
  84. package/dist/sdk.js.map +1 -1
  85. package/dist/types.d.ts +54 -0
  86. package/dist/types.d.ts.map +1 -1
  87. package/dist/types.js.map +1 -1
  88. package/dist/utils.d.ts +35 -2
  89. package/dist/utils.d.ts.map +1 -1
  90. package/dist/utils.js +86 -7
  91. package/dist/utils.js.map +1 -1
  92. package/dist/vault.d.ts +44 -5
  93. package/dist/vault.d.ts.map +1 -1
  94. package/dist/vault.js +138 -12
  95. package/dist/vault.js.map +1 -1
  96. package/package.json +2 -2
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Thin typed client for the challenge-service public HTTP API. Optional — activated by
3
+ * `challengeApiUrl` in SDKConfig. It only maps SDK types onto the service wire formats;
4
+ * pricing, admission, and submission policy live server-side.
5
+ *
6
+ * Endpoints: POST /quote (quote-signer), POST /intents/open, POST /intents/close (relayer),
7
+ * POST /purchase (gasless buyChallenge via a signed ForwardRequest).
8
+ */
9
+ export class ChallengeApiClient {
10
+ fetchFn;
11
+ baseUrl;
12
+ constructor(baseUrl, fetchFn) {
13
+ this.fetchFn = fetchFn;
14
+ this.baseUrl = baseUrl.replace(/\/+$/, "");
15
+ }
16
+ async postRaw(path, body) {
17
+ const fetchFn = this.fetchFn ?? globalThis.fetch;
18
+ if (!fetchFn)
19
+ throw new Error("fetch is not available; pass fetchFn in SDKConfig");
20
+ const res = await fetchFn(`${this.baseUrl}${path}`, {
21
+ method: "POST",
22
+ headers: { "Content-Type": "application/json" },
23
+ body: JSON.stringify(body),
24
+ });
25
+ const json = (await res.json().catch(() => ({})));
26
+ return { ok: res.ok, status: res.status, json };
27
+ }
28
+ static wireError(path, status, json) {
29
+ const error = typeof json.error === "string" ? json.error : `HTTP ${status}`;
30
+ const detail = typeof json.detail === "string" ? `: ${json.detail}` : "";
31
+ return new Error(`challenge-service ${path} failed (${status}) ${error}${detail}`);
32
+ }
33
+ async post(path, body) {
34
+ const { ok, status, json } = await this.postRaw(path, body);
35
+ if (!ok)
36
+ throw ChallengeApiClient.wireError(path, status, json);
37
+ return json;
38
+ }
39
+ /**
40
+ * Submit endpoints reply with meaningful terminal bodies on non-2xx codes too:
41
+ * 409 {"status":"cached"} (dedup replay of an already-submitted intent),
42
+ * 422 {"status":"reverted", tx_hash, phase, ...} (mined but reverted),
43
+ * 503 {"status":"queued"} (broadcast deferred to recovery). Any body carrying a
44
+ * `status` field is a submit outcome, not a transport error — only error-keyed
45
+ * bodies (e.g. 400 validation, 503 dedup_released) throw.
46
+ */
47
+ async postSubmit(path, body) {
48
+ const { ok, status, json } = await this.postRaw(path, body);
49
+ if (typeof json.status === "string")
50
+ return ChallengeApiClient.parseSubmitResponse(json);
51
+ if (!ok)
52
+ throw ChallengeApiClient.wireError(path, status, json);
53
+ return ChallengeApiClient.parseSubmitResponse(json);
54
+ }
55
+ // u64 wire fields are JSON numbers; guard the bigint → number conversion.
56
+ static toJsonNumber(value, field) {
57
+ if (value > BigInt(Number.MAX_SAFE_INTEGER) || value < 0n) {
58
+ throw new Error(`${field} does not fit a JSON number: ${value}`);
59
+ }
60
+ return Number(value);
61
+ }
62
+ static parseSubmitResponse(raw) {
63
+ return {
64
+ status: raw.status,
65
+ txId: typeof raw.tx_id === "string" ? raw.tx_id : undefined,
66
+ txHash: typeof raw.tx_hash === "string" ? raw.tx_hash : undefined,
67
+ phase: typeof raw.phase === "number" ? raw.phase : undefined,
68
+ challengeFailed: typeof raw.challenge_failed === "boolean" ? raw.challenge_failed : undefined,
69
+ };
70
+ }
71
+ /**
72
+ * Request a builder-signed quote from the quote-signer. Verify the returned signature
73
+ * and fee (ChallengeFactoryModule.verifyQuote / previewQuote) before paying.
74
+ */
75
+ async requestQuote(req) {
76
+ const raw = await this.post("/quote", {
77
+ account_owner: req.accountOwner,
78
+ ...(req.payer ? { payer: req.payer } : {}),
79
+ allocation: req.allocation.toString(),
80
+ drawdown_bps: req.drawdownBps,
81
+ daily_drawdown_enabled: req.dailyDrawdownEnabled,
82
+ trading_days_enabled: req.tradingDaysEnabled,
83
+ challenge_type: req.challengeType,
84
+ final_target_profit_bps: req.finalTargetProfitBps,
85
+ price_multiplier_bps: req.priceMultiplierBps,
86
+ });
87
+ const q = raw.quote;
88
+ const quote = {
89
+ accountOwner: q.accountOwner,
90
+ payer: q.payer,
91
+ builder: q.builder,
92
+ referrer: q.referrer,
93
+ allocation: BigInt(q.allocation),
94
+ drawdownBps: Number(q.drawdownBps),
95
+ dailyDrawdownEnabled: q.dailyDrawdownEnabled,
96
+ tradingDaysEnabled: q.tradingDaysEnabled,
97
+ challengeType: Number(q.challengeType),
98
+ finalTargetProfitBps: Number(q.finalTargetProfitBps),
99
+ priceMultiplierBps: Number(q.priceMultiplierBps),
100
+ quotedChallengeFee: BigInt(q.quotedChallengeFee),
101
+ minBuilderVaultAmount: BigInt(q.minBuilderVaultAmount),
102
+ deadline: BigInt(q.deadline),
103
+ nonce: BigInt(q.nonce),
104
+ quoteConfigNonce: BigInt(q.quoteConfigNonce),
105
+ builderQuoteEpoch: BigInt(q.builderQuoteEpoch),
106
+ };
107
+ return {
108
+ quote,
109
+ builderSignature: raw.builderSignature,
110
+ quoteDigest: raw.quoteDigest,
111
+ maxChallengeFee: BigInt(raw.maxChallengeFee),
112
+ fees: {
113
+ challengeFee: BigInt(raw.fees.challengeFee),
114
+ builderAmount: BigInt(raw.fees.builderAmount),
115
+ protocolFee: BigInt(raw.fees.protocolFee),
116
+ referralFee: BigInt(raw.fees.referralFee),
117
+ maxNotional: BigInt(raw.fees.maxNotional),
118
+ },
119
+ };
120
+ }
121
+ /** Submit a signed open intent to the relayer (gasless; relayer pays gas). */
122
+ async submitOpenIntent(signed) {
123
+ const { intent, signature } = signed;
124
+ return this.postSubmit("/intents/open", {
125
+ owner: intent.owner,
126
+ account: intent.account,
127
+ market: intent.market,
128
+ is_long: intent.isLong,
129
+ margin: intent.margin.toString(),
130
+ notional: intent.notional.toString(),
131
+ max_price: ChallengeApiClient.toJsonNumber(intent.maxPrice, "maxPrice"),
132
+ min_price: ChallengeApiClient.toJsonNumber(intent.minPrice, "minPrice"),
133
+ nonce: intent.nonce.toString(),
134
+ deadline: ChallengeApiClient.toJsonNumber(intent.deadline, "deadline"),
135
+ signature,
136
+ });
137
+ }
138
+ /** Submit a signed close intent to the relayer (gasless; relayer pays gas). */
139
+ async submitCloseIntent(signed) {
140
+ const { intent, signature } = signed;
141
+ return this.postSubmit("/intents/close", {
142
+ owner: intent.owner,
143
+ account: intent.account,
144
+ position_id: ChallengeApiClient.toJsonNumber(intent.positionId, "positionId"),
145
+ max_price: ChallengeApiClient.toJsonNumber(intent.maxPrice, "maxPrice"),
146
+ min_price: ChallengeApiClient.toJsonNumber(intent.minPrice, "minPrice"),
147
+ nonce: intent.nonce.toString(),
148
+ deadline: ChallengeApiClient.toJsonNumber(intent.deadline, "deadline"),
149
+ signature,
150
+ });
151
+ }
152
+ /**
153
+ * Gasless challenge purchase: a ForwardRequest signed by the payer whose `data` MUST be
154
+ * buyChallengeWithPermit calldata targeting the factory — the service strictly decodes
155
+ * that selector and requires permitValue >= quotedChallengeFee; plain buyChallenge
156
+ * calldata is rejected with a validation error. Build the calldata with
157
+ * ChallengeFactoryModule.encodeBuyChallengeWithPermit, wrap it via
158
+ * ForwarderModule.signRequest({ to: factory, data }), and submit here. The service
159
+ * consumes its own builder quotes only.
160
+ */
161
+ async purchase(request) {
162
+ return this.postSubmit("/purchase", {
163
+ from: request.from,
164
+ to: request.to,
165
+ value: request.value.toString(),
166
+ gas: request.gas.toString(),
167
+ deadline: request.deadline,
168
+ data: request.data,
169
+ signature: request.signature,
170
+ });
171
+ }
172
+ }
173
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/challenge/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,151 @@
1
+ import { type Address, type Chain, type Hash, type Hex, type PublicClient, type WalletClient } from "viem";
2
+ import type { ChallengeFeeBreakdown, ChallengePricingConfig, ChallengeQuote, ChallengeTerms, QuoteVerification } from "./types.js";
3
+ export declare const CHALLENGE_QUOTE_TYPES: {
4
+ readonly ChallengeQuote: readonly [{
5
+ readonly name: "accountOwner";
6
+ readonly type: "address";
7
+ }, {
8
+ readonly name: "payer";
9
+ readonly type: "address";
10
+ }, {
11
+ readonly name: "builder";
12
+ readonly type: "address";
13
+ }, {
14
+ readonly name: "referrer";
15
+ readonly type: "address";
16
+ }, {
17
+ readonly name: "allocation";
18
+ readonly type: "uint96";
19
+ }, {
20
+ readonly name: "drawdownBps";
21
+ readonly type: "uint16";
22
+ }, {
23
+ readonly name: "dailyDrawdownEnabled";
24
+ readonly type: "bool";
25
+ }, {
26
+ readonly name: "tradingDaysEnabled";
27
+ readonly type: "bool";
28
+ }, {
29
+ readonly name: "challengeType";
30
+ readonly type: "uint8";
31
+ }, {
32
+ readonly name: "finalTargetProfitBps";
33
+ readonly type: "uint16";
34
+ }, {
35
+ readonly name: "priceMultiplierBps";
36
+ readonly type: "uint16";
37
+ }, {
38
+ readonly name: "quotedChallengeFee";
39
+ readonly type: "uint256";
40
+ }, {
41
+ readonly name: "minBuilderVaultAmount";
42
+ readonly type: "uint256";
43
+ }, {
44
+ readonly name: "deadline";
45
+ readonly type: "uint64";
46
+ }, {
47
+ readonly name: "nonce";
48
+ readonly type: "uint256";
49
+ }, {
50
+ readonly name: "quoteConfigNonce";
51
+ readonly type: "uint256";
52
+ }, {
53
+ readonly name: "builderQuoteEpoch";
54
+ readonly type: "uint256";
55
+ }];
56
+ };
57
+ /**
58
+ * ChallengeFactory module — signed-quote purchases plus builder quote administration.
59
+ *
60
+ * Quotes are priced and signed by the builder's quote-signer service; the SDK's job is to
61
+ * verify them (verifyQuote / previewQuote) and spend them (buyChallenge). Owner pricing/risk
62
+ * config setters are multisig territory and intentionally not covered.
63
+ */
64
+ export declare class ChallengeFactoryModule {
65
+ private publicClient;
66
+ private walletClient;
67
+ private chain;
68
+ private factoryAddress;
69
+ /** builderRegistry is immutable on the factory — cached after the first delegate check. */
70
+ private builderRegistryCache;
71
+ constructor(publicClient: PublicClient, walletClient: WalletClient | undefined, chain: Chain, factoryAddress: Address);
72
+ get address(): Address;
73
+ private requireWallet;
74
+ private write;
75
+ /** Factory wiring + quote freshness anchors (quoteConfigNonce invalidates all quotes on config change). */
76
+ getConfig(): Promise<{
77
+ vault: Address;
78
+ oracle: Address;
79
+ implementation: Address;
80
+ builderRegistry: Address;
81
+ owner: Address;
82
+ pendingOwner: Address;
83
+ quoteConfigNonce: bigint;
84
+ maxOpenPositions: number;
85
+ minHoldBlocks: bigint;
86
+ accountsCount: bigint;
87
+ }>;
88
+ getPricingConfig(): Promise<ChallengePricingConfig>;
89
+ /** Immutable terms a challenge account was minted with. */
90
+ getChallengeTerms(account: Address): Promise<ChallengeTerms>;
91
+ /**
92
+ * On-chain fee re-derivation for a quote. This is the authoritative pricing check —
93
+ * do NOT re-implement ChallengePricingLib math off-chain, it drifts on config changes.
94
+ */
95
+ previewQuote(quote: ChallengeQuote): Promise<ChallengeFeeBreakdown>;
96
+ /** Local EIP-712 digest of a quote (no RPC; matches challengeQuoteDigest on-chain). */
97
+ quoteDigest(quote: ChallengeQuote): Hex;
98
+ /**
99
+ * Verify a builder quote signature before paying for it. Recovers the ECDSA signer locally,
100
+ * accepts the builder EOA directly, and falls back to a MainVault.delegateBuilder registry
101
+ * check over RPC. ERC-1271 contract signatures cannot be recovered off-chain — those return
102
+ * valid=false and must be validated by on-chain simulation instead.
103
+ */
104
+ verifyQuote(quote: ChallengeQuote, signature: Hex): Promise<QuoteVerification>;
105
+ /** Deterministic clone address for the trader's next challenge with this builder. */
106
+ predictChallengeAccount(trader: Address, builder: Address): Promise<Address>;
107
+ getAccountAt(index: bigint): Promise<Address>;
108
+ /** Current per-builder epoch; bumping it (incrementBuilderQuoteEpoch) voids all prior quotes. */
109
+ getBuilderQuoteEpoch(builder: Address): Promise<bigint>;
110
+ isQuoteNonceUsed(builder: Address, nonce: bigint): Promise<boolean>;
111
+ /**
112
+ * Direct-gas purchase of a builder-signed quote. Requires prior USDC allowance from the
113
+ * payer to the ChallengeVault. `maxChallengeFee` defaults to the quoted fee (no slippage).
114
+ * For gasless UX submit through the challenge-service /purchase route instead.
115
+ */
116
+ buyChallenge(quote: ChallengeQuote, builderSignature: Hex, maxChallengeFee?: bigint): Promise<Hash>;
117
+ /**
118
+ * Calldata for buyChallengeWithPermit — the ONLY call shape the challenge-service
119
+ * gasless POST /purchase route accepts (it strictly decodes this selector and requires
120
+ * permitValue >= quotedChallengeFee). Wrap it in a ForwardRequest via
121
+ * ForwarderModule.signRequest({ to: factory, data }) and submit with
122
+ * ChallengeApiClient.purchase.
123
+ */
124
+ static encodeBuyChallengeWithPermit(p: {
125
+ quote: ChallengeQuote;
126
+ builderSignature: Hex;
127
+ maxChallengeFee?: bigint;
128
+ permitValue: bigint;
129
+ permitDeadline: bigint;
130
+ v: number;
131
+ r: Hex;
132
+ s: Hex;
133
+ }): Hex;
134
+ /** Purchase with an ERC-2612 permit (first-time users with no vault allowance). */
135
+ buyChallengeWithPermit(p: {
136
+ quote: ChallengeQuote;
137
+ builderSignature: Hex;
138
+ maxChallengeFee?: bigint;
139
+ permitValue: bigint;
140
+ permitDeadline: bigint;
141
+ v: number;
142
+ r: Hex;
143
+ s: Hex;
144
+ }): Promise<Hash>;
145
+ /** Void one outstanding quote nonce (builder or its delegate). */
146
+ cancelQuoteNonce(nonce: bigint): Promise<Hash>;
147
+ cancelQuoteNonces(nonces: bigint[]): Promise<Hash>;
148
+ /** Void ALL outstanding quotes of the calling builder at once. */
149
+ incrementBuilderQuoteEpoch(): Promise<Hash>;
150
+ }
151
+ //# sourceMappingURL=factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/challenge/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,OAAO,EACZ,KAAK,KAAK,EACV,KAAK,IAAI,EACT,KAAK,GAAG,EACR,KAAK,YAAY,EACjB,KAAK,YAAY,EAElB,MAAM,MAAM,CAAC;AAGd,OAAO,KAAK,EACV,qBAAqB,EACrB,sBAAsB,EACtB,cAAc,EACd,cAAc,EACd,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAGpB,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoBxB,CAAC;AAaX;;;;;;GAMG;AACH,qBAAa,sBAAsB;IAK/B,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,cAAc;IAPxB,2FAA2F;IAC3F,OAAO,CAAC,oBAAoB,CAAsB;gBAGxC,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,YAAY,GAAG,SAAS,EACtC,KAAK,EAAE,KAAK,EACZ,cAAc,EAAE,OAAO;IAGjC,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,OAAO,CAAC,aAAa;YASP,KAAK;IAWnB,2GAA2G;IACrG,SAAS,IAAI,OAAO,CAAC;QACzB,KAAK,EAAE,OAAO,CAAC;QACf,MAAM,EAAE,OAAO,CAAC;QAChB,cAAc,EAAE,OAAO,CAAC;QACxB,eAAe,EAAE,OAAO,CAAC;QACzB,KAAK,EAAE,OAAO,CAAC;QACf,YAAY,EAAE,OAAO,CAAC;QACtB,gBAAgB,EAAE,MAAM,CAAC;QACzB,gBAAgB,EAAE,MAAM,CAAC;QACzB,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IA+BI,gBAAgB,IAAI,OAAO,CAAC,sBAAsB,CAAC;IA2BzD,2DAA2D;IACrD,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC;IAwBlE;;;OAGG;IACG,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAgBzE,uFAAuF;IACvF,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,GAAG;IAcvC;;;;;OAKG;IACG,WAAW,CAAC,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA6CpF,qFAAqF;IAC/E,uBAAuB,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAS5E,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASnD,iGAAiG;IAC3F,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IASvD,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWzE;;;;OAIG;IACG,YAAY,CAAC,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,GAAG,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASzG;;;;;;OAMG;IACH,MAAM,CAAC,4BAA4B,CAAC,CAAC,EAAE;QACrC,KAAK,EAAE,cAAc,CAAC;QACtB,gBAAgB,EAAE,GAAG,CAAC;QACtB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,MAAM,CAAC;QACvB,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,GAAG,CAAC;QACP,CAAC,EAAE,GAAG,CAAC;KACR,GAAG,GAAG;IAiBP,mFAAmF;IAC7E,sBAAsB,CAAC,CAAC,EAAE;QAC9B,KAAK,EAAE,cAAc,CAAC;QACtB,gBAAgB,EAAE,GAAG,CAAC;QACtB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,MAAM,CAAC;QACvB,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,GAAG,CAAC;QACP,CAAC,EAAE,GAAG,CAAC;KACR,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBjB,kEAAkE;IAC5D,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS9C,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IASxD,kEAAkE;IAC5D,0BAA0B,IAAI,OAAO,CAAC,IAAI,CAAC;CAOlD"}