@bitgo/sdk-coin-canton 1.29.6 → 1.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,5 @@
1
1
  import { BitGoBase } from '@bitgo/sdk-core';
2
+ import { type CoinMap } from '@bitgo/statics';
2
3
  export declare const register: (sdk: BitGoBase) => void;
4
+ export declare const registerWithCoinMap: (sdk: BitGoBase, coinMap: CoinMap) => void;
3
5
  //# sourceMappingURL=register.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAK5C,eAAO,MAAM,QAAQ,QAAS,SAAS,KAAG,IAMzC,CAAC"}
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAqB,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,KAAK,OAAO,EAA4B,MAAM,gBAAgB,CAAC;AAKxE,eAAO,MAAM,QAAQ,QAAS,SAAS,KAAG,IAMzC,CAAC;AAEF,eAAO,MAAM,mBAAmB,QAAS,SAAS,WAAW,OAAO,KAAG,IAStE,CAAC"}
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.register = void 0;
3
+ exports.registerWithCoinMap = exports.register = void 0;
4
+ const sdk_core_1 = require("@bitgo/sdk-core");
5
+ const statics_1 = require("@bitgo/statics");
4
6
  const canton_1 = require("./canton");
5
7
  const tcanton_1 = require("./tcanton");
6
8
  const cantonToken_1 = require("./cantonToken");
@@ -12,4 +14,15 @@ const register = (sdk) => {
12
14
  });
13
15
  };
