@bitgo-beta/sdk-coin-icp 1.0.1-beta.575 → 1.0.1-beta.576

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/package.json +7 -7
  2. package/dist/src/icp.d.ts +0 -92
  3. package/dist/src/icp.d.ts.map +0 -1
  4. package/dist/src/icp.js +0 -377
  5. package/dist/src/index.d.ts +0 -5
  6. package/dist/src/index.d.ts.map +0 -1
  7. package/dist/src/index.js +0 -21
  8. package/dist/src/lib/icpAgent.d.ts +0 -34
  9. package/dist/src/lib/icpAgent.d.ts.map +0 -1
  10. package/dist/src/lib/icpAgent.js +0 -87
  11. package/dist/src/lib/iface.d.ts +0 -187
  12. package/dist/src/lib/iface.d.ts.map +0 -1
  13. package/dist/src/lib/iface.js +0 -39
  14. package/dist/src/lib/index.d.ts +0 -9
  15. package/dist/src/lib/index.d.ts.map +0 -1
  16. package/dist/src/lib/index.js +0 -53
  17. package/dist/src/lib/keyPair.d.ts +0 -18
  18. package/dist/src/lib/keyPair.d.ts.map +0 -1
  19. package/dist/src/lib/keyPair.js +0 -60
  20. package/dist/src/lib/signedTransactionBuilder.d.ts +0 -9
  21. package/dist/src/lib/signedTransactionBuilder.d.ts.map +0 -1
  22. package/dist/src/lib/signedTransactionBuilder.js +0 -64
  23. package/dist/src/lib/transaction.d.ts +0 -54
  24. package/dist/src/lib/transaction.d.ts.map +0 -1
  25. package/dist/src/lib/transaction.js +0 -255
  26. package/dist/src/lib/transactionBuilder.d.ts +0 -78
  27. package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
  28. package/dist/src/lib/transactionBuilder.js +0 -164
  29. package/dist/src/lib/transactionBuilderFactory.d.ts +0 -25
  30. package/dist/src/lib/transactionBuilderFactory.d.ts.map +0 -1
  31. package/dist/src/lib/transactionBuilderFactory.js +0 -61
  32. package/dist/src/lib/transferBuilder.d.ts +0 -19
  33. package/dist/src/lib/transferBuilder.d.ts.map +0 -1
  34. package/dist/src/lib/transferBuilder.js +0 -109
  35. package/dist/src/lib/unsignedTransactionBuilder.d.ts +0 -11
  36. package/dist/src/lib/unsignedTransactionBuilder.d.ts.map +0 -1
  37. package/dist/src/lib/unsignedTransactionBuilder.js +0 -87
  38. package/dist/src/lib/utils.d.ts +0 -304
  39. package/dist/src/lib/utils.d.ts.map +0 -1
  40. package/dist/src/lib/utils.js +0 -725
  41. package/dist/src/register.d.ts +0 -3
  42. package/dist/src/register.d.ts.map +0 -1
  43. package/dist/src/register.js +0 -11
  44. package/dist/src/ticp.d.ts +0 -25
  45. package/dist/src/ticp.d.ts.map +0 -1
  46. package/dist/src/ticp.js +0 -37
