@bitgo-beta/statics 15.1.1-beta.214 → 15.1.1-beta.2140

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 (137) hide show
  1. package/dist/src/account.d.ts +1188 -73
  2. package/dist/src/account.d.ts.map +1 -1
  3. package/dist/src/account.js +1794 -161
  4. package/dist/src/ada.d.ts +1 -0
  5. package/dist/src/ada.d.ts.map +1 -1
  6. package/dist/src/ada.js +7 -3
  7. package/dist/src/allCoinsAndTokens.d.ts +2 -0
  8. package/dist/src/allCoinsAndTokens.d.ts.map +1 -0
  9. package/dist/src/allCoinsAndTokens.js +1916 -0
  10. package/dist/src/avaxp.d.ts +1 -0
  11. package/dist/src/avaxp.d.ts.map +1 -1
  12. package/dist/src/avaxp.js +8 -3
  13. package/dist/src/base.d.ts +2981 -45
  14. package/dist/src/base.d.ts.map +1 -1
  15. package/dist/src/base.js +3101 -56
  16. package/dist/src/bip44CoinTypes.d.ts +26 -0
  17. package/dist/src/bip44CoinTypes.d.ts.map +1 -0
  18. package/dist/src/bip44CoinTypes.js +148 -0
  19. package/dist/src/canton.d.ts +35 -0
  20. package/dist/src/canton.d.ts.map +1 -0
  21. package/dist/src/canton.js +51 -0
  22. package/dist/src/coinFeatures.d.ts +134 -0
  23. package/dist/src/coinFeatures.d.ts.map +1 -0
  24. package/dist/src/coinFeatures.js +817 -0
  25. package/dist/src/coins/adaTokens.d.ts +2 -0
  26. package/dist/src/coins/adaTokens.d.ts.map +1 -0
  27. package/dist/src/coins/adaTokens.js +27 -0
  28. package/dist/src/coins/avaxTokens.d.ts +2 -0
  29. package/dist/src/coins/avaxTokens.d.ts.map +1 -0
  30. package/dist/src/coins/avaxTokens.js +133 -0
  31. package/dist/src/coins/botOfcTokens.d.ts +3 -0
  32. package/dist/src/coins/botOfcTokens.d.ts.map +1 -0
  33. package/dist/src/coins/botOfcTokens.js +352 -0
  34. package/dist/src/coins/botTokens.d.ts +3 -0
  35. package/dist/src/coins/botTokens.d.ts.map +1 -0
  36. package/dist/src/coins/botTokens.js +1662 -0
  37. package/dist/src/coins/bscTokens.d.ts +2 -0
  38. package/dist/src/coins/bscTokens.d.ts.map +1 -0
  39. package/dist/src/coins/bscTokens.js +421 -0
  40. package/dist/src/coins/cantonTokens.d.ts +2 -0
  41. package/dist/src/coins/cantonTokens.d.ts.map +1 -0
  42. package/dist/src/coins/cantonTokens.js +134 -0
  43. package/dist/src/coins/cosmosTokens.d.ts +2 -0
  44. package/dist/src/coins/cosmosTokens.d.ts.map +1 -0
  45. package/dist/src/coins/cosmosTokens.js +14 -0
  46. package/dist/src/coins/erc20Coins.d.ts +2 -0
  47. package/dist/src/coins/erc20Coins.d.ts.map +1 -0
  48. package/dist/src/coins/erc20Coins.js +2087 -0
  49. package/dist/src/coins/erc7984Tokens.d.ts +17 -0
  50. package/dist/src/coins/erc7984Tokens.d.ts.map +1 -0
  51. package/dist/src/coins/erc7984Tokens.js +40 -0
  52. package/dist/src/coins/generateERC20.d.ts +36 -0
  53. package/dist/src/coins/generateERC20.d.ts.map +1 -0
  54. package/dist/src/coins/generateERC20.js +46 -0
  55. package/dist/src/coins/hoodethTokens.d.ts +2 -0
  56. package/dist/src/coins/hoodethTokens.d.ts.map +1 -0
  57. package/dist/src/coins/hoodethTokens.js +319 -0
  58. package/dist/src/coins/jettonTokens.d.ts +2 -0
  59. package/dist/src/coins/jettonTokens.d.ts.map +1 -0
  60. package/dist/src/coins/jettonTokens.js +19 -0
  61. package/dist/src/coins/nep141Tokens.d.ts +2 -0
  62. package/dist/src/coins/nep141Tokens.d.ts.map +1 -0
  63. package/dist/src/coins/nep141Tokens.js +18 -0
  64. package/dist/src/coins/ofcCoins.d.ts +2 -0
  65. package/dist/src/coins/ofcCoins.d.ts.map +1 -0
  66. package/dist/src/coins/ofcCoins.js +1503 -0
  67. package/dist/src/coins/ofcErc20Coins.d.ts +4 -0
  68. package/dist/src/coins/ofcErc20Coins.d.ts.map +1 -0
  69. package/dist/src/coins/ofcErc20Coins.js +1907 -0
  70. package/dist/src/coins/ofcHoodethTokens.d.ts +2 -0
  71. package/dist/src/coins/ofcHoodethTokens.d.ts.map +1 -0
  72. package/dist/src/coins/ofcHoodethTokens.js +317 -0
  73. package/dist/src/coins/polygonTokens.d.ts +2 -0
  74. package/dist/src/coins/polygonTokens.d.ts.map +1 -0
  75. package/dist/src/coins/polygonTokens.js +220 -0
  76. package/dist/src/coins/polyxTokens.d.ts +2 -0
  77. package/dist/src/coins/polyxTokens.d.ts.map +1 -0
  78. package/dist/src/coins/polyxTokens.js +22 -0
  79. package/dist/src/coins/sip10Tokens.d.ts +2 -0
  80. package/dist/src/coins/sip10Tokens.d.ts.map +1 -0
  81. package/dist/src/coins/sip10Tokens.js +25 -0
  82. package/dist/src/coins/solTokens.d.ts +3 -0
  83. package/dist/src/coins/solTokens.d.ts.map +1 -0
  84. package/dist/src/coins/solTokens.js +538 -0
  85. package/dist/src/coins/vetTokens.d.ts +2 -0
  86. package/dist/src/coins/vetTokens.d.ts.map +1 -0
  87. package/dist/src/coins/vetTokens.js +11 -0
  88. package/dist/src/coins.d.ts +22 -1
  89. package/dist/src/coins.d.ts.map +1 -1
  90. package/dist/src/coins.js +485 -2064
  91. package/dist/src/constants.d.ts +6 -0
  92. package/dist/src/constants.d.ts.map +1 -1
  93. package/dist/src/constants.js +8 -2
  94. package/dist/src/errors.d.ts +15 -0
  95. package/dist/src/errors.d.ts.map +1 -1
  96. package/dist/src/errors.js +37 -2
  97. package/dist/src/flrp.d.ts +41 -0
  98. package/dist/src/flrp.d.ts.map +1 -0
  99. package/dist/src/flrp.js +66 -0
  100. package/dist/src/hypeevm.d.ts +28 -0
  101. package/dist/src/hypeevm.d.ts.map +1 -0
  102. package/dist/src/hypeevm.js +60 -0
  103. package/dist/src/index.d.ts +8 -1
  104. package/dist/src/index.d.ts.map +1 -1
  105. package/dist/src/index.js +53 -3
  106. package/dist/src/kaspa.d.ts +35 -0
  107. package/dist/src/kaspa.d.ts.map +1 -0
  108. package/dist/src/kaspa.js +63 -0
  109. package/dist/src/lightning.d.ts +44 -0
  110. package/dist/src/lightning.d.ts.map +1 -0
  111. package/dist/src/lightning.js +64 -0
  112. package/dist/src/map.d.ts +38 -1
  113. package/dist/src/map.d.ts.map +1 -1
  114. package/dist/src/map.js +269 -35
  115. package/dist/src/networkFeatureMapForTokens.d.ts +30 -0
  116. package/dist/src/networkFeatureMapForTokens.d.ts.map +1 -0
  117. package/dist/src/networkFeatureMapForTokens.js +92 -0
  118. package/dist/src/networks.d.ts +2065 -72
  119. package/dist/src/networks.d.ts.map +1 -1
  120. package/dist/src/networks.js +2532 -108
  121. package/dist/src/ofc.d.ts +695 -3
  122. package/dist/src/ofc.d.ts.map +1 -1
  123. package/dist/src/ofc.js +1653 -28
  124. package/dist/src/safe.d.ts +22 -0
  125. package/dist/src/safe.d.ts.map +1 -0
  126. package/dist/src/safe.js +28 -0
  127. package/dist/src/tokenConfig.d.ts +718 -114
  128. package/dist/src/tokenConfig.d.ts.map +1 -1
  129. package/dist/src/tokenConfig.js +1132 -233
  130. package/dist/src/utxo.d.ts +7 -2
  131. package/dist/src/utxo.d.ts.map +1 -1
  132. package/dist/src/utxo.js +132 -4
  133. package/dist/tsconfig.tsbuildinfo +1 -1
  134. package/package.json +6 -3
  135. package/.mocharc.js +0 -10
  136. package/.prettierignore +0 -2
  137. package/CHANGELOG.md +0 -1584
package/dist/src/map.js CHANGED
@@ -2,51 +2,166 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CoinMap = void 0;
4
4
  const errors_1 = require("./errors");
