decentralcardgame-cardchain-client-ts 0.0.27 → 0.0.29
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/DecentralCardGame.cardchain.cardchain/module.js +399 -345
- package/DecentralCardGame.cardchain.cardchain/module.ts +624 -544
- package/DecentralCardGame.cardchain.cardchain/registry.js +66 -62
- package/DecentralCardGame.cardchain.cardchain/registry.ts +66 -62
- package/DecentralCardGame.cardchain.cardchain/rest.ts +11 -0
- package/DecentralCardGame.cardchain.cardchain/types/cardchain/cardchain/tx.js +182 -0
- package/DecentralCardGame.cardchain.cardchain/types/cardchain/cardchain/tx.ts +226 -0
- package/DecentralCardGame.cardchain.cardchain/types/cardchain/cardchain/user.js +74 -0
- package/DecentralCardGame.cardchain.cardchain/types/cardchain/cardchain/user.ts +87 -0
- package/DecentralCardGame.cardchain.cardchain/types.js +2 -1
- package/DecentralCardGame.cardchain.cardchain/types.ts +2 -0
- package/DecentralCardGame.cardchain.featureflag/module.js +1 -4
- package/DecentralCardGame.cardchain.featureflag/module.ts +69 -71
- package/client.js +4 -1
- package/client.ts +161 -154
- package/cosmos.auth.v1beta1/module.js +1 -4
- package/cosmos.auth.v1beta1/module.ts +69 -71
- package/ibc.core.channel.v1/module.js +4 -1
- package/ibc.core.channel.v1/module.ts +81 -79
- package/ibc.core.client.v1/module.js +4 -1
- package/ibc.core.client.v1/module.ts +83 -81
- package/ibc.core.connection.v1/module.js +4 -1
- package/ibc.core.connection.v1/module.ts +79 -77
- package/package.json +4 -1
- package/tsconfig.json +10 -10
|
@@ -1,104 +1,102 @@
|
|
|
1
1
|
// Generated by Ignite ignite.com/cli
|
|
2
2
|
|
|
3
|
-
import {StdFee} from "@cosmjs/amino";
|
|
4
|
-
import {SigningStargateClient, DeliverTxResponse} from "@cosmjs/stargate";
|
|
5
|
-
import {EncodeObject, GeneratedType, OfflineSigner, Registry} from "@cosmjs/proto-signing";
|
|
6
|
-
import {msgTypes} from './registry';
|
|
7
|
-
import {IgniteClient} from "../client"
|
|
8
|
-
import {MissingWalletError} from "../helpers"
|
|
9
|
-
import {Api} from "./rest";
|
|
3
|
+
import { StdFee } from "@cosmjs/amino";
|
|
4
|
+
import { SigningStargateClient, DeliverTxResponse } from "@cosmjs/stargate";
|
|
5
|
+
import { EncodeObject, GeneratedType, OfflineSigner, Registry } from "@cosmjs/proto-signing";
|
|
6
|
+
import { msgTypes } from './registry';
|
|
7
|
+
import { IgniteClient } from "../client"
|
|
8
|
+
import { MissingWalletError } from "../helpers"
|
|
9
|
+
import { Api } from "./rest";
|
|
10
10
|
|
|
11
|
-
import {Flag as typeFlag} from "./types"
|
|
12
|
-
import {Params as typeParams} from "./types"
|
|
13
|
-
import {FlagEnableProposal as typeFlagEnableProposal} from "./types"
|
|
11
|
+
import { Flag as typeFlag} from "./types"
|
|
12
|
+
import { Params as typeParams} from "./types"
|
|
13
|
+
import { FlagEnableProposal as typeFlagEnableProposal} from "./types"
|
|
14
|
+
|
|
15
|
+
export { };
|
|
14
16
|
|
|
15
|
-
export {};
|
|
16
17
|
|
|
17
18
|
|
|
18
19
|
export const registry = new Registry(msgTypes);
|
|
19
20
|
|
|
20
21
|
type Field = {
|
|
21
|
-
|
|
22
|
-
|
|
22
|
+
name: string;
|
|
23
|
+
type: unknown;
|
|
23
24
|
}
|
|
24
|
-
|
|
25
25
|
function getStructure(template) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
26
|
+
const structure: {fields: Field[]} = { fields: [] }
|
|
27
|
+
for (let [key, value] of Object.entries(template)) {
|
|
28
|
+
let field = { name: key, type: typeof value }
|
|
29
|
+
structure.fields.push(field)
|
|
30
|
+
}
|
|
31
|
+
return structure
|
|
32
32
|
}
|
|
33
|
-
|
|
34
33
|
const defaultFee = {
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
amount: [],
|
|
35
|
+
gas: "200000",
|
|
37
36
|
};
|
|
38
37
|
|
|
39
38
|
interface TxClientOptions {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
39
|
+
addr: string
|
|
40
|
+
prefix: string
|
|
41
|
+
signer?: OfflineSigner
|
|
43
42
|
}
|
|
44
43
|
|
|
45
|
-
export const txClient = ({signer, prefix, addr}: TxClientOptions = {
|
|
46
|
-
addr: "http://localhost:26657",
|
|
47
|
-
prefix: "cosmos"
|
|
48
|
-
}) => {
|
|
44
|
+
export const txClient = ({ signer, prefix, addr }: TxClientOptions = { addr: "http://localhost:26657", prefix: "cosmos" }) => {
|
|
49
45
|
|
|
50
|
-
|
|
46
|
+
return {
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
}
|
|
51
50
|
};
|
|
52
51
|
|
|
53
52
|
interface QueryClientOptions {
|
|
54
|
-
|
|
53
|
+
addr: string
|
|
55
54
|
}
|
|
56
55
|
|
|
57
|
-
export const queryClient = ({addr: addr}: QueryClientOptions = {addr: "http://localhost:1317"}) => {
|
|
58
|
-
|
|
56
|
+
export const queryClient = ({ addr: addr }: QueryClientOptions = { addr: "http://localhost:1317" }) => {
|
|
57
|
+
return new Api({ baseURL: addr });
|
|
59
58
|
};
|
|
60
59
|
|
|
61
60
|
class SDKModule {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
this.tx[m] = methods[m].bind(this.tx);
|
|
92
|
-
}
|
|
61
|
+
public query: ReturnType<typeof queryClient>;
|
|
62
|
+
public tx: ReturnType<typeof txClient>;
|
|
63
|
+
public structure: Record<string,unknown>;
|
|
64
|
+
public registry: Array<[string, GeneratedType]> = [];
|
|
65
|
+
|
|
66
|
+
constructor(client: IgniteClient) {
|
|
67
|
+
|
|
68
|
+
this.query = queryClient({ addr: client.env.apiURL });
|
|
69
|
+
this.updateTX(client);
|
|
70
|
+
this.structure = {
|
|
71
|
+
Flag: getStructure(typeFlag.fromPartial({})),
|
|
72
|
+
Params: getStructure(typeParams.fromPartial({})),
|
|
73
|
+
FlagEnableProposal: getStructure(typeFlagEnableProposal.fromPartial({})),
|
|
74
|
+
|
|
75
|
+
};
|
|
76
|
+
client.on('signer-changed',(signer) => {
|
|
77
|
+
this.updateTX(client);
|
|
78
|
+
})
|
|
79
|
+
}
|
|
80
|
+
updateTX(client: IgniteClient) {
|
|
81
|
+
const methods = txClient({
|
|
82
|
+
signer: client.signer,
|
|
83
|
+
addr: client.env.rpcURL,
|
|
84
|
+
prefix: client.env.prefix ?? "cosmos",
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
this.tx = methods;
|
|
88
|
+
for (let m in methods) {
|
|
89
|
+
this.tx[m] = methods[m].bind(this.tx);
|
|
93
90
|
}
|
|
91
|
+
}
|
|
94
92
|
};
|
|
95
93
|
|
|
96
94
|
const Module = (test: IgniteClient) => {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
95
|
+
return {
|
|
96
|
+
module: {
|
|
97
|
+
DecentralCardGameCardchainFeatureflag: new SDKModule(test)
|
|
98
|
+
},
|
|
99
|
+
registry: msgTypes
|
|
100
|
+
}
|
|
103
101
|
}
|
|
104
102
|
export default Module;
|
package/client.js
CHANGED
|
@@ -20,7 +20,10 @@ export class IgniteClient extends EventEmitter {
|
|
|
20
20
|
async signAndBroadcast(msgs, fee, memo) {
|
|
21
21
|
if (this.signer) {
|
|
22
22
|
const { address } = (await this.signer.getAccounts())[0];
|
|
23
|
-
const signingClient = await SigningStargateClient.connectWithSigner(this.env.rpcURL, this.signer, {
|
|
23
|
+
const signingClient = await SigningStargateClient.connectWithSigner(this.env.rpcURL, this.signer, {
|
|
24
|
+
registry: new Registry(this.registry),
|
|
25
|
+
prefix: this.env.prefix
|
|
26
|
+
});
|
|
24
27
|
return await signingClient.signAndBroadcast(address, msgs, fee ? fee : defaultFee, memo);
|
|
25
28
|
}
|
|
26
29
|
else {
|
package/client.ts
CHANGED
|
@@ -1,169 +1,176 @@
|
|
|
1
1
|
/// <reference path="./types.d.ts" />
|
|
2
2
|
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
GeneratedType,
|
|
4
|
+
OfflineSigner,
|
|
5
|
+
EncodeObject,
|
|
6
|
+
Registry,
|
|
7
7
|
} from "@cosmjs/proto-signing";
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
8
|
+
import {StdFee} from "@cosmjs/amino";
|
|
9
|
+
import {SigningStargateClient} from "@cosmjs/stargate";
|
|
10
|
+
import {Env} from "./env";
|
|
11
|
+
import {UnionToIntersection, Return, Constructor} from "./helpers";
|
|
12
|
+
import {Module} from "./modules";
|
|
13
|
+
import {EventEmitter} from "events";
|
|
14
|
+
import {ChainInfo} from "@keplr-wallet/types";
|
|
15
15
|
|
|
16
16
|
const defaultFee = {
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
amount: [],
|
|
18
|
+
gas: "200000",
|
|
19
19
|
};
|
|
20
20
|
|
|
21
21
|
export class IgniteClient extends EventEmitter {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
22
|
+
static plugins: Module[] = [];
|
|
23
|
+
env: Env;
|
|
24
|
+
signer?: OfflineSigner;
|
|
25
|
+
registry: Array<[string, GeneratedType]> = [];
|
|
26
|
+
|
|
27
|
+
static plugin<T extends Module | Module[]>(plugin: T) {
|
|
28
|
+
const currentPlugins = this.plugins;
|
|
29
|
+
|
|
30
|
+
class AugmentedClient extends this {
|
|
31
|
+
static plugins = currentPlugins.concat(plugin);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (Array.isArray(plugin)) {
|
|
35
|
+
type Extension = UnionToIntersection<Return<T>['module']>
|
|
36
|
+
return AugmentedClient as typeof IgniteClient & Constructor<Extension>;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
type Extension = Return<T>['module']
|
|
40
|
+
return AugmentedClient as typeof IgniteClient & Constructor<Extension>;
|
|
31
41
|
}
|
|
32
42
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
43
|
+
async signAndBroadcast(msgs: EncodeObject[], fee: StdFee, memo: string) {
|
|
44
|
+
if (this.signer) {
|
|
45
|
+
const {address} = (await this.signer.getAccounts())[0];
|
|
46
|
+
const signingClient = await SigningStargateClient.connectWithSigner(this.env.rpcURL, this.signer, {
|
|
47
|
+
registry: new Registry(this.registry),
|
|
48
|
+
prefix: this.env.prefix
|
|
49
|
+
});
|
|
50
|
+
return await signingClient.signAndBroadcast(address, msgs, fee ? fee : defaultFee, memo)
|
|
51
|
+
} else {
|
|
52
|
+
throw new Error(" Signer is not present.");
|
|
53
|
+
}
|
|
36
54
|
}
|
|
37
55
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
56
|
+
constructor(env: Env, signer?: OfflineSigner) {
|
|
57
|
+
super();
|
|
58
|
+
this.env = env;
|
|
59
|
+
this.setMaxListeners(0);
|
|
60
|
+
this.signer = signer;
|
|
61
|
+
const classConstructor = this.constructor as typeof IgniteClient;
|
|
62
|
+
classConstructor.plugins.forEach(plugin => {
|
|
63
|
+
const pluginInstance = plugin(this);
|
|
64
|
+
Object.assign(this, pluginInstance.module)
|
|
65
|
+
if (this.registry) {
|
|
66
|
+
this.registry = this.registry.concat(pluginInstance.registry)
|
|
67
|
+
}
|
|
68
|
+
});
|
|
49
69
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
preferNoSetFee: true,
|
|
156
|
-
preferNoSetMemo: true,
|
|
157
|
-
},
|
|
158
|
-
};
|
|
159
|
-
}
|
|
160
|
-
await window.keplr.enable(chainId);
|
|
161
|
-
this.signer = window.keplr.getOfflineSigner(chainId);
|
|
162
|
-
this.emit("signer-changed", this.signer);
|
|
163
|
-
} catch (e) {
|
|
164
|
-
throw new Error(
|
|
165
|
-
"Could not load tendermint, staking and bank modules. Please ensure your client loads them to use useKeplr()"
|
|
166
|
-
);
|
|
70
|
+
|
|
71
|
+
useSigner(signer: OfflineSigner) {
|
|
72
|
+
this.signer = signer;
|
|
73
|
+
this.emit("signer-changed", this.signer);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
removeSigner() {
|
|
77
|
+
this.signer = undefined;
|
|
78
|
+
this.emit("signer-changed", this.signer);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
async useKeplr(keplrChainInfo: Partial<ChainInfo> = {}) {
|
|
82
|
+
// Using queryClients directly because BaseClient has no knowledge of the modules at this stage
|
|
83
|
+
try {
|
|
84
|
+
const queryClient = (
|
|
85
|
+
await import("./cosmos.base.tendermint.v1beta1/module")
|
|
86
|
+
).queryClient;
|
|
87
|
+
const stakingQueryClient = (
|
|
88
|
+
await import("./cosmos.staking.v1beta1/module")
|
|
89
|
+
).queryClient;
|
|
90
|
+
const bankQueryClient = (await import("./cosmos.bank.v1beta1/module"))
|
|
91
|
+
.queryClient;
|
|
92
|
+
|
|
93
|
+
const stakingqc = stakingQueryClient({addr: this.env.apiURL});
|
|
94
|
+
const qc = queryClient({addr: this.env.apiURL});
|
|
95
|
+
const node_info = await (await qc.serviceGetNodeInfo()).data;
|
|
96
|
+
const chainId = node_info.default_node_info?.network ?? "";
|
|
97
|
+
const chainName = chainId?.toUpperCase() + " Network";
|
|
98
|
+
const staking = await (await stakingqc.queryParams()).data;
|
|
99
|
+
const bankqc = bankQueryClient({addr: this.env.apiURL});
|
|
100
|
+
const tokens = await (await bankqc.queryTotalSupply()).data;
|
|
101
|
+
const addrPrefix = this.env.prefix ?? "cosmos";
|
|
102
|
+
const rpc = this.env.rpcURL;
|
|
103
|
+
const rest = this.env.apiURL;
|
|
104
|
+
let stakeCurrency = {
|
|
105
|
+
coinDenom: staking.params?.bond_denom?.toUpperCase() ?? "",
|
|
106
|
+
coinMinimalDenom: staking.params?.bond_denom ?? "",
|
|
107
|
+
coinDecimals: 0,
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
let bip44 = {
|
|
111
|
+
coinType: 118,
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
let bech32Config = {
|
|
115
|
+
bech32PrefixAccAddr: addrPrefix,
|
|
116
|
+
bech32PrefixAccPub: addrPrefix + "pub",
|
|
117
|
+
bech32PrefixValAddr: addrPrefix + "valoper",
|
|
118
|
+
bech32PrefixValPub: addrPrefix + "valoperpub",
|
|
119
|
+
bech32PrefixConsAddr: addrPrefix + "valcons",
|
|
120
|
+
bech32PrefixConsPub: addrPrefix + "valconspub",
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
let currencies =
|
|
124
|
+
tokens.supply?.map((x) => {
|
|
125
|
+
const y = {
|
|
126
|
+
coinDenom: x.denom?.toUpperCase() ?? "",
|
|
127
|
+
coinMinimalDenom: x.denom ?? "",
|
|
128
|
+
coinDecimals: 0,
|
|
129
|
+
};
|
|
130
|
+
return y;
|
|
131
|
+
}) ?? [];
|
|
132
|
+
|
|
133
|
+
let feeCurrencies =
|
|
134
|
+
tokens.supply?.map((x) => {
|
|
135
|
+
const y = {
|
|
136
|
+
coinDenom: x.denom?.toUpperCase() ?? "",
|
|
137
|
+
coinMinimalDenom: x.denom ?? "",
|
|
138
|
+
coinDecimals: 0,
|
|
139
|
+
};
|
|
140
|
+
return y;
|
|
141
|
+
}) ?? [];
|
|
142
|
+
|
|
143
|
+
let coinType = 118;
|
|
144
|
+
|
|
145
|
+
if (chainId) {
|
|
146
|
+
const suggestOptions: ChainInfo = {
|
|
147
|
+
chainId,
|
|
148
|
+
chainName,
|
|
149
|
+
rpc,
|
|
150
|
+
rest,
|
|
151
|
+
stakeCurrency,
|
|
152
|
+
bip44,
|
|
153
|
+
bech32Config,
|
|
154
|
+
currencies,
|
|
155
|
+
feeCurrencies,
|
|
156
|
+
...keplrChainInfo,
|
|
157
|
+
};
|
|
158
|
+
await window.keplr.experimentalSuggestChain(suggestOptions);
|
|
159
|
+
|
|
160
|
+
window.keplr.defaultOptions = {
|
|
161
|
+
sign: {
|
|
162
|
+
preferNoSetFee: true,
|
|
163
|
+
preferNoSetMemo: true,
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
await window.keplr.enable(chainId);
|
|
168
|
+
this.signer = window.keplr.getOfflineSigner(chainId);
|
|
169
|
+
this.emit("signer-changed", this.signer);
|
|
170
|
+
} catch (e) {
|
|
171
|
+
throw new Error(
|
|
172
|
+
"Could not load tendermint, staking and bank modules. Please ensure your client loads them to use useKeplr()"
|
|
173
|
+
);
|
|
174
|
+
}
|
|
167
175
|
}
|
|
168
|
-
}
|
|
169
176
|
}
|
|
@@ -18,10 +18,7 @@ const defaultFee = {
|
|
|
18
18
|
amount: [],
|
|
19
19
|
gas: "200000",
|
|
20
20
|
};
|
|
21
|
-
export const txClient = ({ signer, prefix, addr } = {
|
|
22
|
-
addr: "http://localhost:26657",
|
|
23
|
-
prefix: "cosmos"
|
|
24
|
-
}) => {
|
|
21
|
+
export const txClient = ({ signer, prefix, addr } = { addr: "http://localhost:26657", prefix: "cosmos" }) => {
|
|
25
22
|
return {};
|
|
26
23
|
};
|
|
27
24
|
export const queryClient = ({ addr: addr } = { addr: "http://localhost:1317" }) => {
|