@@ -1,54 +0,0 @@
1
- import { BaseKey, BaseTransaction } from '@bitgo-beta/sdk-core';
2
- import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
3
- import { IcpTransaction, IcpTransactionData, PayloadsData, Signatures, TxData, IcpTransactionExplanation, ParsedTransaction } from './iface';
4
- export declare class Transaction extends BaseTransaction {
5
- protected _icpTransactionData: IcpTransactionData;
6
- protected _icpTransaction: IcpTransaction;
7
- protected _payloadsData: PayloadsData;
8
- protected _signedTransaction: string;
9
- protected _signaturePayload: Signatures[];
10
- protected _createdTimestamp: number | bigint | undefined;
11
- constructor(_coinConfig: Readonly<CoinConfig>);
12
- get icpTransactionData(): IcpTransactionData;
13
- set icpTransactionData(icpTransactionData: IcpTransactionData);
14
- get icpTransaction(): IcpTransaction;
15
- set icpTransaction(icpTransaction: IcpTransaction);
16
- get unsignedTransaction(): string;
17
- get signaturePayload(): Signatures[];
18
- set signedTransaction(signature: string);
19
- get signedTransaction(): string;
20
- set payloadsData(payloadsData: PayloadsData);
21
- get payloadsData(): PayloadsData;
22
- set createdTimestamp(createdTimestamp: number);
23
- get createdTimestamp(): number | bigint | undefined;
24
- fromRawTransaction(rawTransaction: string): Promise<void>;
25
- addSignature(signaturePayloads: Signatures[]): void;
26
- /** @inheritdoc */
27
- toJson(): TxData;
28
- /** @inheritDoc */
29
- explainTransaction(): IcpTransactionExplanation;
30
- /**
31
- * Explains a transfer transaction by providing details about the recipients and the total output amount.
32
- *
33
- * @param {IcpTransactionExplanation} explanationResult - The initial explanation result to be extended.
34
- * @returns {IcpTransactionExplanation} The extended explanation result including the output amount and recipients.
35
- */
36
- explainTransferTransaction(explanationResult: IcpTransactionExplanation): IcpTransactionExplanation;
37
- /** @inheritdoc */
38
- toBroadcastFormat(): string;
39
- serialize(): string;
40
- parseUnsignedTransaction(rawTransaction: string): Promise<ParsedTransaction>;
41
- private getParsedTransactionFromUpdate;
42
- parseSignedTransaction(rawTransaction: string): Promise<ParsedTransaction>;
43
- /** @inheritdoc */
44
- canSign(key: BaseKey): boolean;
45
- /**
46
- * Generates a unique transaction ID for the current transaction.
47
- * The transaction ID is derived using the unsigned transaction data,
48
- * the sender's address, and the receiver's address.
49
- *
50
- * @returns {string} The generated transaction ID.
51
- */
52
- private generateTransactionId;
53
- }
54
- //# sourceMappingURL=transaction.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../../src/lib/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,eAAe,EAKhB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,YAAY,EAEZ,UAAU,EACV,MAAM,EACN,yBAAyB,EAGzB,iBAAiB,EAOlB,MAAM,SAAS,CAAC;AAGjB,qBAAa,WAAY,SAAQ,eAAe;IAC9C,SAAS,CAAC,mBAAmB,EAAE,kBAAkB,CAAC;IAClD,SAAS,CAAC,eAAe,EAAE,cAAc,CAAC;IAC1C,SAAS,CAAC,aAAa,EAAE,YAAY,CAAC;IACtC,SAAS,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACrC,SAAS,CAAC,iBAAiB,EAAE,UAAU,EAAE,CAAC;IAC1C,SAAS,CAAC,iBAAiB,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;gBAE7C,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAI7C,IAAI,kBAAkB,IAAI,kBAAkB,CAE3C;IAED,IAAI,kBAAkB,CAAC,kBAAkB,EAAE,kBAAkB,EAE5D;IAED,IAAI,cAAc,IAAI,cAAc,CAEnC;IAED,IAAI,cAAc,CAAC,cAAc,EAAE,cAAc,EAEhD;IAED,IAAI,mBAAmB,IAAI,MAAM,CAEhC;IAED,IAAI,gBAAgB,IAAI,UAAU,EAAE,CAEnC;IAED,IAAI,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAEtC;IAED,IAAI,iBAAiB,IAAI,MAAM,CAE9B;IAED,IAAI,YAAY,CAAC,YAAY,EAAE,YAAY,EAE1C;IAED,IAAI,YAAY,IAAI,YAAY,CAE/B;IAED,IAAI,gBAAgB,CAAC,gBAAgB,EAAE,MAAM,EAE5C;IAED,IAAI,gBAAgB,IAAI,MAAM,GAAG,MAAM,GAAG,SAAS,CAElD;IAEK,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkC/D,YAAY,CAAC,iBAAiB,EAAE,UAAU,EAAE,GAAG,IAAI;IAanD,kBAAkB;IAClB,MAAM,IAAI,MAAM;IAyBhB,kBAAkB;IAClB,kBAAkB,IAAI,yBAAyB;IAwB/C;;;;;OAKG;IACH,0BAA0B,CAAC,iBAAiB,EAAE,yBAAyB,GAAG,yBAAyB;IAcnG,kBAAkB;IAClB,iBAAiB,IAAI,MAAM;IAO3B,SAAS,IAAI,MAAM;IAIb,wBAAwB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;YAQpE,8BAA8B;IAgEtC,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAOhF,kBAAkB;IAClB,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO;IAI9B;;;;;;OAMG;IACH,OAAO,CAAC,qBAAqB;CAQ9B"}
@@ -1,255 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.Transaction = void 0;
7
- const sdk_core_1 = require("@bitgo-beta/sdk-core");
8
- const iface_1 = require("./iface");
9
- const utils_1 = __importDefault(require("./utils"));
10
- class Transaction extends sdk_core_1.BaseTransaction {
11
- constructor(_coinConfig) {
12
- super(_coinConfig);
13
- }
14
- get icpTransactionData() {
15
- return this._icpTransactionData;
16
- }
17
- set icpTransactionData(icpTransactionData) {
18
- this._icpTransactionData = icpTransactionData;
19
- }
20
- get icpTransaction() {
21
- return this._icpTransaction;
22
- }
23
- set icpTransaction(icpTransaction) {
24
- this._icpTransaction = icpTransaction;
25
- }
26
- get unsignedTransaction() {
27
- return this._payloadsData.unsigned_transaction;
28
- }
29
- get signaturePayload() {
30
- return this._signaturePayload;
31
- }
32
- set signedTransaction(signature) {
33
- this._signedTransaction = signature;
34
- }
35
- get signedTransaction() {
36
- return this._signedTransaction;
37
- }
38
- set payloadsData(payloadsData) {
39
- this._payloadsData = payloadsData;
40
- }
41
- get payloadsData() {
42
- return this._payloadsData;
43
- }
44
- set createdTimestamp(createdTimestamp) {
45
- this._createdTimestamp = createdTimestamp;
46
- }
47
- get createdTimestamp() {
48
- return this._createdTimestamp;
49
- }
50
- async fromRawTransaction(rawTransaction) {
51
- try {
52
- const serializedTxFormatBuffer = Buffer.from(rawTransaction, 'hex');
53
- const serializedTxFormatJsonString = serializedTxFormatBuffer.toString('utf-8');
54
- const jsonRawTransaction = JSON.parse(serializedTxFormatJsonString);
55
- const payloadsData = jsonRawTransaction.serializedTxHex;
56
- this._payloadsData = payloadsData;
57
- const parsedTx = await this.parseUnsignedTransaction(payloadsData.unsigned_transaction);
58
- const senderPublicKeyHex = jsonRawTransaction.publicKey;
59
- const transactionType = parsedTx.operations[0].type;
60
- switch (transactionType) {
61
- case iface_1.OperationType.TRANSACTION:
62
- this._icpTransactionData = {
63
- senderAddress: parsedTx.operations[0].account.address,
64
- receiverAddress: parsedTx.operations[1].account.address,
65
- amount: parsedTx.operations[1].amount.value,
66
- fee: parsedTx.operations[2].amount.value,
67
- senderPublicKeyHex: senderPublicKeyHex,
68
- transactionType: transactionType,
69
- expiryTime: Number(parsedTx.metadata.ingress_end ?? parsedTx.metadata.created_at_time + iface_1.MAX_INGRESS_TTL),
70
- memo: parsedTx.metadata.memo,
71
- };
72
- utils_1.default.validateRawTransaction(this._icpTransactionData);
73
- this._id = this.generateTransactionId();
74
- break;
75
- default:
76
- throw new Error('Invalid transaction type');
77
- }
78
- }
79
- catch (error) {
80
- throw new sdk_core_1.InvalidTransactionError(`Invalid transaction: ${error.message}`);
81
- }
82
- }
83
- addSignature(signaturePayloads) {
84
- if (!signaturePayloads) {
85
- throw new Error('signatures not provided');
86
- }
87
- if (signaturePayloads.length !== this._payloadsData.payloads.length) {
88
- throw new Error('signatures length is not matching');
89
- }
90
- this._signaturePayload = signaturePayloads;
91
- if (this._id === undefined || this._id === null) {
92
- this._id = this.generateTransactionId();
93
- }
94
- }
95
- /** @inheritdoc */
96
- toJson() {
97
- if (!this._icpTransactionData) {
98
- throw new sdk_core_1.InvalidTransactionError('Empty transaction');
99
- }
100
- switch (this._icpTransactionData.transactionType) {
101
- case iface_1.OperationType.TRANSACTION:
102
- const txData = {
103
- id: this._id,
104
- sender: this._icpTransactionData.senderAddress,
105
- senderPublicKey: this._icpTransactionData.senderPublicKeyHex,
106
- recipient: this._icpTransactionData.receiverAddress,
107
- memo: this._icpTransactionData.memo,
108
- feeAmount: this._icpTransactionData.fee,
109
- expirationTime: this._icpTransactionData.expiryTime,
110
- type: sdk_core_1.TransactionType.Send,
111
- };
112
- if (this._icpTransactionData.memo !== undefined) {
113
- txData.memo = this._icpTransactionData.memo;
114
- }
115
- return txData;
116
- default:
117
- throw new Error(`Unsupported transaction type: ${this._icpTransactionData.transactionType}`);
118
- }
119
- }
120
- /** @inheritDoc */
121
- explainTransaction() {
122
- const result = this.toJson();
123
- const displayOrder = ['id', 'outputAmount', 'changeAmount', 'outputs', 'changeOutputs', 'fee'];
124
- const outputs = [];
125
- const explanationResult = {
126
- displayOrder,
127
- id: this.id,
128
- outputs,
129
- outputAmount: '0',
130
- fee: { fee: '0' },
131
- type: result.type,
132
- changeOutputs: [], // account based does not use change outputs
133
- changeAmount: '0', // account based does not make change
134
- };
135
- switch (explanationResult.type) {
136
- case sdk_core_1.TransactionType.Send:
137
- return this.explainTransferTransaction(explanationResult);
138
- default:
139
- throw new sdk_core_1.InvalidTransactionError('Transaction type not supported');
140
- }
141
- }
142
- /**
143
- * Explains a transfer transaction by providing details about the recipients and the total output amount.
144
- *
145
- * @param {IcpTransactionExplanation} explanationResult - The initial explanation result to be extended.
146
- * @returns {IcpTransactionExplanation} The extended explanation result including the output amount and recipients.
147
- */
148
- explainTransferTransaction(explanationResult) {
149
- explanationResult.fee = { fee: this.icpTransactionData.fee };
150
- const recipients = utils_1.default.getRecipients(this.icpTransactionData);
151
- const outputs = [recipients];
152
- const outputAmountBN = recipients.amount;
153
- const outputAmount = outputAmountBN.toString();
154
- return {
155
- ...explanationResult,
156
- outputAmount,
157
- outputs,
158
- };
159
- }
160
- /** @inheritdoc */
161
- toBroadcastFormat() {
162
- if (!this._signedTransaction) {
163
- throw new sdk_core_1.InvalidTransactionError('Empty transaction');
164
- }
165
- return this.serialize();
166
- }
167
- serialize() {
168
- return this._signedTransaction;
169
- }
170
- async parseUnsignedTransaction(rawTransaction) {
171
- const unsignedTransaction = utils_1.default.cborDecode(utils_1.default.blobFromHex(rawTransaction));
172
- const update = unsignedTransaction.updates[0];
173
- const httpCanisterUpdate = update[1];
174
- httpCanisterUpdate.ingress_expiry = BigInt(unsignedTransaction.ingress_expiries[0]);
175
- return await this.getParsedTransactionFromUpdate(httpCanisterUpdate, false);
176
- }
177
- async getParsedTransactionFromUpdate(httpCanisterUpdate, isSigned) {
178
- const senderPrincipal = utils_1.default.convertSenderBlobToPrincipal(httpCanisterUpdate.sender);
179
- const ACCOUNT_ID_PREFIX = utils_1.default.getAccountIdPrefix();
180
- const subAccount = new Uint8Array(32);
181
- const senderAccount = utils_1.default.getAccountIdFromPrincipalBytes(ACCOUNT_ID_PREFIX, Buffer.from(senderPrincipal.buffer), subAccount);
182
- const args = await utils_1.default.fromArgs(httpCanisterUpdate.arg);
183
- const senderOperation = {
184
- type: iface_1.OperationType.TRANSACTION,
185
- account: { address: senderAccount },
186
- amount: {
187
- value: `-${args.payment.receiverGets.e8s.toString()}`,
188
- currency: {
189
- symbol: this._coinConfig.family,
190
- decimals: this._coinConfig.decimalPlaces,
191
- },
192
- },
193
- };
194
- const receiverOperation = {
195
- type: iface_1.OperationType.TRANSACTION,
196
- account: { address: args.to.hash.toString('hex') },
197
- amount: {
198
- value: args.payment.receiverGets.e8s.toString(),
199
- currency: {
200
- symbol: this._coinConfig.family,
201
- decimals: this._coinConfig.decimalPlaces,
202
- },
203
- },
204
- };
205
- const feeOperation = {
206
- type: iface_1.OperationType.FEE,
207
- account: { address: senderAccount },
208
- amount: {
209
- value: `-${args.maxFee.e8s.toString()}`,
210
- currency: {
211
- symbol: this._coinConfig.family,
212
- decimals: this._coinConfig.decimalPlaces,
213
- },
214
- },
215
- };
216
- const accountIdentifierSigners = [];
217
- if (isSigned) {
218
- accountIdentifierSigners.push({ address: senderAccount });
219
- }
220
- const parsedTxn = {
221
- operations: [senderOperation, receiverOperation, feeOperation],
222
- metadata: {
223
- created_at_time: args.createdAtTime.timestampNanos,
224
- memo: Number(args.memo.memo),
225
- ingress_end: Number(httpCanisterUpdate.ingress_expiry) + iface_1.PERMITTED_DRIFT,
226
- },
227
- account_identifier_signers: accountIdentifierSigners,
228
- };
229
- this.createdTimestamp = args.createdAtTime.timestampNanos;
230
- return parsedTxn;
231
- }
232
- async parseSignedTransaction(rawTransaction) {
233
- const signedTransaction = utils_1.default.cborDecode(utils_1.default.blobFromHex(rawTransaction));
234
- const httpCanisterUpdate = signedTransaction.content;
235
- httpCanisterUpdate.ingress_expiry = BigInt(signedTransaction.content.ingress_expiry);
236
- return await this.getParsedTransactionFromUpdate(httpCanisterUpdate, true);
237
- }
238
- /** @inheritdoc */
239
- canSign(key) {
240
- return true;
241
- }
242
- /**
243
- * Generates a unique transaction ID for the current transaction.
244
- * The transaction ID is derived using the unsigned transaction data,
245
- * the sender's address, and the receiver's address.
246
- *
247
- * @returns {string} The generated transaction ID.
248
- */
249
- generateTransactionId() {
250
- const id = utils_1.default.getTransactionId(this.unsignedTransaction, this.icpTransactionData.senderAddress, this.icpTransactionData.receiverAddress);
251
- return id;
252
- }
253
- }
254
- exports.Transaction = Transaction;
255
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG1EQU84QjtBQUU5QixtQ0FpQmlCO0FBQ2pCLG9EQUE0QjtBQUU1QixNQUFhLFdBQVksU0FBUSwwQkFBZTtJQVE5QyxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQsSUFBSSxrQkFBa0I7UUFDcEIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUM7SUFDbEMsQ0FBQztJQUVELElBQUksa0JBQWtCLENBQUMsa0JBQXNDO1FBQzNELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxrQkFBa0IsQ0FBQztJQUNoRCxDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxjQUFjLENBQUMsY0FBOEI7UUFDL0MsSUFBSSxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUM7SUFDeEMsQ0FBQztJQUVELElBQUksbUJBQW1CO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQztJQUNqRCxDQUFDO0lBRUQsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDaEMsQ0FBQztJQUVELElBQUksaUJBQWlCLENBQUMsU0FBaUI7UUFDckMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFNBQVMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsSUFBSSxpQkFBaUI7UUFDbkIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUM7SUFDakMsQ0FBQztJQUVELElBQUksWUFBWSxDQUFDLFlBQTBCO1FBQ3pDLElBQUksQ0FBQyxhQUFhLEdBQUcsWUFBWSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUFJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FB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SyxDQUFDLFVBQVUsQ0FBQyxlQUFLLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFDOUUsTUFBTSxrQkFBa0IsR0FBSSxpQkFBb0MsQ0FBQyxPQUE2QixDQUFDO1FBQy9GLGtCQUFrQixDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUUsaUJBQW9DLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3pHLE9BQU8sTUFBTSxJQUFJLENBQUMsOEJBQThCLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixPQUFPLENBQUMsR0FBWTtRQUNsQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxxQkFBcUI7UUFDM0IsTUFBTSxFQUFFLEdBQUcsZUFBSyxDQUFDLGdCQUFnQixDQUMvQixJQUFJLENBQUMsbUJBQW1CLEVBQ3hCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLEVBQ3JDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQ3hDLENBQUM7UUFDRixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7Q0FDRjtBQWpTRCxrQ0FpU0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCYXNlS2V5LFxuICBCYXNlVHJhbnNhY3Rpb24sXG4gIFRyYW5zYWN0aW9uUmVjaXBpZW50LFxuICBUcmFuc2FjdGlvblR5cGUsXG4gIEludmFsaWRUcmFuc2FjdGlvbkVycm9yLFxuICBUcmFuc2FjdGlvblR5cGUgYXMgQml0R29UcmFuc2FjdGlvblR5cGUsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7XG4gIEljcFRyYW5zYWN0aW9uLFxuICBJY3BUcmFuc2FjdGlvbkRhdGEsXG4gIFBheWxvYWRzRGF0YSxcbiAgT3BlcmF0aW9uVHlwZSxcbiAgU2lnbmF0dXJlcyxcbiAgVHhEYXRhLFxuICBJY3BUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLFxuICBDYm9yVW5zaWduZWRUcmFuc2FjdGlvbixcbiAgSHR0cENhbmlzdGVyVXBkYXRlLFxuICBQYXJzZWRUcmFuc2FjdGlvbixcbiAgSWNwT3BlcmF0aW9uLFxuICBVcGRhdGVFbnZlbG9wZSxcbiAgSWNwQWNjb3VudCxcbiAgTUFYX0lOR1JFU1NfVFRMLFxuICBQRVJNSVRURURfRFJJRlQsXG4gIFJhd1RyYW5zYWN0aW9uLFxufSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uIHtcbiAgcHJvdGVjdGVkIF9pY3BUcmFuc2FjdGlvbkRhdGE6IEljcFRyYW5zYWN0aW9uRGF0YTtcbiAgcHJvdGVjdGVkIF9pY3BUcmFuc2FjdGlvbjogSWNwVHJhbnNhY3Rpb247XG4gIHByb3RlY3RlZCBfcGF5bG9hZHNEYXRhOiBQYXlsb2Fkc0RhdGE7XG4gIHByb3RlY3RlZCBfc2lnbmVkVHJhbnNhY3Rpb246IHN0cmluZztcbiAgcHJvdGVjdGVkIF9zaWduYXR1cmVQYXlsb2FkOiBTaWduYXR1cmVzW107XG4gIHByb3RlY3RlZCBfY3JlYXRlZFRpbWVzdGFtcDogbnVtYmVyIHwgYmlnaW50IHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIGdldCBpY3BUcmFuc2FjdGlvbkRhdGEoKTogSWNwVHJhbnNhY3Rpb25EYXRhIHtcbiAgICByZXR1cm4gdGhpcy5faWNwVHJhbnNhY3Rpb25EYXRhO1xuICB9XG5cbiAgc2V0IGljcFRyYW5zYWN0aW9uRGF0YShpY3BUcmFuc2FjdGlvbkRhdGE6IEljcFRyYW5zYWN0aW9uRGF0YSkge1xuICAgIHRoaXMuX2ljcFRyYW5zYWN0aW9uRGF0YSA9IGljcFRyYW5zYWN0aW9uRGF0YTtcbiAgfVxuXG4gIGdldCBpY3BUcmFuc2FjdGlvbigpOiBJY3BUcmFuc2FjdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ljcFRyYW5zYWN0aW9uO1xuICB9XG5cbiAgc2V0IGljcFRyYW5zYWN0aW9uKGljcFRyYW5zYWN0aW9uOiBJY3BUcmFuc2FjdGlvbikge1xuICAgIHRoaXMuX2ljcFRyYW5zYWN0aW9uID0gaWNwVHJhbnNhY3Rpb247XG4gIH1cblxuICBnZXQgdW5zaWduZWRUcmFuc2FjdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9wYXlsb2Fkc0RhdGEudW5zaWduZWRfdHJhbnNhY3Rpb247XG4gIH1cblxuICBnZXQgc2lnbmF0dXJlUGF5bG9hZCgpOiBTaWduYXR1cmVzW10ge1xuICAgIHJldHVybiB0aGlzLl9zaWduYXR1cmVQYXlsb2FkO1xuICB9XG5cbiAgc2V0IHNpZ25lZFRyYW5zYWN0aW9uKHNpZ25hdHVyZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fc2lnbmVkVHJhbnNhY3Rpb24gPSBzaWduYXR1cmU7XG4gIH1cblxuICBnZXQgc2lnbmVkVHJhbnNhY3Rpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2lnbmVkVHJhbnNhY3Rpb247XG4gIH1cblxuICBzZXQgcGF5bG9hZHNEYXRhKHBheWxvYWRzRGF0YTogUGF5bG9hZHNEYXRhKSB7XG4gICAgdGhpcy5fcGF5bG9hZHNEYXRhID0gcGF5bG9hZHNEYXRhO1xuICB9XG5cbiAgZ2V0IHBheWxvYWRzRGF0YSgpOiBQYXlsb2Fkc0RhdGEge1xuICAgIHJldHVybiB0aGlzLl9wYXlsb2Fkc0RhdGE7XG4gIH1cblxuICBzZXQgY3JlYXRlZFRpbWVzdGFtcChjcmVhdGVkVGltZXN0YW1wOiBudW1iZXIpIHtcbiAgICB0aGlzLl9jcmVhdGVkVGltZXN0YW1wID0gY3JlYXRlZFRpbWVzdGFtcDtcbiAgfVxuXG4gIGdldCBjcmVhdGVkVGltZXN0YW1wKCk6IG51bWJlciB8IGJpZ2ludCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZWRUaW1lc3RhbXA7XG4gIH1cblxuICBhc3luYyBmcm9tUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb246IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzZXJpYWxpemVkVHhGb3JtYXRCdWZmZXIgPSBCdWZmZXIuZnJvbShyYXdUcmFuc2FjdGlvbiwgJ2hleCcpO1xuICAgICAgY29uc3Qgc2VyaWFsaXplZFR4Rm9ybWF0SnNvblN0cmluZyA9IHNlcmlhbGl6ZWRUeEZvcm1hdEJ1ZmZlci50b1N0cmluZygndXRmLTgnKTtcbiAgICAgIGNvbnN0IGpzb25SYXdUcmFuc2FjdGlvbjogUmF3VHJhbnNhY3Rpb24gPSBKU09OLnBhcnNlKHNlcmlhbGl6ZWRUeEZvcm1hdEpzb25TdHJpbmcpO1xuICAgICAgY29uc3QgcGF5bG9hZHNEYXRhID0ganNvblJhd1RyYW5zYWN0aW9uLnNlcmlhbGl6ZWRUeEhleDtcbiAgICAgIHRoaXMuX3BheWxvYWRzRGF0YSA9IHBheWxvYWRzRGF0YTtcbiAgICAgIGNvbnN0IHBhcnNlZFR4ID0gYXdhaXQgdGhpcy5wYXJzZVVuc2lnbmVkVHJhbnNhY3Rpb24ocGF5bG9hZHNEYXRhLnVuc2lnbmVkX3RyYW5zYWN0aW9uKTtcbiAgICAgIGNvbnN0IHNlbmRlclB1YmxpY0tleUhleCA9IGpzb25SYXdUcmFuc2FjdGlvbi5wdWJsaWNLZXk7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvblR5cGUgPSBwYXJzZWRUeC5vcGVyYXRpb25zWzBdLnR5cGU7XG4gICAgICBzd2l0Y2ggKHRyYW5zYWN0aW9uVHlwZSkge1xuICAgICAgICBjYXNlIE9wZXJhdGlvblR5cGUuVFJBTlNBQ1RJT046XG4gICAgICAgICAgdGhpcy5faWNwVHJhbnNhY3Rpb25EYXRhID0ge1xuICAgICAgICAgICAgc2VuZGVyQWRkcmVzczogcGFyc2VkVHgub3BlcmF0aW9uc1swXS5hY2NvdW50LmFkZHJlc3MsXG4gICAgICAgICAgICByZWNlaXZlckFkZHJlc3M6IHBhcnNlZFR4Lm9wZXJhdGlvbnNbMV0uYWNjb3VudC5hZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiBwYXJzZWRUeC5vcGVyYXRpb25zWzFdLmFtb3VudC52YWx1ZSxcbiAgICAgICAgICAgIGZlZTogcGFyc2VkVHgub3BlcmF0aW9uc1syXS5hbW91bnQudmFsdWUsXG4gICAgICAgICAgICBzZW5kZXJQdWJsaWNLZXlIZXg6IHNlbmRlclB1YmxpY0tleUhleCxcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uVHlwZTogdHJhbnNhY3Rpb25UeXBlLFxuICAgICAgICAgICAgZXhwaXJ5VGltZTogTnVtYmVyKHBhcnNlZFR4Lm1ldGFkYXRhLmluZ3Jlc3NfZW5kID8/IHBhcnNlZFR4Lm1ldGFkYXRhLmNyZWF0ZWRfYXRfdGltZSArIE1BWF9JTkdSRVNTX1RUTCksXG4gICAgICAgICAgICBtZW1vOiBwYXJzZWRUeC5tZXRhZGF0YS5tZW1vLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICB1dGlscy52YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKHRoaXMuX2ljcFRyYW5zYWN0aW9uRGF0YSk7XG4gICAgICAgICAgdGhpcy5faWQgPSB0aGlzLmdlbmVyYXRlVHJhbnNhY3Rpb25JZCgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbiB0eXBlJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCB0cmFuc2FjdGlvbjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIGFkZFNpZ25hdHVyZShzaWduYXR1cmVQYXlsb2FkczogU2lnbmF0dXJlc1tdKTogdm9pZCB7XG4gICAgaWYgKCFzaWduYXR1cmVQYXlsb2Fkcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaWduYXR1cmVzIG5vdCBwcm92aWRlZCcpO1xuICAgIH1cbiAgICBpZiAoc2lnbmF0dXJlUGF5bG9hZHMubGVuZ3RoICE9PSB0aGlzLl9wYXlsb2Fkc0RhdGEucGF5bG9hZHMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NpZ25hdHVyZXMgbGVuZ3RoIGlzIG5vdCBtYXRjaGluZycpO1xuICAgIH1cbiAgICB0aGlzLl9zaWduYXR1cmVQYXlsb2FkID0gc2lnbmF0dXJlUGF5bG9hZHM7XG4gICAgaWYgKHRoaXMuX2lkID09PSB1bmRlZmluZWQgfHwgdGhpcy5faWQgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX2lkID0gdGhpcy5nZW5lcmF0ZVRyYW5zYWN0aW9uSWQoKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdG9Kc29uKCk6IFR4RGF0YSB7XG4gICAgaWYgKCF0aGlzLl9pY3BUcmFuc2FjdGlvbkRhdGEpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gICAgc3dpdGNoICh0aGlzLl9pY3BUcmFuc2FjdGlvbkRhdGEudHJhbnNhY3Rpb25UeXBlKSB7XG4gICAgICBjYXNlIE9wZXJhdGlvblR5cGUuVFJBTlNBQ1RJT046XG4gICAgICAgIGNvbnN0IHR4RGF0YTogVHhEYXRhID0ge1xuICAgICAgICAgIGlkOiB0aGlzLl9pZCxcbiAgICAgICAgICBzZW5kZXI6IHRoaXMuX2ljcFRyYW5zYWN0aW9uRGF0YS5zZW5kZXJBZGRyZXNzLFxuICAgICAgICAgIHNlbmRlclB1YmxpY0tleTogdGhpcy5faWNwVHJhbnNhY3Rpb25EYXRhLnNlbmRlclB1YmxpY0tleUhleCxcbiAgICAgICAgICByZWNpcGllbnQ6IHRoaXMuX2ljcFRyYW5zYWN0aW9uRGF0YS5yZWNlaXZlckFkZHJlc3MsXG4gICAgICAgICAgbWVtbzogdGhpcy5faWNwVHJhbnNhY3Rpb25EYXRhLm1lbW8sXG4gICAgICAgICAgZmVlQW1vdW50OiB0aGlzLl9pY3BUcmFuc2FjdGlvbkRhdGEuZmVlLFxuICAgICAgICAgIGV4cGlyYXRpb25UaW1lOiB0aGlzLl9pY3BUcmFuc2FjdGlvbkRhdGEuZXhwaXJ5VGltZSxcbiAgICAgICAgICB0eXBlOiBCaXRHb1RyYW5zYWN0aW9uVHlwZS5TZW5kLFxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5faWNwVHJhbnNhY3Rpb25EYXRhLm1lbW8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHR4RGF0YS5tZW1vID0gdGhpcy5faWNwVHJhbnNhY3Rpb25EYXRhLm1lbW87XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHR4RGF0YTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgdHJhbnNhY3Rpb24gdHlwZTogJHt0aGlzLl9pY3BUcmFuc2FjdGlvbkRhdGEudHJhbnNhY3Rpb25UeXBlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBleHBsYWluVHJhbnNhY3Rpb24oKTogSWNwVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy50b0pzb24oKTtcbiAgICBjb25zdCBkaXNwbGF5T3JkZXIgPSBbJ2lkJywgJ291dHB1dEFtb3VudCcsICdjaGFuZ2VBbW91bnQnLCAnb3V0cHV0cycsICdjaGFuZ2VPdXRwdXRzJywgJ2ZlZSddO1xuICAgIGNvbnN0IG91dHB1dHM6IFRyYW5zYWN0aW9uUmVjaXBpZW50W10gPSBbXTtcblxuICAgIGNvbnN0IGV4cGxhbmF0aW9uUmVzdWx0ID0ge1xuICAgICAgZGlzcGxheU9yZGVyLFxuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBvdXRwdXRzLFxuICAgICAgb3V0cHV0QW1vdW50OiAnMCcsXG4gICAgICBmZWU6IHsgZmVlOiAnMCcgfSxcbiAgICAgIHR5cGU6IHJlc3VsdC50eXBlLFxuICAgICAgY2hhbmdlT3V0cHV0czogW10sIC8vIGFjY291bnQgYmFzZWQgZG9lcyBub3QgdXNlIGNoYW5nZSBvdXRwdXRzXG4gICAgICBjaGFuZ2VBbW91bnQ6ICcwJywgLy8gYWNjb3VudCBiYXNlZCBkb2VzIG5vdCBtYWtlIGNoYW5nZVxuICAgIH07XG5cbiAgICBzd2l0Y2ggKGV4cGxhbmF0aW9uUmVzdWx0LnR5cGUpIHtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlNlbmQ6XG4gICAgICAgIHJldHVybiB0aGlzLmV4cGxhaW5UcmFuc2ZlclRyYW5zYWN0aW9uKGV4cGxhbmF0aW9uUmVzdWx0KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignVHJhbnNhY3Rpb24gdHlwZSBub3Qgc3VwcG9ydGVkJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4cGxhaW5zIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gYnkgcHJvdmlkaW5nIGRldGFpbHMgYWJvdXQgdGhlIHJlY2lwaWVudHMgYW5kIHRoZSB0b3RhbCBvdXRwdXQgYW1vdW50LlxuICAgKlxuICAgKiBAcGFyYW0ge0ljcFRyYW5zYWN0aW9uRXhwbGFuYXRpb259IGV4cGxhbmF0aW9uUmVzdWx0IC0gVGhlIGluaXRpYWwgZXhwbGFuYXRpb24gcmVzdWx0IHRvIGJlIGV4dGVuZGVkLlxuICAgKiBAcmV0dXJucyB7SWNwVHJhbnNhY3Rpb25FeHBsYW5hdGlvbn0gVGhlIGV4dGVuZGVkIGV4cGxhbmF0aW9uIHJlc3VsdCBpbmNsdWRpbmcgdGhlIG91dHB1dCBhbW91bnQgYW5kIHJlY2lwaWVudHMuXG4gICAqL1xuICBleHBsYWluVHJhbnNmZXJUcmFuc2FjdGlvbihleHBsYW5hdGlvblJlc3VsdDogSWNwVHJhbnNhY3Rpb25FeHBsYW5hdGlvbik6IEljcFRyYW5zYWN0aW9uRXhwbGFuYXRpb24ge1xuICAgIGV4cGxhbmF0aW9uUmVzdWx0LmZlZSA9IHsgZmVlOiB0aGlzLmljcFRyYW5zYWN0aW9uRGF0YS5mZWUgfTtcbiAgICBjb25zdCByZWNpcGllbnRzID0gdXRpbHMuZ2V0UmVjaXBpZW50cyh0aGlzLmljcFRyYW5zYWN0aW9uRGF0YSk7XG4gICAgY29uc3Qgb3V0cHV0czogVHJhbnNhY3Rpb25SZWNpcGllbnRbXSA9IFtyZWNpcGllbnRzXTtcbiAgICBjb25zdCBvdXRwdXRBbW91bnRCTiA9IHJlY2lwaWVudHMuYW1vdW50O1xuICAgIGNvbnN0IG91dHB1dEFtb3VudCA9IG91dHB1dEFtb3VudEJOLnRvU3RyaW5nKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZXhwbGFuYXRpb25SZXN1bHQsXG4gICAgICBvdXRwdXRBbW91bnQsXG4gICAgICBvdXRwdXRzLFxuICAgIH07XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdG9Ccm9hZGNhc3RGb3JtYXQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuX3NpZ25lZFRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZSgpO1xuICB9XG5cbiAgc2VyaWFsaXplKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NpZ25lZFRyYW5zYWN0aW9uO1xuICB9XG5cbiAgYXN5bmMgcGFyc2VVbnNpZ25lZFRyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiBQcm9taXNlPFBhcnNlZFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgdW5zaWduZWRUcmFuc2FjdGlvbiA9IHV0aWxzLmNib3JEZWNvZGUodXRpbHMuYmxvYkZyb21IZXgocmF3VHJhbnNhY3Rpb24pKSBhcyBDYm9yVW5zaWduZWRUcmFuc2FjdGlvbjtcbiAgICBjb25zdCB1cGRhdGUgPSB1bnNpZ25lZFRyYW5zYWN0aW9uLnVwZGF0ZXNbMF07XG4gICAgY29uc3QgaHR0cENhbmlzdGVyVXBkYXRlID0gKHVwZGF0ZSBhcyB1bmtub3duIGFzIFtzdHJpbmcsIEh0dHBDYW5pc3RlclVwZGF0ZV0pWzFdO1xuICAgIGh0dHBDYW5pc3RlclVwZGF0ZS5pbmdyZXNzX2V4cGlyeSA9IEJpZ0ludCh1bnNpZ25lZFRyYW5zYWN0aW9uLmluZ3Jlc3NfZXhwaXJpZXNbMF0pO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldFBhcnNlZFRyYW5zYWN0aW9uRnJvbVVwZGF0ZShodHRwQ2FuaXN0ZXJVcGRhdGUsIGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0UGFyc2VkVHJhbnNhY3Rpb25Gcm9tVXBkYXRlKFxuICAgIGh0dHBDYW5pc3RlclVwZGF0ZTogSHR0cENhbmlzdGVyVXBkYXRlLFxuICAgIGlzU2lnbmVkOiBib29sZWFuXG4gICk6IFByb21pc2U8UGFyc2VkVHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCBzZW5kZXJQcmluY2lwYWwgPSB1dGlscy5jb252ZXJ0U2VuZGVyQmxvYlRvUHJpbmNpcGFsKGh0dHBDYW5pc3RlclVwZGF0ZS5zZW5kZXIpO1xuICAgIGNvbnN0IEFDQ09VTlRfSURfUFJFRklYID0gdXRpbHMuZ2V0QWNjb3VudElkUHJlZml4KCk7XG4gICAgY29uc3Qgc3ViQWNjb3VudCA9IG5ldyBVaW50OEFycmF5KDMyKTtcbiAgICBjb25zdCBzZW5kZXJBY2NvdW50ID0gdXRpbHMuZ2V0QWNjb3VudElkRnJvbVByaW5jaXBhbEJ5dGVzKFxuICAgICAgQUNDT1VOVF9JRF9QUkVGSVgsXG4gICAgICBCdWZmZXIuZnJvbShzZW5kZXJQcmluY2lwYWwuYnVmZmVyKSxcbiAgICAgIHN1YkFjY291bnRcbiAgICApO1xuICAgIGNvbnN0IGFyZ3MgPSBhd2FpdCB1dGlscy5mcm9tQXJncyhodHRwQ2FuaXN0ZXJVcGRhdGUuYXJnKTtcbiAgICBjb25zdCBzZW5kZXJPcGVyYXRpb246IEljcE9wZXJhdGlvbiA9IHtcbiAgICAgIHR5cGU6IE9wZXJhdGlvblR5cGUuVFJBTlNBQ1RJT04sXG4gICAgICBhY2NvdW50OiB7IGFkZHJlc3M6IHNlbmRlckFjY291bnQgfSxcbiAgICAgIGFtb3VudDoge1xuICAgICAgICB2YWx1ZTogYC0ke2FyZ3MucGF5bWVudC5yZWNlaXZlckdldHMuZThzLnRvU3RyaW5nKCl9YCxcbiAgICAgICAgY3VycmVuY3k6IHtcbiAgICAgICAgICBzeW1ib2w6IHRoaXMuX2NvaW5Db25maWcuZmFtaWx5LFxuICAgICAgICAgIGRlY2ltYWxzOiB0aGlzLl9jb2luQ29uZmlnLmRlY2ltYWxQbGFjZXMsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gICAgY29uc3QgcmVjZWl2ZXJPcGVyYXRpb246IEljcE9wZXJhdGlvbiA9IHtcbiAgICAgIHR5cGU6IE9wZXJhdGlvblR5cGUuVFJBTlNBQ1RJT04sXG4gICAgICBhY2NvdW50OiB7IGFkZHJlc3M6IGFyZ3MudG8uaGFzaC50b1N0cmluZygnaGV4JykgfSxcbiAgICAgIGFtb3VudDoge1xuICAgICAgICB2YWx1ZTogYXJncy5wYXltZW50LnJlY2VpdmVyR2V0cy5lOHMudG9TdHJpbmcoKSxcbiAgICAgICAgY3VycmVuY3k6IHtcbiAgICAgICAgICBzeW1ib2w6IHRoaXMuX2NvaW5Db25maWcuZmFtaWx5LFxuICAgICAgICAgIGRlY2ltYWxzOiB0aGlzLl9jb2luQ29uZmlnLmRlY2ltYWxQbGFjZXMsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCBmZWVPcGVyYXRpb246IEljcE9wZXJhdGlvbiA9IHtcbiAgICAgIHR5cGU6IE9wZXJhdGlvblR5cGUuRkVFLFxuICAgICAgYWNjb3VudDogeyBhZGRyZXNzOiBzZW5kZXJBY2NvdW50IH0sXG4gICAgICBhbW91bnQ6IHtcbiAgICAgICAgdmFsdWU6IGAtJHthcmdzLm1heEZlZS5lOHMudG9TdHJpbmcoKX1gLFxuICAgICAgICBjdXJyZW5jeToge1xuICAgICAgICAgIHN5bWJvbDogdGhpcy5fY29pbkNvbmZpZy5mYW1pbHksXG4gICAgICAgICAgZGVjaW1hbHM6IHRoaXMuX2NvaW5Db25maWcuZGVjaW1hbFBsYWNlcyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBjb25zdCBhY2NvdW50SWRlbnRpZmllclNpZ25lcnM6IEljcEFjY291bnRbXSA9IFtdO1xuICAgIGlmIChpc1NpZ25lZCkge1xuICAgICAgYWNjb3VudElkZW50aWZpZXJTaWduZXJzLnB1c2goeyBhZGRyZXNzOiBzZW5kZXJBY2NvdW50IH0pO1xuICAgIH1cbiAgICBjb25zdCBwYXJzZWRUeG46IFBhcnNlZFRyYW5zYWN0aW9uID0ge1xuICAgICAgb3BlcmF0aW9uczogW3NlbmRlck9wZXJhdGlvbiwgcmVjZWl2ZXJPcGVyYXRpb24sIGZlZU9wZXJhdGlvbl0sXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBjcmVhdGVkX2F0X3RpbWU6IGFyZ3MuY3JlYXRlZEF0VGltZS50aW1lc3RhbXBOYW5vcyxcbiAgICAgICAgbWVtbzogTnVtYmVyKGFyZ3MubWVtby5tZW1vKSxcbiAgICAgICAgaW5ncmVzc19lbmQ6IE51bWJlcihodHRwQ2FuaXN0ZXJVcGRhdGUuaW5ncmVzc19leHBpcnkpICsgUEVSTUlUVEVEX0RSSUZULFxuICAgICAgfSxcbiAgICAgIGFjY291bnRfaWRlbnRpZmllcl9zaWduZXJzOiBhY2NvdW50SWRlbnRpZmllclNpZ25lcnMsXG4gICAgfTtcbiAgICB0aGlzLmNyZWF0ZWRUaW1lc3RhbXAgPSBhcmdzLmNyZWF0ZWRBdFRpbWUudGltZXN0YW1wTmFub3M7XG4gICAgcmV0dXJuIHBhcnNlZFR4bjtcbiAgfVxuXG4gIGFzeW5jIHBhcnNlU2lnbmVkVHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb246IHN0cmluZyk6IFByb21pc2U8UGFyc2VkVHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCBzaWduZWRUcmFuc2FjdGlvbiA9IHV0aWxzLmNib3JEZWNvZGUodXRpbHMuYmxvYkZyb21IZXgocmF3VHJhbnNhY3Rpb24pKTtcbiAgICBjb25zdCBodHRwQ2FuaXN0ZXJVcGRhdGUgPSAoc2lnbmVkVHJhbnNhY3Rpb24gYXMgVXBkYXRlRW52ZWxvcGUpLmNvbnRlbnQgYXMgSHR0cENhbmlzdGVyVXBkYXRlO1xuICAgIGh0dHBDYW5pc3RlclVwZGF0ZS5pbmdyZXNzX2V4cGlyeSA9IEJpZ0ludCgoc2lnbmVkVHJhbnNhY3Rpb24gYXMgVXBkYXRlRW52ZWxvcGUpLmNvbnRlbnQuaW5ncmVzc19leHBpcnkpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldFBhcnNlZFRyYW5zYWN0aW9uRnJvbVVwZGF0ZShodHRwQ2FuaXN0ZXJVcGRhdGUsIHRydWUpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGNhblNpZ24oa2V5OiBCYXNlS2V5KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgdW5pcXVlIHRyYW5zYWN0aW9uIElEIGZvciB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi5cbiAgICogVGhlIHRyYW5zYWN0aW9uIElEIGlzIGRlcml2ZWQgdXNpbmcgdGhlIHVuc2lnbmVkIHRyYW5zYWN0aW9uIGRhdGEsXG4gICAqIHRoZSBzZW5kZXIncyBhZGRyZXNzLCBhbmQgdGhlIHJlY2VpdmVyJ3MgYWRkcmVzcy5cbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGdlbmVyYXRlZCB0cmFuc2FjdGlvbiBJRC5cbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVUcmFuc2FjdGlvbklkKCk6IHN0cmluZyB7XG4gICAgY29uc3QgaWQgPSB1dGlscy5nZXRUcmFuc2FjdGlvbklkKFxuICAgICAgdGhpcy51bnNpZ25lZFRyYW5zYWN0aW9uLFxuICAgICAgdGhpcy5pY3BUcmFuc2FjdGlvbkRhdGEuc2VuZGVyQWRkcmVzcyxcbiAgICAgIHRoaXMuaWNwVHJhbnNhY3Rpb25EYXRhLnJlY2VpdmVyQWRkcmVzc1xuICAgICk7XG4gICAgcmV0dXJuIGlkO1xuICB9XG59XG4iXX0=
@@ -1,78 +0,0 @@
1
- import { BaseAddress, BaseKey, BaseTransactionBuilder } from '@bitgo-beta/sdk-core';
2
- import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
3
- import BigNumber from 'bignumber.js';
4
- import { IcpTransaction, IcpTransactionData, PayloadsData, Signatures } from './iface';
5
- import { Transaction } from './transaction';
6
- export declare abstract class TransactionBuilder extends BaseTransactionBuilder {
7
- protected _transaction: Transaction;
8
- protected _sender: string;
9
- protected _publicKey: string;
10
- protected _memo: number | BigInt;
11
- protected _ingressEnd: number | BigInt;
12
- protected _receiverId: string;
13
- protected _amount: string;
14
- constructor(_coinConfig: Readonly<CoinConfig>);
15
- signaturePayload(): Signatures[];
16
- payloadData(): PayloadsData;
17
- icpTransaction(): IcpTransaction;
18
- /**
19
- * Sets the public key and the address of the sender of this transaction.
20
- *
21
- * @param {string} address the account that is sending this transaction
22
- * @param {string} pubKey the public key that is sending this transaction
23
- * @returns {TransactionBuilder} This transaction builder
24
- */
25
- sender(address: string, pubKey: string): this;
26
- /**
27
- * Set the memo
28
- *
29
- * @param {number} memo - number that to be used as memo
30
- * @returns {TransactionBuilder} This transaction builder
31
- */
32
- memo(memo: number): this;
33
- /**
34
- * Set the ingressEnd timestamp
35
- * @param {number} ingressEnd - timestamp in nanoseconds
36
- * @returns {TransactionBuilder} This transaction builder
37
- */
38
- ingressEnd(ingressEnd: number | BigInt): this;
39
- /**
40
- * Sets the account Id of the receiver of this transaction.
41
- *
42
- * @param {string} accountId the account id of the account that is receiving this transaction
43
- * @returns {TransactionBuilder} This transaction builder
44
- */
45
- receiverId(accountId: string): this;
46
- /** @inheritdoc */
47
- get transaction(): Transaction;
48
- /** @inheritdoc */
49
- set transaction(transaction: Transaction);
50
- get transactionType(): string;
51
- /** @inheritdoc */
52
- fromImplementation(rawTransaction: string): Transaction;
53
- /** @inheritdoc */
54
- validateTransaction(transaction: Transaction): void;
55
- /**
56
- * Sets the amount of this transaction.
57
- *
58
- * @param {string} value the amount to be sent in e8s (1 ICP = 1e8 e8s)
59
- * @returns {TransactionBuilder} This transaction builder
60
- */
61
- amount(value: string): this;
62
- validateValue(value: BigNumber): void;
63
- /**
64
- * Initialize the transaction builder fields using the decoded transaction data
65
- *
66
- * @param {Transaction} tx the transaction data
67
- */
68
- initBuilder(tx: Transaction): void;
69
- validateAddress(address: BaseAddress): void;
70
- validateRawTransaction(rawTransaction: IcpTransactionData): void;
71
- /** @inheritdoc */
72
- validateKey(key: BaseKey): void;
73
- /**
74
- * Combines the unsigned transaction and the signature payload to create a signed transaction.
75
- */
76
- combine(): void;
77
- }
78
- //# sourceMappingURL=transactionBuilder.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transactionBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,sBAAsB,EAAuC,MAAM,sBAAsB,CAAC;AACzH,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,SAAS,MAAM,cAAc,CAAC;AACrC,OAAO,EAAgB,cAAc,EAAE,kBAAkB,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErG,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,8BAAsB,kBAAmB,SAAQ,sBAAsB;IACrE,SAAS,CAAC,YAAY,EAAE,WAAW,CAAC;IACpC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC;IAC7B,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;IACvC,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC;IAC9B,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;gBAEd,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAKtC,gBAAgB,IAAI,UAAU,EAAE;IAIhC,WAAW,IAAI,YAAY;IAI3B,cAAc,IAAI,cAAc;IAIvC;;;;;;OAMG;IACI,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAYpD;;;;;OAKG;IACI,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ/B;;;;OAIG;IACI,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQpD;;;;;OAKG;IACI,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAQ1C,kBAAkB;IAClB,IAAI,WAAW,IAAI,WAAW,CAE7B;IAED,kBAAkB;IAClB,IAAI,WAAW,CAAC,WAAW,EAAE,WAAW,EAEvC;IAED,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED,kBAAkB;IAClB,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,WAAW;IAQvD,kBAAkB;IAClB,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAOnD;;;;;OAKG;IACI,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMlC,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAIrC;;;;OAIG;IACH,WAAW,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;IAWlC,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAM3C,sBAAsB,CAAC,cAAc,EAAE,kBAAkB,GAAG,IAAI;IAIhE,kBAAkB;IAClB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAS/B;;OAEG;IACI,OAAO,IAAI,IAAI;CAOvB"}
@@ -1,164 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.TransactionBuilder = void 0;
7
- const sdk_core_1 = require("@bitgo-beta/sdk-core");
8
- const bignumber_js_1 = __importDefault(require("bignumber.js"));
9
- const iface_1 = require("./iface");
10
- const signedTransactionBuilder_1 = require("./signedTransactionBuilder");
11
- const transaction_1 = require("./transaction");
12
- const utils_1 = __importDefault(require("./utils"));
13
- class TransactionBuilder extends sdk_core_1.BaseTransactionBuilder {
14
- constructor(_coinConfig) {
15
- super(_coinConfig);
16
- this._transaction = new transaction_1.Transaction(_coinConfig);
17
- }
18
- signaturePayload() {
19
- return this._transaction.signaturePayload;
20
- }
21
- payloadData() {
22
- return this._transaction.payloadsData;
23
- }
24
- icpTransaction() {
25
- return this._transaction.icpTransaction;
26
- }
27
- /**
28
- * Sets the public key and the address of the sender of this transaction.
29
- *
30
- * @param {string} address the account that is sending this transaction
31
- * @param {string} pubKey the public key that is sending this transaction
32
- * @returns {TransactionBuilder} This transaction builder
33
- */
34
- sender(address, pubKey) {
35
- if (!address || !utils_1.default.isValidAddress(address.toString())) {
36
- throw new sdk_core_1.BuildTransactionError('Invalid or missing address, got: ' + address);
37
- }
38
- if (!pubKey || !utils_1.default.isValidPublicKey(pubKey)) {
39
- throw new sdk_core_1.BuildTransactionError('Invalid or missing pubKey, got: ' + pubKey);
40
- }
41
- this._sender = address;
42
- this._publicKey = pubKey;
43
- return this;
44
- }
45
- /**
46
- * Set the memo
47
- *
48
- * @param {number} memo - number that to be used as memo
49
- * @returns {TransactionBuilder} This transaction builder
50
- */
51
- memo(memo) {
52
- if (typeof memo !== 'number' || Number.isNaN(memo) || memo < 0) {
53
- throw new sdk_core_1.BuildTransactionError(`Invalid memo: ${memo}`);
54
- }
55
- this._memo = memo;
56
- return this;
57
- }
58
- /**
59
- * Set the ingressEnd timestamp
60
- * @param {number} ingressEnd - timestamp in nanoseconds
61
- * @returns {TransactionBuilder} This transaction builder
62
- */
63
- ingressEnd(ingressEnd) {
64
- if (BigInt(ingressEnd.toString()) < 0n) {
65
- throw new sdk_core_1.BuildTransactionError(`Invalid timestamp: ${ingressEnd}`);
66
- }
67
- this._ingressEnd = ingressEnd;
68
- return this;
69
- }
70
- /**
71
- * Sets the account Id of the receiver of this transaction.
72
- *
73
- * @param {string} accountId the account id of the account that is receiving this transaction
74
- * @returns {TransactionBuilder} This transaction builder
75
- */
76
- receiverId(accountId) {
77
- if (!accountId || !utils_1.default.isValidAddress(accountId)) {
78
- throw new sdk_core_1.BuildTransactionError('Invalid or missing accountId for receiver, got: ' + accountId);
79
- }
80
- this._receiverId = accountId;
81
- return this;
82
- }
83
- /** @inheritdoc */
84
- get transaction() {
85
- return this._transaction;
86
- }
87
- /** @inheritdoc */
88
- set transaction(transaction) {
89
- this._transaction = transaction;
90
- }
91
- get transactionType() {
92
- return this._transaction.icpTransactionData.transactionType;
93
- }
94
- /** @inheritdoc */
95
- fromImplementation(rawTransaction) {
96
- this.transaction.fromRawTransaction(rawTransaction);
97
- const icpTransactionData = this.transaction.icpTransactionData;
98
- this.validateRawTransaction(icpTransactionData);
99
- this.buildImplementation();
100
- return this.transaction;
101
- }
102
- /** @inheritdoc */
103
- validateTransaction(transaction) {
104
- if (!transaction || !transaction.icpTransactionData) {
105
- return;
106
- }
107
- utils_1.default.validateRawTransaction(transaction.icpTransactionData);
108
- }
109
- /**
110
- * Sets the amount of this transaction.
111
- *
112
- * @param {string} value the amount to be sent in e8s (1 ICP = 1e8 e8s)
113
- * @returns {TransactionBuilder} This transaction builder
114
- */
115
- amount(value) {
116
- utils_1.default.validateValue(new bignumber_js_1.default(value));
117
- this._amount = value;
118
- return this;
119
- }
120
- validateValue(value) {
121
- utils_1.default.validateValue(new bignumber_js_1.default(value));
122
- }
123
- /**
124
- * Initialize the transaction builder fields using the decoded transaction data
125
- *
126
- * @param {Transaction} tx the transaction data
127
- */
128
- initBuilder(tx) {
129
- this._transaction = tx;
130
- const icpTransactionData = tx.icpTransactionData;
131
- this._sender = icpTransactionData.senderAddress;
132
- this._receiverId = icpTransactionData.receiverAddress;
133
- this._publicKey = icpTransactionData.senderPublicKeyHex;
134
- this._amount = icpTransactionData.amount;
135
- this._memo = icpTransactionData.memo ?? iface_1.DEFAULT_MEMO;
136
- this._ingressEnd = Number(icpTransactionData.expiryTime);
137
- }
138
- validateAddress(address) {
139
- if (!utils_1.default.isValidAddress(address.address)) {
140
- throw new sdk_core_1.BuildTransactionError('Invalid address');
141
- }
142
- }
143
- validateRawTransaction(rawTransaction) {
144
- utils_1.default.validateRawTransaction(rawTransaction);
145
- }
146
- /** @inheritdoc */
147
- validateKey(key) {
148
- if (!key || !key.key) {
149
- throw new sdk_core_1.SigningError('Key is required');
150
- }
151
- if (!utils_1.default.isValidPrivateKey(key.key)) {
152
- throw new sdk_core_1.SigningError('Invalid private key');
153
- }
154
- }
155
- /**
156
- * Combines the unsigned transaction and the signature payload to create a signed transaction.
157
- */
158
- combine() {
159
- const signedTransactionBuilder = new signedTransactionBuilder_1.SignedTransactionBuilder(this._transaction.unsignedTransaction, this._transaction.signaturePayload);
160
- this._transaction.signedTransaction = signedTransactionBuilder.getSignTransaction();
161
- }
162
- }
163
- exports.TransactionBuilder = TransactionBuilder;
164
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsbURBQXlIO0FBRXpILGdFQUFxQztBQUNyQyxtQ0FBcUc7QUFDckcseUVBQXNFO0FBQ3RFLCtDQUE0QztBQUM1QyxvREFBNEI7QUFFNUIsTUFBc0Isa0JBQW1CLFNBQVEsaUNBQXNCO0lBU3JFLFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25CLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSx5QkFBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFTSxnQkFBZ0I7UUFDckIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDO0lBQzVDLENBQUM7SUFFTSxXQUFXO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUM7SUFDeEMsQ0FBQztJQUVNLGNBQWM7UUFDbkIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksTUFBTSxDQUFDLE9BQWUsRUFBRSxNQUFjO1FBQzNDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxlQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDMUQsTUFBTSxJQUFJLGdDQUFxQixDQUFDLG1DQUFtQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBQ2pGLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsZUFBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDL0MsTUFBTSxJQUFJLGdDQUFxQixDQUFDLGtDQUFrQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBQy9FLENBQUM7UUFDRCxJQUFJ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SCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxPQUFPO1FBQ1osTUFBTSx3QkFBd0IsR0FBRyxJQUFJLG1EQUF3QixDQUMzRCxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixFQUNyQyxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUNuQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsR0FBRyx3QkFBd0IsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQ3RGLENBQUM7Q0FDRjtBQW5MRCxnREFtTEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQWRkcmVzcywgQmFzZUtleSwgQmFzZVRyYW5zYWN0aW9uQnVpbGRlciwgQnVpbGRUcmFuc2FjdGlvbkVycm9yLCBTaWduaW5nRXJyb3IgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgeyBERUZBVUxUX01FTU8sIEljcFRyYW5zYWN0aW9uLCBJY3BUcmFuc2FjdGlvbkRhdGEsIFBheWxvYWRzRGF0YSwgU2lnbmF0dXJlcyB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgU2lnbmVkVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi9zaWduZWRUcmFuc2FjdGlvbkJ1aWxkZXInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFRyYW5zYWN0aW9uQnVpbGRlciBleHRlbmRzIEJhc2VUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICBwcm90ZWN0ZWQgX3RyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbjtcbiAgcHJvdGVjdGVkIF9zZW5kZXI6IHN0cmluZztcbiAgcHJvdGVjdGVkIF9wdWJsaWNLZXk6IHN0cmluZztcbiAgcHJvdGVjdGVkIF9tZW1vOiBudW1iZXIgfCBCaWdJbnQ7XG4gIHByb3RlY3RlZCBfaW5ncmVzc0VuZDogbnVtYmVyIHwgQmlnSW50O1xuICBwcm90ZWN0ZWQgX3JlY2VpdmVySWQ6IHN0cmluZztcbiAgcHJvdGVjdGVkIF9hbW91bnQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihfY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihfY29pbkNvbmZpZyk7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oX2NvaW5Db25maWcpO1xuICB9XG5cbiAgcHVibGljIHNpZ25hdHVyZVBheWxvYWQoKTogU2lnbmF0dXJlc1tdIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb24uc2lnbmF0dXJlUGF5bG9hZDtcbiAgfVxuXG4gIHB1YmxpYyBwYXlsb2FkRGF0YSgpOiBQYXlsb2Fkc0RhdGEge1xuICAgIHJldHVybiB0aGlzLl90cmFuc2FjdGlvbi5wYXlsb2Fkc0RhdGE7XG4gIH1cblxuICBwdWJsaWMgaWNwVHJhbnNhY3Rpb24oKTogSWNwVHJhbnNhY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl90cmFuc2FjdGlvbi5pY3BUcmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBwdWJsaWMga2V5IGFuZCB0aGUgYWRkcmVzcyBvZiB0aGUgc2VuZGVyIG9mIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzIHRoZSBhY2NvdW50IHRoYXQgaXMgc2VuZGluZyB0aGlzIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwdWJLZXkgdGhlIHB1YmxpYyBrZXkgdGhhdCBpcyBzZW5kaW5nIHRoaXMgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybnMge1RyYW5zYWN0aW9uQnVpbGRlcn0gVGhpcyB0cmFuc2FjdGlvbiBidWlsZGVyXG4gICAqL1xuICBwdWJsaWMgc2VuZGVyKGFkZHJlc3M6IHN0cmluZywgcHViS2V5OiBzdHJpbmcpOiB0aGlzIHtcbiAgICBpZiAoIWFkZHJlc3MgfHwgIXV0aWxzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MudG9TdHJpbmcoKSkpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgb3IgbWlzc2luZyBhZGRyZXNzLCBnb3Q6ICcgKyBhZGRyZXNzKTtcbiAgICB9XG4gICAgaWYgKCFwdWJLZXkgfHwgIXV0aWxzLmlzVmFsaWRQdWJsaWNLZXkocHViS2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBvciBtaXNzaW5nIHB1YktleSwgZ290OiAnICsgcHViS2V5KTtcbiAgICB9XG4gICAgdGhpcy5fc2VuZGVyID0gYWRkcmVzcztcbiAgICB0aGlzLl9wdWJsaWNLZXkgPSBwdWJLZXk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBtZW1vXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtZW1vIC0gbnVtYmVyIHRoYXQgdG8gYmUgdXNlZCBhcyBtZW1vXG4gICAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbkJ1aWxkZXJ9IFRoaXMgdHJhbnNhY3Rpb24gYnVpbGRlclxuICAgKi9cbiAgcHVibGljIG1lbW8obWVtbzogbnVtYmVyKTogdGhpcyB7XG4gICAgaWYgKHR5cGVvZiBtZW1vICE9PSAnbnVtYmVyJyB8fCBOdW1iZXIuaXNOYU4obWVtbykgfHwgbWVtbyA8IDApIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgbWVtbzogJHttZW1vfWApO1xuICAgIH1cbiAgICB0aGlzLl9tZW1vID0gbWVtbztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGluZ3Jlc3NFbmQgdGltZXN0YW1wXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmdyZXNzRW5kIC0gdGltZXN0YW1wIGluIG5hbm9zZWNvbmRzXG4gICAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbkJ1aWxkZXJ9IFRoaXMgdHJhbnNhY3Rpb24gYnVpbGRlclxuICAgKi9cbiAgcHVibGljIGluZ3Jlc3NFbmQoaW5ncmVzc0VuZDogbnVtYmVyIHwgQmlnSW50KTogdGhpcyB7XG4gICAgaWYgKEJpZ0ludChpbmdyZXNzRW5kLnRvU3RyaW5nKCkpIDwgMG4pIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgdGltZXN0YW1wOiAke2luZ3Jlc3NFbmR9YCk7XG4gICAgfVxuICAgIHRoaXMuX2luZ3Jlc3NFbmQgPSBpbmdyZXNzRW5kO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGFjY291bnQgSWQgb2YgdGhlIHJlY2VpdmVyIG9mIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhY2NvdW50SWQgdGhlIGFjY291bnQgaWQgb2YgdGhlIGFjY291bnQgdGhhdCBpcyByZWNlaXZpbmcgdGhpcyB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25CdWlsZGVyfSBUaGlzIHRyYW5zYWN0aW9uIGJ1aWxkZXJcbiAgICovXG4gIHB1YmxpYyByZWNlaXZlcklkKGFjY291bnRJZDogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKCFhY2NvdW50SWQgfHwgIXV0aWxzLmlzVmFsaWRBZGRyZXNzKGFjY291bnRJZCkpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgb3IgbWlzc2luZyBhY2NvdW50SWQgZm9yIHJlY2VpdmVyLCBnb3Q6ICcgKyBhY2NvdW50SWQpO1xuICAgIH1cbiAgICB0aGlzLl9yZWNlaXZlcklkID0gYWNjb3VudElkO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGdldCB0cmFuc2FjdGlvbigpOiBUcmFuc2FjdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHNldCB0cmFuc2FjdGlvbih0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24pIHtcbiAgICB0aGlzLl90cmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uO1xuICB9XG5cbiAgZ2V0IHRyYW5zYWN0aW9uVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90cmFuc2FjdGlvbi5pY3BUcmFuc2FjdGlvbkRhdGEudHJhbnNhY3Rpb25UeXBlO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGZyb21JbXBsZW1lbnRhdGlvbihyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogVHJhbnNhY3Rpb24ge1xuICAgIHRoaXMudHJhbnNhY3Rpb24uZnJvbVJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uKTtcbiAgICBjb25zdCBpY3BUcmFuc2FjdGlvbkRhdGEgPSB0aGlzLnRyYW5zYWN0aW9uLmljcFRyYW5zYWN0aW9uRGF0YTtcbiAgICB0aGlzLnZhbGlkYXRlUmF3VHJhbnNhY3Rpb24oaWNwVHJhbnNhY3Rpb25EYXRhKTtcbiAgICB0aGlzLmJ1aWxkSW1wbGVtZW50YXRpb24oKTtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWxpZGF0ZVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIGlmICghdHJhbnNhY3Rpb24gfHwgIXRyYW5zYWN0aW9uLmljcFRyYW5zYWN0aW9uRGF0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB1dGlscy52YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKHRyYW5zYWN0aW9uLmljcFRyYW5zYWN0aW9uRGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgYW1vdW50IG9mIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSB0aGUgYW1vdW50IHRvIGJlIHNlbnQgaW4gZThzICgxIElDUCA9IDFlOCBlOHMpXG4gICAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbkJ1aWxkZXJ9IFRoaXMgdHJhbnNhY3Rpb24gYnVpbGRlclxuICAgKi9cbiAgcHVibGljIGFtb3VudCh2YWx1ZTogc3RyaW5nKTogdGhpcyB7XG4gICAgdXRpbHMudmFsaWRhdGVWYWx1ZShuZXcgQmlnTnVtYmVyKHZhbHVlKSk7XG4gICAgdGhpcy5fYW1vdW50ID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB2YWxpZGF0ZVZhbHVlKHZhbHVlOiBCaWdOdW1iZXIpOiB2b2lkIHtcbiAgICB1dGlscy52YWxpZGF0ZVZhbHVlKG5ldyBCaWdOdW1iZXIodmFsdWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSB0cmFuc2FjdGlvbiBidWlsZGVyIGZpZWxkcyB1c2luZyB0aGUgZGVjb2RlZCB0cmFuc2FjdGlvbiBkYXRhXG4gICAqXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb259IHR4IHRoZSB0cmFuc2FjdGlvbiBkYXRhXG4gICAqL1xuICBpbml0QnVpbGRlcih0eDogVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICB0aGlzLl90cmFuc2FjdGlvbiA9IHR4O1xuICAgIGNvbnN0IGljcFRyYW5zYWN0aW9uRGF0YSA9IHR4LmljcFRyYW5zYWN0aW9uRGF0YTtcbiAgICB0aGlzLl9zZW5kZXIgPSBpY3BUcmFuc2FjdGlvbkRhdGEuc2VuZGVyQWRkcmVzcztcbiAgICB0aGlzLl9yZWNlaXZlcklkID0gaWNwVHJhbnNhY3Rpb25EYXRhLnJlY2VpdmVyQWRkcmVzcztcbiAgICB0aGlzLl9wdWJsaWNLZXkgPSBpY3BUcmFuc2FjdGlvbkRhdGEuc2VuZGVyUHVibGljS2V5SGV4O1xuICAgIHRoaXMuX2Ftb3VudCA9IGljcFRyYW5zYWN0aW9uRGF0YS5hbW91bnQ7XG4gICAgdGhpcy5fbWVtbyA9IGljcFRyYW5zYWN0aW9uRGF0YS5tZW1vID8/IERFRkFVTFRfTUVNTztcbiAgICB0aGlzLl9pbmdyZXNzRW5kID0gTnVtYmVyKGljcFRyYW5zYWN0aW9uRGF0YS5leHBpcnlUaW1lKTtcbiAgfVxuXG4gIHZhbGlkYXRlQWRkcmVzcyhhZGRyZXNzOiBCYXNlQWRkcmVzcyk6IHZvaWQge1xuICAgIGlmICghdXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcy5hZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBhZGRyZXNzJyk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGVSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbjogSWNwVHJhbnNhY3Rpb25EYXRhKTogdm9pZCB7XG4gICAgdXRpbHMudmFsaWRhdGVSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbik7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVLZXkoa2V5OiBCYXNlS2V5KTogdm9pZCB7XG4gICAgaWYgKCFrZXkgfHwgIWtleS5rZXkpIHtcbiAgICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ0tleSBpcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBpZiAoIXV0aWxzLmlzVmFsaWRQcml2YXRlS2V5KGtleS5rZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKCdJbnZhbGlkIHByaXZhdGUga2V5Jyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbWJpbmVzIHRoZSB1bnNpZ25lZCB0cmFuc2FjdGlvbiBhbmQgdGhlIHNpZ25hdHVyZSBwYXlsb2FkIHRvIGNyZWF0ZSBhIHNpZ25lZCB0cmFuc2FjdGlvbi5cbiAgICovXG4gIHB1YmxpYyBjb21iaW5lKCk6IHZvaWQge1xuICAgIGNvbnN0IHNpZ25lZFRyYW5zYWN0aW9uQnVpbGRlciA9IG5ldyBTaWduZWRUcmFuc2FjdGlvbkJ1aWxkZXIoXG4gICAgICB0aGlzLl90cmFuc2FjdGlvbi51bnNpZ25lZFRyYW5zYWN0aW9uLFxuICAgICAgdGhpcy5fdHJhbnNhY3Rpb24uc2lnbmF0dXJlUGF5bG9hZFxuICAgICk7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24uc2lnbmVkVHJhbnNhY3Rpb24gPSBzaWduZWRUcmFuc2FjdGlvbkJ1aWxkZXIuZ2V0U2lnblRyYW5zYWN0aW9uKCk7XG4gIH1cbn1cbiJdfQ==