@bitgo/sdk-coin-eth 25.8.1 → 25.9.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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAqB,MAAM,iBAAiB,CAAC;AAO/D,OAAO,EAAE,KAAK,OAAO,EAA2B,MAAM,gBAAgB,CAAC;AAEvE,eAAO,MAAM,QAAQ,QAAS,SAAS,KAAG,IAWzC,CAAC;AAEF,eAAO,MAAM,mBAAmB,QAAS,SAAS,WAAW,OAAO,KAAG,IAgBtE,CAAC"}
|
package/dist/src/register.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.registerWithCoinMap = exports.register = void 0;
|
|
4
|
+
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
4
5
|
const erc20Token_1 = require("./erc20Token");
|
|
5
6
|
const eth_1 = require("./eth");
|
|
6
7
|
const gteth_1 = require("./gteth");
|
|
@@ -22,9 +23,20 @@ const register = (sdk) => {
|
|
|
22
23
|
};
|
|
23
24
|
exports.register = register;
|
|
24
25
|
const registerWithCoinMap = (sdk, coinMap) => {
|
|
26
|
+
sdk.register('eth', eth_1.Eth.createInstance);
|
|
27
|
+
sdk.register('gteth', gteth_1.Gteth.createInstance);
|
|
28
|
+
sdk.register('teth', teth_1.Teth.createInstance);
|
|
29
|
+
sdk.register('hteth', hteth_1.Hteth.createInstance);
|
|
30
|
+
erc721Token_1.Erc721Token.createTokenConstructors().forEach(({ name, coinConstructor }) => {
|
|
31
|
+
sdk.register(name, coinConstructor);
|
|
32
|
+
});
|
|
33
|
+
// Registration for ERC20 tokens from the coin map (includes both hardcoded and dynamic tokens from AMS).
|
|
25
34
|
erc20Token_1.Erc20Token.createTokenConstructors((0, statics_1.getFormattedErc20Tokens)(coinMap)).forEach(({ name, coinConstructor }) => {
|
|
26
35
|
sdk.register(name, coinConstructor);
|
|
36
|
+
if (coinMap.has(name)) {
|
|
37
|
+
sdk_core_1.GlobalCoinFactory.registerToken(coinMap.get(name), coinConstructor);
|
|
38
|
+
}
|
|
27
39
|
});
|
|
28
40
|
};
|
|
29
41
|
exports.registerWithCoinMap = registerWithCoinMap;
|
|
30
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVnaXN0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsOENBQStEO0FBQy9ELDZDQUEwQztBQUMxQywrQkFBNEI7QUFDNUIsbUNBQWdDO0FBQ2hDLG1DQUFnQztBQUNoQyxpQ0FBOEI7QUFDOUIsK0NBQTRDO0FBQzVDLDRDQUF1RTtBQUVoRSxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQWMsRUFBUSxFQUFFO0lBQy9DLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLFNBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN4QyxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxhQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDNUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsV0FBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLGFBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM1Qyx1QkFBVSxDQUFDLHVCQUF1QixFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLEVBQUUsRUFBRTtRQUN6RSxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxlQUFlLENBQUMsQ0FBQztJQUN0QyxDQUFDLENBQUMsQ0FBQztJQUNILHlCQUFXLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsRUFBRSxFQUFFO1FBQzFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3RDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBWFcsUUFBQSxRQUFRLFlBV25CO0FBRUssTUFBTSxtQkFBbUIsR0FBRyxDQUFDLEdBQWMsRUFBRSxPQUFnQixFQUFRLEVBQUU7SUFDNUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsU0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3hDLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLGFBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM1QyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxXQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDMUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsYUFBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzVDLHlCQUFXLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsRUFBRSxFQUFFO1FBQzFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3RDLENBQUMsQ0FBQyxDQUFDO0lBRUgseUdBQXlHO0lBQ3pHLHVCQUFVLENBQUMsdUJBQXVCLENBQUMsSUFBQSxpQ0FBdUIsRUFBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUU7UUFDekcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDcEMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDdEIsNEJBQWlCLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDdEUsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBaEJXLFFBQUEsbUJBQW1CLHVCQWdCOUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCaXRHb0Jhc2UsIEdsb2JhbENvaW5GYWN0b3J5IH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IEVyYzIwVG9rZW4gfSBmcm9tICcuL2VyYzIwVG9rZW4nO1xuaW1wb3J0IHsgRXRoIH0gZnJvbSAnLi9ldGgnO1xuaW1wb3J0IHsgR3RldGggfSBmcm9tICcuL2d0ZXRoJztcbmltcG9ydCB7IEh0ZXRoIH0gZnJvbSAnLi9odGV0aCc7XG5pbXBvcnQgeyBUZXRoIH0gZnJvbSAnLi90ZXRoJztcbmltcG9ydCB7IEVyYzcyMVRva2VuIH0gZnJvbSAnLi9lcmM3MjFUb2tlbic7XG5pbXBvcnQgeyB0eXBlIENvaW5NYXAsIGdldEZvcm1hdHRlZEVyYzIwVG9rZW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXIgPSAoc2RrOiBCaXRHb0Jhc2UpOiB2b2lkID0+IHtcbiAgc2RrLnJlZ2lzdGVyKCdldGgnLCBFdGguY3JlYXRlSW5zdGFuY2UpO1xuICBzZGsucmVnaXN0ZXIoJ2d0ZXRoJywgR3RldGguY3JlYXRlSW5zdGFuY2UpO1xuICBzZGsucmVnaXN0ZXIoJ3RldGgnLCBUZXRoLmNyZWF0ZUluc3RhbmNlKTtcbiAgc2RrLnJlZ2lzdGVyKCdodGV0aCcsIEh0ZXRoLmNyZWF0ZUluc3RhbmNlKTtcbiAgRXJjMjBUb2tlbi5jcmVhdGVUb2tlbkNvbnN0cnVjdG9ycygpLmZvckVhY2goKHsgbmFtZSwgY29pbkNvbnN0cnVjdG9yIH0pID0+IHtcbiAgICBzZGsucmVnaXN0ZXIobmFtZSwgY29pbkNvbnN0cnVjdG9yKTtcbiAgfSk7XG4gIEVyYzcyMVRva2VuLmNyZWF0ZVRva2VuQ29uc3RydWN0b3JzKCkuZm9yRWFjaCgoeyBuYW1lLCBjb2luQ29uc3RydWN0b3IgfSkgPT4ge1xuICAgIHNkay5yZWdpc3RlcihuYW1lLCBjb2luQ29uc3RydWN0b3IpO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCByZWdpc3RlcldpdGhDb2luTWFwID0gKHNkazogQml0R29CYXNlLCBjb2luTWFwOiBDb2luTWFwKTogdm9pZCA9PiB7XG4gIHNkay5yZWdpc3RlcignZXRoJywgRXRoLmNyZWF0ZUluc3RhbmNlKTtcbiAgc2RrLnJlZ2lzdGVyKCdndGV0aCcsIEd0ZXRoLmNyZWF0ZUluc3RhbmNlKTtcbiAgc2RrLnJlZ2lzdGVyKCd0ZXRoJywgVGV0aC5jcmVhdGVJbnN0YW5jZSk7XG4gIHNkay5yZWdpc3RlcignaHRldGgnLCBIdGV0aC5jcmVhdGVJbnN0YW5jZSk7XG4gIEVyYzcyMVRva2VuLmNyZWF0ZVRva2VuQ29uc3RydWN0b3JzKCkuZm9yRWFjaCgoeyBuYW1lLCBjb2luQ29uc3RydWN0b3IgfSkgPT4ge1xuICAgIHNkay5yZWdpc3RlcihuYW1lLCBjb2luQ29uc3RydWN0b3IpO1xuICB9KTtcblxuICAvLyBSZWdpc3RyYXRpb24gZm9yIEVSQzIwIHRva2VucyBmcm9tIHRoZSBjb2luIG1hcCAoaW5jbHVkZXMgYm90aCBoYXJkY29kZWQgYW5kIGR5bmFtaWMgdG9rZW5zIGZyb20gQU1TKS5cbiAgRXJjMjBUb2tlbi5jcmVhdGVUb2tlbkNvbnN0cnVjdG9ycyhnZXRGb3JtYXR0ZWRFcmMyMFRva2Vucyhjb2luTWFwKSkuZm9yRWFjaCgoeyBuYW1lLCBjb2luQ29uc3RydWN0b3IgfSkgPT4ge1xuICAgIHNkay5yZWdpc3RlcihuYW1lLCBjb2luQ29uc3RydWN0b3IpO1xuICAgIGlmIChjb2luTWFwLmhhcyhuYW1lKSkge1xuICAgICAgR2xvYmFsQ29pbkZhY3RvcnkucmVnaXN0ZXJUb2tlbihjb2luTWFwLmdldChuYW1lKSwgY29pbkNvbnN0cnVjdG9yKTtcbiAgICB9XG4gIH0pO1xufTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../test/unit/register.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const sinon_1 = __importDefault(require("sinon"));
|
|
7
|
+
const assert_1 = __importDefault(require("assert"));
|
|
8
|
+
const sdk_api_1 = require("@bitgo/sdk-api");
|
|
9
|
+
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
10
|
+
const statics_1 = require("@bitgo/statics");
|
|
11
|
+
const register_1 = require("../../src/register");
|
|
12
|
+
const erc20Token_1 = require("../../src/erc20Token");
|
|
13
|
+
const erc721Token_1 = require("../../src/erc721Token");
|
|
14
|
+
describe('ETH Register', function () {
|
|
15
|
+
let bitgo;
|
|
16
|
+
let registerSpy;
|
|
17
|
+
let registerTokenSpy;
|
|
18
|
+
beforeEach(function () {
|
|
19
|
+
bitgo = new sdk_api_1.BitGoAPI({ env: 'test' });
|
|
20
|
+
registerSpy = sinon_1.default.spy(bitgo, 'register');
|
|
21
|
+
registerTokenSpy = sinon_1.default.spy(sdk_core_1.GlobalCoinFactory, 'registerToken');
|
|
22
|
+
});
|
|
23
|
+
afterEach(function () {
|
|
24
|
+
registerSpy.restore();
|
|
25
|
+
registerTokenSpy.restore();
|
|
26
|
+
});
|
|
27
|
+
describe('register', function () {
|
|
28
|
+
it('should register base coins and token constructors', function () {
|
|
29
|
+
(0, register_1.register)(bitgo);
|
|
30
|
+
const registeredNames = registerSpy.getCalls().map((call) => call.args[0]);
|
|
31
|
+
// Base coins should be registered
|
|
32
|
+
assert_1.default.ok(registeredNames.includes('eth'));
|
|
33
|
+
assert_1.default.ok(registeredNames.includes('gteth'));
|
|
34
|
+
assert_1.default.ok(registeredNames.includes('teth'));
|
|
35
|
+
assert_1.default.ok(registeredNames.includes('hteth'));
|
|
36
|
+
// ERC20 and ERC721 tokens should be registered
|
|
37
|
+
const erc20Count = erc20Token_1.Erc20Token.createTokenConstructors().length;
|
|
38
|
+
const erc721Count = erc721Token_1.Erc721Token.createTokenConstructors().length;
|
|
39
|
+
assert_1.default.strictEqual(registerSpy.callCount, 4 + erc20Count + erc721Count);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
describe('registerWithCoinMap', function () {
|
|
43
|
+
it('should call register internally for base coins and tokens', function () {
|
|
44
|
+
(0, register_1.registerWithCoinMap)(bitgo, statics_1.coins);
|
|
45
|
+
const registeredNames = registerSpy.getCalls().map((call) => call.args[0]);
|
|
46
|
+
// Base coins should be registered via register()
|
|
47
|
+
assert_1.default.ok(registeredNames.includes('eth'));
|
|
48
|
+
assert_1.default.ok(registeredNames.includes('gteth'));
|
|
49
|
+
assert_1.default.ok(registeredNames.includes('teth'));
|
|
50
|
+
assert_1.default.ok(registeredNames.includes('hteth'));
|
|
51
|
+
});
|
|
52
|
+
it('should add dynamic ERC20 tokens to the global coin map', function () {
|
|
53
|
+
(0, register_1.registerWithCoinMap)(bitgo, statics_1.coins);
|
|
54
|
+
// registerToken should have been called for dynamic tokens
|
|
55
|
+
assert_1.default.ok(registerTokenSpy.callCount > 0);
|
|
56
|
+
// Each call should pass a valid coin from the coinMap
|
|
57
|
+
for (let i = 0; i < registerTokenSpy.callCount; i++) {
|
|
58
|
+
const call = registerTokenSpy.getCall(i);
|
|
59
|
+
const staticsCoin = call.args[0];
|
|
60
|
+
assert_1.default.ok(statics_1.coins.has(staticsCoin.name), `${staticsCoin.name} should exist in the coin map`);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
it('should not add tokens to the global coin map when coin map has no ERC20 tokens', function () {
|
|
64
|
+
const limitedCoinMap = statics_1.coins.filter((coin) => !(coin instanceof statics_1.Erc20Coin));
|
|
65
|
+
(0, register_1.registerWithCoinMap)(bitgo, limitedCoinMap);
|
|
66
|
+
// registerToken should not be called since no ERC20 tokens are in the map
|
|
67
|
+
assert_1.default.strictEqual(registerTokenSpy.callCount, 0);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvcmVnaXN0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrREFBMEI7QUFDMUIsb0RBQTRCO0FBQzVCLDRDQUEwQztBQUMxQyw4Q0FBb0Q7QUFDcEQsNENBQWtEO0FBQ2xELGlEQUFtRTtBQUNuRSxxREFBa0Q7QUFDbEQsdURBQW9EO0FBRXBELFFBQVEsQ0FBQyxjQUFjLEVBQUU7SUFDdkIsSUFBSSxLQUFlLENBQUM7SUFDcEIsSUFBSSxXQUEyQixDQUFDO0lBQ2hDLElBQUksZ0JBQWdDLENBQUM7SUFFckMsVUFBVSxDQUFDO1FBQ1QsS0FBSyxHQUFHLElBQUksa0JBQVEsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLFdBQVcsR0FBRyxlQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMzQyxnQkFBZ0IsR0FBRyxlQUFLLENBQUMsR0FBRyxDQUFDLDRCQUFpQixFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ25FLENBQUMsQ0FBQyxDQUFDO0lBRUgsU0FBUyxDQUFDO1FBQ1IsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3RCLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzdCLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFVBQVUsRUFBRTtRQUNuQixFQUFFLENBQUMsbURBQW1ELEVBQUU7WUFDdEQsSUFBQSxtQkFBUSxFQUFDLEtBQUssQ0FBQyxDQUFDO1lBRWhCLE1BQU0sZUFBZSxHQUFHLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUUzRSxrQ0FBa0M7WUFDbEMsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsZUFB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QUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgQml0R29BUEkgfSBmcm9tICdAYml0Z28vc2RrLWFwaSc7XG5pbXBvcnQgeyBHbG9iYWxDb2luRmFjdG9yeSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBjb2lucywgRXJjMjBDb2luIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHsgcmVnaXN0ZXIsIHJlZ2lzdGVyV2l0aENvaW5NYXAgfSBmcm9tICcuLi8uLi9zcmMvcmVnaXN0ZXInO1xuaW1wb3J0IHsgRXJjMjBUb2tlbiB9IGZyb20gJy4uLy4uL3NyYy9lcmMyMFRva2VuJztcbmltcG9ydCB7IEVyYzcyMVRva2VuIH0gZnJvbSAnLi4vLi4vc3JjL2VyYzcyMVRva2VuJztcblxuZGVzY3JpYmUoJ0VUSCBSZWdpc3RlcicsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGJpdGdvOiBCaXRHb0FQSTtcbiAgbGV0IHJlZ2lzdGVyU3B5OiBzaW5vbi5TaW5vblNweTtcbiAgbGV0IHJlZ2lzdGVyVG9rZW5TcHk6IHNpbm9uLlNpbm9uU3B5O1xuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIGJpdGdvID0gbmV3IEJpdEdvQVBJKHsgZW52OiAndGVzdCcgfSk7XG4gICAgcmVnaXN0ZXJTcHkgPSBzaW5vbi5zcHkoYml0Z28sICdyZWdpc3RlcicpO1xuICAgIHJlZ2lzdGVyVG9rZW5TcHkgPSBzaW5vbi5zcHkoR2xvYmFsQ29pbkZhY3RvcnksICdyZWdpc3RlclRva2VuJyk7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgcmVnaXN0ZXJTcHkucmVzdG9yZSgpO1xuICAgIHJlZ2lzdGVyVG9rZW5TcHkucmVzdG9yZSgpO1xuICB9KTtcblxuICBkZXNjcmliZSgncmVnaXN0ZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCByZWdpc3RlciBiYXNlIGNvaW5zIGFuZCB0b2tlbiBjb25zdHJ1Y3RvcnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZWdpc3RlcihiaXRnbyk7XG5cbiAgICAgIGNvbnN0IHJlZ2lzdGVyZWROYW1lcyA9IHJlZ2lzdGVyU3B5LmdldENhbGxzKCkubWFwKChjYWxsKSA9PiBjYWxsLmFyZ3NbMF0pO1xuXG4gICAgICAvLyBCYXNlIGNvaW5zIHNob3VsZCBiZSByZWdpc3RlcmVkXG4gICAgICBhc3NlcnQub2socmVnaXN0ZXJlZE5hbWVzLmluY2x1ZGVzKCdldGgnKSk7XG4gICAgICBhc3NlcnQub2socmVnaXN0ZXJlZE5hbWVzLmluY2x1ZGVzKCdndGV0aCcpKTtcbiAgICAgIGFzc2VydC5vayhyZWdpc3RlcmVkTmFtZXMuaW5jbHVkZXMoJ3RldGgnKSk7XG4gICAgICBhc3NlcnQub2socmVnaXN0ZXJlZE5hbWVzLmluY2x1ZGVzKCdodGV0aCcpKTtcblxuICAgICAgLy8gRVJDMjAgYW5kIEVSQzcyMSB0b2tlbnMgc2hvdWxkIGJlIHJlZ2lzdGVyZWRcbiAgICAgIGNvbnN0IGVyYzIwQ291bnQgPSBFcmMyMFRva2VuLmNyZWF0ZVRva2VuQ29uc3RydWN0b3JzKCkubGVuZ3RoO1xuICAgICAgY29uc3QgZXJjNzIxQ291bnQgPSBFcmM3MjFUb2tlbi5jcmVhdGVUb2tlbkNvbnN0cnVjdG9ycygpLmxlbmd0aDtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZWdpc3RlclNweS5jYWxsQ291bnQsIDQgKyBlcmMyMENvdW50ICsgZXJjNzIxQ291bnQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncmVnaXN0ZXJXaXRoQ29pbk1hcCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGNhbGwgcmVnaXN0ZXIgaW50ZXJuYWxseSBmb3IgYmFzZSBjb2lucyBhbmQgdG9rZW5zJywgZnVuY3Rpb24gKCkge1xuICAgICAgcmVnaXN0ZXJXaXRoQ29pbk1hcChiaXRnbywgY29pbnMpO1xuXG4gICAgICBjb25zdCByZWdpc3RlcmVkTmFtZXMgPSByZWdpc3RlclNweS5nZXRDYWxscygpLm1hcCgoY2FsbCkgPT4gY2FsbC5hcmdzWzBdKTtcblxuICAgICAgLy8gQmFzZSBjb2lucyBzaG91bGQgYmUgcmVnaXN0ZXJlZCB2aWEgcmVnaXN0ZXIoKVxuICAgICAgYXNzZXJ0Lm9rKHJlZ2lzdGVyZWROYW1lcy5pbmNsdWRlcygnZXRoJykpO1xuICAgICAgYXNzZXJ0Lm9rKHJlZ2lzdGVyZWROYW1lcy5pbmNsdWRlcygnZ3RldGgnKSk7XG4gICAgICBhc3NlcnQub2socmVnaXN0ZXJlZE5hbWVzLmluY2x1ZGVzKCd0ZXRoJykpO1xuICAgICAgYXNzZXJ0Lm9rKHJlZ2lzdGVyZWROYW1lcy5pbmNsdWRlcygnaHRldGgnKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFkZCBkeW5hbWljIEVSQzIwIHRva2VucyB0byB0aGUgZ2xvYmFsIGNvaW4gbWFwJywgZnVuY3Rpb24gKCkge1xuICAgICAgcmVnaXN0ZXJXaXRoQ29pbk1hcChiaXRnbywgY29pbnMpO1xuXG4gICAgICAvLyByZWdpc3RlclRva2VuIHNob3VsZCBoYXZlIGJlZW4gY2FsbGVkIGZvciBkeW5hbWljIHRva2Vuc1xuICAgICAgYXNzZXJ0Lm9rKHJlZ2lzdGVyVG9rZW5TcHkuY2FsbENvdW50ID4gMCk7XG5cbiAgICAgIC8vIEVhY2ggY2FsbCBzaG91bGQgcGFzcyBhIHZhbGlkIGNvaW4gZnJvbSB0aGUgY29pbk1hcFxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWdpc3RlclRva2VuU3B5LmNhbGxDb3VudDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNhbGwgPSByZWdpc3RlclRva2VuU3B5LmdldENhbGwoaSk7XG4gICAgICAgIGNvbnN0IHN0YXRpY3NDb2luID0gY2FsbC5hcmdzWzBdO1xuICAgICAgICBhc3NlcnQub2soY29pbnMuaGFzKHN0YXRpY3NDb2luLm5hbWUpLCBgJHtzdGF0aWNzQ29pbi5uYW1lfSBzaG91bGQgZXhpc3QgaW4gdGhlIGNvaW4gbWFwYCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCBhZGQgdG9rZW5zIHRvIHRoZSBnbG9iYWwgY29pbiBtYXAgd2hlbiBjb2luIG1hcCBoYXMgbm8gRVJDMjAgdG9rZW5zJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbGltaXRlZENvaW5NYXAgPSBjb2lucy5maWx0ZXIoKGNvaW4pID0+ICEoY29pbiBpbnN0YW5jZW9mIEVyYzIwQ29pbikpO1xuXG4gICAgICByZWdpc3RlcldpdGhDb2luTWFwKGJpdGdvLCBsaW1pdGVkQ29pbk1hcCk7XG5cbiAgICAgIC8vIHJlZ2lzdGVyVG9rZW4gc2hvdWxkIG5vdCBiZSBjYWxsZWQgc2luY2Ugbm8gRVJDMjAgdG9rZW5zIGFyZSBpbiB0aGUgbWFwXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVnaXN0ZXJUb2tlblNweS5jYWxsQ291bnQsIDApO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|