@silencelaboratories/walletprovider-sdk 0.1.0 → 0.3.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.
- package/README.md +100 -59
- package/dist/EOAauthentication.d.ts +7 -22
- package/dist/authentication.d.ts +75 -31
- package/dist/encoding.d.ts +1 -2
- package/dist/ephemeralAuthentication.d.ts +21 -0
- package/dist/index.cjs.js +1 -0
- package/dist/index.d.ts +9 -6
- package/dist/index.esm.js +1 -0
- package/dist/networkSigner.d.ts +91 -25
- package/dist/passkeyAuthentication.d.ts +29 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/validator.d.ts +3 -0
- package/dist/viemSigner.d.ts +7 -4
- package/dist/walletProviderServiceClient.d.ts +13 -7
- package/dist/walletProviderServiceClientInterface.d.ts +14 -6
- package/package.json +26 -13
- package/dist/index.js +0 -1
package/README.md
CHANGED
|
@@ -10,8 +10,8 @@ In order to run it execute the following:
|
|
|
10
10
|
1. Build the library
|
|
11
11
|
|
|
12
12
|
```
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
npm install
|
|
14
|
+
npm run build
|
|
15
15
|
```
|
|
16
16
|
|
|
17
17
|
2. Run the demo
|
|
@@ -49,37 +49,44 @@ For description of classes, interfaces, types, please refer to [documentation](.
|
|
|
49
49
|
## Authentication
|
|
50
50
|
|
|
51
51
|
|
|
52
|
-
Users authenticate using
|
|
52
|
+
Users authenticate using **EOA wallet** or **Passkey** during **key generation** and register an ephemeral signing key pair and associates it with their identity.
|
|
53
53
|
|
|
54
54
|
Frontend can later use the ephemeral signing key pair to authorize **signing requests** for duration of the session without the need for repeated user interaction, providing a seamless and secure authentication mechanism.
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
Key generation:
|
|
57
|
+
- [EOAAuth](./docs/walletprovider-sdk.eoaauth.md) to authenticate the user **during keygen**. The `EOAAuth` object is created with the user's wallet address.
|
|
58
|
+
|
|
59
|
+
- [PasskeyAuth](./docs/walletprovider-sdk.passkeyauth.md) to authenticate the user **during keygen**. The `PasskeyAuth` object is created with the [PasskeyUser](./docs/walletprovider-sdk.passkeyuser.md), [RelyingPartyConfig](./docs/walletprovider-sdk.relyingpartyconfig.md).
|
|
60
|
+
|
|
61
|
+
- The ephemeral public key and lifetime of the key in seconds will be associated with both `EOAAuth` and `PasskeyAuth` objects.
|
|
57
62
|
|
|
58
|
-
|
|
63
|
+
Signature generation:
|
|
64
|
+
- [EphAuth](./docs/walletprovider-sdk.ephauth.md) to authenticate the user **during signing**. The `EphAuth` object is created with the ephemeral keypair.
|
|
59
65
|
|
|
60
66
|
## Keygen
|
|
61
67
|
|
|
62
68
|
|
|
63
69
|
The full working example is in the [demo](https://github.com/silence-laboratories/walletprovider-sdk/blob/a75d7a009fb4d3629d353d53f8c27c34190c9035/demo/src/routes/%2Bpage.svelte#L89).
|
|
64
|
-
The core object to use is the [NetworkSigner](./docs/walletprovider-sdk.networksigner.md).
|
|
70
|
+
The core object to use is the [NetworkSigner](./docs/walletprovider-sdk.networksigner.md). It allows to generate keys and do signatures.
|
|
65
71
|
|
|
66
|
-
|
|
72
|
+
In order to create your keys, you need two other components. The [WalletProviderServiceClient](./docs/walletprovider-sdk.walletproviderserviceclient.md) that connects to the Backend part of the SDK, and the **authentication module**.
|
|
67
73
|
|
|
68
|
-
|
|
69
|
-
Let's create the `NetworkSigner`
|
|
74
|
+
### Authenticate with EOA wallet
|
|
75
|
+
We provide EOA authentication via [EOAAuth](./docs/walletprovider-sdk.eoaauth.md) module. Let's create the `NetworkSigner` with associated `EOAAuth` object.
|
|
70
76
|
|
|
71
77
|
```ts
|
|
72
78
|
// Generate ephemeral secret key esk
|
|
73
|
-
const sk =
|
|
74
|
-
ephSK = sk;
|
|
79
|
+
const sk = generateEphPrivateKey();
|
|
75
80
|
// Derive public part epk from esk
|
|
76
|
-
ephPK =
|
|
77
|
-
|
|
81
|
+
const ephPK = getEphPublicKey(sk);
|
|
82
|
+
// Arbitrary ID to identify the ephemeral key
|
|
83
|
+
const ephId = uuidv4();
|
|
78
84
|
// Create a client that connects to the backend service
|
|
79
85
|
const wpClient = await createWalletProviderService(clusterConfig);
|
|
80
86
|
|
|
81
87
|
// Create EOA authenticator, signature will include epk
|
|
82
88
|
const eoaAuth = new EOAAuth(
|
|
89
|
+
ephId,
|
|
83
90
|
accountsFromBrowserWallet[0],
|
|
84
91
|
new BrowserWallet(),
|
|
85
92
|
ephPK,
|
|
@@ -91,7 +98,7 @@ const eoaAuth = new EOAAuth(
|
|
|
91
98
|
const sdk = new NetworkSigner(wpClient, threshold, partiesNumber, eoaAuth);
|
|
92
99
|
```
|
|
93
100
|
|
|
94
|
-
Now you can generate a key, using the [
|
|
101
|
+
Now you can generate a key, using the [generateKey](./docs/walletprovider-sdk.networksigner.authenticateandcreatekey.md) method. The method accepts optional permissions. No permissions means _allow all operations_.
|
|
95
102
|
|
|
96
103
|
```ts
|
|
97
104
|
const permissions = {
|
|
@@ -110,12 +117,60 @@ const permissions = {
|
|
|
110
117
|
};
|
|
111
118
|
|
|
112
119
|
// Generate a new key
|
|
113
|
-
let resp: KeygenResponse = await sdk.
|
|
120
|
+
let resp: KeygenResponse = await sdk.generateKey(JSON.stringify(permissions));
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Calling this method will cause to the Browser Wallet window to pop up, requesting the User to sign the request.
|
|
124
|
+
|
|
125
|
+
The returned [KeygenResponse](./docs/walletprovider-sdk.keygenresponse.md) contains `keyId` and `publicKey`. The `publicKey` is the public part of the key generated by Silent Network. Use the `keyId` in subsequent calls to sign.
|
|
126
|
+
|
|
127
|
+
The `esk` key can be later used by the frontend in subsequent signgen requests for authenticating.
|
|
128
|
+
|
|
129
|
+
### Authenticate with Passkey
|
|
130
|
+
We provide Passkey authentication via [PasskeyAuth](./docs/walletprovider-sdk.passkeyauth.md) module. Let's create the `NetworkSigner` with associated `PasskeyAuth` object.
|
|
131
|
+
|
|
132
|
+
```ts
|
|
133
|
+
// Generate ephemeral secret key esk
|
|
134
|
+
const sk = generateEphPrivateKey();
|
|
135
|
+
// Derive public part epk from esk
|
|
136
|
+
const ephPK = getEphPublicKey(sk);
|
|
137
|
+
// Arbitrary ID to identify the ephemeral key
|
|
138
|
+
const ephId = uuidv4();
|
|
139
|
+
// Create a client that connects to the backend service
|
|
140
|
+
const wpClient = await createWalletProviderService(clusterConfig);
|
|
141
|
+
// Here we configure the relying party for local development
|
|
142
|
+
const rpConfig: RelyingPartyConfig = {
|
|
143
|
+
rpId: 'localhost',
|
|
144
|
+
rpName: 'http://localhost:5173',
|
|
145
|
+
};
|
|
146
|
+
// Information about the owner of the passkey
|
|
147
|
+
const passkeyUser: PasskeyUser = {
|
|
148
|
+
id: userId,
|
|
149
|
+
displayName: 'Alice',
|
|
150
|
+
name: 'alice@gmail.com ' + userId, // For development purposes
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
// Get passkey credential id from your storage
|
|
154
|
+
const credentialId = getPasskeyCredentialId();
|
|
155
|
+
// Create EOA authenticator, signature will include epk
|
|
156
|
+
const passkeyAuth = new PasskeyAuth(
|
|
157
|
+
rpConfig,
|
|
158
|
+
passkeyUser,
|
|
159
|
+
ephId,
|
|
160
|
+
ephPK,
|
|
161
|
+
// Lifetime of one hour
|
|
162
|
+
60 * 60,
|
|
163
|
+
// If credentialId is null, we will do passkey register, otherwise, we will do passkey auth/login
|
|
164
|
+
credentialId,
|
|
165
|
+
);
|
|
166
|
+
|
|
167
|
+
// Create a new signer instance
|
|
168
|
+
const sdk = new NetworkSigner(wpClient, threshold, partiesNumber, passkeyAuth);
|
|
114
169
|
```
|
|
115
170
|
|
|
116
|
-
|
|
171
|
+
Now you can generate a key like in the EOA example by calling the [generateKey](./docs/walletprovider-sdk.networksigner.authenticateandcreatekey.md) method.
|
|
117
172
|
|
|
118
|
-
|
|
173
|
+
Calling this method will prompt the browser to request Passkey User Verification. Once user verification is done, the [KeygenResponse](./docs/walletprovider-sdk.keygenresponse.md) is returned.
|
|
119
174
|
|
|
120
175
|
The `esk` key can be later used by the frontend in subsequent signgen requests for authenticating.
|
|
121
176
|
|
|
@@ -125,81 +180,67 @@ The full signing example is [here](https://github.com/silence-laboratories/walle
|
|
|
125
180
|
|
|
126
181
|
Let's create NetworkSigner for signing. Note the `EphAuth` is used to avoid user interaction when generating the signatures.
|
|
127
182
|
```ts
|
|
128
|
-
const authModule = new EphAuth(
|
|
183
|
+
const authModule = new EphAuth(ephId, ephSK);
|
|
129
184
|
// Create a new signer instance
|
|
130
185
|
const sdk = new NetworkSigner(wpClient, threshold, partiesNumber, authModule);
|
|
131
186
|
```
|
|
132
187
|
|
|
133
188
|
|
|
134
|
-
Use the [NetworkSigner.
|
|
189
|
+
Use the [NetworkSigner.signMessage](./docs/walletprovider-sdk.networksigner.authenticateandsign.md) method in order to generate a signature.
|
|
135
190
|
|
|
136
191
|
```ts
|
|
137
192
|
let signMessage = JSON.stringify({
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
193
|
+
message: JSON.stringify({
|
|
194
|
+
userOperation: {
|
|
195
|
+
sender: '0x8d4cb2540d993fe34c646299f1ab4af3012ff34c',
|
|
196
|
+
nonce: '0x7',
|
|
197
|
+
initCode: '0x',
|
|
198
|
+
callData: '0000189...',
|
|
199
|
+
callGasLimit: '0x18473',
|
|
200
|
+
verificationGasLimit: '0x18473',
|
|
201
|
+
preVerificationGas: '66768',
|
|
202
|
+
maxFeePerGas: '',
|
|
203
|
+
maxPriorityFeePerGas: '',
|
|
204
|
+
paymasterAndData: '0x',
|
|
205
|
+
},
|
|
206
|
+
entryPointVersion: 'v0.6.0',
|
|
207
|
+
entryPointAddress: '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789',
|
|
208
|
+
chainId: 80002,
|
|
209
|
+
}),
|
|
210
|
+
requestType: 'accountAbstractionTx',
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
let resp = await sdk.signMessage(selectedKeyId, signMessage);
|
|
156
214
|
```
|
|
157
215
|
|
|
158
216
|
The [SignResponse](./docs/walletprovider-sdk.signresponse.md) contains the signature `sign` and the recovery ID `recid`.
|
|
159
217
|
|
|
160
|
-
# Developing the library
|
|
161
|
-
|
|
162
|
-
Audience of this section are library developers.
|
|
163
|
-
|
|
164
|
-
## Bun runtime is required
|
|
165
|
-
|
|
166
|
-
Install bun from https://bun.sh
|
|
167
218
|
|
|
168
219
|
## Install dependencies
|
|
169
220
|
|
|
170
221
|
```bash
|
|
171
|
-
|
|
222
|
+
npm install
|
|
172
223
|
```
|
|
173
224
|
|
|
174
225
|
## Build
|
|
175
226
|
|
|
176
227
|
```bash
|
|
177
|
-
|
|
228
|
+
npm run build
|
|
178
229
|
```
|
|
179
230
|
|
|
180
231
|
The output will be in the `dist` folder.
|
|
181
232
|
|
|
182
|
-
## Test
|
|
183
|
-
|
|
184
|
-
Create `*.test.ts` files and run tests with:
|
|
185
|
-
|
|
186
|
-
```bash
|
|
187
|
-
bun run test
|
|
188
|
-
# or watch test
|
|
189
|
-
bun run test:watch
|
|
190
|
-
```
|
|
191
|
-
|
|
192
233
|
## End to end tests
|
|
193
234
|
Please refer to [README.md](./e2e-tests/README.md) for instructions how to execute them.
|
|
194
235
|
|
|
195
236
|
## Format the code
|
|
196
237
|
|
|
197
238
|
```bash
|
|
198
|
-
|
|
239
|
+
npm run format
|
|
199
240
|
```
|
|
200
241
|
|
|
201
242
|
## Generate the documentation
|
|
202
243
|
|
|
203
244
|
```bash
|
|
204
|
-
|
|
205
|
-
```
|
|
245
|
+
npm run docs
|
|
246
|
+
```
|
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
/** Externally Owned Account (EOA) atuhentication. Uses secret key stored on a wallet to sign requests.
|
|
2
2
|
* The requests are presented to the user in a readable form by using TypedData (EIP712).
|
|
3
3
|
*/
|
|
4
|
-
import { KeygenSetupOpts
|
|
5
|
-
import { type UserAuthentication } from './authentication
|
|
4
|
+
import { KeygenSetupOpts } from './networkSigner';
|
|
5
|
+
import { type UserAuthentication } from './authentication';
|
|
6
6
|
import { type TypedDataDomain } from 'viem';
|
|
7
|
-
|
|
8
|
-
eoa: string;
|
|
9
|
-
ephPK: string;
|
|
10
|
-
expiry: number;
|
|
11
|
-
};
|
|
7
|
+
import { EphClaim } from './ephemeralAuthentication';
|
|
12
8
|
export type FieldDefinition = {
|
|
13
9
|
name: string;
|
|
14
10
|
type: string;
|
|
@@ -50,23 +46,12 @@ export interface IBrowserWallet {
|
|
|
50
46
|
signTypedData<T>(from: string, request: TypedData<T>): Promise<unknown>;
|
|
51
47
|
}
|
|
52
48
|
/** Present the request to the User using wallet UI, and ask for sign.
|
|
53
|
-
* The signature is the authorization for
|
|
49
|
+
* The signature is the authorization for keygen operation
|
|
54
50
|
*/
|
|
55
|
-
export declare function authenticateUsingEOA({ setup,
|
|
51
|
+
export declare function authenticateUsingEOA({ setup, eoa, challenge, browserWallet, ephClaim, }: {
|
|
56
52
|
setup: KeygenSetupOpts;
|
|
57
|
-
|
|
53
|
+
eoa: string;
|
|
58
54
|
challenge: string;
|
|
59
55
|
browserWallet: IBrowserWallet;
|
|
60
|
-
|
|
61
|
-
lifetime: number;
|
|
62
|
-
}): Promise<UserAuthentication>;
|
|
63
|
-
/** Present the request to the User using wallet UI, and ask for sign.
|
|
64
|
-
* The signature is the authorization for the operation
|
|
65
|
-
*/
|
|
66
|
-
export declare function authenticateUsingEphKey({ setup, user_id, challenge, ephSK, ephPK, }: {
|
|
67
|
-
setup: SignSetupOpts;
|
|
68
|
-
user_id: string;
|
|
69
|
-
challenge: string;
|
|
70
|
-
ephSK: Uint8Array;
|
|
71
|
-
ephPK: Uint8Array;
|
|
56
|
+
ephClaim: EphClaim;
|
|
72
57
|
}): Promise<UserAuthentication>;
|
package/dist/authentication.d.ts
CHANGED
|
@@ -1,17 +1,13 @@
|
|
|
1
|
-
import { KeygenSetupOpts, SignSetupOpts } from './networkSigner';
|
|
1
|
+
import { AddEphemeralKeyOpts, KeygenSetupOpts, SignSetupOpts } from './networkSigner';
|
|
2
2
|
import { IBrowserWallet } from './EOAauthentication';
|
|
3
|
+
import { PasskeyUser, RelyingPartyConfig } from './passkeyAuthentication';
|
|
4
|
+
import { EphClaim } from './ephemeralAuthentication';
|
|
3
5
|
/** Type of the request authentication
|
|
4
6
|
* @alpha
|
|
5
7
|
*/
|
|
6
|
-
export declare enum AuthMethod {
|
|
7
|
-
/** Authentication using Externally Owned Account */
|
|
8
|
-
EOA = 0,
|
|
9
|
-
/** No authentication */
|
|
10
|
-
NONE = 1
|
|
11
|
-
}
|
|
12
8
|
export type UserCredentials = {
|
|
13
9
|
id: string;
|
|
14
|
-
method:
|
|
10
|
+
method: 'eoa' | 'ephemeral' | 'passkey';
|
|
15
11
|
credentials: string;
|
|
16
12
|
};
|
|
17
13
|
export type UserAuthentication = {
|
|
@@ -20,50 +16,98 @@ export type UserAuthentication = {
|
|
|
20
16
|
};
|
|
21
17
|
export interface AuthModule {
|
|
22
18
|
authenticate({ setup, challenge, }: {
|
|
23
|
-
setup: KeygenSetupOpts | SignSetupOpts;
|
|
19
|
+
setup: KeygenSetupOpts | SignSetupOpts | AddEphemeralKeyOpts;
|
|
24
20
|
challenge: string;
|
|
25
21
|
}): Promise<UserAuthentication>;
|
|
26
22
|
}
|
|
27
|
-
|
|
23
|
+
export interface DkgAuthModule extends AuthModule {
|
|
24
|
+
get ephClaim(): EphClaim;
|
|
25
|
+
}
|
|
26
|
+
/** The `EOAAuth` implementing Externally Owned Account authentication.
|
|
28
27
|
* @alpha
|
|
29
28
|
*/
|
|
30
|
-
export declare class EOAAuth implements
|
|
31
|
-
/** User ID, typically the ETH address that is used to do authentication */
|
|
32
|
-
userId: string;
|
|
29
|
+
export declare class EOAAuth implements DkgAuthModule {
|
|
33
30
|
/** An interface to the wallet, like MetaMask, that is used to sign the requests */
|
|
34
|
-
browserWallet
|
|
35
|
-
/**
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
|
|
39
|
-
|
|
31
|
+
private browserWallet;
|
|
32
|
+
/** the ETH address that is used to do EOA authentication */
|
|
33
|
+
private eoa;
|
|
34
|
+
/** Ephemeral key claim */
|
|
35
|
+
ephClaim: EphClaim;
|
|
36
|
+
/**
|
|
37
|
+
*
|
|
38
|
+
* @param ephId - Ephemeral key ID
|
|
39
|
+
* @param eoa - Ethereum address
|
|
40
|
+
* @param browserWallet - Interface to the wallet provider, like MetaMask, that is used to sign the requests
|
|
41
|
+
* @param ephPK - Ephemeral public key
|
|
42
|
+
* @param lifetime - Lifetime of the ephemeral key. Default is 1 hour
|
|
43
|
+
*/
|
|
44
|
+
constructor(ephId: string, eoa: string, browserWallet: IBrowserWallet, ephPK: Uint8Array, lifetime: number);
|
|
45
|
+
private validateInputs;
|
|
40
46
|
/**
|
|
41
47
|
* Prepares a message to present on the Browser Wallet window and requests to sign it.
|
|
42
|
-
* @param setup -
|
|
48
|
+
* @param setup - Keygen setup options
|
|
43
49
|
* @param challenge - the challenge received from the backend
|
|
44
50
|
*
|
|
45
51
|
* @public
|
|
46
52
|
*/
|
|
47
|
-
authenticate({ setup, challenge
|
|
48
|
-
setup: KeygenSetupOpts
|
|
53
|
+
authenticate({ setup, challenge }: {
|
|
54
|
+
setup: KeygenSetupOpts;
|
|
49
55
|
challenge: string;
|
|
50
56
|
}): Promise<UserAuthentication>;
|
|
51
57
|
}
|
|
52
|
-
/**
|
|
58
|
+
/** The `EphAuth` module is only used for signing requests to the network.
|
|
59
|
+
* @alpha
|
|
60
|
+
* An Ephmeral key used to locally sign the signature requests to network.
|
|
53
61
|
* This eph key is registered during keygen. The key is used to sign the requests without
|
|
54
62
|
* asking the user to sign the request each time.
|
|
55
|
-
* The auth module is only used for signing requests to the network.
|
|
56
63
|
* */
|
|
57
64
|
export declare class EphAuth implements AuthModule {
|
|
58
|
-
/** User ID, typically the ETH address that is used to do authentication */
|
|
59
|
-
userId: string;
|
|
60
65
|
/** Secret key of the ephemeral keypair */
|
|
61
|
-
ephSK
|
|
62
|
-
/**
|
|
63
|
-
|
|
64
|
-
|
|
66
|
+
private ephSK;
|
|
67
|
+
/** Ephemeral key claim */
|
|
68
|
+
private ephClaim;
|
|
69
|
+
/**
|
|
70
|
+
*
|
|
71
|
+
* @param ephId - Ephemeral key ID
|
|
72
|
+
* @param ephSK - Ephemeral secret key
|
|
73
|
+
*/
|
|
74
|
+
constructor(ephId: string, ephSK: Uint8Array);
|
|
75
|
+
/**
|
|
76
|
+
* Prepares a message to present on the Browser Wallet window and requests to sign it.
|
|
77
|
+
* @param setup - Signgen setup options
|
|
78
|
+
* @param challenge - the challenge received from the backend
|
|
79
|
+
*
|
|
80
|
+
* @public
|
|
81
|
+
*/
|
|
82
|
+
authenticate({ setup, challenge }: {
|
|
83
|
+
setup: SignSetupOpts;
|
|
84
|
+
challenge: string;
|
|
85
|
+
}): Promise<UserAuthentication>;
|
|
86
|
+
}
|
|
87
|
+
/** The `AuthModule` implementing Passkey authentication.
|
|
88
|
+
* @alpha
|
|
89
|
+
*/
|
|
90
|
+
export declare class PasskeyAuth implements DkgAuthModule {
|
|
91
|
+
/** Replying party object. Read more: https://developer.mozilla.org/en-US/docs/Web/API/PublicKeyCredentialCreationOptions#rp */
|
|
92
|
+
private rpConfig;
|
|
93
|
+
/** ID of the acceptable credential by user. App proves that user has passkey credential by passing the value of this field */
|
|
94
|
+
private allowCredentialId;
|
|
95
|
+
/** Passkey user information, only requires while registering. Read more: https://developer.mozilla.org/en-US/docs/Web/API/PublicKeyCredentialCreationOptions#user */
|
|
96
|
+
private user;
|
|
97
|
+
/** Ephemeral key claim */
|
|
98
|
+
ephClaim: EphClaim;
|
|
99
|
+
/**
|
|
100
|
+
*
|
|
101
|
+
* @param rpConfig - Passkey relying party configuration. Read more: https://developer.mozilla.org/en-US/docs/Web/API/PublicKeyCredentialCreationOptions#rp
|
|
102
|
+
* @param user - Passkey user information, only requires while registering. Read more: https://developer.mozilla.org/en-US/docs/Web/API/PublicKeyCredentialCreationOptions#user
|
|
103
|
+
* @param allowCredentialId - ID of the acceptable credential by user. App proves that user has passkey credential by passing the value of this field
|
|
104
|
+
* @param ephId - Ephemeral key ID
|
|
105
|
+
* @param ephPK - Ephemeral public key
|
|
106
|
+
* @param lifetime - Lifetime of the ephemeral key. Default is 1 hour
|
|
107
|
+
*/
|
|
108
|
+
constructor(rpConfig: RelyingPartyConfig, user: PasskeyUser | null, allowCredentialId: string | null, ephId: string, ephPK: Uint8Array, lifetime: number);
|
|
65
109
|
authenticate({ setup, challenge, }: {
|
|
66
|
-
setup: KeygenSetupOpts |
|
|
110
|
+
setup: KeygenSetupOpts | AddEphemeralKeyOpts;
|
|
67
111
|
challenge: string;
|
|
68
112
|
}): Promise<UserAuthentication>;
|
|
69
113
|
}
|
package/dist/encoding.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
export declare const decodeHex: (s: string) => Uint8Array;
|
|
2
|
-
export declare const encodeHex: (a: Uint8Array) => string;
|
|
3
1
|
export declare const decodeBase64: (b64: string) => Uint8Array;
|
|
4
2
|
export declare const encodeBase64: (b: Uint8Array) => string;
|
|
3
|
+
export declare const arrayBufferToBase64Url: (a: ArrayBuffer) => string;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { UserAuthentication } from './authentication';
|
|
2
|
+
import { SignSetupOpts } from './networkSigner';
|
|
3
|
+
export declare class EphClaim {
|
|
4
|
+
ephId: string;
|
|
5
|
+
ephPK: string;
|
|
6
|
+
expiry: number;
|
|
7
|
+
constructor(ephId: string, ephPK: Uint8Array, lifetime?: number);
|
|
8
|
+
private validateInputs;
|
|
9
|
+
toJSON(): string;
|
|
10
|
+
}
|
|
11
|
+
/** Locally sign the signature requests to network without asking the user, the ephSK is registered during keygen.
|
|
12
|
+
* The signature is the authorization for signgen operation
|
|
13
|
+
*/
|
|
14
|
+
export declare function authenticateUsingEphKey({ setup, challenge, ephSK, ephClaim, }: {
|
|
15
|
+
setup: SignSetupOpts;
|
|
16
|
+
challenge: string;
|
|
17
|
+
ephSK: Uint8Array;
|
|
18
|
+
ephClaim: EphClaim;
|
|
19
|
+
}): Promise<UserAuthentication>;
|
|
20
|
+
export declare function generateEphPrivateKey(): Uint8Array;
|
|
21
|
+
export declare function getEphPublicKey(ephSK: Uint8Array): Uint8Array;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var S=Object.defineProperty;var Q=Object.getOwnPropertyDescriptor;var G=Object.getOwnPropertyNames;var z=Object.prototype.hasOwnProperty;var Y=(n,e,t)=>e in n?S(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t;var X=(n,e)=>{for(var t in e)S(n,t,{get:e[t],enumerable:!0})},Z=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of G(e))!z.call(n,i)&&i!==t&&S(n,i,{get:()=>e[i],enumerable:!(r=Q(e,i))||r.enumerable});return n};var j=n=>Z(S({},"__esModule",{value:!0}),n);var s=(n,e,t)=>Y(n,typeof e!="symbol"?e+"":e,t);var se={};X(se,{EOAAuth:()=>I,EphAuth:()=>E,NetworkSigner:()=>C,PasskeyAuth:()=>K,WalletProviderServiceClient:()=>A,computeAddress:()=>V,generateEphPrivateKey:()=>q,getEphPublicKey:()=>B});module.exports=j(se);var U=require("js-base64");var R=n=>btoa(String.fromCodePoint.apply(null,Array.from(n))),c=n=>U.Base64.fromUint8Array(new Uint8Array(n),!0);var h=(n,e)=>{u(typeof e!="string",`${n} must be string`),u((e==null?void 0:e.trim().length)===0,`${n} cannot be empty`)},w=n=>{u(!(n instanceof Uint8Array),"key must be an Uint8Array"),u(n.length!==32,"ed25519: key length must be 32 bytes")},u=(n,e)=>{if(n)throw new Error(e)};var A=class{constructor(e){s(this,"walletProviderId");s(this,"walletProviderUrl");s(this,"passkeyCredentialId");this.walletProviderId=e.walletProviderId,this.walletProviderUrl=e.walletProviderUrl}getWalletId(){return this.walletProviderId}async startKeygen({setup:e,authModule:t}){return this.connect(e,t).then(r=>{var p,l;let i=r.split(":");u(i.length!==2,"Invalid keygen response from network");let a=(p=i[0])==null?void 0:p.split("=")[1];return{publicKey:(l=i[1])==null?void 0:l.split("=")[1],keyId:a,passkeyCredentialId:this.passkeyCredentialId}})}async startSigngen({setup:e,authModule:t}){return this.connect(e,t).then(r=>{var p,l;let i=r.split(":");u(i.length!==2,"Invalid signgen response from network");let a=(p=i[0])==null?void 0:p.split("=")[1],o=(l=i[1])==null?void 0:l.split("=")[1];if(a===void 0||o===void 0)throw new Error("Invalid signgen response from network");return{sign:a,recid:parseInt(o)}})}async addEphemeralKey({setup:e,authModule:t}){return this.connect(e,t).then(r=>({status:r}))}connect(e,t){return new Promise((r,i)=>{let a=0,o=e.queryPath;o==="signgen"&&(e.message=R(new TextEncoder().encode(e.message)));let p=new WebSocket(`${this.walletProviderUrl}/${o}`);p.addEventListener("open",l=>{switch(console.debug(`Connection opened in state ${a} with event ${JSON.stringify(l,void 0," ")}`),a){case 0:a=1,p.send(JSON.stringify(e));break;case 1:case 2:a=3,i("Incorrect protocol state");break;case 3:break}}),p.addEventListener("message",async l=>{switch(console.debug(`Connection message in state ${a} with event ${JSON.stringify(l,void 0," ")}`),a){case 0:a=3,i("Incorrect protocol state");break;case 1:{a=2;try{let d=await t.authenticate({setup:e,challenge:l.data});d.credentials.method==="passkey"&&(this.passkeyCredentialId=d.credentials.id),p.send(JSON.stringify(d))}catch(d){i(d)}break}case 2:a=3,p.close(),r(l.data);break;case 3:break}}),p.addEventListener("error",l=>{console.debug(`Connection error in state ${a} with event ${JSON.stringify(l,void 0," ")}`),a!=3&&(a=3,i("Incorrect protocol state"))}),p.addEventListener("close",l=>{console.debug(`Connection closed in state ${a} with event ${JSON.stringify(l,void 0," ")}`),a!=3&&(a=3,i("Incorrect protocol state"))})})}};var ee=1,T=2,te=3,M=[{name:"tag",type:"uint16"},{name:"value",type:"string"}],g=class{constructor({t:e,n:t,key_label:r,permissions:i}){s(this,"t");s(this,"n");s(this,"key_label");s(this,"metadata");this.t=e,this.n=t,r&&(this.key_label=r),this.metadata=[],i&&this.metadata.push({tag:ee,value:i})}set ephClaim(e){this.metadata.push({tag:T,value:e.toJSON()})}get queryPath(){return"keygen"}get requestSchema(){return{Request:[{name:"setup",type:"KeygenSetupOpts"},{name:"challenge",type:"string"}],KeygenSetupOpts:[{name:"t",type:"uint32"},{name:"n",type:"uint32"},{name:"metadata",type:"TaggedValue[]"}],TaggedValue:M}}},b=class{constructor({t:e,key_id:t,message:r}){s(this,"t");s(this,"key_id");s(this,"message");this.t=e,this.key_id=t,this.message=r}get queryPath(){return"signgen"}},f=class{constructor({n:e,key_id:t}){s(this,"n");s(this,"key_id");s(this,"metadata");this.n=e,this.key_id=t,this.metadata=[],this.metadata.push({tag:te,value:t})}set ephClaim(e){this.metadata.push({tag:T,value:e.toJSON()})}get queryPath(){return"addEphemeralKey"}get requestSchema(){return{Request:[{name:"setup",type:"AddEphemeralKeyOpts"},{name:"challenge",type:"string"}],AddEphemeralKeyOpts:[{name:"n",type:"uint32"},{name:"metadata",type:"TaggedValue[]"}],TaggedValue:M}}},C=class{constructor(e,t,r,i){s(this,"authModule");s(this,"threshold");s(this,"totalNodes");s(this,"wp_client");u(t<2,`Threshold = ${t} must be at least 2`),u(r<t,`Total nodes = ${r} must be greater or equal to threshold = ${t}`),this.threshold=t,this.totalNodes=r,this.authModule=i,this.wp_client=e}async generateKey(e){let t=new g({t:this.threshold,n:this.totalNodes,permissions:e,key_label:void 0});return this.setEphClaimOf(t),await this.wp_client.startKeygen({setup:t,authModule:this.authModule})}async signMessage(e,t){h("keyId",e),h("message",t);let r=new b({t:this.threshold,key_id:e,message:t});return await this.wp_client.startSigngen({setup:r,authModule:this.authModule})}async addEphemeralKey(e){h("keyId",e);let t=new f({n:this.totalNodes,key_id:e});return this.setEphClaimOf(t),await this.wp_client.addEphemeralKey({setup:t,authModule:this.authModule})}setEphClaimOf(e){e.ephClaim=this.authModule.ephClaim}};var ne={name:"SilentShard authentication",version:"0.1.0"},re=[{name:"name",type:"string"},{name:"version",type:"string"}];function ie(n,e,t){let r;return n instanceof g?r=new g({t:n.t,n:n.n,key_label:n.key_label,permissions:void 0}):r=new f({n:n.n,key_id:n.key_id}),r.ephClaim=t,{types:{EIP712Domain:re,...n.requestSchema},domain:ne,primaryType:"Request",message:{setup:r,challenge:e}}}async function N({setup:n,eoa:e,challenge:t,browserWallet:r,ephClaim:i}){let a=ie(n,t,i),o=await r.signTypedData(e,a);return{credentials:{credentials:i.toJSON(),method:"eoa",id:e},signature:o}}var W=require("@noble/curves/ed25519");var O=require("js-base64"),k=require("viem");async function D({user:n,challenge:e,rpConfig:t,ephClaim:r}){let i=(0,k.hexToBytes)(`0x${e}`,{size:32}),a={publicKey:{authenticatorSelection:{residentKey:"preferred",userVerification:"required"},challenge:i,excludeCredentials:[],pubKeyCredParams:[{type:"public-key",alg:-7},{type:"public-key",alg:-257}],rp:{name:t.rpName,id:t.rpId},user:{...n,id:O.Base64.toUint8Array(n.id)}}},o=await navigator.credentials.create(a);if(o===null)throw new Error("No credential returned");let p=c(o.response.attestationObject),d={rawCredential:JSON.stringify({authenticatorAttachment:o.authenticatorAttachment,id:o.id,rawId:c(o.rawId),response:{attestationObject:p,clientDataJSON:c(o.response.clientDataJSON)},type:o.type}),origin:t.rpName,rpId:t.rpId};return{credentials:{credentials:r.toJSON(),method:"passkey",id:o.id},signature:JSON.stringify(d)}}async function J({challenge:n,allowCredentialId:e,rpConfig:t,ephClaim:r}){let i=(0,k.hexToBytes)(`0x${n}`,{size:32}),a=e?[{type:"public-key",id:O.Base64.toUint8Array(e)}]:[],o={publicKey:{userVerification:"required",challenge:i,allowCredentials:a}},p=await navigator.credentials.get(o);if(p===null)throw new Error("Failed to get navigator credentials");let l=p.response,d=l.userHandle;if(d===null)throw new Error("User handle cannot be null");let H=c(l.signature),L={rawCredential:JSON.stringify({authenticatorAttachment:p.authenticatorAttachment,id:p.id,rawId:c(p.rawId),response:{authenticatorData:c(l.authenticatorData),clientDataJSON:c(l.clientDataJSON),signature:H,userHandle:c(d)},type:p.type}),origin:t.rpName,rpId:t.rpId};return{credentials:{credentials:r.toJSON(),method:"passkey",id:p.id},signature:JSON.stringify(L)}}var x=require("viem"),P=require("@noble/curves/ed25519");var m=class{constructor(e,t,r=3600){s(this,"ephId");s(this,"ephPK");s(this,"expiry");this.validateInputs(e,t,r),this.ephId=e,this.ephPK=(0,x.toHex)(t),this.expiry=Math.floor(Date.now()/1e3)+r}validateInputs(e,t,r){h("ephId",e),w(t),u(Number.isInteger(r)===!1,"lifetime must be an integer");let i=r>0&&r<=365*24*60*60;u(!i,"lifetime must be greater than 0 and less than or equal to 365 days")}toJSON(){return JSON.stringify({ephId:this.ephId,ephPK:this.ephPK,expiry:this.expiry})}};async function _({setup:n,challenge:e,ephSK:t,ephClaim:r}){let i={setup:n,challenge:e},a=new TextEncoder,o=(0,x.toHex)(P.ed25519.sign(a.encode(JSON.stringify(i)),t));return{credentials:{credentials:r.toJSON(),method:"ephemeral",id:r.ephId},signature:o}}function q(){return P.ed25519.utils.randomPrivateKey()}function B(n){return P.ed25519.getPublicKey(n)}var $=require("viem");var I=class{constructor(e,t,r,i,a){s(this,"browserWallet");s(this,"eoa");s(this,"ephClaim");this.validateInputs(t,r),this.ephClaim=new m(e,i,a),this.browserWallet=r,this.eoa=t}validateInputs(e,t){u(!(0,$.isAddress)(e),"invalid Ethereum address format"),u(!((t==null?void 0:t.signTypedData)instanceof Function),"invalid browserWallet")}async authenticate({setup:e,challenge:t}){return await N({setup:e,eoa:this.eoa,challenge:t,browserWallet:this.browserWallet,ephClaim:this.ephClaim})}},E=class{constructor(e,t){s(this,"ephSK");s(this,"ephClaim");w(t),this.ephSK=t;let r=W.ed25519.getPublicKey(this.ephSK);this.ephClaim=new m(e,r)}async authenticate({setup:e,challenge:t}){return await _({setup:e,challenge:t,ephSK:this.ephSK,ephClaim:this.ephClaim})}},K=class{constructor(e,t,r,i,a,o){s(this,"rpConfig");s(this,"allowCredentialId");s(this,"user");s(this,"ephClaim");this.ephClaim=new m(i,a,o),this.rpConfig=e,this.user=t,this.allowCredentialId=r}async authenticate({setup:e,challenge:t}){let r=e.queryPath==="addEphemeralKey";if(this.allowCredentialId||r)return await J({allowCredentialId:this.allowCredentialId,challenge:t,rpConfig:this.rpConfig,ephClaim:this.ephClaim});if(this.user)return await D({user:this.user,challenge:t,rpConfig:this.rpConfig,ephClaim:this.ephClaim});throw new Error("Invalid arguments for passkey authentication")}};var v=require("viem/accounts"),F=require("@noble/curves/secp256k1");var y=require("viem");function V(n){if(n.startsWith("0x")&&(n=n.slice(2)),n.startsWith("04"))return(0,v.publicKeyToAddress)(`0x${n} `);if(n.startsWith("02")||n.startsWith("03")){let e=F.secp256k1.ProjectivePoint.fromHex(n).toHex(!1);return(0,v.publicKeyToAddress)(`0x${e}`)}else throw new Error("Invalid public key")}0&&(module.exports={EOAAuth,EphAuth,NetworkSigner,PasskeyAuth,WalletProviderServiceClient,computeAddress,generateEphPrivateKey,getEphPublicKey});
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
3
|
-
export type {
|
|
4
|
-
export type {
|
|
5
|
-
export { WalletProviderServiceClient } from './walletProviderServiceClient
|
|
6
|
-
export {
|
|
1
|
+
export type { SignResponse, KeygenResponse, AddEphemeralKeyResponse } from './networkSigner';
|
|
2
|
+
export type { IBrowserWallet, TypedData } from './EOAauthentication';
|
|
3
|
+
export type { ClientConfig, IWalletProviderServiceClient } from './walletProviderServiceClientInterface';
|
|
4
|
+
export type { PasskeyUser, RelyingPartyConfig } from './passkeyAuthentication';
|
|
5
|
+
export { WalletProviderServiceClient } from './walletProviderServiceClient';
|
|
6
|
+
export { NetworkSigner } from './networkSigner';
|
|
7
|
+
export { EOAAuth, EphAuth, PasskeyAuth } from './authentication';
|
|
8
|
+
export { computeAddress } from './viemSigner';
|
|
9
|
+
export { generateEphPrivateKey, getEphPublicKey } from './ephemeralAuthentication';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var $=Object.defineProperty,F=Object.defineProperties;var V=Object.getOwnPropertyDescriptors;var O=Object.getOwnPropertySymbols;var H=Object.prototype.hasOwnProperty,L=Object.prototype.propertyIsEnumerable;var w=(n,e,t)=>e in n?$(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t,y=(n,e)=>{for(var t in e||(e={}))H.call(e,t)&&w(n,t,e[t]);if(O)for(var t of O(e))L.call(e,t)&&w(n,t,e[t]);return n},A=(n,e)=>F(n,V(e));var s=(n,e,t)=>w(n,typeof e!="symbol"?e+"":e,t);import{Base64 as Q}from"js-base64";var k=n=>btoa(String.fromCodePoint.apply(null,Array.from(n))),c=n=>Q.fromUint8Array(new Uint8Array(n),!0);var h=(n,e)=>{u(typeof e!="string","".concat(n," must be string")),u((e==null?void 0:e.trim().length)===0,"".concat(n," cannot be empty"))},S=n=>{u(!(n instanceof Uint8Array),"key must be an Uint8Array"),u(n.length!==32,"ed25519: key length must be 32 bytes")},u=(n,e)=>{if(n)throw new Error(e)};var C=class{constructor(e){s(this,"walletProviderId");s(this,"walletProviderUrl");s(this,"passkeyCredentialId");this.walletProviderId=e.walletProviderId,this.walletProviderUrl=e.walletProviderUrl}getWalletId(){return this.walletProviderId}async startKeygen({setup:e,authModule:t}){return this.connect(e,t).then(r=>{var p,l;let i=r.split(":");u(i.length!==2,"Invalid keygen response from network");let a=(p=i[0])==null?void 0:p.split("=")[1];return{publicKey:(l=i[1])==null?void 0:l.split("=")[1],keyId:a,passkeyCredentialId:this.passkeyCredentialId}})}async startSigngen({setup:e,authModule:t}){return this.connect(e,t).then(r=>{var p,l;let i=r.split(":");u(i.length!==2,"Invalid signgen response from network");let a=(p=i[0])==null?void 0:p.split("=")[1],o=(l=i[1])==null?void 0:l.split("=")[1];if(a===void 0||o===void 0)throw new Error("Invalid signgen response from network");return{sign:a,recid:parseInt(o)}})}async addEphemeralKey({setup:e,authModule:t}){return this.connect(e,t).then(r=>({status:r}))}connect(e,t){return new Promise((r,i)=>{let a=0,o=e.queryPath;o==="signgen"&&(e.message=k(new TextEncoder().encode(e.message)));let p=new WebSocket("".concat(this.walletProviderUrl,"/").concat(o));p.addEventListener("open",l=>{switch(console.debug("Connection opened in state ".concat(a," with event ").concat(JSON.stringify(l,void 0," "))),a){case 0:a=1,p.send(JSON.stringify(e));break;case 1:case 2:a=3,i("Incorrect protocol state");break;case 3:break}}),p.addEventListener("message",async l=>{switch(console.debug("Connection message in state ".concat(a," with event ").concat(JSON.stringify(l,void 0," "))),a){case 0:a=3,i("Incorrect protocol state");break;case 1:{a=2;try{let d=await t.authenticate({setup:e,challenge:l.data});d.credentials.method==="passkey"&&(this.passkeyCredentialId=d.credentials.id),p.send(JSON.stringify(d))}catch(d){i(d)}break}case 2:a=3,p.close(),r(l.data);break;case 3:break}}),p.addEventListener("error",l=>{console.debug("Connection error in state ".concat(a," with event ").concat(JSON.stringify(l,void 0," "))),a!=3&&(a=3,i("Incorrect protocol state"))}),p.addEventListener("close",l=>{console.debug("Connection closed in state ".concat(a," with event ").concat(JSON.stringify(l,void 0," "))),a!=3&&(a=3,i("Incorrect protocol state"))})})}};var G=1,x=2,z=3,U=[{name:"tag",type:"uint16"},{name:"value",type:"string"}],g=class{constructor({t:e,n:t,key_label:r,permissions:i}){s(this,"t");s(this,"n");s(this,"key_label");s(this,"metadata");this.t=e,this.n=t,r&&(this.key_label=r),this.metadata=[],i&&this.metadata.push({tag:G,value:i})}set ephClaim(e){this.metadata.push({tag:x,value:e.toJSON()})}get queryPath(){return"keygen"}get requestSchema(){return{Request:[{name:"setup",type:"KeygenSetupOpts"},{name:"challenge",type:"string"}],KeygenSetupOpts:[{name:"t",type:"uint32"},{name:"n",type:"uint32"},{name:"metadata",type:"TaggedValue[]"}],TaggedValue:U}}},P=class{constructor({t:e,key_id:t,message:r}){s(this,"t");s(this,"key_id");s(this,"message");this.t=e,this.key_id=t,this.message=r}get queryPath(){return"signgen"}},f=class{constructor({n:e,key_id:t}){s(this,"n");s(this,"key_id");s(this,"metadata");this.n=e,this.key_id=t,this.metadata=[],this.metadata.push({tag:z,value:t})}set ephClaim(e){this.metadata.push({tag:x,value:e.toJSON()})}get queryPath(){return"addEphemeralKey"}get requestSchema(){return{Request:[{name:"setup",type:"AddEphemeralKeyOpts"},{name:"challenge",type:"string"}],AddEphemeralKeyOpts:[{name:"n",type:"uint32"},{name:"metadata",type:"TaggedValue[]"}],TaggedValue:U}}},I=class{constructor(e,t,r,i){s(this,"authModule");s(this,"threshold");s(this,"totalNodes");s(this,"wp_client");u(t<2,"Threshold = ".concat(t," must be at least 2")),u(r<t,"Total nodes = ".concat(r," must be greater or equal to threshold = ").concat(t)),this.threshold=t,this.totalNodes=r,this.authModule=i,this.wp_client=e}async generateKey(e){let t=new g({t:this.threshold,n:this.totalNodes,permissions:e,key_label:void 0});return this.setEphClaimOf(t),await this.wp_client.startKeygen({setup:t,authModule:this.authModule})}async signMessage(e,t){h("keyId",e),h("message",t);let r=new P({t:this.threshold,key_id:e,message:t});return await this.wp_client.startSigngen({setup:r,authModule:this.authModule})}async addEphemeralKey(e){h("keyId",e);let t=new f({n:this.totalNodes,key_id:e});return this.setEphClaimOf(t),await this.wp_client.addEphemeralKey({setup:t,authModule:this.authModule})}setEphClaimOf(e){e.ephClaim=this.authModule.ephClaim}};var Y={name:"SilentShard authentication",version:"0.1.0"},X=[{name:"name",type:"string"},{name:"version",type:"string"}];function Z(n,e,t){let r;return n instanceof g?r=new g({t:n.t,n:n.n,key_label:n.key_label,permissions:void 0}):r=new f({n:n.n,key_id:n.key_id}),r.ephClaim=t,{types:y({EIP712Domain:X},n.requestSchema),domain:Y,primaryType:"Request",message:{setup:r,challenge:e}}}async function R({setup:n,eoa:e,challenge:t,browserWallet:r,ephClaim:i}){let a=Z(n,t,i),o=await r.signTypedData(e,a);return{credentials:{credentials:i.toJSON(),method:"eoa",id:e},signature:o}}import{ed25519 as te}from"@noble/curves/ed25519";import{Base64 as T}from"js-base64";import{hexToBytes as M}from"viem";async function N({user:n,challenge:e,rpConfig:t,ephClaim:r}){let i=M("0x".concat(e),{size:32}),a={publicKey:{authenticatorSelection:{residentKey:"preferred",userVerification:"required"},challenge:i,excludeCredentials:[],pubKeyCredParams:[{type:"public-key",alg:-7},{type:"public-key",alg:-257}],rp:{name:t.rpName,id:t.rpId},user:A(y({},n),{id:T.toUint8Array(n.id)})}},o=await navigator.credentials.create(a);if(o===null)throw new Error("No credential returned");let p=c(o.response.attestationObject),d={rawCredential:JSON.stringify({authenticatorAttachment:o.authenticatorAttachment,id:o.id,rawId:c(o.rawId),response:{attestationObject:p,clientDataJSON:c(o.response.clientDataJSON)},type:o.type}),origin:t.rpName,rpId:t.rpId};return{credentials:{credentials:r.toJSON(),method:"passkey",id:o.id},signature:JSON.stringify(d)}}async function D({challenge:n,allowCredentialId:e,rpConfig:t,ephClaim:r}){let i=M("0x".concat(n),{size:32}),a=e?[{type:"public-key",id:T.toUint8Array(e)}]:[],o={publicKey:{userVerification:"required",challenge:i,allowCredentials:a}},p=await navigator.credentials.get(o);if(p===null)throw new Error("Failed to get navigator credentials");let l=p.response,d=l.userHandle;if(d===null)throw new Error("User handle cannot be null");let B=c(l.signature),W={rawCredential:JSON.stringify({authenticatorAttachment:p.authenticatorAttachment,id:p.id,rawId:c(p.rawId),response:{authenticatorData:c(l.authenticatorData),clientDataJSON:c(l.clientDataJSON),signature:B,userHandle:c(d)},type:p.type}),origin:t.rpName,rpId:t.rpId};return{credentials:{credentials:r.toJSON(),method:"passkey",id:p.id},signature:JSON.stringify(W)}}import{toHex as J}from"viem";import{ed25519 as E}from"@noble/curves/ed25519";var m=class{constructor(e,t,r=3600){s(this,"ephId");s(this,"ephPK");s(this,"expiry");this.validateInputs(e,t,r),this.ephId=e,this.ephPK=J(t),this.expiry=Math.floor(Date.now()/1e3)+r}validateInputs(e,t,r){h("ephId",e),S(t),u(Number.isInteger(r)===!1,"lifetime must be an integer");let i=r>0&&r<=365*24*60*60;u(!i,"lifetime must be greater than 0 and less than or equal to 365 days")}toJSON(){return JSON.stringify({ephId:this.ephId,ephPK:this.ephPK,expiry:this.expiry})}};async function _({setup:n,challenge:e,ephSK:t,ephClaim:r}){let i={setup:n,challenge:e},a=new TextEncoder,o=J(E.sign(a.encode(JSON.stringify(i)),t));return{credentials:{credentials:r.toJSON(),method:"ephemeral",id:r.ephId},signature:o}}function j(){return E.utils.randomPrivateKey()}function ee(n){return E.getPublicKey(n)}import{isAddress as ne}from"viem";var K=class{constructor(e,t,r,i,a){s(this,"browserWallet");s(this,"eoa");s(this,"ephClaim");this.validateInputs(t,r),this.ephClaim=new m(e,i,a),this.browserWallet=r,this.eoa=t}validateInputs(e,t){u(!ne(e),"invalid Ethereum address format"),u(!((t==null?void 0:t.signTypedData)instanceof Function),"invalid browserWallet")}async authenticate({setup:e,challenge:t}){return await R({setup:e,eoa:this.eoa,challenge:t,browserWallet:this.browserWallet,ephClaim:this.ephClaim})}},v=class{constructor(e,t){s(this,"ephSK");s(this,"ephClaim");S(t),this.ephSK=t;let r=te.getPublicKey(this.ephSK);this.ephClaim=new m(e,r)}async authenticate({setup:e,challenge:t}){return await _({setup:e,challenge:t,ephSK:this.ephSK,ephClaim:this.ephClaim})}},b=class{constructor(e,t,r,i,a,o){s(this,"rpConfig");s(this,"allowCredentialId");s(this,"user");s(this,"ephClaim");this.ephClaim=new m(i,a,o),this.rpConfig=e,this.user=t,this.allowCredentialId=r}async authenticate({setup:e,challenge:t}){let r=e.queryPath==="addEphemeralKey";if(this.allowCredentialId||r)return await D({allowCredentialId:this.allowCredentialId,challenge:t,rpConfig:this.rpConfig,ephClaim:this.ephClaim});if(this.user)return await N({user:this.user,challenge:t,rpConfig:this.rpConfig,ephClaim:this.ephClaim});throw new Error("Invalid arguments for passkey authentication")}};import{publicKeyToAddress as q,toAccount as Ve}from"viem/accounts";import{secp256k1 as re}from"@noble/curves/secp256k1";import{hashMessage as ze,hashTypedData as Ye,keccak256 as Xe,serializeSignature as Ze,serializeTransaction as je,toHex as tt}from"viem";function ie(n){if(n.startsWith("0x")&&(n=n.slice(2)),n.startsWith("04"))return q("0x".concat(n," "));if(n.startsWith("02")||n.startsWith("03")){let e=re.ProjectivePoint.fromHex(n).toHex(!1);return q("0x".concat(e))}else throw new Error("Invalid public key")}export{K as EOAAuth,v as EphAuth,I as NetworkSigner,b as PasskeyAuth,C as WalletProviderServiceClient,ie as computeAddress,j as generateEphPrivateKey,ee as getEphPublicKey};
|
package/dist/networkSigner.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { AuthModule, UserAuthentication } from './authentication
|
|
2
|
-
import { type IWalletProviderServiceClient } from './walletProviderServiceClientInterface
|
|
1
|
+
import { AuthModule, UserAuthentication } from './authentication';
|
|
2
|
+
import { GetQueryPath, QueryPath, type IWalletProviderServiceClient } from './walletProviderServiceClientInterface';
|
|
3
|
+
import { EphClaim } from './ephemeralAuthentication';
|
|
3
4
|
/**
|
|
4
5
|
* Response from the network for keygen requests
|
|
5
6
|
* @alpha
|
|
@@ -19,6 +20,12 @@ export interface KeygenResponse {
|
|
|
19
20
|
* where Y is set to 0x02 if Y-coord is even, or 0x03 if Y-coord is odd
|
|
20
21
|
*/
|
|
21
22
|
publicKey: string;
|
|
23
|
+
/**
|
|
24
|
+
* Optional credential id used for passkey authentication.
|
|
25
|
+
*
|
|
26
|
+
* Returned by Authenticator.
|
|
27
|
+
*/
|
|
28
|
+
passkeyCredentialId?: string;
|
|
22
29
|
}
|
|
23
30
|
/**
|
|
24
31
|
* Response from the network for sign request
|
|
@@ -34,8 +41,15 @@ export interface SignResponse {
|
|
|
34
41
|
*/
|
|
35
42
|
recid: number;
|
|
36
43
|
}
|
|
44
|
+
/**
|
|
45
|
+
* Response from the network for adding ephemeral key request
|
|
46
|
+
* @alpha
|
|
47
|
+
*/
|
|
48
|
+
export interface AddEphemeralKeyResponse {
|
|
49
|
+
status: string;
|
|
50
|
+
}
|
|
37
51
|
/** Key parameters used during generation */
|
|
38
|
-
export declare class KeygenSetupOpts {
|
|
52
|
+
export declare class KeygenSetupOpts implements GetQueryPath {
|
|
39
53
|
/** Threshold, number of parties that needs to participate in a protocol in order to produce valid signature */
|
|
40
54
|
t: number;
|
|
41
55
|
/** Total number of nodes that participate in Key generation, must be greater or equal than `t` */
|
|
@@ -45,29 +59,75 @@ export declare class KeygenSetupOpts {
|
|
|
45
59
|
/** Metadata for a key. Currently they store the permissions, can be set in a constructor of this class.
|
|
46
60
|
If permissions are not set, all operations are allowed.
|
|
47
61
|
*/
|
|
48
|
-
metadata
|
|
49
|
-
|
|
50
|
-
value: string;
|
|
51
|
-
}[];
|
|
52
|
-
constructor({ t, n, key_label, permissions, ephPK, }: {
|
|
62
|
+
private metadata;
|
|
63
|
+
constructor({ t, n, key_label, permissions, }: {
|
|
53
64
|
t: number;
|
|
54
65
|
n: number;
|
|
55
|
-
key_label
|
|
56
|
-
permissions
|
|
57
|
-
ephPK?: string;
|
|
66
|
+
key_label: string | undefined;
|
|
67
|
+
permissions: string | undefined;
|
|
58
68
|
});
|
|
69
|
+
set ephClaim(ephClaim: EphClaim);
|
|
70
|
+
get queryPath(): QueryPath;
|
|
71
|
+
get requestSchema(): {
|
|
72
|
+
Request: {
|
|
73
|
+
name: string;
|
|
74
|
+
type: string;
|
|
75
|
+
}[];
|
|
76
|
+
KeygenSetupOpts: {
|
|
77
|
+
name: string;
|
|
78
|
+
type: string;
|
|
79
|
+
}[];
|
|
80
|
+
TaggedValue: {
|
|
81
|
+
name: string;
|
|
82
|
+
type: string;
|
|
83
|
+
}[];
|
|
84
|
+
};
|
|
59
85
|
}
|
|
60
86
|
/** Parameters used in Signature execution */
|
|
61
|
-
export
|
|
62
|
-
/**
|
|
87
|
+
export declare class SignSetupOpts implements GetQueryPath {
|
|
88
|
+
/** Number of nodes that will participate in the signature execution */
|
|
63
89
|
t: number;
|
|
64
90
|
/** Select the key using it's ID */
|
|
65
91
|
key_id: string;
|
|
66
92
|
/** The message to sign */
|
|
67
93
|
message: string;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
|
|
94
|
+
constructor({ t, key_id, message }: {
|
|
95
|
+
t: number;
|
|
96
|
+
key_id: string;
|
|
97
|
+
message: string;
|
|
98
|
+
});
|
|
99
|
+
get queryPath(): QueryPath;
|
|
100
|
+
}
|
|
101
|
+
export declare class AddEphemeralKeyOpts implements GetQueryPath {
|
|
102
|
+
/** Total number of nodes that participate in Adding Ephemeral Key */
|
|
103
|
+
n: number;
|
|
104
|
+
/** Select the key using it's ID */
|
|
105
|
+
key_id: string;
|
|
106
|
+
/** Metadata for a key. Currently they store the permissions, can be set in a constructor of this class.
|
|
107
|
+
If permissions are not set, all operations are allowed.
|
|
108
|
+
*/
|
|
109
|
+
private metadata;
|
|
110
|
+
constructor({ n, key_id }: {
|
|
111
|
+
n: number;
|
|
112
|
+
key_id: string;
|
|
113
|
+
});
|
|
114
|
+
set ephClaim(ephClaim: EphClaim);
|
|
115
|
+
get queryPath(): QueryPath;
|
|
116
|
+
get requestSchema(): {
|
|
117
|
+
Request: {
|
|
118
|
+
name: string;
|
|
119
|
+
type: string;
|
|
120
|
+
}[];
|
|
121
|
+
AddEphemeralKeyOpts: {
|
|
122
|
+
name: string;
|
|
123
|
+
type: string;
|
|
124
|
+
}[];
|
|
125
|
+
TaggedValue: {
|
|
126
|
+
name: string;
|
|
127
|
+
type: string;
|
|
128
|
+
}[];
|
|
129
|
+
};
|
|
130
|
+
}
|
|
71
131
|
/** The `user_authentication` contains signature over the `setup` parameter. */
|
|
72
132
|
export type UserAuthenticatedRequest<T> = {
|
|
73
133
|
setup: T;
|
|
@@ -94,23 +154,29 @@ export declare class NetworkSigner {
|
|
|
94
154
|
* @param authModule - Authentication module, used to get confirmation from the User before request execution
|
|
95
155
|
*/
|
|
96
156
|
constructor(wpClient: IWalletProviderServiceClient, threshold: number, totalNodes: number, authModule: AuthModule);
|
|
97
|
-
/**
|
|
98
|
-
* Uses `authModule` to
|
|
99
|
-
* @param ephKey - ephemeral key used to authenticate the user during the session.
|
|
157
|
+
/** Generate a distributed key that's generated by Silent Network.
|
|
158
|
+
* Uses `authModule` to authenticate the User with the Silent Network.
|
|
100
159
|
* @param permissions - optional permissions that will be stored in the key metadata.
|
|
101
160
|
* The permissions are validated during sign requests.
|
|
102
161
|
* @returns {@link KeygenResponse} containing `keyId` and the `pubKey` public part of the key
|
|
103
162
|
* @public
|
|
104
|
-
* @alpha
|
|
105
163
|
*/
|
|
106
|
-
|
|
107
|
-
/** Generate a signature
|
|
164
|
+
generateKey(permissions?: string): Promise<KeygenResponse>;
|
|
165
|
+
/** Generate a signature by the distributed key of Silent Network.
|
|
166
|
+
* Uses `authModule` to authenticate the sign request by the User.
|
|
108
167
|
* The network chooses `t` nodes to execute the protocol.
|
|
109
|
-
* @param keyId - the key id returned from `
|
|
168
|
+
* @param keyId - the key id returned from `keygen`
|
|
110
169
|
* @param message - the message to sign by the MPC network
|
|
111
170
|
* @returns {@link SignResponse}
|
|
112
171
|
* @public
|
|
113
|
-
* @alpha
|
|
114
172
|
*/
|
|
115
|
-
|
|
173
|
+
signMessage(keyId: string, message: string): Promise<SignResponse>;
|
|
174
|
+
/** Add new ephemeral key to an exist distributed key on the network.
|
|
175
|
+
* Uses `authModule` to authenticate the request by the User.
|
|
176
|
+
* @param keyId - the key id returned from `keygen`
|
|
177
|
+
* @returns {@link AddEphemeralKeyResponse}
|
|
178
|
+
* @public
|
|
179
|
+
*/
|
|
180
|
+
addEphemeralKey(keyId: string): Promise<AddEphemeralKeyResponse>;
|
|
181
|
+
private setEphClaimOf;
|
|
116
182
|
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { UserAuthentication } from './authentication';
|
|
2
|
+
import { EphClaim } from './ephemeralAuthentication';
|
|
3
|
+
/** Information about the user currently registering. Read more: https://w3c.github.io/webauthn/#dom-publickeycredentialcreationoptions-user
|
|
4
|
+
* @alpha
|
|
5
|
+
* */
|
|
6
|
+
export type PasskeyUser = {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
displayName: string;
|
|
10
|
+
};
|
|
11
|
+
/** The RP responsible for registering and authenticating the user. Read more: https://w3c.github.io/webauthn/#dom-publickeycredentialcreationoptions-rp
|
|
12
|
+
* @alpha
|
|
13
|
+
* */
|
|
14
|
+
export type RelyingPartyConfig = {
|
|
15
|
+
rpName: string;
|
|
16
|
+
rpId: string;
|
|
17
|
+
};
|
|
18
|
+
export declare function passkeyRegister({ user, challenge, rpConfig, ephClaim, }: {
|
|
19
|
+
user: PasskeyUser;
|
|
20
|
+
challenge: string;
|
|
21
|
+
rpConfig: RelyingPartyConfig;
|
|
22
|
+
ephClaim: EphClaim;
|
|
23
|
+
}): Promise<UserAuthentication>;
|
|
24
|
+
export declare function passkeyLogin({ challenge, allowCredentialId, rpConfig, ephClaim, }: {
|
|
25
|
+
challenge: string;
|
|
26
|
+
allowCredentialId: string | null;
|
|
27
|
+
rpConfig: RelyingPartyConfig;
|
|
28
|
+
ephClaim: EphClaim;
|
|
29
|
+
}): Promise<UserAuthentication>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"fileNames":["../node_modules/typescript/lib/lib.es5.d.ts","../node_modules/typescript/lib/lib.es2015.d.ts","../node_modules/typescript/lib/lib.es2016.d.ts","../node_modules/typescript/lib/lib.es2017.d.ts","../node_modules/typescript/lib/lib.es2018.d.ts","../node_modules/typescript/lib/lib.es2019.d.ts","../node_modules/typescript/lib/lib.es2020.d.ts","../node_modules/typescript/lib/lib.es2021.d.ts","../node_modules/typescript/lib/lib.es2022.d.ts","../node_modules/typescript/lib/lib.es2023.d.ts","../node_modules/typescript/lib/lib.esnext.d.ts","../node_modules/typescript/lib/lib.dom.d.ts","../node_modules/typescript/lib/lib.es2015.core.d.ts","../node_modules/typescript/lib/lib.es2015.collection.d.ts","../node_modules/typescript/lib/lib.es2015.generator.d.ts","../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../node_modules/typescript/lib/lib.es2015.promise.d.ts","../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../node_modules/typescript/lib/lib.es2016.intl.d.ts","../node_modules/typescript/lib/lib.es2017.date.d.ts","../node_modules/typescript/lib/lib.es2017.object.d.ts","../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2017.string.d.ts","../node_modules/typescript/lib/lib.es2017.intl.d.ts","../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../node_modules/typescript/lib/lib.es2018.intl.d.ts","../node_modules/typescript/lib/lib.es2018.promise.d.ts","../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../node_modules/typescript/lib/lib.es2019.array.d.ts","../node_modules/typescript/lib/lib.es2019.object.d.ts","../node_modules/typescript/lib/lib.es2019.string.d.ts","../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../node_modules/typescript/lib/lib.es2019.intl.d.ts","../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../node_modules/typescript/lib/lib.es2020.date.d.ts","../node_modules/typescript/lib/lib.es2020.promise.d.ts","../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2020.string.d.ts","../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2020.intl.d.ts","../node_modules/typescript/lib/lib.es2020.number.d.ts","../node_modules/typescript/lib/lib.es2021.promise.d.ts","../node_modules/typescript/lib/lib.es2021.string.d.ts","../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../node_modules/typescript/lib/lib.es2021.intl.d.ts","../node_modules/typescript/lib/lib.es2022.array.d.ts","../node_modules/typescript/lib/lib.es2022.error.d.ts","../node_modules/typescript/lib/lib.es2022.intl.d.ts","../node_modules/typescript/lib/lib.es2022.object.d.ts","../node_modules/typescript/lib/lib.es2022.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2022.string.d.ts","../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../node_modules/typescript/lib/lib.es2023.array.d.ts","../node_modules/typescript/lib/lib.es2023.collection.d.ts","../node_modules/typescript/lib/lib.es2023.intl.d.ts","../node_modules/typescript/lib/lib.esnext.array.d.ts","../node_modules/typescript/lib/lib.esnext.collection.d.ts","../node_modules/typescript/lib/lib.esnext.intl.d.ts","../node_modules/typescript/lib/lib.esnext.disposable.d.ts","../node_modules/typescript/lib/lib.esnext.string.d.ts","../node_modules/typescript/lib/lib.esnext.promise.d.ts","../node_modules/typescript/lib/lib.esnext.decorators.d.ts","../node_modules/typescript/lib/lib.esnext.object.d.ts","../node_modules/typescript/lib/lib.esnext.regexp.d.ts","../node_modules/typescript/lib/lib.esnext.iterator.d.ts","../node_modules/typescript/lib/lib.decorators.d.ts","../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../node_modules/@noble/curves/abstract/modular.d.ts","../node_modules/@noble/curves/abstract/curve.d.ts","../node_modules/@noble/curves/abstract/utils.d.ts","../node_modules/@noble/curves/abstract/edwards.d.ts","../node_modules/@noble/curves/abstract/hash-to-curve.d.ts","../node_modules/@noble/curves/abstract/montgomery.d.ts","../node_modules/@noble/curves/ed25519.d.ts","../node_modules/js-base64/base64.d.ts","../src/encoding.ts","../node_modules/abitype/dist/types/register.d.ts","../node_modules/abitype/dist/types/types.d.ts","../node_modules/abitype/dist/types/abi.d.ts","../node_modules/abitype/dist/types/errors.d.ts","../node_modules/abitype/dist/types/narrow.d.ts","../node_modules/abitype/dist/types/utils.d.ts","../node_modules/abitype/dist/types/human-readable/types/signatures.d.ts","../node_modules/abitype/dist/types/human-readable/formatAbiParameter.d.ts","../node_modules/abitype/dist/types/human-readable/formatAbiParameters.d.ts","../node_modules/abitype/dist/types/human-readable/formatAbiItem.d.ts","../node_modules/abitype/dist/types/human-readable/formatAbi.d.ts","../node_modules/abitype/dist/types/human-readable/types/utils.d.ts","../node_modules/abitype/dist/types/human-readable/types/structs.d.ts","../node_modules/abitype/dist/types/human-readable/parseAbi.d.ts","../node_modules/abitype/dist/types/human-readable/parseAbiItem.d.ts","../node_modules/abitype/dist/types/human-readable/parseAbiParameter.d.ts","../node_modules/abitype/dist/types/human-readable/parseAbiParameters.d.ts","../node_modules/abitype/dist/types/human-readable/errors/abiItem.d.ts","../node_modules/abitype/dist/types/human-readable/errors/abiParameter.d.ts","../node_modules/abitype/dist/types/human-readable/errors/signature.d.ts","../node_modules/abitype/dist/types/human-readable/errors/splitParameters.d.ts","../node_modules/abitype/dist/types/human-readable/errors/struct.d.ts","../node_modules/abitype/dist/types/exports/index.d.ts","../node_modules/webauthn-p256/_types/types.d.ts","../node_modules/webauthn-p256/_types/credential.d.ts","../node_modules/webauthn-p256/_types/publicKey.d.ts","../node_modules/webauthn-p256/_types/sign.d.ts","../node_modules/webauthn-p256/_types/utils.d.ts","../node_modules/webauthn-p256/_types/verify.d.ts","../node_modules/webauthn-p256/_types/index.d.ts","../node_modules/viem/_types/errors/utils.d.ts","../node_modules/viem/_types/accounts/utils/parseAccount.d.ts","../node_modules/viem/_types/types/utils.d.ts","../node_modules/@scure/bip32/lib/index.d.ts","../node_modules/viem/_types/types/account.d.ts","../node_modules/viem/_types/types/misc.d.ts","../node_modules/viem/_types/account-abstraction/types/entryPointVersion.d.ts","../node_modules/viem/_types/experimental/eip7702/types/authorization.d.ts","../node_modules/viem/_types/types/eip4844.d.ts","../node_modules/viem/_types/types/fee.d.ts","../node_modules/viem/_types/types/kzg.d.ts","../node_modules/viem/_types/types/log.d.ts","../node_modules/viem/_types/types/transaction.d.ts","../node_modules/viem/_types/types/contract.d.ts","../node_modules/viem/_types/types/multicall.d.ts","../node_modules/viem/_types/account-abstraction/types/userOperation.d.ts","../node_modules/viem/_types/account-abstraction/types/rpc.d.ts","../node_modules/viem/_types/types/withdrawal.d.ts","../node_modules/viem/_types/types/block.d.ts","../node_modules/viem/_types/experimental/eip7702/types/rpc.d.ts","../node_modules/viem/_types/types/proof.d.ts","../node_modules/viem/_types/types/rpc.d.ts","../node_modules/viem/_types/types/eip1193.d.ts","../node_modules/viem/_types/clients/transports/createTransport.d.ts","../node_modules/viem/_types/errors/base.d.ts","../node_modules/viem/_types/errors/fee.d.ts","../node_modules/viem/_types/utils/signature/recoverAddress.d.ts","../node_modules/viem/_types/utils/data/concat.d.ts","../node_modules/viem/_types/utils/data/isHex.d.ts","../node_modules/viem/_types/errors/data.d.ts","../node_modules/viem/_types/utils/data/pad.d.ts","../node_modules/viem/_types/errors/encoding.d.ts","../node_modules/viem/_types/utils/data/size.d.ts","../node_modules/viem/_types/utils/data/trim.d.ts","../node_modules/viem/_types/utils/encoding/fromHex.d.ts","../node_modules/viem/_types/utils/encoding/toHex.d.ts","../node_modules/viem/_types/utils/encoding/toBytes.d.ts","../node_modules/viem/_types/errors/cursor.d.ts","../node_modules/viem/_types/utils/cursor.d.ts","../node_modules/viem/_types/utils/encoding/toRlp.d.ts","../node_modules/viem/_types/utils/hash/keccak256.d.ts","../node_modules/viem/_types/experimental/eip7702/utils/hashAuthorization.d.ts","../node_modules/viem/_types/experimental/eip7702/utils/recoverAuthorizationAddress.d.ts","../node_modules/viem/_types/types/stateOverride.d.ts","../node_modules/viem/_types/errors/request.d.ts","../node_modules/viem/_types/errors/rpc.d.ts","../node_modules/viem/_types/utils/promise/createBatchScheduler.d.ts","../node_modules/viem/_types/utils/promise/withRetry.d.ts","../node_modules/viem/_types/utils/rpc/socket.d.ts","../node_modules/viem/_types/utils/buildRequest.d.ts","../node_modules/viem/_types/errors/estimateGas.d.ts","../node_modules/viem/_types/errors/transaction.d.ts","../node_modules/viem/_types/utils/transaction/getTransactionType.d.ts","../node_modules/viem/_types/utils/blob/blobsToCommitments.d.ts","../node_modules/viem/_types/utils/blob/blobsToProofs.d.ts","../node_modules/viem/_types/utils/hash/sha256.d.ts","../node_modules/viem/_types/utils/blob/commitmentToVersionedHash.d.ts","../node_modules/viem/_types/utils/blob/commitmentsToVersionedHashes.d.ts","../node_modules/viem/_types/errors/blob.d.ts","../node_modules/viem/_types/utils/blob/toBlobs.d.ts","../node_modules/viem/_types/utils/blob/toBlobSidecars.d.ts","../node_modules/viem/_types/experimental/eip7702/utils/serializeAuthorizationList.d.ts","../node_modules/viem/_types/errors/address.d.ts","../node_modules/viem/_types/errors/chain.d.ts","../node_modules/viem/_types/errors/node.d.ts","../node_modules/viem/_types/utils/lru.d.ts","../node_modules/viem/_types/utils/address/isAddress.d.ts","../node_modules/viem/_types/utils/transaction/assertTransaction.d.ts","../node_modules/viem/_types/utils/transaction/serializeAccessList.d.ts","../node_modules/viem/_types/utils/transaction/serializeTransaction.d.ts","../node_modules/viem/_types/accounts/utils/sign.d.ts","../node_modules/viem/_types/accounts/utils/signTransaction.d.ts","../node_modules/viem/_types/errors/account.d.ts","../node_modules/viem/_types/utils/chain/assertCurrentChain.d.ts","../node_modules/viem/_types/utils/errors/getTransactionError.d.ts","../node_modules/viem/_types/utils/formatters/formatter.d.ts","../node_modules/viem/_types/utils/formatters/transactionRequest.d.ts","../node_modules/viem/_types/utils/transaction/assertRequest.d.ts","../node_modules/viem/_types/actions/public/getChainId.d.ts","../node_modules/viem/_types/actions/wallet/sendRawTransaction.d.ts","../node_modules/viem/_types/actions/wallet/sendTransaction.d.ts","../node_modules/viem/_types/utils/errors/getNodeError.d.ts","../node_modules/viem/_types/utils/errors/getEstimateGasError.d.ts","../node_modules/viem/_types/actions/public/estimateGas.d.ts","../node_modules/viem/_types/errors/block.d.ts","../node_modules/viem/_types/utils/formatters/transaction.d.ts","../node_modules/viem/_types/utils/formatters/block.d.ts","../node_modules/viem/_types/actions/public/getBlock.d.ts","../node_modules/viem/_types/actions/public/getTransactionCount.d.ts","../node_modules/viem/_types/utils/nonceManager.d.ts","../node_modules/viem/_types/actions/wallet/prepareTransactionRequest.d.ts","../node_modules/viem/_types/actions/public/getGasPrice.d.ts","../node_modules/viem/_types/actions/public/estimateMaxPriorityFeePerGas.d.ts","../node_modules/viem/_types/actions/public/estimateFeesPerGas.d.ts","../node_modules/viem/_types/types/chain.d.ts","../node_modules/viem/_types/errors/abi.d.ts","../node_modules/viem/_types/utils/data/slice.d.ts","../node_modules/viem/_types/utils/hash/hashSignature.d.ts","../node_modules/viem/_types/utils/hash/normalizeSignature.d.ts","../node_modules/viem/_types/utils/hash/toSignature.d.ts","../node_modules/viem/_types/utils/hash/toSignatureHash.d.ts","../node_modules/viem/_types/utils/hash/toFunctionSelector.d.ts","../node_modules/viem/_types/utils/address/getAddress.d.ts","../node_modules/viem/_types/utils/encoding/fromBytes.d.ts","../node_modules/viem/_types/utils/abi/decodeAbiParameters.d.ts","../node_modules/viem/_types/utils/abi/formatAbiItem.d.ts","../node_modules/viem/_types/utils/abi/decodeErrorResult.d.ts","../node_modules/viem/_types/errors/contract.d.ts","../node_modules/viem/_types/utils/abi/getAbiItem.d.ts","../node_modules/viem/_types/utils/abi/decodeFunctionResult.d.ts","../node_modules/viem/_types/utils/abi/encodeAbiParameters.d.ts","../node_modules/viem/_types/utils/abi/encodeDeployData.d.ts","../node_modules/viem/_types/utils/abi/encodeFunctionData.d.ts","../node_modules/viem/_types/utils/chain/getChainContractAddress.d.ts","../node_modules/viem/_types/utils/errors/getCallError.d.ts","../node_modules/viem/_types/errors/stateOverride.d.ts","../node_modules/viem/_types/utils/stateOverride.d.ts","../node_modules/viem/_types/actions/public/call.d.ts","../node_modules/viem/_types/errors/ccip.d.ts","../node_modules/viem/_types/utils/ccip.d.ts","../node_modules/viem/_types/utils/ens/encodedLabelToLabelhash.d.ts","../node_modules/viem/_types/utils/ens/namehash.d.ts","../node_modules/viem/_types/utils/ens/encodeLabelhash.d.ts","../node_modules/viem/_types/utils/ens/labelhash.d.ts","../node_modules/viem/_types/utils/ens/packetToBytes.d.ts","../node_modules/viem/_types/utils/errors/getContractError.d.ts","../node_modules/viem/_types/actions/public/readContract.d.ts","../node_modules/viem/_types/actions/ens/getEnsAddress.d.ts","../node_modules/viem/_types/types/ens.d.ts","../node_modules/viem/_types/errors/ens.d.ts","../node_modules/viem/_types/utils/ens/avatar/utils.d.ts","../node_modules/viem/_types/utils/ens/avatar/parseAvatarRecord.d.ts","../node_modules/viem/_types/actions/ens/getEnsText.d.ts","../node_modules/viem/_types/actions/ens/getEnsAvatar.d.ts","../node_modules/viem/_types/actions/ens/getEnsName.d.ts","../node_modules/viem/_types/actions/ens/getEnsResolver.d.ts","../node_modules/viem/_types/types/filter.d.ts","../node_modules/viem/_types/actions/public/createBlockFilter.d.ts","../node_modules/viem/_types/errors/log.d.ts","../node_modules/viem/_types/utils/hash/toEventSelector.d.ts","../node_modules/viem/_types/utils/abi/encodeEventTopics.d.ts","../node_modules/viem/_types/actions/public/createContractEventFilter.d.ts","../node_modules/viem/_types/actions/public/createEventFilter.d.ts","../node_modules/viem/_types/actions/public/createPendingTransactionFilter.d.ts","../node_modules/viem/_types/actions/public/estimateContractGas.d.ts","../node_modules/viem/_types/actions/public/getBalance.d.ts","../node_modules/viem/_types/actions/public/getBlobBaseFee.d.ts","../node_modules/viem/_types/utils/promise/withCache.d.ts","../node_modules/viem/_types/actions/public/getBlockNumber.d.ts","../node_modules/viem/_types/actions/public/getBlockTransactionCount.d.ts","../node_modules/viem/_types/actions/public/getCode.d.ts","../node_modules/viem/_types/utils/abi/decodeEventLog.d.ts","../node_modules/viem/_types/utils/formatters/log.d.ts","../node_modules/viem/_types/actions/public/getLogs.d.ts","../node_modules/viem/_types/actions/public/getContractEvents.d.ts","../node_modules/viem/_types/errors/eip712.d.ts","../node_modules/viem/_types/actions/public/getEip712Domain.d.ts","../node_modules/viem/_types/utils/formatters/feeHistory.d.ts","../node_modules/viem/_types/actions/public/getFeeHistory.d.ts","../node_modules/viem/_types/actions/public/getFilterChanges.d.ts","../node_modules/viem/_types/actions/public/getFilterLogs.d.ts","../node_modules/viem/_types/utils/formatters/proof.d.ts","../node_modules/viem/_types/actions/public/getProof.d.ts","../node_modules/viem/_types/actions/public/getStorageAt.d.ts","../node_modules/viem/_types/actions/public/getTransaction.d.ts","../node_modules/viem/_types/utils/formatters/transactionReceipt.d.ts","../node_modules/viem/_types/actions/public/getTransactionConfirmations.d.ts","../node_modules/viem/_types/actions/public/getTransactionReceipt.d.ts","../node_modules/viem/_types/actions/public/multicall.d.ts","../node_modules/viem/_types/actions/wallet/writeContract.d.ts","../node_modules/viem/_types/actions/public/simulateContract.d.ts","../node_modules/viem/_types/actions/public/uninstallFilter.d.ts","../node_modules/viem/_types/utils/signature/hashMessage.d.ts","../node_modules/viem/_types/actions/public/verifyHash.d.ts","../node_modules/viem/_types/actions/public/verifyMessage.d.ts","../node_modules/viem/_types/types/typedData.d.ts","../node_modules/viem/_types/utils/typedData.d.ts","../node_modules/viem/_types/utils/signature/hashTypedData.d.ts","../node_modules/viem/_types/actions/public/verifyTypedData.d.ts","../node_modules/viem/_types/utils/observe.d.ts","../node_modules/viem/_types/clients/transports/fallback.d.ts","../node_modules/viem/_types/types/transport.d.ts","../node_modules/viem/_types/utils/poll.d.ts","../node_modules/viem/_types/actions/public/watchBlockNumber.d.ts","../node_modules/viem/_types/actions/public/waitForTransactionReceipt.d.ts","../node_modules/viem/_types/utils/stringify.d.ts","../node_modules/viem/_types/actions/public/watchBlocks.d.ts","../node_modules/viem/_types/actions/public/watchContractEvent.d.ts","../node_modules/viem/_types/actions/public/watchEvent.d.ts","../node_modules/viem/_types/actions/public/watchPendingTransactions.d.ts","../node_modules/viem/_types/utils/siwe/types.d.ts","../node_modules/viem/_types/utils/siwe/validateSiweMessage.d.ts","../node_modules/viem/_types/actions/siwe/verifySiweMessage.d.ts","../node_modules/viem/_types/clients/decorators/public.d.ts","../node_modules/viem/_types/actions/wallet/addChain.d.ts","../node_modules/viem/_types/actions/wallet/deployContract.d.ts","../node_modules/viem/_types/actions/wallet/getAddresses.d.ts","../node_modules/viem/_types/actions/wallet/getPermissions.d.ts","../node_modules/viem/_types/actions/wallet/requestAddresses.d.ts","../node_modules/viem/_types/actions/wallet/requestPermissions.d.ts","../node_modules/viem/_types/accounts/utils/signMessage.d.ts","../node_modules/viem/_types/actions/wallet/signMessage.d.ts","../node_modules/viem/_types/actions/wallet/signTransaction.d.ts","../node_modules/viem/_types/accounts/utils/signTypedData.d.ts","../node_modules/viem/_types/actions/wallet/signTypedData.d.ts","../node_modules/viem/_types/actions/wallet/switchChain.d.ts","../node_modules/viem/_types/actions/wallet/watchAsset.d.ts","../node_modules/viem/_types/clients/decorators/wallet.d.ts","../node_modules/viem/_types/clients/createClient.d.ts","../node_modules/viem/_types/account-abstraction/accounts/types.d.ts","../node_modules/viem/_types/accounts/utils/signAuthorization.d.ts","../node_modules/viem/_types/accounts/types.d.ts","../node_modules/viem/_types/actions/getContract.d.ts","../node_modules/viem/_types/actions/test/dumpState.d.ts","../node_modules/viem/_types/actions/test/getAutomine.d.ts","../node_modules/viem/_types/actions/test/getTxpoolContent.d.ts","../node_modules/viem/_types/actions/test/getTxpoolStatus.d.ts","../node_modules/viem/_types/actions/test/impersonateAccount.d.ts","../node_modules/viem/_types/actions/test/increaseTime.d.ts","../node_modules/viem/_types/actions/test/inspectTxpool.d.ts","../node_modules/viem/_types/actions/test/loadState.d.ts","../node_modules/viem/_types/actions/test/mine.d.ts","../node_modules/viem/_types/actions/test/reset.d.ts","../node_modules/viem/_types/actions/test/revert.d.ts","../node_modules/viem/_types/actions/test/sendUnsignedTransaction.d.ts","../node_modules/viem/_types/actions/test/setBalance.d.ts","../node_modules/viem/_types/actions/test/setBlockGasLimit.d.ts","../node_modules/viem/_types/actions/test/setBlockTimestampInterval.d.ts","../node_modules/viem/_types/actions/test/setCode.d.ts","../node_modules/viem/_types/actions/test/setCoinbase.d.ts","../node_modules/viem/_types/actions/test/setIntervalMining.d.ts","../node_modules/viem/_types/actions/test/setMinGasPrice.d.ts","../node_modules/viem/_types/actions/test/setNextBlockBaseFeePerGas.d.ts","../node_modules/viem/_types/actions/test/setNextBlockTimestamp.d.ts","../node_modules/viem/_types/actions/test/setNonce.d.ts","../node_modules/viem/_types/actions/test/setStorageAt.d.ts","../node_modules/viem/_types/actions/test/stopImpersonatingAccount.d.ts","../node_modules/viem/_types/clients/decorators/test.d.ts","../node_modules/viem/_types/clients/createTestClient.d.ts","../node_modules/viem/_types/actions/test/dropTransaction.d.ts","../node_modules/viem/_types/actions/test/snapshot.d.ts","../node_modules/viem/_types/actions/test/removeBlockTimestampInterval.d.ts","../node_modules/viem/_types/actions/test/setAutomine.d.ts","../node_modules/viem/_types/actions/test/setLoggingEnabled.d.ts","../node_modules/viem/_types/actions/test/setRpcUrl.d.ts","../node_modules/viem/_types/clients/transports/custom.d.ts","../node_modules/viem/_types/errors/transport.d.ts","../node_modules/viem/_types/utils/promise/withTimeout.d.ts","../node_modules/viem/_types/utils/rpc/http.d.ts","../node_modules/viem/_types/clients/transports/http.d.ts","../node_modules/viem/_types/clients/createPublicClient.d.ts","../node_modules/viem/_types/clients/createWalletClient.d.ts","../node_modules/viem/_types/utils/rpc/webSocket.d.ts","../node_modules/viem/_types/clients/transports/webSocket.d.ts","../node_modules/viem/_types/constants/abis.d.ts","../node_modules/viem/_types/constants/address.d.ts","../node_modules/viem/_types/constants/contracts.d.ts","../node_modules/viem/_types/constants/unit.d.ts","../node_modules/viem/_types/constants/number.d.ts","../node_modules/viem/_types/constants/bytes.d.ts","../node_modules/viem/_types/constants/strings.d.ts","../node_modules/viem/_types/errors/unit.d.ts","../node_modules/viem/_types/errors/typedData.d.ts","../node_modules/viem/_types/utils/abi/decodeDeployData.d.ts","../node_modules/viem/_types/utils/abi/decodeFunctionData.d.ts","../node_modules/viem/_types/utils/abi/encodeErrorResult.d.ts","../node_modules/viem/_types/utils/abi/prepareEncodeFunctionData.d.ts","../node_modules/viem/_types/utils/abi/encodeFunctionResult.d.ts","../node_modules/viem/_types/utils/abi/parseEventLogs.d.ts","../node_modules/viem/_types/utils/data/isBytes.d.ts","../node_modules/viem/_types/utils/address/getContractAddress.d.ts","../node_modules/viem/_types/utils/transaction/getSerializedTransactionType.d.ts","../node_modules/viem/_types/utils/signature/compactSignatureToSignature.d.ts","../node_modules/viem/_types/utils/signature/parseCompactSignature.d.ts","../node_modules/viem/_types/utils/signature/parseSignature.d.ts","../node_modules/viem/_types/utils/signature/recoverMessageAddress.d.ts","../node_modules/viem/_types/utils/signature/recoverPublicKey.d.ts","../node_modules/viem/_types/utils/signature/serializeSignature.d.ts","../node_modules/viem/_types/utils/signature/recoverTransactionAddress.d.ts","../node_modules/viem/_types/utils/signature/recoverTypedDataAddress.d.ts","../node_modules/viem/_types/utils/signature/signatureToCompactSignature.d.ts","../node_modules/viem/_types/utils/signature/serializeCompactSignature.d.ts","../node_modules/viem/_types/utils/address/isAddressEqual.d.ts","../node_modules/viem/_types/utils/signature/verifyHash.d.ts","../node_modules/viem/_types/utils/signature/verifyMessage.d.ts","../node_modules/viem/_types/utils/signature/verifyTypedData.d.ts","../node_modules/viem/_types/utils/signature/isErc6492Signature.d.ts","../node_modules/viem/_types/utils/signature/parseErc6492Signature.d.ts","../node_modules/viem/_types/utils/signature/serializeErc6492Signature.d.ts","../node_modules/viem/_types/utils/blob/sidecarsToVersionedHashes.d.ts","../node_modules/viem/_types/utils/blob/fromBlobs.d.ts","../node_modules/viem/_types/utils/kzg/defineKzg.d.ts","../node_modules/viem/_types/utils/kzg/setupKzg.d.ts","../node_modules/viem/_types/utils/chain/defineChain.d.ts","../node_modules/viem/_types/utils/chain/extractChain.d.ts","../node_modules/viem/_types/utils/abi/encodePacked.d.ts","../node_modules/viem/_types/utils/unit/formatUnits.d.ts","../node_modules/viem/_types/utils/unit/formatEther.d.ts","../node_modules/viem/_types/utils/unit/formatGwei.d.ts","../node_modules/viem/_types/utils/encoding/fromRlp.d.ts","../node_modules/viem/_types/utils/hash/toEventSignature.d.ts","../node_modules/viem/_types/utils/hash/toFunctionSignature.d.ts","../node_modules/viem/_types/utils/hash/toEventHash.d.ts","../node_modules/viem/_types/utils/hash/toFunctionHash.d.ts","../node_modules/viem/_types/utils/signature/toPrefixedMessage.d.ts","../node_modules/viem/_types/utils/hash/isHash.d.ts","../node_modules/viem/_types/utils/hash/ripemd160.d.ts","../node_modules/viem/_types/utils/unit/parseUnits.d.ts","../node_modules/viem/_types/utils/unit/parseEther.d.ts","../node_modules/viem/_types/utils/unit/parseGwei.d.ts","../node_modules/viem/_types/utils/transaction/parseTransaction.d.ts","../node_modules/viem/_types/index.d.ts","../src/validator.ts","../src/ephemeralAuthentication.ts","../src/passkeyAuthentication.ts","../src/authentication.ts","../src/walletProviderServiceClientInterface.ts","../src/networkSigner.ts","../src/EOAauthentication.ts","../src/walletProviderServiceClient.ts","../node_modules/@scure/bip39/wordlists/czech.d.ts","../node_modules/@scure/bip39/wordlists/english.d.ts","../node_modules/@scure/bip39/wordlists/french.d.ts","../node_modules/@scure/bip39/wordlists/italian.d.ts","../node_modules/@scure/bip39/wordlists/japanese.d.ts","../node_modules/@scure/bip39/wordlists/korean.d.ts","../node_modules/@scure/bip39/wordlists/portuguese.d.ts","../node_modules/@scure/bip39/wordlists/simplified-chinese.d.ts","../node_modules/@scure/bip39/wordlists/spanish.d.ts","../node_modules/@scure/bip39/wordlists/traditional-chinese.d.ts","../node_modules/viem/_types/accounts/wordlists.d.ts","../node_modules/viem/_types/accounts/generateMnemonic.d.ts","../node_modules/viem/_types/accounts/generatePrivateKey.d.ts","../node_modules/viem/_types/accounts/toAccount.d.ts","../node_modules/viem/_types/accounts/utils/publicKeyToAddress.d.ts","../node_modules/viem/_types/accounts/privateKeyToAccount.d.ts","../node_modules/viem/_types/accounts/hdKeyToAccount.d.ts","../node_modules/viem/_types/accounts/mnemonicToAccount.d.ts","../node_modules/viem/_types/accounts/utils/privateKeyToAddress.d.ts","../node_modules/viem/_types/accounts/index.d.ts","../node_modules/@noble/curves/abstract/weierstrass.d.ts","../node_modules/@noble/curves/secp256k1.d.ts","../src/viemSigner.ts","../src/index.ts","../node_modules/@types/argparse/index.d.ts","../node_modules/@types/estree/index.d.ts","../node_modules/@types/json-schema/index.d.ts","../node_modules/@types/eslint/use-at-your-own-risk.d.ts","../node_modules/@types/eslint/index.d.ts","../node_modules/@types/eslint-plugin-security/index.d.ts","../node_modules/@types/triple-beam/index.d.ts"],"fileIdsList":[[74],[74,75,76],[75,76,77,78,79],[74,76,78,453],[461],[458,459,460],[83,84],[84],[83,85,86,87,88,90,91,92,93,96,97,98,99,100,101,102,103,104],[86],[85,86,89],[85,86],[85,92],[85,89,91],[84,85,89],[84,85,90],[84,85,89,94,95],[84,85,87,89,94,95],[84,85],[84,85,89,94],[83,84,85,89,95],[83,84,85],[105,112,115,118,119,128,202,288,321],[322],[118,119,128],[105,115,118,119,124,125,126,127],[113],[113,118,148],[113,117,148,324,448],[105,114,116,183,184,202,313,316,323,324,390,443,444,445,446,447,448,449,450,451],[113,324,449],[113,118,148,183,184,202,313,316,324,446,447],[105,113,175,179,324],[105,115,117,118,120,125,165,182,202,288,322,323],[105,113,324],[105,113,118,148,447],[105,113,118,153,215],[113,115,118,120,154,183],[113,118,183,285],[113,118,125,153,165,182,183],[105,113,118,183,288,290],[433,434,435,436,437,438,439,440,441,442],[105,113,115,136,146,148,207,222,225,226,234,237,239,321],[113,115,136,207,241,244,245,321],[105,113,115,136,148,207,226,237,239,321],[105,115,136,148,207,222,225,226,234,237,239,321],[105,113,115,126,136,207,239,254,257,267,282,283,300,321,324],[105,113,114,115,118,131,136,148,156,159,162,189,190,207,220,222,224,225,226,227,229,321,324],[113,136,162,207,249,321],[105,113,126,131,136,148,162,207,249,253,321],[105,113,115,126,131,136,148,162,207,249,253,321],[105,114,115,126,136,196,207,225,238,321,324],[113,117,122,131,136,138,203,204,205,207,321],[105,114,115,131,136,148,155,156,162,189,190,195,207,321,324],[113,117,131,136,138,147,162,200,203,204,207,321],[105,113,131,136,148,162,207,321],[113,136,162,207,321,324],[113,115,118,131,136,148,162,197,199,207,321,324],[113,136,162,207,260,321],[113,118,131,136,147,148,162,207,321],[113,136,147,162,207,321,324],[105,113,118,131,136,148,162,207,321],[105,113,118,124,126,131,136,207,221,266,321],[105,113,115,118,136,239,268,321],[122,131,136,148,162,207,270,321],[105,113,118,124,131,136,162,207,249,264,265,321],[105,113,124,131,136,162,207,249,264,265,321],[105,113,118,124,126,131,136,148,162,207,253,264,265,321],[105,113,118,131,133,136,148,162,207,274,321],[113,115,118,131,136,148,162,198,207,321],[113,118,136,207,261,277,278,321],[105,113,131,136,147,148,162,207,321,324],[113,118,136,162,164,207,278,321,424],[105,113,126,127,136,207,222,225,226,230,238,239,321],[105,115,126,136,207,222,225,230,238,321],[105,113,114,115,117,118,125,126,136,207,222,225,230,238,282,321],[105,113,115,118,136,141,144,148,207,224,230,321],[105,113,115,118,136,207,285,286,321],[105,113,118,136,207,286,288,290,321],[113,118,125,136,160,200,207,277,280,292,296,321],[113,136,207,261,294,295,321],[113,131,136,200,207,294,295,298,321],[105,113,124,126,131,136,207,292,294,298,321],[113,118,136,207,292,294,298,321],[113,115,118,136,207,285,286,304,321],[113,117,118,136,162,207,351],[113,117,136,162,207,351],[105,113,117,134,136,162,207,351],[105,113,117,136,162,207,351],[113,117,134,136,162,207,351],[113,117,118,136,162,189,207,351],[105,113,117,118,136,162,207,351],[113,136,148,162,207,321,324],[105,113,115,118,126,136,193,207,321,324],[105,113,136,162,207,215,321,324],[113,135,136,162,207,321,324],[105,114,115,117,123,125,136,165,185,189,190,196,200,201,202,206,207,321,324],[105,113,136,162,207,321,324],[113,115,135,136,162,207,321,324],[113,118,125,136,162,207,321],[105,113,114,115,117,118,123,136,155,162,184,185,186,187,189,190,191,192,203,207,321,324],[113,114,117,118,136,148,162,207,313,321,324],[113,114,115,117,123,125,136,148,162,165,184,186,189,190,191,207,321,324],[105,113,114,117,118,136,141,162,185,207,288,289,298,316,321,324],[105,113,114,115,117,118,126,136,185,189,193,207,225,238,283,321,324],[105,113,114,115,117,135,136,207,232,306,320,324],[105,113,115,117,135,136,207,306,321],[105,113,115,117,135,136,207,321,324,350],[105,113,115,117,135,136,207,320,321,324],[105,117,122,126,131,136,191,192,196,200,201,203,204,205,206,207,230,239,240,245,246,247,248,249,250,254,255,256,257,258,259,261,262,263,266,267,269,271,272,273,275,276,277,279,280,281,283,284,287,291,296,297,299,300,301,302,305,321],[117,134,136,207,321,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,351,352],[105,126,136,191,192,193,203,207,282,307,308,309,310,311,312,314,315,317,318,319,321,324],[113,135,207,321],[113,136],[113,136,207],[113,136,359,361],[113,118,134,136,161,359,365],[105,118,137],[137],[118,137],[137,207],[105,118,137,207,219,230],[105,137],[137,196,207,324],[115,137],[137,156],[118,125,131,137,193,207,324],[105],[105,115,118],[105,118],[113,118,120,140,148,149,152,153],[105,113,115,118,120,139,154],[113,120],[105,115,117,118,121,122,123,124,125,126,127,129,130,131,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,152,153,156,157,158,160,163,164,165,166,167,168,169,170,172,173,175,176,177,179,180,181,182,186,189,190,191,192,193,196,197,198,199,200,201,202,203,204,205,206,207,208,209,214,215,216,217,219,220,221,222,223,224,225,226,228,230,232,234,236,238,239,240,241,242,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261,262,263,264,265,266,267,269,271,272,273,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,293,294,296,297,298,299,300,301,302,306,307,308,309,310,311,312,314,315,317,318,319,320,321,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,362,363,364,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423],[105,115,116,324],[105,118,125,130],[105,115,117,122,125,136,182,199,203,206,321],[105,115,118,125],[105,115,118,129,131,134],[118],[115],[105,115,118,126,131,135],[105,115,118,125,324],[105,118,126],[105,115,126],[105,115,118,122,124,125,131,132,133],[105,115,118,120,121,122,123,124],[115,136,293],[105,115],[105,113,118,145,146,148,149,151,208,209,215,216],[105,113,118,126,208,217],[105,113,115,118,126,208,214,217,218],[105,113,115,118,126,208,217,218,252],[105,113,115,118,126,208,209,214,217,218],[105,113,115,118,126,208,217,221],[105,113,118,140,143,145,148,175,179,208,209],[105,113,115,118,126,140,208,223],[105,113,115,118,126,140,214,218,221,223],[105,113,115,118,126,149,153,208,218,221,223,251,252],[105,113,115,118,126,140,208,214,218,221,223],[105,113,115,118,126,208,221,223],[105,113,118,140,143,148,175,179,208],[105,113,126,208],[105,113,115,118,126,141,179,208,214],[105,113,124,126,134,264],[105,113,115,118,126,140,208,214,218,221],[105,113,149,153,179],[105,113,118,140,143,149,152,153,209,215,382],[105,113,178],[105,113,175],[113,118,123,148,149],[113,118,148,168],[113,118,169],[113,118,148,149,151],[113,118,121,169],[113,115,118,121,123,166,167,172],[113,118,145,148,149,151,171],[113,135,157,158,159,160,161],[105,113,118,136,157,207,230,231,321],[113,176,207],[115,207],[113,207],[176,207],[113,118,150],[113,118],[113,118,142],[113,118,141],[113,118,141,142,145],[113,118,146,147,148],[113,118,144,145,146,149],[113,118,137,144,148,149,151,152],[113,118,141,143,147,148],[113,118,143,144,147],[113,136,207,241,243,321],[105,113,136,207,239,241,242,321],[113,148,149,153,233],[113,140,148,149,153,233],[113,118,149,235,236],[113,194,207,220,230],[105,113,220],[113,163,194,196,207,324],[115,137,177,193],[113,164,193,194,207,324],[113,115,118,131,134,188,198,207],[113,122,134],[113,115],[113,115,124,134],[113,115,133,134],[113,115,125,131,134,188,207],[113,115,125,134,188,207],[113,149,153],[113,118,141,145],[113,118,141,148,149],[213],[113,213],[212],[105,113,209,213],[105,113,211],[105,113,210,212],[113,123],[113,404],[105,115,321],[113,115,134,157,360],[113,134,159],[161],[113,118,148,149],[113,118,153],[105,113,118,148,153,223,288,289],[113,118,209],[105,113,115,118,217,399],[105,113,118],[105,113,118,139,285],[113,118,141,147],[105,113,118,125,139,153,182,390],[105,113,118,139,288,290],[113,118,147],[113,118,147,148],[113,118,140,148],[105,113,118,139,215,395],[105,113,118,215,388,395],[105,113,118,215,288,392,395],[105,115,303],[134,142,148,156,175,228],[113,114,115,164,175,177,193,207],[113,125,137,171,175,176,177,179],[113,115,125,147,164,209,424],[113,115,125,164,424],[113,115,118,125,141,143,147,152,164,175,179,180,384,412],[113,118,125,152,164,175,179],[113,115,118,125,140,148,152,164,165,166,167,170,173,174,180,181],[105,113,118,145,148,179,288,290],[409],[113,420],[106],[106,107,108,109,110,111],[424,426,428,430],[80,424,425,426,427,430,431],[81],[80,424,425,428,430],[426,427,428,429,430,431,432,455],[425,426,428,429],[81,82,424,426,428],[82,424,430,452,454],[82,425,428,429,430],[428,430]],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"5514e54f17d6d74ecefedc73c504eadffdeda79c7ea205cf9febead32d45c4bc","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"abee51ebffafd50c07d76be5848a34abfe4d791b5745ef1e5648718722fab924","impliedFormat":1},{"version":"9e8ca8ed051c2697578c023d9c29d6df689a083561feba5c14aedee895853999","affectsGlobalScope":true,"impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"45d8ccb3dfd57355eb29749919142d4321a0aa4df6acdfc54e30433d7176600a","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1a94697425a99354df73d9c8291e2ecd4dddd370aed4023c2d6dee6cccb32666","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3f9fc0ec0b96a9e642f11eda09c0be83a61c7b336977f8b9fdb1e9788e925fe","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3d7b04b45033f57351c8434f60b6be1ea71a2dfec2d0a0c3c83badbb0e3e693","affectsGlobalScope":true,"impliedFormat":1},{"version":"956d27abdea9652e8368ce029bb1e0b9174e9678a273529f426df4b3d90abd60","affectsGlobalScope":true,"impliedFormat":1},{"version":"4fa6ed14e98aa80b91f61b9805c653ee82af3502dc21c9da5268d3857772ca05","affectsGlobalScope":true,"impliedFormat":1},{"version":"e6633e05da3ff36e6da2ec170d0d03ccf33de50ca4dc6f5aeecb572cedd162fb","affectsGlobalScope":true,"impliedFormat":1},{"version":"15c1c3d7b2e46e0025417ed6d5f03f419e57e6751f87925ca19dc88297053fe6","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"caccc56c72713969e1cfe5c3d44e5bab151544d9d2b373d7dbe5a1e4166652be","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"9d540251809289a05349b70ab5f4b7b99f922af66ab3c39ba56a475dcf95d5ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"0b11f3ca66aa33124202c80b70cd203219c3d4460cfc165e0707aa9ec710fc53","affectsGlobalScope":true,"impliedFormat":1},{"version":"6a3f5a0129cc80cf439ab71164334d649b47059a4f5afca90282362407d0c87f","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"61d6a2092f48af66dbfb220e31eea8b10bc02b6932d6e529005fd2d7b3281290","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"987339ae38c9341b0d90da7350e543c0d561d04b540f29a6912d387ffee30123","impliedFormat":1},{"version":"518e0fd89eddb50289b99dbed7d7ca0951deb4c68f320d66a211ae70c3cd4e19","impliedFormat":1},{"version":"d6add5a006175d8e4ac5067baa29854010ae2be9eec488f3b09f62e48fdcbc73","impliedFormat":1},{"version":"fd883585af80279b31ab2da3b0e4a3039e1f2f000b41bae5b68f53bdfa0381ed","impliedFormat":1},{"version":"44bebcbc4a93fea28f3564a7763dd12f0f3bdec624eb8a63e97afd007d1ff4bd","impliedFormat":1},{"version":"58ff317d61b47e8fc6688bd50e6770311691202553f119d1e1d79b64d864e200","impliedFormat":1},{"version":"2bcba968352e7a0ab44a841f38846bc1137b4f2dd389e174962d2ecfe17f1f83","impliedFormat":1},{"version":"b05f67fbf31701e85c3f299bd3ddf2a83d277eb616dcc1aad0f3c25c3fbf0da2","impliedFormat":1},{"version":"739fd063492c94c26fe75a05459e94826fe71f76147b315cf386992b6c011522","signature":"7adb4f9ddd5454d7afcc4dd35e1e3125e308ad1ecca686eaae081036393b4d64","impliedFormat":1},{"version":"b166e33cf8226ac8781899da244397e77e5b6528271339ce26ece0c2c7242d7f","impliedFormat":1},{"version":"a623d5cf7925e72dbf4602862499564389c7c3dc0ce049733cc0ec756a846667","impliedFormat":1},{"version":"9c1724d9b0cb3d7141dc25a44b0d18cf0b3b20a42e971c6898d4195ec6d4b8dd","impliedFormat":1},{"version":"63634c0855e639ea7f609613d799bbb0dc774ec9f3242bc272c5567dc5ccd485","impliedFormat":1},{"version":"592f06c425ab27b4bafec624ef5b153cbdde9ac58f7113100a2da1c4309d1309","impliedFormat":1},{"version":"19c8ab51b4b07c529d95cd4d5c8d100a68dca247ec83a5097d35106fd8a7acca","impliedFormat":1},{"version":"bec1d0ac62cee9b4d1ea8b64c4798c59c1726668b76d06b68a206e0cb0ac76a6","impliedFormat":1},{"version":"fb4f06b2af9ee4b2d2be8c964b0a8f6dd260be9048488ffcf04eb5c0fcb8bf61","impliedFormat":1},{"version":"f185055f36d76e2df5eeb87ae1148a25a125be2bff2095e1bd39c1c7ce85a640","impliedFormat":1},{"version":"948a56ec8bfbbf20ad2496f49f451cfeb878cfcd6156032c0769b603f3ed8f18","impliedFormat":1},{"version":"979fdebc12d30becce6a15e68d99bc8a2a470a8dcf0898ac9e2d241a7e531940","impliedFormat":1},{"version":"1824ad7d4259910646279d667e517334c0aa24d5c810e8ea6da756fc2e02372f","impliedFormat":1},{"version":"989e9060e220ff86025044ba3c867a83512a655b7cf6253b2bd682192debf390","impliedFormat":1},{"version":"8b1feb568c859feb59236e9723b7a86e2ff8f9a8f2012366ffd1798164dc2798","impliedFormat":1},{"version":"8fab988b0129e674afc0bc0e95329b4052cf027f5d5b5b3e6e92d055b5ba88ef","impliedFormat":1},{"version":"4fe56d524ab24c225668803c1792945053e648b4e8fa4e50fa35594495b56732","impliedFormat":1},{"version":"2652931b8f7dca9a57f21aeb25b5d46851dcf17e4d5ed54b9b57d5d26e647680","impliedFormat":1},{"version":"d364c8df7d52199f5d011b4ded96f36dd114b984f5ee2e50ffe7d30ac1ab4bba","impliedFormat":1},{"version":"408f9eb3c7a3533bf5f07e0cde110a5ee0702864795ee6727792520fe60320b6","impliedFormat":1},{"version":"ba79eb15c36ff23e352ef608ceb7f9f0f278b15ad42512c05eedbe78f228e0e4","impliedFormat":1},{"version":"4cd233c6af471432253a67ae4f3b43c85e58a71418d98c3e162a1dac975c68f6","impliedFormat":1},{"version":"aa77c7d8ddc961e8192bcaa92da140e1205f8aee78bfadead5f52b8844d7d05c","impliedFormat":1},{"version":"37e37d3a525a207efab5458069fd9a27a174d2dc3af729702c81729ca03a349f","impliedFormat":1},{"version":"592be78d9e29c468162ae5c0caacab93517a84b9e119fa43839d37c8a22c96d1","impliedFormat":99},{"version":"9fb7f17cc5582417ed2484bfc9f493ed8e9a7493e023f07d5486860c8acb5f6f","impliedFormat":99},{"version":"6ba794b0e290825b3869e05c4ce9e0efdc9d68eb34d8434d61b2aa798a224c4e","impliedFormat":99},{"version":"b979e09ceeae224e71344ca6258d8ebc93ffc28262678b21f3f872b6f613ae29","impliedFormat":99},{"version":"976cc1f58ff3f255fdb41bdaf18430246a1024f38741fc0d048edb30ad7f5099","impliedFormat":99},{"version":"4a82d200fce0dd902da81b36928ae5c3a366770bea8b52f39936f7f11432f879","impliedFormat":99},{"version":"46c1ab579dd5d88d2a6435859aa8439d27f3f249848a4a8ab650f77135ace7b6","impliedFormat":99},{"version":"a2e86477a12540ef9e439245b959b2d8b96d674d5215d154ff22ad26141f4cfb","impliedFormat":1},{"version":"29150e44771dac0aeb711badc04e08fccd01b46efc560bd6e01b96d746a3f26c","impliedFormat":1},{"version":"e09f096004d70d6e98f5e5fee165849b3944f706861cdeffce5339dfd8426db5","impliedFormat":1},{"version":"1ddd1ca692a6c656ade0a85c9a722b3679b3d0bf113b699908e0325cf3537dbe","impliedFormat":1},{"version":"8588b5e62eff0072477ec7fb47245882d41db7d1b8051089ea331d671af2cf0e","impliedFormat":1},{"version":"48c022acf7a664fc81a3296858f08e2f70fdd57404f2ccc88bb951dc94311939","impliedFormat":1},{"version":"7fbc4600e6ef98e81e3c44329fd0cf7c53eda75cf666b17a6e4666e93e1b0159","impliedFormat":1},{"version":"0a7c25930355abdf0926057044de0c8f910a3196af6126282dd2186898a7d13f","impliedFormat":1},{"version":"007dfb1f314277f6e211fec9c5f62fd182e3bb76f1fe1f165228a259ae0b91b8","impliedFormat":1},{"version":"a6aa3bd9c165acb07db158897587581d7b081ce4271579b720a94f95c8c487d5","impliedFormat":1},{"version":"904714e49891cc1e136cf104f4bc9adfc846be9bd28ac55e101145a0d8103b30","impliedFormat":1},{"version":"9b8ba907ff8c52756b1a0aeac192a22591ac9431ac688cddad8111c8fd5124a3","impliedFormat":1},{"version":"c8b56ebca7f7c08fb96a65b2dfcbc8a6efb10b9b9ff060eca55042428e25e570","impliedFormat":1},{"version":"3fede259ef5c9dd9a97e662da9f6774dbc82f390d29563319b658ebd7f958135","impliedFormat":1},{"version":"d74e6cdb7ac0a4d675d598a09c8deed53dcb11a4e32e344ad6a831663bfb60dd","impliedFormat":1},{"version":"269605a13c650dc3326bc1fa1c65fc05fd8507256c83710974d20e704b55c914","impliedFormat":1},{"version":"ed94531f5270503b60d1938fd4929ce0b719e402862c49fe624eb660f75cc901","impliedFormat":1},{"version":"b9c9c9352d6606fe440735ccad134563017fc5aff8dcd418c58f778437339f06","impliedFormat":1},{"version":"a77c74ba29ae0c5b355aa140686b95239f1e579e51cec743af252fe59a245563","impliedFormat":1},{"version":"fe6fc233bd0daead47deecc6903a5571edaa4a9539c7157c4580d26dcc37a48b","impliedFormat":1},{"version":"d09f6a6dab49823b554255030c4ee8d49a2a993bd02f2cff2e444b2627dffc5a","impliedFormat":1},{"version":"35c6081d0c246583d33f452afa7877652db95b9b9393520b2fc3753795a1bb8c","impliedFormat":1},{"version":"5f5186291de127ff03bc059587fc5d23ccc3e1cb0cd277d5ad5da2e0d6085887","impliedFormat":1},{"version":"1065c8e64bf4876e3f9caa626f4f71fe64b755edfd23db5ceca6accd9c313f1c","impliedFormat":1},{"version":"0717c1a24cd66da2d50833ba78f89d994d1ebe494e0105ac67caa1e1a32a298d","impliedFormat":1},{"version":"cf4bdd9324f9116bf29daf9add3fefe4e609be0dc3bdba1759cf1a6654047726","impliedFormat":1},{"version":"0b59bc43ab08b3bb00a8a4978683c872fe4c6c3206bc68316ff7a3cbe70d75b0","impliedFormat":1},{"version":"d3763a4abd763d825a766d636661ee3ec52fa8477eb63c243b8dcd033ba23789","impliedFormat":1},{"version":"f4377e81d50af3f689cc5dd2005be3b79dfbbcb3f5a0301c843e8daf1cc9ddda","impliedFormat":1},{"version":"ac1e8ae42e98e9a296d467169321f4cf8802643302f619b025117c4ed5a2d200","impliedFormat":1},{"version":"6641f18545bf0ce6aaa467607f6a19a2896c4a6965deffd9c8f586f00950f494","impliedFormat":1},{"version":"27c66f434db3a00fb5b286c88582f2da3a85a2108cdfafe9bf63fa6df206aa2a","impliedFormat":1},{"version":"e2ef2006aa0a9b806063cb510989bafad85e71f21cd7e25783b8876203594dc7","impliedFormat":1},{"version":"5683b6c327ab05195ba14856985488b486117687e3f1b94991e787b25fd6cbb0","impliedFormat":1},{"version":"32d08e56282b632a4ff2aabf97d8e2ca72c872e99453de231684f0347a46c41c","impliedFormat":1},{"version":"f26ba893d9cda649365c19c9929d53ba069d829caa98dea1ad3c90374704cf54","impliedFormat":1},{"version":"0f9bfdd25e2e13e6adf81d98a2909fe1a7ade6cdcd380bc7c9a259effaf3c295","impliedFormat":1},{"version":"4179d52fc45e3c72cab28cedf19d10a915522d5f3f83979e61213137bfc794e9","impliedFormat":1},{"version":"665222ab0b8547fa189b3b4bef8598ca271e552339f871fcd4d7e86f979b8145","impliedFormat":1},{"version":"2748451f1cb5d1594fec48577685ef0cdefea02fea292873b9ab74aa47ff57ad","impliedFormat":1},{"version":"cece3e0e89f3e9a526ce76bf9bf3aab41bf83a58d625558a671f9058b5e822e6","impliedFormat":1},{"version":"11854416213ad2da216b2c09af4a4b16129e051a25ed8f3148ac5e62814341bd","impliedFormat":1},{"version":"5f03bcd31cb6649a36edd547407ab86887ec3c41347c03f52179bc58017fda13","impliedFormat":1},{"version":"48ff4dab14889a41f5b0b94aacb853b96f8778888167625a42ba7a45250a15b7","impliedFormat":1},{"version":"92c35a5a8200e9d5a30c9e36eb7db062b3ca1e03309bd0ec3416714695cc6dca","impliedFormat":1},{"version":"657e5c36539693988464477fb47f7aedfa8a487fd95606671156d52adab81101","impliedFormat":1},{"version":"e3e20ed4715775989c0ee8c2be8e657503503ba75c03defe13b99dc317baf3e7","impliedFormat":1},{"version":"c2f1b0272966ba4ec45818b50813210e3abaa993664e26db5617df45672e49aa","impliedFormat":1},{"version":"6faca0f0e857cab15c7ec26f36dc28b73730b184ce942a25654bbcf4ece22f59","impliedFormat":1},{"version":"40273b09b5738abd52321b86f426893ef84f9da766f2206207c4d9bd6c5b7f35","impliedFormat":1},{"version":"4ab90837f0df1a6c8039689ea77d7d28a06eb1bbf2bc129c271e8a6c01a0f391","impliedFormat":1},{"version":"2c6fcafbedc3bf7e030fbda5acc875e0f2f98b253477105ef5cf0f674409b525","impliedFormat":1},{"version":"171f9f3da4589275b3ca1472e2ee0f32f4b16d5e2c41f79db8bb209433f30d67","impliedFormat":1},{"version":"0d7db9b74a017be10aa36509dd2ae4499260381aabc6772feef677fa16f3a1f4","impliedFormat":1},{"version":"e59ef219cec3c3faab54d5cb12222a04d3e095c84abf94088920c1584832ce43","impliedFormat":1},{"version":"786c15fcfa8b821410e278a740f9dc81c44546259d1cc0143646876a0c030cc0","impliedFormat":1},{"version":"99ea681335aa97ba7618ac3db69a2e2da87da7faf8a39f822030ec4db96ca023","impliedFormat":1},{"version":"d7169a2b449d5b8e309edd84624649d04b746be48fe93b2e69bb7a85653b1e97","impliedFormat":1},{"version":"c462479720ea1932e5adc0bd4808be8ee2c83488be1012bf48f4bbb532b63758","impliedFormat":1},{"version":"d72479ce8210c21451cadef350179fbf3729c0e29005aca2d7e0c6ad031a4afa","impliedFormat":1},{"version":"d0e0354d3d4ac41cb7a67c10ca59652f8cba9eeb0929fcc878e492691f73d02a","impliedFormat":1},{"version":"9e8cbec0dabed8a1d03ab57736738a202df26cfbe180db391347df78a0509fa4","impliedFormat":1},{"version":"fbe06770551602ccc8e240a24793a8268b1bce44de38c26a7710f7bf1702f9b5","impliedFormat":1},{"version":"e4859560e5d635efa084427db27d6e31780eb570c2a567e95ed12f3828199710","impliedFormat":1},{"version":"6f29c691b977d5fdebefbc109c896fa863e95ae4464d959cc1506f45ad01da8e","impliedFormat":1},{"version":"ddf805d002fbf463fe2e40e78a4c7d1773a62f18716ce452cc02ba185c6c9c0e","impliedFormat":1},{"version":"d7aeffb82f803488ad4f918929a3a980e387c64c395ea793f6167c9704d4502a","impliedFormat":1},{"version":"2ede90710bab4dcdef47b532a8b3a1d63b7c366b058e95c705e9d9634f29f445","impliedFormat":1},{"version":"887a73b0167b36d4aed6d2549b19c4bcc6f2f50248b20d4d10ee2a10ef0516e8","impliedFormat":1},{"version":"d5e5bec490256e96a14ee3ee62df234b39130673a78c7cc23cbbd62daa5bb09a","impliedFormat":1},{"version":"e1654470227365a820804931d846c6a63a7f51f89bca85d7e22612f43a6d2add","impliedFormat":1},{"version":"62c9a85d5dc9da38e54f1d802b7b62b82170f3a4571e3c992f1db09f60dce051","impliedFormat":1},{"version":"56e14052acc507ace03e94e8ec6cc22c84a65db751f11ca20349a4ea396f72ab","impliedFormat":1},{"version":"1c7dde9d6e45e71504fd8ba6a9c29db164e7a8040bc1782c2a80a3098d0a86c8","impliedFormat":1},{"version":"916e966405a9923eef3123175b1d31188945917edc14027ebe5df1c1f4ba0c70","impliedFormat":1},{"version":"d742f86f826cd1d46f45cc6c106cf34077b10239da02393fc2b6a6490bb4059a","impliedFormat":1},{"version":"e9ce8ab614cd43c203bdeedd6fb230c64d62dc240c7384d962fe39bdb0ed16d2","impliedFormat":1},{"version":"639e7fd024205c3c4af58bb193c1d7790618fcb8b70e9b15068c647ab729ee3a","impliedFormat":1},{"version":"2c26bbcb3898665e821d93f28d9c4b7d712ca23743d8a7a9d89e2aec794bdf40","impliedFormat":1},{"version":"c0e0fc040511ce5af4e546fabe949945c67507cf1f1bc7211448f2e6832bf0bc","impliedFormat":1},{"version":"63847d7133093860ab00f9de7dc1a316449acfdea95e48a01f8d4019ff875e8b","impliedFormat":1},{"version":"e6f70e3c94d2b1d7c5112ad6df2dd7c2ae5dc81bc89510bbdd4478614cf80594","impliedFormat":1},{"version":"146e5c86d78b4a7ff6dcaf9835b3a6a639dd414d21a30c69df5183bca5596d15","impliedFormat":1},{"version":"713472b1fbf211215a59f78d2b351a77b06d441d7bb7e69c45fe49f8d4784333","impliedFormat":1},{"version":"2e24d2d878e6b0e745d3814ccb2186520c6ffc6b3ee3facc329741c100ff42ae","impliedFormat":1},{"version":"b1dcb886b03955cb52ada9b74a8706b2038a3b028e1bd4b41343d6dec6cc9160","impliedFormat":1},{"version":"00b9f288c0a241fb4316737af41e0ff0e64be1c03c90640bc3a9f1449742ca9b","impliedFormat":1},{"version":"d9f5c7419d04f5b0682db3d10bd3cfb084ddf728f945bc735836ea7139ab3bea","impliedFormat":1},{"version":"7f70f7d51c3232d6e7546bc8f9d6b91df3a9e001de4c755771dd052d9fbc9a07","impliedFormat":1},{"version":"175cdf7e9b2d7178e5b73a4f3dea1f02abe320f6585ee8a6c16991c92e4220e8","impliedFormat":1},{"version":"ef6b222405d44c0dcdea4b8ab7d3aa2ac0258995520c3ad2efa0fe161137807d","impliedFormat":1},{"version":"c6c694fe37d60819f29e998c03d875609d07a2f3d2a280d096474823384bff70","impliedFormat":1},{"version":"1a176b3032ec0fab791c658844c3c1d3df8fbe985b194858c8b31d736781942a","impliedFormat":1},{"version":"82e5bb555d1f1b9344b367e2761eeca6609ff1bc69908d779660e0ddb1c192c3","impliedFormat":1},{"version":"37bd33bdc57f46ff75b573c30c162cf2d1b5e160c230225d349ab01501e3a9b2","impliedFormat":1},{"version":"ea87e08b2a990ff767bcdc40e99eff30028d98af8d401f14b08974223c58c06a","impliedFormat":1},{"version":"389a2c2135dd3de1844b996d661ef3a5ffb978356994841fca0f0a99b1728e28","impliedFormat":1},{"version":"a582c8844a6809984a681db3997068d5d8144bee3f889c5240c559c5502c165a","impliedFormat":1},{"version":"e0494aecf0482850786831665c0f976125882c17084022efc6f8a51443b3a7f4","impliedFormat":1},{"version":"ede7ecc62da0236596749292448b282d9c5e846c95e107d6e87720204b792250","impliedFormat":1},{"version":"557981373fbd676739d62fb4aa7b601a639bfb39f7b563ab2c9a2350aa5d7298","impliedFormat":1},{"version":"078045f76bc547eeae562dde79c81e2565be6fecbdbbc4bfbd03fd16cfcad523","impliedFormat":1},{"version":"04783d0830346173973d5283d10b91fd7d6c1c0aaacd93a95455ddedaac4fc0d","impliedFormat":1},{"version":"6185cad87bf4da80c49a2f7a06af8e3e47eab0bfb31a9bf49520989b1b86056d","impliedFormat":1},{"version":"c002bfb107918122bba26d8d0736f293b22866dadc501f9ce27def3230233be5","impliedFormat":1},{"version":"131906682a56016d19849546fc5f9e0076b4e35bc2c5af362d79a50998215d4d","impliedFormat":1},{"version":"ee0c30ecd200ed26166dc9f9ca3f502e5584d61912f894563c7db45292b5833b","impliedFormat":1},{"version":"64248331a3a1c684ca70489fb8a94e48c5ca8bf86a5fb99179341edda11370ad","impliedFormat":1},{"version":"fa2d827d435777dbfc4a41a70d836b6a401bea8f77903cc22f939425f9da0b8b","impliedFormat":1},{"version":"8a59602dc83ec951feaf5cb7125393d3ebe38914c921e07ca0383a63857435d8","impliedFormat":1},{"version":"0654c77e8427f5125066d551e5f7c273735a92f4e7a2be6f12daf46ffa92ec3c","impliedFormat":1},{"version":"6f2a826f77810913e18a6a5ac87e5783f600961d4d7bc20315db13f69e2280de","impliedFormat":1},{"version":"14e3d141c66a44d32beff51678ba0abd236e18c520b12678a73936e78955cae2","impliedFormat":1},{"version":"bcc4218ae8d2f99608412f5917a663c7c764da0dd63be12d01ec49bf0148fe70","impliedFormat":1},{"version":"4136928c1cc5825cd17ecce5ae4a1671cf0047679e452d4886cfb33e74fed5c7","impliedFormat":1},{"version":"21f4388f6d904f8b0d17565fb331eb25d0f2af0704ed7d6247af4cc9631f7c67","impliedFormat":1},{"version":"546b944e81166843668e7b7a1153ccd1e565834ffc29e1df38aa6d26de9e1c81","impliedFormat":1},{"version":"47babc7ab6a3990895b389d6651d1841a17d7c7a9a57f86c0d72fe8d9230230f","impliedFormat":1},{"version":"f8d0e96fe8f2cbb5e617eec5f198ab78e13ba2c66176ad202b287aa3cc667e23","impliedFormat":1},{"version":"1375b2b59bde71a963ff2cb306eceea05060ded0b7cbcdaf1206e4e8245e605a","impliedFormat":1},{"version":"f5dcef5516ecd8836256359ed4b9c6bb8c73fcce697d1c343b11ee8e7fd15a8a","impliedFormat":1},{"version":"e55a68bbc963c9520f0492892d642fa145d34a351d483cd144a11e3346c18cfb","impliedFormat":1},{"version":"da14f80dc904a20fe5a98009f117d8f977ad6d50fdab685e75d6b38322ea56cb","impliedFormat":1},{"version":"ca90e5e191954b9b8c43ed5d5bc787107c071315c4acaae515e7d918e8814e15","impliedFormat":1},{"version":"8ef0c5c7cba59cbccd0ac5e17ec42dc4a8250cd267f9cdb08a4dcb1a099068ad","impliedFormat":1},{"version":"63ed74c721b55f614bef2b233b03c7e56377b0e38ea16f1dc3fc57a06ce2ca8e","impliedFormat":1},{"version":"57b3caa3ba40034d9b19cfc8f24259745b58d7f50d091b5b7dfd6f4e820e5399","impliedFormat":1},{"version":"b30336ed279a38bc62e5678bf19efaf6f414bfbca31e4550932d59d810d654d5","impliedFormat":1},{"version":"1f142b1a6a8b7b29da43a88c8a5f6bbad28f7cf1b67457596ab6d71bed584e8a","impliedFormat":1},{"version":"a203895f2d4b51c8799af4a17e6d72657c6dfdc4a08ab338970e257e5e083d85","impliedFormat":1},{"version":"c67a3535fe218dac271adc4d9c91cabbcf99d09081dc3fe3567e3a354bf632e2","impliedFormat":1},{"version":"7670372101b08f0d0a2a8cf4d107d969df407a74cba20e9f3991b50d9d3c590c","impliedFormat":1},{"version":"324c0b50e53b8b0dd54dc0f50f0154e3e6fb17608df73de0803b5e9a532cf2e2","impliedFormat":1},{"version":"fe831d90ec6b5e04075ae831936f1e2049cce2473ad1aecf3d5ee37d66ea84cc","impliedFormat":1},{"version":"93b5102a702eb62880ae6fb3be2eb6910694ccf77a2e9063eb5d94bd0b2b32b2","impliedFormat":1},{"version":"0cb25d82f88175135d0827f552720abae64eb9863cba71e0b6ea6e76cf0da3d2","impliedFormat":1},{"version":"d0622e1a5d9ee2b4b8a1a6db2c0f02fc34f4f865d7ece6ec86800074210d2f4d","impliedFormat":1},{"version":"5300e082fe9398613c3b5a4975df67318951c46b4a033d159bbe082793ca2c3a","impliedFormat":1},{"version":"be05176f0f7347f4a9faed9a400c182f107b7499d79f4c6e67ec3d830ed6cde9","impliedFormat":1},{"version":"498b8e59b7659c0ce11ce3323bd0d23c923e21c7290e5bd96ce0f3ca639fb4fe","impliedFormat":1},{"version":"740bf9b794f8fcecb6c3761598372f16a7835dddb4c163a21ae0c7f472dc6bd3","impliedFormat":1},{"version":"12816e95a6bc1b4a98195c0e6747b33cfd178f0424579a3eb21b49911283f79a","impliedFormat":1},{"version":"ccc9e8f887951895386cafcff62aff2617397584ce48ca891646b901272b9d12","impliedFormat":1},{"version":"bffc26bac30d45f1e5fea885f17cafb6a943bcc21fd1122c71b9fe466ece8fdf","impliedFormat":1},{"version":"3f2a3b143fafe71c581c13fc479dba5b0b7ff34993f87b9085d87575b53fc993","impliedFormat":1},{"version":"81580d0db97bc8f13bcf79cc7a97e9606cca948df6f0b26e3084d5db0a41089e","impliedFormat":1},{"version":"fd4ddb3d82b68edf2f7dd1b10ca66c5b108007c46067d0dfac4167a4492577cb","impliedFormat":1},{"version":"8c5414d8170f8fca7d8cdf74dba186370e35cc895c3e25f10ce42fff3ef9b49d","impliedFormat":1},{"version":"2caa4ad00b1f3ca5b07ff3d84beab2d9a4a8d841b677aa1546b78054a890a902","impliedFormat":1},{"version":"c96415ec4a5ff2202c8f5db2b8163a605100b6b47435c5b31d8280e06233958e","impliedFormat":1},{"version":"93b1c61409fbf44c4e666937c0cacb36d006b9901a53a2750e520f6ba9b1fcc2","impliedFormat":1},{"version":"981af6a24b8e1531dd933ff6df096a7a50dfd79f24c5e5be1134b684465a807d","impliedFormat":1},{"version":"d3b51ab522194f5ffd145f57fc2b2017e35d11593a8a5468fd3da7767dba0d57","impliedFormat":1},{"version":"47bf53f3991735879e5f41d8cfab687cc424cb775a0022b1d0fd55c78ff415ea","impliedFormat":1},{"version":"7c682517ded1d1e4ce341feb36a731499ed7241ee93de83aa2010d4f7add0555","impliedFormat":1},{"version":"f68e3a3eba1a531a71c8cb53bedafae2c25c376c147e3bc6ec96613a5de9dc84","impliedFormat":1},{"version":"d34648e4d5c8ccbcb2f5ccb5fa039e3be364ec95b0ef3a3750891e204c4bc3cf","impliedFormat":1},{"version":"367ef08f1d0de5ec4d4786cb8a1b8a17abf395bb0c5f8d151ec10fb66a2ce50e","impliedFormat":1},{"version":"ede4a9299b475e71baffcfd20b9b5056f77b8da69e7c824692fa7601be181ce7","impliedFormat":1},{"version":"c92c476c4463a4a96da5ed77010afd4bfa94944e298359bbff940cdde33c5f16","impliedFormat":1},{"version":"a484890e7212977036ce5965e7ca7b49e53436a66906a29093f91d4e02260fdf","impliedFormat":1},{"version":"4ea2003d86a9c68928ef069ce548c3e6ae35cbcb34184a71f1c566dde2160cf8","impliedFormat":1},{"version":"f727d3e75bfc036625d6920c725a3e4cbc564eef78f47d6b68c6351bb480d799","impliedFormat":1},{"version":"a87fcc9011e8a5e244d6e9af4902c315670aa852fa75dc82ae7cb62f98233a1a","impliedFormat":1},{"version":"120b21a1468deb4be0874bb633c86a1ac4df8919947d22b4762a773d9682a668","impliedFormat":1},{"version":"90afaa269677aeb839cc0e7479e0c3152248e4c8b440954b66a0e13fff08d64b","impliedFormat":1},{"version":"458858857e06dc9112fe9faadfc3d8b3e2828f9070cf8f0dfb7150b6252f021a","impliedFormat":1},{"version":"fb1d37cbc97a4d199bdf61878f4fc9f9ed2141df5f63c6a09d42fa810be09fee","impliedFormat":1},{"version":"2b881659708008e1c27269e1eb8dc476af0c2ab2f1fbf50f6e5f8cb6758d8b1f","impliedFormat":1},{"version":"4734f28362c42ec30a21ac4b8e2ae9a6cac54313cf0190e5e3c44da88bc11298","impliedFormat":1},{"version":"d57b6b6e55782dd990869f766f3dd0b63f030fd3a424a06ed5e1f62bc37bb90b","impliedFormat":1},{"version":"8f8c6a79e620f8a63952de19f38927f7da119cd0a5408d7289532f68b8017d98","impliedFormat":1},{"version":"bdf518ed49e9ad6926ecaee24a183828a23a061a1dfac8788cfc09da02a0bf91","impliedFormat":1},{"version":"c83ae875a44933a76a37949bc96569a414f5fd74f4089edcb4caad0db6bd7e6c","impliedFormat":1},{"version":"69870c54caf722bc568fd348b5e813500e964d820c7482bdb82d94d5aa6f19ed","impliedFormat":1},{"version":"504ffacc3312189dad74385206715390bd98e424aff384f67b21331bd16cf7e3","impliedFormat":1},{"version":"1870eb1fe1a14d19041559a003bb79753347b6da6d87703548b6b20faef30e6e","impliedFormat":1},{"version":"ed93611af4d148d789edfc67fd414195505a89691438ee261fa65d55bd66da0c","impliedFormat":1},{"version":"58ed0a6574485bcf18d4d775084258ed49f7b92ac9f8735488d19ab14bc6db88","impliedFormat":1},{"version":"02aeaa95c9b6125f8b6e5bcc16fc6df7d8f2bf945801defb73e1c13e1fe57c51","impliedFormat":1},{"version":"e6a214b21397bc966e36b92e7ba2986f33d2f68c9c194935937b0455f3b71c29","impliedFormat":1},{"version":"fe995eb8b806358aebf1e963824ea181b2fa9cc52e2dc4022eec67730b742753","impliedFormat":1},{"version":"52db5fc6d8fa0809b2110d96434a06ad26776677e825a10f93fe133497f6c93b","impliedFormat":1},{"version":"7a604944e45b35dc79983b128a7087816a6e9ca6d9c5d02d4a31e88dd50b9c39","impliedFormat":1},{"version":"05685c6f88402fe3db6d60e4c05176e7027b3acfecfd08ef6ca3e5f4bbfd1c1b","impliedFormat":1},{"version":"204ef1918267feb2040caad874caebd9bbf4f018367517750eeae16d880b0698","impliedFormat":1},{"version":"336748521fda8616bfd62560b7d5f37e6158531bbe16f2252b76827c2c6cd9ff","impliedFormat":1},{"version":"c4117a326ced8cc18ed60273de14f4c5e78a53cf2c59092f6278a8afca8d9ced","impliedFormat":1},{"version":"34787d4cfe21491065b9e8c3038a66c78747dc97b171b1201ff3913f2181e5c8","impliedFormat":1},{"version":"fe4c08b22b011d68b3625c665cc302f77bb8aed4b35853a53e3efaf082bc8e83","impliedFormat":1},{"version":"743e3303fed6823026dba4b34833ee6b59779678fd7daf64e1e9049114016b1a","impliedFormat":1},{"version":"7caae0b58bdfbedfbdd1a2f5b41779a08cbf62d62f7be63cd70cc71fb97165a0","impliedFormat":1},{"version":"b611b2a0b82dc6e520bc8c6698c0bf4481aba89c4923450f0753c062e4754c7e","impliedFormat":1},{"version":"e61edd9cf6dd20c0bec59e9d85151fd928c9fcb170273a7924ff5eaeade6c8bf","impliedFormat":1},{"version":"dcbc3cecf73f68c9d63280f3c9747bc6140b1eb9d8b5e5f04de58ea67c564a70","impliedFormat":1},{"version":"b1ae559a876cc54bbf319cccb4de11341916f78d58b2a9a5fc605d9f73b5111e","impliedFormat":1},{"version":"7b86682a3abdade9ceed5cfb5503097496223b93fc257de6795c4736efa841c1","impliedFormat":1},{"version":"07afa56980800740ec44e0b2e08d37d31c3ba1bcff58417ab7c26478bc37e4ac","impliedFormat":1},{"version":"02b6175908b56ca273252e8f734cde6cbc88c298384f4b397e63e41240184dc9","impliedFormat":1},{"version":"59fdde76b9d1518ee3a6711b14dc0b7582b7f9cf702c0cb8acc0bda3aef9e1bd","impliedFormat":1},{"version":"0a20f875729ca5de76aa486ba9cbb1913e349ae2d7d1c2e1ad3b45e142ca815d","impliedFormat":1},{"version":"477b09f880a9f9364b68fe02e237f3779fbffb0761bfbc3f77fa895ca49c44ce","impliedFormat":1},{"version":"d85a0edc67a11fa750331746b55fd5af4b41f1bd11e550ff7090abc9e9f83ebc","impliedFormat":1},{"version":"666732d3b18e0ae093bc48e5cd08380a7fcc64c06b7d8d0b4899567c5de7f5cb","impliedFormat":1},{"version":"be789dbab62f36a20dcb50cf0e67d0ef6b3e3cac17bc0aa9bb30bbe51756ea63","impliedFormat":1},{"version":"202596f2a7cba63ba07d482e8af95b70ee54da4c177643afdeed07bf28c5997a","impliedFormat":1},{"version":"d1658de6ff4ccce2e9cfd8b11722a6279bd3524644d0b65e3e8fc6b69b5ca49a","impliedFormat":1},{"version":"26e9c5b617defeb1de0fedecd7267aa16ad5cab23d726451fabd534ca246eed2","impliedFormat":1},{"version":"4091c43b763549c33d662afe79d75c078622bef954d4a473eca6aef8c251c169","impliedFormat":1},{"version":"7b2d3172fd95b696a31b40ccc3df7c44445dd70a80a3bbb2467da27c78717b48","impliedFormat":1},{"version":"402c1b5455a8fa4f474bf64354f72af7c01e4ad9b1685e3063216b95167a3fdc","impliedFormat":1},{"version":"df38d6066bcf7ef916b9e971e9c92d3f54c12a21235fa5694062bb57f6a028c2","impliedFormat":1},{"version":"5990d3194dafd93fc7a9e51032d11a57756c31fdcd88fac3b9be08af303972c5","impliedFormat":1},{"version":"987562ea1c31f04677cd3b46cbd4cdc6363f6178dbfd4db2a0788fe22947b8a5","impliedFormat":1},{"version":"0de5e8597a103c005b774f8892352a5f123a5e272924fe967b7d82305113bc4d","impliedFormat":1},{"version":"16185bd9e115626e25bca46fb8238f9ef3706c22b62ce940ae66c4e4cfde0df9","impliedFormat":1},{"version":"5711b07fe1b6426486276dd67efdee7ec4e70bcfdcaf39c6626594bbd7d51c34","impliedFormat":1},{"version":"7f81c91c6febbd59728630098f6f2b1e4afeba6af9128645634520d5681096a1","impliedFormat":1},{"version":"269296ab0ca6cc30fad3ccb911b1ff589d4a2c6ea7077c26c7ea5fe650103d6e","impliedFormat":1},{"version":"a49ef7664e1afe51062e193f0008ed621d8a3af547d994123ca44dbbb68c75a2","impliedFormat":1},{"version":"165ee417439a725fbd0a04278830c1056354556188d6000e5dc8ecd12cd3cb10","impliedFormat":1},{"version":"9539893a03d2cf718e8c38adf1a845ec0183ab455c8b257c64cd6727f57b0e1c","impliedFormat":1},{"version":"5e0f0b5968cb81b81847619fb6643f364d0eeb630e575fd0029d22c1171b3a37","impliedFormat":1},{"version":"45fb63c6d3a608b091c3baaaafe97de027a061e2f10813aa97d003b654417ed9","impliedFormat":1},{"version":"9a1bce80c36643bbc3e66c7db014c849b81a1d2d3ebfa69000f03e64545566a0","impliedFormat":1},{"version":"f438823b9ca13c413beaee87829111be171b305995bcf71d67ddd941de6dd999","impliedFormat":1},{"version":"623e7ec6876645a7e93a1a67506f3852b8e5e79ba3cb4c9a90ff8a24d3377a12","impliedFormat":1},{"version":"0ddba574bf51b1e47c502caa07ff96528b0c49878c2521ceb322a94557a824ee","impliedFormat":1},{"version":"3111b876a50a391cac841049c1683d20bf7d83eb05d5ff10b0a49689ca0dc49c","impliedFormat":1},{"version":"de84187571b3fb57d7d47f3199fe75845d024fa2c4aeb0a8bca8a281e37e9b62","impliedFormat":1},{"version":"4e302b950595396f49e539c733b44c52b77a9d3b85cc7c6fd24fcc7df1e30031","impliedFormat":1},{"version":"668eb6f044ef3e07635b3da9b29413de381299f80fdeb90e3ba5bea910d9d588","impliedFormat":1},{"version":"f75b6da37adf4f4fcb1b3e6e30099d345bfcfcc2024dc304bf6eaf40ed477c5a","impliedFormat":1},{"version":"39701d3533318e98924f5e5a4fb0ea5b49527853ae63e78e26190955c1ba4d62","impliedFormat":1},{"version":"30cb04bc8d380ecb7053659c2b42b48f87ffd05af3abe9f7b4783e07777a8d96","impliedFormat":1},{"version":"96847849b0b8472d06b023c7f6fd630cb5cb3e6129bf16c6ce58a931084c1d04","impliedFormat":1},{"version":"f15bb0a6bb20f0a494969d93f68c02a8e8076717fe7dcda6db06ab9e31041c22","impliedFormat":1},{"version":"84e3928255909a8e580fca688a15fbedef5c190e5d1a8da1dcd99afb6a40e617","impliedFormat":1},{"version":"58b8d98c9e39b0a1bab10c9a19a61d9fcac111aba5a6ff47e86525c079ddcbbb","impliedFormat":1},{"version":"a69abca4388cc76962773b4c869d5d34781cf0be92853d7bec53eac7a2f75c60","impliedFormat":1},{"version":"471b5d5986eff907c7f4b7047b54c15648495f94e219a27fd8cc91f35fa0e970","impliedFormat":1},{"version":"75cc2a2e33c7d3fe1574d9c93712950b5556dd4af48a1d1e5a657c66ff2eedf9","impliedFormat":1},{"version":"05c44f2a752cfbef15a81e90bc63eb96efcd3d07dd9b378df5a150a06775a2fb","impliedFormat":1},{"version":"9699ff431424e42dfeeb6417ea7b4d1ed66fc6bfc530748dfedebd2683fcc1b6","impliedFormat":1},{"version":"496197b06b51aeae8323da87d042ed2224e654994a3d9b5e3350df9c9576dc50","impliedFormat":1},{"version":"9d744f7d5a08aa240bceb2755dc8c6ee681cad5e818009162e69ae915bba6b77","impliedFormat":1},{"version":"86b7e0f835e2d550541c27e03abf5270a42f5876e1e915568289142b317a0ffd","impliedFormat":1},{"version":"ac6990a9034baddaf28cb15200bd2f0a46efb118d08f4d341abc16669ad577a1","impliedFormat":1},{"version":"29faa0f1ab122161019ca07b328664d62b5b1ec742606fa5b34851603a49a77c","impliedFormat":1},{"version":"0e07fb22607b2eda1883d4521080a5a29ef90714c1ae598e53eae0b94bf1bd10","impliedFormat":1},{"version":"52cb5d5beedcff01d5b851653cfdbe9a8e8e953a8462a357e71d93eee3ed760b","impliedFormat":1},{"version":"ba6d810e67aef7d6ed15cdd8223d5a207a111077c88d99ce7af5fe959a079803","impliedFormat":1},{"version":"3e02766c76edcd0486eeecad81ca4982a532a80293d71a8d94973e89feb5be2b","impliedFormat":1},{"version":"34e45896ae4bd8f3b44772aae2989adf64febd060810a9e08fc72b07778e58bd","impliedFormat":1},{"version":"e9d1e246d3a0510d5ca97f6c154d00bed351359b868294905efe98052ec6bcda","impliedFormat":1},{"version":"5668bff27e260e0a51ee72b7e0f6e69bba542b8a69f553c30d86e124adf479dd","impliedFormat":1},{"version":"1b4262a15a86e72e78d7fdbb6a6d20e8794f7fa4aa7c54f0b18ac7270e4fab08","impliedFormat":1},{"version":"9334b283bedfcd488ccb33b3e942905c86fa163e919653a5379eb8f28a2d5f7d","impliedFormat":1},{"version":"f3f62eb4cf38d86cc7f56d0879b49656a21f2eef4fd0acef3936889327d7f256","impliedFormat":1},{"version":"e32c5cb1819686336a2101f31b91c2e8e06f8f8311abd1195c203b81b62247b0","impliedFormat":1},{"version":"683734687779547527b05fdcef60947f6fc51758185d788531e9ac7bde84fd6f","impliedFormat":1},{"version":"c418f31663f9aa18537f6443172821265c078de18427ff136a24c536e76b7fc4","impliedFormat":1},{"version":"d3db93b436babc8fcab37cacce55115c25b7898e5e2053bca400ff5348b1ad9e","impliedFormat":1},{"version":"1df375435c44c94f1bce343de4ff81b8c82e644d6b33a801bc6cf4beceb76b71","impliedFormat":1},{"version":"fed5b5c20508c5f84a929161f452dbf769cc2d2ee1371b94ddc2feb418a0cf70","impliedFormat":1},{"version":"76755db046290dad61362d95c03b440a0feaf507edfb5744304c7f98c81faccc","impliedFormat":1},{"version":"e16841ad044e21c48c6065627566a2ac216e067cc34b9ad3b47312d208d9a262","impliedFormat":1},{"version":"7150b4a18287da2e25c68a12bd0cff78f6141a2425a27431a10cd4a91cb9626b","impliedFormat":1},{"version":"214a581fbe6902059a64de2bd75c56b6030c6388c29de93c4296380a99c04e4a","impliedFormat":1},{"version":"78b758d401e53f5319bc143ebdc7714ebe0f1e94fc3906d5e93816e5736bf299","impliedFormat":1},{"version":"ce50872ae30242ed1ce2ddb9d9226c85f17098e901bc456cfc365887ab553127","impliedFormat":1},{"version":"cae86d70eabc661dff2f46f34018ff4840228f01709c8399a9c012711dfe5292","impliedFormat":1},{"version":"77b463688f41048f449fa30b45393b81fd6dfe3eb71f7734c1a6d580373b6a12","impliedFormat":1},{"version":"b6ccce9156aa85ca2e836bc572d4697800739ab008b0a6ae9bfa0361b8baa04c","impliedFormat":1},{"version":"07dcca6e9f155b79d087216735842ab1f7c020ce41f095507afdffecbac06a03","impliedFormat":1},{"version":"1fab3bc9db401033ed6ef6dca9114b3a0a875b475b6c1b2ce52efddf3c4fa130","impliedFormat":1},{"version":"269b37626ed3fc5d6aff2b3103bfecdb86ab69e5fe28933b63a17ac83a547ede","impliedFormat":1},{"version":"1ef3cc7b03643e330cf9bcaeb42257a19f573bfafdaf51e2e45e52c19e20c3ff","impliedFormat":1},{"version":"e05f14953944c6b7f9c8a51c5739cad11e7ea4e441fd5659cbc3a5ebdc28bcfb","impliedFormat":1},{"version":"98fe9a0d3adc98c4aadc97a5bcb8c9589525e16e82e6714333e0315d1ff40a12","impliedFormat":1},{"version":"941c51312144ba38e2d86c081d212bc1f22f64eeb1dc342a1c7aeaaece7a7770","impliedFormat":1},{"version":"8d204669e89ac66eb2fa93e17daf42dc9fa33b3d865158327819df72f4fa3f1f","impliedFormat":1},{"version":"4f66c595621f6dd5c693d12c122def1c9eac9c48ace86deeb7c1a0fe54d63c61","impliedFormat":1},{"version":"6b26f80f079695a24ca28f6b19bb074ddb70cd79bc837ae8437e54ac8727aa14","impliedFormat":1},{"version":"1686e8b2a3bca066aafbb9bea2ac249e7205af7e6b878955741c66b3a4eaba63","impliedFormat":1},{"version":"f974c4abba2e7ae62cc358c6c1589df489406ef517a48355cbcc5f09cf11d8a8","impliedFormat":1},{"version":"949ab063079fbbcbf8a96c093b9cc465f83fd2ce49f4558492d6f95065cb201d","impliedFormat":1},{"version":"2d1c8bc1708e58c9aa73d71f89dc69d45fd00ed42841d022bbffa467c88464f4","impliedFormat":1},{"version":"55c3e286e757f731c3b80c1e6d4a567bcc6d5d512438016240e7da573a554dc3","impliedFormat":1},{"version":"33cb723eea3ced280f163fa717045e233b801081a64509d4d59b47620fde9ef5","impliedFormat":1},{"version":"8c357660e14e4ae047c44211f7d024d48eacf3d5ad6ac805095a436a4d3e268c","impliedFormat":1},{"version":"e67731d353b0f48ec4c7b1cee2358e2b7b6ea56c86775f2f3c07029b73b8bf06","impliedFormat":1},{"version":"e2eccdc38e22cc3882939c7fca91570a8379112c03f6206986e0bd78afeed21c","impliedFormat":1},{"version":"58a60f1ff614a331f5de62b4a629b5f41066430f7b72f65ec27f0cf841403c9e","impliedFormat":1},{"version":"bade739298ee5cd485966b3f2812cd94ed23be0bd8991624bde84db9e41e4240","impliedFormat":1},{"version":"4289204445b85c740954797654b504406befd2168731ec18efffb3ea22674a5c","impliedFormat":1},{"version":"e8ac4073fe7b469e55e1fc7b1540363d5a99b507839135fc97cfe5f2d0e36595","impliedFormat":1},{"version":"0f45169be3f2e0eb418bb1d5d480aa8fca7375af0b6e51dfccc3afbf77d9ef12","impliedFormat":1},{"version":"25699fd6154aa1d8ad42dd7739ebe65e15277c0f44d15ce6826cc43bde4ea5bf","impliedFormat":1},{"version":"d4fabc6a3e3110ed60c84e9ec6712265afe268601f3462198b57aa4359745c33","impliedFormat":1},{"version":"802353808bbaf39f8ce455fc7c459d39f13a2fefcf6f18a78c9ea0c61be089eb","impliedFormat":1},{"version":"a057b62631a72f836a8faa37332f03324b9610bf1bd7781fd6f93be063cd10f5","impliedFormat":1},{"version":"76c5f9421476e8762a83f970028b5b7e9ac13fade254d40c04c188f87be8fd7b","impliedFormat":1},{"version":"6378e4cad97066c62bf7bdd7fb6e2310f6a43cdf7aba950a2d37b4b0772c0554","impliedFormat":1},{"version":"3b6fddf2afbdf36f7bb869ccdeaffac8d53759e527e3425a6b8df4dca616d1fd","impliedFormat":1},{"version":"e88588861f78985ee212de6a72e45b445e5e04286b4ce1eb1d28d72bb781e269","impliedFormat":1},{"version":"22b9f52673fc11b687471594d6080d4319999e4d98903679a4ba94d24b056426","impliedFormat":1},{"version":"3d594041401ac69433c4a2ee492d356db4706adddd4f8201e7e5f542e58173b2","impliedFormat":1},{"version":"806aa43416ea1f5265e1cf94168fd4902348762aa8114dc53c131cff9f87b5ec","impliedFormat":1},{"version":"f27757e22127417f5daddd0ad4be81d5a743c95576d8c957ce39ef02a6cc1ec0","impliedFormat":1},{"version":"383679ac9fe44ffb52057dc5ad7ee2e4a90a3f4abbe9a1cf186d9a2cee617965","impliedFormat":1},{"version":"95a55bb419a26b07ed2a30f5e29524fab09f325c8a42fa59e83fdc75b9e0a8a1","impliedFormat":1},{"version":"c603261cc9c84d60d180847c874203b916a56e17935d113c0fa417448ca5841a","signature":"d5484487f05e22df348f0aeace0bb6f8cc8e4d80b94c45b663ee7ef591691f54","impliedFormat":1},{"version":"5432f2a8809fd2afc466a4c5172bf7e4a98a3fd4a200a3e1170678c35d3fc437","signature":"18441b8e2275c0d2baf8e0fc30d82d2ea5e3f29e3e7f778e8f7900b89c9c44da","impliedFormat":1},{"version":"cbe45accc75f5f25d7e01fbf641cad65da3059aa882a787dfef71d4984c22040","signature":"9acee195019b6d28b71fa42de5d99d8b0a92f63547c945429d157836eec584d4","impliedFormat":1},{"version":"1f9940f664dc6b2225362e84ff43478a1d28af2d2368a629e946ec469903aeb0","signature":"8f61adf9ef64cd9fed4530ea56c6fb311715f62cb4b93e4d86afbac2becb8d71","impliedFormat":1},{"version":"8e451cf211409c09dc354c8b99888735142fd160ccc252156aa6b4a2cd18c058","signature":"a115f768d9165403a59a6668b6869a4f1859e2246177f9d866b6b8be866551ce","impliedFormat":1},{"version":"ba5bfacf839638196a322a3cf458ac71362f820b6b924a36e6c6154d36225413","signature":"19d968cca65ab78df411463effc1e2c9a1841a8779d48d3305f389efc1ef5dea","impliedFormat":1},{"version":"32bf1da909cc2d03da57355e80487d61023b28c6a16263208121f2bb430fa7c8","signature":"4de4f42fea791c490066d8d704b10a04ed3c6465007d80cca1cb90b2ea9f02b2","impliedFormat":1},{"version":"a0e57bd97ce7c561ee71fbc990bf4ef70830f0fa47f35f2de0ac663bbf013514","signature":"23424f11d81d11b2be0a3121ee1820b938b808d48b08e09f1ceeb568bfff587b","impliedFormat":1},{"version":"6a1197b37f8f406bfb74528ca1fb90659c6d1a251d472b1c65affb5c6a6ba5f8","impliedFormat":1},{"version":"6a1197b37f8f406bfb74528ca1fb90659c6d1a251d472b1c65affb5c6a6ba5f8","impliedFormat":1},{"version":"6a1197b37f8f406bfb74528ca1fb90659c6d1a251d472b1c65affb5c6a6ba5f8","impliedFormat":1},{"version":"6a1197b37f8f406bfb74528ca1fb90659c6d1a251d472b1c65affb5c6a6ba5f8","impliedFormat":1},{"version":"6a1197b37f8f406bfb74528ca1fb90659c6d1a251d472b1c65affb5c6a6ba5f8","impliedFormat":1},{"version":"6a1197b37f8f406bfb74528ca1fb90659c6d1a251d472b1c65affb5c6a6ba5f8","impliedFormat":1},{"version":"6a1197b37f8f406bfb74528ca1fb90659c6d1a251d472b1c65affb5c6a6ba5f8","impliedFormat":1},{"version":"6a1197b37f8f406bfb74528ca1fb90659c6d1a251d472b1c65affb5c6a6ba5f8","impliedFormat":1},{"version":"6a1197b37f8f406bfb74528ca1fb90659c6d1a251d472b1c65affb5c6a6ba5f8","impliedFormat":1},{"version":"6a1197b37f8f406bfb74528ca1fb90659c6d1a251d472b1c65affb5c6a6ba5f8","impliedFormat":1},{"version":"516c53364c6b242591c65afc8b0f0f0cee74ac8a04f52470a539fcb33da2e318","impliedFormat":1},{"version":"045fe6d9e971df69d53ed8f1551e60c4849b0529e407e5960b31096418fa8346","impliedFormat":1},{"version":"0974c0312c1fe25e56e8030b1830ce8bc071a973714ac6f2409894addc346fcd","impliedFormat":1},{"version":"d10db4f48a9957fba79c406fbc79af87d979d34a1bbf5e12ca4a53cef0f16cca","impliedFormat":1},{"version":"3493d3ac411c6977f391ab438a9940c3a8e06dc04b7e2d84e0571a30aa224314","impliedFormat":1},{"version":"2907069986d89f01c9151da8a01161545a283405369bf009dbad2e661c556703","impliedFormat":1},{"version":"0feee6a4ec2ca4ce1072d0bf3a9839094b5a651decd598b2fa79bcdee647fb16","impliedFormat":1},{"version":"5bac046f252b55e3b05035d5329e2ef15a944fe429d81ac7fe36a4cd8bb8ae7f","impliedFormat":1},{"version":"4e1949bcfbde9ae075bff5b15ce1d3a401624840cefdbabdd6516004b93b821d","impliedFormat":1},{"version":"c84036d7bec11b3300648aca39ea471bc970927c5b19339c0fe1d65863b42886","impliedFormat":1},{"version":"6d33d3edd8f95c1551880530aa7165c7a43576e1c25680ed51ef573072889f0a","impliedFormat":1},{"version":"e7bd54c49435fc3668d6124ec6c400da823e088d7791ea4edf9483d170e5402d","impliedFormat":1},{"version":"b7d3c28a10bfefcf5dc2390b1684dfa0792ba845c83a4077e2b8927c598d0cd0","signature":"ee6a6afa2c88293a7b920309fb113ee4bb642ee65966ccffcebc7a48bea07a7e","impliedFormat":1},{"version":"9f7d5e154a06af18e5741273a02448f7352099d34306f6902ecd0ab4a18f4db4","signature":"a4ee07710fcabe36bac2b1cb71a05622faa85716eba08f0e7ce1c8eebdce3ead","impliedFormat":1},{"version":"dc3b172ee27054dbcedcf5007b78c256021db936f6313a9ce9a3ecbb503fd646","impliedFormat":1},{"version":"785b9d575b49124ce01b46f5b9402157c7611e6532effa562ac6aebec0074dfc","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"a4a39b5714adfcadd3bbea6698ca2e942606d833bde62ad5fb6ec55f5e438ff8","impliedFormat":1},{"version":"bbc1d029093135d7d9bfa4b38cbf8761db505026cc458b5e9c8b74f4000e5e75","impliedFormat":1},{"version":"26844826cb93d1cb95aa49dbaf3515600c53fd139a82c6e0acdbc4bd2c84953f","impliedFormat":1},{"version":"908217c4f2244ec402b73533ebfcc46d6dcd34fc1c807ff403d7f98702abb3bc","impliedFormat":1}],"root":[82,[425,432],455,456],"options":{"allowUnreachableCode":false,"allowUnusedLabels":false,"alwaysStrict":true,"declaration":true,"declarationDir":"./","declarationMap":false,"emitDeclarationOnly":true,"esModuleInterop":true,"exactOptionalPropertyTypes":true,"module":100,"noFallthroughCasesInSwitch":true,"noImplicitOverride":true,"noImplicitReturns":true,"noImplicitThis":true,"noPropertyAccessFromIndexSignature":true,"noUncheckedIndexedAccess":true,"noUnusedLocals":true,"noUnusedParameters":true,"outDir":"./","skipLibCheck":true,"strict":true,"strictBindCallApply":true,"strictFunctionTypes":true,"strictNullChecks":true,"strictPropertyInitialization":true,"useUnknownInCatchVariables":true},"referencedMap":[[75,1],[77,2],[78,2],[453,2],[80,3],[454,4],[462,5],[461,6],[460,5],[85,7],[86,8],[105,9],[100,10],[101,11],[102,12],[103,10],[104,10],[93,13],[92,14],[90,15],[91,16],[96,17],[97,18],[98,18],[99,18],[89,19],[95,20],[94,21],[88,22],[322,23],[119,24],[129,25],[128,26],[444,27],[445,28],[449,29],[452,30],[450,31],[448,32],[446,33],[324,34],[114,35],[451,36],[447,37],[183,28],[323,38],[313,39],[184,40],[316,41],[443,42],[240,43],[246,44],[247,45],[248,45],[245,46],[325,47],[230,48],[250,49],[254,50],[255,51],[256,49],[257,52],[206,53],[196,54],[205,55],[258,56],[259,57],[200,58],[261,59],[262,60],[191,61],[263,62],[267,63],[269,64],[271,65],[272,66],[273,67],[204,57],[266,68],[275,69],[276,62],[277,70],[279,71],[201,72],[280,73],[281,74],[239,75],[283,76],[284,49],[286,77],[287,78],[291,79],[297,80],[296,81],[299,82],[300,83],[301,83],[302,84],[305,85],[352,86],[326,86],[327,87],[328,88],[329,87],[330,89],[331,87],[332,89],[333,86],[334,87],[354,87],[335,87],[336,90],[337,91],[355,87],[338,89],[339,87],[340,87],[341,92],[342,89],[343,87],[356,87],[344,87],[345,87],[346,87],[347,89],[357,87],[348,92],[353,87],[349,89],[307,93],[308,94],[309,95],[310,96],[203,97],[311,98],[312,99],[192,100],[193,101],[314,102],[315,103],[317,104],[318,93],[319,96],[282,105],[321,106],[363,107],[351,108],[364,109],[306,110],[350,111],[320,112],[136,113],[358,114],[293,115],[362,116],[366,117],[208,118],[185,119],[175,119],[171,120],[197,120],[231,118],[176,121],[220,122],[150,119],[142,119],[268,123],[144,120],[242,119],[163,124],[138,119],[251,119],[177,119],[157,119],[158,125],[228,126],[164,127],[359,119],[375,119],[374,119],[113,128],[120,129],[132,130],[154,131],[155,132],[174,133],[424,134],[117,135],[131,136],[207,137],[126,138],[135,139],[121,140],[122,141],[249,142],[123,143],[124,144],[118,141],[127,145],[133,130],[134,146],[156,129],[125,147],[294,148],[288,149],[130,140],[217,150],[376,151],[219,152],[264,153],[377,154],[222,155],[223,156],[224,157],[378,158],[253,159],[225,160],[380,161],[408,162],[218,163],[221,164],[381,165],[379,166],[215,167],[383,168],[179,169],[395,170],[166,171],[167,171],[169,172],[170,173],[403,174],[402,175],[173,176],[172,177],[162,178],[232,179],[186,180],[406,181],[407,182],[226,183],[151,184],[140,185],[382,185],[141,185],[143,186],[145,187],[209,188],[146,185],[216,189],[147,190],[412,191],[149,192],[148,193],[152,174],[244,194],[243,195],[235,185],[233,187],[236,196],[234,197],[237,198],[227,199],[238,200],[195,201],[194,202],[187,203],[199,204],[270,205],[188,206],[265,207],[274,208],[198,209],[278,210],[189,210],[210,211],[418,212],[153,213],[211,27],[419,213],[168,213],[415,214],[252,215],[413,216],[416,214],[214,217],[414,216],[212,218],[213,219],[404,220],[405,221],[202,222],[292,206],[295,27],[159,27],[260,27],[160,27],[360,27],[361,223],[161,224],[365,225],[385,226],[285,227],[290,228],[399,229],[386,28],[400,230],[387,28],[139,231],[388,232],[389,233],[391,234],[392,235],[394,236],[401,231],[390,237],[393,226],[417,238],[396,239],[397,240],[398,241],[303,128],[304,242],[229,243],[298,27],[190,244],[180,245],[384,246],[165,247],[423,248],[181,249],[182,250],[289,251],[410,252],[411,252],[409,27],[421,253],[422,253],[420,27],[107,254],[112,255],[108,254],[109,254],[110,254],[111,254],[431,256],[428,257],[82,258],[426,259],[456,260],[430,261],[427,262],[455,263],[432,264],[429,265]],"version":"5.6.3"}
|
package/dist/viemSigner.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { LocalAccount } from 'viem/accounts';
|
|
2
2
|
import { NetworkSigner } from './networkSigner';
|
|
3
|
+
import { Address } from 'viem';
|
|
3
4
|
/**
|
|
4
5
|
* Create a new viem custom account for signing transactions using
|
|
5
6
|
* the MPC network.
|
|
@@ -8,6 +9,8 @@ import { NetworkSigner } from './networkSigner';
|
|
|
8
9
|
* @param publicKey Associated public key of the selected Key ID.
|
|
9
10
|
* @param threshold The threshold.
|
|
10
11
|
*/
|
|
11
|
-
export declare function createViemAccount(networkSigner: NetworkSigner, keyId: string, publicKey: string):
|
|
12
|
-
/** Computes ETH address from ECDSA `publicKey` returned by Silent Network
|
|
13
|
-
|
|
12
|
+
export declare function createViemAccount(networkSigner: NetworkSigner, keyId: string, publicKey: string): LocalAccount;
|
|
13
|
+
/** Computes ETH address from ECDSA `publicKey` returned by Silent Network
|
|
14
|
+
* @public
|
|
15
|
+
*/
|
|
16
|
+
export declare function computeAddress(publicKey: string): Address;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { type
|
|
1
|
+
import { AuthModule } from './authentication';
|
|
2
|
+
import { type KeygenSetupOpts, type KeygenResponse, type SignSetupOpts, type SignResponse, AddEphemeralKeyOpts, AddEphemeralKeyResponse } from './networkSigner';
|
|
3
|
+
import { type ClientConfig, IWalletProviderServiceClient } from './walletProviderServiceClientInterface';
|
|
3
4
|
/**
|
|
4
5
|
* The Websocket client to the Wallet Provider backend service.
|
|
5
6
|
* All requests are relayed by this entity to the MPC network.
|
|
@@ -8,19 +9,24 @@ import { type ClientConfig, IWalletProviderServiceClient, type Signer } from './
|
|
|
8
9
|
export declare class WalletProviderServiceClient implements IWalletProviderServiceClient {
|
|
9
10
|
walletProviderId: string;
|
|
10
11
|
walletProviderUrl: string;
|
|
12
|
+
passkeyCredentialId?: string;
|
|
11
13
|
/**
|
|
12
14
|
* Create new client that connects to the backend service
|
|
13
15
|
* @param config - config containing information about backend service
|
|
14
16
|
*/
|
|
15
17
|
constructor(config: ClientConfig);
|
|
16
18
|
getWalletId(): string;
|
|
17
|
-
startKeygen({ setup,
|
|
19
|
+
startKeygen({ setup, authModule, }: {
|
|
18
20
|
setup: KeygenSetupOpts;
|
|
19
|
-
|
|
21
|
+
authModule: AuthModule;
|
|
20
22
|
}): Promise<KeygenResponse>;
|
|
21
|
-
startSigngen({ setup,
|
|
23
|
+
startSigngen({ setup, authModule }: {
|
|
22
24
|
setup: SignSetupOpts;
|
|
23
|
-
|
|
25
|
+
authModule: AuthModule;
|
|
24
26
|
}): Promise<SignResponse>;
|
|
25
|
-
|
|
27
|
+
addEphemeralKey({ setup, authModule, }: {
|
|
28
|
+
setup: AddEphemeralKeyOpts;
|
|
29
|
+
authModule: AuthModule;
|
|
30
|
+
}): Promise<AddEphemeralKeyResponse>;
|
|
31
|
+
connect(setupOpts: KeygenSetupOpts | SignSetupOpts | AddEphemeralKeyOpts, authModule: AuthModule): Promise<string>;
|
|
26
32
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { UserAuthentication } from './authentication';
|
|
2
|
-
import { KeygenResponse, KeygenSetupOpts, SignResponse, SignSetupOpts } from './networkSigner';
|
|
1
|
+
import { AuthModule, UserAuthentication } from './authentication';
|
|
2
|
+
import { AddEphemeralKeyOpts, KeygenResponse, KeygenSetupOpts, SignResponse, SignSetupOpts, AddEphemeralKeyResponse } from './networkSigner';
|
|
3
3
|
/**
|
|
4
4
|
* The config used to create Wallet Provider Service backend client.
|
|
5
5
|
* Please refer to {@link https://shipyard.rs/silencelaboratories/crates/wallet-provider-service | example backend service}
|
|
@@ -24,12 +24,20 @@ export type Signer = (challenge: string) => Promise<UserAuthentication>;
|
|
|
24
24
|
*/
|
|
25
25
|
export interface IWalletProviderServiceClient {
|
|
26
26
|
getWalletId(): string;
|
|
27
|
-
startKeygen({ setup,
|
|
27
|
+
startKeygen({ setup, authModule }: {
|
|
28
28
|
setup: KeygenSetupOpts;
|
|
29
|
-
|
|
29
|
+
authModule: AuthModule;
|
|
30
30
|
}): Promise<KeygenResponse>;
|
|
31
|
-
startSigngen({ setup,
|
|
31
|
+
startSigngen({ setup, authModule }: {
|
|
32
32
|
setup: SignSetupOpts;
|
|
33
|
-
|
|
33
|
+
authModule: AuthModule;
|
|
34
34
|
}): Promise<SignResponse>;
|
|
35
|
+
addEphemeralKey({ setup, authModule, }: {
|
|
36
|
+
setup: AddEphemeralKeyOpts;
|
|
37
|
+
authModule: AuthModule;
|
|
38
|
+
}): Promise<AddEphemeralKeyResponse>;
|
|
39
|
+
}
|
|
40
|
+
export type QueryPath = 'signgen' | 'keygen' | 'addEphemeralKey';
|
|
41
|
+
export interface GetQueryPath {
|
|
42
|
+
get queryPath(): QueryPath;
|
|
35
43
|
}
|
package/package.json
CHANGED
|
@@ -1,9 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@silencelaboratories/walletprovider-sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"author": "Silence Laboratories",
|
|
4
5
|
"description": "Frontend SDK for Wallet Providers",
|
|
5
|
-
"main": "dist/index.js",
|
|
6
|
-
"
|
|
6
|
+
"main": "./dist/index.cjs.js",
|
|
7
|
+
"module": "./dist/index.esm.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"require": "./dist/index.cjs.js",
|
|
13
|
+
"import": "./dist/index.esm.js"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
7
16
|
"files": [
|
|
8
17
|
"dist"
|
|
9
18
|
],
|
|
@@ -12,27 +21,31 @@
|
|
|
12
21
|
"formatcheck": "prettier --check --cache .",
|
|
13
22
|
"lint": "eslint --cache ./src/**/*.ts",
|
|
14
23
|
"typecheck": "tsc -p . --noEmit",
|
|
15
|
-
"build": "
|
|
16
|
-
"build:e2e": "bun run scripts/build.e2e.mjs && bun run build:declaration",
|
|
24
|
+
"build": "node build.js && npm run build:declaration",
|
|
17
25
|
"build:declaration": "tsc -p . --emitDeclarationOnly",
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"docs": "
|
|
26
|
+
"clean": "rimraf dist",
|
|
27
|
+
"prepack": "npm run clean && npm run build && npm run build:declaration",
|
|
28
|
+
"docs": "npm run build:declaration && api-extractor run --local --verbose && api-documenter markdown -i ./temp -o ./docs"
|
|
21
29
|
},
|
|
22
|
-
"type": "module",
|
|
23
30
|
"devDependencies": {
|
|
24
31
|
"@eslint/js": "^9.3.0",
|
|
25
32
|
"@microsoft/api-documenter": "^7.25.2",
|
|
26
33
|
"@microsoft/api-extractor": "^7.46.2",
|
|
27
|
-
"@types/
|
|
34
|
+
"@types/eslint-plugin-security": "^3.0.0",
|
|
35
|
+
"esbuild": "0.24.0",
|
|
36
|
+
"esbuild-node-externals": "^1.15.0",
|
|
28
37
|
"eslint": "^8.x",
|
|
38
|
+
"eslint-plugin-security": "^3.0.1",
|
|
29
39
|
"globals": "^15.3.0",
|
|
40
|
+
"npm-dts": "^1.3.13",
|
|
30
41
|
"prettier": "^3.2.5",
|
|
31
|
-
"
|
|
42
|
+
"rimraf": "^6.0.1",
|
|
43
|
+
"typescript": "5.6.3",
|
|
32
44
|
"typescript-eslint": "^7.11.0"
|
|
33
45
|
},
|
|
34
46
|
"dependencies": {
|
|
35
|
-
"@noble/curves": "^1.
|
|
36
|
-
"
|
|
47
|
+
"@noble/curves": "^1.6.0",
|
|
48
|
+
"js-base64": "^3.7.7",
|
|
49
|
+
"viem": "2.21.32"
|
|
37
50
|
}
|
|
38
51
|
}
|
package/dist/index.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{toHex as R} from"viem";function Y(x){return x.message!==void 0}var j=1,E=2;class H{t;n;key_label;metadata;constructor({t:x,n:F,key_label:B,permissions:J,ephPK:U}){if(this.t=x,this.n=F,this.key_label=B,this.metadata=[],J)this.metadata.push({tag:j,value:J});if(U)this.metadata.push({tag:E,value:U})}}class V{authModule;threshold;totalNodes;wp_client;constructor(x,F,B,J){if(F===0)throw new Error("Threshold cannot be 0");this.threshold=F,this.totalNodes=B,this.authModule=J,this.wp_client=x}async authenticateAndCreateKey(x,F){try{const B=new H({t:this.threshold,n:this.totalNodes,permissions:F,ephPK:R(x)});console.log("Generated Payload:",B);const J=(X)=>this.authModule.authenticate({setup:B,challenge:X}),U=await this.wp_client.startKeygen({setup:B,signer:J});return console.log("Keygen response:",U),U}catch(B){throw console.error(B),B}}async authenticateAndSign(x,F){const B={t:this.threshold,key_id:x,message:F},J=(X)=>this.authModule.authenticate({setup:B,challenge:X}),U=await this.wp_client.startSigngen({setup:B,signer:J});return console.log("Sign response:",U),U}}import{toHex as z} from"viem";import{ed25519 as f} from"@noble/curves/ed25519";var k=function(x,F,B){console.log("EPHKEY",B);const J=new H({t:x.t,n:x.n,key_label:x.key_label,permissions:void 0,ephPK:z(B)});return console.log("SETUP_NO_PERM",J),{types:{EIP712Domain:_,...w},domain:I,primaryType:"Request",message:{setup:J,challenge:F}}};async function D({setup:x,user_id:F,challenge:B,browserWallet:J,ephPK:U,lifetime:X}){if(Y(x))throw new Error("EOA auth cannot be used for Sign requests, please use EphAuth instead");const Z=k(x,B,U);console.log("typed request:"),console.log(JSON.stringify(Z,void 0,4));const Q=await J.signTypedData(F,Z);console.log("User signed a request",Q);const $={eoa:F,ephPK:z(U),expiry:Math.floor(Date.now()/1000)+X};return{credentials:{credentials:JSON.stringify($),method:"eoa",id:F},signature:Q}}async function N({setup:x,user_id:F,challenge:B,ephSK:J,ephPK:U}){const X={setup:x,challenge:B},Z=new TextEncoder,Q=z(f.sign(Z.encode(JSON.stringify(X)),J));console.log("AUTH SIGNATURE by eph key",Q),console.log("User signed a request",Q);const $={eoa:F,ephPK:z(U),expiry:0};return{credentials:{credentials:JSON.stringify($),method:"ephemeral",id:F},signature:Q}}var M=[{name:"tag",type:"uint16"},{name:"value",type:"string"}],w={Request:[{name:"setup",type:"KeygenSetupOpts"},{name:"challenge",type:"string"}],KeygenSetupOpts:[{name:"t",type:"uint32"},{name:"n",type:"uint32"},{name:"metadata",type:"TaggedValue[]"}],TaggedValue:M},I={name:"SilentShard authentication",version:"0.1.0"},_=[{name:"name",type:"string"},{name:"version",type:"string"}];import{ed25519 as v} from"@noble/curves/ed25519";var q;(function(B){B[B["EOA"]=0]="EOA";B[B["NONE"]=1]="NONE"})(q||(q={}));class W{userId;browserWallet;ephPK;lifetime;constructor(x,F,B,J=3600){this.userId=x,this.browserWallet=F,this.ephPK=B,this.lifetime=J}async authenticate({setup:x,challenge:F}){return await D({setup:x,user_id:this.userId,challenge:F,browserWallet:this.browserWallet,ephPK:this.ephPK,lifetime:this.lifetime})}}class C{userId;ephSK;ephPK;constructor(x,F){this.userId=x,this.ephSK=F,this.ephPK=v.getPublicKey(this.ephSK)}async authenticate({setup:x,challenge:F}){return await N({setup:x,user_id:this.userId,challenge:F,ephSK:this.ephSK,ephPK:this.ephPK})}}var T=(x)=>btoa(String.fromCodePoint.apply(null,Array.from(x)));var L;(function(U){U[U["initiated"]=0]="initiated";U[U["waitingForSign"]=1]="waitingForSign";U[U["waitingForResult"]=2]="waitingForResult";U[U["finished"]=3]="finished"})(L||(L={}));class O{walletProviderId;walletProviderUrl;constructor(x){this.walletProviderId=x.walletProviderId,this.walletProviderUrl=x.walletProviderUrl}getWalletId(){return this.walletProviderId}async startKeygen({setup:x,signer:F}){return this.connect(x,F).then((B)=>{const J=B.split(":"),U=J[1].split("=")[1],X=J[0].split("=")[1];return{publicKey:U,keyId:X}})}async startSigngen({setup:x,signer:F}){return this.connect(x,F).then((B)=>{const J=B.split(":"),U=J[0].split("=")[1],X=J[1].split("=")[1];return{sign:U,recid:parseInt(X)}})}connect(x,F){return new Promise((B,J)=>{let U=L.initiated,X;if(Y(x))X="signgen",x.message=T((new TextEncoder()).encode(x.message));else X="keygen";const Z=new WebSocket(`${this.walletProviderUrl}/${X}`);Z.addEventListener("open",(Q)=>{switch(console.log(`Connection opened in state ${U} with event ${JSON.stringify(Q,void 0,"\t")}`),U){case L.initiated:U=L.waitingForSign,console.log(`Sending setup: ${JSON.stringify(x)}`),Z.send(JSON.stringify(x));break;case L.waitingForSign:case L.waitingForResult:U=L.finished,J("Incorrect protocol state");break;case L.finished:break}}),Z.addEventListener("message",async(Q)=>{switch(console.log(`Connection message in state ${U} with event ${JSON.stringify(Q,void 0,"\t")}`),U){case L.initiated:U=L.finished,J("Incorrect protocol state");break;case L.waitingForSign:{U=L.waitingForResult;const $=await F(Q.data);console.log(`Sending signature: ${JSON.stringify($)}`),Z.send(JSON.stringify($));break}case L.waitingForResult:U=L.finished,Z.close(),B(Q.data);break;case L.finished:break}}),Z.addEventListener("error",(Q)=>{if(console.log(`Connection error in state ${U} with event ${JSON.stringify(Q,void 0,"\t")}`),U!=L.finished)U=L.finished,J("Incorrect protocol state")}),Z.addEventListener("close",(Q)=>{if(console.log(`Connection closed in state ${U} with event ${JSON.stringify(Q,void 0,"\t")}`),U!=L.finished)U=L.finished,J("Incorrect protocol state")})})}}import*as G from"viem";import{publicKeyToAddress as A,toAccount as t} from"viem/accounts";import{secp256k1 as b} from"@noble/curves/secp256k1";function m(x){if(x.startsWith("0x"))x=x.slice(2);if(x.startsWith("04"))return A(`0x${x} `);else if(x.startsWith("02")||x.startsWith("03")){const F=b.ProjectivePoint.fromHex(x).toHex(!1);return A(`0x${F}`)}else throw new Error("Invalid public key")}export{m as computeAddress,O as WalletProviderServiceClient,V as NetworkSigner,C as EphAuth,W as EOAAuth,q as AuthMethod};
|