@bitgo-beta/sdk-coin-sui 3.0.3-beta.98 → 3.0.3-beta.981

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 (136) hide show
  1. package/CHANGELOG.md +817 -0
  2. package/dist/src/index.d.ts +1 -0
  3. package/dist/src/index.d.ts.map +1 -1
  4. package/dist/src/index.js +7 -2
  5. package/dist/src/lib/compareTransactionBlocks.js +2 -3
  6. package/dist/src/lib/constants.d.ts +9 -2
  7. package/dist/src/lib/constants.d.ts.map +1 -1
  8. package/dist/src/lib/constants.js +18 -2
  9. package/dist/src/lib/customTransaction.d.ts +57 -0
  10. package/dist/src/lib/customTransaction.d.ts.map +1 -0
  11. package/dist/src/lib/customTransaction.js +159 -0
  12. package/dist/src/lib/customTransactionBuilder.d.ts +46 -0
  13. package/dist/src/lib/customTransactionBuilder.d.ts.map +1 -0
  14. package/dist/src/lib/customTransactionBuilder.js +117 -0
  15. package/dist/src/lib/iface.d.ts +76 -10
  16. package/dist/src/lib/iface.d.ts.map +1 -1
  17. package/dist/src/lib/iface.js +40 -5
  18. package/dist/src/lib/index.d.ts +8 -0
  19. package/dist/src/lib/index.d.ts.map +1 -1
  20. package/dist/src/lib/index.js +40 -10
  21. package/dist/src/lib/keyPair.js +24 -10
  22. package/dist/src/lib/mystenlab/builder/Inputs.d.ts +9 -9
  23. package/dist/src/lib/mystenlab/builder/Inputs.d.ts.map +1 -1
  24. package/dist/src/lib/mystenlab/builder/Inputs.js +18 -19
  25. package/dist/src/lib/mystenlab/builder/TransactionBlock.d.ts +40 -354
  26. package/dist/src/lib/mystenlab/builder/TransactionBlock.d.ts.map +1 -1
  27. package/dist/src/lib/mystenlab/builder/TransactionBlock.js +22 -25
  28. package/dist/src/lib/mystenlab/builder/TransactionDataBlock.d.ts +74 -74
  29. package/dist/src/lib/mystenlab/builder/TransactionDataBlock.d.ts.map +1 -1
  30. package/dist/src/lib/mystenlab/builder/TransactionDataBlock.js +41 -44
  31. package/dist/src/lib/mystenlab/builder/Transactions.d.ts +133 -188
  32. package/dist/src/lib/mystenlab/builder/Transactions.d.ts.map +1 -1
  33. package/dist/src/lib/mystenlab/builder/Transactions.js +52 -53
  34. package/dist/src/lib/mystenlab/builder/bcs.d.ts +1 -1
  35. package/dist/src/lib/mystenlab/builder/bcs.d.ts.map +1 -1
  36. package/dist/src/lib/mystenlab/builder/bcs.js +2 -2
  37. package/dist/src/lib/mystenlab/builder/index.js +6 -2
  38. package/dist/src/lib/mystenlab/builder/serializer.js +6 -8
  39. package/dist/src/lib/mystenlab/builder/utils.d.ts +1 -1
  40. package/dist/src/lib/mystenlab/builder/utils.d.ts.map +1 -1
  41. package/dist/src/lib/mystenlab/builder/utils.js +4 -4
  42. package/dist/src/lib/mystenlab/cryptography/hash.js +3 -4
  43. package/dist/src/lib/mystenlab/framework/framework.d.ts +6 -6
  44. package/dist/src/lib/mystenlab/framework/framework.d.ts.map +1 -1
  45. package/dist/src/lib/mystenlab/framework/framework.js +22 -25
  46. package/dist/src/lib/mystenlab/framework/index.js +6 -2
  47. package/dist/src/lib/mystenlab/framework/sui-system-state.js +2 -2
  48. package/dist/src/lib/mystenlab/txn-data-serializers/type-tag-serializer.js +2 -2
  49. package/dist/src/lib/mystenlab/types/coin.d.ts +10 -10
  50. package/dist/src/lib/mystenlab/types/coin.d.ts.map +1 -1
  51. package/dist/src/lib/mystenlab/types/coin.js +19 -19
  52. package/dist/src/lib/mystenlab/types/common.d.ts +8 -8
  53. package/dist/src/lib/mystenlab/types/common.d.ts.map +1 -1
  54. package/dist/src/lib/mystenlab/types/common.js +22 -22
  55. package/dist/src/lib/mystenlab/types/events.d.ts +14 -14
  56. package/dist/src/lib/mystenlab/types/events.d.ts.map +1 -1
  57. package/dist/src/lib/mystenlab/types/events.js +17 -17
  58. package/dist/src/lib/mystenlab/types/index.js +6 -2
  59. package/dist/src/lib/mystenlab/types/normalized.d.ts +21 -21
  60. package/dist/src/lib/mystenlab/types/normalized.d.ts.map +1 -1
  61. package/dist/src/lib/mystenlab/types/normalized.js +41 -41
  62. package/dist/src/lib/mystenlab/types/objects.d.ts +51 -51
  63. package/dist/src/lib/mystenlab/types/objects.d.ts.map +1 -1
  64. package/dist/src/lib/mystenlab/types/objects.js +96 -106
  65. package/dist/src/lib/mystenlab/types/option.d.ts +1 -1
  66. package/dist/src/lib/mystenlab/types/option.d.ts.map +1 -1
  67. package/dist/src/lib/mystenlab/types/option.js +2 -3
  68. package/dist/src/lib/mystenlab/types/sui-bcs.d.ts +8 -8
  69. package/dist/src/lib/mystenlab/types/sui-bcs.d.ts.map +1 -1
  70. package/dist/src/lib/mystenlab/types/sui-bcs.js +5 -5
  71. package/dist/src/lib/mystenlab/types/transactions.d.ts +625 -625
  72. package/dist/src/lib/mystenlab/types/transactions.d.ts.map +1 -1
  73. package/dist/src/lib/mystenlab/types/transactions.js +178 -194
  74. package/dist/src/lib/mystenlab/types/validator.d.ts +9 -9
  75. package/dist/src/lib/mystenlab/types/validator.d.ts.map +1 -1
  76. package/dist/src/lib/mystenlab/types/validator.js +124 -124
  77. package/dist/src/lib/resources/walrusConfig.d.ts +22 -0
  78. package/dist/src/lib/resources/walrusConfig.d.ts.map +1 -0
  79. package/dist/src/lib/resources/walrusConfig.js +37 -0
  80. package/dist/src/lib/rpcClient.d.ts +5 -0
  81. package/dist/src/lib/rpcClient.d.ts.map +1 -0
  82. package/dist/src/lib/rpcClient.js +74 -0
  83. package/dist/src/lib/stakingBuilder.d.ts.map +1 -1
  84. package/dist/src/lib/stakingBuilder.js +23 -7
  85. package/dist/src/lib/stakingTransaction.d.ts +1 -1
  86. package/dist/src/lib/stakingTransaction.d.ts.map +1 -1
  87. package/dist/src/lib/stakingTransaction.js +26 -15
  88. package/dist/src/lib/tokenTransferBuilder.d.ts +38 -0
  89. package/dist/src/lib/tokenTransferBuilder.d.ts.map +1 -0
  90. package/dist/src/lib/tokenTransferBuilder.js +132 -0
  91. package/dist/src/lib/tokenTransferTransaction.d.ts +57 -0
  92. package/dist/src/lib/tokenTransferTransaction.d.ts.map +1 -0
  93. package/dist/src/lib/tokenTransferTransaction.js +250 -0
  94. package/dist/src/lib/transaction.d.ts +12 -4
  95. package/dist/src/lib/transaction.d.ts.map +1 -1
  96. package/dist/src/lib/transaction.js +91 -18
  97. package/dist/src/lib/transactionBuilder.d.ts +2 -3
  98. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  99. package/dist/src/lib/transactionBuilder.js +4 -4
  100. package/dist/src/lib/transactionBuilderFactory.d.ts +14 -2
  101. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  102. package/dist/src/lib/transactionBuilderFactory.js +42 -1
  103. package/dist/src/lib/transferBuilder.d.ts.map +1 -1
  104. package/dist/src/lib/transferBuilder.js +21 -5
  105. package/dist/src/lib/transferTransaction.d.ts +1 -1
  106. package/dist/src/lib/transferTransaction.d.ts.map +1 -1
  107. package/dist/src/lib/transferTransaction.js +31 -8
  108. package/dist/src/lib/unstakingBuilder.js +6 -6
  109. package/dist/src/lib/unstakingTransaction.d.ts +1 -1
  110. package/dist/src/lib/unstakingTransaction.d.ts.map +1 -1
  111. package/dist/src/lib/unstakingTransaction.js +31 -17
  112. package/dist/src/lib/utils.d.ts +16 -4
  113. package/dist/src/lib/utils.d.ts.map +1 -1
  114. package/dist/src/lib/utils.js +269 -29
  115. package/dist/src/lib/walrusStakingBuilder.d.ts +66 -0
  116. package/dist/src/lib/walrusStakingBuilder.d.ts.map +1 -0
  117. package/dist/src/lib/walrusStakingBuilder.js +200 -0
  118. package/dist/src/lib/walrusStakingTransaction.d.ts +52 -0
  119. package/dist/src/lib/walrusStakingTransaction.d.ts.map +1 -0
  120. package/dist/src/lib/walrusStakingTransaction.js +269 -0
  121. package/dist/src/lib/walrusWithdrawStakeBuilder.d.ts +36 -0
  122. package/dist/src/lib/walrusWithdrawStakeBuilder.d.ts.map +1 -0
  123. package/dist/src/lib/walrusWithdrawStakeBuilder.js +173 -0
  124. package/dist/src/lib/walrusWithdrawStakeTransaction.d.ts +21 -0
  125. package/dist/src/lib/walrusWithdrawStakeTransaction.d.ts.map +1 -0
  126. package/dist/src/lib/walrusWithdrawStakeTransaction.js +190 -0
  127. package/dist/src/register.d.ts.map +1 -1
  128. package/dist/src/register.js +5 -1
  129. package/dist/src/sui.d.ts +46 -8
  130. package/dist/src/sui.d.ts.map +1 -1
  131. package/dist/src/sui.js +479 -32
  132. package/dist/src/suiToken.d.ts +22 -0
  133. package/dist/src/suiToken.d.ts.map +1 -0
  134. package/dist/src/suiToken.js +61 -0
  135. package/dist/src/tsui.js +1 -1
  136. package/package.json +10 -8
