@thru/sdk 0.2.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.abi.md +112 -0
- package/README.md +342 -0
- package/dist/abi/index.cjs +946 -0
- package/dist/abi/index.cjs.map +1 -0
- package/dist/abi/index.d.cts +331 -0
- package/dist/abi/index.d.ts +331 -0
- package/dist/abi/index.js +892 -0
- package/dist/abi/index.js.map +1 -0
- package/dist/abi/wasm/bundler/abi_reflect_wasm.d.ts +65 -0
- package/dist/abi/wasm/bundler/abi_reflect_wasm.js +5 -0
- package/dist/abi/wasm/bundler/abi_reflect_wasm_bg.js +412 -0
- package/dist/abi/wasm/bundler/abi_reflect_wasm_bg.wasm +0 -0
- package/dist/abi/wasm/bundler/abi_reflect_wasm_bg.wasm.d.ts +24 -0
- package/dist/abi/wasm/bundler/package.json +17 -0
- package/dist/abi/wasm/node/abi_reflect_wasm.d.ts +65 -0
- package/dist/abi/wasm/node/abi_reflect_wasm.js +425 -0
- package/dist/abi/wasm/node/abi_reflect_wasm_bg.wasm +0 -0
- package/dist/abi/wasm/node/abi_reflect_wasm_bg.wasm.d.ts +24 -0
- package/dist/abi/wasm/node/package.json +11 -0
- package/dist/abi/wasm/web/abi_reflect_wasm.d.ts +114 -0
- package/dist/abi/wasm/web/abi_reflect_wasm.js +499 -0
- package/dist/abi/wasm/web/abi_reflect_wasm_bg.wasm +0 -0
- package/dist/abi/wasm/web/abi_reflect_wasm_bg.wasm.d.ts +24 -0
- package/dist/abi/wasm/web/package.json +15 -0
- package/dist/chunk-CVBQ4UPL.js +3614 -0
- package/dist/chunk-CVBQ4UPL.js.map +1 -0
- package/dist/chunk-NSBPE2FW.js +15 -0
- package/dist/chunk-NSBPE2FW.js.map +1 -0
- package/dist/chunk-RL3Q6FDE.js +105 -0
- package/dist/chunk-RL3Q6FDE.js.map +1 -0
- package/dist/chunk-UDIXYJXC.js +260 -0
- package/dist/chunk-UDIXYJXC.js.map +1 -0
- package/dist/chunk-YQDWOMNO.js +271 -0
- package/dist/chunk-YQDWOMNO.js.map +1 -0
- package/dist/client-Cfi7zRLm.d.cts +1247 -0
- package/dist/client-worIo0a3.d.ts +1247 -0
- package/dist/client.cjs +3791 -0
- package/dist/client.cjs.map +1 -0
- package/dist/client.d.cts +7 -0
- package/dist/client.d.ts +7 -0
- package/dist/client.js +7 -0
- package/dist/client.js.map +1 -0
- package/dist/crypto/index.cjs +170 -0
- package/dist/crypto/index.cjs.map +1 -0
- package/dist/crypto/index.d.cts +60 -0
- package/dist/crypto/index.d.ts +60 -0
- package/dist/crypto/index.js +5 -0
- package/dist/crypto/index.js.map +1 -0
- package/dist/helpers/index.cjs +270 -0
- package/dist/helpers/index.cjs.map +1 -0
- package/dist/helpers/index.d.cts +15 -0
- package/dist/helpers/index.d.ts +15 -0
- package/dist/helpers/index.js +4 -0
- package/dist/helpers/index.js.map +1 -0
- package/dist/metafile-cjs.json +1 -0
- package/dist/metafile-esm.json +1 -0
- package/dist/proto/index.cjs +433 -0
- package/dist/proto/index.cjs.map +1 -0
- package/dist/proto/index.d.cts +435 -0
- package/dist/proto/index.d.ts +435 -0
- package/dist/proto/index.js +4 -0
- package/dist/proto/index.js.map +1 -0
- package/dist/sdk.cjs +4137 -0
- package/dist/sdk.cjs.map +1 -0
- package/dist/sdk.d.cts +36 -0
- package/dist/sdk.d.ts +36 -0
- package/dist/sdk.js +7 -0
- package/dist/sdk.js.map +1 -0
- package/dist/streaming_service_pb-DvCdJiCr.d.cts +4877 -0
- package/dist/streaming_service_pb-DvCdJiCr.d.ts +4877 -0
- package/dist/webcrypto-LTajLAad.d.cts +3 -0
- package/dist/webcrypto-LTajLAad.d.ts +3 -0
- package/package.json +88 -0
package/dist/client.cjs
ADDED
|
@@ -0,0 +1,3791 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var protobuf = require('@bufbuild/protobuf');
|
|
4
|
+
var codegenv2 = require('@bufbuild/protobuf/codegenv2');
|
|
5
|
+
var wkt = require('@bufbuild/protobuf/wkt');
|
|
6
|
+
var connect = require('@connectrpc/connect');
|
|
7
|
+
var connectWeb = require('@connectrpc/connect-web');
|
|
8
|
+
var ed25519 = require('@noble/ed25519');
|
|
9
|
+
var sha2_js = require('@noble/hashes/sha2.js');
|
|
10
|
+
var HDKey = require('micro-key-producer/slip10.js');
|
|
11
|
+
|
|
12
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
|
+
|
|
14
|
+
var HDKey__default = /*#__PURE__*/_interopDefault(HDKey);
|
|
15
|
+
|
|
16
|
+
// thru-ts-client-sdk/domain/primitives/Pubkey.ts
|
|
17
|
+
|
|
18
|
+
// src/helpers/constants.ts
|
|
19
|
+
var BASE64_URL_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
|
|
20
|
+
var tempMap = new Int16Array(256).fill(-1);
|
|
21
|
+
for (let i = 0; i < BASE64_URL_ALPHABET.length; i++) {
|
|
22
|
+
tempMap[BASE64_URL_ALPHABET.charCodeAt(i)] = i;
|
|
23
|
+
}
|
|
24
|
+
var BASE64_URL_MAP = tempMap;
|
|
25
|
+
|
|
26
|
+
// src/helpers/address.ts
|
|
27
|
+
function encodeAddress(bytes) {
|
|
28
|
+
if (bytes.length !== 32) {
|
|
29
|
+
throw new Error("Expected 32-byte address");
|
|
30
|
+
}
|
|
31
|
+
let checksum = 0;
|
|
32
|
+
let accumulator = 0;
|
|
33
|
+
let bitsCollected = 0;
|
|
34
|
+
const output = ["t", "a"];
|
|
35
|
+
for (let i = 0; i < 30; i++) {
|
|
36
|
+
const byte = bytes[i];
|
|
37
|
+
checksum += byte;
|
|
38
|
+
accumulator = (accumulator << 8 | byte) >>> 0;
|
|
39
|
+
bitsCollected += 8;
|
|
40
|
+
while (bitsCollected >= 6) {
|
|
41
|
+
const index = accumulator >> bitsCollected - 6 & 63;
|
|
42
|
+
output.push(BASE64_URL_ALPHABET[index]);
|
|
43
|
+
bitsCollected -= 6;
|
|
44
|
+
accumulator &= maskForBits(bitsCollected);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const secondLast = bytes[30];
|
|
48
|
+
checksum += secondLast;
|
|
49
|
+
accumulator = (accumulator << 8 | secondLast) >>> 0;
|
|
50
|
+
bitsCollected += 8;
|
|
51
|
+
const last = bytes[31];
|
|
52
|
+
checksum += last;
|
|
53
|
+
accumulator = (accumulator << 8 | last) >>> 0;
|
|
54
|
+
bitsCollected += 8;
|
|
55
|
+
accumulator = (accumulator << 8 | checksum & 255) >>> 0;
|
|
56
|
+
bitsCollected += 8;
|
|
57
|
+
while (bitsCollected >= 6) {
|
|
58
|
+
const index = accumulator >> bitsCollected - 6 & 63;
|
|
59
|
+
output.push(BASE64_URL_ALPHABET[index]);
|
|
60
|
+
bitsCollected -= 6;
|
|
61
|
+
accumulator &= maskForBits(bitsCollected);
|
|
62
|
+
}
|
|
63
|
+
return output.join("");
|
|
64
|
+
}
|
|
65
|
+
function decodeAddress(value) {
|
|
66
|
+
if (value.length !== 46) {
|
|
67
|
+
throw new Error("Invalid address length");
|
|
68
|
+
}
|
|
69
|
+
if (!value.startsWith("ta")) {
|
|
70
|
+
throw new Error('Address must start with "ta"');
|
|
71
|
+
}
|
|
72
|
+
const output = new Uint8Array(32);
|
|
73
|
+
let checksum = 0;
|
|
74
|
+
let inIdx = 2;
|
|
75
|
+
let remaining = 40;
|
|
76
|
+
let outIdx = 0;
|
|
77
|
+
while (remaining >= 4) {
|
|
78
|
+
const a2 = BASE64_URL_MAP[value.charCodeAt(inIdx)];
|
|
79
|
+
const b2 = BASE64_URL_MAP[value.charCodeAt(inIdx + 1)];
|
|
80
|
+
const c2 = BASE64_URL_MAP[value.charCodeAt(inIdx + 2)];
|
|
81
|
+
const d2 = BASE64_URL_MAP[value.charCodeAt(inIdx + 3)];
|
|
82
|
+
if (a2 < 0 || b2 < 0 || c2 < 0 || d2 < 0) {
|
|
83
|
+
throw new Error("Invalid address encoding");
|
|
84
|
+
}
|
|
85
|
+
const triple2 = a2 << 18 | b2 << 12 | c2 << 6 | d2;
|
|
86
|
+
const byte12 = triple2 >> 16 & 255;
|
|
87
|
+
const byte22 = triple2 >> 8 & 255;
|
|
88
|
+
const byte3 = triple2 & 255;
|
|
89
|
+
checksum += byte12;
|
|
90
|
+
checksum += byte22;
|
|
91
|
+
checksum += byte3;
|
|
92
|
+
output[outIdx++] = byte12;
|
|
93
|
+
output[outIdx++] = byte22;
|
|
94
|
+
output[outIdx++] = byte3;
|
|
95
|
+
inIdx += 4;
|
|
96
|
+
remaining -= 4;
|
|
97
|
+
}
|
|
98
|
+
const a = BASE64_URL_MAP[value.charCodeAt(inIdx)];
|
|
99
|
+
const b = BASE64_URL_MAP[value.charCodeAt(inIdx + 1)];
|
|
100
|
+
const c = BASE64_URL_MAP[value.charCodeAt(inIdx + 2)];
|
|
101
|
+
const d = BASE64_URL_MAP[value.charCodeAt(inIdx + 3)];
|
|
102
|
+
if (a < 0 || b < 0 || c < 0 || d < 0) {
|
|
103
|
+
throw new Error("Invalid address encoding");
|
|
104
|
+
}
|
|
105
|
+
const triple = a << 18 | b << 12 | c << 6 | d;
|
|
106
|
+
const byte1 = triple >> 16 & 255;
|
|
107
|
+
const byte2 = triple >> 8 & 255;
|
|
108
|
+
const incomingChecksum = triple & 255;
|
|
109
|
+
checksum += byte1;
|
|
110
|
+
checksum += byte2;
|
|
111
|
+
output[outIdx++] = byte1;
|
|
112
|
+
output[outIdx++] = byte2;
|
|
113
|
+
checksum &= 255;
|
|
114
|
+
if (checksum !== incomingChecksum) {
|
|
115
|
+
throw new Error("Address checksum mismatch");
|
|
116
|
+
}
|
|
117
|
+
return output;
|
|
118
|
+
}
|
|
119
|
+
function maskForBits(bits) {
|
|
120
|
+
return bits === 0 ? 0 : (1 << bits) - 1;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// src/helpers/encoding.ts
|
|
124
|
+
function decodeBase64(value) {
|
|
125
|
+
if (value.length === 0) {
|
|
126
|
+
return new Uint8Array();
|
|
127
|
+
}
|
|
128
|
+
const atobFn = globalThis.atob;
|
|
129
|
+
if (!atobFn) {
|
|
130
|
+
throw new Error("Base64 decoding requires globalThis.atob support");
|
|
131
|
+
}
|
|
132
|
+
const binary = atobFn(value);
|
|
133
|
+
const bytes = new Uint8Array(binary.length);
|
|
134
|
+
for (let i = 0; i < binary.length; i++) {
|
|
135
|
+
bytes[i] = binary.charCodeAt(i);
|
|
136
|
+
}
|
|
137
|
+
return bytes;
|
|
138
|
+
}
|
|
139
|
+
function hexToBytes(value) {
|
|
140
|
+
const normalized = value.startsWith("0x") ? value.slice(2) : value;
|
|
141
|
+
if (normalized.length % 2 !== 0) {
|
|
142
|
+
throw new Error("Hex string must contain an even number of characters");
|
|
143
|
+
}
|
|
144
|
+
const bytes = new Uint8Array(normalized.length / 2);
|
|
145
|
+
for (let i = 0; i < normalized.length; i += 2) {
|
|
146
|
+
const byte = parseInt(normalized.slice(i, i + 2), 16);
|
|
147
|
+
if (Number.isNaN(byte)) {
|
|
148
|
+
throw new Error("Hex string contains invalid characters");
|
|
149
|
+
}
|
|
150
|
+
bytes[i / 2] = byte;
|
|
151
|
+
}
|
|
152
|
+
return bytes;
|
|
153
|
+
}
|
|
154
|
+
function isHexString(value) {
|
|
155
|
+
const normalized = value.startsWith("0x") ? value.slice(2) : value;
|
|
156
|
+
return normalized.length % 2 === 0 && normalized.length > 0 && /^[0-9a-fA-F]+$/.test(normalized);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// src/helpers/utils.ts
|
|
160
|
+
function ensureBytes(value, field) {
|
|
161
|
+
if (value instanceof Uint8Array) {
|
|
162
|
+
if (value.length === 0) {
|
|
163
|
+
throw new Error(`${field} cannot be empty`);
|
|
164
|
+
}
|
|
165
|
+
return value;
|
|
166
|
+
}
|
|
167
|
+
if (typeof value === "string") {
|
|
168
|
+
if (value.length === 0) {
|
|
169
|
+
throw new Error(`${field} cannot be empty`);
|
|
170
|
+
}
|
|
171
|
+
return decodeBase64(value);
|
|
172
|
+
}
|
|
173
|
+
throw new Error(`${field} is required`);
|
|
174
|
+
}
|
|
175
|
+
function maskForBits2(bits) {
|
|
176
|
+
return bits === 0 ? 0 : (1 << bits) - 1;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// src/helpers/signature.ts
|
|
180
|
+
function encodeSignature(bytes) {
|
|
181
|
+
if (bytes.length !== 64) {
|
|
182
|
+
throw new Error("Expected 64-byte signature");
|
|
183
|
+
}
|
|
184
|
+
let checksum = 0;
|
|
185
|
+
let accumulator = 0;
|
|
186
|
+
let bitsCollected = 0;
|
|
187
|
+
const output = ["t", "s"];
|
|
188
|
+
for (let i = 0; i < 63; i++) {
|
|
189
|
+
const byte = bytes[i];
|
|
190
|
+
checksum += byte;
|
|
191
|
+
accumulator = (accumulator << 8 | byte) >>> 0;
|
|
192
|
+
bitsCollected += 8;
|
|
193
|
+
while (bitsCollected >= 6) {
|
|
194
|
+
const index = accumulator >> bitsCollected - 6 & 63;
|
|
195
|
+
output.push(BASE64_URL_ALPHABET[index]);
|
|
196
|
+
bitsCollected -= 6;
|
|
197
|
+
accumulator &= maskForBits2(bitsCollected);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
const lastByte = bytes[63];
|
|
201
|
+
checksum += lastByte;
|
|
202
|
+
accumulator = (accumulator << 8 | lastByte) >>> 0;
|
|
203
|
+
bitsCollected += 8;
|
|
204
|
+
accumulator = (accumulator << 16 | checksum & 65535) >>> 0;
|
|
205
|
+
bitsCollected += 16;
|
|
206
|
+
while (bitsCollected >= 6) {
|
|
207
|
+
const index = accumulator >> bitsCollected - 6 & 63;
|
|
208
|
+
output.push(BASE64_URL_ALPHABET[index]);
|
|
209
|
+
bitsCollected -= 6;
|
|
210
|
+
accumulator &= maskForBits2(bitsCollected);
|
|
211
|
+
}
|
|
212
|
+
return output.join("");
|
|
213
|
+
}
|
|
214
|
+
function decodeSignature(value) {
|
|
215
|
+
if (value.length !== 90) {
|
|
216
|
+
throw new Error("Invalid signature length");
|
|
217
|
+
}
|
|
218
|
+
if (!value.startsWith("ts")) {
|
|
219
|
+
throw new Error('Signature must start with "ts"');
|
|
220
|
+
}
|
|
221
|
+
const output = new Uint8Array(64);
|
|
222
|
+
let checksum = 0;
|
|
223
|
+
let inIdx = 2;
|
|
224
|
+
let remaining = 84;
|
|
225
|
+
let outIdx = 0;
|
|
226
|
+
while (remaining > 0) {
|
|
227
|
+
const a2 = BASE64_URL_MAP[value.charCodeAt(inIdx)];
|
|
228
|
+
const b2 = BASE64_URL_MAP[value.charCodeAt(inIdx + 1)];
|
|
229
|
+
const c2 = BASE64_URL_MAP[value.charCodeAt(inIdx + 2)];
|
|
230
|
+
const d2 = BASE64_URL_MAP[value.charCodeAt(inIdx + 3)];
|
|
231
|
+
if (a2 < 0 || b2 < 0 || c2 < 0 || d2 < 0) {
|
|
232
|
+
throw new Error("Invalid signature encoding");
|
|
233
|
+
}
|
|
234
|
+
const triple2 = a2 << 18 | b2 << 12 | c2 << 6 | d2;
|
|
235
|
+
const byte1 = triple2 >> 16 & 255;
|
|
236
|
+
const byte2 = triple2 >> 8 & 255;
|
|
237
|
+
const byte3 = triple2 & 255;
|
|
238
|
+
checksum += byte1;
|
|
239
|
+
checksum += byte2;
|
|
240
|
+
checksum += byte3;
|
|
241
|
+
output[outIdx++] = byte1;
|
|
242
|
+
output[outIdx++] = byte2;
|
|
243
|
+
output[outIdx++] = byte3;
|
|
244
|
+
inIdx += 4;
|
|
245
|
+
remaining -= 4;
|
|
246
|
+
}
|
|
247
|
+
const a = BASE64_URL_MAP[value.charCodeAt(inIdx)];
|
|
248
|
+
const b = BASE64_URL_MAP[value.charCodeAt(inIdx + 1)];
|
|
249
|
+
const c = BASE64_URL_MAP[value.charCodeAt(inIdx + 2)];
|
|
250
|
+
const d = BASE64_URL_MAP[value.charCodeAt(inIdx + 3)];
|
|
251
|
+
if (a < 0 || b < 0 || c < 0 || d < 0) {
|
|
252
|
+
throw new Error("Invalid signature encoding");
|
|
253
|
+
}
|
|
254
|
+
const triple = a << 18 | b << 12 | c << 6 | d;
|
|
255
|
+
const finalByte = triple >> 16 & 255;
|
|
256
|
+
checksum += finalByte;
|
|
257
|
+
output[outIdx] = finalByte;
|
|
258
|
+
const incomingChecksum = triple & 65535;
|
|
259
|
+
checksum &= 65535;
|
|
260
|
+
if (checksum !== incomingChecksum) {
|
|
261
|
+
throw new Error("Signature checksum mismatch");
|
|
262
|
+
}
|
|
263
|
+
return output;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// src/helpers/webcrypto.ts
|
|
267
|
+
function getWebCrypto() {
|
|
268
|
+
const cryptoObj = typeof globalThis !== "undefined" ? globalThis.crypto : void 0;
|
|
269
|
+
if (cryptoObj && typeof cryptoObj.getRandomValues === "function") {
|
|
270
|
+
return cryptoObj;
|
|
271
|
+
}
|
|
272
|
+
throw new Error("Web Crypto API is unavailable. Provide a polyfill exposing globalThis.crypto.");
|
|
273
|
+
}
|
|
274
|
+
var file_buf_validate_validate = /* @__PURE__ */ codegenv2.fileDesc("ChtidWYvdmFsaWRhdGUvdmFsaWRhdGUucHJvdG8SDGJ1Zi52YWxpZGF0ZSI3CgRSdWxlEgoKAmlkGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSEgoKZXhwcmVzc2lvbhgDIAEoCSKGAQoMTWVzc2FnZVJ1bGVzEhYKDmNlbF9leHByZXNzaW9uGAUgAygJEh8KA2NlbBgDIAMoCzISLmJ1Zi52YWxpZGF0ZS5SdWxlEi0KBW9uZW9mGAQgAygLMh4uYnVmLnZhbGlkYXRlLk1lc3NhZ2VPbmVvZlJ1bGVKBAgBEAJSCGRpc2FibGVkIjQKEE1lc3NhZ2VPbmVvZlJ1bGUSDgoGZmllbGRzGAEgAygJEhAKCHJlcXVpcmVkGAIgASgIIh4KCk9uZW9mUnVsZXMSEAoIcmVxdWlyZWQYASABKAgiiwkKCkZpZWxkUnVsZXMSFgoOY2VsX2V4cHJlc3Npb24YHSADKAkSHwoDY2VsGBcgAygLMhIuYnVmLnZhbGlkYXRlLlJ1bGUSEAoIcmVxdWlyZWQYGSABKAgSJAoGaWdub3JlGBsgASgOMhQuYnVmLnZhbGlkYXRlLklnbm9yZRIpCgVmbG9hdBgBIAEoCzIYLmJ1Zi52YWxpZGF0ZS5GbG9hdFJ1bGVzSAASKwoGZG91YmxlGAIgASgLMhkuYnVmLnZhbGlkYXRlLkRvdWJsZVJ1bGVzSAASKQoFaW50MzIYAyABKAsyGC5idWYudmFsaWRhdGUuSW50MzJSdWxlc0gAEikKBWludDY0GAQgASgLMhguYnVmLnZhbGlkYXRlLkludDY0UnVsZXNIABIrCgZ1aW50MzIYBSABKAsyGS5idWYudmFsaWRhdGUuVUludDMyUnVsZXNIABIrCgZ1aW50NjQYBiABKAsyGS5idWYudmFsaWRhdGUuVUludDY0UnVsZXNIABIrCgZzaW50MzIYByABKAsyGS5idWYudmFsaWRhdGUuU0ludDMyUnVsZXNIABIrCgZzaW50NjQYCCABKAsyGS5idWYudmFsaWRhdGUuU0ludDY0UnVsZXNIABItCgdmaXhlZDMyGAkgASgLMhouYnVmLnZhbGlkYXRlLkZpeGVkMzJSdWxlc0gAEi0KB2ZpeGVkNjQYCiABKAsyGi5idWYudmFsaWRhdGUuRml4ZWQ2NFJ1bGVzSAASLwoIc2ZpeGVkMzIYCyABKAsyGy5idWYudmFsaWRhdGUuU0ZpeGVkMzJSdWxlc0gAEi8KCHNmaXhlZDY0GAwgASgLMhsuYnVmLnZhbGlkYXRlLlNGaXhlZDY0UnVsZXNIABInCgRib29sGA0gASgLMhcuYnVmLnZhbGlkYXRlLkJvb2xSdWxlc0gAEisKBnN0cmluZxgOIAEoCzIZLmJ1Zi52YWxpZGF0ZS5TdHJpbmdSdWxlc0gAEikKBWJ5dGVzGA8gASgLMhguYnVmLnZhbGlkYXRlLkJ5dGVzUnVsZXNIABInCgRlbnVtGBAgASgLMhcuYnVmLnZhbGlkYXRlLkVudW1SdWxlc0gAEi8KCHJlcGVhdGVkGBIgASgLMhsuYnVmLnZhbGlkYXRlLlJlcGVhdGVkUnVsZXNIABIlCgNtYXAYEyABKAsyFi5idWYudmFsaWRhdGUuTWFwUnVsZXNIABIlCgNhbnkYFCABKAsyFi5idWYudmFsaWRhdGUuQW55UnVsZXNIABIvCghkdXJhdGlvbhgVIAEoCzIbLmJ1Zi52YWxpZGF0ZS5EdXJhdGlvblJ1bGVzSAASMgoKZmllbGRfbWFzaxgcIAEoCzIcLmJ1Zi52YWxpZGF0ZS5GaWVsZE1hc2tSdWxlc0gAEjEKCXRpbWVzdGFtcBgWIAEoCzIcLmJ1Zi52YWxpZGF0ZS5UaW1lc3RhbXBSdWxlc0gAQgYKBHR5cGVKBAgYEBlKBAgaEBtSB3NraXBwZWRSDGlnbm9yZV9lbXB0eSJVCg9QcmVkZWZpbmVkUnVsZXMSHwoDY2VsGAEgAygLMhIuYnVmLnZhbGlkYXRlLlJ1bGVKBAgYEBlKBAgaEBtSB3NraXBwZWRSDGlnbm9yZV9lbXB0eSL4FgoKRmxvYXRSdWxlcxJ9CgVjb25zdBgBIAEoAkJuwkhrCmkKC2Zsb2F0LmNvbnN0Glp0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICdtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSmQEKAmx0GAIgASgCQooBwkiGAQqDAQoIZmxvYXQubHQadyFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPj0gcnVsZXMubHQpPyAnbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSAASqQEKA2x0ZRgDIAEoAkKZAcJIlQEKkgEKCWZsb2F0Lmx0ZRqEASFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPiBydWxlcy5sdGUpPyAnbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEtAHCgJndBgEIAEoAkLBB8JIvQcKhgEKCGZsb2F0Lmd0GnohaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq9AQoLZmxvYXQuZ3RfbHQarQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrHAQoVZmxvYXQuZ3RfbHRfZXhjbHVzaXZlGq0BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCkpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKzQEKDGZsb2F0Lmd0X2x0ZRq8AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCtcBChZmbG9hdC5ndF9sdGVfZXhjbHVzaXZlGrwBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARKcCAoDZ3RlGAUgASgCQowIwkiICAqVAQoJZmxvYXQuZ3RlGocBIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCswBCgxmbG9hdC5ndGVfbHQauwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtYBChZmbG9hdC5ndGVfbHRfZXhjbHVzaXZlGrsBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrcAQoNZmxvYXQuZ3RlX2x0ZRrKAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK5gEKF2Zsb2F0Lmd0ZV9sdGVfZXhjbHVzaXZlGsoBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSkpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEnkKAmluGAYgAygCQm3CSGoKaAoIZmxvYXQuaW4aXCEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ211c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnAKBm5vdF9pbhgHIAMoAkJgwkhdClsKDGZsb2F0Lm5vdF9pbhpLdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAnbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEm8KBmZpbml0ZRgIIAEoCEJfwkhcCloKDGZsb2F0LmZpbml0ZRpKcnVsZXMuZmluaXRlID8gKHRoaXMuaXNOYW4oKSB8fCB0aGlzLmlzSW5mKCkgPyAnbXVzdCBiZSBmaW5pdGUnIDogJycpIDogJycSKwoHZXhhbXBsZRgJIAMoAkIawkgXChUKDWZsb2F0LmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIooXCgtEb3VibGVSdWxlcxJ+CgVjb25zdBgBIAEoAUJvwkhsCmoKDGRvdWJsZS5jb25zdBpadGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAnbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEpoBCgJsdBgCIAEoAUKLAcJIhwEKhAEKCWRvdWJsZS5sdBp3IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+PSBydWxlcy5sdCk/ICdtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKqAQoDbHRlGAMgASgBQpoBwkiWAQqTAQoKZG91YmxlLmx0ZRqEASFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPiBydWxlcy5sdGUpPyAnbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEtUHCgJndBgEIAEoAULGB8JIwgcKhwEKCWRvdWJsZS5ndBp6IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKvgEKDGRvdWJsZS5ndF9sdBqtAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCsgBChZkb3VibGUuZ3RfbHRfZXhjbHVzaXZlGq0BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCkpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKzgEKDWRvdWJsZS5ndF9sdGUavAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrYAQoXZG91YmxlLmd0X2x0ZV9leGNsdXNpdmUavAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEqEICgNndGUYBSABKAFCkQjCSI0ICpYBCgpkb3VibGUuZ3RlGocBIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCs0BCg1kb3VibGUuZ3RlX2x0GrsBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrXAQoXZG91YmxlLmd0ZV9sdF9leGNsdXNpdmUauwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSkpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCt0BCg5kb3VibGUuZ3RlX2x0ZRrKAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK5wEKGGRvdWJsZS5ndGVfbHRlX2V4Y2x1c2l2ZRrKAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJ6CgJpbhgGIAMoAUJuwkhrCmkKCWRvdWJsZS5pbhpcISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAnbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycScQoGbm90X2luGAcgAygBQmHCSF4KXAoNZG91YmxlLm5vdF9pbhpLdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAnbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEnAKBmZpbml0ZRgIIAEoCEJgwkhdClsKDWRvdWJsZS5maW5pdGUaSnJ1bGVzLmZpbml0ZSA/ICh0aGlzLmlzTmFuKCkgfHwgdGhpcy5pc0luZigpID8gJ211c3QgYmUgZmluaXRlJyA6ICcnKSA6ICcnEiwKB2V4YW1wbGUYCSADKAFCG8JIGAoWCg5kb3VibGUuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4isBQKCkludDMyUnVsZXMSfQoFY29uc3QYASABKAVCbsJIawppCgtpbnQzMi5jb25zdBpadGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAnbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEoQBCgJsdBgCIAEoBUJ2wkhzCnEKCGludDMyLmx0GmUhaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ211c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEpUBCgNsdGUYAyABKAVChQHCSIEBCn8KCWludDMyLmx0ZRpyIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICdtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAAS+QYKAmd0GAQgASgFQuoGwkjmBgp0CghpbnQzMi5ndBpoIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKrQEKC2ludDMyLmd0X2x0Gp0BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq1AQoVaW50MzIuZ3RfbHRfZXhjbHVzaXZlGpsBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvQEKDGludDMyLmd0X2x0ZRqsAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKxQEKFmludDMyLmd0X2x0ZV9leGNsdXNpdmUaqgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEsUHCgNndGUYBSABKAVCtQfCSLEHCoIBCglpbnQzMi5ndGUadSFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwq8AQoMaW50MzIuZ3RlX2x0GqsBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCsQBChZpbnQzMi5ndGVfbHRfZXhjbHVzaXZlGqkBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrMAQoNaW50MzIuZ3RlX2x0ZRq6AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrUAQoXaW50MzIuZ3RlX2x0ZV9leGNsdXNpdmUauAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESeQoCaW4YBiADKAVCbcJIagpoCghpbnQzMi5pbhpcISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAnbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycScAoGbm90X2luGAcgAygFQmDCSF0KWwoMaW50MzIubm90X2luGkt0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICdtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSKwoHZXhhbXBsZRgIIAMoBUIawkgXChUKDWludDMyLmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIrAUCgpJbnQ2NFJ1bGVzEn0KBWNvbnN0GAEgASgDQm7CSGsKaQoLaW50NjQuY29uc3QaWnRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ211c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKEAQoCbHQYAiABKANCdsJIcwpxCghpbnQ2NC5sdBplIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICdtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKVAQoDbHRlGAMgASgDQoUBwkiBAQp/CglpbnQ2NC5sdGUaciFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAnbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEvkGCgJndBgEIAEoA0LqBsJI5gYKdAoIaW50NjQuZ3QaaCFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCq0BCgtpbnQ2NC5ndF9sdBqdAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKtQEKFWludDY0Lmd0X2x0X2V4Y2x1c2l2ZRqbAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCr0BCgxpbnQ2NC5ndF9sdGUarAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCsUBChZpbnQ2NC5ndF9sdGVfZXhjbHVzaXZlGqoBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLFBwoDZ3RlGAUgASgDQrUHwkixBwqCAQoJaW50NjQuZ3RlGnUhaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKvAEKDGludDY0Lmd0ZV9sdBqrAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrEAQoWaW50NjQuZ3RlX2x0X2V4Y2x1c2l2ZRqpAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzAEKDWludDY0Lmd0ZV9sdGUaugFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK1AEKF2ludDY0Lmd0ZV9sdGVfZXhjbHVzaXZlGrgBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEnkKAmluGAYgAygDQm3CSGoKaAoIaW50NjQuaW4aXCEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ211c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnAKBm5vdF9pbhgHIAMoA0JgwkhdClsKDGludDY0Lm5vdF9pbhpLdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAnbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEisKB2V4YW1wbGUYCSADKANCGsJIFwoVCg1pbnQ2NC5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiLCFAoLVUludDMyUnVsZXMSfgoFY29uc3QYASABKA1Cb8JIbApqCgx1aW50MzIuY29uc3QaWnRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ211c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKFAQoCbHQYAiABKA1Cd8JIdApyCgl1aW50MzIubHQaZSFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID49IHJ1bGVzLmx0PyAnbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSAASlwEKA2x0ZRgDIAEoDUKHAcJIgwEKgAEKCnVpbnQzMi5sdGUaciFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAnbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEv4GCgJndBgEIAEoDULvBsJI6wYKdQoJdWludDMyLmd0GmghaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwquAQoMdWludDMyLmd0X2x0Gp0BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq2AQoWdWludDMyLmd0X2x0X2V4Y2x1c2l2ZRqbAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCr4BCg11aW50MzIuZ3RfbHRlGqwBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrGAQoXdWludDMyLmd0X2x0ZV9leGNsdXNpdmUaqgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEsoHCgNndGUYBSABKA1CugfCSLYHCoMBCgp1aW50MzIuZ3RlGnUhaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKvQEKDXVpbnQzMi5ndGVfbHQaqwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKxQEKF3VpbnQzMi5ndGVfbHRfZXhjbHVzaXZlGqkBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrNAQoOdWludDMyLmd0ZV9sdGUaugFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK1QEKGHVpbnQzMi5ndGVfbHRlX2V4Y2x1c2l2ZRq4AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJ6CgJpbhgGIAMoDUJuwkhrCmkKCXVpbnQzMi5pbhpcISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAnbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycScQoGbm90X2luGAcgAygNQmHCSF4KXAoNdWludDMyLm5vdF9pbhpLdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAnbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEiwKB2V4YW1wbGUYCCADKA1CG8JIGAoWCg51aW50MzIuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4iwhQKC1VJbnQ2NFJ1bGVzEn4KBWNvbnN0GAEgASgEQm/CSGwKagoMdWludDY0LmNvbnN0Glp0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICdtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycShQEKAmx0GAIgASgEQnfCSHQKcgoJdWludDY0Lmx0GmUhaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ211c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEpcBCgNsdGUYAyABKARChwHCSIMBCoABCgp1aW50NjQubHRlGnIhaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ211c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABL+BgoCZ3QYBCABKARC7wbCSOsGCnUKCXVpbnQ2NC5ndBpoIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKrgEKDHVpbnQ2NC5ndF9sdBqdAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKtgEKFnVpbnQ2NC5ndF9sdF9leGNsdXNpdmUamwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq+AQoNdWludDY0Lmd0X2x0ZRqsAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKxgEKF3VpbnQ2NC5ndF9sdGVfZXhjbHVzaXZlGqoBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLKBwoDZ3RlGAUgASgEQroHwki2BwqDAQoKdWludDY0Lmd0ZRp1IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCr0BCg11aW50NjQuZ3RlX2x0GqsBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCsUBChd1aW50NjQuZ3RlX2x0X2V4Y2x1c2l2ZRqpAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzQEKDnVpbnQ2NC5ndGVfbHRlGroBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCtUBChh1aW50NjQuZ3RlX2x0ZV9leGNsdXNpdmUauAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESegoCaW4YBiADKARCbsJIawppCgl1aW50NjQuaW4aXCEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ211c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnEKBm5vdF9pbhgHIAMoBEJhwkheClwKDXVpbnQ2NC5ub3RfaW4aS3RoaXMgaW4gcnVsZXMubm90X2luID8gJ211c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxIsCgdleGFtcGxlGAggAygEQhvCSBgKFgoOdWludDY0LmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIsIUCgtTSW50MzJSdWxlcxJ+CgVjb25zdBgBIAEoEUJvwkhsCmoKDHNpbnQzMi5jb25zdBpadGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAnbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEoUBCgJsdBgCIAEoEUJ3wkh0CnIKCXNpbnQzMi5sdBplIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICdtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKXAQoDbHRlGAMgASgRQocBwkiDAQqAAQoKc2ludDMyLmx0ZRpyIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICdtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAAS/gYKAmd0GAQgASgRQu8GwkjrBgp1CglzaW50MzIuZ3QaaCFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCq4BCgxzaW50MzIuZ3RfbHQanQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrYBChZzaW50MzIuZ3RfbHRfZXhjbHVzaXZlGpsBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvgEKDXNpbnQzMi5ndF9sdGUarAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCsYBChdzaW50MzIuZ3RfbHRlX2V4Y2x1c2l2ZRqqAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAESygcKA2d0ZRgFIAEoEUK6B8JItgcKgwEKCnNpbnQzMi5ndGUadSFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwq9AQoNc2ludDMyLmd0ZV9sdBqrAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrFAQoXc2ludDMyLmd0ZV9sdF9leGNsdXNpdmUaqQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCs0BCg5zaW50MzIuZ3RlX2x0ZRq6AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrVAQoYc2ludDMyLmd0ZV9sdGVfZXhjbHVzaXZlGrgBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEnoKAmluGAYgAygRQm7CSGsKaQoJc2ludDMyLmluGlwhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICdtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJxCgZub3RfaW4YByADKBFCYcJIXgpcCg1zaW50MzIubm90X2luGkt0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICdtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSLAoHZXhhbXBsZRgIIAMoEUIbwkgYChYKDnNpbnQzMi5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiLCFAoLU0ludDY0UnVsZXMSfgoFY29uc3QYASABKBJCb8JIbApqCgxzaW50NjQuY29uc3QaWnRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ211c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKFAQoCbHQYAiABKBJCd8JIdApyCglzaW50NjQubHQaZSFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID49IHJ1bGVzLmx0PyAnbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSAASlwEKA2x0ZRgDIAEoEkKHAcJIgwEKgAEKCnNpbnQ2NC5sdGUaciFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAnbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEv4GCgJndBgEIAEoEkLvBsJI6wYKdQoJc2ludDY0Lmd0GmghaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwquAQoMc2ludDY0Lmd0X2x0Gp0BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq2AQoWc2ludDY0Lmd0X2x0X2V4Y2x1c2l2ZRqbAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCr4BCg1zaW50NjQuZ3RfbHRlGqwBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrGAQoXc2ludDY0Lmd0X2x0ZV9leGNsdXNpdmUaqgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEsoHCgNndGUYBSABKBJCugfCSLYHCoMBCgpzaW50NjQuZ3RlGnUhaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKvQEKDXNpbnQ2NC5ndGVfbHQaqwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKxQEKF3NpbnQ2NC5ndGVfbHRfZXhjbHVzaXZlGqkBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrNAQoOc2ludDY0Lmd0ZV9sdGUaugFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK1QEKGHNpbnQ2NC5ndGVfbHRlX2V4Y2x1c2l2ZRq4AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJ6CgJpbhgGIAMoEkJuwkhrCmkKCXNpbnQ2NC5pbhpcISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAnbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycScQoGbm90X2luGAcgAygSQmHCSF4KXAoNc2ludDY0Lm5vdF9pbhpLdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAnbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEiwKB2V4YW1wbGUYCCADKBJCG8JIGAoWCg5zaW50NjQuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4i0xQKDEZpeGVkMzJSdWxlcxJ/CgVjb25zdBgBIAEoB0JwwkhtCmsKDWZpeGVkMzIuY29uc3QaWnRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ211c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKGAQoCbHQYAiABKAdCeMJIdQpzCgpmaXhlZDMyLmx0GmUhaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ211c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEpgBCgNsdGUYAyABKAdCiAHCSIQBCoEBCgtmaXhlZDMyLmx0ZRpyIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICdtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASgwcKAmd0GAQgASgHQvQGwkjwBgp2CgpmaXhlZDMyLmd0GmghaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwqvAQoNZml4ZWQzMi5ndF9sdBqdAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKtwEKF2ZpeGVkMzIuZ3RfbHRfZXhjbHVzaXZlGpsBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvwEKDmZpeGVkMzIuZ3RfbHRlGqwBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrHAQoYZml4ZWQzMi5ndF9sdGVfZXhjbHVzaXZlGqoBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLPBwoDZ3RlGAUgASgHQr8Hwki7BwqEAQoLZml4ZWQzMi5ndGUadSFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwq+AQoOZml4ZWQzMi5ndGVfbHQaqwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKxgEKGGZpeGVkMzIuZ3RlX2x0X2V4Y2x1c2l2ZRqpAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzgEKD2ZpeGVkMzIuZ3RlX2x0ZRq6AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrWAQoZZml4ZWQzMi5ndGVfbHRlX2V4Y2x1c2l2ZRq4AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJ7CgJpbhgGIAMoB0JvwkhsCmoKCmZpeGVkMzIuaW4aXCEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ211c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnIKBm5vdF9pbhgHIAMoB0JiwkhfCl0KDmZpeGVkMzIubm90X2luGkt0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICdtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSLQoHZXhhbXBsZRgIIAMoB0IcwkgZChcKD2ZpeGVkMzIuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4i0xQKDEZpeGVkNjRSdWxlcxJ/CgVjb25zdBgBIAEoBkJwwkhtCmsKDWZpeGVkNjQuY29uc3QaWnRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ211c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKGAQoCbHQYAiABKAZCeMJIdQpzCgpmaXhlZDY0Lmx0GmUhaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ211c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEpgBCgNsdGUYAyABKAZCiAHCSIQBCoEBCgtmaXhlZDY0Lmx0ZRpyIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICdtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASgwcKAmd0GAQgASgGQvQGwkjwBgp2CgpmaXhlZDY0Lmd0GmghaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwqvAQoNZml4ZWQ2NC5ndF9sdBqdAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKtwEKF2ZpeGVkNjQuZ3RfbHRfZXhjbHVzaXZlGpsBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvwEKDmZpeGVkNjQuZ3RfbHRlGqwBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrHAQoYZml4ZWQ2NC5ndF9sdGVfZXhjbHVzaXZlGqoBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLPBwoDZ3RlGAUgASgGQr8Hwki7BwqEAQoLZml4ZWQ2NC5ndGUadSFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwq+AQoOZml4ZWQ2NC5ndGVfbHQaqwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKxgEKGGZpeGVkNjQuZ3RlX2x0X2V4Y2x1c2l2ZRqpAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzgEKD2ZpeGVkNjQuZ3RlX2x0ZRq6AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrWAQoZZml4ZWQ2NC5ndGVfbHRlX2V4Y2x1c2l2ZRq4AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJ7CgJpbhgGIAMoBkJvwkhsCmoKCmZpeGVkNjQuaW4aXCEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ211c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnIKBm5vdF9pbhgHIAMoBkJiwkhfCl0KDmZpeGVkNjQubm90X2luGkt0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICdtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSLQoHZXhhbXBsZRgIIAMoBkIcwkgZChcKD2ZpeGVkNjQuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4i5RQKDVNGaXhlZDMyUnVsZXMSgAEKBWNvbnN0GAEgASgPQnHCSG4KbAoOc2ZpeGVkMzIuY29uc3QaWnRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ211c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKHAQoCbHQYAiABKA9CecJIdgp0CgtzZml4ZWQzMi5sdBplIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICdtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKZAQoDbHRlGAMgASgPQokBwkiFAQqCAQoMc2ZpeGVkMzIubHRlGnIhaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ211c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABKIBwoCZ3QYBCABKA9C+QbCSPUGCncKC3NmaXhlZDMyLmd0GmghaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwqwAQoOc2ZpeGVkMzIuZ3RfbHQanQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrgBChhzZml4ZWQzMi5ndF9sdF9leGNsdXNpdmUamwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrAAQoPc2ZpeGVkMzIuZ3RfbHRlGqwBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrIAQoZc2ZpeGVkMzIuZ3RfbHRlX2V4Y2x1c2l2ZRqqAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES1AcKA2d0ZRgFIAEoD0LEB8JIwAcKhQEKDHNmaXhlZDMyLmd0ZRp1IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCr8BCg9zZml4ZWQzMi5ndGVfbHQaqwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKxwEKGXNmaXhlZDMyLmd0ZV9sdF9leGNsdXNpdmUaqQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCs8BChBzZml4ZWQzMi5ndGVfbHRlGroBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCtcBChpzZml4ZWQzMi5ndGVfbHRlX2V4Y2x1c2l2ZRq4AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJ8CgJpbhgGIAMoD0JwwkhtCmsKC3NmaXhlZDMyLmluGlwhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICdtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJzCgZub3RfaW4YByADKA9CY8JIYApeCg9zZml4ZWQzMi5ub3RfaW4aS3RoaXMgaW4gcnVsZXMubm90X2luID8gJ211c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxIuCgdleGFtcGxlGAggAygPQh3CSBoKGAoQc2ZpeGVkMzIuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4i5RQKDVNGaXhlZDY0UnVsZXMSgAEKBWNvbnN0GAEgASgQQnHCSG4KbAoOc2ZpeGVkNjQuY29uc3QaWnRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ211c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKHAQoCbHQYAiABKBBCecJIdgp0CgtzZml4ZWQ2NC5sdBplIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICdtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKZAQoDbHRlGAMgASgQQokBwkiFAQqCAQoMc2ZpeGVkNjQubHRlGnIhaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ211c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABKIBwoCZ3QYBCABKBBC+QbCSPUGCncKC3NmaXhlZDY0Lmd0GmghaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwqwAQoOc2ZpeGVkNjQuZ3RfbHQanQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrgBChhzZml4ZWQ2NC5ndF9sdF9leGNsdXNpdmUamwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrAAQoPc2ZpeGVkNjQuZ3RfbHRlGqwBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrIAQoZc2ZpeGVkNjQuZ3RfbHRlX2V4Y2x1c2l2ZRqqAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES1AcKA2d0ZRgFIAEoEELEB8JIwAcKhQEKDHNmaXhlZDY0Lmd0ZRp1IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCr8BCg9zZml4ZWQ2NC5ndGVfbHQaqwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKxwEKGXNmaXhlZDY0Lmd0ZV9sdF9leGNsdXNpdmUaqQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCs8BChBzZml4ZWQ2NC5ndGVfbHRlGroBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCtcBChpzZml4ZWQ2NC5ndGVfbHRlX2V4Y2x1c2l2ZRq4AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJ8CgJpbhgGIAMoEEJwwkhtCmsKC3NmaXhlZDY0LmluGlwhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICdtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJzCgZub3RfaW4YByADKBBCY8JIYApeCg9zZml4ZWQ2NC5ub3RfaW4aS3RoaXMgaW4gcnVsZXMubm90X2luID8gJ211c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxIuCgdleGFtcGxlGAggAygQQh3CSBoKGAoQc2ZpeGVkNjQuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4iwAEKCUJvb2xSdWxlcxJ8CgVjb25zdBgBIAEoCEJtwkhqCmgKCmJvb2wuY29uc3QaWnRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ211c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxIqCgdleGFtcGxlGAIgAygIQhnCSBYKFAoMYm9vbC5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAIi6jwKC1N0cmluZ1J1bGVzEoABCgVjb25zdBgBIAEoCUJxwkhuCmwKDHN0cmluZy5jb25zdBpcdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAnbXVzdCBlcXVhbCBgJXNgJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycScQoDbGVuGBMgASgEQmTCSGEKXwoKc3RyaW5nLmxlbhpRdWludCh0aGlzLnNpemUoKSkgIT0gcnVsZXMubGVuID8gJ211c3QgYmUgJXMgY2hhcmFjdGVycycuZm9ybWF0KFtydWxlcy5sZW5dKSA6ICcnEokBCgdtaW5fbGVuGAIgASgEQnjCSHUKcwoOc3RyaW5nLm1pbl9sZW4aYXVpbnQodGhpcy5zaXplKCkpIDwgcnVsZXMubWluX2xlbiA/ICdtdXN0IGJlIGF0IGxlYXN0ICVzIGNoYXJhY3RlcnMnLmZvcm1hdChbcnVsZXMubWluX2xlbl0pIDogJycSiAEKB21heF9sZW4YAyABKARCd8JIdApyCg5zdHJpbmcubWF4X2xlbhpgdWludCh0aGlzLnNpemUoKSkgPiBydWxlcy5tYXhfbGVuID8gJ211c3QgYmUgYXQgbW9zdCAlcyBjaGFyYWN0ZXJzJy5mb3JtYXQoW3J1bGVzLm1heF9sZW5dKSA6ICcnEosBCglsZW5fYnl0ZXMYFCABKARCeMJIdQpzChBzdHJpbmcubGVuX2J5dGVzGl91aW50KGJ5dGVzKHRoaXMpLnNpemUoKSkgIT0gcnVsZXMubGVuX2J5dGVzID8gJ211c3QgYmUgJXMgYnl0ZXMnLmZvcm1hdChbcnVsZXMubGVuX2J5dGVzXSkgOiAnJxKUAQoJbWluX2J5dGVzGAQgASgEQoABwkh9CnsKEHN0cmluZy5taW5fYnl0ZXMaZ3VpbnQoYnl0ZXModGhpcykuc2l6ZSgpKSA8IHJ1bGVzLm1pbl9ieXRlcyA/ICdtdXN0IGJlIGF0IGxlYXN0ICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLm1pbl9ieXRlc10pIDogJycSkgEKCW1heF9ieXRlcxgFIAEoBEJ/wkh8CnoKEHN0cmluZy5tYXhfYnl0ZXMaZnVpbnQoYnl0ZXModGhpcykuc2l6ZSgpKSA+IHJ1bGVzLm1heF9ieXRlcyA/ICdtdXN0IGJlIGF0IG1vc3QgJXMgYnl0ZXMnLmZvcm1hdChbcnVsZXMubWF4X2J5dGVzXSkgOiAnJxKHAQoHcGF0dGVybhgGIAEoCUJ2wkhzCnEKDnN0cmluZy5wYXR0ZXJuGl8hdGhpcy5tYXRjaGVzKHJ1bGVzLnBhdHRlcm4pID8gJ2RvZXMgbm90IG1hdGNoIHJlZ2V4IHBhdHRlcm4gYCVzYCcuZm9ybWF0KFtydWxlcy5wYXR0ZXJuXSkgOiAnJxJ+CgZwcmVmaXgYByABKAlCbsJIawppCg1zdHJpbmcucHJlZml4GlghdGhpcy5zdGFydHNXaXRoKHJ1bGVzLnByZWZpeCkgPyAnZG9lcyBub3QgaGF2ZSBwcmVmaXggYCVzYCcuZm9ybWF0KFtydWxlcy5wcmVmaXhdKSA6ICcnEnwKBnN1ZmZpeBgIIAEoCUJswkhpCmcKDXN0cmluZy5zdWZmaXgaViF0aGlzLmVuZHNXaXRoKHJ1bGVzLnN1ZmZpeCkgPyAnZG9lcyBub3QgaGF2ZSBzdWZmaXggYCVzYCcuZm9ybWF0KFtydWxlcy5zdWZmaXhdKSA6ICcnEooBCghjb250YWlucxgJIAEoCUJ4wkh1CnMKD3N0cmluZy5jb250YWlucxpgIXRoaXMuY29udGFpbnMocnVsZXMuY29udGFpbnMpID8gJ2RvZXMgbm90IGNvbnRhaW4gc3Vic3RyaW5nIGAlc2AnLmZvcm1hdChbcnVsZXMuY29udGFpbnNdKSA6ICcnEpEBCgxub3RfY29udGFpbnMYFyABKAlCe8JIeAp2ChNzdHJpbmcubm90X2NvbnRhaW5zGl90aGlzLmNvbnRhaW5zKHJ1bGVzLm5vdF9jb250YWlucykgPyAnY29udGFpbnMgc3Vic3RyaW5nIGAlc2AnLmZvcm1hdChbcnVsZXMubm90X2NvbnRhaW5zXSkgOiAnJxJ6CgJpbhgKIAMoCUJuwkhrCmkKCXN0cmluZy5pbhpcISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAnbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycScQoGbm90X2luGAsgAygJQmHCSF4KXAoNc3RyaW5nLm5vdF9pbhpLdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAnbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEtkBCgVlbWFpbBgMIAEoCELHAcJIwwEKWwoMc3RyaW5nLmVtYWlsEh1tdXN0IGJlIGEgdmFsaWQgZW1haWwgYWRkcmVzcxosIXJ1bGVzLmVtYWlsIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0VtYWlsKCkKZAoSc3RyaW5nLmVtYWlsX2VtcHR5EjJ2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgZW1haWwgYWRkcmVzcxoaIXJ1bGVzLmVtYWlsIHx8IHRoaXMgIT0gJydIABLhAQoIaG9zdG5hbWUYDSABKAhCzAHCSMgBCl8KD3N0cmluZy5ob3N0bmFtZRIYbXVzdCBiZSBhIHZhbGlkIGhvc3RuYW1lGjIhcnVsZXMuaG9zdG5hbWUgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSG9zdG5hbWUoKQplChVzdHJpbmcuaG9zdG5hbWVfZW1wdHkSLXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBob3N0bmFtZRodIXJ1bGVzLmhvc3RuYW1lIHx8IHRoaXMgIT0gJydIABLBAQoCaXAYDiABKAhCsgHCSK4BCk8KCXN0cmluZy5pcBIabXVzdCBiZSBhIHZhbGlkIElQIGFkZHJlc3MaJiFydWxlcy5pcCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcCgpClsKD3N0cmluZy5pcF9lbXB0eRIvdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQIGFkZHJlc3MaFyFydWxlcy5pcCB8fCB0aGlzICE9ICcnSAAS0AEKBGlwdjQYDyABKAhCvwHCSLsBClYKC3N0cmluZy5pcHY0EhxtdXN0IGJlIGEgdmFsaWQgSVB2NCBhZGRyZXNzGikhcnVsZXMuaXB2NCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcCg0KQphChFzdHJpbmcuaXB2NF9lbXB0eRIxdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjQgYWRkcmVzcxoZIXJ1bGVzLmlwdjQgfHwgdGhpcyAhPSAnJ0gAEtABCgRpcHY2GBAgASgIQr8Bwki7AQpWCgtzdHJpbmcuaXB2NhIcbXVzdCBiZSBhIHZhbGlkIElQdjYgYWRkcmVzcxopIXJ1bGVzLmlwdjYgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXAoNikKYQoRc3RyaW5nLmlwdjZfZW1wdHkSMXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBJUHY2IGFkZHJlc3MaGSFydWxlcy5pcHY2IHx8IHRoaXMgIT0gJydIABK5AQoDdXJpGBEgASgIQqkBwkilAQpLCgpzdHJpbmcudXJpEhNtdXN0IGJlIGEgdmFsaWQgVVJJGighcnVsZXMudXJpIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc1VyaSgpClYKEHN0cmluZy51cmlfZW1wdHkSKHZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBVUkkaGCFydWxlcy51cmkgfHwgdGhpcyAhPSAnJ0gAEmoKB3VyaV9yZWYYEiABKAhCV8JIVApSCg5zdHJpbmcudXJpX3JlZhIdbXVzdCBiZSBhIHZhbGlkIFVSSSBSZWZlcmVuY2UaISFydWxlcy51cmlfcmVmIHx8IHRoaXMuaXNVcmlSZWYoKUgAEokCCgdhZGRyZXNzGBUgASgIQvUBwkjxAQp7Cg5zdHJpbmcuYWRkcmVzcxInbXVzdCBiZSBhIHZhbGlkIGhvc3RuYW1lLCBvciBpcCBhZGRyZXNzGkAhcnVsZXMuYWRkcmVzcyB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNIb3N0bmFtZSgpIHx8IHRoaXMuaXNJcCgpCnIKFHN0cmluZy5hZGRyZXNzX2VtcHR5Ejx2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgaG9zdG5hbWUsIG9yIGlwIGFkZHJlc3MaHCFydWxlcy5hZGRyZXNzIHx8IHRoaXMgIT0gJydIABKSAgoEdXVpZBgWIAEoCEKBAsJI/QEKnwEKC3N0cmluZy51dWlkEhRtdXN0IGJlIGEgdmFsaWQgVVVJRBp6IXJ1bGVzLnV1aWQgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLm1hdGNoZXMoJ15bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kJykKWQoRc3RyaW5nLnV1aWRfZW1wdHkSKXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBVVUlEGhkhcnVsZXMudXVpZCB8fCB0aGlzICE9ICcnSAAS6gEKBXR1dWlkGCEgASgIQtgBwkjUAQptCgxzdHJpbmcudHV1aWQSHG11c3QgYmUgYSB2YWxpZCB0cmltbWVkIFVVSUQaPyFydWxlcy50dXVpZCB8fCB0aGlzID09ICcnIHx8IHRoaXMubWF0Y2hlcygnXlswLTlhLWZBLUZdezMyfSQnKQpjChJzdHJpbmcudHV1aWRfZW1wdHkSMXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCB0cmltbWVkIFVVSUQaGiFydWxlcy50dXVpZCB8fCB0aGlzICE9ICcnSAASkAIKEWlwX3dpdGhfcHJlZml4bGVuGBogASgIQvIBwkjuAQpyChhzdHJpbmcuaXBfd2l0aF9wcmVmaXhsZW4SGW11c3QgYmUgYSB2YWxpZCBJUCBwcmVmaXgaOyFydWxlcy5pcF93aXRoX3ByZWZpeGxlbiB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcFByZWZpeCgpCngKHnN0cmluZy5pcF93aXRoX3ByZWZpeGxlbl9lbXB0eRIudmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQIHByZWZpeBomIXJ1bGVzLmlwX3dpdGhfcHJlZml4bGVuIHx8IHRoaXMgIT0gJydIABLJAgoTaXB2NF93aXRoX3ByZWZpeGxlbhgbIAEoCEKpAsJIpQIKjQEKGnN0cmluZy5pcHY0X3dpdGhfcHJlZml4bGVuEi9tdXN0IGJlIGEgdmFsaWQgSVB2NCBhZGRyZXNzIHdpdGggcHJlZml4IGxlbmd0aBo+IXJ1bGVzLmlwdjRfd2l0aF9wcmVmaXhsZW4gfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXBQcmVmaXgoNCkKkgEKIHN0cmluZy5pcHY0X3dpdGhfcHJlZml4bGVuX2VtcHR5EkR2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NCBhZGRyZXNzIHdpdGggcHJlZml4IGxlbmd0aBooIXJ1bGVzLmlwdjRfd2l0aF9wcmVmaXhsZW4gfHwgdGhpcyAhPSAnJ0gAEskCChNpcHY2X3dpdGhfcHJlZml4bGVuGBwgASgIQqkCwkilAgqNAQoac3RyaW5nLmlwdjZfd2l0aF9wcmVmaXhsZW4SL211c3QgYmUgYSB2YWxpZCBJUHY2IGFkZHJlc3Mgd2l0aCBwcmVmaXggbGVuZ3RoGj4hcnVsZXMuaXB2Nl93aXRoX3ByZWZpeGxlbiB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcFByZWZpeCg2KQqSAQogc3RyaW5nLmlwdjZfd2l0aF9wcmVmaXhsZW5fZW1wdHkSRHZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBJUHY2IGFkZHJlc3Mgd2l0aCBwcmVmaXggbGVuZ3RoGighcnVsZXMuaXB2Nl93aXRoX3ByZWZpeGxlbiB8fCB0aGlzICE9ICcnSAAS7AEKCWlwX3ByZWZpeBgdIAEoCELWAcJI0gEKZgoQc3RyaW5nLmlwX3ByZWZpeBIZbXVzdCBiZSBhIHZhbGlkIElQIHByZWZpeBo3IXJ1bGVzLmlwX3ByZWZpeCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcFByZWZpeCh0cnVlKQpoChZzdHJpbmcuaXBfcHJlZml4X2VtcHR5Ei52YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVAgcHJlZml4Gh4hcnVsZXMuaXBfcHJlZml4IHx8IHRoaXMgIT0gJydIABL9AQoLaXB2NF9wcmVmaXgYHiABKAhC5QHCSOEBCm8KEnN0cmluZy5pcHY0X3ByZWZpeBIbbXVzdCBiZSBhIHZhbGlkIElQdjQgcHJlZml4GjwhcnVsZXMuaXB2NF9wcmVmaXggfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXBQcmVmaXgoNCwgdHJ1ZSkKbgoYc3RyaW5nLmlwdjRfcHJlZml4X2VtcHR5EjB2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NCBwcmVmaXgaICFydWxlcy5pcHY0X3ByZWZpeCB8fCB0aGlzICE9ICcnSAAS/QEKC2lwdjZfcHJlZml4GB8gASgIQuUBwkjhAQpvChJzdHJpbmcuaXB2Nl9wcmVmaXgSG211c3QgYmUgYSB2YWxpZCBJUHY2IHByZWZpeBo8IXJ1bGVzLmlwdjZfcHJlZml4IHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwUHJlZml4KDYsIHRydWUpCm4KGHN0cmluZy5pcHY2X3ByZWZpeF9lbXB0eRIwdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjYgcHJlZml4GiAhcnVsZXMuaXB2Nl9wcmVmaXggfHwgdGhpcyAhPSAnJ0gAEq8CCg1ob3N0X2FuZF9wb3J0GCAgASgIQpUCwkiRAgqTAQoUc3RyaW5nLmhvc3RfYW5kX3BvcnQSO211c3QgYmUgYSB2YWxpZCBob3N0IChob3N0bmFtZSBvciBJUCBhZGRyZXNzKSBhbmQgcG9ydCBwYWlyGj4hcnVsZXMuaG9zdF9hbmRfcG9ydCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNIb3N0QW5kUG9ydCh0cnVlKQp5ChpzdHJpbmcuaG9zdF9hbmRfcG9ydF9lbXB0eRI3dmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIGhvc3QgYW5kIHBvcnQgcGFpchoiIXJ1bGVzLmhvc3RfYW5kX3BvcnQgfHwgdGhpcyAhPSAnJ0gAEu4BCgR1bGlkGCMgASgIQt0BwkjZAQp8CgtzdHJpbmcudWxpZBIUbXVzdCBiZSBhIHZhbGlkIFVMSUQaVyFydWxlcy51bGlkIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5tYXRjaGVzKCdeWzAtN11bMC05QS1ISktNTlAtVFYtWmEtaGprbW5wLXR2LXpdezI1fSQnKQpZChFzdHJpbmcudWxpZF9lbXB0eRIpdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIFVMSUQaGSFydWxlcy51bGlkIHx8IHRoaXMgIT0gJydIABLUAgoMcHJvdG9idWZfZnFuGCUgASgIQrsCwki3AgqvAQoTc3RyaW5nLnByb3RvYnVmX2ZxbhItbXVzdCBiZSBhIHZhbGlkIGZ1bGx5LXF1YWxpZmllZCBQcm90b2J1ZiBuYW1lGmkhcnVsZXMucHJvdG9idWZfZnFuIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5tYXRjaGVzKCdeW0EtWmEtel9dW0EtWmEtel8wLTldKihcXC5bQS1aYS16X11bQS1aYS16XzAtOV0qKSokJykKggEKGXN0cmluZy5wcm90b2J1Zl9mcW5fZW1wdHkSQnZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBmdWxseS1xdWFsaWZpZWQgUHJvdG9idWYgbmFtZRohIXJ1bGVzLnByb3RvYnVmX2ZxbiB8fCB0aGlzICE9ICcnSAASkQMKEHByb3RvYnVmX2RvdF9mcW4YJiABKAhC9ALCSPACCs0BChdzdHJpbmcucHJvdG9idWZfZG90X2ZxbhJAbXVzdCBiZSBhIHZhbGlkIGZ1bGx5LXF1YWxpZmllZCBQcm90b2J1ZiBuYW1lIHdpdGggYSBsZWFkaW5nIGRvdBpwIXJ1bGVzLnByb3RvYnVmX2RvdF9mcW4gfHwgdGhpcyA9PSAnJyB8fCB0aGlzLm1hdGNoZXMoJ15cXC5bQS1aYS16X11bQS1aYS16XzAtOV0qKFxcLltBLVphLXpfXVtBLVphLXpfMC05XSopKiQnKQqdAQodc3RyaW5nLnByb3RvYnVmX2RvdF9mcW5fZW1wdHkSVXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBmdWxseS1xdWFsaWZpZWQgUHJvdG9idWYgbmFtZSB3aXRoIGEgbGVhZGluZyBkb3QaJSFydWxlcy5wcm90b2J1Zl9kb3RfZnFuIHx8IHRoaXMgIT0gJydIABKcBQoQd2VsbF9rbm93bl9yZWdleBgYIAEoDjIYLmJ1Zi52YWxpZGF0ZS5Lbm93blJlZ2V4QuUEwkjhBArqAQojc3RyaW5nLndlbGxfa25vd25fcmVnZXguaGVhZGVyX25hbWUSIG11c3QgYmUgYSB2YWxpZCBIVFRQIGhlYWRlciBuYW1lGqABcnVsZXMud2VsbF9rbm93bl9yZWdleCAhPSAxIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5tYXRjaGVzKCFoYXMocnVsZXMuc3RyaWN0KSB8fCBydWxlcy5zdHJpY3QgPydeOj9bMC05YS16QS1aISMkJSZcJyorLS5eX3x+XHg2MF0rJCcgOideW15cdTAwMDBcdTAwMEFcdTAwMERdKyQnKQqNAQopc3RyaW5nLndlbGxfa25vd25fcmVnZXguaGVhZGVyX25hbWVfZW1wdHkSNXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBIVFRQIGhlYWRlciBuYW1lGilydWxlcy53ZWxsX2tub3duX3JlZ2V4ICE9IDEgfHwgdGhpcyAhPSAnJwrhAQokc3RyaW5nLndlbGxfa25vd25fcmVnZXguaGVhZGVyX3ZhbHVlEiFtdXN0IGJlIGEgdmFsaWQgSFRUUCBoZWFkZXIgdmFsdWUalQFydWxlcy53ZWxsX2tub3duX3JlZ2V4ICE9IDIgfHwgdGhpcy5tYXRjaGVzKCFoYXMocnVsZXMuc3RyaWN0KSB8fCBydWxlcy5zdHJpY3QgPydeW15cdTAwMDAtXHUwMDA4XHUwMDBBLVx1MDAxRlx1MDA3Rl0qJCcgOideW15cdTAwMDBcdTAwMEFcdTAwMERdKiQnKUgAEg4KBnN0cmljdBgZIAEoCBIsCgdleGFtcGxlGCIgAygJQhvCSBgKFgoOc3RyaW5nLmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkIMCgp3ZWxsX2tub3duIt0RCgpCeXRlc1J1bGVzEnoKBWNvbnN0GAEgASgMQmvCSGgKZgoLYnl0ZXMuY29uc3QaV3RoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ211c3QgYmUgJXgnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxJrCgNsZW4YDSABKARCXsJIWwpZCglieXRlcy5sZW4aTHVpbnQodGhpcy5zaXplKCkpICE9IHJ1bGVzLmxlbiA/ICdtdXN0IGJlICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLmxlbl0pIDogJycSgwEKB21pbl9sZW4YAiABKARCcsJIbwptCg1ieXRlcy5taW5fbGVuGlx1aW50KHRoaXMuc2l6ZSgpKSA8IHJ1bGVzLm1pbl9sZW4gPyAnbXVzdCBiZSBhdCBsZWFzdCAlcyBieXRlcycuZm9ybWF0KFtydWxlcy5taW5fbGVuXSkgOiAnJxKCAQoHbWF4X2xlbhgDIAEoBEJxwkhuCmwKDWJ5dGVzLm1heF9sZW4aW3VpbnQodGhpcy5zaXplKCkpID4gcnVsZXMubWF4X2xlbiA/ICdtdXN0IGJlIGF0IG1vc3QgJXMgYnl0ZXMnLmZvcm1hdChbcnVsZXMubWF4X2xlbl0pIDogJycSigEKB3BhdHRlcm4YBCABKAlCecJIdgp0Cg1ieXRlcy5wYXR0ZXJuGmMhc3RyaW5nKHRoaXMpLm1hdGNoZXMocnVsZXMucGF0dGVybikgPyAnbXVzdCBtYXRjaCByZWdleCBwYXR0ZXJuIGAlc2AnLmZvcm1hdChbcnVsZXMucGF0dGVybl0pIDogJycSewoGcHJlZml4GAUgASgMQmvCSGgKZgoMYnl0ZXMucHJlZml4GlYhdGhpcy5zdGFydHNXaXRoKHJ1bGVzLnByZWZpeCkgPyAnZG9lcyBub3QgaGF2ZSBwcmVmaXggJXgnLmZvcm1hdChbcnVsZXMucHJlZml4XSkgOiAnJxJ5CgZzdWZmaXgYBiABKAxCacJIZgpkCgxieXRlcy5zdWZmaXgaVCF0aGlzLmVuZHNXaXRoKHJ1bGVzLnN1ZmZpeCkgPyAnZG9lcyBub3QgaGF2ZSBzdWZmaXggJXgnLmZvcm1hdChbcnVsZXMuc3VmZml4XSkgOiAnJxJ9Cghjb250YWlucxgHIAEoDEJrwkhoCmYKDmJ5dGVzLmNvbnRhaW5zGlQhdGhpcy5jb250YWlucyhydWxlcy5jb250YWlucykgPyAnZG9lcyBub3QgY29udGFpbiAleCcuZm9ybWF0KFtydWxlcy5jb250YWluc10pIDogJycSoQEKAmluGAggAygMQpQBwkiQAQqNAQoIYnl0ZXMuaW4agAFnZXRGaWVsZChydWxlcywgJ2luJykuc2l6ZSgpID4gMCAmJiAhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICdtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJwCgZub3RfaW4YCSADKAxCYMJIXQpbCgxieXRlcy5ub3RfaW4aS3RoaXMgaW4gcnVsZXMubm90X2luID8gJ211c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxLlAQoCaXAYCiABKAhC1gHCSNIBCm4KCGJ5dGVzLmlwEhptdXN0IGJlIGEgdmFsaWQgSVAgYWRkcmVzcxpGIXJ1bGVzLmlwIHx8IHRoaXMuc2l6ZSgpID09IDAgfHwgdGhpcy5zaXplKCkgPT0gNCB8fCB0aGlzLnNpemUoKSA9PSAxNgpgCg5ieXRlcy5pcF9lbXB0eRIvdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQIGFkZHJlc3MaHSFydWxlcy5pcCB8fCB0aGlzLnNpemUoKSAhPSAwSAAS3gEKBGlwdjQYCyABKAhCzQHCSMkBCl8KCmJ5dGVzLmlwdjQSHG11c3QgYmUgYSB2YWxpZCBJUHY0IGFkZHJlc3MaMyFydWxlcy5pcHY0IHx8IHRoaXMuc2l6ZSgpID09IDAgfHwgdGhpcy5zaXplKCkgPT0gNApmChBieXRlcy5pcHY0X2VtcHR5EjF2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NCBhZGRyZXNzGh8hcnVsZXMuaXB2NCB8fCB0aGlzLnNpemUoKSAhPSAwSAAS3wEKBGlwdjYYDCABKAhCzgHCSMoBCmAKCmJ5dGVzLmlwdjYSHG11c3QgYmUgYSB2YWxpZCBJUHY2IGFkZHJlc3MaNCFydWxlcy5pcHY2IHx8IHRoaXMuc2l6ZSgpID09IDAgfHwgdGhpcy5zaXplKCkgPT0gMTYKZgoQYnl0ZXMuaXB2Nl9lbXB0eRIxdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjYgYWRkcmVzcxofIXJ1bGVzLmlwdjYgfHwgdGhpcy5zaXplKCkgIT0gMEgAEs8BCgR1dWlkGA8gASgIQr4Bwki6AQpYCgpieXRlcy51dWlkEhRtdXN0IGJlIGEgdmFsaWQgVVVJRBo0IXJ1bGVzLnV1aWQgfHwgdGhpcy5zaXplKCkgPT0gMCB8fCB0aGlzLnNpemUoKSA9PSAxNgpeChBieXRlcy51dWlkX2VtcHR5Eil2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgVVVJRBofIXJ1bGVzLnV1aWQgfHwgdGhpcy5zaXplKCkgIT0gMEgAEisKB2V4YW1wbGUYDiADKAxCGsJIFwoVCg1ieXRlcy5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCDAoKd2VsbF9rbm93biLBAwoJRW51bVJ1bGVzEnwKBWNvbnN0GAEgASgFQm3CSGoKaAoKZW51bS5jb25zdBpadGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAnbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEhQKDGRlZmluZWRfb25seRgCIAEoCBJ4CgJpbhgDIAMoBUJswkhpCmcKB2VudW0uaW4aXCEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ211c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEm8KBm5vdF9pbhgEIAMoBUJfwkhcCloKC2VudW0ubm90X2luGkt0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICdtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSKgoHZXhhbXBsZRgFIAMoBUIZwkgWChQKDGVudW0uZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACIu0DCg1SZXBlYXRlZFJ1bGVzEpYBCgltaW5faXRlbXMYASABKARCggHCSH8KfQoScmVwZWF0ZWQubWluX2l0ZW1zGmd1aW50KHRoaXMuc2l6ZSgpKSA8IHJ1bGVzLm1pbl9pdGVtcyA/ICdtdXN0IGNvbnRhaW4gYXQgbGVhc3QgJWQgaXRlbShzKScuZm9ybWF0KFtydWxlcy5taW5faXRlbXNdKSA6ICcnEpwBCgltYXhfaXRlbXMYAiABKARCiAHCSIQBCoEBChJyZXBlYXRlZC5tYXhfaXRlbXMaa3VpbnQodGhpcy5zaXplKCkpID4gcnVsZXMubWF4X2l0ZW1zID8gJ211c3QgY29udGFpbiBubyBtb3JlIHRoYW4gJXMgaXRlbShzKScuZm9ybWF0KFtydWxlcy5tYXhfaXRlbXNdKSA6ICcnEnAKBnVuaXF1ZRgDIAEoCEJgwkhdClsKD3JlcGVhdGVkLnVuaXF1ZRIocmVwZWF0ZWQgdmFsdWUgbXVzdCBjb250YWluIHVuaXF1ZSBpdGVtcxoeIXJ1bGVzLnVuaXF1ZSB8fCB0aGlzLnVuaXF1ZSgpEicKBWl0ZW1zGAQgASgLMhguYnVmLnZhbGlkYXRlLkZpZWxkUnVsZXMqCQjoBxCAgICAAiKKAwoITWFwUnVsZXMSjwEKCW1pbl9wYWlycxgBIAEoBEJ8wkh5CncKDW1hcC5taW5fcGFpcnMaZnVpbnQodGhpcy5zaXplKCkpIDwgcnVsZXMubWluX3BhaXJzID8gJ21hcCBtdXN0IGJlIGF0IGxlYXN0ICVkIGVudHJpZXMnLmZvcm1hdChbcnVsZXMubWluX3BhaXJzXSkgOiAnJxKOAQoJbWF4X3BhaXJzGAIgASgEQnvCSHgKdgoNbWFwLm1heF9wYWlycxpldWludCh0aGlzLnNpemUoKSkgPiBydWxlcy5tYXhfcGFpcnMgPyAnbWFwIG11c3QgYmUgYXQgbW9zdCAlZCBlbnRyaWVzJy5mb3JtYXQoW3J1bGVzLm1heF9wYWlyc10pIDogJycSJgoEa2V5cxgEIAEoCzIYLmJ1Zi52YWxpZGF0ZS5GaWVsZFJ1bGVzEigKBnZhbHVlcxgFIAEoCzIYLmJ1Zi52YWxpZGF0ZS5GaWVsZFJ1bGVzKgkI6AcQgICAgAIiJgoIQW55UnVsZXMSCgoCaW4YAiADKAkSDgoGbm90X2luGAMgAygJIr8WCg1EdXJhdGlvblJ1bGVzEpsBCgVjb25zdBgCIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkJxwkhuCmwKDmR1cmF0aW9uLmNvbnN0Glp0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICdtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSogEKAmx0GAMgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQnnCSHYKdAoLZHVyYXRpb24ubHQaZSFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID49IHJ1bGVzLmx0PyAnbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSAAStAEKA2x0ZRgEIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkKJAcJIhQEKggEKDGR1cmF0aW9uLmx0ZRpyIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICdtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASowcKAmd0GAUgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQvkGwkj1Bgp3CgtkdXJhdGlvbi5ndBpoIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKsAEKDmR1cmF0aW9uLmd0X2x0Gp0BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq4AQoYZHVyYXRpb24uZ3RfbHRfZXhjbHVzaXZlGpsBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKwAEKD2R1cmF0aW9uLmd0X2x0ZRqsAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKyAEKGWR1cmF0aW9uLmd0X2x0ZV9leGNsdXNpdmUaqgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEu8HCgNndGUYBiABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CxAfCSMAHCoUBCgxkdXJhdGlvbi5ndGUadSFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwq/AQoPZHVyYXRpb24uZ3RlX2x0GqsBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCscBChlkdXJhdGlvbi5ndGVfbHRfZXhjbHVzaXZlGqkBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrPAQoQZHVyYXRpb24uZ3RlX2x0ZRq6AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrXAQoaZHVyYXRpb24uZ3RlX2x0ZV9leGNsdXNpdmUauAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESlwEKAmluGAcgAygLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQnDCSG0KawoLZHVyYXRpb24uaW4aXCEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ211c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEo4BCgZub3RfaW4YCCADKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CY8JIYApeCg9kdXJhdGlvbi5ub3RfaW4aS3RoaXMgaW4gcnVsZXMubm90X2luID8gJ211c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxJJCgdleGFtcGxlGAkgAygLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQh3CSBoKGAoQZHVyYXRpb24uZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4i6wUKDkZpZWxkTWFza1J1bGVzErkBCgVjb25zdBgBIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2tCjQHCSIkBCoYBChBmaWVsZF9tYXNrLmNvbnN0GnJ0aGlzLnBhdGhzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKS5wYXRocyA/ICdtdXN0IGVxdWFsIHBhdGhzICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKS5wYXRoc10pIDogJycS0wEKAmluGAIgAygJQsYBwkjCAQq/AQoNZmllbGRfbWFzay5pbhqtASF0aGlzLnBhdGhzLmFsbChwLCBwIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSB8fCBnZXRGaWVsZChydWxlcywgJ2luJykuZXhpc3RzKGYsIHAuc3RhcnRzV2l0aChmKycuJykpKSA/ICdtdXN0IG9ubHkgY29udGFpbiBwYXRocyBpbiAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEu0BCgZub3RfaW4YAyADKAlC3AHCSNgBCtUBChFmaWVsZF9tYXNrLm5vdF9pbhq/ASF0aGlzLnBhdGhzLmFsbChwLCAhKHAgaW4gZ2V0RmllbGQocnVsZXMsICdub3RfaW4nKSB8fCBnZXRGaWVsZChydWxlcywgJ25vdF9pbicpLmV4aXN0cyhmLCBwLnN0YXJ0c1dpdGgoZisnLicpKSkpID8gJ211c3Qgbm90IGNvbnRhaW4gYW55IHBhdGhzIGluICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnbm90X2luJyldKSA6ICcnEkwKB2V4YW1wbGUYBCADKAsyGi5nb29nbGUucHJvdG9idWYuRmllbGRNYXNrQh/CSBwKGgoSZmllbGRfbWFzay5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAIisBcKDlRpbWVzdGFtcFJ1bGVzEp0BCgVjb25zdBgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCcsJIbwptCg90aW1lc3RhbXAuY29uc3QaWnRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ211c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKkAQoCbHQYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQnrCSHcKdQoMdGltZXN0YW1wLmx0GmUhaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ211c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAErYBCgNsdGUYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQooBwkiGAQqDAQoNdGltZXN0YW1wLmx0ZRpyIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICdtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASZgoGbHRfbm93GAcgASgIQlTCSFEKTwoQdGltZXN0YW1wLmx0X25vdxo7KHJ1bGVzLmx0X25vdyAmJiB0aGlzID4gbm93KSA/ICdtdXN0IGJlIGxlc3MgdGhhbiBub3cnIDogJydIABKpBwoCZ3QYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQv4Gwkj6Bgp4Cgx0aW1lc3RhbXAuZ3QaaCFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrEBCg90aW1lc3RhbXAuZ3RfbHQanQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrkBChl0aW1lc3RhbXAuZ3RfbHRfZXhjbHVzaXZlGpsBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKwQEKEHRpbWVzdGFtcC5ndF9sdGUarAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCskBChp0aW1lc3RhbXAuZ3RfbHRlX2V4Y2x1c2l2ZRqqAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES9QcKA2d0ZRgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCyQfCSMUHCoYBCg10aW1lc3RhbXAuZ3RlGnUhaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKwAEKEHRpbWVzdGFtcC5ndGVfbHQaqwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKyAEKGnRpbWVzdGFtcC5ndGVfbHRfZXhjbHVzaXZlGqkBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrQAQoRdGltZXN0YW1wLmd0ZV9sdGUaugFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK2AEKG3RpbWVzdGFtcC5ndGVfbHRlX2V4Y2x1c2l2ZRq4AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJpCgZndF9ub3cYCCABKAhCV8JIVApSChB0aW1lc3RhbXAuZ3Rfbm93Gj4ocnVsZXMuZ3Rfbm93ICYmIHRoaXMgPCBub3cpID8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG5vdycgOiAnJ0gBErEBCgZ3aXRoaW4YCSABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25ChQHCSIEBCn8KEHRpbWVzdGFtcC53aXRoaW4aa3RoaXMgPCBub3ctcnVsZXMud2l0aGluIHx8IHRoaXMgPiBub3crcnVsZXMud2l0aGluID8gJ211c3QgYmUgd2l0aGluICVzIG9mIG5vdycuZm9ybWF0KFtydWxlcy53aXRoaW5dKSA6ICcnEksKB2V4YW1wbGUYCiADKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQh7CSBsKGQoRdGltZXN0YW1wLmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIjkKClZpb2xhdGlvbnMSKwoKdmlvbGF0aW9ucxgBIAMoCzIXLmJ1Zi52YWxpZGF0ZS5WaW9sYXRpb24inwEKCVZpb2xhdGlvbhImCgVmaWVsZBgFIAEoCzIXLmJ1Zi52YWxpZGF0ZS5GaWVsZFBhdGgSJQoEcnVsZRgGIAEoCzIXLmJ1Zi52YWxpZGF0ZS5GaWVsZFBhdGgSDwoHcnVsZV9pZBgCIAEoCRIPCgdtZXNzYWdlGAMgASgJEg8KB2Zvcl9rZXkYBCABKAhKBAgBEAJSCmZpZWxkX3BhdGgiPQoJRmllbGRQYXRoEjAKCGVsZW1lbnRzGAEgAygLMh4uYnVmLnZhbGlkYXRlLkZpZWxkUGF0aEVsZW1lbnQi6QIKEEZpZWxkUGF0aEVsZW1lbnQSFAoMZmllbGRfbnVtYmVyGAEgASgFEhIKCmZpZWxkX25hbWUYAiABKAkSPgoKZmllbGRfdHlwZRgDIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlEjwKCGtleV90eXBlGAQgASgOMiouZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUSPgoKdmFsdWVfdHlwZRgFIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlEg8KBWluZGV4GAYgASgESAASEgoIYm9vbF9rZXkYByABKAhIABIRCgdpbnRfa2V5GAggASgDSAASEgoIdWludF9rZXkYCSABKARIABIUCgpzdHJpbmdfa2V5GAogASgJSABCCwoJc3Vic2NyaXB0KqEBCgZJZ25vcmUSFgoSSUdOT1JFX1VOU1BFQ0lGSUVEEAASGAoUSUdOT1JFX0lGX1pFUk9fVkFMVUUQARIRCg1JR05PUkVfQUxXQVlTEAMiBAgCEAIqDElHTk9SRV9FTVBUWSoOSUdOT1JFX0RFRkFVTFQqF0lHTk9SRV9JRl9ERUZBVUxUX1ZBTFVFKhVJR05PUkVfSUZfVU5QT1BVTEFURUQqbgoKS25vd25SZWdleBIbChdLTk9XTl9SRUdFWF9VTlNQRUNJRklFRBAAEiAKHEtOT1dOX1JFR0VYX0hUVFBfSEVBREVSX05BTUUQARIhCh1LTk9XTl9SRUdFWF9IVFRQX0hFQURFUl9WQUxVRRACOlYKB21lc3NhZ2USHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYhwkgASgLMhouYnVmLnZhbGlkYXRlLk1lc3NhZ2VSdWxlc1IHbWVzc2FnZTpOCgVvbmVvZhIdLmdvb2dsZS5wcm90b2J1Zi5PbmVvZk9wdGlvbnMYhwkgASgLMhguYnVmLnZhbGlkYXRlLk9uZW9mUnVsZXNSBW9uZW9mOk4KBWZpZWxkEh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucxiHCSABKAsyGC5idWYudmFsaWRhdGUuRmllbGRSdWxlc1IFZmllbGQ6XQoKcHJlZGVmaW5lZBIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMYiAkgASgLMh0uYnVmLnZhbGlkYXRlLlByZWRlZmluZWRSdWxlc1IKcHJlZGVmaW5lZEK7AQoQY29tLmJ1Zi52YWxpZGF0ZUINVmFsaWRhdGVQcm90b1ABWkdidWYuYnVpbGQvZ2VuL2dvL2J1ZmJ1aWxkL3Byb3RvdmFsaWRhdGUvcHJvdG9jb2xidWZmZXJzL2dvL2J1Zi92YWxpZGF0ZaICA0JWWKoCDEJ1Zi5WYWxpZGF0ZcoCDEJ1ZlxWYWxpZGF0ZeICGEJ1ZlxWYWxpZGF0ZVxHUEJNZXRhZGF0YeoCDUJ1Zjo6VmFsaWRhdGU", [wkt.file_google_protobuf_descriptor, wkt.file_google_protobuf_duration, wkt.file_google_protobuf_field_mask, wkt.file_google_protobuf_timestamp]);
|
|
275
|
+
var file_google_api_field_behavior = /* @__PURE__ */ codegenv2.fileDesc("Ch9nb29nbGUvYXBpL2ZpZWxkX2JlaGF2aW9yLnByb3RvEgpnb29nbGUuYXBpKrYBCg1GaWVsZEJlaGF2aW9yEh4KGkZJRUxEX0JFSEFWSU9SX1VOU1BFQ0lGSUVEEAASDAoIT1BUSU9OQUwQARIMCghSRVFVSVJFRBACEg8KC09VVFBVVF9PTkxZEAMSDgoKSU5QVVRfT05MWRAEEg0KCUlNTVVUQUJMRRAFEhIKDlVOT1JERVJFRF9MSVNUEAYSFQoRTk9OX0VNUFRZX0RFRkFVTFQQBxIOCgpJREVOVElGSUVSEAg6ZAoOZmllbGRfYmVoYXZpb3ISHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zGJwIIAMoDjIZLmdvb2dsZS5hcGkuRmllbGRCZWhhdmlvckICEABSDWZpZWxkQmVoYXZpb3JCsAEKDmNvbS5nb29nbGUuYXBpQhJGaWVsZEJlaGF2aW9yUHJvdG9QAVpBZ29vZ2xlLmdvbGFuZy5vcmcvZ2VucHJvdG8vZ29vZ2xlYXBpcy9hcGkvYW5ub3RhdGlvbnM7YW5ub3RhdGlvbnOiAgNHQViqAgpHb29nbGUuQXBpygIKR29vZ2xlXEFwaeICFkdvb2dsZVxBcGlcR1BCTWV0YWRhdGHqAgtHb29nbGU6OkFwaWIGcHJvdG8z", [wkt.file_google_protobuf_descriptor]);
|
|
276
|
+
var file_thru_common_v1_consensus = /* @__PURE__ */ codegenv2.fileDesc("Ch50aHJ1L2NvbW1vbi92MS9jb25zZW5zdXMucHJvdG8SDnRocnUuY29tbW9uLnYxIpYDCg5WZXJzaW9uQ29udGV4dBI2CgdjdXJyZW50GAEgASgLMh4udGhydS5jb21tb24udjEuQ3VycmVudFZlcnNpb25CA+BBAUgAEk4KE2N1cnJlbnRPckhpc3RvcmljYWwYAiABKAsyKi50aHJ1LmNvbW1vbi52MS5DdXJyZW50T3JIaXN0b3JpY2FsVmVyc2lvbkID4EEBSAASEwoEc2xvdBgDIAEoBEID4EEBSAASNAoJdGltZXN0YW1wGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEBSAASEgoDc2VxGAUgASgEQgPgQQFIADqRAbpIjQEaigEKHHZlcnNpb25fY29udGV4dF9oYXNfc2VsZWN0b3ISLm9uZSBvZiBjdXJyZW50LCBzbG90LCBvciB0aW1lc3RhbXAgbXVzdCBiZSBzZXQaOmhhcyh0aGlzLmN1cnJlbnQpIHx8IGhhcyh0aGlzLnNsb3QpIHx8IGhhcyh0aGlzLnRpbWVzdGFtcClCCQoHdmVyc2lvbiIQCg5DdXJyZW50VmVyc2lvbiIcChpDdXJyZW50T3JIaXN0b3JpY2FsVmVyc2lvbirfAQoPQ29uc2Vuc3VzU3RhdHVzEiAKHENPTlNFTlNVU19TVEFUVVNfVU5TUEVDSUZJRUQQABIdChlDT05TRU5TVVNfU1RBVFVTX09CU0VSVkVEEAESHQoZQ09OU0VOU1VTX1NUQVRVU19JTkNMVURFRBACEh4KGkNPTlNFTlNVU19TVEFUVVNfRklOQUxJWkVEEAMSJQohQ09OU0VOU1VTX1NUQVRVU19MT0NBTExZX0VYRUNVVEVEEAQSJQohQ09OU0VOU1VTX1NUQVRVU19DTFVTVEVSX0VYRUNVVEVEEAVCygEKEmNvbS50aHJ1LmNvbW1vbi52MUIOQ29uc2Vuc3VzUHJvdG9QAVpEZ2l0aHViLmNvbS9VbnRvLUxhYnMvdGhydS1uZXQvZ3JwYy9wa2cvcHJvdG8vdGhydS9jb21tb24vdjE7Y29tbW9udjGiAgNUQ1iqAg5UaHJ1LkNvbW1vbi5WMboCA1RIVcoCDlRocnVcQ29tbW9uXFYx4gIaVGhydVxDb21tb25cVjFcR1BCTWV0YWRhdGHqAhBUaHJ1OjpDb21tb246OlYxYgZwcm90bzM", [file_buf_validate_validate, file_google_api_field_behavior, wkt.file_google_protobuf_timestamp]);
|
|
277
|
+
var VersionContextSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_common_v1_consensus, 0);
|
|
278
|
+
var CurrentVersionSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_common_v1_consensus, 1);
|
|
279
|
+
var CurrentOrHistoricalVersionSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_common_v1_consensus, 2);
|
|
280
|
+
var ConsensusStatus = /* @__PURE__ */ ((ConsensusStatus5) => {
|
|
281
|
+
ConsensusStatus5[ConsensusStatus5["UNSPECIFIED"] = 0] = "UNSPECIFIED";
|
|
282
|
+
ConsensusStatus5[ConsensusStatus5["OBSERVED"] = 1] = "OBSERVED";
|
|
283
|
+
ConsensusStatus5[ConsensusStatus5["INCLUDED"] = 2] = "INCLUDED";
|
|
284
|
+
ConsensusStatus5[ConsensusStatus5["FINALIZED"] = 3] = "FINALIZED";
|
|
285
|
+
ConsensusStatus5[ConsensusStatus5["LOCALLY_EXECUTED"] = 4] = "LOCALLY_EXECUTED";
|
|
286
|
+
ConsensusStatus5[ConsensusStatus5["CLUSTER_EXECUTED"] = 5] = "CLUSTER_EXECUTED";
|
|
287
|
+
return ConsensusStatus5;
|
|
288
|
+
})(ConsensusStatus || {});
|
|
289
|
+
var file_thru_common_v1_primitives = /* @__PURE__ */ codegenv2.fileDesc("Ch90aHJ1L2NvbW1vbi92MS9wcmltaXRpdmVzLnByb3RvEg50aHJ1LmNvbW1vbi52MSIjCgZQdWJrZXkSGQoFdmFsdWUYASABKAxCCuBBArpIBHoCaCAiJgoJU2lnbmF0dXJlEhkKBXZhbHVlGAEgASgMQgrgQQK6SAR6AmhAIiYKCFRhUHVia2V5EhoKBXZhbHVlGAEgASgJQgvgQQK6SAVyA5gBLiIpCgtUc1NpZ25hdHVyZRIaCgV2YWx1ZRgBIAEoCUIL4EECukgFcgOYAVpCywEKEmNvbS50aHJ1LmNvbW1vbi52MUIPUHJpbWl0aXZlc1Byb3RvUAFaRGdpdGh1Yi5jb20vVW50by1MYWJzL3RocnUtbmV0L2dycGMvcGtnL3Byb3RvL3RocnUvY29tbW9uL3YxO2NvbW1vbnYxogIDVENYqgIOVGhydS5Db21tb24uVjG6AgNUSFXKAg5UaHJ1XENvbW1vblxWMeICGlRocnVcQ29tbW9uXFYxXEdQQk1ldGFkYXRh6gIQVGhydTo6Q29tbW9uOjpWMWIGcHJvdG8z", [file_buf_validate_validate, file_google_api_field_behavior]);
|
|
290
|
+
var PubkeySchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_common_v1_primitives, 0);
|
|
291
|
+
var SignatureSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_common_v1_primitives, 1);
|
|
292
|
+
var TaPubkeySchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_common_v1_primitives, 2);
|
|
293
|
+
var TsSignatureSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_common_v1_primitives, 3);
|
|
294
|
+
|
|
295
|
+
// src/proto/gen/thru/common/v1/filters_pb.ts
|
|
296
|
+
var file_thru_common_v1_filters = /* @__PURE__ */ codegenv2.fileDesc("Chx0aHJ1L2NvbW1vbi92MS9maWx0ZXJzLnByb3RvEg50aHJ1LmNvbW1vbi52MSLHAQoGRmlsdGVyEiQKCmV4cHJlc3Npb24YASABKAlCC+BBAbpIBXIDGIAgSACIAQESNwoGcGFyYW1zGAIgAygLMiIudGhydS5jb21tb24udjEuRmlsdGVyLlBhcmFtc0VudHJ5QgPgQQEaTwoLUGFyYW1zRW50cnkSCwoDa2V5GAEgASgJEi8KBXZhbHVlGAIgASgLMiAudGhydS5jb21tb24udjEuRmlsdGVyUGFyYW1WYWx1ZToCOAFCDQoLX2V4cHJlc3Npb24ipAQKEEZpbHRlclBhcmFtVmFsdWUSGwoMc3RyaW5nX3ZhbHVlGAEgASgJQgPgQQFIABIaCgtieXRlc192YWx1ZRgCIAEoDEID4EEBSAASGQoKYm9vbF92YWx1ZRgDIAEoCEID4EEBSAASGAoJaW50X3ZhbHVlGAQgASgSQgPgQQFIABIZCgp1aW50X3ZhbHVlGAUgASgEQgPgQQFIABIbCgxkb3VibGVfdmFsdWUYBiABKAFCA+BBAUgAEjMKDHB1YmtleV92YWx1ZRgHIAEoCzIWLnRocnUuY29tbW9uLnYxLlB1YmtleUID4EEBSAASOQoPc2lnbmF0dXJlX3ZhbHVlGAggASgLMhkudGhydS5jb21tb24udjEuU2lnbmF0dXJlQgPgQQFIABI4Cg90YV9wdWJrZXlfdmFsdWUYCSABKAsyGC50aHJ1LmNvbW1vbi52MS5UYVB1YmtleUID4EEBSAASPgoSdHNfc2lnbmF0dXJlX3ZhbHVlGAogASgLMhsudGhydS5jb21tb24udjEuVHNTaWduYXR1cmVCA+BBAUgAEjoKEGJ5dGVzX2xpc3RfdmFsdWUYCyABKAsyGS50aHJ1LmNvbW1vbi52MS5CeXRlc0xpc3RCA+BBAUgAEjwKEXB1YmtleV9saXN0X3ZhbHVlGAwgASgLMhoudGhydS5jb21tb24udjEuUHVia2V5TGlzdEID4EEBSABCBgoEa2luZCIgCglCeXRlc0xpc3QSEwoGdmFsdWVzGAEgAygMQgPgQQEiOQoKUHVia2V5TGlzdBIrCgZ2YWx1ZXMYASADKAsyFi50aHJ1LmNvbW1vbi52MS5QdWJrZXlCA+BBASKhAQoTQ2VsRmlsdGVyVmFsaWRhdGlvbhInChFhbGxvd2VkX2Z1bmN0aW9ucxgBIAMoCUIM4EEBukgGkgEDEIABEiQKDmFsbG93ZWRfZmllbGRzGAIgAygJQgzgQQG6SAaSAQMQgAISKAoObWF4X2NvbXBsZXhpdHkYAyABKA1CC+BBAbpIBSoDGOgHSACIAQFCEQoPX21heF9jb21wbGV4aXR5QsgBChJjb20udGhydS5jb21tb24udjFCDEZpbHRlcnNQcm90b1ABWkRnaXRodWIuY29tL1VudG8tTGFicy90aHJ1LW5ldC9ncnBjL3BrZy9wcm90by90aHJ1L2NvbW1vbi92MTtjb21tb252MaICA1RDWKoCDlRocnUuQ29tbW9uLlYxugIDVEhVygIOVGhydVxDb21tb25cVjHiAhpUaHJ1XENvbW1vblxWMVxHUEJNZXRhZGF0YeoCEFRocnU6OkNvbW1vbjo6VjFiBnByb3RvMw", [file_buf_validate_validate, file_google_api_field_behavior, file_thru_common_v1_primitives]);
|
|
297
|
+
var FilterSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_common_v1_filters, 0);
|
|
298
|
+
var FilterParamValueSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_common_v1_filters, 1);
|
|
299
|
+
var file_thru_common_v1_pagination = /* @__PURE__ */ codegenv2.fileDesc("Ch90aHJ1L2NvbW1vbi92MS9wYWdpbmF0aW9uLnByb3RvEg50aHJ1LmNvbW1vbi52MSKoAQoLUGFnZVJlcXVlc3QSJQoJcGFnZV9zaXplGAEgASgNQg3gQQG6SAcqBRjoBygBSACIAQESJAoKcGFnZV90b2tlbhgCIAEoCUIL4EEBukgFcgMYgARIAYgBARIiCghvcmRlcl9ieRgDIAEoCUIL4EEBukgFcgMYgAJIAogBAUIMCgpfcGFnZV9zaXplQg0KC19wYWdlX3Rva2VuQgsKCV9vcmRlcl9ieSJyCgxQYWdlUmVzcG9uc2USIQoPbmV4dF9wYWdlX3Rva2VuGAEgASgJQgPgQQFIAIgBARIcCgp0b3RhbF9zaXplGAIgASgEQgPgQQFIAYgBAUISChBfbmV4dF9wYWdlX3Rva2VuQg0KC190b3RhbF9zaXplQssBChJjb20udGhydS5jb21tb24udjFCD1BhZ2luYXRpb25Qcm90b1ABWkRnaXRodWIuY29tL1VudG8tTGFicy90aHJ1LW5ldC9ncnBjL3BrZy9wcm90by90aHJ1L2NvbW1vbi92MTtjb21tb252MaICA1RDWKoCDlRocnUuQ29tbW9uLlYxugIDVEhVygIOVGhydVxDb21tb25cVjHiAhpUaHJ1XENvbW1vblxWMVxHUEJNZXRhZGF0YeoCEFRocnU6OkNvbW1vbjo6VjFiBnByb3RvMw", [file_buf_validate_validate, file_google_api_field_behavior]);
|
|
300
|
+
var PageResponseSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_common_v1_pagination, 1);
|
|
301
|
+
var file_thru_core_v1_types = /* @__PURE__ */ codegenv2.fileDesc("Chh0aHJ1L2NvcmUvdjEvdHlwZXMucHJvdG8SDHRocnUuY29yZS52MSIhCgRIYXNoEhkKBXZhbHVlGAEgASgMQgrgQQK6SAR6AmggIiYKCUJsb2NrSGFzaBIZCgV2YWx1ZRgBIAEoDEIK4EECukgEegJoIEK5AQoQY29tLnRocnUuY29yZS52MUIKVHlwZXNQcm90b1ABWkBnaXRodWIuY29tL1VudG8tTGFicy90aHJ1LW5ldC9ncnBjL3BrZy9wcm90by90aHJ1L2NvcmUvdjE7Y29yZXYxogIDVENYqgIMVGhydS5Db3JlLlYxugIEVEhVQ8oCDFRocnVcQ29yZVxWMeICGFRocnVcQ29yZVxWMVxHUEJNZXRhZGF0YeoCDlRocnU6OkNvcmU6OlYxYgZwcm90bzM", [file_buf_validate_validate, file_google_api_field_behavior, file_thru_common_v1_primitives]);
|
|
302
|
+
var BlockHashSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_core_v1_types, 1);
|
|
303
|
+
|
|
304
|
+
// src/proto/gen/thru/core/v1/account_pb.ts
|
|
305
|
+
var file_thru_core_v1_account = /* @__PURE__ */ codegenv2.fileDesc("Chp0aHJ1L2NvcmUvdjEvYWNjb3VudC5wcm90bxIMdGhydS5jb3JlLnYxIsgBCgxBY2NvdW50RmxhZ3MSFwoKaXNfcHJvZ3JhbRgBIAEoCEID4EECEhoKDWlzX3ByaXZpbGVnZWQYAiABKAhCA+BBAhIeChFpc191bmNvbXByZXNzYWJsZRgDIAEoCEID4EECEhkKDGlzX2VwaGVtZXJhbBgEIAEoCEID4EECEhcKCmlzX2RlbGV0ZWQYBSABKAhCA+BBAhITCgZpc19uZXcYBiABKAhCA+BBAhIaCg1pc19jb21wcmVzc2VkGAcgASgIQgPgQQIilQIKC0FjY291bnRNZXRhEhsKB3ZlcnNpb24YASABKA1CCuBBArpIBCoCKAESLgoFZmxhZ3MYAiABKAsyGi50aHJ1LmNvcmUudjEuQWNjb3VudEZsYWdzQgPgQQISFgoJZGF0YV9zaXplGAMgASgNQgPgQQISEAoDc2VxGAQgASgEQgPgQQISKgoFb3duZXIYBSABKAsyFi50aHJ1LmNvbW1vbi52MS5QdWJrZXlCA+BBAhIUCgdiYWxhbmNlGAYgASgEQgPgQQISEgoFbm9uY2UYByABKARCA+BBAhIjChFsYXN0X3VwZGF0ZWRfc2xvdBgIIAEoBEID4EEBSACIAQFCFAoSX2xhc3RfdXBkYXRlZF9zbG90Iq8BCgtBY2NvdW50RGF0YRIgCgRkYXRhGAEgASgMQg3gQQG6SAd6BRiAgIAISACIAQESHAoKY29tcHJlc3NlZBgCIAEoCEID4EEBSAGIAQESLgoVY29tcHJlc3Npb25fYWxnb3JpdGhtGAMgASgJQgrgQQG6SARyAhhASAKIAQFCBwoFX2RhdGFCDQoLX2NvbXByZXNzZWRCGAoWX2NvbXByZXNzaW9uX2FsZ29yaXRobSJJCglEYXRhU2xpY2USHQoGb2Zmc2V0GAEgASgNQg3gQQK6SAcyBRiAgIAIEh0KBmxlbmd0aBgCIAEoDUIN4EECukgHMgUYgICACCLbAQoLQWNjb3VudFBhZ2USFQoIcGFnZV9pZHgYASABKA1CA+BBAhIeCglwYWdlX3NpemUYAiABKA1CC+BBArpIBSoDGIAgEh4KCXBhZ2VfZGF0YRgDIAEoDEIL4EECukgFegMYgCASHAoKY29tcHJlc3NlZBgEIAEoCEID4EEBSACIAQESLgoVY29tcHJlc3Npb25fYWxnb3JpdGhtGAUgASgJQgrgQQG6SARyAhhASAGIAQFCDQoLX2NvbXByZXNzZWRCGAoWX2NvbXByZXNzaW9uX2FsZ29yaXRobSKMAQoWVmVyc2lvbkNvbnRleHRNZXRhZGF0YRIWCgRzbG90GAEgASgEQgPgQQFIAIgBARI9Cg9ibG9ja190aW1lc3RhbXAYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQFIAYgBAUIHCgVfc2xvdEISChBfYmxvY2tfdGltZXN0YW1wIuYCCgdBY2NvdW50EiwKB2FkZHJlc3MYASABKAsyFi50aHJ1LmNvbW1vbi52MS5QdWJrZXlCA+BBAhIxCgRtZXRhGAIgASgLMhkudGhydS5jb3JlLnYxLkFjY291bnRNZXRhQgPgQQFIAIgBARIxCgRkYXRhGAMgASgLMhkudGhydS5jb3JlLnYxLkFjY291bnREYXRhQgPgQQFIAYgBARJHCg92ZXJzaW9uX2NvbnRleHQYBCABKAsyJC50aHJ1LmNvcmUudjEuVmVyc2lvbkNvbnRleHRNZXRhZGF0YUID4EEBSAKIAQESQwoQY29uc2Vuc3VzX3N0YXR1cxgFIAEoDjIfLnRocnUuY29tbW9uLnYxLkNvbnNlbnN1c1N0YXR1c0ID4EEBSAOIAQFCBwoFX21ldGFCBwoFX2RhdGFCEgoQX3ZlcnNpb25fY29udGV4dEITChFfY29uc2Vuc3VzX3N0YXR1cyLpAQoKUmF3QWNjb3VudBIsCgdhZGRyZXNzGAEgASgLMhYudGhydS5jb21tb24udjEuUHVia2V5QgPgQQISHQoIcmF3X21ldGEYAiABKAxCC+BBArpIBXoDGIAgEiQKCHJhd19kYXRhGAMgASgMQg3gQQG6SAd6BRiAgIAISACIAQESRwoPdmVyc2lvbl9jb250ZXh0GAQgASgLMiQudGhydS5jb3JlLnYxLlZlcnNpb25Db250ZXh0TWV0YWRhdGFCA+BBAUgBiAEBQgsKCV9yYXdfZGF0YUISChBfdmVyc2lvbl9jb250ZXh0KpgBCgtBY2NvdW50VmlldxIcChhBQ0NPVU5UX1ZJRVdfVU5TUEVDSUZJRUQQABIcChhBQ0NPVU5UX1ZJRVdfUFVCS0VZX09OTFkQARIaChZBQ0NPVU5UX1ZJRVdfTUVUQV9PTkxZEAISGgoWQUNDT1VOVF9WSUVXX0RBVEFfT05MWRADEhUKEUFDQ09VTlRfVklFV19GVUxMEARCuwEKEGNvbS50aHJ1LmNvcmUudjFCDEFjY291bnRQcm90b1ABWkBnaXRodWIuY29tL1VudG8tTGFicy90aHJ1LW5ldC9ncnBjL3BrZy9wcm90by90aHJ1L2NvcmUvdjE7Y29yZXYxogIDVENYqgIMVGhydS5Db3JlLlYxugIEVEhVQ8oCDFRocnVcQ29yZVxWMeICGFRocnVcQ29yZVxWMVxHUEJNZXRhZGF0YeoCDlRocnU6OkNvcmU6OlYxYgZwcm90bzM", [file_buf_validate_validate, file_google_api_field_behavior, wkt.file_google_protobuf_timestamp, file_thru_common_v1_consensus, file_thru_common_v1_primitives, file_thru_core_v1_types]);
|
|
306
|
+
var file_thru_core_v1_block = /* @__PURE__ */ codegenv2.fileDesc("Chh0aHJ1L2NvcmUvdjEvYmxvY2sucHJvdG8SDHRocnUuY29yZS52MSKjBAoLQmxvY2tIZWFkZXISEQoEc2xvdBgBIAEoBEID4EECEjAKCmJsb2NrX2hhc2gYAiABKAsyFy50aHJ1LmNvcmUudjEuQmxvY2tIYXNoQgPgQQISOAoQaGVhZGVyX3NpZ25hdHVyZRgDIAEoCzIZLnRocnUuY29tbW9uLnYxLlNpZ25hdHVyZUID4EECEhQKB3ZlcnNpb24YBCABKA1CA+BBAhItCghwcm9kdWNlchgFIAEoCzIWLnRocnUuY29tbW9uLnYxLlB1YmtleUID4EECEjkKEGV4cGlyeV90aW1lc3RhbXAYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQISFwoKc3RhcnRfc2xvdBgHIAEoBEID4EECEhkKDGV4cGlyeV9hZnRlchgIIAEoDUID4EECEhsKDm1heF9ibG9ja19zaXplGAkgASgNQgPgQQISHgoRbWF4X2NvbXB1dGVfdW5pdHMYCiABKARCA+BBAhIcCg9tYXhfc3RhdGVfdW5pdHMYCyABKA1CA+BBAhIgChNib25kX2Ftb3VudF9sb2NrX3VwGAwgASgEQgPgQQISMwoKYmxvY2tfdGltZRgNIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAhIYCgt3ZWlnaHRfc2xvdBgOIAEoBEID4EECEhUKCGNoYWluX2lkGA8gASgNQgPgQQIi2wEKC0Jsb2NrRm9vdGVyEjEKCXNpZ25hdHVyZRgBIAEoCzIZLnRocnUuY29tbW9uLnYxLlNpZ25hdHVyZUID4EECEjIKBnN0YXR1cxgCIAEoDjIdLnRocnUuY29yZS52MS5FeGVjdXRpb25TdGF0dXNCA+BBAhIjChZjb25zdW1lZF9jb21wdXRlX3VuaXRzGAMgASgEQgPgQQISIQoUY29uc3VtZWRfc3RhdGVfdW5pdHMYBCABKA1CA+BBAhIdChBhdHRlc3Rvcl9wYXltZW50GAUgASgEQgPgQQIi/AEKBUJsb2NrEi4KBmhlYWRlchgBIAEoCzIZLnRocnUuY29yZS52MS5CbG9ja0hlYWRlckID4EECEjMKBmZvb3RlchgCIAEoCzIZLnRocnUuY29yZS52MS5CbG9ja0Zvb3RlckID4EEBSACIAQESIAoEYm9keRgDIAEoDEIN4EEBukgHegUYgICAEEgBiAEBEkMKEGNvbnNlbnN1c19zdGF0dXMYBCABKA4yHy50aHJ1LmNvbW1vbi52MS5Db25zZW5zdXNTdGF0dXNCA+BBAUgCiAEBQgkKB19mb290ZXJCBwoFX2JvZHlCEwoRX2NvbnNlbnN1c19zdGF0dXMiPwoIUmF3QmxvY2sSEQoEc2xvdBgBIAEoBEID4EECEiAKCXJhd19ibG9jaxgCIAEoDEIN4EECukgHegUYgICAECqUAQoJQmxvY2tWaWV3EhoKFkJMT0NLX1ZJRVdfVU5TUEVDSUZJRUQQABIaChZCTE9DS19WSUVXX0hFQURFUl9PTkxZEAESIAocQkxPQ0tfVklFV19IRUFERVJfQU5EX0ZPT1RFUhACEhgKFEJMT0NLX1ZJRVdfQk9EWV9PTkxZEAMSEwoPQkxPQ0tfVklFV19GVUxMEAQqjQEKD0V4ZWN1dGlvblN0YXR1cxIgChxFWEVDVVRJT05fU1RBVFVTX1VOU1BFQ0lGSUVEEAASHAoYRVhFQ1VUSU9OX1NUQVRVU19QRU5ESU5HEAESHQoZRVhFQ1VUSU9OX1NUQVRVU19FWEVDVVRFRBACEhsKF0VYRUNVVElPTl9TVEFUVVNfRkFJTEVEEANCuQEKEGNvbS50aHJ1LmNvcmUudjFCCkJsb2NrUHJvdG9QAVpAZ2l0aHViLmNvbS9VbnRvLUxhYnMvdGhydS1uZXQvZ3JwYy9wa2cvcHJvdG8vdGhydS9jb3JlL3YxO2NvcmV2MaICA1RDWKoCDFRocnUuQ29yZS5WMboCBFRIVUPKAgxUaHJ1XENvcmVcVjHiAhhUaHJ1XENvcmVcVjFcR1BCTWV0YWRhdGHqAg5UaHJ1OjpDb3JlOjpWMWIGcHJvdG8z", [file_buf_validate_validate, file_google_api_field_behavior, wkt.file_google_protobuf_timestamp, file_thru_common_v1_primitives, file_thru_common_v1_consensus, file_thru_core_v1_types]);
|
|
307
|
+
var file_thru_core_v1_node = /* @__PURE__ */ codegenv2.fileDesc("Chd0aHJ1L2NvcmUvdjEvbm9kZS5wcm90bxIMdGhydS5jb3JlLnYxIjcKC05vZGVDb250YWN0EhUKCGlwNF9hZGRyGAEgASgNQgPgQQISEQoEcG9ydBgCIAEoDUID4EECIkIKDE5vZGVQcm90b2NvbBIYCgtjb250YWN0X2lkeBgBIAEoDUID4EECEhgKC3Byb3RvY29sX2lkGAIgASgNQgPgQQIijgIKCk5vZGVSZWNvcmQSFAoHdmVyc2lvbhgBIAEoDUID4EECEhUKCGNoYWluX2lkGAIgASgNQgPgQQISEwoGc2VxbnVtGAMgASgEQgPgQQISKwoGcHVia2V5GAQgASgLMhYudGhydS5jb21tb24udjEuUHVia2V5QgPgQQISMAoIY29udGFjdHMYBSADKAsyGS50aHJ1LmNvcmUudjEuTm9kZUNvbnRhY3RCA+BBARIyCglwcm90b2NvbHMYBiADKAsyGi50aHJ1LmNvcmUudjEuTm9kZVByb3RvY29sQgPgQQESFgoJc2lnbmF0dXJlGAcgASgMQgPgQQISEwoGaXNfb3duGAggASgIQgPgQQJCuAEKEGNvbS50aHJ1LmNvcmUudjFCCU5vZGVQcm90b1ABWkBnaXRodWIuY29tL1VudG8tTGFicy90aHJ1LW5ldC9ncnBjL3BrZy9wcm90by90aHJ1L2NvcmUvdjE7Y29yZXYxogIDVENYqgIMVGhydS5Db3JlLlYxugIEVEhVQ8oCDFRocnVcQ29yZVxWMeICGFRocnVcQ29yZVxWMVxHUEJNZXRhZGF0YeoCDlRocnU6OkNvcmU6OlYxYgZwcm90bzM", [file_google_api_field_behavior, file_thru_common_v1_primitives]);
|
|
308
|
+
var file_thru_core_v1_state = /* @__PURE__ */ codegenv2.fileDesc("Chh0aHJ1L2NvcmUvdjEvc3RhdGUucHJvdG8SDHRocnUuY29yZS52MSKnAQoRU3RhdGVQcm9vZlJlcXVlc3QSLAoHYWRkcmVzcxgBIAEoCzIWLnRocnUuY29tbW9uLnYxLlB1YmtleUID4EECEjUKCnByb29mX3R5cGUYAiABKA4yHC50aHJ1LmNvcmUudjEuU3RhdGVQcm9vZlR5cGVCA+BBAhIdCgt0YXJnZXRfc2xvdBgDIAEoBEID4EEBSACIAQFCDgoMX3RhcmdldF9zbG90IjMKClN0YXRlUHJvb2YSEgoFcHJvb2YYASABKAxCA+BBAhIRCgRzbG90GAIgASgEQgPgQQIqjwEKDlN0YXRlUHJvb2ZUeXBlEiAKHFNUQVRFX1BST09GX1RZUEVfVU5TUEVDSUZJRUQQABIdChlTVEFURV9QUk9PRl9UWVBFX0NSRUFUSU5HEAESHQoZU1RBVEVfUFJPT0ZfVFlQRV9VUERBVElORxACEh0KGVNUQVRFX1BST09GX1RZUEVfRVhJU1RJTkcQA0K5AQoQY29tLnRocnUuY29yZS52MUIKU3RhdGVQcm90b1ABWkBnaXRodWIuY29tL1VudG8tTGFicy90aHJ1LW5ldC9ncnBjL3BrZy9wcm90by90aHJ1L2NvcmUvdjE7Y29yZXYxogIDVENYqgIMVGhydS5Db3JlLlYxugIEVEhVQ8oCDFRocnVcQ29yZVxWMeICGFRocnVcQ29yZVxWMVxHUEJNZXRhZGF0YeoCDlRocnU6OkNvcmU6OlYxYgZwcm90bzM", [file_google_api_field_behavior, file_thru_core_v1_types, file_thru_common_v1_primitives]);
|
|
309
|
+
var StateProofRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_core_v1_state, 0);
|
|
310
|
+
var file_thru_core_v1_transaction = /* @__PURE__ */ codegenv2.fileDesc("Ch50aHJ1L2NvcmUvdjEvdHJhbnNhY3Rpb24ucHJvdG8SDHRocnUuY29yZS52MSK3BAoRVHJhbnNhY3Rpb25IZWFkZXISOwoTZmVlX3BheWVyX3NpZ25hdHVyZRgBIAEoCzIZLnRocnUuY29tbW9uLnYxLlNpZ25hdHVyZUID4EECEhQKB3ZlcnNpb24YAiABKA1CA+BBAhISCgVmbGFncxgDIAEoDUID4EECEiUKGHJlYWR3cml0ZV9hY2NvdW50c19jb3VudBgEIAEoDUID4EECEiQKF3JlYWRvbmx5X2FjY291bnRzX2NvdW50GAUgASgNQgPgQQISIgoVaW5zdHJ1Y3Rpb25fZGF0YV9zaXplGAYgASgNQgPgQQISJAoXcmVxdWVzdGVkX2NvbXB1dGVfdW5pdHMYByABKA1CA+BBAhIiChVyZXF1ZXN0ZWRfc3RhdGVfdW5pdHMYCCABKA1CA+BBAhIjChZyZXF1ZXN0ZWRfbWVtb3J5X3VuaXRzGAkgASgNQgPgQQISGQoMZXhwaXJ5X2FmdGVyGAogASgNQgPgQQISEAoDZmVlGAsgASgEQgPgQQISEgoFbm9uY2UYDCABKARCA+BBAhIXCgpzdGFydF9zbG90GA0gASgEQgPgQQISNQoQZmVlX3BheWVyX3B1YmtleRgOIAEoCzIWLnRocnUuY29tbW9uLnYxLlB1YmtleUID4EECEjMKDnByb2dyYW1fcHVia2V5GA8gASgLMhYudGhydS5jb21tb24udjEuUHVia2V5QgPgQQISFQoIY2hhaW5faWQYECABKA1CA+BBAiKWBAoaVHJhbnNhY3Rpb25FeGVjdXRpb25SZXN1bHQSIwoWY29uc3VtZWRfY29tcHV0ZV91bml0cxgBIAEoDUID4EECEiIKFWNvbnN1bWVkX21lbW9yeV91bml0cxgCIAEoDUID4EECEiEKFGNvbnN1bWVkX3N0YXRlX3VuaXRzGAMgASgNQgPgQQISHAoPdXNlcl9lcnJvcl9jb2RlGAQgASgEQgPgQQISNwoIdm1fZXJyb3IYBSABKA4yIC50aHJ1LmNvcmUudjEuVHJhbnNhY3Rpb25WbUVycm9yQgPgQQISHQoQZXhlY3V0aW9uX3Jlc3VsdBgGIAEoBEID4EECEhcKCnBhZ2VzX3VzZWQYByABKA1CA+BBAhIZCgxldmVudHNfY291bnQYCCABKA1CA+BBAhIYCgtldmVudHNfc2l6ZRgJIAEoDUID4EECEjcKEnJlYWR3cml0ZV9hY2NvdW50cxgKIAMoCzIWLnRocnUuY29tbW9uLnYxLlB1YmtleUID4EEBEjYKEXJlYWRvbmx5X2FjY291bnRzGAsgAygLMhYudGhydS5jb21tb24udjEuUHVia2V5QgPgQQESMwoGZXZlbnRzGAwgAygLMh4udGhydS5jb3JlLnYxLlRyYW5zYWN0aW9uRXZlbnRCA+BBARIiChVlcnJvcl9wcm9ncmFtX2FjY19pZHgYDSABKA1CA+BBASKeAQoQVHJhbnNhY3Rpb25FdmVudBIVCghldmVudF9pZBgBIAEoCUID4EECEhUKCGNhbGxfaWR4GAIgASgNQgPgQQISGAoLcHJvZ3JhbV9pZHgYAyABKA1CA+BBAhIsCgdwcm9ncmFtGAQgASgLMhYudGhydS5jb21tb24udjEuUHVia2V5QgPgQQISFAoHcGF5bG9hZBgFIAEoDEID4EECItYCCgtUcmFuc2FjdGlvbhIxCglzaWduYXR1cmUYASABKAsyGS50aHJ1LmNvbW1vbi52MS5TaWduYXR1cmVCA+BBAhI0CgZoZWFkZXIYAiABKAsyHy50aHJ1LmNvcmUudjEuVHJhbnNhY3Rpb25IZWFkZXJCA+BBAhIgCgRib2R5GAMgASgMQg3gQQG6SAd6BRiAgIAISACIAQESTAoQZXhlY3V0aW9uX3Jlc3VsdBgEIAEoCzIoLnRocnUuY29yZS52MS5UcmFuc2FjdGlvbkV4ZWN1dGlvblJlc3VsdEID4EEBSAGIAQESFgoEc2xvdBgFIAEoBEID4EEBSAKIAQESHgoMYmxvY2tfb2Zmc2V0GAYgASgNQgPgQQFIA4gBAUIHCgVfYm9keUITChFfZXhlY3V0aW9uX3Jlc3VsdEIHCgVfc2xvdEIPCg1fYmxvY2tfb2Zmc2V0ImsKDlJhd1RyYW5zYWN0aW9uEjEKCXNpZ25hdHVyZRgBIAEoCzIZLnRocnUuY29tbW9uLnYxLlNpZ25hdHVyZUID4EECEiYKD3Jhd190cmFuc2FjdGlvbhgCIAEoDEIN4EECukgHegUYgICACCq7AQoPVHJhbnNhY3Rpb25WaWV3EiAKHFRSQU5TQUNUSU9OX1ZJRVdfVU5TUEVDSUZJRUQQABIjCh9UUkFOU0FDVElPTl9WSUVXX1NJR05BVFVSRV9PTkxZEAESIAocVFJBTlNBQ1RJT05fVklFV19IRUFERVJfT05MWRACEiQKIFRSQU5TQUNUSU9OX1ZJRVdfSEVBREVSX0FORF9CT0RZEAMSGQoVVFJBTlNBQ1RJT05fVklFV19GVUxMEAQqmAwKElRyYW5zYWN0aW9uVm1FcnJvchIiCh5UUkFOU0FDVElPTl9WTV9FWEVDVVRFX1NVQ0NFU1MQABIwCiNUUkFOU0FDVElPTl9WTV9FUlJPUl9JTlZBTElEX0ZPUk1BVBCB/v////////8BEjEKJFRSQU5TQUNUSU9OX1ZNX0VSUk9SX0lOVkFMSURfVkVSU0lPThCC/v////////8BEi8KIlRSQU5TQUNUSU9OX1ZNX0VSUk9SX0lOVkFMSURfRkxBR1MQg/7/////////ARIzCiZUUkFOU0FDVElPTl9WTV9FUlJPUl9JTlZBTElEX1NJR05BVFVSRRCE/v////////8BEjMKJlRSQU5TQUNUSU9OX1ZNX0VSUk9SX0RVUExJQ0FURV9BQ0NPVU5UEIX+/////////wESMwomVFJBTlNBQ1RJT05fVk1fRVJST1JfVU5TT1JURURfQUNDT1VOVFMQhv7/////////ARI9CjBUUkFOU0FDVElPTl9WTV9FUlJPUl9VTlNPUlRFRF9SRUFEV1JJVEVfQUNDT1VOVFMQh/7/////////ARI8Ci9UUkFOU0FDVElPTl9WTV9FUlJPUl9VTlNPUlRFRF9SRUFET05MWV9BQ0NPVU5UUxCI/v////////8BEj4KMVRSQU5TQUNUSU9OX1ZNX0VSUk9SX0FDQ09VTlRfQ09VTlRfTElNSVRfRVhDRUVERUQQif7/////////ARIvCiJUUkFOU0FDVElPTl9WTV9FUlJPUl9OT05DRV9UT09fTE9XEIH8/////////wESMAojVFJBTlNBQ1RJT05fVk1fRVJST1JfTk9OQ0VfVE9PX0hJR0gQgvz/////////ARJACjNUUkFOU0FDVElPTl9WTV9FUlJPUl9JTlNVRkZJQ0lFTlRfRkVFX1BBWUVSX0JBTEFOQ0UQg/z/////////ARJCCjVUUkFOU0FDVElPTl9WTV9FUlJPUl9GRUVfUEFZRVJfQUNDT1VOVF9ET0VTX05PVF9FWElTVBCE/P////////8BEi4KIVRSQU5TQUNUSU9OX1ZNX0VSUk9SX05PVF9MSVZFX1lFVBCF/P////////8BEikKHFRSQU5TQUNUSU9OX1ZNX0VSUk9SX0VYUElSRUQQhvz/////////ARI/CjJUUkFOU0FDVElPTl9WTV9FUlJPUl9JTlZBTElEX0ZFRV9QQVlFUl9TVEFURV9QUk9PRhCH/P////////8BEkQKN1RSQU5TQUNUSU9OX1ZNX0VSUk9SX0lOVkFMSURfRkVFX1BBWUVSX1NUQVRFX1BST09GX1RZUEUQiPz/////////ARJECjdUUkFOU0FDVElPTl9WTV9FUlJPUl9JTlZBTElEX0ZFRV9QQVlFUl9TVEFURV9QUk9PRl9TTE9UEIn8/////////wESQQo0VFJBTlNBQ1RJT05fVk1fRVJST1JfSU5WQUxJRF9GRUVfUEFZRVJfQUNDT1VOVF9PV05FUhCK/P////////8BEk0KQFRSQU5TQUNUSU9OX1ZNX0VSUk9SX0lOVkFMSURfRkVFX1BBWUVSX1NUQVRFX1BST09GX0FDQ09VTlRfT1dORVIQi/z/////////ARJUCkdUUkFOU0FDVElPTl9WTV9FUlJPUl9JTlZBTElEX0ZFRV9QQVlFUl9TVEFURV9QUk9PRl9BQ0NPVU5UX01FVEFfREFUQV9TWhCM/P////////8BEisKHlRSQU5TQUNUSU9OX1ZNX0VSUk9SX1ZNX0ZBSUxFRBCB+v////////8BEjkKLFRSQU5TQUNUSU9OX1ZNX0VSUk9SX0lOVkFMSURfUFJPR1JBTV9BQ0NPVU5UEIL6/////////wESKwoeVFJBTlNBQ1RJT05fVk1fRVJST1JfVk1fUkVWRVJUEIP6/////////wESLgohVFJBTlNBQ1RJT05fVk1fRVJST1JfQ1VfRVhIQVVTVEVEEIT6/////////wESLgohVFJBTlNBQ1RJT05fVk1fRVJST1JfU1VfRVhIQVVTVEVEEIX6/////////wFCvwEKEGNvbS50aHJ1LmNvcmUudjFCEFRyYW5zYWN0aW9uUHJvdG9QAVpAZ2l0aHViLmNvbS9VbnRvLUxhYnMvdGhydS1uZXQvZ3JwYy9wa2cvcHJvdG8vdGhydS9jb3JlL3YxO2NvcmV2MaICA1RDWKoCDFRocnUuQ29yZS5WMboCBFRIVUPKAgxUaHJ1XENvcmVcVjHiAhhUaHJ1XENvcmVcVjFcR1BCTWV0YWRhdGHqAg5UaHJ1OjpDb3JlOjpWMWIGcHJvdG8z", [file_buf_validate_validate, file_google_api_field_behavior, file_thru_core_v1_types, file_thru_common_v1_primitives]);
|
|
311
|
+
var file_google_api_http = /* @__PURE__ */ codegenv2.fileDesc("ChVnb29nbGUvYXBpL2h0dHAucHJvdG8SCmdvb2dsZS5hcGkiVAoESHR0cBIjCgVydWxlcxgBIAMoCzIULmdvb2dsZS5hcGkuSHR0cFJ1bGUSJwofZnVsbHlfZGVjb2RlX3Jlc2VydmVkX2V4cGFuc2lvbhgCIAEoCCKBAgoISHR0cFJ1bGUSEAoIc2VsZWN0b3IYASABKAkSDQoDZ2V0GAIgASgJSAASDQoDcHV0GAMgASgJSAASDgoEcG9zdBgEIAEoCUgAEhAKBmRlbGV0ZRgFIAEoCUgAEg8KBXBhdGNoGAYgASgJSAASLwoGY3VzdG9tGAggASgLMh0uZ29vZ2xlLmFwaS5DdXN0b21IdHRwUGF0dGVybkgAEgwKBGJvZHkYByABKAkSFQoNcmVzcG9uc2VfYm9keRgMIAEoCRIxChNhZGRpdGlvbmFsX2JpbmRpbmdzGAsgAygLMhQuZ29vZ2xlLmFwaS5IdHRwUnVsZUIJCgdwYXR0ZXJuIi8KEUN1c3RvbUh0dHBQYXR0ZXJuEgwKBGtpbmQYASABKAkSDAoEcGF0aBgCIAEoCUKnAQoOY29tLmdvb2dsZS5hcGlCCUh0dHBQcm90b1ABWkFnb29nbGUuZ29sYW5nLm9yZy9nZW5wcm90by9nb29nbGVhcGlzL2FwaS9hbm5vdGF0aW9uczthbm5vdGF0aW9uc6ICA0dBWKoCCkdvb2dsZS5BcGnKAgpHb29nbGVcQXBp4gIWR29vZ2xlXEFwaVxHUEJNZXRhZGF0YeoCC0dvb2dsZTo6QXBpYgZwcm90bzM");
|
|
312
|
+
var file_google_api_annotations = /* @__PURE__ */ codegenv2.fileDesc("Chxnb29nbGUvYXBpL2Fubm90YXRpb25zLnByb3RvEgpnb29nbGUuYXBpOksKBGh0dHASHi5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucxiwyrwiIAEoCzIULmdvb2dsZS5hcGkuSHR0cFJ1bGVSBGh0dHBCrgEKDmNvbS5nb29nbGUuYXBpQhBBbm5vdGF0aW9uc1Byb3RvUAFaQWdvb2dsZS5nb2xhbmcub3JnL2dlbnByb3RvL2dvb2dsZWFwaXMvYXBpL2Fubm90YXRpb25zO2Fubm90YXRpb25zogIDR0FYqgIKR29vZ2xlLkFwacoCCkdvb2dsZVxBcGniAhZHb29nbGVcQXBpXEdQQk1ldGFkYXRh6gILR29vZ2xlOjpBcGliBnByb3RvMw", [file_google_api_http, wkt.file_google_protobuf_descriptor]);
|
|
313
|
+
var file_google_api_launch_stage = /* @__PURE__ */ codegenv2.fileDesc("Ch1nb29nbGUvYXBpL2xhdW5jaF9zdGFnZS5wcm90bxIKZ29vZ2xlLmFwaSqMAQoLTGF1bmNoU3RhZ2USHAoYTEFVTkNIX1NUQUdFX1VOU1BFQ0lGSUVEEAASEQoNVU5JTVBMRU1FTlRFRBAGEg0KCVBSRUxBVU5DSBAHEhAKDEVBUkxZX0FDQ0VTUxABEgkKBUFMUEhBEAISCAoEQkVUQRADEgYKAkdBEAQSDgoKREVQUkVDQVRFRBAFQpoBCg5jb20uZ29vZ2xlLmFwaUIQTGF1bmNoU3RhZ2VQcm90b1ABWi1nb29nbGUuZ29sYW5nLm9yZy9nZW5wcm90by9nb29nbGVhcGlzL2FwaTthcGmiAgNHQViqAgpHb29nbGUuQXBpygIKR29vZ2xlXEFwaeICFkdvb2dsZVxBcGlcR1BCTWV0YWRhdGHqAgtHb29nbGU6OkFwaWIGcHJvdG8z");
|
|
314
|
+
var file_google_api_client = /* @__PURE__ */ codegenv2.fileDesc("Chdnb29nbGUvYXBpL2NsaWVudC5wcm90bxIKZ29vZ2xlLmFwaSK+AQoWQ29tbW9uTGFuZ3VhZ2VTZXR0aW5ncxIeChJyZWZlcmVuY2VfZG9jc191cmkYASABKAlCAhgBEjoKDGRlc3RpbmF0aW9ucxgCIAMoDjIkLmdvb2dsZS5hcGkuQ2xpZW50TGlicmFyeURlc3RpbmF0aW9uEkgKGnNlbGVjdGl2ZV9nYXBpY19nZW5lcmF0aW9uGAMgASgLMiQuZ29vZ2xlLmFwaS5TZWxlY3RpdmVHYXBpY0dlbmVyYXRpb24i+wMKFUNsaWVudExpYnJhcnlTZXR0aW5ncxIPCgd2ZXJzaW9uGAEgASgJEi0KDGxhdW5jaF9zdGFnZRgCIAEoDjIXLmdvb2dsZS5hcGkuTGF1bmNoU3RhZ2USGgoScmVzdF9udW1lcmljX2VudW1zGAMgASgIEi8KDWphdmFfc2V0dGluZ3MYFSABKAsyGC5nb29nbGUuYXBpLkphdmFTZXR0aW5ncxItCgxjcHBfc2V0dGluZ3MYFiABKAsyFy5nb29nbGUuYXBpLkNwcFNldHRpbmdzEi0KDHBocF9zZXR0aW5ncxgXIAEoCzIXLmdvb2dsZS5hcGkuUGhwU2V0dGluZ3MSMwoPcHl0aG9uX3NldHRpbmdzGBggASgLMhouZ29vZ2xlLmFwaS5QeXRob25TZXR0aW5ncxIvCg1ub2RlX3NldHRpbmdzGBkgASgLMhguZ29vZ2xlLmFwaS5Ob2RlU2V0dGluZ3MSMwoPZG90bmV0X3NldHRpbmdzGBogASgLMhouZ29vZ2xlLmFwaS5Eb3RuZXRTZXR0aW5ncxIvCg1ydWJ5X3NldHRpbmdzGBsgASgLMhguZ29vZ2xlLmFwaS5SdWJ5U2V0dGluZ3MSKwoLZ29fc2V0dGluZ3MYHCABKAsyFi5nb29nbGUuYXBpLkdvU2V0dGluZ3MiqAMKClB1Ymxpc2hpbmcSMwoPbWV0aG9kX3NldHRpbmdzGAIgAygLMhouZ29vZ2xlLmFwaS5NZXRob2RTZXR0aW5ncxIVCg1uZXdfaXNzdWVfdXJpGGUgASgJEhkKEWRvY3VtZW50YXRpb25fdXJpGGYgASgJEhYKDmFwaV9zaG9ydF9uYW1lGGcgASgJEhQKDGdpdGh1Yl9sYWJlbBhoIAEoCRIeChZjb2Rlb3duZXJfZ2l0aHViX3RlYW1zGGkgAygJEhYKDmRvY190YWdfcHJlZml4GGogASgJEjsKDG9yZ2FuaXphdGlvbhhrIAEoDjIlLmdvb2dsZS5hcGkuQ2xpZW50TGlicmFyeU9yZ2FuaXphdGlvbhI7ChBsaWJyYXJ5X3NldHRpbmdzGG0gAygLMiEuZ29vZ2xlLmFwaS5DbGllbnRMaWJyYXJ5U2V0dGluZ3MSKQohcHJvdG9fcmVmZXJlbmNlX2RvY3VtZW50YXRpb25fdXJpGG4gASgJEigKIHJlc3RfcmVmZXJlbmNlX2RvY3VtZW50YXRpb25fdXJpGG8gASgJIuMBCgxKYXZhU2V0dGluZ3MSFwoPbGlicmFyeV9wYWNrYWdlGAEgASgJEkwKE3NlcnZpY2VfY2xhc3NfbmFtZXMYAiADKAsyLy5nb29nbGUuYXBpLkphdmFTZXR0aW5ncy5TZXJ2aWNlQ2xhc3NOYW1lc0VudHJ5EjIKBmNvbW1vbhgDIAEoCzIiLmdvb2dsZS5hcGkuQ29tbW9uTGFuZ3VhZ2VTZXR0aW5ncxo4ChZTZXJ2aWNlQ2xhc3NOYW1lc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEiQQoLQ3BwU2V0dGluZ3MSMgoGY29tbW9uGAEgASgLMiIuZ29vZ2xlLmFwaS5Db21tb25MYW5ndWFnZVNldHRpbmdzIloKC1BocFNldHRpbmdzEjIKBmNvbW1vbhgBIAEoCzIiLmdvb2dsZS5hcGkuQ29tbW9uTGFuZ3VhZ2VTZXR0aW5ncxIXCg9saWJyYXJ5X3BhY2thZ2UYAiABKAkimwIKDlB5dGhvblNldHRpbmdzEjIKBmNvbW1vbhgBIAEoCzIiLmdvb2dsZS5hcGkuQ29tbW9uTGFuZ3VhZ2VTZXR0aW5ncxJOChVleHBlcmltZW50YWxfZmVhdHVyZXMYAiABKAsyLy5nb29nbGUuYXBpLlB5dGhvblNldHRpbmdzLkV4cGVyaW1lbnRhbEZlYXR1cmVzGoQBChRFeHBlcmltZW50YWxGZWF0dXJlcxIdChVyZXN0X2FzeW5jX2lvX2VuYWJsZWQYASABKAgSJwofcHJvdG9idWZfcHl0aG9uaWNfdHlwZXNfZW5hYmxlZBgCIAEoCBIkChx1bnZlcnNpb25lZF9wYWNrYWdlX2Rpc2FibGVkGAMgASgIIkIKDE5vZGVTZXR0aW5ncxIyCgZjb21tb24YASABKAsyIi5nb29nbGUuYXBpLkNvbW1vbkxhbmd1YWdlU2V0dGluZ3MiqgMKDkRvdG5ldFNldHRpbmdzEjIKBmNvbW1vbhgBIAEoCzIiLmdvb2dsZS5hcGkuQ29tbW9uTGFuZ3VhZ2VTZXR0aW5ncxJJChByZW5hbWVkX3NlcnZpY2VzGAIgAygLMi8uZ29vZ2xlLmFwaS5Eb3RuZXRTZXR0aW5ncy5SZW5hbWVkU2VydmljZXNFbnRyeRJLChFyZW5hbWVkX3Jlc291cmNlcxgDIAMoCzIwLmdvb2dsZS5hcGkuRG90bmV0U2V0dGluZ3MuUmVuYW1lZFJlc291cmNlc0VudHJ5EhkKEWlnbm9yZWRfcmVzb3VyY2VzGAQgAygJEiAKGGZvcmNlZF9uYW1lc3BhY2VfYWxpYXNlcxgFIAMoCRIeChZoYW5kd3JpdHRlbl9zaWduYXR1cmVzGAYgAygJGjYKFFJlbmFtZWRTZXJ2aWNlc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaNwoVUmVuYW1lZFJlc291cmNlc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEiQgoMUnVieVNldHRpbmdzEjIKBmNvbW1vbhgBIAEoCzIiLmdvb2dsZS5hcGkuQ29tbW9uTGFuZ3VhZ2VTZXR0aW5ncyK/AQoKR29TZXR0aW5ncxIyCgZjb21tb24YASABKAsyIi5nb29nbGUuYXBpLkNvbW1vbkxhbmd1YWdlU2V0dGluZ3MSRQoQcmVuYW1lZF9zZXJ2aWNlcxgCIAMoCzIrLmdvb2dsZS5hcGkuR29TZXR0aW5ncy5SZW5hbWVkU2VydmljZXNFbnRyeRo2ChRSZW5hbWVkU2VydmljZXNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIoIDCg5NZXRob2RTZXR0aW5ncxIQCghzZWxlY3RvchgBIAEoCRI8Cgxsb25nX3J1bm5pbmcYAiABKAsyJi5nb29nbGUuYXBpLk1ldGhvZFNldHRpbmdzLkxvbmdSdW5uaW5nEh0KFWF1dG9fcG9wdWxhdGVkX2ZpZWxkcxgDIAMoCRIxCghiYXRjaGluZxgEIAEoCzIfLmdvb2dsZS5hcGkuQmF0Y2hpbmdDb25maWdQcm90bxrNAQoLTG9uZ1J1bm5pbmcSNQoSaW5pdGlhbF9wb2xsX2RlbGF5GAEgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uEh0KFXBvbGxfZGVsYXlfbXVsdGlwbGllchgCIAEoAhIxCg5tYXhfcG9sbF9kZWxheRgDIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbhI1ChJ0b3RhbF9wb2xsX3RpbWVvdXQYBCABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb24iUQoYU2VsZWN0aXZlR2FwaWNHZW5lcmF0aW9uEg8KB21ldGhvZHMYASADKAkSJAocZ2VuZXJhdGVfb21pdHRlZF9hc19pbnRlcm5hbBgCIAEoCCKLAQoTQmF0Y2hpbmdDb25maWdQcm90bxI1Cgp0aHJlc2hvbGRzGAEgASgLMiEuZ29vZ2xlLmFwaS5CYXRjaGluZ1NldHRpbmdzUHJvdG8SPQoQYmF0Y2hfZGVzY3JpcHRvchgCIAEoCzIjLmdvb2dsZS5hcGkuQmF0Y2hpbmdEZXNjcmlwdG9yUHJvdG8i6wIKFUJhdGNoaW5nU2V0dGluZ3NQcm90bxIfChdlbGVtZW50X2NvdW50X3RocmVzaG9sZBgBIAEoBRIeChZyZXF1ZXN0X2J5dGVfdGhyZXNob2xkGAIgASgDEjIKD2RlbGF5X3RocmVzaG9sZBgDIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbhIbChNlbGVtZW50X2NvdW50X2xpbWl0GAQgASgFEhoKEnJlcXVlc3RfYnl0ZV9saW1pdBgFIAEoBRIiChpmbG93X2NvbnRyb2xfZWxlbWVudF9saW1pdBgGIAEoBRIfChdmbG93X2NvbnRyb2xfYnl0ZV9saW1pdBgHIAEoBRJfCiRmbG93X2NvbnRyb2xfbGltaXRfZXhjZWVkZWRfYmVoYXZpb3IYCCABKA4yMS5nb29nbGUuYXBpLkZsb3dDb250cm9sTGltaXRFeGNlZWRlZEJlaGF2aW9yUHJvdG8iaQoXQmF0Y2hpbmdEZXNjcmlwdG9yUHJvdG8SFQoNYmF0Y2hlZF9maWVsZBgBIAEoCRIcChRkaXNjcmltaW5hdG9yX2ZpZWxkcxgCIAMoCRIZChFzdWJyZXNwb25zZV9maWVsZBgDIAEoCSqjAQoZQ2xpZW50TGlicmFyeU9yZ2FuaXphdGlvbhIrCidDTElFTlRfTElCUkFSWV9PUkdBTklaQVRJT05fVU5TUEVDSUZJRUQQABIJCgVDTE9VRBABEgcKA0FEUxACEgoKBlBIT1RPUxADEg8KC1NUUkVFVF9WSUVXEAQSDAoIU0hPUFBJTkcQBRIHCgNHRU8QBhIRCg1HRU5FUkFUSVZFX0FJEAcqZwoYQ2xpZW50TGlicmFyeURlc3RpbmF0aW9uEioKJkNMSUVOVF9MSUJSQVJZX0RFU1RJTkFUSU9OX1VOU1BFQ0lGSUVEEAASCgoGR0lUSFVCEAoSEwoPUEFDS0FHRV9NQU5BR0VSEBQqZwolRmxvd0NvbnRyb2xMaW1pdEV4Y2VlZGVkQmVoYXZpb3JQcm90bxISCg5VTlNFVF9CRUhBVklPUhAAEhMKD1RIUk9XX0VYQ0VQVElPThABEgkKBUJMT0NLEAISCgoGSUdOT1JFEAM6SgoQbWV0aG9kX3NpZ25hdHVyZRIeLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zGJsIIAMoCVIPbWV0aG9kU2lnbmF0dXJlOkMKDGRlZmF1bHRfaG9zdBIfLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucxiZCCABKAlSC2RlZmF1bHRIb3N0OkMKDG9hdXRoX3Njb3BlcxIfLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucxiaCCABKAlSC29hdXRoU2NvcGVzOkQKC2FwaV92ZXJzaW9uEh8uZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zGMG6q/oBIAEoCVIKYXBpVmVyc2lvbkKpAQoOY29tLmdvb2dsZS5hcGlCC0NsaWVudFByb3RvUAFaQWdvb2dsZS5nb2xhbmcub3JnL2dlbnByb3RvL2dvb2dsZWFwaXMvYXBpL2Fubm90YXRpb25zO2Fubm90YXRpb25zogIDR0FYqgIKR29vZ2xlLkFwacoCCkdvb2dsZVxBcGniAhZHb29nbGVcQXBpXEdQQk1ldGFkYXRh6gILR29vZ2xlOjpBcGliBnByb3RvMw", [file_google_api_launch_stage, wkt.file_google_protobuf_descriptor, wkt.file_google_protobuf_duration]);
|
|
315
|
+
var file_thru_services_v1_command_service = /* @__PURE__ */ codegenv2.fileDesc("CiZ0aHJ1L3NlcnZpY2VzL3YxL2NvbW1hbmRfc2VydmljZS5wcm90bxIQdGhydS5zZXJ2aWNlcy52MSI2ChZTZW5kVHJhbnNhY3Rpb25SZXF1ZXN0EhwKD3Jhd190cmFuc2FjdGlvbhgBIAEoDEID4EECIkwKF1NlbmRUcmFuc2FjdGlvblJlc3BvbnNlEjEKCXNpZ25hdHVyZRgBIAEoCzIZLnRocnUuY29tbW9uLnYxLlNpZ25hdHVyZUID4EECIlIKHEJhdGNoU2VuZFRyYW5zYWN0aW9uc1JlcXVlc3QSHQoQcmF3X3RyYW5zYWN0aW9ucxgBIAMoDEID4EECEhMKC251bV9yZXRyaWVzGAIgASgFImoKHUJhdGNoU2VuZFRyYW5zYWN0aW9uc1Jlc3BvbnNlEjIKCnNpZ25hdHVyZXMYASADKAsyGS50aHJ1LmNvbW1vbi52MS5TaWduYXR1cmVCA+BBAhIVCghhY2NlcHRlZBgCIAMoCEID4EECIl4KFlNlbmRBbmRUcmFja1R4blJlcXVlc3QSGAoLdHJhbnNhY3Rpb24YASABKAxCA+BBAhIqCgd0aW1lb3V0GAIgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uIv8BChdTZW5kQW5kVHJhY2tUeG5SZXNwb25zZRI3CgZzdGF0dXMYASABKA4yIi50aHJ1LnNlcnZpY2VzLnYxLlN1Ym1pc3Npb25TdGF0dXNCA+BBAhIsCglzaWduYXR1cmUYAiABKAsyGS50aHJ1LmNvbW1vbi52MS5TaWduYXR1cmUSOQoQY29uc2Vuc3VzX3N0YXR1cxgDIAEoDjIfLnRocnUuY29tbW9uLnYxLkNvbnNlbnN1c1N0YXR1cxJCChBleGVjdXRpb25fcmVzdWx0GAQgASgLMigudGhydS5jb3JlLnYxLlRyYW5zYWN0aW9uRXhlY3V0aW9uUmVzdWx0KnUKEFN1Ym1pc3Npb25TdGF0dXMSIQodU1VCTUlTU0lPTl9TVEFUVVNfVU5TUEVDSUZJRUQQABIeChpTVUJNSVNTSU9OX1NUQVRVU19SRUNFSVZFRBABEh4KGlNVQk1JU1NJT05fU1RBVFVTX0FDQ0VQVEVEEAIy1wMKDkNvbW1hbmRTZXJ2aWNlEoMBCg9TZW5kVHJhbnNhY3Rpb24SKC50aHJ1LnNlcnZpY2VzLnYxLlNlbmRUcmFuc2FjdGlvblJlcXVlc3QaKS50aHJ1LnNlcnZpY2VzLnYxLlNlbmRUcmFuc2FjdGlvblJlc3BvbnNlIhuC0+STAhU6ASoiEC92MS90cmFuc2FjdGlvbnMSmwEKFUJhdGNoU2VuZFRyYW5zYWN0aW9ucxIuLnRocnUuc2VydmljZXMudjEuQmF0Y2hTZW5kVHJhbnNhY3Rpb25zUmVxdWVzdBovLnRocnUuc2VydmljZXMudjEuQmF0Y2hTZW5kVHJhbnNhY3Rpb25zUmVzcG9uc2UiIYLT5JMCGzoBKiIWL3YxL3RyYW5zYWN0aW9ucy9iYXRjaBKLAQoPU2VuZEFuZFRyYWNrVHhuEigudGhydS5zZXJ2aWNlcy52MS5TZW5kQW5kVHJhY2tUeG5SZXF1ZXN0GikudGhydS5zZXJ2aWNlcy52MS5TZW5kQW5kVHJhY2tUeG5SZXNwb25zZSIhgtPkkwIbOgEqIhYvdjEvdHJhbnNhY3Rpb25zL3RyYWNrMAEaE8pBEGFwaS50aHJ1Lm5ldHdvcmtC3gEKFGNvbS50aHJ1LnNlcnZpY2VzLnYxQhNDb21tYW5kU2VydmljZVByb3RvUAFaSGdpdGh1Yi5jb20vVW50by1MYWJzL3RocnUtbmV0L2dycGMvcGtnL3Byb3RvL3RocnUvc2VydmljZXMvdjE7c2VydmljZXN2MaICA1RTWKoCEFRocnUuU2VydmljZXMuVjG6AgRUSFVTygIQVGhydVxTZXJ2aWNlc1xWMeICHFRocnVcU2VydmljZXNcVjFcR1BCTWV0YWRhdGHqAhJUaHJ1OjpTZXJ2aWNlczo6VjFiBnByb3RvMw", [file_google_api_annotations, file_google_api_client, file_thru_common_v1_primitives, file_thru_common_v1_consensus, file_google_api_field_behavior, file_thru_core_v1_transaction, file_thru_core_v1_types, wkt.file_google_protobuf_duration]);
|
|
316
|
+
var SendTransactionRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_services_v1_command_service, 0);
|
|
317
|
+
var BatchSendTransactionsRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_services_v1_command_service, 2);
|
|
318
|
+
var SendAndTrackTxnRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_services_v1_command_service, 4);
|
|
319
|
+
var CommandService = /* @__PURE__ */ codegenv2.serviceDesc(file_thru_services_v1_command_service, 0);
|
|
320
|
+
var file_thru_services_v1_query_service = /* @__PURE__ */ codegenv2.fileDesc("CiR0aHJ1L3NlcnZpY2VzL3YxL3F1ZXJ5X3NlcnZpY2UucHJvdG8SEHRocnUuc2VydmljZXMudjEi1QIKEUdldEFjY291bnRSZXF1ZXN0EiwKB2FkZHJlc3MYASABKAsyFi50aHJ1LmNvbW1vbi52MS5QdWJrZXlCA+BBAhIxCgR2aWV3GAIgASgOMhkudGhydS5jb3JlLnYxLkFjY291bnRWaWV3QgPgQQFIAIgBARI8Cg92ZXJzaW9uX2NvbnRleHQYAyABKAsyHi50aHJ1LmNvbW1vbi52MS5WZXJzaW9uQ29udGV4dEID4EECEkAKDW1pbl9jb25zZW5zdXMYBCABKA4yHy50aHJ1LmNvbW1vbi52MS5Db25zZW5zdXNTdGF0dXNCA+BBAUgBiAEBEjUKCmRhdGFfc2xpY2UYBSABKAsyFy50aHJ1LmNvcmUudjEuRGF0YVNsaWNlQgPgQQFIAogBAUIHCgVfdmlld0IQCg5fbWluX2NvbnNlbnN1c0INCgtfZGF0YV9zbGljZSKSAgoUR2V0UmF3QWNjb3VudFJlcXVlc3QSLAoHYWRkcmVzcxgBIAEoCzIWLnRocnUuY29tbW9uLnYxLlB1YmtleUID4EECEjEKBHZpZXcYAiABKA4yGS50aHJ1LmNvcmUudjEuQWNjb3VudFZpZXdCA+BBAUgAiAEBEjwKD3ZlcnNpb25fY29udGV4dBgDIAEoCzIeLnRocnUuY29tbW9uLnYxLlZlcnNpb25Db250ZXh0QgPgQQISQAoNbWluX2NvbnNlbnN1cxgEIAEoDjIfLnRocnUuY29tbW9uLnYxLkNvbnNlbnN1c1N0YXR1c0ID4EEBSAGIAQFCBwoFX3ZpZXdCEAoOX21pbl9jb25zZW5zdXMinAIKFUdldFRyYW5zYWN0aW9uUmVxdWVzdBIxCglzaWduYXR1cmUYASABKAsyGS50aHJ1LmNvbW1vbi52MS5TaWduYXR1cmVCA+BBAhI1CgR2aWV3GAIgASgOMh0udGhydS5jb3JlLnYxLlRyYW5zYWN0aW9uVmlld0ID4EEBSACIAQESPAoPdmVyc2lvbl9jb250ZXh0GAMgASgLMh4udGhydS5jb21tb24udjEuVmVyc2lvbkNvbnRleHRCA+BBAhJACg1taW5fY29uc2Vuc3VzGAQgASgOMh8udGhydS5jb21tb24udjEuQ29uc2Vuc3VzU3RhdHVzQgPgQQFIAYgBAUIHCgVfdmlld0IQCg5fbWluX2NvbnNlbnN1cyLfAQoYR2V0UmF3VHJhbnNhY3Rpb25SZXF1ZXN0EjEKCXNpZ25hdHVyZRgBIAEoCzIZLnRocnUuY29tbW9uLnYxLlNpZ25hdHVyZUID4EECEjwKD3ZlcnNpb25fY29udGV4dBgCIAEoCzIeLnRocnUuY29tbW9uLnYxLlZlcnNpb25Db250ZXh0QgPgQQISQAoNbWluX2NvbnNlbnN1cxgDIAEoDjIfLnRocnUuY29tbW9uLnYxLkNvbnNlbnN1c1N0YXR1c0ID4EEBSACIAQFCEAoOX21pbl9jb25zZW5zdXMiUgoZR2VuZXJhdGVTdGF0ZVByb29mUmVxdWVzdBI1CgdyZXF1ZXN0GAEgASgLMh8udGhydS5jb3JlLnYxLlN0YXRlUHJvb2ZSZXF1ZXN0QgPgQQIiSgoaR2VuZXJhdGVTdGF0ZVByb29mUmVzcG9uc2USLAoFcHJvb2YYASABKAsyGC50aHJ1LmNvcmUudjEuU3RhdGVQcm9vZkID4EECIt4CCg9HZXRCbG9ja1JlcXVlc3QSEwoEc2xvdBgBIAEoBEID4EEBSAASMgoKYmxvY2tfaGFzaBgCIAEoCzIXLnRocnUuY29yZS52MS5CbG9ja0hhc2hCA+BBAUgAEi8KBHZpZXcYAyABKA4yFy50aHJ1LmNvcmUudjEuQmxvY2tWaWV3QgPgQQFIAYgBARJACg1taW5fY29uc2Vuc3VzGAQgASgOMh8udGhydS5jb21tb24udjEuQ29uc2Vuc3VzU3RhdHVzQgPgQQFIAogBATpoukhlGmMKEmJsb2NrX3NlbGVjdG9yX3NldBIlZWl0aGVyIHNsb3Qgb3IgYmxvY2tfaGFzaCBtdXN0IGJlIHNldBomaGFzKHRoaXMuc2xvdCkgfHwgaGFzKHRoaXMuYmxvY2tfaGFzaClCCgoIc2VsZWN0b3JCBwoFX3ZpZXdCEAoOX21pbl9jb25zZW5zdXMiqwIKEkdldFJhd0Jsb2NrUmVxdWVzdBITCgRzbG90GAEgASgEQgPgQQFIABIyCgpibG9ja19oYXNoGAIgASgLMhcudGhydS5jb3JlLnYxLkJsb2NrSGFzaEID4EEBSAASQAoNbWluX2NvbnNlbnN1cxgDIAEoDjIfLnRocnUuY29tbW9uLnYxLkNvbnNlbnN1c1N0YXR1c0ID4EEBSAGIAQE6bLpIaRpnChZyYXdfYmxvY2tfc2VsZWN0b3Jfc2V0EiVlaXRoZXIgc2xvdCBvciBibG9ja19oYXNoIG11c3QgYmUgc2V0GiZoYXModGhpcy5zbG90KSB8fCBoYXModGhpcy5ibG9ja19oYXNoKUIKCghzZWxlY3RvckIQCg5fbWluX2NvbnNlbnN1cyL3AgoTTGlzdEFjY291bnRzUmVxdWVzdBIxCgR2aWV3GAEgASgOMhkudGhydS5jb3JlLnYxLkFjY291bnRWaWV3QgPgQQFIAIgBARJBCg92ZXJzaW9uX2NvbnRleHQYAiABKAsyHi50aHJ1LmNvbW1vbi52MS5WZXJzaW9uQ29udGV4dEID4EEBSAGIAQESMAoGZmlsdGVyGAMgASgLMhYudGhydS5jb21tb24udjEuRmlsdGVyQgPgQQFIAogBARIzCgRwYWdlGAQgASgLMhsudGhydS5jb21tb24udjEuUGFnZVJlcXVlc3RCA+BBAUgDiAEBEkAKDW1pbl9jb25zZW5zdXMYBSABKA4yHy50aHJ1LmNvbW1vbi52MS5Db25zZW5zdXNTdGF0dXNCA+BBAUgEiAEBQgcKBV92aWV3QhIKEF92ZXJzaW9uX2NvbnRleHRCCQoHX2ZpbHRlckIHCgVfcGFnZUIQCg5fbWluX2NvbnNlbnN1cyKDAQoUTGlzdEFjY291bnRzUmVzcG9uc2USLAoIYWNjb3VudHMYASADKAsyFS50aHJ1LmNvcmUudjEuQWNjb3VudEID4EEBEjQKBHBhZ2UYAiABKAsyHC50aHJ1LmNvbW1vbi52MS5QYWdlUmVzcG9uc2VCA+BBAUgAiAEBQgcKBV9wYWdlIpwCChFMaXN0QmxvY2tzUmVxdWVzdBIwCgZmaWx0ZXIYASABKAsyFi50aHJ1LmNvbW1vbi52MS5GaWx0ZXJCA+BBAUgAiAEBEjMKBHBhZ2UYAiABKAsyGy50aHJ1LmNvbW1vbi52MS5QYWdlUmVxdWVzdEID4EEBSAGIAQESLwoEdmlldxgDIAEoDjIXLnRocnUuY29yZS52MS5CbG9ja1ZpZXdCA+BBAUgCiAEBEkAKDW1pbl9jb25zZW5zdXMYBCABKA4yHy50aHJ1LmNvbW1vbi52MS5Db25zZW5zdXNTdGF0dXNCA+BBAUgDiAEBQgkKB19maWx0ZXJCBwoFX3BhZ2VCBwoFX3ZpZXdCEAoOX21pbl9jb25zZW5zdXMifQoSTGlzdEJsb2Nrc1Jlc3BvbnNlEigKBmJsb2NrcxgBIAMoCzITLnRocnUuY29yZS52MS5CbG9ja0ID4EEBEjQKBHBhZ2UYAiABKAsyHC50aHJ1LmNvbW1vbi52MS5QYWdlUmVzcG9uc2VCA+BBAUgAiAEBQgcKBV9wYWdlIswBCiFMaXN0VHJhbnNhY3Rpb25zRm9yQWNjb3VudFJlcXVlc3QSLAoHYWNjb3VudBgBIAEoCzIWLnRocnUuY29tbW9uLnYxLlB1YmtleUID4EECEjMKBHBhZ2UYAiABKAsyGy50aHJ1LmNvbW1vbi52MS5QYWdlUmVxdWVzdEID4EEBSACIAQESMAoGZmlsdGVyGAMgASgLMhYudGhydS5jb21tb24udjEuRmlsdGVyQgPgQQFIAYgBAUIHCgVfcGFnZUIJCgdfZmlsdGVyIpkBCiJMaXN0VHJhbnNhY3Rpb25zRm9yQWNjb3VudFJlc3BvbnNlEjQKBHBhZ2UYASABKAsyHC50aHJ1LmNvbW1vbi52MS5QYWdlUmVzcG9uc2VCA+BBAUgAiAEBEjQKDHRyYW5zYWN0aW9ucxgCIAMoCzIZLnRocnUuY29yZS52MS5UcmFuc2FjdGlvbkID4EEBQgcKBV9wYWdlIhMKEUdldFZlcnNpb25SZXF1ZXN0IpABChJHZXRWZXJzaW9uUmVzcG9uc2USSQoIdmVyc2lvbnMYASADKAsyMi50aHJ1LnNlcnZpY2VzLnYxLkdldFZlcnNpb25SZXNwb25zZS5WZXJzaW9uc0VudHJ5QgPgQQIaLwoNVmVyc2lvbnNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIocBCg9HZXRFdmVudFJlcXVlc3QSHQoIZXZlbnRfaWQYASABKAlCC+BBArpIBXIDGIABEkEKD3ZlcnNpb25fY29udGV4dBgCIAEoCzIeLnRocnUuY29tbW9uLnYxLlZlcnNpb25Db250ZXh0QgPgQQFIAIgBAUISChBfdmVyc2lvbl9jb250ZXh0IqgECgVFdmVudBIVCghldmVudF9pZBgBIAEoCUID4EECEj0KFXRyYW5zYWN0aW9uX3NpZ25hdHVyZRgCIAEoCzIZLnRocnUuY29tbW9uLnYxLlNpZ25hdHVyZUID4EECEjEKB3Byb2dyYW0YAyABKAsyFi50aHJ1LmNvbW1vbi52MS5QdWJrZXlCA+BBAUgAiAEBEhkKB3BheWxvYWQYBCABKAxCA+BBAUgBiAEBEhYKBHNsb3QYBSABKARCA+BBAUgCiAEBEhoKCGNhbGxfaWR4GAYgASgNQgPgQQFIA4gBARIdCgtwcm9ncmFtX2lkeBgHIAEoDUID4EEBSASIAQESHgoMcGF5bG9hZF9zaXplGAggASgNQgPgQQFIBYgBARIeCgxibG9ja19vZmZzZXQYCSABKA1CA+BBAUgGiAEBEjcKCXRpbWVzdGFtcBgKIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAUgHiAEBEjMKCWZlZV9wYXllchgLIAEoCzIWLnRocnUuY29tbW9uLnYxLlB1YmtleUID4EEBSAiIAQFCCgoIX3Byb2dyYW1CCgoIX3BheWxvYWRCBwoFX3Nsb3RCCwoJX2NhbGxfaWR4Qg4KDF9wcm9ncmFtX2lkeEIPCg1fcGF5bG9hZF9zaXplQg8KDV9ibG9ja19vZmZzZXRCDAoKX3RpbWVzdGFtcEIMCgpfZmVlX3BheWVyIrkCChFMaXN0RXZlbnRzUmVxdWVzdBIwCgZmaWx0ZXIYASABKAsyFi50aHJ1LmNvbW1vbi52MS5GaWx0ZXJCA+BBAUgAiAEBEjMKBHBhZ2UYAiABKAsyGy50aHJ1LmNvbW1vbi52MS5QYWdlUmVxdWVzdEID4EEBSAGIAQESQQoPdmVyc2lvbl9jb250ZXh0GAMgASgLMh4udGhydS5jb21tb24udjEuVmVyc2lvbkNvbnRleHRCA+BBAUgCiAEBEkAKDW1pbl9jb25zZW5zdXMYBCABKA4yHy50aHJ1LmNvbW1vbi52MS5Db25zZW5zdXNTdGF0dXNCA+BBAUgDiAEBQgkKB19maWx0ZXJCBwoFX3BhZ2VCEgoQX3ZlcnNpb25fY29udGV4dEIQCg5fbWluX2NvbnNlbnN1cyKBAQoSTGlzdEV2ZW50c1Jlc3BvbnNlEiwKBmV2ZW50cxgBIAMoCzIXLnRocnUuc2VydmljZXMudjEuRXZlbnRCA+BBARI0CgRwYWdlGAIgASgLMhwudGhydS5jb21tb24udjEuUGFnZVJlc3BvbnNlQgPgQQFIAIgBAUIHCgVfcGFnZSLyAgoXTGlzdFRyYW5zYWN0aW9uc1JlcXVlc3QSMAoGZmlsdGVyGAEgASgLMhYudGhydS5jb21tb24udjEuRmlsdGVyQgPgQQFIAIgBARIzCgRwYWdlGAIgASgLMhsudGhydS5jb21tb24udjEuUGFnZVJlcXVlc3RCA+BBAUgBiAEBEh8KDXJldHVybl9ldmVudHMYAyABKAhCA+BBAUgCiAEBEkEKD3ZlcnNpb25fY29udGV4dBgEIAEoCzIeLnRocnUuY29tbW9uLnYxLlZlcnNpb25Db250ZXh0QgPgQQFIA4gBARJACg1taW5fY29uc2Vuc3VzGAUgASgOMh8udGhydS5jb21tb24udjEuQ29uc2Vuc3VzU3RhdHVzQgPgQQFIBIgBAUIJCgdfZmlsdGVyQgcKBV9wYWdlQhAKDl9yZXR1cm5fZXZlbnRzQhIKEF92ZXJzaW9uX2NvbnRleHRCEAoOX21pbl9jb25zZW5zdXMijwEKGExpc3RUcmFuc2FjdGlvbnNSZXNwb25zZRI0Cgx0cmFuc2FjdGlvbnMYASADKAsyGS50aHJ1LmNvcmUudjEuVHJhbnNhY3Rpb25CA+BBARI0CgRwYWdlGAIgASgLMhwudGhydS5jb21tb24udjEuUGFnZVJlc3BvbnNlQgPgQQFIAIgBAUIHCgVfcGFnZSJQChtHZXRUcmFuc2FjdGlvblN0YXR1c1JlcXVlc3QSMQoJc2lnbmF0dXJlGAEgASgLMhkudGhydS5jb21tb24udjEuU2lnbmF0dXJlQgPgQQIigwIKEVRyYW5zYWN0aW9uU3RhdHVzEjEKCXNpZ25hdHVyZRgBIAEoCzIZLnRocnUuY29tbW9uLnYxLlNpZ25hdHVyZUID4EECEkMKEGNvbnNlbnN1c19zdGF0dXMYAiABKA4yHy50aHJ1LmNvbW1vbi52MS5Db25zZW5zdXNTdGF0dXNCA+BBAUgAiAEBEkwKEGV4ZWN1dGlvbl9yZXN1bHQYAyABKAsyKC50aHJ1LmNvcmUudjEuVHJhbnNhY3Rpb25FeGVjdXRpb25SZXN1bHRCA+BBAUgBiAEBQhMKEV9jb25zZW5zdXNfc3RhdHVzQhMKEV9leGVjdXRpb25fcmVzdWx0IhIKEEdldEhlaWdodFJlcXVlc3QiaQoRR2V0SGVpZ2h0UmVzcG9uc2USFgoJZmluYWxpemVkGAEgASgEQgPgQQISHQoQbG9jYWxseV9leGVjdXRlZBgCIAEoBEID4EECEh0KEGNsdXN0ZXJfZXhlY3V0ZWQYAyABKARCA+BBAiIVChNHZXRDaGFpbkluZm9SZXF1ZXN0IkkKFEdldENoYWluSW5mb1Jlc3BvbnNlEhUKCGNoYWluX2lkGAEgASgNQgPgQQISGgoNbWluX2xvY2tfdGltZRgCIAEoBEID4EEBIjcKFEdldFN0YXRlUm9vdHNSZXF1ZXN0EhYKBHNsb3QYASABKARCA+BBAUgAiAEBQgcKBV9zbG90IjwKDlN0YXRlUm9vdEVudHJ5EhEKBHNsb3QYASABKARCA+BBAhIXCgpzdGF0ZV9yb290GAIgASgMQgPgQQIiUwoVR2V0U3RhdGVSb290c1Jlc3BvbnNlEjoKC3N0YXRlX3Jvb3RzGAEgAygLMiAudGhydS5zZXJ2aWNlcy52MS5TdGF0ZVJvb3RFbnRyeUID4EECInMKG0dldEFjdGl2ZVN0YXRlSGFzaGVzUmVxdWVzdBIaCghlbmRfc2xvdBgBIAEoBEID4EEBSACIAQESHAoKc3RhcnRfc2xvdBgCIAEoBEID4EEBSAGIAQFCCwoJX2VuZF9zbG90Qg0KC19zdGFydF9zbG90IkkKFEFjdGl2ZVN0YXRlSGFzaEVudHJ5EhEKBHNsb3QYASABKARCA+BBAhIeChFhY3RpdmVfc3RhdGVfaGFzaBgCIAEoDEID4EECImgKHEdldEFjdGl2ZVN0YXRlSGFzaGVzUmVzcG9uc2USSAoTYWN0aXZlX3N0YXRlX2hhc2hlcxgBIAMoCzImLnRocnUuc2VydmljZXMudjEuQWN0aXZlU3RhdGVIYXNoRW50cnlCA+BBAiIqChVHZXRTbG90TWV0cmljc1JlcXVlc3QSEQoEc2xvdBgBIAEoBEID4EECIvcBChZHZXRTbG90TWV0cmljc1Jlc3BvbnNlEhEKBHNsb3QYASABKARCA+BBAhIrCh5nbG9iYWxfYWN0aXZhdGVkX3N0YXRlX2NvdW50ZXIYAiABKARCA+BBAhItCiBnbG9iYWxfZGVhY3RpdmF0ZWRfc3RhdGVfY291bnRlchgDIAEoBEID4EECEhsKDmNvbGxlY3RlZF9mZWVzGAQgASgEQgPgQQISPQoPYmxvY2tfdGltZXN0YW1wGAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEBSACIAQFCEgoQX2Jsb2NrX3RpbWVzdGFtcCJ9ChZMaXN0U2xvdE1ldHJpY3NSZXF1ZXN0EhcKCnN0YXJ0X3Nsb3QYASABKARCA+BBAhIaCghlbmRfc2xvdBgCIAEoBEID4EEBSACIAQESFwoFbGltaXQYAyABKA1CA+BBAUgBiAEBQgsKCV9lbmRfc2xvdEIICgZfbGltaXQiWQoXTGlzdFNsb3RNZXRyaWNzUmVzcG9uc2USPgoHbWV0cmljcxgBIAMoCzIoLnRocnUuc2VydmljZXMudjEuR2V0U2xvdE1ldHJpY3NSZXNwb25zZUID4EECIhYKFEdldE5vZGVQdWJrZXlSZXF1ZXN0IkQKFUdldE5vZGVQdWJrZXlSZXNwb25zZRIrCgZwdWJrZXkYASABKAsyFi50aHJ1LmNvbW1vbi52MS5QdWJrZXlCA+BBAiIXChVHZXROb2RlUmVjb3Jkc1JlcXVlc3QiSAoWR2V0Tm9kZVJlY29yZHNSZXNwb25zZRIuCgdyZWNvcmRzGAEgAygLMhgudGhydS5jb3JlLnYxLk5vZGVSZWNvcmRCA+BBASIWChRHZXROb2RlU3RhdHVzUmVxdWVzdCLLAQoVR2V0Tm9kZVN0YXR1c1Jlc3BvbnNlEg0KBXJlYWR5GAEgASgIEjgKCWNvbnNlbnN1cxgCIAEoCzIlLnRocnUuc2VydmljZXMudjEuTm9kZUNvbnNlbnN1c1N0YXR1cxIyCgZyZXBhaXIYAyABKAsyIi50aHJ1LnNlcnZpY2VzLnYxLk5vZGVSZXBhaXJTdGF0dXMSFgoOZmluYWxpemVkX3Nsb3QYBCABKAQSHQoVbG9jYWxseV9leGVjdXRlZF9zbG90GAUgASgEImEKE05vZGVDb25zZW5zdXNTdGF0dXMSDgoGYWN0aXZlGAEgASgIEigKBG1vZGUYAiABKA4yGi50aHJ1LnNlcnZpY2VzLnYxLk5vZGVNb2RlEhAKCGZyb250aWVyGAMgASgEIiIKEE5vZGVSZXBhaXJTdGF0dXMSDgoGYWN0aXZlGAEgASgIKlQKCE5vZGVNb2RlEhUKEU5PREVfTU9ERV9VTktOT1dOEAASFQoRTk9ERV9NT0RFX1JFR1VMQVIQARIaChZOT0RFX01PREVfQ0FUQVNUUk9QSElDEAIypxkKDFF1ZXJ5U2VydmljZRJoCglHZXRIZWlnaHQSIi50aHJ1LnNlcnZpY2VzLnYxLkdldEhlaWdodFJlcXVlc3QaIy50aHJ1LnNlcnZpY2VzLnYxLkdldEhlaWdodFJlc3BvbnNlIhKC0+STAgwSCi92MS9oZWlnaHQSdQoMR2V0Q2hhaW5JbmZvEiUudGhydS5zZXJ2aWNlcy52MS5HZXRDaGFpbkluZm9SZXF1ZXN0GiYudGhydS5zZXJ2aWNlcy52MS5HZXRDaGFpbkluZm9SZXNwb25zZSIWgtPkkwIQEg4vdjEvY2hhaW4taW5mbxJ4CgpHZXRBY2NvdW50EiMudGhydS5zZXJ2aWNlcy52MS5HZXRBY2NvdW50UmVxdWVzdBoVLnRocnUuY29yZS52MS5BY2NvdW50Ii7aQQdhZGRyZXNzgtPkkwIeEhwvdjEvYWNjb3VudHMve2FkZHJlc3MudmFsdWV9EoUBCg1HZXRSYXdBY2NvdW50EiYudGhydS5zZXJ2aWNlcy52MS5HZXRSYXdBY2NvdW50UmVxdWVzdBoYLnRocnUuY29yZS52MS5SYXdBY2NvdW50IjLaQQdhZGRyZXNzgtPkkwIiEiAvdjEvYWNjb3VudHMve2FkZHJlc3MudmFsdWV9OnJhdxKMAQoOR2V0VHJhbnNhY3Rpb24SJy50aHJ1LnNlcnZpY2VzLnYxLkdldFRyYW5zYWN0aW9uUmVxdWVzdBoZLnRocnUuY29yZS52MS5UcmFuc2FjdGlvbiI22kEJc2lnbmF0dXJlgtPkkwIkEiIvdjEvdHJhbnNhY3Rpb25zL3tzaWduYXR1cmUudmFsdWV9EpkBChFHZXRSYXdUcmFuc2FjdGlvbhIqLnRocnUuc2VydmljZXMudjEuR2V0UmF3VHJhbnNhY3Rpb25SZXF1ZXN0GhwudGhydS5jb3JlLnYxLlJhd1RyYW5zYWN0aW9uIjraQQlzaWduYXR1cmWC0+STAigSJi92MS90cmFuc2FjdGlvbnMve3NpZ25hdHVyZS52YWx1ZX06cmF3EoYBCghHZXRCbG9jaxIhLnRocnUuc2VydmljZXMudjEuR2V0QmxvY2tSZXF1ZXN0GhMudGhydS5jb3JlLnYxLkJsb2NrIkKC0+STAjxaJxIlL3YxL2Jsb2Nrcy9ieS1oYXNoL3tibG9ja19oYXNoLnZhbHVlfRIRL3YxL2Jsb2Nrcy97c2xvdH0SlwEKC0dldFJhd0Jsb2NrEiQudGhydS5zZXJ2aWNlcy52MS5HZXRSYXdCbG9ja1JlcXVlc3QaFi50aHJ1LmNvcmUudjEuUmF3QmxvY2siSoLT5JMCRForEikvdjEvYmxvY2tzL2J5LWhhc2gve2Jsb2NrX2hhc2gudmFsdWV9OnJhdxIVL3YxL2Jsb2Nrcy97c2xvdH06cmF3EnMKDExpc3RBY2NvdW50cxIlLnRocnUuc2VydmljZXMudjEuTGlzdEFjY291bnRzUmVxdWVzdBomLnRocnUuc2VydmljZXMudjEuTGlzdEFjY291bnRzUmVzcG9uc2UiFILT5JMCDhIML3YxL2FjY291bnRzEmsKCkxpc3RCbG9ja3MSIy50aHJ1LnNlcnZpY2VzLnYxLkxpc3RCbG9ja3NSZXF1ZXN0GiQudGhydS5zZXJ2aWNlcy52MS5MaXN0QmxvY2tzUmVzcG9uc2UiEoLT5JMCDBIKL3YxL2Jsb2NrcxLEAQoaTGlzdFRyYW5zYWN0aW9uc0ZvckFjY291bnQSMy50aHJ1LnNlcnZpY2VzLnYxLkxpc3RUcmFuc2FjdGlvbnNGb3JBY2NvdW50UmVxdWVzdBo0LnRocnUuc2VydmljZXMudjEuTGlzdFRyYW5zYWN0aW9uc0ZvckFjY291bnRSZXNwb25zZSI72kEHYWNjb3VudILT5JMCKxIpL3YxL2FjY291bnRzL3thY2NvdW50LnZhbHVlfS90cmFuc2FjdGlvbnMScAoIR2V0RXZlbnQSIS50aHJ1LnNlcnZpY2VzLnYxLkdldEV2ZW50UmVxdWVzdBoXLnRocnUuc2VydmljZXMudjEuRXZlbnQiKNpBCGV2ZW50X2lkgtPkkwIXEhUvdjEvZXZlbnRzL3tldmVudF9pZH0SawoKTGlzdEV2ZW50cxIjLnRocnUuc2VydmljZXMudjEuTGlzdEV2ZW50c1JlcXVlc3QaJC50aHJ1LnNlcnZpY2VzLnYxLkxpc3RFdmVudHNSZXNwb25zZSISgtPkkwIMEgovdjEvZXZlbnRzEoMBChBMaXN0VHJhbnNhY3Rpb25zEikudGhydS5zZXJ2aWNlcy52MS5MaXN0VHJhbnNhY3Rpb25zUmVxdWVzdBoqLnRocnUuc2VydmljZXMudjEuTGlzdFRyYW5zYWN0aW9uc1Jlc3BvbnNlIhiC0+STAhISEC92MS90cmFuc2FjdGlvbnMSqQEKFEdldFRyYW5zYWN0aW9uU3RhdHVzEi0udGhydS5zZXJ2aWNlcy52MS5HZXRUcmFuc2FjdGlvblN0YXR1c1JlcXVlc3QaIy50aHJ1LnNlcnZpY2VzLnYxLlRyYW5zYWN0aW9uU3RhdHVzIj3aQQlzaWduYXR1cmWC0+STAisSKS92MS90cmFuc2FjdGlvbnMve3NpZ25hdHVyZS52YWx1ZX06c3RhdHVzEpQBChJHZW5lcmF0ZVN0YXRlUHJvb2YSKy50aHJ1LnNlcnZpY2VzLnYxLkdlbmVyYXRlU3RhdGVQcm9vZlJlcXVlc3QaLC50aHJ1LnNlcnZpY2VzLnYxLkdlbmVyYXRlU3RhdGVQcm9vZlJlc3BvbnNlIiOC0+STAh06ASoiGC92MS9zdGF0ZXByb29mczpnZW5lcmF0ZRJsCgpHZXRWZXJzaW9uEiMudGhydS5zZXJ2aWNlcy52MS5HZXRWZXJzaW9uUmVxdWVzdBokLnRocnUuc2VydmljZXMudjEuR2V0VmVyc2lvblJlc3BvbnNlIhOC0+STAg0SCy92MS92ZXJzaW9uEngKDUdldFN0YXRlUm9vdHMSJi50aHJ1LnNlcnZpY2VzLnYxLkdldFN0YXRlUm9vdHNSZXF1ZXN0GicudGhydS5zZXJ2aWNlcy52MS5HZXRTdGF0ZVJvb3RzUmVzcG9uc2UiFoLT5JMCEBIOL3YxL3N0YXRlcm9vdHMSlgEKFEdldEFjdGl2ZVN0YXRlSGFzaGVzEi0udGhydS5zZXJ2aWNlcy52MS5HZXRBY3RpdmVTdGF0ZUhhc2hlc1JlcXVlc3QaLi50aHJ1LnNlcnZpY2VzLnYxLkdldEFjdGl2ZVN0YXRlSGFzaGVzUmVzcG9uc2UiH4LT5JMCGRIXL3YxL2FjdGl2ZS1zdGF0ZS1oYXNoZXMShQEKDkdldFNsb3RNZXRyaWNzEicudGhydS5zZXJ2aWNlcy52MS5HZXRTbG90TWV0cmljc1JlcXVlc3QaKC50aHJ1LnNlcnZpY2VzLnYxLkdldFNsb3RNZXRyaWNzUmVzcG9uc2UiIILT5JMCGhIYL3YxL3Nsb3RzL3tzbG90fS9tZXRyaWNzEoEBCg9MaXN0U2xvdE1ldHJpY3MSKC50aHJ1LnNlcnZpY2VzLnYxLkxpc3RTbG90TWV0cmljc1JlcXVlc3QaKS50aHJ1LnNlcnZpY2VzLnYxLkxpc3RTbG90TWV0cmljc1Jlc3BvbnNlIhmC0+STAhMSES92MS9zbG90cy9tZXRyaWNzEnkKDUdldE5vZGVQdWJrZXkSJi50aHJ1LnNlcnZpY2VzLnYxLkdldE5vZGVQdWJrZXlSZXF1ZXN0GicudGhydS5zZXJ2aWNlcy52MS5HZXROb2RlUHVia2V5UmVzcG9uc2UiF4LT5JMCERIPL3YxL25vZGUvcHVia2V5En0KDkdldE5vZGVSZWNvcmRzEicudGhydS5zZXJ2aWNlcy52MS5HZXROb2RlUmVjb3Jkc1JlcXVlc3QaKC50aHJ1LnNlcnZpY2VzLnYxLkdldE5vZGVSZWNvcmRzUmVzcG9uc2UiGILT5JMCEhIQL3YxL25vZGUvcmVjb3JkcxJ5Cg1HZXROb2RlU3RhdHVzEiYudGhydS5zZXJ2aWNlcy52MS5HZXROb2RlU3RhdHVzUmVxdWVzdBonLnRocnUuc2VydmljZXMudjEuR2V0Tm9kZVN0YXR1c1Jlc3BvbnNlIheC0+STAhESDy92MS9ub2RlL3N0YXR1cxoTykEQYXBpLnRocnUubmV0d29ya0LcAQoUY29tLnRocnUuc2VydmljZXMudjFCEVF1ZXJ5U2VydmljZVByb3RvUAFaSGdpdGh1Yi5jb20vVW50by1MYWJzL3RocnUtbmV0L2dycGMvcGtnL3Byb3RvL3RocnUvc2VydmljZXMvdjE7c2VydmljZXN2MaICA1RTWKoCEFRocnUuU2VydmljZXMuVjG6AgRUSFVTygIQVGhydVxTZXJ2aWNlc1xWMeICHFRocnVcU2VydmljZXNcVjFcR1BCTWV0YWRhdGHqAhJUaHJ1OjpTZXJ2aWNlczo6VjFiBnByb3RvMw", [file_buf_validate_validate, file_google_api_annotations, file_google_api_client, file_google_api_field_behavior, wkt.file_google_protobuf_timestamp, file_thru_common_v1_consensus, file_thru_common_v1_filters, file_thru_common_v1_pagination, file_thru_common_v1_primitives, file_thru_core_v1_account, file_thru_core_v1_block, file_thru_core_v1_state, file_thru_core_v1_transaction, file_thru_core_v1_types, file_thru_core_v1_node]);
|
|
321
|
+
var GetAccountRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_services_v1_query_service, 0);
|
|
322
|
+
var GetRawAccountRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_services_v1_query_service, 1);
|
|
323
|
+
var GetTransactionRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_services_v1_query_service, 2);
|
|
324
|
+
var GetRawTransactionRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_services_v1_query_service, 3);
|
|
325
|
+
var GenerateStateProofRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_services_v1_query_service, 4);
|
|
326
|
+
var GetBlockRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_services_v1_query_service, 6);
|
|
327
|
+
var GetRawBlockRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_services_v1_query_service, 7);
|
|
328
|
+
var ListAccountsRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_services_v1_query_service, 8);
|
|
329
|
+
var ListBlocksRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_services_v1_query_service, 10);
|
|
330
|
+
var ListTransactionsForAccountRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_services_v1_query_service, 12);
|
|
331
|
+
var GetVersionRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_services_v1_query_service, 14);
|
|
332
|
+
var GetEventRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_services_v1_query_service, 16);
|
|
333
|
+
var ListEventsRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_services_v1_query_service, 18);
|
|
334
|
+
var ListTransactionsRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_services_v1_query_service, 20);
|
|
335
|
+
var GetTransactionStatusRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_services_v1_query_service, 22);
|
|
336
|
+
var GetHeightRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_services_v1_query_service, 24);
|
|
337
|
+
var GetChainInfoRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_services_v1_query_service, 26);
|
|
338
|
+
var GetStateRootsRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_services_v1_query_service, 28);
|
|
339
|
+
var GetSlotMetricsRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_services_v1_query_service, 34);
|
|
340
|
+
var ListSlotMetricsRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_services_v1_query_service, 36);
|
|
341
|
+
var GetNodePubkeyRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_services_v1_query_service, 38);
|
|
342
|
+
var GetNodeRecordsRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_services_v1_query_service, 40);
|
|
343
|
+
var GetNodeStatusRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_services_v1_query_service, 42);
|
|
344
|
+
var QueryService = /* @__PURE__ */ codegenv2.serviceDesc(file_thru_services_v1_query_service, 0);
|
|
345
|
+
var file_thru_services_v1_streaming_service = /* @__PURE__ */ codegenv2.fileDesc("Cih0aHJ1L3NlcnZpY2VzL3YxL3N0cmVhbWluZ19zZXJ2aWNlLnByb3RvEhB0aHJ1LnNlcnZpY2VzLnYxIo0CChNTdHJlYW1CbG9ja3NSZXF1ZXN0EhwKCnN0YXJ0X3Nsb3QYASABKARCA+BBAUgAiAEBEjAKBmZpbHRlchgCIAEoCzIWLnRocnUuY29tbW9uLnYxLkZpbHRlckID4EEBSAGIAQESLwoEdmlldxgDIAEoDjIXLnRocnUuY29yZS52MS5CbG9ja1ZpZXdCA+BBAUgCiAEBEkAKDW1pbl9jb25zZW5zdXMYBCABKA4yHy50aHJ1LmNvbW1vbi52MS5Db25zZW5zdXNTdGF0dXNCA+BBAUgDiAEBQg0KC19zdGFydF9zbG90QgkKB19maWx0ZXJCBwoFX3ZpZXdCEAoOX21pbl9jb25zZW5zdXMiPwoUU3RyZWFtQmxvY2tzUmVzcG9uc2USJwoFYmxvY2sYASABKAsyEy50aHJ1LmNvcmUudjEuQmxvY2tCA+BBAiKcAQobU3RyZWFtQWNjb3VudFVwZGF0ZXNSZXF1ZXN0EjEKBHZpZXcYAiABKA4yGS50aHJ1LmNvcmUudjEuQWNjb3VudFZpZXdCA+BBAUgAiAEBEjAKBmZpbHRlchgEIAEoCzIWLnRocnUuY29tbW9uLnYxLkZpbHRlckID4EEBSAGIAQFCBwoFX3ZpZXdCCQoHX2ZpbHRlckoECAEQAiLtAQoNQWNjb3VudFVwZGF0ZRIRCgRzbG90GAEgASgEQgPgQQISMQoEcGFnZRgCIAEoCzIZLnRocnUuY29yZS52MS5BY2NvdW50UGFnZUID4EEBSACIAQESMQoEbWV0YRgDIAEoCzIZLnRocnUuY29yZS52MS5BY2NvdW50TWV0YUID4EEBSAGIAQESGAoGZGVsZXRlGAQgASgIQgPgQQFIAogBARIsCgdhZGRyZXNzGAUgASgLMhYudGhydS5jb21tb24udjEuUHVia2V5QgPgQQJCBwoFX3BhZ2VCBwoFX21ldGFCCQoHX2RlbGV0ZSKbAQoNQmxvY2tGaW5pc2hlZBIRCgRzbG90GAEgASgEQgPgQQISKwoeZ2xvYmFsX2FjdGl2YXRlZF9zdGF0ZV9jb3VudGVyGAIgASgEQgPgQQISLQogZ2xvYmFsX2RlYWN0aXZhdGVkX3N0YXRlX2NvdW50ZXIYAyABKARCA+BBAhIbCg5jb2xsZWN0ZWRfZmVlcxgEIAEoBEID4EECIrwBChxTdHJlYW1BY2NvdW50VXBkYXRlc1Jlc3BvbnNlEikKCHNuYXBzaG90GAEgASgLMhUudGhydS5jb3JlLnYxLkFjY291bnRIABIxCgZ1cGRhdGUYAiABKAsyHy50aHJ1LnNlcnZpY2VzLnYxLkFjY291bnRVcGRhdGVIABIzCghmaW5pc2hlZBgDIAEoCzIfLnRocnUuc2VydmljZXMudjEuQmxvY2tGaW5pc2hlZEgAQgkKB21lc3NhZ2UirAEKGVN0cmVhbVRyYW5zYWN0aW9uc1JlcXVlc3QSMAoGZmlsdGVyGAEgASgLMhYudGhydS5jb21tb24udjEuRmlsdGVyQgPgQQFIAIgBARJACg1taW5fY29uc2Vuc3VzGAIgASgOMh8udGhydS5jb21tb24udjEuQ29uc2Vuc3VzU3RhdHVzQgPgQQFIAYgBAUIJCgdfZmlsdGVyQhAKDl9taW5fY29uc2Vuc3VzIlEKGlN0cmVhbVRyYW5zYWN0aW9uc1Jlc3BvbnNlEjMKC3RyYW5zYWN0aW9uGAEgASgLMhkudGhydS5jb3JlLnYxLlRyYW5zYWN0aW9uQgPgQQIiUgoTU3RyZWFtRXZlbnRzUmVxdWVzdBIwCgZmaWx0ZXIYASABKAsyFi50aHJ1LmNvbW1vbi52MS5GaWx0ZXJCA+BBAUgAiAEBQgkKB19maWx0ZXIipgIKFFN0cmVhbUV2ZW50c1Jlc3BvbnNlEhUKCGV2ZW50X2lkGAEgASgJQgPgQQISGQoHcGF5bG9hZBgCIAEoDEID4EEBSACIAQESNwoJdGltZXN0YW1wGAMgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEBSAGIAQESLAoHcHJvZ3JhbRgEIAEoCzIWLnRocnUuY29tbW9uLnYxLlB1YmtleUID4EECEhUKCGNhbGxfaWR4GAUgASgNQgPgQQISMQoJc2lnbmF0dXJlGAYgASgLMhkudGhydS5jb21tb24udjEuU2lnbmF0dXJlQgPgQQISEQoEc2xvdBgHIAEoBEID4EECQgoKCF9wYXlsb2FkQgwKCl90aW1lc3RhbXAijgEKF1RyYWNrVHJhbnNhY3Rpb25SZXF1ZXN0EjEKCXNpZ25hdHVyZRgBIAEoCzIZLnRocnUuY29tbW9uLnYxLlNpZ25hdHVyZUID4EECEjQKB3RpbWVvdXQYAiABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CA+BBAUgAiAEBQgoKCF90aW1lb3V0IukBChhUcmFja1RyYW5zYWN0aW9uUmVzcG9uc2USMQoJc2lnbmF0dXJlGAEgASgLMhkudGhydS5jb21tb24udjEuU2lnbmF0dXJlQgPgQQISPgoQY29uc2Vuc3VzX3N0YXR1cxgCIAEoDjIfLnRocnUuY29tbW9uLnYxLkNvbnNlbnN1c1N0YXR1c0ID4EEBEkcKEGV4ZWN1dGlvbl9yZXN1bHQYAyABKAsyKC50aHJ1LmNvcmUudjEuVHJhbnNhY3Rpb25FeGVjdXRpb25SZXN1bHRCA+BBARIRCgRzbG90GAQgASgEQgPgQQEiRwoYU3RyZWFtU2xvdE1ldHJpY3NSZXF1ZXN0EhwKCnN0YXJ0X3Nsb3QYASABKARCA+BBAUgAiAEBQg0KC19zdGFydF9zbG90IuEBChlTdHJlYW1TbG90TWV0cmljc1Jlc3BvbnNlEhEKBHNsb3QYASABKARCA+BBAhIrCh5nbG9iYWxfYWN0aXZhdGVkX3N0YXRlX2NvdW50ZXIYAiABKARCA+BBAhItCiBnbG9iYWxfZGVhY3RpdmF0ZWRfc3RhdGVfY291bnRlchgDIAEoBEID4EECEhsKDmNvbGxlY3RlZF9mZWVzGAQgASgEQgPgQQISOAoPYmxvY2tfdGltZXN0YW1wGAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EECIhUKE1N0cmVhbUhlaWdodFJlcXVlc3QibAoUU3RyZWFtSGVpZ2h0UmVzcG9uc2USFgoJZmluYWxpemVkGAEgASgEQgPgQQISHQoQbG9jYWxseV9leGVjdXRlZBgCIAEoBEID4EECEh0KEGNsdXN0ZXJfZXhlY3V0ZWQYAyABKARCA+BBAiIaChhTdHJlYW1Ob2RlUmVjb3Jkc1JlcXVlc3QiZgoZU3RyZWFtTm9kZVJlY29yZHNSZXNwb25zZRIqCgZyZWNvcmQYASABKAsyGC50aHJ1LmNvcmUudjEuTm9kZVJlY29yZEgAEhIKCGZpbmlzaGVkGAIgASgISABCCQoHbWVzc2FnZTLuBgoQU3RyZWFtaW5nU2VydmljZRJfCgxTdHJlYW1CbG9ja3MSJS50aHJ1LnNlcnZpY2VzLnYxLlN0cmVhbUJsb2Nrc1JlcXVlc3QaJi50aHJ1LnNlcnZpY2VzLnYxLlN0cmVhbUJsb2Nrc1Jlc3BvbnNlMAESdwoUU3RyZWFtQWNjb3VudFVwZGF0ZXMSLS50aHJ1LnNlcnZpY2VzLnYxLlN0cmVhbUFjY291bnRVcGRhdGVzUmVxdWVzdBouLnRocnUuc2VydmljZXMudjEuU3RyZWFtQWNjb3VudFVwZGF0ZXNSZXNwb25zZTABEnEKElN0cmVhbVRyYW5zYWN0aW9ucxIrLnRocnUuc2VydmljZXMudjEuU3RyZWFtVHJhbnNhY3Rpb25zUmVxdWVzdBosLnRocnUuc2VydmljZXMudjEuU3RyZWFtVHJhbnNhY3Rpb25zUmVzcG9uc2UwARJfCgxTdHJlYW1FdmVudHMSJS50aHJ1LnNlcnZpY2VzLnYxLlN0cmVhbUV2ZW50c1JlcXVlc3QaJi50aHJ1LnNlcnZpY2VzLnYxLlN0cmVhbUV2ZW50c1Jlc3BvbnNlMAESawoQVHJhY2tUcmFuc2FjdGlvbhIpLnRocnUuc2VydmljZXMudjEuVHJhY2tUcmFuc2FjdGlvblJlcXVlc3QaKi50aHJ1LnNlcnZpY2VzLnYxLlRyYWNrVHJhbnNhY3Rpb25SZXNwb25zZTABEl8KDFN0cmVhbUhlaWdodBIlLnRocnUuc2VydmljZXMudjEuU3RyZWFtSGVpZ2h0UmVxdWVzdBomLnRocnUuc2VydmljZXMudjEuU3RyZWFtSGVpZ2h0UmVzcG9uc2UwARJuChFTdHJlYW1TbG90TWV0cmljcxIqLnRocnUuc2VydmljZXMudjEuU3RyZWFtU2xvdE1ldHJpY3NSZXF1ZXN0GisudGhydS5zZXJ2aWNlcy52MS5TdHJlYW1TbG90TWV0cmljc1Jlc3BvbnNlMAESbgoRU3RyZWFtTm9kZVJlY29yZHMSKi50aHJ1LnNlcnZpY2VzLnYxLlN0cmVhbU5vZGVSZWNvcmRzUmVxdWVzdBorLnRocnUuc2VydmljZXMudjEuU3RyZWFtTm9kZVJlY29yZHNSZXNwb25zZTABQuABChRjb20udGhydS5zZXJ2aWNlcy52MUIVU3RyZWFtaW5nU2VydmljZVByb3RvUAFaSGdpdGh1Yi5jb20vVW50by1MYWJzL3RocnUtbmV0L2dycGMvcGtnL3Byb3RvL3RocnUvc2VydmljZXMvdjE7c2VydmljZXN2MaICA1RTWKoCEFRocnUuU2VydmljZXMuVjG6AgRUSFVTygIQVGhydVxTZXJ2aWNlc1xWMeICHFRocnVcU2VydmljZXNcVjFcR1BCTWV0YWRhdGHqAhJUaHJ1OjpTZXJ2aWNlczo6VjFiBnByb3RvMw", [file_buf_validate_validate, file_google_api_field_behavior, file_thru_common_v1_primitives, wkt.file_google_protobuf_duration, wkt.file_google_protobuf_timestamp, file_thru_common_v1_consensus, file_thru_common_v1_filters, file_thru_core_v1_account, file_thru_core_v1_block, file_thru_core_v1_transaction, file_thru_core_v1_types, file_thru_core_v1_node]);
|
|
346
|
+
var StreamBlocksRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_services_v1_streaming_service, 0);
|
|
347
|
+
var StreamAccountUpdatesRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_services_v1_streaming_service, 2);
|
|
348
|
+
var StreamTransactionsRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_services_v1_streaming_service, 6);
|
|
349
|
+
var StreamEventsRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_services_v1_streaming_service, 8);
|
|
350
|
+
var TrackTransactionRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_services_v1_streaming_service, 10);
|
|
351
|
+
var StreamSlotMetricsRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_services_v1_streaming_service, 12);
|
|
352
|
+
var StreamHeightRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_services_v1_streaming_service, 14);
|
|
353
|
+
var StreamNodeRecordsRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_thru_services_v1_streaming_service, 16);
|
|
354
|
+
var StreamingService = /* @__PURE__ */ codegenv2.serviceDesc(file_thru_services_v1_streaming_service, 0);
|
|
355
|
+
|
|
356
|
+
// thru-ts-client-sdk/domain/primitives/byte-utils.ts
|
|
357
|
+
function copyBytes(source) {
|
|
358
|
+
const bytes = new Uint8Array(source.length);
|
|
359
|
+
bytes.set(source);
|
|
360
|
+
return bytes;
|
|
361
|
+
}
|
|
362
|
+
function ensureExactLength(bytes, expected) {
|
|
363
|
+
if (bytes.length !== expected) {
|
|
364
|
+
throw new Error(`Must contain ${expected} bytes`);
|
|
365
|
+
}
|
|
366
|
+
return copyBytes(bytes);
|
|
367
|
+
}
|
|
368
|
+
function bytesEqual(a, b) {
|
|
369
|
+
if (a.length !== b.length) {
|
|
370
|
+
return false;
|
|
371
|
+
}
|
|
372
|
+
for (let i = 0; i < a.length; i++) {
|
|
373
|
+
if (a[i] !== b[i]) {
|
|
374
|
+
return false;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
return true;
|
|
378
|
+
}
|
|
379
|
+
function bytesToHex(bytes) {
|
|
380
|
+
const hex = new Array(bytes.length);
|
|
381
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
382
|
+
hex[i] = bytes[i].toString(16).padStart(2, "0");
|
|
383
|
+
}
|
|
384
|
+
return hex.join("");
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
// thru-ts-client-sdk/domain/primitives/constants.ts
|
|
388
|
+
var PUBKEY_LENGTH = 32;
|
|
389
|
+
var SIGNATURE_LENGTH = 64;
|
|
390
|
+
var TA_ADDRESS_LENGTH = 46;
|
|
391
|
+
var TS_SIGNATURE_LENGTH = 90;
|
|
392
|
+
|
|
393
|
+
// thru-ts-client-sdk/domain/primitives/Pubkey.ts
|
|
394
|
+
var Pubkey = class _Pubkey {
|
|
395
|
+
constructor(bytes) {
|
|
396
|
+
this.bytes = bytes;
|
|
397
|
+
}
|
|
398
|
+
static from(value) {
|
|
399
|
+
if (value instanceof _Pubkey) {
|
|
400
|
+
return value;
|
|
401
|
+
}
|
|
402
|
+
if (value instanceof Uint8Array) {
|
|
403
|
+
return new _Pubkey(ensureExactLength(value, PUBKEY_LENGTH));
|
|
404
|
+
}
|
|
405
|
+
if (typeof value === "string") {
|
|
406
|
+
return new _Pubkey(_Pubkey.bytesFromString(value));
|
|
407
|
+
}
|
|
408
|
+
throw new Error(
|
|
409
|
+
`Must be provided as Uint8Array, hex string, or ta-address`
|
|
410
|
+
);
|
|
411
|
+
}
|
|
412
|
+
static isThruFmt(value) {
|
|
413
|
+
return value.startsWith("ta") && value.length === TA_ADDRESS_LENGTH;
|
|
414
|
+
}
|
|
415
|
+
toBytes() {
|
|
416
|
+
return copyBytes(this.bytes);
|
|
417
|
+
}
|
|
418
|
+
toBytesUnsafe() {
|
|
419
|
+
return this.bytes;
|
|
420
|
+
}
|
|
421
|
+
toThruFmt() {
|
|
422
|
+
return encodeAddress(this.bytes);
|
|
423
|
+
}
|
|
424
|
+
toHex() {
|
|
425
|
+
return bytesToHex(this.bytes);
|
|
426
|
+
}
|
|
427
|
+
equals(other) {
|
|
428
|
+
const candidate = _Pubkey.from(other);
|
|
429
|
+
return bytesEqual(this.bytes, candidate.bytes);
|
|
430
|
+
}
|
|
431
|
+
toProtoPubkey() {
|
|
432
|
+
return protobuf.create(PubkeySchema, { value: this.toBytes() });
|
|
433
|
+
}
|
|
434
|
+
toProtoTaPubkey() {
|
|
435
|
+
return protobuf.create(TaPubkeySchema, { value: this.toThruFmt() });
|
|
436
|
+
}
|
|
437
|
+
static fromProtoPubkey(proto) {
|
|
438
|
+
if (!proto?.value) {
|
|
439
|
+
throw new Error(`Proto is missing value`);
|
|
440
|
+
}
|
|
441
|
+
return new _Pubkey(ensureExactLength(proto.value, PUBKEY_LENGTH));
|
|
442
|
+
}
|
|
443
|
+
static fromProtoTaPubkey(proto) {
|
|
444
|
+
if (!proto?.value) {
|
|
445
|
+
throw new Error(`Proto is missing value`);
|
|
446
|
+
}
|
|
447
|
+
return new _Pubkey(ensureExactLength(decodeAddress(proto.value), PUBKEY_LENGTH));
|
|
448
|
+
}
|
|
449
|
+
static bytesFromString(value) {
|
|
450
|
+
if (_Pubkey.isThruFmt(value)) {
|
|
451
|
+
return ensureExactLength(decodeAddress(value), PUBKEY_LENGTH);
|
|
452
|
+
}
|
|
453
|
+
if (isHexString(value)) {
|
|
454
|
+
return ensureExactLength(hexToBytes(value), PUBKEY_LENGTH);
|
|
455
|
+
}
|
|
456
|
+
throw new Error(`Must be provided as hex string or ta-address`);
|
|
457
|
+
}
|
|
458
|
+
};
|
|
459
|
+
var Signature = class _Signature {
|
|
460
|
+
constructor(bytes) {
|
|
461
|
+
this.bytes = bytes;
|
|
462
|
+
}
|
|
463
|
+
static from(value) {
|
|
464
|
+
if (value instanceof _Signature) {
|
|
465
|
+
return value;
|
|
466
|
+
}
|
|
467
|
+
if (value instanceof Uint8Array) {
|
|
468
|
+
return new _Signature(ensureExactLength(value, SIGNATURE_LENGTH));
|
|
469
|
+
}
|
|
470
|
+
if (typeof value === "string") {
|
|
471
|
+
return new _Signature(_Signature.bytesFromString(value));
|
|
472
|
+
}
|
|
473
|
+
throw new Error(
|
|
474
|
+
`Must be provided as Uint8Array, ts-encoded string, hex string, or base64 string`
|
|
475
|
+
);
|
|
476
|
+
}
|
|
477
|
+
static fromProto(proto) {
|
|
478
|
+
if (!proto?.value) {
|
|
479
|
+
throw new Error(`Proto is missing value`);
|
|
480
|
+
}
|
|
481
|
+
return new _Signature(ensureExactLength(proto.value, SIGNATURE_LENGTH));
|
|
482
|
+
}
|
|
483
|
+
static isThruFmt(value) {
|
|
484
|
+
return value.startsWith("ts") && value.length === TS_SIGNATURE_LENGTH;
|
|
485
|
+
}
|
|
486
|
+
toBytes() {
|
|
487
|
+
return copyBytes(this.bytes);
|
|
488
|
+
}
|
|
489
|
+
toBytesUnsafe() {
|
|
490
|
+
return this.bytes;
|
|
491
|
+
}
|
|
492
|
+
toThruFmt() {
|
|
493
|
+
return encodeSignature(this.bytes);
|
|
494
|
+
}
|
|
495
|
+
toHex() {
|
|
496
|
+
return bytesToHex(this.bytes);
|
|
497
|
+
}
|
|
498
|
+
equals(other) {
|
|
499
|
+
const candidate = _Signature.from(other);
|
|
500
|
+
return bytesEqual(this.bytes, candidate.bytes);
|
|
501
|
+
}
|
|
502
|
+
toProtoSignature() {
|
|
503
|
+
return protobuf.create(SignatureSchema, { value: this.toBytes() });
|
|
504
|
+
}
|
|
505
|
+
toProtoTsSignature() {
|
|
506
|
+
return protobuf.create(TsSignatureSchema, { value: this.toThruFmt() });
|
|
507
|
+
}
|
|
508
|
+
static fromProtoTsSignature(proto) {
|
|
509
|
+
if (!proto?.value) {
|
|
510
|
+
throw new Error(`Proto is missing value`);
|
|
511
|
+
}
|
|
512
|
+
return new _Signature(ensureExactLength(decodeSignature(proto.value), SIGNATURE_LENGTH));
|
|
513
|
+
}
|
|
514
|
+
static fromProtoSignature(proto) {
|
|
515
|
+
if (!proto?.value) {
|
|
516
|
+
throw new Error(`Proto is missing value`);
|
|
517
|
+
}
|
|
518
|
+
return new _Signature(ensureExactLength(proto.value, SIGNATURE_LENGTH));
|
|
519
|
+
}
|
|
520
|
+
static bytesFromString(value) {
|
|
521
|
+
if (_Signature.isThruFmt(value)) {
|
|
522
|
+
return ensureExactLength(decodeSignature(value), SIGNATURE_LENGTH);
|
|
523
|
+
}
|
|
524
|
+
if (isHexString(value)) {
|
|
525
|
+
return ensureExactLength(hexToBytes(value), SIGNATURE_LENGTH);
|
|
526
|
+
}
|
|
527
|
+
throw new Error(`Must be provided as ts-encoded string or hex string`);
|
|
528
|
+
}
|
|
529
|
+
};
|
|
530
|
+
var DEFAULT_HOST = "https://grpc-web.alphanet.thruput.org";
|
|
531
|
+
var DEFAULT_ACCOUNT_VIEW = 4 /* FULL */;
|
|
532
|
+
var DEFAULT_BLOCK_VIEW = 4 /* FULL */;
|
|
533
|
+
var DEFAULT_TRANSACTION_VIEW = 4 /* FULL */;
|
|
534
|
+
var DEFAULT_MIN_CONSENSUS = 0 /* UNSPECIFIED */;
|
|
535
|
+
var DEFAULT_VERSION_CONTEXT = protobuf.create(VersionContextSchema, {
|
|
536
|
+
version: {
|
|
537
|
+
case: "current",
|
|
538
|
+
value: protobuf.create(CurrentVersionSchema, {})
|
|
539
|
+
}
|
|
540
|
+
});
|
|
541
|
+
var DEFAULT_FEE = 1n;
|
|
542
|
+
var DEFAULT_COMPUTE_UNITS = 3e8;
|
|
543
|
+
var DEFAULT_STATE_UNITS = 1e4;
|
|
544
|
+
var DEFAULT_MEMORY_UNITS = 1e4;
|
|
545
|
+
var DEFAULT_EXPIRY_AFTER = 100;
|
|
546
|
+
|
|
547
|
+
// thru-ts-client-sdk/core/client.ts
|
|
548
|
+
function createThruClientContext(config = {}) {
|
|
549
|
+
const transportOptions = config.transportOptions ?? {};
|
|
550
|
+
const { baseUrl: optionsBaseUrl, interceptors: optionInterceptors, ...restTransportOptions } = transportOptions;
|
|
551
|
+
const baseUrl = config.baseUrl ?? optionsBaseUrl ?? DEFAULT_HOST;
|
|
552
|
+
const mergedInterceptors = [
|
|
553
|
+
...optionInterceptors ?? [],
|
|
554
|
+
...config.interceptors ?? []
|
|
555
|
+
];
|
|
556
|
+
const transport = config.transport ?? connectWeb.createGrpcWebTransport({
|
|
557
|
+
baseUrl,
|
|
558
|
+
...restTransportOptions,
|
|
559
|
+
interceptors: mergedInterceptors.length > 0 ? mergedInterceptors : void 0
|
|
560
|
+
});
|
|
561
|
+
return {
|
|
562
|
+
baseUrl,
|
|
563
|
+
transport,
|
|
564
|
+
query: connect.createClient(QueryService, transport),
|
|
565
|
+
command: connect.createClient(CommandService, transport),
|
|
566
|
+
streaming: connect.createClient(StreamingService, transport),
|
|
567
|
+
callOptions: config.callOptions
|
|
568
|
+
};
|
|
569
|
+
}
|
|
570
|
+
function withCallOptions(ctx, overrides) {
|
|
571
|
+
return mergeCallOptions(ctx.callOptions, overrides);
|
|
572
|
+
}
|
|
573
|
+
function mergeCallOptions(defaults, overrides) {
|
|
574
|
+
if (!defaults) {
|
|
575
|
+
return overrides;
|
|
576
|
+
}
|
|
577
|
+
if (!overrides) {
|
|
578
|
+
return defaults;
|
|
579
|
+
}
|
|
580
|
+
return {
|
|
581
|
+
...defaults,
|
|
582
|
+
...overrides,
|
|
583
|
+
headers: mergeHeaders(defaults.headers, overrides.headers),
|
|
584
|
+
contextValues: overrides.contextValues ?? defaults.contextValues,
|
|
585
|
+
onHeader: overrides.onHeader ?? defaults.onHeader,
|
|
586
|
+
onTrailer: overrides.onTrailer ?? defaults.onTrailer
|
|
587
|
+
};
|
|
588
|
+
}
|
|
589
|
+
function mergeHeaders(a, b) {
|
|
590
|
+
const entries = [];
|
|
591
|
+
const add = (init) => {
|
|
592
|
+
if (!init) {
|
|
593
|
+
return;
|
|
594
|
+
}
|
|
595
|
+
if (init instanceof Headers) {
|
|
596
|
+
init.forEach((value, key) => {
|
|
597
|
+
entries.push([key, value]);
|
|
598
|
+
});
|
|
599
|
+
return;
|
|
600
|
+
}
|
|
601
|
+
if (Array.isArray(init)) {
|
|
602
|
+
for (const [key, value] of init) {
|
|
603
|
+
entries.push([key, value]);
|
|
604
|
+
}
|
|
605
|
+
return;
|
|
606
|
+
}
|
|
607
|
+
for (const [key, value] of Object.entries(init)) {
|
|
608
|
+
if (value !== void 0) {
|
|
609
|
+
entries.push([key, String(value)]);
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
};
|
|
613
|
+
add(a);
|
|
614
|
+
add(b);
|
|
615
|
+
if (entries.length === 0) {
|
|
616
|
+
return void 0;
|
|
617
|
+
}
|
|
618
|
+
return entries;
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
// thru-ts-client-sdk/utils/utils.ts
|
|
622
|
+
function isSlotSelector(selector) {
|
|
623
|
+
return "slot" in selector;
|
|
624
|
+
}
|
|
625
|
+
function mergeTransactionHeader(defaults, overrides) {
|
|
626
|
+
if (!overrides) {
|
|
627
|
+
return defaults;
|
|
628
|
+
}
|
|
629
|
+
const sanitized = Object.fromEntries(
|
|
630
|
+
Object.entries(overrides).filter(([, value]) => value !== void 0)
|
|
631
|
+
);
|
|
632
|
+
return {
|
|
633
|
+
...defaults,
|
|
634
|
+
...sanitized
|
|
635
|
+
};
|
|
636
|
+
}
|
|
637
|
+
function timestampToNanoseconds(timestamp) {
|
|
638
|
+
if (!timestamp) {
|
|
639
|
+
return 0n;
|
|
640
|
+
}
|
|
641
|
+
const seconds = BigInt(timestamp.seconds ?? 0);
|
|
642
|
+
const nanos = BigInt(timestamp.nanos ?? 0);
|
|
643
|
+
return seconds * 1000000000n + nanos;
|
|
644
|
+
}
|
|
645
|
+
function nanosecondsToTimestamp(ns) {
|
|
646
|
+
const seconds = ns / 1000000000n;
|
|
647
|
+
const nanos = Number(ns % 1000000000n);
|
|
648
|
+
return { seconds, nanos };
|
|
649
|
+
}
|
|
650
|
+
function consensusStatusToString(status) {
|
|
651
|
+
const lookup = ConsensusStatus;
|
|
652
|
+
return lookup[status] ?? `UNKNOWN(${status})`;
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
// thru-ts-client-sdk/domain/accounts/Account.ts
|
|
656
|
+
var AccountFlags = class _AccountFlags {
|
|
657
|
+
constructor(flags) {
|
|
658
|
+
this.isProgram = flags?.isProgram ?? false;
|
|
659
|
+
this.isPrivileged = flags?.isPrivileged ?? false;
|
|
660
|
+
this.isUncompressable = flags?.isUncompressable ?? false;
|
|
661
|
+
this.isEphemeral = flags?.isEphemeral ?? false;
|
|
662
|
+
this.isDeleted = flags?.isDeleted ?? false;
|
|
663
|
+
this.isNew = flags?.isNew ?? false;
|
|
664
|
+
this.isCompressed = flags?.isCompressed ?? false;
|
|
665
|
+
}
|
|
666
|
+
static fromProto(flags) {
|
|
667
|
+
if (!flags) {
|
|
668
|
+
return new _AccountFlags();
|
|
669
|
+
}
|
|
670
|
+
return new _AccountFlags({
|
|
671
|
+
isProgram: flags.isProgram,
|
|
672
|
+
isPrivileged: flags.isPrivileged,
|
|
673
|
+
isUncompressable: flags.isUncompressable,
|
|
674
|
+
isEphemeral: flags.isEphemeral,
|
|
675
|
+
isDeleted: flags.isDeleted,
|
|
676
|
+
isNew: flags.isNew,
|
|
677
|
+
isCompressed: flags.isCompressed
|
|
678
|
+
});
|
|
679
|
+
}
|
|
680
|
+
};
|
|
681
|
+
var AccountMeta = class _AccountMeta {
|
|
682
|
+
constructor(params) {
|
|
683
|
+
this.version = params.version;
|
|
684
|
+
this.flags = params.flags ?? new AccountFlags();
|
|
685
|
+
this.dataSize = params.dataSize;
|
|
686
|
+
this.seq = params.seq;
|
|
687
|
+
this.owner = params.owner;
|
|
688
|
+
this.balance = params.balance;
|
|
689
|
+
this.nonce = params.nonce;
|
|
690
|
+
}
|
|
691
|
+
static fromProto(meta) {
|
|
692
|
+
if (!meta) {
|
|
693
|
+
return void 0;
|
|
694
|
+
}
|
|
695
|
+
return new _AccountMeta({
|
|
696
|
+
version: meta.version,
|
|
697
|
+
flags: AccountFlags.fromProto(meta.flags),
|
|
698
|
+
dataSize: meta.dataSize,
|
|
699
|
+
seq: meta.seq ?? 0n,
|
|
700
|
+
owner: meta.owner ? Pubkey.fromProtoPubkey(meta.owner) : void 0,
|
|
701
|
+
balance: meta.balance ?? 0n,
|
|
702
|
+
nonce: meta.nonce
|
|
703
|
+
});
|
|
704
|
+
}
|
|
705
|
+
};
|
|
706
|
+
var AccountData = class _AccountData {
|
|
707
|
+
constructor(params) {
|
|
708
|
+
this.data = params.data ? new Uint8Array(params.data) : void 0;
|
|
709
|
+
this.compressed = params.compressed ?? false;
|
|
710
|
+
this.compressionAlgorithm = params.compressionAlgorithm;
|
|
711
|
+
}
|
|
712
|
+
static fromProto(data) {
|
|
713
|
+
if (!data) {
|
|
714
|
+
return void 0;
|
|
715
|
+
}
|
|
716
|
+
return new _AccountData({
|
|
717
|
+
data: data.data ? new Uint8Array(data.data) : void 0,
|
|
718
|
+
compressed: data.compressed ?? false,
|
|
719
|
+
compressionAlgorithm: data.compressionAlgorithm
|
|
720
|
+
});
|
|
721
|
+
}
|
|
722
|
+
};
|
|
723
|
+
var Account = class _Account {
|
|
724
|
+
constructor(params) {
|
|
725
|
+
this.address = params.address;
|
|
726
|
+
this.meta = params.meta;
|
|
727
|
+
this.data = params.data;
|
|
728
|
+
this.versionContext = params.versionContext;
|
|
729
|
+
this.consensusStatus = params.consensusStatus;
|
|
730
|
+
}
|
|
731
|
+
static fromProto(proto) {
|
|
732
|
+
if (!proto.address) {
|
|
733
|
+
throw new Error("Account proto missing address");
|
|
734
|
+
}
|
|
735
|
+
return new _Account({
|
|
736
|
+
address: Pubkey.fromProtoPubkey(proto.address),
|
|
737
|
+
meta: AccountMeta.fromProto(proto.meta),
|
|
738
|
+
data: AccountData.fromProto(proto.data ?? void 0),
|
|
739
|
+
versionContext: convertVersionContext(proto.versionContext),
|
|
740
|
+
consensusStatus: proto.consensusStatus
|
|
741
|
+
});
|
|
742
|
+
}
|
|
743
|
+
};
|
|
744
|
+
function convertVersionContext(meta) {
|
|
745
|
+
if (!meta) {
|
|
746
|
+
return void 0;
|
|
747
|
+
}
|
|
748
|
+
return {
|
|
749
|
+
slot: meta.slot,
|
|
750
|
+
blockTimestampNs: timestampToNanoseconds(meta.blockTimestamp)
|
|
751
|
+
};
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
// thru-ts-client-sdk/domain/accounts/streaming.ts
|
|
755
|
+
function toStreamAccountUpdate(response) {
|
|
756
|
+
if (!response.message) {
|
|
757
|
+
return void 0;
|
|
758
|
+
}
|
|
759
|
+
if (response.message.case === "snapshot") {
|
|
760
|
+
return {
|
|
761
|
+
kind: "snapshot",
|
|
762
|
+
snapshot: { account: Account.fromProto(response.message.value) }
|
|
763
|
+
};
|
|
764
|
+
}
|
|
765
|
+
if (response.message.case === "update") {
|
|
766
|
+
return {
|
|
767
|
+
kind: "update",
|
|
768
|
+
update: fromProtoUpdate(response.message.value)
|
|
769
|
+
};
|
|
770
|
+
}
|
|
771
|
+
return void 0;
|
|
772
|
+
}
|
|
773
|
+
function fromProtoUpdate(update) {
|
|
774
|
+
return {
|
|
775
|
+
slot: update.slot,
|
|
776
|
+
meta: AccountMeta.fromProto(update.meta),
|
|
777
|
+
page: update.page ? fromProtoPage(update.page) : void 0,
|
|
778
|
+
deleted: update.delete ?? false
|
|
779
|
+
};
|
|
780
|
+
}
|
|
781
|
+
function fromProtoPage(page) {
|
|
782
|
+
return {
|
|
783
|
+
pageIndex: page.pageIdx,
|
|
784
|
+
pageSize: page.pageSize,
|
|
785
|
+
data: new Uint8Array(page.pageData),
|
|
786
|
+
compressed: page.compressed ?? void 0,
|
|
787
|
+
compressionAlgorithm: page.compressionAlgorithm
|
|
788
|
+
};
|
|
789
|
+
}
|
|
790
|
+
var PageResponse = class _PageResponse {
|
|
791
|
+
constructor(params = {}) {
|
|
792
|
+
this.nextPageToken = params.nextPageToken;
|
|
793
|
+
this.totalSize = params.totalSize;
|
|
794
|
+
}
|
|
795
|
+
static fromProto(proto) {
|
|
796
|
+
if (!proto) {
|
|
797
|
+
return void 0;
|
|
798
|
+
}
|
|
799
|
+
return new _PageResponse({
|
|
800
|
+
nextPageToken: proto.nextPageToken,
|
|
801
|
+
totalSize: proto.totalSize
|
|
802
|
+
});
|
|
803
|
+
}
|
|
804
|
+
toProto() {
|
|
805
|
+
return protobuf.create(PageResponseSchema, {
|
|
806
|
+
nextPageToken: this.nextPageToken,
|
|
807
|
+
totalSize: this.totalSize
|
|
808
|
+
});
|
|
809
|
+
}
|
|
810
|
+
hasNextPage() {
|
|
811
|
+
return !!this.nextPageToken;
|
|
812
|
+
}
|
|
813
|
+
};
|
|
814
|
+
ed25519.hashes.sha512 = sha2_js.sha512;
|
|
815
|
+
var DOMAIN_TAGS = {
|
|
816
|
+
[0 /* TXN */]: 1n,
|
|
817
|
+
[1 /* BLOCK_HEADER */]: 2n,
|
|
818
|
+
[2 /* BLOCK */]: 3n,
|
|
819
|
+
[3 /* GOSSIP */]: 4n
|
|
820
|
+
};
|
|
821
|
+
var DOMAIN_BLOCK_SIZE = 128;
|
|
822
|
+
var SIGNATURE_SIZE = 64;
|
|
823
|
+
var PUBKEY_SIZE = 32;
|
|
824
|
+
function createDomainBlock(domain) {
|
|
825
|
+
const block = new Uint8Array(DOMAIN_BLOCK_SIZE);
|
|
826
|
+
block.fill(0);
|
|
827
|
+
const tag = DOMAIN_TAGS[domain];
|
|
828
|
+
if (tag === void 0) {
|
|
829
|
+
throw new Error(`Invalid signature domain: ${domain}`);
|
|
830
|
+
}
|
|
831
|
+
const view = new DataView(block.buffer, block.byteOffset, block.byteLength);
|
|
832
|
+
view.setBigUint64(0, tag, false);
|
|
833
|
+
return block;
|
|
834
|
+
}
|
|
835
|
+
function copyBytes2(bytes) {
|
|
836
|
+
const out = new Uint8Array(bytes.length);
|
|
837
|
+
out.set(bytes);
|
|
838
|
+
return out;
|
|
839
|
+
}
|
|
840
|
+
function concatBytes(...arrays) {
|
|
841
|
+
return ed25519.etc.concatBytes(...arrays);
|
|
842
|
+
}
|
|
843
|
+
function sha512Bytes(bytes) {
|
|
844
|
+
return new Uint8Array(sha2_js.sha512(bytes));
|
|
845
|
+
}
|
|
846
|
+
function bytesToNumberLE(bytes) {
|
|
847
|
+
let value = 0n;
|
|
848
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
849
|
+
value += BigInt(bytes[i]) << 8n * BigInt(i);
|
|
850
|
+
}
|
|
851
|
+
return value;
|
|
852
|
+
}
|
|
853
|
+
function modOrder(value) {
|
|
854
|
+
const modulus = ed25519.Point.CURVE().n;
|
|
855
|
+
const result = value % modulus;
|
|
856
|
+
return result >= 0n ? result : result + modulus;
|
|
857
|
+
}
|
|
858
|
+
function numberToBytesLE(value, length) {
|
|
859
|
+
const out = new Uint8Array(length);
|
|
860
|
+
let current = value;
|
|
861
|
+
for (let i = 0; i < length; i++) {
|
|
862
|
+
out[i] = Number(current & 0xffn);
|
|
863
|
+
current >>= 8n;
|
|
864
|
+
}
|
|
865
|
+
return out;
|
|
866
|
+
}
|
|
867
|
+
async function signWithDomain(message, privateKey, publicKey, domain = 0 /* TXN */) {
|
|
868
|
+
if (privateKey.length !== PUBKEY_SIZE) {
|
|
869
|
+
throw new Error("Private key must contain 32 bytes");
|
|
870
|
+
}
|
|
871
|
+
const domainBlock = createDomainBlock(domain);
|
|
872
|
+
const messageBytes = copyBytes2(message);
|
|
873
|
+
const extended = ed25519.utils.getExtendedPublicKey(privateKey);
|
|
874
|
+
const publicKeyBytes = publicKey ? copyBytes2(publicKey) : extended.pointBytes;
|
|
875
|
+
if (publicKeyBytes.length !== PUBKEY_SIZE) {
|
|
876
|
+
throw new Error("Public key must contain 32 bytes");
|
|
877
|
+
}
|
|
878
|
+
const rInput = concatBytes(domainBlock, extended.prefix, messageBytes);
|
|
879
|
+
const r = modOrder(bytesToNumberLE(sha512Bytes(rInput)));
|
|
880
|
+
const R = ed25519.Point.BASE.multiply(r).toBytes();
|
|
881
|
+
const kInput = concatBytes(domainBlock, R, publicKeyBytes, messageBytes);
|
|
882
|
+
const k = modOrder(bytesToNumberLE(sha512Bytes(kInput)));
|
|
883
|
+
const s = modOrder(r + k * extended.scalar);
|
|
884
|
+
const signature = new Uint8Array(SIGNATURE_SIZE);
|
|
885
|
+
signature.set(R, 0);
|
|
886
|
+
signature.set(numberToBytesLE(s, PUBKEY_SIZE), PUBKEY_SIZE);
|
|
887
|
+
return signature;
|
|
888
|
+
}
|
|
889
|
+
|
|
890
|
+
// thru-ts-client-sdk/wire-format.ts
|
|
891
|
+
var SIGNATURE_SIZE2 = 64;
|
|
892
|
+
var PUBKEY_SIZE2 = 32;
|
|
893
|
+
var HASH_SIZE = 32;
|
|
894
|
+
var BLOCK_HEADER_SIZE = 168;
|
|
895
|
+
var BLOCK_HEADER_SIZE_LEGACY = 160;
|
|
896
|
+
var BLOCK_FOOTER_SIZE = 104;
|
|
897
|
+
var BLOCK_VERSION_V1 = 1;
|
|
898
|
+
var TXN_HEADER_BODY_SIZE = 112;
|
|
899
|
+
var TXN_VERSION_V1 = 1;
|
|
900
|
+
var TXN_MAX_ACCOUNTS = 1024;
|
|
901
|
+
var STATE_PROOF_HEADER_SIZE = 40;
|
|
902
|
+
var ACCOUNT_META_FOOTPRINT = 64;
|
|
903
|
+
var TXN_FLAG_HAS_FEE_PAYER_PROOF = 1 << 0;
|
|
904
|
+
var STATE_PROOF_TYPE_EXISTING = 0;
|
|
905
|
+
var STATE_PROOF_TYPE_UPDATING = 1;
|
|
906
|
+
var STATE_PROOF_TYPE_CREATION = 2;
|
|
907
|
+
|
|
908
|
+
// thru-ts-client-sdk/domain/transactions/Transaction.ts
|
|
909
|
+
var DEFAULT_FLAGS = 0;
|
|
910
|
+
var MAX_INSTRUCTION_DATA_LENGTH = 65535;
|
|
911
|
+
var BYTE_POPCOUNT = new Uint8Array(256).map((_value, index) => {
|
|
912
|
+
let v = index;
|
|
913
|
+
let count = 0;
|
|
914
|
+
while (v !== 0) {
|
|
915
|
+
count += v & 1;
|
|
916
|
+
v >>= 1;
|
|
917
|
+
}
|
|
918
|
+
return count;
|
|
919
|
+
});
|
|
920
|
+
var Transaction = class _Transaction {
|
|
921
|
+
constructor(params) {
|
|
922
|
+
this.version = params.version ?? TXN_VERSION_V1;
|
|
923
|
+
this.feePayer = Pubkey.from(params.feePayer);
|
|
924
|
+
this.program = Pubkey.from(params.program);
|
|
925
|
+
this.fee = params.header.fee;
|
|
926
|
+
this.nonce = params.header.nonce;
|
|
927
|
+
this.startSlot = params.header.startSlot;
|
|
928
|
+
this.expiryAfter = params.header.expiryAfter ?? 0;
|
|
929
|
+
this.chainId = params.header.chainId ?? 1;
|
|
930
|
+
this.requestedComputeUnits = params.header.computeUnits ?? 0;
|
|
931
|
+
this.requestedStateUnits = params.header.stateUnits ?? 0;
|
|
932
|
+
this.requestedMemoryUnits = params.header.memoryUnits ?? 0;
|
|
933
|
+
this.flags = params.header.flags ?? DEFAULT_FLAGS;
|
|
934
|
+
this.readWriteAccounts = params.accounts?.readWriteAccounts ? params.accounts.readWriteAccounts.map(Pubkey.from) : [];
|
|
935
|
+
this.readOnlyAccounts = params.accounts?.readOnlyAccounts ? params.accounts.readOnlyAccounts.map(Pubkey.from) : [];
|
|
936
|
+
this.instructionData = params.instructionData ? new Uint8Array(params.instructionData) : void 0;
|
|
937
|
+
if (this.instructionData && this.instructionData.length > MAX_INSTRUCTION_DATA_LENGTH) {
|
|
938
|
+
throw new Error(`Instruction data exceeds maximum length (${MAX_INSTRUCTION_DATA_LENGTH} bytes)`);
|
|
939
|
+
}
|
|
940
|
+
this.instructionDataSize = params.instructionDataSize;
|
|
941
|
+
this.feePayerStateProof = params.proofs?.feePayerStateProof ? new Uint8Array(params.proofs.feePayerStateProof) : void 0;
|
|
942
|
+
this.feePayerAccountMetaRaw = params.proofs?.feePayerAccountMetaRaw ? new Uint8Array(params.proofs.feePayerAccountMetaRaw) : void 0;
|
|
943
|
+
}
|
|
944
|
+
static fromWire(data) {
|
|
945
|
+
const { transaction, size } = _Transaction.parseWire(data, { strict: true });
|
|
946
|
+
if (size !== data.length) {
|
|
947
|
+
throw new Error(
|
|
948
|
+
`Transaction body has trailing bytes: expected ${size} bytes but found ${data.length}`
|
|
949
|
+
);
|
|
950
|
+
}
|
|
951
|
+
return transaction;
|
|
952
|
+
}
|
|
953
|
+
static parseWire(data, options = {}) {
|
|
954
|
+
const strict = options.strict ?? false;
|
|
955
|
+
const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
|
|
956
|
+
if (data.length < TXN_HEADER_BODY_SIZE) {
|
|
957
|
+
throw new Error(`Transaction data too short: ${data.length} bytes (minimum ${TXN_HEADER_BODY_SIZE})`);
|
|
958
|
+
}
|
|
959
|
+
let offset = 0;
|
|
960
|
+
const version = view.getUint8(offset);
|
|
961
|
+
offset += 1;
|
|
962
|
+
if (strict && version !== TXN_VERSION_V1) {
|
|
963
|
+
throw new Error(`Unsupported transaction version: ${version}`);
|
|
964
|
+
}
|
|
965
|
+
const flags = view.getUint8(offset);
|
|
966
|
+
offset += 1;
|
|
967
|
+
const invalidFlags = flags & -4;
|
|
968
|
+
if (strict && invalidFlags !== 0) {
|
|
969
|
+
throw new Error(`Unsupported transaction flags: 0x${invalidFlags.toString(16).padStart(2, "0")}`);
|
|
970
|
+
}
|
|
971
|
+
const readwriteAccountsCount = view.getUint16(offset, true);
|
|
972
|
+
offset += 2;
|
|
973
|
+
const readonlyAccountsCount = view.getUint16(offset, true);
|
|
974
|
+
offset += 2;
|
|
975
|
+
const instructionDataSize = view.getUint16(offset, true);
|
|
976
|
+
offset += 2;
|
|
977
|
+
const requestedComputeUnits = view.getUint32(offset, true);
|
|
978
|
+
offset += 4;
|
|
979
|
+
const requestedStateUnits = view.getUint16(offset, true);
|
|
980
|
+
offset += 2;
|
|
981
|
+
const requestedMemoryUnits = view.getUint16(offset, true);
|
|
982
|
+
offset += 2;
|
|
983
|
+
const fee = view.getBigUint64(offset, true);
|
|
984
|
+
offset += 8;
|
|
985
|
+
const nonce = view.getBigUint64(offset, true);
|
|
986
|
+
offset += 8;
|
|
987
|
+
const startSlot = view.getBigUint64(offset, true);
|
|
988
|
+
offset += 8;
|
|
989
|
+
const expiryAfter = view.getUint32(offset, true);
|
|
990
|
+
offset += 4;
|
|
991
|
+
const chainId = view.getUint16(offset, true);
|
|
992
|
+
offset += 2;
|
|
993
|
+
offset += 2;
|
|
994
|
+
_Transaction.ensureAvailable(data.length, offset, PUBKEY_SIZE2, "fee payer account");
|
|
995
|
+
const feePayer = data.slice(offset, offset + PUBKEY_SIZE2);
|
|
996
|
+
offset += PUBKEY_SIZE2;
|
|
997
|
+
_Transaction.ensureAvailable(data.length, offset, PUBKEY_SIZE2, "program account");
|
|
998
|
+
const program = data.slice(offset, offset + PUBKEY_SIZE2);
|
|
999
|
+
offset += PUBKEY_SIZE2;
|
|
1000
|
+
if (offset !== TXN_HEADER_BODY_SIZE) {
|
|
1001
|
+
throw new Error(`Transaction header parsing mismatch (expected offset ${TXN_HEADER_BODY_SIZE}, got ${offset})`);
|
|
1002
|
+
}
|
|
1003
|
+
const totalAccountCount = Number(readwriteAccountsCount + readonlyAccountsCount);
|
|
1004
|
+
if (strict && totalAccountCount > TXN_MAX_ACCOUNTS) {
|
|
1005
|
+
throw new Error(
|
|
1006
|
+
`Transaction references ${totalAccountCount} accounts (maximum allowed ${TXN_MAX_ACCOUNTS})`
|
|
1007
|
+
);
|
|
1008
|
+
}
|
|
1009
|
+
const accountsSize = totalAccountCount * PUBKEY_SIZE2;
|
|
1010
|
+
let expectedBodySize = accountsSize + instructionDataSize;
|
|
1011
|
+
if ((flags & TXN_FLAG_HAS_FEE_PAYER_PROOF) !== 0) {
|
|
1012
|
+
const proofOffset = TXN_HEADER_BODY_SIZE + accountsSize + instructionDataSize;
|
|
1013
|
+
_Transaction.ensureAvailable(data.length, proofOffset, STATE_PROOF_HEADER_SIZE, "state proof header");
|
|
1014
|
+
const proofView = new DataView(data.buffer, data.byteOffset + proofOffset, STATE_PROOF_HEADER_SIZE);
|
|
1015
|
+
const typeSlot = proofView.getBigUint64(0, true);
|
|
1016
|
+
const proofType = Number(typeSlot >> 62n & 0x3n);
|
|
1017
|
+
const pathBitset = data.subarray(proofOffset + 8, proofOffset + 40);
|
|
1018
|
+
const siblingCount = countSetBits(pathBitset);
|
|
1019
|
+
const bodyCount = proofType + siblingCount;
|
|
1020
|
+
const proofFootprint = STATE_PROOF_HEADER_SIZE + bodyCount * HASH_SIZE;
|
|
1021
|
+
expectedBodySize += proofFootprint;
|
|
1022
|
+
if (proofType === STATE_PROOF_TYPE_EXISTING) {
|
|
1023
|
+
expectedBodySize += ACCOUNT_META_FOOTPRINT;
|
|
1024
|
+
}
|
|
1025
|
+
}
|
|
1026
|
+
const txnSize = TXN_HEADER_BODY_SIZE + expectedBodySize + SIGNATURE_SIZE2;
|
|
1027
|
+
_Transaction.ensureAvailable(data.length, 0, txnSize, "full transaction");
|
|
1028
|
+
const sigStart = TXN_HEADER_BODY_SIZE + expectedBodySize;
|
|
1029
|
+
const readWriteAccounts = [];
|
|
1030
|
+
for (let i = 0; i < readwriteAccountsCount; i++) {
|
|
1031
|
+
_Transaction.ensureAvailable(sigStart, offset, PUBKEY_SIZE2, "read-write accounts");
|
|
1032
|
+
readWriteAccounts.push(data.slice(offset, offset + PUBKEY_SIZE2));
|
|
1033
|
+
offset += PUBKEY_SIZE2;
|
|
1034
|
+
}
|
|
1035
|
+
const readOnlyAccounts = [];
|
|
1036
|
+
for (let i = 0; i < readonlyAccountsCount; i++) {
|
|
1037
|
+
_Transaction.ensureAvailable(sigStart, offset, PUBKEY_SIZE2, "read-only accounts");
|
|
1038
|
+
readOnlyAccounts.push(data.slice(offset, offset + PUBKEY_SIZE2));
|
|
1039
|
+
offset += PUBKEY_SIZE2;
|
|
1040
|
+
}
|
|
1041
|
+
let instructionData;
|
|
1042
|
+
if (instructionDataSize > 0) {
|
|
1043
|
+
_Transaction.ensureAvailable(sigStart, offset, instructionDataSize, "instruction data");
|
|
1044
|
+
instructionData = data.slice(offset, offset + instructionDataSize);
|
|
1045
|
+
offset += instructionDataSize;
|
|
1046
|
+
}
|
|
1047
|
+
let feePayerStateProof;
|
|
1048
|
+
let feePayerAccountMetaRaw;
|
|
1049
|
+
if ((flags & TXN_FLAG_HAS_FEE_PAYER_PROOF) !== 0) {
|
|
1050
|
+
const { proofBytes, footprint, proofType } = _Transaction.parseStateProof(data.subarray(offset, sigStart));
|
|
1051
|
+
feePayerStateProof = proofBytes;
|
|
1052
|
+
offset += footprint;
|
|
1053
|
+
if (proofType === STATE_PROOF_TYPE_EXISTING) {
|
|
1054
|
+
_Transaction.ensureAvailable(sigStart, offset, ACCOUNT_META_FOOTPRINT, "fee payer account metadata");
|
|
1055
|
+
feePayerAccountMetaRaw = data.slice(offset, offset + ACCOUNT_META_FOOTPRINT);
|
|
1056
|
+
offset += ACCOUNT_META_FOOTPRINT;
|
|
1057
|
+
}
|
|
1058
|
+
}
|
|
1059
|
+
if (offset !== sigStart) {
|
|
1060
|
+
throw new Error(
|
|
1061
|
+
`Transaction body has trailing bytes: expected ${sigStart} bytes consumed but found ${offset}`
|
|
1062
|
+
);
|
|
1063
|
+
}
|
|
1064
|
+
const signatureBytes = data.slice(sigStart, sigStart + SIGNATURE_SIZE2);
|
|
1065
|
+
const hasSignature = hasNonZeroBytes(signatureBytes);
|
|
1066
|
+
const transaction = new _Transaction({
|
|
1067
|
+
version,
|
|
1068
|
+
feePayer: Pubkey.from(feePayer),
|
|
1069
|
+
program: Pubkey.from(program),
|
|
1070
|
+
header: {
|
|
1071
|
+
fee,
|
|
1072
|
+
nonce,
|
|
1073
|
+
startSlot,
|
|
1074
|
+
expiryAfter,
|
|
1075
|
+
chainId,
|
|
1076
|
+
computeUnits: requestedComputeUnits,
|
|
1077
|
+
stateUnits: requestedStateUnits,
|
|
1078
|
+
memoryUnits: requestedMemoryUnits,
|
|
1079
|
+
flags
|
|
1080
|
+
},
|
|
1081
|
+
accounts: {
|
|
1082
|
+
readWriteAccounts,
|
|
1083
|
+
readOnlyAccounts
|
|
1084
|
+
},
|
|
1085
|
+
instructionData,
|
|
1086
|
+
instructionDataSize,
|
|
1087
|
+
proofs: feePayerStateProof || feePayerAccountMetaRaw ? {
|
|
1088
|
+
feePayerStateProof,
|
|
1089
|
+
feePayerAccountMetaRaw
|
|
1090
|
+
} : void 0
|
|
1091
|
+
});
|
|
1092
|
+
if (hasSignature) {
|
|
1093
|
+
transaction.setSignature(Signature.from(signatureBytes));
|
|
1094
|
+
}
|
|
1095
|
+
return { transaction, size: txnSize };
|
|
1096
|
+
}
|
|
1097
|
+
static fromProto(proto) {
|
|
1098
|
+
if (!proto.header) {
|
|
1099
|
+
throw new Error("Transaction proto missing header");
|
|
1100
|
+
}
|
|
1101
|
+
const header = proto.header;
|
|
1102
|
+
const body = proto.body ? new Uint8Array(proto.body) : void 0;
|
|
1103
|
+
let transaction;
|
|
1104
|
+
if (body && body.length > 0) {
|
|
1105
|
+
try {
|
|
1106
|
+
const { transaction: parsed } = this.parseWire(body, { strict: false });
|
|
1107
|
+
transaction = parsed;
|
|
1108
|
+
} catch (err) {
|
|
1109
|
+
transaction = void 0;
|
|
1110
|
+
}
|
|
1111
|
+
}
|
|
1112
|
+
if (!transaction) {
|
|
1113
|
+
let parsed;
|
|
1114
|
+
if (body && body.length > 0) {
|
|
1115
|
+
try {
|
|
1116
|
+
parsed = this.parseBodySections(
|
|
1117
|
+
body,
|
|
1118
|
+
header.readwriteAccountsCount ?? 0,
|
|
1119
|
+
header.readonlyAccountsCount ?? 0,
|
|
1120
|
+
header.instructionDataSize ?? 0,
|
|
1121
|
+
header.flags ?? DEFAULT_FLAGS
|
|
1122
|
+
);
|
|
1123
|
+
} catch (sectionErr) {
|
|
1124
|
+
if (body.length >= TXN_HEADER_BODY_SIZE) {
|
|
1125
|
+
parsed = this.parseBodySections(
|
|
1126
|
+
body.slice(TXN_HEADER_BODY_SIZE),
|
|
1127
|
+
header.readwriteAccountsCount ?? 0,
|
|
1128
|
+
header.readonlyAccountsCount ?? 0,
|
|
1129
|
+
header.instructionDataSize ?? 0,
|
|
1130
|
+
header.flags ?? DEFAULT_FLAGS
|
|
1131
|
+
);
|
|
1132
|
+
} else {
|
|
1133
|
+
throw sectionErr;
|
|
1134
|
+
}
|
|
1135
|
+
}
|
|
1136
|
+
}
|
|
1137
|
+
if (!parsed) {
|
|
1138
|
+
parsed = {
|
|
1139
|
+
readWriteAccounts: [],
|
|
1140
|
+
readOnlyAccounts: [],
|
|
1141
|
+
instructionData: void 0,
|
|
1142
|
+
feePayerStateProof: void 0,
|
|
1143
|
+
feePayerAccountMetaRaw: void 0
|
|
1144
|
+
};
|
|
1145
|
+
}
|
|
1146
|
+
transaction = new _Transaction({
|
|
1147
|
+
version: header.version ?? TXN_VERSION_V1,
|
|
1148
|
+
feePayer: Pubkey.fromProtoPubkey(header.feePayerPubkey),
|
|
1149
|
+
program: Pubkey.fromProtoPubkey(header.programPubkey),
|
|
1150
|
+
header: {
|
|
1151
|
+
fee: header.fee ?? 0n,
|
|
1152
|
+
nonce: header.nonce ?? 0n,
|
|
1153
|
+
startSlot: header.startSlot ?? 0n,
|
|
1154
|
+
expiryAfter: header.expiryAfter ?? 0,
|
|
1155
|
+
chainId: header.chainId ?? 1,
|
|
1156
|
+
computeUnits: header.requestedComputeUnits ?? 0,
|
|
1157
|
+
stateUnits: header.requestedStateUnits ?? 0,
|
|
1158
|
+
memoryUnits: header.requestedMemoryUnits ?? 0,
|
|
1159
|
+
flags: header.flags ?? DEFAULT_FLAGS
|
|
1160
|
+
},
|
|
1161
|
+
accounts: {
|
|
1162
|
+
readWriteAccounts: parsed.readWriteAccounts,
|
|
1163
|
+
readOnlyAccounts: parsed.readOnlyAccounts
|
|
1164
|
+
},
|
|
1165
|
+
instructionData: parsed.instructionData,
|
|
1166
|
+
instructionDataSize: header.instructionDataSize,
|
|
1167
|
+
proofs: parsed.feePayerStateProof || parsed.feePayerAccountMetaRaw ? {
|
|
1168
|
+
feePayerStateProof: parsed.feePayerStateProof,
|
|
1169
|
+
feePayerAccountMetaRaw: parsed.feePayerAccountMetaRaw
|
|
1170
|
+
} : void 0
|
|
1171
|
+
});
|
|
1172
|
+
}
|
|
1173
|
+
const signatureBytes = proto.signature?.value ?? header.feePayerSignature?.value ?? void 0;
|
|
1174
|
+
if (signatureBytes && signatureBytes.length === SIGNATURE_SIZE2 && hasNonZeroBytes(signatureBytes)) {
|
|
1175
|
+
transaction.setSignature(Signature.from(signatureBytes));
|
|
1176
|
+
}
|
|
1177
|
+
if (proto.executionResult) {
|
|
1178
|
+
transaction.executionResult = _Transaction.executionResultFromProto(proto.executionResult);
|
|
1179
|
+
}
|
|
1180
|
+
if (proto.slot !== void 0) {
|
|
1181
|
+
transaction.slot = proto.slot;
|
|
1182
|
+
}
|
|
1183
|
+
if (proto.blockOffset !== void 0) {
|
|
1184
|
+
transaction.blockOffset = proto.blockOffset;
|
|
1185
|
+
}
|
|
1186
|
+
return transaction;
|
|
1187
|
+
}
|
|
1188
|
+
getSignature() {
|
|
1189
|
+
return this.signature;
|
|
1190
|
+
}
|
|
1191
|
+
setSignature(signature) {
|
|
1192
|
+
this.signature = signature;
|
|
1193
|
+
}
|
|
1194
|
+
async sign(privateKey) {
|
|
1195
|
+
if (privateKey.length !== 32) {
|
|
1196
|
+
throw new Error("Fee payer private key must contain 32 bytes");
|
|
1197
|
+
}
|
|
1198
|
+
const payload = this.toWireForSigning();
|
|
1199
|
+
const publicKey = this.feePayer.toBytes();
|
|
1200
|
+
const signature = await signWithDomain(
|
|
1201
|
+
payload,
|
|
1202
|
+
privateKey,
|
|
1203
|
+
publicKey,
|
|
1204
|
+
0 /* TXN */
|
|
1205
|
+
);
|
|
1206
|
+
if (signature.length !== SIGNATURE_SIZE2) {
|
|
1207
|
+
throw new Error("ed25519 signing produced an invalid signature");
|
|
1208
|
+
}
|
|
1209
|
+
this.signature = Signature.from(signature);
|
|
1210
|
+
return this.signature;
|
|
1211
|
+
}
|
|
1212
|
+
toWireForSigning() {
|
|
1213
|
+
const header = this.createHeader();
|
|
1214
|
+
return this.buildWirePayload(new Uint8Array(header), false);
|
|
1215
|
+
}
|
|
1216
|
+
toWire() {
|
|
1217
|
+
const header = this.createHeader();
|
|
1218
|
+
return this.buildWirePayload(new Uint8Array(header), true);
|
|
1219
|
+
}
|
|
1220
|
+
createHeader() {
|
|
1221
|
+
const buffer = new ArrayBuffer(TXN_HEADER_BODY_SIZE);
|
|
1222
|
+
const headerBytes = new Uint8Array(buffer);
|
|
1223
|
+
const view = new DataView(buffer);
|
|
1224
|
+
let offset = 0;
|
|
1225
|
+
view.setUint8(offset, this.version & 255);
|
|
1226
|
+
offset += 1;
|
|
1227
|
+
view.setUint8(offset, this.flags & 255);
|
|
1228
|
+
offset += 1;
|
|
1229
|
+
view.setUint16(offset, this.readWriteAccounts.length, true);
|
|
1230
|
+
offset += 2;
|
|
1231
|
+
view.setUint16(offset, this.readOnlyAccounts.length, true);
|
|
1232
|
+
offset += 2;
|
|
1233
|
+
const instructionDataLength = this.instructionData?.length ?? 0;
|
|
1234
|
+
if (instructionDataLength > MAX_INSTRUCTION_DATA_LENGTH) {
|
|
1235
|
+
throw new Error(`Instruction data exceeds maximum length (${MAX_INSTRUCTION_DATA_LENGTH} bytes)`);
|
|
1236
|
+
}
|
|
1237
|
+
view.setUint16(offset, instructionDataLength, true);
|
|
1238
|
+
offset += 2;
|
|
1239
|
+
view.setUint32(offset, ensureUint32(this.requestedComputeUnits), true);
|
|
1240
|
+
offset += 4;
|
|
1241
|
+
view.setUint16(offset, ensureUint16(this.requestedStateUnits), true);
|
|
1242
|
+
offset += 2;
|
|
1243
|
+
view.setUint16(offset, ensureUint16(this.requestedMemoryUnits), true);
|
|
1244
|
+
offset += 2;
|
|
1245
|
+
view.setBigUint64(offset, ensureBigUint64(this.fee), true);
|
|
1246
|
+
offset += 8;
|
|
1247
|
+
view.setBigUint64(offset, ensureBigUint64(this.nonce), true);
|
|
1248
|
+
offset += 8;
|
|
1249
|
+
view.setBigUint64(offset, ensureBigUint64(this.startSlot), true);
|
|
1250
|
+
offset += 8;
|
|
1251
|
+
view.setUint32(offset, ensureUint32(this.expiryAfter), true);
|
|
1252
|
+
offset += 4;
|
|
1253
|
+
view.setUint16(offset, ensureUint16(this.chainId), true);
|
|
1254
|
+
offset += 2;
|
|
1255
|
+
offset += 2;
|
|
1256
|
+
headerBytes.set(this.feePayer.toBytes(), offset);
|
|
1257
|
+
offset += PUBKEY_SIZE2;
|
|
1258
|
+
headerBytes.set(this.program.toBytes(), offset);
|
|
1259
|
+
return buffer;
|
|
1260
|
+
}
|
|
1261
|
+
buildWirePayload(headerBytes, includeSignature) {
|
|
1262
|
+
const dynamicLength = this.readWriteAccounts.length * PUBKEY_SIZE2 + this.readOnlyAccounts.length * PUBKEY_SIZE2 + (this.instructionData?.length ?? 0) + (this.feePayerStateProof?.length ?? 0) + (this.feePayerAccountMetaRaw?.length ?? 0);
|
|
1263
|
+
const signatureLength = includeSignature ? SIGNATURE_SIZE2 : 0;
|
|
1264
|
+
const result = new Uint8Array(headerBytes.length + dynamicLength + signatureLength);
|
|
1265
|
+
result.set(headerBytes, 0);
|
|
1266
|
+
let offset = headerBytes.length;
|
|
1267
|
+
offset = appendAccountList(result, offset, this.readWriteAccounts.map((account) => account.toBytes()));
|
|
1268
|
+
offset = appendAccountList(result, offset, this.readOnlyAccounts.map((account) => account.toBytes()));
|
|
1269
|
+
if (this.instructionData) {
|
|
1270
|
+
result.set(this.instructionData, offset);
|
|
1271
|
+
offset += this.instructionData.length;
|
|
1272
|
+
}
|
|
1273
|
+
if (this.feePayerStateProof) {
|
|
1274
|
+
result.set(this.feePayerStateProof, offset);
|
|
1275
|
+
offset += this.feePayerStateProof.length;
|
|
1276
|
+
}
|
|
1277
|
+
if (this.feePayerAccountMetaRaw) {
|
|
1278
|
+
result.set(this.feePayerAccountMetaRaw, offset);
|
|
1279
|
+
offset += this.feePayerAccountMetaRaw.length;
|
|
1280
|
+
}
|
|
1281
|
+
if (includeSignature) {
|
|
1282
|
+
if (this.signature) {
|
|
1283
|
+
result.set(this.signature.toBytes(), offset);
|
|
1284
|
+
}
|
|
1285
|
+
}
|
|
1286
|
+
return result;
|
|
1287
|
+
}
|
|
1288
|
+
static parseBodySections(body, readwriteCount, readonlyCount, instructionDataSize, flags) {
|
|
1289
|
+
let offset = 0;
|
|
1290
|
+
const readWriteAccounts = [];
|
|
1291
|
+
for (let i = 0; i < readwriteCount; i++) {
|
|
1292
|
+
this.ensureAvailable(body.length, offset, PUBKEY_SIZE2, "read-write accounts");
|
|
1293
|
+
readWriteAccounts.push(body.slice(offset, offset + PUBKEY_SIZE2));
|
|
1294
|
+
offset += PUBKEY_SIZE2;
|
|
1295
|
+
}
|
|
1296
|
+
const readOnlyAccounts = [];
|
|
1297
|
+
for (let i = 0; i < readonlyCount; i++) {
|
|
1298
|
+
this.ensureAvailable(body.length, offset, PUBKEY_SIZE2, "read-only accounts");
|
|
1299
|
+
readOnlyAccounts.push(body.slice(offset, offset + PUBKEY_SIZE2));
|
|
1300
|
+
offset += PUBKEY_SIZE2;
|
|
1301
|
+
}
|
|
1302
|
+
let instructionData;
|
|
1303
|
+
if (instructionDataSize > 0) {
|
|
1304
|
+
this.ensureAvailable(body.length, offset, instructionDataSize, "instruction data");
|
|
1305
|
+
instructionData = body.slice(offset, offset + instructionDataSize);
|
|
1306
|
+
offset += instructionDataSize;
|
|
1307
|
+
}
|
|
1308
|
+
let feePayerStateProof;
|
|
1309
|
+
let feePayerAccountMetaRaw;
|
|
1310
|
+
if ((flags & TXN_FLAG_HAS_FEE_PAYER_PROOF) !== 0) {
|
|
1311
|
+
const { proofBytes, footprint, proofType } = this.parseStateProof(body.subarray(offset));
|
|
1312
|
+
feePayerStateProof = proofBytes;
|
|
1313
|
+
offset += footprint;
|
|
1314
|
+
if (proofType === STATE_PROOF_TYPE_EXISTING) {
|
|
1315
|
+
this.ensureAvailable(body.length, offset, ACCOUNT_META_FOOTPRINT, "fee payer account metadata");
|
|
1316
|
+
feePayerAccountMetaRaw = body.slice(offset, offset + ACCOUNT_META_FOOTPRINT);
|
|
1317
|
+
offset += ACCOUNT_META_FOOTPRINT;
|
|
1318
|
+
}
|
|
1319
|
+
}
|
|
1320
|
+
if (offset !== body.length) {
|
|
1321
|
+
throw new Error(
|
|
1322
|
+
`Transaction body has trailing bytes: expected ${offset} bytes but found ${body.length}`
|
|
1323
|
+
);
|
|
1324
|
+
}
|
|
1325
|
+
return {
|
|
1326
|
+
readWriteAccounts,
|
|
1327
|
+
readOnlyAccounts,
|
|
1328
|
+
instructionData,
|
|
1329
|
+
feePayerStateProof,
|
|
1330
|
+
feePayerAccountMetaRaw
|
|
1331
|
+
};
|
|
1332
|
+
}
|
|
1333
|
+
static ensureAvailable(totalLength, offset, required, context) {
|
|
1334
|
+
if (offset + required > totalLength) {
|
|
1335
|
+
throw new Error(`Transaction data truncated while parsing ${context}`);
|
|
1336
|
+
}
|
|
1337
|
+
}
|
|
1338
|
+
static parseStateProof(data) {
|
|
1339
|
+
if (data.length < STATE_PROOF_HEADER_SIZE) {
|
|
1340
|
+
throw new Error("Transaction data truncated while parsing state proof header");
|
|
1341
|
+
}
|
|
1342
|
+
const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
|
|
1343
|
+
const typeSlot = view.getBigUint64(0, true);
|
|
1344
|
+
const proofType = Number(typeSlot >> 62n & 0x3n);
|
|
1345
|
+
if (proofType !== STATE_PROOF_TYPE_EXISTING && proofType !== STATE_PROOF_TYPE_UPDATING && proofType !== STATE_PROOF_TYPE_CREATION) {
|
|
1346
|
+
throw new Error(`Transaction state proof has unknown type: ${proofType}`);
|
|
1347
|
+
}
|
|
1348
|
+
const pathBitset = data.subarray(8, 40);
|
|
1349
|
+
const siblingCount = countSetBits(pathBitset);
|
|
1350
|
+
const bodyCount = proofType + siblingCount;
|
|
1351
|
+
const totalSize = STATE_PROOF_HEADER_SIZE + bodyCount * HASH_SIZE;
|
|
1352
|
+
if (proofType === STATE_PROOF_TYPE_CREATION && bodyCount < 2) {
|
|
1353
|
+
throw new Error("Transaction state proof creation entry is truncated");
|
|
1354
|
+
}
|
|
1355
|
+
if (proofType === STATE_PROOF_TYPE_UPDATING && bodyCount < 1) {
|
|
1356
|
+
throw new Error("Transaction state proof updating entry is truncated");
|
|
1357
|
+
}
|
|
1358
|
+
if (data.length < totalSize) {
|
|
1359
|
+
throw new Error("Transaction data truncated while parsing state proof body");
|
|
1360
|
+
}
|
|
1361
|
+
return {
|
|
1362
|
+
proofBytes: data.slice(0, totalSize),
|
|
1363
|
+
footprint: totalSize,
|
|
1364
|
+
proofType
|
|
1365
|
+
};
|
|
1366
|
+
}
|
|
1367
|
+
static executionResultFromProto(proto) {
|
|
1368
|
+
return {
|
|
1369
|
+
consumedComputeUnits: proto.consumedComputeUnits ?? 0,
|
|
1370
|
+
consumedMemoryUnits: proto.consumedMemoryUnits ?? 0,
|
|
1371
|
+
consumedStateUnits: proto.consumedStateUnits ?? 0,
|
|
1372
|
+
userErrorCode: proto.userErrorCode ?? 0n,
|
|
1373
|
+
vmError: proto.vmError ?? 0 /* TRANSACTION_VM_EXECUTE_SUCCESS */,
|
|
1374
|
+
executionResult: proto.executionResult ?? 0n,
|
|
1375
|
+
pagesUsed: proto.pagesUsed ?? 0,
|
|
1376
|
+
eventsCount: proto.eventsCount ?? 0,
|
|
1377
|
+
eventsSize: proto.eventsSize ?? 0,
|
|
1378
|
+
readwriteAccounts: proto.readwriteAccounts.map((account) => Pubkey.fromProtoPubkey(account)),
|
|
1379
|
+
readonlyAccounts: proto.readonlyAccounts.map((account) => Pubkey.fromProtoPubkey(account)),
|
|
1380
|
+
events: proto.events.length ? proto.events.map((event) => ({
|
|
1381
|
+
eventId: event.eventId,
|
|
1382
|
+
callIdx: event.callIdx,
|
|
1383
|
+
programIdx: event.programIdx,
|
|
1384
|
+
program: event.program ? Pubkey.fromProtoPubkey(event.program) : void 0,
|
|
1385
|
+
payload: new Uint8Array(event.payload ?? new Uint8Array(0))
|
|
1386
|
+
})) : void 0,
|
|
1387
|
+
errorProgramAccIdx: proto.errorProgramAccIdx ?? 0
|
|
1388
|
+
};
|
|
1389
|
+
}
|
|
1390
|
+
};
|
|
1391
|
+
function appendAccountList(target, start, accounts) {
|
|
1392
|
+
let offset = start;
|
|
1393
|
+
for (const account of accounts) {
|
|
1394
|
+
target.set(account, offset);
|
|
1395
|
+
offset += PUBKEY_SIZE2;
|
|
1396
|
+
}
|
|
1397
|
+
return offset;
|
|
1398
|
+
}
|
|
1399
|
+
function ensureUint16(value) {
|
|
1400
|
+
if (!Number.isInteger(value) || value < 0 || value > 65535) {
|
|
1401
|
+
throw new Error("Value must fit within uint16 range");
|
|
1402
|
+
}
|
|
1403
|
+
return value;
|
|
1404
|
+
}
|
|
1405
|
+
function ensureUint32(value) {
|
|
1406
|
+
if (!Number.isInteger(value) || value < 0 || value > 4294967295) {
|
|
1407
|
+
throw new Error("Value must fit within uint32 range");
|
|
1408
|
+
}
|
|
1409
|
+
return value;
|
|
1410
|
+
}
|
|
1411
|
+
function ensureBigUint64(value) {
|
|
1412
|
+
if (value < 0n || value > 0xffffffffffffffffn) {
|
|
1413
|
+
throw new Error("Value must fit within uint64 range");
|
|
1414
|
+
}
|
|
1415
|
+
return value;
|
|
1416
|
+
}
|
|
1417
|
+
function countSetBits(bytes) {
|
|
1418
|
+
let total = 0;
|
|
1419
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
1420
|
+
total += BYTE_POPCOUNT[bytes[i]];
|
|
1421
|
+
}
|
|
1422
|
+
return total;
|
|
1423
|
+
}
|
|
1424
|
+
function hasNonZeroBytes(value) {
|
|
1425
|
+
for (let i = 0; i < value.length; i++) {
|
|
1426
|
+
if (value[i] !== 0) {
|
|
1427
|
+
return true;
|
|
1428
|
+
}
|
|
1429
|
+
}
|
|
1430
|
+
return false;
|
|
1431
|
+
}
|
|
1432
|
+
|
|
1433
|
+
// thru-ts-client-sdk/domain/transactions/utils.ts
|
|
1434
|
+
var ACCOUNT_LIMIT = 1024;
|
|
1435
|
+
function normalizeAccountList(accounts) {
|
|
1436
|
+
if (accounts.length === 0) {
|
|
1437
|
+
return [];
|
|
1438
|
+
}
|
|
1439
|
+
if (accounts.length > ACCOUNT_LIMIT) {
|
|
1440
|
+
throw new Error(`Too many accounts provided: ${accounts.length} (max ${ACCOUNT_LIMIT})`);
|
|
1441
|
+
}
|
|
1442
|
+
const deduped = dedupeAccountList(accounts);
|
|
1443
|
+
return deduped;
|
|
1444
|
+
}
|
|
1445
|
+
function dedupeAccountList(accounts) {
|
|
1446
|
+
const pubkeys = accounts.map(Pubkey.from).map((pubkey) => pubkey.toBytes());
|
|
1447
|
+
const seen = /* @__PURE__ */ new Map();
|
|
1448
|
+
for (const pubkey of pubkeys) {
|
|
1449
|
+
if (pubkey.length !== 32) {
|
|
1450
|
+
throw new Error("Account addresses must contain 32 bytes");
|
|
1451
|
+
}
|
|
1452
|
+
const key = toHex(pubkey);
|
|
1453
|
+
if (!seen.has(key)) {
|
|
1454
|
+
seen.set(key, pubkey);
|
|
1455
|
+
}
|
|
1456
|
+
}
|
|
1457
|
+
return Array.from(seen.values()).sort(compareAccounts);
|
|
1458
|
+
}
|
|
1459
|
+
function compareAccounts(a, b) {
|
|
1460
|
+
for (let i = 0; i < 32; i++) {
|
|
1461
|
+
if (a[i] !== b[i]) {
|
|
1462
|
+
return a[i] - b[i];
|
|
1463
|
+
}
|
|
1464
|
+
}
|
|
1465
|
+
return 0;
|
|
1466
|
+
}
|
|
1467
|
+
function toHex(bytes) {
|
|
1468
|
+
let result = "";
|
|
1469
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
1470
|
+
const hex = bytes[i].toString(16).padStart(2, "0");
|
|
1471
|
+
result += hex;
|
|
1472
|
+
}
|
|
1473
|
+
return result;
|
|
1474
|
+
}
|
|
1475
|
+
function parseInstructionData(value) {
|
|
1476
|
+
if (value === void 0) {
|
|
1477
|
+
return void 0;
|
|
1478
|
+
}
|
|
1479
|
+
if (value instanceof Uint8Array) {
|
|
1480
|
+
return new Uint8Array(value);
|
|
1481
|
+
}
|
|
1482
|
+
if (typeof value === "string") {
|
|
1483
|
+
if (value.length === 0) {
|
|
1484
|
+
return new Uint8Array();
|
|
1485
|
+
}
|
|
1486
|
+
if (isHexString(value)) {
|
|
1487
|
+
return hexToBytes(value);
|
|
1488
|
+
}
|
|
1489
|
+
}
|
|
1490
|
+
throw new Error("Instruction data must be provided as hex string or Uint8Array");
|
|
1491
|
+
}
|
|
1492
|
+
function createInstructionContext(feePayer, program, sortedReadWrite, sortedReadOnly) {
|
|
1493
|
+
const accounts = [
|
|
1494
|
+
feePayer,
|
|
1495
|
+
program,
|
|
1496
|
+
...sortedReadWrite.map((bytes) => Pubkey.from(bytes)),
|
|
1497
|
+
...sortedReadOnly.map((bytes) => Pubkey.from(bytes))
|
|
1498
|
+
];
|
|
1499
|
+
const indexMap = /* @__PURE__ */ new Map();
|
|
1500
|
+
for (let i = 0; i < accounts.length; i++) {
|
|
1501
|
+
const key = toHex(accounts[i].toBytes());
|
|
1502
|
+
if (!indexMap.has(key)) {
|
|
1503
|
+
indexMap.set(key, i);
|
|
1504
|
+
}
|
|
1505
|
+
}
|
|
1506
|
+
return {
|
|
1507
|
+
accounts,
|
|
1508
|
+
getAccountIndex: (pubkey) => {
|
|
1509
|
+
const bytes = Pubkey.from(pubkey).toBytes();
|
|
1510
|
+
const key = toHex(bytes);
|
|
1511
|
+
const index = indexMap.get(key);
|
|
1512
|
+
if (index === void 0) {
|
|
1513
|
+
throw new Error(`Account ${key} not found in transaction accounts`);
|
|
1514
|
+
}
|
|
1515
|
+
return index;
|
|
1516
|
+
}
|
|
1517
|
+
};
|
|
1518
|
+
}
|
|
1519
|
+
|
|
1520
|
+
// thru-ts-client-sdk/domain/transactions/TransactionBuilder.ts
|
|
1521
|
+
var FLAG_HAS_FEE_PAYER_PROOF = 1 << 0;
|
|
1522
|
+
var TransactionBuilder = class {
|
|
1523
|
+
build(params) {
|
|
1524
|
+
const feePayer = Pubkey.from(params.feePayer.publicKey);
|
|
1525
|
+
const program = Pubkey.from(params.program);
|
|
1526
|
+
const sortedReadWrite = normalizeAccountList(params.accounts?.readWriteAccounts ?? []);
|
|
1527
|
+
const sortedReadOnly = normalizeAccountList(params.accounts?.readOnlyAccounts ?? []);
|
|
1528
|
+
let instructionData;
|
|
1529
|
+
if (params.buildInstructionData) {
|
|
1530
|
+
const context = createInstructionContext(feePayer, program, sortedReadWrite, sortedReadOnly);
|
|
1531
|
+
const result = params.buildInstructionData(context);
|
|
1532
|
+
instructionData = parseInstructionData(result);
|
|
1533
|
+
} else {
|
|
1534
|
+
instructionData = parseInstructionData(params.instructionData);
|
|
1535
|
+
}
|
|
1536
|
+
const baseFlags = params.header.flags ?? 0;
|
|
1537
|
+
const flags = params.proofs?.feePayerStateProof ? baseFlags | FLAG_HAS_FEE_PAYER_PROOF : baseFlags;
|
|
1538
|
+
const accounts = sortedReadWrite.length > 0 || sortedReadOnly.length > 0 ? { readWriteAccounts: sortedReadWrite, readOnlyAccounts: sortedReadOnly } : void 0;
|
|
1539
|
+
return new Transaction({
|
|
1540
|
+
feePayer,
|
|
1541
|
+
program,
|
|
1542
|
+
header: {
|
|
1543
|
+
...params.header,
|
|
1544
|
+
flags
|
|
1545
|
+
},
|
|
1546
|
+
accounts,
|
|
1547
|
+
instructionData,
|
|
1548
|
+
proofs: params.proofs
|
|
1549
|
+
});
|
|
1550
|
+
}
|
|
1551
|
+
async buildAndSign(params) {
|
|
1552
|
+
if (!params.feePayer.privateKey) {
|
|
1553
|
+
throw new Error("Fee payer private key is required to sign the transaction");
|
|
1554
|
+
}
|
|
1555
|
+
const transaction = this.build(params);
|
|
1556
|
+
const signature = await transaction.sign(params.feePayer.privateKey);
|
|
1557
|
+
const rawTransaction = transaction.toWire();
|
|
1558
|
+
return { transaction, signature, rawTransaction };
|
|
1559
|
+
}
|
|
1560
|
+
};
|
|
1561
|
+
|
|
1562
|
+
// thru-ts-client-sdk/domain/proofs/StateProof.ts
|
|
1563
|
+
var StateProof = class _StateProof {
|
|
1564
|
+
constructor(params) {
|
|
1565
|
+
this.proof = copyBytes3(params.proof);
|
|
1566
|
+
this.slot = params.slot;
|
|
1567
|
+
}
|
|
1568
|
+
static fromProto(proto) {
|
|
1569
|
+
return new _StateProof({
|
|
1570
|
+
proof: proto.proof,
|
|
1571
|
+
slot: proto.slot ?? 0n
|
|
1572
|
+
});
|
|
1573
|
+
}
|
|
1574
|
+
};
|
|
1575
|
+
function copyBytes3(bytes) {
|
|
1576
|
+
const copy = new Uint8Array(bytes.length);
|
|
1577
|
+
copy.set(bytes);
|
|
1578
|
+
return copy;
|
|
1579
|
+
}
|
|
1580
|
+
|
|
1581
|
+
// thru-ts-client-sdk/modules/proofs.ts
|
|
1582
|
+
async function generateStateProof(ctx, options) {
|
|
1583
|
+
const targetSlot = options.targetSlot ?? 0n;
|
|
1584
|
+
const request = protobuf.create(StateProofRequestSchema, {
|
|
1585
|
+
address: options.address ? Pubkey.from(options.address).toProtoPubkey() : void 0,
|
|
1586
|
+
proofType: options.proofType,
|
|
1587
|
+
targetSlot
|
|
1588
|
+
});
|
|
1589
|
+
const schemaRequest = protobuf.create(GenerateStateProofRequestSchema, { request });
|
|
1590
|
+
const response = await ctx.query.generateStateProof(
|
|
1591
|
+
schemaRequest,
|
|
1592
|
+
withCallOptions(ctx)
|
|
1593
|
+
);
|
|
1594
|
+
if (!response.proof) {
|
|
1595
|
+
throw new Error("State proof response missing proof");
|
|
1596
|
+
}
|
|
1597
|
+
return StateProof.fromProto(response.proof);
|
|
1598
|
+
}
|
|
1599
|
+
async function getStateRoots(ctx, options = {}) {
|
|
1600
|
+
const request = protobuf.create(GetStateRootsRequestSchema, {
|
|
1601
|
+
slot: options.slot
|
|
1602
|
+
});
|
|
1603
|
+
return ctx.query.getStateRoots(request, withCallOptions(ctx));
|
|
1604
|
+
}
|
|
1605
|
+
|
|
1606
|
+
// thru-ts-client-sdk/modules/accounts.ts
|
|
1607
|
+
function getAccount(ctx, address, options = {}) {
|
|
1608
|
+
const request = protobuf.create(GetAccountRequestSchema, {
|
|
1609
|
+
address: Pubkey.from(address).toProtoPubkey(),
|
|
1610
|
+
view: options.view ?? DEFAULT_ACCOUNT_VIEW,
|
|
1611
|
+
versionContext: options.versionContext ?? DEFAULT_VERSION_CONTEXT,
|
|
1612
|
+
minConsensus: options.minConsensus ?? DEFAULT_MIN_CONSENSUS,
|
|
1613
|
+
dataSlice: options.dataSlice
|
|
1614
|
+
});
|
|
1615
|
+
return ctx.query.getAccount(request, withCallOptions(ctx)).then(Account.fromProto);
|
|
1616
|
+
}
|
|
1617
|
+
function getRawAccount(ctx, address, options = {}) {
|
|
1618
|
+
const request = protobuf.create(GetRawAccountRequestSchema, {
|
|
1619
|
+
address: Pubkey.from(address).toProtoPubkey(),
|
|
1620
|
+
view: options.view ?? DEFAULT_ACCOUNT_VIEW,
|
|
1621
|
+
versionContext: options.versionContext ?? DEFAULT_VERSION_CONTEXT,
|
|
1622
|
+
minConsensus: options.minConsensus ?? DEFAULT_MIN_CONSENSUS
|
|
1623
|
+
});
|
|
1624
|
+
return ctx.query.getRawAccount(request, withCallOptions(ctx));
|
|
1625
|
+
}
|
|
1626
|
+
function listAccounts(ctx, options) {
|
|
1627
|
+
const request = protobuf.create(ListAccountsRequestSchema, {
|
|
1628
|
+
view: options.view ?? DEFAULT_ACCOUNT_VIEW,
|
|
1629
|
+
versionContext: options.versionContext ?? DEFAULT_VERSION_CONTEXT,
|
|
1630
|
+
filter: options.filter?.toProto(),
|
|
1631
|
+
page: options.page?.toProto(),
|
|
1632
|
+
minConsensus: options.minConsensus ?? DEFAULT_MIN_CONSENSUS
|
|
1633
|
+
});
|
|
1634
|
+
return ctx.query.listAccounts(request, withCallOptions(ctx)).then((response) => ({
|
|
1635
|
+
accounts: response.accounts.map((proto) => Account.fromProto(proto)),
|
|
1636
|
+
page: PageResponse.fromProto(response.page)
|
|
1637
|
+
}));
|
|
1638
|
+
}
|
|
1639
|
+
async function createAccount(ctx, options) {
|
|
1640
|
+
const feePayer = Pubkey.from(options.publicKey).toBytes();
|
|
1641
|
+
const proofResponse = await generateStateProof(ctx, {
|
|
1642
|
+
address: options.publicKey,
|
|
1643
|
+
proofType: 1 /* CREATING */
|
|
1644
|
+
// targetSlot omitted - server will auto-select
|
|
1645
|
+
});
|
|
1646
|
+
const proofBytes = proofResponse.proof;
|
|
1647
|
+
if (!proofBytes || proofBytes.length === 0) {
|
|
1648
|
+
throw new Error("State proof generation returned empty proof");
|
|
1649
|
+
}
|
|
1650
|
+
const startSlot = proofResponse.slot;
|
|
1651
|
+
const program = new Uint8Array(32);
|
|
1652
|
+
program[31] = 3;
|
|
1653
|
+
const builder = new TransactionBuilder();
|
|
1654
|
+
const headerDefaults = {
|
|
1655
|
+
fee: 0n,
|
|
1656
|
+
nonce: 0n,
|
|
1657
|
+
startSlot,
|
|
1658
|
+
expiryAfter: 100,
|
|
1659
|
+
computeUnits: 1e4,
|
|
1660
|
+
memoryUnits: 1e4,
|
|
1661
|
+
stateUnits: 1e4
|
|
1662
|
+
};
|
|
1663
|
+
const header = mergeTransactionHeader(headerDefaults, options.header);
|
|
1664
|
+
const transaction = builder.build({
|
|
1665
|
+
feePayer: { publicKey: feePayer },
|
|
1666
|
+
program,
|
|
1667
|
+
header,
|
|
1668
|
+
proofs: { feePayerStateProof: proofBytes }
|
|
1669
|
+
});
|
|
1670
|
+
return transaction;
|
|
1671
|
+
}
|
|
1672
|
+
|
|
1673
|
+
// thru-ts-client-sdk/domain/transactions/streaming.ts
|
|
1674
|
+
function toStreamTransactionUpdate(proto) {
|
|
1675
|
+
const signatureBytes = proto.signature?.value ? new Uint8Array(proto.signature.value) : new Uint8Array();
|
|
1676
|
+
const executionResult = proto.executionResult ? Transaction.executionResultFromProto(proto.executionResult) : void 0;
|
|
1677
|
+
if (!proto.header) {
|
|
1678
|
+
return {
|
|
1679
|
+
kind: "partial",
|
|
1680
|
+
signature: signatureBytes,
|
|
1681
|
+
slot: proto.slot,
|
|
1682
|
+
executionResult
|
|
1683
|
+
};
|
|
1684
|
+
}
|
|
1685
|
+
return {
|
|
1686
|
+
kind: "full",
|
|
1687
|
+
transaction: Transaction.fromProto(proto)
|
|
1688
|
+
};
|
|
1689
|
+
}
|
|
1690
|
+
function toTrackTransactionUpdate(response) {
|
|
1691
|
+
const signatureBytes = response.signature?.value ? new Uint8Array(response.signature.value) : void 0;
|
|
1692
|
+
const executionResult = response.executionResult ? Transaction.executionResultFromProto(response.executionResult) : void 0;
|
|
1693
|
+
return {
|
|
1694
|
+
signature: signatureBytes,
|
|
1695
|
+
status: consensusStatusToString(response.consensusStatus),
|
|
1696
|
+
statusCode: response.consensusStatus,
|
|
1697
|
+
slot: response.slot !== 0n ? response.slot : void 0,
|
|
1698
|
+
executionResult,
|
|
1699
|
+
transaction: void 0
|
|
1700
|
+
};
|
|
1701
|
+
}
|
|
1702
|
+
|
|
1703
|
+
// thru-ts-client-sdk/domain/transactions/TransactionStatusSnapshot.ts
|
|
1704
|
+
var TransactionStatusSnapshot = class _TransactionStatusSnapshot {
|
|
1705
|
+
constructor(params) {
|
|
1706
|
+
this.signature = copyBytes4(params.signature);
|
|
1707
|
+
this.statusCode = params.consensusStatus;
|
|
1708
|
+
this.status = params.consensusStatus != null ? consensusStatusToString(params.consensusStatus) : void 0;
|
|
1709
|
+
this.executionResult = params.executionResult;
|
|
1710
|
+
}
|
|
1711
|
+
static fromProto(proto) {
|
|
1712
|
+
if (!proto.signature?.value) {
|
|
1713
|
+
throw new Error("TransactionStatus proto missing signature");
|
|
1714
|
+
}
|
|
1715
|
+
return new _TransactionStatusSnapshot({
|
|
1716
|
+
signature: proto.signature.value,
|
|
1717
|
+
consensusStatus: proto.consensusStatus,
|
|
1718
|
+
executionResult: proto.executionResult ? Transaction.executionResultFromProto(proto.executionResult) : void 0
|
|
1719
|
+
});
|
|
1720
|
+
}
|
|
1721
|
+
};
|
|
1722
|
+
function copyBytes4(bytes) {
|
|
1723
|
+
const copy = new Uint8Array(bytes.length);
|
|
1724
|
+
copy.set(bytes);
|
|
1725
|
+
return copy;
|
|
1726
|
+
}
|
|
1727
|
+
|
|
1728
|
+
// thru-ts-client-sdk/domain/blocks/BlockFooter.ts
|
|
1729
|
+
var BlockFooter = class _BlockFooter {
|
|
1730
|
+
constructor(params) {
|
|
1731
|
+
this.signature = copyBytes5(params.signature);
|
|
1732
|
+
this.status = params.status;
|
|
1733
|
+
this.consumedComputeUnits = params.consumedComputeUnits;
|
|
1734
|
+
this.consumedStateUnits = params.consumedStateUnits;
|
|
1735
|
+
this.attestorPayment = params.attestorPayment;
|
|
1736
|
+
}
|
|
1737
|
+
static fromProto(proto) {
|
|
1738
|
+
return new _BlockFooter({
|
|
1739
|
+
signature: proto.signature?.value,
|
|
1740
|
+
status: proto.status ?? 0 /* UNSPECIFIED */,
|
|
1741
|
+
consumedComputeUnits: proto.consumedComputeUnits ?? 0n,
|
|
1742
|
+
consumedStateUnits: proto.consumedStateUnits ?? 0,
|
|
1743
|
+
attestorPayment: proto.attestorPayment ?? 0n
|
|
1744
|
+
});
|
|
1745
|
+
}
|
|
1746
|
+
};
|
|
1747
|
+
function copyBytes5(bytes) {
|
|
1748
|
+
if (!bytes) return void 0;
|
|
1749
|
+
const out = new Uint8Array(bytes.length);
|
|
1750
|
+
out.set(bytes);
|
|
1751
|
+
return out;
|
|
1752
|
+
}
|
|
1753
|
+
|
|
1754
|
+
// thru-ts-client-sdk/domain/blocks/BlockHeader.ts
|
|
1755
|
+
var BlockHeader = class _BlockHeader {
|
|
1756
|
+
constructor(params) {
|
|
1757
|
+
this.slot = params.slot;
|
|
1758
|
+
this.version = params.version;
|
|
1759
|
+
this.headerSignature = copyBytes6(params.headerSignature);
|
|
1760
|
+
this.producer = copyBytes6(params.producer);
|
|
1761
|
+
this.expiryTimestamp = params.expiryTimestamp;
|
|
1762
|
+
this.startSlot = params.startSlot;
|
|
1763
|
+
this.expiryAfter = params.expiryAfter;
|
|
1764
|
+
this.maxBlockSize = params.maxBlockSize;
|
|
1765
|
+
this.maxComputeUnits = params.maxComputeUnits;
|
|
1766
|
+
this.maxStateUnits = params.maxStateUnits;
|
|
1767
|
+
this.bondAmountLockUp = params.bondAmountLockUp;
|
|
1768
|
+
this.weightSlot = params.weightSlot;
|
|
1769
|
+
this.blockHash = copyBytes6(params.blockHash);
|
|
1770
|
+
this.chainId = params.chainId;
|
|
1771
|
+
}
|
|
1772
|
+
static fromProto(proto) {
|
|
1773
|
+
return new _BlockHeader({
|
|
1774
|
+
slot: proto.slot ?? 0n,
|
|
1775
|
+
version: proto.version ?? 0,
|
|
1776
|
+
headerSignature: proto.headerSignature?.value,
|
|
1777
|
+
producer: proto.producer?.value,
|
|
1778
|
+
expiryTimestamp: proto.expiryTimestamp,
|
|
1779
|
+
startSlot: proto.startSlot ?? 0n,
|
|
1780
|
+
expiryAfter: proto.expiryAfter,
|
|
1781
|
+
maxBlockSize: proto.maxBlockSize,
|
|
1782
|
+
maxComputeUnits: proto.maxComputeUnits,
|
|
1783
|
+
maxStateUnits: proto.maxStateUnits,
|
|
1784
|
+
bondAmountLockUp: proto.bondAmountLockUp,
|
|
1785
|
+
weightSlot: proto.weightSlot,
|
|
1786
|
+
blockHash: proto.blockHash?.value,
|
|
1787
|
+
chainId: proto.chainId
|
|
1788
|
+
});
|
|
1789
|
+
}
|
|
1790
|
+
withBlockHash(blockHash) {
|
|
1791
|
+
return new _BlockHeader({
|
|
1792
|
+
slot: this.slot,
|
|
1793
|
+
version: this.version,
|
|
1794
|
+
headerSignature: this.headerSignature,
|
|
1795
|
+
producer: this.producer,
|
|
1796
|
+
expiryTimestamp: this.expiryTimestamp,
|
|
1797
|
+
startSlot: this.startSlot,
|
|
1798
|
+
expiryAfter: this.expiryAfter,
|
|
1799
|
+
maxBlockSize: this.maxBlockSize,
|
|
1800
|
+
maxComputeUnits: this.maxComputeUnits,
|
|
1801
|
+
maxStateUnits: this.maxStateUnits,
|
|
1802
|
+
bondAmountLockUp: this.bondAmountLockUp,
|
|
1803
|
+
weightSlot: this.weightSlot,
|
|
1804
|
+
blockHash,
|
|
1805
|
+
chainId: this.chainId
|
|
1806
|
+
});
|
|
1807
|
+
}
|
|
1808
|
+
};
|
|
1809
|
+
function copyBytes6(bytes) {
|
|
1810
|
+
if (!bytes) return void 0;
|
|
1811
|
+
const out = new Uint8Array(bytes.length);
|
|
1812
|
+
out.set(bytes);
|
|
1813
|
+
return out;
|
|
1814
|
+
}
|
|
1815
|
+
|
|
1816
|
+
// thru-ts-client-sdk/domain/blocks/Block.ts
|
|
1817
|
+
var BLOCK_HASH_SIZE = 32;
|
|
1818
|
+
var RESERVED_FOOTER_PADDING = 0n;
|
|
1819
|
+
var SIGNATURE_PREFIX_SIZE = SIGNATURE_SIZE2;
|
|
1820
|
+
var Block = class _Block {
|
|
1821
|
+
constructor(params) {
|
|
1822
|
+
this.header = params.header;
|
|
1823
|
+
this.footer = params.footer;
|
|
1824
|
+
this.body = params.body ? new Uint8Array(params.body) : void 0;
|
|
1825
|
+
this.consensusStatus = params.consensusStatus;
|
|
1826
|
+
}
|
|
1827
|
+
static fromProto(proto) {
|
|
1828
|
+
if (!proto.header) {
|
|
1829
|
+
throw new Error("Block proto missing header");
|
|
1830
|
+
}
|
|
1831
|
+
const rawBody = proto.body ? new Uint8Array(proto.body) : void 0;
|
|
1832
|
+
const transactionBody = _Block.extractTransactionBody(rawBody, !!proto.footer);
|
|
1833
|
+
const block = new _Block({
|
|
1834
|
+
header: BlockHeader.fromProto(proto.header),
|
|
1835
|
+
footer: proto.footer ? BlockFooter.fromProto(proto.footer) : void 0,
|
|
1836
|
+
body: transactionBody,
|
|
1837
|
+
consensusStatus: proto.consensusStatus
|
|
1838
|
+
});
|
|
1839
|
+
block.attestorPayment = block.footer?.attestorPayment ?? 0n;
|
|
1840
|
+
return block;
|
|
1841
|
+
}
|
|
1842
|
+
static fromWire(data) {
|
|
1843
|
+
const result = _Block.tryParseWireWithHeaderSize(data, BLOCK_HEADER_SIZE);
|
|
1844
|
+
if (result) {
|
|
1845
|
+
return result;
|
|
1846
|
+
}
|
|
1847
|
+
const legacyResult = _Block.tryParseWireWithHeaderSize(data, BLOCK_HEADER_SIZE_LEGACY);
|
|
1848
|
+
if (legacyResult) {
|
|
1849
|
+
return legacyResult;
|
|
1850
|
+
}
|
|
1851
|
+
throw new Error(`Block data too short: ${data.length} bytes (expected at least ${BLOCK_HEADER_SIZE})`);
|
|
1852
|
+
}
|
|
1853
|
+
static tryParseWireWithHeaderSize(data, headerSize) {
|
|
1854
|
+
if (data.length < headerSize) {
|
|
1855
|
+
return null;
|
|
1856
|
+
}
|
|
1857
|
+
const headerBytes = data.slice(0, headerSize);
|
|
1858
|
+
let header;
|
|
1859
|
+
let blockTimeNs;
|
|
1860
|
+
try {
|
|
1861
|
+
const parsed = this.parseHeaderWithSize(headerBytes, headerSize);
|
|
1862
|
+
header = parsed.header;
|
|
1863
|
+
blockTimeNs = parsed.blockTimeNs;
|
|
1864
|
+
} catch {
|
|
1865
|
+
return null;
|
|
1866
|
+
}
|
|
1867
|
+
if (header.version !== BLOCK_VERSION_V1) {
|
|
1868
|
+
return null;
|
|
1869
|
+
}
|
|
1870
|
+
let finalHeader = header;
|
|
1871
|
+
let footer;
|
|
1872
|
+
let footerInfo;
|
|
1873
|
+
let body;
|
|
1874
|
+
if (data.length >= headerSize + BLOCK_FOOTER_SIZE) {
|
|
1875
|
+
const footerOffset = data.length - BLOCK_FOOTER_SIZE;
|
|
1876
|
+
const footerBytes = data.slice(footerOffset);
|
|
1877
|
+
try {
|
|
1878
|
+
const parsedFooter = this.parseFooter(footerBytes);
|
|
1879
|
+
footer = parsedFooter.footer;
|
|
1880
|
+
footerInfo = { blockHash: parsedFooter.blockHash, attestorPayment: parsedFooter.attestorPayment };
|
|
1881
|
+
finalHeader = header.withBlockHash(parsedFooter.blockHash);
|
|
1882
|
+
} catch {
|
|
1883
|
+
return null;
|
|
1884
|
+
}
|
|
1885
|
+
body = footerOffset > headerSize ? data.slice(headerSize, footerOffset) : void 0;
|
|
1886
|
+
} else {
|
|
1887
|
+
body = data.length > headerSize ? data.slice(headerSize) : void 0;
|
|
1888
|
+
}
|
|
1889
|
+
if (body && body.length > 0 && !_Block.looksLikeValidTransactionBody(body)) {
|
|
1890
|
+
return null;
|
|
1891
|
+
}
|
|
1892
|
+
const block = new _Block({ header: finalHeader, footer, body });
|
|
1893
|
+
block.blockTimeNs = blockTimeNs;
|
|
1894
|
+
block.attestorPayment = footerInfo?.attestorPayment ?? 0n;
|
|
1895
|
+
return block;
|
|
1896
|
+
}
|
|
1897
|
+
toWire() {
|
|
1898
|
+
const headerBytes = this.serializeHeader();
|
|
1899
|
+
const bodyBytes = this.body ?? new Uint8Array(0);
|
|
1900
|
+
const footerBytes = this.footer ? this.serializeFooter() : void 0;
|
|
1901
|
+
const totalLength = headerBytes.length + bodyBytes.length + (footerBytes?.length ?? 0);
|
|
1902
|
+
const result = new Uint8Array(totalLength);
|
|
1903
|
+
result.set(headerBytes, 0);
|
|
1904
|
+
result.set(bodyBytes, headerBytes.length);
|
|
1905
|
+
if (footerBytes) {
|
|
1906
|
+
result.set(footerBytes, headerBytes.length + bodyBytes.length);
|
|
1907
|
+
}
|
|
1908
|
+
return result;
|
|
1909
|
+
}
|
|
1910
|
+
getTransactions() {
|
|
1911
|
+
if (!this.body || this.body.length === 0) {
|
|
1912
|
+
return [];
|
|
1913
|
+
}
|
|
1914
|
+
return _Block.parseTransactionsFromBody(this.body);
|
|
1915
|
+
}
|
|
1916
|
+
static extractTransactionBody(raw, hasFooter) {
|
|
1917
|
+
if (!raw || raw.length === 0) {
|
|
1918
|
+
return void 0;
|
|
1919
|
+
}
|
|
1920
|
+
const bodyWithCurrentHeader = _Block.extractWithHeaderSize(raw, hasFooter, BLOCK_HEADER_SIZE);
|
|
1921
|
+
if (bodyWithCurrentHeader && bodyWithCurrentHeader.length > 0 && _Block.looksLikeValidTransactionBody(bodyWithCurrentHeader)) {
|
|
1922
|
+
return bodyWithCurrentHeader;
|
|
1923
|
+
}
|
|
1924
|
+
const bodyWithLegacyHeader = _Block.extractWithHeaderSize(raw, hasFooter, BLOCK_HEADER_SIZE_LEGACY);
|
|
1925
|
+
if (bodyWithLegacyHeader && bodyWithLegacyHeader.length > 0 && _Block.looksLikeValidTransactionBody(bodyWithLegacyHeader)) {
|
|
1926
|
+
return bodyWithLegacyHeader;
|
|
1927
|
+
}
|
|
1928
|
+
return void 0;
|
|
1929
|
+
}
|
|
1930
|
+
static extractWithHeaderSize(raw, hasFooter, headerSize) {
|
|
1931
|
+
if (raw.length <= headerSize) {
|
|
1932
|
+
return void 0;
|
|
1933
|
+
}
|
|
1934
|
+
const footerSize = hasFooter && raw.length >= headerSize + BLOCK_FOOTER_SIZE ? BLOCK_FOOTER_SIZE : 0;
|
|
1935
|
+
const start = headerSize;
|
|
1936
|
+
const end = Math.max(start, raw.length - footerSize);
|
|
1937
|
+
if (end <= start) {
|
|
1938
|
+
return void 0;
|
|
1939
|
+
}
|
|
1940
|
+
return raw.slice(start, end);
|
|
1941
|
+
}
|
|
1942
|
+
/**
|
|
1943
|
+
* Checks if the data looks like a valid transaction body.
|
|
1944
|
+
* Uses heuristics to detect if we've correctly offset into the block data.
|
|
1945
|
+
* Wire format: header (112 bytes) + body + signature (64 bytes at end)
|
|
1946
|
+
* This is a lenient heuristic for format detection - version/flag validation
|
|
1947
|
+
* happens in Transaction.parseWire.
|
|
1948
|
+
*/
|
|
1949
|
+
static looksLikeValidTransactionBody(data) {
|
|
1950
|
+
const MIN_TXN_SIZE = TXN_HEADER_BODY_SIZE + SIGNATURE_SIZE2;
|
|
1951
|
+
if (data.length < MIN_TXN_SIZE) {
|
|
1952
|
+
return false;
|
|
1953
|
+
}
|
|
1954
|
+
const readwriteCount = data[2] | data[3] << 8;
|
|
1955
|
+
const readonlyCount = data[4] | data[5] << 8;
|
|
1956
|
+
const totalAccounts = readwriteCount + readonlyCount;
|
|
1957
|
+
if (totalAccounts > 1024) {
|
|
1958
|
+
return false;
|
|
1959
|
+
}
|
|
1960
|
+
const instrDataSize = data[6] | data[7] << 8;
|
|
1961
|
+
const expectedMinSize = TXN_HEADER_BODY_SIZE + totalAccounts * PUBKEY_SIZE2 + instrDataSize + SIGNATURE_SIZE2;
|
|
1962
|
+
if (data.length < expectedMinSize) {
|
|
1963
|
+
return false;
|
|
1964
|
+
}
|
|
1965
|
+
return true;
|
|
1966
|
+
}
|
|
1967
|
+
serializeHeader() {
|
|
1968
|
+
const buffer = new ArrayBuffer(BLOCK_HEADER_SIZE);
|
|
1969
|
+
const bytes = new Uint8Array(buffer);
|
|
1970
|
+
const view = new DataView(buffer);
|
|
1971
|
+
const signature = normalizeBytes(this.header.headerSignature, SIGNATURE_SIZE2);
|
|
1972
|
+
bytes.set(signature, 0);
|
|
1973
|
+
let offset = SIGNATURE_PREFIX_SIZE;
|
|
1974
|
+
const version = this.header.version ?? BLOCK_VERSION_V1;
|
|
1975
|
+
view.setUint8(offset, version & 255);
|
|
1976
|
+
offset += 1;
|
|
1977
|
+
bytes.fill(0, offset, offset + 5);
|
|
1978
|
+
offset += 5;
|
|
1979
|
+
view.setUint16(offset, this.header.chainId ?? 0, true);
|
|
1980
|
+
offset += 2;
|
|
1981
|
+
const producer = normalizeBytes(this.header.producer, PUBKEY_SIZE2);
|
|
1982
|
+
bytes.set(producer, offset);
|
|
1983
|
+
offset += PUBKEY_SIZE2;
|
|
1984
|
+
const bondAmountLockUp = this.header.bondAmountLockUp ?? 0n;
|
|
1985
|
+
view.setBigUint64(offset, bondAmountLockUp, true);
|
|
1986
|
+
offset += 8;
|
|
1987
|
+
const expiryTimestampNs = timestampToNanoseconds(this.header.expiryTimestamp);
|
|
1988
|
+
view.setBigUint64(offset, expiryTimestampNs, true);
|
|
1989
|
+
offset += 8;
|
|
1990
|
+
const startSlot = this.header.startSlot ?? 0n;
|
|
1991
|
+
view.setBigUint64(offset, startSlot, true);
|
|
1992
|
+
offset += 8;
|
|
1993
|
+
view.setUint32(offset, this.header.expiryAfter ?? 0, true);
|
|
1994
|
+
offset += 4;
|
|
1995
|
+
view.setUint32(offset, this.header.maxBlockSize ?? 0, true);
|
|
1996
|
+
offset += 4;
|
|
1997
|
+
view.setBigUint64(offset, this.header.maxComputeUnits ?? 0n, true);
|
|
1998
|
+
offset += 8;
|
|
1999
|
+
view.setUint32(offset, this.header.maxStateUnits ?? 0, true);
|
|
2000
|
+
offset += 4;
|
|
2001
|
+
bytes.fill(0, offset, offset + 4);
|
|
2002
|
+
offset += 4;
|
|
2003
|
+
view.setBigUint64(offset, this.header.weightSlot ?? 0n, true);
|
|
2004
|
+
offset += 8;
|
|
2005
|
+
const blockTimeNs = this.blockTimeNs ?? 0n;
|
|
2006
|
+
view.setBigUint64(offset, blockTimeNs, true);
|
|
2007
|
+
return bytes;
|
|
2008
|
+
}
|
|
2009
|
+
serializeFooter() {
|
|
2010
|
+
const buffer = new ArrayBuffer(BLOCK_FOOTER_SIZE);
|
|
2011
|
+
const bytes = new Uint8Array(buffer);
|
|
2012
|
+
const view = new DataView(buffer);
|
|
2013
|
+
const attestorPayment = this.footer?.attestorPayment ?? this.attestorPayment ?? RESERVED_FOOTER_PADDING;
|
|
2014
|
+
view.setBigUint64(0, attestorPayment, true);
|
|
2015
|
+
const blockHash = normalizeBytes(this.header.blockHash, BLOCK_HASH_SIZE);
|
|
2016
|
+
bytes.set(blockHash, 8);
|
|
2017
|
+
const signature = normalizeBytes(this.footer?.signature, SIGNATURE_SIZE2);
|
|
2018
|
+
bytes.set(signature, 8 + BLOCK_HASH_SIZE);
|
|
2019
|
+
return bytes;
|
|
2020
|
+
}
|
|
2021
|
+
static parseHeader(bytes) {
|
|
2022
|
+
if (bytes.length !== BLOCK_HEADER_SIZE) {
|
|
2023
|
+
throw new Error(`Invalid block header size: ${bytes.length}`);
|
|
2024
|
+
}
|
|
2025
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
2026
|
+
let offset = 0;
|
|
2027
|
+
const signature = bytes.slice(offset, offset + SIGNATURE_SIZE2);
|
|
2028
|
+
offset += SIGNATURE_SIZE2;
|
|
2029
|
+
const version = view.getUint8(offset);
|
|
2030
|
+
offset += 1;
|
|
2031
|
+
offset += 5;
|
|
2032
|
+
const chainId = view.getUint16(offset, true);
|
|
2033
|
+
offset += 2;
|
|
2034
|
+
const producer = bytes.slice(offset, offset + PUBKEY_SIZE2);
|
|
2035
|
+
offset += PUBKEY_SIZE2;
|
|
2036
|
+
const bondAmountLockUp = view.getBigUint64(offset, true);
|
|
2037
|
+
offset += 8;
|
|
2038
|
+
const expiryTimestampNs = view.getBigUint64(offset, true);
|
|
2039
|
+
offset += 8;
|
|
2040
|
+
const startSlot = view.getBigUint64(offset, true);
|
|
2041
|
+
offset += 8;
|
|
2042
|
+
const expiryAfter = view.getUint32(offset, true);
|
|
2043
|
+
offset += 4;
|
|
2044
|
+
const maxBlockSize = view.getUint32(offset, true);
|
|
2045
|
+
offset += 4;
|
|
2046
|
+
const maxComputeUnits = view.getBigUint64(offset, true);
|
|
2047
|
+
offset += 8;
|
|
2048
|
+
const maxStateUnits = view.getUint32(offset, true);
|
|
2049
|
+
offset += 4;
|
|
2050
|
+
offset += 4;
|
|
2051
|
+
const weightSlot = view.getBigUint64(offset, true);
|
|
2052
|
+
offset += 8;
|
|
2053
|
+
const blockTimeNs = view.getBigUint64(offset, true);
|
|
2054
|
+
const header = new BlockHeader({
|
|
2055
|
+
slot: startSlot,
|
|
2056
|
+
version,
|
|
2057
|
+
headerSignature: signature,
|
|
2058
|
+
producer,
|
|
2059
|
+
expiryTimestamp: nanosecondsToTimestamp(expiryTimestampNs),
|
|
2060
|
+
startSlot,
|
|
2061
|
+
expiryAfter,
|
|
2062
|
+
maxBlockSize,
|
|
2063
|
+
maxComputeUnits,
|
|
2064
|
+
maxStateUnits,
|
|
2065
|
+
bondAmountLockUp,
|
|
2066
|
+
weightSlot,
|
|
2067
|
+
chainId
|
|
2068
|
+
});
|
|
2069
|
+
return { header, blockTimeNs };
|
|
2070
|
+
}
|
|
2071
|
+
/**
|
|
2072
|
+
* Parses a block header with a specific expected size.
|
|
2073
|
+
* Handles both current (168 bytes with weight_slot) and legacy (160 bytes without weight_slot) formats.
|
|
2074
|
+
*/
|
|
2075
|
+
static parseHeaderWithSize(bytes, expectedSize) {
|
|
2076
|
+
if (bytes.length !== expectedSize) {
|
|
2077
|
+
throw new Error(`Invalid block header size: ${bytes.length}, expected ${expectedSize}`);
|
|
2078
|
+
}
|
|
2079
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
2080
|
+
let offset = 0;
|
|
2081
|
+
const signature = bytes.slice(offset, offset + SIGNATURE_SIZE2);
|
|
2082
|
+
offset += SIGNATURE_SIZE2;
|
|
2083
|
+
const version = view.getUint8(offset);
|
|
2084
|
+
offset += 1;
|
|
2085
|
+
offset += 5;
|
|
2086
|
+
const chainId = view.getUint16(offset, true);
|
|
2087
|
+
offset += 2;
|
|
2088
|
+
const producer = bytes.slice(offset, offset + PUBKEY_SIZE2);
|
|
2089
|
+
offset += PUBKEY_SIZE2;
|
|
2090
|
+
const bondAmountLockUp = view.getBigUint64(offset, true);
|
|
2091
|
+
offset += 8;
|
|
2092
|
+
const expiryTimestampNs = view.getBigUint64(offset, true);
|
|
2093
|
+
offset += 8;
|
|
2094
|
+
const startSlot = view.getBigUint64(offset, true);
|
|
2095
|
+
offset += 8;
|
|
2096
|
+
const expiryAfter = view.getUint32(offset, true);
|
|
2097
|
+
offset += 4;
|
|
2098
|
+
const maxBlockSize = view.getUint32(offset, true);
|
|
2099
|
+
offset += 4;
|
|
2100
|
+
const maxComputeUnits = view.getBigUint64(offset, true);
|
|
2101
|
+
offset += 8;
|
|
2102
|
+
const maxStateUnits = view.getUint32(offset, true);
|
|
2103
|
+
offset += 4;
|
|
2104
|
+
offset += 4;
|
|
2105
|
+
let weightSlot;
|
|
2106
|
+
let blockTimeNs;
|
|
2107
|
+
if (expectedSize === BLOCK_HEADER_SIZE) {
|
|
2108
|
+
weightSlot = view.getBigUint64(offset, true);
|
|
2109
|
+
offset += 8;
|
|
2110
|
+
blockTimeNs = view.getBigUint64(offset, true);
|
|
2111
|
+
} else {
|
|
2112
|
+
blockTimeNs = view.getBigUint64(offset, true);
|
|
2113
|
+
}
|
|
2114
|
+
const header = new BlockHeader({
|
|
2115
|
+
slot: startSlot,
|
|
2116
|
+
version,
|
|
2117
|
+
headerSignature: signature,
|
|
2118
|
+
producer,
|
|
2119
|
+
expiryTimestamp: nanosecondsToTimestamp(expiryTimestampNs),
|
|
2120
|
+
startSlot,
|
|
2121
|
+
expiryAfter,
|
|
2122
|
+
maxBlockSize,
|
|
2123
|
+
maxComputeUnits,
|
|
2124
|
+
maxStateUnits,
|
|
2125
|
+
bondAmountLockUp,
|
|
2126
|
+
weightSlot,
|
|
2127
|
+
chainId
|
|
2128
|
+
});
|
|
2129
|
+
return { header, blockTimeNs };
|
|
2130
|
+
}
|
|
2131
|
+
static parseFooter(bytes) {
|
|
2132
|
+
if (bytes.length !== BLOCK_FOOTER_SIZE) {
|
|
2133
|
+
throw new Error(`Invalid block footer size: ${bytes.length}`);
|
|
2134
|
+
}
|
|
2135
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
2136
|
+
let offset = 0;
|
|
2137
|
+
const attestorPayment = view.getBigUint64(offset, true);
|
|
2138
|
+
offset += 8;
|
|
2139
|
+
const blockHash = bytes.slice(offset, offset + BLOCK_HASH_SIZE);
|
|
2140
|
+
offset += BLOCK_HASH_SIZE;
|
|
2141
|
+
const signature = bytes.slice(offset, offset + SIGNATURE_SIZE2);
|
|
2142
|
+
const footer = new BlockFooter({
|
|
2143
|
+
signature,
|
|
2144
|
+
status: 0 /* UNSPECIFIED */,
|
|
2145
|
+
consumedComputeUnits: 0n,
|
|
2146
|
+
consumedStateUnits: 0,
|
|
2147
|
+
attestorPayment
|
|
2148
|
+
});
|
|
2149
|
+
return { footer, blockHash, attestorPayment };
|
|
2150
|
+
}
|
|
2151
|
+
static parseTransactionsFromBody(body) {
|
|
2152
|
+
const transactions = [];
|
|
2153
|
+
let offset = 0;
|
|
2154
|
+
while (offset < body.length) {
|
|
2155
|
+
const slice = body.subarray(offset);
|
|
2156
|
+
if (slice.length < 176) {
|
|
2157
|
+
break;
|
|
2158
|
+
}
|
|
2159
|
+
try {
|
|
2160
|
+
const { transaction, size } = Transaction.parseWire(slice);
|
|
2161
|
+
transactions.push(transaction);
|
|
2162
|
+
offset += size;
|
|
2163
|
+
} catch {
|
|
2164
|
+
break;
|
|
2165
|
+
}
|
|
2166
|
+
}
|
|
2167
|
+
return transactions;
|
|
2168
|
+
}
|
|
2169
|
+
};
|
|
2170
|
+
function normalizeBytes(bytes, size) {
|
|
2171
|
+
if (!bytes || bytes.length !== size) {
|
|
2172
|
+
return new Uint8Array(size);
|
|
2173
|
+
}
|
|
2174
|
+
return bytes;
|
|
2175
|
+
}
|
|
2176
|
+
function toBlockHash(value) {
|
|
2177
|
+
return protobuf.create(BlockHashSchema, { value: ensureBytes(value, "blockHash") });
|
|
2178
|
+
}
|
|
2179
|
+
function deriveProgramAddress(options) {
|
|
2180
|
+
const programAddress = Pubkey.from(options.programAddress).toBytes();
|
|
2181
|
+
const seed = normalizeSeed(options.seed);
|
|
2182
|
+
const ephemeral = options.ephemeral === true;
|
|
2183
|
+
const derivationInput = new Uint8Array(
|
|
2184
|
+
programAddress.length + 1 + seed.length
|
|
2185
|
+
);
|
|
2186
|
+
derivationInput.set(programAddress, 0);
|
|
2187
|
+
derivationInput[programAddress.length] = ephemeral ? 1 : 0;
|
|
2188
|
+
derivationInput.set(seed, programAddress.length + 1);
|
|
2189
|
+
const hash = sha2_js.sha256(derivationInput);
|
|
2190
|
+
const derivedBytes = new Uint8Array(hash.slice(0, 32));
|
|
2191
|
+
return {
|
|
2192
|
+
bytes: derivedBytes,
|
|
2193
|
+
address: encodeAddress(derivedBytes)
|
|
2194
|
+
};
|
|
2195
|
+
}
|
|
2196
|
+
function deriveAddress(inputs) {
|
|
2197
|
+
if (inputs.length === 0) {
|
|
2198
|
+
throw new Error("At least one input is required");
|
|
2199
|
+
}
|
|
2200
|
+
const normalizedInputs = inputs.map((input) => normalizeToBytes(input));
|
|
2201
|
+
const totalLength = normalizedInputs.reduce(
|
|
2202
|
+
(sum, arr) => sum + arr.length,
|
|
2203
|
+
0
|
|
2204
|
+
);
|
|
2205
|
+
const derivationInput = new Uint8Array(totalLength);
|
|
2206
|
+
let offset = 0;
|
|
2207
|
+
for (const input of normalizedInputs) {
|
|
2208
|
+
derivationInput.set(input, offset);
|
|
2209
|
+
offset += input.length;
|
|
2210
|
+
}
|
|
2211
|
+
const hash = sha2_js.sha256(derivationInput);
|
|
2212
|
+
const derivedBytes = new Uint8Array(hash.slice(0, 32));
|
|
2213
|
+
return {
|
|
2214
|
+
bytes: derivedBytes,
|
|
2215
|
+
address: encodeAddress(derivedBytes)
|
|
2216
|
+
};
|
|
2217
|
+
}
|
|
2218
|
+
function normalizeToBytes(input) {
|
|
2219
|
+
if (input instanceof Uint8Array) {
|
|
2220
|
+
return input;
|
|
2221
|
+
}
|
|
2222
|
+
return Pubkey.from(input).toBytes();
|
|
2223
|
+
}
|
|
2224
|
+
function normalizeSeed(value) {
|
|
2225
|
+
if (value instanceof Uint8Array) {
|
|
2226
|
+
if (value.length === 0) {
|
|
2227
|
+
throw new Error("Seed cannot be empty");
|
|
2228
|
+
}
|
|
2229
|
+
if (value.length > 32) {
|
|
2230
|
+
throw new Error("Seed cannot exceed 32 bytes");
|
|
2231
|
+
}
|
|
2232
|
+
const seed = new Uint8Array(32);
|
|
2233
|
+
seed.set(value);
|
|
2234
|
+
return seed;
|
|
2235
|
+
}
|
|
2236
|
+
if (typeof value === "string") {
|
|
2237
|
+
if (value.length === 0) {
|
|
2238
|
+
throw new Error("Seed cannot be empty");
|
|
2239
|
+
}
|
|
2240
|
+
if (isHexString(value)) {
|
|
2241
|
+
const bytes = hexToBytes(value);
|
|
2242
|
+
if (bytes.length !== 32) {
|
|
2243
|
+
throw new Error(
|
|
2244
|
+
`Hex seed must decode to 32 bytes, got ${bytes.length}`
|
|
2245
|
+
);
|
|
2246
|
+
}
|
|
2247
|
+
return bytes;
|
|
2248
|
+
}
|
|
2249
|
+
const encoder = new TextEncoder();
|
|
2250
|
+
const utf8 = encoder.encode(value);
|
|
2251
|
+
if (utf8.length > 32) {
|
|
2252
|
+
throw new Error(`UTF-8 seed too long: ${utf8.length} bytes (max 32)`);
|
|
2253
|
+
}
|
|
2254
|
+
const seed = new Uint8Array(32);
|
|
2255
|
+
seed.set(utf8);
|
|
2256
|
+
return seed;
|
|
2257
|
+
}
|
|
2258
|
+
throw new Error("Seed must be provided as Uint8Array or string");
|
|
2259
|
+
}
|
|
2260
|
+
|
|
2261
|
+
// thru-ts-client-sdk/modules/blocks.ts
|
|
2262
|
+
async function getBlock(ctx, selector, options = {}) {
|
|
2263
|
+
const request = protobuf.create(GetBlockRequestSchema, {
|
|
2264
|
+
selector: isSlotSelector(selector) ? { case: "slot", value: typeof selector.slot === "bigint" ? selector.slot : BigInt(selector.slot) } : { case: "blockHash", value: toBlockHash(selector.blockHash) },
|
|
2265
|
+
view: options.view ?? DEFAULT_BLOCK_VIEW,
|
|
2266
|
+
minConsensus: options.minConsensus ?? DEFAULT_MIN_CONSENSUS
|
|
2267
|
+
});
|
|
2268
|
+
const proto = await ctx.query.getBlock(request, withCallOptions(ctx));
|
|
2269
|
+
const protoBlock = Block.fromProto(proto);
|
|
2270
|
+
try {
|
|
2271
|
+
const rawBlock = await getRawBlock(ctx, selector);
|
|
2272
|
+
const rawBytes = rawBlock?.rawBlock;
|
|
2273
|
+
if (rawBytes && rawBytes.length >= BLOCK_HEADER_SIZE) {
|
|
2274
|
+
const rawBlockParsed = Block.fromWire(rawBytes);
|
|
2275
|
+
if (rawBlockParsed.blockTimeNs !== void 0) {
|
|
2276
|
+
protoBlock.blockTimeNs = rawBlockParsed.blockTimeNs;
|
|
2277
|
+
}
|
|
2278
|
+
if (rawBlockParsed.attestorPayment !== void 0) {
|
|
2279
|
+
protoBlock.attestorPayment = rawBlockParsed.attestorPayment;
|
|
2280
|
+
}
|
|
2281
|
+
}
|
|
2282
|
+
} catch (error) {
|
|
2283
|
+
console.debug("blocks.getBlock: failed to enrich with raw block", error);
|
|
2284
|
+
}
|
|
2285
|
+
return protoBlock;
|
|
2286
|
+
}
|
|
2287
|
+
function getRawBlock(ctx, selector, options = {}) {
|
|
2288
|
+
const request = protobuf.create(GetRawBlockRequestSchema, {
|
|
2289
|
+
selector: isSlotSelector(selector) ? { case: "slot", value: typeof selector.slot === "bigint" ? selector.slot : BigInt(selector.slot) } : { case: "blockHash", value: toBlockHash(selector.blockHash) },
|
|
2290
|
+
minConsensus: options.minConsensus ?? DEFAULT_MIN_CONSENSUS
|
|
2291
|
+
});
|
|
2292
|
+
return ctx.query.getRawBlock(request, withCallOptions(ctx));
|
|
2293
|
+
}
|
|
2294
|
+
async function listBlocks(ctx, options = {}) {
|
|
2295
|
+
const request = protobuf.create(ListBlocksRequestSchema, {
|
|
2296
|
+
filter: options.filter?.toProto(),
|
|
2297
|
+
page: options.page?.toProto(),
|
|
2298
|
+
view: options.view ?? DEFAULT_BLOCK_VIEW,
|
|
2299
|
+
minConsensus: options.minConsensus ?? DEFAULT_MIN_CONSENSUS
|
|
2300
|
+
});
|
|
2301
|
+
const response = await ctx.query.listBlocks(request, withCallOptions(ctx));
|
|
2302
|
+
return {
|
|
2303
|
+
blocks: response.blocks.map((proto) => Block.fromProto(proto)),
|
|
2304
|
+
page: PageResponse.fromProto(response.page)
|
|
2305
|
+
};
|
|
2306
|
+
}
|
|
2307
|
+
function currentVersionContext() {
|
|
2308
|
+
return protobuf.create(VersionContextSchema, {
|
|
2309
|
+
version: { case: "current", value: protobuf.create(CurrentVersionSchema) }
|
|
2310
|
+
});
|
|
2311
|
+
}
|
|
2312
|
+
function currentOrHistoricalVersionContext() {
|
|
2313
|
+
return protobuf.create(VersionContextSchema, {
|
|
2314
|
+
version: { case: "currentOrHistorical", value: protobuf.create(CurrentOrHistoricalVersionSchema) }
|
|
2315
|
+
});
|
|
2316
|
+
}
|
|
2317
|
+
function slotVersionContext(slot) {
|
|
2318
|
+
return protobuf.create(VersionContextSchema, {
|
|
2319
|
+
version: { case: "slot", value: toUint64(slot, "slot") }
|
|
2320
|
+
});
|
|
2321
|
+
}
|
|
2322
|
+
function timestampVersionContext(value) {
|
|
2323
|
+
return protobuf.create(VersionContextSchema, {
|
|
2324
|
+
version: { case: "timestamp", value: normalizeTimestamp(value) }
|
|
2325
|
+
});
|
|
2326
|
+
}
|
|
2327
|
+
function seqVersionContext(seq) {
|
|
2328
|
+
return protobuf.create(VersionContextSchema, {
|
|
2329
|
+
version: { case: "seq", value: toUint64(seq, "seq") }
|
|
2330
|
+
});
|
|
2331
|
+
}
|
|
2332
|
+
function versionContext(input) {
|
|
2333
|
+
if (!input) {
|
|
2334
|
+
return currentVersionContext();
|
|
2335
|
+
}
|
|
2336
|
+
if ("version" in input) {
|
|
2337
|
+
return input;
|
|
2338
|
+
}
|
|
2339
|
+
if ("current" in input) {
|
|
2340
|
+
return currentVersionContext();
|
|
2341
|
+
}
|
|
2342
|
+
if ("currentOrHistorical" in input) {
|
|
2343
|
+
return currentOrHistoricalVersionContext();
|
|
2344
|
+
}
|
|
2345
|
+
if ("slot" in input) {
|
|
2346
|
+
return slotVersionContext(input.slot);
|
|
2347
|
+
}
|
|
2348
|
+
if ("timestamp" in input) {
|
|
2349
|
+
return timestampVersionContext(input.timestamp);
|
|
2350
|
+
}
|
|
2351
|
+
if ("seq" in input) {
|
|
2352
|
+
return seqVersionContext(input.seq);
|
|
2353
|
+
}
|
|
2354
|
+
throw new Error("Version context input must specify current, slot, timestamp, or seq");
|
|
2355
|
+
}
|
|
2356
|
+
function toUint64(value, field) {
|
|
2357
|
+
if (typeof value === "bigint") {
|
|
2358
|
+
if (value < 0n) {
|
|
2359
|
+
throw new Error(`${field} must be non-negative`);
|
|
2360
|
+
}
|
|
2361
|
+
return value;
|
|
2362
|
+
}
|
|
2363
|
+
if (!Number.isFinite(value) || !Number.isInteger(value) || value < 0) {
|
|
2364
|
+
throw new Error(`${field} must be a non-negative integer`);
|
|
2365
|
+
}
|
|
2366
|
+
return BigInt(value);
|
|
2367
|
+
}
|
|
2368
|
+
function normalizeTimestamp(value) {
|
|
2369
|
+
if (value instanceof Date) {
|
|
2370
|
+
const ms = value.getTime();
|
|
2371
|
+
return {
|
|
2372
|
+
seconds: BigInt(Math.floor(ms / 1e3)),
|
|
2373
|
+
nanos: ms % 1e3 * 1e6
|
|
2374
|
+
};
|
|
2375
|
+
}
|
|
2376
|
+
if (typeof value === "number") {
|
|
2377
|
+
if (!Number.isFinite(value)) {
|
|
2378
|
+
throw new Error("timestamp must be a finite number");
|
|
2379
|
+
}
|
|
2380
|
+
const ms = Math.trunc(value);
|
|
2381
|
+
return {
|
|
2382
|
+
seconds: BigInt(Math.floor(ms / 1e3)),
|
|
2383
|
+
nanos: ms % 1e3 * 1e6
|
|
2384
|
+
};
|
|
2385
|
+
}
|
|
2386
|
+
if (typeof value === "object" && value !== null) {
|
|
2387
|
+
return value;
|
|
2388
|
+
}
|
|
2389
|
+
throw new Error("timestamp must be a Date, number, or protobuf Timestamp");
|
|
2390
|
+
}
|
|
2391
|
+
|
|
2392
|
+
// thru-ts-client-sdk/domain/events/ChainEvent.ts
|
|
2393
|
+
var ChainEvent = class _ChainEvent {
|
|
2394
|
+
constructor(params) {
|
|
2395
|
+
if (!params.id) {
|
|
2396
|
+
throw new Error("ChainEvent id is required");
|
|
2397
|
+
}
|
|
2398
|
+
this.id = params.id;
|
|
2399
|
+
this.transactionSignature = copyBytes7(params.transactionSignature);
|
|
2400
|
+
this.program = copyBytes7(params.program);
|
|
2401
|
+
this.payload = copyBytes7(params.payload);
|
|
2402
|
+
this.slot = params.slot;
|
|
2403
|
+
this.callIndex = params.callIndex;
|
|
2404
|
+
this.programIndex = params.programIndex;
|
|
2405
|
+
this.payloadSize = params.payloadSize;
|
|
2406
|
+
this.timestampNs = params.timestampNs;
|
|
2407
|
+
}
|
|
2408
|
+
static fromQuery(proto) {
|
|
2409
|
+
return new _ChainEvent({
|
|
2410
|
+
id: proto.eventId,
|
|
2411
|
+
transactionSignature: proto.transactionSignature?.value,
|
|
2412
|
+
program: proto.program?.value,
|
|
2413
|
+
payload: proto.payload,
|
|
2414
|
+
slot: proto.slot,
|
|
2415
|
+
callIndex: proto.callIdx,
|
|
2416
|
+
programIndex: proto.programIdx,
|
|
2417
|
+
payloadSize: proto.payloadSize
|
|
2418
|
+
});
|
|
2419
|
+
}
|
|
2420
|
+
static fromStream(proto) {
|
|
2421
|
+
const id = normalizeStreamEventId(proto.eventId);
|
|
2422
|
+
return new _ChainEvent({
|
|
2423
|
+
id,
|
|
2424
|
+
transactionSignature: proto.signature?.value,
|
|
2425
|
+
program: proto.program?.value,
|
|
2426
|
+
payload: proto.payload,
|
|
2427
|
+
slot: proto.slot,
|
|
2428
|
+
callIndex: proto.callIdx,
|
|
2429
|
+
timestampNs: timestampToNanoseconds(proto.timestamp)
|
|
2430
|
+
});
|
|
2431
|
+
}
|
|
2432
|
+
};
|
|
2433
|
+
function copyBytes7(input) {
|
|
2434
|
+
if (!input) {
|
|
2435
|
+
return void 0;
|
|
2436
|
+
}
|
|
2437
|
+
const copy = new Uint8Array(input.length);
|
|
2438
|
+
copy.set(input);
|
|
2439
|
+
return copy;
|
|
2440
|
+
}
|
|
2441
|
+
function normalizeStreamEventId(id) {
|
|
2442
|
+
const parts = id.split(":");
|
|
2443
|
+
if (parts.length >= 4) {
|
|
2444
|
+
return parts.slice(0, 4).join(":");
|
|
2445
|
+
}
|
|
2446
|
+
return id;
|
|
2447
|
+
}
|
|
2448
|
+
|
|
2449
|
+
// thru-ts-client-sdk/modules/events.ts
|
|
2450
|
+
function getEvent(ctx, eventId, options = {}) {
|
|
2451
|
+
if (!eventId) {
|
|
2452
|
+
throw new Error("eventId is required");
|
|
2453
|
+
}
|
|
2454
|
+
const request = protobuf.create(GetEventRequestSchema, {
|
|
2455
|
+
eventId,
|
|
2456
|
+
versionContext: options.versionContext ?? DEFAULT_VERSION_CONTEXT
|
|
2457
|
+
});
|
|
2458
|
+
return ctx.query.getEvent(request, withCallOptions(ctx)).then((proto) => ChainEvent.fromQuery(proto));
|
|
2459
|
+
}
|
|
2460
|
+
function listEvents(ctx, options = {}) {
|
|
2461
|
+
const request = protobuf.create(ListEventsRequestSchema, {
|
|
2462
|
+
filter: options.filter?.toProto(),
|
|
2463
|
+
page: options.page?.toProto(),
|
|
2464
|
+
versionContext: options.versionContext ?? DEFAULT_VERSION_CONTEXT,
|
|
2465
|
+
minConsensus: options.minConsensus ?? DEFAULT_MIN_CONSENSUS
|
|
2466
|
+
});
|
|
2467
|
+
return ctx.query.listEvents(request, withCallOptions(ctx)).then((response) => ({
|
|
2468
|
+
events: response.events.map((proto) => ChainEvent.fromQuery(proto)),
|
|
2469
|
+
page: PageResponse.fromProto(response.page)
|
|
2470
|
+
}));
|
|
2471
|
+
}
|
|
2472
|
+
|
|
2473
|
+
// thru-ts-client-sdk/domain/height/HeightSnapshot.ts
|
|
2474
|
+
var HeightSnapshot = class _HeightSnapshot {
|
|
2475
|
+
constructor(params) {
|
|
2476
|
+
this.finalized = params.finalized;
|
|
2477
|
+
this.locallyExecuted = params.locallyExecuted;
|
|
2478
|
+
this.clusterExecuted = params.clusterExecuted;
|
|
2479
|
+
}
|
|
2480
|
+
static fromProto(proto) {
|
|
2481
|
+
return new _HeightSnapshot({
|
|
2482
|
+
finalized: proto.finalized ?? 0n,
|
|
2483
|
+
locallyExecuted: proto.locallyExecuted ?? 0n,
|
|
2484
|
+
clusterExecuted: proto.clusterExecuted ?? 0n
|
|
2485
|
+
});
|
|
2486
|
+
}
|
|
2487
|
+
delta(other) {
|
|
2488
|
+
return {
|
|
2489
|
+
finalized: this.finalized - other.finalized,
|
|
2490
|
+
locallyExecuted: this.locallyExecuted - other.locallyExecuted,
|
|
2491
|
+
clusterExecuted: this.clusterExecuted - other.clusterExecuted
|
|
2492
|
+
};
|
|
2493
|
+
}
|
|
2494
|
+
};
|
|
2495
|
+
|
|
2496
|
+
// thru-ts-client-sdk/modules/height.ts
|
|
2497
|
+
function getBlockHeight(ctx) {
|
|
2498
|
+
const request = protobuf.create(GetHeightRequestSchema);
|
|
2499
|
+
return ctx.query.getHeight(request, withCallOptions(ctx)).then((proto) => HeightSnapshot.fromProto(proto));
|
|
2500
|
+
}
|
|
2501
|
+
async function getChainInfo(ctx) {
|
|
2502
|
+
const request = protobuf.create(GetChainInfoRequestSchema);
|
|
2503
|
+
return ctx.query.getChainInfo(request, withCallOptions(ctx));
|
|
2504
|
+
}
|
|
2505
|
+
async function getChainId(ctx) {
|
|
2506
|
+
const response = await getChainInfo(ctx);
|
|
2507
|
+
return response.chainId;
|
|
2508
|
+
}
|
|
2509
|
+
var _ThruHDWallet = class _ThruHDWallet {
|
|
2510
|
+
static ensureSeed(seed) {
|
|
2511
|
+
if (seed.length !== 64) {
|
|
2512
|
+
throw new Error("Seed must be 64 bytes");
|
|
2513
|
+
}
|
|
2514
|
+
}
|
|
2515
|
+
static deriveKeyPair(seed, path) {
|
|
2516
|
+
_ThruHDWallet.ensureSeed(seed);
|
|
2517
|
+
const hdkey = HDKey__default.default.fromMasterSeed(seed);
|
|
2518
|
+
const derived = hdkey.derive(path);
|
|
2519
|
+
if (!derived.privateKey || !derived.publicKey) {
|
|
2520
|
+
throw new Error("Failed to derive key pair");
|
|
2521
|
+
}
|
|
2522
|
+
const privateKey = derived.privateKey;
|
|
2523
|
+
const publicKey = derived.publicKeyRaw;
|
|
2524
|
+
const secretKey = new Uint8Array(privateKey.length + publicKey.length);
|
|
2525
|
+
secretKey.set(privateKey, 0);
|
|
2526
|
+
secretKey.set(publicKey, privateKey.length);
|
|
2527
|
+
return {
|
|
2528
|
+
publicKey,
|
|
2529
|
+
privateKey,
|
|
2530
|
+
secretKey
|
|
2531
|
+
};
|
|
2532
|
+
}
|
|
2533
|
+
static async getAccount(seed, accountIndex = 0, change = 0) {
|
|
2534
|
+
if (accountIndex < 0) {
|
|
2535
|
+
throw new Error("Account index must be non-negative");
|
|
2536
|
+
}
|
|
2537
|
+
const path = `${_ThruHDWallet.THRU_DERIVATION_PATH}/${accountIndex}'/${change}'`;
|
|
2538
|
+
const { publicKey, privateKey, secretKey } = _ThruHDWallet.deriveKeyPair(seed, path);
|
|
2539
|
+
return {
|
|
2540
|
+
address: encodeAddress(publicKey),
|
|
2541
|
+
publicKey,
|
|
2542
|
+
privateKey,
|
|
2543
|
+
secretKey,
|
|
2544
|
+
path
|
|
2545
|
+
};
|
|
2546
|
+
}
|
|
2547
|
+
static async deriveAccounts(seed, count) {
|
|
2548
|
+
const accounts = [];
|
|
2549
|
+
for (let i = 0; i < count; i++) {
|
|
2550
|
+
const account = await _ThruHDWallet.getAccount(seed, i);
|
|
2551
|
+
accounts.push({
|
|
2552
|
+
index: i,
|
|
2553
|
+
address: account.address,
|
|
2554
|
+
path: account.path,
|
|
2555
|
+
publicKey: account.publicKey
|
|
2556
|
+
});
|
|
2557
|
+
}
|
|
2558
|
+
return accounts;
|
|
2559
|
+
}
|
|
2560
|
+
static isValidPath(path) {
|
|
2561
|
+
const pathRegex = /^m(\/\d+')+$/;
|
|
2562
|
+
return pathRegex.test(path);
|
|
2563
|
+
}
|
|
2564
|
+
};
|
|
2565
|
+
_ThruHDWallet.THRU_COIN_TYPE = 9999;
|
|
2566
|
+
_ThruHDWallet.THRU_DERIVATION_PATH = `m/44'/${_ThruHDWallet.THRU_COIN_TYPE}'`;
|
|
2567
|
+
var ThruHDWallet = _ThruHDWallet;
|
|
2568
|
+
|
|
2569
|
+
// thru-ts-client-sdk/modules/keys.ts
|
|
2570
|
+
async function generateKeyPair() {
|
|
2571
|
+
const seed = generateSeed();
|
|
2572
|
+
const account = await ThruHDWallet.getAccount(seed, 0);
|
|
2573
|
+
seed.fill(0);
|
|
2574
|
+
return {
|
|
2575
|
+
address: account.address,
|
|
2576
|
+
publicKey: account.publicKey,
|
|
2577
|
+
privateKey: account.privateKey
|
|
2578
|
+
};
|
|
2579
|
+
}
|
|
2580
|
+
async function fromPrivateKey(privateKey) {
|
|
2581
|
+
return new Uint8Array(await ed25519.getPublicKeyAsync(privateKey));
|
|
2582
|
+
}
|
|
2583
|
+
function generateSeed() {
|
|
2584
|
+
const cryptoObj = getWebCrypto();
|
|
2585
|
+
const bytes = new Uint8Array(64);
|
|
2586
|
+
cryptoObj.getRandomValues(bytes);
|
|
2587
|
+
return bytes;
|
|
2588
|
+
}
|
|
2589
|
+
async function getNodeStatus(ctx) {
|
|
2590
|
+
const request = protobuf.create(GetNodeStatusRequestSchema, {});
|
|
2591
|
+
return ctx.query.getNodeStatus(request, withCallOptions(ctx));
|
|
2592
|
+
}
|
|
2593
|
+
async function getNodePubkey(ctx) {
|
|
2594
|
+
const request = protobuf.create(GetNodePubkeyRequestSchema, {});
|
|
2595
|
+
return ctx.query.getNodePubkey(request, withCallOptions(ctx));
|
|
2596
|
+
}
|
|
2597
|
+
async function getNodeRecords(ctx) {
|
|
2598
|
+
const request = protobuf.create(GetNodeRecordsRequestSchema, {});
|
|
2599
|
+
return ctx.query.getNodeRecords(request, withCallOptions(ctx));
|
|
2600
|
+
}
|
|
2601
|
+
function copyBytes8(source) {
|
|
2602
|
+
const bytes = new Uint8Array(source.length);
|
|
2603
|
+
bytes.set(source);
|
|
2604
|
+
return bytes;
|
|
2605
|
+
}
|
|
2606
|
+
function toUint(value) {
|
|
2607
|
+
if (typeof value === "bigint") {
|
|
2608
|
+
if (value < 0n) {
|
|
2609
|
+
throw new Error("FilterParamValue.uint requires a non-negative value");
|
|
2610
|
+
}
|
|
2611
|
+
return value;
|
|
2612
|
+
}
|
|
2613
|
+
if (!Number.isFinite(value) || !Number.isInteger(value) || value < 0) {
|
|
2614
|
+
throw new Error("FilterParamValue.uint requires a non-negative integer");
|
|
2615
|
+
}
|
|
2616
|
+
return BigInt(value);
|
|
2617
|
+
}
|
|
2618
|
+
var FilterParamValue = class _FilterParamValue {
|
|
2619
|
+
constructor(params) {
|
|
2620
|
+
this.case = params.case;
|
|
2621
|
+
if (!params.case) {
|
|
2622
|
+
this.value = void 0;
|
|
2623
|
+
return;
|
|
2624
|
+
}
|
|
2625
|
+
switch (params.case) {
|
|
2626
|
+
case "stringValue":
|
|
2627
|
+
if (typeof params.value !== "string") {
|
|
2628
|
+
throw new Error("FilterParamValue.string requires a string value");
|
|
2629
|
+
}
|
|
2630
|
+
this.value = params.value;
|
|
2631
|
+
return;
|
|
2632
|
+
case "bytesValue":
|
|
2633
|
+
if (!(params.value instanceof Uint8Array)) {
|
|
2634
|
+
throw new Error("FilterParamValue.bytes requires a Uint8Array value");
|
|
2635
|
+
}
|
|
2636
|
+
this.value = copyBytes8(params.value);
|
|
2637
|
+
return;
|
|
2638
|
+
case "boolValue":
|
|
2639
|
+
if (typeof params.value !== "boolean") {
|
|
2640
|
+
throw new Error("FilterParamValue.bool requires a boolean value");
|
|
2641
|
+
}
|
|
2642
|
+
this.value = params.value;
|
|
2643
|
+
return;
|
|
2644
|
+
case "intValue":
|
|
2645
|
+
if (typeof params.value !== "bigint") {
|
|
2646
|
+
throw new Error("FilterParamValue.int requires a bigint value");
|
|
2647
|
+
}
|
|
2648
|
+
this.value = params.value;
|
|
2649
|
+
return;
|
|
2650
|
+
case "doubleValue":
|
|
2651
|
+
if (typeof params.value !== "number") {
|
|
2652
|
+
throw new Error("FilterParamValue.double requires a number value");
|
|
2653
|
+
}
|
|
2654
|
+
this.value = params.value;
|
|
2655
|
+
return;
|
|
2656
|
+
case "uintValue":
|
|
2657
|
+
if (typeof params.value !== "bigint") {
|
|
2658
|
+
throw new Error("FilterParamValue.uint requires a bigint value");
|
|
2659
|
+
}
|
|
2660
|
+
this.value = params.value;
|
|
2661
|
+
return;
|
|
2662
|
+
case "pubkeyValue":
|
|
2663
|
+
if (!(params.value instanceof Uint8Array)) {
|
|
2664
|
+
throw new Error("FilterParamValue.pubkey requires a Uint8Array value");
|
|
2665
|
+
}
|
|
2666
|
+
this.value = copyBytes8(params.value);
|
|
2667
|
+
return;
|
|
2668
|
+
case "signatureValue":
|
|
2669
|
+
if (!(params.value instanceof Uint8Array)) {
|
|
2670
|
+
throw new Error("FilterParamValue.signature requires a Uint8Array value");
|
|
2671
|
+
}
|
|
2672
|
+
this.value = copyBytes8(params.value);
|
|
2673
|
+
return;
|
|
2674
|
+
case "taPubkeyValue":
|
|
2675
|
+
if (typeof params.value !== "string") {
|
|
2676
|
+
throw new Error("FilterParamValue.taPubkey requires a string value");
|
|
2677
|
+
}
|
|
2678
|
+
this.value = params.value;
|
|
2679
|
+
return;
|
|
2680
|
+
case "tsSignatureValue":
|
|
2681
|
+
if (typeof params.value !== "string") {
|
|
2682
|
+
throw new Error("FilterParamValue.tsSignature requires a string value");
|
|
2683
|
+
}
|
|
2684
|
+
this.value = params.value;
|
|
2685
|
+
return;
|
|
2686
|
+
default:
|
|
2687
|
+
this.value = void 0;
|
|
2688
|
+
}
|
|
2689
|
+
}
|
|
2690
|
+
static none() {
|
|
2691
|
+
return new _FilterParamValue({});
|
|
2692
|
+
}
|
|
2693
|
+
static string(value) {
|
|
2694
|
+
return new _FilterParamValue({ case: "stringValue", value });
|
|
2695
|
+
}
|
|
2696
|
+
static bytes(value) {
|
|
2697
|
+
return new _FilterParamValue({ case: "bytesValue", value });
|
|
2698
|
+
}
|
|
2699
|
+
static bool(value) {
|
|
2700
|
+
return new _FilterParamValue({ case: "boolValue", value });
|
|
2701
|
+
}
|
|
2702
|
+
static int(value) {
|
|
2703
|
+
return new _FilterParamValue({ case: "intValue", value });
|
|
2704
|
+
}
|
|
2705
|
+
static double(value) {
|
|
2706
|
+
if (!Number.isFinite(value)) {
|
|
2707
|
+
throw new Error("FilterParamValue.double requires a finite number");
|
|
2708
|
+
}
|
|
2709
|
+
return new _FilterParamValue({ case: "doubleValue", value });
|
|
2710
|
+
}
|
|
2711
|
+
static uint(value) {
|
|
2712
|
+
return new _FilterParamValue({ case: "uintValue", value: toUint(value) });
|
|
2713
|
+
}
|
|
2714
|
+
static pubkey(value) {
|
|
2715
|
+
return new _FilterParamValue({
|
|
2716
|
+
case: "pubkeyValue",
|
|
2717
|
+
value: Pubkey.from(value).toBytes()
|
|
2718
|
+
});
|
|
2719
|
+
}
|
|
2720
|
+
static signature(value) {
|
|
2721
|
+
return new _FilterParamValue({
|
|
2722
|
+
case: "signatureValue",
|
|
2723
|
+
value: Signature.from(value).toBytes()
|
|
2724
|
+
});
|
|
2725
|
+
}
|
|
2726
|
+
static taPubkey(value) {
|
|
2727
|
+
return new _FilterParamValue({
|
|
2728
|
+
case: "taPubkeyValue",
|
|
2729
|
+
value: Pubkey.from(value).toThruFmt()
|
|
2730
|
+
});
|
|
2731
|
+
}
|
|
2732
|
+
static tsSignature(value) {
|
|
2733
|
+
return new _FilterParamValue({
|
|
2734
|
+
case: "tsSignatureValue",
|
|
2735
|
+
value: Signature.from(value).toThruFmt()
|
|
2736
|
+
});
|
|
2737
|
+
}
|
|
2738
|
+
static fromProto(proto) {
|
|
2739
|
+
const kind = proto.kind;
|
|
2740
|
+
if (!kind.case) {
|
|
2741
|
+
return _FilterParamValue.none();
|
|
2742
|
+
}
|
|
2743
|
+
switch (kind.case) {
|
|
2744
|
+
case "stringValue":
|
|
2745
|
+
return _FilterParamValue.string(kind.value);
|
|
2746
|
+
case "bytesValue":
|
|
2747
|
+
return _FilterParamValue.bytes(kind.value);
|
|
2748
|
+
case "boolValue":
|
|
2749
|
+
return _FilterParamValue.bool(kind.value);
|
|
2750
|
+
case "intValue":
|
|
2751
|
+
return _FilterParamValue.int(kind.value);
|
|
2752
|
+
case "doubleValue":
|
|
2753
|
+
return _FilterParamValue.double(kind.value);
|
|
2754
|
+
case "uintValue":
|
|
2755
|
+
return _FilterParamValue.uint(kind.value);
|
|
2756
|
+
case "pubkeyValue":
|
|
2757
|
+
return _FilterParamValue.pubkey(Pubkey.fromProtoPubkey(kind.value).toBytes());
|
|
2758
|
+
case "signatureValue":
|
|
2759
|
+
return _FilterParamValue.signature(Signature.fromProtoSignature(kind.value).toBytes());
|
|
2760
|
+
case "taPubkeyValue":
|
|
2761
|
+
return _FilterParamValue.taPubkey(Pubkey.fromProtoTaPubkey(kind.value).toThruFmt());
|
|
2762
|
+
case "tsSignatureValue":
|
|
2763
|
+
return _FilterParamValue.tsSignature(Signature.fromProtoTsSignature(kind.value).toThruFmt());
|
|
2764
|
+
default:
|
|
2765
|
+
return _FilterParamValue.none();
|
|
2766
|
+
}
|
|
2767
|
+
}
|
|
2768
|
+
toProto() {
|
|
2769
|
+
if (!this.case) {
|
|
2770
|
+
return protobuf.create(FilterParamValueSchema);
|
|
2771
|
+
}
|
|
2772
|
+
switch (this.case) {
|
|
2773
|
+
case "stringValue":
|
|
2774
|
+
return protobuf.create(FilterParamValueSchema, {
|
|
2775
|
+
kind: {
|
|
2776
|
+
case: "stringValue",
|
|
2777
|
+
value: this.value
|
|
2778
|
+
}
|
|
2779
|
+
});
|
|
2780
|
+
case "bytesValue":
|
|
2781
|
+
return protobuf.create(FilterParamValueSchema, {
|
|
2782
|
+
kind: {
|
|
2783
|
+
case: "bytesValue",
|
|
2784
|
+
value: copyBytes8(this.value)
|
|
2785
|
+
}
|
|
2786
|
+
});
|
|
2787
|
+
case "boolValue":
|
|
2788
|
+
return protobuf.create(FilterParamValueSchema, {
|
|
2789
|
+
kind: {
|
|
2790
|
+
case: "boolValue",
|
|
2791
|
+
value: this.value
|
|
2792
|
+
}
|
|
2793
|
+
});
|
|
2794
|
+
case "intValue":
|
|
2795
|
+
return protobuf.create(FilterParamValueSchema, {
|
|
2796
|
+
kind: {
|
|
2797
|
+
case: "intValue",
|
|
2798
|
+
value: this.value
|
|
2799
|
+
}
|
|
2800
|
+
});
|
|
2801
|
+
case "doubleValue":
|
|
2802
|
+
return protobuf.create(FilterParamValueSchema, {
|
|
2803
|
+
kind: {
|
|
2804
|
+
case: "doubleValue",
|
|
2805
|
+
value: this.value
|
|
2806
|
+
}
|
|
2807
|
+
});
|
|
2808
|
+
case "uintValue":
|
|
2809
|
+
return protobuf.create(FilterParamValueSchema, {
|
|
2810
|
+
kind: {
|
|
2811
|
+
case: "uintValue",
|
|
2812
|
+
value: this.value
|
|
2813
|
+
}
|
|
2814
|
+
});
|
|
2815
|
+
case "pubkeyValue":
|
|
2816
|
+
return protobuf.create(FilterParamValueSchema, {
|
|
2817
|
+
kind: {
|
|
2818
|
+
case: "pubkeyValue",
|
|
2819
|
+
value: Pubkey.from(this.value).toProtoPubkey()
|
|
2820
|
+
}
|
|
2821
|
+
});
|
|
2822
|
+
case "signatureValue":
|
|
2823
|
+
return protobuf.create(FilterParamValueSchema, {
|
|
2824
|
+
kind: {
|
|
2825
|
+
case: "signatureValue",
|
|
2826
|
+
value: Signature.from(this.value).toProtoSignature()
|
|
2827
|
+
}
|
|
2828
|
+
});
|
|
2829
|
+
case "taPubkeyValue":
|
|
2830
|
+
return protobuf.create(FilterParamValueSchema, {
|
|
2831
|
+
kind: {
|
|
2832
|
+
case: "taPubkeyValue",
|
|
2833
|
+
value: Pubkey.from(this.value).toProtoTaPubkey()
|
|
2834
|
+
}
|
|
2835
|
+
});
|
|
2836
|
+
case "tsSignatureValue":
|
|
2837
|
+
return protobuf.create(FilterParamValueSchema, {
|
|
2838
|
+
kind: {
|
|
2839
|
+
case: "tsSignatureValue",
|
|
2840
|
+
value: Signature.from(this.value).toProtoTsSignature()
|
|
2841
|
+
}
|
|
2842
|
+
});
|
|
2843
|
+
default:
|
|
2844
|
+
throw new Error("FilterParamValue has an unknown kind");
|
|
2845
|
+
}
|
|
2846
|
+
}
|
|
2847
|
+
getCase() {
|
|
2848
|
+
return this.case;
|
|
2849
|
+
}
|
|
2850
|
+
getString() {
|
|
2851
|
+
return this.case === "stringValue" ? this.value : void 0;
|
|
2852
|
+
}
|
|
2853
|
+
getBytes() {
|
|
2854
|
+
if (this.case !== "bytesValue" || !(this.value instanceof Uint8Array)) {
|
|
2855
|
+
return void 0;
|
|
2856
|
+
}
|
|
2857
|
+
return copyBytes8(this.value);
|
|
2858
|
+
}
|
|
2859
|
+
getBool() {
|
|
2860
|
+
return this.case === "boolValue" ? this.value : void 0;
|
|
2861
|
+
}
|
|
2862
|
+
getInt() {
|
|
2863
|
+
return this.case === "intValue" ? this.value : void 0;
|
|
2864
|
+
}
|
|
2865
|
+
getUint() {
|
|
2866
|
+
return this.case === "uintValue" ? this.value : void 0;
|
|
2867
|
+
}
|
|
2868
|
+
getDouble() {
|
|
2869
|
+
return this.case === "doubleValue" ? this.value : void 0;
|
|
2870
|
+
}
|
|
2871
|
+
getPubkey() {
|
|
2872
|
+
if (this.case !== "pubkeyValue") {
|
|
2873
|
+
return void 0;
|
|
2874
|
+
}
|
|
2875
|
+
return copyBytes8(this.value);
|
|
2876
|
+
}
|
|
2877
|
+
getSignature() {
|
|
2878
|
+
if (this.case !== "signatureValue") {
|
|
2879
|
+
return void 0;
|
|
2880
|
+
}
|
|
2881
|
+
return copyBytes8(this.value);
|
|
2882
|
+
}
|
|
2883
|
+
getTaPubkey() {
|
|
2884
|
+
return this.case === "taPubkeyValue" ? this.value : void 0;
|
|
2885
|
+
}
|
|
2886
|
+
getTsSignature() {
|
|
2887
|
+
return this.case === "tsSignatureValue" ? this.value : void 0;
|
|
2888
|
+
}
|
|
2889
|
+
};
|
|
2890
|
+
var Filter = class _Filter {
|
|
2891
|
+
constructor(init = {}) {
|
|
2892
|
+
this.expression = init.expression;
|
|
2893
|
+
this.params = /* @__PURE__ */ new Map();
|
|
2894
|
+
if (!init.params) {
|
|
2895
|
+
return;
|
|
2896
|
+
}
|
|
2897
|
+
if (init.params instanceof Map) {
|
|
2898
|
+
for (const [key, value] of init.params.entries()) {
|
|
2899
|
+
this.setParamInternal(key, value);
|
|
2900
|
+
}
|
|
2901
|
+
return;
|
|
2902
|
+
}
|
|
2903
|
+
if (typeof init.params === "object" && !Array.isArray(init.params)) {
|
|
2904
|
+
for (const [key, value] of Object.entries(init.params)) {
|
|
2905
|
+
this.setParamInternal(key, value);
|
|
2906
|
+
}
|
|
2907
|
+
return;
|
|
2908
|
+
}
|
|
2909
|
+
for (const [key, value] of init.params) {
|
|
2910
|
+
this.setParamInternal(key, value);
|
|
2911
|
+
}
|
|
2912
|
+
}
|
|
2913
|
+
static fromProto(proto) {
|
|
2914
|
+
const params = Object.entries(proto.params ?? {}).map(([key, value]) => [key, FilterParamValue.fromProto(value)]);
|
|
2915
|
+
return new _Filter({
|
|
2916
|
+
expression: proto.expression,
|
|
2917
|
+
params
|
|
2918
|
+
});
|
|
2919
|
+
}
|
|
2920
|
+
toProto() {
|
|
2921
|
+
const protoParams = {};
|
|
2922
|
+
for (const [key, value] of this.params.entries()) {
|
|
2923
|
+
protoParams[key] = value.toProto();
|
|
2924
|
+
}
|
|
2925
|
+
return protobuf.create(FilterSchema, {
|
|
2926
|
+
expression: this.expression,
|
|
2927
|
+
params: protoParams
|
|
2928
|
+
});
|
|
2929
|
+
}
|
|
2930
|
+
hasParam(name) {
|
|
2931
|
+
return this.params.has(name);
|
|
2932
|
+
}
|
|
2933
|
+
getParam(name) {
|
|
2934
|
+
const param = this.params.get(name);
|
|
2935
|
+
return param;
|
|
2936
|
+
}
|
|
2937
|
+
listParams() {
|
|
2938
|
+
return Array.from(this.params.keys());
|
|
2939
|
+
}
|
|
2940
|
+
entries() {
|
|
2941
|
+
return Array.from(this.params.entries());
|
|
2942
|
+
}
|
|
2943
|
+
withExpression(expression) {
|
|
2944
|
+
return new _Filter({ expression, params: this.params });
|
|
2945
|
+
}
|
|
2946
|
+
withParam(name, value) {
|
|
2947
|
+
const params = new Map(this.params);
|
|
2948
|
+
params.set(name, value);
|
|
2949
|
+
return new _Filter({ expression: this.expression, params });
|
|
2950
|
+
}
|
|
2951
|
+
withoutParam(name) {
|
|
2952
|
+
if (!this.params.has(name)) {
|
|
2953
|
+
return this;
|
|
2954
|
+
}
|
|
2955
|
+
const params = new Map(this.params);
|
|
2956
|
+
params.delete(name);
|
|
2957
|
+
return new _Filter({ expression: this.expression, params });
|
|
2958
|
+
}
|
|
2959
|
+
setParamInternal(name, value) {
|
|
2960
|
+
if (!(value instanceof FilterParamValue)) {
|
|
2961
|
+
throw new Error(`Filter parameter "${name}" must be a FilterParamValue`);
|
|
2962
|
+
}
|
|
2963
|
+
this.params.set(name, value);
|
|
2964
|
+
}
|
|
2965
|
+
};
|
|
2966
|
+
|
|
2967
|
+
// thru-ts-client-sdk/modules/streaming.ts
|
|
2968
|
+
function streamBlocks(ctx, options = {}) {
|
|
2969
|
+
const request = protobuf.create(StreamBlocksRequestSchema, {
|
|
2970
|
+
startSlot: options.startSlot,
|
|
2971
|
+
filter: options.filter?.toProto(),
|
|
2972
|
+
view: options.view ?? DEFAULT_BLOCK_VIEW,
|
|
2973
|
+
minConsensus: options.minConsensus ?? DEFAULT_MIN_CONSENSUS
|
|
2974
|
+
});
|
|
2975
|
+
const iterable = ctx.streaming.streamBlocks(request, withCallOptions(ctx, { signal: options.signal }));
|
|
2976
|
+
async function* mapper() {
|
|
2977
|
+
for await (const response of iterable) {
|
|
2978
|
+
if (!response.block) {
|
|
2979
|
+
continue;
|
|
2980
|
+
}
|
|
2981
|
+
yield { block: Block.fromProto(response.block) };
|
|
2982
|
+
}
|
|
2983
|
+
}
|
|
2984
|
+
return mapper();
|
|
2985
|
+
}
|
|
2986
|
+
function streamAccountUpdates(ctx, address, options = {}) {
|
|
2987
|
+
const addressBytes = Pubkey.from(address).toBytes();
|
|
2988
|
+
const addressFilter = new Filter({
|
|
2989
|
+
expression: "account_address.value == params.address",
|
|
2990
|
+
params: {
|
|
2991
|
+
address: FilterParamValue.bytes(addressBytes)
|
|
2992
|
+
}
|
|
2993
|
+
});
|
|
2994
|
+
let mergedFilter = addressFilter;
|
|
2995
|
+
if (options.filter) {
|
|
2996
|
+
const combinedParams = {};
|
|
2997
|
+
for (const [key, value] of addressFilter.entries()) {
|
|
2998
|
+
combinedParams[key] = value;
|
|
2999
|
+
}
|
|
3000
|
+
for (const [key, value] of options.filter.entries()) {
|
|
3001
|
+
combinedParams[key] = value;
|
|
3002
|
+
}
|
|
3003
|
+
mergedFilter = new Filter({
|
|
3004
|
+
expression: `(${addressFilter.expression}) && (${options.filter.expression})`,
|
|
3005
|
+
params: combinedParams
|
|
3006
|
+
});
|
|
3007
|
+
}
|
|
3008
|
+
const request = protobuf.create(StreamAccountUpdatesRequestSchema, {
|
|
3009
|
+
view: options.view ?? DEFAULT_ACCOUNT_VIEW,
|
|
3010
|
+
filter: mergedFilter.toProto()
|
|
3011
|
+
});
|
|
3012
|
+
const iterable = ctx.streaming.streamAccountUpdates(request, withCallOptions(ctx, { signal: options.signal }));
|
|
3013
|
+
async function* mapper() {
|
|
3014
|
+
for await (const response of iterable) {
|
|
3015
|
+
const update = toStreamAccountUpdate(response);
|
|
3016
|
+
if (!update) {
|
|
3017
|
+
continue;
|
|
3018
|
+
}
|
|
3019
|
+
yield { update };
|
|
3020
|
+
}
|
|
3021
|
+
}
|
|
3022
|
+
return mapper();
|
|
3023
|
+
}
|
|
3024
|
+
function streamTransactions(ctx, options = {}) {
|
|
3025
|
+
const request = protobuf.create(StreamTransactionsRequestSchema, {
|
|
3026
|
+
filter: options.filter?.toProto(),
|
|
3027
|
+
minConsensus: options.minConsensus ?? DEFAULT_MIN_CONSENSUS
|
|
3028
|
+
});
|
|
3029
|
+
const iterable = ctx.streaming.streamTransactions(request, withCallOptions(ctx, { signal: options.signal }));
|
|
3030
|
+
async function* mapper() {
|
|
3031
|
+
for await (const response of iterable) {
|
|
3032
|
+
if (!response.transaction) {
|
|
3033
|
+
continue;
|
|
3034
|
+
}
|
|
3035
|
+
try {
|
|
3036
|
+
yield toStreamTransactionUpdate(response.transaction);
|
|
3037
|
+
} catch (err) {
|
|
3038
|
+
console.error("streamTransactions: failed to decode transaction update", err);
|
|
3039
|
+
}
|
|
3040
|
+
}
|
|
3041
|
+
}
|
|
3042
|
+
return mapper();
|
|
3043
|
+
}
|
|
3044
|
+
function streamEvents(ctx, options = {}) {
|
|
3045
|
+
const request = protobuf.create(StreamEventsRequestSchema, {
|
|
3046
|
+
filter: options.filter?.toProto()
|
|
3047
|
+
});
|
|
3048
|
+
const iterable = ctx.streaming.streamEvents(request, withCallOptions(ctx, { signal: options.signal }));
|
|
3049
|
+
async function* mapper() {
|
|
3050
|
+
for await (const response of iterable) {
|
|
3051
|
+
yield { event: ChainEvent.fromStream(response) };
|
|
3052
|
+
}
|
|
3053
|
+
}
|
|
3054
|
+
return mapper();
|
|
3055
|
+
}
|
|
3056
|
+
function trackTransaction(ctx, signature, options = {}) {
|
|
3057
|
+
const timeoutMs = options.timeoutMs;
|
|
3058
|
+
const request = protobuf.create(TrackTransactionRequestSchema, {
|
|
3059
|
+
signature: Signature.from(signature).toProtoSignature(),
|
|
3060
|
+
timeout: timeoutMs != null ? {
|
|
3061
|
+
seconds: BigInt(Math.floor(timeoutMs / 1e3)),
|
|
3062
|
+
nanos: timeoutMs % 1e3 * 1e6
|
|
3063
|
+
} : void 0
|
|
3064
|
+
});
|
|
3065
|
+
const iterable = ctx.streaming.trackTransaction(request, withCallOptions(ctx, { signal: options.signal }));
|
|
3066
|
+
async function* mapper() {
|
|
3067
|
+
for await (const response of iterable) {
|
|
3068
|
+
yield toTrackTransactionUpdate(response);
|
|
3069
|
+
}
|
|
3070
|
+
}
|
|
3071
|
+
return mapper();
|
|
3072
|
+
}
|
|
3073
|
+
function streamHeight(ctx, options = {}) {
|
|
3074
|
+
const request = protobuf.create(StreamHeightRequestSchema, {});
|
|
3075
|
+
const iterable = ctx.streaming.streamHeight(request, withCallOptions(ctx, { signal: options.signal }));
|
|
3076
|
+
async function* mapper() {
|
|
3077
|
+
for await (const response of iterable) {
|
|
3078
|
+
yield { height: HeightSnapshot.fromProto(response) };
|
|
3079
|
+
}
|
|
3080
|
+
}
|
|
3081
|
+
return mapper();
|
|
3082
|
+
}
|
|
3083
|
+
function streamSlotMetrics(ctx, options = {}) {
|
|
3084
|
+
const request = protobuf.create(StreamSlotMetricsRequestSchema, {
|
|
3085
|
+
startSlot: options.startSlot
|
|
3086
|
+
});
|
|
3087
|
+
const iterable = ctx.streaming.streamSlotMetrics(request, withCallOptions(ctx, { signal: options.signal }));
|
|
3088
|
+
async function* mapper() {
|
|
3089
|
+
for await (const response of iterable) {
|
|
3090
|
+
yield {
|
|
3091
|
+
slot: response.slot,
|
|
3092
|
+
collectedFees: response.collectedFees,
|
|
3093
|
+
globalActivatedStateCounter: response.globalActivatedStateCounter,
|
|
3094
|
+
globalDeactivatedStateCounter: response.globalDeactivatedStateCounter,
|
|
3095
|
+
blockTimestamp: response.blockTimestamp
|
|
3096
|
+
};
|
|
3097
|
+
}
|
|
3098
|
+
}
|
|
3099
|
+
return mapper();
|
|
3100
|
+
}
|
|
3101
|
+
function streamNodeRecords(ctx, options = {}) {
|
|
3102
|
+
const request = protobuf.create(StreamNodeRecordsRequestSchema, {});
|
|
3103
|
+
const iterable = ctx.streaming.streamNodeRecords(request, withCallOptions(ctx, { signal: options.signal }));
|
|
3104
|
+
async function* mapper() {
|
|
3105
|
+
for await (const response of iterable) {
|
|
3106
|
+
if (response.message.case === "record") {
|
|
3107
|
+
yield { type: "record", record: response.message.value };
|
|
3108
|
+
} else if (response.message.case === "finished") {
|
|
3109
|
+
yield { type: "finished" };
|
|
3110
|
+
}
|
|
3111
|
+
}
|
|
3112
|
+
}
|
|
3113
|
+
return mapper();
|
|
3114
|
+
}
|
|
3115
|
+
|
|
3116
|
+
// thru-ts-client-sdk/modules/nonce.ts
|
|
3117
|
+
var DEFAULT_NONCE_WAIT_TIMEOUT_MS = 1e4;
|
|
3118
|
+
var AccountNonceObserver = class {
|
|
3119
|
+
constructor(ctx, account, options = {}) {
|
|
3120
|
+
this.abortController = new AbortController();
|
|
3121
|
+
this.waiters = /* @__PURE__ */ new Set();
|
|
3122
|
+
this.closed = false;
|
|
3123
|
+
this.streamStarted = false;
|
|
3124
|
+
this.ctx = ctx;
|
|
3125
|
+
this.account = Pubkey.from(account);
|
|
3126
|
+
this.versionContext = options.versionContext ?? currentVersionContext();
|
|
3127
|
+
options.signal?.addEventListener("abort", () => this.close(), { once: true });
|
|
3128
|
+
}
|
|
3129
|
+
getLatestNonce() {
|
|
3130
|
+
return this.latestNonce;
|
|
3131
|
+
}
|
|
3132
|
+
async refresh() {
|
|
3133
|
+
const account = await getAccount(this.ctx, this.account, {
|
|
3134
|
+
view: 4 /* FULL */,
|
|
3135
|
+
versionContext: this.versionContext
|
|
3136
|
+
});
|
|
3137
|
+
this.observeNonce(account.meta?.nonce);
|
|
3138
|
+
return this.latestNonce;
|
|
3139
|
+
}
|
|
3140
|
+
start() {
|
|
3141
|
+
if (this.streamStarted || this.closed) {
|
|
3142
|
+
return;
|
|
3143
|
+
}
|
|
3144
|
+
this.streamStarted = true;
|
|
3145
|
+
void this.runStream();
|
|
3146
|
+
}
|
|
3147
|
+
async waitForNonceAtLeast(target, options = {}) {
|
|
3148
|
+
if (this.closed) {
|
|
3149
|
+
throw new Error("AccountNonceObserver is closed");
|
|
3150
|
+
}
|
|
3151
|
+
if (this.latestNonce === void 0 || this.latestNonce < target) {
|
|
3152
|
+
this.start();
|
|
3153
|
+
await this.refresh();
|
|
3154
|
+
}
|
|
3155
|
+
if (this.closed) {
|
|
3156
|
+
throw new Error("AccountNonceObserver is closed");
|
|
3157
|
+
}
|
|
3158
|
+
if (this.latestNonce !== void 0 && this.latestNonce >= target) {
|
|
3159
|
+
return this.latestNonce;
|
|
3160
|
+
}
|
|
3161
|
+
return new Promise((resolve, reject) => {
|
|
3162
|
+
const timeoutMs = options.timeoutMs ?? DEFAULT_NONCE_WAIT_TIMEOUT_MS;
|
|
3163
|
+
const waiter = {
|
|
3164
|
+
target,
|
|
3165
|
+
resolve,
|
|
3166
|
+
reject
|
|
3167
|
+
};
|
|
3168
|
+
waiter.timeoutId = setTimeout(() => {
|
|
3169
|
+
this.waiters.delete(waiter);
|
|
3170
|
+
reject(new Error(`Timed out waiting for nonce >= ${target.toString()} after ${timeoutMs}ms`));
|
|
3171
|
+
}, timeoutMs);
|
|
3172
|
+
this.waiters.add(waiter);
|
|
3173
|
+
});
|
|
3174
|
+
}
|
|
3175
|
+
close() {
|
|
3176
|
+
if (this.closed) {
|
|
3177
|
+
return;
|
|
3178
|
+
}
|
|
3179
|
+
this.closed = true;
|
|
3180
|
+
this.abortController.abort();
|
|
3181
|
+
for (const waiter of this.waiters) {
|
|
3182
|
+
if (waiter.timeoutId) {
|
|
3183
|
+
clearTimeout(waiter.timeoutId);
|
|
3184
|
+
}
|
|
3185
|
+
waiter.reject(new Error("AccountNonceObserver closed"));
|
|
3186
|
+
}
|
|
3187
|
+
this.waiters.clear();
|
|
3188
|
+
}
|
|
3189
|
+
async runStream() {
|
|
3190
|
+
try {
|
|
3191
|
+
for await (const { update } of streamAccountUpdates(this.ctx, this.account, {
|
|
3192
|
+
view: 4 /* FULL */,
|
|
3193
|
+
signal: this.abortController.signal
|
|
3194
|
+
})) {
|
|
3195
|
+
if (this.closed) {
|
|
3196
|
+
return;
|
|
3197
|
+
}
|
|
3198
|
+
if (update.kind === "snapshot") {
|
|
3199
|
+
this.observeNonce(update.snapshot.account.meta?.nonce);
|
|
3200
|
+
continue;
|
|
3201
|
+
}
|
|
3202
|
+
this.observeNonce(update.update.meta?.nonce);
|
|
3203
|
+
}
|
|
3204
|
+
} catch (error) {
|
|
3205
|
+
if (!this.closed) {
|
|
3206
|
+
this.rejectWaiters(error instanceof Error ? error : new Error(String(error)));
|
|
3207
|
+
}
|
|
3208
|
+
} finally {
|
|
3209
|
+
this.streamStarted = false;
|
|
3210
|
+
if (!this.closed) {
|
|
3211
|
+
this.rejectWaiters(new Error("Account nonce stream ended unexpectedly"));
|
|
3212
|
+
}
|
|
3213
|
+
}
|
|
3214
|
+
}
|
|
3215
|
+
observeNonce(nonce) {
|
|
3216
|
+
if (nonce === void 0) {
|
|
3217
|
+
return;
|
|
3218
|
+
}
|
|
3219
|
+
if (this.latestNonce === void 0 || nonce > this.latestNonce) {
|
|
3220
|
+
this.latestNonce = nonce;
|
|
3221
|
+
}
|
|
3222
|
+
this.resolveReadyWaiters();
|
|
3223
|
+
}
|
|
3224
|
+
resolveReadyWaiters() {
|
|
3225
|
+
if (this.latestNonce === void 0) {
|
|
3226
|
+
return;
|
|
3227
|
+
}
|
|
3228
|
+
for (const waiter of Array.from(this.waiters)) {
|
|
3229
|
+
if (this.latestNonce < waiter.target) {
|
|
3230
|
+
continue;
|
|
3231
|
+
}
|
|
3232
|
+
this.waiters.delete(waiter);
|
|
3233
|
+
if (waiter.timeoutId) {
|
|
3234
|
+
clearTimeout(waiter.timeoutId);
|
|
3235
|
+
}
|
|
3236
|
+
waiter.resolve(this.latestNonce);
|
|
3237
|
+
}
|
|
3238
|
+
}
|
|
3239
|
+
rejectWaiters(error) {
|
|
3240
|
+
for (const waiter of this.waiters) {
|
|
3241
|
+
if (waiter.timeoutId) {
|
|
3242
|
+
clearTimeout(waiter.timeoutId);
|
|
3243
|
+
}
|
|
3244
|
+
waiter.reject(error);
|
|
3245
|
+
}
|
|
3246
|
+
this.waiters.clear();
|
|
3247
|
+
}
|
|
3248
|
+
};
|
|
3249
|
+
var FeePayerNonceManager = class {
|
|
3250
|
+
constructor(ctx, feePayer, options = {}) {
|
|
3251
|
+
this.allocationQueue = Promise.resolve();
|
|
3252
|
+
this.observer = options.observer ?? new AccountNonceObserver(ctx, feePayer);
|
|
3253
|
+
}
|
|
3254
|
+
async allocate(count) {
|
|
3255
|
+
return this.withAllocationLock(() => this.allocateUnsafe(count));
|
|
3256
|
+
}
|
|
3257
|
+
reset(nextNonce) {
|
|
3258
|
+
this.nextNonce = nextNonce;
|
|
3259
|
+
}
|
|
3260
|
+
async sync() {
|
|
3261
|
+
const latestNonce = await this.observer.refresh();
|
|
3262
|
+
if (latestNonce === void 0) {
|
|
3263
|
+
throw new Error("Unable to read fee payer nonce");
|
|
3264
|
+
}
|
|
3265
|
+
this.nextNonce = latestNonce;
|
|
3266
|
+
return latestNonce;
|
|
3267
|
+
}
|
|
3268
|
+
async waitForNonceAtLeast(target, options) {
|
|
3269
|
+
const nonce = await this.observer.waitForNonceAtLeast(target, options);
|
|
3270
|
+
if (this.nextNonce === void 0 || nonce > this.nextNonce) {
|
|
3271
|
+
this.nextNonce = nonce;
|
|
3272
|
+
}
|
|
3273
|
+
return nonce;
|
|
3274
|
+
}
|
|
3275
|
+
close() {
|
|
3276
|
+
this.observer.close();
|
|
3277
|
+
}
|
|
3278
|
+
async allocateUnsafe(count) {
|
|
3279
|
+
if (!Number.isInteger(count) || count <= 0) {
|
|
3280
|
+
throw new Error("Nonce allocation count must be a positive integer");
|
|
3281
|
+
}
|
|
3282
|
+
const latestNonce = await this.observer.refresh();
|
|
3283
|
+
if (latestNonce === void 0) {
|
|
3284
|
+
throw new Error("Unable to read fee payer nonce");
|
|
3285
|
+
}
|
|
3286
|
+
const baseNonce = this.nextNonce === void 0 || latestNonce > this.nextNonce ? latestNonce : this.nextNonce;
|
|
3287
|
+
const barrierNonce = baseNonce + BigInt(count);
|
|
3288
|
+
const nonces = Array.from({ length: count }, (_, index) => baseNonce + BigInt(index));
|
|
3289
|
+
this.nextNonce = barrierNonce;
|
|
3290
|
+
return {
|
|
3291
|
+
baseNonce,
|
|
3292
|
+
nonces,
|
|
3293
|
+
barrierNonce
|
|
3294
|
+
};
|
|
3295
|
+
}
|
|
3296
|
+
async withAllocationLock(work) {
|
|
3297
|
+
const previous = this.allocationQueue;
|
|
3298
|
+
let release;
|
|
3299
|
+
this.allocationQueue = new Promise((resolve) => {
|
|
3300
|
+
release = resolve;
|
|
3301
|
+
});
|
|
3302
|
+
await previous;
|
|
3303
|
+
try {
|
|
3304
|
+
return await work();
|
|
3305
|
+
} finally {
|
|
3306
|
+
release();
|
|
3307
|
+
}
|
|
3308
|
+
}
|
|
3309
|
+
};
|
|
3310
|
+
async function getSlotMetrics(ctx, slot) {
|
|
3311
|
+
const request = protobuf.create(GetSlotMetricsRequestSchema, { slot });
|
|
3312
|
+
return ctx.query.getSlotMetrics(request, withCallOptions(ctx));
|
|
3313
|
+
}
|
|
3314
|
+
async function listSlotMetrics(ctx, options) {
|
|
3315
|
+
const request = protobuf.create(ListSlotMetricsRequestSchema, {
|
|
3316
|
+
startSlot: options.startSlot,
|
|
3317
|
+
endSlot: options.endSlot,
|
|
3318
|
+
limit: options.limit
|
|
3319
|
+
});
|
|
3320
|
+
return ctx.query.listSlotMetrics(request, withCallOptions(ctx));
|
|
3321
|
+
}
|
|
3322
|
+
async function getTransaction(ctx, signature, options = {}) {
|
|
3323
|
+
const request = protobuf.create(GetTransactionRequestSchema, {
|
|
3324
|
+
signature: Signature.from(signature).toProtoSignature(),
|
|
3325
|
+
view: options.view ?? DEFAULT_TRANSACTION_VIEW,
|
|
3326
|
+
versionContext: options.versionContext ?? DEFAULT_VERSION_CONTEXT,
|
|
3327
|
+
minConsensus: options.minConsensus ?? DEFAULT_MIN_CONSENSUS
|
|
3328
|
+
});
|
|
3329
|
+
const proto = await ctx.query.getTransaction(request, withCallOptions(ctx));
|
|
3330
|
+
return Transaction.fromProto(proto);
|
|
3331
|
+
}
|
|
3332
|
+
async function getRawTransaction(ctx, signature, options = {}) {
|
|
3333
|
+
const request = protobuf.create(GetRawTransactionRequestSchema, {
|
|
3334
|
+
signature: Signature.from(signature).toProtoSignature(),
|
|
3335
|
+
versionContext: options.versionContext ?? DEFAULT_VERSION_CONTEXT,
|
|
3336
|
+
minConsensus: options.minConsensus ?? DEFAULT_MIN_CONSENSUS
|
|
3337
|
+
});
|
|
3338
|
+
return ctx.query.getRawTransaction(request, withCallOptions(ctx));
|
|
3339
|
+
}
|
|
3340
|
+
async function getTransactionStatus(ctx, signature) {
|
|
3341
|
+
const request = protobuf.create(GetTransactionStatusRequestSchema, {
|
|
3342
|
+
signature: Signature.from(signature).toProtoSignature()
|
|
3343
|
+
});
|
|
3344
|
+
const proto = await ctx.query.getTransactionStatus(request, withCallOptions(ctx));
|
|
3345
|
+
return TransactionStatusSnapshot.fromProto(proto);
|
|
3346
|
+
}
|
|
3347
|
+
async function listTransactionsForAccount(ctx, account, options = {}) {
|
|
3348
|
+
const request = protobuf.create(ListTransactionsForAccountRequestSchema, {
|
|
3349
|
+
account: Pubkey.from(account).toProtoPubkey(),
|
|
3350
|
+
filter: options.filter?.toProto(),
|
|
3351
|
+
page: options.page?.toProto()
|
|
3352
|
+
});
|
|
3353
|
+
const response = await ctx.query.listTransactionsForAccount(
|
|
3354
|
+
request,
|
|
3355
|
+
withCallOptions(ctx)
|
|
3356
|
+
);
|
|
3357
|
+
const protoTransactionSignatures = (response.transactions ?? []).map((transaction) => transaction.signature);
|
|
3358
|
+
const transactions = await Promise.all(
|
|
3359
|
+
protoTransactionSignatures.map((signature) => {
|
|
3360
|
+
if (!signature) {
|
|
3361
|
+
throw new Error("ListTransactionsForAccount returned an empty signature");
|
|
3362
|
+
}
|
|
3363
|
+
return getTransaction(ctx, signature.value, options.transactionOptions);
|
|
3364
|
+
})
|
|
3365
|
+
);
|
|
3366
|
+
return {
|
|
3367
|
+
transactions,
|
|
3368
|
+
page: PageResponse.fromProto(response.page)
|
|
3369
|
+
};
|
|
3370
|
+
}
|
|
3371
|
+
async function listTransactions(ctx, options = {}) {
|
|
3372
|
+
const request = protobuf.create(ListTransactionsRequestSchema, {
|
|
3373
|
+
filter: options.filter?.toProto(),
|
|
3374
|
+
page: options.page?.toProto(),
|
|
3375
|
+
returnEvents: options.returnEvents,
|
|
3376
|
+
versionContext: options.versionContext ?? DEFAULT_VERSION_CONTEXT,
|
|
3377
|
+
minConsensus: options.minConsensus ?? DEFAULT_MIN_CONSENSUS
|
|
3378
|
+
});
|
|
3379
|
+
const response = await ctx.query.listTransactions(
|
|
3380
|
+
request,
|
|
3381
|
+
withCallOptions(ctx)
|
|
3382
|
+
);
|
|
3383
|
+
return {
|
|
3384
|
+
transactions: response.transactions.map((proto) => Transaction.fromProto(proto)),
|
|
3385
|
+
page: PageResponse.fromProto(response.page)
|
|
3386
|
+
};
|
|
3387
|
+
}
|
|
3388
|
+
async function buildTransaction(ctx, options) {
|
|
3389
|
+
const builder = createTransactionBuilder();
|
|
3390
|
+
const params = await createBuildParams(ctx, options);
|
|
3391
|
+
return builder.build(params);
|
|
3392
|
+
}
|
|
3393
|
+
async function buildAndSignTransaction(ctx, options) {
|
|
3394
|
+
const builder = createTransactionBuilder();
|
|
3395
|
+
const params = await createBuildParams(ctx, options);
|
|
3396
|
+
if (!params.feePayer.privateKey) {
|
|
3397
|
+
throw new Error("Fee payer private key is required to sign the transaction");
|
|
3398
|
+
}
|
|
3399
|
+
return builder.buildAndSign(params);
|
|
3400
|
+
}
|
|
3401
|
+
async function sendTransaction(ctx, transaction) {
|
|
3402
|
+
const raw = transaction instanceof Uint8Array ? transaction : transaction.toWire();
|
|
3403
|
+
return sendRawTransaction(ctx, raw);
|
|
3404
|
+
}
|
|
3405
|
+
async function batchSendTransactions(ctx, transactions, options = {}) {
|
|
3406
|
+
const rawTransactions = transactions.map(
|
|
3407
|
+
(tx) => tx instanceof Uint8Array ? tx : tx.toWire()
|
|
3408
|
+
);
|
|
3409
|
+
const request = protobuf.create(BatchSendTransactionsRequestSchema, {
|
|
3410
|
+
rawTransactions,
|
|
3411
|
+
numRetries: options.numRetries ?? 0
|
|
3412
|
+
});
|
|
3413
|
+
return ctx.command.batchSendTransactions(request, withCallOptions(ctx));
|
|
3414
|
+
}
|
|
3415
|
+
async function batchSendAndTrack(ctx, transactions, options = {}) {
|
|
3416
|
+
const rawTransactions = transactions.map(
|
|
3417
|
+
(tx) => tx instanceof Uint8Array ? tx : tx.toWire()
|
|
3418
|
+
);
|
|
3419
|
+
const signatures = rawTransactions.map(extractSignature);
|
|
3420
|
+
const trackControllers = rawTransactions.map(() => new AbortController());
|
|
3421
|
+
const abortStatuses = rawTransactions.map(() => void 0);
|
|
3422
|
+
const trackPromises = signatures.map(
|
|
3423
|
+
(signature, index) => trackUntilExecution(ctx, signature, {
|
|
3424
|
+
timeoutMs: options.trackTimeoutMs,
|
|
3425
|
+
signal: trackControllers[index].signal,
|
|
3426
|
+
getAbortStatus: () => abortStatuses[index]
|
|
3427
|
+
})
|
|
3428
|
+
);
|
|
3429
|
+
options.signal?.addEventListener(
|
|
3430
|
+
"abort",
|
|
3431
|
+
() => {
|
|
3432
|
+
for (let index = 0; index < trackControllers.length; index += 1) {
|
|
3433
|
+
abortStatuses[index] ?? (abortStatuses[index] = "cancelled");
|
|
3434
|
+
trackControllers[index].abort();
|
|
3435
|
+
}
|
|
3436
|
+
},
|
|
3437
|
+
{ once: true }
|
|
3438
|
+
);
|
|
3439
|
+
let response;
|
|
3440
|
+
try {
|
|
3441
|
+
response = await batchSendTransactions(ctx, rawTransactions, {
|
|
3442
|
+
numRetries: options.numRetries ?? 0
|
|
3443
|
+
});
|
|
3444
|
+
} catch (error) {
|
|
3445
|
+
for (const controller of trackControllers) {
|
|
3446
|
+
controller.abort();
|
|
3447
|
+
}
|
|
3448
|
+
await Promise.allSettled(trackPromises);
|
|
3449
|
+
throw error;
|
|
3450
|
+
}
|
|
3451
|
+
const accepted = signatures.map((_, index) => response.accepted[index] === true);
|
|
3452
|
+
for (let index = 0; index < accepted.length; index += 1) {
|
|
3453
|
+
if (!accepted[index]) {
|
|
3454
|
+
abortStatuses[index] = "not_accepted";
|
|
3455
|
+
trackControllers[index].abort();
|
|
3456
|
+
}
|
|
3457
|
+
}
|
|
3458
|
+
const tracked = await Promise.all(trackPromises);
|
|
3459
|
+
return signatures.map((signature, index) => ({
|
|
3460
|
+
signature,
|
|
3461
|
+
accepted: accepted[index],
|
|
3462
|
+
...tracked[index]
|
|
3463
|
+
}));
|
|
3464
|
+
}
|
|
3465
|
+
function sendAndTrackTxn(ctx, transaction, options = {}) {
|
|
3466
|
+
const raw = transaction instanceof Uint8Array ? transaction : transaction.toWire();
|
|
3467
|
+
const request = protobuf.create(SendAndTrackTxnRequestSchema, {
|
|
3468
|
+
transaction: raw,
|
|
3469
|
+
timeout: options.timeoutMs != null ? {
|
|
3470
|
+
seconds: BigInt(Math.floor(options.timeoutMs / 1e3)),
|
|
3471
|
+
nanos: options.timeoutMs % 1e3 * 1e6
|
|
3472
|
+
} : void 0
|
|
3473
|
+
});
|
|
3474
|
+
const iterable = ctx.command.sendAndTrackTxn(request, {
|
|
3475
|
+
...withCallOptions(ctx),
|
|
3476
|
+
signal: options.signal
|
|
3477
|
+
});
|
|
3478
|
+
async function* mapper() {
|
|
3479
|
+
for await (const response of iterable) {
|
|
3480
|
+
yield {
|
|
3481
|
+
status: response.status,
|
|
3482
|
+
signature: response.signature ? { value: response.signature.value } : void 0,
|
|
3483
|
+
consensusStatus: response.consensusStatus,
|
|
3484
|
+
executionResult: response.executionResult ? {
|
|
3485
|
+
vmError: response.executionResult.vmError,
|
|
3486
|
+
consumedComputeUnits: response.executionResult.consumedComputeUnits,
|
|
3487
|
+
userErrorCode: response.executionResult.userErrorCode
|
|
3488
|
+
} : void 0
|
|
3489
|
+
};
|
|
3490
|
+
}
|
|
3491
|
+
}
|
|
3492
|
+
return mapper();
|
|
3493
|
+
}
|
|
3494
|
+
async function sendRawTransaction(ctx, rawTransaction) {
|
|
3495
|
+
const request = protobuf.create(SendTransactionRequestSchema, { rawTransaction });
|
|
3496
|
+
const response = await ctx.command.sendTransaction(request, withCallOptions(ctx));
|
|
3497
|
+
if (!response.signature?.value) {
|
|
3498
|
+
throw new Error("No signature returned from sendTransaction");
|
|
3499
|
+
}
|
|
3500
|
+
return encodeSignature(response.signature.value);
|
|
3501
|
+
}
|
|
3502
|
+
function extractSignature(rawTransaction) {
|
|
3503
|
+
if (rawTransaction.length < 64) {
|
|
3504
|
+
throw new Error(`Raw transaction too short to contain a signature: ${rawTransaction.length} bytes`);
|
|
3505
|
+
}
|
|
3506
|
+
const signatureBytes = rawTransaction.slice(rawTransaction.length - 64);
|
|
3507
|
+
return Signature.from(signatureBytes).toThruFmt();
|
|
3508
|
+
}
|
|
3509
|
+
async function trackUntilExecution(ctx, signature, options = {}) {
|
|
3510
|
+
let finalizedSeen = false;
|
|
3511
|
+
let latestUpdate;
|
|
3512
|
+
try {
|
|
3513
|
+
for await (const update of trackTransaction(ctx, signature, options)) {
|
|
3514
|
+
latestUpdate = update;
|
|
3515
|
+
if (update.statusCode === 3 /* FINALIZED */ || update.status === "finalized") {
|
|
3516
|
+
finalizedSeen = true;
|
|
3517
|
+
}
|
|
3518
|
+
if (update.executionResult) {
|
|
3519
|
+
return {
|
|
3520
|
+
trackStatus: "executed",
|
|
3521
|
+
update,
|
|
3522
|
+
executionResult: update.executionResult
|
|
3523
|
+
};
|
|
3524
|
+
}
|
|
3525
|
+
}
|
|
3526
|
+
} catch (error) {
|
|
3527
|
+
if (options.signal?.aborted) {
|
|
3528
|
+
return {
|
|
3529
|
+
trackStatus: options.getAbortStatus?.() ?? "cancelled",
|
|
3530
|
+
error
|
|
3531
|
+
};
|
|
3532
|
+
}
|
|
3533
|
+
if (finalizedSeen) {
|
|
3534
|
+
return {
|
|
3535
|
+
trackStatus: "finalized_without_execution",
|
|
3536
|
+
update: latestUpdate,
|
|
3537
|
+
error
|
|
3538
|
+
};
|
|
3539
|
+
}
|
|
3540
|
+
return {
|
|
3541
|
+
trackStatus: "track_error",
|
|
3542
|
+
update: latestUpdate,
|
|
3543
|
+
error
|
|
3544
|
+
};
|
|
3545
|
+
}
|
|
3546
|
+
if (finalizedSeen) {
|
|
3547
|
+
return {
|
|
3548
|
+
trackStatus: "finalized_without_execution",
|
|
3549
|
+
update: latestUpdate
|
|
3550
|
+
};
|
|
3551
|
+
}
|
|
3552
|
+
return {
|
|
3553
|
+
trackStatus: "timeout",
|
|
3554
|
+
update: latestUpdate
|
|
3555
|
+
};
|
|
3556
|
+
}
|
|
3557
|
+
function createTransactionBuilder() {
|
|
3558
|
+
return new TransactionBuilder();
|
|
3559
|
+
}
|
|
3560
|
+
async function createBuildParams(ctx, options) {
|
|
3561
|
+
const feePayerPublicKey = Pubkey.from(options.feePayer.publicKey).toBytes();
|
|
3562
|
+
const program = Pubkey.from(options.program).toBytes();
|
|
3563
|
+
const header = await createTransactionHeader(ctx, options.header ?? {}, feePayerPublicKey);
|
|
3564
|
+
const accounts = parseAccounts(options.accounts);
|
|
3565
|
+
const context = createInstructionContext2(feePayerPublicKey, program, accounts);
|
|
3566
|
+
const instructionData = await resolveInstructionData(options.instructionData, context);
|
|
3567
|
+
const proofs = createProofs(options);
|
|
3568
|
+
return {
|
|
3569
|
+
feePayer: {
|
|
3570
|
+
publicKey: feePayerPublicKey,
|
|
3571
|
+
privateKey: options.feePayer.privateKey
|
|
3572
|
+
},
|
|
3573
|
+
program: Pubkey.from(options.program).toBytes(),
|
|
3574
|
+
header,
|
|
3575
|
+
accounts,
|
|
3576
|
+
instructionData,
|
|
3577
|
+
proofs
|
|
3578
|
+
};
|
|
3579
|
+
}
|
|
3580
|
+
async function createTransactionHeader(ctx, header, feePayerPublicKey) {
|
|
3581
|
+
const nonce = header.nonce ?? await fetchFeePayerNonce(ctx, feePayerPublicKey);
|
|
3582
|
+
const startSlot = header.startSlot ?? await fetchFinalizedSlot(ctx);
|
|
3583
|
+
const chainId = header.chainId ?? await fetchChainId(ctx);
|
|
3584
|
+
return {
|
|
3585
|
+
fee: header.fee ?? DEFAULT_FEE,
|
|
3586
|
+
nonce,
|
|
3587
|
+
startSlot,
|
|
3588
|
+
expiryAfter: header.expiryAfter ?? DEFAULT_EXPIRY_AFTER,
|
|
3589
|
+
chainId,
|
|
3590
|
+
computeUnits: header.computeUnits ?? DEFAULT_COMPUTE_UNITS,
|
|
3591
|
+
stateUnits: header.stateUnits ?? DEFAULT_STATE_UNITS,
|
|
3592
|
+
memoryUnits: header.memoryUnits ?? DEFAULT_MEMORY_UNITS,
|
|
3593
|
+
flags: header.flags
|
|
3594
|
+
};
|
|
3595
|
+
}
|
|
3596
|
+
function parseAccounts(accounts) {
|
|
3597
|
+
if (!accounts) {
|
|
3598
|
+
return void 0;
|
|
3599
|
+
}
|
|
3600
|
+
const readWrite = accounts.readWrite?.map(
|
|
3601
|
+
(value, index) => Pubkey.from(value).toBytes()
|
|
3602
|
+
);
|
|
3603
|
+
const readOnly = accounts.readOnly?.map(
|
|
3604
|
+
(value, index) => Pubkey.from(value).toBytes()
|
|
3605
|
+
);
|
|
3606
|
+
const result = {};
|
|
3607
|
+
if (readWrite && readWrite.length > 0) {
|
|
3608
|
+
result.readWriteAccounts = normalizeAccountList(readWrite);
|
|
3609
|
+
}
|
|
3610
|
+
if (readOnly && readOnly.length > 0) {
|
|
3611
|
+
result.readOnlyAccounts = normalizeAccountList(readOnly);
|
|
3612
|
+
}
|
|
3613
|
+
if (!result.readWriteAccounts && !result.readOnlyAccounts) {
|
|
3614
|
+
return void 0;
|
|
3615
|
+
}
|
|
3616
|
+
return result;
|
|
3617
|
+
}
|
|
3618
|
+
function createInstructionContext2(feePayer, program, accounts) {
|
|
3619
|
+
const allAccounts = [
|
|
3620
|
+
Pubkey.from(feePayer),
|
|
3621
|
+
Pubkey.from(program),
|
|
3622
|
+
...accounts?.readWriteAccounts?.map((value) => Pubkey.from(value)) ?? [],
|
|
3623
|
+
...accounts?.readOnlyAccounts?.map((value) => Pubkey.from(value)) ?? []
|
|
3624
|
+
];
|
|
3625
|
+
const getAccountIndex = (pubkey) => {
|
|
3626
|
+
for (let i = 0; i < allAccounts.length; i++) {
|
|
3627
|
+
if (allAccounts[i].equals(Pubkey.from(pubkey))) {
|
|
3628
|
+
return i;
|
|
3629
|
+
}
|
|
3630
|
+
}
|
|
3631
|
+
throw new Error("Account not found in transaction accounts");
|
|
3632
|
+
};
|
|
3633
|
+
return { accounts: allAccounts, getAccountIndex };
|
|
3634
|
+
}
|
|
3635
|
+
async function resolveInstructionData(value, context) {
|
|
3636
|
+
if (value === void 0) {
|
|
3637
|
+
return void 0;
|
|
3638
|
+
}
|
|
3639
|
+
if (typeof value === "function") {
|
|
3640
|
+
return await value(context);
|
|
3641
|
+
}
|
|
3642
|
+
if (value instanceof Uint8Array) {
|
|
3643
|
+
return value;
|
|
3644
|
+
}
|
|
3645
|
+
return parseInstructionData(value);
|
|
3646
|
+
}
|
|
3647
|
+
function createProofs(options) {
|
|
3648
|
+
const proofs = {};
|
|
3649
|
+
if (options.feePayerStateProof) {
|
|
3650
|
+
proofs.feePayerStateProof = options.feePayerStateProof;
|
|
3651
|
+
}
|
|
3652
|
+
if (options.feePayerAccountMetaRaw) {
|
|
3653
|
+
proofs.feePayerAccountMetaRaw = options.feePayerAccountMetaRaw;
|
|
3654
|
+
}
|
|
3655
|
+
const hasProofs = Boolean(proofs.feePayerStateProof || proofs.feePayerAccountMetaRaw);
|
|
3656
|
+
return hasProofs ? proofs : void 0;
|
|
3657
|
+
}
|
|
3658
|
+
async function fetchFeePayerNonce(ctx, feePayer) {
|
|
3659
|
+
const account = await getAccount(ctx, feePayer, { view: 4 /* FULL */ });
|
|
3660
|
+
const nonce = account.meta?.nonce;
|
|
3661
|
+
if (nonce === void 0) {
|
|
3662
|
+
throw new Error("Fee payer account nonce is unavailable");
|
|
3663
|
+
}
|
|
3664
|
+
return nonce;
|
|
3665
|
+
}
|
|
3666
|
+
async function fetchFinalizedSlot(ctx) {
|
|
3667
|
+
const height = await getBlockHeight(ctx);
|
|
3668
|
+
return height.finalized;
|
|
3669
|
+
}
|
|
3670
|
+
async function fetchChainId(ctx) {
|
|
3671
|
+
return getChainId(ctx);
|
|
3672
|
+
}
|
|
3673
|
+
|
|
3674
|
+
// thru-ts-client-sdk/domain/version/VersionInfo.ts
|
|
3675
|
+
var VersionInfo = class _VersionInfo {
|
|
3676
|
+
constructor(components) {
|
|
3677
|
+
this.components = { ...components };
|
|
3678
|
+
}
|
|
3679
|
+
static fromProto(proto) {
|
|
3680
|
+
return new _VersionInfo(proto.versions ?? {});
|
|
3681
|
+
}
|
|
3682
|
+
get(component) {
|
|
3683
|
+
return this.components[component];
|
|
3684
|
+
}
|
|
3685
|
+
};
|
|
3686
|
+
|
|
3687
|
+
// thru-ts-client-sdk/modules/version.ts
|
|
3688
|
+
function getVersion(ctx) {
|
|
3689
|
+
const request = protobuf.create(GetVersionRequestSchema);
|
|
3690
|
+
return ctx.query.getVersion(request, withCallOptions(ctx)).then((response) => VersionInfo.fromProto(response));
|
|
3691
|
+
}
|
|
3692
|
+
|
|
3693
|
+
// thru-ts-client-sdk/core/bound-client.ts
|
|
3694
|
+
function bind(ctx, fn) {
|
|
3695
|
+
return ((...args) => fn(ctx, ...args));
|
|
3696
|
+
}
|
|
3697
|
+
function createBoundThruClient(ctx) {
|
|
3698
|
+
return {
|
|
3699
|
+
ctx,
|
|
3700
|
+
blocks: {
|
|
3701
|
+
get: bind(ctx, getBlock),
|
|
3702
|
+
getRaw: bind(ctx, getRawBlock),
|
|
3703
|
+
list: bind(ctx, listBlocks),
|
|
3704
|
+
stream: bind(ctx, streamBlocks),
|
|
3705
|
+
getBlockHeight: bind(ctx, getBlockHeight),
|
|
3706
|
+
streamHeight: bind(ctx, streamHeight)
|
|
3707
|
+
},
|
|
3708
|
+
accounts: {
|
|
3709
|
+
get: bind(ctx, getAccount),
|
|
3710
|
+
getRaw: bind(ctx, getRawAccount),
|
|
3711
|
+
list: bind(ctx, listAccounts),
|
|
3712
|
+
stream: bind(ctx, streamAccountUpdates),
|
|
3713
|
+
create: bind(ctx, createAccount)
|
|
3714
|
+
},
|
|
3715
|
+
transactions: {
|
|
3716
|
+
get: bind(ctx, getTransaction),
|
|
3717
|
+
getRaw: bind(ctx, getRawTransaction),
|
|
3718
|
+
getStatus: bind(ctx, getTransactionStatus),
|
|
3719
|
+
list: bind(ctx, listTransactions),
|
|
3720
|
+
listForAccount: bind(ctx, listTransactionsForAccount),
|
|
3721
|
+
stream: bind(ctx, streamTransactions),
|
|
3722
|
+
build: bind(ctx, buildTransaction),
|
|
3723
|
+
buildAndSign: bind(ctx, buildAndSignTransaction),
|
|
3724
|
+
send: bind(ctx, sendTransaction),
|
|
3725
|
+
batchSend: bind(ctx, batchSendTransactions),
|
|
3726
|
+
batchSendAndTrack: bind(ctx, batchSendAndTrack),
|
|
3727
|
+
sendAndTrack: bind(ctx, sendAndTrackTxn),
|
|
3728
|
+
track: bind(ctx, trackTransaction)
|
|
3729
|
+
},
|
|
3730
|
+
nonce: {
|
|
3731
|
+
createObserver: (account, options) => new AccountNonceObserver(ctx, account, options),
|
|
3732
|
+
createFeePayerManager: (feePayer, options) => new FeePayerNonceManager(ctx, feePayer, options)
|
|
3733
|
+
},
|
|
3734
|
+
helpers: {
|
|
3735
|
+
createSignature: Signature.from,
|
|
3736
|
+
createPubkey: Pubkey.from,
|
|
3737
|
+
deriveProgramAddress,
|
|
3738
|
+
deriveAddress
|
|
3739
|
+
},
|
|
3740
|
+
keys: {
|
|
3741
|
+
generateKeyPair,
|
|
3742
|
+
fromPrivateKey
|
|
3743
|
+
},
|
|
3744
|
+
events: {
|
|
3745
|
+
get: bind(ctx, getEvent),
|
|
3746
|
+
list: bind(ctx, listEvents),
|
|
3747
|
+
stream: bind(ctx, streamEvents)
|
|
3748
|
+
},
|
|
3749
|
+
slots: {
|
|
3750
|
+
getMetrics: bind(ctx, getSlotMetrics),
|
|
3751
|
+
listMetrics: bind(ctx, listSlotMetrics),
|
|
3752
|
+
streamMetrics: bind(ctx, streamSlotMetrics)
|
|
3753
|
+
},
|
|
3754
|
+
proofs: {
|
|
3755
|
+
generate: bind(ctx, generateStateProof),
|
|
3756
|
+
getStateRoots: bind(ctx, getStateRoots)
|
|
3757
|
+
},
|
|
3758
|
+
node: {
|
|
3759
|
+
getStatus: bind(ctx, getNodeStatus),
|
|
3760
|
+
getPubkey: bind(ctx, getNodePubkey),
|
|
3761
|
+
getRecords: bind(ctx, getNodeRecords),
|
|
3762
|
+
streamRecords: bind(ctx, streamNodeRecords)
|
|
3763
|
+
},
|
|
3764
|
+
chain: {
|
|
3765
|
+
getChainInfo: bind(ctx, getChainInfo),
|
|
3766
|
+
getChainId: bind(ctx, getChainId)
|
|
3767
|
+
},
|
|
3768
|
+
version: {
|
|
3769
|
+
get: bind(ctx, getVersion)
|
|
3770
|
+
},
|
|
3771
|
+
consensus: {
|
|
3772
|
+
statusToString: consensusStatusToString,
|
|
3773
|
+
versionContext,
|
|
3774
|
+
currentVersionContext,
|
|
3775
|
+
currentOrHistoricalVersionContext,
|
|
3776
|
+
slotVersionContext,
|
|
3777
|
+
timestampVersionContext,
|
|
3778
|
+
seqVersionContext
|
|
3779
|
+
}
|
|
3780
|
+
};
|
|
3781
|
+
}
|
|
3782
|
+
|
|
3783
|
+
// thru-ts-client-sdk/client.ts
|
|
3784
|
+
function createThruClient(config = {}) {
|
|
3785
|
+
const ctx = createThruClientContext(config);
|
|
3786
|
+
return createBoundThruClient(ctx);
|
|
3787
|
+
}
|
|
3788
|
+
|
|
3789
|
+
exports.createThruClient = createThruClient;
|
|
3790
|
+
//# sourceMappingURL=client.cjs.map
|
|
3791
|
+
//# sourceMappingURL=client.cjs.map
|