5
+ const account_1 = require("./account");
5
6
  class CoinMap {
6
7
  constructor() {
7
8
  this._map = new Map();
8
9
  this._coinByIds = new Map();
9
10
  // Holds key equivalences used during an asset name migration
10
11
  this._coinByAliases = new Map();
12
+ // map of coin by address -> the key is the family:contractAddress
13
+ // the family is the where the coin is e.g l1 chains like eth, bsc etc. or l2 like arbeth, celo etc.
14
+ this._coinByContractAddress = new Map();
15
+ // map of coin by NFT collection ID -> the key is the (t)family:nftCollectionID
16
+ this._coinByNftCollectionID = new Map();
17
+ // Lazily initialized cache for chainId to coin name mapping (derived from network definitions)
18
+ this._coinByChainId = null;
11
19
  // Do not instantiate
12
20
  }
21
+ static contractAddressKey(coin) {
22
+ return `${coin.family}:${coin.contractAddress}`;
23
+ }
24
+ static nftCollectionIdKey(coin) {
25
+ return `${coin.prefix}${coin.family}:${coin.nftCollectionId}`;
26
+ }
27
+ /**
28
+ * Whether a different token with the same contract address (or NFT collection id) is already
29
+ * registered. Token identity in the map is keyed by name/id/alias, but a token also claims a
30
+ * contract-address key (`family:contractAddress`) and, for NFTs, a collection-id key. Two tokens
31
+ * that share such a key but differ in name cannot coexist — `addCoin` throws on the second.
32
+ * Callers merging externally-sourced tokens use this to skip a colliding token rather than crash.
33
+ */
34
+ hasTokenAddressConflict(coin) {
35
+ if (coin instanceof account_1.ContractAddressDefinedToken) {
36
+ const key = CoinMap.contractAddressKey(coin);
37
+ const existing = this._coinByContractAddress.get(key);
38
+ return existing !== undefined && existing.network.type === coin.network.type;
39
+ }
40
+ if (coin instanceof account_1.NFTCollectionIdDefinedToken) {
41
+ const key = CoinMap.nftCollectionIdKey(coin);
42
+ const existing = this._coinByNftCollectionID.get(key);
43
+ return existing !== undefined && existing.network.type === coin.network.type;
44
+ }
45
+ return false;
46
+ }
13
47
  static fromCoins(coins) {
14
- return coins.reduce((coinMap, coin) => {
15
- if (coinMap.has(coin.name)) {
16
- throw new errors_1.DuplicateCoinDefinitionError(coin.name);
48
+ const coinMap = new CoinMap();
49
+ coins.forEach((coin) => {
50
+ coinMap.addCoin(coin);
51
+ });
52
+ return coinMap;
53
+ }
54
+ addCoin(coin) {
55
+ if (this._map.has(coin.name)) {
56
+ throw new errors_1.DuplicateCoinDefinitionError(coin.name);
57
+ }
58
+ if (this._coinByIds.has(coin.id)) {
59
+ throw new errors_1.DuplicateCoinIdDefinitionError(coin.id);
60
+ }
61
+ const alias = coin.alias;
62
+ if (alias && this._coinByAliases.has(alias)) {
63
+ throw new errors_1.DuplicateCoinDefinitionError(alias);
64
+ }
65
+ this._map.set(coin.name, coin);
66
+ this._coinByIds.set(coin.id, coin);
67
+ if (alias) {
68
+ this._coinByAliases.set(coin.alias, coin);
69
+ }
70
+ if (coin.isToken) {
71
+ if (coin instanceof account_1.ContractAddressDefinedToken) {
72
+ const contractAddressKey = CoinMap.contractAddressKey(coin);
73
+ const existingByContractAddress = this._coinByContractAddress.get(contractAddressKey);
74
+ if (existingByContractAddress) {
75
+ if (existingByContractAddress.network.type === coin.network.type) {
76
+ throw new errors_1.DuplicateContractAddressDefinitionError(contractAddressKey, existingByContractAddress.name);
77
+ }
78
+ }
79
+ else {
80
+ this._coinByContractAddress.set(contractAddressKey, coin);
81
+ }
82
+ }
83
+ else if (coin instanceof account_1.NFTCollectionIdDefinedToken) {
84
+ const nftCollectionKey = CoinMap.nftCollectionIdKey(coin);
85
+ const existingByNftCollectionId = this._coinByNftCollectionID.get(nftCollectionKey);
86
+ if (existingByNftCollectionId) {
87
+ if (existingByNftCollectionId.network.type === coin.network.type) {
88
+ throw new errors_1.DuplicateNftCollectionIdDefinitionError(nftCollectionKey, existingByNftCollectionId.name);
89
+ }
90
+ }
91
+ else {
92
+ this._coinByNftCollectionID.set(nftCollectionKey, coin);
93
+ }
94
+ }
95
+ }
96
+ }
97
+ /**
98
+ * Replace a coin (token or base coin) in the CoinMap with a new object carrying refreshed modifiable
99
+ * fields. The existing record is looked up by id, and the swap only happens when its immutable fields
100
+ * (id, name, contract address and alias) are unchanged. Anything else throws before the map
101
+ * is touched. Coins that are not in the map yet are added.
102
+ * @param {Readonly<BaseCoin>} coin new coin object
103
+ * @throws {CoinReplacementNotAllowedError} when an immutable field differs from the existing record
104
+ */
105
+ replace(coin) {
106
+ if (this.has(coin.id)) {
107
+ const oldCoin = this.get(coin.id);
108
+ CoinMap.assertImmutableFieldsUnchanged(oldCoin, coin);
109
+ this._map.delete(oldCoin.name);
110
+ this._coinByIds.delete(oldCoin.id);
111
+ if (oldCoin.alias) {
112
+ this._coinByAliases.delete(oldCoin.alias);
113
+ }
114
+ if (oldCoin instanceof account_1.ContractAddressDefinedToken) {
115
+ this._coinByContractAddress.delete(CoinMap.contractAddressKey(oldCoin));
116
+ }
117
+ else if (oldCoin instanceof account_1.NFTCollectionIdDefinedToken) {
118
+ this._coinByNftCollectionID.delete(CoinMap.nftCollectionIdKey(oldCoin));
17
119
  }
18
- coinMap._map.set(coin.name, coin);
19
- if (coinMap._coinByIds.has(coin.id)) {
20
- throw new errors_1.DuplicateCoinIdDefinitionError(coin.id);
120
+ }
121
+ this.addCoin(coin);
122
+ }
123
+ static assertImmutableFieldsUnchanged(oldCoin, newCoin) {
124
+ const oldContractAddress = oldCoin instanceof account_1.ContractAddressDefinedToken ? oldCoin.contractAddress : undefined;
125
+ const newContractAddress = newCoin instanceof account_1.ContractAddressDefinedToken ? newCoin.contractAddress : undefined;
126
+ if (oldCoin.id !== newCoin.id) {
127
+ throw new errors_1.CoinReplacementNotAllowedError(oldCoin.name, 'immutable field id changed');
128
+ }
129
+ if (oldCoin.name !== newCoin.name) {
130
+ throw new errors_1.CoinReplacementNotAllowedError(oldCoin.name, 'immutable field name changed');
131
+ }
132
+ if (oldContractAddress !== newContractAddress) {
133
+ throw new errors_1.CoinReplacementNotAllowedError(oldCoin.name, 'immutable field contractAddress changed');
134
+ }
135
+ if (oldCoin.alias !== newCoin.alias) {
136
+ throw new errors_1.CoinReplacementNotAllowedError(oldCoin.name, 'immutable field alias changed');
137
+ }
138
+ }
139
+ buildChainIdMap() {
140
+ const chainIdMap = new Map();
141
+ this._map.forEach((coin, coinName) => {
142
+ // Skip tokens - they share the same chainId as their parent chain
143
+ if (coin.isToken) {
144
+ return;
21
145
  }
22
- coinMap._coinByIds.set(coin.id, coin);
23
- const alias = coin.alias;
24
- if (alias) {
25
- if (coinMap.has(alias)) {
26
- throw new errors_1.DuplicateCoinDefinitionError(alias);
146
+ const network = coin.network;
147
+ if ('chainId' in network && typeof network.chainId === 'number') {
148
+ const chainId = network.chainId;
149
+ if (!chainIdMap.has(chainId)) {
150
+ chainIdMap.set(chainId, coinName);
27
151
  }
28
- coinMap._coinByAliases.set(alias, coin);
29
152
  }
30
- return coinMap;
31
- }, new CoinMap());
32
- }
33
- static coinNameFromChainId(chainId) {
34
- const ethLikeCoinFromChainId = {
35
- 1: 'eth',
36
- 42: 'teth',
37
- 5: 'gteth',
38
- 17000: 'hteth',
39
- 10001: 'ethw',
40
- 80001: 'tpolygon',
41
- 137: 'polygon',
42
- 56: 'bsc',
43
- 97: 'tbsc',
44
- 42161: 'arbeth',
45
- 421614: 'tarbeth',
46
- 10: 'opeth',
47
- 11155420: 'topeth',
48
- };
49
- return ethLikeCoinFromChainId[chainId];
153
+ });
154
+ return chainIdMap;
155
+ }
156
+ coinNameFromChainId(chainId) {
157
+ const coinName = CoinMap.LEGACY_CHAIN_ID_MAP[chainId];
158
+ if (coinName) {
159
+ return coinName;
160
+ }
161
+ if (this._coinByChainId === null) {
162
+ this._coinByChainId = this.buildChainIdMap();
163
+ }
164
+ return this._coinByChainId.get(chainId);
50
165
  }
51
166
  /**
52
167
  * Override `get` to throw if a coin is missing, instead of returning undefined.
@@ -55,14 +170,32 @@ class CoinMap {
55
170
  * @return {BaseCoin}
56
171
  */
57
172
  get(key) {
58
- const coin = this._map.get(key) || this._coinByIds.get(key) || this._coinByAliases.get(key);
173
+ const coin = this.getOrUndefined(key);
59
174
  if (coin) {
60
175
  return coin;
61
176
  }
62
177
  throw new errors_1.CoinNotDefinedError(key);
63
178
  }
179
+ /**
180
+ * Safe accessor that returns undefined instead of throwing when a coin is not found.
181
+ * Prefer this over `get` at call sites where the coin name is not guaranteed to be
182
+ * registered — it makes the missing-coin case explicit in the type system.
183
+ * @param {string} key
184
+ * @return {BaseCoin | undefined}
185
+ */
186
+ getOrUndefined(key) {
187
+ return (this._map.get(key) ||
188
+ this._coinByIds.get(key) ||
189
+ this._coinByAliases.get(key) ||
190
+ this._coinByContractAddress.get(key) ||
191
+ this._coinByNftCollectionID.get(key));
192
+ }
64
193
  has(key) {
65
- return this._map.has(key) || this._coinByIds.has(key) || this._coinByAliases.has(key);
194
+ return (this._map.has(key) ||
195
+ this._coinByIds.has(key) ||
196
+ this._coinByAliases.has(key) ||
197
+ this._coinByContractAddress.has(key) ||
198
+ this._coinByNftCollectionID.has(key));
66
199
  }
67
200
  map(mapper) {
68
201
  const mapResult = [];
@@ -95,4 +228,105 @@ class CoinMap {
95
228
  }
96
229
  }
97
230
  exports.CoinMap = CoinMap;
98
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21hcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxQ0FBNkc7QUFFN0csTUFBYSxPQUFPO0lBTWxCO1FBTGlCLFNBQUksR0FBRyxJQUFJLEdBQUcsRUFBOEIsQ0FBQztRQUM3QyxlQUFVLEdBQUcsSUFBSSxHQUFHLEVBQThCLENBQUM7UUFDcEUsNkRBQTZEO1FBQzVDLG1CQUFjLEdBQUcsSUFBSSxHQUFHLEVBQThCLENBQUM7UUFHdEUscUJBQXFCO0lBQ3ZCLENBQUM7SUFFRCxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQTJCO1FBQzFDLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUNwQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUMxQixNQUFNLElBQUkscUNBQTRCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ25EO1lBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUVsQyxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRTtnQkFDbkMsTUFBTSxJQUFJLHVDQUE4QixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUNuRDtZQUNELE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFFdEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUN6QixJQUFJLEtBQUssRUFBRTtnQkFDVCxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ3RCLE1BQU0sSUFBSSxxQ0FBNEIsQ0FBQyxLQUFL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QUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0NBQ0Y7QUF6R0QsMEJBeUdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZUNvaW4gfSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IHsgRHVwbGljYXRlQ29pbkRlZmluaXRpb25FcnJvciwgQ29pbk5vdERlZmluZWRFcnJvciwgRHVwbGljYXRlQ29pbklkRGVmaW5pdGlvbkVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuXG5leHBvcnQgY2xhc3MgQ29pbk1hcCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX21hcCA9IG5ldyBNYXA8c3RyaW5nLCBSZWFkb25seTxCYXNlQ29pbj4+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NvaW5CeUlkcyA9IG5ldyBNYXA8c3RyaW5nLCBSZWFkb25seTxCYXNlQ29pbj4+KCk7XG4gIC8vIEhvbGRzIGtleSBlcXVpdmFsZW5jZXMgdXNlZCBkdXJpbmcgYW4gYXNzZXQgbmFtZSBtaWdyYXRpb25cbiAgcHJpdmF0ZSByZWFkb25seSBfY29pbkJ5QWxpYXNlcyA9IG5ldyBNYXA8c3RyaW5nLCBSZWFkb25seTxCYXNlQ29pbj4+KCk7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBEbyBub3QgaW5zdGFudGlhdGVcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29pbnMoY29pbnM6IFJlYWRvbmx5PEJhc2VDb2luPltdKTogQ29pbk1hcCB7XG4gICAgcmV0dXJuIGNvaW5zLnJlZHVjZSgoY29pbk1hcCwgY29pbikgPT4ge1xuICAgICAgaWYgKGNvaW5NYXAuaGFzKGNvaW4ubmFtZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IER1cGxpY2F0ZUNvaW5EZWZpbml0aW9uRXJyb3IoY29pbi5uYW1lKTtcbiAgICAgIH1cbiAgICAgIGNvaW5NYXAuX21hcC5zZXQoY29pbi5uYW1lLCBjb2luKTtcblxuICAgICAgaWYgKGNvaW5NYXAuX2NvaW5CeUlkcy5oYXMoY29pbi5pZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IER1cGxpY2F0ZUNvaW5JZERlZmluaXRpb25FcnJvcihjb2luLmlkKTtcbiAgICAgIH1cbiAgICAgIGNvaW5NYXAuX2NvaW5CeUlkcy5zZXQoY29pbi5pZCwgY29pbik7XG5cbiAgICAgIGNvbnN0IGFsaWFzID0gY29pbi5hbGlhcztcbiAgICAgIGlmIChhbGlhcykge1xuICAgICAgICBpZiAoY29pbk1hcC5oYXMoYWxpYXMpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IER1cGxpY2F0ZUNvaW5EZWZpbml0aW9uRXJyb3IoYWxpYXMpO1xuICAgICAgICB9XG4gICAgICAgIGNvaW5NYXAuX2NvaW5CeUFsaWFzZXMuc2V0KGFsaWFzLCBjb2luKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb2luTWFwO1xuICAgIH0sIG5ldyBDb2luTWFwKCkpO1xuICB9XG5cbiAgc3RhdGljIGNvaW5OYW1lRnJvbUNoYWluSWQoY2hhaW5JZDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBldGhMaWtlQ29pbkZyb21DaGFpbklkOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+ID0ge1xuICAgICAgMTogJ2V0aCcsXG4gICAgICA0MjogJ3RldGgnLFxuICAgICAgNTogJ2d0ZXRoJyxcbiAgICAgIDE3MDAwOiAnaHRldGgnLFxuICAgICAgMTAwMDE6ICdldGh3JyxcbiAgICAgIDgwMDAxOiAndHBvbHlnb24nLFxuICAgICAgMTM3OiAncG9seWdvbicsXG4gICAgICA1NjogJ2JzYycsXG4gICAgICA5NzogJ3Ric2MnLFxuICAgICAgNDIxNjE6ICdhcmJldGgnLFxuICAgICAgNDIxNjE0OiAndGFyYmV0aCcsXG4gICAgICAxMDogJ29wZXRoJyxcbiAgICAgIDExMTU1NDIwOiAndG9wZXRoJyxcbiAgICB9O1xuICAgIHJldHVybiBldGhMaWtlQ29pbkZyb21DaGFpbklkW2NoYWluSWRdO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGBnZXRgIHRvIHRocm93IGlmIGEgY29pbiBpcyBtaXNzaW5nLCBpbnN0ZWFkIG9mIHJldHVybmluZyB1bmRlZmluZWQuXG4gICAqIEl0IHdpbGwgaG9ub3Iga2V5IGVxdWl2YWxlbmNlcyBpbiBjYXNlIGdpdmVuIGtleSBpcyBtaXNzaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEByZXR1cm4ge0Jhc2VDb2lufVxuICAgKi9cbiAgcHVibGljIGdldChrZXk6IHN0cmluZyk6IFJlYWRvbmx5PEJhc2VDb2luPiB7XG4gICAgY29uc3QgY29pbiA9IHRoaXMuX21hcC5nZXQoa2V5KSB8fCB0aGlzLl9jb2luQnlJZHMuZ2V0KGtleSkgfHwgdGhpcy5fY29pbkJ5QWxpYXNlcy5nZXQoa2V5KTtcblxuICAgIGlmIChjb2luKSB7XG4gICAgICByZXR1cm4gY29pbjtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgQ29pbk5vdERlZmluZWRFcnJvcihrZXkpO1xuICB9XG5cbiAgcHVibGljIGhhcyhrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9tYXAuaGFzKGtleSkgfHwgdGhpcy5fY29pbkJ5SWRzLmhhcyhrZXkpIHx8IHRoaXMuX2NvaW5CeUFsaWFzZXMuaGFzKGtleSk7XG4gIH1cblxuICBwdWJsaWMgbWFwPFQ+KG1hcHBlcjogKGNvaW46IFJlYWRvbmx5PEJhc2VDb2luPiwgY29pbk5hbWU6IHN0cmluZykgPT4gVCk6IFRbXSB7XG4gICAgY29uc3QgbWFwUmVzdWx0OiBUW10gPSBbXTtcbiAgICB0aGlzLl9tYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgbWFwUmVzdWx0LnB1c2gobWFwcGVyKHZhbHVlLCBrZXkpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gbWFwUmVzdWx0O1xuICB9XG5cbiAgcHVibGljIHJlZHVjZTxUPihyZWR1Y2VyOiAoYWNjOiBULCBjb2luOiBSZWFkb25seTxCYXNlQ29pbj4sIGNvaW5OYW1lOiBzdHJpbmcpID0+IFQsIGluaXRpYWxWYWx1ZTogVCk6IFQge1xuICAgIGxldCBhY2MgPSBpbml0aWFsVmFsdWU7XG4gICAgdGhpcy5fbWFwLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIGFjYyA9IHJlZHVjZXIoYWNjLCB2YWx1ZSwga2V5KTtcbiAgICB9KTtcbiAgICByZXR1cm4gYWNjO1xuICB9XG5cbiAgcHVibGljIGZpbHRlcihwcmVkaWNhdGU6IChjb2luOiBSZWFkb25seTxCYXNlQ29pbj4sIGNvaW5OYW1lOiBzdHJpbmcpID0+IGJvb2xlYW4pOiBDb2luTWFwIHtcbiAgICBjb25zdCBmaWx0ZXJSZXN1bHQ6IFJlYWRvbmx5PEJhc2VDb2luPltdID0gW107XG4gICAgdGhpcy5fbWFwLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGtleSkpIHtcbiAgICAgICAgZmlsdGVyUmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBDb2luTWFwLmZyb21Db2lucyhmaWx0ZXJSZXN1bHQpO1xuICB9XG5cbiAgcHVibGljIGZvckVhY2goY2FsbGJhY2s6IChjb2luOiBSZWFkb25seTxCYXNlQ29pbj4sIGNvaW5OYW1lOiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl9tYXAuZm9yRWFjaChjYWxsYmFjayk7XG4gIH1cblxuICBwdWJsaWMgW1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmFibGVJdGVyYXRvcjxbc3RyaW5nLCBSZWFkb25seTxCYXNlQ29pbj5dPiB7XG4gICAgcmV0dXJuIHRoaXMuX21hcFtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gIH1cbn1cbiJdfQ==
231
+ /**
232
+ * Hardcoded mapping for backward compatibility.
233
+ */
234
+ CoinMap.LEGACY_CHAIN_ID_MAP = {
235
+ 1: 'eth',
236
+ 42: 'teth',
237
+ 5: 'gteth',
238
+ 560048: 'hteth',
239
+ 10001: 'ethw',
240
+ 80002: 'tpolygon',
241
+ 137: 'polygon',
242
+ 56: 'bsc',
243
+ 97: 'tbsc',
244
+ 42161: 'arbeth',
245
+ 421614: 'tarbeth',
246
+ 10: 'opeth',
247
+ 11155420: 'topeth',
248
+ 1116: 'coredao',
249
+ 1114: 'tcoredao',
250
+ 248: 'oas',
251
+ 9372: 'toas',
252
+ 14: 'flr',
253
+ 114: 'tflr',
254
+ 19: 'sgb',
255
+ 16: 'tsgb',
256
+ 1111: 'wemix',
257
+ 1112: 'twemix',
258
+ 50: 'xdc',
259
+ 51: 'txdc',
260
+ 80094: 'bera',
261
+ 80069: 'tbera',
262
+ 42220: 'celo',
263
+ 11142220: 'tcelo',
264
+ 2222: 'kava',
265
+ 2221: 'tkava',
266
+ 43114: 'avaxc',
267
+ 43113: 'tavaxc',
268
+ 100: 'gno',
269
+ 130: 'unieth',
270
+ 1301: 'tunieth',
271
+ 190415: 'hppeth',
272
+ 181228: 'thppeth',
273
+ 6985385: 'h',
274
+ 7080969: 'th',
275
+ 4663: 'hoodeth',
276
+ 46630: 'thoodeth',
277
+ 324: 'zksyncera',
278
+ 300: 'tzksyncera',
279
+ 8453: 'baseeth',
280
+ 84532: 'tbaseeth',
281
+ 143: 'mon',
282
+ 10143: 'tmon',
283
+ 480: 'world',
284
+ 4801: 'tworld',
285
+ 5031: 'somi',
286
+ 50312: 'tstt',
287
+ 1868: 'soneium',
288
+ 1946: 'tsoneium',
289
+ 33111: 'tapechain',
290
+ 33139: 'apechain',
291
+ 688689: 'tphrs',
292
+ 102030: 'ctc',
293
+ 102031: 'tctc',
294
+ 998: 'thypeevm',
295
+ 999: 'hypeevm',
296
+ 16602: 'tog',
297
+ 16661: 'og',
298
+ 9746: 'txpl',
299
+ 9745: 'xpl',
300
+ 14601: 'tsonic',
301
+ 146: 'sonic',
302
+ 1328: 'tseievm',
303
+ 1329: 'seievm',
304
+ 1001: 'tkaia',
305
+ 8217: 'kaia',
306
+ 1270: 'tirys',
307
+ 59141: 'tlineaeth',
308
+ 59144: 'lineaeth',
309
+ 1315: 'tip',
310
+ 1514: 'ip',
311
+ 545: 'tflow',
312
+ 747: 'flow',
313
+ 98867: 'tplume',
314
+ 98866: 'plume',
315
+ 6343: 'tmegaeth',
316
+ 4326: 'megaeth',
317
+ 295: 'hbarevm',
318
+ 296: 'thbarevm',
319
+ 196: 'okbxlayer',
320
+ 1952: 'tokbxlayer',
321
+ 5734951: 'jovayeth',
322
+ 2019775: 'tjovayeth',
323
+ 5042: 'arcusdc',
324
+ 5042002: 'tarcusdc',
325
+ 4217: 'tempo',
326
+ 42431: 'ttempo',
327
+ 5000: 'mantle',
328
+ 5003: 'tmantle',
329
+ 25363: 'fluenteth',
330
+ 20994: 'tfluenteth',
331
+ };
332
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21hcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxQ0FPa0I7QUFDbEIsdUNBQXFGO0FBR3JGLE1BQWEsT0FBTztJQWFsQjtRQVppQixTQUFJLEdBQUcsSUFBSSxHQUFHLEVBQThCLENBQUM7UUFDN0MsZUFBVSxHQUFHLElBQUksR0FBRyxFQUE4QixDQUFDO1FBQ3BFLDZEQUE2RDtRQUM1QyxtQkFBYyxHQUFHLElBQUksR0FBRyxFQUE4QixDQUFDO1FBQ3hFLGtFQUFrRTtRQUNsRSxvR0FBb0c7UUFDbkYsMkJBQXNCLEdBQUcsSUFBSSxHQUFHLEVBQThCLENBQUM7UUFDaEYsK0VBQStFO1FBQzlELDJCQUFzQixHQUFHLElBQUksR0FBRyxFQUE4QixDQUFDO1FBQ2hGLCtGQUErRjtRQUN2RixtQkFBYyxHQUErQixJQUFJLENBQUM7UUFHeEQscUJBQXFCO0lBQ3ZCLENBQUM7SUFFTyxNQUFNLENBQUMsa0JBQWtCLENBQUMsSUFBaUM7UUFDakUsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ2xELENBQUM7SUFFTyxNQUFNLENBQUMsa0JBQWtCLENBQUMsSUFBaUM7UUFDakUsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDaEUsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHVCQUF1QixDQUFDLElBQXdCO1FBQ3JELElBQUksSUFBSSxZQUFZLHFDQUEyQixFQUFFLENBQUM7WUFDaEQsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdEQsT0FBTyxRQUFRLEtBQUssU0FBUyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQy9FLENBQUM7UUFDRCxJQUFJLElBQUksWUFBWSxxQ0FBMkIsRUFBRSxDQUFDO1lBQ2hELE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RELE9BQU8sUUFBUSxLQUFLLFNBQVMsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUMvRSxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUEyQjtRQUMxQyxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzlCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNyQixPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVNLE9BQU8sQ0FBQyxJQUF3QjtRQUNyQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzdCLE1BQU0sSUFBSSxxQ0FBNEIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDakMsTUFBTSxJQUFJLHVDQUE4QixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN6QixJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzVDLE1BQU0sSUFBSSxxQ0FBNEIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25DLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixJQUFJLElBQUksWUFBWSxxQ0FBMkIsRUFBRSxDQUFDO2dCQUNoRCxNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDNUQsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBQ3RGLElBQUkseUJBQXlCLEVBQUUsQ0FBQztvQkFDOUIsSUFBSSx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7d0JBQ2pFLE1BQU0sSUFBSSxnREFBdUMsQ0FBQyxrQkFBa0IsRUFBRSx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDeEcsQ0FBQztnQkFDSCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDNUQsQ0FBQztZQUNILENBQUM7aUJBQU0sSUFBSSxJQUFJLFlBQVkscUNBQTJCLEVBQUUsQ0FBQztnQkFDdkQsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzFELE1BQU0seUJBQXlCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNwRixJQUFJLHlCQUF5QixFQUFFLENBQUM7b0JBQzlCLElBQUkseUJBQXlCLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO3dCQUNqRSxNQUFNLElBQUksZ0RBQXVDLENBQUMsZ0JBQWdCLEVBQUUseUJBQXlCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3RHLENBQUM7Z0JBQ0gsQ0FBQztxQkFBTSxDQUFDO29CQUNOLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzFELENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksT0FBTyxDQUFDLElBQXdCO1FBQ3JDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUN0QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNsQyxPQUFPLENBQUMsOEJBQThCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3RELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbkMsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1QyxDQUFDO1lBQ0QsSUFBSSxPQUFPLFlBQVkscUNBQTJCLEVBQUUsQ0FBQztnQkFDbkQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUMxRSxDQUFDO2lCQUFNLElBQUksT0FBTyxZQUFZLHFDQUEyQixFQUFFLENBQUM7Z0JBQzFELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDMUUsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFTyxNQUFNLENBQUMsOEJBQThCLENBQUMsT0FBMkIsRUFBRSxPQUEyQjtRQUNwRyxNQUFNLGtCQUFrQixHQUFHLE9BQU8sWUFBWSxxQ0FBMkIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ2hILE1BQU0sa0JBQWtCLEdBQUcsT0FBTyxZQUFZLHFDQUEyQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDaEgsSUFBSSxPQUFPLENBQUMsRUFBRSxLQUFLLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM5QixNQUFNLElBQUksdUNBQThCLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSw0QkFBNEIsQ0FBQyxDQUFDO1FBQ3ZGLENBQUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xDLE1BQU0sSUFBSSx1Q0FBOEIsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLDhCQUE4QixDQUFDLENBQUM7UUFDekYsQ0FBQztRQUNELElBQUksa0JBQWtCLEtBQUssa0JBQWtCLEVBQUUsQ0FBQztZQUM5QyxNQUFNLElBQUksdUNBQThCLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSx5Q0FBeUMsQ0FBQyxDQUFDO1FBQ3BHLENBQUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLEtBQUssT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSx1Q0FBOEIsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLCtCQUErQixDQUFDLENBQUM7UUFDMUYsQ0FBQztJQUNILENBQUM7SUF3R08sZUFBZTtRQUNyQixNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztRQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRTtZQUNuQyxrRUFBa0U7WUFDbEUsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2pCLE9BQU87WUFDVCxDQUFDO1lBQ0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUM3QixJQUFJLFNBQVMsSUFBSSxPQUFPLElBQUksT0FBUSxPQUEyQixDQUFDLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDckYsTUFBTSxPQUFPLEdBQUksT0FBMkIsQ0FBQyxPQUFPLENBQUM7Z0JBQ3JELElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7b0JBQzdCLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUNwQyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVNLG1CQUFtQixDQUFDLE9BQWU7UUFDeEMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RELElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQy9DLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLEdBQUcsQ0FBQyxHQUFXO1FBQ3BCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNULE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELE1BQU0sSUFBSSw0QkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksY0FBYyxDQUFDLEdBQVc7UUFDL0IsT0FBTyxDQUNMLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUNsQixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7WUFDeEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQzVCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQ3JDLENBQUM7SUFDSixDQUFDO0lBRU0sR0FBRyxDQUFDLEdBQVc7UUFDcEIsT0FBTyxDQUNMLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUNsQixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7WUFDeEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQzVCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQ3JDLENBQUM7SUFDSixDQUFDO0lBRU0sR0FBRyxDQUFJLE1BQXlEO1FBQ3JFLE1BQU0sU0FBUyxHQUFRLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUMvQixTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFTSxNQUFNLENBQUksT0FBa0UsRUFBRSxZQUFlO1FBQ2xHLElBQUksR0FBRyxHQUFHLFlBQVksQ0FBQztRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUMvQixHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFTSxNQUFNLENBQUMsU0FBa0U7UUFDOUUsTUFBTSxZQUFZLEdBQXlCLEVBQUUsQ0FBQztRQUM5QyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUMvQixJQUFJLFNBQVMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDMUIsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzQixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLE9BQU8sQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVNLE9BQU8sQ0FBQyxRQUE4RDtRQUMzRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztJQUN0QyxDQUFDOztBQXhWSCwwQkF5VkM7QUE5TUM7O0dBRUc7QUFDcUIsMkJBQW1CLEdBQTJCO0lBQ3BFLENBQUMsRUFBRSxLQUFLO0lBQ1IsRUFBRSxFQUFFLE1BQU07SUFDVixDQUFDLEVBQUUsT0FBTztJQUNWLE1BQU0sRUFBRSxPQUFPO0lBQ2YsS0FBSyxFQUFFLE1BQU07SUFDYixLQUFLLEVBQUUsVUFBVTtJQUNqQixHQUFHLEVBQUUsU0FBUztJQUNkLEVBQUUsRUFBRSxLQUFLO0lBQ1QsRUFBRSxFQUFFLE1BQU07SUFDVixLQUFLLEVBQUUsUUFBUTtJQUNmLE1BQU0sRUFBRSxTQUFTO0lBQ2pCLEVBQUUsRUFBRSxPQUFPO0lBQ1gsUUFBUSxFQUFFLFFBQVE7SUFDbEIsSUFBSSxFQUFFLFNBQVM7SUFDZixJQUFJLEVBQUUsVUFBVTtJQUNoQixHQUFHLEVBQUUsS0FBSztJQUNWLElBQUksRUFBRSxNQUFNO0lBQ1osRUFBRSxFQUFFLEtBQUs7SUFDVCxHQUFHLEVBQUUsTUFBTTtJQUNYLEVBQUUsRUFBRSxLQUFLO0lBQ1QsRUFBRSxFQUFFLE1BQU07SUFDVixJQUFJLEVBQUUsT0FBTztJQUNiLElBQUksRUFBRSxRQUFRO0lBQ2QsRUFBRSxFQUFFLEtBQUs7SUFDVCxFQUFFLEVBQUUsTUFBTTtJQUNWLEtBQUssRUFBRSxNQUFNO0lBQ2IsS0FBSyxFQUFFLE9BQU87SUFDZCxLQUFLLEVBQUUsTUFBTTtJQUNiLFFBQVEsRUFBRSxPQUFPO0lBQ2pCLElBQUksRUFBRSxNQUFNO0lBQ1osSUFBSSxFQUFFLE9BQU87SUFDYixLQUFLLEVBQUUsT0FBTztJQUNkLEtBQUssRUFBRSxRQUFRO0lBQ2YsR0FBRyxFQUFFLEtBQUs7SUFDVixHQUFHLEVBQUUsUUFBUTtJQUNiLElBQUksRUFBRSxTQUFTO0lBQ2YsTUFBTSxFQUFFLFFBQVE7SUFDaEIsTUFBTSxFQUFFLFNBQVM7SUFDakIsT0FBTyxFQUFFLEdBQUc7SUFDWixPQUFPLEVBQUUsSUFBSTtJQUNiLElBQUksRUFBRSxTQUFTO0lBQ2YsS0FBSyxFQUFFLFVBQVU7SUFDakIsR0FBRyxFQUFFLFdBQVc7SUFDaEIsR0FBRyxFQUFFLFlBQVk7SUFDakIsSUFBSSxFQUFFLFNBQVM7SUFDZixLQUFLLEVBQUUsVUFBVTtJQUNqQixHQUFHLEVBQUUsS0FBSztJQUNWLEtBQUssRUFBRSxNQUFNO0lBQ2IsR0FBRyxFQUFFLE9BQU87SUFDWixJQUFJLEVBQUUsUUFBUTtJQUNkLElBQUksRUFBRSxNQUFNO0lBQ1osS0FBSyxFQUFFLE1BQU07SUFDYixJQUFJLEVBQUUsU0FBUztJQUNmLElBQUksRUFBRSxVQUFVO0lBQ2hCLEtBQUssRUFBRSxXQUFXO0lBQ2xCLEtBQUssRUFBRSxVQUFVO0lBQ2pCLE1BQU0sRUFBRSxPQUFPO0lBQ2YsTUFBTSxFQUFFLEtBQUs7SUFDYixNQUFNLEVBQUUsTUFBTTtJQUNkLEdBQUcsRUFBRSxVQUFVO0lBQ2YsR0FBRyxFQUFFLFNBQVM7SUFDZCxLQUFLLEVBQUUsS0FBSztJQUNaLEtBQUssRUFBRSxJQUFJO0lBQ1gsSUFBSSxFQUFFLE1BQU07SUFDWixJQUFJLEVBQUUsS0FBSztJQUNYLEtBQUssRUFBRSxRQUFRO0lBQ2YsR0FBRyxFQUFFLE9BQU87SUFDWixJQUFJLEVBQUUsU0FBUztJQUNmLElBQUksRUFBRSxRQUFRO0lBQ2QsSUFBSSxFQUFFLE9BQU87SUFDYixJQUFJLEVBQUUsTUFBTTtJQUNaLElBQUksRUFBRSxPQUFPO0lBQ2IsS0FBSyxFQUFFLFdBQVc7SUFDbEIsS0FBSyxFQUFFLFVBQVU7SUFDakIsSUFBSSxFQUFFLEtBQUs7SUFDWCxJQUFJLEVBQUUsSUFBSTtJQUNWLEdBQUcsRUFBRSxPQUFPO0lBQ1osR0FBRyxFQUFFLE1BQU07SUFDWCxLQUFLLEVBQUUsUUFBUTtJQUNmLEtBQUssRUFBRSxPQUFPO0lBQ2QsSUFBSSxFQUFFLFVBQVU7SUFDaEIsSUFBSSxFQUFFLFNBQVM7SUFDZixHQUFHLEVBQUUsU0FBUztJQUNkLEdBQUcsRUFBRSxVQUFVO0lBQ2YsR0FBRyxFQUFFLFdBQVc7SUFDaEIsSUFBSSxFQUFFLFlBQVk7SUFDbEIsT0FBTyxFQUFFLFVBQVU7SUFDbkIsT0FBTyxFQUFFLFdBQVc7SUFDcEIsSUFBSSxFQUFFLFNBQVM7SUFDZixPQUFPLEVBQUUsVUFBVTtJQUNuQixJQUFJLEVBQUUsT0FBTztJQUNiLEtBQUssRUFBRSxRQUFRO0lBQ2YsSUFBSSxFQUFFLFFBQVE7SUFDZCxJQUFJLEVBQUUsU0FBUztJQUNmLEtBQUssRUFBRSxXQUFXO0lBQ2xCLEtBQUssRUFBRSxZQUFZO0NBQ3BCLEFBakcwQyxDQWlHekMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ29pbiB9IGZyb20gJy4vYmFzZSc7XG5pbXBvcnQge1xuICBEdXBsaWNhdGVDb2luRGVmaW5pdGlvbkVycm9yLFxuICBDb2luTm90RGVmaW5lZEVycm9yLFxuICBEdXBsaWNhdGVDb2luSWREZWZpbml0aW9uRXJyb3IsXG4gIER1cGxpY2F0ZUNvbnRyYWN0QWRkcmVzc0RlZmluaXRpb25FcnJvcixcbiAgRHVwbGljYXRlTmZ0Q29sbGVjdGlvbklkRGVmaW5pdGlvbkVycm9yLFxuICBDb2luUmVwbGFjZW1lbnROb3RBbGxvd2VkRXJyb3IsXG59IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IENvbnRyYWN0QWRkcmVzc0RlZmluZWRUb2tlbiwgTkZUQ29sbGVjdGlvbklkRGVmaW5lZFRva2VuIH0gZnJvbSAnLi9hY2NvdW50JztcbmltcG9ydCB7IEV0aGVyZXVtTmV0d29yayB9IGZyb20gJy4vbmV0d29ya3MnO1xuXG5leHBvcnQgY2xhc3MgQ29pbk1hcCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX21hcCA9IG5ldyBNYXA8c3RyaW5nLCBSZWFkb25seTxCYXNlQ29pbj4+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NvaW5CeUlkcyA9IG5ldyBNYXA8c3RyaW5nLCBSZWFkb25seTxCYXNlQ29pbj4+KCk7XG4gIC8vIEhvbGRzIGtleSBlcXVpdmFsZW5jZXMgdXNlZCBkdXJpbmcgYW4gYXNzZXQgbmFtZSBtaWdyYXRpb25cbiAgcHJpdmF0ZSByZWFkb25seSBfY29pbkJ5QWxpYXNlcyA9IG5ldyBNYXA8c3RyaW5nLCBSZWFkb25seTxCYXNlQ29pbj4+KCk7XG4gIC8vIG1hcCBvZiBjb2luIGJ5IGFkZHJlc3MgLT4gdGhlIGtleSBpcyB0aGUgZmFtaWx5OmNvbnRyYWN0QWRkcmVzc1xuICAvLyB0aGUgZmFtaWx5IGlzIHRoZSB3aGVyZSB0aGUgY29pbiBpcyBlLmcgbDEgY2hhaW5zIGxpa2UgZXRoLCBic2MgZXRjLiBvciBsMiBsaWtlIGFyYmV0aCwgY2VsbyBldGMuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2NvaW5CeUNvbnRyYWN0QWRkcmVzcyA9IG5ldyBNYXA8c3RyaW5nLCBSZWFkb25seTxCYXNlQ29pbj4+KCk7XG4gIC8vIG1hcCBvZiBjb2luIGJ5IE5GVCBjb2xsZWN0aW9uIElEIC0+IHRoZSBrZXkgaXMgdGhlICh0KWZhbWlseTpuZnRDb2xsZWN0aW9uSURcbiAgcHJpdmF0ZSByZWFkb25seSBfY29pbkJ5TmZ0Q29sbGVjdGlvbklEID0gbmV3IE1hcDxzdHJpbmcsIFJlYWRvbmx5PEJhc2VDb2luPj4oKTtcbiAgLy8gTGF6aWx5IGluaXRpYWxpemVkIGNhY2hlIGZvciBjaGFpbklkIHRvIGNvaW4gbmFtZSBtYXBwaW5nIChkZXJpdmVkIGZyb20gbmV0d29yayBkZWZpbml0aW9ucylcbiAgcHJpdmF0ZSBfY29pbkJ5Q2hhaW5JZDogTWFwPG51bWJlciwgc3RyaW5nPiB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gRG8gbm90IGluc3RhbnRpYXRlXG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjb250cmFjdEFkZHJlc3NLZXkoY29pbjogQ29udHJhY3RBZGRyZXNzRGVmaW5lZFRva2VuKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7Y29pbi5mYW1pbHl9OiR7Y29pbi5jb250cmFjdEFkZHJlc3N9YDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIG5mdENvbGxlY3Rpb25JZEtleShjb2luOiBORlRDb2xsZWN0aW9uSWREZWZpbmVkVG9rZW4pOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtjb2luLnByZWZpeH0ke2NvaW4uZmFtaWx5fToke2NvaW4ubmZ0Q29sbGVjdGlvbklkfWA7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBhIGRpZmZlcmVudCB0b2tlbiB3aXRoIHRoZSBzYW1lIGNvbnRyYWN0IGFkZHJlc3MgKG9yIE5GVCBjb2xsZWN0aW9uIGlkKSBpcyBhbHJlYWR5XG4gICAqIHJlZ2lzdGVyZWQuIFRva2VuIGlkZW50aXR5IGluIHRoZSBtYXAgaXMga2V5ZWQgYnkgbmFtZS9pZC9hbGlhcywgYnV0IGEgdG9rZW4gYWxzbyBjbGFpbXMgYVxuICAgKiBjb250cmFjdC1hZGRyZXNzIGtleSAoYGZhbWlseTpjb250cmFjdEFkZHJlc3NgKSBhbmQsIGZvciBORlRzLCBhIGNvbGxlY3Rpb24taWQga2V5LiBUd28gdG9rZW5zXG4gICAqIHRoYXQgc2hhcmUgc3VjaCBhIGtleSBidXQgZGlmZmVyIGluIG5hbWUgY2Fubm90IGNvZXhpc3Qg4oCUIGBhZGRDb2luYCB0aHJvd3Mgb24gdGhlIHNlY29uZC5cbiAgICogQ2FsbGVycyBtZXJnaW5nIGV4dGVybmFsbHktc291cmNlZCB0b2tlbnMgdXNlIHRoaXMgdG8gc2tpcCBhIGNvbGxpZGluZyB0b2tlbiByYXRoZXIgdGhhbiBjcmFzaC5cbiAgICovXG4gIHB1YmxpYyBoYXNUb2tlbkFkZHJlc3NDb25mbGljdChjb2luOiBSZWFkb25seTxCYXNlQ29pbj4pOiBib29sZWFuIHtcbiAgICBpZiAoY29pbiBpbnN0YW5jZW9mIENvbnRyYWN0QWRkcmVzc0RlZmluZWRUb2tlbikge1xuICAgICAgY29uc3Qga2V5ID0gQ29pbk1hcC5jb250cmFjdEFkZHJlc3NLZXkoY29pbik7XG4gICAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuX2NvaW5CeUNvbnRyYWN0QWRkcmVzcy5nZXQoa2V5KTtcbiAgICAgIHJldHVybiBleGlzdGluZyAhPT0gdW5kZWZpbmVkICYmIGV4aXN0aW5nLm5ldHdvcmsudHlwZSA9PT0gY29pbi5uZXR3b3JrLnR5cGU7XG4gICAgfVxuICAgIGlmIChjb2luIGluc3RhbmNlb2YgTkZUQ29sbGVjdGlvbklkRGVmaW5lZFRva2VuKSB7XG4gICAgICBjb25zdCBrZXkgPSBDb2luTWFwLm5mdENvbGxlY3Rpb25JZEtleShjb2luKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5fY29pbkJ5TmZ0Q29sbGVjdGlvbklELmdldChrZXkpO1xuICAgICAgcmV0dXJuIGV4aXN0aW5nICE9PSB1bmRlZmluZWQgJiYgZXhpc3RpbmcubmV0d29yay50eXBlID09PSBjb2luLm5ldHdvcmsudHlwZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db2lucyhjb2luczogUmVhZG9ubHk8QmFzZUNvaW4+W10pOiBDb2luTWFwIHtcbiAgICBjb25zdCBjb2luTWFwID0gbmV3IENvaW5NYXAoKTtcbiAgICBjb2lucy5mb3JFYWNoKChjb2luKSA9PiB7XG4gICAgICBjb2luTWFwLmFkZENvaW4oY29pbik7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvaW5NYXA7XG4gIH1cblxuICBwdWJsaWMgYWRkQ29pbihjb2luOiBSZWFkb25seTxCYXNlQ29pbj4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbWFwLmhhcyhjb2luLm5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRHVwbGljYXRlQ29pbkRlZmluaXRpb25FcnJvcihjb2luLm5hbWUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fY29pbkJ5SWRzLmhhcyhjb2luLmlkKSkge1xuICAgICAgdGhyb3cgbmV3IER1cGxpY2F0ZUNvaW5JZERlZmluaXRpb25FcnJvcihjb2luLmlkKTtcbiAgICB9XG4gICAgY29uc3QgYWxpYXMgPSBjb2luLmFsaWFzO1xuICAgIGlmIChhbGlhcyAmJiB0aGlzLl9jb2luQnlBbGlhc2VzLmhhcyhhbGlhcykpIHtcbiAgICAgIHRocm93IG5ldyBEdXBsaWNhdGVDb2luRGVmaW5pdGlvbkVycm9yKGFsaWFzKTtcbiAgICB9XG4gICAgdGhpcy5fbWFwLnNldChjb2luLm5hbWUsIGNvaW4pO1xuICAgIHRoaXMuX2NvaW5CeUlkcy5zZXQoY29pbi5pZCwgY29pbik7XG4gICAgaWYgKGFsaWFzKSB7XG4gICAgICB0aGlzLl9jb2luQnlBbGlhc2VzLnNldChjb2luLmFsaWFzLCBjb2luKTtcbiAgICB9XG5cbiAgICBpZiAoY29pbi5pc1Rva2VuKSB7XG4gICAgICBpZiAoY29pbiBpbnN0YW5jZW9mIENvbnRyYWN0QWRkcmVzc0RlZmluZWRUb2tlbikge1xuICAgICAgICBjb25zdCBjb250cmFjdEFkZHJlc3NLZXkgPSBDb2luTWFwLmNvbnRyYWN0QWRkcmVzc0tleShjb2luKTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdCeUNvbnRyYWN0QWRkcmVzcyA9IHRoaXMuX2NvaW5CeUNvbnRyYWN0QWRkcmVzcy5nZXQoY29udHJhY3RBZGRyZXNzS2V5KTtcbiAgICAgICAgaWYgKGV4aXN0aW5nQnlDb250cmFjdEFkZHJlc3MpIHtcbiAgICAgICAgICBpZiAoZXhpc3RpbmdCeUNvbnRyYWN0QWRkcmVzcy5uZXR3b3JrLnR5cGUgPT09IGNvaW4ubmV0d29yay50eXBlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRHVwbGljYXRlQ29udHJhY3RBZGRyZXNzRGVmaW5pdGlvbkVycm9yKGNvbnRyYWN0QWRkcmVzc0tleSwgZXhpc3RpbmdCeUNvbnRyYWN0QWRkcmVzcy5uYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fY29pbkJ5Q29udHJhY3RBZGRyZXNzLnNldChjb250cmFjdEFkZHJlc3NLZXksIGNvaW4pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvaW4gaW5zdGFuY2VvZiBORlRDb2xsZWN0aW9uSWREZWZpbmVkVG9rZW4pIHtcbiAgICAgICAgY29uc3QgbmZ0Q29sbGVjdGlvbktleSA9IENvaW5NYXAubmZ0Q29sbGVjdGlvbklkS2V5KGNvaW4pO1xuICAgICAgICBjb25zdCBleGlzdGluZ0J5TmZ0Q29sbGVjdGlvbklkID0gdGhpcy5fY29pbkJ5TmZ0Q29sbGVjdGlvbklELmdldChuZnRDb2xsZWN0aW9uS2V5KTtcbiAgICAgICAgaWYgKGV4aXN0aW5nQnlOZnRDb2xsZWN0aW9uSWQpIHtcbiAgICAgICAgICBpZiAoZXhpc3RpbmdCeU5mdENvbGxlY3Rpb25JZC5uZXR3b3JrLnR5cGUgPT09IGNvaW4ubmV0d29yay50eXBlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRHVwbGljYXRlTmZ0Q29sbGVjdGlvbklkRGVmaW5pdGlvbkVycm9yKG5mdENvbGxlY3Rpb25LZXksIGV4aXN0aW5nQnlOZnRDb2xsZWN0aW9uSWQubmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2NvaW5CeU5mdENvbGxlY3Rpb25JRC5zZXQobmZ0Q29sbGVjdGlvbktleSwgY29pbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSBhIGNvaW4gKHRva2VuIG9yIGJhc2UgY29pbikgaW4gdGhlIENvaW5NYXAgd2l0aCBhIG5ldyBvYmplY3QgY2FycnlpbmcgcmVmcmVzaGVkIG1vZGlmaWFibGVcbiAgICogZmllbGRzLiBUaGUgZXhpc3RpbmcgcmVjb3JkIGlzIGxvb2tlZCB1cCBieSBpZCwgYW5kIHRoZSBzd2FwIG9ubHkgaGFwcGVucyB3aGVuIGl0cyBpbW11dGFibGUgZmllbGRzXG4gICAqIChpZCwgbmFtZSwgY29udHJhY3QgYWRkcmVzcyBhbmQgYWxpYXMpIGFyZSB1bmNoYW5nZWQuIEFueXRoaW5nIGVsc2UgdGhyb3dzIGJlZm9yZSB0aGUgbWFwXG4gICAqIGlzIHRvdWNoZWQuIENvaW5zIHRoYXQgYXJlIG5vdCBpbiB0aGUgbWFwIHlldCBhcmUgYWRkZWQuXG4gICAqIEBwYXJhbSB7UmVhZG9ubHk8QmFzZUNvaW4+fSBjb2luIG5ldyBjb2luIG9iamVjdFxuICAgKiBAdGhyb3dzIHtDb2luUmVwbGFjZW1lbnROb3RBbGxvd2VkRXJyb3J9IHdoZW4gYW4gaW1tdXRhYmxlIGZpZWxkIGRpZmZlcnMgZnJvbSB0aGUgZXhpc3RpbmcgcmVjb3JkXG4gICAqL1xuICBwdWJsaWMgcmVwbGFjZShjb2luOiBSZWFkb25seTxCYXNlQ29pbj4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oYXMoY29pbi5pZCkpIHtcbiAgICAgIGNvbnN0IG9sZENvaW4gPSB0aGlzLmdldChjb2luLmlkKTtcbiAgICAgIENvaW5NYXAuYXNzZXJ0SW1tdXRhYmxlRmllbGRzVW5jaGFuZ2VkKG9sZENvaW4sIGNvaW4pO1xuICAgICAgdGhpcy5fbWFwLmRlbGV0ZShvbGRDb2luLm5hbWUpO1xuICAgICAgdGhpcy5fY29pbkJ5SWRzLmRlbGV0ZShvbGRDb2luLmlkKTtcbiAgICAgIGlmIChvbGRDb2luLmFsaWFzKSB7XG4gICAgICAgIHRoaXMuX2NvaW5CeUFsaWFzZXMuZGVsZXRlKG9sZENvaW4uYWxpYXMpO1xuICAgICAgfVxuICAgICAgaWYgKG9sZENvaW4gaW5zdGFuY2VvZiBDb250cmFjdEFkZHJlc3NEZWZpbmVkVG9rZW4pIHtcbiAgICAgICAgdGhpcy5fY29pbkJ5Q29udHJhY3RBZGRyZXNzLmRlbGV0ZShDb2luTWFwLmNvbnRyYWN0QWRkcmVzc0tleShvbGRDb2luKSk7XG4gICAgICB9IGVsc2UgaWYgKG9sZENvaW4gaW5zdGFuY2VvZiBORlRDb2xsZWN0aW9uSWREZWZpbmVkVG9rZW4pIHtcbiAgICAgICAgdGhpcy5fY29pbkJ5TmZ0Q29sbGVjdGlvbklELmRlbGV0ZShDb2luTWFwLm5mdENvbGxlY3Rpb25JZEtleShvbGRDb2luKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuYWRkQ29pbihjb2luKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGFzc2VydEltbXV0YWJsZUZpZWxkc1VuY2hhbmdlZChvbGRDb2luOiBSZWFkb25seTxCYXNlQ29pbj4sIG5ld0NvaW46IFJlYWRvbmx5PEJhc2VDb2luPik6IHZvaWQge1xuICAgIGNvbnN0IG9sZENvbnRyYWN0QWRkcmVzcyA9IG9sZENvaW4gaW5zdGFuY2VvZiBDb250cmFjdEFkZHJlc3NEZWZpbmVkVG9rZW4gPyBvbGRDb2luLmNvbnRyYWN0QWRkcmVzcyA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBuZXdDb250cmFjdEFkZHJlc3MgPSBuZXdDb2luIGluc3RhbmNlb2YgQ29udHJhY3RBZGRyZXNzRGVmaW5lZFRva2VuID8gbmV3Q29pbi5jb250cmFjdEFkZHJlc3MgOiB1bmRlZmluZWQ7XG4gICAgaWYgKG9sZENvaW4uaWQgIT09IG5ld0NvaW4uaWQpIHtcbiAgICAgIHRocm93IG5ldyBDb2luUmVwbGFjZW1lbnROb3RBbGxvd2VkRXJyb3Iob2xkQ29pbi5uYW1lLCAnaW1tdXRhYmxlIGZpZWxkIGlkIGNoYW5nZWQnKTtcbiAgICB9XG4gICAgaWYgKG9sZENvaW4ubmFtZSAhPT0gbmV3Q29pbi5uYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgQ29pblJlcGxhY2VtZW50Tm90QWxsb3dlZEVycm9yKG9sZENvaW4ubmFtZSwgJ2ltbXV0YWJsZSBmaWVsZCBuYW1lIGNoYW5nZWQnKTtcbiAgICB9XG4gICAgaWYgKG9sZENvbnRyYWN0QWRkcmVzcyAhPT0gbmV3Q29udHJhY3RBZGRyZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgQ29pblJlcGxhY2VtZW50Tm90QWxsb3dlZEVycm9yKG9sZENvaW4ubmFtZSwgJ2ltbXV0YWJsZSBmaWVsZCBjb250cmFjdEFkZHJlc3MgY2hhbmdlZCcpO1xuICAgIH1cbiAgICBpZiAob2xkQ29pbi5hbGlhcyAhPT0gbmV3Q29pbi5hbGlhcykge1xuICAgICAgdGhyb3cgbmV3IENvaW5SZXBsYWNlbWVudE5vdEFsbG93ZWRFcnJvcihvbGRDb2luLm5hbWUsICdpbW11dGFibGUgZmllbGQgYWxpYXMgY2hhbmdlZCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYXJkY29kZWQgbWFwcGluZyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IExFR0FDWV9DSEFJTl9JRF9NQVA6IFJlY29yZDxudW1iZXIsIHN0cmluZz4gPSB7XG4gICAgMTogJ2V0aCcsXG4gICAgNDI6ICd0ZXRoJyxcbiAgICA1OiAnZ3RldGgnLFxuICAgIDU2MDA0ODogJ2h0ZXRoJyxcbiAgICAxMDAwMTogJ2V0aHcnLFxuICAgIDgwMDAyOiAndHBvbHlnb24nLFxuICAgIDEzNzogJ3BvbHlnb24nLFxuICAgIDU2OiAnYnNjJyxcbiAgICA5NzogJ3Ric2MnLFxuICAgIDQyMTYxOiAnYXJiZXRoJyxcbiAgICA0MjE2MTQ6ICd0YXJiZXRoJyxcbiAgICAxMDogJ29wZXRoJyxcbiAgICAxMTE1NTQyMDogJ3RvcGV0aCcsXG4gICAgMTExNjogJ2NvcmVkYW8nLFxuICAgIDExMTQ6ICd0Y29yZWRhbycsXG4gICAgMjQ4OiAnb2FzJyxcbiAgICA5MzcyOiAndG9hcycsXG4gICAgMTQ6ICdmbHInLFxuICAgIDExNDogJ3RmbHInLFxuICAgIDE5OiAnc2diJyxcbiAgICAxNjogJ3RzZ2InLFxuICAgIDExMTE6ICd3ZW1peCcsXG4gICAgMTExMjogJ3R3ZW1peCcsXG4gICAgNTA6ICd4ZGMnLFxuICAgIDUxOiAndHhkYycsXG4gICAgODAwOTQ6ICdiZXJhJyxcbiAgICA4MDA2OTogJ3RiZXJhJyxcbiAgICA0MjIyMDogJ2NlbG8nLFxuICAgIDExMTQyMjIwOiAndGNlbG8nLFxuICAgIDIyMjI6ICdrYXZhJyxcbiAgICAyMjIxOiAndGthdmEnLFxuICAgIDQzMTE0OiAnYXZheGMnLFxuICAgIDQzMTEzOiAndGF2YXhjJyxcbiAgICAxMDA6ICdnbm8nLFxuICAgIDEzMDogJ3VuaWV0aCcsXG4gICAgMTMwMTogJ3R1bmlldGgnLFxuICAgIDE5MDQxNTogJ2hwcGV0aCcsXG4gICAgMTgxMjI4OiAndGhwcGV0aCcsXG4gICAgNjk4NTM4NTogJ2gnLFxuICAgIDcwODA5Njk6ICd0aCcsXG4gICAgNDY2MzogJ2hvb2RldGgnLFxuICAgIDQ2NjMwOiAndGhvb2RldGgnLFxuICAgIDMyNDogJ3prc3luY2VyYScsXG4gICAgMzAwOiAndHprc3luY2VyYScsXG4gICAgODQ1MzogJ2Jhc2VldGgnLFxuICAgIDg0NTMyOiAndGJhc2VldGgnLFxuICAgIDE0MzogJ21vbicsXG4gICAgMTAxNDM6ICd0bW9uJyxcbiAgICA0ODA6ICd3b3JsZCcsXG4gICAgNDgwMTogJ3R3b3JsZCcsXG4gICAgNTAzMTogJ3NvbWknLFxuICAgIDUwMzEyOiAndHN0dCcsXG4gICAgMTg2ODogJ3NvbmVpdW0nLFxuICAgIDE5NDY6ICd0c29uZWl1bScsXG4gICAgMzMxMTE6ICd0YXBlY2hhaW4nLFxuICAgIDMzMTM5OiAnYXBlY2hhaW4nLFxuICAgIDY4ODY4OTogJ3RwaHJzJyxcbiAgICAxMDIwMzA6ICdjdGMnLFxuICAgIDEwMjAzMTogJ3RjdGMnLFxuICAgIDk5ODogJ3RoeXBlZXZtJyxcbiAgICA5OTk6ICdoeXBlZXZtJyxcbiAgICAxNjYwMjogJ3RvZycsXG4gICAgMTY2NjE6ICdvZycsXG4gICAgOTc0NjogJ3R4cGwnLFxuICAgIDk3NDU6ICd4cGwnLFxuICAgIDE0NjAxOiAndHNvbmljJyxcbiAgICAxNDY6ICdzb25pYycsXG4gICAgMTMyODogJ3RzZWlldm0nLFxuICAgIDEzMjk6ICdzZWlldm0nLFxuICAgIDEwMDE6ICd0a2FpYScsXG4gICAgODIxNzogJ2thaWEnLFxuICAgIDEyNzA6ICd0aXJ5cycsXG4gICAgNTkxNDE6ICd0bGluZWFldGgnLFxuICAgIDU5MTQ0OiAnbGluZWFldGgnLFxuICAgIDEzMTU6ICd0aXAnLFxuICAgIDE1MTQ6ICdpcCcsXG4gICAgNTQ1OiAndGZsb3cnLFxuICAgIDc0NzogJ2Zsb3cnLFxuICAgIDk4ODY3OiAndHBsdW1lJyxcbiAgICA5ODg2NjogJ3BsdW1lJyxcbiAgICA2MzQzOiAndG1lZ2FldGgnLFxuICAgIDQzMjY6ICdtZWdhZXRoJyxcbiAgICAyOTU6ICdoYmFyZXZtJyxcbiAgICAyOTY6ICd0aGJhcmV2bScsXG4gICAgMTk2OiAnb2tieGxheWVyJyxcbiAgICAxOTUyOiAndG9rYnhsYXllcicsXG4gICAgNTczNDk1MTogJ2pvdmF5ZXRoJyxcbiAgICAyMDE5Nzc1OiAndGpvdmF5ZXRoJyxcbiAgICA1MDQyOiAnYXJjdXNkYycsXG4gICAgNTA0MjAwMjogJ3RhcmN1c2RjJyxcbiAgICA0MjE3OiAndGVtcG8nLFxuICAgIDQyNDMxOiAndHRlbXBvJyxcbiAgICA1MDAwOiAnbWFudGxlJyxcbiAgICA1MDAzOiAndG1hbnRsZScsXG4gICAgMjUzNjM6ICdmbHVlbnRldGgnLFxuICAgIDIwOTk0OiAndGZsdWVudGV0aCcsXG4gIH07XG5cbiAgcHJpdmF0ZSBidWlsZENoYWluSWRNYXAoKTogTWFwPG51bWJlciwgc3RyaW5nPiB7XG4gICAgY29uc3QgY2hhaW5JZE1hcCA9IG5ldyBNYXA8bnVtYmVyLCBzdHJpbmc+KCk7XG4gICAgdGhpcy5fbWFwLmZvckVhY2goKGNvaW4sIGNvaW5OYW1lKSA9PiB7XG4gICAgICAvLyBTa2lwIHRva2VucyAtIHRoZXkgc2hhcmUgdGhlIHNhbWUgY2hhaW5JZCBhcyB0aGVpciBwYXJlbnQgY2hhaW5cbiAgICAgIGlmIChjb2luLmlzVG9rZW4pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbmV0d29yayA9IGNvaW4ubmV0d29yaztcbiAgICAgIGlmICgnY2hhaW5JZCcgaW4gbmV0d29yayAmJiB0eXBlb2YgKG5ldHdvcmsgYXMgRXRoZXJldW1OZXR3b3JrKS5jaGFpbklkID09PSAnbnVtYmVyJykge1xuICAgICAgICBjb25zdCBjaGFpbklkID0gKG5ldHdvcmsgYXMgRXRoZXJldW1OZXR3b3JrKS5jaGFpbklkO1xuICAgICAgICBpZiAoIWNoYWluSWRNYXAuaGFzKGNoYWluSWQpKSB7XG4gICAgICAgICAgY2hhaW5JZE1hcC5zZXQoY2hhaW5JZCwgY29pbk5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNoYWluSWRNYXA7XG4gIH1cblxuICBwdWJsaWMgY29pbk5hbWVGcm9tQ2hhaW5JZChjaGFpbklkOiBudW1iZXIpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNvaW5OYW1lID0gQ29pbk1hcC5MRUdBQ1lfQ0hBSU5fSURfTUFQW2NoYWluSWRdO1xuICAgIGlmIChjb2luTmFtZSkge1xuICAgICAgcmV0dXJuIGNvaW5OYW1lO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9jb2luQnlDaGFpbklkID09PSBudWxsKSB7XG4gICAgICB0aGlzLl9jb2luQnlDaGFpbklkID0gdGhpcy5idWlsZENoYWluSWRNYXAoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NvaW5CeUNoYWluSWQuZ2V0KGNoYWluSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGBnZXRgIHRvIHRocm93IGlmIGEgY29pbiBpcyBtaXNzaW5nLCBpbnN0ZWFkIG9mIHJldHVybmluZyB1bmRlZmluZWQuXG4gICAqIEl0IHdpbGwgaG9ub3Iga2V5IGVxdWl2YWxlbmNlcyBpbiBjYXNlIGdpdmVuIGtleSBpcyBtaXNzaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEByZXR1cm4ge0Jhc2VDb2lufVxuICAgKi9cbiAgcHVibGljIGdldChrZXk6IHN0cmluZyk6IFJlYWRvbmx5PEJhc2VDb2luPiB7XG4gICAgY29uc3QgY29pbiA9IHRoaXMuZ2V0T3JVbmRlZmluZWQoa2V5KTtcbiAgICBpZiAoY29pbikge1xuICAgICAgcmV0dXJuIGNvaW47XG4gICAgfVxuICAgIHRocm93IG5ldyBDb2luTm90RGVmaW5lZEVycm9yKGtleSk7XG4gIH1cblxuICAvKipcbiAgICogU2FmZSBhY2Nlc3NvciB0aGF0IHJldHVybnMgdW5kZWZpbmVkIGluc3RlYWQgb2YgdGhyb3dpbmcgd2hlbiBhIGNvaW4gaXMgbm90IGZvdW5kLlxuICAgKiBQcmVmZXIgdGhpcyBvdmVyIGBnZXRgIGF0IGNhbGwgc2l0ZXMgd2hlcmUgdGhlIGNvaW4gbmFtZSBpcyBub3QgZ3VhcmFudGVlZCB0byBiZVxuICAgKiByZWdpc3RlcmVkIOKAlCBpdCBtYWtlcyB0aGUgbWlzc2luZy1jb2luIGNhc2UgZXhwbGljaXQgaW4gdGhlIHR5cGUgc3lzdGVtLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEByZXR1cm4ge0Jhc2VDb2luIHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgcHVibGljIGdldE9yVW5kZWZpbmVkKGtleTogc3RyaW5nKTogUmVhZG9ubHk8QmFzZUNvaW4+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5fbWFwLmdldChrZXkpIHx8XG4gICAgICB0aGlzLl9jb2luQnlJZHMuZ2V0KGtleSkgfHxcbiAgICAgIHRoaXMuX2NvaW5CeUFsaWFzZXMuZ2V0KGtleSkgfHxcbiAgICAgIHRoaXMuX2NvaW5CeUNvbnRyYWN0QWRkcmVzcy5nZXQoa2V5KSB8fFxuICAgICAgdGhpcy5fY29pbkJ5TmZ0Q29sbGVjdGlvbklELmdldChrZXkpXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBoYXMoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5fbWFwLmhhcyhrZXkpIHx8XG4gICAgICB0aGlzLl9jb2luQnlJZHMuaGFzKGtleSkgfHxcbiAgICAgIHRoaXMuX2NvaW5CeUFsaWFzZXMuaGFzKGtleSkgfHxcbiAgICAgIHRoaXMuX2NvaW5CeUNvbnRyYWN0QWRkcmVzcy5oYXMoa2V5KSB8fFxuICAgICAgdGhpcy5fY29pbkJ5TmZ0Q29sbGVjdGlvbklELmhhcyhrZXkpXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBtYXA8VD4obWFwcGVyOiAoY29pbjogUmVhZG9ubHk8QmFzZUNvaW4+LCBjb2luTmFtZTogc3RyaW5nKSA9PiBUKTogVFtdIHtcbiAgICBjb25zdCBtYXBSZXN1bHQ6IFRbXSA9IFtdO1xuICAgIHRoaXMuX21hcC5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICBtYXBSZXN1bHQucHVzaChtYXBwZXIodmFsdWUsIGtleSkpO1xuICAgIH0pO1xuICAgIHJldHVybiBtYXBSZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgcmVkdWNlPFQ+KHJlZHVjZXI6IChhY2M6IFQsIGNvaW46IFJlYWRvbmx5PEJhc2VDb2luPiwgY29pbk5hbWU6IHN0cmluZykgPT4gVCwgaW5pdGlhbFZhbHVlOiBUKTogVCB7XG4gICAgbGV0IGFjYyA9IGluaXRpYWxWYWx1ZTtcbiAgICB0aGlzLl9tYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgYWNjID0gcmVkdWNlcihhY2MsIHZhbHVlLCBrZXkpO1xuICAgIH0pO1xuICAgIHJldHVybiBhY2M7XG4gIH1cblxuICBwdWJsaWMgZmlsdGVyKHByZWRpY2F0ZTogKGNvaW46IFJlYWRvbmx5PEJhc2VDb2luPiwgY29pbk5hbWU6IHN0cmluZykgPT4gYm9vbGVhbik6IENvaW5NYXAge1xuICAgIGNvbnN0IGZpbHRlclJlc3VsdDogUmVhZG9ubHk8QmFzZUNvaW4+W10gPSBbXTtcbiAgICB0aGlzLl9tYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwga2V5KSkge1xuICAgICAgICBmaWx0ZXJSZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIENvaW5NYXAuZnJvbUNvaW5zKGZpbHRlclJlc3VsdCk7XG4gIH1cblxuICBwdWJsaWMgZm9yRWFjaChjYWxsYmFjazogKGNvaW46IFJlYWRvbmx5PEJhc2VDb2luPiwgY29pbk5hbWU6IHN0cmluZykgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX21hcC5mb3JFYWNoKGNhbGxiYWNrKTtcbiAgfVxuXG4gIHB1YmxpYyBbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPFtzdHJpbmcsIFJlYWRvbmx5PEJhc2VDb2luPl0+IHtcbiAgICByZXR1cm4gdGhpcy5fbWFwW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,30 @@
1
+ import { CoinFamily, CoinFeature } from './base';
2
+ /** Register default token features for a dynamically onboarded chain family. */
3
+ export declare function registerNetworkFeatures(family: string, features: CoinFeature[]): void;
4
+ /** Default token feature set shared by "plain" EVM-compatible chain families (no bespoke features). */
5
+ export declare const EVM_TOKEN_FEATURES: CoinFeature[];
6
+ /** Same as EVM_TOKEN_FEATURES, minus EIP1559, for EVM-compatible families that don't support it (e.g. xdc). */
7
+ export declare const EVM_TOKEN_FEATURES_NON_EIP1559: CoinFeature[];
8
+ /**
9
+ * Populate networkFeatureMapForTokens for every family whose base coin carries
10
+ * CoinFeature.SUPPORTS_ERC20 and isn't already explicitly listed below, using EVM_TOKEN_FEATURES
11
+ * (or its non-EIP1559 variant, mirroring the base coin's own EIP1559 support). Called once from
12
+ * coins.ts (which has access to the full coin map) so this module doesn't need to import it
13
+ * directly (that would create a circular import: coins.ts -> networkFeatureMapForTokens.ts ->
14
+ * allCoinsAndTokens.ts -> coins/botTokens.ts -> networkFeatureMapForTokens.ts).
15
+ */
16
+ export declare function registerErc20Families(families: Iterable<[family: string, supportsEip1559: boolean]>): void;
17
+ /**
18
+ * Look up token features for a family.
19
+ * Checks the static map first (including entries backfilled by registerErc20Families), then the
20
+ * dynamic map. Returns undefined if the family isn't recognized by either.
21
+ */
22
+ export declare function getNetworkFeatures(family: string): CoinFeature[] | undefined;
23
+ /**
24
+ * Resolve the final feature list for a token: the family's default token features
25
+ * plus `additionalFeatures`, minus `excludedFeatures`. Used by generated bot-token
26
+ * lists to apply the per-token diff returned by AMS (`features=false`).
27
+ */
28
+ export declare function getTokenFeatures(family: string, additionalFeatures?: CoinFeature[], excludedFeatures?: CoinFeature[]): CoinFeature[];
29
+ export declare const networkFeatureMapForTokens: Partial<Record<CoinFamily, CoinFeature[]>>;
30
+ //# sourceMappingURL=networkFeatureMapForTokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"networkFeatureMapForTokens.d.ts","sourceRoot":"","sources":["../../src/networkFeatureMapForTokens.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAiBjD,gFAAgF;AAChF,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI,CAErF;AAED,uGAAuG;AACvG,eAAO,MAAM,kBAAkB,EAAE,WAAW,EAQ3C,CAAC;AAEF,+GAA+G;AAC/G,eAAO,MAAM,8BAA8B,EAAE,WAAW,EAEvD,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI,CAQ1G;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,EAAE,GAAG,SAAS,CAE5E;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,kBAAkB,GAAE,WAAW,EAAO,EACtC,gBAAgB,GAAE,WAAW,EAAO,GACnC,WAAW,EAAE,CAIf;AAED,eAAO,MAAM,0BAA0B,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC,CA4BjF,CAAC"}
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.networkFeatureMapForTokens = exports.EVM_TOKEN_FEATURES_NON_EIP1559 = exports.EVM_TOKEN_FEATURES = void 0;
4
+ exports.registerNetworkFeatures = registerNetworkFeatures;
5
+ exports.registerErc20Families = registerErc20Families;
6
+ exports.getNetworkFeatures = getNetworkFeatures;
7
+ exports.getTokenFeatures = getTokenFeatures;
8
+ const account_1 = require("./account");
9
+ const base_1 = require("./base");
10
+ const coinFeatures_1 = require("./coinFeatures");
11
+ const dynamicNetworkFeaturesMap = new Map();
12
+ /** Register default token features for a dynamically onboarded chain family. */
13
+ function registerNetworkFeatures(family, features) {
14
+ dynamicNetworkFeaturesMap.set(family, features);
15
+ }
16
+ /** Default token feature set shared by "plain" EVM-compatible chain families (no bespoke features). */
17
+ exports.EVM_TOKEN_FEATURES = [
18
+ ...coinFeatures_1.EVM_FEATURES,
19
+ base_1.CoinFeature.SHARED_EVM_SIGNING,
20
+ base_1.CoinFeature.SHARED_EVM_SDK,
21
+ base_1.CoinFeature.EVM_COMPATIBLE_IMS,
22
+ base_1.CoinFeature.EVM_COMPATIBLE_UI,
23
+ base_1.CoinFeature.EVM_COMPATIBLE_WP,
24
+ base_1.CoinFeature.SUPPORTS_ERC20,
25
+ ];
26
+ /** Same as EVM_TOKEN_FEATURES, minus EIP1559, for EVM-compatible families that don't support it (e.g. xdc). */
27
+ exports.EVM_TOKEN_FEATURES_NON_EIP1559 = exports.EVM_TOKEN_FEATURES.filter((feature) => feature !== base_1.CoinFeature.EIP1559);
28
+ /**
29
+ * Populate networkFeatureMapForTokens for every family whose base coin carries
30
+ * CoinFeature.SUPPORTS_ERC20 and isn't already explicitly listed below, using EVM_TOKEN_FEATURES
31
+ * (or its non-EIP1559 variant, mirroring the base coin's own EIP1559 support). Called once from
32
+ * coins.ts (which has access to the full coin map) so this module doesn't need to import it
33
+ * directly (that would create a circular import: coins.ts -> networkFeatureMapForTokens.ts ->
34
+ * allCoinsAndTokens.ts -> coins/botTokens.ts -> networkFeatureMapForTokens.ts).
35
+ */
36
+ function registerErc20Families(families) {
37
+ for (const [family, supportsEip1559] of families) {
38
+ if (!(family in exports.networkFeatureMapForTokens)) {
39
+ exports.networkFeatureMapForTokens[family] = supportsEip1559
40
+ ? exports.EVM_TOKEN_FEATURES
41
+ : exports.EVM_TOKEN_FEATURES_NON_EIP1559;
42
+ }
43
+ }
44
+ }
45
+ /**
46
+ * Look up token features for a family.
47
+ * Checks the static map first (including entries backfilled by registerErc20Families), then the
48
+ * dynamic map. Returns undefined if the family isn't recognized by either.
49
+ */
50
+ function getNetworkFeatures(family) {
51
+ return exports.networkFeatureMapForTokens[family] ?? dynamicNetworkFeaturesMap.get(family);
52
+ }
53
+ /**
54
+ * Resolve the final feature list for a token: the family's default token features
55
+ * plus `additionalFeatures`, minus `excludedFeatures`. Used by generated bot-token
56
+ * lists to apply the per-token diff returned by AMS (`features=false`).
57
+ */
58
+ function getTokenFeatures(family, additionalFeatures = [], excludedFeatures = []) {
59
+ const base = getNetworkFeatures(family) ?? [];
60
+ const excluded = new Set(excludedFeatures);
61
+ return [...new Set([...base, ...additionalFeatures])].filter((f) => !excluded.has(f));
62
+ }
63
+ exports.networkFeatureMapForTokens = {
64
+ algo: account_1.AccountCoin.DEFAULT_FEATURES,
65
+ apt: coinFeatures_1.APT_FEATURES,
66
+ arbeth: [...account_1.AccountCoin.DEFAULT_FEATURES, base_1.CoinFeature.EIP1559],
67
+ avaxc: account_1.AccountCoin.DEFAULT_FEATURES,
68
+ bera: [...account_1.AccountCoin.DEFAULT_FEATURES, base_1.CoinFeature.EIP1559],
69
+ bsc: coinFeatures_1.BSC_TOKEN_FEATURES,
70
+ canton: coinFeatures_1.CANTON_TOKEN_FEATURES,
71
+ celo: account_1.AccountCoin.DEFAULT_FEATURES,
72
+ eth: account_1.AccountCoin.DEFAULT_FEATURES,
73
+ baseeth: exports.EVM_TOKEN_FEATURES,
74
+ eos: account_1.AccountCoin.DEFAULT_FEATURES,
75
+ gasevm: exports.EVM_TOKEN_FEATURES,
76
+ hbar: account_1.AccountCoin.DEFAULT_FEATURES,
77
+ opeth: [...account_1.AccountCoin.DEFAULT_FEATURES, base_1.CoinFeature.EIP1559],
78
+ katanaeth: exports.EVM_TOKEN_FEATURES,
79
+ polygon: coinFeatures_1.POLYGON_TOKEN_FEATURES,
80
+ scrolleth: exports.EVM_TOKEN_FEATURES,
81
+ sol: coinFeatures_1.SOL_TOKEN_FEATURES,
82
+ stx: coinFeatures_1.STX_TOKEN_FEATURES,
83
+ sui: coinFeatures_1.SUI_TOKEN_FEATURES,
84
+ tao: coinFeatures_1.TAO_TOKEN_FEATURES,
85
+ polyx: coinFeatures_1.POLYX_TOKEN_FEATURES,
86
+ trx: account_1.AccountCoin.DEFAULT_FEATURES,
87
+ xlm: account_1.AccountCoin.DEFAULT_FEATURES,
88
+ xrp: account_1.AccountCoin.DEFAULT_FEATURES,
89
+ ofc: [],
90
+ ada: coinFeatures_1.ADA_TOKEN_FEATURES,
91
+ };
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29ya0ZlYXR1cmVNYXBGb3JUb2tlbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbmV0d29ya0ZlYXR1cmVNYXBGb3JUb2tlbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBbUJBLDBEQUVDO0FBMEJELHNEQVFDO0FBT0QsZ0RBRUM7QUFPRCw0Q0FRQztBQS9FRCx1Q0FBd0M7QUFDeEMsaUNBQWlEO0FBQ2pELGlEQVl3QjtBQUV4QixNQUFNLHlCQUF5QixHQUFHLElBQUksR0FBRyxFQUF5QixDQUFDO0FBRW5FLGdGQUFnRjtBQUNoRixTQUFnQix1QkFBdUIsQ0FBQyxNQUFjLEVBQUUsUUFBdUI7SUFDN0UseUJBQXlCLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBRUQsdUdBQXVHO0FBQzFGLFFBQUEsa0JBQWtCLEdBQWtCO0lBQy9DLEdBQUcsMkJBQVk7SUFDZixrQkFBVyxDQUFDLGtCQUFrQjtJQUM5QixrQkFBVyxDQUFDLGNBQWM7SUFDMUIsa0JBQVcsQ0FBQyxrQkFBa0I7SUFDOUIsa0JBQVcsQ0FBQyxpQkFBaUI7SUFDN0Isa0JBQVcsQ0FBQyxpQkFBaUI7SUFDN0Isa0JBQVcsQ0FBQyxjQUFjO0NBQzNCLENBQUM7QUFFRiwrR0FBK0c7QUFDbEcsUUFBQSw4QkFBOEIsR0FBa0IsMEJBQWtCLENBQUMsTUFBTSxDQUNwRixDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxLQUFLLGtCQUFXLENBQUMsT0FBTyxDQUM3QyxDQUFDO0FBRUY7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLHFCQUFxQixDQUFDLFFBQThEO0lBQ2xHLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNqRCxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksa0NBQTBCLENBQUMsRUFBRSxDQUFDO1lBQzVDLGtDQUEwQixDQUFDLE1BQW9CLENBQUMsR0FBRyxlQUFlO2dCQUNoRSxDQUFDLENBQUMsMEJBQWtCO2dCQUNwQixDQUFDLENBQUMsc0NBQThCLENBQUM7UUFDckMsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLGtCQUFrQixDQUFDLE1BQWM7SUFDL0MsT0FBTyxrQ0FBMEIsQ0FBQyxNQUFvQixDQUFDLElBQUkseUJBQXlCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ25HLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsZ0JBQWdCLENBQzlCLE1BQWMsRUFDZCxxQkFBb0MsRUFBRSxFQUN0QyxtQkFBa0MsRUFBRTtJQUVwQyxNQUFNLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDOUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQWMsZ0JBQWdCLENBQUMsQ0FBQztJQUN4RCxPQUFPLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBYyxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyRyxDQUFDO0FBRVksUUFBQSwwQkFBMEIsR0FBK0M7SUFDcEYsSUFBSSxFQUFFLHFCQUFXLENBQUMsZ0JBQWdCO0lBQ2xDLEdBQUcsRUFBRSwyQkFBWTtJQUNqQixNQUFNLEVBQUUsQ0FBQyxHQUFHLHFCQUFXLENBQUMsZ0JBQWdCLEVBQUUsa0JBQVcsQ0FBQyxPQUFPLENBQUM7SUFDOUQsS0FBSyxFQUFFLHFCQUFXLENBQUMsZ0JBQWdCO0lBQ25DLElBQUksRUFBRSxDQUFDLEdBQUcscUJBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxrQkFBVyxDQUFDLE9BQU8sQ0FBQztJQUM1RCxHQUFHLEVBQUUsaUNBQWtCO0lBQ3ZCLE1BQU0sRUFBRSxvQ0FBcUI7SUFDN0IsSUFBSSxFQUFFLHFCQUFXLENBQUMsZ0JBQWdCO0lBQ2xDLEdBQUcsRUFBRSxxQkFBVyxDQUFDLGdCQUFnQjtJQUNqQyxPQUFPLEVBQUUsMEJBQWtCO0lBQzNCLEdBQUcsRUFBRSxxQkFBVyxDQUFDLGdCQUFnQjtJQUNqQyxNQUFNLEVBQUUsMEJBQWtCO0lBQzFCLElBQUksRUFBRSxxQkFBVyxDQUFDLGdCQUFnQjtJQUNsQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLHFCQUFXLENBQUMsZ0JBQWdCLEVBQUUsa0JBQVcsQ0FBQyxPQUFPLENBQUM7SUFDN0QsU0FBUyxFQUFFLDBCQUFrQjtJQUM3QixPQUFPLEVBQUUscUNBQXNCO0lBQy9CLFNBQVMsRUFBRSwwQkFBa0I7SUFDN0IsR0FBRyxFQUFFLGlDQUFrQjtJQUN2QixHQUFHLEVBQUUsaUNBQWtCO0lBQ3ZCLEdBQUcsRUFBRSxpQ0FBa0I7SUFDdkIsR0FBRyxFQUFFLGlDQUFrQjtJQUN2QixLQUFLLEVBQUUsbUNBQW9CO0lBQzNCLEdBQUcsRUFBRSxxQkFBVyxDQUFDLGdCQUFnQjtJQUNqQyxHQUFHLEVBQUUscUJBQVcsQ0FBQyxnQkFBZ0I7SUFDakMsR0FBRyxFQUFFLHFCQUFXLENBQUMsZ0JBQWdCO0lBQ2pDLEdBQUcsRUFBRSxFQUFFO0lBQ1AsR0FBRyxFQUFFLGlDQUFrQjtDQUN4QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWNjb3VudENvaW4gfSBmcm9tICcuL2FjY291bnQnO1xuaW1wb3J0IHsgQ29pbkZhbWlseSwgQ29pbkZlYXR1cmUgfSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IHtcbiAgQURBX1RPS0VOX0ZFQVRVUkVTLFxuICBBUFRfRkVBVFVSRVMsXG4gIEJTQ19UT0tFTl9GRUFUVVJFUyxcbiAgQ0FOVE9OX1RPS0VOX0ZFQVRVUkVTLFxuICBFVk1fRkVBVFVSRVMsXG4gIFBPTFlHT05fVE9LRU5fRkVBVFVSRVMsXG4gIFBPTFlYX1RPS0VOX0ZFQVRVUkVTLFxuICBTT0xfVE9LRU5fRkVBVFVSRVMsXG4gIFNUWF9UT0tFTl9GRUFUVVJFUyxcbiAgU1VJX1RPS0VOX0ZFQVRVUkVTLFxuICBUQU9fVE9LRU5fRkVBVFVSRVMsXG59IGZyb20gJy4vY29pbkZlYXR1cmVzJztcblxuY29uc3QgZHluYW1pY05ldHdvcmtGZWF0dXJlc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBDb2luRmVhdHVyZVtdPigpO1xuXG4vKiogUmVnaXN0ZXIgZGVmYXVsdCB0b2tlbiBmZWF0dXJlcyBmb3IgYSBkeW5hbWljYWxseSBvbmJvYXJkZWQgY2hhaW4gZmFtaWx5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyTmV0d29ya0ZlYXR1cmVzKGZhbWlseTogc3RyaW5nLCBmZWF0dXJlczogQ29pbkZlYXR1cmVbXSk6IHZvaWQge1xuICBkeW5hbWljTmV0d29ya0ZlYXR1cmVzTWFwLnNldChmYW1pbHksIGZlYXR1cmVzKTtcbn1cblxuLyoqIERlZmF1bHQgdG9rZW4gZmVhdHVyZSBzZXQgc2hhcmVkIGJ5IFwicGxhaW5cIiBFVk0tY29tcGF0aWJsZSBjaGFpbiBmYW1pbGllcyAobm8gYmVzcG9rZSBmZWF0dXJlcykuICovXG5leHBvcnQgY29uc3QgRVZNX1RPS0VOX0ZFQVRVUkVTOiBDb2luRmVhdHVyZVtdID0gW1xuICAuLi5FVk1fRkVBVFVSRVMsXG4gIENvaW5GZWF0dXJlLlNIQVJFRF9FVk1fU0lHTklORyxcbiAgQ29pbkZlYXR1cmUuU0hBUkVEX0VWTV9TREssXG4gIENvaW5GZWF0dXJlLkVWTV9DT01QQVRJQkxFX0lNUyxcbiAgQ29pbkZlYXR1cmUuRVZNX0NPTVBBVElCTEVfVUksXG4gIENvaW5GZWF0dXJlLkVWTV9DT01QQVRJQkxFX1dQLFxuICBDb2luRmVhdHVyZS5TVVBQT1JUU19FUkMyMCxcbl07XG5cbi8qKiBTYW1lIGFzIEVWTV9UT0tFTl9GRUFUVVJFUywgbWludXMgRUlQMTU1OSwgZm9yIEVWTS1jb21wYXRpYmxlIGZhbWlsaWVzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBpdCAoZS5nLiB4ZGMpLiAqL1xuZXhwb3J0IGNvbnN0IEVWTV9UT0tFTl9GRUFUVVJFU19OT05fRUlQMTU1OTogQ29pbkZlYXR1cmVbXSA9IEVWTV9UT0tFTl9GRUFUVVJFUy5maWx0ZXIoXG4gIChmZWF0dXJlKSA9PiBmZWF0dXJlICE9PSBDb2luRmVhdHVyZS5FSVAxNTU5XG4pO1xuXG4vKipcbiAqIFBvcHVsYXRlIG5ldHdvcmtGZWF0dXJlTWFwRm9yVG9rZW5zIGZvciBldmVyeSBmYW1pbHkgd2hvc2UgYmFzZSBjb2luIGNhcnJpZXNcbiAqIENvaW5GZWF0dXJlLlNVUFBPUlRTX0VSQzIwIGFuZCBpc24ndCBhbHJlYWR5IGV4cGxpY2l0bHkgbGlzdGVkIGJlbG93LCB1c2luZyBFVk1fVE9LRU5fRkVBVFVSRVNcbiAqIChvciBpdHMgbm9uLUVJUDE1NTkgdmFyaWFudCwgbWlycm9yaW5nIHRoZSBiYXNlIGNvaW4ncyBvd24gRUlQMTU1OSBzdXBwb3J0KS4gQ2FsbGVkIG9uY2UgZnJvbVxuICogY29pbnMudHMgKHdoaWNoIGhhcyBhY2Nlc3MgdG8gdGhlIGZ1bGwgY29pbiBtYXApIHNvIHRoaXMgbW9kdWxlIGRvZXNuJ3QgbmVlZCB0byBpbXBvcnQgaXRcbiAqIGRpcmVjdGx5ICh0aGF0IHdvdWxkIGNyZWF0ZSBhIGNpcmN1bGFyIGltcG9ydDogY29pbnMudHMgLT4gbmV0d29ya0ZlYXR1cmVNYXBGb3JUb2tlbnMudHMgLT5cbiAqIGFsbENvaW5zQW5kVG9rZW5zLnRzIC0+IGNvaW5zL2JvdFRva2Vucy50cyAtPiBuZXR3b3JrRmVhdHVyZU1hcEZvclRva2Vucy50cykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckVyYzIwRmFtaWxpZXMoZmFtaWxpZXM6IEl0ZXJhYmxlPFtmYW1pbHk6IHN0cmluZywgc3VwcG9ydHNFaXAxNTU5OiBib29sZWFuXT4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbZmFtaWx5LCBzdXBwb3J0c0VpcDE1NTldIG9mIGZhbWlsaWVzKSB7XG4gICAgaWYgKCEoZmFtaWx5IGluIG5ldHdvcmtGZWF0dXJlTWFwRm9yVG9rZW5zKSkge1xuICAgICAgbmV0d29ya0ZlYXR1cmVNYXBGb3JUb2tlbnNbZmFtaWx5IGFzIENvaW5GYW1pbHldID0gc3VwcG9ydHNFaXAxNTU5XG4gICAgICAgID8gRVZNX1RPS0VOX0ZFQVRVUkVTXG4gICAgICAgIDogRVZNX1RPS0VOX0ZFQVRVUkVTX05PTl9FSVAxNTU5O1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIExvb2sgdXAgdG9rZW4gZmVhdHVyZXMgZm9yIGEgZmFtaWx5LlxuICogQ2hlY2tzIHRoZSBzdGF0aWMgbWFwIGZpcnN0IChpbmNsdWRpbmcgZW50cmllcyBiYWNrZmlsbGVkIGJ5IHJlZ2lzdGVyRXJjMjBGYW1pbGllcyksIHRoZW4gdGhlXG4gKiBkeW5hbWljIG1hcC4gUmV0dXJucyB1bmRlZmluZWQgaWYgdGhlIGZhbWlseSBpc24ndCByZWNvZ25pemVkIGJ5IGVpdGhlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5ldHdvcmtGZWF0dXJlcyhmYW1pbHk6IHN0cmluZyk6IENvaW5GZWF0dXJlW10gfCB1bmRlZmluZWQge1xuICByZXR1cm4gbmV0d29ya0ZlYXR1cmVNYXBGb3JUb2tlbnNbZmFtaWx5IGFzIENvaW5GYW1pbHldID8/IGR5bmFtaWNOZXR3b3JrRmVhdHVyZXNNYXAuZ2V0KGZhbWlseSk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgZmluYWwgZmVhdHVyZSBsaXN0IGZvciBhIHRva2VuOiB0aGUgZmFtaWx5J3MgZGVmYXVsdCB0b2tlbiBmZWF0dXJlc1xuICogcGx1cyBgYWRkaXRpb25hbEZlYXR1cmVzYCwgbWludXMgYGV4Y2x1ZGVkRmVhdHVyZXNgLiBVc2VkIGJ5IGdlbmVyYXRlZCBib3QtdG9rZW5cbiAqIGxpc3RzIHRvIGFwcGx5IHRoZSBwZXItdG9rZW4gZGlmZiByZXR1cm5lZCBieSBBTVMgKGBmZWF0dXJlcz1mYWxzZWApLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VG9rZW5GZWF0dXJlcyhcbiAgZmFtaWx5OiBzdHJpbmcsXG4gIGFkZGl0aW9uYWxGZWF0dXJlczogQ29pbkZlYXR1cmVbXSA9IFtdLFxuICBleGNsdWRlZEZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gW11cbik6IENvaW5GZWF0dXJlW10ge1xuICBjb25zdCBiYXNlID0gZ2V0TmV0d29ya0ZlYXR1cmVzKGZhbWlseSkgPz8gW107XG4gIGNvbnN0IGV4Y2x1ZGVkID0gbmV3IFNldDxDb2luRmVhdHVyZT4oZXhjbHVkZWRGZWF0dXJlcyk7XG4gIHJldHVybiBbLi4ubmV3IFNldDxDb2luRmVhdHVyZT4oWy4uLmJhc2UsIC4uLmFkZGl0aW9uYWxGZWF0dXJlc10pXS5maWx0ZXIoKGYpID0+ICFleGNsdWRlZC5oYXMoZikpO1xufVxuXG5leHBvcnQgY29uc3QgbmV0d29ya0ZlYXR1cmVNYXBGb3JUb2tlbnM6IFBhcnRpYWw8UmVjb3JkPENvaW5GYW1pbHksIENvaW5GZWF0dXJlW10+PiA9IHtcbiAgYWxnbzogQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgYXB0OiBBUFRfRkVBVFVSRVMsXG4gIGFyYmV0aDogWy4uLkFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsIENvaW5GZWF0dXJlLkVJUDE1NTldLFxuICBhdmF4YzogQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgYmVyYTogWy4uLkFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsIENvaW5GZWF0dXJlLkVJUDE1NTldLFxuICBic2M6IEJTQ19UT0tFTl9GRUFUVVJFUyxcbiAgY2FudG9uOiBDQU5UT05fVE9LRU5fRkVBVFVSRVMsXG4gIGNlbG86IEFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIGV0aDogQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgYmFzZWV0aDogRVZNX1RPS0VOX0ZFQVRVUkVTLFxuICBlb3M6IEFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIGdhc2V2bTogRVZNX1RPS0VOX0ZFQVRVUkVTLFxuICBoYmFyOiBBY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICBvcGV0aDogWy4uLkFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsIENvaW5GZWF0dXJlLkVJUDE1NTldLFxuICBrYXRhbmFldGg6IEVWTV9UT0tFTl9GRUFUVVJFUyxcbiAgcG9seWdvbjogUE9MWUdPTl9UT0tFTl9GRUFUVVJFUyxcbiAgc2Nyb2xsZXRoOiBFVk1fVE9LRU5fRkVBVFVSRVMsXG4gIHNvbDogU09MX1RPS0VOX0ZFQVRVUkVTLFxuICBzdHg6IFNUWF9UT0tFTl9GRUFUVVJFUyxcbiAgc3VpOiBTVUlfVE9LRU5fRkVBVFVSRVMsXG4gIHRhbzogVEFPX1RPS0VOX0ZFQVRVUkVTLFxuICBwb2x5eDogUE9MWVhfVE9LRU5fRkVBVFVSRVMsXG4gIHRyeDogQWNjb3VudENvaW4uREVGQVVMVF9GRUFUVVJFUyxcbiAgeGxtOiBBY2NvdW50Q29pbi5ERUZBVUxUX0ZFQVRVUkVTLFxuICB4cnA6IEFjY291bnRDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIG9mYzogW10sXG4gIGFkYTogQURBX1RPS0VOX0ZFQVRVUkVTLFxufTtcbiJdfQ==