PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-coin-cspr/dist/test/unit/lib/transactionBuilder
Просмотр файла: undelegateBuilder.js
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const assert_1 = __importDefault(require("assert"));
const should = __importStar(require("should"));
const lib_1 = require("../../../../src/lib");
const constants_1 = require("../../../../src/lib/constants");
const testData = __importStar(require("../../../fixtures/resources"));
const sdk_core_1 = require("@bitgo/sdk-core");
const statics_1 = require("@bitgo/statics");
describe('CSPR Undelegate Builder', () => {
const factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tcspr'));
const sender = testData.ACCOUNT_1;
const owner1Address = new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress();
const validator = constants_1.DELEGATE_VALIDATOR_ACCOUNT;
const initUndelegateTxBuilder = () => {
const builder = factory.getUndelegateBuilder();
return builder;
};
const addFeeToBuilder = (builder, gasLimit, gasPrice) => {
builder.fee({ gasLimit: gasLimit, gasPrice: gasPrice });
return builder;
};
const addSourceToBuilder = (builder, source) => {
builder.source({ address: new lib_1.KeyPair({ pub: source.publicKey }).getAddress() });
return builder;
};
const addValidatorToBuilder = (builder, validator) => {
builder.validator(validator);
return builder;
};
const addAmountToBuilder = (builder, amount) => {
builder.amount(amount);
return builder;
};
const initUnsignedUndelegateTxBuilder = () => {
let builder = initUndelegateTxBuilder();
builder = addFeeToBuilder(builder, testData.FEE.gasLimit, testData.FEE.gasPrice);
builder = addSourceToBuilder(builder, sender);
builder = addValidatorToBuilder(builder, validator);
builder = addAmountToBuilder(builder, '10');
return builder;
};
describe('should build ', () => {
it('an init valid undelegate transaction', async () => {
const txBuilder = initUnsignedUndelegateTxBuilder();
txBuilder.sign({ key: testData.ACCOUNT_1.privateKey });
txBuilder.sign({ key: testData.ACCOUNT_2.privateKey });
const tx = await txBuilder.build();
const txJson = tx.toJson();
should.deepEqual(txJson.fee, testData.FEE);
should.deepEqual(tx.signature.length, 2);
should.equal(txJson.from, owner1Address);
tx.type.should.equal(sdk_core_1.TransactionType.StakingUnlock);
});
it('an init valid undelegate transaction with an external signature', async () => {
const txBuilder = initUnsignedUndelegateTxBuilder();
txBuilder.sign({ key: testData.ACCOUNT_2.privateKey });
txBuilder.signature(testData.EXTERNAL_SIGNATURE.signature, new lib_1.KeyPair({ pub: testData.EXTERNAL_SIGNATURE.publicKey }));
const tx = await txBuilder.build();
const txJson = tx.toJson();
should.equal(txJson.from, owner1Address);
should.deepEqual(tx.signature.length, 2);
tx.type.should.equal(sdk_core_1.TransactionType.StakingUnlock);
});
it('an init undelegate transaction with external signature included twice', async () => {
const txBuilder = initUnsignedUndelegateTxBuilder();
txBuilder.signature(testData.EXTERNAL_SIGNATURE.signature, new lib_1.KeyPair({ pub: testData.EXTERNAL_SIGNATURE.publicKey }));
txBuilder.signature(testData.EXTERNAL_SIGNATURE.signature, new lib_1.KeyPair({ pub: testData.EXTERNAL_SIGNATURE.publicKey }));
const tx = await txBuilder.build();
const txJson = tx.toJson();
should.equal(txJson.from, owner1Address);
should.deepEqual(tx.signature.length, 1);
tx.type.should.equal(sdk_core_1.TransactionType.StakingUnlock);
});
it('an undelegate transaction with large amount', async function () {
const amount = '10000000000000000';
let txBuilder = initUnsignedUndelegateTxBuilder();
txBuilder = addAmountToBuilder(txBuilder, amount);
const tx = await txBuilder.build();
const txJson = tx.toJson();
txJson.amount.should.equal(amount);
});
});
describe('should fail to build', () => {
it('a undelegate transaction without fee', async () => {
let txBuilder = initUndelegateTxBuilder();
txBuilder = addSourceToBuilder(txBuilder, sender);
txBuilder = addValidatorToBuilder(txBuilder, validator);
txBuilder = addAmountToBuilder(txBuilder, '10');
await txBuilder.build().should.be.rejectedWith(testData.INVALID_TRANSACTION_MISSING_FEE);
});
it('a undelegate transaction without amount', async () => {
let txBuilder = initUndelegateTxBuilder();
txBuilder = addFeeToBuilder(txBuilder, testData.FEE.gasLimit, testData.FEE.gasPrice);
txBuilder = addSourceToBuilder(txBuilder, sender);
txBuilder = addValidatorToBuilder(txBuilder, validator);
await txBuilder.build().should.be.rejectedWith(testData.INVALID_TRANSACTION_MISSING_AMOUNT);
});
it('a undelegate transaction with invalid source', async () => {
let txBuilder = initUndelegateTxBuilder();
txBuilder = addFeeToBuilder(txBuilder, testData.FEE.gasLimit, testData.FEE.gasPrice);
txBuilder = addValidatorToBuilder(txBuilder, validator);
txBuilder = addAmountToBuilder(txBuilder, '10');
await txBuilder.build().should.be.rejectedWith(testData.INVALID_TRANSACTION_MISSING_SOURCE);
});
it('a undelegate transaction without validator', async () => {
let txBuilder = initUndelegateTxBuilder();
txBuilder = addFeeToBuilder(txBuilder, testData.FEE.gasLimit, testData.FEE.gasPrice);
txBuilder = addSourceToBuilder(txBuilder, sender);
txBuilder = addAmountToBuilder(txBuilder, '10');
const tx = await txBuilder.build();
const txJson = tx.toJson();
should.equal(txJson.from, owner1Address);
tx.type.should.equal(sdk_core_1.TransactionType.StakingUnlock);
should.equal(txJson.validator, constants_1.DELEGATE_VALIDATOR_ACCOUNT);
});
});
describe('should validate', () => {
const factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tcspr'));
it('an address', async () => {
const txBuilder = factory.getUndelegateBuilder();
txBuilder.validateAddress({ address: testData.VALID_ADDRESS });
assert_1.default.throws(() => txBuilder.validateAddress({ address: testData.INVALID_ADDRESS }), new RegExp('Invalid address ' + testData.INVALID_ADDRESS));
});
it('a validator address', async () => {
let txBuilder = initUndelegateTxBuilder();
txBuilder = addFeeToBuilder(txBuilder, testData.FEE.gasLimit, testData.FEE.gasPrice);
txBuilder = addSourceToBuilder(txBuilder, sender);
txBuilder = addAmountToBuilder(txBuilder, '10');
assert_1.default.throws(() => txBuilder.validator('abc'), /Invalid address/);
});
it('fee value should be greater than zero', () => {
const txBuilder = factory.getUndelegateBuilder();
assert_1.default.throws(() => txBuilder.fee({ gasLimit: '-10' }));
should.doesNotThrow(() => txBuilder.fee(testData.FEE));
});
it('amount value should be greater than zero', () => {
const txBuilder = factory.getUndelegateBuilder();
assert_1.default.throws(() => txBuilder.amount('-1'));
should.doesNotThrow(() => txBuilder.amount('1'));
});
it('a private key', () => {
const txBuilder = factory.getUndelegateBuilder();
assert_1.default.throws(() => txBuilder.validateKey({ key: 'abc' }), /Unsupported private key/);
should.doesNotThrow(() => txBuilder.validateKey({ key: testData.ACCOUNT_1.privateKey }));
});
it('a length of signers', () => {
const txBuilder = initUnsignedUndelegateTxBuilder();
should.doesNotThrow(() => txBuilder.sign({ key: testData.ACCOUNT_1.privateKey }));
should.doesNotThrow(() => txBuilder.sign({ key: testData.ACCOUNT_2.privateKey }));
should.doesNotThrow(() => txBuilder.sign({ key: testData.ACCOUNT_3.privateKey }));
assert_1.default.throws(() => txBuilder.sign({ key: testData.ACCOUNT_4.privateKey }), new RegExp('A maximum of 3 can sign the transaction.'));
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5kZWxlZ2F0ZUJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvbGliL3RyYW5zYWN0aW9uQnVpbGRlci91bmRlbGVnYXRlQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QiwrQ0FBaUM7QUFDakMsNkNBQXlFO0FBQ3pFLDZEQUEyRTtBQUMzRSxzRUFBd0Q7QUFDeEQsOENBQWtEO0FBRWxELDRDQUF1QztBQUV2QyxRQUFRLENBQUMseUJBQXlCLEVBQUUsR0FBRyxFQUFFO0lBQ3ZDLE1BQU0sT0FBTyxHQUFHLElBQUksK0JBQXlCLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUM7SUFDbEMsTUFBTSxhQUFhLEdBQUcsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3RGLE1BQU0sU0FBUyxHQUFHLHNDQUEwQixDQUFDO0lBRTdDLE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxFQUFFO1FBQ25DLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQy9DLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUMsQ0FBQztJQUVGLE1BQU0sZUFBZSxHQUFHLENBQUMsT0FBMEIsRUFBRSxRQUFnQixFQUFFLFFBQWdCLEVBQUUsRUFBRTtRQUN6RixPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN4RCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDLENBQUM7SUFFRixNQUFNLGtC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Q0FDWCxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUMsRUFDNUQsSUFBSSxNQUFNLENBQUMsMENBQTBDLENBQUMsQ0FDdkQsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCAqIGFzIHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgS2V5UGFpciwgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9saWInO1xuaW1wb3J0IHsgREVMRUdBVEVfVkFMSURBVE9SX0FDQ09VTlQgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvbGliL2NvbnN0YW50cyc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi8uLi8uLi9maXh0dXJlcy9yZXNvdXJjZXMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IFVuZGVsZWdhdGVCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL2xpYi91bmRlbGVnYXRlQnVpbGRlcic7XG5pbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcblxuZGVzY3JpYmUoJ0NTUFIgVW5kZWxlZ2F0ZSBCdWlsZGVyJywgKCkgPT4ge1xuICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0Y3NwcicpKTtcbiAgY29uc3Qgc2VuZGVyID0gdGVzdERhdGEuQUNDT1VOVF8xO1xuICBjb25zdCBvd25lcjFBZGRyZXNzID0gbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMS5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpO1xuICBjb25zdCB2YWxpZGF0b3IgPSBERUxFR0FURV9WQUxJREFUT1JfQUNDT1VOVDtcblxuICBjb25zdCBpbml0VW5kZWxlZ2F0ZVR4QnVpbGRlciA9ICgpID0+IHtcbiAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRVbmRlbGVnYXRlQnVpbGRlcigpO1xuICAgIHJldHVybiBidWlsZGVyO1xuICB9O1xuXG4gIGNvbnN0IGFkZEZlZVRvQnVpbGRlciA9IChidWlsZGVyOiBVbmRlbGVnYXRlQnVpbGRlciwgZ2FzTGltaXQ6IHN0cmluZywgZ2FzUHJpY2U6IHN0cmluZykgPT4ge1xuICAgIGJ1aWxkZXIuZmVlKHsgZ2FzTGltaXQ6IGdhc0xpbWl0LCBnYXNQcmljZTogZ2FzUHJpY2UgfSk7XG4gICAgcmV0dXJuIGJ1aWxkZXI7XG4gIH07XG5cbiAgY29uc3QgYWRkU291cmNlVG9CdWlsZGVyID0gKGJ1aWxkZXI6IFVuZGVsZWdhdGVCdWlsZGVyLCBzb3VyY2UpID0+IHtcbiAgICBidWlsZGVyLnNvdXJjZSh7IGFkZHJlc3M6IG5ldyBLZXlQYWlyKHsgcHViOiBzb3VyY2UucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKSB9KTtcbiAgICByZXR1cm4gYnVpbGRlcjtcbiAgfTtcblxuICBjb25zdCBhZGRWYWxpZGF0b3JUb0J1aWxkZXIgPSAoYnVpbGRlcjogVW5kZWxlZ2F0ZUJ1aWxkZXIsIHZhbGlkYXRvcjogc3RyaW5nKSA9PiB7XG4gICAgYnVpbGRlci52YWxpZGF0b3IodmFsaWRhdG9yKTtcbiAgICByZXR1cm4gYnVpbGRlcjtcbiAgfTtcblxuICBjb25zdCBhZGRBbW91bnRUb0J1aWxkZXIgPSAoYnVpbGRlcjogVW5kZWxlZ2F0ZUJ1aWxkZXIsIGFtb3VudDogc3RyaW5nKSA9PiB7XG4gICAgYnVpbGRlci5hbW91bnQoYW1vdW50KTtcbiAgICByZXR1cm4gYnVpbGRlcjtcbiAgfTtcblxuICBjb25zdCBpbml0VW5zaWduZWRVbmRlbGVnYXRlVHhCdWlsZGVyID0gKCkgPT4ge1xuICAgIGxldCBidWlsZGVyID0gaW5pdFVuZGVsZWdhdGVUeEJ1aWxkZXIoKTtcbiAgICBidWlsZGVyID0gYWRkRmVlVG9CdWlsZGVyKGJ1aWxkZXIsIHRlc3REYXRhLkZFRS5nYXNMaW1pdCwgdGVzdERhdGEuRkVFLmdhc1ByaWNlKTtcbiAgICBidWlsZGVyID0gYWRkU291cmNlVG9CdWlsZGVyKGJ1aWxkZXIsIHNlbmRlcik7XG4gICAgYnVpbGRlciA9IGFkZFZhbGlkYXRvclRvQnVpbGRlcihidWlsZGVyLCB2YWxpZGF0b3IpO1xuICAgIGJ1aWxkZXIgPSBhZGRBbW91bnRUb0J1aWxkZXIoYnVpbGRlciwgJzEwJyk7XG4gICAgcmV0dXJuIGJ1aWxkZXI7XG4gIH07XG5cbiAgZGVzY3JpYmUoJ3Nob3VsZCBidWlsZCAnLCAoKSA9PiB7XG4gICAgaXQoJ2FuIGluaXQgdmFsaWQgdW5kZWxlZ2F0ZSB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGluaXRVbnNpZ25lZFVuZGVsZWdhdGVUeEJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BQ0NPVU5UXzEucHJpdmF0ZUtleSB9KTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BQ0NPVU5UXzIucHJpdmF0ZUtleSB9KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmZlZSwgdGVzdERhdGEuRkVFKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHguc2lnbmF0dXJlLmxlbmd0aCwgMik7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLmZyb20sIG93bmVyMUFkZHJlc3MpO1xuICAgICAgdHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdVbmxvY2spO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FuIGluaXQgdmFsaWQgdW5kZWxlZ2F0ZSB0cmFuc2FjdGlvbiB3aXRoIGFuIGV4dGVybmFsIHNpZ25hdHVyZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGluaXRVbnNpZ25lZFVuZGVsZWdhdGVUeEJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BQ0NPVU5UXzIucHJpdmF0ZUtleSB9KTtcbiAgICAgIHR4QnVpbGRlci5zaWduYXR1cmUoXG4gICAgICAgIHRlc3REYXRhLkVYVEVSTkFMX1NJR05BVFVSRS5zaWduYXR1cmUsXG4gICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5FWFRFUk5BTF9TSUdOQVRVUkUucHVibGljS2V5IH0pXG4gICAgICApO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5mcm9tLCBvd25lcjFBZGRyZXNzKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHguc2lnbmF0dXJlLmxlbmd0aCwgMik7XG4gICAgICB0eC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1VubG9jayk7XG4gICAgfSk7XG5cbiAgICBpdCgnYW4gaW5pdCB1bmRlbGVnYXRlIHRyYW5zYWN0aW9uIHdpdGggZXh0ZXJuYWwgc2lnbmF0dXJlIGluY2x1ZGVkIHR3aWNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gaW5pdFVuc2lnbmVkVW5kZWxlZ2F0ZVR4QnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNpZ25hdHVyZShcbiAgICAgICAgdGVzdERhdGEuRVhURVJOQUxfU0lHTkFUVVJFLnNpZ25hdHVyZSxcbiAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkVYVEVSTkFMX1NJR05BVFVSRS5wdWJsaWNLZXkgfSlcbiAgICAgICk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbmF0dXJlKFxuICAgICAgICB0ZXN0RGF0YS5FWFRFUk5BTF9TSUdOQVRVUkUuc2lnbmF0dXJlLFxuICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuRVhURVJOQUxfU0lHTkFUVVJFLnB1YmxpY0tleSB9KVxuICAgICAgKTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5mcm9tLCBvd25lcjFBZGRyZXNzKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHguc2lnbmF0dXJlLmxlbmd0aCwgMSk7XG4gICAgICB0eC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1VubG9jayk7XG4gICAgfSk7XG5cbiAgICBpdCgnYW4gdW5kZWxlZ2F0ZSB0cmFuc2FjdGlvbiB3aXRoIGxhcmdlIGFtb3VudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFtb3VudCA9ICcxMDAwMDAwMDAwMDAwMDAwMCc7XG4gICAgICBsZXQgdHhCdWlsZGVyID0gaW5pdFVuc2lnbmVkVW5kZWxlZ2F0ZVR4QnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyID0gYWRkQW1vdW50VG9CdWlsZGVyKHR4QnVpbGRlciwgYW1vdW50KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHR4SnNvbi5hbW91bnQuc2hvdWxkLmVxdWFsKGFtb3VudCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaG91bGQgZmFpbCB0byBidWlsZCcsICgpID0+IHtcbiAgICBpdCgnYSB1bmRlbGVnYXRlIHRyYW5zYWN0aW9uIHdpdGhvdXQgZmVlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IHR4QnVpbGRlciA9IGluaXRVbmRlbGVnYXRlVHhCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIgPSBhZGRTb3VyY2VUb0J1aWxkZXIodHhCdWlsZGVyLCBzZW5kZXIpO1xuICAgICAgdHhCdWlsZGVyID0gYWRkVmFsaWRhdG9yVG9CdWlsZGVyKHR4QnVpbGRlciwgdmFsaWRhdG9yKTtcbiAgICAgIHR4QnVpbGRlciA9IGFkZEFtb3VudFRvQnVpbGRlcih0eEJ1aWxkZXIsICcxMCcpO1xuICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCh0ZXN0RGF0YS5JTlZBTElEX1RSQU5TQUNUSU9OX01JU1NJTkdfRkVFKTtcbiAgICB9KTtcblxuICAgIGl0KCdhIHVuZGVsZWdhdGUgdHJhbnNhY3Rpb24gd2l0aG91dCBhbW91bnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBsZXQgdHhCdWlsZGVyID0gaW5pdFVuZGVsZWdhdGVUeEJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlciA9IGFkZEZlZVRvQnVpbGRlcih0eEJ1aWxkZXIsIHRlc3REYXRhLkZFRS5nYXNMaW1pdCwgdGVzdERhdGEuRkVFLmdhc1ByaWNlKTtcbiAgICAgIHR4QnVpbGRlciA9IGFkZFNvdXJjZVRvQnVpbGRlcih0eEJ1aWxkZXIsIHNlbmRlcik7XG4gICAgICB0eEJ1aWxkZXIgPSBhZGRWYWxpZGF0b3JUb0J1aWxkZXIodHhCdWlsZGVyLCB2YWxpZGF0b3IpO1xuICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCh0ZXN0RGF0YS5JTlZBTElEX1RSQU5TQUNUSU9OX01JU1NJTkdfQU1PVU5UKTtcbiAgICB9KTtcblxuICAgIGl0KCdhIHVuZGVsZWdhdGUgdHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkIHNvdXJjZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGxldCB0eEJ1aWxkZXIgPSBpbml0VW5kZWxlZ2F0ZVR4QnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyID0gYWRkRmVlVG9CdWlsZGVyKHR4QnVpbGRlciwgdGVzdERhdGEuRkVFLmdhc0xpbWl0LCB0ZXN0RGF0YS5GRUUuZ2FzUHJpY2UpO1xuICAgICAgdHhCdWlsZGVyID0gYWRkVmFsaWRhdG9yVG9CdWlsZGVyKHR4QnVpbGRlciwgdmFsaWRhdG9yKTtcbiAgICAgIHR4QnVpbGRlciA9IGFkZEFtb3VudFRvQnVpbGRlcih0eEJ1aWxkZXIsICcxMCcpO1xuICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCh0ZXN0RGF0YS5JTlZBTElEX1RSQU5TQUNUSU9OX01JU1NJTkdfU09VUkNFKTtcbiAgICB9KTtcblxuICAgIGl0KCdhIHVuZGVsZWdhdGUgdHJhbnNhY3Rpb24gd2l0aG91dCB2YWxpZGF0b3InLCBhc3luYyAoKSA9PiB7XG4gICAgICBsZXQgdHhCdWlsZGVyID0gaW5pdFVuZGVsZWdhdGVUeEJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlciA9IGFkZEZlZVRvQnVpbGRlcih0eEJ1aWxkZXIsIHRlc3REYXRhLkZFRS5nYXNMaW1pdCwgdGVzdERhdGEuRkVFLmdhc1ByaWNlKTtcbiAgICAgIHR4QnVpbGRlciA9IGFkZFNvdXJjZVRvQnVpbGRlcih0eEJ1aWxkZXIsIHNlbmRlcik7XG4gICAgICB0eEJ1aWxkZXIgPSBhZGRBbW91bnRUb0J1aWxkZXIodHhCdWlsZGVyLCAnMTAnKTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5mcm9tLCBvd25lcjFBZGRyZXNzKTtcbiAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nVW5sb2NrKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24udmFsaWRhdG9yLCBERUxFR0FURV9WQUxJREFUT1JfQUNDT1VOVCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaG91bGQgdmFsaWRhdGUnLCAoKSA9PiB7XG4gICAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGNzcHInKSk7XG5cbiAgICBpdCgnYW4gYWRkcmVzcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VW5kZWxlZ2F0ZUJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci52YWxpZGF0ZUFkZHJlc3MoeyBhZGRyZXNzOiB0ZXN0RGF0YS5WQUxJRF9BRERSRVNTIH0pO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gdHhCdWlsZGVyLnZhbGlkYXRlQWRkcmVzcyh7IGFkZHJlc3M6IHRlc3REYXRhLklOVkFMSURfQUREUkVTUyB9KSxcbiAgICAgICAgbmV3IFJlZ0V4cCgnSW52YWxpZCBhZGRyZXNzICcgKyB0ZXN0RGF0YS5JTlZBTElEX0FERFJFU1MpXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2EgdmFsaWRhdG9yIGFkZHJlc3MnLCBhc3luYyAoKSA9PiB7XG4gICAgICBsZXQgdHhCdWlsZGVyID0gaW5pdFVuZGVsZWdhdGVUeEJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlciA9IGFkZEZlZVRvQnVpbGRlcih0eEJ1aWxkZXIsIHRlc3REYXRhLkZFRS5nYXNMaW1pdCwgdGVzdERhdGEuRkVFLmdhc1ByaWNlKTtcbiAgICAgIHR4QnVpbGRlciA9IGFkZFNvdXJjZVRvQnVpbGRlcih0eEJ1aWxkZXIsIHNlbmRlcik7XG4gICAgICB0eEJ1aWxkZXIgPSBhZGRBbW91bnRUb0J1aWxkZXIodHhCdWlsZGVyLCAnMTAnKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnZhbGlkYXRvcignYWJjJyksIC9JbnZhbGlkIGFkZHJlc3MvKTtcbiAgICB9KTtcblxuICAgIGl0KCdmZWUgdmFsdWUgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiB6ZXJvJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRVbmRlbGVnYXRlQnVpbGRlcigpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIuZmVlKHsgZ2FzTGltaXQ6ICctMTAnIH0pKTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gdHhCdWlsZGVyLmZlZSh0ZXN0RGF0YS5GRUUpKTtcbiAgICB9KTtcblxuICAgIGl0KCdhbW91bnQgdmFsdWUgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiB6ZXJvJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRVbmRlbGVnYXRlQnVpbGRlcigpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIuYW1vdW50KCctMScpKTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gdHhCdWlsZGVyLmFtb3VudCgnMScpKTtcbiAgICB9KTtcblxuICAgIGl0KCdhIHByaXZhdGUga2V5JywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRVbmRlbGVnYXRlQnVpbGRlcigpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIudmFsaWRhdGVLZXkoeyBrZXk6ICdhYmMnIH0pLCAvVW5zdXBwb3J0ZWQgcHJpdmF0ZSBrZXkvKTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gdHhCdWlsZGVyLnZhbGlkYXRlS2V5KHsga2V5OiB0ZXN0RGF0YS5BQ0NPVU5UXzEucHJpdmF0ZUtleSB9KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYSBsZW5ndGggb2Ygc2lnbmVycycsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGluaXRVbnNpZ25lZFVuZGVsZWdhdGVUeEJ1aWxkZXIoKTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFDQ09VTlRfMS5wcml2YXRlS2V5IH0pKTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFDQ09VTlRfMi5wcml2YXRlS2V5IH0pKTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFDQ09VTlRfMy5wcml2YXRlS2V5IH0pKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BQ0NPVU5UXzQucHJpdmF0ZUtleSB9KSxcbiAgICAgICAgbmV3IFJlZ0V4cCgnQSBtYXhpbXVtIG9mIDMgY2FuIHNpZ24gdGhlIHRyYW5zYWN0aW9uLicpXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19Выполнить команду
Для локальной разработки. Не используйте в интернете!