@rosen-bridge/abstract-extractor 2.1.0 → 2.1.1

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 (127) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/package.json +14 -7
  3. package/.eslintignore +0 -1
  4. package/dist/lib/abstractExtractor.d.ts +0 -25
  5. package/dist/lib/abstractExtractor.d.ts.map +0 -1
  6. package/dist/lib/abstractExtractor.js +0 -3
  7. package/dist/lib/constants.d.ts +0 -4
  8. package/dist/lib/constants.d.ts.map +0 -1
  9. package/dist/lib/constants.js +0 -4
  10. package/dist/lib/ergo/AbstractErgoExtractor.d.ts +0 -80
  11. package/dist/lib/ergo/AbstractErgoExtractor.d.ts.map +0 -1
  12. package/dist/lib/ergo/AbstractErgoExtractor.js +0 -142
  13. package/dist/lib/ergo/AbstractErgoExtractorAction.d.ts +0 -92
  14. package/dist/lib/ergo/AbstractErgoExtractorAction.d.ts.map +0 -1
  15. package/dist/lib/ergo/AbstractErgoExtractorAction.js +0 -222
  16. package/dist/lib/ergo/AbstractErgoExtractorEntity.d.ts +0 -11
  17. package/dist/lib/ergo/AbstractErgoExtractorEntity.d.ts.map +0 -1
  18. package/dist/lib/ergo/AbstractErgoExtractorEntity.js +0 -57
  19. package/dist/lib/ergo/index.d.ts +0 -10
  20. package/dist/lib/ergo/index.d.ts.map +0 -1
  21. package/dist/lib/ergo/index.js +0 -10
  22. package/dist/lib/ergo/initializable/AbstractInitializable.d.ts +0 -48
  23. package/dist/lib/ergo/initializable/AbstractInitializable.d.ts.map +0 -1
  24. package/dist/lib/ergo/initializable/AbstractInitializable.js +0 -163
  25. package/dist/lib/ergo/initializable/AbstractInitializableAction.d.ts +0 -14
  26. package/dist/lib/ergo/initializable/AbstractInitializableAction.d.ts.map +0 -1
  27. package/dist/lib/ergo/initializable/AbstractInitializableAction.js +0 -16
  28. package/dist/lib/ergo/initializable/index.d.ts +0 -3
  29. package/dist/lib/ergo/initializable/index.d.ts.map +0 -1
  30. package/dist/lib/ergo/initializable/index.js +0 -3
  31. package/dist/lib/ergo/interfaces.d.ts +0 -47
  32. package/dist/lib/ergo/interfaces.d.ts.map +0 -1
  33. package/dist/lib/ergo/interfaces.js +0 -8
  34. package/dist/lib/ergo/network/AbstractNetwork.d.ts +0 -26
  35. package/dist/lib/ergo/network/AbstractNetwork.d.ts.map +0 -1
  36. package/dist/lib/ergo/network/AbstractNetwork.js +0 -3
  37. package/dist/lib/ergo/network/ExplorerNetwork.d.ts +0 -74
  38. package/dist/lib/ergo/network/ExplorerNetwork.d.ts.map +0 -1
  39. package/dist/lib/ergo/network/ExplorerNetwork.js +0 -185
  40. package/dist/lib/ergo/network/NodeNetwork.d.ts +0 -60
  41. package/dist/lib/ergo/network/NodeNetwork.d.ts.map +0 -1
  42. package/dist/lib/ergo/network/NodeNetwork.js +0 -131
  43. package/dist/lib/ergo/utils.d.ts +0 -8
  44. package/dist/lib/ergo/utils.d.ts.map +0 -1
  45. package/dist/lib/ergo/utils.js +0 -16
  46. package/dist/lib/index.d.ts +0 -4
  47. package/dist/lib/index.d.ts.map +0 -1
  48. package/dist/lib/index.js +0 -4
  49. package/dist/tests/AbstractErgoExtractor.mock.d.ts +0 -11
  50. package/dist/tests/AbstractErgoExtractor.mock.d.ts.map +0 -1
  51. package/dist/tests/AbstractErgoExtractor.mock.js +0 -11
  52. package/dist/tests/AbstractErgoExtractor.spec.d.ts +0 -2
  53. package/dist/tests/AbstractErgoExtractor.spec.d.ts.map +0 -1
  54. package/dist/tests/AbstractErgoExtractor.spec.js +0 -240
  55. package/dist/tests/AbstractErgoExtractorAction.mock.d.ts +0 -15
  56. package/dist/tests/AbstractErgoExtractorAction.mock.d.ts.map +0 -1
  57. package/dist/tests/AbstractErgoExtractorAction.mock.js +0 -27
  58. package/dist/tests/AbstractErgoExtractorAction.spec.d.ts +0 -2
  59. package/dist/tests/AbstractErgoExtractorAction.spec.d.ts.map +0 -1
  60. package/dist/tests/AbstractErgoExtractorAction.spec.js +0 -221
  61. package/dist/tests/initializable/AbstractInitializable.mock.d.ts +0 -61
  62. package/dist/tests/initializable/AbstractInitializable.mock.d.ts.map +0 -1
  63. package/dist/tests/initializable/AbstractInitializable.mock.js +0 -18
  64. package/dist/tests/initializable/AbstractInitializable.spec.d.ts +0 -2
  65. package/dist/tests/initializable/AbstractInitializable.spec.d.ts.map +0 -1
  66. package/dist/tests/initializable/AbstractInitializable.spec.js +0 -299
  67. package/dist/tests/initializable/AbstractInitializableAction.mock.d.ts +0 -15
  68. package/dist/tests/initializable/AbstractInitializableAction.mock.d.ts.map +0 -1
  69. package/dist/tests/initializable/AbstractInitializableAction.mock.js +0 -27
  70. package/dist/tests/initializable/AbstractInitializableAction.spec.d.ts +0 -2
  71. package/dist/tests/initializable/AbstractInitializableAction.spec.d.ts.map +0 -1
  72. package/dist/tests/initializable/AbstractInitializableAction.spec.js +0 -54
  73. package/dist/tests/initializable/testData.d.ts +0 -94
  74. package/dist/tests/initializable/testData.d.ts.map +0 -1
  75. package/dist/tests/initializable/testData.js +0 -235
  76. package/dist/tests/network/ExplorerNetwork.spec.d.ts +0 -2
  77. package/dist/tests/network/ExplorerNetwork.spec.d.ts.map +0 -1
  78. package/dist/tests/network/ExplorerNetwork.spec.js +0 -61
  79. package/dist/tests/network/NodeNetwork.spec.d.ts +0 -2
  80. package/dist/tests/network/NodeNetwork.spec.d.ts.map +0 -1
  81. package/dist/tests/network/NodeNetwork.spec.js +0 -48
  82. package/dist/tests/network/testData.d.ts +0 -752
  83. package/dist/tests/network/testData.d.ts.map +0 -1
  84. package/dist/tests/network/testData.js +0 -1401
  85. package/dist/tests/testData.d.ts +0 -32
  86. package/dist/tests/testData.d.ts.map +0 -1
  87. package/dist/tests/testData.js +0 -121
  88. package/dist/tests/testUtils.d.ts +0 -9
  89. package/dist/tests/testUtils.d.ts.map +0 -1
  90. package/dist/tests/testUtils.js +0 -31
  91. package/dist/tsconfig.tsbuildinfo +0 -1
  92. package/dist/vitest.config.d.ts +0 -3
  93. package/dist/vitest.config.d.ts.map +0 -1
  94. package/dist/vitest.config.js +0 -18
  95. package/lib/abstractExtractor.ts +0 -31
  96. package/lib/constants.ts +0 -3
  97. package/lib/ergo/AbstractErgoExtractor.ts +0 -227
  98. package/lib/ergo/AbstractErgoExtractorAction.ts +0 -319
  99. package/lib/ergo/AbstractErgoExtractorEntity.ts +0 -32
  100. package/lib/ergo/index.ts +0 -9
  101. package/lib/ergo/initializable/AbstractInitializable.ts +0 -228
  102. package/lib/ergo/initializable/AbstractInitializableAction.ts +0 -33
  103. package/lib/ergo/initializable/index.ts +0 -2
  104. package/lib/ergo/interfaces.ts +0 -51
  105. package/lib/ergo/network/AbstractNetwork.ts +0 -29
  106. package/lib/ergo/network/ExplorerNetwork.ts +0 -237
  107. package/lib/ergo/network/NodeNetwork.ts +0 -169
  108. package/lib/ergo/utils.ts +0 -15
  109. package/lib/index.ts +0 -3
  110. package/tests/AbstractErgoExtractor.mock.ts +0 -33
  111. package/tests/AbstractErgoExtractor.spec.ts +0 -284
  112. package/tests/AbstractErgoExtractorAction.mock.ts +0 -45
  113. package/tests/AbstractErgoExtractorAction.spec.ts +0 -268
  114. package/tests/initializable/AbstractInitializable.mock.ts +0 -44
  115. package/tests/initializable/AbstractInitializable.spec.ts +0 -386
  116. package/tests/initializable/AbstractInitializableAction.mock.ts +0 -45
  117. package/tests/initializable/AbstractInitializableAction.spec.ts +0 -64
  118. package/tests/initializable/testData.ts +0 -283
  119. package/tests/network/ExplorerNetwork.spec.ts +0 -73
  120. package/tests/network/NodeNetwork.spec.ts +0 -56
  121. package/tests/network/testData.ts +0 -1708
  122. package/tests/testData.ts +0 -140
  123. package/tests/testUtils.ts +0 -22
  124. package/tsconfig.build.json +0 -9
  125. package/tsconfig.build.tsbuildinfo +0 -1
  126. package/tsconfig.json +0 -9
  127. package/vitest.config.ts +0 -18
