PHP WebShell
Текущая директория: /opt/BitGoJS/modules/account-lib/dist/test/unit/coin/baseCoin
Просмотр файла: transactionBuilder.js
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const sinon_1 = __importDefault(require("sinon"));
const assert_1 = __importDefault(require("assert"));
const should_1 = __importDefault(require("should"));
const testTransactionBuilder_1 = require("../../../resources/testTransactionBuilder");
const testTransaction_1 = require("../../../resources/testTransaction");
describe('Transaction builder', () => {
let txBuilder;
let sandbox;
beforeEach(() => {
sandbox = sinon_1.default.createSandbox();
txBuilder = new testTransactionBuilder_1.TestTransactionBuilder();
});
afterEach(() => {
sandbox.restore();
});
it('should sign a transaction that is valid', () => {
const testTx = sinon_1.default.createStubInstance(testTransaction_1.TestTransaction);
testTx.canSign.returns(true);
const validateKey = sinon_1.default.spy(txBuilder, 'validateKey');
txBuilder.from(testTx);
txBuilder.sign({ key: 'validKey' });
sandbox.assert.calledOnce(validateKey);
});
it('should sign a transaction with an invalid signature', () => {
const testTx = sinon_1.default.createStubInstance(testTransaction_1.TestTransaction);
testTx.canSign.returns(false);
const validateKey = sinon_1.default.spy(txBuilder, 'validateKey');
txBuilder.from(testTx);
assert_1.default.throws(() => txBuilder.sign({ key: 'invalidKey' }));
sandbox.assert.calledOnce(validateKey);
});
it('should parse a valid transaction', () => {
const testTx = sinon_1.default.createStubInstance(testTransaction_1.TestTransaction);
testTx.canSign.returns(true);
const validateRawTransaction = sinon_1.default.spy(txBuilder, 'validateRawTransaction');
const fromImplementation = sinon_1.default.spy(txBuilder, 'fromImplementation');
txBuilder.from(testTx);
sandbox.assert.calledOnce(validateRawTransaction);
sandbox.assert.calledOnce(fromImplementation);
});
it('should build a valid transaction', () => {
const testTx = sinon_1.default.createStubInstance(testTransaction_1.TestTransaction);
testTx.canSign.returns(true);
const validateTransaction = sinon_1.default.spy(txBuilder, 'validateTransaction');
const buildImplementation = sinon_1.default.spy(txBuilder, 'buildImplementation');
txBuilder.from(testTx);
txBuilder.build();
sandbox.assert.calledOnce(validateTransaction);
sandbox.assert.calledOnce(buildImplementation);
});
it('should verify validity window params', () => {
const testTx = sinon_1.default.createStubInstance(testTransaction_1.TestTransaction);
testTx.canSign.returns(true);
txBuilder.from(testTx);
txBuilder.build();
let validityWindow;
let params = {};
(0, should_1.default)(() => txBuilder.getValidityWindow(params)).throwError('Unit parameter must be specified as blockheight or timestamp');
params = {
unit: 'wrongUnit',
};
(0, should_1.default)(() => txBuilder.getValidityWindow(params)).throwError('Unit parameter must be specified as blockheight or timestamp');
params = {
firstValid: 10,
lastValid: 23,
minDuration: 10,
maxDuration: 20,
unit: '',
};
(0, should_1.default)(() => txBuilder.getValidityWindow(params)).throwError('Unit parameter must be specified as blockheight or timestamp');
params = {
firstValid: 10,
lastValid: 23,
minDuration: 10,
maxDuration: 5,
unit: 'blockheight',
};
(0, should_1.default)(() => txBuilder.getValidityWindow(params)).throwError(`Expected maxDuration (5) to be grather than minDuration (10)`);
params = {
firstValid: 10,
lastValid: 11,
minDuration: 10,
maxDuration: 20,
unit: 'timestamp',
};
validityWindow = txBuilder.getValidityWindow(params);
validityWindow.should.have.properties(['firstValid', 'lastValid', 'minDuration', 'maxDuration', 'unit']);
validityWindow.firstValid.should.be.equal(10);
validityWindow.lastValid.should.be.equal(30);
validityWindow.minDuration.should.be.equal(10);
validityWindow.maxDuration.should.be.equal(20);
validityWindow.unit.should.be.equal('timestamp');
params = {
firstValid: 10,
lastValid: 23,
minDuration: 10,
maxDuration: 11,
unit: 'blockheight',
};
validityWindow = txBuilder.getValidityWindow(params);
validityWindow.should.have.properties(['firstValid', 'lastValid', 'minDuration', 'maxDuration', 'unit']);
validityWindow.firstValid.should.be.equal(10);
validityWindow.lastValid.should.be.equal(21);
validityWindow.minDuration.should.be.equal(10);
validityWindow.maxDuration.should.be.equal(11);
validityWindow.unit.should.be.equal('blockheight');
params = {
unit: 'timestamp',
};
const dateNow = Date.now();
validityWindow = txBuilder.getValidityWindow(params);
validityWindow.should.have.properties(['firstValid', 'lastValid', 'minDuration', 'maxDuration', 'unit']);
validityWindow.firstValid.should.be.greaterThanOrEqual(dateNow);
validityWindow.lastValid.should.be.equal(validityWindow.firstValid + 31536000000);
validityWindow.minDuration.should.be.equal(0);
validityWindow.maxDuration.should.be.equal(31536000000);
validityWindow.unit.should.be.equal('timestamp');
params = {
unit: 'blockheight',
};
validityWindow = txBuilder.getValidityWindow(params);
validityWindow.should.have.properties(['firstValid', 'lastValid', 'minDuration', 'maxDuration', 'unit']);
validityWindow.firstValid.should.be.equal(0);
validityWindow.lastValid.should.be.equal(1000000);
validityWindow.minDuration.should.be.equal(0);
validityWindow.maxDuration.should.be.equal(1000000);
validityWindow.unit.should.be.equal('blockheight');
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2NvaW4vYmFzZUNvaW4vdHJhbnNhY3Rpb25CdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsa0RBQTBCO0FBQzFCLG9EQUE0QjtBQUM1QixvREFBNEI7QUFDNUIsc0ZBQW1GO0FBQ25GLHdFQUFxRTtBQUVyRSxRQUFRLENBQUMscUJBQXFCLEVBQUUsR0FBRyxFQUFFO0lBQ25DLElBQUksU0FBUyxDQUFDO0lBQ2QsSUFBSSxPQUEyQixDQUFDO0lBRWhDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCxPQUFPLEdBQUcsZUFBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ2hDLFNBQVMsR0FBRyxJQUFJLCtDQUFzQixFQUFFLENBQUM7SUFDM0MsQ0FBQyxDQUFDLENBQUM7SUFFSCxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2IsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3BCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHlDQUF5QyxFQUFFLEdBQUcsRUFBRTtRQUNqRCxNQUFNLE1BQU0sR0FBRyxlQUFLLENBQUMsa0JBQWtCLENBQUMsaUNBQWUsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLE1BQU0sV0FBVyxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBRXhELFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkIsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBRXBDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3pDLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHFEQUFxRCxFQUFFLEdBQUcsRUFBRTtRQUM3RCxNQUFNLE1BQU0sR0FBRyxlQUFLLENBQUMsa0JBQWtCLENBQUMsaUNBQWUsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlCLE1BQU0sV0FBVyxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBRXhELFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkIsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFM0QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDekMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsa0NBQWtDLEVBQUUsR0FBRyxFQUFFO1FBQzFDLE1BQU0sTUFBTSxHQUFHLGVBQUssQ0FBQyxrQkFBa0IsQ0FBQyxpQ0FBZSxDQUFDLENBQUM7UUFDekQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0IsTUFBTSxzQkFBc0IsR0FBRyxlQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO1FBQzlFLE1BQU0sa0JBQWtCLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztRQUV0RSxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXZCLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDbEQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNoRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxrQ0FBa0MsRUFBRSxHQUFHLEVBQUU7UUFDMUMsTUFBTSxNQUFNLEdBQUcsZUFBSyxDQUFDLGtCQUFrQixDQUFDLGlDQUFlLENBQUMsQ0FBQztRQUN6RCxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QixNQUFNLG1CQUFtQixHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFDeEUsTUFBTSxtQkFBbUIsR0FBRyxlQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBRXhFLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkIsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRWxCLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDL0MsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNqRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxzQ0FBc0MsRUFBRSxHQUFHLEVBQUU7UUFDOUMsTUFBTSxNQUFNLEdBQUcsZUFBSyxDQUFDLGtCQUFrQixDQUFDLGlDQUFlLENBQUMsQ0FBQztRQUN6RCxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QixTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZCLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNsQixJQUFJLGNBQWMsQ0FBQztRQUVuQixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBQSxnQkFBTSxFQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FDMUQsOERBQThELENBQy9ELENBQUM7UUFFRixNQUFNLEdBQUc7WUFDUCxJQUFJLEVBQUUsV0FBVztTQUNsQixDQUFDO1FBQ0YsSUFBQSxnQkFBTSxFQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FDMUQsOERBQThELENBQy9ELENBQUM7UUFFRixNQUFNLEdBQUc7WUFDUCxVQUFVLEVBQUUsRUFBRTtZQUNkLFNBQVMsRUFBRSxFQUFFO1lBQ2IsV0FBVyxFQUFFLEVBQUU7WUFDZixXQUFXLEVBQUUsRUFBRTtZQUNmLElBQUksRUFBRSxFQUFFO1NBQ1QsQ0FBQztRQUNGLElBQUEsZ0JBQU0sRUFBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQzFELDhEQUE4RCxDQUMvRCxDQUFDO1FBRUYsTUFBTSxHQUFHO1lBQ1AsVUFBVSxFQUFFLEVBQUU7WUFDZCxTQUFTLEVBQUUsRUFBRTtZQUNiLFdBQVcsRUFBRSxFQUFFO1lBQ2YsV0FBVyxFQUFFLENBQUM7WUFDZCxJQUFJLEVBQUUsYUFBYTtTQUNwQixDQUFDO1FBQ0YsSUFBQSxnQkFBTSxFQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FDMUQsOERBQThELENBQy9ELENBQUM7UUFFRixNQUFNLEdBQUc7WUFDUCxVQUFVLEVBQUUsRUFBRTtZQUNkLFNBQVMsRUFBRSxFQUFFO1lBQ2IsV0FBVyxFQUFFLEVBQUU7WUFDZixXQUFXLEVBQUUsRUFBRTtZQUNmLElBQUksRUFBRSxXQUFXO1NBQ2xCLENBQUM7UUFDRixjQUFjLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JELGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3pHLGNBQWMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM3QyxjQUFjLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLGNBQWMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0MsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVqRCxNQUFNLEdBQUc7WUFDUCxVQUFVLEVBQUUsRUFBRTtZQUNkLFNBQVMsRUFBRSxFQUFFO1lBQ2IsV0FBVyxFQUFFLEVBQUU7WUFDZixXQUFXLEVBQUUsRUFBRTtZQUNmLElBQUksRUFBRSxhQUFhO1NBQ3BCLENBQUM7UUFDRixjQUFjLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JELGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3pHLGNBQWMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM3QyxjQUFjLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLGNBQWMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0MsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUVuRCxNQUFNLEdBQUc7WUFDUCxJQUFJLEVBQUUsV0FBVztTQUNsQixDQUFDO1FBQ0YsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzNCLGNBQWMsR0FBRyxTQUFTLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckQsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDekcsY0FBYyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hFLGNBQWMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUMsQ0FBQztRQUNsRixjQUFjLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlDLGNBQWMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDeEQsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVqRCxNQUFNLEdBQUc7WUFDUCxJQUFJLEVBQUUsYUFBYTtTQUNwQixDQUFDO1FBQ0YsY0FBYyxHQUFHLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRCxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUN6RyxjQUFjLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdDLGNBQWMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEQsY0FBYyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QyxjQUFjLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BELGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDckQsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyBUZXN0VHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vcmVzb3VyY2VzL3Rlc3RUcmFuc2FjdGlvbkJ1aWxkZXInO1xuaW1wb3J0IHsgVGVzdFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vcmVzb3VyY2VzL3Rlc3RUcmFuc2FjdGlvbic7XG5cbmRlc2NyaWJlKCdUcmFuc2FjdGlvbiBidWlsZGVyJywgKCkgPT4ge1xuICBsZXQgdHhCdWlsZGVyO1xuICBsZXQgc2FuZGJveDogc2lub24uU2lub25TYW5kYm94O1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIHNhbmRib3ggPSBzaW5vbi5jcmVhdGVTYW5kYm94KCk7XG4gICAgdHhCdWlsZGVyID0gbmV3IFRlc3RUcmFuc2FjdGlvbkJ1aWxkZXIoKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBzYW5kYm94LnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBzaWduIGEgdHJhbnNhY3Rpb24gdGhhdCBpcyB2YWxpZCcsICgpID0+IHtcbiAgICBjb25zdCB0ZXN0VHggPSBzaW5vbi5jcmVhdGVTdHViSW5zdGFuY2UoVGVzdFRyYW5zYWN0aW9uKTtcbiAgICB0ZXN0VHguY2FuU2lnbi5yZXR1cm5zKHRydWUpO1xuICAgIGNvbnN0IHZhbGlkYXRlS2V5ID0gc2lub24uc3B5KHR4QnVpbGRlciwgJ3ZhbGlkYXRlS2V5Jyk7XG5cbiAgICB0eEJ1aWxkZXIuZnJvbSh0ZXN0VHgpO1xuICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiAndmFsaWRLZXknIH0pO1xuXG4gICAgc2FuZGJveC5hc3NlcnQuY2FsbGVkT25jZSh2YWxpZGF0ZUtleSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgc2lnbiBhIHRyYW5zYWN0aW9uIHdpdGggYW4gaW52YWxpZCBzaWduYXR1cmUnLCAoKSA9PiB7XG4gICAgY29uc3QgdGVzdFR4ID0gc2lub24uY3JlYXRlU3R1Ykluc3RhbmNlKFRlc3RUcmFuc2FjdGlvbik7XG4gICAgdGVzdFR4LmNhblNpZ24ucmV0dXJucyhmYWxzZSk7XG4gICAgY29uc3QgdmFsaWRhdGVLZXkgPSBzaW5vbi5zcHkodHhCdWlsZGVyLCAndmFsaWRhdGVLZXknKTtcblxuICAgIHR4QnVpbGRlci5mcm9tKHRlc3RUeCk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIuc2lnbih7IGtleTogJ2ludmFsaWRLZXknIH0pKTtcblxuICAgIHNhbmRib3guYXNzZXJ0LmNhbGxlZE9uY2UodmFsaWRhdGVLZXkpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHBhcnNlIGEgdmFsaWQgdHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgY29uc3QgdGVzdFR4ID0gc2lub24uY3JlYXRlU3R1Ykluc3RhbmNlKFRlc3RUcmFuc2FjdGlvbik7XG4gICAgdGVzdFR4LmNhblNpZ24ucmV0dXJucyh0cnVlKTtcbiAgICBjb25zdCB2YWxpZGF0ZVJhd1RyYW5zYWN0aW9uID0gc2lub24uc3B5KHR4QnVpbGRlciwgJ3ZhbGlkYXRlUmF3VHJhbnNhY3Rpb24nKTtcbiAgICBjb25zdCBmcm9tSW1wbGVtZW50YXRpb24gPSBzaW5vbi5zcHkodHhCdWlsZGVyLCAnZnJvbUltcGxlbWVudGF0aW9uJyk7XG5cbiAgICB0eEJ1aWxkZXIuZnJvbSh0ZXN0VHgpO1xuXG4gICAgc2FuZGJveC5hc3NlcnQuY2FsbGVkT25jZSh2YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKTtcbiAgICBzYW5kYm94LmFzc2VydC5jYWxsZWRPbmNlKGZyb21JbXBsZW1lbnRhdGlvbik7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYnVpbGQgYSB2YWxpZCB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICBjb25zdCB0ZXN0VHggPSBzaW5vbi5jcmVhdGVTdHViSW5zdGFuY2UoVGVzdFRyYW5zYWN0aW9uKTtcbiAgICB0ZXN0VHguY2FuU2lnbi5yZXR1cm5zKHRydWUpO1xuICAgIGNvbnN0IHZhbGlkYXRlVHJhbnNhY3Rpb24gPSBzaW5vbi5zcHkodHhCdWlsZGVyLCAndmFsaWRhdGVUcmFuc2FjdGlvbicpO1xuICAgIGNvbnN0IGJ1aWxkSW1wbGVtZW50YXRpb24gPSBzaW5vbi5zcHkodHhCdWlsZGVyLCAnYnVpbGRJbXBsZW1lbnRhdGlvbicpO1xuXG4gICAgdHhCdWlsZGVyLmZyb20odGVzdFR4KTtcbiAgICB0eEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgIHNhbmRib3guYXNzZXJ0LmNhbGxlZE9uY2UodmFsaWRhdGVUcmFuc2FjdGlvbik7XG4gICAgc2FuZGJveC5hc3NlcnQuY2FsbGVkT25jZShidWlsZEltcGxlbWVudGF0aW9uKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB2ZXJpZnkgdmFsaWRpdHkgd2luZG93IHBhcmFtcycsICgpID0+IHtcbiAgICBjb25zdCB0ZXN0VHggPSBzaW5vbi5jcmVhdGVTdHViSW5zdGFuY2UoVGVzdFRyYW5zYWN0aW9uKTtcbiAgICB0ZXN0VHguY2FuU2lnbi5yZXR1cm5zKHRydWUpO1xuICAgIHR4QnVpbGRlci5mcm9tKHRlc3RUeCk7XG4gICAgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgbGV0IHZhbGlkaXR5V2luZG93O1xuXG4gICAgbGV0IHBhcmFtcyA9IHt9O1xuICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuZ2V0VmFsaWRpdHlXaW5kb3cocGFyYW1zKSkudGhyb3dFcnJvcihcbiAgICAgICdVbml0IHBhcmFtZXRlciBtdXN0IGJlIHNwZWNpZmllZCBhcyBibG9ja2hlaWdodCBvciB0aW1lc3RhbXAnLFxuICAgICk7XG5cbiAgICBwYXJhbXMgPSB7XG4gICAgICB1bml0OiAnd3JvbmdVbml0JyxcbiAgICB9O1xuICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuZ2V0VmFsaWRpdHlXaW5kb3cocGFyYW1zKSkudGhyb3dFcnJvcihcbiAgICAgICdVbml0IHBhcmFtZXRlciBtdXN0IGJlIHNwZWNpZmllZCBhcyBibG9ja2hlaWdodCBvciB0aW1lc3RhbXAnLFxuICAgICk7XG5cbiAgICBwYXJhbXMgPSB7XG4gICAgICBmaXJzdFZhbGlkOiAxMCxcbiAgICAgIGxhc3RWYWxpZDogMjMsXG4gICAgICBtaW5EdXJhdGlvbjogMTAsXG4gICAgICBtYXhEdXJhdGlvbjogMjAsXG4gICAgICB1bml0OiAnJyxcbiAgICB9O1xuICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuZ2V0VmFsaWRpdHlXaW5kb3cocGFyYW1zKSkudGhyb3dFcnJvcihcbiAgICAgICdVbml0IHBhcmFtZXRlciBtdXN0IGJlIHNwZWNpZmllZCBhcyBibG9ja2hlaWdodCBvciB0aW1lc3RhbXAnLFxuICAgICk7XG5cbiAgICBwYXJhbXMgPSB7XG4gICAgICBmaXJzdFZhbGlkOiAxMCxcbiAgICAgIGxhc3RWYWxpZDogMjMsXG4gICAgICBtaW5EdXJhdGlvbjogMTAsXG4gICAgICBtYXhEdXJhdGlvbjogNSxcbiAgICAgIHVuaXQ6ICdibG9ja2hlaWdodCcsXG4gICAgfTtcbiAgICBzaG91bGQoKCkgPT4gdHhCdWlsZGVyLmdldFZhbGlkaXR5V2luZG93KHBhcmFtcykpLnRocm93RXJyb3IoXG4gICAgICBgRXhwZWN0ZWQgbWF4RHVyYXRpb24gKDUpIHRvIGJlIGdyYXRoZXIgdGhhbiBtaW5EdXJhdGlvbiAoMTApYCxcbiAgICApO1xuXG4gICAgcGFyYW1zID0ge1xuICAgICAgZmlyc3RWYWxpZDogMTAsXG4gICAgICBsYXN0VmFsaWQ6IDExLFxuICAgICAgbWluRHVyYXRpb246IDEwLFxuICAgICAgbWF4RHVyYXRpb246IDIwLFxuICAgICAgdW5pdDogJ3RpbWVzdGFtcCcsXG4gICAgfTtcbiAgICB2YWxpZGl0eVdpbmRvdyA9IHR4QnVpbGRlci5nZXRWYWxpZGl0eVdpbmRvdyhwYXJhbXMpO1xuICAgIHZhbGlkaXR5V2luZG93LnNob3VsZC5oYXZlLnByb3BlcnRpZXMoWydmaXJzdFZhbGlkJywgJ2xhc3RWYWxpZCcsICdtaW5EdXJhdGlvbicsICdtYXhEdXJhdGlvbicsICd1bml0J10pO1xuICAgIHZhbGlkaXR5V2luZG93LmZpcnN0VmFsaWQuc2hvdWxkLmJlLmVxdWFsKDEwKTtcbiAgICB2YWxpZGl0eVdpbmRvdy5sYXN0VmFsaWQuc2hvdWxkLmJlLmVxdWFsKDMwKTtcbiAgICB2YWxpZGl0eVdpbmRvdy5taW5EdXJhdGlvbi5zaG91bGQuYmUuZXF1YWwoMTApO1xuICAgIHZhbGlkaXR5V2luZG93Lm1heER1cmF0aW9uLnNob3VsZC5iZS5lcXVhbCgyMCk7XG4gICAgdmFsaWRpdHlXaW5kb3cudW5pdC5zaG91bGQuYmUuZXF1YWwoJ3RpbWVzdGFtcCcpO1xuXG4gICAgcGFyYW1zID0ge1xuICAgICAgZmlyc3RWYWxpZDogMTAsXG4gICAgICBsYXN0VmFsaWQ6IDIzLFxuICAgICAgbWluRHVyYXRpb246IDEwLFxuICAgICAgbWF4RHVyYXRpb246IDExLFxuICAgICAgdW5pdDogJ2Jsb2NraGVpZ2h0JyxcbiAgICB9O1xuICAgIHZhbGlkaXR5V2luZG93ID0gdHhCdWlsZGVyLmdldFZhbGlkaXR5V2luZG93KHBhcmFtcyk7XG4gICAgdmFsaWRpdHlXaW5kb3cuc2hvdWxkLmhhdmUucHJvcGVydGllcyhbJ2ZpcnN0VmFsaWQnLCAnbGFzdFZhbGlkJywgJ21pbkR1cmF0aW9uJywgJ21heER1cmF0aW9uJywgJ3VuaXQnXSk7XG4gICAgdmFsaWRpdHlXaW5kb3cuZmlyc3RWYWxpZC5zaG91bGQuYmUuZXF1YWwoMTApO1xuICAgIHZhbGlkaXR5V2luZG93Lmxhc3RWYWxpZC5zaG91bGQuYmUuZXF1YWwoMjEpO1xuICAgIHZhbGlkaXR5V2luZG93Lm1pbkR1cmF0aW9uLnNob3VsZC5iZS5lcXVhbCgxMCk7XG4gICAgdmFsaWRpdHlXaW5kb3cubWF4RHVyYXRpb24uc2hvdWxkLmJlLmVxdWFsKDExKTtcbiAgICB2YWxpZGl0eVdpbmRvdy51bml0LnNob3VsZC5iZS5lcXVhbCgnYmxvY2toZWlnaHQnKTtcblxuICAgIHBhcmFtcyA9IHtcbiAgICAgIHVuaXQ6ICd0aW1lc3RhbXAnLFxuICAgIH07XG4gICAgY29uc3QgZGF0ZU5vdyA9IERhdGUubm93KCk7XG4gICAgdmFsaWRpdHlXaW5kb3cgPSB0eEJ1aWxkZXIuZ2V0VmFsaWRpdHlXaW5kb3cocGFyYW1zKTtcbiAgICB2YWxpZGl0eVdpbmRvdy5zaG91bGQuaGF2ZS5wcm9wZXJ0aWVzKFsnZmlyc3RWYWxpZCcsICdsYXN0VmFsaWQnLCAnbWluRHVyYXRpb24nLCAnbWF4RHVyYXRpb24nLCAndW5pdCddKTtcbiAgICB2YWxpZGl0eVdpbmRvdy5maXJzdFZhbGlkLnNob3VsZC5iZS5ncmVhdGVyVGhhbk9yRXF1YWwoZGF0ZU5vdyk7XG4gICAgdmFsaWRpdHlXaW5kb3cubGFzdFZhbGlkLnNob3VsZC5iZS5lcXVhbCh2YWxpZGl0eVdpbmRvdy5maXJzdFZhbGlkICsgMzE1MzYwMDAwMDApO1xuICAgIHZhbGlkaXR5V2luZG93Lm1pbkR1cmF0aW9uLnNob3VsZC5iZS5lcXVhbCgwKTtcbiAgICB2YWxpZGl0eVdpbmRvdy5tYXhEdXJhdGlvbi5zaG91bGQuYmUuZXF1YWwoMzE1MzYwMDAwMDApO1xuICAgIHZhbGlkaXR5V2luZG93LnVuaXQuc2hvdWxkLmJlLmVxdWFsKCd0aW1lc3RhbXAnKTtcblxuICAgIHBhcmFtcyA9IHtcbiAgICAgIHVuaXQ6ICdibG9ja2hlaWdodCcsXG4gICAgfTtcbiAgICB2YWxpZGl0eVdpbmRvdyA9IHR4QnVpbGRlci5nZXRWYWxpZGl0eVdpbmRvdyhwYXJhbXMpO1xuICAgIHZhbGlkaXR5V2luZG93LnNob3VsZC5oYXZlLnByb3BlcnRpZXMoWydmaXJzdFZhbGlkJywgJ2xhc3RWYWxpZCcsICdtaW5EdXJhdGlvbicsICdtYXhEdXJhdGlvbicsICd1bml0J10pO1xuICAgIHZhbGlkaXR5V2luZG93LmZpcnN0VmFsaWQuc2hvdWxkLmJlLmVxdWFsKDApO1xuICAgIHZhbGlkaXR5V2luZG93Lmxhc3RWYWxpZC5zaG91bGQuYmUuZXF1YWwoMTAwMDAwMCk7XG4gICAgdmFsaWRpdHlXaW5kb3cubWluRHVyYXRpb24uc2hvdWxkLmJlLmVxdWFsKDApO1xuICAgIHZhbGlkaXR5V2luZG93Lm1heER1cmF0aW9uLnNob3VsZC5iZS5lcXVhbCgxMDAwMDAwKTtcbiAgICB2YWxpZGl0eVdpbmRvdy51bml0LnNob3VsZC5iZS5lcXVhbCgnYmxvY2toZWlnaHQnKTtcbiAgfSk7XG59KTtcbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!