@0xbow/privacy-pools-core-sdk 0.1.5

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 (93) hide show
  1. package/README.md +73 -0
  2. package/dist/esm/ccip-nJye9Itm.js +166 -0
  3. package/dist/esm/ccip-nJye9Itm.js.map +1 -0
  4. package/dist/esm/index-DAWUECi8.js +84043 -0
  5. package/dist/esm/index-DAWUECi8.js.map +1 -0
  6. package/dist/esm/index.mjs +4 -0
  7. package/dist/esm/index.mjs.map +1 -0
  8. package/dist/index.d.mts +666 -0
  9. package/dist/node/artifacts/commitment.vkey +114 -0
  10. package/dist/node/artifacts/commitment.wasm +0 -0
  11. package/dist/node/artifacts/commitment.zkey +0 -0
  12. package/dist/node/artifacts/merkleTree.vkey +269 -0
  13. package/dist/node/artifacts/merkleTree.wasm +0 -0
  14. package/dist/node/artifacts/merkleTree.zkey +0 -0
  15. package/dist/node/artifacts/withdraw.vkey +129 -0
  16. package/dist/node/artifacts/withdraw.wasm +0 -0
  17. package/dist/node/artifacts/withdraw.zkey +0 -0
  18. package/dist/node/ccip-lPhPeJab.js +183 -0
  19. package/dist/node/ccip-lPhPeJab.js.map +1 -0
  20. package/dist/node/index-BiU5Ef8Z.js +90625 -0
  21. package/dist/node/index-BiU5Ef8Z.js.map +1 -0
  22. package/dist/node/index.mjs +21 -0
  23. package/dist/node/index.mjs.map +1 -0
  24. package/dist/types/abi/ERC20.d.ts +38 -0
  25. package/dist/types/abi/IEntrypoint.d.ts +794 -0
  26. package/dist/types/abi/IPrivacyPool.d.ts +51 -0
  27. package/dist/types/ccip-BZzz1Y5w.js +182 -0
  28. package/dist/types/circuits/circuits.impl.d.ts +108 -0
  29. package/dist/types/circuits/circuits.interface.d.ts +127 -0
  30. package/dist/types/circuits/index.d.ts +2 -0
  31. package/dist/types/constants.d.ts +2 -0
  32. package/dist/types/core/bruteForce.service.d.ts +61 -0
  33. package/dist/types/core/commitment.service.d.ts +30 -0
  34. package/dist/types/core/contracts.service.d.ts +106 -0
  35. package/dist/types/core/sdk.d.ts +44 -0
  36. package/dist/types/core/withdrawal.service.d.ts +32 -0
  37. package/dist/types/crypto.d.ts +45 -0
  38. package/dist/types/dirname.helper.d.ts +2 -0
  39. package/dist/types/errors/base.error.d.ts +52 -0
  40. package/dist/types/exceptions/circuitInitialization.exception.d.ts +3 -0
  41. package/dist/types/exceptions/fetchArtifacts.exception.d.ts +3 -0
  42. package/dist/types/exceptions/index.d.ts +4 -0
  43. package/dist/types/exceptions/invalidRpcUrl.exception.d.ts +3 -0
  44. package/dist/types/exceptions/privacyPool.exception.d.ts +13 -0
  45. package/dist/types/external.d.ts +7 -0
  46. package/dist/types/filename.helper.d.ts +2 -0
  47. package/dist/types/index-D-_1h8-n.js +90638 -0
  48. package/dist/types/index.d.ts +10 -0
  49. package/dist/types/index.js +20 -0
  50. package/dist/types/interfaces/blockchainProvider.interface.d.ts +12 -0
  51. package/dist/types/interfaces/circuits.interface.d.ts +30 -0
  52. package/dist/types/interfaces/contracts.interface.d.ts +28 -0
  53. package/dist/types/interfaces/index.d.ts +1 -0
  54. package/dist/types/internal.d.ts +6 -0
  55. package/dist/types/providers/blockchainProvider.d.ts +8 -0
  56. package/dist/types/providers/index.d.ts +1 -0
  57. package/dist/types/types/commitment.d.ts +48 -0
  58. package/dist/types/types/index.d.ts +2 -0
  59. package/dist/types/types/withdrawal.d.ts +30 -0
  60. package/package.json +81 -0
  61. package/src/abi/ERC20.ts +222 -0
  62. package/src/abi/IEntrypoint.ts +627 -0
  63. package/src/abi/IPrivacyPool.ts +386 -0
  64. package/src/circuits/circuits.impl.ts +213 -0
  65. package/src/circuits/circuits.interface.ts +162 -0
  66. package/src/circuits/index.ts +2 -0
  67. package/src/constants.ts +3 -0
  68. package/src/core/bruteForce.service.ts +120 -0
  69. package/src/core/commitment.service.ts +84 -0
  70. package/src/core/contracts.service.ts +407 -0
  71. package/src/core/sdk.ts +91 -0
  72. package/src/core/withdrawal.service.ts +110 -0
  73. package/src/crypto.ts +156 -0
  74. package/src/dirname.helper.ts +4 -0
  75. package/src/errors/base.error.ts +120 -0
  76. package/src/exceptions/circuitInitialization.exception.ts +6 -0
  77. package/src/exceptions/fetchArtifacts.exception.ts +7 -0
  78. package/src/exceptions/index.ts +4 -0
  79. package/src/exceptions/invalidRpcUrl.exception.ts +6 -0
  80. package/src/exceptions/privacyPool.exception.ts +19 -0
  81. package/src/external.ts +13 -0
  82. package/src/filename.helper.ts +4 -0
  83. package/src/index.ts +18 -0
  84. package/src/interfaces/blockchainProvider.interface.ts +13 -0
  85. package/src/interfaces/circuits.interface.ts +34 -0
  86. package/src/interfaces/contracts.interface.ts +58 -0
  87. package/src/interfaces/index.ts +1 -0
  88. package/src/internal.ts +6 -0
  89. package/src/providers/blockchainProvider.ts +26 -0
  90. package/src/providers/index.ts +1 -0
  91. package/src/types/commitment.ts +50 -0
  92. package/src/types/index.ts +2 -0
  93. package/src/types/withdrawal.ts +33 -0