@@ -1,299 +0,0 @@
1
- import { ErgoNetworkType } from '@rosen-bridge/scanner-interfaces';
2
- import { MockedInitializableErgoExtractor } from './AbstractInitializable.mock';
3
- import { transactionBatch } from './testData';
4
- import { RETRIAL_COUNT } from '../../lib/constants';
5
- describe('AbstractInitializableErgoExtractor', () => {
6
- describe('getTotalTxCount', () => {
7
- /**
8
- * @target getTotalTxCount should return the total tx count
9
- * @dependencies
10
- * - explorer network
11
- * @scenario
12
- * - mock extractor
13
- * - mock `getAddressTransactionsWithOffsetLimit` in node network
14
- * - run test (call `getTotalTxCount`)
15
- * @expected
16
- * - return one total tx count
17
- */
18
- it('should return the total tx count', async () => {
19
- const extractor = new MockedInitializableErgoExtractor(ErgoNetworkType.Node, 'node_url', 'address');
20
- extractor['network'].getAddressTransactionsWithOffsetLimit = vitest.fn().mockResolvedValue({
21
- items: [],
22
- total: 196704,
23
- });
24
- const totalTxCount = await extractor['getTotalTxCount']();
25
- expect(totalTxCount).toEqual(196704);
26
- });
27
- });
28
- describe('processTransactionBatch', () => {
29
- /**
30
- * @target processTransactionBatch should group transactions and process them in correct order
31
- * @dependencies
32
- * @scenario
33
- * - mock extractor
34
- * - spy `processTransactions`
35
- * - run test (call `processTransactionBatch`)
36
- * @expected
37
- * - to group txs in two blocks
38
- * - to process each blocks transaction separately
39
- */
40
- it('should group transactions and process them in correct order', async () => {
41
- const extractor = new MockedInitializableErgoExtractor(ErgoNetworkType.Node, 'node_url', 'address');
42
- const processSpy = vitest.fn().mockResolvedValue(true);
43
- extractor.processTransactions = processSpy;
44
- await extractor['processTransactionBatch'](transactionBatch);
45
- expect(processSpy).toBeCalledTimes(2);
46
- expect(processSpy).toHaveBeenCalledWith([transactionBatch[2]], {
47
- hash: '92eaff11a4a1c29b8654473258f9d837e9ce99fc0a8a4f27c484d5871afcde64',
48
- height: 1320698,
49
- });
50
- expect(processSpy).toHaveBeenLastCalledWith(transactionBatch.slice(0, 2), {
51
- hash: 'b861e2134821fcf1fcdad7e6edd56c4e4495b42b2fd72762a4c79ed1db78b44b',
52
- height: 1320705,
53
- });
54
- });
55
- /**
56
- * @target processTransactionBatch should throw error when processing transactions fails for a block
57
- * @dependencies
58
- * @scenario
59
- * - mock extractor
60
- * - spy `processTransactions` to return false (always fails)
61
- * - run test (call `processTransactionBatch`)
62
- * @expected
63
- * - to throw error
64
- */
65
- it('should throw error when processing transactions fails for a block', async () => {
66
- const extractor = new MockedInitializableErgoExtractor(ErgoNetworkType.Node, 'node_url', 'address');
67
- extractor.processTransactions = vitest.fn().mockResolvedValue(false);
68
- await expect(() => extractor['processTransactionBatch'](transactionBatch)).rejects.toThrowError();
69
- });
70
- });
71
- describe('initWithRetrial', () => {
72
- /**
73
- * @target initWithRetrial should not run the init job when its not set
74
- * @dependencies
75
- * - database
76
- * @scenario
77
- * - mock extractor with false initialization
78
- * - mock `removeAllData` in database actions
79
- * - mock init job
80
- * - run test (call `initWithRetrial`)
81
- * @expected
82
- * - not to remove database old data
83
- * - not to run the init job
84
- */
85
- it('should not run the init job when its not set', async () => {
86
- const extractor = new MockedInitializableErgoExtractor(ErgoNetworkType.Node, 'node_url', 'address', undefined, false);
87
- const removeSpy = vitest.fn();
88
- extractor['actions'] = {
89
- removeAllData: removeSpy,
90
- };
91
- const initSpy = vitest.fn();
92
- await extractor['initWithRetrial'](initSpy);
93
- expect(removeSpy).not.toHaveBeenCalled();
94
- expect(initSpy).not.toHaveBeenCalled();
95
- });
96
- /**
97
- * @target initWithRetrial should call init job once
98
- * @dependencies
99
- * - database
100
- * @scenario
101
- * - mock extractor
102
- * - mock `removeAllData` in database actions
103
- * - mock init job
104
- * - run test (call `initWithRetrial`)
105
- * @expected
106
- * - to remove database old data once
107
- * - call init job once
108
- */
109
- it('should call init job once', async () => {
110
- const extractor = new MockedInitializableErgoExtractor(ErgoNetworkType.Node, 'node_url', 'address');
111
- const removeSpy = vitest.fn();
112
- extractor['actions'] = {
113
- removeAllData: removeSpy,
114
- };
115
- const initSpy = vitest.fn();
116
- await extractor['initWithRetrial'](initSpy);
117
- expect(removeSpy).toHaveBeenCalledOnce();
118
- expect(initSpy).toHaveBeenCalledOnce();
119
- });
120
- /**
121
- * @target initWithRetrial should call init job RETRIAL_COUNT number of times
122
- * @dependencies
123
- * - database
124
- * @scenario
125
- * - mock extractor
126
- * - mock `removeAllData` in database actions
127
- * - mock init job to throw error
128
- * - run test (call `initWithRetrial`)
129
- * @expected
130
- * - to remove database old data once
131
- * - call init job RETRIAL_COUNT number of times
132
- * - to throw error after trials
133
- */
134
- it('should call init job RETRIAL_COUNT number of times', async () => {
135
- const extractor = new MockedInitializableErgoExtractor(ErgoNetworkType.Node, 'node_url', 'address');
136
- const removeSpy = vitest.fn();
137
- extractor['actions'] = {
138
- removeAllData: removeSpy,
139
- };
140
- const initSpy = vitest.fn().mockRejectedValue(0);
141
- await expect(async () => await extractor['initWithRetrial'](initSpy)).rejects.toThrowError();
142
- expect(removeSpy).toHaveBeenCalledOnce();
143
- expect(initSpy).toHaveBeenCalledTimes(RETRIAL_COUNT);
144
- });
145
- });
146
- describe('initializeWithNode', () => {
147
- /**
148
- * @target initializeWithNode should process all transactions bellow the init height twice
149
- * @dependencies
150
- * - node network
151
- * @scenario
152
- * - mock extractor
153
- * - mock `getAddressTransactionsWithOffsetLimit` in node network
154
- * - mock `initWithRetrial` to run the job once
155
- * - mock `getTotalTxCount` to return 3
156
- * - run test (call `initializeWithNode`)
157
- * @expected
158
- * - to filter the transactions and process the txs bellow the init height
159
- * - to process all filtered transactions twice
160
- */
161
- it('should process all transactions bellow the init height twice', async () => {
162
- const extractor = new MockedInitializableErgoExtractor(ErgoNetworkType.Node, 'node_url', 'address');
163
- extractor['network'].getAddressTransactionsWithOffsetLimit = vitest.fn().mockResolvedValue({
164
- items: transactionBatch,
165
- total: 3,
166
- });
167
- extractor['initWithRetrial'] = async (job) => job();
168
- extractor['getTotalTxCount'] = async () => 3;
169
- const processSpy = vitest.fn();
170
- extractor['processTransactionBatch'] = processSpy;
171
- await extractor['initializeWithNode']({ hash: 'hash', height: 1320698 });
172
- expect(processSpy).toBeCalledTimes(2);
173
- expect(processSpy).toBeCalledWith([transactionBatch[2]]);
174
- });
175
- /**
176
- * @target initializeWithNode should throw error when total transaction count changes
177
- * @dependencies
178
- * - node network
179
- * @scenario
180
- * - mock extractor
181
- * - mock `getAddressTransactionsWithOffsetLimit` in node network
182
- * - mock `initWithRetrial` to run the job once
183
- * - mock `getTotalTxCount` to return 3 then 4
184
- * - run test (call `initializeWithNode`)
185
- * @expected
186
- * - to throw error when the number of transactions change during initialization
187
- */
188
- it('should throw error when total transaction count changes', async () => {
189
- const extractor = new MockedInitializableErgoExtractor(ErgoNetworkType.Node, 'node_url', 'address');
190
- extractor['network'].getAddressTransactionsWithOffsetLimit = vitest.fn().mockResolvedValue({
191
- items: transactionBatch,
192
- total: 3,
193
- });
194
- extractor['initWithRetrial'] = async (job) => job();
195
- extractor['getTotalTxCount'] = vitest
196
- .fn()
197
- .mockResolvedValueOnce(3)
198
- .mockResolvedValue(4);
199
- extractor['processTransactionBatch'] = vitest.fn();
200
- expect(() => extractor['initializeWithNode']({ hash: 'hash', height: 1320698 })).rejects.toThrowError();
201
- });
202
- });
203
- describe('initializeWithExplorer', () => {
204
- /**
205
- * @target initializeWithExplorer should limit the height and process
206
- * transactions when they are less than the API_LIMIT
207
- * @dependencies
208
- * - explorer network
209
- * @scenario
210
- * - mock extractor
211
- * - mock `initWithRetrial` to run the job once
212
- * - mock `getAddressTransactionsWithHeight` in explorer network
213
- * return API_LIMIT transactions in first call (to limit the height range)
214
- * return 0 transactions in second call (to pass a range without process)
215
- * return transactionBatch in last call (to process the transactions when they are less than API_LIMIT)
216
- * - run test (call `initializeWithExplorer`)
217
- * @expected
218
- * - to limit the height when the transaction count is equal to API_LIMIT
219
- * - to cover all height ranges
220
- * - to process transactions when they are less than API_LIMIT
221
- */
222
- it(`should limit the height and process transactions when they are less than
223
- the API_LIMIT`, async () => {
224
- const extractor = new MockedInitializableErgoExtractor(ErgoNetworkType.Explorer, 'explorer_url', 'address');
225
- extractor['initWithRetrial'] = async (job) => job();
226
- const addressTxSpy = vitest
227
- .fn()
228
- .mockResolvedValueOnce(new Array(100).fill(transactionBatch[0]))
229
- .mockResolvedValueOnce([])
230
- .mockResolvedValueOnce(transactionBatch);
231
- extractor['network'].getAddressTransactionsWithHeight = addressTxSpy;
232
- const processSpy = vitest.fn();
233
- extractor['processTransactionBatch'] = processSpy;
234
- await extractor['initializeWithExplorer']({
235
- hash: 'hash',
236
- height: 1320800,
237
- });
238
- expect(addressTxSpy).toHaveBeenCalledWith('address', 0, 1320800);
239
- expect(addressTxSpy).toHaveBeenCalledWith('address', 0, 660400);
240
- expect(addressTxSpy).toHaveBeenLastCalledWith('address', 660401, 1320800);
241
- expect(processSpy).toHaveBeenCalledTimes(1);
242
- expect(processSpy).toHaveBeenCalledWith(transactionBatch);
243
- });
244
- /**
245
- * @target initializeWithExplorer should process all block transactions when
246
- * the number of transactions in the block is more than API_LIMIT
247
- * @dependencies
248
- * - explorer network
249
- * @scenario
250
- * - mock extractor
251
- * - mock `initWithRetrial` to run the job once
252
- * - mock `getAddressTransactionsWithHeight` to return 100 transactions in one block
253
- * - spy all other functions to check the calls
254
- * - run test (call `initializeWithExplorer`)
255
- * @expected
256
- * - to process all transactions in block 1320000
257
- * - not to stuck at a large block and complete the process
258
- */
259
- it(`should process all block transactions when the number of transactions in
260
- the block is more than API_LIMIT`, async () => {
261
- // mock extractor
262
- const extractor = new MockedInitializableErgoExtractor(ErgoNetworkType.Explorer, 'explorer_url', 'address');
263
- // mock `initWithRetrial` to run the job once
264
- extractor['initWithRetrial'] = async (job) => job();
265
- // mock `getAddressTransactionsWithHeight` to return 100 transactions in one block
266
- const exNetwork = extractor['network'];
267
- const addressTxSpy = vitest
268
- .fn()
269
- .mockImplementation((address, fromHeight, toHeight) => {
270
- if (fromHeight <= 1320000 && toHeight >= 1320000)
271
- return new Array(100).fill(transactionBatch[0]);
272
- return [];
273
- });
274
- exNetwork.getAddressTransactionsWithHeight = addressTxSpy;
275
- // spy all other functions to check the calls
276
- const blockIdSpy = vi.fn().mockResolvedValue('blockId');
277
- const blockTxsSpy = vi.fn().mockResolvedValue([]);
278
- exNetwork.getBlockIdAtHeight = blockIdSpy;
279
- exNetwork.getBlockTxs = blockTxsSpy;
280
- const processSpy = vitest.fn();
281
- const processBatchSpy = vitest.fn();
282
- extractor.processTransactions = processSpy;
283
- extractor['processTransactionBatch'] = processBatchSpy;
284
- // run test (call `initializeWithExplorer`)
285
- await extractor['initializeWithExplorer']({
286
- hash: 'hash',
287
- height: 1320800,
288
- });
289
- expect(blockIdSpy).toHaveBeenCalledWith(1320000);
290
- expect(blockTxsSpy).toHaveBeenCalledWith('blockId');
291
- expect(processSpy).toHaveBeenCalledWith([], {
292
- hash: 'blockId',
293
- height: 1320000,
294
- });
295
- expect(processBatchSpy).not.toBeCalled();
296
- });
297
- });
298
- });
299
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RJbml0aWFsaXphYmxlLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0cy9pbml0aWFsaXphYmxlL0Fic3RyYWN0SW5pdGlhbGl6YWJsZS5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQVFuRSxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDOUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBR3BELFFBQVEsQ0FBQyxvQ0FBb0MsRUFBRSxHQUFHLEVBQUU7SUFDbEQsUUFBUSxDQUFDLGlCQUFpQixFQUFFLEdBQUcsRUFBRTtRQUMvQjs7Ozs7Ozs7OztXQVVHO1FBQ0gsRUFBRSxDQUFDLGtDQUFrQyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ2hELE1BQU0sU0FBUyxHQUFHLElBQUksZ0NBQWdDLENBQ3BELGVBQWUsQ0FBQyxJQUFJLEVBQ3BCLFVBQVUsRUFDVixTQUFTLENBQ1YsQ0FBQztZQUVBLFNBQVMsQ0FBQyxTQUFTLENBQ3BCLENBQUMscUNBQXFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDO2dCQUN0RSxLQUFLLEVBQUUsRUFBRTtnQkFDVCxLQUFLLEVBQUUsTUFBTTthQUNkLENBQUMsQ0FBQztZQUNILE1BQU0sWUFBWSxHQUFHLE1BQU0sU0FBUyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztZQUMxRCxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMseUJBQXlCLEVBQUUsR0FBRyxFQUFFO1FBQ3ZDOzs7Ozs7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QyxHQUFHLGVBQWUsQ0FBQztZQUN2RCwyQ0FBMkM7WUFDM0MsTUFBTSxTQUFTLENBQUMsd0JBQXdCLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxFQUFFLE1BQU07Z0JBQ1osTUFBTSxFQUFFLE9BQU87YUFDaEIsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2pELE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNwRCxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsb0JBQW9CLENBQUMsRUFBRSxFQUFFO2dCQUMxQyxJQUFJLEVBQUUsU0FBUztnQkFDZixNQUFNLEVBQUUsT0FBTzthQUNoQixDQUFDLENBQUM7WUFDSCxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVyZ29OZXR3b3JrVHlwZSB9IGZyb20gJ0Byb3Nlbi1icmlkZ2Uvc2Nhbm5lci1pbnRlcmZhY2VzJztcblxuaW1wb3J0IHtcbiAgTm9kZU5ldHdvcmssXG4gIEFic3RyYWN0Qm94RGF0YSxcbiAgRXhwbG9yZXJOZXR3b3JrLFxuICBBYnN0cmFjdEVyZ29FeHRyYWN0b3JFbnRpdHksXG59IGZyb20gJy4uLy4uL2xpYic7XG5pbXBvcnQgeyBNb2NrZWRJbml0aWFsaXphYmxlRXJnb0V4dHJhY3RvciB9IGZyb20gJy4vQWJzdHJhY3RJbml0aWFsaXphYmxlLm1vY2snO1xuaW1wb3J0IHsgdHJhbnNhY3Rpb25CYXRjaCB9IGZyb20gJy4vdGVzdERhdGEnO1xuaW1wb3J0IHsgUkVUUklBTF9DT1VOVCB9IGZyb20gJy4uLy4uL2xpYi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQWJzdHJhY3RJbml0aWFsaXphYmxlRXJnb0V4dHJhY3RvckFjdGlvbiB9IGZyb20gJy4uLy4uL2xpYi9lcmdvL2luaXRpYWxpemFibGUnO1xuXG5kZXNjcmliZSgnQWJzdHJhY3RJbml0aWFsaXphYmxlRXJnb0V4dHJhY3RvcicsICgpID0+IHtcbiAgZGVzY3JpYmUoJ2dldFRvdGFsVHhDb3VudCcsICgpID0+IHtcbiAgICAvKipcbiAgICAgKiBAdGFyZ2V0IGdldFRvdGFsVHhDb3VudCBzaG91bGQgcmV0dXJuIHRoZSB0b3RhbCB0eCBjb3VudFxuICAgICAqIEBkZXBlbmRlbmNpZXNcbiAgICAgKiAtIGV4cGxvcmVyIG5ldHdvcmtcbiAgICAgKiBAc2NlbmFyaW9cbiAgICAgKiAtIG1vY2sgZXh0cmFjdG9yXG4gICAgICogLSBtb2NrIGBnZXRBZGRyZXNzVHJhbnNhY3Rpb25zV2l0aE9mZnNldExpbWl0YCBpbiBub2RlIG5ldHdvcmtcbiAgICAgKiAtIHJ1biB0ZXN0IChjYWxsIGBnZXRUb3RhbFR4Q291bnRgKVxuICAgICAqIEBleHBlY3RlZFxuICAgICAqIC0gcmV0dXJuIG9uZSB0b3RhbCB0eCBjb3VudFxuICAgICAqL1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSB0b3RhbCB0eCBjb3VudCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGV4dHJhY3RvciA9IG5ldyBNb2NrZWRJbml0aWFsaXphYmxlRXJnb0V4dHJhY3RvcihcbiAgICAgICAgRXJnb05ldHdvcmtUeXBlLk5vZGUsXG4gICAgICAgICdub2RlX3VybCcsXG4gICAgICAgICdhZGRyZXNzJyxcbiAgICAgICk7XG4gICAgICAoXG4gICAgICAgIGV4dHJhY3RvclsnbmV0d29yayddIGFzIE5vZGVOZXR3b3JrXG4gICAgICApLmdldEFkZHJlc3NUcmFuc2FjdGlvbnNXaXRoT2Zmc2V0TGltaXQgPSB2aXRlc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICAgIGl0ZW1zOiBbXSxcbiAgICAgICAgdG90YWw6IDE5NjcwNCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgdG90YWxUeENvdW50ID0gYXdhaXQgZXh0cmFjdG9yWydnZXRUb3RhbFR4Q291bnQnXSgpO1xuICAgICAgZXhwZWN0KHRvdGFsVHhDb3VudCkudG9FcXVhbCgxOTY3MDQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncHJvY2Vzc1RyYW5zYWN0aW9uQmF0Y2gnLCAoKSA9PiB7XG4gICAgLyoqXG4gICAgICogQHRhcmdldCBwcm9jZXNzVHJhbnNhY3Rpb25CYXRjaCBzaG91bGQgZ3JvdXAgdHJhbnNhY3Rpb25zIGFuZCBwcm9jZXNzIHRoZW0gaW4gY29ycmVjdCBvcmRlclxuICAgICAqIEBkZXBlbmRlbmNpZXNcbiAgICAgKiBAc2NlbmFyaW9cbiAgICAgKiAtIG1vY2sgZXh0cmFjdG9yXG4gICAgICogLSBzcHkgYHByb2Nlc3NUcmFuc2FjdGlvbnNgXG4gICAgICogLSBydW4gdGVzdCAoY2FsbCBgcHJvY2Vzc1RyYW5zYWN0aW9uQmF0Y2hgKVxuICAgICAqIEBleHBlY3RlZFxuICAgICAqIC0gdG8gZ3JvdXAgdHhzIGluIHR3byBibG9ja3NcbiAgICAgKiAtIHRvIHByb2Nlc3MgZWFjaCBibG9ja3MgdHJhbnNhY3Rpb24gc2VwYXJhdGVseVxuICAgICAqL1xuICAgIGl0KCdzaG91bGQgZ3JvdXAgdHJhbnNhY3Rpb25zIGFuZCBwcm9jZXNzIHRoZW0gaW4gY29ycmVjdCBvcmRlcicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGV4dHJhY3RvciA9IG5ldyBNb2NrZWRJbml0aWFsaXphYmxlRXJnb0V4dHJhY3RvcihcbiAgICAgICAgRXJnb05ldHdvcmtUeXBlLk5vZGUsXG4gICAgICAgICdub2RlX3VybCcsXG4gICAgICAgICdhZGRyZXNzJyxcbiAgICAgICk7XG4gICAgICBjb25zdCBwcm9jZXNzU3B5ID0gdml0ZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUodHJ1ZSk7XG4gICAgICBleHRyYWN0b3IucHJvY2Vzc1RyYW5zYWN0aW9ucyA9IHByb2Nlc3NTcHk7XG4gICAgICBhd2FpdCBleHRyYWN0b3JbJ3Byb2Nlc3NUcmFuc2FjdGlvbkJhdGNoJ10odHJhbnNhY3Rpb25CYXRjaCk7XG4gICAgICBleHBlY3QocHJvY2Vzc1NweSkudG9CZUNhbGxlZFRpbWVzKDIpO1xuICAgICAgZXhwZWN0KHByb2Nlc3NTcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFt0cmFuc2FjdGlvbkJhdGNoWzJdXSwge1xuICAgICAgICBoYXNoOiAnOTJlYWZmMTFhNGExYzI5Yjg2NTQ0NzMyNThmOWQ4MzdlOWNlOTlmYzBhOGE0ZjI3YzQ4NGQ1ODcxYWZjZGU2NCcsXG4gICAgICAgIGhlaWdodDogMTMyMDY5OCxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KHByb2Nlc3NTcHkpLnRvSGF2ZUJlZW5MYXN0Q2FsbGVkV2l0aChcbiAgICAgICAgdHJhbnNhY3Rpb25CYXRjaC5zbGljZSgwLCAyKSxcbiAgICAgICAge1xuICAgICAgICAgIGhhc2g6ICdiODYxZTIxMzQ4MjFmY2YxZmNkYWQ3ZTZlZGQ1NmM0ZTQ0OTViNDJiMmZkNzI3NjJhNGM3OWVkMWRiNzhiNDRiJyxcbiAgICAgICAgICBoZWlnaHQ6IDEzMjA3MDUsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQHRhcmdldCBwcm9jZXNzVHJhbnNhY3Rpb25CYXRjaCBzaG91bGQgdGhyb3cgZXJyb3Igd2hlbiBwcm9jZXNzaW5nIHRyYW5zYWN0aW9ucyBmYWlscyBmb3IgYSBibG9ja1xuICAgICAqIEBkZXBlbmRlbmNpZXNcbiAgICAgKiBAc2NlbmFyaW9cbiAgICAgKiAtIG1vY2sgZXh0cmFjdG9yXG4gICAgICogLSBzcHkgYHByb2Nlc3NUcmFuc2FjdGlvbnNgIHRvIHJldHVybiBmYWxzZSAoYWx3YXlzIGZhaWxzKVxuICAgICAqIC0gcnVuIHRlc3QgKGNhbGwgYHByb2Nlc3NUcmFuc2FjdGlvbkJhdGNoYClcbiAgICAgKiBAZXhwZWN0ZWRcbiAgICAgKiAtIHRvIHRocm93IGVycm9yXG4gICAgICovXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIHByb2Nlc3NpbmcgdHJhbnNhY3Rpb25zIGZhaWxzIGZvciBhIGJsb2NrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZXh0cmFjdG9yID0gbmV3IE1vY2tlZEluaXRpYWxpemFibGVFcmdvRXh0cmFjdG9yKFxuICAgICAgICBFcmdvTmV0d29ya1R5cGUuTm9kZSxcbiAgICAgICAgJ25vZGVfdXJsJyxcbiAgICAgICAgJ2FkZHJlc3MnLFxuICAgICAgKTtcbiAgICAgIGV4dHJhY3Rvci5wcm9jZXNzVHJhbnNhY3Rpb25zID0gdml0ZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoZmFsc2UpO1xuICAgICAgYXdhaXQgZXhwZWN0KCgpID0+XG4gICAgICAgIGV4dHJhY3RvclsncHJvY2Vzc1RyYW5zYWN0aW9uQmF0Y2gnXSh0cmFuc2FjdGlvbkJhdGNoKSxcbiAgICAgICkucmVqZWN0cy50b1Rocm93RXJyb3IoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2luaXRXaXRoUmV0cmlhbCcsICgpID0+IHtcbiAgICAvKipcbiAgICAgKiBAdGFyZ2V0IGluaXRXaXRoUmV0cmlhbCBzaG91bGQgbm90IHJ1biB0aGUgaW5pdCBqb2Igd2hlbiBpdHMgbm90IHNldFxuICAgICAqIEBkZXBlbmRlbmNpZXNcbiAgICAgKiAtIGRhdGFiYXNlXG4gICAgICogQHNjZW5hcmlvXG4gICAgICogLSBtb2NrIGV4dHJhY3RvciB3aXRoIGZhbHNlIGluaXRpYWxpemF0aW9uXG4gICAgICogLSBtb2NrIGByZW1vdmVBbGxEYXRhYCBpbiBkYXRhYmFzZSBhY3Rpb25zXG4gICAgICogLSBtb2NrIGluaXQgam9iXG4gICAgICogLSBydW4gdGVzdCAoY2FsbCBgaW5pdFdpdGhSZXRyaWFsYClcbiAgICAgKiBAZXhwZWN0ZWRcbiAgICAgKiAtIG5vdCB0byByZW1vdmUgZGF0YWJhc2Ugb2xkIGRhdGFcbiAgICAgKiAtIG5vdCB0byBydW4gdGhlIGluaXQgam9iXG4gICAgICovXG4gICAgaXQoJ3Nob3VsZCBub3QgcnVuIHRoZSBpbml0IGpvYiB3aGVuIGl0cyBub3Qgc2V0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZXh0cmFjdG9yID0gbmV3IE1vY2tlZEluaXRpYWxpemFibGVFcmdvRXh0cmFjdG9yKFxuICAgICAgICBFcmdvTmV0d29ya1R5cGUuTm9kZSxcbiAgICAgICAgJ25vZGVfdXJsJyxcbiAgICAgICAgJ2FkZHJlc3MnLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIGZhbHNlLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJlbW92ZVNweSA9IHZpdGVzdC5mbigpO1xuICAgICAgZXh0cmFjdG9yWydhY3Rpb25zJ10gPSB7XG4gICAgICAgIHJlbW92ZUFsbERhdGE6IHJlbW92ZVNweSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBBYnN0cmFjdEluaXRpYWxpemFibGVFcmdvRXh0cmFjdG9yQWN0aW9uPFxuICAgICAgICBBYnN0cmFjdEJveERhdGEsXG4gICAgICAgIEFic3RyYWN0RXJnb0V4dHJhY3RvckVudGl0eVxuICAgICAgPjtcbiAgICAgIGNvbnN0IGluaXRTcHkgPSB2aXRlc3QuZm4oKTtcbiAgICAgIGF3YWl0IGV4dHJhY3RvclsnaW5pdFdpdGhSZXRyaWFsJ10oaW5pdFNweSk7XG4gICAgICBleHBlY3QocmVtb3ZlU3B5KS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgZXhwZWN0KGluaXRTcHkpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBAdGFyZ2V0IGluaXRXaXRoUmV0cmlhbCBzaG91bGQgY2FsbCBpbml0IGpvYiBvbmNlXG4gICAgICogQGRlcGVuZGVuY2llc1xuICAgICAqIC0gZGF0YWJhc2VcbiAgICAgKiBAc2NlbmFyaW9cbiAgICAgKiAtIG1vY2sgZXh0cmFjdG9yXG4gICAgICogLSBtb2NrIGByZW1vdmVBbGxEYXRhYCBpbiBkYXRhYmFzZSBhY3Rpb25zXG4gICAgICogLSBtb2NrIGluaXQgam9iXG4gICAgICogLSBydW4gdGVzdCAoY2FsbCBgaW5pdFdpdGhSZXRyaWFsYClcbiAgICAgKiBAZXhwZWN0ZWRcbiAgICAgKiAtIHRvIHJlbW92ZSBkYXRhYmFzZSBvbGQgZGF0YSBvbmNlXG4gICAgICogLSBjYWxsIGluaXQgam9iIG9uY2VcbiAgICAgKi9cbiAgICBpdCgnc2hvdWxkIGNhbGwgaW5pdCBqb2Igb25jZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGV4dHJhY3RvciA9IG5ldyBNb2NrZWRJbml0aWFsaXphYmxlRXJnb0V4dHJhY3RvcihcbiAgICAgICAgRXJnb05ldHdvcmtUeXBlLk5vZGUsXG4gICAgICAgICdub2RlX3VybCcsXG4gICAgICAgICdhZGRyZXNzJyxcbiAgICAgICk7XG4gICAgICBjb25zdCByZW1vdmVTcHkgPSB2aXRlc3QuZm4oKTtcbiAgICAgIGV4dHJhY3RvclsnYWN0aW9ucyddID0ge1xuICAgICAgICByZW1vdmVBbGxEYXRhOiByZW1vdmVTcHksXG4gICAgICB9IGFzIHVua25vd24gYXMgQWJzdHJhY3RJbml0aWFsaXphYmxlRXJnb0V4dHJhY3RvckFjdGlvbjxcbiAgICAgICAgQWJzdHJhY3RCb3hEYXRhLFxuICAgICAgICBBYnN0cmFjdEVyZ29FeHRyYWN0b3JFbnRpdHlcbiAgICAgID47XG4gICAgICBjb25zdCBpbml0U3B5ID0gdml0ZXN0LmZuKCk7XG4gICAgICBhd2FpdCBleHRyYWN0b3JbJ2luaXRXaXRoUmV0cmlhbCddKGluaXRTcHkpO1xuICAgICAgZXhwZWN0KHJlbW92ZVNweSkudG9IYXZlQmVlbkNhbGxlZE9uY2UoKTtcbiAgICAgIGV4cGVjdChpbml0U3B5KS50b0hhdmVCZWVuQ2FsbGVkT25jZSgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQHRhcmdldCBpbml0V2l0aFJldHJpYWwgc2hvdWxkIGNhbGwgaW5pdCBqb2IgUkVUUklBTF9DT1VOVCBudW1iZXIgb2YgdGltZXNcbiAgICAgKiBAZGVwZW5kZW5jaWVzXG4gICAgICogLSBkYXRhYmFzZVxuICAgICAqIEBzY2VuYXJpb1xuICAgICAqIC0gbW9jayBleHRyYWN0b3JcbiAgICAgKiAtIG1vY2sgYHJlbW92ZUFsbERhdGFgIGluIGRhdGFiYXNlIGFjdGlvbnNcbiAgICAgKiAtIG1vY2sgaW5pdCBqb2IgdG8gdGhyb3cgZXJyb3JcbiAgICAgKiAtIHJ1biB0ZXN0IChjYWxsIGBpbml0V2l0aFJldHJpYWxgKVxuICAgICAqIEBleHBlY3RlZFxuICAgICAqIC0gdG8gcmVtb3ZlIGRhdGFiYXNlIG9sZCBkYXRhIG9uY2VcbiAgICAgKiAtIGNhbGwgaW5pdCBqb2IgUkVUUklBTF9DT1VOVCBudW1iZXIgb2YgdGltZXNcbiAgICAgKiAtIHRvIHRocm93IGVycm9yIGFmdGVyIHRyaWFsc1xuICAgICAqL1xuICAgIGl0KCdzaG91bGQgY2FsbCBpbml0IGpvYiBSRVRSSUFMX0NPVU5UIG51bWJlciBvZiB0aW1lcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGV4dHJhY3RvciA9IG5ldyBNb2NrZWRJbml0aWFsaXphYmxlRXJnb0V4dHJhY3RvcihcbiAgICAgICAgRXJnb05ldHdvcmtUeXBlLk5vZGUsXG4gICAgICAgICdub2RlX3VybCcsXG4gICAgICAgICdhZGRyZXNzJyxcbiAgICAgICk7XG4gICAgICBjb25zdCByZW1vdmVTcHkgPSB2aXRlc3QuZm4oKTtcbiAgICAgIGV4dHJhY3RvclsnYWN0aW9ucyddID0ge1xuICAgICAgICByZW1vdmVBbGxEYXRhOiByZW1vdmVTcHksXG4gICAgICB9IGFzIHVua25vd24gYXMgQWJzdHJhY3RJbml0aWFsaXphYmxlRXJnb0V4dHJhY3RvckFjdGlvbjxcbiAgICAgICAgQWJzdHJhY3RCb3hEYXRhLFxuICAgICAgICBBYnN0cmFjdEVyZ29FeHRyYWN0b3JFbnRpdHlcbiAgICAgID47XG4gICAgICBjb25zdCBpbml0U3B5ID0gdml0ZXN0LmZuKCkubW9ja1JlamVjdGVkVmFsdWUoMCk7XG4gICAgICBhd2FpdCBleHBlY3QoXG4gICAgICAgIGFzeW5jICgpID0+IGF3YWl0IGV4dHJhY3RvclsnaW5pdFdpdGhSZXRyaWFsJ10oaW5pdFNweSksXG4gICAgICApLnJlamVjdHMudG9UaHJvd0Vycm9yKCk7XG4gICAgICBleHBlY3QocmVtb3ZlU3B5KS50b0hhdmVCZWVuQ2FsbGVkT25jZSgpO1xuICAgICAgZXhwZWN0KGluaXRTcHkpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcyhSRVRSSUFMX0NPVU5UKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2luaXRpYWxpemVXaXRoTm9kZScsICgpID0+IHtcbiAgICAvKipcbiAgICAgKiBAdGFyZ2V0IGluaXRpYWxpemVXaXRoTm9kZSBzaG91bGQgcHJvY2VzcyBhbGwgdHJhbnNhY3Rpb25zIGJlbGxvdyB0aGUgaW5pdCBoZWlnaHQgdHdpY2VcbiAgICAgKiBAZGVwZW5kZW5jaWVzXG4gICAgICogLSBub2RlIG5ldHdvcmtcbiAgICAgKiBAc2NlbmFyaW9cbiAgICAgKiAtIG1vY2sgZXh0cmFjdG9yXG4gICAgICogLSBtb2NrIGBnZXRBZGRyZXNzVHJhbnNhY3Rpb25zV2l0aE9mZnNldExpbWl0YCBpbiBub2RlIG5ldHdvcmtcbiAgICAgKiAtIG1vY2sgYGluaXRXaXRoUmV0cmlhbGAgdG8gcnVuIHRoZSBqb2Igb25jZVxuICAgICAqIC0gbW9jayBgZ2V0VG90YWxUeENvdW50YCB0byByZXR1cm4gM1xuICAgICAqIC0gcnVuIHRlc3QgKGNhbGwgYGluaXRpYWxpemVXaXRoTm9kZWApXG4gICAgICogQGV4cGVjdGVkXG4gICAgICogLSB0byBmaWx0ZXIgdGhlIHRyYW5zYWN0aW9ucyBhbmQgcHJvY2VzcyB0aGUgdHhzIGJlbGxvdyB0aGUgaW5pdCBoZWlnaHRcbiAgICAgKiAtIHRvIHByb2Nlc3MgYWxsIGZpbHRlcmVkIHRyYW5zYWN0aW9ucyB0d2ljZVxuICAgICAqL1xuICAgIGl0KCdzaG91bGQgcHJvY2VzcyBhbGwgdHJhbnNhY3Rpb25zIGJlbGxvdyB0aGUgaW5pdCBoZWlnaHQgdHdpY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBleHRyYWN0b3IgPSBuZXcgTW9ja2VkSW5pdGlhbGl6YWJsZUVyZ29FeHRyYWN0b3IoXG4gICAgICAgIEVyZ29OZXR3b3JrVHlwZS5Ob2RlLFxuICAgICAgICAnbm9kZV91cmwnLFxuICAgICAgICAnYWRkcmVzcycsXG4gICAgICApO1xuICAgICAgKFxuICAgICAgICBleHRyYWN0b3JbJ25ldHdvcmsnXSBhcyBOb2RlTmV0d29ya1xuICAgICAgKS5nZXRBZGRyZXNzVHJhbnNhY3Rpb25zV2l0aE9mZnNldExpbWl0ID0gdml0ZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoe1xuICAgICAgICBpdGVtczogdHJhbnNhY3Rpb25CYXRjaCxcbiAgICAgICAgdG90YWw6IDMsXG4gICAgICB9KTtcbiAgICAgIGV4dHJhY3RvclsnaW5pdFdpdGhSZXRyaWFsJ10gPSBhc3luYyAoam9iOiAoKSA9PiBQcm9taXNlPHZvaWQ+KSA9PiBqb2IoKTtcbiAgICAgIGV4dHJhY3RvclsnZ2V0VG90YWxUeENvdW50J10gPSBhc3luYyAoKSA9PiAzO1xuICAgICAgY29uc3QgcHJvY2Vzc1NweSA9IHZpdGVzdC5mbigpO1xuICAgICAgZXh0cmFjdG9yWydwcm9jZXNzVHJhbnNhY3Rpb25CYXRjaCddID0gcHJvY2Vzc1NweTtcbiAgICAgIGF3YWl0IGV4dHJhY3RvclsnaW5pdGlhbGl6ZVdpdGhOb2RlJ10oeyBoYXNoOiAnaGFzaCcsIGhlaWdodDogMTMyMDY5OCB9KTtcbiAgICAgIGV4cGVjdChwcm9jZXNzU3B5KS50b0JlQ2FsbGVkVGltZXMoMik7XG4gICAgICBleHBlY3QocHJvY2Vzc1NweSkudG9CZUNhbGxlZFdpdGgoW3RyYW5zYWN0aW9uQmF0Y2hbMl1dKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEB0YXJnZXQgaW5pdGlhbGl6ZVdpdGhOb2RlIHNob3VsZCB0aHJvdyBlcnJvciB3aGVuIHRvdGFsIHRyYW5zYWN0aW9uIGNvdW50IGNoYW5nZXNcbiAgICAgKiBAZGVwZW5kZW5jaWVzXG4gICAgICogLSBub2RlIG5ldHdvcmtcbiAgICAgKiBAc2NlbmFyaW9cbiAgICAgKiAtIG1vY2sgZXh0cmFjdG9yXG4gICAgICogLSBtb2NrIGBnZXRBZGRyZXNzVHJhbnNhY3Rpb25zV2l0aE9mZnNldExpbWl0YCBpbiBub2RlIG5ldHdvcmtcbiAgICAgKiAtIG1vY2sgYGluaXRXaXRoUmV0cmlhbGAgdG8gcnVuIHRoZSBqb2Igb25jZVxuICAgICAqIC0gbW9jayBgZ2V0VG90YWxUeENvdW50YCB0byByZXR1cm4gMyB0aGVuIDRcbiAgICAgKiAtIHJ1biB0ZXN0IChjYWxsIGBpbml0aWFsaXplV2l0aE5vZGVgKVxuICAgICAqIEBleHBlY3RlZFxuICAgICAqIC0gdG8gdGhyb3cgZXJyb3Igd2hlbiB0aGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBjaGFuZ2UgZHVyaW5nIGluaXRpYWxpemF0aW9uXG4gICAgICovXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIHRvdGFsIHRyYW5zYWN0aW9uIGNvdW50IGNoYW5nZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBleHRyYWN0b3IgPSBuZXcgTW9ja2VkSW5pdGlhbGl6YWJsZUVyZ29FeHRyYWN0b3IoXG4gICAgICAgIEVyZ29OZXR3b3JrVHlwZS5Ob2RlLFxuICAgICAgICAnbm9kZV91cmwnLFxuICAgICAgICAnYWRkcmVzcycsXG4gICAgICApO1xuICAgICAgKFxuICAgICAgICBleHRyYWN0b3JbJ25ldHdvcmsnXSBhcyBOb2RlTmV0d29ya1xuICAgICAgKS5nZXRBZGRyZXNzVHJhbnNhY3Rpb25zV2l0aE9mZnNldExpbWl0ID0gdml0ZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoe1xuICAgICAgICBpdGVtczogdHJhbnNhY3Rpb25CYXRjaCxcbiAgICAgICAgdG90YWw6IDMsXG4gICAgICB9KTtcbiAgICAgIGV4dHJhY3RvclsnaW5pdFdpdGhSZXRyaWFsJ10gPSBhc3luYyAoam9iOiAoKSA9PiBQcm9taXNlPHZvaWQ+KSA9PiBqb2IoKTtcbiAgICAgIGV4dHJhY3RvclsnZ2V0VG90YWxUeENvdW50J10gPSB2aXRlc3RcbiAgICAgICAgLmZuKClcbiAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlT25jZSgzKVxuICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWUoNCk7XG4gICAgICBleHRyYWN0b3JbJ3Byb2Nlc3NUcmFuc2FjdGlvbkJhdGNoJ10gPSB2aXRlc3QuZm4oKTtcbiAgICAgIGV4cGVjdCgoKSA9PlxuICAgICAgICBleHRyYWN0b3JbJ2luaXRpYWxpemVXaXRoTm9kZSddKHsgaGFzaDogJ2hhc2gnLCBoZWlnaHQ6IDEzMjA2OTggfSksXG4gICAgICApLnJlamVjdHMudG9UaHJvd0Vycm9yKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpbml0aWFsaXplV2l0aEV4cGxvcmVyJywgKCkgPT4ge1xuICAgIC8qKlxuICAgICAqIEB0YXJnZXQgaW5pdGlhbGl6ZVdpdGhFeHBsb3JlciBzaG91bGQgbGltaXQgdGhlIGhlaWdodCBhbmQgcHJvY2Vzc1xuICAgICAqIHRyYW5zYWN0aW9ucyB3aGVuIHRoZXkgYXJlIGxlc3MgdGhhbiB0aGUgQVBJX0xJTUlUXG4gICAgICogQGRlcGVuZGVuY2llc1xuICAgICAqIC0gZXhwbG9yZXIgbmV0d29ya1xuICAgICAqIEBzY2VuYXJpb1xuICAgICAqIC0gbW9jayBleHRyYWN0b3JcbiAgICAgKiAtIG1vY2sgYGluaXRXaXRoUmV0cmlhbGAgdG8gcnVuIHRoZSBqb2Igb25jZVxuICAgICAqIC0gbW9jayBgZ2V0QWRkcmVzc1RyYW5zYWN0aW9uc1dpdGhIZWlnaHRgIGluIGV4cGxvcmVyIG5ldHdvcmtcbiAgICAgKiAgICByZXR1cm4gQVBJX0xJTUlUIHRyYW5zYWN0aW9ucyBpbiBmaXJzdCBjYWxsICh0byBsaW1pdCB0aGUgaGVpZ2h0IHJhbmdlKVxuICAgICAqICAgIHJldHVybiAwIHRyYW5zYWN0aW9ucyBpbiBzZWNvbmQgY2FsbCAodG8gcGFzcyBhIHJhbmdlIHdpdGhvdXQgcHJvY2VzcylcbiAgICAgKiAgICByZXR1cm4gdHJhbnNhY3Rpb25CYXRjaCBpbiBsYXN0IGNhbGwgKHRvIHByb2Nlc3MgdGhlIHRyYW5zYWN0aW9ucyB3aGVuIHRoZXkgYXJlIGxlc3MgdGhhbiBBUElfTElNSVQpXG4gICAgICogLSBydW4gdGVzdCAoY2FsbCBgaW5pdGlhbGl6ZVdpdGhFeHBsb3JlcmApXG4gICAgICogQGV4cGVjdGVkXG4gICAgICogLSB0byBsaW1pdCB0aGUgaGVpZ2h0IHdoZW4gdGhlIHRyYW5zYWN0aW9uIGNvdW50IGlzIGVxdWFsIHRvIEFQSV9MSU1JVFxuICAgICAqIC0gdG8gY292ZXIgYWxsIGhlaWdodCByYW5nZXNcbiAgICAgKiAtIHRvIHByb2Nlc3MgdHJhbnNhY3Rpb25zIHdoZW4gdGhleSBhcmUgbGVzcyB0aGFuIEFQSV9MSU1JVFxuICAgICAqL1xuICAgIGl0KGBzaG91bGQgbGltaXQgdGhlIGhlaWdodCBhbmQgcHJvY2VzcyB0cmFuc2FjdGlvbnMgd2hlbiB0aGV5IGFyZSBsZXNzIHRoYW5cbiAgICAgIHRoZSBBUElfTElNSVRgLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBleHRyYWN0b3IgPSBuZXcgTW9ja2VkSW5pdGlhbGl6YWJsZUVyZ29FeHRyYWN0b3IoXG4gICAgICAgIEVyZ29OZXR3b3JrVHlwZS5FeHBsb3JlcixcbiAgICAgICAgJ2V4cGxvcmVyX3VybCcsXG4gICAgICAgICdhZGRyZXNzJyxcbiAgICAgICk7XG4gICAgICBleHRyYWN0b3JbJ2luaXRXaXRoUmV0cmlhbCddID0gYXN5bmMgKGpvYjogKCkgPT4gUHJvbWlzZTx2b2lkPikgPT4gam9iKCk7XG4gICAgICBjb25zdCBhZGRyZXNzVHhTcHkgPSB2aXRlc3RcbiAgICAgICAgLmZuKClcbiAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlT25jZShuZXcgQXJyYXkoMTAwKS5maWxsKHRyYW5zYWN0aW9uQmF0Y2hbMF0pKVxuICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKFtdKVxuICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHRyYW5zYWN0aW9uQmF0Y2gpO1xuICAgICAgKFxuICAgICAgICBleHRyYWN0b3JbJ25ldHdvcmsnXSBhcyBFeHBsb3Jlck5ldHdvcmtcbiAgICAgICkuZ2V0QWRkcmVzc1RyYW5zYWN0aW9uc1dpdGhIZWlnaHQgPSBhZGRyZXNzVHhTcHk7XG4gICAgICBjb25zdCBwcm9jZXNzU3B5ID0gdml0ZXN0LmZuKCk7XG4gICAgICBleHRyYWN0b3JbJ3Byb2Nlc3NUcmFuc2FjdGlvbkJhdGNoJ10gPSBwcm9jZXNzU3B5O1xuICAgICAgYXdhaXQgZXh0cmFjdG9yWydpbml0aWFsaXplV2l0aEV4cGxvcmVyJ10oe1xuICAgICAgICBoYXNoOiAnaGFzaCcsXG4gICAgICAgIGhlaWdodDogMTMyMDgwMCxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGFkZHJlc3NUeFNweSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2FkZHJlc3MnLCAwLCAxMzIwODAwKTtcbiAgICAgIGV4cGVjdChhZGRyZXNzVHhTcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdhZGRyZXNzJywgMCwgNjYwNDAwKTtcbiAgICAgIGV4cGVjdChhZGRyZXNzVHhTcHkpLnRvSGF2ZUJlZW5MYXN0Q2FsbGVkV2l0aCgnYWRkcmVzcycsIDY2MDQwMSwgMTMyMDgwMCk7XG4gICAgICBleHBlY3QocHJvY2Vzc1NweSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICAgICAgZXhwZWN0KHByb2Nlc3NTcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHRyYW5zYWN0aW9uQmF0Y2gpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQHRhcmdldCBpbml0aWFsaXplV2l0aEV4cGxvcmVyIHNob3VsZCBwcm9jZXNzIGFsbCBibG9jayB0cmFuc2FjdGlvbnMgd2hlblxuICAgICAqIHRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGluIHRoZSBibG9jayBpcyBtb3JlIHRoYW4gQVBJX0xJTUlUXG4gICAgICogQGRlcGVuZGVuY2llc1xuICAgICAqIC0gZXhwbG9yZXIgbmV0d29ya1xuICAgICAqIEBzY2VuYXJpb1xuICAgICAqIC0gbW9jayBleHRyYWN0b3JcbiAgICAgKiAtIG1vY2sgYGluaXRXaXRoUmV0cmlhbGAgdG8gcnVuIHRoZSBqb2Igb25jZVxuICAgICAqIC0gbW9jayBgZ2V0QWRkcmVzc1RyYW5zYWN0aW9uc1dpdGhIZWlnaHRgIHRvIHJldHVybiAxMDAgdHJhbnNhY3Rpb25zIGluIG9uZSBibG9ja1xuICAgICAqIC0gc3B5IGFsbCBvdGhlciBmdW5jdGlvbnMgdG8gY2hlY2sgdGhlIGNhbGxzXG4gICAgICogLSBydW4gdGVzdCAoY2FsbCBgaW5pdGlhbGl6ZVdpdGhFeHBsb3JlcmApXG4gICAgICogQGV4cGVjdGVkXG4gICAgICogLSB0byBwcm9jZXNzIGFsbCB0cmFuc2FjdGlvbnMgaW4gYmxvY2sgMTMyMDAwMFxuICAgICAqIC0gbm90IHRvIHN0dWNrIGF0IGEgbGFyZ2UgYmxvY2sgYW5kIGNvbXBsZXRlIHRoZSBwcm9jZXNzXG4gICAgICovXG4gICAgaXQoYHNob3VsZCBwcm9jZXNzIGFsbCBibG9jayB0cmFuc2FjdGlvbnMgd2hlbiB0aGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBpblxuICAgICAgdGhlIGJsb2NrIGlzIG1vcmUgdGhhbiBBUElfTElNSVRgLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBtb2NrIGV4dHJhY3RvclxuICAgICAgY29uc3QgZXh0cmFjdG9yID0gbmV3IE1vY2tlZEluaXRpYWxpemFibGVFcmdvRXh0cmFjdG9yKFxuICAgICAgICBFcmdvTmV0d29ya1R5cGUuRXhwbG9yZXIsXG4gICAgICAgICdleHBsb3Jlcl91cmwnLFxuICAgICAgICAnYWRkcmVzcycsXG4gICAgICApO1xuICAgICAgLy8gbW9jayBgaW5pdFdpdGhSZXRyaWFsYCB0byBydW4gdGhlIGpvYiBvbmNlXG4gICAgICBleHRyYWN0b3JbJ2luaXRXaXRoUmV0cmlhbCddID0gYXN5bmMgKGpvYjogKCkgPT4gUHJvbWlzZTx2b2lkPikgPT4gam9iKCk7XG4gICAgICAvLyBtb2NrIGBnZXRBZGRyZXNzVHJhbnNhY3Rpb25zV2l0aEhlaWdodGAgdG8gcmV0dXJuIDEwMCB0cmFuc2FjdGlvbnMgaW4gb25lIGJsb2NrXG4gICAgICBjb25zdCBleE5ldHdvcmsgPSBleHRyYWN0b3JbJ25ldHdvcmsnXSBhcyBFeHBsb3Jlck5ldHdvcms7XG4gICAgICBjb25zdCBhZGRyZXNzVHhTcHkgPSB2aXRlc3RcbiAgICAgICAgLmZuKClcbiAgICAgICAgLm1vY2tJbXBsZW1lbnRhdGlvbihcbiAgICAgICAgICAoYWRkcmVzczogc3RyaW5nLCBmcm9tSGVpZ2h0OiBudW1iZXIsIHRvSGVpZ2h0OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGlmIChmcm9tSGVpZ2h0IDw9IDEzMjAwMDAgJiYgdG9IZWlnaHQgPj0gMTMyMDAwMClcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheSgxMDApLmZpbGwodHJhbnNhY3Rpb25CYXRjaFswXSk7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIGV4TmV0d29yay5nZXRBZGRyZXNzVHJhbnNhY3Rpb25zV2l0aEhlaWdodCA9IGFkZHJlc3NUeFNweTtcbiAgICAgIC8vIHNweSBhbGwgb3RoZXIgZnVuY3Rpb25zIHRvIGNoZWNrIHRoZSBjYWxsc1xuICAgICAgY29uc3QgYmxvY2tJZFNweSA9IHZpLmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoJ2Jsb2NrSWQnKTtcbiAgICAgIGNvbnN0IGJsb2NrVHhzU3B5ID0gdmkuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShbXSk7XG4gICAgICBleE5ldHdvcmsuZ2V0QmxvY2tJZEF0SGVpZ2h0ID0gYmxvY2tJZFNweTtcbiAgICAgIGV4TmV0d29yay5nZXRCbG9ja1R4cyA9IGJsb2NrVHhzU3B5O1xuICAgICAgY29uc3QgcHJvY2Vzc1NweSA9IHZpdGVzdC5mbigpO1xuICAgICAgY29uc3QgcHJvY2Vzc0JhdGNoU3B5ID0gdml0ZXN0LmZuKCk7XG4gICAgICBleHRyYWN0b3IucHJvY2Vzc1RyYW5zYWN0aW9ucyA9IHByb2Nlc3NTcHk7XG4gICAgICBleHRyYWN0b3JbJ3Byb2Nlc3NUcmFuc2FjdGlvbkJhdGNoJ10gPSBwcm9jZXNzQmF0Y2hTcHk7XG4gICAgICAvLyBydW4gdGVzdCAoY2FsbCBgaW5pdGlhbGl6ZVdpdGhFeHBsb3JlcmApXG4gICAgICBhd2FpdCBleHRyYWN0b3JbJ2luaXRpYWxpemVXaXRoRXhwbG9yZXInXSh7XG4gICAgICAgIGhhc2g6ICdoYXNoJyxcbiAgICAgICAgaGVpZ2h0OiAxMzIwODAwLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoYmxvY2tJZFNweSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoMTMyMDAwMCk7XG4gICAgICBleHBlY3QoYmxvY2tUeHNTcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdibG9ja0lkJyk7XG4gICAgICBleHBlY3QocHJvY2Vzc1NweSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoW10sIHtcbiAgICAgICAgaGFzaDogJ2Jsb2NrSWQnLFxuICAgICAgICBoZWlnaHQ6IDEzMjAwMDAsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChwcm9jZXNzQmF0Y2hTcHkpLm5vdC50b0JlQ2FsbGVkKCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -1,15 +0,0 @@
1
- import { DataSource } from '@rosen-bridge/extended-typeorm';
2
- import { BlockInfo } from '@rosen-bridge/scanner-interfaces';
3
- import { AbstractErgoExtractorEntity, AbstractBoxData, AbstractInitializableErgoExtractorAction } from '../../lib';
4
- export declare class TestInitializableErgoExtractorAction extends AbstractInitializableErgoExtractorAction<AbstractBoxData, AbstractErgoExtractorEntity> {
5
- constructor(dataSource: DataSource);
6
- /**
7
- * create the test database entity from data and block information
8
- */
9
- createEntity: (boxes: AbstractBoxData[], block: BlockInfo, extractor: string) => Omit<AbstractErgoExtractorEntity, "id">[];
10
- /**
11
- * convert the database entity back to raw data
12
- */
13
- convertEntityToData: (entities: AbstractErgoExtractorEntity[]) => AbstractBoxData[];
14
- }
15
- //# sourceMappingURL=AbstractInitializableAction.mock.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AbstractInitializableAction.mock.d.ts","sourceRoot":"","sources":["../../../tests/initializable/AbstractInitializableAction.mock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAE5D,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAE7D,OAAO,EACL,2BAA2B,EAC3B,eAAe,EACf,wCAAwC,EACzC,MAAM,WAAW,CAAC;AAGnB,qBAAa,oCAAqC,SAAQ,wCAAwC,CAChG,eAAe,EACf,2BAA2B,CAC5B;gBACa,UAAU,EAAE,UAAU;IAIlC;;OAEG;IACH,YAAY,GACV,OAAO,eAAe,EAAE,EACxB,OAAO,SAAS,EAChB,WAAW,MAAM,KAChB,IAAI,CAAC,2BAA2B,EAAE,IAAI,CAAC,EAAE,CAQ1C;IAEF;;OAEG;IACH,mBAAmB,GACjB,UAAU,2BAA2B,EAAE,KACtC,eAAe,EAAE,CAElB;CACH"}
@@ -1,27 +0,0 @@
1
- import { pick } from 'lodash-es';
2
- import { AbstractInitializableErgoExtractorAction, } from '../../lib';
3
- import { TestEntity } from '../testUtils';
4
- export class TestInitializableErgoExtractorAction extends AbstractInitializableErgoExtractorAction {
5
- constructor(dataSource) {
6
- super(dataSource, TestEntity);
7
- }
8
- /**
9
- * create the test database entity from data and block information
10
- */
11
- createEntity = (boxes, block, extractor) => {
12
- return boxes.map((box) => ({
13
- boxId: box.boxId,
14
- block: block.hash,
15
- height: block.height,
16
- serialized: box.serialized,
17
- extractor: extractor,
18
- }));
19
- };
20
- /**
21
- * convert the database entity back to raw data
22
- */
23
- convertEntityToData = (entities) => {
24
- return entities.map((data) => pick(data, ['boxId', 'serialized']));
25
- };
26
- }
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RJbml0aWFsaXphYmxlQWN0aW9uLm1vY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0cy9pbml0aWFsaXphYmxlL0Fic3RyYWN0SW5pdGlhbGl6YWJsZUFjdGlvbi5tb2NrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFHakMsT0FBTyxFQUdMLHdDQUF3QyxHQUN6QyxNQUFNLFdBQVcsQ0FBQztBQUNuQixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTFDLE1BQU0sT0FBTyxvQ0FBcUMsU0FBUSx3Q0FHekQ7SUFDQyxZQUFZLFVBQXNCO1FBQ2hDLEtBQUssQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsWUFBWSxHQUFHLENBQ2IsS0FBd0IsRUFDeEIsS0FBZ0IsRUFDaEIsU0FBaUIsRUFDMEIsRUFBRTtRQUM3QyxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDekIsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLO1lBQ2hCLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSTtZQUNqQixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07WUFDcEIsVUFBVSxFQUFFLEdBQUcsQ0FBQyxVQUFVO1lBQzFCLFNBQVMsRUFBRSxTQUFTO1NBQ3JCLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQyxDQUFDO0lBRUY7O09BRUc7SUFDSCxtQkFBbUIsR0FBRyxDQUNwQixRQUF1QyxFQUNwQixFQUFFO1FBQ3JCLE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckUsQ0FBQyxDQUFDO0NBQ0giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRhU291cmNlIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9leHRlbmRlZC10eXBlb3JtJztcbmltcG9ydCB7IHBpY2sgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQmxvY2tJbmZvIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9zY2FubmVyLWludGVyZmFjZXMnO1xuXG5pbXBvcnQge1xuICBBYnN0cmFjdEVyZ29FeHRyYWN0b3JFbnRpdHksXG4gIEFic3RyYWN0Qm94RGF0YSxcbiAgQWJzdHJhY3RJbml0aWFsaXphYmxlRXJnb0V4dHJhY3RvckFjdGlvbixcbn0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCB7IFRlc3RFbnRpdHkgfSBmcm9tICcuLi90ZXN0VXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgVGVzdEluaXRpYWxpemFibGVFcmdvRXh0cmFjdG9yQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RJbml0aWFsaXphYmxlRXJnb0V4dHJhY3RvckFjdGlvbjxcbiAgQWJzdHJhY3RCb3hEYXRhLFxuICBBYnN0cmFjdEVyZ29FeHRyYWN0b3JFbnRpdHlcbj4ge1xuICBjb25zdHJ1Y3RvcihkYXRhU291cmNlOiBEYXRhU291cmNlKSB7XG4gICAgc3VwZXIoZGF0YVNvdXJjZSwgVGVzdEVudGl0eSk7XG4gIH1cblxuICAvKipcbiAgICogY3JlYXRlIHRoZSB0ZXN0IGRhdGFiYXNlIGVudGl0eSBmcm9tIGRhdGEgYW5kIGJsb2NrIGluZm9ybWF0aW9uXG4gICAqL1xuICBjcmVhdGVFbnRpdHkgPSAoXG4gICAgYm94ZXM6IEFic3RyYWN0Qm94RGF0YVtdLFxuICAgIGJsb2NrOiBCbG9ja0luZm8sXG4gICAgZXh0cmFjdG9yOiBzdHJpbmcsXG4gICk6IE9taXQ8QWJzdHJhY3RFcmdvRXh0cmFjdG9yRW50aXR5LCAnaWQnPltdID0+IHtcbiAgICByZXR1cm4gYm94ZXMubWFwKChib3gpID0+ICh7XG4gICAgICBib3hJZDogYm94LmJveElkLFxuICAgICAgYmxvY2s6IGJsb2NrLmhhc2gsXG4gICAgICBoZWlnaHQ6IGJsb2NrLmhlaWdodCxcbiAgICAgIHNlcmlhbGl6ZWQ6IGJveC5zZXJpYWxpemVkLFxuICAgICAgZXh0cmFjdG9yOiBleHRyYWN0b3IsXG4gICAgfSkpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBjb252ZXJ0IHRoZSBkYXRhYmFzZSBlbnRpdHkgYmFjayB0byByYXcgZGF0YVxuICAgKi9cbiAgY29udmVydEVudGl0eVRvRGF0YSA9IChcbiAgICBlbnRpdGllczogQWJzdHJhY3RFcmdvRXh0cmFjdG9yRW50aXR5W10sXG4gICk6IEFic3RyYWN0Qm94RGF0YVtdID0+IHtcbiAgICByZXR1cm4gZW50aXRpZXMubWFwKChkYXRhKSA9PiBwaWNrKGRhdGEsIFsnYm94SWQnLCAnc2VyaWFsaXplZCddKSk7XG4gIH07XG59XG4iXX0=
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=AbstractInitializableAction.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AbstractInitializableAction.spec.d.ts","sourceRoot":"","sources":["../../../tests/initializable/AbstractInitializableAction.spec.ts"],"names":[],"mappings":""}
@@ -1,54 +0,0 @@
1
- import { TestInitializableErgoExtractorAction } from './AbstractInitializableAction.mock';
2
- import { createDatabase, TestEntity } from '../testUtils';
3
- import { sampleEntities } from '../testData';
4
- describe('AbstractErgoExtractorAction', () => {
5
- let dataSource;
6
- let action;
7
- let repository;
8
- beforeEach(async () => {
9
- dataSource = await createDatabase();
10
- action = new TestInitializableErgoExtractorAction(dataSource);
11
- repository = dataSource.getRepository(TestEntity);
12
- });
13
- describe('removeAllData', () => {
14
- /**
15
- * @target removeAllData should remove all available data related to this extractor
16
- * @dependencies
17
- * @scenario
18
- * - insert 4 entities related to this extractor
19
- * - run test (call `removeAllData`)
20
- * @expected
21
- * - to have 4 entities before removing
22
- * - to have no remaining entities after remove
23
- */
24
- it(`should remove all available data related to this extractor`, async () => {
25
- await dataSource.getRepository(TestEntity).insert(sampleEntities);
26
- const countBefore = await repository.count();
27
- await action.removeAllData('extractor');
28
- const countAfter = await repository.count();
29
- expect(countBefore).toEqual(4);
30
- expect(countAfter).toEqual(0);
31
- });
32
- /**
33
- * @target removeAllData should not remove any data related to another extractor
34
- * @dependencies
35
- * @scenario
36
- * - insert 4 entities related to another extractor
37
- * - run test (call `removeAllData`)
38
- * @expected
39
- * - to have 4 entities after removing
40
- */
41
- it(`should not remove any data related to another extractor`, async () => {
42
- await dataSource.getRepository(TestEntity).insert(sampleEntities.map((entity) => ({
43
- ...entity,
44
- extractor: 'extractor-new',
45
- })));
46
- const countBefore = await repository.count();
47
- await action.removeAllData('extractor');
48
- const countAfter = await repository.count();
49
- expect(countBefore).toEqual(4);
50
- expect(countAfter).toEqual(4);
51
- });
52
- });
53
- });
54
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RJbml0aWFsaXphYmxlQWN0aW9uLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0cy9pbml0aWFsaXphYmxlL0Fic3RyYWN0SW5pdGlhbGl6YWJsZUFjdGlvbi5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzFGLE9BQU8sRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzFELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFN0MsUUFBUSxDQUFDLDZCQUE2QixFQUFFLEdBQUcsRUFBRTtJQUMzQyxJQUFJLFVBQXNCLENBQUM7SUFDM0IsSUFBSSxNQUE0QyxDQUFDO0lBQ2pELElBQUksVUFBa0MsQ0FBQztJQUN2QyxVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDcEIsVUFBVSxHQUFHLE1BQU0sY0FBYyxFQUFFLENBQUM7UUFDcEMsTUFBTSxHQUFHLElBQUksb0NBQW9DLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDOUQsVUFBVSxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDcEQsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRTtRQUM3Qjs7Ozs7Ozs7O1dBU0c7UUFDSCxFQUFFLENBQUMsNERBQTRELEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDMUUsTUFBTSxVQUFVLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNsRSxNQUFNLFdBQVcsR0FBRyxNQUFNLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUU3QyxNQUFNLE1BQU0sQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDeEMsTUFBTSxVQUFVLEdBQUcsTUFBTSxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFNUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQixNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO1FBRUg7Ozs7Ozs7O1dBUUc7UUFDSCxFQUFFLENBQUMseURBQXlELEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDdkUsTUFBTSxVQUFVLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FDL0MsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDOUIsR0FBRyxNQUFNO2dCQUNULFNBQVMsRUFBRSxlQUFlO2FBQzNCLENBQUMsQ0FBQyxDQUNKLENBQUM7WUFDRixNQUFNLFdBQVcsR0FBRyxNQUFNLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUU3QyxNQUFNLE1BQU0sQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDeEMsTUFBTSxVQUFVLEdBQUcsTUFBTSxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFNUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQixNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGFTb3VyY2UsIFJlcG9zaXRvcnkgfSBmcm9tICdAcm9zZW4tYnJpZGdlL2V4dGVuZGVkLXR5cGVvcm0nO1xuXG5pbXBvcnQgeyBUZXN0SW5pdGlhbGl6YWJsZUVyZ29FeHRyYWN0b3JBY3Rpb24gfSBmcm9tICcuL0Fic3RyYWN0SW5pdGlhbGl6YWJsZUFjdGlvbi5tb2NrJztcbmltcG9ydCB7IGNyZWF0ZURhdGFiYXNlLCBUZXN0RW50aXR5IH0gZnJvbSAnLi4vdGVzdFV0aWxzJztcbmltcG9ydCB7IHNhbXBsZUVudGl0aWVzIH0gZnJvbSAnLi4vdGVzdERhdGEnO1xuXG5kZXNjcmliZSgnQWJzdHJhY3RFcmdvRXh0cmFjdG9yQWN0aW9uJywgKCkgPT4ge1xuICBsZXQgZGF0YVNvdXJjZTogRGF0YVNvdXJjZTtcbiAgbGV0IGFjdGlvbjogVGVzdEluaXRpYWxpemFibGVFcmdvRXh0cmFjdG9yQWN0aW9uO1xuICBsZXQgcmVwb3NpdG9yeTogUmVwb3NpdG9yeTxUZXN0RW50aXR5PjtcbiAgYmVmb3JlRWFjaChhc3luYyAoKSA9PiB7XG4gICAgZGF0YVNvdXJjZSA9IGF3YWl0IGNyZWF0ZURhdGFiYXNlKCk7XG4gICAgYWN0aW9uID0gbmV3IFRlc3RJbml0aWFsaXphYmxlRXJnb0V4dHJhY3RvckFjdGlvbihkYXRhU291cmNlKTtcbiAgICByZXBvc2l0b3J5ID0gZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KFRlc3RFbnRpdHkpO1xuICB9KTtcblxuICBkZXNjcmliZSgncmVtb3ZlQWxsRGF0YScsICgpID0+IHtcbiAgICAvKipcbiAgICAgKiBAdGFyZ2V0IHJlbW92ZUFsbERhdGEgc2hvdWxkIHJlbW92ZSBhbGwgYXZhaWxhYmxlIGRhdGEgcmVsYXRlZCB0byB0aGlzIGV4dHJhY3RvclxuICAgICAqIEBkZXBlbmRlbmNpZXNcbiAgICAgKiBAc2NlbmFyaW9cbiAgICAgKiAtIGluc2VydCA0IGVudGl0aWVzIHJlbGF0ZWQgdG8gdGhpcyBleHRyYWN0b3JcbiAgICAgKiAtIHJ1biB0ZXN0IChjYWxsIGByZW1vdmVBbGxEYXRhYClcbiAgICAgKiBAZXhwZWN0ZWRcbiAgICAgKiAtIHRvIGhhdmUgNCBlbnRpdGllcyBiZWZvcmUgcmVtb3ZpbmdcbiAgICAgKiAtIHRvIGhhdmUgbm8gcmVtYWluaW5nIGVudGl0aWVzIGFmdGVyIHJlbW92ZVxuICAgICAqL1xuICAgIGl0KGBzaG91bGQgcmVtb3ZlIGFsbCBhdmFpbGFibGUgZGF0YSByZWxhdGVkIHRvIHRoaXMgZXh0cmFjdG9yYCwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KFRlc3RFbnRpdHkpLmluc2VydChzYW1wbGVFbnRpdGllcyk7XG4gICAgICBjb25zdCBjb3VudEJlZm9yZSA9IGF3YWl0IHJlcG9zaXRvcnkuY291bnQoKTtcblxuICAgICAgYXdhaXQgYWN0aW9uLnJlbW92ZUFsbERhdGEoJ2V4dHJhY3RvcicpO1xuICAgICAgY29uc3QgY291bnRBZnRlciA9IGF3YWl0IHJlcG9zaXRvcnkuY291bnQoKTtcblxuICAgICAgZXhwZWN0KGNvdW50QmVmb3JlKS50b0VxdWFsKDQpO1xuICAgICAgZXhwZWN0KGNvdW50QWZ0ZXIpLnRvRXF1YWwoMCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBAdGFyZ2V0IHJlbW92ZUFsbERhdGEgc2hvdWxkIG5vdCByZW1vdmUgYW55IGRhdGEgcmVsYXRlZCB0byBhbm90aGVyIGV4dHJhY3RvclxuICAgICAqIEBkZXBlbmRlbmNpZXNcbiAgICAgKiBAc2NlbmFyaW9cbiAgICAgKiAtIGluc2VydCA0IGVudGl0aWVzIHJlbGF0ZWQgdG8gYW5vdGhlciBleHRyYWN0b3JcbiAgICAgKiAtIHJ1biB0ZXN0IChjYWxsIGByZW1vdmVBbGxEYXRhYClcbiAgICAgKiBAZXhwZWN0ZWRcbiAgICAgKiAtIHRvIGhhdmUgNCBlbnRpdGllcyBhZnRlciByZW1vdmluZ1xuICAgICAqL1xuICAgIGl0KGBzaG91bGQgbm90IHJlbW92ZSBhbnkgZGF0YSByZWxhdGVkIHRvIGFub3RoZXIgZXh0cmFjdG9yYCwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KFRlc3RFbnRpdHkpLmluc2VydChcbiAgICAgICAgc2FtcGxlRW50aXRpZXMubWFwKChlbnRpdHkpID0+ICh7XG4gICAgICAgICAgLi4uZW50aXR5LFxuICAgICAgICAgIGV4dHJhY3RvcjogJ2V4dHJhY3Rvci1uZXcnLFxuICAgICAgICB9KSksXG4gICAgICApO1xuICAgICAgY29uc3QgY291bnRCZWZvcmUgPSBhd2FpdCByZXBvc2l0b3J5LmNvdW50KCk7XG5cbiAgICAgIGF3YWl0IGFjdGlvbi5yZW1vdmVBbGxEYXRhKCdleHRyYWN0b3InKTtcbiAgICAgIGNvbnN0IGNvdW50QWZ0ZXIgPSBhd2FpdCByZXBvc2l0b3J5LmNvdW50KCk7XG5cbiAgICAgIGV4cGVjdChjb3VudEJlZm9yZSkudG9FcXVhbCg0KTtcbiAgICAgIGV4cGVjdChjb3VudEFmdGVyKS50b0VxdWFsKDQpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
@@ -1,94 +0,0 @@
1
- export declare const ergoBoxes: ({
2
- boxId: string;
3
- transactionId: string;
4
- blockId: string;
5
- value: bigint;
6
- index: number;
7
- creationHeight: number;
8
- inclusionHeight: number;
9
- ergoTree: string;
10
- address: string;
11
- assets: {
12
- tokenId: string;
13
- index: number;
14
- amount: bigint;
15
- name: string;
16
- decimals: number;
17
- }[];
18
- additionalRegisters: {};
19
- spentHeight?: undefined;
20
- spentBlockId?: undefined;
21
- spentTransactionId?: undefined;
22
- spentIndex?: undefined;
23
- } | {
24
- boxId: string;
25
- transactionId: string;
26
- blockId: string;
27
- value: bigint;
28
- index: number;
29
- creationHeight: number;
30
- inclusionHeight: number;
31
- ergoTree: string;
32
- address: string;
33
- assets: {
34
- tokenId: string;
35
- index: number;
36
- amount: bigint;
37
- name: string;
38
- decimals: number;
39
- }[];
40
- additionalRegisters: {};
41
- spentHeight: number;
42
- spentBlockId: string;
43
- spentTransactionId: string;
44
- spentIndex: number;
45
- })[];
46
- export declare const extractedData: {
47
- boxId: string;
48
- address: string;
49
- serialized: string;
50
- blockId: string;
51
- height: number;
52
- };
53
- export declare const transactionBatch: {
54
- id: string;
55
- inclusionHeight: number;
56
- blockId: string;
57
- outputs: ({
58
- transactionId: string;
59
- index: number;
60
- value: bigint;
61
- ergoTree: string;
62
- creationHeight: number;
63
- assets: {
64
- tokenId: string;
65
- amount: bigint;
66
- }[];
67
- additionalRegisters: {
68
- R4: string;
69
- R5: string;
70
- R6: string;
71
- };
72
- boxId: string;
73
- } | {
74
- transactionId: string;
75
- index: number;
76
- value: bigint;
77
- ergoTree: string;
78
- creationHeight: number;
79
- assets: never[];
80
- additionalRegisters: {
81
- R4?: undefined;
82
- R5?: undefined;
83
- R6?: undefined;
84
- };
85
- boxId: string;
86
- })[];
87
- inputs: {
88
- boxId: string;
89
- }[];
90
- dataInputs: {
91
- boxId: string;
92
- }[];
93
- }[];
94
- //# sourceMappingURL=testData.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"testData.d.ts","sourceRoot":"","sources":["../../../tests/initializable/testData.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAuDrB,CAAC;AAEF,eAAO,MAAM,aAAa;;;;;;CAMzB,CAAC;AAEF,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyN5B,CAAC"}