arc200-client 1.0.0 → 1.0.2

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/dist/index.js CHANGED
@@ -1,9 +1,7 @@
1
1
  "use strict";
2
- var __create = Object.create;
3
2
  var __defProp = Object.defineProperty;
4
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
6
  var __export = (target, all) => {
9
7
  for (var name in all)
@@ -17,318 +15,318 @@ var __copyProps = (to, from, except, desc) => {
17
15
  }
18
16
  return to;
19
17
  };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
19
 
30
20
  // src/index.ts
31
- var src_exports = {};
32
- __export(src_exports, {
33
- getArc200Client: () => getArc200Client_default
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ Arc200Client: () => Arc200Client,
24
+ Arc200Factory: () => Arc200Factory,
25
+ getArc200Client: () => getArc200Client
34
26
  });
35
- module.exports = __toCommonJS(src_exports);
27
+ module.exports = __toCommonJS(index_exports);
36
28
 
37
- // contracts/clients/Arc200Client.ts
38
- var algokit = __toESM(require("@algorandfoundation/algokit-utils"));
39
- var import_algosdk = require("algosdk");
29
+ // contracts/artifacts/Arc200Client.ts
30
+ var import_app_arc56 = require("@algorandfoundation/algokit-utils/types/app-arc56");
31
+ var import_app_client = require("@algorandfoundation/algokit-utils/types/app-client");
32
+ var import_app_factory = require("@algorandfoundation/algokit-utils/types/app-factory");
40
33
  var APP_SPEC = {
41
- "hints": {
42
- "arc200_name()string": {
43
- "call_config": {
44
- "no_op": "CALL"
45
- }
34
+ name: "Arc200",
35
+ structs: {
36
+ ApprovalStruct: [
37
+ { name: "approvalAmount", type: "uint256" },
38
+ { name: "owner", type: "address" },
39
+ { name: "spender", type: "address" }
40
+ ]
41
+ },
42
+ methods: [
43
+ {
44
+ name: "bootstrap",
45
+ args: [
46
+ { type: "byte[]", name: "name" },
47
+ { type: "byte[]", name: "symbol" },
48
+ { type: "uint8", name: "decimals" },
49
+ { type: "uint256", name: "totalSupply" }
50
+ ],
51
+ returns: { type: "bool" },
52
+ actions: { create: [], call: ["NoOp"] },
53
+ readonly: false,
54
+ events: [
55
+ {
56
+ name: "arc200_Transfer",
57
+ args: [
58
+ { type: "address", name: "from" },
59
+ { type: "address", name: "to" },
60
+ { type: "uint256", name: "value" }
61
+ ]
62
+ }
63
+ ],
64
+ recommendations: {}
46
65
  },
47
- "arc200_symbol()string": {
48
- "call_config": {
49
- "no_op": "CALL"
50
- }
66
+ {
67
+ name: "arc200_name",
68
+ args: [],
69
+ returns: { type: "byte[32]", desc: "The name of the token" },
70
+ actions: { create: [], call: ["NoOp"] },
71
+ readonly: true,
72
+ desc: "Returns the name of the token",
73
+ events: [],
74
+ recommendations: {}
51
75
  },
52
- "arc200_decimals()uint8": {
53
- "call_config": {
54
- "no_op": "CALL"
55
- }
76
+ {
77
+ name: "arc200_symbol",
78
+ args: [],
79
+ returns: { type: "byte[8]", desc: "The symbol of the token" },
80
+ actions: { create: [], call: ["NoOp"] },
81
+ readonly: true,
82
+ desc: "Returns the symbol of the token",
83
+ events: [],
84
+ recommendations: {}
56
85
  },
57
- "arc200_totalSupply()uint256": {
58
- "call_config": {
59
- "no_op": "CALL"
60
- }
86
+ {
87
+ name: "arc200_decimals",
88
+ args: [],
89
+ returns: { type: "uint8", desc: "The decimals of the token" },
90
+ actions: { create: [], call: ["NoOp"] },
91
+ readonly: true,
92
+ desc: "Returns the decimals of the token",
93
+ events: [],
94
+ recommendations: {}
61
95
  },
62
- "arc200_balanceOf(address)uint256": {
63
- "call_config": {
64
- "no_op": "CALL"
65
- }
96
+ {
97
+ name: "arc200_totalSupply",
98
+ args: [],
99
+ returns: { type: "uint256", desc: "The total supply of the token" },
100
+ actions: { create: [], call: ["NoOp"] },
101
+ readonly: true,
102
+ desc: "Returns the total supply of the token",
103
+ events: [],
104
+ recommendations: {}
66
105
  },
67
- "arc200_transfer(address,uint256)bool": {
68
- "call_config": {
69
- "no_op": "CALL"
70
- }
106
+ {
107
+ name: "arc200_balanceOf",
108
+ args: [{ type: "address", name: "owner", desc: "The address of the owner of the token" }],
109
+ returns: { type: "uint256", desc: "The current balance of the holder of the token" },
110
+ actions: { create: [], call: ["NoOp"] },
111
+ readonly: true,
112
+ desc: "Returns the current balance of the owner of the token",
113
+ events: [],
114
+ recommendations: {}
71
115
  },
72
- "arc200_transferFrom(address,address,uint256)bool": {
73
- "call_config": {
74
- "no_op": "CALL"
75
- }
116
+ {
117
+ name: "arc200_transfer",
118
+ args: [
119
+ { type: "address", name: "to", desc: "The destination of the transfer" },
120
+ { type: "uint256", name: "value", desc: "Amount of tokens to transfer" }
121
+ ],
122
+ returns: { type: "bool", desc: "Success" },
123
+ actions: { create: [], call: ["NoOp"] },
124
+ readonly: false,
125
+ desc: "Transfers tokens",
126
+ events: [
127
+ {
128
+ name: "arc200_Transfer",
129
+ args: [
130
+ { type: "address", name: "from" },
131
+ { type: "address", name: "to" },
132
+ { type: "uint256", name: "value" }
133
+ ]
134
+ }
135
+ ],
136
+ recommendations: {}
76
137
  },
77
- "arc200_approve(address,uint256)bool": {
78
- "call_config": {
79
- "no_op": "CALL"
80
- }
138
+ {
139
+ name: "arc200_transferFrom",
140
+ args: [
141
+ { type: "address", name: "from", desc: "The source of the transfer" },
142
+ { type: "address", name: "to", desc: "The destination of the transfer" },
143
+ { type: "uint256", name: "value", desc: "Amount of tokens to transfer" }
144
+ ],
145
+ returns: { type: "bool", desc: "Success" },
146
+ actions: { create: [], call: ["NoOp"] },
147
+ readonly: false,
148
+ desc: "Transfers tokens from source to destination as approved spender",
149
+ events: [
150
+ {
151
+ name: "arc200_Approval",
152
+ args: [
153
+ { type: "address", name: "owner" },
154
+ { type: "address", name: "spender" },
155
+ { type: "uint256", name: "value" }
156
+ ]
157
+ },
158
+ {
159
+ name: "arc200_Transfer",
160
+ args: [
161
+ { type: "address", name: "from" },
162
+ { type: "address", name: "to" },
163
+ { type: "uint256", name: "value" }
164
+ ]
165
+ }
166
+ ],
167
+ recommendations: {}
81
168
  },
82
- "arc200_allowance(address,address)uint256": {
83
- "call_config": {
84
- "no_op": "CALL"
85
- }
169
+ {
170
+ name: "arc200_approve",
171
+ args: [
172
+ { type: "address", name: "spender", desc: "Who is allowed to take tokens on owner's behalf" },
173
+ { type: "uint256", name: "value", desc: "Amount of tokens to be taken by spender" }
174
+ ],
175
+ returns: { type: "bool", desc: "Success" },
176
+ actions: { create: [], call: ["NoOp"] },
177
+ readonly: false,
178
+ desc: "Approve spender for a token",
179
+ events: [
180
+ {
181
+ name: "arc200_Approval",
182
+ args: [
183
+ { type: "address", name: "owner" },
184
+ { type: "address", name: "spender" },
185
+ { type: "uint256", name: "value" }
186
+ ]
187
+ }
188
+ ],
189
+ recommendations: {}
86
190
  },
87
- "createApplication()void": {
88
- "call_config": {
89
- "no_op": "CREATE"
90
- }
191
+ {
192
+ name: "arc200_allowance",
193
+ args: [
194
+ { type: "address", name: "owner", desc: "Owner's account" },
195
+ { type: "address", name: "spender", desc: "Who is allowed to take tokens on owner's behalf" }
196
+ ],
197
+ returns: { type: "uint256", desc: "The remaining allowance" },
198
+ actions: { create: [], call: ["NoOp"] },
199
+ readonly: true,
200
+ desc: "Returns the current allowance of the spender of the tokens of the owner",
201
+ events: [],
202
+ recommendations: {}
91
203
  }
92
- },
93
- "bare_call_config": {
94
- "no_op": "NEVER",
95
- "opt_in": "NEVER",
96
- "close_out": "NEVER",
97
- "update_application": "NEVER",
98
- "delete_application": "NEVER"
99
- },
100
- "schema": {
101
- "local": {
102
- "declared": {},
103
- "reserved": {}
204
+ ],
205
+ arcs: [22, 28],
206
+ desc: "Smart Contract Token Base Interface",
207
+ networks: {},
208
+ state: {
209
+ schema: { global: { ints: 0, bytes: 4 }, local: { ints: 0, bytes: 0 } },
210
+ keys: {
211
+ global: {
212
+ name: { keyType: "AVMString", valueType: "byte[]", key: "bg==", desc: "Name of the asset. Max 32 bytes" },
213
+ symbol: { keyType: "AVMString", valueType: "byte[]", key: "cw==", desc: "Symbol of the asset. Max 8 bytes" },
214
+ decimals: {
215
+ keyType: "AVMString",
216
+ valueType: "uint8",
217
+ key: "ZA==",
218
+ desc: "Decimals of the asset. Recommended is 6 decimal places."
219
+ },
220
+ totalSupply: { keyType: "AVMString", valueType: "uint256", key: "dA==", desc: "Minted supply" }
221
+ },
222
+ local: {},
223
+ box: {}
104
224
  },
105
- "global": {
106
- "declared": {},
107
- "reserved": {}
225
+ maps: {
226
+ global: {},
227
+ local: {},
228
+ box: {
229
+ balances: { keyType: "address", valueType: "uint256", prefix: "Yg==" },
230
+ approvals: { keyType: "byte[32]", valueType: "ApprovalStruct", prefix: "YQ==" }
231
+ }
108
232
  }
109
233
  },
110
- "state": {
111
- "global": {
112
- "num_byte_slices": 0,
113
- "num_uints": 0
234
+ bareActions: { create: ["NoOp"], call: [] },
235
+ sourceInfo: {
236
+ approval: {
237
+ sourceInfo: [
238
+ { pc: [589, 706], errorMessage: "Box must have value" },
239
+ { pc: [707], errorMessage: "Index access is out of bounds" },
240
+ { pc: [610], errorMessage: "Insufficient balance at the sender account" },
241
+ { pc: [369], errorMessage: "Name of the asset must be longer or equal to 1 character" },
242
+ { pc: [372], errorMessage: "Name of the asset must be shorter or equal to 32 characters" },
243
+ { pc: [145, 167, 189, 214, 236, 255, 271, 287, 303, 319], errorMessage: "OnCompletion is not NoOp" },
244
+ { pc: [363], errorMessage: "Only deployer of this smart contract can call bootstrap method" },
245
+ { pc: [378], errorMessage: "Symbol of the asset must be longer or equal to 1 character" },
246
+ { pc: [381], errorMessage: "Symbol of the asset must be shorter or equal to 8 characters" },
247
+ { pc: [388], errorMessage: "This method can be called only once" },
248
+ { pc: [352], errorMessage: "can only call when creating" },
249
+ { pc: [148, 170, 192, 217, 239, 258, 274, 290, 306, 322], errorMessage: "can only call when not creating" },
250
+ { pc: [439, 454, 469, 474], errorMessage: "check GlobalState exists" },
251
+ { pc: [514], errorMessage: "insufficient approval" },
252
+ { pc: [447, 462, 675], errorMessage: "invalid size" },
253
+ { pc: [522, 628], errorMessage: "overflow" }
254
+ ],
255
+ pcOffsetMethod: "none"
114
256
  },
115
- "local": {
116
- "num_byte_slices": 0,
117
- "num_uints": 0
118
- }
257
+ clear: { sourceInfo: [], pcOffsetMethod: "none" }
119
258
  },
120
- "source": {
121
- "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgovLyBUaGlzIFRFQUwgd2FzIGdlbmVyYXRlZCBieSBURUFMU2NyaXB0IHYwLjg0LjAKLy8gaHR0cHM6Ly9naXRodWIuY29tL2FsZ29yYW5kZm91bmRhdGlvbi9URUFMU2NyaXB0CgovLyBUaGlzIGNvbnRyYWN0IGlzIGNvbXBsaWFudCB3aXRoIGFuZC9vciBpbXBsZW1lbnRzIHRoZSBmb2xsb3dpbmcgQVJDczogWyBBUkM0IF0KCi8vIFRoZSBmb2xsb3dpbmcgdGVuIGxpbmVzIG9mIFRFQUwgaGFuZGxlIGluaXRpYWwgcHJvZ3JhbSBmbG93Ci8vIFRoaXMgcGF0dGVybiBpcyB1c2VkIHRvIG1ha2UgaXQgZWFzeSBmb3IgYW55b25lIHRvIHBhcnNlIHRoZSBzdGFydCBvZiB0aGUgcHJvZ3JhbSBhbmQgZGV0ZXJtaW5lIGlmIGEgc3BlY2lmaWMgYWN0aW9uIGlzIGFsbG93ZWQKLy8gSGVyZSwgYWN0aW9uIHJlZmVycyB0byB0aGUgT25Db21wbGV0ZSBpbiBjb21iaW5hdGlvbiB3aXRoIHdoZXRoZXIgdGhlIGFwcCBpcyBiZWluZyBjcmVhdGVkIG9yIGNhbGxlZAovLyBFdmVyeSBwb3NzaWJsZSBhY3Rpb24gZm9yIHRoaXMgY29udHJhY3QgaXMgcmVwcmVzZW50ZWQgaW4gdGhlIHN3aXRjaCBzdGF0ZW1lbnQKLy8gSWYgdGhlIGFjdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQgaW4gdGhlIGNvbnRyYWN0LCBpdHMgcmVzcGVjdGl2ZSBicmFuY2ggd2lsbCBiZSAiKk5PVF9JTVBMRU1FTlRFRCIgd2hpY2gganVzdCBjb250YWlucyAiZXJyIgp0eG4gQXBwbGljYXRpb25JRAohCmludCA2CioKdHhuIE9uQ29tcGxldGlvbgorCnN3aXRjaCAqY2FsbF9Ob09wICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqY3JlYXRlX05vT3AgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVECgoqTk9UX0lNUExFTUVOVEVEOgoJZXJyCgovLyBhcmMyMDBfbmFtZSgpc3RyaW5nCiphYmlfcm91dGVfYXJjMjAwX25hbWU6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIGV4ZWN1dGUgYXJjMjAwX25hbWUoKXN0cmluZwoJY2FsbHN1YiBhcmMyMDBfbmFtZQoJZHVwCglsZW4KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCgljb25jYXQKCWNvbmNhdAoJbG9nCglpbnQgMQoJcmV0dXJuCgovLyBhcmMyMDBfbmFtZSgpOiBzdHJpbmdbMzJdCi8vCi8vIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHRva2VuCi8vCi8vIEByZXR1cm5zIFRoZSBuYW1lIG9mIHRoZSB0b2tlbgphcmMyMDBfbmFtZToKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0c1xhcmMyMDAuYWxnby50czoxNQoJLy8gcmV0dXJuICdBcmMyMDAnOwoJYnl0ZSAweDQxNzI2MzMyMzAzMCAvLyAiQXJjMjAwIgoJcmV0c3ViCgovLyBhcmMyMDBfc3ltYm9sKClzdHJpbmcKKmFiaV9yb3V0ZV9hcmMyMDBfc3ltYm9sOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBleGVjdXRlIGFyYzIwMF9zeW1ib2woKXN0cmluZwoJY2FsbHN1YiBhcmMyMDBfc3ltYm9sCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFyYzIwMF9zeW1ib2woKTogc3RyaW5nWzhdCi8vCi8vIFJldHVybnMgdGhlIHN5bWJvbCBvZiB0aGUgdG9rZW4KLy8KLy8gQHJldHVybnMgVGhlIHN5bWJvbCBvZiB0aGUgdG9rZW4KYXJjMjAwX3N5bWJvbDoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0c1xhcmMyMDAuYWxnby50czoyNQoJLy8gcmV0dXJuICdBcmMyMDAnOwoJYnl0ZSAweDQxNzI2MzMyMzAzMCAvLyAiQXJjMjAwIgoJcmV0c3ViCgovLyBhcmMyMDBfZGVjaW1hbHMoKXVpbnQ4CiphYmlfcm91dGVfYXJjMjAwX2RlY2ltYWxzOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBleGVjdXRlIGFyYzIwMF9kZWNpbWFscygpdWludDgKCWNhbGxzdWIgYXJjMjAwX2RlY2ltYWxzCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDgKCTw9Cglhc3NlcnQKCWV4dHJhY3QgNyAxCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gYXJjMjAwX2RlY2ltYWxzKCk6IHVpbnQ4Ci8vCi8vIFJldHVybnMgdGhlIGRlY2ltYWxzIG9mIHRoZSB0b2tlbgovLwovLyBAcmV0dXJucyBUaGUgZGVjaW1hbHMgb2YgdGhlIHRva2VuCmFyYzIwMF9kZWNpbWFsczoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0c1xhcmMyMDAuYWxnby50czozNQoJLy8gcmV0dXJuIDYgYXMgdWludDg7CglpbnQgNgoJcmV0c3ViCgovLyBhcmMyMDBfdG90YWxTdXBwbHkoKXVpbnQyNTYKKmFiaV9yb3V0ZV9hcmMyMDBfdG90YWxTdXBwbHk6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIGV4ZWN1dGUgYXJjMjAwX3RvdGFsU3VwcGx5KCl1aW50MjU2CgljYWxsc3ViIGFyYzIwMF90b3RhbFN1cHBseQoJZHVwCgliaXRsZW4KCWludCAyNTYKCTw9Cglhc3NlcnQKCWJ5dGUgMHhGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGCgliJgoJZHVwCglsZW4KCWR1cAoJaW50IDMyCgktCglzd2FwCglzdWJzdHJpbmczCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gYXJjMjAwX3RvdGFsU3VwcGx5KCk6IHVpbnQyNTYKLy8KLy8gUmV0dXJucyB0aGUgdG90YWwgc3VwcGx5IG9mIHRoZSB0b2tlbgovLwovLyBAcmV0dXJucyBUaGUgdG90YWwgc3VwcGx5IG9mIHRoZSB0b2tlbgphcmMyMDBfdG90YWxTdXBwbHk6Cglwcm90byAwIDEKCgkvLyBjb250cmFjdHNcYXJjMjAwLmFsZ28udHM6NDUKCS8vIHJldHVybiAxXzAwMF8wMDBfMDAwXzAwMF8wMDAgYXMgdWludDI1NjsKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzOGQ3ZWE0YzY4MDAwCglyZXRzdWIKCi8vIGFyYzIwMF9iYWxhbmNlT2YoYWRkcmVzcyl1aW50MjU2CiphYmlfcm91dGVfYXJjMjAwX2JhbGFuY2VPZjoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gb3duZXI6IGFkZHJlc3MKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWR1cAoJbGVuCglpbnQgMzIKCT09Cglhc3NlcnQKCgkvLyBleGVjdXRlIGFyYzIwMF9iYWxhbmNlT2YoYWRkcmVzcyl1aW50MjU2CgljYWxsc3ViIGFyYzIwMF9iYWxhbmNlT2YKCWR1cAoJYml0bGVuCglpbnQgMjU2Cgk8PQoJYXNzZXJ0CglieXRlIDB4RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgoJYiYKCWR1cAoJbGVuCglkdXAKCWludCAzMgoJLQoJc3dhcAoJc3Vic3RyaW5nMwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFyYzIwMF9iYWxhbmNlT2Yob3duZXI6IEFkZHJlc3MpOiB1aW50MjU2Ci8vCi8vIFJldHVybnMgdGhlIGN1cnJlbnQgYmFsYW5jZSBvZiB0aGUgb3duZXIgb2YgdGhlIHRva2VuCi8vCi8vIEBwYXJhbSBvd25lciBUaGUgYWRkcmVzcyBvZiB0aGUgb3duZXIgb2YgdGhlIHRva2VuCi8vIEByZXR1cm5zIFRoZSBjdXJyZW50IGJhbGFuY2Ugb2YgdGhlIGhvbGRlciBvZiB0aGUgdG9rZW4KYXJjMjAwX2JhbGFuY2VPZjoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0c1xhcmMyMDAuYWxnby50czo1NgoJLy8gcmV0dXJuIDAgYXMgdWludDI1NjsKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCglyZXRzdWIKCi8vIGFyYzIwMF90cmFuc2ZlcihhZGRyZXNzLHVpbnQyNTYpYm9vbAoqYWJpX3JvdXRlX2FyYzIwMF90cmFuc2ZlcjoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gdmFsdWU6IHVpbnQyNTYKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMzIKCT09Cglhc3NlcnQKCgkvLyB0bzogYWRkcmVzcwoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZHVwCglsZW4KCWludCAzMgoJPT0KCWFzc2VydAoKCS8vIGV4ZWN1dGUgYXJjMjAwX3RyYW5zZmVyKGFkZHJlc3MsdWludDI1Nilib29sCgljYWxsc3ViIGFyYzIwMF90cmFuc2ZlcgoJYnl0ZSAweDAwCglpbnQgMAoJdW5jb3ZlciAyCglzZXRiaXQKCWNvbmNhdAoJbG9nCglpbnQgMQoJcmV0dXJuCgovLyBhcmMyMDBfdHJhbnNmZXIodG86IEFkZHJlc3MsIHZhbHVlOiB1aW50MjU2KTogYm9vbGVhbgovLwovLyBUcmFuc2ZlcnMgdG9rZW5zCi8vCi8vIEBwYXJhbSB0byBUaGUgZGVzdGluYXRpb24gb2YgdGhlIHRyYW5zZmVyCi8vIEBwYXJhbSB2YWx1ZSBBbW91bnQgb2YgdG9rZW5zIHRvIHRyYW5zZmVyCi8vIEByZXR1cm5zIFN1Y2Nlc3MKYXJjMjAwX3RyYW5zZmVyOgoJcHJvdG8gMiAxCgoJLy8gY29udHJhY3RzXGFyYzIwMC5hbGdvLnRzOjY3CgkvLyByZXR1cm4gZmFsc2U7CglpbnQgMAoJcmV0c3ViCgovLyBhcmMyMDBfdHJhbnNmZXJGcm9tKGFkZHJlc3MsYWRkcmVzcyx1aW50MjU2KWJvb2wKKmFiaV9yb3V0ZV9hcmMyMDBfdHJhbnNmZXJGcm9tOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyB2YWx1ZTogdWludDI1NgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwoJZHVwCglsZW4KCWludCAzMgoJPT0KCWFzc2VydAoKCS8vIHRvOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoJYXNzZXJ0CgoJLy8gZnJvbTogYWRkcmVzcwoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZHVwCglsZW4KCWludCAzMgoJPT0KCWFzc2VydAoKCS8vIGV4ZWN1dGUgYXJjMjAwX3RyYW5zZmVyRnJvbShhZGRyZXNzLGFkZHJlc3MsdWludDI1Nilib29sCgljYWxsc3ViIGFyYzIwMF90cmFuc2ZlckZyb20KCWJ5dGUgMHgwMAoJaW50IDAKCXVuY292ZXIgMgoJc2V0Yml0Cgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gYXJjMjAwX3RyYW5zZmVyRnJvbShmcm9tOiBBZGRyZXNzLCB0bzogQWRkcmVzcywgdmFsdWU6IHVpbnQyNTYpOiBib29sZWFuCi8vCi8vIFRyYW5zZmVycyB0b2tlbnMgZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24gYXMgYXBwcm92ZWQgc3BlbmRlcgovLwovLyBAcGFyYW0gZnJvbSBUaGUgc291cmNlIG9mIHRoZSB0cmFuc2ZlcgovLyBAcGFyYW0gdG8gVGhlIGRlc3RpbmF0aW9uIG9mIHRoZSB0cmFuc2ZlcgovLyBAcGFyYW0gdmFsdWUgQW1vdW50IG9mIHRva2VucyB0byB0cmFuc2ZlcgovLyBAcmV0dXJucyBTdWNjZXNzCmFyYzIwMF90cmFuc2ZlckZyb206Cglwcm90byAzIDEKCgkvLyBjb250cmFjdHNcYXJjMjAwLmFsZ28udHM6NzkKCS8vIHJldHVybiBmYWxzZTsKCWludCAwCglyZXRzdWIKCi8vIGFyYzIwMF9hcHByb3ZlKGFkZHJlc3MsdWludDI1Nilib29sCiphYmlfcm91dGVfYXJjMjAwX2FwcHJvdmU6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbHVlOiB1aW50MjU2Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoJYXNzZXJ0CgoJLy8gc3BlbmRlcjogYWRkcmVzcwoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZHVwCglsZW4KCWludCAzMgoJPT0KCWFzc2VydAoKCS8vIGV4ZWN1dGUgYXJjMjAwX2FwcHJvdmUoYWRkcmVzcyx1aW50MjU2KWJvb2wKCWNhbGxzdWIgYXJjMjAwX2FwcHJvdmUKCWJ5dGUgMHgwMAoJaW50IDAKCXVuY292ZXIgMgoJc2V0Yml0Cgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gYXJjMjAwX2FwcHJvdmUoc3BlbmRlcjogQWRkcmVzcywgdmFsdWU6IHVpbnQyNTYpOiBib29sZWFuCi8vCi8vIEFwcHJvdmUgc3BlbmRlciBmb3IgYSB0b2tlbgovLwovLyBAcGFyYW0gc3BlbmRlciBXaG8gaXMgYWxsb3dlZCB0byB0YWtlIHRva2VucyBvbiBvd25lcidzIGJlaGFsZgovLyBAcGFyYW0gdmFsdWUgQW1vdW50IG9mIHRva2VucyB0byBiZSB0YWtlbiBieSBzcGVuZGVyCi8vIEByZXR1cm5zIFN1Y2Nlc3MKYXJjMjAwX2FwcHJvdmU6Cglwcm90byAyIDEKCgkvLyBjb250cmFjdHNcYXJjMjAwLmFsZ28udHM6OTAKCS8vIHJldHVybiBmYWxzZTsKCWludCAwCglyZXRzdWIKCi8vIGFyYzIwMF9hbGxvd2FuY2UoYWRkcmVzcyxhZGRyZXNzKXVpbnQyNTYKKmFiaV9yb3V0ZV9hcmMyMDBfYWxsb3dhbmNlOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBzcGVuZGVyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoJYXNzZXJ0CgoJLy8gb3duZXI6IGFkZHJlc3MKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWR1cAoJbGVuCglpbnQgMzIKCT09Cglhc3NlcnQKCgkvLyBleGVjdXRlIGFyYzIwMF9hbGxvd2FuY2UoYWRkcmVzcyxhZGRyZXNzKXVpbnQyNTYKCWNhbGxzdWIgYXJjMjAwX2FsbG93YW5jZQoJZHVwCgliaXRsZW4KCWludCAyNTYKCTw9Cglhc3NlcnQKCWJ5dGUgMHhGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGCgliJgoJZHVwCglsZW4KCWR1cAoJaW50IDMyCgktCglzd2FwCglzdWJzdHJpbmczCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gYXJjMjAwX2FsbG93YW5jZShvd25lcjogQWRkcmVzcywgc3BlbmRlcjogQWRkcmVzcyk6IHVpbnQyNTYKLy8KLy8gUmV0dXJucyB0aGUgY3VycmVudCBhbGxvd2FuY2Ugb2YgdGhlIHNwZW5kZXIgb2YgdGhlIHRva2VucyBvZiB0aGUgb3duZXIKLy8KLy8gQHBhcmFtIG93bmVyIE93bmVyJ3MgYWNjb3VudAovLyBAcGFyYW0gc3BlbmRlciBXaG8gaXMgYWxsb3dlZCB0byB0YWtlIHRva2VucyBvbiBvd25lcidzIGJlaGFsZgovLyBAcmV0dXJucyBUaGUgcmVtYWluaW5nIGFsbG93YW5jZQphcmMyMDBfYWxsb3dhbmNlOgoJcHJvdG8gMiAxCgoJLy8gY29udHJhY3RzXGFyYzIwMC5hbGdvLnRzOjEwMgoJLy8gcmV0dXJuIDAgYXMgdWludDI1NjsKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCglyZXRzdWIKCiphYmlfcm91dGVfY3JlYXRlQXBwbGljYXRpb246CglpbnQgMQoJcmV0dXJuCgoqY3JlYXRlX05vT3A6CgltZXRob2QgImNyZWF0ZUFwcGxpY2F0aW9uKCl2b2lkIgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAoJbWF0Y2ggKmFiaV9yb3V0ZV9jcmVhdGVBcHBsaWNhdGlvbgoJZXJyCgoqY2FsbF9Ob09wOgoJbWV0aG9kICJhcmMyMDBfbmFtZSgpc3RyaW5nIgoJbWV0aG9kICJhcmMyMDBfc3ltYm9sKClzdHJpbmciCgltZXRob2QgImFyYzIwMF9kZWNpbWFscygpdWludDgiCgltZXRob2QgImFyYzIwMF90b3RhbFN1cHBseSgpdWludDI1NiIKCW1ldGhvZCAiYXJjMjAwX2JhbGFuY2VPZihhZGRyZXNzKXVpbnQyNTYiCgltZXRob2QgImFyYzIwMF90cmFuc2ZlcihhZGRyZXNzLHVpbnQyNTYpYm9vbCIKCW1ldGhvZCAiYXJjMjAwX3RyYW5zZmVyRnJvbShhZGRyZXNzLGFkZHJlc3MsdWludDI1Nilib29sIgoJbWV0aG9kICJhcmMyMDBfYXBwcm92ZShhZGRyZXNzLHVpbnQyNTYpYm9vbCIKCW1ldGhvZCAiYXJjMjAwX2FsbG93YW5jZShhZGRyZXNzLGFkZHJlc3MpdWludDI1NiIKCXR4bmEgQXBwbGljYXRpb25BcmdzIDAKCW1hdGNoICphYmlfcm91dGVfYXJjMjAwX25hbWUgKmFiaV9yb3V0ZV9hcmMyMDBfc3ltYm9sICphYmlfcm91dGVfYXJjMjAwX2RlY2ltYWxzICphYmlfcm91dGVfYXJjMjAwX3RvdGFsU3VwcGx5ICphYmlfcm91dGVfYXJjMjAwX2JhbGFuY2VPZiAqYWJpX3JvdXRlX2FyYzIwMF90cmFuc2ZlciAqYWJpX3JvdXRlX2FyYzIwMF90cmFuc2ZlckZyb20gKmFiaV9yb3V0ZV9hcmMyMDBfYXBwcm92ZSAqYWJpX3JvdXRlX2FyYzIwMF9hbGxvd2FuY2UKCWVycg==",
122
- "clear": "I3ByYWdtYSB2ZXJzaW9uIDEw"
259
+ source: {
260
+ approval: "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMSAwIDMyIDgKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAiYiIgInQiIDB4ODAgMHg3OTgzYzM1YyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czo1MgogICAgLy8gZXhwb3J0IGNsYXNzIEFyYzIwMCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AxNQogICAgcHVzaGJ5dGVzcyAweDk3NTM4MmUyIDB4NjU3ZDEzZWMgMHhiNmFlMWEyNSAweDg0ZWMxM2Q1IDB4ZWM5OTYwNDEgMHg4MmU1NzNjNCAweGRhNzAyNWI5IDB4NGE5NjhmOGYgMHhiNTQyMjEyNSAweGJiYjMxOWYzIC8vIG1ldGhvZCAiYm9vdHN0cmFwKGJ5dGVbXSxieXRlW10sdWludDgsdWludDI1Nilib29sIiwgbWV0aG9kICJhcmMyMDBfbmFtZSgpYnl0ZVszMl0iLCBtZXRob2QgImFyYzIwMF9zeW1ib2woKWJ5dGVbOF0iLCBtZXRob2QgImFyYzIwMF9kZWNpbWFscygpdWludDgiLCBtZXRob2QgImFyYzIwMF90b3RhbFN1cHBseSgpdWludDI1NiIsIG1ldGhvZCAiYXJjMjAwX2JhbGFuY2VPZihhZGRyZXNzKXVpbnQyNTYiLCBtZXRob2QgImFyYzIwMF90cmFuc2ZlcihhZGRyZXNzLHVpbnQyNTYpYm9vbCIsIG1ldGhvZCAiYXJjMjAwX3RyYW5zZmVyRnJvbShhZGRyZXNzLGFkZHJlc3MsdWludDI1Nilib29sIiwgbWV0aG9kICJhcmMyMDBfYXBwcm92ZShhZGRyZXNzLHVpbnQyNTYpYm9vbCIsIG1ldGhvZCAiYXJjMjAwX2FsbG93YW5jZShhZGRyZXNzLGFkZHJlc3MpdWludDI1NiIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fYm9vdHN0cmFwX3JvdXRlQDMgbWFpbl9hcmMyMDBfbmFtZV9yb3V0ZUA0IG1haW5fYXJjMjAwX3N5bWJvbF9yb3V0ZUA1IG1haW5fYXJjMjAwX2RlY2ltYWxzX3JvdXRlQDYgbWFpbl9hcmMyMDBfdG90YWxTdXBwbHlfcm91dGVANyBtYWluX2FyYzIwMF9iYWxhbmNlT2Zfcm91dGVAOCBtYWluX2FyYzIwMF90cmFuc2Zlcl9yb3V0ZUA5IG1haW5fYXJjMjAwX3RyYW5zZmVyRnJvbV9yb3V0ZUAxMCBtYWluX2FyYzIwMF9hcHByb3ZlX3JvdXRlQDExIG1haW5fYXJjMjAwX2FsbG93YW5jZV9yb3V0ZUAxMgoKbWFpbl9hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjUyCiAgICAvLyBleHBvcnQgY2xhc3MgQXJjMjAwIGV4dGVuZHMgQ29udHJhY3QgewogICAgaW50Y18xIC8vIDAKICAgIHJldHVybgoKbWFpbl9hcmMyMDBfYWxsb3dhbmNlX3JvdXRlQDEyOgogICAgLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjE5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjUyCiAgICAvLyBleHBvcnQgY2xhc3MgQXJjMjAwIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjE5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGNhbGxzdWIgYXJjMjAwX2FsbG93YW5jZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hcmMyMDBfYXBwcm92ZV9yb3V0ZUAxMToKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czoxODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czo1MgogICAgLy8gZXhwb3J0IGNsYXNzIEFyYzIwMCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czoxODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFyYzIwMF9hcHByb3ZlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FyYzIwMF90cmFuc2ZlckZyb21fcm91dGVAMTA6CiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6NTIKICAgIC8vIGV4cG9ydCBjbGFzcyBBcmMyMDAgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBhcmMyMDBfdHJhbnNmZXJGcm9tCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FyYzIwMF90cmFuc2Zlcl9yb3V0ZUA5OgogICAgLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjE1MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjUyCiAgICAvLyBleHBvcnQgY2xhc3MgQXJjMjAwIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjE1MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYXJjMjAwX3RyYW5zZmVyCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FyYzIwMF9iYWxhbmNlT2Zfcm91dGVAODoKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czoxNDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czo1MgogICAgLy8gZXhwb3J0IGNsYXNzIEFyYzIwMCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czoxNDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBjYWxsc3ViIGFyYzIwMF9iYWxhbmNlT2YKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYXJjMjAwX3RvdGFsU3VwcGx5X3JvdXRlQDc6CiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6MTI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGFyYzIwMF90b3RhbFN1cHBseQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hcmMyMDBfZGVjaW1hbHNfcm91dGVANjoKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czoxMTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgYXJjMjAwX2RlY2ltYWxzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FyYzIwMF9zeW1ib2xfcm91dGVANToKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czoxMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgYXJjMjAwX3N5bWJvbAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hcmMyMDBfbmFtZV9yb3V0ZUA0OgogICAgLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGFyYzIwMF9uYW1lCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2Jvb3RzdHJhcF9yb3V0ZUAzOgogICAgLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6NTIKICAgIC8vIGV4cG9ydCBjbGFzcyBBcmMyMDAgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6NzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGJvb3RzdHJhcAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAMTU6CiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6NTIKICAgIC8vIGV4cG9ydCBjbGFzcyBBcmMyMDAgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDE5CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czo6QXJjMjAwLmJvb3RzdHJhcChuYW1lOiBieXRlcywgc3ltYm9sOiBieXRlcywgZGVjaW1hbHM6IGJ5dGVzLCB0b3RhbFN1cHBseTogYnl0ZXMpIC0+IGJ5dGVzOgpib290c3RyYXA6CiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6NzMtNzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgYm9vdHN0cmFwKG5hbWU6IER5bmFtaWNCeXRlcywgc3ltYm9sOiBEeW5hbWljQnl0ZXMsIGRlY2ltYWxzOiBVaW50TjgsIHRvdGFsU3VwcGx5OiBVaW50TjI1Nik6IEJvb2wgewogICAgcHJvdG8gNCAxCiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6NzUKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSBHbG9iYWwuY3JlYXRvckFkZHJlc3MsICdPbmx5IGRlcGxveWVyIG9mIHRoaXMgc21hcnQgY29udHJhY3QgY2FuIGNhbGwgYm9vdHN0cmFwIG1ldGhvZCcpOwogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgZGVwbG95ZXIgb2YgdGhpcyBzbWFydCBjb250cmFjdCBjYW4gY2FsbCBib290c3RyYXAgbWV0aG9kCiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6NzYKICAgIC8vIGFzc2VydChuYW1lLmxlbmd0aCA+IDAsICdOYW1lIG9mIHRoZSBhc3NldCBtdXN0IGJlIGxvbmdlciBvciBlcXVhbCB0byAxIGNoYXJhY3RlcicpOwogICAgZnJhbWVfZGlnIC00CiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5hbWUgb2YgdGhlIGFzc2V0IG11c3QgYmUgbG9uZ2VyIG9yIGVxdWFsIHRvIDEgY2hhcmFjdGVyCiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6NzcKICAgIC8vIGFzc2VydChuYW1lLmxlbmd0aCA8PSAzMiwgJ05hbWUgb2YgdGhlIGFzc2V0IG11c3QgYmUgc2hvcnRlciBvciBlcXVhbCB0byAzMiBjaGFyYWN0ZXJzJyk7CiAgICBpbnRjXzIgLy8gMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gTmFtZSBvZiB0aGUgYXNzZXQgbXVzdCBiZSBzaG9ydGVyIG9yIGVxdWFsIHRvIDMyIGNoYXJhY3RlcnMKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czo3OAogICAgLy8gYXNzZXJ0KHN5bWJvbC5sZW5ndGggPiAwLCAnU3ltYm9sIG9mIHRoZSBhc3NldCBtdXN0IGJlIGxvbmdlciBvciBlcXVhbCB0byAxIGNoYXJhY3RlcicpOwogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgYXNzZXJ0IC8vIFN5bWJvbCBvZiB0aGUgYXNzZXQgbXVzdCBiZSBsb25nZXIgb3IgZXF1YWwgdG8gMSBjaGFyYWN0ZXIKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czo3OQogICAgLy8gYXNzZXJ0KHN5bWJvbC5sZW5ndGggPD0gOCwgJ1N5bWJvbCBvZiB0aGUgYXNzZXQgbXVzdCBiZSBzaG9ydGVyIG9yIGVxdWFsIHRvIDggY2hhcmFjdGVycycpOwogICAgaW50Y18zIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gU3ltYm9sIG9mIHRoZSBhc3NldCBtdXN0IGJlIHNob3J0ZXIgb3IgZXF1YWwgdG8gOCBjaGFyYWN0ZXJzCiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6NjgKICAgIC8vIHB1YmxpYyB0b3RhbFN1cHBseSA9IEdsb2JhbFN0YXRlPFVpbnROMjU2Pih7IGtleTogJ3QnIH0pOwogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzIgLy8gInQiCiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6ODAKICAgIC8vIGFzc2VydCghdGhpcy50b3RhbFN1cHBseS5oYXNWYWx1ZSwgJ1RoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlJyk7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czo1NgogICAgLy8gcHVibGljIG5hbWUgPSBHbG9iYWxTdGF0ZTxEeW5hbWljQnl0ZXM+KHsga2V5OiAnbicgfSk7CiAgICBwdXNoYnl0ZXMgIm4iCiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6ODIKICAgIC8vIHRoaXMubmFtZS52YWx1ZSA9IG5hbWU7CiAgICBmcmFtZV9kaWcgLTQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6NjAKICAgIC8vIHB1YmxpYyBzeW1ib2wgPSBHbG9iYWxTdGF0ZTxEeW5hbWljQnl0ZXM+KHsga2V5OiAncycgfSk7CiAgICBwdXNoYnl0ZXMgInMiCiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6ODMKICAgIC8vIHRoaXMuc3ltYm9sLnZhbHVlID0gc3ltYm9sOwogICAgZnJhbWVfZGlnIC0zCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjY4CiAgICAvLyBwdWJsaWMgdG90YWxTdXBwbHkgPSBHbG9iYWxTdGF0ZTxVaW50TjI1Nj4oeyBrZXk6ICd0JyB9KTsKICAgIGJ5dGVjXzIgLy8gInQiCiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6ODQKICAgIC8vIHRoaXMudG90YWxTdXBwbHkudmFsdWUgPSB0b3RhbFN1cHBseTsKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czo2NAogICAgLy8gcHVibGljIGRlY2ltYWxzID0gR2xvYmFsU3RhdGU8VWludE44Pih7IGtleTogJ2QnIH0pOwogICAgcHVzaGJ5dGVzICJkIgogICAgLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjg1CiAgICAvLyB0aGlzLmRlY2ltYWxzLnZhbHVlID0gZGVjaW1hbHM7CiAgICBmcmFtZV9kaWcgLTIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6ODYKICAgIC8vIGNvbnN0IHNlbmRlciA9IG5ldyBBZGRyZXNzKFR4bi5zZW5kZXIpOwogICAgdHhuIFNlbmRlcgogICAgLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjcwCiAgICAvLyBwdWJsaWMgYmFsYW5jZXMgPSBCb3hNYXA8QWRkcmVzcywgVWludE4yNTY+KHsga2V5UHJlZml4OiAnYicgfSk7CiAgICBieXRlY18xIC8vICJiIgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjg4CiAgICAvLyB0aGlzLmJhbGFuY2VzKHNlbmRlcikudmFsdWUgPSB0b3RhbFN1cHBseTsKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X3B1dAogICAgLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjkwCiAgICAvLyBlbWl0KG5ldyBhcmMyMDBfVHJhbnNmZXIoeyBmcm9tOiBuZXcgQWRkcmVzcyhHbG9iYWwuemVyb0FkZHJlc3MpLCB0bzogc2VuZGVyLCB2YWx1ZTogdG90YWxTdXBwbHkgfSkpOwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBieXRlYyA0IC8vIG1ldGhvZCAiYXJjMjAwX1RyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50MjU2KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6OTEKICAgIC8vIHJldHVybiBuZXcgQm9vbCh0cnVlKTsKICAgIGJ5dGVjXzMgLy8gMHg4MAogICAgcmV0c3ViCgoKLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjpBcmMyMDAuYXJjMjAwX25hbWUoKSAtPiBieXRlczoKYXJjMjAwX25hbWU6CiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6NTYKICAgIC8vIHB1YmxpYyBuYW1lID0gR2xvYmFsU3RhdGU8RHluYW1pY0J5dGVzPih7IGtleTogJ24nIH0pOwogICAgaW50Y18xIC8vIDAKICAgIHB1c2hieXRlcyAibiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6MTAxCiAgICAvLyByZXR1cm4gbmV3IFN0YXRpY0J5dGVzPDMyPih0aGlzLm5hbWUudmFsdWUubmF0aXZlKTsKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgc2l6ZQogICAgcmV0c3ViCgoKLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjpBcmMyMDAuYXJjMjAwX3N5bWJvbCgpIC0+IGJ5dGVzOgphcmMyMDBfc3ltYm9sOgogICAgLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjYwCiAgICAvLyBwdWJsaWMgc3ltYm9sID0gR2xvYmFsU3RhdGU8RHluYW1pY0J5dGVzPih7IGtleTogJ3MnIH0pOwogICAgaW50Y18xIC8vIDAKICAgIHB1c2hieXRlcyAicyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6MTExCiAgICAvLyByZXR1cm4gbmV3IFN0YXRpY0J5dGVzPDg+KHRoaXMuc3ltYm9sLnZhbHVlLm5hdGl2ZSk7CiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgc2l6ZQogICAgcmV0c3ViCgoKLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjpBcmMyMDAuYXJjMjAwX2RlY2ltYWxzKCkgLT4gYnl0ZXM6CmFyYzIwMF9kZWNpbWFsczoKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czo2NAogICAgLy8gcHVibGljIGRlY2ltYWxzID0gR2xvYmFsU3RhdGU8VWludE44Pih7IGtleTogJ2QnIH0pOwogICAgaW50Y18xIC8vIDAKICAgIHB1c2hieXRlcyAiZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6MTIxCiAgICAvLyByZXR1cm4gdGhpcy5kZWNpbWFscy52YWx1ZTsKICAgIHJldHN1YgoKCi8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czo6QXJjMjAwLmFyYzIwMF90b3RhbFN1cHBseSgpIC0+IGJ5dGVzOgphcmMyMDBfdG90YWxTdXBwbHk6CiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6NjgKICAgIC8vIHB1YmxpYyB0b3RhbFN1cHBseSA9IEdsb2JhbFN0YXRlPFVpbnROMjU2Pih7IGtleTogJ3QnIH0pOwogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzIgLy8gInQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjEzMQogICAgLy8gcmV0dXJuIHRoaXMudG90YWxTdXBwbHkudmFsdWU7CiAgICByZXRzdWIKCgovLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6OkFyYzIwMC5hcmMyMDBfYmFsYW5jZU9mKG93bmVyOiBieXRlcykgLT4gYnl0ZXM6CmFyYzIwMF9iYWxhbmNlT2Y6CiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6MTQwLTE0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIC8vIHB1YmxpYyBhcmMyMDBfYmFsYW5jZU9mKG93bmVyOiBBZGRyZXNzKTogYXJjNC5VaW50TjI1NiB7CiAgICBwcm90byAxIDEKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czoxNDIKICAgIC8vIHJldHVybiB0aGlzLl9iYWxhbmNlT2Yob3duZXIpOwogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9iYWxhbmNlT2YKICAgIHJldHN1YgoKCi8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czo6QXJjMjAwLmFyYzIwMF90cmFuc2Zlcih0bzogYnl0ZXMsIHZhbHVlOiBieXRlcykgLT4gYnl0ZXM6CmFyYzIwMF90cmFuc2ZlcjoKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czoxNTItMTUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIGFyYzIwMF90cmFuc2Zlcih0bzogQWRkcmVzcywgdmFsdWU6IGFyYzQuVWludE4yNTYpOiBhcmM0LkJvb2wgewogICAgcHJvdG8gMiAxCiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6MTU0CiAgICAvLyByZXR1cm4gdGhpcy5fdHJhbnNmZXIobmV3IEFkZHJlc3MoVHhuLnNlbmRlciksIHRvLCB2YWx1ZSk7CiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfdHJhbnNmZXIKICAgIHJldHN1YgoKCi8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czo6QXJjMjAwLmFyYzIwMF90cmFuc2ZlckZyb20oZnJvbTogYnl0ZXMsIHRvOiBieXRlcywgdmFsdWU6IGJ5dGVzKSAtPiBieXRlczoKYXJjMjAwX3RyYW5zZmVyRnJvbToKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czoxNjUtMTY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIGFyYzIwMF90cmFuc2ZlckZyb20oZnJvbTogQWRkcmVzcywgdG86IEFkZHJlc3MsIHZhbHVlOiBhcmM0LlVpbnROMjU2KTogYXJjNC5Cb29sIHsKICAgIHByb3RvIDMgMQogICAgLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjE2NwogICAgLy8gY29uc3Qgc3BlbmRlciA9IG5ldyBBZGRyZXNzKFR4bi5zZW5kZXIpOwogICAgdHhuIFNlbmRlcgogICAgLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjE2OAogICAgLy8gY29uc3Qgc3BlbmRlcl9hbGxvd2FuY2UgPSB0aGlzLl9hbGxvd2FuY2UoZnJvbSwgc3BlbmRlcik7CiAgICBmcmFtZV9kaWcgLTMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9hbGxvd2FuY2UKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czoxNjkKICAgIC8vIGFzc2VydChzcGVuZGVyX2FsbG93YW5jZS5uYXRpdmUgPj0gdmFsdWUubmF0aXZlLCAnaW5zdWZmaWNpZW50IGFwcHJvdmFsJyk7CiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMQogICAgYj49CiAgICBhc3NlcnQgLy8gaW5zdWZmaWNpZW50IGFwcHJvdmFsCiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6MTcwCiAgICAvLyBjb25zdCBuZXdfc3BlbmRlcl9hbGxvd2FuY2UgPSBuZXcgVWludE4yNTYoc3BlbmRlcl9hbGxvd2FuY2UubmF0aXZlIC0gdmFsdWUubmF0aXZlKTsKICAgIGZyYW1lX2RpZyAtMQogICAgYi0KICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyAzMgogICAgYnplcm8KICAgIGJ8CiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6MTcxCiAgICAvLyB0aGlzLl9hcHByb3ZlKGZyb20sIHNwZW5kZXIsIG5ld19zcGVuZGVyX2FsbG93YW5jZSk7CiAgICBmcmFtZV9kaWcgLTMKICAgIGNvdmVyIDIKICAgIGNhbGxzdWIgX2FwcHJvdmUKICAgIHBvcAogICAgLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjE3MgogICAgLy8gcmV0dXJuIHRoaXMuX3RyYW5zZmVyKGZyb20sIHRvLCB2YWx1ZSk7CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF90cmFuc2ZlcgogICAgcmV0c3ViCgoKLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjpBcmMyMDAuYXJjMjAwX2FwcHJvdmUoc3BlbmRlcjogYnl0ZXMsIHZhbHVlOiBieXRlcykgLT4gYnl0ZXM6CmFyYzIwMF9hcHByb3ZlOgogICAgLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjE4Mi0xODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgYXJjMjAwX2FwcHJvdmUoc3BlbmRlcjogQWRkcmVzcywgdmFsdWU6IGFyYzQuVWludE4yNTYpOiBCb29sIHsKICAgIHByb3RvIDIgMQogICAgLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjE4NAogICAgLy8gY29uc3Qgb3duZXIgPSBuZXcgQWRkcmVzcyhUeG4uc2VuZGVyKTsKICAgIHR4biBTZW5kZXIKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czoxODUKICAgIC8vIHJldHVybiB0aGlzLl9hcHByb3ZlKG93bmVyLCBzcGVuZGVyLCB2YWx1ZSk7CiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfYXBwcm92ZQogICAgcmV0c3ViCgoKLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjpBcmMyMDAuYXJjMjAwX2FsbG93YW5jZShvd25lcjogYnl0ZXMsIHNwZW5kZXI6IGJ5dGVzKSAtPiBieXRlczoKYXJjMjAwX2FsbG93YW5jZToKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czoxOTQtMTk1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgLy8gcHVibGljIGFyYzIwMF9hbGxvd2FuY2Uob3duZXI6IEFkZHJlc3MsIHNwZW5kZXI6IEFkZHJlc3MpOiBhcmM0LlVpbnROMjU2IHsKICAgIHByb3RvIDIgMQogICAgLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjE5NgogICAgLy8gcmV0dXJuIHRoaXMuX2FsbG93YW5jZShvd25lciwgc3BlbmRlcik7CiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfYWxsb3dhbmNlCiAgICByZXRzdWIKCgovLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6OkFyYzIwMC5fYmFsYW5jZU9mKG93bmVyOiBieXRlcykgLT4gYnl0ZXM6Cl9iYWxhbmNlT2Y6CiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6MTk5CiAgICAvLyBwcml2YXRlIF9iYWxhbmNlT2Yob3duZXI6IEFkZHJlc3MpOiBVaW50TjI1NiB7CiAgICBwcm90byAxIDEKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czo3MAogICAgLy8gcHVibGljIGJhbGFuY2VzID0gQm94TWFwPEFkZHJlc3MsIFVpbnROMjU2Pih7IGtleVByZWZpeDogJ2InIH0pOwogICAgYnl0ZWNfMSAvLyAiYiIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czoyMDAKICAgIC8vIGlmICghdGhpcy5iYWxhbmNlcyhvd25lcikuZXhpc3RzKSByZXR1cm4gbmV3IFVpbnROMjU2KDApOwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogX2JhbGFuY2VPZl9hZnRlcl9pZl9lbHNlQDIKICAgIGJ5dGVjIDUgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBzd2FwCiAgICByZXRzdWIKCl9iYWxhbmNlT2ZfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjIwMQogICAgLy8gcmV0dXJuIHRoaXMuYmFsYW5jZXMob3duZXIpLnZhbHVlOwogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6OkFyYzIwMC5fdHJhbnNmZXIoc2VuZGVyOiBieXRlcywgcmVjaXBpZW50OiBieXRlcywgYW1vdW50OiBieXRlcykgLT4gYnl0ZXM6Cl90cmFuc2ZlcjoKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czoyMDQKICAgIC8vIHByaXZhdGUgX3RyYW5zZmVyKHNlbmRlcjogQWRkcmVzcywgcmVjaXBpZW50OiBBZGRyZXNzLCBhbW91bnQ6IFVpbnROMjU2KTogQm9vbCB7CiAgICBwcm90byAzIDEKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czoyMDUKICAgIC8vIGNvbnN0IHNlbmRlcl9iYWxhbmNlID0gdGhpcy5fYmFsYW5jZU9mKHNlbmRlcik7CiAgICBmcmFtZV9kaWcgLTMKICAgIGNhbGxzdWIgX2JhbGFuY2VPZgogICAgZHVwCiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6MjA2CiAgICAvLyBjb25zdCByZWNpcGllbnRfYmFsYW5jZSA9IHRoaXMuX2JhbGFuY2VPZihyZWNpcGllbnQpOwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIF9iYWxhbmNlT2YKICAgIHN3YXAKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czoyMDcKICAgIC8vIGFzc2VydChzZW5kZXJfYmFsYW5jZS5uYXRpdmUgPj0gYW1vdW50Lm5hdGl2ZSwgJ0luc3VmZmljaWVudCBiYWxhbmNlIGF0IHRoZSBzZW5kZXIgYWNjb3VudCcpOwogICAgZnJhbWVfZGlnIC0xCiAgICBiPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgYmFsYW5jZSBhdCB0aGUgc2VuZGVyIGFjY291bnQKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czoyMDkKICAgIC8vIGlmIChzZW5kZXIgIT09IHJlY2lwaWVudCkgewogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgICE9CiAgICBieiBfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6MjExCiAgICAvLyB0aGlzLmJhbGFuY2VzKHNlbmRlcikudmFsdWUgPSBuZXcgVWludE4yNTYoc2VuZGVyX2JhbGFuY2UubmF0aXZlIC0gYW1vdW50Lm5hdGl2ZSk7CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0xCiAgICBiLQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDMyCiAgICBiemVybwogICAgYnwKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czo3MAogICAgLy8gcHVibGljIGJhbGFuY2VzID0gQm94TWFwPEFkZHJlc3MsIFVpbnROMjU2Pih7IGtleVByZWZpeDogJ2InIH0pOwogICAgYnl0ZWNfMSAvLyAiYiIKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6MjExCiAgICAvLyB0aGlzLmJhbGFuY2VzKHNlbmRlcikudmFsdWUgPSBuZXcgVWludE4yNTYoc2VuZGVyX2JhbGFuY2UubmF0aXZlIC0gYW1vdW50Lm5hdGl2ZSk7CiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6NzAKICAgIC8vIHB1YmxpYyBiYWxhbmNlcyA9IEJveE1hcDxBZGRyZXNzLCBVaW50TjI1Nj4oeyBrZXlQcmVmaXg6ICdiJyB9KTsKICAgIGJ5dGVjXzEgLy8gImIiCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjIxMgogICAgLy8gdGhpcy5iYWxhbmNlcyhyZWNpcGllbnQpLnZhbHVlID0gcmVjaXBpZW50X2JhbGFuY2U7CiAgICBmcmFtZV9kaWcgMQogICAgYm94X3B1dAoKX3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czoyMjAKICAgIC8vIGVtaXQobmV3IGFyYzIwMF9UcmFuc2Zlcih7IGZyb206IHNlbmRlciwgdG86IHJlY2lwaWVudCwgdmFsdWU6IGFtb3VudCB9KSk7CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyBtZXRob2QgImFyYzIwMF9UcmFuc2ZlcihhZGRyZXNzLGFkZHJlc3MsdWludDI1NikiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjIyMQogICAgLy8gcmV0dXJuIG5ldyBCb29sKHRydWUpOwogICAgYnl0ZWNfMyAvLyAweDgwCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czo6QXJjMjAwLl9hcHByb3ZhbEtleShvd25lcjogYnl0ZXMsIHNwZW5kZXI6IGJ5dGVzKSAtPiBieXRlczoKX2FwcHJvdmFsS2V5OgogICAgLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjIyMwogICAgLy8gcHJpdmF0ZSBfYXBwcm92YWxLZXkob3duZXI6IEFkZHJlc3MsIHNwZW5kZXI6IEFkZHJlc3MpOiBTdGF0aWNCeXRlczwzMj4gewogICAgcHJvdG8gMiAxCiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6MjI0CiAgICAvLyByZXR1cm4gbmV3IFN0YXRpY0J5dGVzPDMyPihvcC5zaGEyNTYob3AuY29uY2F0KG93bmVyLmJ5dGVzLCBzcGVuZGVyLmJ5dGVzKSkpOwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgc2hhMjU2CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgc2l6ZQogICAgcmV0c3ViCgoKLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjpBcmMyMDAuX2FsbG93YW5jZShvd25lcjogYnl0ZXMsIHNwZW5kZXI6IGJ5dGVzKSAtPiBieXRlczoKX2FsbG93YW5jZToKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czoyMjcKICAgIC8vIHByaXZhdGUgX2FsbG93YW5jZShvd25lcjogQWRkcmVzcywgc3BlbmRlcjogQWRkcmVzcyk6IFVpbnROMjU2IHsKICAgIHByb3RvIDIgMQogICAgLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjIyOAogICAgLy8gY29uc3Qga2V5ID0gdGhpcy5fYXBwcm92YWxLZXkob3duZXIsIHNwZW5kZXIpOwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2FwcHJvdmFsS2V5CiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6NzIKICAgIC8vIHB1YmxpYyBhcHByb3ZhbHMgPSBCb3hNYXA8U3RhdGljQnl0ZXM8MzI+LCBBcHByb3ZhbFN0cnVjdD4oeyBrZXlQcmVmaXg6ICdhJyB9KTsKICAgIHB1c2hieXRlcyAiYSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6MjI5CiAgICAvLyBpZiAoIXRoaXMuYXBwcm92YWxzKGtleSkuZXhpc3RzKSByZXR1cm4gbmV3IFVpbnROMjU2KDApOwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogX2FsbG93YW5jZV9hZnRlcl9pZl9lbHNlQDIKICAgIGJ5dGVjIDUgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBzd2FwCiAgICByZXRzdWIKCl9hbGxvd2FuY2VfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjIzMAogICAgLy8gcmV0dXJuIHRoaXMuYXBwcm92YWxzKGtleSkudmFsdWUuYXBwcm92YWxBbW91bnQ7CiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGV4dHJhY3QgMCAzMiAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czo6QXJjMjAwLl9hcHByb3ZlKG93bmVyOiBieXRlcywgc3BlbmRlcjogYnl0ZXMsIGFtb3VudDogYnl0ZXMpIC0+IGJ5dGVzOgpfYXBwcm92ZToKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czoyMzMKICAgIC8vIHByaXZhdGUgX2FwcHJvdmUob3duZXI6IEFkZHJlc3MsIHNwZW5kZXI6IEFkZHJlc3MsIGFtb3VudDogVWludE4yNTYpOiBCb29sIHsKICAgIHByb3RvIDMgMQogICAgLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjIzNAogICAgLy8gY29uc3Qga2V5ID0gdGhpcy5fYXBwcm92YWxLZXkob3duZXIsIHNwZW5kZXIpOwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgX2FwcHJvdmFsS2V5CiAgICAvLyBjb250cmFjdHMvYXJjMjAwLmFsZ28udHM6MjM1LTIzOQogICAgLy8gY29uc3QgYXBwcm92YWxCb3g6IEFwcHJvdmFsU3RydWN0ID0gbmV3IEFwcHJvdmFsU3RydWN0KHsKICAgIC8vICAgYXBwcm92YWxBbW91bnQ6IGFtb3VudCwKICAgIC8vICAgb3duZXI6IG93bmVyLAogICAgLy8gICBzcGVuZGVyOiBzcGVuZGVyLAogICAgLy8gfSk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjcyCiAgICAvLyBwdWJsaWMgYXBwcm92YWxzID0gQm94TWFwPFN0YXRpY0J5dGVzPDMyPiwgQXBwcm92YWxTdHJ1Y3Q+KHsga2V5UHJlZml4OiAnYScgfSk7CiAgICBwdXNoYnl0ZXMgImEiCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL2FyYzIwMC5hbGdvLnRzOjI0MAogICAgLy8gdGhpcy5hcHByb3ZhbHMoa2V5KS52YWx1ZSA9IGFwcHJvdmFsQm94LmNvcHkoKTsKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czoyNDEKICAgIC8vIGVtaXQobmV3IGFyYzIwMF9BcHByb3ZhbCh7IG93bmVyOiBvd25lciwgc3BlbmRlcjogc3BlbmRlciwgdmFsdWU6IGFtb3VudCB9KSk7CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MTk2OWY4NjUgLy8gbWV0aG9kICJhcmMyMDBfQXBwcm92YWwoYWRkcmVzcyxhZGRyZXNzLHVpbnQyNTYpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDAuYWxnby50czoyNDIKICAgIC8vIHJldHVybiBuZXcgQm9vbCh0cnVlKTsKICAgIGJ5dGVjXzMgLy8gMHg4MAogICAgcmV0c3ViCg==",
261
+ clear: "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="
123
262
  },
124
- "contract": {
125
- "name": "Arc200",
126
- "desc": "",
127
- "methods": [
128
- {
129
- "name": "arc200_name",
130
- "desc": "Returns the name of the token",
131
- "readonly": true,
132
- "args": [],
133
- "returns": {
134
- "type": "string",
135
- "desc": "The name of the token"
136
- }
137
- },
138
- {
139
- "name": "arc200_symbol",
140
- "desc": "Returns the symbol of the token",
141
- "readonly": true,
142
- "args": [],
143
- "returns": {
144
- "type": "string",
145
- "desc": "The symbol of the token"
146
- }
147
- },
148
- {
149
- "name": "arc200_decimals",
150
- "desc": "Returns the decimals of the token",
151
- "readonly": true,
152
- "args": [],
153
- "returns": {
154
- "type": "uint8",
155
- "desc": "The decimals of the token"
156
- }
157
- },
158
- {
159
- "name": "arc200_totalSupply",
160
- "desc": "Returns the total supply of the token",
161
- "readonly": true,
162
- "args": [],
163
- "returns": {
164
- "type": "uint256",
165
- "desc": "The total supply of the token"
166
- }
167
- },
168
- {
169
- "name": "arc200_balanceOf",
170
- "desc": "Returns the current balance of the owner of the token",
171
- "readonly": true,
172
- "args": [
173
- {
174
- "name": "owner",
175
- "type": "address",
176
- "desc": "The address of the owner of the token"
177
- }
178
- ],
179
- "returns": {
180
- "type": "uint256",
181
- "desc": "The current balance of the holder of the token"
182
- }
183
- },
184
- {
185
- "name": "arc200_transfer",
186
- "desc": "Transfers tokens",
187
- "args": [
188
- {
189
- "name": "to",
190
- "type": "address",
191
- "desc": "The destination of the transfer"
192
- },
193
- {
194
- "name": "value",
195
- "type": "uint256",
196
- "desc": "Amount of tokens to transfer"
197
- }
198
- ],
199
- "returns": {
200
- "type": "bool",
201
- "desc": "Success"
202
- }
203
- },
204
- {
205
- "name": "arc200_transferFrom",
206
- "desc": "Transfers tokens from source to destination as approved spender",
207
- "args": [
208
- {
209
- "name": "from",
210
- "type": "address",
211
- "desc": "The source of the transfer"
212
- },
213
- {
214
- "name": "to",
215
- "type": "address",
216
- "desc": "The destination of the transfer"
217
- },
218
- {
219
- "name": "value",
220
- "type": "uint256",
221
- "desc": "Amount of tokens to transfer"
222
- }
223
- ],
224
- "returns": {
225
- "type": "bool",
226
- "desc": "Success"
227
- }
228
- },
229
- {
230
- "name": "arc200_approve",
231
- "desc": "Approve spender for a token",
232
- "args": [
233
- {
234
- "name": "spender",
235
- "type": "address",
236
- "desc": "Who is allowed to take tokens on owner's behalf"
237
- },
238
- {
239
- "name": "value",
240
- "type": "uint256",
241
- "desc": "Amount of tokens to be taken by spender"
242
- }
243
- ],
244
- "returns": {
245
- "type": "bool",
246
- "desc": "Success"
247
- }
248
- },
249
- {
250
- "name": "arc200_allowance",
251
- "desc": "Returns the current allowance of the spender of the tokens of the owner",
252
- "readonly": true,
253
- "args": [
254
- {
255
- "name": "owner",
256
- "type": "address",
257
- "desc": "Owner's account"
258
- },
259
- {
260
- "name": "spender",
261
- "type": "address",
262
- "desc": "Who is allowed to take tokens on owner's behalf"
263
- }
264
- ],
265
- "returns": {
266
- "type": "uint256",
267
- "desc": "The remaining allowance"
268
- }
269
- },
270
- {
271
- "name": "createApplication",
272
- "args": [],
273
- "returns": {
274
- "type": "void"
275
- }
276
- }
277
- ]
278
- }
263
+ byteCode: {
264
+ approval: "CiAEAQAgCCYGBBUffHUBYgF0AYAEeYPDXCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEbQQEZggoEl1OC4gRlfRPsBLauGiUEhOwT1QTsmWBBBILlc8QE2nAluQRKlo+PBLVCISUEu7MZ8zYaAI4KALAAoACQAIAAcABdAEcALgAYAAIjQzEZFEQxGEQ2GgE2GgKIAY8oTFCwIkMxGRREMRhENhoBNhoCiAFsKExQsCJDMRkURDEYRDYaATYaAjYaA4gBJShMULAiQzEZFEQxGEQ2GgE2GgKIAQIoTFCwIkMxGRREMRhENhoBiADmKExQsCJDMRkURDEYRIgA0ShMULAiQzEZFEQxGESIALooTFCwIkMxGRREMRhEiACbKExQsCJDMRkURDEYRIgAfChMULAiQzEZFEQxGEQ2GgE2GgI2GgM2GgSIABEoTFCwIkMxGUD/LzEYFEQiQ4oEATEAMgkSRIv8I1lJRCQORIv9I1lJRCUORCMqZUUBFESAAW6L/GeAAXOL/Wcqi/9ngAFki/5nMQApSwFQi/+/MgNMUIv/UCcETFCwK4kjgAFuZURXAgBJFSQSRIkjgAFzZURXAgBJFSUSRIkjgAFkZUSJIyplRImKAQGL/4gAVImKAgExAIv+i/+IAF+JigMBMQCL/UsBiACnSYv/p0SL/6FJFSQORCSvq4v9TgKIALNIi/2L/ov/iAAxiYoCATEAi/6L/4gAnImKAgGL/ov/iABuiYoBASmL/1BJvUUBQAAEJwVMiYsAvkRMiYoDAYv9iP/gSYv+iP/aTIv/p0SL/Yv+E0EAGosAi/+hSRUkDkQkr6spi/1QTL8pi/5QiwG/i/2L/lCL/1AnBExQsCuMAImKAgGL/ov/UAFJFSQSRImKAgGL/ov/iP/ngAFhTFBJvUUBQAAEJwVMiYsAvkRXACBMiYoDAYv9i/6I/8SL/4v9UIv+UIABYU8CUEy/i/2L/lCL/1CABBlp+GVMULAriQ==",
265
+ clear: "CoEBQw=="
266
+ },
267
+ compilerInfo: { compiler: "puya", compilerVersion: { major: 4, minor: 7, patch: 0 } },
268
+ events: [
269
+ {
270
+ name: "arc200_Transfer",
271
+ args: [
272
+ { type: "address", name: "from" },
273
+ { type: "address", name: "to" },
274
+ { type: "uint256", name: "value" }
275
+ ]
276
+ },
277
+ {
278
+ name: "arc200_Approval",
279
+ args: [
280
+ { type: "address", name: "owner" },
281
+ { type: "address", name: "spender" },
282
+ { type: "uint256", name: "value" }
283
+ ]
284
+ }
285
+ ],
286
+ templateVariables: {}
279
287
  };
280
- var Arc200CallFactory = class {
288
+ var Arc200ParamsFactory = class {
281
289
  /**
282
- * Gets available create call factories
290
+ * Constructs a no op call for the bootstrap(byte[],byte[],uint8,uint256)bool ABI method
291
+ *
292
+ * @param params Parameters for the call
293
+ * @returns An `AppClientMethodCallParams` object for the call
283
294
  */
284
- static get create() {
295
+ static bootstrap(params) {
285
296
  return {
286
- /**
287
- * Constructs a create call for the Arc200 smart contract using the createApplication()void ABI method
288
- *
289
- * @param args Any args for the contract call
290
- * @param params Any additional parameters for the call
291
- * @returns A TypedCallParams object for the call
292
- */
293
- createApplication(args, params = {}) {
294
- return {
295
- method: "createApplication()void",
296
- methodArgs: Array.isArray(args) ? args : [],
297
- ...params
298
- };
299
- }
297
+ ...params,
298
+ method: "bootstrap(byte[],byte[],uint8,uint256)bool",
299
+ args: Array.isArray(params.args) ? params.args : [params.args.name, params.args.symbol, params.args.decimals, params.args.totalSupply]
300
300
  };
301
301
  }
302
302
  /**
303
- * Constructs a no op call for the arc200_name()string ABI method
303
+ * Constructs a no op call for the arc200_name()byte[32] ABI method
304
304
  *
305
305
  * Returns the name of the token
306
306
  *
307
- * @param args Any args for the contract call
308
- * @param params Any additional parameters for the call
309
- * @returns A TypedCallParams object for the call
307
+ * @param params Parameters for the call
308
+ * @returns An `AppClientMethodCallParams` object for the call
310
309
  */
311
- static arc200Name(args, params) {
310
+ static arc200Name(params) {
312
311
  return {
313
- method: "arc200_name()string",
314
- methodArgs: Array.isArray(args) ? args : [],
315
- ...params
312
+ ...params,
313
+ method: "arc200_name()byte[32]",
314
+ args: Array.isArray(params.args) ? params.args : []
316
315
  };
317
316
  }
318
317
  /**
319
- * Constructs a no op call for the arc200_symbol()string ABI method
318
+ * Constructs a no op call for the arc200_symbol()byte[8] ABI method
320
319
  *
321
320
  * Returns the symbol of the token
322
321
  *
323
- * @param args Any args for the contract call
324
- * @param params Any additional parameters for the call
325
- * @returns A TypedCallParams object for the call
322
+ * @param params Parameters for the call
323
+ * @returns An `AppClientMethodCallParams` object for the call
326
324
  */
327
- static arc200Symbol(args, params) {
325
+ static arc200Symbol(params) {
328
326
  return {
329
- method: "arc200_symbol()string",
330
- methodArgs: Array.isArray(args) ? args : [],
331
- ...params
327
+ ...params,
328
+ method: "arc200_symbol()byte[8]",
329
+ args: Array.isArray(params.args) ? params.args : []
332
330
  };
333
331
  }
334
332
  /**
@@ -336,15 +334,14 @@ var Arc200CallFactory = class {
336
334
  *
337
335
  * Returns the decimals of the token
338
336
  *
339
- * @param args Any args for the contract call
340
- * @param params Any additional parameters for the call
341
- * @returns A TypedCallParams object for the call
337
+ * @param params Parameters for the call
338
+ * @returns An `AppClientMethodCallParams` object for the call
342
339
  */
343
- static arc200Decimals(args, params) {
340
+ static arc200Decimals(params) {
344
341
  return {
342
+ ...params,
345
343
  method: "arc200_decimals()uint8",
346
- methodArgs: Array.isArray(args) ? args : [],
347
- ...params
344
+ args: Array.isArray(params.args) ? params.args : []
348
345
  };
349
346
  }
350
347
  /**
@@ -352,15 +349,14 @@ var Arc200CallFactory = class {
352
349
  *
353
350
  * Returns the total supply of the token
354
351
  *
355
- * @param args Any args for the contract call
356
- * @param params Any additional parameters for the call
357
- * @returns A TypedCallParams object for the call
352
+ * @param params Parameters for the call
353
+ * @returns An `AppClientMethodCallParams` object for the call
358
354
  */
359
- static arc200TotalSupply(args, params) {
355
+ static arc200TotalSupply(params) {
360
356
  return {
357
+ ...params,
361
358
  method: "arc200_totalSupply()uint256",
362
- methodArgs: Array.isArray(args) ? args : [],
363
- ...params
359
+ args: Array.isArray(params.args) ? params.args : []
364
360
  };
365
361
  }
366
362
  /**
@@ -368,15 +364,14 @@ var Arc200CallFactory = class {
368
364
  *
369
365
  * Returns the current balance of the owner of the token
370
366
  *
371
- * @param args Any args for the contract call
372
- * @param params Any additional parameters for the call
373
- * @returns A TypedCallParams object for the call
367
+ * @param params Parameters for the call
368
+ * @returns An `AppClientMethodCallParams` object for the call
374
369
  */
375
- static arc200BalanceOf(args, params) {
370
+ static arc200BalanceOf(params) {
376
371
  return {
372
+ ...params,
377
373
  method: "arc200_balanceOf(address)uint256",
378
- methodArgs: Array.isArray(args) ? args : [args.owner],
379
- ...params
374
+ args: Array.isArray(params.args) ? params.args : [params.args.owner]
380
375
  };
381
376
  }
382
377
  /**
@@ -384,15 +379,14 @@ var Arc200CallFactory = class {
384
379
  *
385
380
  * Transfers tokens
386
381
  *
387
- * @param args Any args for the contract call
388
- * @param params Any additional parameters for the call
389
- * @returns A TypedCallParams object for the call
382
+ * @param params Parameters for the call
383
+ * @returns An `AppClientMethodCallParams` object for the call
390
384
  */
391
- static arc200Transfer(args, params) {
385
+ static arc200Transfer(params) {
392
386
  return {
387
+ ...params,
393
388
  method: "arc200_transfer(address,uint256)bool",
394
- methodArgs: Array.isArray(args) ? args : [args.to, args.value],
395
- ...params
389
+ args: Array.isArray(params.args) ? params.args : [params.args.to, params.args.value]
396
390
  };
397
391
  }
398
392
  /**
@@ -400,15 +394,14 @@ var Arc200CallFactory = class {
400
394
  *
401
395
  * Transfers tokens from source to destination as approved spender
402
396
  *
403
- * @param args Any args for the contract call
404
- * @param params Any additional parameters for the call
405
- * @returns A TypedCallParams object for the call
397
+ * @param params Parameters for the call
398
+ * @returns An `AppClientMethodCallParams` object for the call
406
399
  */
407
- static arc200TransferFrom(args, params) {
400
+ static arc200TransferFrom(params) {
408
401
  return {
402
+ ...params,
409
403
  method: "arc200_transferFrom(address,address,uint256)bool",
410
- methodArgs: Array.isArray(args) ? args : [args.from, args.to, args.value],
411
- ...params
404
+ args: Array.isArray(params.args) ? params.args : [params.args.from, params.args.to, params.args.value]
412
405
  };
413
406
  }
414
407
  /**
@@ -416,15 +409,14 @@ var Arc200CallFactory = class {
416
409
  *
417
410
  * Approve spender for a token
418
411
  *
419
- * @param args Any args for the contract call
420
- * @param params Any additional parameters for the call
421
- * @returns A TypedCallParams object for the call
412
+ * @param params Parameters for the call
413
+ * @returns An `AppClientMethodCallParams` object for the call
422
414
  */
423
- static arc200Approve(args, params) {
415
+ static arc200Approve(params) {
424
416
  return {
417
+ ...params,
425
418
  method: "arc200_approve(address,uint256)bool",
426
- methodArgs: Array.isArray(args) ? args : [args.spender, args.value],
427
- ...params
419
+ args: Array.isArray(params.args) ? params.args : [params.args.spender, params.args.value]
428
420
  };
429
421
  }
430
422
  /**
@@ -432,56 +424,121 @@ var Arc200CallFactory = class {
432
424
  *
433
425
  * Returns the current allowance of the spender of the tokens of the owner
434
426
  *
435
- * @param args Any args for the contract call
436
- * @param params Any additional parameters for the call
437
- * @returns A TypedCallParams object for the call
427
+ * @param params Parameters for the call
428
+ * @returns An `AppClientMethodCallParams` object for the call
438
429
  */
439
- static arc200Allowance(args, params) {
430
+ static arc200Allowance(params) {
440
431
  return {
432
+ ...params,
441
433
  method: "arc200_allowance(address,address)uint256",
442
- methodArgs: Array.isArray(args) ? args : [args.owner, args.spender],
443
- ...params
434
+ args: Array.isArray(params.args) ? params.args : [params.args.owner, params.args.spender]
444
435
  };
445
436
  }
446
437
  };
447
- var Arc200Client = class {
438
+ var Arc200Factory = class {
448
439
  /**
449
- * Creates a new instance of `Arc200Client`
440
+ * Creates a new instance of `Arc200Factory`
450
441
  *
451
- * @param appDetails appDetails The details to identify the app to deploy
452
- * @param algod An algod client instance
442
+ * @param params The parameters to initialise the app factory with
453
443
  */
454
- constructor(appDetails, algod) {
455
- this.algod = algod;
456
- this.sender = appDetails.sender;
457
- this.appClient = algokit.getAppClient({
458
- ...appDetails,
459
- app: APP_SPEC
460
- }, algod);
444
+ constructor(params) {
445
+ /**
446
+ * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.
447
+ */
448
+ this.params = {
449
+ /**
450
+ * Gets available create methods
451
+ */
452
+ create: {
453
+ /**
454
+ * Creates a new instance of the Arc200 smart contract using a bare call.
455
+ *
456
+ * @param params The params for the bare (raw) call
457
+ * @returns The params for a create call
458
+ */
459
+ bare: (params) => {
460
+ return this.appFactory.params.bare.create(params);
461
+ }
462
+ }
463
+ };
464
+ /**
465
+ * Create transactions for the current app
466
+ */
467
+ this.createTransaction = {
468
+ /**
469
+ * Gets available create methods
470
+ */
471
+ create: {
472
+ /**
473
+ * Creates a new instance of the Arc200 smart contract using a bare call.
474
+ *
475
+ * @param params The params for the bare (raw) call
476
+ * @returns The transaction for a create call
477
+ */
478
+ bare: (params) => {
479
+ return this.appFactory.createTransaction.bare.create(params);
480
+ }
481
+ }
482
+ };
483
+ /**
484
+ * Send calls to the current app
485
+ */
486
+ this.send = {
487
+ /**
488
+ * Gets available create methods
489
+ */
490
+ create: {
491
+ /**
492
+ * Creates a new instance of the Arc200 smart contract using a bare call.
493
+ *
494
+ * @param params The params for the bare (raw) call
495
+ * @returns The create result
496
+ */
497
+ bare: async (params) => {
498
+ const result = await this.appFactory.send.bare.create(params);
499
+ return { result: result.result, appClient: new Arc200Client(result.appClient) };
500
+ }
501
+ }
502
+ };
503
+ this.appFactory = new import_app_factory.AppFactory({
504
+ ...params,
505
+ appSpec: APP_SPEC
506
+ });
507
+ }
508
+ /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */
509
+ get appName() {
510
+ return this.appFactory.appName;
511
+ }
512
+ /** The ARC-56 app spec being used */
513
+ get appSpec() {
514
+ return APP_SPEC;
515
+ }
516
+ /** A reference to the underlying `AlgorandClient` this app factory is using. */
517
+ get algorand() {
518
+ return this.appFactory.algorand;
461
519
  }
462
520
  /**
463
- * Checks for decode errors on the AppCallTransactionResult and maps the return value to the specified generic type
521
+ * Returns a new `AppClient` client for an app instance of the given ID.
464
522
  *
465
- * @param result The AppCallTransactionResult to be mapped
466
- * @param returnValueFormatter An optional delegate to format the return value if required
467
- * @returns The smart contract response with an updated return value
523
+ * Automatically populates appName, defaultSender and source maps from the factory
524
+ * if not specified in the params.
525
+ * @param params The parameters to create the app client
526
+ * @returns The `AppClient`
468
527
  */
469
- mapReturnValue(result, returnValueFormatter) {
470
- if (result.return?.decodeError) {
471
- throw result.return.decodeError;
472
- }
473
- const returnValue = result.return?.returnValue !== void 0 && returnValueFormatter !== void 0 ? returnValueFormatter(result.return.returnValue) : result.return?.returnValue;
474
- return { ...result, return: returnValue };
528
+ getAppClientById(params) {
529
+ return new Arc200Client(this.appFactory.getAppClientById(params));
475
530
  }
476
531
  /**
477
- * Calls the ABI method with the matching signature using an onCompletion code of NO_OP
532
+ * Returns a new `AppClient` client, resolving the app by creator address and name
533
+ * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).
478
534
  *
479
- * @param typedCallParams An object containing the method signature, args, and any other relevant parameters
480
- * @param returnValueFormatter An optional delegate which when provided will be used to map non-undefined return values to the target type
481
- * @returns The result of the smart contract call
535
+ * Automatically populates appName, defaultSender and source maps from the factory
536
+ * if not specified in the params.
537
+ * @param params The parameters to create the app client
538
+ * @returns The `AppClient`
482
539
  */
483
- async call(typedCallParams, returnValueFormatter) {
484
- return this.mapReturnValue(await this.appClient.call(typedCallParams), returnValueFormatter);
540
+ async getAppClientByCreatorAndName(params) {
541
+ return new Arc200Client(await this.appFactory.getAppClientByCreatorAndName(params));
485
542
  }
486
543
  /**
487
544
  * Idempotently deploys the Arc200 smart contract.
@@ -489,227 +546,832 @@ var Arc200Client = class {
489
546
  * @param params The arguments for the contract calls and any additional parameters for the call
490
547
  * @returns The deployment result
491
548
  */
492
- deploy(params = {}) {
493
- const createArgs = params.createCall?.(Arc200CallFactory.create);
494
- return this.appClient.deploy({
495
- ...params,
496
- createArgs,
497
- createOnCompleteAction: createArgs?.onCompleteAction
549
+ async deploy(params = {}) {
550
+ const result = await this.appFactory.deploy({
551
+ ...params
498
552
  });
553
+ return { result: result.result, appClient: new Arc200Client(result.appClient) };
499
554
  }
500
- /**
501
- * Gets available create methods
502
- */
503
- get create() {
504
- const $this = this;
505
- return {
555
+ };
556
+ var Arc200Client = class _Arc200Client {
557
+ constructor(appClientOrParams) {
558
+ /**
559
+ * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.
560
+ */
561
+ this.params = {
562
+ /**
563
+ * Makes a clear_state call to an existing instance of the Arc200 smart contract.
564
+ *
565
+ * @param params The params for the bare (raw) call
566
+ * @returns The clearState result
567
+ */
568
+ clearState: (params) => {
569
+ return this.appClient.params.bare.clearState(params);
570
+ },
571
+ /**
572
+ * Makes a call to the Arc200 smart contract using the `bootstrap(byte[],byte[],uint8,uint256)bool` ABI method.
573
+ *
574
+ * @param params The params for the smart contract call
575
+ * @returns The call params
576
+ */
577
+ bootstrap: (params) => {
578
+ return this.appClient.params.call(Arc200ParamsFactory.bootstrap(params));
579
+ },
580
+ /**
581
+ * Makes a call to the Arc200 smart contract using the `arc200_name()byte[32]` ABI method.
582
+ *
583
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
584
+ *
585
+ * Returns the name of the token
586
+ *
587
+ * @param params The params for the smart contract call
588
+ * @returns The call params: The name of the token
589
+ */
590
+ arc200Name: (params = { args: [] }) => {
591
+ return this.appClient.params.call(Arc200ParamsFactory.arc200Name(params));
592
+ },
593
+ /**
594
+ * Makes a call to the Arc200 smart contract using the `arc200_symbol()byte[8]` ABI method.
595
+ *
596
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
597
+ *
598
+ * Returns the symbol of the token
599
+ *
600
+ * @param params The params for the smart contract call
601
+ * @returns The call params: The symbol of the token
602
+ */
603
+ arc200Symbol: (params = { args: [] }) => {
604
+ return this.appClient.params.call(Arc200ParamsFactory.arc200Symbol(params));
605
+ },
606
+ /**
607
+ * Makes a call to the Arc200 smart contract using the `arc200_decimals()uint8` ABI method.
608
+ *
609
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
610
+ *
611
+ * Returns the decimals of the token
612
+ *
613
+ * @param params The params for the smart contract call
614
+ * @returns The call params: The decimals of the token
615
+ */
616
+ arc200Decimals: (params = { args: [] }) => {
617
+ return this.appClient.params.call(Arc200ParamsFactory.arc200Decimals(params));
618
+ },
619
+ /**
620
+ * Makes a call to the Arc200 smart contract using the `arc200_totalSupply()uint256` ABI method.
621
+ *
622
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
623
+ *
624
+ * Returns the total supply of the token
625
+ *
626
+ * @param params The params for the smart contract call
627
+ * @returns The call params: The total supply of the token
628
+ */
629
+ arc200TotalSupply: (params = { args: [] }) => {
630
+ return this.appClient.params.call(Arc200ParamsFactory.arc200TotalSupply(params));
631
+ },
632
+ /**
633
+ * Makes a call to the Arc200 smart contract using the `arc200_balanceOf(address)uint256` ABI method.
634
+ *
635
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
636
+ *
637
+ * Returns the current balance of the owner of the token
638
+ *
639
+ * @param params The params for the smart contract call
640
+ * @returns The call params: The current balance of the holder of the token
641
+ */
642
+ arc200BalanceOf: (params) => {
643
+ return this.appClient.params.call(Arc200ParamsFactory.arc200BalanceOf(params));
644
+ },
645
+ /**
646
+ * Makes a call to the Arc200 smart contract using the `arc200_transfer(address,uint256)bool` ABI method.
647
+ *
648
+ * Transfers tokens
649
+ *
650
+ * @param params The params for the smart contract call
651
+ * @returns The call params: Success
652
+ */
653
+ arc200Transfer: (params) => {
654
+ return this.appClient.params.call(Arc200ParamsFactory.arc200Transfer(params));
655
+ },
656
+ /**
657
+ * Makes a call to the Arc200 smart contract using the `arc200_transferFrom(address,address,uint256)bool` ABI method.
658
+ *
659
+ * Transfers tokens from source to destination as approved spender
660
+ *
661
+ * @param params The params for the smart contract call
662
+ * @returns The call params: Success
663
+ */
664
+ arc200TransferFrom: (params) => {
665
+ return this.appClient.params.call(Arc200ParamsFactory.arc200TransferFrom(params));
666
+ },
667
+ /**
668
+ * Makes a call to the Arc200 smart contract using the `arc200_approve(address,uint256)bool` ABI method.
669
+ *
670
+ * Approve spender for a token
671
+ *
672
+ * @param params The params for the smart contract call
673
+ * @returns The call params: Success
674
+ */
675
+ arc200Approve: (params) => {
676
+ return this.appClient.params.call(Arc200ParamsFactory.arc200Approve(params));
677
+ },
678
+ /**
679
+ * Makes a call to the Arc200 smart contract using the `arc200_allowance(address,address)uint256` ABI method.
680
+ *
681
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
682
+ *
683
+ * Returns the current allowance of the spender of the tokens of the owner
684
+ *
685
+ * @param params The params for the smart contract call
686
+ * @returns The call params: The remaining allowance
687
+ */
688
+ arc200Allowance: (params) => {
689
+ return this.appClient.params.call(Arc200ParamsFactory.arc200Allowance(params));
690
+ }
691
+ };
692
+ /**
693
+ * Create transactions for the current app
694
+ */
695
+ this.createTransaction = {
696
+ /**
697
+ * Makes a clear_state call to an existing instance of the Arc200 smart contract.
698
+ *
699
+ * @param params The params for the bare (raw) call
700
+ * @returns The clearState result
701
+ */
702
+ clearState: (params) => {
703
+ return this.appClient.createTransaction.bare.clearState(params);
704
+ },
705
+ /**
706
+ * Makes a call to the Arc200 smart contract using the `bootstrap(byte[],byte[],uint8,uint256)bool` ABI method.
707
+ *
708
+ * @param params The params for the smart contract call
709
+ * @returns The call transaction
710
+ */
711
+ bootstrap: (params) => {
712
+ return this.appClient.createTransaction.call(Arc200ParamsFactory.bootstrap(params));
713
+ },
714
+ /**
715
+ * Makes a call to the Arc200 smart contract using the `arc200_name()byte[32]` ABI method.
716
+ *
717
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
718
+ *
719
+ * Returns the name of the token
720
+ *
721
+ * @param params The params for the smart contract call
722
+ * @returns The call transaction: The name of the token
723
+ */
724
+ arc200Name: (params = { args: [] }) => {
725
+ return this.appClient.createTransaction.call(Arc200ParamsFactory.arc200Name(params));
726
+ },
506
727
  /**
507
- * Creates a new instance of the Arc200 smart contract using the createApplication()void ABI method.
728
+ * Makes a call to the Arc200 smart contract using the `arc200_symbol()byte[8]` ABI method.
729
+ *
730
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
731
+ *
732
+ * Returns the symbol of the token
508
733
  *
509
- * @param args The arguments for the smart contract call
510
- * @param params Any additional parameters for the call
511
- * @returns The create result
734
+ * @param params The params for the smart contract call
735
+ * @returns The call transaction: The symbol of the token
512
736
  */
513
- async createApplication(args, params = {}) {
514
- return $this.mapReturnValue(await $this.appClient.create(Arc200CallFactory.create.createApplication(args, params)));
737
+ arc200Symbol: (params = { args: [] }) => {
738
+ return this.appClient.createTransaction.call(Arc200ParamsFactory.arc200Symbol(params));
739
+ },
740
+ /**
741
+ * Makes a call to the Arc200 smart contract using the `arc200_decimals()uint8` ABI method.
742
+ *
743
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
744
+ *
745
+ * Returns the decimals of the token
746
+ *
747
+ * @param params The params for the smart contract call
748
+ * @returns The call transaction: The decimals of the token
749
+ */
750
+ arc200Decimals: (params = { args: [] }) => {
751
+ return this.appClient.createTransaction.call(Arc200ParamsFactory.arc200Decimals(params));
752
+ },
753
+ /**
754
+ * Makes a call to the Arc200 smart contract using the `arc200_totalSupply()uint256` ABI method.
755
+ *
756
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
757
+ *
758
+ * Returns the total supply of the token
759
+ *
760
+ * @param params The params for the smart contract call
761
+ * @returns The call transaction: The total supply of the token
762
+ */
763
+ arc200TotalSupply: (params = { args: [] }) => {
764
+ return this.appClient.createTransaction.call(Arc200ParamsFactory.arc200TotalSupply(params));
765
+ },
766
+ /**
767
+ * Makes a call to the Arc200 smart contract using the `arc200_balanceOf(address)uint256` ABI method.
768
+ *
769
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
770
+ *
771
+ * Returns the current balance of the owner of the token
772
+ *
773
+ * @param params The params for the smart contract call
774
+ * @returns The call transaction: The current balance of the holder of the token
775
+ */
776
+ arc200BalanceOf: (params) => {
777
+ return this.appClient.createTransaction.call(Arc200ParamsFactory.arc200BalanceOf(params));
778
+ },
779
+ /**
780
+ * Makes a call to the Arc200 smart contract using the `arc200_transfer(address,uint256)bool` ABI method.
781
+ *
782
+ * Transfers tokens
783
+ *
784
+ * @param params The params for the smart contract call
785
+ * @returns The call transaction: Success
786
+ */
787
+ arc200Transfer: (params) => {
788
+ return this.appClient.createTransaction.call(Arc200ParamsFactory.arc200Transfer(params));
789
+ },
790
+ /**
791
+ * Makes a call to the Arc200 smart contract using the `arc200_transferFrom(address,address,uint256)bool` ABI method.
792
+ *
793
+ * Transfers tokens from source to destination as approved spender
794
+ *
795
+ * @param params The params for the smart contract call
796
+ * @returns The call transaction: Success
797
+ */
798
+ arc200TransferFrom: (params) => {
799
+ return this.appClient.createTransaction.call(Arc200ParamsFactory.arc200TransferFrom(params));
800
+ },
801
+ /**
802
+ * Makes a call to the Arc200 smart contract using the `arc200_approve(address,uint256)bool` ABI method.
803
+ *
804
+ * Approve spender for a token
805
+ *
806
+ * @param params The params for the smart contract call
807
+ * @returns The call transaction: Success
808
+ */
809
+ arc200Approve: (params) => {
810
+ return this.appClient.createTransaction.call(Arc200ParamsFactory.arc200Approve(params));
811
+ },
812
+ /**
813
+ * Makes a call to the Arc200 smart contract using the `arc200_allowance(address,address)uint256` ABI method.
814
+ *
815
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
816
+ *
817
+ * Returns the current allowance of the spender of the tokens of the owner
818
+ *
819
+ * @param params The params for the smart contract call
820
+ * @returns The call transaction: The remaining allowance
821
+ */
822
+ arc200Allowance: (params) => {
823
+ return this.appClient.createTransaction.call(Arc200ParamsFactory.arc200Allowance(params));
515
824
  }
516
825
  };
826
+ /**
827
+ * Send calls to the current app
828
+ */
829
+ this.send = {
830
+ /**
831
+ * Makes a clear_state call to an existing instance of the Arc200 smart contract.
832
+ *
833
+ * @param params The params for the bare (raw) call
834
+ * @returns The clearState result
835
+ */
836
+ clearState: (params) => {
837
+ return this.appClient.send.bare.clearState(params);
838
+ },
839
+ /**
840
+ * Makes a call to the Arc200 smart contract using the `bootstrap(byte[],byte[],uint8,uint256)bool` ABI method.
841
+ *
842
+ * @param params The params for the smart contract call
843
+ * @returns The call result
844
+ */
845
+ bootstrap: async (params) => {
846
+ const result = await this.appClient.send.call(Arc200ParamsFactory.bootstrap(params));
847
+ return {
848
+ ...result,
849
+ return: result.return
850
+ };
851
+ },
852
+ /**
853
+ * Makes a call to the Arc200 smart contract using the `arc200_name()byte[32]` ABI method.
854
+ *
855
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
856
+ *
857
+ * Returns the name of the token
858
+ *
859
+ * @param params The params for the smart contract call
860
+ * @returns The call result: The name of the token
861
+ */
862
+ arc200Name: async (params = { args: [] }) => {
863
+ const result = await this.appClient.send.call(Arc200ParamsFactory.arc200Name(params));
864
+ return { ...result, return: result.return };
865
+ },
866
+ /**
867
+ * Makes a call to the Arc200 smart contract using the `arc200_symbol()byte[8]` ABI method.
868
+ *
869
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
870
+ *
871
+ * Returns the symbol of the token
872
+ *
873
+ * @param params The params for the smart contract call
874
+ * @returns The call result: The symbol of the token
875
+ */
876
+ arc200Symbol: async (params = { args: [] }) => {
877
+ const result = await this.appClient.send.call(Arc200ParamsFactory.arc200Symbol(params));
878
+ return { ...result, return: result.return };
879
+ },
880
+ /**
881
+ * Makes a call to the Arc200 smart contract using the `arc200_decimals()uint8` ABI method.
882
+ *
883
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
884
+ *
885
+ * Returns the decimals of the token
886
+ *
887
+ * @param params The params for the smart contract call
888
+ * @returns The call result: The decimals of the token
889
+ */
890
+ arc200Decimals: async (params = { args: [] }) => {
891
+ const result = await this.appClient.send.call(Arc200ParamsFactory.arc200Decimals(params));
892
+ return { ...result, return: result.return };
893
+ },
894
+ /**
895
+ * Makes a call to the Arc200 smart contract using the `arc200_totalSupply()uint256` ABI method.
896
+ *
897
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
898
+ *
899
+ * Returns the total supply of the token
900
+ *
901
+ * @param params The params for the smart contract call
902
+ * @returns The call result: The total supply of the token
903
+ */
904
+ arc200TotalSupply: async (params = { args: [] }) => {
905
+ const result = await this.appClient.send.call(Arc200ParamsFactory.arc200TotalSupply(params));
906
+ return {
907
+ ...result,
908
+ return: result.return
909
+ };
910
+ },
911
+ /**
912
+ * Makes a call to the Arc200 smart contract using the `arc200_balanceOf(address)uint256` ABI method.
913
+ *
914
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
915
+ *
916
+ * Returns the current balance of the owner of the token
917
+ *
918
+ * @param params The params for the smart contract call
919
+ * @returns The call result: The current balance of the holder of the token
920
+ */
921
+ arc200BalanceOf: async (params) => {
922
+ const result = await this.appClient.send.call(Arc200ParamsFactory.arc200BalanceOf(params));
923
+ return {
924
+ ...result,
925
+ return: result.return
926
+ };
927
+ },
928
+ /**
929
+ * Makes a call to the Arc200 smart contract using the `arc200_transfer(address,uint256)bool` ABI method.
930
+ *
931
+ * Transfers tokens
932
+ *
933
+ * @param params The params for the smart contract call
934
+ * @returns The call result: Success
935
+ */
936
+ arc200Transfer: async (params) => {
937
+ const result = await this.appClient.send.call(Arc200ParamsFactory.arc200Transfer(params));
938
+ return {
939
+ ...result,
940
+ return: result.return
941
+ };
942
+ },
943
+ /**
944
+ * Makes a call to the Arc200 smart contract using the `arc200_transferFrom(address,address,uint256)bool` ABI method.
945
+ *
946
+ * Transfers tokens from source to destination as approved spender
947
+ *
948
+ * @param params The params for the smart contract call
949
+ * @returns The call result: Success
950
+ */
951
+ arc200TransferFrom: async (params) => {
952
+ const result = await this.appClient.send.call(Arc200ParamsFactory.arc200TransferFrom(params));
953
+ return {
954
+ ...result,
955
+ return: result.return
956
+ };
957
+ },
958
+ /**
959
+ * Makes a call to the Arc200 smart contract using the `arc200_approve(address,uint256)bool` ABI method.
960
+ *
961
+ * Approve spender for a token
962
+ *
963
+ * @param params The params for the smart contract call
964
+ * @returns The call result: Success
965
+ */
966
+ arc200Approve: async (params) => {
967
+ const result = await this.appClient.send.call(Arc200ParamsFactory.arc200Approve(params));
968
+ return {
969
+ ...result,
970
+ return: result.return
971
+ };
972
+ },
973
+ /**
974
+ * Makes a call to the Arc200 smart contract using the `arc200_allowance(address,address)uint256` ABI method.
975
+ *
976
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
977
+ *
978
+ * Returns the current allowance of the spender of the tokens of the owner
979
+ *
980
+ * @param params The params for the smart contract call
981
+ * @returns The call result: The remaining allowance
982
+ */
983
+ arc200Allowance: async (params) => {
984
+ const result = await this.appClient.send.call(Arc200ParamsFactory.arc200Allowance(params));
985
+ return {
986
+ ...result,
987
+ return: result.return
988
+ };
989
+ }
990
+ };
991
+ /**
992
+ * Methods to access state for the current Arc200 app
993
+ */
994
+ this.state = {
995
+ /**
996
+ * Methods to access global state for the current Arc200 app
997
+ */
998
+ global: {
999
+ /**
1000
+ * Get all current keyed values from global state
1001
+ */
1002
+ getAll: async () => {
1003
+ const result = await this.appClient.state.global.getAll();
1004
+ return {
1005
+ name: result.name,
1006
+ symbol: result.symbol,
1007
+ decimals: result.decimals,
1008
+ totalSupply: result.totalSupply
1009
+ };
1010
+ },
1011
+ /**
1012
+ * Get the current value of the name key in global state
1013
+ */
1014
+ name: async () => {
1015
+ return await this.appClient.state.global.getValue("name");
1016
+ },
1017
+ /**
1018
+ * Get the current value of the symbol key in global state
1019
+ */
1020
+ symbol: async () => {
1021
+ return await this.appClient.state.global.getValue("symbol");
1022
+ },
1023
+ /**
1024
+ * Get the current value of the decimals key in global state
1025
+ */
1026
+ decimals: async () => {
1027
+ return await this.appClient.state.global.getValue("decimals");
1028
+ },
1029
+ /**
1030
+ * Get the current value of the totalSupply key in global state
1031
+ */
1032
+ totalSupply: async () => {
1033
+ return await this.appClient.state.global.getValue("totalSupply");
1034
+ }
1035
+ },
1036
+ /**
1037
+ * Methods to access box state for the current Arc200 app
1038
+ */
1039
+ box: {
1040
+ /**
1041
+ * Get all current keyed values from box state
1042
+ */
1043
+ getAll: async () => {
1044
+ const result = await this.appClient.state.box.getAll();
1045
+ return {};
1046
+ },
1047
+ /**
1048
+ * Get values from the balances map in box state
1049
+ */
1050
+ balances: {
1051
+ /**
1052
+ * Get all current values of the balances map in box state
1053
+ */
1054
+ getMap: async () => {
1055
+ return await this.appClient.state.box.getMap("balances");
1056
+ },
1057
+ /**
1058
+ * Get a current value of the balances map by key from box state
1059
+ */
1060
+ value: async (key) => {
1061
+ return await this.appClient.state.box.getMapValue("balances", key);
1062
+ }
1063
+ },
1064
+ /**
1065
+ * Get values from the approvals map in box state
1066
+ */
1067
+ approvals: {
1068
+ /**
1069
+ * Get all current values of the approvals map in box state
1070
+ */
1071
+ getMap: async () => {
1072
+ return await this.appClient.state.box.getMap("approvals");
1073
+ },
1074
+ /**
1075
+ * Get a current value of the approvals map by key from box state
1076
+ */
1077
+ value: async (key) => {
1078
+ return await this.appClient.state.box.getMapValue("approvals", key);
1079
+ }
1080
+ }
1081
+ }
1082
+ };
1083
+ this.appClient = appClientOrParams instanceof import_app_client.AppClient ? appClientOrParams : new import_app_client.AppClient({
1084
+ ...appClientOrParams,
1085
+ appSpec: APP_SPEC
1086
+ });
517
1087
  }
518
1088
  /**
519
- * Makes a clear_state call to an existing instance of the Arc200 smart contract.
520
- *
521
- * @param args The arguments for the bare call
522
- * @returns The clear_state result
1089
+ * Checks for decode errors on the given return value and maps the return value to the return type for the given method
1090
+ * @returns The typed return value or undefined if there was no value
523
1091
  */
524
- clearState(args = {}) {
525
- return this.appClient.clearState(args);
1092
+ decodeReturnValue(method, returnValue) {
1093
+ return returnValue !== void 0 ? (0, import_app_arc56.getArc56ReturnValue)(
1094
+ returnValue,
1095
+ this.appClient.getABIMethod(method),
1096
+ APP_SPEC.structs
1097
+ ) : void 0;
526
1098
  }
527
1099
  /**
528
- * Calls the arc200_name()string ABI method.
529
- *
530
- * Returns the name of the token
531
- *
532
- * @param args The arguments for the contract call
533
- * @param params Any additional parameters for the call
534
- * @returns The result of the call: The name of the token
1100
+ * Returns a new `Arc200Client` client, resolving the app by creator address and name
1101
+ * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).
1102
+ * @param params The parameters to create the app client
535
1103
  */
536
- arc200Name(args, params = {}) {
537
- return this.call(Arc200CallFactory.arc200Name(args, params));
1104
+ static async fromCreatorAndName(params) {
1105
+ return new _Arc200Client(await import_app_client.AppClient.fromCreatorAndName({ ...params, appSpec: APP_SPEC }));
538
1106
  }
539
1107
  /**
540
- * Calls the arc200_symbol()string ABI method.
1108
+ * Returns an `Arc200Client` instance for the current network based on
1109
+ * pre-determined network-specific app IDs specified in the ARC-56 app spec.
541
1110
  *
542
- * Returns the symbol of the token
543
- *
544
- * @param args The arguments for the contract call
545
- * @param params Any additional parameters for the call
546
- * @returns The result of the call: The symbol of the token
1111
+ * If no IDs are in the app spec or the network isn't recognised, an error is thrown.
1112
+ * @param params The parameters to create the app client
547
1113
  */
548
- arc200Symbol(args, params = {}) {
549
- return this.call(Arc200CallFactory.arc200Symbol(args, params));
1114
+ static async fromNetwork(params) {
1115
+ return new _Arc200Client(await import_app_client.AppClient.fromNetwork({ ...params, appSpec: APP_SPEC }));
1116
+ }
1117
+ /** The ID of the app instance this client is linked to. */
1118
+ get appId() {
1119
+ return this.appClient.appId;
1120
+ }
1121
+ /** The app address of the app instance this client is linked to. */
1122
+ get appAddress() {
1123
+ return this.appClient.appAddress;
1124
+ }
1125
+ /** The name of the app. */
1126
+ get appName() {
1127
+ return this.appClient.appName;
1128
+ }
1129
+ /** The ARC-56 app spec being used */
1130
+ get appSpec() {
1131
+ return this.appClient.appSpec;
1132
+ }
1133
+ /** A reference to the underlying `AlgorandClient` this app client is using. */
1134
+ get algorand() {
1135
+ return this.appClient.algorand;
550
1136
  }
551
1137
  /**
552
- * Calls the arc200_decimals()uint8 ABI method.
553
- *
554
- * Returns the decimals of the token
1138
+ * Clone this app client with different params
555
1139
  *
556
- * @param args The arguments for the contract call
557
- * @param params Any additional parameters for the call
558
- * @returns The result of the call: The decimals of the token
1140
+ * @param params The params to use for the the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value.
1141
+ * @returns A new app client with the altered params
559
1142
  */
560
- arc200Decimals(args, params = {}) {
561
- return this.call(Arc200CallFactory.arc200Decimals(args, params));
1143
+ clone(params) {
1144
+ return new _Arc200Client(this.appClient.clone(params));
562
1145
  }
563
1146
  /**
564
- * Calls the arc200_totalSupply()uint256 ABI method.
1147
+ * Makes a readonly (simulated) call to the Arc200 smart contract using the `arc200_name()byte[32]` ABI method.
565
1148
  *
566
- * Returns the total supply of the token
1149
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1150
+ *
1151
+ * Returns the name of the token
567
1152
  *
568
- * @param args The arguments for the contract call
569
- * @param params Any additional parameters for the call
570
- * @returns The result of the call: The total supply of the token
1153
+ * @param params The params for the smart contract call
1154
+ * @returns The call result: The name of the token
571
1155
  */
572
- arc200TotalSupply(args, params = {}) {
573
- return this.call(Arc200CallFactory.arc200TotalSupply(args, params));
1156
+ async arc200Name(params = {
1157
+ args: []
1158
+ }) {
1159
+ const result = await this.appClient.send.call(Arc200ParamsFactory.arc200Name(params));
1160
+ return result.return;
574
1161
  }
575
1162
  /**
576
- * Calls the arc200_balanceOf(address)uint256 ABI method.
1163
+ * Makes a readonly (simulated) call to the Arc200 smart contract using the `arc200_symbol()byte[8]` ABI method.
577
1164
  *
578
- * Returns the current balance of the owner of the token
1165
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1166
+ *
1167
+ * Returns the symbol of the token
579
1168
  *
580
- * @param args The arguments for the contract call
581
- * @param params Any additional parameters for the call
582
- * @returns The result of the call: The current balance of the holder of the token
1169
+ * @param params The params for the smart contract call
1170
+ * @returns The call result: The symbol of the token
583
1171
  */
584
- arc200BalanceOf(args, params = {}) {
585
- return this.call(Arc200CallFactory.arc200BalanceOf(args, params));
1172
+ async arc200Symbol(params = {
1173
+ args: []
1174
+ }) {
1175
+ const result = await this.appClient.send.call(Arc200ParamsFactory.arc200Symbol(params));
1176
+ return result.return;
586
1177
  }
587
1178
  /**
588
- * Calls the arc200_transfer(address,uint256)bool ABI method.
1179
+ * Makes a readonly (simulated) call to the Arc200 smart contract using the `arc200_decimals()uint8` ABI method.
589
1180
  *
590
- * Transfers tokens
1181
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1182
+ *
1183
+ * Returns the decimals of the token
591
1184
  *
592
- * @param args The arguments for the contract call
593
- * @param params Any additional parameters for the call
594
- * @returns The result of the call: Success
1185
+ * @param params The params for the smart contract call
1186
+ * @returns The call result: The decimals of the token
595
1187
  */
596
- arc200Transfer(args, params = {}) {
597
- return this.call(Arc200CallFactory.arc200Transfer(args, params));
1188
+ async arc200Decimals(params = {
1189
+ args: []
1190
+ }) {
1191
+ const result = await this.appClient.send.call(Arc200ParamsFactory.arc200Decimals(params));
1192
+ return result.return;
598
1193
  }
599
1194
  /**
600
- * Calls the arc200_transferFrom(address,address,uint256)bool ABI method.
1195
+ * Makes a readonly (simulated) call to the Arc200 smart contract using the `arc200_totalSupply()uint256` ABI method.
601
1196
  *
602
- * Transfers tokens from source to destination as approved spender
1197
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1198
+ *
1199
+ * Returns the total supply of the token
603
1200
  *
604
- * @param args The arguments for the contract call
605
- * @param params Any additional parameters for the call
606
- * @returns The result of the call: Success
1201
+ * @param params The params for the smart contract call
1202
+ * @returns The call result: The total supply of the token
607
1203
  */
608
- arc200TransferFrom(args, params = {}) {
609
- return this.call(Arc200CallFactory.arc200TransferFrom(args, params));
1204
+ async arc200TotalSupply(params = { args: [] }) {
1205
+ const result = await this.appClient.send.call(Arc200ParamsFactory.arc200TotalSupply(params));
1206
+ return result.return;
610
1207
  }
611
1208
  /**
612
- * Calls the arc200_approve(address,uint256)bool ABI method.
1209
+ * Makes a readonly (simulated) call to the Arc200 smart contract using the `arc200_balanceOf(address)uint256` ABI method.
613
1210
  *
614
- * Approve spender for a token
1211
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1212
+ *
1213
+ * Returns the current balance of the owner of the token
615
1214
  *
616
- * @param args The arguments for the contract call
617
- * @param params Any additional parameters for the call
618
- * @returns The result of the call: Success
1215
+ * @param params The params for the smart contract call
1216
+ * @returns The call result: The current balance of the holder of the token
619
1217
  */
620
- arc200Approve(args, params = {}) {
621
- return this.call(Arc200CallFactory.arc200Approve(args, params));
1218
+ async arc200BalanceOf(params) {
1219
+ const result = await this.appClient.send.call(Arc200ParamsFactory.arc200BalanceOf(params));
1220
+ return result.return;
622
1221
  }
623
1222
  /**
624
- * Calls the arc200_allowance(address,address)uint256 ABI method.
1223
+ * Makes a readonly (simulated) call to the Arc200 smart contract using the `arc200_allowance(address,address)uint256` ABI method.
1224
+ *
1225
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
625
1226
  *
626
1227
  * Returns the current allowance of the spender of the tokens of the owner
627
1228
  *
628
- * @param args The arguments for the contract call
629
- * @param params Any additional parameters for the call
630
- * @returns The result of the call: The remaining allowance
1229
+ * @param params The params for the smart contract call
1230
+ * @returns The call result: The remaining allowance
631
1231
  */
632
- arc200Allowance(args, params = {}) {
633
- return this.call(Arc200CallFactory.arc200Allowance(args, params));
1232
+ async arc200Allowance(params) {
1233
+ const result = await this.appClient.send.call(Arc200ParamsFactory.arc200Allowance(params));
1234
+ return result.return;
634
1235
  }
635
- compose() {
1236
+ newGroup() {
636
1237
  const client = this;
637
- const atc = new import_algosdk.AtomicTransactionComposer();
1238
+ const composer = this.algorand.newGroup();
638
1239
  let promiseChain = Promise.resolve();
639
1240
  const resultMappers = [];
640
1241
  return {
641
- arc200Name(args, params) {
642
- promiseChain = promiseChain.then(() => client.arc200Name(args, { ...params, sendParams: { ...params?.sendParams, skipSending: true, atc } }));
643
- resultMappers.push(void 0);
1242
+ /**
1243
+ * Add a bootstrap(byte[],byte[],uint8,uint256)bool method call against the Arc200 contract
1244
+ */
1245
+ bootstrap(params) {
1246
+ promiseChain = promiseChain.then(
1247
+ async () => composer.addAppCallMethodCall(await client.params.bootstrap(params))
1248
+ );
1249
+ resultMappers.push((v) => client.decodeReturnValue("bootstrap(byte[],byte[],uint8,uint256)bool", v));
644
1250
  return this;
645
1251
  },
646
- arc200Symbol(args, params) {
647
- promiseChain = promiseChain.then(() => client.arc200Symbol(args, { ...params, sendParams: { ...params?.sendParams, skipSending: true, atc } }));
648
- resultMappers.push(void 0);
1252
+ /**
1253
+ * Add a arc200_name()byte[32] method call against the Arc200 contract
1254
+ */
1255
+ arc200Name(params) {
1256
+ promiseChain = promiseChain.then(
1257
+ async () => composer.addAppCallMethodCall(await client.params.arc200Name(params))
1258
+ );
1259
+ resultMappers.push((v) => client.decodeReturnValue("arc200_name()byte[32]", v));
1260
+ return this;
1261
+ },
1262
+ /**
1263
+ * Add a arc200_symbol()byte[8] method call against the Arc200 contract
1264
+ */
1265
+ arc200Symbol(params) {
1266
+ promiseChain = promiseChain.then(
1267
+ async () => composer.addAppCallMethodCall(await client.params.arc200Symbol(params))
1268
+ );
1269
+ resultMappers.push((v) => client.decodeReturnValue("arc200_symbol()byte[8]", v));
649
1270
  return this;
650
1271
  },
651
- arc200Decimals(args, params) {
652
- promiseChain = promiseChain.then(() => client.arc200Decimals(args, { ...params, sendParams: { ...params?.sendParams, skipSending: true, atc } }));
653
- resultMappers.push(void 0);
1272
+ /**
1273
+ * Add a arc200_decimals()uint8 method call against the Arc200 contract
1274
+ */
1275
+ arc200Decimals(params) {
1276
+ promiseChain = promiseChain.then(
1277
+ async () => composer.addAppCallMethodCall(await client.params.arc200Decimals(params))
1278
+ );
1279
+ resultMappers.push((v) => client.decodeReturnValue("arc200_decimals()uint8", v));
654
1280
  return this;
655
1281
  },
656
- arc200TotalSupply(args, params) {
657
- promiseChain = promiseChain.then(() => client.arc200TotalSupply(args, { ...params, sendParams: { ...params?.sendParams, skipSending: true, atc } }));
658
- resultMappers.push(void 0);
1282
+ /**
1283
+ * Add a arc200_totalSupply()uint256 method call against the Arc200 contract
1284
+ */
1285
+ arc200TotalSupply(params) {
1286
+ promiseChain = promiseChain.then(
1287
+ async () => composer.addAppCallMethodCall(await client.params.arc200TotalSupply(params))
1288
+ );
1289
+ resultMappers.push((v) => client.decodeReturnValue("arc200_totalSupply()uint256", v));
659
1290
  return this;
660
1291
  },
661
- arc200BalanceOf(args, params) {
662
- promiseChain = promiseChain.then(() => client.arc200BalanceOf(args, { ...params, sendParams: { ...params?.sendParams, skipSending: true, atc } }));
663
- resultMappers.push(void 0);
1292
+ /**
1293
+ * Add a arc200_balanceOf(address)uint256 method call against the Arc200 contract
1294
+ */
1295
+ arc200BalanceOf(params) {
1296
+ promiseChain = promiseChain.then(
1297
+ async () => composer.addAppCallMethodCall(await client.params.arc200BalanceOf(params))
1298
+ );
1299
+ resultMappers.push((v) => client.decodeReturnValue("arc200_balanceOf(address)uint256", v));
664
1300
  return this;
665
1301
  },
666
- arc200Transfer(args, params) {
667
- promiseChain = promiseChain.then(() => client.arc200Transfer(args, { ...params, sendParams: { ...params?.sendParams, skipSending: true, atc } }));
668
- resultMappers.push(void 0);
1302
+ /**
1303
+ * Add a arc200_transfer(address,uint256)bool method call against the Arc200 contract
1304
+ */
1305
+ arc200Transfer(params) {
1306
+ promiseChain = promiseChain.then(
1307
+ async () => composer.addAppCallMethodCall(await client.params.arc200Transfer(params))
1308
+ );
1309
+ resultMappers.push((v) => client.decodeReturnValue("arc200_transfer(address,uint256)bool", v));
669
1310
  return this;
670
1311
  },
671
- arc200TransferFrom(args, params) {
672
- promiseChain = promiseChain.then(() => client.arc200TransferFrom(args, { ...params, sendParams: { ...params?.sendParams, skipSending: true, atc } }));
673
- resultMappers.push(void 0);
1312
+ /**
1313
+ * Add a arc200_transferFrom(address,address,uint256)bool method call against the Arc200 contract
1314
+ */
1315
+ arc200TransferFrom(params) {
1316
+ promiseChain = promiseChain.then(
1317
+ async () => composer.addAppCallMethodCall(await client.params.arc200TransferFrom(params))
1318
+ );
1319
+ resultMappers.push((v) => client.decodeReturnValue("arc200_transferFrom(address,address,uint256)bool", v));
674
1320
  return this;
675
1321
  },
676
- arc200Approve(args, params) {
677
- promiseChain = promiseChain.then(() => client.arc200Approve(args, { ...params, sendParams: { ...params?.sendParams, skipSending: true, atc } }));
678
- resultMappers.push(void 0);
1322
+ /**
1323
+ * Add a arc200_approve(address,uint256)bool method call against the Arc200 contract
1324
+ */
1325
+ arc200Approve(params) {
1326
+ promiseChain = promiseChain.then(
1327
+ async () => composer.addAppCallMethodCall(await client.params.arc200Approve(params))
1328
+ );
1329
+ resultMappers.push((v) => client.decodeReturnValue("arc200_approve(address,uint256)bool", v));
679
1330
  return this;
680
1331
  },
681
- arc200Allowance(args, params) {
682
- promiseChain = promiseChain.then(() => client.arc200Allowance(args, { ...params, sendParams: { ...params?.sendParams, skipSending: true, atc } }));
683
- resultMappers.push(void 0);
1332
+ /**
1333
+ * Add a arc200_allowance(address,address)uint256 method call against the Arc200 contract
1334
+ */
1335
+ arc200Allowance(params) {
1336
+ promiseChain = promiseChain.then(
1337
+ async () => composer.addAppCallMethodCall(await client.params.arc200Allowance(params))
1338
+ );
1339
+ resultMappers.push((v) => client.decodeReturnValue("arc200_allowance(address,address)uint256", v));
684
1340
  return this;
685
1341
  },
686
- clearState(args) {
687
- promiseChain = promiseChain.then(() => client.clearState({ ...args, sendParams: { ...args?.sendParams, skipSending: true, atc } }));
688
- resultMappers.push(void 0);
1342
+ /**
1343
+ * Add a clear state call to the Arc200 contract
1344
+ */
1345
+ clearState(params) {
1346
+ promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params)));
689
1347
  return this;
690
1348
  },
691
- addTransaction(txn, defaultSender) {
692
- promiseChain = promiseChain.then(async () => atc.addTransaction(await algokit.getTransactionWithSigner(txn, defaultSender ?? client.sender)));
1349
+ addTransaction(txn, signer) {
1350
+ promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer));
693
1351
  return this;
694
1352
  },
695
- async atc() {
1353
+ async composer() {
696
1354
  await promiseChain;
697
- return atc;
1355
+ return composer;
698
1356
  },
699
1357
  async simulate(options) {
700
1358
  await promiseChain;
701
- const result = await atc.simulate(client.algod, new import_algosdk.modelsv2.SimulateRequest({ txnGroups: [], ...options }));
1359
+ const result = await (!options ? composer.simulate() : composer.simulate(options));
702
1360
  return {
703
1361
  ...result,
704
- returns: result.methodResults?.map((val, i) => resultMappers[i] !== void 0 ? resultMappers[i](val.returnValue) : val.returnValue)
1362
+ returns: result.returns?.map(
1363
+ (val, i) => resultMappers[i] !== void 0 ? resultMappers[i](val) : val.returnValue
1364
+ )
705
1365
  };
706
1366
  },
707
- async execute() {
1367
+ async send(params) {
708
1368
  await promiseChain;
709
- const result = await algokit.sendAtomicTransactionComposer({ atc, sendParams: {} }, client.algod);
1369
+ const result = await composer.send(params);
710
1370
  return {
711
1371
  ...result,
712
- returns: result.returns?.map((val, i) => resultMappers[i] !== void 0 ? resultMappers[i](val.returnValue) : val.returnValue)
1372
+ returns: result.returns?.map(
1373
+ (val, i) => resultMappers[i] !== void 0 ? resultMappers[i](val) : val.returnValue
1374
+ )
713
1375
  };
714
1376
  }
715
1377
  };
@@ -718,18 +1380,20 @@ var Arc200Client = class {
718
1380
 
719
1381
  // src/getArc200Client.ts
720
1382
  var getArc200Client = (input) => {
721
- return new Arc200Client(
722
- {
723
- sender: input.sender,
724
- resolveBy: "id",
725
- id: input.appId
726
- },
727
- input.algod
728
- );
1383
+ return new Arc200Client({
1384
+ algorand: input.algorand,
1385
+ appId: input.appId,
1386
+ appName: input.appName,
1387
+ approvalSourceMap: input.approvalSourceMap,
1388
+ clearSourceMap: input.clearSourceMap,
1389
+ defaultSender: input.defaultSender,
1390
+ defaultSigner: input.defaultSigner
1391
+ });
729
1392
  };
730
- var getArc200Client_default = getArc200Client;
731
1393
  // Annotate the CommonJS export names for ESM import in node:
732
1394
  0 && (module.exports = {
1395
+ Arc200Client,
1396
+ Arc200Factory,
733
1397
  getArc200Client
734
1398
  });
735
1399
  //# sourceMappingURL=index.js.map