PHP WebShell

Текущая директория: /opt/BitGoJS/modules/sdk-coin-near/dist/test/unit/transactionBuilder

Просмотр файла: stakingWithdrawBuilder.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 should_1 = __importDefault(require("should"));
const testData = __importStar(require("../../resources/near"));
const getBuilderFactory_1 = require("../getBuilderFactory");
const sdk_core_1 = require("@bitgo/sdk-core");
const near_1 = require("../../resources/near");
describe('Near Staking withdraw Builder', () => {
    const factory = (0, getBuilderFactory_1.getBuilderFactory)('tnear');
    const gas = '125000000000000';
    const amount = '1000000'; // amount to withdraw in yoctos
    describe('Succeed', () => {
        it('build a staking withdraw signed tx', async () => {
            const txBuilder = factory.getStakingWithdrawBuilder();
            txBuilder
                .amount(amount)
                .gas(gas)
                .sender(testData.accounts.account1.address, testData.accounts.account1.publicKey)
                .receiverId(near_1.validatorContractAddress)
                .recentBlockHash(testData.blockHash.block1)
                .nonce(1);
            txBuilder.sign({ key: testData.accounts.account1.secretKey });
            const tx = await txBuilder.build();
            tx.inputs.length.should.equal(1);
            should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingWithdraw);
            const rawTx = tx.toBroadcastFormat();
            should_1.default.equal(rawTx, testData.rawTx.stakingWithdraw.signed);
            const txJson = tx.toJson();
            txJson.should.have.properties(['id', 'signerId', 'publicKey', 'nonce', 'actions', 'signature']);
            txJson.id.should.equal('52ZX8MUwmYc6WQ67riUBpmntkcSxxT5aKkJYt5CtCZub');
            txJson.signerId.should.equal(testData.accounts.account1.address);
            txJson.publicKey.should.equal(testData.accounts.account1.publicKeyBase58);
            txJson.nonce.should.equal(1);
            txJson.receiverId.should.equal('lavenderfive.pool.f863973.m0');
            txJson.actions.should.deepEqual([
                {
                    functionCall: {
                        methodName: 'withdraw',
                        args: { amount: amount },
                        gas: '125000000000000',
                        deposit: '0',
                    },
                },
            ]);
        });
        it('build a staking withdraw unsigned tx', async () => {
            const txBuilder = factory.getStakingWithdrawBuilder();
            txBuilder
                .amount(amount)
                .gas(gas)
                .sender(testData.accounts.account1.address, testData.accounts.account1.publicKey)
                .receiverId(near_1.validatorContractAddress)
                .recentBlockHash(testData.blockHash.block1)
                .nonce(1);
            const tx = await txBuilder.build();
            tx.inputs.length.should.equal(1);
            should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingWithdraw);
            const rawTx = tx.toBroadcastFormat();
            should_1.default.equal(rawTx, testData.rawTx.stakingWithdraw.unsigned);
            const explainTx = tx.explainTransaction();
            explainTx.outputAmount.should.equal('1000000');
            explainTx.outputs[0].amount.should.equal('1000000');
            explainTx.outputs[0].address.should.equal(testData.accounts.account1.address);
        });
        it('build from an unsigned staking withdraw tx', async () => {
            const txBuilder = factory.from(testData.rawTx.stakingWithdraw.unsigned);
            const tx = await txBuilder.build();
            const txJson = tx.toJson();
            txJson.should.have.properties(['id', 'signerId', 'publicKey', 'nonce', 'actions', 'signature']);
            txJson.id.should.equal('52ZX8MUwmYc6WQ67riUBpmntkcSxxT5aKkJYt5CtCZub');
            txJson.signerId.should.equal(testData.accounts.account1.address);
            txJson.publicKey.should.equal(testData.accounts.account1.publicKeyBase58);
            txJson.nonce.should.equal(1);
            txJson.receiverId.should.equal('lavenderfive.pool.f863973.m0');
            txJson.actions.should.deepEqual([
                {
                    functionCall: {
                        methodName: 'withdraw',
                        args: { amount: amount },
                        gas: '125000000000000',
                        deposit: '0',
                    },
                },
            ]);
        });
        it('build from a signed staking withdraw tx', async () => {
            const txBuilder = factory.from(testData.rawTx.stakingWithdraw.signed);
            const tx = await txBuilder.build();
            const txJson = tx.toJson();
            txJson.should.have.properties(['id', 'signerId', 'publicKey', 'nonce', 'actions', 'signature']);
            txJson.id.should.equal('52ZX8MUwmYc6WQ67riUBpmntkcSxxT5aKkJYt5CtCZub');
            txJson.signerId.should.equal(testData.accounts.account1.address);
            txJson.publicKey.should.equal(testData.accounts.account1.publicKeyBase58);
            txJson.nonce.should.equal(1);
            txJson.receiverId.should.equal('lavenderfive.pool.f863973.m0');
            txJson.actions.should.deepEqual([
                {
                    functionCall: {
                        methodName: 'withdraw',
                        args: { amount: amount },
                        gas: '125000000000000',
                        deposit: '0',
                    },
                },
            ]);
        });
    });
    describe('Fail', () => {
        it('staking withdraw with missing gas', async () => {
            const txBuilder = factory.getStakingWithdrawBuilder();
            txBuilder
                .amount(amount)
                .sender(testData.accounts.account1.address, testData.accounts.account1.publicKey)
                .receiverId(near_1.validatorContractAddress)
                .recentBlockHash(testData.blockHash.block1)
                .nonce(1);
            await txBuilder.build().should.be.rejectedWith('gas is required before building staking withdraw');
        });
        it('staking withdraw with missing amount', async () => {
            const txBuilder = factory.getStakingWithdrawBuilder();
            txBuilder
                .gas(gas)
                .sender(testData.accounts.account1.address, testData.accounts.account1.publicKey)
                .receiverId(near_1.validatorContractAddress)
                .recentBlockHash(testData.blockHash.block1)
                .nonce(1);
            await txBuilder.build().should.be.rejectedWith('amount is required before building staking withdraw');
        });
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Rha2luZ1dpdGhkcmF3QnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdW5pdC90cmFuc2FjdGlvbkJ1aWxkZXIvc3Rha2luZ1dpdGhkcmF3QnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QiwrREFBaUQ7QUFDakQsNERBQXlEO0FBQ3pELDhDQUFrRDtBQUNsRCwrQ0FBZ0U7QUFFaEUsUUFBUSxDQUFDLCtCQUErQixFQUFFLEdBQUcsRUFBRTtJQUM3QyxNQUFNLE9BQU8sR0FBRyxJQUFBLHFDQUFpQixFQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzNDLE1BQU0sR0FBRyxHQUFHLGlCQUFpQixDQUFDO0lBQzlCLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUFDLCtCQUErQjtJQUV6RCxRQUFRLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTtRQUN2QixFQUFFLENBQUMsb0NBQW9DLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDbEQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLHlCQUF5QixFQUFFLENBQUM7WUFDdEQsU0FBUztpQkFDTixNQUFNLENBQUMsTUFBTSxDQUFDO2lCQUNkLEdBQUcsQ0FBQyxHQUFHLENBQUM7aUJBQ1IsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7aUJBQ2hGLFVBQVUsQ0FBQywrQkFBd0IsQ0FBQztpQkFDcEMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO2lCQUMxQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDWixTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFD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Q0FBQyxzQ0FBc0MsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNwRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMseUJBQXlCLEVBQUUsQ0FBQztZQUN0RCxTQUFTO2lCQUNOLEdBQUcsQ0FBQyxHQUFHLENBQUM7aUJBQ1IsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7aUJBQ2hGLFVBQVUsQ0FBQywrQkFBd0IsQ0FBQztpQkFDcEMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO2lCQUMxQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDWixNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO1FBQ3hHLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uLy4uL3Jlc291cmNlcy9uZWFyJztcbmltcG9ydCB7IGdldEJ1aWxkZXJGYWN0b3J5IH0gZnJvbSAnLi4vZ2V0QnVpbGRlckZhY3RvcnknO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IHZhbGlkYXRvckNvbnRyYWN0QWRkcmVzcyB9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9uZWFyJztcblxuZGVzY3JpYmUoJ05lYXIgU3Rha2luZyB3aXRoZHJhdyBCdWlsZGVyJywgKCkgPT4ge1xuICBjb25zdCBmYWN0b3J5ID0gZ2V0QnVpbGRlckZhY3RvcnkoJ3RuZWFyJyk7XG4gIGNvbnN0IGdhcyA9ICcxMjUwMDAwMDAwMDAwMDAnO1xuICBjb25zdCBhbW91bnQgPSAnMTAwMDAwMCc7IC8vIGFtb3VudCB0byB3aXRoZHJhdyBpbiB5b2N0b3NcblxuICBkZXNjcmliZSgnU3VjY2VlZCcsICgpID0+IHtcbiAgICBpdCgnYnVpbGQgYSBzdGFraW5nIHdpdGhkcmF3IHNpZ25lZCB0eCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0U3Rha2luZ1dpdGhkcmF3QnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyXG4gICAgICAgIC5hbW91bnQoYW1vdW50KVxuICAgICAgICAuZ2FzKGdhcylcbiAgICAgICAgLnNlbmRlcih0ZXN0RGF0YS5hY2NvdW50cy5hY2NvdW50MS5hZGRyZXNzLCB0ZXN0RGF0YS5hY2NvdW50cy5hY2NvdW50MS5wdWJsaWNLZXkpXG4gICAgICAgIC5yZWNlaXZlcklkKHZhbGlkYXRvckNvbnRyYWN0QWRkcmVzcylcbiAgICAgICAgLnJlY2VudEJsb2NrSGFzaCh0ZXN0RGF0YS5ibG9ja0hhc2guYmxvY2sxKVxuICAgICAgICAubm9uY2UoMSk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDEuc2VjcmV0S2V5IH0pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXcpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0RGF0YS5yYXdUeC5zdGFraW5nV2l0aGRyYXcuc2lnbmVkKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgdHhKc29uLnNob3VsZC5oYXZlLnByb3BlcnRpZXMoWydpZCcsICdzaWduZXJJZCcsICdwdWJsaWNLZXknLCAnbm9uY2UnLCAnYWN0aW9ucycsICdzaWduYXR1cmUnXSk7XG4gICAgICB0eEpzb24uaWQuc2hvdWxkLmVxdWFsKCc1MlpYOE1Vd21ZYzZXUTY3cmlVQnBtbnRrY1N4eFQ1YUtrSll0NUN0Q1p1YicpO1xuICAgICAgdHhKc29uLnNpZ25lcklkLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5hY2NvdW50cy5hY2NvdW50MS5hZGRyZXNzKTtcbiAgICAgIHR4SnNvbi5wdWJsaWNLZXkuc2hvdWxkLmVxdWFsKHRlc3REYXRhLmFjY291bnRzLmFjY291bnQxLnB1YmxpY0tleUJhc2U1OCk7XG4gICAgICB0eEpzb24ubm9uY2Uuc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHhKc29uLnJlY2VpdmVySWQuc2hvdWxkLmVxdWFsKCdsYXZlbmRlcmZpdmUucG9vbC5mODYzOTczLm0wJyk7XG4gICAgICB0eEpzb24uYWN0aW9ucy5zaG91bGQuZGVlcEVxdWFsKFtcbiAgICAgICAge1xuICAgICAgICAgIGZ1bmN0aW9uQ2FsbDoge1xuICAgICAgICAgICAgbWV0aG9kTmFtZTogJ3dpdGhkcmF3JyxcbiAgICAgICAgICAgIGFyZ3M6IHsgYW1vdW50OiBhbW91bnQgfSxcbiAgICAgICAgICAgIGdhczogJzEyNTAwMDAwMDAwMDAwMCcsXG4gICAgICAgICAgICBkZXBvc2l0OiAnMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkIGEgc3Rha2luZyB3aXRoZHJhdyB1bnNpZ25lZCB0eCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0U3Rha2luZ1dpdGhkcmF3QnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyXG4gICAgICAgIC5hbW91bnQoYW1vdW50KVxuICAgICAgICAuZ2FzKGdhcylcbiAgICAgICAgLnNlbmRlcih0ZXN0RGF0YS5hY2NvdW50cy5hY2NvdW50MS5hZGRyZXNzLCB0ZXN0RGF0YS5hY2NvdW50cy5hY2NvdW50MS5wdWJsaWNLZXkpXG4gICAgICAgIC5yZWNlaXZlcklkKHZhbGlkYXRvckNvbnRyYWN0QWRkcmVzcylcbiAgICAgICAgLnJlY2VudEJsb2NrSGFzaCh0ZXN0RGF0YS5ibG9ja0hhc2guYmxvY2sxKVxuICAgICAgICAubm9uY2UoMSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdXaXRoZHJhdyk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLnJhd1R4LnN0YWtpbmdXaXRoZHJhdy51bnNpZ25lZCk7XG4gICAgICBjb25zdCBleHBsYWluVHggPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICAgIGV4cGxhaW5UeC5vdXRwdXRBbW91bnQuc2hvdWxkLmVxdWFsKCcxMDAwMDAwJyk7XG4gICAgICBleHBsYWluVHgub3V0cHV0c1swXS5hbW91bnQuc2hvdWxkLmVxdWFsKCcxMDAwMDAwJyk7XG4gICAgICBleHBsYWluVHgub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5hY2NvdW50cy5hY2NvdW50MS5hZGRyZXNzKTtcbiAgICB9KTtcblxuICAgIGl0KCdidWlsZCBmcm9tIGFuIHVuc2lnbmVkIHN0YWtpbmcgd2l0aGRyYXcgdHgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEucmF3VHguc3Rha2luZ1dpdGhkcmF3LnVuc2lnbmVkKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHR4SnNvbi5zaG91bGQuaGF2ZS5wcm9wZXJ0aWVzKFsnaWQnLCAnc2lnbmVySWQnLCAncHVibGljS2V5JywgJ25vbmNlJywgJ2FjdGlvbnMnLCAnc2lnbmF0dXJlJ10pO1xuICAgICAgdHhKc29uLmlkLnNob3VsZC5lcXVhbCgnNTJaWDhNVXdtWWM2V1E2N3JpVUJwbW50a2NTeHhUNWFLa0pZdDVDdENadWInKTtcbiAgICAgIHR4SnNvbi5zaWduZXJJZC5zaG91bGQuZXF1YWwodGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDEuYWRkcmVzcyk7XG4gICAgICB0eEpzb24ucHVibGljS2V5LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5hY2NvdW50cy5hY2NvdW50MS5wdWJsaWNLZXlCYXNlNTgpO1xuICAgICAgdHhKc29uLm5vbmNlLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4SnNvbi5yZWNlaXZlcklkLnNob3VsZC5lcXVhbCgnbGF2ZW5kZXJmaXZlLnBvb2wuZjg2Mzk3My5tMCcpO1xuICAgICAgdHhKc29uLmFjdGlvbnMuc2hvdWxkLmRlZXBFcXVhbChbXG4gICAgICAgIHtcbiAgICAgICAgICBmdW5jdGlvbkNhbGw6IHtcbiAgICAgICAgICAgIG1ldGhvZE5hbWU6ICd3aXRoZHJhdycsXG4gICAgICAgICAgICBhcmdzOiB7IGFtb3VudDogYW1vdW50IH0sXG4gICAgICAgICAgICBnYXM6ICcxMjUwMDAwMDAwMDAwMDAnLFxuICAgICAgICAgICAgZGVwb3NpdDogJzAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KCdidWlsZCBmcm9tIGEgc2lnbmVkIHN0YWtpbmcgd2l0aGRyYXcgdHgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEucmF3VHguc3Rha2luZ1dpdGhkcmF3LnNpZ25lZCk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICB0eEpzb24uc2hvdWxkLmhhdmUucHJvcGVydGllcyhbJ2lkJywgJ3NpZ25lcklkJywgJ3B1YmxpY0tleScsICdub25jZScsICdhY3Rpb25zJywgJ3NpZ25hdHVyZSddKTtcbiAgICAgIHR4SnNvbi5pZC5zaG91bGQuZXF1YWwoJzUyWlg4TVV3bVljNldRNjdyaVVCcG1udGtjU3h4VDVhS2tKWXQ1Q3RDWnViJyk7XG4gICAgICB0eEpzb24uc2lnbmVySWQuc2hvdWxkLmVxdWFsKHRlc3REYXRhLmFjY291bnRzLmFjY291bnQxLmFkZHJlc3MpO1xuICAgICAgdHhKc29uLnB1YmxpY0tleS5zaG91bGQuZXF1YWwodGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDEucHVibGljS2V5QmFzZTU4KTtcbiAgICAgIHR4SnNvbi5ub25jZS5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eEpzb24ucmVjZWl2ZXJJZC5zaG91bGQuZXF1YWwoJ2xhdmVuZGVyZml2ZS5wb29sLmY4NjM5NzMubTAnKTtcbiAgICAgIHR4SnNvbi5hY3Rpb25zLnNob3VsZC5kZWVwRXF1YWwoW1xuICAgICAgICB7XG4gICAgICAgICAgZnVuY3Rpb25DYWxsOiB7XG4gICAgICAgICAgICBtZXRob2ROYW1lOiAnd2l0aGRyYXcnLFxuICAgICAgICAgICAgYXJnczogeyBhbW91bnQ6IGFtb3VudCB9LFxuICAgICAgICAgICAgZ2FzOiAnMTI1MDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICAgIGRlcG9zaXQ6ICcwJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdGYWlsJywgKCkgPT4ge1xuICAgIGl0KCdzdGFraW5nIHdpdGhkcmF3IHdpdGggbWlzc2luZyBnYXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFN0YWtpbmdXaXRoZHJhd0J1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlclxuICAgICAgICAuYW1vdW50KGFtb3VudClcbiAgICAgICAgLnNlbmRlcih0ZXN0RGF0YS5hY2NvdW50cy5hY2NvdW50MS5hZGRyZXNzLCB0ZXN0RGF0YS5hY2NvdW50cy5hY2NvdW50MS5wdWJsaWNLZXkpXG4gICAgICAgIC5yZWNlaXZlcklkKHZhbGlkYXRvckNvbnRyYWN0QWRkcmVzcylcbiAgICAgICAgLnJlY2VudEJsb2NrSGFzaCh0ZXN0RGF0YS5ibG9ja0hhc2guYmxvY2sxKVxuICAgICAgICAubm9uY2UoMSk7XG4gICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdnYXMgaXMgcmVxdWlyZWQgYmVmb3JlIGJ1aWxkaW5nIHN0YWtpbmcgd2l0aGRyYXcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzdGFraW5nIHdpdGhkcmF3IHdpdGggbWlzc2luZyBhbW91bnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFN0YWtpbmdXaXRoZHJhd0J1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlclxuICAgICAgICAuZ2FzKGdhcylcbiAgICAgICAgLnNlbmRlcih0ZXN0RGF0YS5hY2NvdW50cy5hY2NvdW50MS5hZGRyZXNzLCB0ZXN0RGF0YS5hY2NvdW50cy5hY2NvdW50MS5wdWJsaWNLZXkpXG4gICAgICAgIC5yZWNlaXZlcklkKHZhbGlkYXRvckNvbnRyYWN0QWRkcmVzcylcbiAgICAgICAgLnJlY2VudEJsb2NrSGFzaCh0ZXN0RGF0YS5ibG9ja0hhc2guYmxvY2sxKVxuICAgICAgICAubm9uY2UoMSk7XG4gICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdhbW91bnQgaXMgcmVxdWlyZWQgYmVmb3JlIGJ1aWxkaW5nIHN0YWtpbmcgd2l0aGRyYXcnKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==

Выполнить команду


Для локальной разработки. Не используйте в интернете!