PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-coin-coreum/dist/test/unit
Просмотр файла: transaction.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 sdk_core_1 = require("@bitgo/sdk-core");
const statics_1 = require("@bitgo/statics");
const encoding_1 = require("@cosmjs/encoding");
const should_1 = __importDefault(require("should"));
const abstract_cosmos_1 = require("@bitgo/abstract-cosmos");
const utils_1 = require("../../src/lib/utils");
const testData = __importStar(require("../resources/tcoreum"));
describe('Coreum Transaction', () => {
let tx;
const config = statics_1.coins.get('tcoreum');
const utils = new utils_1.CoreumUtils(config.network.type);
beforeEach(() => {
tx = new abstract_cosmos_1.CosmosTransaction(config, utils);
});
describe('Empty transaction', () => {
it('should throw empty transaction', function () {
should_1.default.throws(() => tx.toBroadcastFormat(), 'Empty transaction');
});
});
describe('From raw transaction', () => {
it('should build a transfer from raw signed base64', function () {
tx.enrichTransactionDetailsFromRawTransaction(testData.TEST_SEND_TX.signedTxBase64);
const json = tx.toJson();
should_1.default.equal(json.sequence, testData.TEST_SEND_TX.sequence);
should_1.default.deepEqual(json.gasBudget, testData.TEST_SEND_TX.gasBudget);
should_1.default.equal(json.publicKey, (0, sdk_core_1.toHex)((0, encoding_1.fromBase64)(testData.TEST_SEND_TX.pubKey)));
should_1.default.equal(json.sendMessages[0].value.toAddress, testData.TEST_SEND_TX.sendMessage.value.toAddress);
should_1.default.deepEqual(json.sendMessages[0].value.amount, testData.TEST_SEND_TX.sendMessage.value.amount);
should_1.default.equal(Buffer.from(json.signature).toString('base64'), testData.TEST_SEND_TX.signature);
should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
tx.loadInputsAndOutputs();
should_1.default.deepEqual(tx.inputs, [
{
address: testData.TEST_SEND_TX.sender,
value: testData.TEST_SEND_TX.sendMessage.value.amount[0].amount,
coin: 'tcoreum',
},
]);
should_1.default.deepEqual(tx.outputs, [
{
address: testData.TEST_SEND_TX.sendMessage.value.toAddress,
value: testData.TEST_SEND_TX.sendMessage.value.amount[0].amount,
coin: 'tcoreum',
},
]);
});
it('should build a transfer from raw signed hex', function () {
tx.enrichTransactionDetailsFromRawTransaction((0, sdk_core_1.toHex)((0, encoding_1.fromBase64)(testData.TEST_SEND_TX.signedTxBase64)));
const json = tx.toJson();
should_1.default.equal(json.sequence, testData.TEST_SEND_TX.sequence);
should_1.default.deepEqual(json.gasBudget, testData.TEST_SEND_TX.gasBudget);
should_1.default.equal(json.publicKey, (0, sdk_core_1.toHex)((0, encoding_1.fromBase64)(testData.TEST_SEND_TX.pubKey)));
should_1.default.equal(json.sendMessages[0].value.toAddress, testData.TEST_SEND_TX.sendMessage.value.toAddress);
should_1.default.deepEqual(json.sendMessages[0].value.amount, testData.TEST_SEND_TX.sendMessage.value.amount);
should_1.default.equal(Buffer.from(json.signature).toString('base64'), testData.TEST_SEND_TX.signature);
should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
tx.loadInputsAndOutputs();
should_1.default.deepEqual(tx.inputs, [
{
address: testData.TEST_SEND_TX.sender,
value: testData.TEST_SEND_TX.sendMessage.value.amount[0].amount,
coin: 'tcoreum',
},
]);
should_1.default.deepEqual(tx.outputs, [
{
address: testData.TEST_SEND_TX.sendMessage.value.toAddress,
value: testData.TEST_SEND_TX.sendMessage.value.amount[0].amount,
coin: 'tcoreum',
},
]);
});
it('should build a delegate txn from raw signed base64', function () {
tx.enrichTransactionDetailsFromRawTransaction(testData.TEST_DELEGATE_TX.signedTxBase64);
const json = tx.toJson();
should_1.default.equal(json.sequence, testData.TEST_DELEGATE_TX.sequence);
should_1.default.deepEqual(json.gasBudget, testData.TEST_DELEGATE_TX.gasBudget);
should_1.default.equal(Buffer.from(json.publicKey, 'hex').toString('base64'), testData.TEST_DELEGATE_TX.pubKey);
should_1.default.equal(json.sendMessages[0].value.validatorAddress, testData.TEST_DELEGATE_TX.sendMessage.value.validatorAddress);
should_1.default.deepEqual(json.sendMessages[0].value.amount, testData.TEST_DELEGATE_TX.sendMessage.value.amount);
should_1.default.equal(Buffer.from(json.signature).toString('base64'), testData.TEST_DELEGATE_TX.signature);
should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingActivate);
tx.loadInputsAndOutputs();
should_1.default.deepEqual(tx.inputs, [
{
address: testData.TEST_DELEGATE_TX.delegator,
value: testData.TEST_DELEGATE_TX.sendMessage.value.amount.amount,
coin: 'tcoreum',
},
]);
should_1.default.deepEqual(tx.outputs, [
{
address: testData.TEST_DELEGATE_TX.validator,
value: testData.TEST_DELEGATE_TX.sendMessage.value.amount.amount,
coin: 'tcoreum',
},
]);
});
it('should build a undelegate txn from raw signed base64', function () {
tx.enrichTransactionDetailsFromRawTransaction(testData.TEST_UNDELEGATE_TX.signedTxBase64);
const json = tx.toJson();
should_1.default.equal(json.sequence, testData.TEST_UNDELEGATE_TX.sequence);
should_1.default.deepEqual(json.gasBudget, testData.TEST_UNDELEGATE_TX.gasBudget);
should_1.default.equal(Buffer.from(json.publicKey, 'hex').toString('base64'), testData.TEST_UNDELEGATE_TX.pubKey);
should_1.default.equal(json.sendMessages[0].value.validatorAddress, testData.TEST_UNDELEGATE_TX.sendMessage.value.validatorAddress);
should_1.default.deepEqual(json.sendMessages[0].value.amount, testData.TEST_UNDELEGATE_TX.sendMessage.value.amount);
should_1.default.equal(Buffer.from(json.signature).toString('base64'), testData.TEST_UNDELEGATE_TX.signature);
should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingDeactivate);
tx.loadInputsAndOutputs();
should_1.default.deepEqual(tx.inputs, [
{
address: testData.TEST_UNDELEGATE_TX.delegator,
value: testData.TEST_UNDELEGATE_TX.sendMessage.value.amount.amount,
coin: 'tcoreum',
},
]);
should_1.default.deepEqual(tx.outputs, [
{
address: testData.TEST_UNDELEGATE_TX.validator,
value: testData.TEST_UNDELEGATE_TX.sendMessage.value.amount.amount,
coin: 'tcoreum',
},
]);
});
it('should build a withdraw rewards from raw signed base64', function () {
tx.enrichTransactionDetailsFromRawTransaction(testData.TEST_WITHDRAW_REWARDS_TX.signedTxBase64);
const json = tx.toJson();
should_1.default.equal(json.sequence, testData.TEST_WITHDRAW_REWARDS_TX.sequence);
should_1.default.deepEqual(json.gasBudget, testData.TEST_WITHDRAW_REWARDS_TX.gasBudget);
should_1.default.equal(Buffer.from(json.publicKey, 'hex').toString('base64'), testData.TEST_WITHDRAW_REWARDS_TX.pubKey);
should_1.default.equal(json.sendMessages[0].value.validatorAddress, testData.TEST_WITHDRAW_REWARDS_TX.sendMessage.value.validatorAddress);
should_1.default.equal(Buffer.from(json.signature).toString('base64'), testData.TEST_WITHDRAW_REWARDS_TX.signature);
should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingWithdraw);
tx.loadInputsAndOutputs();
should_1.default.deepEqual(tx.inputs, [
{
address: testData.TEST_WITHDRAW_REWARDS_TX.delegator,
value: 'UNAVAILABLE',
coin: 'tcoreum',
},
]);
should_1.default.deepEqual(tx.outputs, [
{
address: testData.TEST_WITHDRAW_REWARDS_TX.validator,
value: 'UNAVAILABLE',
coin: 'tcoreum',
},
]);
});
it('should fail to build a transfer from incorrect raw hex', function () {
should_1.default.throws(() => tx.enrichTransactionDetailsFromRawTransaction('random' + testData.TEST_SEND_TX.signedTxBase64), 'incorrect raw data');
});
it('should fail to explain transaction with invalid raw hex', function () {
should_1.default.throws(() => tx.enrichTransactionDetailsFromRawTransaction('randomString'), 'Invalid transaction');
});
});
describe('Explain transaction', () => {
it('should explain a transfer pay transaction', function () {
tx.enrichTransactionDetailsFromRawTransaction(testData.TEST_SEND_TX.signedTxBase64);
const explainedTransaction = tx.explainTransaction();
explainedTransaction.should.deepEqual({
displayOrder: ['id', 'outputs', 'outputAmount', 'changeOutputs', 'changeAmount', 'fee', 'type'],
id: testData.TEST_SEND_TX.hash,
outputs: [
{
address: testData.TEST_SEND_TX.recipient,
amount: testData.TEST_SEND_TX.sendAmount,
},
],
outputAmount: testData.TEST_SEND_TX.sendAmount,
changeOutputs: [],
changeAmount: '0',
fee: { fee: testData.TEST_SEND_TX.feeAmount },
type: 0,
});
});
it('should fail to explain transaction with invalid raw base64 string', function () {
should_1.default.throws(() => tx.enrichTransactionDetailsFromRawTransaction('randomString'), 'Invalid transaction');
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw4Q0FBeUQ7QUFDekQsNENBQXVDO0FBQ3ZDLCtDQUE4QztBQUM5QyxvREFBNEI7QUFFNUIsNERBS2dDO0FBQ2hDLCtDQUFrRDtBQUNsRCwrREFBaUQ7QUFFakQsUUFBUSxDQUFDLG9CQUFvQixFQUFFLEdBQUcsRUFBRTtJQUNsQyxJQUFJLEVBQXFCLENBQUM7SUFDMUIsTUFBTSxNQUFNLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwQyxNQUFNLEtBQUssR0FBRyxJQUFJLG1CQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVuRCxVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsRUFBRSxHQUFHLElBQUksbUNBQWlCLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzVDLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtRQUNqQyxFQUFFLENBQUMsZ0NBQWdDLEVBQUU7WUFDbkMsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUNuRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsRUFBRTtRQUNwQyxFQUFFLENBQUMsZ0RBQWdELEVBQUU7WUFDbkQsRUFBRSxDQUFDLDBDQUEwQyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDcEYsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLE1BQU0s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LEVBQUUsQ0FBQywyQ0FBMkMsRUFBRTtZQUM5QyxFQUFFLENBQUMsMENBQTBDLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNwRixNQUFNLG9CQUFvQixHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3JELG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7Z0JBQ3BDLFlBQVksRUFBRSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQztnQkFDL0YsRUFBRSxFQUFFLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSTtnQkFDOUIsT0FBTyxFQUFFO29CQUNQO3dCQUNFLE9BQU8sRUFBRSxRQUFRLENBQUMsWUFBWSxDQUFDLFNBQVM7d0JBQ3hDLE1BQU0sRUFBRSxRQUFRLENBQUMsWUFBWSxDQUFDLFVBQVU7cUJBQ3pDO2lCQUNGO2dCQUNELFlBQVksRUFBRSxRQUFRLENBQUMsWUFBWSxDQUFDLFVBQVU7Z0JBQzlDLGFBQWEsRUFBRSxFQUFFO2dCQUNqQixZQUFZLEVBQUUsR0FBRztnQkFDakIsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFO2dCQUM3QyxJQUFJLEVBQUUsQ0FBQzthQUNSLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1FQUFtRSxFQUFFO1lBQ3RFLGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQywwQ0FBMEMsQ0FBQyxjQUFjLENBQUMsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBQzVHLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHRvSGV4LCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgeyBmcm9tQmFzZTY0IH0gZnJvbSAnQGNvc21qcy9lbmNvZGluZyc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5cbmltcG9ydCB7XG4gIENvc21vc1RyYW5zYWN0aW9uLFxuICBEZWxlZ2F0ZU9yVW5kZWxlZ2V0ZU1lc3NhZ2UsXG4gIFNlbmRNZXNzYWdlLFxuICBXaXRoZHJhd0RlbGVnYXRvclJld2FyZHNNZXNzYWdlLFxufSBmcm9tICdAYml0Z28vYWJzdHJhY3QtY29zbW9zJztcbmltcG9ydCB7IENvcmV1bVV0aWxzIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi91dGlscyc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi9yZXNvdXJjZXMvdGNvcmV1bSc7XG5cbmRlc2NyaWJlKCdDb3JldW0gVHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gIGxldCB0eDogQ29zbW9zVHJhbnNhY3Rpb247XG4gIGNvbnN0IGNvbmZpZyA9IGNvaW5zLmdldCgndGNvcmV1bScpO1xuICBjb25zdCB1dGlscyA9IG5ldyBDb3JldW1VdGlscyhjb25maWcubmV0d29yay50eXBlKTtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICB0eCA9IG5ldyBDb3Ntb3NUcmFuc2FjdGlvbihjb25maWcsIHV0aWxzKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0VtcHR5IHRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdGhyb3cgZW1wdHkgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQudGhyb3dzKCgpID0+IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksICdFbXB0eSB0cmFuc2FjdGlvbicpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRnJvbSByYXcgdHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHRyYW5zZmVyIGZyb20gcmF3IHNpZ25lZCBiYXNlNjQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0eC5lbnJpY2hUcmFuc2FjdGlvbkRldGFpbHNGcm9tUmF3VHJhbnNhY3Rpb24odGVzdERhdGEuVEVTVF9TRU5EX1RYLnNpZ25lZFR4QmFzZTY0KTtcbiAgICAgIGNvbnN0IGpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHNob3VsZC5lcXVhbChqc29uLnNlcXVlbmNlLCB0ZXN0RGF0YS5URVNUX1NFTkRfVFguc2VxdWVuY2UpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbChqc29uLmdhc0J1ZGdldCwgdGVzdERhdGEuVEVTVF9TRU5EX1RYLmdhc0J1ZGdldCk7XG4gICAgICBzaG91bGQuZXF1YWwoanNvbi5wdWJsaWNLZXksIHRvSGV4KGZyb21CYXNlNjQodGVzdERhdGEuVEVTVF9TRU5EX1RYLnB1YktleSkpKTtcbiAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgKGpzb24uc2VuZE1lc3NhZ2VzWzBdLnZhbHVlIGFzIFNlbmRNZXNzYWdlKS50b0FkZHJlc3MsXG4gICAgICAgIHRlc3REYXRhLlRFU1RfU0VORF9UWC5zZW5kTWVzc2FnZS52YWx1ZS50b0FkZHJlc3NcbiAgICAgICk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKFxuICAgICAgICAoanNvbi5zZW5kTWVzc2FnZXNbMF0udmFsdWUgYXMgU2VuZE1lc3NhZ2UpLmFtb3VudCxcbiAgICAgICAgdGVzdERhdGEuVEVTVF9TRU5EX1RYLnNlbmRNZXNzYWdlLnZhbHVlLmFtb3VudFxuICAgICAgKTtcbiAgICAgIHNob3VsZC5lcXVhbChCdWZmZXIuZnJvbShqc29uLnNpZ25hdHVyZSBhcyBhbnkpLnRvU3RyaW5nKCdiYXNlNjQnKSwgdGVzdERhdGEuVEVTVF9TRU5EX1RYLnNpZ25hdHVyZSk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgdHgubG9hZElucHV0c0FuZE91dHB1dHMoKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHguaW5wdXRzLCBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5URVNUX1NFTkRfVFguc2VuZGVyLFxuICAgICAgICAgIHZhbHVlOiB0ZXN0RGF0YS5URVNUX1NFTkRfVFguc2VuZE1lc3NhZ2UudmFsdWUuYW1vdW50WzBdLmFtb3VudCxcbiAgICAgICAgICBjb2luOiAndGNvcmV1bScsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgub3V0cHV0cywgW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuVEVTVF9TRU5EX1RYLnNlbmRNZXNzYWdlLnZhbHVlLnRvQWRkcmVzcyxcbiAgICAgICAgICB2YWx1ZTogdGVzdERhdGEuVEVTVF9TRU5EX1RYLnNlbmRNZXNzYWdlLnZhbHVlLmFtb3VudFswXS5hbW91bnQsXG4gICAgICAgICAgY29pbjogJ3Rjb3JldW0nLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgdHJhbnNmZXIgZnJvbSByYXcgc2lnbmVkIGhleCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHR4LmVucmljaFRyYW5zYWN0aW9uRGV0YWlsc0Zyb21SYXdUcmFuc2FjdGlvbih0b0hleChmcm9tQmFzZTY0KHRlc3REYXRhLlRFU1RfU0VORF9UWC5zaWduZWRUeEJhc2U2NCkpKTtcbiAgICAgIGNvbnN0IGpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHNob3VsZC5lcXVhbChqc29uLnNlcXVlbmNlLCB0ZXN0RGF0YS5URVNUX1NFTkRfVFguc2VxdWVuY2UpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbChqc29uLmdhc0J1ZGdldCwgdGVzdERhdGEuVEVTVF9TRU5EX1RYLmdhc0J1ZGdldCk7XG4gICAgICBzaG91bGQuZXF1YWwoanNvbi5wdWJsaWNLZXksIHRvSGV4KGZyb21CYXNlNjQodGVzdERhdGEuVEVTVF9TRU5EX1RYLnB1YktleSkpKTtcbiAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgKGpzb24uc2VuZE1lc3NhZ2VzWzBdLnZhbHVlIGFzIFNlbmRNZXNzYWdlKS50b0FkZHJlc3MsXG4gICAgICAgIHRlc3REYXRhLlRFU1RfU0VORF9UWC5zZW5kTWVzc2FnZS52YWx1ZS50b0FkZHJlc3NcbiAgICAgICk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKFxuICAgICAgICAoanNvbi5zZW5kTWVzc2FnZXNbMF0udmFsdWUgYXMgU2VuZE1lc3NhZ2UpLmFtb3VudCxcbiAgICAgICAgdGVzdERhdGEuVEVTVF9TRU5EX1RYLnNlbmRNZXNzYWdlLnZhbHVlLmFtb3VudFxuICAgICAgKTtcbiAgICAgIHNob3VsZC5lcXVhbChCdWZmZXIuZnJvbShqc29uLnNpZ25hdHVyZSBhcyBhbnkpLnRvU3RyaW5nKCdiYXNlNjQnKSwgdGVzdERhdGEuVEVTVF9TRU5EX1RYLnNpZ25hdHVyZSk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgdHgubG9hZElucHV0c0FuZE91dHB1dHMoKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHguaW5wdXRzLCBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5URVNUX1NFTkRfVFguc2VuZGVyLFxuICAgICAgICAgIHZhbHVlOiB0ZXN0RGF0YS5URVNUX1NFTkRfVFguc2VuZE1lc3NhZ2UudmFsdWUuYW1vdW50WzBdLmFtb3VudCxcbiAgICAgICAgICBjb2luOiAndGNvcmV1bScsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgub3V0cHV0cywgW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuVEVTVF9TRU5EX1RYLnNlbmRNZXNzYWdlLnZhbHVlLnRvQWRkcmVzcyxcbiAgICAgICAgICB2YWx1ZTogdGVzdERhdGEuVEVTVF9TRU5EX1RYLnNlbmRNZXNzYWdlLnZhbHVlLmFtb3VudFswXS5hbW91bnQsXG4gICAgICAgICAgY29pbjogJ3Rjb3JldW0nLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgZGVsZWdhdGUgdHhuIGZyb20gcmF3IHNpZ25lZCBiYXNlNjQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0eC5lbnJpY2hUcmFuc2FjdGlvbkRldGFpbHNGcm9tUmF3VHJhbnNhY3Rpb24odGVzdERhdGEuVEVTVF9ERUxFR0FURV9UWC5zaWduZWRUeEJhc2U2NCk7XG4gICAgICBjb25zdCBqc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZXF1YWwoanNvbi5zZXF1ZW5jZSwgdGVzdERhdGEuVEVTVF9ERUxFR0FURV9UWC5zZXF1ZW5jZSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKGpzb24uZ2FzQnVkZ2V0LCB0ZXN0RGF0YS5URVNUX0RFTEVHQVRFX1RYLmdhc0J1ZGdldCk7XG4gICAgICBzaG91bGQuZXF1YWwoQnVmZmVyLmZyb20oanNvbi5wdWJsaWNLZXkgYXMgYW55LCAnaGV4JykudG9TdHJpbmcoJ2Jhc2U2NCcpLCB0ZXN0RGF0YS5URVNUX0RFTEVHQVRFX1RYLnB1YktleSk7XG4gICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgIChqc29uLnNlbmRNZXNzYWdlc1swXS52YWx1ZSBhcyBEZWxlZ2F0ZU9yVW5kZWxlZ2V0ZU1lc3NhZ2UpLnZhbGlkYXRvckFkZHJlc3MsXG4gICAgICAgIHRlc3REYXRhLlRFU1RfREVMRUdBVEVfVFguc2VuZE1lc3NhZ2UudmFsdWUudmFsaWRhdG9yQWRkcmVzc1xuICAgICAgKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwoXG4gICAgICAgIChqc29uLnNlbmRNZXNzYWdlc1swXS52YWx1ZSBhcyBEZWxlZ2F0ZU9yVW5kZWxlZ2V0ZU1lc3NhZ2UpLmFtb3VudCxcbiAgICAgICAgdGVzdERhdGEuVEVTVF9ERUxFR0FURV9UWC5zZW5kTWVzc2FnZS52YWx1ZS5hbW91bnRcbiAgICAgICk7XG4gICAgICBzaG91bGQuZXF1YWwoQnVmZmVyLmZyb20oanNvbi5zaWduYXR1cmUgYXMgYW55KS50b1N0cmluZygnYmFzZTY0JyksIHRlc3REYXRhLlRFU1RfREVMRUdBVEVfVFguc2lnbmF0dXJlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FjdGl2YXRlKTtcbiAgICAgIHR4LmxvYWRJbnB1dHNBbmRPdXRwdXRzKCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LmlucHV0cywgW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuVEVTVF9ERUxFR0FURV9UWC5kZWxlZ2F0b3IsXG4gICAgICAgICAgdmFsdWU6IHRlc3REYXRhLlRFU1RfREVMRUdBVEVfVFguc2VuZE1lc3NhZ2UudmFsdWUuYW1vdW50LmFtb3VudCxcbiAgICAgICAgICBjb2luOiAndGNvcmV1bScsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgub3V0cHV0cywgW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuVEVTVF9ERUxFR0FURV9UWC52YWxpZGF0b3IsXG4gICAgICAgICAgdmFsdWU6IHRlc3REYXRhLlRFU1RfREVMRUdBVEVfVFguc2VuZE1lc3NhZ2UudmFsdWUuYW1vdW50LmFtb3VudCxcbiAgICAgICAgICBjb2luOiAndGNvcmV1bScsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSB1bmRlbGVnYXRlIHR4biBmcm9tIHJhdyBzaWduZWQgYmFzZTY0JywgZnVuY3Rpb24gKCkge1xuICAgICAgdHguZW5yaWNoVHJhbnNhY3Rpb25EZXRhaWxzRnJvbVJhd1RyYW5zYWN0aW9uKHRlc3REYXRhLlRFU1RfVU5ERUxFR0FURV9UWC5zaWduZWRUeEJhc2U2NCk7XG4gICAgICBjb25zdCBqc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZXF1YWwoanNvbi5zZXF1ZW5jZSwgdGVzdERhdGEuVEVTVF9VTkRFTEVHQVRFX1RYLnNlcXVlbmNlKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwoanNvbi5nYXNCdWRnZXQsIHRlc3REYXRhLlRFU1RfVU5ERUxFR0FURV9UWC5nYXNCdWRnZXQpO1xuICAgICAgc2hvdWxkLmVxdWFsKEJ1ZmZlci5mcm9tKGpzb24ucHVibGljS2V5IGFzIGFueSwgJ2hleCcpLnRvU3RyaW5nKCdiYXNlNjQnKSwgdGVzdERhdGEuVEVTVF9VTkRFTEVHQVRFX1RYLnB1YktleSk7XG4gICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgIChqc29uLnNlbmRNZXNzYWdlc1swXS52YWx1ZSBhcyBEZWxlZ2F0ZU9yVW5kZWxlZ2V0ZU1lc3NhZ2UpLnZhbGlkYXRvckFkZHJlc3MsXG4gICAgICAgIHRlc3REYXRhLlRFU1RfVU5ERUxFR0FURV9UWC5zZW5kTWVzc2FnZS52YWx1ZS52YWxpZGF0b3JBZGRyZXNzXG4gICAgICApO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbChcbiAgICAgICAgKGpzb24uc2VuZE1lc3NhZ2VzWzBdLnZhbHVlIGFzIERlbGVnYXRlT3JVbmRlbGVnZXRlTWVzc2FnZSkuYW1vdW50LFxuICAgICAgICB0ZXN0RGF0YS5URVNUX1VOREVMRUdBVEVfVFguc2VuZE1lc3NhZ2UudmFsdWUuYW1vdW50XG4gICAgICApO1xuICAgICAgc2hvdWxkLmVxdWFsKEJ1ZmZlci5mcm9tKGpzb24uc2lnbmF0dXJlIGFzIGFueSkudG9TdHJpbmcoJ2Jhc2U2NCcpLCB0ZXN0RGF0YS5URVNUX1VOREVMRUdBVEVfVFguc2lnbmF0dXJlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlYWN0aXZhdGUpO1xuICAgICAgdHgubG9hZElucHV0c0FuZE91dHB1dHMoKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHguaW5wdXRzLCBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5URVNUX1VOREVMRUdBVEVfVFguZGVsZWdhdG9yLFxuICAgICAgICAgIHZhbHVlOiB0ZXN0RGF0YS5URVNUX1VOREVMRUdBVEVfVFguc2VuZE1lc3NhZ2UudmFsdWUuYW1vdW50LmFtb3VudCxcbiAgICAgICAgICBjb2luOiAndGNvcmV1bScsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgub3V0cHV0cywgW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuVEVTVF9VTkRFTEVHQVRFX1RYLnZhbGlkYXRvcixcbiAgICAgICAgICB2YWx1ZTogdGVzdERhdGEuVEVTVF9VTkRFTEVHQVRFX1RYLnNlbmRNZXNzYWdlLnZhbHVlLmFtb3VudC5hbW91bnQsXG4gICAgICAgICAgY29pbjogJ3Rjb3JldW0nLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgd2l0aGRyYXcgcmV3YXJkcyBmcm9tIHJhdyBzaWduZWQgYmFzZTY0JywgZnVuY3Rpb24gKCkge1xuICAgICAgdHguZW5yaWNoVHJhbnNhY3Rpb25EZXRhaWxzRnJvbVJhd1RyYW5zYWN0aW9uKHRlc3REYXRhLlRFU1RfV0lUSERSQVdfUkVXQVJEU19UWC5zaWduZWRUeEJhc2U2NCk7XG4gICAgICBjb25zdCBqc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZXF1YWwoanNvbi5zZXF1ZW5jZSwgdGVzdERhdGEuVEVTVF9XSVRIRFJBV19SRVdBUkRTX1RYLnNlcXVlbmNlKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwoanNvbi5nYXNCdWRnZXQsIHRlc3REYXRhLlRFU1RfV0lUSERSQVdfUkVXQVJEU19UWC5nYXNCdWRnZXQpO1xuICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICBCdWZmZXIuZnJvbShqc29uLnB1YmxpY0tleSBhcyBhbnksICdoZXgnKS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgICAgIHRlc3REYXRhLlRFU1RfV0lUSERSQVdfUkVXQVJEU19UWC5wdWJLZXlcbiAgICAgICk7XG4gICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgIChqc29uLnNlbmRNZXNzYWdlc1swXS52YWx1ZSBhcyBXaXRoZHJhd0RlbGVnYXRvclJld2FyZHNNZXNzYWdlKS52YWxpZGF0b3JBZGRyZXNzLFxuICAgICAgICB0ZXN0RGF0YS5URVNUX1dJVEhEUkFXX1JFV0FSRFNfVFguc2VuZE1lc3NhZ2UudmFsdWUudmFsaWRhdG9yQWRkcmVzc1xuICAgICAgKTtcbiAgICAgIHNob3VsZC5lcXVhbChCdWZmZXIuZnJvbShqc29uLnNpZ25hdHVyZSBhcyBhbnkpLnRvU3RyaW5nKCdiYXNlNjQnKSwgdGVzdERhdGEuVEVTVF9XSVRIRFJBV19SRVdBUkRTX1RYLnNpZ25hdHVyZSk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdXaXRoZHJhdyk7XG5cbiAgICAgIHR4LmxvYWRJbnB1dHNBbmRPdXRwdXRzKCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LmlucHV0cywgW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuVEVTVF9XSVRIRFJBV19SRVdBUkRTX1RYLmRlbGVnYXRvcixcbiAgICAgICAgICB2YWx1ZTogJ1VOQVZBSUxBQkxFJyxcbiAgICAgICAgICBjb2luOiAndGNvcmV1bScsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgub3V0cHV0cywgW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuVEVTVF9XSVRIRFJBV19SRVdBUkRTX1RYLnZhbGlkYXRvcixcbiAgICAgICAgICB2YWx1ZTogJ1VOQVZBSUxBQkxFJyxcbiAgICAgICAgICBjb2luOiAndGNvcmV1bScsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byBidWlsZCBhIHRyYW5zZmVyIGZyb20gaW5jb3JyZWN0IHJhdyBoZXgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQudGhyb3dzKFxuICAgICAgICAoKSA9PiB0eC5lbnJpY2hUcmFuc2FjdGlvbkRldGFpbHNGcm9tUmF3VHJhbnNhY3Rpb24oJ3JhbmRvbScgKyB0ZXN0RGF0YS5URVNUX1NFTkRfVFguc2lnbmVkVHhCYXNlNjQpLFxuICAgICAgICAnaW5jb3JyZWN0IHJhdyBkYXRhJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byBleHBsYWluIHRyYW5zYWN0aW9uIHdpdGggaW52YWxpZCByYXcgaGV4JywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLnRocm93cygoKSA9PiB0eC5lbnJpY2hUcmFuc2FjdGlvbkRldGFpbHNGcm9tUmF3VHJhbnNhY3Rpb24oJ3JhbmRvbVN0cmluZycpLCAnSW52YWxpZCB0cmFuc2FjdGlvbicpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRXhwbGFpbiB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGV4cGxhaW4gYSB0cmFuc2ZlciBwYXkgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0eC5lbnJpY2hUcmFuc2FjdGlvbkRldGFpbHNGcm9tUmF3VHJhbnNhY3Rpb24odGVzdERhdGEuVEVTVF9TRU5EX1RYLnNpZ25lZFR4QmFzZTY0KTtcbiAgICAgIGNvbnN0IGV4cGxhaW5lZFRyYW5zYWN0aW9uID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gICAgICBleHBsYWluZWRUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgZGlzcGxheU9yZGVyOiBbJ2lkJywgJ291dHB1dHMnLCAnb3V0cHV0QW1vdW50JywgJ2NoYW5nZU91dHB1dHMnLCAnY2hhbmdlQW1vdW50JywgJ2ZlZScsICd0eXBlJ10sXG4gICAgICAgIGlkOiB0ZXN0RGF0YS5URVNUX1NFTkRfVFguaGFzaCxcbiAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLlRFU1RfU0VORF9UWC5yZWNpcGllbnQsXG4gICAgICAgICAgICBhbW91bnQ6IHRlc3REYXRhLlRFU1RfU0VORF9UWC5zZW5kQW1vdW50LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIG91dHB1dEFtb3VudDogdGVzdERhdGEuVEVTVF9TRU5EX1RYLnNlbmRBbW91bnQsXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgICAgZmVlOiB7IGZlZTogdGVzdERhdGEuVEVTVF9TRU5EX1RYLmZlZUFtb3VudCB9LFxuICAgICAgICB0eXBlOiAwLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gZXhwbGFpbiB0cmFuc2FjdGlvbiB3aXRoIGludmFsaWQgcmF3IGJhc2U2NCBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQudGhyb3dzKCgpID0+IHR4LmVucmljaFRyYW5zYWN0aW9uRGV0YWlsc0Zyb21SYXdUcmFuc2FjdGlvbigncmFuZG9tU3RyaW5nJyksICdJbnZhbGlkIHRyYW5zYWN0aW9uJyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=Выполнить команду
Для локальной разработки. Не используйте в интернете!