bitgo
Version:
BitGo JavaScript SDK
193 lines • 30.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const nock = require("nock");
const should = require("should");
const goStakingWallet_1 = require("../../fixtures/staking/goStakingWallet");
const sdk_core_1 = require("@bitgo/sdk-core");
const sdk_test_1 = require("@bitgo/sdk-test");
const src_1 = require("../../../../src");
const sinon = require("sinon");
const coins_1 = require("../../../../src/v2/coins");
const statics_1 = require("@bitgo/statics");
describe('Go Staking Wallet Common', function () {
const microservicesUri = sdk_core_1.Environments['mock'].uri;
let bitgo;
let baseCoin;
let enterprise;
let stakingWallet;
const coin = 'tsol';
const ofcCoin = `ofc${coin}`;
before(async function () {
bitgo = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'mock', microservicesUri });
bitgo.initializeTestVars();
baseCoin = bitgo.coin(ofcCoin);
baseCoin.keychains();
const ofcToken = statics_1.tokens.testnet.ofc.tokens.filter((token) => token.type === `ofc${coin}`)[0];
const tokenConstructor = coins_1.OfcToken.createTokenConstructor(ofcToken);
bitgo.register(ofcToken.type, tokenConstructor);
enterprise = new sdk_core_1.Enterprise(bitgo, baseCoin, { id: '5cf940949449412d00f53b3d92dbcaa3', name: 'Test Enterprise' });
const walletData = {
id: 'walletId',
coin: ofcCoin,
enterprise: enterprise.id,
keys: ['5b3424f91bf349930e340175', '5b3424f91bf349930e340174', '5b3424f91bf349930e340173'],
};
const wallet = new sdk_core_1.Wallet(bitgo, baseCoin, walletData);
stakingWallet = wallet.toGoStakingWallet();
nock(microservicesUri)
.get(`/api/v2/${ofcCoin}/key/${stakingWallet.wallet.keyIds()[0]}`)
.reply(200, {
id: stakingWallet.wallet.keyIds()[0],
pub: 'xpub661MyMwAqRbcFq65dvGMeEVb81KKDRRkWkawSVesWcyevGc5gr8V27LjNfkktaMuKtM362jhgKy2eu35RdArcmmEAoULzAvgKkJpWQPvLXM',
source: 'user',
encryptedPrv: bitgo.encrypt({
input: 'xprvA41z7zogVVwxVSgdKUHDy1SKmdb533PjDz7J6N6mV6uS3ze1ai8FHa8kmHScGpWmj4WggLyQjgPie1rFSruoUihUZREPSL39UNdE3BBDu76',
password: 'passphrase',
}),
coinSpecific: {},
});
nock(microservicesUri)
.get(`/api/v2/${ofcCoin}/key/${stakingWallet.wallet.keyIds()[1]}`)
.reply(200, {
id: stakingWallet.wallet.keyIds()[1],
pub: 'xpub661MyMwAqRbcFq65dvGMeEVb81KKDRRkWkawSVesWcyevGc5gr8V27LjNfkktaMuKtM362jhgKy2eu35RdArcmmEAoULzAvgKkJpWQPvLXM',
source: 'user',
encryptedPrv: bitgo.encrypt({
input: 'xprvA41z7zogVVwxVSgdKUHDy1SKmdb533PjDz7J6N6mV6uS3ze1ai8FHa8kmHScGpWmj4WggLyQjgPie1rFSruoUihUZREPSL39UNdE3BBDu76',
password: 'passphrase',
}),
coinSpecific: {},
});
nock(microservicesUri)
.get(`/api/v2/${ofcCoin}/key/${stakingWallet.wallet.keyIds()[2]}`)
.reply(200, {
id: stakingWallet.wallet.keyIds()[2],
pub: 'xpub661MyMwAqRbcFq65dvGMeEVb81KKDRRkWkawSVesWcyevGc5gr8V27LjNfkktaMuKtM362jhgKy2eu35RdArcmmEAoULzAvgKkJpWQPvLXM',
source: 'user',
encryptedPrv: bitgo.encrypt({
input: 'xprvA41z7zogVVwxVSgdKUHDy1SKmdb533PjDz7J6N6mV6uS3ze1ai8FHa8kmHScGpWmj4WggLyQjgPie1rFSruoUihUZREPSL39UNdE3BBDu76',
password: 'passphrase',
}),
coinSpecific: {},
});
});
const sandbox = sinon.createSandbox();
afterEach(function () {
sandbox.verifyAndRestore();
});
describe('stake', function () {
it('should call go-staking-service to stake', async function () {
const preview = goStakingWallet_1.default.previewGoStakingRequest(coin);
const msScope1 = nock(microservicesUri)
.post(`/api/go-staking/v1/${ofcCoin}/accounts/${stakingWallet.accountId}/requests/preview`, {
amount: '1',
clientId: 'clientId',
type: 'STAKE',
})
.reply(201, preview);
const expected = goStakingWallet_1.default.finalizeGoStakingRequest(coin, 'STAKE');
const msScope2 = nock(microservicesUri)
.post(`/api/go-staking/v1/${ofcCoin}/accounts/${stakingWallet.accountId}/requests/finalize`, {
amount: '1',
clientId: 'clientId',
frontTransferSendRequest: {
halfSigned: {
payload: preview.payload,
},
},
type: 'STAKE',
})
.reply(201, expected);
const stakingRequest = await stakingWallet.stake({
amount: '1',
clientId: 'clientId',
walletPassphrase: 'passphrase',
});
should.exist(stakingRequest);
stakingRequest.should.deepEqual(expected);
msScope1.isDone().should.be.True();
msScope2.isDone().should.be.True();
});
});
describe('unstake', function () {
it('should call go-staking-service to unstake', async function () {
const expected = goStakingWallet_1.default.finalizeGoStakingRequest(coin, 'UNSTAKE');
const msScope = nock(microservicesUri)
.post(`/api/go-staking/v1/${ofcCoin}/accounts/${stakingWallet.accountId}/requests/finalize`, {
amount: '1',
clientId: 'clientId',
type: 'UNSTAKE',
})
.reply(201, expected);
const stakingRequest = await stakingWallet.unstake({
amount: '1',
clientId: 'clientId',
});
should.exist(stakingRequest);
stakingRequest.should.deepEqual(expected);
msScope.isDone().should.be.True();
});
});
describe('getGoStakingRequest', function () {
it('should call go-staking-service to get go staking request', async function () {
const stakingRequestId = '8638284a-dab2-46b9-b07f-21109a6e7220';
const expected = goStakingWallet_1.default.finalizeGoStakingRequest(coin, 'STAKE');
const msScope = nock(microservicesUri)
.get(`/api/go-staking/v1/${ofcCoin}/accounts/${stakingWallet.accountId}/requests/${stakingRequestId}`)
.reply(200, expected);
const stakingRequest = await stakingWallet.getGoStakingRequest(stakingRequestId);
should.exist(stakingRequest);
stakingRequest.should.deepEqual(expected);
msScope.isDone().should.be.True();
});
});
describe('getGoStakingRequestsByCoin', function () {
it('should call go-staking-service to get go staking requests by coin', async function () {
const expected = goStakingWallet_1.default.getGoStakingRequestsByCoin(ofcCoin);
const msScope = nock(microservicesUri)
.get(`/api/go-staking/v1/${ofcCoin}/accounts/${stakingWallet.accountId}/requests`)
.reply(200, expected);
const stakingRequests = await stakingWallet.getGoStakingRequestsByWalletCoin();
should.exist(stakingRequests);
stakingRequests.should.deepEqual(expected);
msScope.isDone().should.be.True();
});
});
describe('getGoStakingRequests', function () {
it('should call go-staking-service to get go staking requests', async function () {
const expected = goStakingWallet_1.default.getGoStakingRequests([ofcCoin]);
const msScope = nock(microservicesUri)
.get(`/api/go-staking/v1/accounts/${stakingWallet.accountId}/requests`)
.reply(200, expected);
const stakingRequests = await stakingWallet.getGoStakingRequests();
should.exist(stakingRequests);
stakingRequests.should.deepEqual(expected);
msScope.isDone().should.be.True();
});
});
describe('getGoStakingWallets', function () {
it('should call go-staking-service to get go staking wallets', async function () {
const expected = goStakingWallet_1.default.getGoStakingWallets([ofcCoin]);
const msScope = nock(microservicesUri)
.get(`/api/go-staking/v1/accounts/${stakingWallet.accountId}/coins`)
.reply(200, expected);
const goStakingWallets = await stakingWallet.getGoStakingWallets();
should.exist(goStakingWallets);
goStakingWallets.should.deepEqual(expected);
msScope.isDone().should.be.True();
});
});
describe('getGoStakingWallet', function () {
it('should call go-staking-service to get go staking wallet', async function () {
const expected = goStakingWallet_1.default.getGoStakingWallet(ofcCoin);
const msScope = nock(microservicesUri)
.get(`/api/go-staking/v1/${ofcCoin}/accounts/${stakingWallet.accountId}/coins`)
.reply(200, expected);
const goStakingWallet = await stakingWallet.getGoStakingWallet();
should.exist(goStakingWallet);
goStakingWallet.should.deepEqual(expected);
msScope.isDone().should.be.True();
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29TdGFraW5nV2FsbGV0Q29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC92Mi91bml0L3N0YWtpbmcvZ29TdGFraW5nV2FsbGV0Q29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkJBQThCO0FBQzlCLGlDQUFrQztBQUNsQyw0RUFBOEQ7QUFFOUQsOENBQW9GO0FBQ3BGLDhDQUE0QztBQUM1Qyx5Q0FBd0M7QUFDeEMsK0JBQStCO0FBQy9CLG9EQUFvRDtBQUNwRCw0Q0FBd0M7QUFFeEMsUUFBUSxDQUFDLDBCQUEwQixFQUFFO0lBQ25DLE1BQU0sZ0JBQWdCLEdBQUcsdUJBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDbEQsSUFBSSxLQUFLLENBQUM7SUFDVixJQUFJLFFBQVEsQ0FBQztJQUNiLElBQUksVUFBVSxDQUFDO0lBQ2YsSUFBSSxhQUE4QixDQUFDO0lBQ25DLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQztJQUNwQixNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBRTdCLE1BQU0sQ0FBQyxLQUFLO1FBQ1YsS0FBSyxHQUFHLG9CQUFTLENBQUMsUUFBUSxDQUFDLFdBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQVMsQ0FBQyxDQUFDO1FBQzVFLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzNCLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9CLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNyQixNQUFNLFFBQVEsR0FBRyxnQkFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFD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Z0JBQWdCLEdBQUcsTUFBTSxhQUFhLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUVuRSxNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFFL0IsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM1QyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLG9CQUFvQixFQUFFO1FBQzdCLEVBQUUsQ0FBQyx5REFBeUQsRUFBRSxLQUFLO1lBQ2pFLE1BQU0sUUFBUSxHQUFHLHlCQUFRLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO2lCQUNuQyxHQUFHLENBQUMsc0JBQXNCLE9BQU8sYUFBYSxhQUFhLENBQUMsU0FBUyxRQUFRLENBQUM7aUJBQzlFLEtBQUssQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFFeEIsTUFBTSxlQUFlLEdBQUcsTUFBTSxhQUFhLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUVqRSxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBRTlCLGVBQWUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzNDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBub2NrID0gcmVxdWlyZSgnbm9jaycpO1xuaW1wb3J0IHNob3VsZCA9IHJlcXVpcmUoJ3Nob3VsZCcpO1xuaW1wb3J0IGZpeHR1cmVzIGZyb20gJy4uLy4uL2ZpeHR1cmVzL3N0YWtpbmcvZ29TdGFraW5nV2FsbGV0JztcblxuaW1wb3J0IHsgRW50ZXJwcmlzZSwgRW52aXJvbm1lbnRzLCBHb1N0YWtpbmdXYWxsZXQsIFdhbGxldCB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBUZXN0Qml0R28gfSBmcm9tICdAYml0Z28vc2RrLXRlc3QnO1xuaW1wb3J0IHsgQml0R28gfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMnO1xuaW1wb3J0ICogYXMgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0IHsgT2ZjVG9rZW4gfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvdjIvY29pbnMnO1xuaW1wb3J0IHsgdG9rZW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuXG5kZXNjcmliZSgnR28gU3Rha2luZyBXYWxsZXQgQ29tbW9uJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBtaWNyb3NlcnZpY2VzVXJpID0gRW52aXJvbm1lbnRzWydtb2NrJ10udXJpO1xuICBsZXQgYml0Z287XG4gIGxldCBiYXNlQ29pbjtcbiAgbGV0IGVudGVycHJpc2U7XG4gIGxldCBzdGFraW5nV2FsbGV0OiBHb1N0YWtpbmdXYWxsZXQ7XG4gIGNvbnN0IGNvaW4gPSAndHNvbCc7XG4gIGNvbnN0IG9mY0NvaW4gPSBgb2ZjJHtjb2lufWA7XG5cbiAgYmVmb3JlKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBiaXRnbyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHbywgeyBlbnY6ICdtb2NrJywgbWljcm9zZXJ2aWNlc1VyaSB9IGFzIGFueSk7XG4gICAgYml0Z28uaW5pdGlhbGl6ZVRlc3RWYXJzKCk7XG4gICAgYmFzZUNvaW4gPSBiaXRnby5jb2luKG9mY0NvaW4pO1xuICAgIGJhc2VDb2luLmtleWNoYWlucygpO1xuICAgIGNvbnN0IG9mY1Rva2VuID0gdG9rZW5zLnRlc3RuZXQub2ZjLnRva2Vucy5maWx0ZXIoKHRva2VuKSA9PiB0b2tlbi50eXBlID09PSBgb2ZjJHtjb2lufWApWzBdO1xuICAgIGNvbnN0IHRva2VuQ29uc3RydWN0b3IgPSBPZmNUb2tlbi5jcmVhdGVUb2tlbkNvbnN0cnVjdG9yKG9mY1Rva2VuKTtcbiAgICBiaXRnby5yZWdpc3RlcihvZmNUb2tlbi50eXBlLCB0b2tlbkNvbnN0cnVjdG9yKTtcblxuICAgIGVudGVycHJpc2UgPSBuZXcgRW50ZXJwcmlzZShiaXRnbywgYmFzZUNvaW4sIHsgaWQ6ICc1Y2Y5NDA5NDk0NDk0MTJkMDBmNTNiM2Q5MmRiY2FhMycsIG5hbWU6ICdUZXN0IEVudGVycHJpc2UnIH0pO1xuICAgIGNvbnN0IHdhbGxldERhdGEgPSB7XG4gICAgICBpZDogJ3dhbGxldElkJyxcbiAgICAgIGNvaW46IG9mY0NvaW4sXG4gICAgICBlbnRlcnByaXNlOiBlbnRlcnByaXNlLmlkLFxuICAgICAga2V5czogWyc1YjM0MjRmOTFiZjM0OTkzMGUzNDAxNzUnLCAnNWIzNDI0ZjkxYmYzNDk5MzBlMzQwMTc0JywgJzViMzQyNGY5MWJmMzQ5OTMwZTM0MDE3MyddLFxuICAgIH07XG4gICAgY29uc3Qgd2FsbGV0ID0gbmV3IFdhbGxldChiaXRnbywgYmFzZUNvaW4sIHdhbGxldERhdGEpO1xuICAgIHN0YWtpbmdXYWxsZXQgPSB3YWxsZXQudG9Hb1N0YWtpbmdXYWxsZXQoKTtcbiAgICBub2NrKG1pY3Jvc2VydmljZXNVcmkpXG4gICAgICAuZ2V0KGAvYXBpL3YyLyR7b2ZjQ29pbn0va2V5LyR7c3Rha2luZ1dhbGxldC53YWxsZXQua2V5SWRzKClbMF19YClcbiAgICAgIC5yZXBseSgyMDAsIHtcbiAgICAgICAgaWQ6IHN0YWtpbmdXYWxsZXQud2FsbGV0LmtleUlkcygpWzBdLFxuICAgICAgICBwdWI6ICd4cHViNjYxTXlNd0FxUmJjRnE2NWR2R01lRVZiODFLS0RSUmtXa2F3U1Zlc1djeWV2R2M1Z3I4VjI3TGpOZmtrdGFNdUt0TTM2MmpoZ0t5MmV1MzVSZEFyY21tRUFvVUx6QXZnS2tKcFdRUHZMWE0nLFxuICAgICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgICAgZW5jcnlwdGVkUHJ2OiBiaXRnby5lbmNyeXB0KHtcbiAgICAgICAgICBpbnB1dDpcbiAgICAgICAgICAgICd4cHJ2QTQxejd6b2dWVnd4VlNnZEtVSER5MVNLbWRiNTMzUGpEejdKNk42bVY2dVMzemUxYWk4RkhhOGttSFNjR3BXbWo0V2dnTHlRamdQaWUxckZTcnVvVWloVVpSRVBTTDM5VU5kRTNCQkR1NzYnLFxuICAgICAgICAgIHBhc3N3b3JkOiAncGFzc3BocmFzZScsXG4gICAgICAgIH0pLFxuICAgICAgICBjb2luU3BlY2lmaWM6IHt9LFxuICAgICAgfSk7XG5cbiAgICBub2NrKG1pY3Jvc2VydmljZXNVcmkpXG4gICAgICAuZ2V0KGAvYXBpL3YyLyR7b2ZjQ29pbn0va2V5LyR7c3Rha2luZ1dhbGxldC53YWxsZXQua2V5SWRzKClbMV19YClcbiAgICAgIC5yZXBseSgyMDAsIHtcbiAgICAgICAgaWQ6IHN0YWtpbmdXYWxsZXQud2FsbGV0LmtleUlkcygpWzFdLFxuICAgICAgICBwdWI6ICd4cHViNjYxTXlNd0FxUmJjRnE2NWR2R01lRVZiODFLS0RSUmtXa2F3U1Zlc1djeWV2R2M1Z3I4VjI3TGpOZmtrdGFNdUt0TTM2MmpoZ0t5MmV1MzVSZEFyY21tRUFvVUx6QXZnS2tKcFdRUHZMWE0nLFxuICAgICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgICAgZW5jcnlwdGVkUHJ2OiBiaXRnby5lbmNyeXB0KHtcbiAgICAgICAgICBpbnB1dDpcbiAgICAgICAgICAgICd4cHJ2QTQxejd6b2dWVnd4VlNnZEtVSER5MVNLbWRiNTMzUGpEejdKNk42bVY2dVMzemUxYWk4RkhhOGttSFNjR3BXbWo0V2dnTHlRamdQaWUxckZTcnVvVWloVVpSRVBTTDM5VU5kRTNCQkR1NzYnLFxuICAgICAgICAgIHBhc3N3b3JkOiAncGFzc3BocmFzZScsXG4gICAgICAgIH0pLFxuICAgICAgICBjb2luU3BlY2lmaWM6IHt9LFxuICAgICAgfSk7XG5cbiAgICBub2NrKG1pY3Jvc2VydmljZXNVcmkpXG4gICAgICAuZ2V0KGAvYXBpL3YyLyR7b2ZjQ29pbn0va2V5LyR7c3Rha2luZ1dhbGxldC53YWxsZXQua2V5SWRzKClbMl19YClcbiAgICAgIC5yZXBseSgyMDAsIHtcbiAgICAgICAgaWQ6IHN0YWtpbmdXYWxsZXQud2FsbGV0LmtleUlkcygpWzJdLFxuICAgICAgICBwdWI6ICd4cHViNjYxTXlNd0FxUmJjRnE2NWR2R01lRVZiODFLS0RSUmtXa2F3U1Zlc1djeWV2R2M1Z3I4VjI3TGpOZmtrdGFNdUt0TTM2MmpoZ0t5MmV1MzVSZEFyY21tRUFvVUx6QXZnS2tKcFdRUHZMWE0nLFxuICAgICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgICAgZW5jcnlwdGVkUHJ2OiBiaXRnby5lbmNyeXB0KHtcbiAgICAgICAgICBpbnB1dDpcbiAgICAgICAgICAgICd4cHJ2QTQxejd6b2dWVnd4VlNnZEtVSER5MVNLbWRiNTMzUGpEejdKNk42bVY2dVMzemUxYWk4RkhhOGttSFNjR3BXbWo0V2dnTHlRamdQaWUxckZTcnVvVWloVVpSRVBTTDM5VU5kRTNCQkR1NzYnLFxuICAgICAgICAgIHBhc3N3b3JkOiAncGFzc3BocmFzZScsXG4gICAgICAgIH0pLFxuICAgICAgICBjb2luU3BlY2lmaWM6IHt9LFxuICAgICAgfSk7XG4gIH0pO1xuXG4gIGNvbnN0IHNhbmRib3ggPSBzaW5vbi5jcmVhdGVTYW5kYm94KCk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzYW5kYm94LnZlcmlmeUFuZFJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3N0YWtlJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgY2FsbCBnby1zdGFraW5nLXNlcnZpY2UgdG8gc3Rha2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwcmV2aWV3ID0gZml4dHVyZXMucHJldmlld0dvU3Rha2luZ1JlcXVlc3QoY29pbik7XG4gICAgICBjb25zdCBtc1Njb3BlMSA9IG5vY2sobWljcm9zZXJ2aWNlc1VyaSlcbiAgICAgICAgLnBvc3QoYC9hcGkvZ28tc3Rha2luZy92MS8ke29mY0NvaW59L2FjY291bnRzLyR7c3Rha2luZ1dhbGxldC5hY2NvdW50SWR9L3JlcXVlc3RzL3ByZXZpZXdgLCB7XG4gICAgICAgICAgYW1vdW50OiAnMScsXG4gICAgICAgICAgY2xpZW50SWQ6ICdjbGllbnRJZCcsXG4gICAgICAgICAgdHlwZTogJ1NUQUtFJyxcbiAgICAgICAgfSlcbiAgICAgICAgLnJlcGx5KDIwMSwgcHJldmlldyk7XG5cbiAgICAgIGNvbnN0IGV4cGVjdGVkID0gZml4dHVyZXMuZmluYWxpemVHb1N0YWtpbmdSZXF1ZXN0KGNvaW4sICdTVEFLRScpO1xuICAgICAgY29uc3QgbXNTY29wZTIgPSBub2NrKG1pY3Jvc2VydmljZXNVcmkpXG4gICAgICAgIC5wb3N0KGAvYXBpL2dvLXN0YWtpbmcvdjEvJHtvZmNDb2lufS9hY2NvdW50cy8ke3N0YWtpbmdXYWxsZXQuYWNjb3VudElkfS9yZXF1ZXN0cy9maW5hbGl6ZWAsIHtcbiAgICAgICAgICBhbW91bnQ6ICcxJyxcbiAgICAgICAgICBjbGllbnRJZDogJ2NsaWVudElkJyxcbiAgICAgICAgICBmcm9udFRyYW5zZmVyU2VuZFJlcXVlc3Q6IHtcbiAgICAgICAgICAgIGhhbGZTaWduZWQ6IHtcbiAgICAgICAgICAgICAgcGF5bG9hZDogcHJldmlldy5wYXlsb2FkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR5cGU6ICdTVEFLRScsXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXBseSgyMDEsIGV4cGVjdGVkKTtcblxuICAgICAgY29uc3Qgc3Rha2luZ1JlcXVlc3QgPSBhd2FpdCBzdGFraW5nV2FsbGV0LnN0YWtlKHtcbiAgICAgICAgYW1vdW50OiAnMScsXG4gICAgICAgIGNsaWVudElkOiAnY2xpZW50SWQnLFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiAncGFzc3BocmFzZScsXG4gICAgICB9KTtcblxuICAgICAgc2hvdWxkLmV4aXN0KHN0YWtpbmdSZXF1ZXN0KTtcblxuICAgICAgc3Rha2luZ1JlcXVlc3Quc2hvdWxkLmRlZXBFcXVhbChleHBlY3RlZCk7XG4gICAgICBtc1Njb3BlMS5pc0RvbmUoKS5zaG91bGQuYmUuVHJ1ZSgpO1xuICAgICAgbXNTY29wZTIuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Vuc3Rha2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjYWxsIGdvLXN0YWtpbmctc2VydmljZSB0byB1bnN0YWtlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSBmaXh0dXJlcy5maW5hbGl6ZUdvU3Rha2luZ1JlcXVlc3QoY29pbiwgJ1VOU1RBS0UnKTtcbiAgICAgIGNvbnN0IG1zU2NvcGUgPSBub2NrKG1pY3Jvc2VydmljZXNVcmkpXG4gICAgICAgIC5wb3N0KGAvYXBpL2dvLXN0YWtpbmcvdjEvJHtvZmNDb2lufS9hY2NvdW50cy8ke3N0YWtpbmdXYWxsZXQuYWNjb3VudElkfS9yZXF1ZXN0cy9maW5hbGl6ZWAsIHtcbiAgICAgICAgICBhbW91bnQ6ICcxJyxcbiAgICAgICAgICBjbGllbnRJZDogJ2NsaWVudElkJyxcbiAgICAgICAgICB0eXBlOiAnVU5TVEFLRScsXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXBseSgyMDEsIGV4cGVjdGVkKTtcblxuICAgICAgY29uc3Qgc3Rha2luZ1JlcXVlc3QgPSBhd2FpdCBzdGFraW5nV2FsbGV0LnVuc3Rha2Uoe1xuICAgICAgICBhbW91bnQ6ICcxJyxcbiAgICAgICAgY2xpZW50SWQ6ICdjbGllbnRJZCcsXG4gICAgICB9KTtcblxuICAgICAgc2hvdWxkLmV4aXN0KHN0YWtpbmdSZXF1ZXN0KTtcblxuICAgICAgc3Rha2luZ1JlcXVlc3Quc2hvdWxkLmRlZXBFcXVhbChleHBlY3RlZCk7XG4gICAgICBtc1Njb3BlLmlzRG9uZSgpLnNob3VsZC5iZS5UcnVlKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRHb1N0YWtpbmdSZXF1ZXN0JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgY2FsbCBnby1zdGFraW5nLXNlcnZpY2UgdG8gZ2V0IGdvIHN0YWtpbmcgcmVxdWVzdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHN0YWtpbmdSZXF1ZXN0SWQgPSAnODYzODI4NGEtZGFiMi00NmI5LWIwN2YtMjExMDlhNmU3MjIwJztcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0gZml4dHVyZXMuZmluYWxpemVHb1N0YWtpbmdSZXF1ZXN0KGNvaW4sICdTVEFLRScpO1xuICAgICAgY29uc3QgbXNTY29wZSA9IG5vY2sobWljcm9zZXJ2aWNlc1VyaSlcbiAgICAgICAgLmdldChgL2FwaS9nby1zdGFraW5nL3YxLyR7b2ZjQ29pbn0vYWNjb3VudHMvJHtzdGFraW5nV2FsbGV0LmFjY291bnRJZH0vcmVxdWVzdHMvJHtzdGFraW5nUmVxdWVzdElkfWApXG4gICAgICAgIC5yZXBseSgyMDAsIGV4cGVjdGVkKTtcblxuICAgICAgY29uc3Qgc3Rha2luZ1JlcXVlc3QgPSBhd2FpdCBzdGFraW5nV2FsbGV0LmdldEdvU3Rha2luZ1JlcXVlc3Qoc3Rha2luZ1JlcXVlc3RJZCk7XG5cbiAgICAgIHNob3VsZC5leGlzdChzdGFraW5nUmVxdWVzdCk7XG5cbiAgICAgIHN0YWtpbmdSZXF1ZXN0LnNob3VsZC5kZWVwRXF1YWwoZXhwZWN0ZWQpO1xuICAgICAgbXNTY29wZS5pc0RvbmUoKS5zaG91bGQuYmUuVHJ1ZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2V0R29TdGFraW5nUmVxdWVzdHNCeUNvaW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjYWxsIGdvLXN0YWtpbmctc2VydmljZSB0byBnZXQgZ28gc3Rha2luZyByZXF1ZXN0cyBieSBjb2luJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSBmaXh0dXJlcy5nZXRHb1N0YWtpbmdSZXF1ZXN0c0J5Q29pbihvZmNDb2luKTtcbiAgICAgIGNvbnN0IG1zU2NvcGUgPSBub2NrKG1pY3Jvc2VydmljZXNVcmkpXG4gICAgICAgIC5nZXQoYC9hcGkvZ28tc3Rha2luZy92MS8ke29mY0NvaW59L2FjY291bnRzLyR7c3Rha2luZ1dhbGxldC5hY2NvdW50SWR9L3JlcXVlc3RzYClcbiAgICAgICAgLnJlcGx5KDIwMCwgZXhwZWN0ZWQpO1xuXG4gICAgICBjb25zdCBzdGFraW5nUmVxdWVzdHMgPSBhd2FpdCBzdGFraW5nV2FsbGV0LmdldEdvU3Rha2luZ1JlcXVlc3RzQnlXYWxsZXRDb2luKCk7XG5cbiAgICAgIHNob3VsZC5leGlzdChzdGFraW5nUmVxdWVzdHMpO1xuXG4gICAgICBzdGFraW5nUmVxdWVzdHMuc2hvdWxkLmRlZXBFcXVhbChleHBlY3RlZCk7XG4gICAgICBtc1Njb3BlLmlzRG9uZSgpLnNob3VsZC5iZS5UcnVlKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRHb1N0YWtpbmdSZXF1ZXN0cycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGNhbGwgZ28tc3Rha2luZy1zZXJ2aWNlIHRvIGdldCBnbyBzdGFraW5nIHJlcXVlc3RzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSBmaXh0dXJlcy5nZXRHb1N0YWtpbmdSZXF1ZXN0cyhbb2ZjQ29pbl0pO1xuICAgICAgY29uc3QgbXNTY29wZSA9IG5vY2sobWljcm9zZXJ2aWNlc1VyaSlcbiAgICAgICAgLmdldChgL2FwaS9nby1zdGFraW5nL3YxL2FjY291bnRzLyR7c3Rha2luZ1dhbGxldC5hY2NvdW50SWR9L3JlcXVlc3RzYClcbiAgICAgICAgLnJlcGx5KDIwMCwgZXhwZWN0ZWQpO1xuXG4gICAgICBjb25zdCBzdGFraW5nUmVxdWVzdHMgPSBhd2FpdCBzdGFraW5nV2FsbGV0LmdldEdvU3Rha2luZ1JlcXVlc3RzKCk7XG5cbiAgICAgIHNob3VsZC5leGlzdChzdGFraW5nUmVxdWVzdHMpO1xuXG4gICAgICBzdGFraW5nUmVxdWVzdHMuc2hvdWxkLmRlZXBFcXVhbChleHBlY3RlZCk7XG4gICAgICBtc1Njb3BlLmlzRG9uZSgpLnNob3VsZC5iZS5UcnVlKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRHb1N0YWtpbmdXYWxsZXRzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgY2FsbCBnby1zdGFraW5nLXNlcnZpY2UgdG8gZ2V0IGdvIHN0YWtpbmcgd2FsbGV0cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0gZml4dHVyZXMuZ2V0R29TdGFraW5nV2FsbGV0cyhbb2ZjQ29pbl0pO1xuICAgICAgY29uc3QgbXNTY29wZSA9IG5vY2sobWljcm9zZXJ2aWNlc1VyaSlcbiAgICAgICAgLmdldChgL2FwaS9nby1zdGFraW5nL3YxL2FjY291bnRzLyR7c3Rha2luZ1dhbGxldC5hY2NvdW50SWR9L2NvaW5zYClcbiAgICAgICAgLnJlcGx5KDIwMCwgZXhwZWN0ZWQpO1xuXG4gICAgICBjb25zdCBnb1N0YWtpbmdXYWxsZXRzID0gYXdhaXQgc3Rha2luZ1dhbGxldC5nZXRHb1N0YWtpbmdXYWxsZXRzKCk7XG5cbiAgICAgIHNob3VsZC5leGlzdChnb1N0YWtpbmdXYWxsZXRzKTtcblxuICAgICAgZ29TdGFraW5nV2FsbGV0cy5zaG91bGQuZGVlcEVxdWFsKGV4cGVjdGVkKTtcbiAgICAgIG1zU2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldEdvU3Rha2luZ1dhbGxldCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGNhbGwgZ28tc3Rha2luZy1zZXJ2aWNlIHRvIGdldCBnbyBzdGFraW5nIHdhbGxldCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0gZml4dHVyZXMuZ2V0R29TdGFraW5nV2FsbGV0KG9mY0NvaW4pO1xuICAgICAgY29uc3QgbXNTY29wZSA9IG5vY2sobWljcm9zZXJ2aWNlc1VyaSlcbiAgICAgICAgLmdldChgL2FwaS9nby1zdGFraW5nL3YxLyR7b2ZjQ29pbn0vYWNjb3VudHMvJHtzdGFraW5nV2FsbGV0LmFjY291bnRJZH0vY29pbnNgKVxuICAgICAgICAucmVwbHkoMjAwLCBleHBlY3RlZCk7XG5cbiAgICAgIGNvbnN0IGdvU3Rha2luZ1dhbGxldCA9IGF3YWl0IHN0YWtpbmdXYWxsZXQuZ2V0R29TdGFraW5nV2FsbGV0KCk7XG5cbiAgICAgIHNob3VsZC5leGlzdChnb1N0YWtpbmdXYWxsZXQpO1xuXG4gICAgICBnb1N0YWtpbmdXYWxsZXQuc2hvdWxkLmRlZXBFcXVhbChleHBlY3RlZCk7XG4gICAgICBtc1Njb3BlLmlzRG9uZSgpLnNob3VsZC5iZS5UcnVlKCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=