PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-coin-icp/dist/test/unit
Просмотр файла: utils.js
"use strict";
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 utils_1 = __importDefault(require("../../src/lib/utils"));
const icp_1 = require("../resources/icp");
const { encode } = require('cbor-x/index-no-eval');
const crypto_1 = require("crypto");
describe('utils', () => {
describe('isValidAddress()', () => {
it('should validate addresses correctly', () => {
should_1.default.equal(utils_1.default.isValidAddress(icp_1.Accounts.account1.address), true);
should_1.default.equal(utils_1.default.isValidAddress(icp_1.Accounts.account2.address), true);
should_1.default.equal(utils_1.default.isValidAddress(icp_1.Accounts.account3.address), true);
should_1.default.equal(utils_1.default.isValidAddress(icp_1.Accounts.account4.address), true);
should_1.default.equal(utils_1.default.isValidAddress(icp_1.Accounts.account5.address), true);
should_1.default.equal(utils_1.default.isValidAddress(icp_1.Accounts.account6.address), true);
});
it('should invalidate wrong addresses correctly', () => {
should_1.default.equal(utils_1.default.isValidAddress(icp_1.Accounts.errorsAccounts.account1.address), false);
should_1.default.equal(utils_1.default.isValidAddress(icp_1.Accounts.errorsAccounts.account2.address), false);
should_1.default.equal(utils_1.default.isValidAddress(icp_1.Accounts.errorsAccounts.account3.address), false);
should_1.default.equal(utils_1.default.isValidAddress(icp_1.Accounts.errorsAccounts.account4.address), false);
should_1.default.equal(utils_1.default.isValidAddress(icp_1.Accounts.errorsAccounts.account5.address), false);
should_1.default.equal(utils_1.default.isValidAddress(icp_1.Accounts.errorsAccounts.account6.address), false);
});
});
describe('isValidBlockId()', () => {
it('should validate block hashes correctly', () => {
should_1.default.equal(utils_1.default.isValidBlockId(icp_1.BlockHashes.validHashes.block1), true);
should_1.default.equal(utils_1.default.isValidBlockId(icp_1.BlockHashes.validHashes.block2), true);
should_1.default.equal(utils_1.default.isValidBlockId(icp_1.BlockHashes.validHashes.block3), true);
});
});
describe('isValidTransactionId()', () => {
it('should validate transaction hashes correctly', () => {
should_1.default.equal(utils_1.default.isValidBlockId(icp_1.TransactionHashes.validHashes.txId1), true);
should_1.default.equal(utils_1.default.isValidBlockId(icp_1.TransactionHashes.validHashes.txId2), true);
should_1.default.equal(utils_1.default.isValidBlockId(icp_1.TransactionHashes.validHashes.txId3), true);
});
});
describe('gasData()', () => {
it('should return correct gas data', () => {
should_1.default.equal(utils_1.default.feeData(), '-10000');
});
});
describe('isValidPublicKey()', () => {
it('should validate public key correctly', () => {
should_1.default.equal(utils_1.default.isValidPublicKey(icp_1.Accounts.account1.publicKey), true);
should_1.default.equal(utils_1.default.isValidPublicKey(icp_1.Accounts.account2.publicKey), true);
should_1.default.equal(utils_1.default.isValidPublicKey(icp_1.Accounts.account3.publicKey), true);
should_1.default.equal(utils_1.default.isValidPublicKey(icp_1.Accounts.account4.publicKey), true);
should_1.default.equal(utils_1.default.isValidPublicKey(icp_1.Accounts.account5.publicKey), true);
should_1.default.equal(utils_1.default.isValidPublicKey(icp_1.Accounts.account6.publicKey), true);
});
it('should invalidate public key correctly', () => {
should_1.default.equal(utils_1.default.isValidPublicKey(icp_1.Accounts.errorsAccounts.account1.publicKey), false);
should_1.default.equal(utils_1.default.isValidPublicKey(icp_1.Accounts.errorsAccounts.account2.publicKey), false);
should_1.default.equal(utils_1.default.isValidPublicKey(icp_1.Accounts.errorsAccounts.account3.publicKey), false);
should_1.default.equal(utils_1.default.isValidPublicKey(icp_1.Accounts.errorsAccounts.account4.publicKey), false);
should_1.default.equal(utils_1.default.isValidPublicKey(icp_1.Accounts.errorsAccounts.account5.publicKey), false);
should_1.default.equal(utils_1.default.isValidPublicKey(icp_1.Accounts.errorsAccounts.account6.publicKey), false);
});
});
describe('cborEncode()', () => {
it('should correctly encode an object', () => {
const value = { key: 'value' };
const expectedHex = Buffer.from(encode(value)).toString('hex');
should_1.default.equal(utils_1.default.cborEncode(value), expectedHex);
});
it('should encode and decode a big number correctly', () => {
const original = { number: BigInt(1740680777458000000) };
const encoded = encode(original);
const decoded = utils_1.default.cborDecode(encoded);
should_1.default.deepEqual(decoded, original);
});
});
describe('cborDecode()', () => {
it('should correctly decode a CBOR-encoded object', () => {
const original = { key: 'value', number: 100 };
const encoded = encode(original);
const decoded = utils_1.default.cborDecode(encoded);
should_1.default.deepEqual(decoded, original);
});
});
describe('isValidLength()', () => {
it('should return true for a valid compressed public key length (66 characters)', () => {
should_1.default.equal(utils_1.default.isValidLength('a'.repeat(66)), true);
});
});
describe('isValidHex()', () => {
it('should return true for a valid hexadecimal string', () => {
should_1.default.equal(utils_1.default.isValidHex('abcdef1234567890ABCDEF'), true);
});
});
describe('hexToBytes()', () => {
it('should correctly convert a valid hexadecimal string to a Uint8Array', () => {
const hex = 'abcdef123456';
const expected = new Uint8Array([0xab, 0xcd, 0xef, 0x12, 0x34, 0x56]);
should_1.default.deepEqual(utils_1.default.hexToBytes(hex), expected);
});
});
describe('isValidPrivateKey()', () => {
it('should validate private key correctly', () => {
should_1.default.equal(utils_1.default.isValidPrivateKey(icp_1.Accounts.account1.secretKey), true);
should_1.default.equal(utils_1.default.isValidPrivateKey(icp_1.Accounts.account2.secretKey), true);
should_1.default.equal(utils_1.default.isValidPrivateKey(icp_1.Accounts.account3.secretKey), true);
should_1.default.equal(utils_1.default.isValidPrivateKey(icp_1.Accounts.account4.secretKey), true);
should_1.default.equal(utils_1.default.isValidPrivateKey(icp_1.Accounts.account5.secretKey), true);
should_1.default.equal(utils_1.default.isValidPrivateKey(icp_1.Accounts.account6.secretKey), true);
});
it('should invalidate private key correctly', () => {
should_1.default.equal(utils_1.default.isValidPrivateKey(icp_1.Accounts.errorsAccounts.account1.secretKey), false);
should_1.default.equal(utils_1.default.isValidPrivateKey(icp_1.Accounts.errorsAccounts.account2.secretKey), false);
should_1.default.equal(utils_1.default.isValidPrivateKey(icp_1.Accounts.errorsAccounts.account3.secretKey), false);
should_1.default.equal(utils_1.default.isValidPrivateKey(icp_1.Accounts.errorsAccounts.account4.secretKey), false);
should_1.default.equal(utils_1.default.isValidPrivateKey(icp_1.Accounts.errorsAccounts.account5.secretKey), false);
should_1.default.equal(utils_1.default.isValidPrivateKey(icp_1.Accounts.errorsAccounts.account6.secretKey), false);
});
});
describe('getAddressFromPublicKey()', () => {
it('should return the correct address for a valid public key', async () => {
const address1 = await utils_1.default.getAddressFromPublicKey(icp_1.Accounts.account1.publicKey);
should_1.default.equal(address1, icp_1.Accounts.account1.address);
const address2 = await utils_1.default.getAddressFromPublicKey(icp_1.Accounts.account1.publicKey);
should_1.default.equal(address2, icp_1.Accounts.account1.address);
const address3 = await utils_1.default.getAddressFromPublicKey(icp_1.Accounts.account1.publicKey);
should_1.default.equal(address3, icp_1.Accounts.account1.address);
const address4 = await utils_1.default.getAddressFromPublicKey(icp_1.Accounts.account1.publicKey);
should_1.default.equal(address4, icp_1.Accounts.account1.address);
const address5 = await utils_1.default.getAddressFromPublicKey(icp_1.Accounts.account1.publicKey);
should_1.default.equal(address5, icp_1.Accounts.account1.address);
const address6 = await utils_1.default.getAddressFromPublicKey(icp_1.Accounts.account1.publicKey);
should_1.default.equal(address6, icp_1.Accounts.account1.address);
});
it('should throw an error for an invalid public key', async () => {
await (0, should_1.default)(utils_1.default.getAddressFromPublicKey(icp_1.Accounts.errorsAccounts.account1.publicKey)).be.rejectedWith('Invalid hex-encoded public key format.');
});
});
describe('generateKeyPair()', () => {
it('should generate a valid key pair without a seed', () => {
const keyPair = utils_1.default.generateKeyPair();
should_1.default.exist(keyPair);
should_1.default.exist(keyPair.pub);
should_1.default.exist(keyPair.prv);
});
it('should generate a valid key pair with a given seed', () => {
const seed = (0, crypto_1.randomBytes)(32);
const keyPair = utils_1.default.generateKeyPair(seed);
should_1.default.exist(keyPair);
should_1.default.exist(keyPair.pub);
should_1.default.exist(keyPair.prv);
});
it('should generate different key pairs for different seeds', () => {
const seed1 = (0, crypto_1.randomBytes)(32);
const seed2 = (0, crypto_1.randomBytes)(32);
const keyPair1 = utils_1.default.generateKeyPair(seed1);
const keyPair2 = utils_1.default.generateKeyPair(seed2);
should_1.default.notEqual(keyPair1.pub, keyPair2.pub);
should_1.default.notEqual(keyPair1.prv, keyPair2.prv);
});
it('should generate the same key pair for the same seed', () => {
const seed = (0, crypto_1.randomBytes)(32);
const keyPair1 = utils_1.default.generateKeyPair(seed);
const keyPair2 = utils_1.default.generateKeyPair(seed);
should_1.default.equal(keyPair1.pub, keyPair2.pub);
should_1.default.equal(keyPair1.prv, keyPair2.prv);
});
});
describe('validateRawTransaction()', () => {
const data = icp_1.IcpTransactionData;
it('should validate icpTransactionData correctly', () => {
utils_1.default.validateRawTransaction(data);
});
it('should throw an error for invalid expiryTime', () => {
(data.expiryTime = Date.now()), should_1.default.throws(() => utils_1.default.validateRawTransaction(data), 'Invalid expiry time');
});
it('should throw an error for invalid fee', () => {
data.fee = '-100';
should_1.default.throws(() => utils_1.default.validateRawTransaction(data), 'Invalid fee value');
});
it('should throw an error for invalid amount', () => {
data.amount = '0';
should_1.default.throws(() => utils_1.default.validateRawTransaction(data), 'amount cannot be less than or equal to zero');
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsZ0VBQXdDO0FBQ3hDLDBDQUFnRztBQUNoRyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUM7QUFDbkQsbUNBQXFDO0FBRXJDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFO0lBQ3JCLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUU7UUFDaEMsRUFBRSxDQUFDLHFDQUFxQyxFQUFFLEdBQUcsRUFBRTtZQUM3QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxlQUFLLENBQUMsY0FBYyxDQUFDLGNBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDcEUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsZUFBSyxDQUFDLGNBQWMsQ0FBQyxjQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3BFLGdCQUFNLENBQUMsS0FBSyxDQUFDLGVBQUssQ0FBQyxjQUFjLENBQUMsY0FBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwRSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxlQUFLLENBQUMsY0FBYyxDQUFDLGNBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDcEUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsZUFBSyxDQUFDLGNBQWMsQ0FBQyxjQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3BFLGdCQUFNLENBQUMsS0FBSyxDQUFDLGVBQUssQ0FBQyxjQUFjLENBQUMsY0FBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMs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RTtRQUN4QyxNQUFNLElBQUksR0FBRyx3QkFBa0IsQ0FBQztRQUNoQyxFQUFFLENBQUMsOENBQThDLEVBQUUsR0FBRyxFQUFFO1lBQ3RELGVBQUssQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyw4Q0FBOEMsRUFBRSxHQUFHLEVBQUU7WUFDdEQsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLGVBQUssQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBQ2pILENBQUMsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFDLHVDQUF1QyxFQUFFLEdBQUcsRUFBRTtZQUMvQyxJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQztZQUNsQixnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxlQUFLLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUMvRSxDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQywwQ0FBMEMsRUFBRSxHQUFHLEVBQUU7WUFDbEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7WUFDbEIsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsZUFBSyxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxFQUFFLDZDQUE2QyxDQUFDLENBQUM7UUFDekcsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4uLy4uL3NyYy9saWIvdXRpbHMnO1xuaW1wb3J0IHsgQWNjb3VudHMsIEljcFRyYW5zYWN0aW9uRGF0YSwgQmxvY2tIYXNoZXMsIFRyYW5zYWN0aW9uSGFzaGVzIH0gZnJvbSAnLi4vcmVzb3VyY2VzL2ljcCc7XG5jb25zdCB7IGVuY29kZSB9ID0gcmVxdWlyZSgnY2Jvci14L2luZGV4LW5vLWV2YWwnKTtcbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnY3J5cHRvJztcblxuZGVzY3JpYmUoJ3V0aWxzJywgKCkgPT4ge1xuICBkZXNjcmliZSgnaXNWYWxpZEFkZHJlc3MoKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGFkZHJlc3NlcyBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3MoQWNjb3VudHMuYWNjb3VudDEuYWRkcmVzcyksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRBZGRyZXNzKEFjY291bnRzLmFjY291bnQyLmFkZHJlc3MpLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyhBY2NvdW50cy5hY2NvdW50My5hZGRyZXNzKSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3MoQWNjb3VudHMuYWNjb3VudDQuYWRkcmVzcyksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRBZGRyZXNzKEFjY291bnRzLmFjY291bnQ1LmFkZHJlc3MpLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyhBY2NvdW50cy5hY2NvdW50Ni5hZGRyZXNzKSwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGludmFsaWRhdGUgd3JvbmcgYWRkcmVzc2VzIGNvcnJlY3RseScsICgpID0+IHtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyhBY2NvdW50cy5lcnJvcnNBY2NvdW50cy5hY2NvdW50MS5hZGRyZXNzKSwgZmFsc2UpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRBZGRyZXNzKEFjY291bnRzLmVycm9yc0FjY291bnRzLmFjY291bnQyLmFkZHJlc3MpLCBmYWxzZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3MoQWNjb3VudHMuZXJyb3JzQWNjb3VudHMuYWNjb3VudDMuYWRkcmVzcyksIGZhbHNlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyhBY2NvdW50cy5lcnJvcnNBY2NvdW50cy5hY2NvdW50NC5hZGRyZXNzKSwgZmFsc2UpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRBZGRyZXNzKEFjY291bnRzLmVycm9yc0FjY291bnRzLmFjY291bnQ1LmFkZHJlc3MpLCBmYWxzZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3MoQWNjb3VudHMuZXJyb3JzQWNjb3VudHMuYWNjb3VudDYuYWRkcmVzcyksIGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzVmFsaWRCbG9ja0lkKCknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBibG9jayBoYXNoZXMgY29ycmVjdGx5JywgKCkgPT4ge1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRCbG9ja0lkKEJsb2NrSGFzaGVzLnZhbGlkSGFzaGVzLmJsb2NrMSksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRCbG9ja0lkKEJsb2NrSGFzaGVzLnZhbGlkSGFzaGVzLmJsb2NrMiksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRCbG9ja0lkKEJsb2NrSGFzaGVzLnZhbGlkSGFzaGVzLmJsb2NrMyksIHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNWYWxpZFRyYW5zYWN0aW9uSWQoKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHRyYW5zYWN0aW9uIGhhc2hlcyBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEJsb2NrSWQoVHJhbnNhY3Rpb25IYXNoZXMudmFsaWRIYXNoZXMudHhJZDEpLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQmxvY2tJZChUcmFuc2FjdGlvbkhhc2hlcy52YWxpZEhhc2hlcy50eElkMiksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRCbG9ja0lkKFRyYW5zYWN0aW9uSGFzaGVzLnZhbGlkSGFzaGVzLnR4SWQzKSwgdHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnYXNEYXRhKCknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gY29ycmVjdCBnYXMgZGF0YScsICgpID0+IHtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5mZWVEYXRhKCksICctMTAwMDAnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzVmFsaWRQdWJsaWNLZXkoKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHB1YmxpYyBrZXkgY29ycmVjdGx5JywgKCkgPT4ge1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkoQWNjb3VudHMuYWNjb3VudDEucHVibGljS2V5KSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFB1YmxpY0tleShBY2NvdW50cy5hY2NvdW50Mi5wdWJsaWNLZXkpLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUHVibGljS2V5KEFjY291bnRzLmFjY291bnQzLnB1YmxpY0tleSksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkoQWNjb3VudHMuYWNjb3VudDQucHVibGljS2V5KSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFB1YmxpY0tleShBY2NvdW50cy5hY2NvdW50NS5wdWJsaWNLZXkpLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUHVibGljS2V5KEFjY291bnRzLmFjY291bnQ2LnB1YmxpY0tleSksIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBpbnZhbGlkYXRlIHB1YmxpYyBrZXkgY29ycmVjdGx5JywgKCkgPT4ge1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkoQWNjb3VudHMuZXJyb3JzQWNjb3VudHMuYWNjb3VudDEucHVibGljS2V5KSwgZmFsc2UpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkoQWNjb3VudHMuZXJyb3JzQWNjb3VudHMuYWNjb3VudDIucHVibGljS2V5KSwgZmFsc2UpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkoQWNjb3VudHMuZXJyb3JzQWNjb3VudHMuYWNjb3VudDMucHVibGljS2V5KSwgZmFsc2UpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkoQWNjb3VudHMuZXJyb3JzQWNjb3VudHMuYWNjb3VudDQucHVibGljS2V5KSwgZmFsc2UpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkoQWNjb3VudHMuZXJyb3JzQWNjb3VudHMuYWNjb3VudDUucHVibGljS2V5KSwgZmFsc2UpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkoQWNjb3VudHMuZXJyb3JzQWNjb3VudHMuYWNjb3VudDYucHVibGljS2V5KSwgZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY2JvckVuY29kZSgpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgY29ycmVjdGx5IGVuY29kZSBhbiBvYmplY3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHsga2V5OiAndmFsdWUnIH07XG4gICAgICBjb25zdCBleHBlY3RlZEhleCA9IEJ1ZmZlci5mcm9tKGVuY29kZSh2YWx1ZSkpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5jYm9yRW5jb2RlKHZhbHVlKSwgZXhwZWN0ZWRIZXgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBlbmNvZGUgYW5kIGRlY29kZSBhIGJpZyBudW1iZXIgY29ycmVjdGx5JywgKCkgPT4ge1xuICAgICAgY29uc3Qgb3JpZ2luYWwgPSB7IG51bWJlcjogQmlnSW50KDE3NDA2ODA3Nzc0NTgwMDAwMDApIH07XG4gICAgICBjb25zdCBlbmNvZGVkID0gZW5jb2RlKG9yaWdpbmFsKTtcbiAgICAgIGNvbnN0IGRlY29kZWQgPSB1dGlscy5jYm9yRGVjb2RlKGVuY29kZWQpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbChkZWNvZGVkLCBvcmlnaW5hbCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjYm9yRGVjb2RlKCknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgZGVjb2RlIGEgQ0JPUi1lbmNvZGVkIG9iamVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsID0geyBrZXk6ICd2YWx1ZScsIG51bWJlcjogMTAwIH07XG4gICAgICBjb25zdCBlbmNvZGVkID0gZW5jb2RlKG9yaWdpbmFsKTtcbiAgICAgIGNvbnN0IGRlY29kZWQgPSB1dGlscy5jYm9yRGVjb2RlKGVuY29kZWQpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbChkZWNvZGVkLCBvcmlnaW5hbCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpc1ZhbGlkTGVuZ3RoKCknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSBmb3IgYSB2YWxpZCBjb21wcmVzc2VkIHB1YmxpYyBrZXkgbGVuZ3RoICg2NiBjaGFyYWN0ZXJzKScsICgpID0+IHtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkTGVuZ3RoKCdhJy5yZXBlYXQoNjYpKSwgdHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpc1ZhbGlkSGV4KCknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSBmb3IgYSB2YWxpZCBoZXhhZGVjaW1hbCBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEhleCgnYWJjZGVmMTIzNDU2Nzg5MEFCQ0RFRicpLCB0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2hleFRvQnl0ZXMoKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGNvcnJlY3RseSBjb252ZXJ0IGEgdmFsaWQgaGV4YWRlY2ltYWwgc3RyaW5nIHRvIGEgVWludDhBcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IGhleCA9ICdhYmNkZWYxMjM0NTYnO1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSBuZXcgVWludDhBcnJheShbMHhhYiwgMHhjZCwgMHhlZiwgMHgxMiwgMHgzNCwgMHg1Nl0pO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh1dGlscy5oZXhUb0J5dGVzKGhleCksIGV4cGVjdGVkKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzVmFsaWRQcml2YXRlS2V5KCknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBwcml2YXRlIGtleSBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFByaXZhdGVLZXkoQWNjb3VudHMuYWNjb3VudDEuc2VjcmV0S2V5KSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFByaXZhdGVLZXkoQWNjb3VudHMuYWNjb3VudDIuc2VjcmV0S2V5KSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFByaXZhdGVLZXkoQWNjb3VudHMuYWNjb3VudDMuc2VjcmV0S2V5KSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFByaXZhdGVLZXkoQWNjb3VudHMuYWNjb3VudDQuc2VjcmV0S2V5KSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFByaXZhdGVLZXkoQWNjb3VudHMuYWNjb3VudDUuc2VjcmV0S2V5KSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFByaXZhdGVLZXkoQWNjb3VudHMuYWNjb3VudDYuc2VjcmV0S2V5KSwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGludmFsaWRhdGUgcHJpdmF0ZSBrZXkgY29ycmVjdGx5JywgKCkgPT4ge1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRQcml2YXRlS2V5KEFjY291bnRzLmVycm9yc0FjY291bnRzLmFjY291bnQxLnNlY3JldEtleSksIGZhbHNlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUHJpdmF0ZUtleShBY2NvdW50cy5lcnJvcnNBY2NvdW50cy5hY2NvdW50Mi5zZWNyZXRLZXkpLCBmYWxzZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFByaXZhdGVLZXkoQWNjb3VudHMuZXJyb3JzQWNjb3VudHMuYWNjb3VudDMuc2VjcmV0S2V5KSwgZmFsc2UpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRQcml2YXRlS2V5KEFjY291bnRzLmVycm9yc0FjY291bnRzLmFjY291bnQ0LnNlY3JldEtleSksIGZhbHNlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUHJpdmF0ZUtleShBY2NvdW50cy5lcnJvcnNBY2NvdW50cy5hY2NvdW50NS5zZWNyZXRLZXkpLCBmYWxzZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFByaXZhdGVLZXkoQWNjb3VudHMuZXJyb3JzQWNjb3VudHMuYWNjb3VudDYuc2VjcmV0S2V5KSwgZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXkoKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgY29ycmVjdCBhZGRyZXNzIGZvciBhIHZhbGlkIHB1YmxpYyBrZXknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBhZGRyZXNzMSA9IGF3YWl0IHV0aWxzLmdldEFkZHJlc3NGcm9tUHVibGljS2V5KEFjY291bnRzLmFjY291bnQxLnB1YmxpY0tleSk7XG4gICAgICBzaG91bGQuZXF1YWwoYWRkcmVzczEsIEFjY291bnRzLmFjY291bnQxLmFkZHJlc3MpO1xuICAgICAgY29uc3QgYWRkcmVzczIgPSBhd2FpdCB1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShBY2NvdW50cy5hY2NvdW50MS5wdWJsaWNLZXkpO1xuICAgICAgc2hvdWxkLmVxdWFsKGFkZHJlc3MyLCBBY2NvdW50cy5hY2NvdW50MS5hZGRyZXNzKTtcbiAgICAgIGNvbnN0IGFkZHJlc3MzID0gYXdhaXQgdXRpbHMuZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXkoQWNjb3VudHMuYWNjb3VudDEucHVibGljS2V5KTtcbiAgICAgIHNob3VsZC5lcXVhbChhZGRyZXNzMywgQWNjb3VudHMuYWNjb3VudDEuYWRkcmVzcyk7XG4gICAgICBjb25zdCBhZGRyZXNzNCA9IGF3YWl0IHV0aWxzLmdldEFkZHJlc3NGcm9tUHVibGljS2V5KEFjY291bnRzLmFjY291bnQxLnB1YmxpY0tleSk7XG4gICAgICBzaG91bGQuZXF1YWwoYWRkcmVzczQsIEFjY291bnRzLmFjY291bnQxLmFkZHJlc3MpO1xuICAgICAgY29uc3QgYWRkcmVzczUgPSBhd2FpdCB1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShBY2NvdW50cy5hY2NvdW50MS5wdWJsaWNLZXkpO1xuICAgICAgc2hvdWxkLmVxdWFsKGFkZHJlc3M1LCBBY2NvdW50cy5hY2NvdW50MS5hZGRyZXNzKTtcbiAgICAgIGNvbnN0IGFkZHJlc3M2ID0gYXdhaXQgdXRpbHMuZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXkoQWNjb3VudHMuYWNjb3VudDEucHVibGljS2V5KTtcbiAgICAgIHNob3VsZC5lcXVhbChhZGRyZXNzNiwgQWNjb3VudHMuYWNjb3VudDEuYWRkcmVzcyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGFuIGVycm9yIGZvciBhbiBpbnZhbGlkIHB1YmxpYyBrZXknLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBzaG91bGQodXRpbHMuZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXkoQWNjb3VudHMuZXJyb3JzQWNjb3VudHMuYWNjb3VudDEucHVibGljS2V5KSkuYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgICAnSW52YWxpZCBoZXgtZW5jb2RlZCBwdWJsaWMga2V5IGZvcm1hdC4nXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2VuZXJhdGVLZXlQYWlyKCknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBhIHZhbGlkIGtleSBwYWlyIHdpdGhvdXQgYSBzZWVkJywgKCkgPT4ge1xuICAgICAgY29uc3Qga2V5UGFpciA9IHV0aWxzLmdlbmVyYXRlS2V5UGFpcigpO1xuICAgICAgc2hvdWxkLmV4aXN0KGtleVBhaXIpO1xuICAgICAgc2hvdWxkLmV4aXN0KGtleVBhaXIucHViKTtcbiAgICAgIHNob3VsZC5leGlzdChrZXlQYWlyLnBydik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdlbmVyYXRlIGEgdmFsaWQga2V5IHBhaXIgd2l0aCBhIGdpdmVuIHNlZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzZWVkID0gcmFuZG9tQnl0ZXMoMzIpO1xuICAgICAgY29uc3Qga2V5UGFpciA9IHV0aWxzLmdlbmVyYXRlS2V5UGFpcihzZWVkKTtcbiAgICAgIHNob3VsZC5leGlzdChrZXlQYWlyKTtcbiAgICAgIHNob3VsZC5leGlzdChrZXlQYWlyLnB1Yik7XG4gICAgICBzaG91bGQuZXhpc3Qoa2V5UGFpci5wcnYpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBkaWZmZXJlbnQga2V5IHBhaXJzIGZvciBkaWZmZXJlbnQgc2VlZHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzZWVkMSA9IHJhbmRvbUJ5dGVzKDMyKTtcbiAgICAgIGNvbnN0IHNlZWQyID0gcmFuZG9tQnl0ZXMoMzIpO1xuICAgICAgY29uc3Qga2V5UGFpcjEgPSB1dGlscy5nZW5lcmF0ZUtleVBhaXIoc2VlZDEpO1xuICAgICAgY29uc3Qga2V5UGFpcjIgPSB1dGlscy5nZW5lcmF0ZUtleVBhaXIoc2VlZDIpO1xuXG4gICAgICBzaG91bGQubm90RXF1YWwoa2V5UGFpcjEucHViLCBrZXlQYWlyMi5wdWIpO1xuICAgICAgc2hvdWxkLm5vdEVxdWFsKGtleVBhaXIxLnBydiwga2V5UGFpcjIucHJ2KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2VuZXJhdGUgdGhlIHNhbWUga2V5IHBhaXIgZm9yIHRoZSBzYW1lIHNlZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzZWVkID0gcmFuZG9tQnl0ZXMoMzIpO1xuICAgICAgY29uc3Qga2V5UGFpcjEgPSB1dGlscy5nZW5lcmF0ZUtleVBhaXIoc2VlZCk7XG4gICAgICBjb25zdCBrZXlQYWlyMiA9IHV0aWxzLmdlbmVyYXRlS2V5UGFpcihzZWVkKTtcblxuICAgICAgc2hvdWxkLmVxdWFsKGtleVBhaXIxLnB1Yiwga2V5UGFpcjIucHViKTtcbiAgICAgIHNob3VsZC5lcXVhbChrZXlQYWlyMS5wcnYsIGtleVBhaXIyLnBydik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd2YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKCknLCAoKSA9PiB7XG4gICAgY29uc3QgZGF0YSA9IEljcFRyYW5zYWN0aW9uRGF0YTtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGljcFRyYW5zYWN0aW9uRGF0YSBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICB1dGlscy52YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKGRhdGEpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgdGhyb3cgYW4gZXJyb3IgZm9yIGludmFsaWQgZXhwaXJ5VGltZScsICgpID0+IHtcbiAgICAgIChkYXRhLmV4cGlyeVRpbWUgPSBEYXRlLm5vdygpKSwgc2hvdWxkLnRocm93cygoKSA9PiB1dGlscy52YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKGRhdGEpLCAnSW52YWxpZCBleHBpcnkgdGltZScpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgdGhyb3cgYW4gZXJyb3IgZm9yIGludmFsaWQgZmVlJywgKCkgPT4ge1xuICAgICAgZGF0YS5mZWUgPSAnLTEwMCc7XG4gICAgICBzaG91bGQudGhyb3dzKCgpID0+IHV0aWxzLnZhbGlkYXRlUmF3VHJhbnNhY3Rpb24oZGF0YSksICdJbnZhbGlkIGZlZSB2YWx1ZScpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgdGhyb3cgYW4gZXJyb3IgZm9yIGludmFsaWQgYW1vdW50JywgKCkgPT4ge1xuICAgICAgZGF0YS5hbW91bnQgPSAnMCc7XG4gICAgICBzaG91bGQudGhyb3dzKCgpID0+IHV0aWxzLnZhbGlkYXRlUmF3VHJhbnNhY3Rpb24oZGF0YSksICdhbW91bnQgY2Fubm90IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB6ZXJvJyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=Выполнить команду
Для локальной разработки. Не используйте в интернете!