@rosen-bridge/tx-pot 0.1.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import { TransactionEntity } from '../db/entities/TransactionEntity';
2
- import { DummyLogger } from '@rosen-bridge/logger-interface';
2
+ import { DummyLogger } from '@rosen-bridge/abstract-logger';
3
3
  import { SigningStatus, TransactionStatus, UnregisteredChain, } from './types';
4
4
  import { txOptionToClause } from './utils';
5
5
  export class TxPot {
@@ -8,6 +8,7 @@ export class TxPot {
8
8
  chains = new Map();
9
9
  validators = new Map();
10
10
  txTypeCallbacks = new Map();
11
+ submissionAllowance = new Map();
11
12
  logger;
12
13
  constructor(dataSource, logger) {
13
14
  this.txRepository = dataSource.getRepository(TransactionEntity);
@@ -46,16 +47,78 @@ export class TxPot {
46
47
  * registers a validator function
47
48
  * @param chain
48
49
  * @param txType
50
+ * @param id
49
51
  * @param validator
50
52
  */
51
- registerValidator = (chain, txType, validator) => {
53
+ registerValidator = (chain, txType, id, validator) => {
52
54
  let chainValidators = this.validators.get(chain);
53
55
  if (!chainValidators) {
54
56
  chainValidators = new Map();
55
57
  this.validators.set(chain, chainValidators);
56
58
  }
57
- chainValidators.set(txType, validator);
58
- this.logger.debug(`A tx validator function is registered for chain [${chain}] and type [${txType}]`);
59
+ let typeValidators = chainValidators.get(txType);
60
+ if (!typeValidators) {
61
+ typeValidators = new Map();
62
+ chainValidators.set(txType, typeValidators);
63
+ }
64
+ const currentValidator = typeValidators.get(id);
65
+ typeValidators.set(id, validator);
66
+ if (currentValidator) {
67
+ this.logger.debug(`The tx validator function for chain [${chain}], type [${txType}] and id [${id}] is replaced`);
68
+ }
69
+ else {
70
+ this.logger.info(`New tx validator function is registered for chain [${chain}] and type [${txType}] by id [${id}]`);
71
+ }
72
+ };
73
+ /**
74
+ * removes a validator function
75
+ * @param chain
76
+ * @param txType
77
+ * @param id
78
+ */
79
+ unregisterValidator = (chain, txType, id) => {
80
+ const validators = this.validators.get(chain)?.get(txType);
81
+ if (!validators) {
82
+ this.logger.debug(`No tx validator function is set for chain [${chain}], type [${txType}] and id [${id}]`);
83
+ return;
84
+ }
85
+ validators.delete(id);
86
+ this.logger.info(`Removed tx validator function for chain [${chain}], type [${txType}] and id [${id}]`);
87
+ };
88
+ /**
89
+ * registers a submit validator function
90
+ * @param chain
91
+ * @param id
92
+ * @param validator
93
+ */
94
+ registerSubmitValidator = (chain, id, validator) => {
95
+ let chainAllowance = this.submissionAllowance.get(chain);
96
+ if (!chainAllowance) {
97
+ chainAllowance = new Map();
98
+ this.submissionAllowance.set(chain, chainAllowance);
99
+ }
100
+ const currentValidator = chainAllowance.get(id);
101
+ chainAllowance.set(id, validator);
102
+ if (currentValidator) {
103
+ this.logger.debug(`The tx submit validator function for chain [${chain}] and id [${id}] is replaced`);
104
+ }
105
+ else {
106
+ this.logger.info(`New tx submit validator function is registered for chain [${chain}] by id [${id}]`);
107
+ }
108
+ };
109
+ /**
110
+ * removes a submit validator function
111
+ * @param chain
112
+ * @param id
113
+ */
114
+ unregisterSubmitValidator = (chain, id) => {
115
+ const chainAllowance = this.submissionAllowance.get(chain);
116
+ if (!chainAllowance) {
117
+ this.logger.debug(`No tx submit validator function is set for chain [${chain}] and id [${id}]`);
118
+ return;
119
+ }
120
+ chainAllowance.delete(id);
121
+ this.logger.info(`Removed tx submit validator function for chain [${chain}] and id [${id}]`);
59
122
  };
60
123
  /**
61
124
  * registers a callback function
@@ -63,16 +126,43 @@ export class TxPot {
63
126
  * of given type changes to given status
64
127
  * @param txType
65
128
  * @param status
129
+ * @param id
66
130
  * @param callback
67
131
  */
68
- registerCallback = (txType, status, callback) => {
132
+ registerCallback = (txType, status, id, callback) => {
69
133
  let typeCallbacks = this.txTypeCallbacks.get(txType);
70
134
  if (!typeCallbacks) {
71
135
  typeCallbacks = new Map();
72
136
  this.txTypeCallbacks.set(txType, typeCallbacks);
73
137
  }
74
- typeCallbacks.set(status, callback);
75
- this.logger.debug(`A tx status callback function is registered for type [${txType}] and status [${status}]`);
138
+ let statusCallbacks = typeCallbacks.get(status);
139
+ if (!statusCallbacks) {
140
+ statusCallbacks = new Map();
141
+ typeCallbacks.set(status, statusCallbacks);
142
+ }
143
+ const currentCallback = statusCallbacks.get(id);
144
+ statusCallbacks.set(id, callback);
145
+ if (currentCallback) {
146
+ this.logger.debug(`The tx status callback function for type [${txType}] and status [${status}] and id [${id}] is replaced`);
147
+ }
148
+ else {
149
+ this.logger.info(`New tx status callback function is registered for type [${txType}] and status [${status}] by id [${id}]`);
150
+ }
151
+ };
152
+ /**
153
+ * removes a callback function
154
+ * @param txType
155
+ * @param status
156
+ * @param id
157
+ */
158
+ unregisterCallback = (txType, status, id) => {
159
+ const callbacks = this.txTypeCallbacks.get(txType)?.get(status);
160
+ if (!callbacks) {
161
+ this.logger.debug(`No tx status callback function is set for type [${txType}] and status [${status}] and id [${id}]`);
162
+ return;
163
+ }
164
+ callbacks.delete(id);
165
+ this.logger.info(`Removed tx status callback function for type [${txType}] and status [${status}] and id [${id}]`);
76
166
  };
77
167
  /**
78
168
  * returns chain manager for given chain
@@ -108,16 +198,41 @@ export class TxPot {
108
198
  * @param tx
109
199
  */
110
200
  validateTx = async (tx) => {
111
- const validator = this.validators.get(tx.chain)?.get(tx.txType);
112
- if (validator === undefined) {
201
+ const validators = this.validators.get(tx.chain)?.get(tx.txType);
202
+ if (validators === undefined) {
113
203
  // tx is valid since no validator is found
114
204
  this.logger.debug(`No validator function is found for chain [${tx.chain}] and type [${tx.txType}]`);
115
205
  return true;
116
206
  }
117
- if (await validator(tx))
207
+ for (const idValidatorPair of validators) {
208
+ if ((await idValidatorPair[1](tx)) === false) {
209
+ this.logger.debug(`tx [${tx.txId}] is recognized as invalid by validator [${idValidatorPair[0]}]`);
210
+ await this.setTransactionAsInvalid(tx);
211
+ return false;
212
+ }
213
+ }
214
+ return true;
215
+ };
216
+ /**
217
+ * checks a transaction for submission
218
+ * returns true if no validator functions is set or all validators allow tx to submit
219
+ * otherwise returns false
220
+ * @param tx
221
+ */
222
+ isSubmitAllowed = async (tx) => {
223
+ const validators = this.submissionAllowance.get(tx.chain);
224
+ if (validators === undefined) {
225
+ // tx is allowed for submission since no validator is found
226
+ this.logger.debug(`No submit validator function is found for chain [${tx.chain}]`);
118
227
  return true;
119
- await this.setTransactionAsInvalid(tx);
120
- return false;
228
+ }
229
+ for (const idValidatorPair of validators) {
230
+ if ((await idValidatorPair[1](tx)) === false) {
231
+ this.logger.debug(`tx [${tx.txId}] is not allowed for submission by submit validator [${idValidatorPair[0]}]`);
232
+ return false;
233
+ }
234
+ }
235
+ return true;
121
236
  };
122
237
  /**
123
238
  * updates the status of a tx
@@ -132,13 +247,16 @@ export class TxPot {
132
247
  status: status,
133
248
  lastStatusUpdate: this.currentTime(),
134
249
  });
135
- const callback = this.txTypeCallbacks.get(tx.txType)?.get(status);
136
- if (callback)
137
- callback(tx, status).catch((e) => {
138
- this.logger.debug(`An error occurred while handling tx [${tx.txId}] status change: ${e}`);
139
- if (e instanceof Error && e.stack)
140
- this.logger.debug(e.stack);
141
- });
250
+ const callbacks = this.txTypeCallbacks.get(tx.txType)?.get(status);
251
+ if (callbacks) {
252
+ for (const idCallbackPair of callbacks) {
253
+ idCallbackPair[1](tx, status).catch((e) => {
254
+ this.logger.debug(`An error occurred while handling tx [${tx.txId}] status change in callback [${idCallbackPair[0]}]: ${e}`);
255
+ if (e instanceof Error && e.stack)
256
+ this.logger.debug(e.stack);
257
+ });
258
+ }
259
+ }
142
260
  else
143
261
  this.logger.debug(`No callback function is set for type [${tx.txType}] and status [${status}]`);
144
262
  };
@@ -151,6 +269,8 @@ export class TxPot {
151
269
  * @param tx
152
270
  */
153
271
  processSignedTx = async (tx) => {
272
+ if (!(await this.isSubmitAllowed(tx)))
273
+ return;
154
274
  const manager = this.getChainManager(tx.chain);
155
275
  try {
156
276
  await manager.submitTransaction(tx.serializedTx);
@@ -188,8 +308,17 @@ export class TxPot {
188
308
  const isValidToType = await this.validateTx(tx);
189
309
  if (isValidTx && isValidToType) {
190
310
  // tx is valid. resending...
191
- this.logger.info(`Tx [${tx.txId}] is still valid. Resending tx...`);
192
- await manager.submitTransaction(tx.serializedTx);
311
+ this.logger.info(`Tx [${tx.txId}] is still valid. Attempting resend...`);
312
+ if (await this.isSubmitAllowed(tx)) {
313
+ try {
314
+ await manager.submitTransaction(tx.serializedTx);
315
+ }
316
+ catch (e) {
317
+ this.logger.warn(`Failed to submit tx [${tx.txId}] to chain [${tx.chain}]: ${e}`);
318
+ if (e instanceof Error && e.stack)
319
+ this.logger.warn(e.stack);
320
+ }
321
+ }
193
322
  }
194
323
  else {
195
324
  // tx seems invalid. reset status if enough blocks past.
@@ -210,8 +339,10 @@ export class TxPot {
210
339
  * - process sent txs
211
340
  */
212
341
  update = async () => {
213
- // process signed txs
342
+ // fetch signed and sent txs
214
343
  const signedTxs = await this.getTxsByStatus(TransactionStatus.SIGNED);
344
+ const sentTxs = await this.getTxsByStatus(TransactionStatus.SENT);
345
+ // process signed txs
215
346
  for (const tx of signedTxs) {
216
347
  try {
217
348
  await this.processSignedTx(tx);
@@ -224,7 +355,6 @@ export class TxPot {
224
355
  }
225
356
  this.logger.debug(`Processed [${signedTxs.length}] txs with status [${TransactionStatus.SIGNED}]`);
226
357
  // process sent txs
227
- const sentTxs = await this.getTxsByStatus(TransactionStatus.SENT);
228
358
  for (const tx of sentTxs) {
229
359
  try {
230
360
  await this.processesSentTx(tx);
@@ -261,15 +391,18 @@ export class TxPot {
261
391
  };
262
392
  /**
263
393
  * inserts a new transaction into db
394
+ * Note: make sure to set `lastCheck` field if initialStatus is `signed` or `sent`
264
395
  * @param txId
265
396
  * @param chain
266
397
  * @param txType
267
398
  * @param requiredSign
268
399
  * @param serializedTx
269
400
  * @param initialStatus
270
- * @param lastCheck
401
+ * @param lastCheck last blockchain height that tx was valid
402
+ * @param extra
403
+ * @param extra2
271
404
  */
272
- addTx = async (txId, chain, txType, requiredSign, serializedTx, initialStatus = TransactionStatus.APPROVED, lastCheck = 0) => {
405
+ addTx = async (txId, chain, txType, requiredSign, serializedTx, initialStatus = TransactionStatus.APPROVED, lastCheck = 0, extra, extra2) => {
273
406
  await this.txRepository.insert({
274
407
  txId: txId,
275
408
  chain: chain,
@@ -281,6 +414,8 @@ export class TxPot {
281
414
  failedInSign: false,
282
415
  signFailedCount: 0,
283
416
  serializedTx: serializedTx,
417
+ extra: extra,
418
+ extra2: extra2,
284
419
  });
285
420
  };
286
421
  /**
@@ -382,5 +517,17 @@ export class TxPot {
382
517
  where: options.map(txOptionToClause),
383
518
  });
384
519
  };
520
+ /**
521
+ * updates extra fields of a transaction
522
+ * @param txId
523
+ * @param chain
524
+ * @param extra
525
+ * @param extra2
526
+ */
527
+ updateExtra = async (txId, chain, extra, extra2) => {
528
+ if (extra === undefined && extra2 === undefined)
529
+ return;
530
+ await this.txRepository.update({ txId, chain }, { extra, extra2 });
531
+ };
385
532
  }
386
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHhQb3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvdHJhbnNhY3Rpb24vVHhQb3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDckUsT0FBTyxFQUFrQixXQUFXLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM3RSxPQUFPLEVBRUwsYUFBYSxFQUNiLGlCQUFpQixFQUVqQixpQkFBaUIsR0FFbEIsTUFBTSxTQUFTLENBQUM7QUFDakIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRzNDLE1BQU0sT0FBTyxLQUFLO0lBQ04sTUFBTSxDQUFDLFFBQVEsQ0FBUTtJQUNkLFlBQVksQ0FBZ0M7SUFDckQsTUFBTSxHQUFHLElBQUksR0FBRyxFQUFtQyxDQUFDO0lBQ3BELFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBMEMsQ0FBQztJQUMvRCxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBR2hDLENBQUM7SUFDTSxNQUFNLENBQWlCO0lBRWpDLFlBQXNCLFVBQXNCLEVBQUUsTUFBdUI7UUFDbkUsSUFBSSxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLElBQUksSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUMxQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FDcEIsVUFBc0IsRUFDdEIsTUFBdUIsRUFDaEIsRUFBRTtRQUNULEtBQUssQ0FBQyxRQUFRLEdBQUcsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLE9BQU8sS0FBSyxDQUFDLFFBQVEsQ0FBQztJQUN4QixDQUFDLENBQUM7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QUN4QixJQUFZLEVBQ1osS0FBYSxFQUNiLFlBQW9CLEVBQ0wsRUFBRTtRQUNqQixNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUM1QixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFDZjtZQUNFLFlBQVksRUFBRSxZQUFZO1NBQzNCLENBQ0YsQ0FBQztJQUNKLENBQUMsQ0FBQztJQUVGOzs7O09BSUc7SUFDSCxVQUFVLEdBQUcsS0FBSyxFQUNoQixJQUFZLEVBQ1osS0FBYSxFQUNzQixFQUFFO1FBQ3JDLE9BQU8sTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQztZQUNyQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFO1NBQ3ZCLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztJQUVGOztPQUVHO0lBQ0gsV0FBVyxHQUFHLENBQ1osVUFBNEIsRUFBRSxFQUNBLEVBQUU7UUFDaEMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztZQUM1QixLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQztTQUNyQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRhU291cmNlLCBSZXBvc2l0b3J5IH0gZnJvbSAndHlwZW9ybSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkVudGl0eSB9IGZyb20gJy4uL2RiL2VudGl0aWVzL1RyYW5zYWN0aW9uRW50aXR5JztcbmltcG9ydCB7IEFic3RyYWN0TG9nZ2VyLCBEdW1teUxvZ2dlciB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvbG9nZ2VyLWludGVyZmFjZSc7XG5pbXBvcnQge1xuICBDYWxsYmFja0Z1bmN0aW9uLFxuICBTaWduaW5nU3RhdHVzLFxuICBUcmFuc2FjdGlvblN0YXR1cyxcbiAgVHhPcHRpb25zLFxuICBVbnJlZ2lzdGVyZWRDaGFpbixcbiAgVmFsaWRhdG9yRnVuY3Rpb24sXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgdHhPcHRpb25Ub0NsYXVzZSB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgQWJzdHJhY3RQb3RDaGFpbk1hbmFnZXIgfSBmcm9tICcuLi9uZXR3b3JrL0Fic3RyYWN0UG90Q2hhaW5NYW5hZ2VyJztcblxuZXhwb3J0IGNsYXNzIFR4UG90IHtcbiAgcHJvdGVjdGVkIHN0YXRpYyBpbnN0YW5jZTogVHhQb3Q7XG4gIHByb3RlY3RlZCByZWFkb25seSB0eFJlcG9zaXRvcnk6IFJlcG9zaXRvcnk8VHJhbnNhY3Rpb25FbnRpdHk+O1xuICBwcm90ZWN0ZWQgY2hhaW5zID0gbmV3IE1hcDxzdHJpbmcsIEFic3RyYWN0UG90Q2hhaW5NYW5hZ2VyPigpO1xuICBwcm90ZWN0ZWQgdmFsaWRhdG9ycyA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBWYWxpZGF0b3JGdW5jdGlvbj4+KCk7XG4gIHByb3RlY3RlZCB0eFR5cGVDYWxsYmFja3MgPSBuZXcgTWFwPFxuICAgIHN0cmluZyxcbiAgICBNYXA8VHJhbnNhY3Rpb25TdGF0dXMsIENhbGxiYWNrRnVuY3Rpb24+XG4gID4oKTtcbiAgcHJvdGVjdGVkIGxvZ2dlcjogQWJzdHJhY3RMb2dnZXI7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGRhdGFTb3VyY2U6IERhdGFTb3VyY2UsIGxvZ2dlcj86IEFic3RyYWN0TG9nZ2VyKSB7XG4gICAgdGhpcy50eFJlcG9zaXRvcnkgPSBkYXRhU291cmNlLmdldFJlcG9zaXRvcnkoVHJhbnNhY3Rpb25FbnRpdHkpO1xuICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyID8/IG5ldyBEdW1teUxvZ2dlcigpO1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdUeFBvdCBpbnN0YW50aWF0ZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBpbml0aWF0ZXMgVHhQb3RcbiAgICogQHBhcmFtIGRhdGFTb3VyY2UgdHlwZW9ybSBkYXRhIHNvdXJjZVxuICAgKiBAcGFyYW0gbG9nZ2VyXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNldHVwID0gKFxuICAgIGRhdGFTb3VyY2U6IERhdGFTb3VyY2UsXG4gICAgbG9nZ2VyPzogQWJzdHJhY3RMb2dnZXJcbiAgKTogVHhQb3QgPT4ge1xuICAgIFR4UG90Lmluc3RhbmNlID0gbmV3IFR4UG90KGRhdGFTb3VyY2UsIGxvZ2dlcik7XG4gICAgcmV0dXJuIFR4UG90Lmluc3RhbmNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiByZXR1cm5zIFR4UG90IGluc3RhbmNlICh0aHJvd3MgZXJyb3IgaWYgbm9uZSBleGlzdHMpXG4gICAqIEByZXR1cm5zIFR4UG90IGluc3RhbmNlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlID0gKCk6IFR4UG90ID0+IHtcbiAgICBpZiAoIVR4UG90Lmluc3RhbmNlKSB0aHJvdyBFcnJvcihgVHhQb3QgaW5zdGFuY2UgZG9lc24ndCBleGlzdGApO1xuICAgIHJldHVybiBUeFBvdC5pbnN0YW5jZTtcbiAgfTtcblxuICAvKipcbiAgICogcmVnaXN0ZXJzIGEgY2hhaW4gdG8gVHhQb3RcbiAgICogQHBhcmFtIGNoYWluXG4gICAqIEBwYXJhbSBjaGFpbk1hbmFnZXJcbiAgICovXG4gIHJlZ2lzdGVyQ2hhaW4gPSAoXG4gICAgY2hhaW46IHN0cmluZyxcbiAgICBjaGFpbk1hbmFnZXI6IEFic3RyYWN0UG90Q2hhaW5NYW5hZ2VyXG4gICk6IHZvaWQgPT4ge1xuICAgIHRoaXMuY2hhaW5zLnNldChjaGFpbiwgY2hhaW5NYW5hZ2VyKTtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBBIFR4UG90IGNoYWluIG1hbmFnZXIgaXMgcmVnaXN0ZXJlZCBmb3IgY2hhaW4gWyR7Y2hhaW59XWBcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiByZWdpc3RlcnMgYSB2YWxpZGF0b3IgZnVuY3Rpb25cbiAgICogQHBhcmFtIGNoYWluXG4gICAqIEBwYXJhbSB0eFR5cGVcbiAgICogQHBhcmFtIHZhbGlkYXRvclxuICAgKi9cbiAgcmVnaXN0ZXJWYWxpZGF0b3IgPSAoXG4gICAgY2hhaW46IHN0cmluZyxcbiAgICB0eFR5cGU6IHN0cmluZyxcbiAgICB2YWxpZGF0b3I6IFZhbGlkYXRvckZ1bmN0aW9uXG4gICk6IHZvaWQgPT4ge1xuICAgIGxldCBjaGFpblZhbGlkYXRvcnMgPSB0aGlzLnZhbGlkYXRvcnMuZ2V0KGNoYWluKTtcbiAgICBpZiAoIWNoYWluVmFsaWRhdG9ycykge1xuICAgICAgY2hhaW5WYWxpZGF0b3JzID0gbmV3IE1hcDxzdHJpbmcsIFZhbGlkYXRvckZ1bmN0aW9uPigpO1xuICAgICAgdGhpcy52YWxpZGF0b3JzLnNldChjaGFpbiwgY2hhaW5WYWxpZGF0b3JzKTtcbiAgICB9XG5cbiAgICBjaGFpblZhbGlkYXRvcnMuc2V0KHR4VHlwZSwgdmFsaWRhdG9yKTtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBBIHR4IHZhbGlkYXRvciBmdW5jdGlvbiBpcyByZWdpc3RlcmVkIGZvciBjaGFpbiBbJHtjaGFpbn1dIGFuZCB0eXBlIFske3R4VHlwZX1dYFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIHJlZ2lzdGVycyBhIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAqICB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2hlbiBzdGF0dXMgb2YgYW55IHRyYW5zYWN0aW9uc1xuICAgKiAgb2YgZ2l2ZW4gdHlwZSBjaGFuZ2VzIHRvIGdpdmVuIHN0YXR1c1xuICAgKiBAcGFyYW0gdHhUeXBlXG4gICAqIEBwYXJhbSBzdGF0dXNcbiAgICogQHBhcmFtIGNhbGxiYWNrXG4gICAqL1xuICByZWdpc3RlckNhbGxiYWNrID0gKFxuICAgIHR4VHlwZTogc3RyaW5nLFxuICAgIHN0YXR1czogVHJhbnNhY3Rpb25TdGF0dXMsXG4gICAgY2FsbGJhY2s6IENhbGxiYWNrRnVuY3Rpb25cbiAgKTogdm9pZCA9PiB7XG4gICAgbGV0IHR5cGVDYWxsYmFja3MgPSB0aGlzLnR4VHlwZUNhbGxiYWNrcy5nZXQodHhUeXBlKTtcbiAgICBpZiAoIXR5cGVDYWxsYmFja3MpIHtcbiAgICAgIHR5cGVDYWxsYmFja3MgPSBuZXcgTWFwPFRyYW5zYWN0aW9uU3RhdHVzLCBDYWxsYmFja0Z1bmN0aW9uPigpO1xuICAgICAgdGhpcy50eFR5cGVDYWxsYmFja3Muc2V0KHR4VHlwZSwgdHlwZUNhbGxiYWNrcyk7XG4gICAgfVxuXG4gICAgdHlwZUNhbGxiYWNrcy5zZXQoc3RhdHVzLCBjYWxsYmFjayk7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICBgQSB0eCBzdGF0dXMgY2FsbGJhY2sgZnVuY3Rpb24gaXMgcmVnaXN0ZXJlZCBmb3IgdHlwZSBbJHt0eFR5cGV9XSBhbmQgc3RhdHVzIFske3N0YXR1c31dYFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIHJldHVybnMgY2hhaW4gbWFuYWdlciBmb3IgZ2l2ZW4gY2hhaW5cbiAgICogIHRocm93cyBlcnJvciBpZiBubyBtYW5hZ2VyIGlzIHJlZ2lzdGVyZWQgZm9yIGl0XG4gICAqIEBwYXJhbSBjaGFpblxuICAgKi9cbiAgcHJvdGVjdGVkIGdldENoYWluTWFuYWdlciA9IChjaGFpbjogc3RyaW5nKTogQWJzdHJhY3RQb3RDaGFpbk1hbmFnZXIgPT4ge1xuICAgIGNvbnN0IG1hbmFnZXIgPSB0aGlzLmNoYWlucy5nZXQoY2hhaW4pO1xuICAgIGlmICghbWFuYWdlcilcbiAgICAgIHRocm93IG5ldyBVbnJlZ2lzdGVyZWRDaGFpbihcbiAgICAgICAgYE5vIG1hbmFnZXIgaXMgcmVnaXN0ZXJlZCBmb3IgY2hhaW4gWyR7Y2hhaW59XWBcbiAgICAgICk7XG4gICAgcmV0dXJuIG1hbmFnZXI7XG4gIH07XG5cbiAgLyoqXG4gICAqIHNldHMgdGhlIHR4IGFzIGludmFsaWQgaWYgZW5vdWdoIGJsb2NrcyBpcyBwYXNzZWQgZnJvbSBsYXN0IGNoZWNrXG4gICAqIEBwYXJhbSB0eFxuICAgKi9cbiAgcHJvdGVjdGVkIHNldFRyYW5zYWN0aW9uQXNJbnZhbGlkID0gYXN5bmMgKFxuICAgIHR4OiBUcmFuc2FjdGlvbkVudGl0eVxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBtYW5hZ2VyID0gdGhpcy5nZXRDaGFpbk1hbmFnZXIodHguY2hhaW4pO1xuXG4gICAgY29uc3QgY3VycmVudEhlaWdodCA9IGF3YWl0IG1hbmFnZXIuZ2V0SGVpZ2h0KCk7XG4gICAgY29uc3QgcmVxdWlyZWRDb25maXJtYXRpb24gPSBtYW5hZ2VyLmdldFR4UmVxdWlyZWRDb25maXJtYXRpb24odHgudHhUeXBlKTtcblxuICAgIGlmIChjdXJyZW50SGVpZ2h0IC0gdHgubGFzdENoZWNrID49IHJlcXVpcmVkQ29uZmlybWF0aW9uKSB7XG4gICAgICBhd2FpdCB0aGlzLnNldFR4U3RhdHVzKHR4LCBUcmFuc2FjdGlvblN0YXR1cy5JTlZBTElEKTtcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oYFR4IFske3R4LnR4SWR9XSBpcyBpbnZhbGlkYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oXG4gICAgICAgIGBUeCBbJHtcbiAgICAgICAgICB0eC50eElkXG4gICAgICAgIH1dIHNlZW1zIGludmFsaWQuIFdhaXRpbmcgZm9yIGVub3VnaCBjb25maXJtYXRpb24gb2YgdGhpcyBwcm9wb3NpdGlvbiBbJHtcbiAgICAgICAgICBjdXJyZW50SGVpZ2h0IC0gdHgubGFzdENoZWNrXG4gICAgICAgIH0vJHtyZXF1aXJlZENvbmZpcm1hdGlvbn1dYFxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIHZhbGlkYXRlcyBhIHRyYW5zYWN0aW9uXG4gICAqIHJldHVybnMgdHJ1ZSBpZiBubyB2YWxpZGF0b3IgZnVuY3Rpb25zIGlzIHNldCBvciB0eCBpcyB2YWxpZFxuICAgKiBvdGhlcndpc2UgaGFuZGxlIHRoZSB0eCBhcyBpbnZhbGlkIGFuZCByZXR1cm5zIGZhbHNlXG4gICAqIEBwYXJhbSB0eFxuICAgKi9cbiAgcHJvdGVjdGVkIHZhbGlkYXRlVHggPSBhc3luYyAodHg6IFRyYW5zYWN0aW9uRW50aXR5KTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgY29uc3QgdmFsaWRhdG9yID0gdGhpcy52YWxpZGF0b3JzLmdldCh0eC5jaGFpbik/LmdldCh0eC50eFR5cGUpO1xuICAgIGlmICh2YWxpZGF0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gdHggaXMgdmFsaWQgc2luY2Ugbm8gdmFsaWRhdG9yIGlzIGZvdW5kXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgYE5vIHZhbGlkYXRvciBmdW5jdGlvbiBpcyBmb3VuZCBmb3IgY2hhaW4gWyR7dHguY2hhaW59XSBhbmQgdHlwZSBbJHt0eC50eFR5cGV9XWBcbiAgICAgICk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGF3YWl0IHZhbGlkYXRvcih0eCkpIHJldHVybiB0cnVlO1xuXG4gICAgYXdhaXQgdGhpcy5zZXRUcmFuc2FjdGlvbkFzSW52YWxpZCh0eCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiB1cGRhdGVzIHRoZSBzdGF0dXMgb2YgYSB0eFxuICAgKiBAcGFyYW0gdHhLZXkgdHggaWQgYW5kIGNoYWluXG4gICAqIEBwYXJhbSBzdGF0dXMgbmV3IHN0YXR1c1xuICAgKi9cbiAgcHJvdGVjdGVkIHNldFR4U3RhdHVzID0gYXN5bmMgKFxuICAgIHR4OiBUcmFuc2FjdGlvbkVudGl0eSxcbiAgICBzdGF0dXM6IFRyYW5zYWN0aW9uU3RhdHVzXG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGF3YWl0IHRoaXMudHhSZXBvc2l0b3J5LnVwZGF0ZShcbiAgICAgIHtcbiAgICAgICAgdHhJZDogdHgudHhJZCxcbiAgICAgICAgY2hhaW46IHR4LmNoYWluLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc3RhdHVzOiBzdGF0dXMsXG4gICAgICAgIGxhc3RTdGF0dXNVcGRhdGU6IHRoaXMuY3VycmVudFRpbWUoKSxcbiAgICAgIH1cbiAgICApO1xuICAgIGNvbnN0IGNhbGxiYWNrID0gdGhpcy50eFR5cGVDYWxsYmFja3MuZ2V0KHR4LnR4VHlwZSk/LmdldChzdGF0dXMpO1xuICAgIGlmIChjYWxsYmFjaylcbiAgICAgIGNhbGxiYWNrKHR4LCBzdGF0dXMpLmNhdGNoKChlKSA9PiB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgIGBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyB0eCBbJHt0eC50eElkfV0gc3RhdHVzIGNoYW5nZTogJHtlfWBcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvciAmJiBlLnN0YWNrKSB0aGlzLmxvZ2dlci5kZWJ1ZyhlLnN0YWNrKTtcbiAgICAgIH0pO1xuICAgIGVsc2VcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgTm8gY2FsbGJhY2sgZnVuY3Rpb24gaXMgc2V0IGZvciB0eXBlIFske3R4LnR4VHlwZX1dIGFuZCBzdGF0dXMgWyR7c3RhdHVzfV1gXG4gICAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBjdXJyZW50IHRpbWVzdGFtcCBpbiBzZWNvbmRzIGFuZCBzdHJpbmcgZm9ybWF0XG4gICAqL1xuICBwcm90ZWN0ZWQgY3VycmVudFRpbWUgPSAoKSA9PiBTdHJpbmcoTWF0aC5yb3VuZChEYXRlLm5vdygpIC8gMTAwMCkpO1xuXG4gIC8qKlxuICAgKiBzdWJtaXRzIHRoZSBzaWduZWQgdHJhbnNhY3Rpb24gdG8gdGhlIGJsb2NrY2hhaW5cbiAgICogQHBhcmFtIHR4XG4gICAqL1xuICBwcm90ZWN0ZWQgcHJvY2Vzc1NpZ25lZFR4ID0gYXN5bmMgKHR4OiBUcmFuc2FjdGlvbkVudGl0eSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IG1hbmFnZXIgPSB0aGlzLmdldENoYWluTWFuYWdlcih0eC5jaGFpbik7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG1hbmFnZXIuc3VibWl0VHJhbnNhY3Rpb24odHguc2VyaWFsaXplZFR4KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICBgRmFpbGVkIHRvIHN1Ym1pdCB0eCBbJHt0eC50eElkfV0gdG8gY2hhaW4gWyR7dHguY2hhaW59XTogJHtlfWBcbiAgICAgICk7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yICYmIGUuc3RhY2spIHRoaXMubG9nZ2VyLndhcm4oZS5zdGFjayk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuc2V0VHhTdGF0dXModHgsIFRyYW5zYWN0aW9uU3RhdHVzLlNFTlQpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBwcm9jZXNzZXMgdGhlIHNlbnQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHR4XG4gICAqL1xuICBwcm90ZWN0ZWQgcHJvY2Vzc2VzU2VudFR4ID0gYXN5bmMgKHR4OiBUcmFuc2FjdGlvbkVudGl0eSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IG1hbmFnZXIgPSB0aGlzLmdldENoYWluTWFuYWdlcih0eC5jaGFpbik7XG5cbiAgICBjb25zdCB0eENvbmZpcm1hdGlvbiA9IGF3YWl0IG1hbmFnZXIuZ2V0VHhDb25maXJtYXRpb24odHgudHhJZCk7XG4gICAgY29uc3QgcmVxdWlyZWRDb25maXJtYXRpb24gPSBtYW5hZ2VyLmdldFR4UmVxdWlyZWRDb25maXJtYXRpb24odHgudHhUeXBlKTtcblxuICAgIGlmICh0eENvbmZpcm1hdGlvbiA+PSByZXF1aXJlZENvbmZpcm1hdGlvbikge1xuICAgICAgLy8gdHggaXMgY29uZmlybWVkIGVub3VnaFxuICAgICAgYXdhaXQgdGhpcy5zZXRUeFN0YXR1cyh0eCwgVHJhbnNhY3Rpb25TdGF0dXMuQ09NUExFVEVEKTtcbiAgICB9IGVsc2UgaWYgKHR4Q29uZmlybWF0aW9uID09PSAtMSkge1xuICAgICAgLy8gdHggaXMgbm90IG1pbmVkLCBjaGVja2luZyBtZW1wb29sLi4uXG4gICAgICBpZiAoYXdhaXQgbWFuYWdlci5pc1R4SW5NZW1wb29sKHR4LnR4SWQpKSB7XG4gICAgICAgIC8vIHR4IGlzIGluIG1lbXBvb2wsIHVwZGF0aW5nIGxhc3QgY2hlY2suLi5cbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gYXdhaXQgbWFuYWdlci5nZXRIZWlnaHQoKTtcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVUeExhc3RDaGVjayh0eC50eElkLCB0eC5jaGFpbiwgaGVpZ2h0KTtcbiAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhgVHggWyR7dHgudHhJZH1dIGlzIGluIG1lbXBvb2xgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHR4IGlzIG5vdCBpbiBtZW1wb29sLCBjaGVja2luZyBpZiB0eCBpcyBzdGlsbCB2YWxpZFxuICAgICAgICBjb25zdCBpc1ZhbGlkVHggPSBhd2FpdCBtYW5hZ2VyLmlzVHhWYWxpZChcbiAgICAgICAgICB0eC5zZXJpYWxpemVkVHgsXG4gICAgICAgICAgU2lnbmluZ1N0YXR1cy5TaWduZWRcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgaXNWYWxpZFRvVHlwZSA9IGF3YWl0IHRoaXMudmFsaWRhdGVUeCh0eCk7XG5cbiAgICAgICAgaWYgKGlzVmFsaWRUeCAmJiBpc1ZhbGlkVG9UeXBlKSB7XG4gICAgICAgICAgLy8gdHggaXMgdmFsaWQuIHJlc2VuZGluZy4uLlxuICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oYFR4IFske3R4LnR4SWR9XSBpcyBzdGlsbCB2YWxpZC4gUmVzZW5kaW5nIHR4Li4uYCk7XG4gICAgICAgICAgYXdhaXQgbWFuYWdlci5zdWJtaXRUcmFuc2FjdGlvbih0eC5zZXJpYWxpemVkVHgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHR4IHNlZW1zIGludmFsaWQuIHJlc2V0IHN0YXR1cyBpZiBlbm91Z2ggYmxvY2tzIHBhc3QuXG4gICAgICAgICAgYXdhaXQgdGhpcy5zZXRUcmFuc2FjdGlvbkFzSW52YWxpZCh0eCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdHggaXMgbWluZWQsIGJ1dCBpcyBub3QgY29uZmlybWVkIGVub3VnaCwgdXBkYXRpbmcgbGFzdCBjaGVjay4uLlxuICAgICAgY29uc3QgaGVpZ2h0ID0gYXdhaXQgbWFuYWdlci5nZXRIZWlnaHQoKTtcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlVHhMYXN0Q2hlY2sodHgudHhJZCwgdHguY2hhaW4sIGhlaWdodCk7XG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICBgVHggWyR7dHgudHhJZH1dIGlzIGluIGNvbmZpcm1hdGlvbiBwcm9jZXNzIFske3R4Q29uZmlybWF0aW9ufS8ke3JlcXVpcmVkQ29uZmlybWF0aW9ufV1gXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogcnVucyBhbGwgam9icyBvZiBUeFBvdFxuICAgKiAtIHByb2Nlc3Mgc2lnbmVkIHR4c1xuICAgKiAtIHByb2Nlc3Mgc2VudCB0eHNcbiAgICovXG4gIHVwZGF0ZSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAvLyBwcm9jZXNzIHNpZ25lZCB0eHNcbiAgICBjb25zdCBzaWduZWRUeHMgPSBhd2FpdCB0aGlzLmdldFR4c0J5U3RhdHVzKFRyYW5zYWN0aW9uU3RhdHVzLlNJR05FRCk7XG4gICAgZm9yIChjb25zdCB0eCBvZiBzaWduZWRUeHMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc1NpZ25lZFR4KHR4KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICBgQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0eCBbJHt0eC50eElkfV0gd2l0aCBzdGF0dXMgWyR7VHJhbnNhY3Rpb25TdGF0dXMuU0lHTkVEfV06ICR7ZX1gXG4gICAgICAgICk7XG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5zdGFjaykgdGhpcy5sb2dnZXIud2FybihlLnN0YWNrKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICBgUHJvY2Vzc2VkIFske3NpZ25lZFR4cy5sZW5ndGh9XSB0eHMgd2l0aCBzdGF0dXMgWyR7VHJhbnNhY3Rpb25TdGF0dXMuU0lHTkVEfV1gXG4gICAgKTtcblxuICAgIC8vIHByb2Nlc3Mgc2VudCB0eHNcbiAgICBjb25zdCBzZW50VHhzID0gYXdhaXQgdGhpcy5nZXRUeHNCeVN0YXR1cyhUcmFuc2FjdGlvblN0YXR1cy5TRU5UKTtcbiAgICBmb3IgKGNvbnN0IHR4IG9mIHNlbnRUeHMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc2VzU2VudFR4KHR4KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICBgQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0eCBbJHt0eC50eElkfV0gd2l0aCBzdGF0dXMgWyR7VHJhbnNhY3Rpb25TdGF0dXMuU0VOVH1dOiAke2V9YFxuICAgICAgICApO1xuICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yICYmIGUuc3RhY2spIHRoaXMubG9nZ2VyLndhcm4oZS5zdGFjayk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgYFByb2Nlc3NlZCBbJHtzZW50VHhzLmxlbmd0aH1dIHR4cyB3aXRoIHN0YXR1cyBbJHtUcmFuc2FjdGlvblN0YXR1cy5TRU5UfV1gXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogZ2V0cyB0cmFuc2FjdGlvbnMgYnkgc3RhdHVzXG4gICAqIEBwYXJhbSBzdGF0dXNcbiAgICogQHBhcmFtIHZhbGlkYXRlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXRUeHNCeVN0YXR1cyA9IGFzeW5jIChcbiAgICBzdGF0dXM6IFRyYW5zYWN0aW9uU3RhdHVzLFxuICAgIHZhbGlkYXRlID0gZmFsc2VcbiAgKTogUHJvbWlzZTxBcnJheTxUcmFuc2FjdGlvbkVudGl0eT4+ID0+IHtcbiAgICBjb25zdCB0eHMgPSBhd2FpdCB0aGlzLnR4UmVwb3NpdG9yeS5maW5kKHtcbiAgICAgIHdoZXJlOiB7XG4gICAgICAgIHN0YXR1czogc3RhdHVzLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBpZiAoIXZhbGlkYXRlKSByZXR1cm4gdHhzO1xuXG4gICAgLy8gdmFsaWRhdGUgdGhlIHRyYW5zYWN0aW9uc1xuICAgIGNvbnN0IHZhbGlkVHhzOiBBcnJheTxUcmFuc2FjdGlvbkVudGl0eT4gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHR4IG9mIHR4cykge1xuICAgICAgaWYgKGF3YWl0IHRoaXMudmFsaWRhdGVUeCh0eCkpIHZhbGlkVHhzLnB1c2godHgpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsaWRUeHM7XG4gIH07XG5cbiAgLyoqXG4gICAqIGluc2VydHMgYSBuZXcgdHJhbnNhY3Rpb24gaW50byBkYlxuICAgKiBAcGFyYW0gdHhJZFxuICAgKiBAcGFyYW0gY2hhaW5cbiAgICogQHBhcmFtIHR4VHlwZVxuICAgKiBAcGFyYW0gcmVxdWlyZWRTaWduXG4gICAqIEBwYXJhbSBzZXJpYWxpemVkVHhcbiAgICogQHBhcmFtIGluaXRpYWxTdGF0dXNcbiAgICogQHBhcmFtIGxhc3RDaGVja1xuICAgKi9cbiAgYWRkVHggPSBhc3luYyAoXG4gICAgdHhJZDogc3RyaW5nLFxuICAgIGNoYWluOiBzdHJpbmcsXG4gICAgdHhUeXBlOiBzdHJpbmcsXG4gICAgcmVxdWlyZWRTaWduOiBudW1iZXIsXG4gICAgc2VyaWFsaXplZFR4OiBzdHJpbmcsXG4gICAgaW5pdGlhbFN0YXR1cyA9IFRyYW5zYWN0aW9uU3RhdHVzLkFQUFJPVkVELFxuICAgIGxhc3RDaGVjayA9IDBcbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgYXdhaXQgdGhpcy50eFJlcG9zaXRvcnkuaW5zZXJ0KHtcbiAgICAgIHR4SWQ6IHR4SWQsXG4gICAgICBjaGFpbjogY2hhaW4sXG4gICAgICB0eFR5cGU6IHR4VHlwZSxcbiAgICAgIHN0YXR1czogaW5pdGlhbFN0YXR1cyxcbiAgICAgIHJlcXVpcmVkU2lnbjogcmVxdWlyZWRTaWduLFxuICAgICAgbGFzdENoZWNrOiBsYXN0Q2hlY2ssXG4gICAgICBsYXN0U3RhdHVzVXBkYXRlOiB0aGlzLmN1cnJlbnRUaW1lKCksXG4gICAgICBmYWlsZWRJblNpZ246IGZhbHNlLFxuICAgICAgc2lnbkZhaWxlZENvdW50OiAwLFxuICAgICAgc2VyaWFsaXplZFR4OiBzZXJpYWxpemVkVHgsXG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIHVwZGF0ZXMgdGhlIHN0YXR1cyBvZiBhIHR4XG4gICAqIEBwYXJhbSB0eElkXG4gICAqIEBwYXJhbSBjaGFpblxuICAgKiBAcGFyYW0gc3RhdHVzIG5ldyBzdGF0dXNcbiAgICovXG4gIHNldFR4U3RhdHVzQnlJZCA9IGFzeW5jIChcbiAgICB0eElkOiBzdHJpbmcsXG4gICAgY2hhaW46IHN0cmluZyxcbiAgICBzdGF0dXM6IFRyYW5zYWN0aW9uU3RhdHVzXG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdGhpcy50eFJlcG9zaXRvcnkuZmluZE9uZU9yRmFpbCh7XG4gICAgICB3aGVyZTogeyB0eElkLCBjaGFpbiB9LFxuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMuc2V0VHhTdGF0dXModHgsIHN0YXR1cyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIHVwZGF0ZXMgdHggaW5mbyB3aGVuIGZhaWxlZCBpbiBzaWduIHByb2Nlc3NcbiAgICogQHBhcmFtIHR4SWRcbiAgICogQHBhcmFtIGNoYWluXG4gICAqL1xuICBzZXRUeEFzU2lnbkZhaWxlZCA9IGFzeW5jICh0eElkOiBzdHJpbmcsIGNoYWluOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBhd2FpdCB0aGlzLnR4UmVwb3NpdG9yeS51cGRhdGUoXG4gICAgICB7XG4gICAgICAgIHR4SWQ6IHR4SWQsXG4gICAgICAgIGNoYWluOiBjaGFpbixcbiAgICAgICAgc3RhdHVzOiBUcmFuc2FjdGlvblN0YXR1cy5JTl9TSUdOLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc3RhdHVzOiBUcmFuc2FjdGlvblN0YXR1cy5TSUdOX0ZBSUxFRCxcbiAgICAgICAgbGFzdFN0YXR1c1VwZGF0ZTogdGhpcy5jdXJyZW50VGltZSgpLFxuICAgICAgICBzaWduRmFpbGVkQ291bnQ6ICgpID0+ICdcInNpZ25GYWlsZWRDb3VudFwiICsgMScsXG4gICAgICAgIGZhaWxlZEluU2lnbjogdHJ1ZSxcbiAgICAgIH1cbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiB1cGRhdGVzIHRoZSB0eCBhbmQgc2V0IHN0YXR1cyBhcyBzaWduZWRcbiAgICogQHBhcmFtIHR4SWRcbiAgICogQHBhcmFtIGNoYWluXG4gICAqIEBwYXJhbSBzZXJpYWxpemVkVHhcbiAgICogQHBhcmFtIGN1cnJlbnRIZWlnaHQgY3VycmVudCBoZWlnaHQgb2YgdGhlIGJsb2NrY2hhaW5cbiAgICogQHBhcmFtIGV4dHJhXG4gICAqIEBwYXJhbSBleHRyYTJcbiAgICovXG4gIHNldFR4QXNTaWduZWQgPSBhc3luYyAoXG4gICAgdHhJZDogc3RyaW5nLFxuICAgIGNoYWluOiBzdHJpbmcsXG4gICAgc2VyaWFsaXplZFR4OiBzdHJpbmcsXG4gICAgY3VycmVudEhlaWdodDogbnVtYmVyLFxuICAgIGV4dHJhPzogc3RyaW5nLFxuICAgIGV4dHJhMj86IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCB1cGRhdGVkRmllbGRzOiBQYXJ0aWFsPFRyYW5zYWN0aW9uRW50aXR5PiA9IHtcbiAgICAgIHNlcmlhbGl6ZWRUeDogc2VyaWFsaXplZFR4LFxuICAgICAgc3RhdHVzOiBUcmFuc2FjdGlvblN0YXR1cy5TSUdORUQsXG4gICAgICBsYXN0U3RhdHVzVXBkYXRlOiB0aGlzLmN1cnJlbnRUaW1lKCksXG4gICAgICBsYXN0Q2hlY2s6IGN1cnJlbnRIZWlnaHQsXG4gICAgfTtcbiAgICBpZiAoZXh0cmEpIHVwZGF0ZWRGaWVsZHMuZXh0cmEgPSBleHRyYTtcbiAgICBpZiAoZXh0cmEyKSB1cGRhdGVkRmllbGRzLmV4dHJhMiA9IGV4dHJhMjtcblxuICAgIGF3YWl0IHRoaXMudHhSZXBvc2l0b3J5LnVwZGF0ZSh7IHR4SWQsIGNoYWluIH0sIHVwZGF0ZWRGaWVsZHMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiB1cGRhdGVzIGxhc3QgY2hlY2sgdmFsdWUgb2YgYSB0eFxuICAgKiBAcGFyYW0gdHhJZFxuICAgKiBAcGFyYW0gY2hhaW5cbiAgICogQHBhcmFtIGN1cnJlbnRIZWlnaHQgY3VycmVudCBoZWlnaHQgb2YgdGhlIGJsb2NrY2hhaW5cbiAgICovXG4gIHVwZGF0ZVR4TGFzdENoZWNrID0gYXN5bmMgKFxuICAgIHR4SWQ6IHN0cmluZyxcbiAgICBjaGFpbjogc3RyaW5nLFxuICAgIGN1cnJlbnRIZWlnaHQ6IG51bWJlclxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBhd2FpdCB0aGlzLnR4UmVwb3NpdG9yeS51cGRhdGUoXG4gICAgICB7IHR4SWQsIGNoYWluIH0sXG4gICAgICB7IGxhc3RDaGVjazogY3VycmVudEhlaWdodCB9XG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogdXBkYXRlcyBmYWlsZWRJblNpZ24gZmllbGQgb2YgYSB0cmFuc2FjdGlvbiB0byBmYWxzZVxuICAgKiBAcGFyYW0gdHhJZFxuICAgKiBAcGFyYW0gY2hhaW5cbiAgICovXG4gIHJlc2V0RmFpbGVkSW5TaWduID0gYXN5bmMgKHR4SWQ6IHN0cmluZywgY2hhaW46IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGF3YWl0IHRoaXMudHhSZXBvc2l0b3J5LnVwZGF0ZShcbiAgICAgIHsgdHhJZCwgY2hhaW4gfSxcbiAgICAgIHtcbiAgICAgICAgZmFpbGVkSW5TaWduOiBmYWxzZSxcbiAgICAgIH1cbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiB1cGRhdGVzIHJlcXVpcmVkU2lnbiBmaWVsZCBvZiBhIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB0eElkXG4gICAqIEBwYXJhbSBjaGFpblxuICAgKiBAcGFyYW0gcmVxdWlyZWRTaWduXG4gICAqL1xuICB1cGRhdGVSZXF1aXJlZFNpZ24gPSBhc3luYyAoXG4gICAgdHhJZDogc3RyaW5nLFxuICAgIGNoYWluOiBzdHJpbmcsXG4gICAgcmVxdWlyZWRTaWduOiBudW1iZXJcbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgYXdhaXQgdGhpcy50eFJlcG9zaXRvcnkudXBkYXRlKFxuICAgICAgeyB0eElkLCBjaGFpbiB9LFxuICAgICAge1xuICAgICAgICByZXF1aXJlZFNpZ246IHJlcXVpcmVkU2lnbixcbiAgICAgIH1cbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBnZXRzIHRoZSB0cmFuc2FjdGlvbiBieSBpdHMgaWQgYW5kIGNoYWluXG4gICAqIEBwYXJhbSB0eElkXG4gICAqIEBwYXJhbSBjaGFpblxuICAgKi9cbiAgZ2V0VHhCeUtleSA9IGFzeW5jIChcbiAgICB0eElkOiBzdHJpbmcsXG4gICAgY2hhaW46IHN0cmluZ1xuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uRW50aXR5IHwgbnVsbD4gPT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnR4UmVwb3NpdG9yeS5maW5kT25lKHtcbiAgICAgIHdoZXJlOiB7IHR4SWQsIGNoYWluIH0sXG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHRoZSB0cmFuc2FjdGlvbnMgd2l0aCB2YWxpZCBzdGF0dXNcbiAgICovXG4gIGdldFR4c1F1ZXJ5ID0gKFxuICAgIG9wdGlvbnM6IEFycmF5PFR4T3B0aW9ucz4gPSBbXVxuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uRW50aXR5W10+ID0+IHtcbiAgICByZXR1cm4gdGhpcy50eFJlcG9zaXRvcnkuZmluZCh7XG4gICAgICB3aGVyZTogb3B0aW9ucy5tYXAodHhPcHRpb25Ub0NsYXVzZSksXG4gICAgfSk7XG4gIH07XG59XG4iXX0=
533
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHhQb3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvdHJhbnNhY3Rpb24vVHhQb3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDckUsT0FBTyxFQUFrQixXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM1RSxPQUFPLEVBRUwsYUFBYSxFQUNiLGlCQUFpQixFQUVqQixpQkFBaUIsR0FFbEIsTUFBTSxTQUFTLENBQUM7QUFDakIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRzNDLE1BQU0sT0FBTyxLQUFLO0lBQ04sTUFBTSxDQUFDLFFBQVEsQ0FBUTtJQUNkLFlBQVksQ0FBZ0M7SUFDckQsTUFBTSxHQUFHLElBQUksR0FBRyxFQUFtQyxDQUFDO0lBQ3BELFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFHM0IsQ0FBQztJQUNNLGVBQWUsR0FBRyxJQUFJLEdBQUcsRUFHaEMsQ0FBQztJQUNNLG1CQUFtQixHQUFHLElBQUksR0FBRyxFQUdwQyxDQUFDO0lBQ00sTUFBTSxDQUFpQjtJQUVqQyxZQUFzQixVQUFzQixFQUFFLE1BQXVCO1FBQ25FLElBQUksQ0FBQyxZQUFZLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxJQUFJLElBQUksV0FBVyxFQUFFLENBQUM7UUFDMUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsS0FBSyxHQUFHLENBQ3BCLFVBQXNCLEVBQ3RCLE1BQXVCLEVBQ2hCLEVBQUU7UUFDVCxLQUFLLENBQUMsUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMvQyxPQUFP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LEVBQ0EsRUFBRTtRQUNoQyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDO1lBQzVCLEtBQUssRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDO1NBQ3JDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztJQUVGOzs7Ozs7T0FNRztJQUNILFdBQVcsR0FBRyxLQUFLLEVBQ2pCLElBQVksRUFDWixLQUFhLEVBQ2IsS0FBcUIsRUFDckIsTUFBc0IsRUFDUCxFQUFFO1FBQ2pCLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxNQUFNLEtBQUssU0FBUztZQUFFLE9BQU87UUFDeEQsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3JFLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGFTb3VyY2UsIFJlcG9zaXRvcnkgfSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uRW50aXR5IH0gZnJvbSAnLi4vZGIvZW50aXRpZXMvVHJhbnNhY3Rpb25FbnRpdHknO1xuaW1wb3J0IHsgQWJzdHJhY3RMb2dnZXIsIER1bW15TG9nZ2VyIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1sb2dnZXInO1xuaW1wb3J0IHtcbiAgQ2FsbGJhY2tGdW5jdGlvbixcbiAgU2lnbmluZ1N0YXR1cyxcbiAgVHJhbnNhY3Rpb25TdGF0dXMsXG4gIFR4T3B0aW9ucyxcbiAgVW5yZWdpc3RlcmVkQ2hhaW4sXG4gIFZhbGlkYXRvckZ1bmN0aW9uLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IHR4T3B0aW9uVG9DbGF1c2UgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IEFic3RyYWN0UG90Q2hhaW5NYW5hZ2VyIH0gZnJvbSAnLi4vbmV0d29yay9BYnN0cmFjdFBvdENoYWluTWFuYWdlcic7XG5cbmV4cG9ydCBjbGFzcyBUeFBvdCB7XG4gIHByb3RlY3RlZCBzdGF0aWMgaW5zdGFuY2U6IFR4UG90O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdHhSZXBvc2l0b3J5OiBSZXBvc2l0b3J5PFRyYW5zYWN0aW9uRW50aXR5PjtcbiAgcHJvdGVjdGVkIGNoYWlucyA9IG5ldyBNYXA8c3RyaW5nLCBBYnN0cmFjdFBvdENoYWluTWFuYWdlcj4oKTtcbiAgcHJvdGVjdGVkIHZhbGlkYXRvcnMgPSBuZXcgTWFwPFxuICAgIHN0cmluZyxcbiAgICBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBWYWxpZGF0b3JGdW5jdGlvbj4+XG4gID4oKTtcbiAgcHJvdGVjdGVkIHR4VHlwZUNhbGxiYWNrcyA9IG5ldyBNYXA8XG4gICAgc3RyaW5nLFxuICAgIE1hcDxUcmFuc2FjdGlvblN0YXR1cywgTWFwPHN0cmluZywgQ2FsbGJhY2tGdW5jdGlvbj4+XG4gID4oKTtcbiAgcHJvdGVjdGVkIHN1Ym1pc3Npb25BbGxvd2FuY2UgPSBuZXcgTWFwPFxuICAgIHN0cmluZyxcbiAgICBNYXA8c3RyaW5nLCBWYWxpZGF0b3JGdW5jdGlvbj5cbiAgPigpO1xuICBwcm90ZWN0ZWQgbG9nZ2VyOiBBYnN0cmFjdExvZ2dlcjtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoZGF0YVNvdXJjZTogRGF0YVNvdXJjZSwgbG9nZ2VyPzogQWJzdHJhY3RMb2dnZXIpIHtcbiAgICB0aGlzLnR4UmVwb3NpdG9yeSA9IGRhdGFTb3VyY2UuZ2V0UmVwb3NpdG9yeShUcmFuc2FjdGlvbkVudGl0eSk7XG4gICAgdGhpcy5sb2dnZXIgPSBsb2dnZXIgPz8gbmV3IER1bW15TG9nZ2VyKCk7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ1R4UG90IGluc3RhbnRpYXRlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIGluaXRpYXRlcyBUeFBvdFxuICAgKiBAcGFyYW0gZGF0YVNvdXJjZSB0eXBlb3JtIGRhdGEgc291cmNlXG4gICAqIEBwYXJhbSBsb2dnZXJcbiAgICogQHJldHVybnNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2V0dXAgPSAoXG4gICAgZGF0YVNvdXJjZTogRGF0YVNvdXJjZSxcbiAgICBsb2dnZXI/OiBBYnN0cmFjdExvZ2dlclxuICApOiBUeFBvdCA9PiB7XG4gICAgVHhQb3QuaW5zdGFuY2UgPSBuZXcgVHhQb3QoZGF0YVNvdXJjZSwgbG9nZ2VyKTtcbiAgICByZXR1cm4gVHhQb3QuaW5zdGFuY2U7XG4gIH07XG5cbiAgLyoqXG4gICAqIHJldHVybnMgVHhQb3QgaW5zdGFuY2UgKHRocm93cyBlcnJvciBpZiBub25lIGV4aXN0cylcbiAgICogQHJldHVybnMgVHhQb3QgaW5zdGFuY2VcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UgPSAoKTogVHhQb3QgPT4ge1xuICAgIGlmICghVHhQb3QuaW5zdGFuY2UpIHRocm93IEVycm9yKGBUeFBvdCBpbnN0YW5jZSBkb2Vzbid0IGV4aXN0YCk7XG4gICAgcmV0dXJuIFR4UG90Lmluc3RhbmNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiByZWdpc3RlcnMgYSBjaGFpbiB0byBUeFBvdFxuICAgKiBAcGFyYW0gY2hhaW5cbiAgICogQHBhcmFtIGNoYWluTWFuYWdlclxuICAgKi9cbiAgcmVnaXN0ZXJDaGFpbiA9IChcbiAgICBjaGFpbjogc3RyaW5nLFxuICAgIGNoYWluTWFuYWdlcjogQWJzdHJhY3RQb3RDaGFpbk1hbmFnZXJcbiAgKTogdm9pZCA9PiB7XG4gICAgdGhpcy5jaGFpbnMuc2V0KGNoYWluLCBjaGFpbk1hbmFnZXIpO1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgYEEgVHhQb3QgY2hhaW4gbWFuYWdlciBpcyByZWdpc3RlcmVkIGZvciBjaGFpbiBbJHtjaGFpbn1dYFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIHJlZ2lzdGVycyBhIHZhbGlkYXRvciBmdW5jdGlvblxuICAgKiBAcGFyYW0gY2hhaW5cbiAgICogQHBhcmFtIHR4VHlwZVxuICAgKiBAcGFyYW0gaWRcbiAgICogQHBhcmFtIHZhbGlkYXRvclxuICAgKi9cbiAgcmVnaXN0ZXJWYWxpZGF0b3IgPSAoXG4gICAgY2hhaW46IHN0cmluZyxcbiAgICB0eFR5cGU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nLFxuICAgIHZhbGlkYXRvcjogVmFsaWRhdG9yRnVuY3Rpb25cbiAgKTogdm9pZCA9PiB7XG4gICAgbGV0IGNoYWluVmFsaWRhdG9ycyA9IHRoaXMudmFsaWRhdG9ycy5nZXQoY2hhaW4pO1xuICAgIGlmICghY2hhaW5WYWxpZGF0b3JzKSB7XG4gICAgICBjaGFpblZhbGlkYXRvcnMgPSBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgVmFsaWRhdG9yRnVuY3Rpb24+PigpO1xuICAgICAgdGhpcy52YWxpZGF0b3JzLnNldChjaGFpbiwgY2hhaW5WYWxpZGF0b3JzKTtcbiAgICB9XG5cbiAgICBsZXQgdHlwZVZhbGlkYXRvcnMgPSBjaGFpblZhbGlkYXRvcnMuZ2V0KHR4VHlwZSk7XG4gICAgaWYgKCF0eXBlVmFsaWRhdG9ycykge1xuICAgICAgdHlwZVZhbGlkYXRvcnMgPSBuZXcgTWFwPHN0cmluZywgVmFsaWRhdG9yRnVuY3Rpb24+KCk7XG4gICAgICBjaGFpblZhbGlkYXRvcnMuc2V0KHR4VHlwZSwgdHlwZVZhbGlkYXRvcnMpO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50VmFsaWRhdG9yID0gdHlwZVZhbGlkYXRvcnMuZ2V0KGlkKTtcbiAgICB0eXBlVmFsaWRhdG9ycy5zZXQoaWQsIHZhbGlkYXRvcik7XG4gICAgaWYgKGN1cnJlbnRWYWxpZGF0b3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgVGhlIHR4IHZhbGlkYXRvciBmdW5jdGlvbiBmb3IgY2hhaW4gWyR7Y2hhaW59XSwgdHlwZSBbJHt0eFR5cGV9XSBhbmQgaWQgWyR7aWR9XSBpcyByZXBsYWNlZGBcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oXG4gICAgICAgIGBOZXcgdHggdmFsaWRhdG9yIGZ1bmN0aW9uIGlzIHJlZ2lzdGVyZWQgZm9yIGNoYWluIFske2NoYWlufV0gYW5kIHR5cGUgWyR7dHhUeXBlfV0gYnkgaWQgWyR7aWR9XWBcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiByZW1vdmVzIGEgdmFsaWRhdG9yIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSBjaGFpblxuICAgKiBAcGFyYW0gdHhUeXBlXG4gICAqIEBwYXJhbSBpZFxuICAgKi9cbiAgdW5yZWdpc3RlclZhbGlkYXRvciA9IChjaGFpbjogc3RyaW5nLCB0eFR5cGU6IHN0cmluZywgaWQ6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHZhbGlkYXRvcnMgPSB0aGlzLnZhbGlkYXRvcnMuZ2V0KGNoYWluKT8uZ2V0KHR4VHlwZSk7XG4gICAgaWYgKCF2YWxpZGF0b3JzKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgYE5vIHR4IHZhbGlkYXRvciBmdW5jdGlvbiBpcyBzZXQgZm9yIGNoYWluIFske2NoYWlufV0sIHR5cGUgWyR7dHhUeXBlfV0gYW5kIGlkIFske2lkfV1gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhbGlkYXRvcnMuZGVsZXRlKGlkKTtcbiAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgYFJlbW92ZWQgdHggdmFsaWRhdG9yIGZ1bmN0aW9uIGZvciBjaGFpbiBbJHtjaGFpbn1dLCB0eXBlIFske3R4VHlwZX1dIGFuZCBpZCBbJHtpZH1dYFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIHJlZ2lzdGVycyBhIHN1Ym1pdCB2YWxpZGF0b3IgZnVuY3Rpb25cbiAgICogQHBhcmFtIGNoYWluXG4gICAqIEBwYXJhbSBpZFxuICAgKiBAcGFyYW0gdmFsaWRhdG9yXG4gICAqL1xuICByZWdpc3RlclN1Ym1pdFZhbGlkYXRvciA9IChcbiAgICBjaGFpbjogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcsXG4gICAgdmFsaWRhdG9yOiBWYWxpZGF0b3JGdW5jdGlvblxuICApOiB2b2lkID0+IHtcbiAgICBsZXQgY2hhaW5BbGxvd2FuY2UgPSB0aGlzLnN1Ym1pc3Npb25BbGxvd2FuY2UuZ2V0KGNoYWluKTtcbiAgICBpZiAoIWNoYWluQWxsb3dhbmNlKSB7XG4gICAgICBjaGFpbkFsbG93YW5jZSA9IG5ldyBNYXA8c3RyaW5nLCBWYWxpZGF0b3JGdW5jdGlvbj4oKTtcbiAgICAgIHRoaXMuc3VibWlzc2lvbkFsbG93YW5jZS5zZXQoY2hhaW4sIGNoYWluQWxsb3dhbmNlKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50VmFsaWRhdG9yID0gY2hhaW5BbGxvd2FuY2UuZ2V0KGlkKTtcbiAgICBjaGFpbkFsbG93YW5jZS5zZXQoaWQsIHZhbGlkYXRvcik7XG4gICAgaWYgKGN1cnJlbnRWYWxpZGF0b3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgVGhlIHR4IHN1Ym1pdCB2YWxpZGF0b3IgZnVuY3Rpb24gZm9yIGNoYWluIFske2NoYWlufV0gYW5kIGlkIFske2lkfV0gaXMgcmVwbGFjZWRgXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICBgTmV3IHR4IHN1Ym1pdCB2YWxpZGF0b3IgZnVuY3Rpb24gaXMgcmVnaXN0ZXJlZCBmb3IgY2hhaW4gWyR7Y2hhaW59XSBieSBpZCBbJHtpZH1dYFxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIHJlbW92ZXMgYSBzdWJtaXQgdmFsaWRhdG9yIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSBjaGFpblxuICAgKiBAcGFyYW0gaWRcbiAgICovXG4gIHVucmVnaXN0ZXJTdWJtaXRWYWxpZGF0b3IgPSAoY2hhaW46IHN0cmluZywgaWQ6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGNoYWluQWxsb3dhbmNlID0gdGhpcy5zdWJtaXNzaW9uQWxsb3dhbmNlLmdldChjaGFpbik7XG4gICAgaWYgKCFjaGFpbkFsbG93YW5jZSkge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgIGBObyB0eCBzdWJtaXQgdmFsaWRhdG9yIGZ1bmN0aW9uIGlzIHNldCBmb3IgY2hhaW4gWyR7Y2hhaW59XSBhbmQgaWQgWyR7aWR9XWBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY2hhaW5BbGxvd2FuY2UuZGVsZXRlKGlkKTtcbiAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgYFJlbW92ZWQgdHggc3VibWl0IHZhbGlkYXRvciBmdW5jdGlvbiBmb3IgY2hhaW4gWyR7Y2hhaW59XSBhbmQgaWQgWyR7aWR9XWBcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiByZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvblxuICAgKiAgdGhlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHdoZW4gc3RhdHVzIG9mIGFueSB0cmFuc2FjdGlvbnNcbiAgICogIG9mIGdpdmVuIHR5cGUgY2hhbmdlcyB0byBnaXZlbiBzdGF0dXNcbiAgICogQHBhcmFtIHR4VHlwZVxuICAgKiBAcGFyYW0gc3RhdHVzXG4gICAqIEBwYXJhbSBpZFxuICAgKiBAcGFyYW0gY2FsbGJhY2tcbiAgICovXG4gIHJlZ2lzdGVyQ2FsbGJhY2sgPSAoXG4gICAgdHhUeXBlOiBzdHJpbmcsXG4gICAgc3RhdHVzOiBUcmFuc2FjdGlvblN0YXR1cyxcbiAgICBpZDogc3RyaW5nLFxuICAgIGNhbGxiYWNrOiBDYWxsYmFja0Z1bmN0aW9uXG4gICk6IHZvaWQgPT4ge1xuICAgIGxldCB0eXBlQ2FsbGJhY2tzID0gdGhpcy50eFR5cGVDYWxsYmFja3MuZ2V0KHR4VHlwZSk7XG4gICAgaWYgKCF0eXBlQ2FsbGJhY2tzKSB7XG4gICAgICB0eXBlQ2FsbGJhY2tzID0gbmV3IE1hcDxcbiAgICAgICAgVHJhbnNhY3Rpb25TdGF0dXMsXG4gICAgICAgIE1hcDxzdHJpbmcsIENhbGxiYWNrRnVuY3Rpb24+XG4gICAgICA+KCk7XG4gICAgICB0aGlzLnR4VHlwZUNhbGxiYWNrcy5zZXQodHhUeXBlLCB0eXBlQ2FsbGJhY2tzKTtcbiAgICB9XG5cbiAgICBsZXQgc3RhdHVzQ2FsbGJhY2tzID0gdHlwZUNhbGxiYWNrcy5nZXQoc3RhdHVzKTtcbiAgICBpZiAoIXN0YXR1c0NhbGxiYWNrcykge1xuICAgICAgc3RhdHVzQ2FsbGJhY2tzID0gbmV3IE1hcDxzdHJpbmcsIENhbGxiYWNrRnVuY3Rpb24+KCk7XG4gICAgICB0eXBlQ2FsbGJhY2tzLnNldChzdGF0dXMsIHN0YXR1c0NhbGxiYWNrcyk7XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudENhbGxiYWNrID0gc3RhdHVzQ2FsbGJhY2tzLmdldChpZCk7XG4gICAgc3RhdHVzQ2FsbGJhY2tzLnNldChpZCwgY2FsbGJhY2spO1xuICAgIGlmIChjdXJyZW50Q2FsbGJhY2spIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgVGhlIHR4IHN0YXR1cyBjYWxsYmFjayBmdW5jdGlvbiBmb3IgdHlwZSBbJHt0eFR5cGV9XSBhbmQgc3RhdHVzIFske3N0YXR1c31dIGFuZCBpZCBbJHtpZH1dIGlzIHJlcGxhY2VkYFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcbiAgICAgICAgYE5ldyB0eCBzdGF0dXMgY2FsbGJhY2sgZnVuY3Rpb24gaXMgcmVnaXN0ZXJlZCBmb3IgdHlwZSBbJHt0eFR5cGV9XSBhbmQgc3RhdHVzIFske3N0YXR1c31dIGJ5IGlkIFske2lkfV1gXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogcmVtb3ZlcyBhIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB0eFR5cGVcbiAgICogQHBhcmFtIHN0YXR1c1xuICAgKiBAcGFyYW0gaWRcbiAgICovXG4gIHVucmVnaXN0ZXJDYWxsYmFjayA9IChcbiAgICB0eFR5cGU6IHN0cmluZyxcbiAgICBzdGF0dXM6IFRyYW5zYWN0aW9uU3RhdHVzLFxuICAgIGlkOiBzdHJpbmdcbiAgKTogdm9pZCA9PiB7XG4gICAgY29uc3QgY2FsbGJhY2tzID0gdGhpcy50eFR5cGVDYWxsYmFja3MuZ2V0KHR4VHlwZSk/LmdldChzdGF0dXMpO1xuICAgIGlmICghY2FsbGJhY2tzKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgYE5vIHR4IHN0YXR1cyBjYWxsYmFjayBmdW5jdGlvbiBpcyBzZXQgZm9yIHR5cGUgWyR7dHhUeXBlfV0gYW5kIHN0YXR1cyBbJHtzdGF0dXN9XSBhbmQgaWQgWyR7aWR9XWBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY2FsbGJhY2tzLmRlbGV0ZShpZCk7XG4gICAgdGhpcy5sb2dnZXIuaW5mbyhcbiAgICAgIGBSZW1vdmVkIHR4IHN0YXR1cyBjYWxsYmFjayBmdW5jdGlvbiBmb3IgdHlwZSBbJHt0eFR5cGV9XSBhbmQgc3RhdHVzIFske3N0YXR1c31dIGFuZCBpZCBbJHtpZH1dYFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIHJldHVybnMgY2hhaW4gbWFuYWdlciBmb3IgZ2l2ZW4gY2hhaW5cbiAgICogIHRocm93cyBlcnJvciBpZiBubyBtYW5hZ2VyIGlzIHJlZ2lzdGVyZWQgZm9yIGl0XG4gICAqIEBwYXJhbSBjaGFpblxuICAgKi9cbiAgcHJvdGVjdGVkIGdldENoYWluTWFuYWdlciA9IChjaGFpbjogc3RyaW5nKTogQWJzdHJhY3RQb3RDaGFpbk1hbmFnZXIgPT4ge1xuICAgIGNvbnN0IG1hbmFnZXIgPSB0aGlzLmNoYWlucy5nZXQoY2hhaW4pO1xuICAgIGlmICghbWFuYWdlcilcbiAgICAgIHRocm93IG5ldyBVbnJlZ2lzdGVyZWRDaGFpbihcbiAgICAgICAgYE5vIG1hbmFnZXIgaXMgcmVnaXN0ZXJlZCBmb3IgY2hhaW4gWyR7Y2hhaW59XWBcbiAgICAgICk7XG4gICAgcmV0dXJuIG1hbmFnZXI7XG4gIH07XG5cbiAgLyoqXG4gICAqIHNldHMgdGhlIHR4IGFzIGludmFsaWQgaWYgZW5vdWdoIGJsb2NrcyBpcyBwYXNzZWQgZnJvbSBsYXN0IGNoZWNrXG4gICAqIEBwYXJhbSB0eFxuICAgKi9cbiAgcHJvdGVjdGVkIHNldFRyYW5zYWN0aW9uQXNJbnZhbGlkID0gYXN5bmMgKFxuICAgIHR4OiBUcmFuc2FjdGlvbkVudGl0eVxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBtYW5hZ2VyID0gdGhpcy5nZXRDaGFpbk1hbmFnZXIodHguY2hhaW4pO1xuXG4gICAgY29uc3QgY3VycmVudEhlaWdodCA9IGF3YWl0IG1hbmFnZXIuZ2V0SGVpZ2h0KCk7XG4gICAgY29uc3QgcmVxdWlyZWRDb25maXJtYXRpb24gPSBtYW5hZ2VyLmdldFR4UmVxdWlyZWRDb25maXJtYXRpb24odHgudHhUeXBlKTtcblxuICAgIGlmIChjdXJyZW50SGVpZ2h0IC0gdHgubGFzdENoZWNrID49IHJlcXVpcmVkQ29uZmlybWF0aW9uKSB7XG4gICAgICBhd2FpdCB0aGlzLnNldFR4U3RhdHVzKHR4LCBUcmFuc2FjdGlvblN0YXR1cy5JTlZBTElEKTtcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oYFR4IFske3R4LnR4SWR9XSBpcyBpbnZhbGlkYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oXG4gICAgICAgIGBUeCBbJHtcbiAgICAgICAgICB0eC50eElkXG4gICAgICAgIH1dIHNlZW1zIGludmFsaWQuIFdhaXRpbmcgZm9yIGVub3VnaCBjb25maXJtYXRpb24gb2YgdGhpcyBwcm9wb3NpdGlvbiBbJHtcbiAgICAgICAgICBjdXJyZW50SGVpZ2h0IC0gdHgubGFzdENoZWNrXG4gICAgICAgIH0vJHtyZXF1aXJlZENvbmZpcm1hdGlvbn1dYFxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIHZhbGlkYXRlcyBhIHRyYW5zYWN0aW9uXG4gICAqIHJldHVybnMgdHJ1ZSBpZiBubyB2YWxpZGF0b3IgZnVuY3Rpb25zIGlzIHNldCBvciB0eCBpcyB2YWxpZFxuICAgKiBvdGhlcndpc2UgaGFuZGxlIHRoZSB0eCBhcyBpbnZhbGlkIGFuZCByZXR1cm5zIGZhbHNlXG4gICAqIEBwYXJhbSB0eFxuICAgKi9cbiAgcHJvdGVjdGVkIHZhbGlkYXRlVHggPSBhc3luYyAodHg6IFRyYW5zYWN0aW9uRW50aXR5KTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgY29uc3QgdmFsaWRhdG9ycyA9IHRoaXMudmFsaWRhdG9ycy5nZXQodHguY2hhaW4pPy5nZXQodHgudHhUeXBlKTtcbiAgICBpZiAodmFsaWRhdG9ycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyB0eCBpcyB2YWxpZCBzaW5jZSBubyB2YWxpZGF0b3IgaXMgZm91bmRcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgTm8gdmFsaWRhdG9yIGZ1bmN0aW9uIGlzIGZvdW5kIGZvciBjaGFpbiBbJHt0eC5jaGFpbn1dIGFuZCB0eXBlIFske3R4LnR4VHlwZX1dYFxuICAgICAgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGlkVmFsaWRhdG9yUGFpciBvZiB2YWxpZGF0b3JzKSB7XG4gICAgICBpZiAoKGF3YWl0IGlkVmFsaWRhdG9yUGFpclsxXSh0eCkpID09PSBmYWxzZSkge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICBgdHggWyR7dHgudHhJZH1dIGlzIHJlY29nbml6ZWQgYXMgaW52YWxpZCBieSB2YWxpZGF0b3IgWyR7aWRWYWxpZGF0b3JQYWlyWzBdfV1gXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0VHJhbnNhY3Rpb25Bc0ludmFsaWQodHgpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBjaGVja3MgYSB0cmFuc2FjdGlvbiBmb3Igc3VibWlzc2lvblxuICAgKiByZXR1cm5zIHRydWUgaWYgbm8gdmFsaWRhdG9yIGZ1bmN0aW9ucyBpcyBzZXQgb3IgYWxsIHZhbGlkYXRvcnMgYWxsb3cgdHggdG8gc3VibWl0XG4gICAqIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlXG4gICAqIEBwYXJhbSB0eFxuICAgKi9cbiAgcHJvdGVjdGVkIGlzU3VibWl0QWxsb3dlZCA9IGFzeW5jIChcbiAgICB0eDogVHJhbnNhY3Rpb25FbnRpdHlcbiAgKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgY29uc3QgdmFsaWRhdG9ycyA9IHRoaXMuc3VibWlzc2lvbkFsbG93YW5jZS5nZXQodHguY2hhaW4pO1xuICAgIGlmICh2YWxpZGF0b3JzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIHR4IGlzIGFsbG93ZWQgZm9yIHN1Ym1pc3Npb24gc2luY2Ugbm8gdmFsaWRhdG9yIGlzIGZvdW5kXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgYE5vIHN1Ym1pdCB2YWxpZGF0b3IgZnVuY3Rpb24gaXMgZm91bmQgZm9yIGNoYWluIFske3R4LmNoYWlufV1gXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGZvciAoY29uc3QgaWRWYWxpZGF0b3JQYWlyIG9mIHZhbGlkYXRvcnMpIHtcbiAgICAgIGlmICgoYXdhaXQgaWRWYWxpZGF0b3JQYWlyWzFdKHR4KSkgPT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgIGB0eCBbJHt0eC50eElkfV0gaXMgbm90IGFsbG93ZWQgZm9yIHN1Ym1pc3Npb24gYnkgc3VibWl0IHZhbGlkYXRvciBbJHtpZFZhbGlkYXRvclBhaXJbMF19XWBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICAvKipcbiAgICogdXBkYXRlcyB0aGUgc3RhdHVzIG9mIGEgdHhcbiAgICogQHBhcmFtIHR4S2V5IHR4IGlkIGFuZCBjaGFpblxuICAgKiBAcGFyYW0gc3RhdHVzIG5ldyBzdGF0dXNcbiAgICovXG4gIHByb3RlY3RlZCBzZXRUeFN0YXR1cyA9IGFzeW5jIChcbiAgICB0eDogVHJhbnNhY3Rpb25FbnRpdHksXG4gICAgc3RhdHVzOiBUcmFuc2FjdGlvblN0YXR1c1xuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBhd2FpdCB0aGlzLnR4UmVwb3NpdG9yeS51cGRhdGUoXG4gICAgICB7XG4gICAgICAgIHR4SWQ6IHR4LnR4SWQsXG4gICAgICAgIGNoYWluOiB0eC5jaGFpbixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHN0YXR1czogc3RhdHVzLFxuICAgICAgICBsYXN0U3RhdHVzVXBkYXRlOiB0aGlzLmN1cnJlbnRUaW1lKCksXG4gICAgICB9XG4gICAgKTtcbiAgICBjb25zdCBjYWxsYmFja3MgPSB0aGlzLnR4VHlwZUNhbGxiYWNrcy5nZXQodHgudHhUeXBlKT8uZ2V0KHN0YXR1cyk7XG4gICAgaWYgKGNhbGxiYWNrcykge1xuICAgICAgZm9yIChjb25zdCBpZENhbGxiYWNrUGFpciBvZiBjYWxsYmFja3MpIHtcbiAgICAgICAgaWRDYWxsYmFja1BhaXJbMV0odHgsIHN0YXR1cykuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyB0eCBbJHt0eC50eElkfV0gc3RhdHVzIGNoYW5nZSBpbiBjYWxsYmFjayBbJHtpZENhbGxiYWNrUGFpclswXX1dOiAke2V9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvciAmJiBlLnN0YWNrKSB0aGlzLmxvZ2dlci5kZWJ1ZyhlLnN0YWNrKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgYE5vIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIHNldCBmb3IgdHlwZSBbJHt0eC50eFR5cGV9XSBhbmQgc3RhdHVzIFske3N0YXR1c31dYFxuICAgICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogQHJldHVybnMgY3VycmVudCB0aW1lc3RhbXAgaW4gc2Vjb25kcyBhbmQgc3RyaW5nIGZvcm1hdFxuICAgKi9cbiAgcHJvdGVjdGVkIGN1cnJlbnRUaW1lID0gKCkgPT4gU3RyaW5nKE1hdGgucm91bmQoRGF0ZS5ub3coKSAvIDEwMDApKTtcblxuICAvKipcbiAgICogc3VibWl0cyB0aGUgc2lnbmVkIHRyYW5zYWN0aW9uIHRvIHRoZSBibG9ja2NoYWluXG4gICAqIEBwYXJhbSB0eFxuICAgKi9cbiAgcHJvdGVjdGVkIHByb2Nlc3NTaWduZWRUeCA9IGFzeW5jICh0eDogVHJhbnNhY3Rpb25FbnRpdHkpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoIShhd2FpdCB0aGlzLmlzU3VibWl0QWxsb3dlZCh0eCkpKSByZXR1cm47XG4gICAgY29uc3QgbWFuYWdlciA9IHRoaXMuZ2V0Q2hhaW5NYW5hZ2VyKHR4LmNoYWluKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbWFuYWdlci5zdWJtaXRUcmFuc2FjdGlvbih0eC5zZXJpYWxpemVkVHgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgIGBGYWlsZWQgdG8gc3VibWl0IHR4IFske3R4LnR4SWR9XSB0byBjaGFpbiBbJHt0eC5jaGFpbn1dOiAke2V9YFxuICAgICAgKTtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5zdGFjaykgdGhpcy5sb2dnZXIud2FybihlLnN0YWNrKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5zZXRUeFN0YXR1cyh0eCwgVHJhbnNhY3Rpb25TdGF0dXMuU0VOVCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIHByb2Nlc3NlcyB0aGUgc2VudCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gdHhcbiAgICovXG4gIHByb3RlY3RlZCBwcm9jZXNzZXNTZW50VHggPSBhc3luYyAodHg6IFRyYW5zYWN0aW9uRW50aXR5KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgbWFuYWdlciA9IHRoaXMuZ2V0Q2hhaW5NYW5hZ2VyKHR4LmNoYWluKTtcblxuICAgIGNvbnN0IHR4Q29uZmlybWF0aW9uID0gYXdhaXQgbWFuYWdlci5nZXRUeENvbmZpcm1hdGlvbih0eC50eElkKTtcbiAgICBjb25zdCByZXF1aXJlZENvbmZpcm1hdGlvbiA9IG1hbmFnZXIuZ2V0VHhSZXF1aXJlZENvbmZpcm1hdGlvbih0eC50eFR5cGUpO1xuXG4gICAgaWYgKHR4Q29uZmlybWF0aW9uID49IHJlcXVpcmVkQ29uZmlybWF0aW9uKSB7XG4gICAgICAvLyB0eCBpcyBjb25maXJtZWQgZW5vdWdoXG4gICAgICBhd2FpdCB0aGlzLnNldFR4U3RhdHVzKHR4LCBUcmFuc2FjdGlvblN0YXR1cy5DT01QTEVURUQpO1xuICAgIH0gZWxzZSBpZiAodHhDb25maXJtYXRpb24gPT09IC0xKSB7XG4gICAgICAvLyB0eCBpcyBub3QgbWluZWQsIGNoZWNraW5nIG1lbXBvb2wuLi5cbiAgICAgIGlmIChhd2FpdCBtYW5hZ2VyLmlzVHhJbk1lbXBvb2wodHgudHhJZCkpIHtcbiAgICAgICAgLy8gdHggaXMgaW4gbWVtcG9vbCwgdXBkYXRpbmcgbGFzdCBjaGVjay4uLlxuICAgICAgICBjb25zdCBoZWlnaHQgPSBhd2FpdCBtYW5hZ2VyLmdldEhlaWdodCgpO1xuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVR4TGFzdENoZWNrKHR4LnR4SWQsIHR4LmNoYWluLCBoZWlnaHQpO1xuICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKGBUeCBbJHt0eC50eElkfV0gaXMgaW4gbWVtcG9vbGApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdHggaXMgbm90IGluIG1lbXBvb2wsIGNoZWNraW5nIGlmIHR4IGlzIHN0aWxsIHZhbGlkXG4gICAgICAgIGNvbnN0IGlzVmFsaWRUeCA9IGF3YWl0IG1hbmFnZXIuaXNUeFZhbGlkKFxuICAgICAgICAgIHR4LnNlcmlhbGl6ZWRUeCxcbiAgICAgICAgICBTaWduaW5nU3RhdHVzLlNpZ25lZFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBpc1ZhbGlkVG9UeXBlID0gYXdhaXQgdGhpcy52YWxpZGF0ZVR4KHR4KTtcblxuICAgICAgICBpZiAoaXNWYWxpZFR4ICYmIGlzVmFsaWRUb1R5cGUpIHtcbiAgICAgICAgICAvLyB0eCBpcyB2YWxpZC4gcmVzZW5kaW5nLi4uXG4gICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcbiAgICAgICAgICAgIGBUeCBbJHt0eC50eElkfV0gaXMgc3RpbGwgdmFsaWQuIEF0dGVtcHRpbmcgcmVzZW5kLi4uYFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGF3YWl0IHRoaXMuaXNTdWJtaXRBbGxvd2VkKHR4KSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYXdhaXQgbWFuYWdlci5zdWJtaXRUcmFuc2FjdGlvbih0eC5zZXJpYWxpemVkVHgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgIGBGYWlsZWQgdG8gc3VibWl0IHR4IFske3R4LnR4SWR9XSB0byBjaGFpbiBbJHt0eC5jaGFpbn1dOiAke2V9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yICYmIGUuc3RhY2spIHRoaXMubG9nZ2VyLndhcm4oZS5zdGFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHR4IHNlZW1zIGludmFsaWQuIHJlc2V0IHN0YXR1cyBpZiBlbm91Z2ggYmxvY2tzIHBhc3QuXG4gICAgICAgICAgYXdhaXQgdGhpcy5zZXRUcmFuc2FjdGlvbkFzSW52YWxpZCh0eCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdHggaXMgbWluZWQsIGJ1dCBpcyBub3QgY29uZmlybWVkIGVub3VnaCwgdXBkYXRpbmcgbGFzdCBjaGVjay4uLlxuICAgICAgY29uc3QgaGVpZ2h0ID0gYXdhaXQgbWFuYWdlci5nZXRIZWlnaHQoKTtcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlVHhMYXN0Q2hlY2sodHgudHhJZCwgdHguY2hhaW4sIGhlaWdodCk7XG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICBgVHggWyR7dHgudHhJZH1dIGlzIGluIGNvbmZpcm1hdGlvbiBwcm9jZXNzIFske3R4Q29uZmlybWF0aW9ufS8ke3JlcXVpcmVkQ29uZmlybWF0aW9ufV1gXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogcnVucyBhbGwgam9icyBvZiBUeFBvdFxuICAgKiAtIHByb2Nlc3Mgc2lnbmVkIHR4c1xuICAgKiAtIHByb2Nlc3Mgc2VudCB0eHNcbiAgICovXG4gIHVwZGF0ZSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAvLyBmZXRjaCBzaWduZWQgYW5kIHNlbnQgdHhzXG4gICAgY29uc3Qgc2lnbmVkVHhzID0gYXdhaXQgdGhpcy5nZXRUeHNCeVN0YXR1cyhUcmFuc2FjdGlvblN0YXR1cy5TSUdORUQpO1xuICAgIGNvbnN0IHNlbnRUeHMgPSBhd2FpdCB0aGlzLmdldFR4c0J5U3RhdHVzKFRyYW5zYWN0aW9uU3RhdHVzLlNFTlQpO1xuXG4gICAgLy8gcHJvY2VzcyBzaWduZWQgdHhzXG4gICAgZm9yIChjb25zdCB0eCBvZiBzaWduZWRUeHMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc1NpZ25lZFR4KHR4KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICBgQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0eCBbJHt0eC50eElkfV0gd2l0aCBzdGF0dXMgWyR7VHJhbnNhY3Rpb25TdGF0dXMuU0lHTkVEfV06ICR7ZX1gXG4gICAgICAgICk7XG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5zdGFjaykgdGhpcy5sb2dnZXIud2FybihlLnN0YWNrKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICBgUHJvY2Vzc2VkIFske3NpZ25lZFR4cy5sZW5ndGh9XSB0eHMgd2l0aCBzdGF0dXMgWyR7VHJhbnNhY3Rpb25TdGF0dXMuU0lHTkVEfV1gXG4gICAgKTtcblxuICAgIC8vIHByb2Nlc3Mgc2VudCB0eHNcbiAgICBmb3IgKGNvbnN0IHR4IG9mIHNlbnRUeHMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc2VzU2VudFR4KHR4KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICBgQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0eCBbJHt0eC50eElkfV0gd2l0aCBzdGF0dXMgWyR7VHJhbnNhY3Rpb25TdGF0dXMuU0VOVH1dOiAke2V9YFxuICAgICAgICApO1xuICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yICYmIGUuc3RhY2spIHRoaXMubG9nZ2VyLndhcm4oZS5zdGFjayk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgYFByb2Nlc3NlZCBbJHtzZW50VHhzLmxlbmd0aH1dIHR4cyB3aXRoIHN0YXR1cyBbJHtUcmFuc2FjdGlvblN0YXR1cy5TRU5UfV1gXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogZ2V0cyB0cmFuc2FjdGlvbnMgYnkgc3RhdHVzXG4gICAqIEBwYXJhbSBzdGF0dXNcbiAgICogQHBhcmFtIHZhbGlkYXRlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXRUeHNCeVN0YXR1cyA9IGFzeW5jIChcbiAgICBzdGF0dXM6IFRyYW5zYWN0aW9uU3RhdHVzLFxuICAgIHZhbGlkYXRlID0gZmFsc2VcbiAgKTogUHJvbWlzZTxBcnJheTxUcmFuc2FjdGlvbkVudGl0eT4+ID0+IHtcbiAgICBjb25zdCB0eHMgPSBhd2FpdCB0aGlzLnR4UmVwb3NpdG9yeS5maW5kKHtcbiAgICAgIHdoZXJlOiB7XG4gICAgICAgIHN0YXR1czogc3RhdHVzLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBpZiAoIXZhbGlkYXRlKSByZXR1cm4gdHhzO1xuXG4gICAgLy8gdmFsaWRhdGUgdGhlIHRyYW5zYWN0aW9uc1xuICAgIGNvbnN0IHZhbGlkVHhzOiBBcnJheTxUcmFuc2FjdGlvbkVudGl0eT4gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHR4IG9mIHR4cykge1xuICAgICAgaWYgKGF3YWl0IHRoaXMudmFsaWRhdGVUeCh0eCkpIHZhbGlkVHhzLnB1c2godHgpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsaWRUeHM7XG4gIH07XG5cbiAgLyoqXG4gICAqIGluc2VydHMgYSBuZXcgdHJhbnNhY3Rpb24gaW50byBkYlxuICAgKiAgIE5vdGU6IG1ha2Ugc3VyZSB0byBzZXQgYGxhc3RDaGVja2AgZmllbGQgaWYgaW5pdGlhbFN0YXR1cyBpcyBgc2lnbmVkYCBvciBgc2VudGBcbiAgICogQHBhcmFtIHR4SWRcbiAgICogQHBhcmFtIGNoYWluXG4gICAqIEBwYXJhbSB0eFR5cGVcbiAgICogQHBhcmFtIHJlcXVpcmVkU2lnblxuICAgKiBAcGFyYW0gc2VyaWFsaXplZFR4XG4gICAqIEBwYXJhbSBpbml0aWFsU3RhdHVzXG4gICAqIEBwYXJhbSBsYXN0Q2hlY2sgbGFzdCBibG9ja2NoYWluIGhlaWdodCB0aGF0IHR4IHdhcyB2YWxpZFxuICAgKiBAcGFyYW0gZXh0cmFcbiAgICogQHBhcmFtIGV4dHJhMlxuICAgKi9cbiAgYWRkVHggPSBhc3luYyAoXG4gICAgdHhJZDogc3RyaW5nLFxuICAgIGNoYWluOiBzdHJpbmcsXG4gICAgdHhUeXBlOiBzdHJpbmcsXG4gICAgcmVxdWlyZWRTaWduOiBudW1iZXIsXG4gICAgc2VyaWFsaXplZFR4OiBzdHJpbmcsXG4gICAgaW5pdGlhbFN0YXR1cyA9IFRyYW5zYWN0aW9uU3RhdHVzLkFQUFJPVkVELFxuICAgIGxhc3RDaGVjayA9IDAsXG4gICAgZXh0cmE/OiBzdHJpbmcgfCBudWxsLFxuICAgIGV4dHJhMj86IHN0cmluZyB8IG51bGxcbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgYXdhaXQgdGhpcy50eFJlcG9zaXRvcnkuaW5zZXJ0KHtcbiAgICAgIHR4SWQ6IHR4SWQsXG4gICAgICBjaGFpbjogY2hhaW4sXG4gICAgICB0eFR5cGU6IHR4VHlwZSxcbiAgICAgIHN0YXR1czogaW5pdGlhbFN0YXR1cyxcbiAgICAgIHJlcXVpcmVkU2lnbjogcmVxdWlyZWRTaWduLFxuICAgICAgbGFzdENoZWNrOiBsYXN0Q2hlY2ssXG4gICAgICBsYXN0U3RhdHVzVXBkYXRlOiB0aGlzLmN1cnJlbnRUaW1lKCksXG4gICAgICBmYWlsZWRJblNpZ246IGZhbHNlLFxuICAgICAgc2lnbkZhaWxlZENvdW50OiAwLFxuICAgICAgc2VyaWFsaXplZFR4OiBzZXJpYWxpemVkVHgsXG4gICAgICBleHRyYTogZXh0cmEsXG4gICAgICBleHRyYTI6IGV4dHJhMixcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogdXBkYXRlcyB0aGUgc3RhdHVzIG9mIGEgdHhcbiAgICogQHBhcmFtIHR4SWRcbiAgICogQHBhcmFtIGNoYWluXG4gICAqIEBwYXJhbSBzdGF0dXMgbmV3IHN0YXR1c1xuICAgKi9cbiAgc2V0VHhTdGF0dXNCeUlkID0gYXN5bmMgKFxuICAgIHR4SWQ6IHN0cmluZyxcbiAgICBjaGFpbjogc3RyaW5nLFxuICAgIHN0YXR1czogVHJhbnNhY3Rpb25TdGF0dXNcbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgdHggPSBhd2FpdCB0aGlzLnR4UmVwb3NpdG9yeS5maW5kT25lT3JGYWlsKHtcbiAgICAgIHdoZXJlOiB7IHR4SWQsIGNoYWluIH0sXG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy5zZXRUeFN0YXR1cyh0eCwgc3RhdHVzKTtcbiAgfTtcblxuICAvKipcbiAgICogdXBkYXRlcyB0eCBpbmZvIHdoZW4gZmFpbGVkIGluIHNpZ24gcHJvY2Vzc1xuICAgKiBAcGFyYW0gdHhJZFxuICAgKiBAcGFyYW0gY2hhaW5cbiAgICovXG4gIHNldFR4QXNTaWduRmFpbGVkID0gYXN5bmMgKHR4SWQ6IHN0cmluZywgY2hhaW46IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGF3YWl0IHRoaXMudHhSZXBvc2l0b3J5LnVwZGF0ZShcbiAgICAgIHtcbiAgICAgICAgdHhJZDogdHhJZCxcbiAgICAgICAgY2hhaW46IGNoYWluLFxuICAgICAgICBzdGF0dXM6IFRyYW5zYWN0aW9uU3RhdHVzLklOX1NJR04sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzdGF0dXM6IFRyYW5zYWN0aW9uU3RhdHVzLlNJR05fRkFJTEVELFxuICAgICAgICBsYXN0U3RhdHVzVXBkYXRlOiB0aGlzLmN1cnJlbnRUaW1lKCksXG4gICAgICAgIHNpZ25GYWlsZWRDb3VudDogKCkgPT4gJ1wic2lnbkZhaWxlZENvdW50XCIgKyAxJyxcbiAgICAgICAgZmFpbGVkSW5TaWduOiB0cnVlLFxuICAgICAgfVxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIHVwZGF0ZXMgdGhlIHR4IGFuZCBzZXQgc3RhdHVzIGFzIHNpZ25lZFxuICAgKiBAcGFyYW0gdHhJZFxuICAgKiBAcGFyYW0gY2hhaW5cbiAgICogQHBhcmFtIHNlcmlhbGl6ZWRUeFxuICAgKiBAcGFyYW0gY3VycmVudEhlaWdodCBjdXJyZW50IGhlaWdodCBvZiB0aGUgYmxvY2tjaGFpblxuICAgKiBAcGFyYW0gZXh0cmFcbiAgICogQHBhcmFtIGV4dHJhMlxuICAgKi9cbiAgc2V0VHhBc1NpZ25lZCA9IGFzeW5jIChcbiAgICB0eElkOiBzdHJpbmcsXG4gICAgY2hhaW46IHN0cmluZyxcbiAgICBzZXJpYWxpemVkVHg6IHN0cmluZyxcbiAgICBjdXJyZW50SGVpZ2h0OiBudW1iZXIsXG4gICAgZXh0cmE/OiBzdHJpbmcsXG4gICAgZXh0cmEyPzogc3RyaW5nXG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IHVwZGF0ZWRGaWVsZHM6IFBhcnRpYWw8VHJhbnNhY3Rpb25FbnRpdHk+ID0ge1xuICAgICAgc2VyaWFsaXplZFR4OiBzZXJpYWxpemVkVHgsXG4gICAgICBzdGF0dXM6IFRyYW5zYWN0aW9uU3RhdHVzLlNJR05FRCxcbiAgICAgIGxhc3RTdGF0dXNVcGRhdGU6IHRoaXMuY3VycmVudFRpbWUoKSxcbiAgICAgIGxhc3RDaGVjazogY3VycmVudEhlaWdodCxcbiAgICB9O1xuICAgIGlmIChleHRyYSkgdXBkYXRlZEZpZWxkcy5leHRyYSA9IGV4dHJhO1xuICAgIGlmIChleHRyYTIpIHVwZGF0ZWRGaWVsZHMuZXh0cmEyID0gZXh0cmEyO1xuXG4gICAgYXdhaXQgdGhpcy50eFJlcG9zaXRvcnkudXBkYXRlKHsgdHhJZCwgY2hhaW4gfSwgdXBkYXRlZEZpZWxkcyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIHVwZGF0ZXMgbGFzdCBjaGVjayB2YWx1ZSBvZiBhIHR4XG4gICAqIEBwYXJhbSB0eElkXG4gICAqIEBwYXJhbSBjaGFpblxuICAgKiBAcGFyYW0gY3VycmVudEhlaWdodCBjdXJyZW50IGhlaWdodCBvZiB0aGUgYmxvY2tjaGFpblxuICAgKi9cbiAgdXBkYXRlVHhMYXN0Q2hlY2sgPSBhc3luYyAoXG4gICAgdHhJZDogc3RyaW5nLFxuICAgIGNoYWluOiBzdHJpbmcsXG4gICAgY3VycmVudEhlaWdodDogbnVtYmVyXG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGF3YWl0IHRoaXMudHhSZXBvc2l0b3J5LnVwZGF0ZShcbiAgICAgIHsgdHhJZCwgY2hhaW4gfSxcbiAgICAgIHsgbGFzdENoZWNrOiBjdXJyZW50SGVpZ2h0IH1cbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiB1cGRhdGVzIGZhaWxlZEluU2lnbiBmaWVsZCBvZiBhIHRyYW5zYWN0aW9uIHRvIGZhbHNlXG4gICAqIEBwYXJhbSB0eElkXG4gICAqIEBwYXJhbSBjaGFpblxuICAgKi9cbiAgcmVzZXRGYWlsZWRJblNpZ24gPSBhc3luYyAodHhJZDogc3RyaW5nLCBjaGFpbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgYXdhaXQgdGhpcy50eFJlcG9zaXRvcnkudXBkYXRlKFxuICAgICAgeyB0eElkLCBjaGFpbiB9LFxuICAgICAge1xuICAgICAgICBmYWlsZWRJblNpZ246IGZhbHNlLFxuICAgICAgfVxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIHVwZGF0ZXMgcmVxdWlyZWRTaWduIGZpZWxkIG9mIGEgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHR4SWRcbiAgICogQHBhcmFtIGNoYWluXG4gICAqIEBwYXJhbSByZXF1aXJlZFNpZ25cbiAgICovXG4gIHVwZGF0ZVJlcXVpcmVkU2lnbiA9IGFzeW5jIChcbiAgICB0eElkOiBzdHJpbmcsXG4gICAgY2hhaW46IHN0cmluZyxcbiAgICByZXF1aXJlZFNpZ246IG51bWJlclxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBhd2FpdCB0aGlzLnR4UmVwb3NpdG9yeS51cGRhdGUoXG4gICAgICB7IHR4SWQsIGNoYWluIH0sXG4gICAgICB7XG4gICAgICAgIHJlcXVpcmVkU2lnbjogcmVxdWlyZWRTaWduLFxuICAgICAgfVxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIGdldHMgdGhlIHRyYW5zYWN0aW9uIGJ5IGl0cyBpZCBhbmQgY2hhaW5cbiAgICogQHBhcmFtIHR4SWRcbiAgICogQHBhcmFtIGNoYWluXG4gICAqL1xuICBnZXRUeEJ5S2V5ID0gYXN5bmMgKFxuICAgIHR4SWQ6IHN0cmluZyxcbiAgICBjaGFpbjogc3RyaW5nXG4gICk6IFByb21pc2U8VHJhbnNhY3Rpb25FbnRpdHkgfCBudWxsPiA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMudHhSZXBvc2l0b3J5LmZpbmRPbmUoe1xuICAgICAgd2hlcmU6IHsgdHhJZCwgY2hhaW4gfSxcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogQHJldHVybnMgdGhlIHRyYW5zYWN0aW9ucyB3aXRoIHZhbGlkIHN0YXR1c1xuICAgKi9cbiAgZ2V0VHhzUXVlcnkgPSAoXG4gICAgb3B0aW9uczogQXJyYXk8VHhPcHRpb25zPiA9IFtdXG4gICk6IFByb21pc2U8VHJhbnNhY3Rpb25FbnRpdHlbXT4gPT4ge1xuICAgIHJldHVybiB0aGlzLnR4UmVwb3NpdG9yeS5maW5kKHtcbiAgICAgIHdoZXJlOiBvcHRpb25zLm1hcCh0eE9wdGlvblRvQ2xhdXNlKSxcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogdXBkYXRlcyBleHRyYSBmaWVsZHMgb2YgYSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gdHhJZFxuICAgKiBAcGFyYW0gY2hhaW5cbiAgICogQHBhcmFtIGV4dHJhXG4gICAqIEBwYXJhbSBleHRyYTJcbiAgICovXG4gIHVwZGF0ZUV4dHJhID0gYXN5bmMgKFxuICAgIHR4SWQ6IHN0cmluZyxcbiAgICBjaGFpbjogc3RyaW5nLFxuICAgIGV4dHJhPzogc3RyaW5nIHwgbnVsbCxcbiAgICBleHRyYTI/OiBzdHJpbmcgfCBudWxsXG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmIChleHRyYSA9PT0gdW5kZWZpbmVkICYmIGV4dHJhMiA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgYXdhaXQgdGhpcy50eFJlcG9zaXRvcnkudXBkYXRlKHsgdHhJZCwgY2hhaW4gfSwgeyBleHRyYSwgZXh0cmEyIH0pO1xuICB9O1xufVxuIl19
@@ -27,7 +27,7 @@ export interface TxOptions {
27
27
  txType?: string;
28
28
  status?: FieldOption<TransactionStatus>;
29
29
  failedInSign?: boolean;
30
- extra?: FieldValue<string>;
30
+ extra?: FieldValue<string | null>;
31
31
  }
32
32
  export declare class UnregisteredChain extends Error {
33
33
  constructor(msg: string);
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../lib/transaction/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAErE,MAAM,MAAM,0BAA0B,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAChE,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;AAE/E,MAAM,MAAM,iBAAiB,GAAG,CAAC,EAAE,EAAE,iBAAiB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAC5E,MAAM,MAAM,gBAAgB,GAAG,CAC7B,EAAE,EAAE,iBAAiB,EACrB,SAAS,EAAE,iBAAiB,KACzB,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,oBAAY,iBAAiB;IAC3B,QAAQ,aAAa;IACrB,OAAO,YAAY;IACnB,WAAW,gBAAgB;IAC3B,MAAM,WAAW;IACjB,IAAI,SAAS;IACb,OAAO,YAAY;IACnB,SAAS,cAAc;CACxB;AAED,oBAAY,aAAa;IACvB,MAAM,IAAA;IACN,QAAQ,IAAA;CACT;AAED,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AACzC,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC,iBAAiB,CAAC,CAAC;IACxC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;CAC5B;AAED,qBAAa,iBAAkB,SAAQ,KAAK;gBAC9B,GAAG,EAAE,MAAM;CAGxB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../lib/transaction/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAErE,MAAM,MAAM,0BAA0B,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAChE,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;AAE/E,MAAM,MAAM,iBAAiB,GAAG,CAAC,EAAE,EAAE,iBAAiB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAC5E,MAAM,MAAM,gBAAgB,GAAG,CAC7B,EAAE,EAAE,iBAAiB,EACrB,SAAS,EAAE,iBAAiB,KACzB,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,oBAAY,iBAAiB;IAC3B,QAAQ,aAAa;IACrB,OAAO,YAAY;IACnB,WAAW,gBAAgB;IAC3B,MAAM,WAAW;IACjB,IAAI,SAAS;IACb,OAAO,YAAY;IACnB,SAAS,cAAc;CACxB;AAED,oBAAY,aAAa;IACvB,MAAM,IAAA;IACN,QAAQ,IAAA;CACT;AAED,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AACzC,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC,iBAAiB,CAAC,CAAC;IACxC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACnC;AAED,qBAAa,iBAAkB,SAAQ,KAAK;gBAC9B,GAAG,EAAE,MAAM;CAGxB"}
@@ -18,4 +18,4 @@ export class UnregisteredChain extends Error {
18
18
  super('UnregisteredChain: ' + msg);
19
19
  }
20
20
  }
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvdHJhbnNhY3Rpb24vdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBV0EsTUFBTSxDQUFOLElBQVksaUJBUVg7QUFSRCxXQUFZLGlCQUFpQjtJQUMzQiwwQ0FBcUIsQ0FBQTtJQUNyQix3Q0FBbUIsQ0FBQTtJQUNuQixnREFBMkIsQ0FBQTtJQUMzQixzQ0FBaUIsQ0FBQTtJQUNqQixrQ0FBYSxDQUFBO0lBQ2Isd0NBQW1CLENBQUE7SUFDbkIsNENBQXVCLENBQUE7QUFDekIsQ0FBQyxFQVJXLGlCQUFpQixLQUFqQixpQkFBaUIsUUFRNUI7QUFFRCxNQUFNLENBQU4sSUFBWSxhQUdYO0FBSEQsV0FBWSxhQUFhO0lBQ3ZCLHFEQUFNLENBQUE7SUFDTix5REFBUSxDQUFBO0FBQ1YsQ0FBQyxFQUhXLGFBQWEsS0FBYixhQUFhLFFBR3hCO0FBaUJELE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxLQUFLO0lBQzFDLFlBQVksR0FBVztRQUNyQixLQUFLLENBQUMscUJBQXFCLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDckMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHJhbnNhY3Rpb25FbnRpdHkgfSBmcm9tICcuLi9kYi9lbnRpdGllcy9UcmFuc2FjdGlvbkVudGl0eSc7XG5cbmV4cG9ydCB0eXBlIENoYWluUmVxdWlyZWRDb25maXJtYXRpb25zID0gUmVjb3JkPHN0cmluZywgbnVtYmVyPjsgLy8gdHggdHlwZSA9PiByZXF1aXJlZCBudW1iZXJcbmV4cG9ydCB0eXBlIFJlcXVpcmVkQ29uZmlybWF0aW9ucyA9IFJlY29yZDxzdHJpbmcsIENoYWluUmVxdWlyZWRDb25maXJtYXRpb25zPjtcblxuZXhwb3J0IHR5cGUgVmFsaWRhdG9yRnVuY3Rpb24gPSAodHg6IFRyYW5zYWN0aW9uRW50aXR5KSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuZXhwb3J0IHR5cGUgQ2FsbGJhY2tGdW5jdGlvbiA9IChcbiAgdHg6IFRyYW5zYWN0aW9uRW50aXR5LFxuICBuZXdTdGF0dXM6IFRyYW5zYWN0aW9uU3RhdHVzXG4pID0+IFByb21pc2U8dm9pZD47XG5cbmV4cG9ydCBlbnVtIFRyYW5zYWN0aW9uU3RhdHVzIHtcbiAgQVBQUk9WRUQgPSAnYXBwcm92ZWQnLFxuICBJTl9TSUdOID0gJ2luLXNpZ24nLFxuICBTSUdOX0ZBSUxFRCA9ICdzaWduLWZhaWxlZCcsXG4gIFNJR05FRCA9ICdzaWduZWQnLFxuICBTRU5UID0gJ3NlbnQnLFxuICBJTlZBTElEID0gJ2ludmFsaWQnLFxuICBDT01QTEVURUQgPSAnY29tcGxldGVkJyxcbn1cblxuZXhwb3J0IGVudW0gU2lnbmluZ1N0YXR1cyB7XG4gIFNpZ25lZCxcbiAgVW5TaWduZWQsXG59XG5cbmV4cG9ydCB0eXBlIEZpZWxkVmFsdWU8VD4gPSBUIHwgQXJyYXk8VD47XG5leHBvcnQgaW50ZXJmYWNlIEZpZWxkT3B0aW9uPFQ+IHtcbiAgbm90OiBib29sZWFuO1xuICB2YWx1ZTogRmllbGRWYWx1ZTxUPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUeE9wdGlvbnMge1xuICB0eElkPzogRmllbGRWYWx1ZTxzdHJpbmc+O1xuICBjaGFpbj86IHN0cmluZztcbiAgdHhUeXBlPzogc3RyaW5nO1xuICBzdGF0dXM/OiBGaWVsZE9wdGlvbjxUcmFuc2FjdGlvblN0YXR1cz47XG4gIGZhaWxlZEluU2lnbj86IGJvb2xlYW47XG4gIGV4dHJhPzogRmllbGRWYWx1ZTxzdHJpbmc+O1xufVxuXG5leHBvcnQgY2xhc3MgVW5yZWdpc3RlcmVkQ2hhaW4gZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nKSB7XG4gICAgc3VwZXIoJ1VucmVnaXN0ZXJlZENoYWluOiAnICsgbXNnKTtcbiAgfVxufVxuIl19
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvdHJhbnNhY3Rpb24vdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBV0EsTUFBTSxDQUFOLElBQVksaUJBUVg7QUFSRCxXQUFZLGlCQUFpQjtJQUMzQiwwQ0FBcUIsQ0FBQTtJQUNyQix3Q0FBbUIsQ0FBQTtJQUNuQixnREFBMkIsQ0FBQTtJQUMzQixzQ0FBaUIsQ0FBQTtJQUNqQixrQ0FBYSxDQUFBO0lBQ2Isd0NBQW1CLENBQUE7SUFDbkIsNENBQXVCLENBQUE7QUFDekIsQ0FBQyxFQVJXLGlCQUFpQixLQUFqQixpQkFBaUIsUUFRNUI7QUFFRCxNQUFNLENBQU4sSUFBWSxhQUdYO0FBSEQsV0FBWSxhQUFhO0lBQ3ZCLHFEQUFNLENBQUE7SUFDTix5REFBUSxDQUFBO0FBQ1YsQ0FBQyxFQUhXLGFBQWEsS0FBYixhQUFhLFFBR3hCO0FBaUJELE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxLQUFLO0lBQzFDLFlBQVksR0FBVztRQUNyQixLQUFLLENBQUMscUJBQXFCLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDckMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHJhbnNhY3Rpb25FbnRpdHkgfSBmcm9tICcuLi9kYi9lbnRpdGllcy9UcmFuc2FjdGlvbkVudGl0eSc7XG5cbmV4cG9ydCB0eXBlIENoYWluUmVxdWlyZWRDb25maXJtYXRpb25zID0gUmVjb3JkPHN0cmluZywgbnVtYmVyPjsgLy8gdHggdHlwZSA9PiByZXF1aXJlZCBudW1iZXJcbmV4cG9ydCB0eXBlIFJlcXVpcmVkQ29uZmlybWF0aW9ucyA9IFJlY29yZDxzdHJpbmcsIENoYWluUmVxdWlyZWRDb25maXJtYXRpb25zPjtcblxuZXhwb3J0IHR5cGUgVmFsaWRhdG9yRnVuY3Rpb24gPSAodHg6IFRyYW5zYWN0aW9uRW50aXR5KSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuZXhwb3J0IHR5cGUgQ2FsbGJhY2tGdW5jdGlvbiA9IChcbiAgdHg6IFRyYW5zYWN0aW9uRW50aXR5LFxuICBuZXdTdGF0dXM6IFRyYW5zYWN0aW9uU3RhdHVzXG4pID0+IFByb21pc2U8dm9pZD47XG5cbmV4cG9ydCBlbnVtIFRyYW5zYWN0aW9uU3RhdHVzIHtcbiAgQVBQUk9WRUQgPSAnYXBwcm92ZWQnLFxuICBJTl9TSUdOID0gJ2luLXNpZ24nLFxuICBTSUdOX0ZBSUxFRCA9ICdzaWduLWZhaWxlZCcsXG4gIFNJR05FRCA9ICdzaWduZWQnLFxuICBTRU5UID0gJ3NlbnQnLFxuICBJTlZBTElEID0gJ2ludmFsaWQnLFxuICBDT01QTEVURUQgPSAnY29tcGxldGVkJyxcbn1cblxuZXhwb3J0IGVudW0gU2lnbmluZ1N0YXR1cyB7XG4gIFNpZ25lZCxcbiAgVW5TaWduZWQsXG59XG5cbmV4cG9ydCB0eXBlIEZpZWxkVmFsdWU8VD4gPSBUIHwgQXJyYXk8VD47XG5leHBvcnQgaW50ZXJmYWNlIEZpZWxkT3B0aW9uPFQ+IHtcbiAgbm90OiBib29sZWFuO1xuICB2YWx1ZTogRmllbGRWYWx1ZTxUPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUeE9wdGlvbnMge1xuICB0eElkPzogRmllbGRWYWx1ZTxzdHJpbmc+O1xuICBjaGFpbj86IHN0cmluZztcbiAgdHhUeXBlPzogc3RyaW5nO1xuICBzdGF0dXM/OiBGaWVsZE9wdGlvbjxUcmFuc2FjdGlvblN0YXR1cz47XG4gIGZhaWxlZEluU2lnbj86IGJvb2xlYW47XG4gIGV4dHJhPzogRmllbGRWYWx1ZTxzdHJpbmcgfCBudWxsPjtcbn1cblxuZXhwb3J0IGNsYXNzIFVucmVnaXN0ZXJlZENoYWluIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZykge1xuICAgIHN1cGVyKCdVbnJlZ2lzdGVyZWRDaGFpbjogJyArIG1zZyk7XG4gIH1cbn1cbiJdfQ==
@@ -4,5 +4,7 @@ import { TxOptions } from './types';
4
4
  * @param options
5
5
  * @returns
6
6
  */
7
- export declare const txOptionToClause: (options: TxOptions) => Record<string, any>;
8
- //# sourceMappingURL=utils.d.ts.map
7
+ export declare const txOptionToClause: (
8
+ options: TxOptions
9
+ ) => Record<string, any>;
10
+ //# sourceMappingURL=utils.d.ts.map