@@ -1,15 +1,15 @@
1
1
  "use strict";
2
- var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
3
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
4
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
5
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
6
- };
7
2
  var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
8
3
  if (kind === "m") throw new TypeError("Private method is not writable");
9
4
  if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
10
5
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
11
6
  return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
12
7
  };
8
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
10
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
11
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
+ };
13
13
  var _TransactionBlock_blockData;
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.TransactionBlock = void 0;
@@ -23,14 +23,11 @@ const utils_1 = require("./utils");
23
23
  function createTransactionResult(index) {
24
24
  const baseResult = { kind: 'Result', index };
25
25
  const nestedResults = [];
26
- const nestedResultFor = (resultIndex) => {
27
- var _a;
28
- return ((_a = nestedResults[resultIndex]) !== null && _a !== void 0 ? _a : (nestedResults[resultIndex] = {
29
- kind: 'NestedResult',
30
- index,
31
- resultIndex,
32
- }));
33
- };
26
+ const nestedResultFor = (resultIndex) => (nestedResults[resultIndex] ?? (nestedResults[resultIndex] = {
27
+ kind: 'NestedResult',
28
+ index,
29
+ resultIndex,
30
+ }));
34
31
  return new Proxy(baseResult, {
35
32
  set() {
36
33
  throw new Error('The transaction result is a proxy, and does not support setting properties directly');
@@ -74,10 +71,6 @@ const GAS_OVERHEAD_PER_COIN = 10n;
74
71
  * Transaction Builder
75
72
  */
76
73
  class TransactionBlock {
77
- constructor(transaction) {
78
- _TransactionBlock_blockData.set(this, void 0);
79
- __classPrivateFieldSet(this, _TransactionBlock_blockData, new TransactionDataBlock_1.TransactionBlockDataBuilder(transaction ? __classPrivateFieldGet(transaction, _TransactionBlock_blockData, "f") : undefined), "f");
80
- }
81
74
  /** Returns `true` if the object is an instance of the Transaction builder class. */
82
75
  static is(obj) {
83
76
  return !!obj && typeof obj === 'object' && obj[TRANSACTION_BRAND] === true;
@@ -88,7 +81,7 @@ class TransactionBlock {
88
81
  */
89
82
  static fromKind(serialized) {
90
83
  const tx = new TransactionBlock();
91
- __classPrivateFieldSet(tx, _TransactionBlock_blockData, TransactionDataBlock_1.TransactionBlockDataBuilder.fromKindBytes(typeof serialized === 'string' ? bcs_1.fromB64(serialized) : serialized), "f");
84
+ __classPrivateFieldSet(tx, _TransactionBlock_blockData, TransactionDataBlock_1.TransactionBlockDataBuilder.fromKindBytes(typeof serialized === 'string' ? (0, bcs_1.fromB64)(serialized) : serialized), "f");
92
85
  return tx;
93
86
  }
94
87
  /**
@@ -101,7 +94,7 @@ class TransactionBlock {
101
94
  const tx = new TransactionBlock();
102
95
  // Check for bytes:
103
96
  if (typeof serialized !== 'string' || !serialized.startsWith('{')) {
104
- __classPrivateFieldSet(tx, _TransactionBlock_blockData, TransactionDataBlock_1.TransactionBlockDataBuilder.fromBytes(typeof serialized === 'string' ? bcs_1.fromB64(serialized) : serialized), "f");
97
+ __classPrivateFieldSet(tx, _TransactionBlock_blockData, TransactionDataBlock_1.TransactionBlockDataBuilder.fromBytes(typeof serialized === 'string' ? (0, bcs_1.fromB64)(serialized) : serialized), "f");
105
98
  }
106
99
  else {
107
100
  __classPrivateFieldSet(tx, _TransactionBlock_blockData, TransactionDataBlock_1.TransactionBlockDataBuilder.restore(JSON.parse(serialized)), "f");
@@ -144,7 +137,7 @@ class TransactionBlock {
144
137
  if (payments.length >= MAX_GAS_OBJECTS) {
145
138
  throw new Error(`Payment objects exceed maximum amount ${MAX_GAS_OBJECTS}`);
146
139
  }
147
- __classPrivateFieldGet(this, _TransactionBlock_blockData, "f").gasConfig.payment = payments.map((payment) => superstruct_1.mask(payment, types_1.SuiObjectRef));
140
+ __classPrivateFieldGet(this, _TransactionBlock_blockData, "f").gasConfig.payment = payments.map((payment) => (0, superstruct_1.mask)(payment, types_1.SuiObjectRef));
148
141
  }
149
142
  /** Get a snapshot of the transaction data, in JSON form: */
150
143
  get blockData() {
@@ -155,6 +148,10 @@ class TransactionBlock {
155
148
  get [(_TransactionBlock_blockData = new WeakMap(), TRANSACTION_BRAND)]() {
156
149
  return true;
157
150
  }
151
+ constructor(transaction) {
152
+ _TransactionBlock_blockData.set(this, void 0);
153
+ __classPrivateFieldSet(this, _TransactionBlock_blockData, new TransactionDataBlock_1.TransactionBlockDataBuilder(transaction ? __classPrivateFieldGet(transaction, _TransactionBlock_blockData, "f") : undefined), "f");
154
+ }
158
155
  /** Returns an argument for the gas coin, to be used in a transaction. */
159
156
  get gas() {
160
157
  return { kind: 'GasCoin' };
@@ -170,7 +167,7 @@ class TransactionBlock {
170
167
  */
171
168
  input(type, value) {
172
169
  const index = __classPrivateFieldGet(this, _TransactionBlock_blockData, "f").inputs.length;
173
- const input = utils_1.create({
170
+ const input = (0, utils_1.create)({
174
171
  kind: 'Input',
175
172
  // bigints can't be serialized to JSON, so just string-convert them here:
176
173
  value: typeof value === 'bigint' ? String(value) : value,
@@ -184,10 +181,10 @@ class TransactionBlock {
184
181
  * Add a new object input to the transaction.
185
182
  */
186
183
  object(value) {
187
- const id = Inputs_1.getIdFromCallArg(value);
184
+ const id = (0, Inputs_1.getIdFromCallArg)(value);
188
185
  // deduplicate
189
- const inserted = __classPrivateFieldGet(this, _TransactionBlock_blockData, "f").inputs.find((i) => i.type === 'object' && id === Inputs_1.getIdFromCallArg(i.value));
190
- return inserted !== null && inserted !== void 0 ? inserted : this.input('object', value);
186
+ const inserted = __classPrivateFieldGet(this, _TransactionBlock_blockData, "f").inputs.find((i) => i.type === 'object' && id === (0, Inputs_1.getIdFromCallArg)(i.value));
187
+ return inserted ?? this.input('object', value);
191
188
  }
192
189
  /**
193
190
  * Add a new non-object input to the transaction.
@@ -255,4 +252,4 @@ class TransactionBlock {
255
252
  }
256
253
  }
257
254
  exports.TransactionBlock = TransactionBlock;
258
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb25CbG9jay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvbXlzdGVubGFiL2J1aWxkZXIvVHJhbnNhY3Rpb25CbG9jay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxQ0FBc0M7QUFDdEMsNkNBQXVDO0FBQ3ZDLG9DQUFrRDtBQUNsRCxpREFBMkc7QUFDM0cscUNBQW1GO0FBQ25GLGlFQUE0RjtBQUM1RixtQ0FBaUM7QUFJakMsU0FBUyx1QkFBdUIsQ0FBQyxLQUFhO0lBQzVDLE1BQU0sVUFBVSxHQUF3QixFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFFbEUsTUFBTSxhQUFhLEdBQTBCLEVBQUUsQ0FBQztJQUNoRCxNQUFNLGVBQWUsR0FBRyxDQUFDLFdBQW1CLEVBQXVCLEVBQUU7O1FBQ25FLE9BQUEsT0FBQyxhQUFhLENBQUMsV0FBVyxxQ0FBekIsYUFBYSxDQUFDLFdBQVcsSUFBTTtZQUM5QixJQUFJLEVBQUUsY0FBYztZQUNwQixLQUFLO1lBQ0wsV0FBVztTQUNaLEVBQUMsQ0FBQTtLQUFBLENBQUM7SUFFTCxPQUFPLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRTtRQUMzQixHQUFHO1lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxxRkFBcUYsQ0FBQyxDQUFDO1FBQ3pHLENBQUM7UUFDRCw2RUFBNkU7UUFDN0UsNEVBQTRFO1FBQzVFLG1DQUFtQztRQUNuQyxHQUFHLENBQUMsTUFBTSxFQUFFLFFBQVE7WUFDbEIseUVBQXlFO1lBQ3pFLElBQUksUUFBUSxJQUFJLE1BQU0sRUFBRTtnQkFDdEIsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQzthQUN0QztZQUVELHlCQUF5QjtZQUN6QixJQUFJLFFBQVEsS0FBSyxNQUFNLENBQUMsUUFBUSxFQUFFO2dCQUNoQyxPQUFPLFFBQVEsQ0FB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R0FBRyxDQUFDLDJCQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBQ0QsZUFBZSxDQUFDLEdBQUcsSUFBMEQ7UUFDM0UsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLDJCQUFZLENBQUMsZUFBZSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBQ0QsV0FBVyxDQUFDLEdBQUcsSUFBc0Q7UUFDbkUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLDJCQUFZLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLHVCQUFBLElBQUksbUNBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCwwQ0FBMEM7SUFDMUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLG1CQUFtQixLQUFtQixFQUFFO1FBQ3BELE9BQU8sdUJBQUEsSUFBSSxtQ0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLG1CQUFtQixFQUFFLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsZ0NBQWdDO0lBQ2hDLEtBQUssQ0FBQyxTQUFTO1FBQ2IsT0FBTyx1QkFBQSxJQUFJLG1DQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDckMsQ0FBQztDQUNGO0FBcE5ELDRDQW9OQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZyb21CNjQgfSBmcm9tICdAbXlzdGVuL2Jjcyc7XG5pbXBvcnQgeyBpcywgbWFzayB9IGZyb20gJ3N1cGVyc3RydWN0JztcbmltcG9ydCB7IE9iamVjdElkLCBTdWlPYmplY3RSZWYgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbnMsIFRyYW5zYWN0aW9uQXJndW1lbnQsIFRyYW5zYWN0aW9uVHlwZSwgVHJhbnNhY3Rpb25CbG9ja0lucHV0IH0gZnJvbSAnLi9UcmFuc2FjdGlvbnMnO1xuaW1wb3J0IHsgQnVpbGRlckNhbGxBcmcsIGdldElkRnJvbUNhbGxBcmcsIElucHV0cywgT2JqZWN0Q2FsbEFyZyB9IGZyb20gJy4vSW5wdXRzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQmxvY2tEYXRhQnVpbGRlciwgVHJhbnNhY3Rpb25FeHBpcmF0aW9uIH0gZnJvbSAnLi9UcmFuc2FjdGlvbkRhdGFCbG9jayc7XG5pbXBvcnQgeyBjcmVhdGUgfSBmcm9tICcuL3V0aWxzJztcblxudHlwZSBUcmFuc2FjdGlvblJlc3VsdCA9IFRyYW5zYWN0aW9uQXJndW1lbnQgJiBUcmFuc2FjdGlvbkFyZ3VtZW50W107XG5cbmZ1bmN0aW9uIGNyZWF0ZVRyYW5zYWN0aW9uUmVzdWx0KGluZGV4OiBudW1iZXIpOiBUcmFuc2FjdGlvblJlc3VsdCB7XG4gIGNvbnN0IGJhc2VSZXN1bHQ6IFRyYW5zYWN0aW9uQXJndW1lbnQgPSB7IGtpbmQ6ICdSZXN1bHQnLCBpbmRleCB9O1xuXG4gIGNvbnN0IG5lc3RlZFJlc3VsdHM6IFRyYW5zYWN0aW9uQXJndW1lbnRbXSA9IFtdO1xuICBjb25zdCBuZXN0ZWRSZXN1bHRGb3IgPSAocmVzdWx0SW5kZXg6IG51bWJlcik6IFRyYW5zYWN0aW9uQXJndW1lbnQgPT5cbiAgICAobmVzdGVkUmVzdWx0c1tyZXN1bHRJbmRleF0gPz89IHtcbiAgICAgIGtpbmQ6ICdOZXN0ZWRSZXN1bHQnLFxuICAgICAgaW5kZXgsXG4gICAgICByZXN1bHRJbmRleCxcbiAgICB9KTtcblxuICByZXR1cm4gbmV3IFByb3h5KGJhc2VSZXN1bHQsIHtcbiAgICBzZXQoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSB0cmFuc2FjdGlvbiByZXN1bHQgaXMgYSBwcm94eSwgYW5kIGRvZXMgbm90IHN1cHBvcnQgc2V0dGluZyBwcm9wZXJ0aWVzIGRpcmVjdGx5Jyk7XG4gICAgfSxcbiAgICAvLyBUT0RPOiBJbnN0ZWFkIG9mIG1ha2luZyB0aGlzIHJldHVybiBhIGNvbmNyZXRlIGFyZ3VtZW50LCB3ZSBzaG91bGQgaWRlYWxseVxuICAgIC8vIG1ha2UgaXQgcmVmZXJlbmNlLWJhc2VkIChzbyB0aGF0IHRoaXMgZ2V0cyByZXNvbHZlZCBhdCBidWlsZC10aW1lKSwgd2hpY2hcbiAgICAvLyBhbGxvd3MgcmUtb3JkZXJpbmcgdHJhbnNhY3Rpb25zLlxuICAgIGdldCh0YXJnZXQsIHByb3BlcnR5KSB7XG4gICAgICAvLyBUaGlzIGFsbG93cyB0aGlzIHRyYW5zYWN0aW9uIGFyZ3VtZW50IHRvIGJlIHVzZWQgaW4gdGhlIHNpbmd1bGFyIGZvcm06XG4gICAgICBpZiAocHJvcGVydHkgaW4gdGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3BlcnR5KTtcbiAgICAgIH1cblxuICAgICAgLy8gU3VwcG9ydCBkZXN0cnVjdHVyaW5nOlxuICAgICAgaWYgKHByb3BlcnR5ID09PSBTeW1ib2wuaXRlcmF0b3IpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICB5aWVsZCBuZXN0ZWRSZXN1bHRGb3IoaSk7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHByb3BlcnR5ID09PSAnc3ltYm9sJykgcmV0dXJuO1xuXG4gICAgICBjb25zdCByZXN1bHRJbmRleCA9IHBhcnNlSW50KHByb3BlcnR5LCAxMCk7XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKHJlc3VsdEluZGV4KSB8fCByZXN1bHRJbmRleCA8IDApIHJldHVybjtcbiAgICAgIHJldHVybiBuZXN0ZWRSZXN1bHRGb3IocmVzdWx0SW5kZXgpO1xuICAgIH0sXG4gIH0pIGFzIFRyYW5zYWN0aW9uUmVzdWx0O1xufVxuXG5jb25zdCBUUkFOU0FDVElPTl9CUkFORCA9IFN5bWJvbC5mb3IoJ0BteXN0ZW4vdHJhbnNhY3Rpb24nKTtcblxuLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIGdhcyBvYmplY3RzIHRoYXQgY2FuIGJlIHNlbGVjdGVkIGZvciBvbmUgdHJhbnNhY3Rpb24uXG5jb25zdCBNQVhfR0FTX09CSkVDVFMgPSAyNTY7XG5cbi8vIFRoZSBtYXhpbXVtIGdhcyB0aGF0IGlzIGFsbG93ZWQuXG5jb25zdCBNQVhfR0FTID0gMTAwMDAwMDAwMDtcblxuLy8gQSBndWVzcyBhYm91dCBob3cgbXVjaCBvdmVyaGVhZCBlYWNoIGNvaW4gcHJvdmlkZXMgZm9yIGdhcyBjYWxjdWxhdGlvbnMuXG4vLyBAdHMtaWdub3JlXG5jb25zdCBHQVNfT1ZFUkhFQURfUEVSX0NPSU4gPSAxMG47XG5cbmludGVyZmFjZSBCdWlsZE9wdGlvbnMge1xuICBvbmx5VHJhbnNhY3Rpb25LaW5kPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUcmFuc2FjdGlvbiBCdWlsZGVyXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkJsb2NrIHtcbiAgLyoqIFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3QgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIFRyYW5zYWN0aW9uIGJ1aWxkZXIgY2xhc3MuICovXG4gIHN0YXRpYyBpcyhvYmo6IHVua25vd24pOiBvYmogaXMgVHJhbnNhY3Rpb25CbG9jayB7XG4gICAgcmV0dXJuICEhb2JqICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIChvYmogYXMgYW55KVtUUkFOU0FDVElPTl9CUkFORF0gPT09IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgZnJvbSBhIHNlcmlhbGl6ZSB0cmFuc2FjdGlvbiBraW5kIChidWlsdCB3aXRoIGBidWlsZCh7IG9ubHlUcmFuc2FjdGlvbktpbmQ6IHRydWUgfSlgKSB0byBhIGBUcmFuc2FjdGlvbmAgY2xhc3MuXG4gICAqIFN1cHBvcnRzIGVpdGhlciBhIGJ5dGUgYXJyYXksIG9yIGJhc2U2NC1lbmNvZGVkIGJ5dGVzLlxuICAgKi9cbiAgc3RhdGljIGZyb21LaW5kKHNlcmlhbGl6ZWQ6IHN0cmluZyB8IFVpbnQ4QXJyYXkpIHtcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbkJsb2NrKCk7XG5cbiAgICB0eC4jYmxvY2tEYXRhID0gVHJhbnNhY3Rpb25CbG9ja0RhdGFCdWlsZGVyLmZyb21LaW5kQnl0ZXMoXG4gICAgICB0eXBlb2Ygc2VyaWFsaXplZCA9PT0gJ3N0cmluZycgPyBmcm9tQjY0KHNlcmlhbGl6ZWQpIDogc2VyaWFsaXplZFxuICAgICk7XG5cbiAgICByZXR1cm4gdHg7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgZnJvbSBhIHNlcmlhbGl6ZWQgdHJhbnNhY3Rpb24gZm9ybWF0IHRvIGEgYFRyYW5zYWN0aW9uYCBjbGFzcy5cbiAgICogVGhlcmUgYXJlIHR3byBzdXBwb3J0ZWQgc2VyaWFsaXplZCBmb3JtYXRzOlxuICAgKiAtIEEgc3RyaW5nIHJldHVybmVkIGZyb20gYFRyYW5zYWN0aW9uI3NlcmlhbGl6ZWAuIFRoZSBzZXJpYWxpemVkIGZvcm1hdCBtdXN0IGJlIGNvbXBhdGlibGUsIG9yIGl0IHdpbGwgdGhyb3cgYW4gZXJyb3IuXG4gICAqIC0gQSBieXRlIGFycmF5IChvciBiYXNlNjQtZW5jb2RlZCBieXRlcykgY29udGFpbmluZyBCQ1MgdHJhbnNhY3Rpb24gZGF0YS5cbiAgICovXG4gIHN0YXRpYyBmcm9tKHNlcmlhbGl6ZWQ6IHN0cmluZyB8IFVpbnQ4QXJyYXkpIHtcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbkJsb2NrKCk7XG5cbiAgICAvLyBDaGVjayBmb3IgYnl0ZXM6XG4gICAgaWYgKHR5cGVvZiBzZXJpYWxpemVkICE9PSAnc3RyaW5nJyB8fCAhc2VyaWFsaXplZC5zdGFydHNXaXRoKCd7JykpIHtcbiAgICAgIHR4LiNibG9ja0RhdGEgPSBUcmFuc2FjdGlvbkJsb2NrRGF0YUJ1aWxkZXIuZnJvbUJ5dGVzKFxuICAgICAgICB0eXBlb2Ygc2VyaWFsaXplZCA9PT0gJ3N0cmluZycgPyBmcm9tQjY0KHNlcmlhbGl6ZWQpIDogc2VyaWFsaXplZFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHguI2Jsb2NrRGF0YSA9IFRyYW5zYWN0aW9uQmxvY2tEYXRhQnVpbGRlci5yZXN0b3JlKEpTT04ucGFyc2Uoc2VyaWFsaXplZCkpO1xuICAgIH1cblxuICAgIHJldHVybiB0eDtcbiAgfVxuXG4gIC8qKiBBIGhlbHBlciB0byByZXRyaWV2ZSB0aGUgVHJhbnNhY3Rpb24gYnVpbGRlciBgVHJhbnNhY3Rpb25zYCAqL1xuICBzdGF0aWMgZ2V0IFRyYW5zYWN0aW9ucygpIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25zO1xuICB9XG5cbiAgLyoqIEEgaGVscGVyIHRvIHJldHJpZXZlIHRoZSBUcmFuc2FjdGlvbiBidWlsZGVyIGBJbnB1dHNgICovXG4gIHN0YXRpYyBnZXQgSW5wdXRzKCkge1xuICAgIHJldHVybiBJbnB1dHM7XG4gIH1cblxuICBzZXRTZW5kZXIoc2VuZGVyOiBzdHJpbmcpIHtcbiAgICB0aGlzLiNibG9ja0RhdGEuc2VuZGVyID0gc2VuZGVyO1xuICB9XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBzZW5kZXIgb25seSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBzZXQuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGZvciBzcG9uc29yZWQgdHJhbnNhY3Rpb24gZmxvd3Mgd2hlcmUgdGhlIHNlbmRlciBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIHRoZSBzaWduZXIgYWRkcmVzcy5cbiAgICovXG4gIHNldFNlbmRlcklmTm90U2V0KHNlbmRlcjogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLiNibG9ja0RhdGEuc2VuZGVyKSB7XG4gICAgICB0aGlzLiNibG9ja0RhdGEuc2VuZGVyID0gc2VuZGVyO1xuICAgIH1cbiAgfVxuICBzZXRFeHBpcmF0aW9uKGV4cGlyYXRpb24/OiBUcmFuc2FjdGlvbkV4cGlyYXRpb24pIHtcbiAgICB0aGlzLiNibG9ja0RhdGEuZXhwaXJhdGlvbiA9IGV4cGlyYXRpb247XG4gIH1cbiAgc2V0R2FzUHJpY2UocHJpY2U6IG51bWJlciB8IGJpZ2ludCkge1xuICAgIHRoaXMuI2Jsb2NrRGF0YS5nYXNDb25maWcucHJpY2UgPSBTdHJpbmcocHJpY2UpO1xuICB9XG4gIHNldEdhc0J1ZGdldChidWRnZXQ6IG51bWJlciB8IGJpZ2ludCkge1xuICAgIHRoaXMuI2Jsb2NrRGF0YS5nYXNDb25maWcuYnVkZ2V0ID0gU3RyaW5nKGJ1ZGdldCk7XG4gIH1cbiAgc2V0R2FzT3duZXIob3duZXI6IHN0cmluZykge1xuICAgIHRoaXMuI2Jsb2NrRGF0YS5nYXNDb25maWcub3duZXIgPSBvd25lcjtcbiAgfVxuICBzZXRHYXNQYXltZW50KHBheW1lbnRzOiBTdWlPYmplY3RSZWZbXSkge1xuICAgIGlmIChwYXltZW50cy5sZW5ndGggPj0gTUFYX0dBU19PQkpFQ1RTKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFBheW1lbnQgb2JqZWN0cyBleGNlZWQgbWF4aW11bSBhbW91bnQgJHtNQVhfR0FTX09CSkVDVFN9YCk7XG4gICAgfVxuICAgIHRoaXMuI2Jsb2NrRGF0YS5nYXNDb25maWcucGF5bWVudCA9IHBheW1lbnRzLm1hcCgocGF5bWVudCkgPT4gbWFzayhwYXltZW50LCBTdWlPYmplY3RSZWYpKTtcbiAgfVxuXG4gICNibG9ja0RhdGE6IFRyYW5zYWN0aW9uQmxvY2tEYXRhQnVpbGRlcjtcbiAgLyoqIEdldCBhIHNuYXBzaG90IG9mIHRoZSB0cmFuc2FjdGlvbiBkYXRhLCBpbiBKU09OIGZvcm06ICovXG4gIGdldCBibG9ja0RhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2Jsb2NrRGF0YS5zbmFwc2hvdCgpO1xuICB9XG5cbiAgLy8gVXNlZCB0byBicmFuZCB0cmFuc2FjdGlvbiBjbGFzc2VzIHNvIHRoYXQgdGhleSBjYW4gYmUgaWRlbnRpZmllZCwgZXZlbiBiZXR3ZWVuIG11bHRpcGxlIGNvcGllc1xuICAvLyBvZiB0aGUgYnVpbGRlci5cbiAgZ2V0IFtUUkFOU0FDVElPTl9CUkFORF0oKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcih0cmFuc2FjdGlvbj86IFRyYW5zYWN0aW9uQmxvY2spIHtcbiAgICB0aGlzLiNibG9ja0RhdGEgPSBuZXcgVHJhbnNhY3Rpb25CbG9ja0RhdGFCdWlsZGVyKHRyYW5zYWN0aW9uID8gdHJhbnNhY3Rpb24uI2Jsb2NrRGF0YSA6IHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKiogUmV0dXJucyBhbiBhcmd1bWVudCBmb3IgdGhlIGdhcyBjb2luLCB0byBiZSB1c2VkIGluIGEgdHJhbnNhY3Rpb24uICovXG4gIGdldCBnYXMoKTogVHJhbnNhY3Rpb25Bcmd1bWVudCB7XG4gICAgcmV0dXJuIHsga2luZDogJ0dhc0NvaW4nIH07XG4gIH1cblxuICAvKipcbiAgICogRHluYW1pY2FsbHkgY3JlYXRlIGEgbmV3IGlucHV0LCB3aGljaCBpcyBzZXBhcmF0ZSBmcm9tIHRoZSBgaW5wdXRgLiBUaGlzIGlzIGltcG9ydGFudFxuICAgKiBmb3IgZ2VuZXJhdGVkIGNsaWVudHMgdG8gYmUgYWJsZSB0byBkZWZpbmUgdW5pcXVlIGlucHV0cyB0aGF0IGFyZSBub24tb3ZlcmxhcHBpbmcgd2l0aCB0aGVcbiAgICogZGVmaW5lZCBpbnB1dHMuXG4gICAqXG4gICAqIEZvciBgVWludDhBcnJheWAgdHlwZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnQgdGhlIGlucHV0IGludG8gYSBgUHVyZWAgQ2FsbEFyZywgc2luY2UgdGhpc1xuICAgKiBpcyB0aGUgZm9ybWF0IHJlcXVpcmVkIGZvciBjdXN0b20gc2VyaWFsaXphdGlvbi5cbiAgICpcbiAgICovXG4gIGlucHV0KHR5cGU6ICdvYmplY3QnIHwgJ3B1cmUnLCB2YWx1ZT86IHVua25vd24pIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuI2Jsb2NrRGF0YS5pbnB1dHMubGVuZ3RoO1xuICAgIGNvbnN0IGlucHV0ID0gY3JlYXRlKFxuICAgICAge1xuICAgICAgICBraW5kOiAnSW5wdXQnLFxuICAgICAgICAvLyBiaWdpbnRzIGNhbid0IGJlIHNlcmlhbGl6ZWQgdG8gSlNPTiwgc28ganVzdCBzdHJpbmctY29udmVydCB0aGVtIGhlcmU6XG4gICAgICAgIHZhbHVlOiB0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnID8gU3RyaW5nKHZhbHVlKSA6IHZhbHVlLFxuICAgICAgICBpbmRleCxcbiAgICAgICAgdHlwZSxcbiAgICAgIH0sXG4gICAgICBUcmFuc2FjdGlvbkJsb2NrSW5wdXRcbiAgICApO1xuICAgIHRoaXMuI2Jsb2NrRGF0YS5pbnB1dHMucHVzaChpbnB1dCk7XG4gICAgcmV0dXJuIGlucHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIG5ldyBvYmplY3QgaW5wdXQgdG8gdGhlIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgb2JqZWN0KHZhbHVlOiBPYmplY3RJZCB8IE9iamVjdENhbGxBcmcpIHtcbiAgICBjb25zdCBpZCA9IGdldElkRnJvbUNhbGxBcmcodmFsdWUpO1xuICAgIC8vIGRlZHVwbGljYXRlXG4gICAgY29uc3QgaW5zZXJ0ZWQgPSB0aGlzLiNibG9ja0RhdGEuaW5wdXRzLmZpbmQoKGkpID0+IGkudHlwZSA9PT0gJ29iamVjdCcgJiYgaWQgPT09IGdldElkRnJvbUNhbGxBcmcoaS52YWx1ZSkpO1xuICAgIHJldHVybiBpbnNlcnRlZCA/PyB0aGlzLmlucHV0KCdvYmplY3QnLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbmV3IG5vbi1vYmplY3QgaW5wdXQgdG8gdGhlIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgcHVyZShcbiAgICAvKipcbiAgICAgKiBUaGUgcHVyZSB2YWx1ZSB0aGF0IHdpbGwgYmUgdXNlZCBhcyB0aGUgaW5wdXQgdmFsdWUuIElmIHRoaXMgaXMgYSBVaW50OEFycmF5LCB0aGVuIHRoZSB2YWx1ZVxuICAgICAqIGlzIGFzc3VtZWQgdG8gYmUgcmF3IGJ5dGVzLCBhbmQgd2lsbCBiZSB1c2VkIGRpcmVjdGx5LlxuICAgICAqL1xuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIC8qKlxuICAgICAqIFRoZSBCQ1MgdHlwZSB0byBzZXJpYWxpemUgdGhlIHZhbHVlIGludG8uIElmIG5vdCBwcm92aWRlZCwgdGhlIHR5cGUgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGRldGVybWluZWRcbiAgICAgKiBiYXNlZCBvbiBob3cgdGhlIGlucHV0IGlzIHVzZWQuXG4gICAgICovXG4gICAgdHlwZT86IHN0cmluZ1xuICApIHtcbiAgICAvLyBUT0RPOiB3ZSBjYW4gYWxzbyBkbyBzb21lIGRlZHVwbGljYXRpb24gaGVyZVxuICAgIHJldHVybiB0aGlzLmlucHV0KFxuICAgICAgJ3B1cmUnLFxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5ID8gSW5wdXRzLlB1cmUodmFsdWUpIDogdHlwZSA/IElucHV0cy5QdXJlKHZhbHVlLCB0eXBlKSA6IHZhbHVlXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBBZGQgYSB0cmFuc2FjdGlvbiB0byB0aGUgdHJhbnNhY3Rpb24gYmxvY2suICovXG4gIGFkZCh0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25UeXBlKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLiNibG9ja0RhdGEudHJhbnNhY3Rpb25zLnB1c2godHJhbnNhY3Rpb24pO1xuICAgIHJldHVybiBjcmVhdGVUcmFuc2FjdGlvblJlc3VsdChpbmRleCAtIDEpO1xuICB9XG5cbiAgLy8gTWV0aG9kIHNob3J0aGFuZHM6XG5cbiAgc3BsaXRDb2lucyguLi5hcmdzOiBQYXJhbWV0ZXJzPCh0eXBlb2YgVHJhbnNhY3Rpb25zKVsnU3BsaXRDb2lucyddPikge1xuICAgIHJldHVybiB0aGlzLmFkZChUcmFuc2FjdGlvbnMuU3BsaXRDb2lucyguLi5hcmdzKSk7XG4gIH1cbiAgbWVyZ2VDb2lucyguLi5hcmdzOiBQYXJhbWV0ZXJzPCh0eXBlb2YgVHJhbnNhY3Rpb25zKVsnTWVyZ2VDb2lucyddPikge1xuICAgIHJldHVybiB0aGlzLmFkZChUcmFuc2FjdGlvbnMuTWVyZ2VDb2lucyguLi5hcmdzKSk7XG4gIH1cbiAgcHVibGlzaCguLi5hcmdzOiBQYXJhbWV0ZXJzPCh0eXBlb2YgVHJhbnNhY3Rpb25zKVsnUHVibGlzaCddPikge1xuICAgIHJldHVybiB0aGlzLmFkZChUcmFuc2FjdGlvbnMuUHVibGlzaCguLi5hcmdzKSk7XG4gIH1cbiAgbW92ZUNhbGwoLi4uYXJnczogUGFyYW1ldGVyczwodHlwZW9mIFRyYW5zYWN0aW9ucylbJ01vdmVDYWxsJ10+KSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkKFRyYW5zYWN0aW9ucy5Nb3ZlQ2FsbCguLi5hcmdzKSk7XG4gIH1cbiAgdHJhbnNmZXJPYmplY3RzKC4uLmFyZ3M6IFBhcmFtZXRlcnM8KHR5cGVvZiBUcmFuc2FjdGlvbnMpWydUcmFuc2Zlck9iamVjdHMnXT4pIHtcbiAgICByZXR1cm4gdGhpcy5hZGQoVHJhbnNhY3Rpb25zLlRyYW5zZmVyT2JqZWN0cyguLi5hcmdzKSk7XG4gIH1cbiAgbWFrZU1vdmVWZWMoLi4uYXJnczogUGFyYW1ldGVyczwodHlwZW9mIFRyYW5zYWN0aW9ucylbJ01ha2VNb3ZlVmVjJ10+KSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkKFRyYW5zYWN0aW9ucy5NYWtlTW92ZVZlYyguLi5hcmdzKSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIHRoZSB0cmFuc2FjdGlvbiB0byBhIHN0cmluZyBzbyB0aGF0IGl0IGNhbiBiZSBzZW50IHRvIGEgc2VwYXJhdGUgY29udGV4dC5cbiAgICogVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBgYnVpbGRgIGluIHRoYXQgaXQgZG9lcyBub3Qgc2VyaWFsaXplIHRvIEJDUyBieXRlcywgYW5kIGluc3RlYWRcbiAgICogdXNlcyBhIHNlcGFyYXRlIGZvcm1hdCB0aGF0IGlzIHVuaXF1ZSB0byB0aGUgdHJhbnNhY3Rpb24gYnVpbGRlci4gVGhpcyBhbGxvd3NcbiAgICogdXMgdG8gc2VyaWFsaXplIHBhcnRpYWxseS1jb21wbGV0ZSB0cmFuc2FjdGlvbnMsIHRoYXQgY2FuIHRoZW4gYmUgY29tcGxldGVkIGFuZFxuICAgKiBidWlsdCBpbiBhIHNlcGFyYXRlIGNvbnRleHQuXG4gICAqXG4gICAqIEZvciBleGFtcGxlLCBhIGRhcHAgY2FuIGNvbnN0cnVjdCBhIHRyYW5zYWN0aW9uLCBidXQgbm90IHByb3ZpZGUgZ2FzIG9iamVjdHNcbiAgICogb3IgYSBnYXMgYnVkZ2V0LiBUaGUgdHJhbnNhY3Rpb24gdGhlbiBjYW4gYmUgc2VudCB0byB0aGUgd2FsbGV0LCB3aGVyZSB0aGlzXG4gICAqIGluZm9ybWF0aW9uIGlzIGF1dG9tYXRpY2FsbHkgZmlsbGVkIGluIChlLmcuIGJ5IHF1ZXJ5aW5nIGZvciBjb2luIG9iamVjdHNcbiAgICogYW5kIHBlcmZvcm1pbmcgYSBkcnkgcnVuKS5cbiAgICovXG4gIHNlcmlhbGl6ZSgpIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy4jYmxvY2tEYXRhLnNuYXBzaG90KCkpO1xuICB9XG5cbiAgLyoqIEJ1aWxkIHRoZSB0cmFuc2FjdGlvbiB0byBCQ1MgYnl0ZXMuICovXG4gIGFzeW5jIGJ1aWxkKHsgb25seVRyYW5zYWN0aW9uS2luZCB9OiBCdWlsZE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIHJldHVybiB0aGlzLiNibG9ja0RhdGEuYnVpbGQoeyBvbmx5VHJhbnNhY3Rpb25LaW5kIH0pO1xuICB9XG5cbiAgLyoqIERlcml2ZSB0cmFuc2FjdGlvbiBkaWdlc3QgKi9cbiAgYXN5bmMgZ2V0RGlnZXN0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuI2Jsb2NrRGF0YS5nZXREaWdlc3QoKTtcbiAgfVxufVxuIl19
255
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb25CbG9jay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvbXlzdGVubGFiL2J1aWxkZXIvVHJhbnNhY3Rpb25CbG9jay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxQ0FBc0M7QUFDdEMsNkNBQXVDO0FBQ3ZDLG9DQUFrRDtBQUNsRCxpREFBMkc7QUFDM0cscUNBQW1GO0FBQ25GLGlFQUE0RjtBQUM1RixtQ0FBaUM7QUFJakMsU0FBUyx1QkFBdUIsQ0FBQyxLQUFhO0lBQzVDLE1BQU0sVUFBVSxHQUF3QixFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFFbEUsTUFBTSxhQUFhLEdBQTBCLEVBQUUsQ0FBQztJQUNoRCxNQUFNLGVBQWUsR0FBRyxDQUFDLFdBQW1CLEVBQXVCLEVBQUUsQ0FDbkUsQ0FBQyxhQUFhLENBQUMsV0FBVyxNQUF6QixhQUFhLENBQUMsV0FBVyxJQUFNO1FBQzlCLElBQUksRUFBRSxjQUFjO1FBQ3BCLEtBQUs7UUFDTCxXQUFXO0tBQ1osRUFBQyxDQUFDO0lBRUwsT0FBTyxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUU7UUFDM0IsR0FBRztZQUNELE1BQU0sSUFBSSxLQUFLLENBQUMscUZBQXFGLENBQUMsQ0FBQztRQUN6RyxDQUFDO1FBQ0QsNkVBQTZFO1FBQzdFLDRFQUE0RTtRQUM1RSxtQ0FBbUM7UUFDbkMsR0FBRyxDQUFDLE1BQU0sRUFBRSxRQUFRO1lBQ2xCLHlFQUF5RTtZQUN6RSxJQUFJLFFBQVEsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDdkIsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2QyxDQUFDO1lBRUQseUJBQXlCO1lBQ3pCLElBQUksUUFBUSxLQUFLLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDakMsT0FBTyxRQUFRLENBQUM7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QUM7SUFDakQsQ0FBQztJQUNELFFBQVEsQ0FBQyxHQUFHLElBQW1EO1FBQzdELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQywyQkFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUNELGVBQWUsQ0FBQyxHQUFHLElBQTBEO1FBQzNFLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQywyQkFBWSxDQUFDLGVBQWUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUNELFdBQVcsQ0FBQyxHQUFHLElBQXNEO1FBQ25FLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQywyQkFBWSxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyx1QkFBQSxJQUFJLG1DQUFXLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsMENBQTBDO0lBQzFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxtQkFBbUIsS0FBbUIsRUFBRTtRQUNwRCxPQUFPLHVCQUFBLElBQUksbUNBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxtQkFBbUIsRUFBRSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELGdDQUFnQztJQUNoQyxLQUFLLENBQUMsU0FBUztRQUNiLE9BQU8sdUJBQUEsSUFBSSxtQ0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3JDLENBQUM7Q0FDRjtBQXBORCw0Q0FvTkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmcm9tQjY0IH0gZnJvbSAnQG15c3Rlbi9iY3MnO1xuaW1wb3J0IHsgaXMsIG1hc2sgfSBmcm9tICdzdXBlcnN0cnVjdCc7XG5pbXBvcnQgeyBPYmplY3RJZCwgU3VpT2JqZWN0UmVmIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25zLCBUcmFuc2FjdGlvbkFyZ3VtZW50LCBUcmFuc2FjdGlvblR5cGUsIFRyYW5zYWN0aW9uQmxvY2tJbnB1dCB9IGZyb20gJy4vVHJhbnNhY3Rpb25zJztcbmltcG9ydCB7IEJ1aWxkZXJDYWxsQXJnLCBnZXRJZEZyb21DYWxsQXJnLCBJbnB1dHMsIE9iamVjdENhbGxBcmcgfSBmcm9tICcuL0lucHV0cyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJsb2NrRGF0YUJ1aWxkZXIsIFRyYW5zYWN0aW9uRXhwaXJhdGlvbiB9IGZyb20gJy4vVHJhbnNhY3Rpb25EYXRhQmxvY2snO1xuaW1wb3J0IHsgY3JlYXRlIH0gZnJvbSAnLi91dGlscyc7XG5cbnR5cGUgVHJhbnNhY3Rpb25SZXN1bHQgPSBUcmFuc2FjdGlvbkFyZ3VtZW50ICYgVHJhbnNhY3Rpb25Bcmd1bWVudFtdO1xuXG5mdW5jdGlvbiBjcmVhdGVUcmFuc2FjdGlvblJlc3VsdChpbmRleDogbnVtYmVyKTogVHJhbnNhY3Rpb25SZXN1bHQge1xuICBjb25zdCBiYXNlUmVzdWx0OiBUcmFuc2FjdGlvbkFyZ3VtZW50ID0geyBraW5kOiAnUmVzdWx0JywgaW5kZXggfTtcblxuICBjb25zdCBuZXN0ZWRSZXN1bHRzOiBUcmFuc2FjdGlvbkFyZ3VtZW50W10gPSBbXTtcbiAgY29uc3QgbmVzdGVkUmVzdWx0Rm9yID0gKHJlc3VsdEluZGV4OiBudW1iZXIpOiBUcmFuc2FjdGlvbkFyZ3VtZW50ID0+XG4gICAgKG5lc3RlZFJlc3VsdHNbcmVzdWx0SW5kZXhdID8/PSB7XG4gICAgICBraW5kOiAnTmVzdGVkUmVzdWx0JyxcbiAgICAgIGluZGV4LFxuICAgICAgcmVzdWx0SW5kZXgsXG4gICAgfSk7XG5cbiAgcmV0dXJuIG5ldyBQcm94eShiYXNlUmVzdWx0LCB7XG4gICAgc2V0KCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgdHJhbnNhY3Rpb24gcmVzdWx0IGlzIGEgcHJveHksIGFuZCBkb2VzIG5vdCBzdXBwb3J0IHNldHRpbmcgcHJvcGVydGllcyBkaXJlY3RseScpO1xuICAgIH0sXG4gICAgLy8gVE9ETzogSW5zdGVhZCBvZiBtYWtpbmcgdGhpcyByZXR1cm4gYSBjb25jcmV0ZSBhcmd1bWVudCwgd2Ugc2hvdWxkIGlkZWFsbHlcbiAgICAvLyBtYWtlIGl0IHJlZmVyZW5jZS1iYXNlZCAoc28gdGhhdCB0aGlzIGdldHMgcmVzb2x2ZWQgYXQgYnVpbGQtdGltZSksIHdoaWNoXG4gICAgLy8gYWxsb3dzIHJlLW9yZGVyaW5nIHRyYW5zYWN0aW9ucy5cbiAgICBnZXQodGFyZ2V0LCBwcm9wZXJ0eSkge1xuICAgICAgLy8gVGhpcyBhbGxvd3MgdGhpcyB0cmFuc2FjdGlvbiBhcmd1bWVudCB0byBiZSB1c2VkIGluIHRoZSBzaW5ndWxhciBmb3JtOlxuICAgICAgaWYgKHByb3BlcnR5IGluIHRhcmdldCkge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wZXJ0eSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFN1cHBvcnQgZGVzdHJ1Y3R1cmluZzpcbiAgICAgIGlmIChwcm9wZXJ0eSA9PT0gU3ltYm9sLml0ZXJhdG9yKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiogKCkge1xuICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgeWllbGQgbmVzdGVkUmVzdWx0Rm9yKGkpO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBwcm9wZXJ0eSA9PT0gJ3N5bWJvbCcpIHJldHVybjtcblxuICAgICAgY29uc3QgcmVzdWx0SW5kZXggPSBwYXJzZUludChwcm9wZXJ0eSwgMTApO1xuICAgICAgaWYgKE51bWJlci5pc05hTihyZXN1bHRJbmRleCkgfHwgcmVzdWx0SW5kZXggPCAwKSByZXR1cm47XG4gICAgICByZXR1cm4gbmVzdGVkUmVzdWx0Rm9yKHJlc3VsdEluZGV4KTtcbiAgICB9LFxuICB9KSBhcyBUcmFuc2FjdGlvblJlc3VsdDtcbn1cblxuY29uc3QgVFJBTlNBQ1RJT05fQlJBTkQgPSBTeW1ib2wuZm9yKCdAbXlzdGVuL3RyYW5zYWN0aW9uJyk7XG5cbi8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBnYXMgb2JqZWN0cyB0aGF0IGNhbiBiZSBzZWxlY3RlZCBmb3Igb25lIHRyYW5zYWN0aW9uLlxuY29uc3QgTUFYX0dBU19PQkpFQ1RTID0gMjU2O1xuXG4vLyBUaGUgbWF4aW11bSBnYXMgdGhhdCBpcyBhbGxvd2VkLlxuY29uc3QgTUFYX0dBUyA9IDEwMDAwMDAwMDA7XG5cbi8vIEEgZ3Vlc3MgYWJvdXQgaG93IG11Y2ggb3ZlcmhlYWQgZWFjaCBjb2luIHByb3ZpZGVzIGZvciBnYXMgY2FsY3VsYXRpb25zLlxuLy8gQHRzLWlnbm9yZVxuY29uc3QgR0FTX09WRVJIRUFEX1BFUl9DT0lOID0gMTBuO1xuXG5pbnRlcmZhY2UgQnVpbGRPcHRpb25zIHtcbiAgb25seVRyYW5zYWN0aW9uS2luZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVHJhbnNhY3Rpb24gQnVpbGRlclxuICovXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25CbG9jayB7XG4gIC8qKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0IGlzIGFuIGluc3RhbmNlIG9mIHRoZSBUcmFuc2FjdGlvbiBidWlsZGVyIGNsYXNzLiAqL1xuICBzdGF0aWMgaXMob2JqOiB1bmtub3duKTogb2JqIGlzIFRyYW5zYWN0aW9uQmxvY2sge1xuICAgIHJldHVybiAhIW9iaiAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiAob2JqIGFzIGFueSlbVFJBTlNBQ1RJT05fQlJBTkRdID09PSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGZyb20gYSBzZXJpYWxpemUgdHJhbnNhY3Rpb24ga2luZCAoYnVpbHQgd2l0aCBgYnVpbGQoeyBvbmx5VHJhbnNhY3Rpb25LaW5kOiB0cnVlIH0pYCkgdG8gYSBgVHJhbnNhY3Rpb25gIGNsYXNzLlxuICAgKiBTdXBwb3J0cyBlaXRoZXIgYSBieXRlIGFycmF5LCBvciBiYXNlNjQtZW5jb2RlZCBieXRlcy5cbiAgICovXG4gIHN0YXRpYyBmcm9tS2luZChzZXJpYWxpemVkOiBzdHJpbmcgfCBVaW50OEFycmF5KSB7XG4gICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb25CbG9jaygpO1xuXG4gICAgdHguI2Jsb2NrRGF0YSA9IFRyYW5zYWN0aW9uQmxvY2tEYXRhQnVpbGRlci5mcm9tS2luZEJ5dGVzKFxuICAgICAgdHlwZW9mIHNlcmlhbGl6ZWQgPT09ICdzdHJpbmcnID8gZnJvbUI2NChzZXJpYWxpemVkKSA6IHNlcmlhbGl6ZWRcbiAgICApO1xuXG4gICAgcmV0dXJuIHR4O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGZyb20gYSBzZXJpYWxpemVkIHRyYW5zYWN0aW9uIGZvcm1hdCB0byBhIGBUcmFuc2FjdGlvbmAgY2xhc3MuXG4gICAqIFRoZXJlIGFyZSB0d28gc3VwcG9ydGVkIHNlcmlhbGl6ZWQgZm9ybWF0czpcbiAgICogLSBBIHN0cmluZyByZXR1cm5lZCBmcm9tIGBUcmFuc2FjdGlvbiNzZXJpYWxpemVgLiBUaGUgc2VyaWFsaXplZCBmb3JtYXQgbXVzdCBiZSBjb21wYXRpYmxlLCBvciBpdCB3aWxsIHRocm93IGFuIGVycm9yLlxuICAgKiAtIEEgYnl0ZSBhcnJheSAob3IgYmFzZTY0LWVuY29kZWQgYnl0ZXMpIGNvbnRhaW5pbmcgQkNTIHRyYW5zYWN0aW9uIGRhdGEuXG4gICAqL1xuICBzdGF0aWMgZnJvbShzZXJpYWxpemVkOiBzdHJpbmcgfCBVaW50OEFycmF5KSB7XG4gICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb25CbG9jaygpO1xuXG4gICAgLy8gQ2hlY2sgZm9yIGJ5dGVzOlxuICAgIGlmICh0eXBlb2Ygc2VyaWFsaXplZCAhPT0gJ3N0cmluZycgfHwgIXNlcmlhbGl6ZWQuc3RhcnRzV2l0aCgneycpKSB7XG4gICAgICB0eC4jYmxvY2tEYXRhID0gVHJhbnNhY3Rpb25CbG9ja0RhdGFCdWlsZGVyLmZyb21CeXRlcyhcbiAgICAgICAgdHlwZW9mIHNlcmlhbGl6ZWQgPT09ICdzdHJpbmcnID8gZnJvbUI2NChzZXJpYWxpemVkKSA6IHNlcmlhbGl6ZWRcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHR4LiNibG9ja0RhdGEgPSBUcmFuc2FjdGlvbkJsb2NrRGF0YUJ1aWxkZXIucmVzdG9yZShKU09OLnBhcnNlKHNlcmlhbGl6ZWQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHg7XG4gIH1cblxuICAvKiogQSBoZWxwZXIgdG8gcmV0cmlldmUgdGhlIFRyYW5zYWN0aW9uIGJ1aWxkZXIgYFRyYW5zYWN0aW9uc2AgKi9cbiAgc3RhdGljIGdldCBUcmFuc2FjdGlvbnMoKSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9ucztcbiAgfVxuXG4gIC8qKiBBIGhlbHBlciB0byByZXRyaWV2ZSB0aGUgVHJhbnNhY3Rpb24gYnVpbGRlciBgSW5wdXRzYCAqL1xuICBzdGF0aWMgZ2V0IElucHV0cygpIHtcbiAgICByZXR1cm4gSW5wdXRzO1xuICB9XG5cbiAgc2V0U2VuZGVyKHNlbmRlcjogc3RyaW5nKSB7XG4gICAgdGhpcy4jYmxvY2tEYXRhLnNlbmRlciA9IHNlbmRlcjtcbiAgfVxuICAvKipcbiAgICogU2V0cyB0aGUgc2VuZGVyIG9ubHkgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gc2V0LlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3Igc3BvbnNvcmVkIHRyYW5zYWN0aW9uIGZsb3dzIHdoZXJlIHRoZSBzZW5kZXIgbWF5IG5vdCBiZSB0aGUgc2FtZSBhcyB0aGUgc2lnbmVyIGFkZHJlc3MuXG4gICAqL1xuICBzZXRTZW5kZXJJZk5vdFNldChzZW5kZXI6IHN0cmluZykge1xuICAgIGlmICghdGhpcy4jYmxvY2tEYXRhLnNlbmRlcikge1xuICAgICAgdGhpcy4jYmxvY2tEYXRhLnNlbmRlciA9IHNlbmRlcjtcbiAgICB9XG4gIH1cbiAgc2V0RXhwaXJhdGlvbihleHBpcmF0aW9uPzogVHJhbnNhY3Rpb25FeHBpcmF0aW9uKSB7XG4gICAgdGhpcy4jYmxvY2tEYXRhLmV4cGlyYXRpb24gPSBleHBpcmF0aW9uO1xuICB9XG4gIHNldEdhc1ByaWNlKHByaWNlOiBudW1iZXIgfCBiaWdpbnQpIHtcbiAgICB0aGlzLiNibG9ja0RhdGEuZ2FzQ29uZmlnLnByaWNlID0gU3RyaW5nKHByaWNlKTtcbiAgfVxuICBzZXRHYXNCdWRnZXQoYnVkZ2V0OiBudW1iZXIgfCBiaWdpbnQpIHtcbiAgICB0aGlzLiNibG9ja0RhdGEuZ2FzQ29uZmlnLmJ1ZGdldCA9IFN0cmluZyhidWRnZXQpO1xuICB9XG4gIHNldEdhc093bmVyKG93bmVyOiBzdHJpbmcpIHtcbiAgICB0aGlzLiNibG9ja0RhdGEuZ2FzQ29uZmlnLm93bmVyID0gb3duZXI7XG4gIH1cbiAgc2V0R2FzUGF5bWVudChwYXltZW50czogU3VpT2JqZWN0UmVmW10pIHtcbiAgICBpZiAocGF5bWVudHMubGVuZ3RoID49IE1BWF9HQVNfT0JKRUNUUykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXltZW50IG9iamVjdHMgZXhjZWVkIG1heGltdW0gYW1vdW50ICR7TUFYX0dBU19PQkpFQ1RTfWApO1xuICAgIH1cbiAgICB0aGlzLiNibG9ja0RhdGEuZ2FzQ29uZmlnLnBheW1lbnQgPSBwYXltZW50cy5tYXAoKHBheW1lbnQpID0+IG1hc2socGF5bWVudCwgU3VpT2JqZWN0UmVmKSk7XG4gIH1cblxuICAjYmxvY2tEYXRhOiBUcmFuc2FjdGlvbkJsb2NrRGF0YUJ1aWxkZXI7XG4gIC8qKiBHZXQgYSBzbmFwc2hvdCBvZiB0aGUgdHJhbnNhY3Rpb24gZGF0YSwgaW4gSlNPTiBmb3JtOiAqL1xuICBnZXQgYmxvY2tEYXRhKCkge1xuICAgIHJldHVybiB0aGlzLiNibG9ja0RhdGEuc25hcHNob3QoKTtcbiAgfVxuXG4gIC8vIFVzZWQgdG8gYnJhbmQgdHJhbnNhY3Rpb24gY2xhc3NlcyBzbyB0aGF0IHRoZXkgY2FuIGJlIGlkZW50aWZpZWQsIGV2ZW4gYmV0d2VlbiBtdWx0aXBsZSBjb3BpZXNcbiAgLy8gb2YgdGhlIGJ1aWxkZXIuXG4gIGdldCBbVFJBTlNBQ1RJT05fQlJBTkRdKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3RydWN0b3IodHJhbnNhY3Rpb24/OiBUcmFuc2FjdGlvbkJsb2NrKSB7XG4gICAgdGhpcy4jYmxvY2tEYXRhID0gbmV3IFRyYW5zYWN0aW9uQmxvY2tEYXRhQnVpbGRlcih0cmFuc2FjdGlvbiA/IHRyYW5zYWN0aW9uLiNibG9ja0RhdGEgOiB1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqIFJldHVybnMgYW4gYXJndW1lbnQgZm9yIHRoZSBnYXMgY29pbiwgdG8gYmUgdXNlZCBpbiBhIHRyYW5zYWN0aW9uLiAqL1xuICBnZXQgZ2FzKCk6IFRyYW5zYWN0aW9uQXJndW1lbnQge1xuICAgIHJldHVybiB7IGtpbmQ6ICdHYXNDb2luJyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIER5bmFtaWNhbGx5IGNyZWF0ZSBhIG5ldyBpbnB1dCwgd2hpY2ggaXMgc2VwYXJhdGUgZnJvbSB0aGUgYGlucHV0YC4gVGhpcyBpcyBpbXBvcnRhbnRcbiAgICogZm9yIGdlbmVyYXRlZCBjbGllbnRzIHRvIGJlIGFibGUgdG8gZGVmaW5lIHVuaXF1ZSBpbnB1dHMgdGhhdCBhcmUgbm9uLW92ZXJsYXBwaW5nIHdpdGggdGhlXG4gICAqIGRlZmluZWQgaW5wdXRzLlxuICAgKlxuICAgKiBGb3IgYFVpbnQ4QXJyYXlgIHR5cGUgYXV0b21hdGljYWxseSBjb252ZXJ0IHRoZSBpbnB1dCBpbnRvIGEgYFB1cmVgIENhbGxBcmcsIHNpbmNlIHRoaXNcbiAgICogaXMgdGhlIGZvcm1hdCByZXF1aXJlZCBmb3IgY3VzdG9tIHNlcmlhbGl6YXRpb24uXG4gICAqXG4gICAqL1xuICBpbnB1dCh0eXBlOiAnb2JqZWN0JyB8ICdwdXJlJywgdmFsdWU/OiB1bmtub3duKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLiNibG9ja0RhdGEuaW5wdXRzLmxlbmd0aDtcbiAgICBjb25zdCBpbnB1dCA9IGNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAga2luZDogJ0lucHV0JyxcbiAgICAgICAgLy8gYmlnaW50cyBjYW4ndCBiZSBzZXJpYWxpemVkIHRvIEpTT04sIHNvIGp1c3Qgc3RyaW5nLWNvbnZlcnQgdGhlbSBoZXJlOlxuICAgICAgICB2YWx1ZTogdHlwZW9mIHZhbHVlID09PSAnYmlnaW50JyA/IFN0cmluZyh2YWx1ZSkgOiB2YWx1ZSxcbiAgICAgICAgaW5kZXgsXG4gICAgICAgIHR5cGUsXG4gICAgICB9LFxuICAgICAgVHJhbnNhY3Rpb25CbG9ja0lucHV0XG4gICAgKTtcbiAgICB0aGlzLiNibG9ja0RhdGEuaW5wdXRzLnB1c2goaW5wdXQpO1xuICAgIHJldHVybiBpbnB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBuZXcgb2JqZWN0IGlucHV0IHRvIHRoZSB0cmFuc2FjdGlvbi5cbiAgICovXG4gIG9iamVjdCh2YWx1ZTogT2JqZWN0SWQgfCBPYmplY3RDYWxsQXJnKSB7XG4gICAgY29uc3QgaWQgPSBnZXRJZEZyb21DYWxsQXJnKHZhbHVlKTtcbiAgICAvLyBkZWR1cGxpY2F0ZVxuICAgIGNvbnN0IGluc2VydGVkID0gdGhpcy4jYmxvY2tEYXRhLmlucHV0cy5maW5kKChpKSA9PiBpLnR5cGUgPT09ICdvYmplY3QnICYmIGlkID09PSBnZXRJZEZyb21DYWxsQXJnKGkudmFsdWUpKTtcbiAgICByZXR1cm4gaW5zZXJ0ZWQgPz8gdGhpcy5pbnB1dCgnb2JqZWN0JywgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIG5ldyBub24tb2JqZWN0IGlucHV0IHRvIHRoZSB0cmFuc2FjdGlvbi5cbiAgICovXG4gIHB1cmUoXG4gICAgLyoqXG4gICAgICogVGhlIHB1cmUgdmFsdWUgdGhhdCB3aWxsIGJlIHVzZWQgYXMgdGhlIGlucHV0IHZhbHVlLiBJZiB0aGlzIGlzIGEgVWludDhBcnJheSwgdGhlbiB0aGUgdmFsdWVcbiAgICAgKiBpcyBhc3N1bWVkIHRvIGJlIHJhdyBieXRlcywgYW5kIHdpbGwgYmUgdXNlZCBkaXJlY3RseS5cbiAgICAgKi9cbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICAvKipcbiAgICAgKiBUaGUgQkNTIHR5cGUgdG8gc2VyaWFsaXplIHRoZSB2YWx1ZSBpbnRvLiBJZiBub3QgcHJvdmlkZWQsIHRoZSB0eXBlIHdpbGwgYXV0b21hdGljYWxseSBiZSBkZXRlcm1pbmVkXG4gICAgICogYmFzZWQgb24gaG93IHRoZSBpbnB1dCBpcyB1c2VkLlxuICAgICAqL1xuICAgIHR5cGU/OiBzdHJpbmdcbiAgKSB7XG4gICAgLy8gVE9ETzogd2UgY2FuIGFsc28gZG8gc29tZSBkZWR1cGxpY2F0aW9uIGhlcmVcbiAgICByZXR1cm4gdGhpcy5pbnB1dChcbiAgICAgICdwdXJlJyxcbiAgICAgIHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSA/IElucHV0cy5QdXJlKHZhbHVlKSA6IHR5cGUgPyBJbnB1dHMuUHVyZSh2YWx1ZSwgdHlwZSkgOiB2YWx1ZVxuICAgICk7XG4gIH1cblxuICAvKiogQWRkIGEgdHJhbnNhY3Rpb24gdG8gdGhlIHRyYW5zYWN0aW9uIGJsb2NrLiAqL1xuICBhZGQodHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uVHlwZSkge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy4jYmxvY2tEYXRhLnRyYW5zYWN0aW9ucy5wdXNoKHRyYW5zYWN0aW9uKTtcbiAgICByZXR1cm4gY3JlYXRlVHJhbnNhY3Rpb25SZXN1bHQoaW5kZXggLSAxKTtcbiAgfVxuXG4gIC8vIE1ldGhvZCBzaG9ydGhhbmRzOlxuXG4gIHNwbGl0Q29pbnMoLi4uYXJnczogUGFyYW1ldGVyczwodHlwZW9mIFRyYW5zYWN0aW9ucylbJ1NwbGl0Q29pbnMnXT4pIHtcbiAgICByZXR1cm4gdGhpcy5hZGQoVHJhbnNhY3Rpb25zLlNwbGl0Q29pbnMoLi4uYXJncykpO1xuICB9XG4gIG1lcmdlQ29pbnMoLi4uYXJnczogUGFyYW1ldGVyczwodHlwZW9mIFRyYW5zYWN0aW9ucylbJ01lcmdlQ29pbnMnXT4pIHtcbiAgICByZXR1cm4gdGhpcy5hZGQoVHJhbnNhY3Rpb25zLk1lcmdlQ29pbnMoLi4uYXJncykpO1xuICB9XG4gIHB1Ymxpc2goLi4uYXJnczogUGFyYW1ldGVyczwodHlwZW9mIFRyYW5zYWN0aW9ucylbJ1B1Ymxpc2gnXT4pIHtcbiAgICByZXR1cm4gdGhpcy5hZGQoVHJhbnNhY3Rpb25zLlB1Ymxpc2goLi4uYXJncykpO1xuICB9XG4gIG1vdmVDYWxsKC4uLmFyZ3M6IFBhcmFtZXRlcnM8KHR5cGVvZiBUcmFuc2FjdGlvbnMpWydNb3ZlQ2FsbCddPikge1xuICAgIHJldHVybiB0aGlzLmFkZChUcmFuc2FjdGlvbnMuTW92ZUNhbGwoLi4uYXJncykpO1xuICB9XG4gIHRyYW5zZmVyT2JqZWN0cyguLi5hcmdzOiBQYXJhbWV0ZXJzPCh0eXBlb2YgVHJhbnNhY3Rpb25zKVsnVHJhbnNmZXJPYmplY3RzJ10+KSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkKFRyYW5zYWN0aW9ucy5UcmFuc2Zlck9iamVjdHMoLi4uYXJncykpO1xuICB9XG4gIG1ha2VNb3ZlVmVjKC4uLmFyZ3M6IFBhcmFtZXRlcnM8KHR5cGVvZiBUcmFuc2FjdGlvbnMpWydNYWtlTW92ZVZlYyddPikge1xuICAgIHJldHVybiB0aGlzLmFkZChUcmFuc2FjdGlvbnMuTWFrZU1vdmVWZWMoLi4uYXJncykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSB0aGUgdHJhbnNhY3Rpb24gdG8gYSBzdHJpbmcgc28gdGhhdCBpdCBjYW4gYmUgc2VudCB0byBhIHNlcGFyYXRlIGNvbnRleHQuXG4gICAqIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gYGJ1aWxkYCBpbiB0aGF0IGl0IGRvZXMgbm90IHNlcmlhbGl6ZSB0byBCQ1MgYnl0ZXMsIGFuZCBpbnN0ZWFkXG4gICAqIHVzZXMgYSBzZXBhcmF0ZSBmb3JtYXQgdGhhdCBpcyB1bmlxdWUgdG8gdGhlIHRyYW5zYWN0aW9uIGJ1aWxkZXIuIFRoaXMgYWxsb3dzXG4gICAqIHVzIHRvIHNlcmlhbGl6ZSBwYXJ0aWFsbHktY29tcGxldGUgdHJhbnNhY3Rpb25zLCB0aGF0IGNhbiB0aGVuIGJlIGNvbXBsZXRlZCBhbmRcbiAgICogYnVpbHQgaW4gYSBzZXBhcmF0ZSBjb250ZXh0LlxuICAgKlxuICAgKiBGb3IgZXhhbXBsZSwgYSBkYXBwIGNhbiBjb25zdHJ1Y3QgYSB0cmFuc2FjdGlvbiwgYnV0IG5vdCBwcm92aWRlIGdhcyBvYmplY3RzXG4gICAqIG9yIGEgZ2FzIGJ1ZGdldC4gVGhlIHRyYW5zYWN0aW9uIHRoZW4gY2FuIGJlIHNlbnQgdG8gdGhlIHdhbGxldCwgd2hlcmUgdGhpc1xuICAgKiBpbmZvcm1hdGlvbiBpcyBhdXRvbWF0aWNhbGx5IGZpbGxlZCBpbiAoZS5nLiBieSBxdWVyeWluZyBmb3IgY29pbiBvYmplY3RzXG4gICAqIGFuZCBwZXJmb3JtaW5nIGEgZHJ5IHJ1bikuXG4gICAqL1xuICBzZXJpYWxpemUoKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuI2Jsb2NrRGF0YS5zbmFwc2hvdCgpKTtcbiAgfVxuXG4gIC8qKiBCdWlsZCB0aGUgdHJhbnNhY3Rpb24gdG8gQkNTIGJ5dGVzLiAqL1xuICBhc3luYyBidWlsZCh7IG9ubHlUcmFuc2FjdGlvbktpbmQgfTogQnVpbGRPcHRpb25zID0ge30pOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICByZXR1cm4gdGhpcy4jYmxvY2tEYXRhLmJ1aWxkKHsgb25seVRyYW5zYWN0aW9uS2luZCB9KTtcbiAgfVxuXG4gIC8qKiBEZXJpdmUgdHJhbnNhY3Rpb24gZGlnZXN0ICovXG4gIGFzeW5jIGdldERpZ2VzdCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLiNibG9ja0RhdGEuZ2V0RGlnZXN0KCk7XG4gIH1cbn1cbiJdfQ==