bitgo
Version:
BitGo JavaScript SDK
126 lines • 19.6 kB
JavaScript
"use strict";
//
// Tests for enterprises
//
Object.defineProperty(exports, "__esModule", { value: true });
const nock = require("nock");
const sinon = require("sinon");
const sdk_core_1 = require("@bitgo/sdk-core");
const sdk_test_1 = require("@bitgo/sdk-test");
const bitgo_1 = require("../../../src/bitgo");
const ecdsaNtilde_1 = require("./internal/tssUtils/mocks/ecdsaNtilde");
const utxo_lib_1 = require("@bitgo/utxo-lib");
describe('Enterprise:', function () {
let bitgo;
let enterprise;
let baseCoin;
let bgUrl;
before(function () {
bitgo = sdk_test_1.TestBitGo.decorate(bitgo_1.BitGo, { env: 'test' });
bitgo.initializeTestVars();
baseCoin = bitgo.coin('tbtc');
enterprise = new sdk_core_1.Enterprise(bitgo, baseCoin, { id: '593f1ece99d37c23080a557283edcc89', name: 'Test Enterprise' });
bgUrl = sdk_core_1.common.Environments[bitgo.getEnv()].uri;
});
describe('Transaction data', function () {
it('should search for pending transaction correctly', async function () {
const params = { enterpriseId: enterprise.id };
const scope = nock(bgUrl).get('/api/v2/tbtc/tx/pending/first').query(params).reply(200);
await enterprise.getFirstPendingTransaction().should.be.resolved();
scope.isDone().should.be.True();
});
});
it('should fetch the tss config correctly', async function () {
const scope = nock(bgUrl)
.get(`/api/v2/enterprise/${enterprise.id}/tssconfig`)
.reply(200, {
ecdsa: {
challenge: {
enterprise: {
...ecdsaNtilde_1.mockChallengeA,
verifiers: {
adminSignature: 'hex sig',
},
},
},
},
});
await enterprise.getExistingTssEcdsaChallenge().should.be.resolved();
scope.isDone().should.be.True();
});
describe('Resign enterprise challenge', function () {
const bitgo = sdk_test_1.TestBitGo.decorate(bitgo_1.BitGo, { env: 'mock' });
const enterprise = new sdk_core_1.Enterprise(bitgo, bitgo.coin('tbtc'), { id: '123', name: 'Test Enterprise' });
const oldAdminEcdhKey = bitgo.keychains().create();
const oldAdminDerivationPath = 'm/0/0';
const newAdminEcdhKey = bitgo.keychains().create();
const newAdminDerivationPath = 'm/0/1';
const entChallenge = {
ntilde: 'ent ntilde',
h1: 'ent h1',
h2: 'ent h2',
};
const bitgoChallenge = {
ntilde: 'bitgo ntilde',
h1: 'bitgo h1',
h2: 'bitgo h2',
};
const signedEntChallenge = sdk_core_1.ECDSAUtils.EcdsaUtils.signChallenge(entChallenge, oldAdminEcdhKey.xprv, oldAdminDerivationPath);
const signedBitgoChallenge = sdk_core_1.ECDSAUtils.EcdsaUtils.signChallenge(bitgoChallenge, oldAdminEcdhKey.xprv, oldAdminDerivationPath);
const newSignedEntChallenge = sdk_core_1.ECDSAUtils.EcdsaUtils.signChallenge(entChallenge, newAdminEcdhKey.xprv, newAdminDerivationPath);
const newSignedBitgoChallenge = sdk_core_1.ECDSAUtils.EcdsaUtils.signChallenge(bitgoChallenge, newAdminEcdhKey.xprv, newAdminDerivationPath);
const entChallengeWithVerifiers = {
...entChallenge,
verifiers: {
adminSignature: signedEntChallenge.toString('hex'),
},
};
const bitgoChallengeWithVerifier = {
...bitgoChallenge,
verifiers: {
adminSignature: signedBitgoChallenge.toString('hex'),
},
};
it('should verify and resign enterprise challenge', async function () {
const stubuUploadChallenges = sinon.stub(sdk_core_1.ECDSAUtils.EcdsaUtils, 'uploadChallengesToEnterprise');
await enterprise
.resignEnterpriseChallenges({
xprv: oldAdminEcdhKey.xprv,
derivationPath: oldAdminDerivationPath,
derivedPubKey: utxo_lib_1.bip32
.fromBase58(oldAdminEcdhKey.xpub)
.derivePath(oldAdminDerivationPath)
.publicKey.toString('hex'),
}, {
xprv: newAdminEcdhKey.xprv,
derivationPath: newAdminDerivationPath,
derivedPubKey: utxo_lib_1.bip32
.fromBase58(newAdminEcdhKey.xpub)
.derivePath(newAdminDerivationPath)
.publicKey.toString('hex'),
}, entChallengeWithVerifiers, bitgoChallengeWithVerifier, bitgoChallengeWithVerifier)
.should.not.be.rejected();
stubuUploadChallenges.should.be.calledWith(bitgo, '123', entChallengeWithVerifiers, newSignedEntChallenge.toString('hex'), newSignedBitgoChallenge.toString('hex'), newSignedBitgoChallenge.toString('hex'));
});
it('should fail when the old ecdh keychain is incorrect', async function () {
await enterprise
.resignEnterpriseChallenges({
xprv: newAdminEcdhKey.xprv,
derivationPath: newAdminDerivationPath,
derivedPubKey: utxo_lib_1.bip32
.fromBase58(newAdminEcdhKey.xpub)
.derivePath(newAdminDerivationPath)
.publicKey.toString('hex'),
}, {
xprv: newAdminEcdhKey.xprv,
derivationPath: newAdminDerivationPath,
derivedPubKey: utxo_lib_1.bip32
.fromBase58(newAdminEcdhKey.xpub)
.derivePath(newAdminDerivationPath)
.publicKey.toString('hex'),
}, entChallengeWithVerifiers, bitgoChallengeWithVerifier, bitgoChallengeWithVerifier)
.should.be.rejectedWith('Cannot re-sign. The Enterprise TSS config was signed by another user.');
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50ZXJwcmlzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdjIvdW5pdC9lbnRlcnByaXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxFQUFFO0FBQ0Ysd0JBQXdCO0FBQ3hCLEVBQUU7O0FBRUYsNkJBQThCO0FBQzlCLCtCQUErQjtBQUMvQiw4Q0FBaUU7QUFFakUsOENBQTRDO0FBQzVDLDhDQUEyQztBQUMzQyx1RUFBdUU7QUFDdkUsOENBQXdDO0FBRXhDLFFBQVEsQ0FBQyxhQUFhLEVBQUU7SUFDdEIsSUFBSSxLQUFLLENBQUM7SUFDVixJQUFJLFVBQVUsQ0FBQztJQUNmLElBQUksUUFBUSxDQUFDO0lBQ2IsSUFBSSxLQUFLLENBQUM7SUFFVixNQUFNLENBQUM7UUFDTCxLQUFLLEdBQUcsb0JBQVMsQ0FBQyxRQUFRLENBQUMsYUFBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDbkQsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDM0IsUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUIsVUFBVSxHQUFHLElBQUkscUJBQVUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLGtDQUFrQyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQUM7UUFDbEgsS0FBSyxHQUFHLGlCQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUNsRCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxrQkFBa0IsRUFBRTtRQUMzQixFQUFFLENBQUMsaURBQWlELEVBQUUsS0FBSztZQUN6RCxNQUFNLE1BQU0sR0FBRyxFQUFFLFlBQVksRUFBRSxVQUFVLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDL0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFD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QkFBcUIsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQ3JDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFDdkMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUN4QyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMscURBQXFELEVBQUUsS0FBSztZQUM3RCxNQUFNLFVBQVU7aUJBQ2IsMEJBQTBCLENBQ3pCO2dCQUNFLElBQUksRUFBRSxlQUFlLENBQUMsSUFBSTtnQkFDMUIsY0FBYyxFQUFFLHNCQUFzQjtnQkFDdEMsYUFBYSxFQUFFLGdCQUFLO3FCQUNqQixVQUFVLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQztxQkFDaEMsVUFBVSxDQUFDLHNCQUFzQixDQUFDO3FCQUNsQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQzthQUM3QixFQUNEO2dCQUNFLElBQUksRUFBRSxlQUFlLENBQUMsSUFBSTtnQkFDMUIsY0FBYyxFQUFFLHNCQUFzQjtnQkFDdEMsYUFBYSxFQUFFLGdCQUFLO3FCQUNqQixVQUFVLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQztxQkFDaEMsVUFBVSxDQUFDLHNCQUFzQixDQUFDO3FCQUNsQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQzthQUM3QixFQUNELHlCQUF5QixFQUN6QiwwQkFBMEIsRUFDMUIsMEJBQTBCLENBQzNCO2lCQUNBLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLHVFQUF1RSxDQUFDLENBQUM7UUFDckcsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy9cbi8vIFRlc3RzIGZvciBlbnRlcnByaXNlc1xuLy9cblxuaW1wb3J0IG5vY2sgPSByZXF1aXJlKCdub2NrJyk7XG5pbXBvcnQgKiBhcyBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgeyBjb21tb24sIEVDRFNBVXRpbHMsIEVudGVycHJpc2UgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuXG5pbXBvcnQgeyBUZXN0Qml0R28gfSBmcm9tICdAYml0Z28vc2RrLXRlc3QnO1xuaW1wb3J0IHsgQml0R28gfSBmcm9tICcuLi8uLi8uLi9zcmMvYml0Z28nO1xuaW1wb3J0IHsgbW9ja0NoYWxsZW5nZUEgfSBmcm9tICcuL2ludGVybmFsL3Rzc1V0aWxzL21vY2tzL2VjZHNhTnRpbGRlJztcbmltcG9ydCB7IGJpcDMyIH0gZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcblxuZGVzY3JpYmUoJ0VudGVycHJpc2U6JywgZnVuY3Rpb24gKCkge1xuICBsZXQgYml0Z287XG4gIGxldCBlbnRlcnByaXNlO1xuICBsZXQgYmFzZUNvaW47XG4gIGxldCBiZ1VybDtcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvLCB7IGVudjogJ3Rlc3QnIH0pO1xuICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICAgIGJhc2VDb2luID0gYml0Z28uY29pbigndGJ0YycpO1xuICAgIGVudGVycHJpc2UgPSBuZXcgRW50ZXJwcmlzZShiaXRnbywgYmFzZUNvaW4sIHsgaWQ6ICc1OTNmMWVjZTk5ZDM3YzIzMDgwYTU1NzI4M2VkY2M4OScsIG5hbWU6ICdUZXN0IEVudGVycHJpc2UnIH0pO1xuICAgIGJnVXJsID0gY29tbW9uLkVudmlyb25tZW50c1tiaXRnby5nZXRFbnYoKV0udXJpO1xuICB9KTtcblxuICBkZXNjcmliZSgnVHJhbnNhY3Rpb24gZGF0YScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHNlYXJjaCBmb3IgcGVuZGluZyB0cmFuc2FjdGlvbiBjb3JyZWN0bHknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSB7IGVudGVycHJpc2VJZDogZW50ZXJwcmlzZS5pZCB9O1xuICAgICAgY29uc3Qgc2NvcGUgPSBub2NrKGJnVXJsKS5nZXQoJy9hcGkvdjIvdGJ0Yy90eC9wZW5kaW5nL2ZpcnN0JykucXVlcnkocGFyYW1zKS5yZXBseSgyMDApO1xuICAgICAgYXdhaXQgZW50ZXJwcmlzZS5nZXRGaXJzdFBlbmRpbmdUcmFuc2FjdGlvbigpLnNob3VsZC5iZS5yZXNvbHZlZCgpO1xuICAgICAgc2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBmZXRjaCB0aGUgdHNzIGNvbmZpZyBjb3JyZWN0bHknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgc2NvcGUgPSBub2NrKGJnVXJsKVxuICAgICAgLmdldChgL2FwaS92Mi9lbnRlcnByaXNlLyR7ZW50ZXJwcmlzZS5pZH0vdHNzY29uZmlnYClcbiAgICAgIC5yZXBseSgyMDAsIHtcbiAgICAgICAgZWNkc2E6IHtcbiAgICAgICAgICBjaGFsbGVuZ2U6IHtcbiAgICAgICAgICAgIGVudGVycHJpc2U6IHtcbiAgICAgICAgICAgICAgLi4ubW9ja0NoYWxsZW5nZUEsXG4gICAgICAgICAgICAgIHZlcmlmaWVyczoge1xuICAgICAgICAgICAgICAgIGFkbWluU2lnbmF0dXJlOiAnaGV4IHNpZycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICBhd2FpdCBlbnRlcnByaXNlLmdldEV4aXN0aW5nVHNzRWNkc2FDaGFsbGVuZ2UoKS5zaG91bGQuYmUucmVzb2x2ZWQoKTtcbiAgICBzY29wZS5pc0RvbmUoKS5zaG91bGQuYmUuVHJ1ZSgpO1xuICB9KTtcblxuICBkZXNjcmliZSgnUmVzaWduIGVudGVycHJpc2UgY2hhbGxlbmdlJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvLCB7IGVudjogJ21vY2snIH0pO1xuICAgIGNvbnN0IGVudGVycHJpc2UgPSBuZXcgRW50ZXJwcmlzZShiaXRnbywgYml0Z28uY29pbigndGJ0YycpLCB7IGlkOiAnMTIzJywgbmFtZTogJ1Rlc3QgRW50ZXJwcmlzZScgfSk7XG5cbiAgICBjb25zdCBvbGRBZG1pbkVjZGhLZXkgPSBiaXRnby5rZXljaGFpbnMoKS5jcmVhdGUoKTtcbiAgICBjb25zdCBvbGRBZG1pbkRlcml2YXRpb25QYXRoID0gJ20vMC8wJztcblxuICAgIGNvbnN0IG5ld0FkbWluRWNkaEtleSA9IGJpdGdvLmtleWNoYWlucygpLmNyZWF0ZSgpO1xuICAgIGNvbnN0IG5ld0FkbWluRGVyaXZhdGlvblBhdGggPSAnbS8wLzEnO1xuXG4gICAgY29uc3QgZW50Q2hhbGxlbmdlID0ge1xuICAgICAgbnRpbGRlOiAnZW50IG50aWxkZScsXG4gICAgICBoMTogJ2VudCBoMScsXG4gICAgICBoMjogJ2VudCBoMicsXG4gICAgfTtcbiAgICBjb25zdCBiaXRnb0NoYWxsZW5nZSA9IHtcbiAgICAgIG50aWxkZTogJ2JpdGdvIG50aWxkZScsXG4gICAgICBoMTogJ2JpdGdvIGgxJyxcbiAgICAgIGgyOiAnYml0Z28gaDInLFxuICAgIH07XG5cbiAgICBjb25zdCBzaWduZWRFbnRDaGFsbGVuZ2UgPSBFQ0RTQVV0aWxzLkVjZHNhVXRpbHMuc2lnbkNoYWxsZW5nZShcbiAgICAgIGVudENoYWxsZW5nZSxcbiAgICAgIG9sZEFkbWluRWNkaEtleS54cHJ2LFxuICAgICAgb2xkQWRtaW5EZXJpdmF0aW9uUGF0aFxuICAgICk7XG5cbiAgICBjb25zdCBzaWduZWRCaXRnb0NoYWxsZW5nZSA9IEVDRFNBVXRpbHMuRWNkc2FVdGlscy5zaWduQ2hhbGxlbmdlKFxuICAgICAgYml0Z29DaGFsbGVuZ2UsXG4gICAgICBvbGRBZG1pbkVjZGhLZXkueHBydixcbiAgICAgIG9sZEFkbWluRGVyaXZhdGlvblBhdGhcbiAgICApO1xuXG4gICAgY29uc3QgbmV3U2lnbmVkRW50Q2hhbGxlbmdlID0gRUNEU0FVdGlscy5FY2RzYVV0aWxzLnNpZ25DaGFsbGVuZ2UoXG4gICAgICBlbnRDaGFsbGVuZ2UsXG4gICAgICBuZXdBZG1pbkVjZGhLZXkueHBydixcbiAgICAgIG5ld0FkbWluRGVyaXZhdGlvblBhdGhcbiAgICApO1xuXG4gICAgY29uc3QgbmV3U2lnbmVkQml0Z29DaGFsbGVuZ2UgPSBFQ0RTQVV0aWxzLkVjZHNhVXRpbHMuc2lnbkNoYWxsZW5nZShcbiAgICAgIGJpdGdvQ2hhbGxlbmdlLFxuICAgICAgbmV3QWRtaW5FY2RoS2V5LnhwcnYsXG4gICAgICBuZXdBZG1pbkRlcml2YXRpb25QYXRoXG4gICAgKTtcblxuICAgIGNvbnN0IGVudENoYWxsZW5nZVdpdGhWZXJpZmllcnM6IEVDRFNBVXRpbHMuU2VyaWFsaXplZE50aWxkZVdpdGhWZXJpZmllcnMgPSB7XG4gICAgICAuLi5lbnRDaGFsbGVuZ2UsXG4gICAgICB2ZXJpZmllcnM6IHtcbiAgICAgICAgYWRtaW5TaWduYXR1cmU6IHNpZ25lZEVudENoYWxsZW5nZS50b1N0cmluZygnaGV4JyksXG4gICAgICB9LFxuICAgIH07XG4gICAgY29uc3QgYml0Z29DaGFsbGVuZ2VXaXRoVmVyaWZpZXI6IEVDRFNBVXRpbHMuU2VyaWFsaXplZE50aWxkZVdpdGhWZXJpZmllcnMgPSB7XG4gICAgICAuLi5iaXRnb0NoYWxsZW5nZSxcbiAgICAgIHZlcmlmaWVyczoge1xuICAgICAgICBhZG1pblNpZ25hdHVyZTogc2lnbmVkQml0Z29DaGFsbGVuZ2UudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgYW5kIHJlc2lnbiBlbnRlcnByaXNlIGNoYWxsZW5nZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHN0dWJ1VXBsb2FkQ2hhbGxlbmdlcyA9IHNpbm9uLnN0dWIoRUNEU0FVdGlscy5FY2RzYVV0aWxzLCAndXBsb2FkQ2hhbGxlbmdlc1RvRW50ZXJwcmlzZScpO1xuICAgICAgYXdhaXQgZW50ZXJwcmlzZVxuICAgICAgICAucmVzaWduRW50ZXJwcmlzZUNoYWxsZW5nZXMoXG4gICAgICAgICAge1xuICAgICAgICAgICAgeHBydjogb2xkQWRtaW5FY2RoS2V5LnhwcnYsXG4gICAgICAgICAgICBkZXJpdmF0aW9uUGF0aDogb2xkQWRtaW5EZXJpdmF0aW9uUGF0aCxcbiAgICAgICAgICAgIGRlcml2ZWRQdWJLZXk6IGJpcDMyXG4gICAgICAgICAgICAgIC5mcm9tQmFzZTU4KG9sZEFkbWluRWNkaEtleS54cHViKVxuICAgICAgICAgICAgICAuZGVyaXZlUGF0aChvbGRBZG1pbkRlcml2YXRpb25QYXRoKVxuICAgICAgICAgICAgICAucHVibGljS2V5LnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHhwcnY6IG5ld0FkbWluRWNkaEtleS54cHJ2LFxuICAgICAgICAgICAgZGVyaXZhdGlvblBhdGg6IG5ld0FkbWluRGVyaXZhdGlvblBhdGgsXG4gICAgICAgICAgICBkZXJpdmVkUHViS2V5OiBiaXAzMlxuICAgICAgICAgICAgICAuZnJvbUJhc2U1OChuZXdBZG1pbkVjZGhLZXkueHB1YilcbiAgICAgICAgICAgICAgLmRlcml2ZVBhdGgobmV3QWRtaW5EZXJpdmF0aW9uUGF0aClcbiAgICAgICAgICAgICAgLnB1YmxpY0tleS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBlbnRDaGFsbGVuZ2VXaXRoVmVyaWZpZXJzLFxuICAgICAgICAgIGJpdGdvQ2hhbGxlbmdlV2l0aFZlcmlmaWVyLFxuICAgICAgICAgIGJpdGdvQ2hhbGxlbmdlV2l0aFZlcmlmaWVyXG4gICAgICAgIClcbiAgICAgICAgLnNob3VsZC5ub3QuYmUucmVqZWN0ZWQoKTtcbiAgICAgIHN0dWJ1VXBsb2FkQ2hhbGxlbmdlcy5zaG91bGQuYmUuY2FsbGVkV2l0aChcbiAgICAgICAgYml0Z28sXG4gICAgICAgICcxMjMnLFxuICAgICAgICBlbnRDaGFsbGVuZ2VXaXRoVmVyaWZpZXJzLFxuICAgICAgICBuZXdTaWduZWRFbnRDaGFsbGVuZ2UudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBuZXdTaWduZWRCaXRnb0NoYWxsZW5nZS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIG5ld1NpZ25lZEJpdGdvQ2hhbGxlbmdlLnRvU3RyaW5nKCdoZXgnKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB3aGVuIHRoZSBvbGQgZWNkaCBrZXljaGFpbiBpcyBpbmNvcnJlY3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBlbnRlcnByaXNlXG4gICAgICAgIC5yZXNpZ25FbnRlcnByaXNlQ2hhbGxlbmdlcyhcbiAgICAgICAgICB7XG4gICAgICAgICAgICB4cHJ2OiBuZXdBZG1pbkVjZGhLZXkueHBydixcbiAgICAgICAgICAgIGRlcml2YXRpb25QYXRoOiBuZXdBZG1pbkRlcml2YXRpb25QYXRoLFxuICAgICAgICAgICAgZGVyaXZlZFB1YktleTogYmlwMzJcbiAgICAgICAgICAgICAgLmZyb21CYXNlNTgobmV3QWRtaW5FY2RoS2V5LnhwdWIpXG4gICAgICAgICAgICAgIC5kZXJpdmVQYXRoKG5ld0FkbWluRGVyaXZhdGlvblBhdGgpXG4gICAgICAgICAgICAgIC5wdWJsaWNLZXkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgeHBydjogbmV3QWRtaW5FY2RoS2V5LnhwcnYsXG4gICAgICAgICAgICBkZXJpdmF0aW9uUGF0aDogbmV3QWRtaW5EZXJpdmF0aW9uUGF0aCxcbiAgICAgICAgICAgIGRlcml2ZWRQdWJLZXk6IGJpcDMyXG4gICAgICAgICAgICAgIC5mcm9tQmFzZTU4KG5ld0FkbWluRWNkaEtleS54cHViKVxuICAgICAgICAgICAgICAuZGVyaXZlUGF0aChuZXdBZG1pbkRlcml2YXRpb25QYXRoKVxuICAgICAgICAgICAgICAucHVibGljS2V5LnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVudENoYWxsZW5nZVdpdGhWZXJpZmllcnMsXG4gICAgICAgICAgYml0Z29DaGFsbGVuZ2VXaXRoVmVyaWZpZXIsXG4gICAgICAgICAgYml0Z29DaGFsbGVuZ2VXaXRoVmVyaWZpZXJcbiAgICAgICAgKVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnQ2Fubm90IHJlLXNpZ24uIFRoZSBFbnRlcnByaXNlIFRTUyBjb25maWcgd2FzIHNpZ25lZCBieSBhbm90aGVyIHVzZXIuJyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=