PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-coin-trx/dist/test/unit
Просмотр файла: util.js
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const node_test_1 = require("node:test");
const assert_1 = __importDefault(require("assert"));
const src_1 = require("../../src");
const resources_1 = require("../resources");
const utils_1 = require("../../src/lib/utils");
(0, node_test_1.describe)('Util library should', function () {
// arbitrary text
const arr = [127, 255, 31, 192, 3, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
const hex = '7FFF1FC0037E0000000000000000000000000000000000000000000000000000';
const txt = 'arbitrary string to sign';
const signedString = '0x9424113f32c17b6ffbeee024e1a54b6991d756e82f66cca16a41231fdfa270d03b08e833f5dbbd5cc86896c2e5ea6c74d2e292cda21f717164f994fcdf28486d1b';
// prv-pub-address hex
const prv = 'FB3AA887E0BE3FAC9D75E661DAFF4A7FE0E91AAB13DA9775CD8586D7CB9B7640';
const pub = '046EBFB90C396B4A3B992B727CB4714A32E2A6DE43FDB3EC266286AC2246D8FD1E23E12C0DEB752C631A9011BBF8B56E2FBAA20E99D3952F0A558D11F96E7C1C5D';
const addressHex = '412C2BA4A9FF6C53207DC5B686BFECF75EA7B80577';
const base58 = 'TDzm1tCXM2YS1PDa3GoXSvxdy4AgwVbBPE';
const addrBytes = [65, 44, 43, 164, 169, 255, 108, 83, 32, 125, 197, 182, 134, 191, 236, 247, 94, 167, 184, 5, 119];
// tx information
(0, node_test_1.it)('be able to convert hex to bytes', () => {
const ba = src_1.Utils.getByteArrayFromHexAddress(hex);
assert_1.default.deepStrictEqual(ba, arr);
});
(0, node_test_1.it)('be able to convert hex with 0x to bytes ', () => {
const ba = src_1.Utils.getByteArrayFromHexAddress('0x' + hex);
assert_1.default.deepStrictEqual(ba, arr);
});
(0, node_test_1.it)('be able to convert hex to bytes', () => {
const hs = src_1.Utils.getHexAddressFromByteArray(arr);
assert_1.default.equal(hs, hex);
});
(0, node_test_1.it)('get a pub from a prv', () => {
const derivedPub = src_1.Utils.getPubKeyFromPriKey(Buffer.from(prv, 'hex'));
const derivedPubHex = src_1.Utils.getHexAddressFromByteArray(derivedPub);
assert_1.default.equal(derivedPubHex, pub);
});
(0, node_test_1.it)('get an hex address from a prv', () => {
const addr = src_1.Utils.getAddressFromPriKey(Buffer.from(prv, 'hex'));
const hexAddr = src_1.Utils.getHexAddressFromByteArray(addr);
assert_1.default.equal(hexAddr, addressHex);
});
(0, node_test_1.it)('get an base58 address', () => {
const addr = src_1.Utils.getAddressFromPriKey(Buffer.from(prv, 'hex'));
const addr58 = src_1.Utils.getBase58AddressFromByteArray(addr);
assert_1.default.equal(addr58, base58);
});
(0, node_test_1.it)('get an base58 address from hex', () => {
const addr58 = src_1.Utils.getBase58AddressFromHex(addressHex);
assert_1.default.equal(addr58, base58);
});
(0, node_test_1.it)('get hex from base58 address', () => {
const hexAddr = src_1.Utils.getHexAddressFromBase58Address(base58);
assert_1.default.equal(hexAddr, addressHex);
});
(0, node_test_1.it)('validate a hex string', () => {
const hex = ['0xaffd', '0x11'];
hex.map((hex) => {
assert_1.default.ok(src_1.Utils.isValidHex(hex));
});
const invalidHex = ['0xa11', '0xFFdYYY', '0x', ''];
invalidHex.map((hex) => {
assert_1.default.strictEqual(src_1.Utils.isValidHex(hex), false);
});
});
(0, node_test_1.it)('sign a string', () => {
const hexText = Buffer.from(txt).toString('hex');
const signed = src_1.Utils.signString(hexText, prv);
assert_1.default.equal(signedString, signed);
});
(0, node_test_1.it)('should calculate an address from a pub', () => {
const pubBytes = src_1.Utils.getByteArrayFromHexAddress(pub);
const bytes = src_1.Utils.getRawAddressFromPubKey(pubBytes);
assert_1.default.deepStrictEqual(bytes, addrBytes);
});
(0, node_test_1.it)('should verify a signed message', () => {
const hexEncodedMessage = Buffer.from(txt).toString('hex');
assert_1.default.strictEqual(src_1.Utils.verifySignature(hexEncodedMessage, base58, signedString, true), true);
});
(0, node_test_1.it)('should fail to verify a signed message if the message is not in hex', () => {
assert_1.default.throws(() => src_1.Utils.verifySignature(txt, base58, signedString, true));
});
(0, node_test_1.it)('should fail to verify a signed message if the address is not in base58', () => {
const hexEncodedString = Buffer.from(txt).toString('hex');
assert_1.default.throws(() => src_1.Utils.verifySignature(hexEncodedString, addressHex, signedString, true));
});
(0, node_test_1.it)('should fail to verify a signed message if the signature is not in hex', () => {
const hexEncodedString = Buffer.from(txt).toString('hex');
assert_1.default.throws(() => src_1.Utils.verifySignature(hexEncodedString, base58, 'abc', true));
});
(0, node_test_1.it)('should return transaction data', () => {
const data = src_1.Utils.decodeRawTransaction(resources_1.UnsignedTransferContractTx.tx.raw_data_hex);
assert_1.default.equal(data.timestamp, resources_1.UnsignedTransferContractTx.tx.raw_data.timestamp);
assert_1.default.equal(data.expiration, resources_1.UnsignedTransferContractTx.tx.raw_data.expiration);
assert_1.default.ok(data.contracts);
});
(0, node_test_1.it)('should decode a transfer contract', () => {
const tx = resources_1.UnsignedTransferContractTx.tx;
const rawTx = src_1.Utils.decodeRawTransaction(tx.raw_data_hex);
const value = resources_1.UnsignedTransferContractTx.tx.raw_data.contract[0].parameter.value;
const parsedContract = src_1.Utils.decodeTransferContract(rawTx.contracts[0].parameter.value);
const toAddress = src_1.Utils.getBase58AddressFromHex(value.to_address);
const ownerAddress = src_1.Utils.getBase58AddressFromHex(value.owner_address);
const amount = value.amount;
assert_1.default.equal(parsedContract[0].parameter.value.to_address, toAddress);
assert_1.default.equal(parsedContract[0].parameter.value.owner_address, ownerAddress);
assert_1.default.equal(parsedContract[0].parameter.value.amount, amount);
});
(0, node_test_1.it)('should decode an AccountPermissionUpdate Contract', () => {
const tx = resources_1.SignedAccountPermissionUpdateContractTx;
const value = tx.raw_data.contract[0].parameter.value;
const rawTx = src_1.Utils.decodeRawTransaction(tx.raw_data_hex);
const parsedTx = src_1.Utils.decodeAccountPermissionUpdateContract(rawTx.contracts[0].parameter.value);
const ownerAddress = src_1.Utils.getBase58AddressFromHex(value.owner_address);
assert_1.default.equal(parsedTx.ownerAddress, ownerAddress);
assert_1.default.equal(parsedTx.owner.type, 0);
assert_1.default.equal(parsedTx.owner.threshold, 2);
assert_1.default.equal(parsedTx.actives.length, 1);
assert_1.default.equal(parsedTx.actives[0].type, 2);
assert_1.default.equal(parsedTx.actives[0].threshold, 2);
});
(0, node_test_1.it)('should encode and decode data parameters for transfer', () => {
const types = ['address', 'uint256'];
const amount = '2000000000000000000000';
const values = [addressHex, amount];
const methodId = '0xa9059cbb';
const data = src_1.Utils.encodeDataParams(types, values, methodId);
assert_1.default.equal(data, 'a9059cbb0000000000000000000000002c2ba4a9ff6c53207dc5b686bfecf75ea7b8057700000000000000000000000000000000000000000000006c6b935b8bbd400000');
const decodedData = src_1.Utils.decodeDataParams(types, 'a9059cbb0000000000000000000000002c2ba4a9ff6c53207dc5b686bfecf75ea7b8057700000000000000000000000000000000000000000000006c6b935b8bbd400000');
assert_1.default.equal(decodedData[0], addressHex.toLocaleLowerCase());
assert_1.default.equal(decodedData[1].toString(), amount);
});
(0, node_test_1.it)('should correctly map testnet and mainnet tokens', () => {
assert_1.default.strictEqual(utils_1.tokenMainnetContractAddresses.includes('TSSMHYeV2uE9qYH95DqyoCuNCzEL1NvU3S'), true);
assert_1.default.strictEqual(utils_1.tokenTestnetContractAddresses.includes('TGkfUshdbAiNj5G1mynp2meq2BfF6XSGPf'), true);
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEseUNBQXlDO0FBQ3pDLG9EQUE0QjtBQUM1QixtQ0FBNkM7QUFFN0MsNENBQW1HO0FBQ25HLCtDQUFtRztBQUVuRyxJQUFBLG9CQUFRLEVBQUMscUJBQXFCLEVBQUU7SUFDOUIsaUJBQWlCO0lBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RILE1BQU0sR0FBRyxHQUFHLGtFQUFrRSxDQUFDO0lBQy9FLE1BQU0sR0FBRyxHQUFHLDBCQUEwQixDQUFDO0lBQ3ZDLE1BQU0sWUFBWSxHQUNoQixzSUFBc0ksQ0FBQztJQUV6SSxzQkFBc0I7SUFDdEIsTUFBTSxHQUFHLEdBQUcsa0VBQWtFLENBQUM7SUFDL0UsTUFBTSxHQUFHLEdBQ1Asb0lBQW9JLENBQUM7SUFDdkksTUFBTSxVQUFVLEdBQUcsNENBQTRDLENBQUM7SUFDaEUsTUFBTSxNQUFNLEdBQUcsb0NBQW9DLENBQUM7SUFDcEQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdB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Q0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztRQUM3RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbEQsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFBLGNBQUUsRUFBQyxpREFBaUQsRUFBRSxHQUFHLEVBQUU7UUFDekQsZ0JBQU0sQ0FBQyxXQUFXLENBQUMscUNBQTZCLENBQUMsUUFBUSxDQUFDLG9DQUFvQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkcsZ0JBQU0sQ0FBQyxXQUFXLENBQUMscUNBQTZCLENBQUMsUUFBUSxDQUFDLG9DQUFvQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDekcsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlc2NyaWJlLCBpdCB9IGZyb20gJ25vZGU6dGVzdCc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBJbnRlcmZhY2UsIFV0aWxzIH0gZnJvbSAnLi4vLi4vc3JjJztcblxuaW1wb3J0IHsgVW5zaWduZWRUcmFuc2ZlckNvbnRyYWN0VHgsIFNpZ25lZEFjY291bnRQZXJtaXNzaW9uVXBkYXRlQ29udHJhY3RUeCB9IGZyb20gJy4uL3Jlc291cmNlcyc7XG5pbXBvcnQgeyB0b2tlbk1haW5uZXRDb250cmFjdEFkZHJlc3NlcywgdG9rZW5UZXN0bmV0Q29udHJhY3RBZGRyZXNzZXMgfSBmcm9tICcuLi8uLi9zcmMvbGliL3V0aWxzJztcblxuZGVzY3JpYmUoJ1V0aWwgbGlicmFyeSBzaG91bGQnLCBmdW5jdGlvbiAoKSB7XG4gIC8vIGFyYml0cmFyeSB0ZXh0XG4gIGNvbnN0IGFyciA9IFsxMjcsIDI1NSwgMzEsIDE5MiwgMywgMTI2LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXTtcbiAgY29uc3QgaGV4ID0gJzdGRkYxRkMwMDM3RTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnO1xuICBjb25zdCB0eHQgPSAnYXJiaXRyYXJ5IHN0cmluZyB0byBzaWduJztcbiAgY29uc3Qgc2lnbmVkU3RyaW5nID1cbiAgICAnMHg5NDI0MTEzZjMyYzE3YjZmZmJlZWUwMjRlMWE1NGI2OTkxZDc1NmU4MmY2NmNjYTE2YTQxMjMxZmRmYTI3MGQwM2IwOGU4MzNmNWRiYmQ1Y2M4Njg5NmMyZTVlYTZjNzRkMmUyOTJjZGEyMWY3MTcxNjRmOTk0ZmNkZjI4NDg2ZDFiJztcblxuICAvLyBwcnYtcHViLWFkZHJlc3MgaGV4XG4gIGNvbnN0IHBydiA9ICdGQjNBQTg4N0UwQkUzRkFDOUQ3NUU2NjFEQUZGNEE3RkUwRTkxQUFCMTNEQTk3NzVDRDg1ODZEN0NCOUI3NjQwJztcbiAgY29uc3QgcHViID1cbiAgICAnMDQ2RUJGQjkwQzM5NkI0QTNCOTkyQjcyN0NCNDcxNEEzMkUyQTZERTQzRkRCM0VDMjY2Mjg2QUMyMjQ2RDhGRDFFMjNFMTJDMERFQjc1MkM2MzFBOTAxMUJCRjhCNTZFMkZCQUEyMEU5OUQzOTUyRjBBNTU4RDExRjk2RTdDMUM1RCc7XG4gIGNvbnN0IGFkZHJlc3NIZXggPSAnNDEyQzJCQTRBOUZGNkM1MzIwN0RDNUI2ODZCRkVDRjc1RUE3QjgwNTc3JztcbiAgY29uc3QgYmFzZTU4ID0gJ1REem0xdENYTTJZUzFQRGEzR29YU3Z4ZHk0QWd3VmJCUEUnO1xuICBjb25zdCBhZGRyQnl0ZXMgPSBbNjUsIDQ0LCA0MywgMTY0LCAxNjksIDI1NSwgMTA4LCA4MywgMzIsIDEyNSwgMTk3LCAxODIsIDEzNCwgMTkxLCAyMzYsIDI0NywgOTQsIDE2NywgMTg0LCA1LCAxMTldO1xuXG4gIC8vIHR4IGluZm9ybWF0aW9uXG4gIGl0KCdiZSBhYmxlIHRvIGNvbnZlcnQgaGV4IHRvIGJ5dGVzJywgKCkgPT4ge1xuICAgIGNvbnN0IGJhID0gVXRpbHMuZ2V0Qnl0ZUFycmF5RnJvbUhleEFkZHJlc3MoaGV4KTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGJhLCBhcnIpO1xuICB9KTtcblxuICBpdCgnYmUgYWJsZSB0byBjb252ZXJ0IGhleCB3aXRoIDB4IHRvIGJ5dGVzICcsICgpID0+IHtcbiAgICBjb25zdCBiYSA9IFV0aWxzLmdldEJ5dGVBcnJheUZyb21IZXhBZGRyZXNzKCcweCcgKyBoZXgpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoYmEsIGFycik7XG4gIH0pO1xuXG4gIGl0KCdiZSBhYmxlIHRvIGNvbnZlcnQgaGV4IHRvIGJ5dGVzJywgKCkgPT4ge1xuICAgIGNvbnN0IGhzID0gVXRpbHMuZ2V0SGV4QWRkcmVzc0Zyb21CeXRlQXJyYXkoYXJyKTtcbiAgICBhc3NlcnQuZXF1YWwoaHMsIGhleCk7XG4gIH0pO1xuXG4gIGl0KCdnZXQgYSBwdWIgZnJvbSBhIHBydicsICgpID0+IHtcbiAgICBjb25zdCBkZXJpdmVkUHViID0gVXRpbHMuZ2V0UHViS2V5RnJvbVByaUtleShCdWZmZXIuZnJvbShwcnYsICdoZXgnKSk7XG4gICAgY29uc3QgZGVyaXZlZFB1YkhleCA9IFV0aWxzLmdldEhleEFkZHJlc3NGcm9tQnl0ZUFycmF5KGRlcml2ZWRQdWIpO1xuICAgIGFzc2VydC5lcXVhbChkZXJpdmVkUHViSGV4LCBwdWIpO1xuICB9KTtcblxuICBpdCgnZ2V0IGFuIGhleCBhZGRyZXNzIGZyb20gYSBwcnYnLCAoKSA9PiB7XG4gICAgY29uc3QgYWRkciA9IFV0aWxzLmdldEFkZHJlc3NGcm9tUHJpS2V5KEJ1ZmZlci5mcm9tKHBydiwgJ2hleCcpKTtcbiAgICBjb25zdCBoZXhBZGRyID0gVXRpbHMuZ2V0SGV4QWRkcmVzc0Zyb21CeXRlQXJyYXkoYWRkcik7XG4gICAgYXNzZXJ0LmVxdWFsKGhleEFkZHIsIGFkZHJlc3NIZXgpO1xuICB9KTtcblxuICBpdCgnZ2V0IGFuIGJhc2U1OCBhZGRyZXNzJywgKCkgPT4ge1xuICAgIGNvbnN0IGFkZHIgPSBVdGlscy5nZXRBZGRyZXNzRnJvbVByaUtleShCdWZmZXIuZnJvbShwcnYsICdoZXgnKSk7XG4gICAgY29uc3QgYWRkcjU4ID0gVXRpbHMuZ2V0QmFzZTU4QWRkcmVzc0Zyb21CeXRlQXJyYXkoYWRkcik7XG4gICAgYXNzZXJ0LmVxdWFsKGFkZHI1OCwgYmFzZTU4KTtcbiAgfSk7XG5cbiAgaXQoJ2dldCBhbiBiYXNlNTggYWRkcmVzcyBmcm9tIGhleCcsICgpID0+IHtcbiAgICBjb25zdCBhZGRyNTggPSBVdGlscy5nZXRCYXNlNThBZGRyZXNzRnJvbUhleChhZGRyZXNzSGV4KTtcbiAgICBhc3NlcnQuZXF1YWwoYWRkcjU4LCBiYXNlNTgpO1xuICB9KTtcblxuICBpdCgnZ2V0IGhleCBmcm9tIGJhc2U1OCBhZGRyZXNzJywgKCkgPT4ge1xuICAgIGNvbnN0IGhleEFkZHIgPSBVdGlscy5nZXRIZXhBZGRyZXNzRnJvbUJhc2U1OEFkZHJlc3MoYmFzZTU4KTtcbiAgICBhc3NlcnQuZXF1YWwoaGV4QWRkciwgYWRkcmVzc0hleCk7XG4gIH0pO1xuXG4gIGl0KCd2YWxpZGF0ZSBhIGhleCBzdHJpbmcnLCAoKSA9PiB7XG4gICAgY29uc3QgaGV4ID0gWycweGFmZmQnLCAnMHgxMSddO1xuICAgIGhleC5tYXAoKGhleCkgPT4ge1xuICAgICAgYXNzZXJ0Lm9rKFV0aWxzLmlzVmFsaWRIZXgoaGV4KSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBpbnZhbGlkSGV4ID0gWycweGExMScsICcweEZGZFlZWScsICcweCcsICcnXTtcbiAgICBpbnZhbGlkSGV4Lm1hcCgoaGV4KSA9PiB7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoVXRpbHMuaXNWYWxpZEhleChoZXgpLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdzaWduIGEgc3RyaW5nJywgKCkgPT4ge1xuICAgIGNvbnN0IGhleFRleHQgPSBCdWZmZXIuZnJvbSh0eHQpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCBzaWduZWQgPSBVdGlscy5zaWduU3RyaW5nKGhleFRleHQsIHBydik7XG5cbiAgICBhc3NlcnQuZXF1YWwoc2lnbmVkU3RyaW5nLCBzaWduZWQpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNhbGN1bGF0ZSBhbiBhZGRyZXNzIGZyb20gYSBwdWInLCAoKSA9PiB7XG4gICAgY29uc3QgcHViQnl0ZXMgPSBVdGlscy5nZXRCeXRlQXJyYXlGcm9tSGV4QWRkcmVzcyhwdWIpO1xuICAgIGNvbnN0IGJ5dGVzID0gVXRpbHMuZ2V0UmF3QWRkcmVzc0Zyb21QdWJLZXkocHViQnl0ZXMpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoYnl0ZXMsIGFkZHJCeXRlcyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdmVyaWZ5IGEgc2lnbmVkIG1lc3NhZ2UnLCAoKSA9PiB7XG4gICAgY29uc3QgaGV4RW5jb2RlZE1lc3NhZ2UgPSBCdWZmZXIuZnJvbSh0eHQpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoVXRpbHMudmVyaWZ5U2lnbmF0dXJlKGhleEVuY29kZWRNZXNzYWdlLCBiYXNlNTgsIHNpZ25lZFN0cmluZywgdHJ1ZSksIHRydWUpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGZhaWwgdG8gdmVyaWZ5IGEgc2lnbmVkIG1lc3NhZ2UgaWYgdGhlIG1lc3NhZ2UgaXMgbm90IGluIGhleCcsICgpID0+IHtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IFV0aWxzLnZlcmlmeVNpZ25hdHVyZSh0eHQsIGJhc2U1OCwgc2lnbmVkU3RyaW5nLCB0cnVlKSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZmFpbCB0byB2ZXJpZnkgYSBzaWduZWQgbWVzc2FnZSBpZiB0aGUgYWRkcmVzcyBpcyBub3QgaW4gYmFzZTU4JywgKCkgPT4ge1xuICAgIGNvbnN0IGhleEVuY29kZWRTdHJpbmcgPSBCdWZmZXIuZnJvbSh0eHQpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IFV0aWxzLnZlcmlmeVNpZ25hdHVyZShoZXhFbmNvZGVkU3RyaW5nLCBhZGRyZXNzSGV4LCBzaWduZWRTdHJpbmcsIHRydWUpKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBmYWlsIHRvIHZlcmlmeSBhIHNpZ25lZCBtZXNzYWdlIGlmIHRoZSBzaWduYXR1cmUgaXMgbm90IGluIGhleCcsICgpID0+IHtcbiAgICBjb25zdCBoZXhFbmNvZGVkU3RyaW5nID0gQnVmZmVyLmZyb20odHh0KS50b1N0cmluZygnaGV4Jyk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBVdGlscy52ZXJpZnlTaWduYXR1cmUoaGV4RW5jb2RlZFN0cmluZywgYmFzZTU4LCAnYWJjJywgdHJ1ZSkpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJldHVybiB0cmFuc2FjdGlvbiBkYXRhJywgKCkgPT4ge1xuICAgIGNvbnN0IGRhdGEgPSBVdGlscy5kZWNvZGVSYXdUcmFuc2FjdGlvbihVbnNpZ25lZFRyYW5zZmVyQ29udHJhY3RUeC50eC5yYXdfZGF0YV9oZXgpO1xuICAgIGFzc2VydC5lcXVhbChkYXRhLnRpbWVzdGFtcCwgVW5zaWduZWRUcmFuc2ZlckNvbnRyYWN0VHgudHgucmF3X2RhdGEudGltZXN0YW1wKTtcbiAgICBhc3NlcnQuZXF1YWwoZGF0YS5leHBpcmF0aW9uLCBVbnNpZ25lZFRyYW5zZmVyQ29udHJhY3RUeC50eC5yYXdfZGF0YS5leHBpcmF0aW9uKTtcbiAgICBhc3NlcnQub2soZGF0YS5jb250cmFjdHMpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGRlY29kZSBhIHRyYW5zZmVyIGNvbnRyYWN0JywgKCkgPT4ge1xuICAgIGNvbnN0IHR4ID0gVW5zaWduZWRUcmFuc2ZlckNvbnRyYWN0VHgudHg7XG4gICAgY29uc3QgcmF3VHggPSBVdGlscy5kZWNvZGVSYXdUcmFuc2FjdGlvbih0eC5yYXdfZGF0YV9oZXgpO1xuICAgIGNvbnN0IHZhbHVlID0gVW5zaWduZWRUcmFuc2ZlckNvbnRyYWN0VHgudHgucmF3X2RhdGEuY29udHJhY3RbMF0ucGFyYW1ldGVyLnZhbHVlO1xuICAgIGNvbnN0IHBhcnNlZENvbnRyYWN0ID0gVXRpbHMuZGVjb2RlVHJhbnNmZXJDb250cmFjdChcbiAgICAgIHJhd1R4LmNvbnRyYWN0c1swXS5wYXJhbWV0ZXIudmFsdWVcbiAgICApIGFzIEludGVyZmFjZS5UcmFuc2ZlckNvbnRyYWN0W107XG5cbiAgICBjb25zdCB0b0FkZHJlc3MgPSBVdGlscy5nZXRCYXNlNThBZGRyZXNzRnJvbUhleCh2YWx1ZS50b19hZGRyZXNzKTtcbiAgICBjb25zdCBvd25lckFkZHJlc3MgPSBVdGlscy5nZXRCYXNlNThBZGRyZXNzRnJvbUhleCh2YWx1ZS5vd25lcl9hZGRyZXNzKTtcbiAgICBjb25zdCBhbW91bnQgPSB2YWx1ZS5hbW91bnQ7XG5cbiAgICBhc3NlcnQuZXF1YWwocGFyc2VkQ29udHJhY3RbMF0ucGFyYW1ldGVyLnZhbHVlLnRvX2FkZHJlc3MsIHRvQWRkcmVzcyk7XG4gICAgYXNzZXJ0LmVxdWFsKHBhcnNlZENvbnRyYWN0WzBdLnBhcmFtZXRlci52YWx1ZS5vd25lcl9hZGRyZXNzLCBvd25lckFkZHJlc3MpO1xuICAgIGFzc2VydC5lcXVhbChwYXJzZWRDb250cmFjdFswXS5wYXJhbWV0ZXIudmFsdWUuYW1vdW50LCBhbW91bnQpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGRlY29kZSBhbiBBY2NvdW50UGVybWlzc2lvblVwZGF0ZSBDb250cmFjdCcsICgpID0+IHtcbiAgICBjb25zdCB0eCA9IFNpZ25lZEFjY291bnRQZXJtaXNzaW9uVXBkYXRlQ29udHJhY3RUeDtcbiAgICBjb25zdCB2YWx1ZSA9IHR4LnJhd19kYXRhLmNvbnRyYWN0WzBdLnBhcmFtZXRlci52YWx1ZTtcbiAgICBjb25zdCByYXdUeCA9IFV0aWxzLmRlY29kZVJhd1RyYW5zYWN0aW9uKHR4LnJhd19kYXRhX2hleCk7XG4gICAgY29uc3QgcGFyc2VkVHggPSBVdGlscy5kZWNvZGVBY2NvdW50UGVybWlzc2lvblVwZGF0ZUNvbnRyYWN0KFxuICAgICAgcmF3VHguY29udHJhY3RzWzBdLnBhcmFtZXRlci52YWx1ZVxuICAgICkgYXMgSW50ZXJmYWNlLkFjY291bnRQZXJtaXNzaW9uVXBkYXRlQ29udHJhY3Q7XG4gICAgY29uc3Qgb3duZXJBZGRyZXNzID0gVXRpbHMuZ2V0QmFzZTU4QWRkcmVzc0Zyb21IZXgodmFsdWUub3duZXJfYWRkcmVzcyk7XG4gICAgYXNzZXJ0LmVxdWFsKHBhcnNlZFR4Lm93bmVyQWRkcmVzcywgb3duZXJBZGRyZXNzKTtcbiAgICBhc3NlcnQuZXF1YWwocGFyc2VkVHgub3duZXIudHlwZSwgMCk7XG4gICAgYXNzZXJ0LmVxdWFsKHBhcnNlZFR4Lm93bmVyLnRocmVzaG9sZCwgMik7XG4gICAgYXNzZXJ0LmVxdWFsKHBhcnNlZFR4LmFjdGl2ZXMubGVuZ3RoLCAxKTtcbiAgICBhc3NlcnQuZXF1YWwocGFyc2VkVHguYWN0aXZlc1swXS50eXBlLCAyKTtcbiAgICBhc3NlcnQuZXF1YWwocGFyc2VkVHguYWN0aXZlc1swXS50aHJlc2hvbGQsIDIpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGVuY29kZSBhbmQgZGVjb2RlIGRhdGEgcGFyYW1ldGVycyBmb3IgdHJhbnNmZXInLCAoKSA9PiB7XG4gICAgY29uc3QgdHlwZXMgPSBbJ2FkZHJlc3MnLCAndWludDI1NiddO1xuICAgIGNvbnN0IGFtb3VudCA9ICcyMDAwMDAwMDAwMDAwMDAwMDAwMDAwJztcbiAgICBjb25zdCB2YWx1ZXMgPSBbYWRkcmVzc0hleCwgYW1vdW50XTtcbiAgICBjb25zdCBtZXRob2RJZCA9ICcweGE5MDU5Y2JiJztcbiAgICBjb25zdCBkYXRhID0gVXRpbHMuZW5jb2RlRGF0YVBhcmFtcyh0eXBlcywgdmFsdWVzLCBtZXRob2RJZCk7XG4gICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgZGF0YSxcbiAgICAgICdhOTA1OWNiYjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDJjMmJhNGE5ZmY2YzUzMjA3ZGM1YjY4NmJmZWNmNzVlYTdiODA1NzcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNmM2YjkzNWI4YmJkNDAwMDAwJ1xuICAgICk7XG5cbiAgICBjb25zdCBkZWNvZGVkRGF0YSA9IFV0aWxzLmRlY29kZURhdGFQYXJhbXMoXG4gICAgICB0eXBlcyxcbiAgICAgICdhOTA1OWNiYjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDJjMmJhNGE5ZmY2YzUzMjA3ZGM1YjY4NmJmZWNmNzVlYTdiODA1NzcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNmM2YjkzNWI4YmJkNDAwMDAwJ1xuICAgICk7XG4gICAgYXNzZXJ0LmVxdWFsKGRlY29kZWREYXRhWzBdLCBhZGRyZXNzSGV4LnRvTG9jYWxlTG93ZXJDYXNlKCkpO1xuICAgIGFzc2VydC5lcXVhbChkZWNvZGVkRGF0YVsxXS50b1N0cmluZygpLCBhbW91bnQpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNvcnJlY3RseSBtYXAgdGVzdG5ldCBhbmQgbWFpbm5ldCB0b2tlbnMnLCAoKSA9PiB7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRva2VuTWFpbm5ldENvbnRyYWN0QWRkcmVzc2VzLmluY2x1ZGVzKCdUU1NNSFllVjJ1RTlxWUg5NURxeW9DdU5DekVMMU52VTNTJyksIHRydWUpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0b2tlblRlc3RuZXRDb250cmFjdEFkZHJlc3Nlcy5pbmNsdWRlcygnVEdrZlVzaGRiQWlOajVHMW15bnAybWVxMkJmRjZYU0dQZicpLCB0cnVlKTtcbiAgfSk7XG59KTtcbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!