14
16
  exports.register = register;
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVnaXN0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EscUNBQWtDO0FBQ2xDLHVDQUFvQztBQUNwQywrQ0FBNEM7QUFFckMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFjLEVBQVEsRUFBRTtJQUMvQyxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxlQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDOUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsaUJBQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNoRCx5QkFBVyxDQUFDLHVCQUF1QixFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLEVBQUUsRUFBRTtRQUMxRSxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxlQUFlLENBQUMsQ0FBQztJQUN0QyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQU5XLFFBQUEsUUFBUSxZQU1uQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBDYW50b24gfSBmcm9tICcuL2NhbnRvbic7XG5pbXBvcnQgeyBUY2FudG9uIH0gZnJvbSAnLi90Y2FudG9uJztcbmltcG9ydCB7IENhbnRvblRva2VuIH0gZnJvbSAnLi9jYW50b25Ub2tlbic7XG5cbmV4cG9ydCBjb25zdCByZWdpc3RlciA9IChzZGs6IEJpdEdvQmFzZSk6IHZvaWQgPT4ge1xuICBzZGsucmVnaXN0ZXIoJ2NhbnRvbicsIENhbnRvbi5jcmVhdGVJbnN0YW5jZSk7XG4gIHNkay5yZWdpc3RlcigndGNhbnRvbicsIFRjYW50b24uY3JlYXRlSW5zdGFuY2UpO1xuICBDYW50b25Ub2tlbi5jcmVhdGVUb2tlbkNvbnN0cnVjdG9ycygpLmZvckVhY2goKHsgbmFtZSwgY29pbkNvbnN0cnVjdG9yIH0pID0+IHtcbiAgICBzZGsucmVnaXN0ZXIobmFtZSwgY29pbkNvbnN0cnVjdG9yKTtcbiAgfSk7XG59O1xuIl19
17
+ const registerWithCoinMap = (sdk, coinMap) => {
18
+ sdk.register('canton', canton_1.Canton.createInstance);
19
+ sdk.register('tcanton', tcanton_1.Tcanton.createInstance);
20
+ // Registration for Canton tokens from the coin map (includes both hardcoded and dynamic tokens from AMS).
21
+ cantonToken_1.CantonToken.createTokenConstructors((0, statics_1.getFormattedCantonTokens)(coinMap)).forEach(({ name, coinConstructor }) => {
22
+ sdk.register(name, coinConstructor);
23
+ // name is derived from coinMap itself (via getFormattedCantonTokens), so it is always present.
24
+ sdk_core_1.GlobalCoinFactory.registerToken(coinMap.get(name), coinConstructor);
25
+ });
26
+ };
27
+ exports.registerWithCoinMap = registerWithCoinMap;
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVnaXN0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsOENBQStEO0FBQy9ELDRDQUF3RTtBQUN4RSxxQ0FBa0M7QUFDbEMsdUNBQW9DO0FBQ3BDLCtDQUE0QztBQUVyQyxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQWMsRUFBUSxFQUFFO0lBQy9DLEdBQUcsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLGVBQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM5QyxHQUFHLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxpQkFBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ2hELHlCQUFXLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsRUFBRSxFQUFFO1FBQzFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3RDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBTlcsUUFBQSxRQUFRLFlBTW5CO0FBRUssTUFBTSxtQkFBbUIsR0FBRyxDQUFDLEdBQWMsRUFBRSxPQUFnQixFQUFRLEVBQUU7SUFDNUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsZUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzlDLEdBQUcsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLGlCQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDaEQsMEdBQTBHO0lBQzFHLHlCQUFXLENBQUMsdUJBQXVCLENBQUMsSUFBQSxrQ0FBd0IsRUFBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUU7UUFDM0csR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDcEMsK0ZBQStGO1FBQy9GLDRCQUFpQixDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3RFLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBVFcsUUFBQSxtQkFBbUIsdUJBUzlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQml0R29CYXNlLCBHbG9iYWxDb2luRmFjdG9yeSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyB0eXBlIENvaW5NYXAsIGdldEZvcm1hdHRlZENhbnRvblRva2VucyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IENhbnRvbiB9IGZyb20gJy4vY2FudG9uJztcbmltcG9ydCB7IFRjYW50b24gfSBmcm9tICcuL3RjYW50b24nO1xuaW1wb3J0IHsgQ2FudG9uVG9rZW4gfSBmcm9tICcuL2NhbnRvblRva2VuJztcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyID0gKHNkazogQml0R29CYXNlKTogdm9pZCA9PiB7XG4gIHNkay5yZWdpc3RlcignY2FudG9uJywgQ2FudG9uLmNyZWF0ZUluc3RhbmNlKTtcbiAgc2RrLnJlZ2lzdGVyKCd0Y2FudG9uJywgVGNhbnRvbi5jcmVhdGVJbnN0YW5jZSk7XG4gIENhbnRvblRva2VuLmNyZWF0ZVRva2VuQ29uc3RydWN0b3JzKCkuZm9yRWFjaCgoeyBuYW1lLCBjb2luQ29uc3RydWN0b3IgfSkgPT4ge1xuICAgIHNkay5yZWdpc3RlcihuYW1lLCBjb2luQ29uc3RydWN0b3IpO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCByZWdpc3RlcldpdGhDb2luTWFwID0gKHNkazogQml0R29CYXNlLCBjb2luTWFwOiBDb2luTWFwKTogdm9pZCA9PiB7XG4gIHNkay5yZWdpc3RlcignY2FudG9uJywgQ2FudG9uLmNyZWF0ZUluc3RhbmNlKTtcbiAgc2RrLnJlZ2lzdGVyKCd0Y2FudG9uJywgVGNhbnRvbi5jcmVhdGVJbnN0YW5jZSk7XG4gIC8vIFJlZ2lzdHJhdGlvbiBmb3IgQ2FudG9uIHRva2VucyBmcm9tIHRoZSBjb2luIG1hcCAoaW5jbHVkZXMgYm90aCBoYXJkY29kZWQgYW5kIGR5bmFtaWMgdG9rZW5zIGZyb20gQU1TKS5cbiAgQ2FudG9uVG9rZW4uY3JlYXRlVG9rZW5Db25zdHJ1Y3RvcnMoZ2V0Rm9ybWF0dGVkQ2FudG9uVG9rZW5zKGNvaW5NYXApKS5mb3JFYWNoKCh7IG5hbWUsIGNvaW5Db25zdHJ1Y3RvciB9KSA9PiB7XG4gICAgc2RrLnJlZ2lzdGVyKG5hbWUsIGNvaW5Db25zdHJ1Y3Rvcik7XG4gICAgLy8gbmFtZSBpcyBkZXJpdmVkIGZyb20gY29pbk1hcCBpdHNlbGYgKHZpYSBnZXRGb3JtYXR0ZWRDYW50b25Ub2tlbnMpLCBzbyBpdCBpcyBhbHdheXMgcHJlc2VudC5cbiAgICBHbG9iYWxDb2luRmFjdG9yeS5yZWdpc3RlclRva2VuKGNvaW5NYXAuZ2V0KG5hbWUpLCBjb2luQ29uc3RydWN0b3IpO1xuICB9KTtcbn07XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../test/unit/register.ts"],"names":[],"mappings":""}
@@ -0,0 +1,65 @@
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 cantonToken_1 = require("../../src/cantonToken");
13
+ describe('Canton Register', function () {
14
+ let bitgo;
15
+ let registerSpy;
16
+ let registerTokenSpy;
17
+ beforeEach(function () {
18
+ bitgo = new sdk_api_1.BitGoAPI({ env: 'test' });
19
+ registerSpy = sinon_1.default.spy(bitgo, 'register');
20
+ registerTokenSpy = sinon_1.default.spy(sdk_core_1.GlobalCoinFactory, 'registerToken');
21
+ });
22
+ afterEach(function () {
23
+ registerSpy.restore();
24
+ registerTokenSpy.restore();
25
+ });
26
+ describe('register', function () {
27
+ it('should register base coins and token constructors', function () {
28
+ (0, register_1.register)(bitgo);
29
+ const registeredNames = registerSpy.getCalls().map((call) => call.args[0]);
30
+ // Base coins should be registered
31
+ assert_1.default.ok(registeredNames.includes('canton'));
32
+ assert_1.default.ok(registeredNames.includes('tcanton'));
33
+ // Canton tokens from statics should be registered
34
+ const cantonTokenCount = cantonToken_1.CantonToken.createTokenConstructors().length;
35
+ assert_1.default.strictEqual(registerSpy.callCount, 2 + cantonTokenCount);
36
+ });
37
+ });
38
+ describe('registerWithCoinMap', function () {
39
+ it('should call register internally for base coins and tokens', function () {
40
+ (0, register_1.registerWithCoinMap)(bitgo, statics_1.coins);
41
+ const registeredNames = registerSpy.getCalls().map((call) => call.args[0]);
42
+ // Base coins should be registered
43
+ assert_1.default.ok(registeredNames.includes('canton'));
44
+ assert_1.default.ok(registeredNames.includes('tcanton'));
45
+ });
46
+ it('should add dynamic Canton tokens to the global coin map', function () {
47
+ (0, register_1.registerWithCoinMap)(bitgo, statics_1.coins);
48
+ // registerToken should have been called for Canton tokens in the coin map
49
+ assert_1.default.ok(registerTokenSpy.callCount > 0);
50
+ // Each call should pass a valid coin from the coinMap
51
+ for (let i = 0; i < registerTokenSpy.callCount; i++) {
52
+ const call = registerTokenSpy.getCall(i);
53
+ const staticsCoin = call.args[0];
54
+ assert_1.default.ok(statics_1.coins.has(staticsCoin.name), `${staticsCoin.name} should exist in the coin map`);
55
+ }
56
+ });
57
+ it('should not add tokens to the global coin map when coin map has no Canton tokens', function () {
58
+ const limitedCoinMap = statics_1.coins.filter((coin) => !(coin instanceof statics_1.CantonToken));
59
+ (0, register_1.registerWithCoinMap)(bitgo, limitedCoinMap);
60
+ // registerToken should not be called since no Canton tokens are in the map
61
+ assert_1.default.strictEqual(registerTokenSpy.callCount, 0);
62
+ });
63
+ });
64
+ });
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvcmVnaXN0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrREFBMEI7QUFDMUIsb0RBQTRCO0FBQzVCLDRDQUEwQztBQUMxQyw4Q0FBb0Q7QUFDcEQsNENBQW9EO0FBQ3BELGlEQUFtRTtBQUNuRSx1REFBc0U7QUFFdEUsUUFBUSxDQUFDLGlCQUFpQixFQUFFO0lBQzFCLElBQUksS0FBZSxDQUFDO0lBQ3BCLElBQUksV0FBMkIsQ0FBQztJQUNoQyxJQUFJLGdCQUFnQyxDQUFDO0lBRXJDLFVBQVUsQ0FBQztRQUNULEtBQUssR0FBRyxJQUFJLGtCQUFRLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN0QyxXQUFXLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDM0MsZ0JBQWdCLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyw0QkFBaUIsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUNuRSxDQUFDLENBQUMsQ0FBQztJQUVILFNBQVMsQ0FBQztRQUNSLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN0QixnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM3QixDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxVQUFVLEVBQUU7UUFDbkIsRUFBRSxDQUFDLG1EQUFtRCxFQUFFO1lBQ3RELElBQUEsbUJBQVEsRUFBQyxLQUFLLENBQUMsQ0FBQztZQUVoQixNQUFNLGVBQWUsR0FBRyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFM0Usa0NBQWtDO1lBQ2xDLGdCQUFNLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUM5QyxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFFL0Msa0RBQWtEO1lBQ2xELE1BQU0sZ0JBQWdCLEdBQUcseUJBQWMsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUN6RSxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2xFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMscUJBQXFCLEVBQUU7UUFDOUIsRUFBRSxDQUFDLDJEQUEyRCxFQUFFO1lBQzlELElBQUEsOEJBQW1CLEVBQUMsS0FBSyxFQUFFLGVBQUssQ0FBQyxDQUFDO1lBRWxDLE1BQU0sZUFBZSxHQUFHLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUUzRSxrQ0FBa0M7WUFDbEMsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQzlDLGdCQUFNLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUNqRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx5REFBeUQsRUFBRTtZQUM1RCxJQUFBLDhCQUFtQixFQUFDLEtBQUssRUFBRSxlQUFLLENBQUMsQ0FBQztZQUVsQywwRUFBMEU7WUFDMUUsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBRTFDLHNEQUFzRDtZQUN0RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3BELE1BQU0sSUFBSSxHQUFHLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakMsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxXQUFXLENBQUMsSUFBSSwrQkFBK0IsQ0FBQyxDQUFDO1lBQzdGLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxpRkFBaUYsRUFBRTtZQUNwRixNQUFNLGNBQWMsR0FBRyxlQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxZQUFZLHFCQUFXLENBQUMsQ0FBQyxDQUFDO1lBRTlFLElBQUEsOEJBQW1CLEVBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBRTNDLDJFQUEyRTtZQUMzRSxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvL3Nkay1hcGknO1xuaW1wb3J0IHsgR2xvYmFsQ29pbkZhY3RvcnkgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgY29pbnMsIENhbnRvblRva2VuIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHsgcmVnaXN0ZXIsIHJlZ2lzdGVyV2l0aENvaW5NYXAgfSBmcm9tICcuLi8uLi9zcmMvcmVnaXN0ZXInO1xuaW1wb3J0IHsgQ2FudG9uVG9rZW4gYXMgU2RrQ2FudG9uVG9rZW4gfSBmcm9tICcuLi8uLi9zcmMvY2FudG9uVG9rZW4nO1xuXG5kZXNjcmliZSgnQ2FudG9uIFJlZ2lzdGVyJywgZnVuY3Rpb24gKCkge1xuICBsZXQgYml0Z286IEJpdEdvQVBJO1xuICBsZXQgcmVnaXN0ZXJTcHk6IHNpbm9uLlNpbm9uU3B5O1xuICBsZXQgcmVnaXN0ZXJUb2tlblNweTogc2lub24uU2lub25TcHk7XG5cbiAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgYml0Z28gPSBuZXcgQml0R29BUEkoeyBlbnY6ICd0ZXN0JyB9KTtcbiAgICByZWdpc3RlclNweSA9IHNpbm9uLnNweShiaXRnbywgJ3JlZ2lzdGVyJyk7XG4gICAgcmVnaXN0ZXJUb2tlblNweSA9IHNpbm9uLnNweShHbG9iYWxDb2luRmFjdG9yeSwgJ3JlZ2lzdGVyVG9rZW4nKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICByZWdpc3RlclNweS5yZXN0b3JlKCk7XG4gICAgcmVnaXN0ZXJUb2tlblNweS5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZWdpc3RlcicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJlZ2lzdGVyIGJhc2UgY29pbnMgYW5kIHRva2VuIGNvbnN0cnVjdG9ycycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlZ2lzdGVyKGJpdGdvKTtcblxuICAgICAgY29uc3QgcmVnaXN0ZXJlZE5hbWVzID0gcmVnaXN0ZXJTcHkuZ2V0Q2FsbHMoKS5tYXAoKGNhbGwpID0+IGNhbGwuYXJnc1swXSk7XG5cbiAgICAgIC8vIEJhc2UgY29pbnMgc2hvdWxkIGJlIHJlZ2lzdGVyZWRcbiAgICAgIGFzc2VydC5vayhyZWdpc3RlcmVkTmFtZXMuaW5jbHVkZXMoJ2NhbnRvbicpKTtcbiAgICAgIGFzc2VydC5vayhyZWdpc3RlcmVkTmFtZXMuaW5jbHVkZXMoJ3RjYW50b24nKSk7XG5cbiAgICAgIC8vIENhbnRvbiB0b2tlbnMgZnJvbSBzdGF0aWNzIHNob3VsZCBiZSByZWdpc3RlcmVkXG4gICAgICBjb25zdCBjYW50b25Ub2tlbkNvdW50ID0gU2RrQ2FudG9uVG9rZW4uY3JlYXRlVG9rZW5Db25zdHJ1Y3RvcnMoKS5sZW5ndGg7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVnaXN0ZXJTcHkuY2FsbENvdW50LCAyICsgY2FudG9uVG9rZW5Db3VudCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZWdpc3RlcldpdGhDb2luTWFwJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgY2FsbCByZWdpc3RlciBpbnRlcm5hbGx5IGZvciBiYXNlIGNvaW5zIGFuZCB0b2tlbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZWdpc3RlcldpdGhDb2luTWFwKGJpdGdvLCBjb2lucyk7XG5cbiAgICAgIGNvbnN0IHJlZ2lzdGVyZWROYW1lcyA9IHJlZ2lzdGVyU3B5LmdldENhbGxzKCkubWFwKChjYWxsKSA9PiBjYWxsLmFyZ3NbMF0pO1xuXG4gICAgICAvLyBCYXNlIGNvaW5zIHNob3VsZCBiZSByZWdpc3RlcmVkXG4gICAgICBhc3NlcnQub2socmVnaXN0ZXJlZE5hbWVzLmluY2x1ZGVzKCdjYW50b24nKSk7XG4gICAgICBhc3NlcnQub2socmVnaXN0ZXJlZE5hbWVzLmluY2x1ZGVzKCd0Y2FudG9uJykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhZGQgZHluYW1pYyBDYW50b24gdG9rZW5zIHRvIHRoZSBnbG9iYWwgY29pbiBtYXAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZWdpc3RlcldpdGhDb2luTWFwKGJpdGdvLCBjb2lucyk7XG5cbiAgICAgIC8vIHJlZ2lzdGVyVG9rZW4gc2hvdWxkIGhhdmUgYmVlbiBjYWxsZWQgZm9yIENhbnRvbiB0b2tlbnMgaW4gdGhlIGNvaW4gbWFwXG4gICAgICBhc3NlcnQub2socmVnaXN0ZXJUb2tlblNweS5jYWxsQ291bnQgPiAwKTtcblxuICAgICAgLy8gRWFjaCBjYWxsIHNob3VsZCBwYXNzIGEgdmFsaWQgY29pbiBmcm9tIHRoZSBjb2luTWFwXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlZ2lzdGVyVG9rZW5TcHkuY2FsbENvdW50OyBpKyspIHtcbiAgICAgICAgY29uc3QgY2FsbCA9IHJlZ2lzdGVyVG9rZW5TcHkuZ2V0Q2FsbChpKTtcbiAgICAgICAgY29uc3Qgc3RhdGljc0NvaW4gPSBjYWxsLmFyZ3NbMF07XG4gICAgICAgIGFzc2VydC5vayhjb2lucy5oYXMoc3RhdGljc0NvaW4ubmFtZSksIGAke3N0YXRpY3NDb2luLm5hbWV9IHNob3VsZCBleGlzdCBpbiB0aGUgY29pbiBtYXBgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IGFkZCB0b2tlbnMgdG8gdGhlIGdsb2JhbCBjb2luIG1hcCB3aGVuIGNvaW4gbWFwIGhhcyBubyBDYW50b24gdG9rZW5zJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbGltaXRlZENvaW5NYXAgPSBjb2lucy5maWx0ZXIoKGNvaW4pID0+ICEoY29pbiBpbnN0YW5jZW9mIENhbnRvblRva2VuKSk7XG5cbiAgICAgIHJlZ2lzdGVyV2l0aENvaW5NYXAoYml0Z28sIGxpbWl0ZWRDb2luTWFwKTtcblxuICAgICAgLy8gcmVnaXN0ZXJUb2tlbiBzaG91bGQgbm90IGJlIGNhbGxlZCBzaW5jZSBubyBDYW50b24gdG9rZW5zIGFyZSBpbiB0aGUgbWFwXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVnaXN0ZXJUb2tlblNweS5jYWxsQ291bnQsIDApO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19