package/README.md ADDED
@@ -0,0 +1,73 @@
1
+ # Privacy Pool Core SDK
2
+
3
+ A TypeScript SDK for interacting with the Privacy Pool protocol. This SDK provides a comprehensive set of tools and utilities for integrating with Privacy Pool, enabling deposits, withdrawals, and other core functionality.
4
+
5
+ ## Installation
6
+
7
+
8
+ ```bash
9
+ npm install @0xbow/privacy-pool-core-sdk
10
+ # or
11
+ yarn add @0xbow/privacy-pool-core-sdk
12
+ # or
13
+ pnpm add @0xbow/privacy-pool-core-sdk
14
+ ```
15
+
16
+ ## Setup
17
+
18
+ 1. Install dependencies by running `pnpm install`
19
+ 2. Build the SDK by running `pnpm build`
20
+
21
+ ## Available Scripts
22
+
23
+ | Script | Description |
24
+ | ------------- | ------------------------------------------------------- |
25
+ | `build` | Build the SDK using Rollup |
26
+ | `build:bundle`| Build the SDK and set up circuits |
27
+ | `check-types` | Check for TypeScript type issues |
28
+ | `clean` | Remove build artifacts |
29
+ | `lint` | Run ESLint to check code quality |
30
+ | `lint:fix` | Fix linting issues automatically |
31
+ | `format` | Check code formatting using Prettier |
32
+ | `format:fix` | Fix formatting issues automatically |
33
+ | `test` | Run tests using Vitest |
34
+ | `test:cov` | Generate test coverage report |
35
+
36
+ ## Usage
37
+
38
+ ```typescript
39
+ import { PrivacyPoolSDK } from '@0xbow/privacy-pool-core-sdk';
40
+
41
+ // Initialize the SDK
42
+ const sdk = new PrivacyPoolSDK({
43
+ // Configuration options
44
+ });
45
+
46
+ // Example: Create a deposit
47
+ const deposit = await sdk.deposit({
48
+ // Deposit parameters
49
+ });
50
+
51
+ // Example: Create a withdrawal
52
+ const withdrawal = await sdk.withdraw({
53
+ // Withdrawal parameters
54
+ });
55
+ ```
56
+
57
+ For detailed usage examples and API documentation, please refer to our [documentation](https://github.com/defi-wonderland/privacy-pool-core/tree/main/docs).
58
+
59
+ ## Features
60
+
61
+ - Deposit and withdrawal functionality
62
+ - Zero-knowledge proof generation
63
+ - Commitment management
64
+ - Contract interactions
65
+ - Type-safe API
66
+
67
+ ## Contributing
68
+
69
+ Contributions are welcome! Please feel free to submit a Pull Request.
70
+
71
+ ## License
72
+
73
+ Apache-2.0 License - see the [LICENSE](LICENSE) file for details.
@@ -0,0 +1,166 @@
1
+ import { B as BaseError, g as getUrl, s as stringify, d as decodeErrorResult, i as isAddressEqual, c as call, a as concat, e as encodeAbiParameters, H as HttpRequestError, b as isHex } from './index-DAWUECi8.js';
2
+ import 'buffer';
3
+ import 'assert';
4
+
5
+ class OffchainLookupError extends BaseError {
6
+ constructor({ callbackSelector, cause, data, extraData, sender, urls, }) {
7
+ super(cause.shortMessage ||
8
+ 'An error occurred while fetching for an offchain result.', {
9
+ cause,
10
+ metaMessages: [
11
+ ...(cause.metaMessages || []),
12
+ cause.metaMessages?.length ? '' : [],
13
+ 'Offchain Gateway Call:',
14
+ urls && [
15
+ ' Gateway URL(s):',
16
+ ...urls.map((url) => ` ${getUrl(url)}`),
17
+ ],
18
+ ` Sender: ${sender}`,
19
+ ` Data: ${data}`,
20
+ ` Callback selector: ${callbackSelector}`,
21
+ ` Extra data: ${extraData}`,
22
+ ].flat(),
23
+ name: 'OffchainLookupError',
24
+ });
25
+ }
26
+ }
27
+ class OffchainLookupResponseMalformedError extends BaseError {
28
+ constructor({ result, url }) {
29
+ super('Offchain gateway response is malformed. Response data must be a hex value.', {
30
+ metaMessages: [
31
+ `Gateway URL: ${getUrl(url)}`,
32
+ `Response: ${stringify(result)}`,
33
+ ],
34
+ name: 'OffchainLookupResponseMalformedError',
35
+ });
36
+ }
37
+ }
38
+ class OffchainLookupSenderMismatchError extends BaseError {
39
+ constructor({ sender, to }) {
40
+ super('Reverted sender address does not match target contract address (`to`).', {
41
+ metaMessages: [
42
+ `Contract address: ${to}`,
43
+ `OffchainLookup sender address: ${sender}`,
44
+ ],
45
+ name: 'OffchainLookupSenderMismatchError',
46
+ });
47
+ }
48
+ }
49
+
50
+ const offchainLookupSignature = '0x556f1830';
51
+ const offchainLookupAbiItem = {
52
+ name: 'OffchainLookup',
53
+ type: 'error',
54
+ inputs: [
55
+ {
56
+ name: 'sender',
57
+ type: 'address',
58
+ },
59
+ {
60
+ name: 'urls',
61
+ type: 'string[]',
62
+ },
63
+ {
64
+ name: 'callData',
65
+ type: 'bytes',
66
+ },
67
+ {
68
+ name: 'callbackFunction',
69
+ type: 'bytes4',
70
+ },
71
+ {
72
+ name: 'extraData',
73
+ type: 'bytes',
74
+ },
75
+ ],
76
+ };
77
+ async function offchainLookup(client, { blockNumber, blockTag, data, to, }) {
78
+ const { args } = decodeErrorResult({
79
+ data,
80
+ abi: [offchainLookupAbiItem],
81
+ });
82
+ const [sender, urls, callData, callbackSelector, extraData] = args;
83
+ const { ccipRead } = client;
84
+ const ccipRequest_ = ccipRead && typeof ccipRead?.request === 'function'
85
+ ? ccipRead.request
86
+ : ccipRequest;
87
+ try {
88
+ if (!isAddressEqual(to, sender))
89
+ throw new OffchainLookupSenderMismatchError({ sender, to });
90
+ const result = await ccipRequest_({ data: callData, sender, urls });
91
+ const { data: data_ } = await call(client, {
92
+ blockNumber,
93
+ blockTag,
94
+ data: concat([
95
+ callbackSelector,
96
+ encodeAbiParameters([{ type: 'bytes' }, { type: 'bytes' }], [result, extraData]),
97
+ ]),
98
+ to,
99
+ });
100
+ return data_;
101
+ }
102
+ catch (err) {
103
+ throw new OffchainLookupError({
104
+ callbackSelector,
105
+ cause: err,
106
+ data,
107
+ extraData,
108
+ sender,
109
+ urls,
110
+ });
111
+ }
112
+ }
113
+ async function ccipRequest({ data, sender, urls, }) {
114
+ let error = new Error('An unknown error occurred.');
115
+ for (let i = 0; i < urls.length; i++) {
116
+ const url = urls[i];
117
+ const method = url.includes('{data}') ? 'GET' : 'POST';
118
+ const body = method === 'POST' ? { data, sender } : undefined;
119
+ const headers = method === 'POST' ? { 'Content-Type': 'application/json' } : {};
120
+ try {
121
+ const response = await fetch(url.replace('{sender}', sender).replace('{data}', data), {
122
+ body: JSON.stringify(body),
123
+ headers,
124
+ method,
125
+ });
126
+ let result;
127
+ if (response.headers.get('Content-Type')?.startsWith('application/json')) {
128
+ result = (await response.json()).data;
129
+ }
130
+ else {
131
+ result = (await response.text());
132
+ }
133
+ if (!response.ok) {
134
+ error = new HttpRequestError({
135
+ body,
136
+ details: result?.error
137
+ ? stringify(result.error)
138
+ : response.statusText,
139
+ headers: response.headers,
140
+ status: response.status,
141
+ url,
142
+ });
143
+ continue;
144
+ }
145
+ if (!isHex(result)) {
146
+ error = new OffchainLookupResponseMalformedError({
147
+ result,
148
+ url,
149
+ });
150
+ continue;
151
+ }
152
+ return result;
153
+ }
154
+ catch (err) {
155
+ error = new HttpRequestError({
156
+ body,
157
+ details: err.message,
158
+ url,
159
+ });
160
+ }
161
+ }
162
+ throw error;
163
+ }
164
+
165
+ export { ccipRequest, offchainLookup, offchainLookupAbiItem, offchainLookupSignature };
166
+ //# sourceMappingURL=ccip-nJye9Itm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ccip-nJye9Itm.js","sources":["../../node_modules/.pnpm/viem@2.22.14_typescript@5.7.3/node_modules/viem/_esm/errors/ccip.js","../../node_modules/.pnpm/viem@2.22.14_typescript@5.7.3/node_modules/viem/_esm/utils/ccip.js"],"sourcesContent":["import { stringify } from '../utils/stringify.js';\nimport { BaseError } from './base.js';\nimport { getUrl } from './utils.js';\nexport class OffchainLookupError extends BaseError {\n constructor({ callbackSelector, cause, data, extraData, sender, urls, }) {\n super(cause.shortMessage ||\n 'An error occurred while fetching for an offchain result.', {\n cause,\n metaMessages: [\n ...(cause.metaMessages || []),\n cause.metaMessages?.length ? '' : [],\n 'Offchain Gateway Call:',\n urls && [\n ' Gateway URL(s):',\n ...urls.map((url) => ` ${getUrl(url)}`),\n ],\n ` Sender: ${sender}`,\n ` Data: ${data}`,\n ` Callback selector: ${callbackSelector}`,\n ` Extra data: ${extraData}`,\n ].flat(),\n name: 'OffchainLookupError',\n });\n }\n}\nexport class OffchainLookupResponseMalformedError extends BaseError {\n constructor({ result, url }) {\n super('Offchain gateway response is malformed. Response data must be a hex value.', {\n metaMessages: [\n `Gateway URL: ${getUrl(url)}`,\n `Response: ${stringify(result)}`,\n ],\n name: 'OffchainLookupResponseMalformedError',\n });\n }\n}\nexport class OffchainLookupSenderMismatchError extends BaseError {\n constructor({ sender, to }) {\n super('Reverted sender address does not match target contract address (`to`).', {\n metaMessages: [\n `Contract address: ${to}`,\n `OffchainLookup sender address: ${sender}`,\n ],\n name: 'OffchainLookupSenderMismatchError',\n });\n }\n}\n//# sourceMappingURL=ccip.js.map","import { call } from '../actions/public/call.js';\nimport { OffchainLookupError, OffchainLookupResponseMalformedError, OffchainLookupSenderMismatchError, } from '../errors/ccip.js';\nimport { HttpRequestError, } from '../errors/request.js';\nimport { decodeErrorResult } from './abi/decodeErrorResult.js';\nimport { encodeAbiParameters } from './abi/encodeAbiParameters.js';\nimport { isAddressEqual } from './address/isAddressEqual.js';\nimport { concat } from './data/concat.js';\nimport { isHex } from './data/isHex.js';\nimport { stringify } from './stringify.js';\nexport const offchainLookupSignature = '0x556f1830';\nexport const offchainLookupAbiItem = {\n name: 'OffchainLookup',\n type: 'error',\n inputs: [\n {\n name: 'sender',\n type: 'address',\n },\n {\n name: 'urls',\n type: 'string[]',\n },\n {\n name: 'callData',\n type: 'bytes',\n },\n {\n name: 'callbackFunction',\n type: 'bytes4',\n },\n {\n name: 'extraData',\n type: 'bytes',\n },\n ],\n};\nexport async function offchainLookup(client, { blockNumber, blockTag, data, to, }) {\n const { args } = decodeErrorResult({\n data,\n abi: [offchainLookupAbiItem],\n });\n const [sender, urls, callData, callbackSelector, extraData] = args;\n const { ccipRead } = client;\n const ccipRequest_ = ccipRead && typeof ccipRead?.request === 'function'\n ? ccipRead.request\n : ccipRequest;\n try {\n if (!isAddressEqual(to, sender))\n throw new OffchainLookupSenderMismatchError({ sender, to });\n const result = await ccipRequest_({ data: callData, sender, urls });\n const { data: data_ } = await call(client, {\n blockNumber,\n blockTag,\n data: concat([\n callbackSelector,\n encodeAbiParameters([{ type: 'bytes' }, { type: 'bytes' }], [result, extraData]),\n ]),\n to,\n });\n return data_;\n }\n catch (err) {\n throw new OffchainLookupError({\n callbackSelector,\n cause: err,\n data,\n extraData,\n sender,\n urls,\n });\n }\n}\nexport async function ccipRequest({ data, sender, urls, }) {\n let error = new Error('An unknown error occurred.');\n for (let i = 0; i < urls.length; i++) {\n const url = urls[i];\n const method = url.includes('{data}') ? 'GET' : 'POST';\n const body = method === 'POST' ? { data, sender } : undefined;\n const headers = method === 'POST' ? { 'Content-Type': 'application/json' } : {};\n try {\n const response = await fetch(url.replace('{sender}', sender).replace('{data}', data), {\n body: JSON.stringify(body),\n headers,\n method,\n });\n let result;\n if (response.headers.get('Content-Type')?.startsWith('application/json')) {\n result = (await response.json()).data;\n }\n else {\n result = (await response.text());\n }\n if (!response.ok) {\n error = new HttpRequestError({\n body,\n details: result?.error\n ? stringify(result.error)\n : response.statusText,\n headers: response.headers,\n status: response.status,\n url,\n });\n continue;\n }\n if (!isHex(result)) {\n error = new OffchainLookupResponseMalformedError({\n result,\n url,\n });\n continue;\n }\n return result;\n }\n catch (err) {\n error = new HttpRequestError({\n body,\n details: err.message,\n url,\n });\n }\n }\n throw error;\n}\n//# sourceMappingURL=ccip.js.map"],"names":[],"mappings":";;;;AAGO,MAAM,mBAAmB,SAAS,SAAS,CAAC;AACnD,IAAI,WAAW,CAAC,EAAE,gBAAgB,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,GAAG,EAAE;AAC7E,QAAQ,KAAK,CAAC,KAAK,CAAC,YAAY;AAChC,YAAY,0DAA0D,EAAE;AACxE,YAAY,KAAK;AACjB,YAAY,YAAY,EAAE;AAC1B,gBAAgB,IAAI,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC;AAC7C,gBAAgB,KAAK,CAAC,YAAY,EAAE,MAAM,GAAG,EAAE,GAAG,EAAE;AACpD,gBAAgB,wBAAwB;AACxC,gBAAgB,IAAI,IAAI;AACxB,oBAAoB,mBAAmB;AACvC,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC9D,iBAAiB;AACjB,gBAAgB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AACrC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACjC,gBAAgB,CAAC,qBAAqB,EAAE,gBAAgB,CAAC,CAAC;AAC1D,gBAAgB,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;AAC5C,aAAa,CAAC,IAAI,EAAE;AACpB,YAAY,IAAI,EAAE,qBAAqB;AACvC,SAAS,CAAC;AACV;AACA;AACO,MAAM,oCAAoC,SAAS,SAAS,CAAC;AACpE,IAAI,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;AACjC,QAAQ,KAAK,CAAC,4EAA4E,EAAE;AAC5F,YAAY,YAAY,EAAE;AAC1B,gBAAgB,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7C,gBAAgB,CAAC,UAAU,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AAChD,aAAa;AACb,YAAY,IAAI,EAAE,sCAAsC;AACxD,SAAS,CAAC;AACV;AACA;AACO,MAAM,iCAAiC,SAAS,SAAS,CAAC;AACjE,IAAI,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE;AAChC,QAAQ,KAAK,CAAC,wEAAwE,EAAE;AACxF,YAAY,YAAY,EAAE;AAC1B,gBAAgB,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;AACzC,gBAAgB,CAAC,+BAA+B,EAAE,MAAM,CAAC,CAAC;AAC1D,aAAa;AACb,YAAY,IAAI,EAAE,mCAAmC;AACrD,SAAS,CAAC;AACV;AACA;;ACrCY,MAAC,uBAAuB,GAAG;AAC3B,MAAC,qBAAqB,GAAG;AACrC,IAAI,IAAI,EAAE,gBAAgB;AAC1B,IAAI,IAAI,EAAE,OAAO;AACjB,IAAI,MAAM,EAAE;AACZ,QAAQ;AACR,YAAY,IAAI,EAAE,QAAQ;AAC1B,YAAY,IAAI,EAAE,SAAS;AAC3B,SAAS;AACT,QAAQ;AACR,YAAY,IAAI,EAAE,MAAM;AACxB,YAAY,IAAI,EAAE,UAAU;AAC5B,SAAS;AACT,QAAQ;AACR,YAAY,IAAI,EAAE,UAAU;AAC5B,YAAY,IAAI,EAAE,OAAO;AACzB,SAAS;AACT,QAAQ;AACR,YAAY,IAAI,EAAE,kBAAkB;AACpC,YAAY,IAAI,EAAE,QAAQ;AAC1B,SAAS;AACT,QAAQ;AACR,YAAY,IAAI,EAAE,WAAW;AAC7B,YAAY,IAAI,EAAE,OAAO;AACzB,SAAS;AACT,KAAK;AACL;AACO,eAAe,cAAc,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE;AACnF,IAAI,MAAM,EAAE,IAAI,EAAE,GAAG,iBAAiB,CAAC;AACvC,QAAQ,IAAI;AACZ,QAAQ,GAAG,EAAE,CAAC,qBAAqB,CAAC;AACpC,KAAK,CAAC;AACN,IAAI,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,SAAS,CAAC,GAAG,IAAI;AACtE,IAAI,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM;AAC/B,IAAI,MAAM,YAAY,GAAG,QAAQ,IAAI,OAAO,QAAQ,EAAE,OAAO,KAAK;AAClE,UAAU,QAAQ,CAAC;AACnB,UAAU,WAAW;AACrB,IAAI,IAAI;AACR,QAAQ,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,MAAM,CAAC;AACvC,YAAY,MAAM,IAAI,iCAAiC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACvE,QAAQ,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAC3E,QAAQ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE;AACnD,YAAY,WAAW;AACvB,YAAY,QAAQ;AACpB,YAAY,IAAI,EAAE,MAAM,CAAC;AACzB,gBAAgB,gBAAgB;AAChC,gBAAgB,mBAAmB,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAChG,aAAa,CAAC;AACd,YAAY,EAAE;AACd,SAAS,CAAC;AACV,QAAQ,OAAO,KAAK;AACpB;AACA,IAAI,OAAO,GAAG,EAAE;AAChB,QAAQ,MAAM,IAAI,mBAAmB,CAAC;AACtC,YAAY,gBAAgB;AAC5B,YAAY,KAAK,EAAE,GAAG;AACtB,YAAY,IAAI;AAChB,YAAY,SAAS;AACrB,YAAY,MAAM;AAClB,YAAY,IAAI;AAChB,SAAS,CAAC;AACV;AACA;AACO,eAAe,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAG,EAAE;AAC3D,IAAI,IAAI,KAAK,GAAG,IAAI,KAAK,CAAC,4BAA4B,CAAC;AACvD,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC1C,QAAQ,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;AAC3B,QAAQ,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,KAAK,GAAG,MAAM;AAC9D,QAAQ,MAAM,IAAI,GAAG,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS;AACrE,QAAQ,MAAM,OAAO,GAAG,MAAM,KAAK,MAAM,GAAG,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,EAAE;AACvF,QAAQ,IAAI;AACZ,YAAY,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE;AAClG,gBAAgB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;AAC1C,gBAAgB,OAAO;AACvB,gBAAgB,MAAM;AACtB,aAAa,CAAC;AACd,YAAY,IAAI,MAAM;AACtB,YAAY,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,kBAAkB,CAAC,EAAE;AACtF,gBAAgB,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,IAAI;AACrD;AACA,iBAAiB;AACjB,gBAAgB,MAAM,IAAI,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;AAChD;AACA,YAAY,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;AAC9B,gBAAgB,KAAK,GAAG,IAAI,gBAAgB,CAAC;AAC7C,oBAAoB,IAAI;AACxB,oBAAoB,OAAO,EAAE,MAAM,EAAE;AACrC,0BAA0B,SAAS,CAAC,MAAM,CAAC,KAAK;AAChD,0BAA0B,QAAQ,CAAC,UAAU;AAC7C,oBAAoB,OAAO,EAAE,QAAQ,CAAC,OAAO;AAC7C,oBAAoB,MAAM,EAAE,QAAQ,CAAC,MAAM;AAC3C,oBAAoB,GAAG;AACvB,iBAAiB,CAAC;AAClB,gBAAgB;AAChB;AACA,YAAY,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;AAChC,gBAAgB,KAAK,GAAG,IAAI,oCAAoC,CAAC;AACjE,oBAAoB,MAAM;AAC1B,oBAAoB,GAAG;AACvB,iBAAiB,CAAC;AAClB,gBAAgB;AAChB;AACA,YAAY,OAAO,MAAM;AACzB;AACA,QAAQ,OAAO,GAAG,EAAE;AACpB,YAAY,KAAK,GAAG,IAAI,gBAAgB,CAAC;AACzC,gBAAgB,IAAI;AACpB,gBAAgB,OAAO,EAAE,GAAG,CAAC,OAAO;AACpC,gBAAgB,GAAG;AACnB,aAAa,CAAC;AACd;AACA;AACA,IAAI,MAAM,KAAK;AACf;;;;","x_google_ignoreList":[0,1]}