PHP WebShell

Текущая директория: /opt/BitGoJS/modules/sdk-coin-ada/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 src_1 = require("../../src");
const sdk_core_1 = require("@bitgo/sdk-core");
const cardano_serialization_lib_nodejs_1 = require("@emurgo/cardano-serialization-lib-nodejs");
const resources_1 = require("../resources");
describe('utils', () => {
    it('should validate addresses correctly', () => {
        should_1.default.equal(src_1.Utils.default.isValidAddress(resources_1.address.address1), true);
        should_1.default.equal(src_1.Utils.default.isValidAddress(resources_1.address.address2), true);
        should_1.default.equal(src_1.Utils.default.isValidAddress(resources_1.address.address3), true);
        should_1.default.equal(src_1.Utils.default.isValidAddress(resources_1.address.address4), true);
        should_1.default.equal(src_1.Utils.default.isValidAddress('dfjk35y'), false);
        should_1.default.equal(src_1.Utils.default.isValidAddress(undefined), false);
        should_1.default.equal(src_1.Utils.default.isValidAddress(''), false);
        // validator addresses
        should_1.default.equal(src_1.Utils.default.isValidAddress(resources_1.address.address7), true);
        should_1.default.equal(src_1.Utils.default.isValidAddress(resources_1.address.address8), true);
        should_1.default.equal(src_1.Utils.default.isValidAddress(resources_1.address.address9), false);
        should_1.default.equal(src_1.Utils.default.isValidAddress(resources_1.address.address10), false);
        should_1.default.equal(src_1.Utils.default.isValidAddress(resources_1.address.address11), false);
        should_1.default.equal(src_1.Utils.default.isValidAddress(resources_1.address.address12), false);
        should_1.default.equal(src_1.Utils.default.isValidAddress(resources_1.address.address13), false);
        should_1.default.equal(src_1.Utils.default.isValidAddress(resources_1.address.address14), false);
        should_1.default.equal(src_1.Utils.default.isValidAddress(resources_1.address.address15), false);
        should_1.default.equal(src_1.Utils.default.isValidAddress(resources_1.address.address16), false);
        // Byron addresses
        should_1.default.equal(src_1.Utils.default.isValidAddress(resources_1.address.byron1), true);
        should_1.default.equal(src_1.Utils.default.isValidAddress(resources_1.address.byron2), true);
        should_1.default.equal(src_1.Utils.default.isValidAddress(resources_1.address.byron3), true);
        should_1.default.equal(src_1.Utils.default.isValidAddress(resources_1.address.byron4), false);
        should_1.default.equal(src_1.Utils.default.isValidAddress(resources_1.address.byron5), false);
        should_1.default.equal(src_1.Utils.default.isValidAddress(resources_1.address.byron6), false);
    });
    it('should create stake and payment keys correctly', () => {
        const keyPair1 = new src_1.KeyPair({ pub: resources_1.enterpriseAccounts.account1.publicKey });
        const keyPair2 = new src_1.KeyPair({ pub: resources_1.enterpriseAccounts.account3.publicKey });
        should_1.default.equal(src_1.Utils.default.createBaseAddressWithStakeAndPaymentKey(keyPair1, keyPair2, sdk_core_1.AddressFormat.testnet), 'addr_test1qq9arfq9pugs57apr3535z470ma2tvg8pnjy54q6s60muz5kelhytwhzrw9snh7759n9m8fr2xurpk4zyw8hmvk2avdsf62mmj');
    });
    it('should create stake and payment keys correctly from private keys', () => {
        const keyPair1 = new src_1.KeyPair({ prv: resources_1.privateKeys.prvKey4 });
        const keyPair2 = new src_1.KeyPair({ prv: resources_1.privateKeys.prvKey2 });
        should_1.default.equal(src_1.Utils.default.createBaseAddressWithStakeAndPaymentKey(keyPair1, keyPair2, sdk_core_1.AddressFormat.testnet), 'addr_test1qqvglhn9k8um66dsahxyukn9l2f6zdmnpy8puth00gjulk7g0xp5f99mdzwswz4rmfwu00x724w2jahygheyk2zqg9lsvz2muj');
    });
    it('should create stake and payment keys correctly with keypairs initialized from nothing', () => {
        const keyPair1 = new src_1.KeyPair();
        const keyPair2 = new src_1.KeyPair();
        should_1.default.equal(src_1.Utils.default.createBaseAddressWithStakeAndPaymentKey(keyPair1, keyPair2, sdk_core_1.AddressFormat.testnet), src_1.Utils.default.createBaseAddressWithStakeAndPaymentKey(keyPair1, keyPair2, sdk_core_1.AddressFormat.testnet));
    });
    it('should validate block hash correctly', () => {
        should_1.default.equal(src_1.Utils.default.isValidBlockId(resources_1.blockHash.hash1), true);
        should_1.default.equal(src_1.Utils.default.isValidBlockId(resources_1.blockHash.hash2), true);
        // param is coming as undefined so it was causing an issue
        should_1.default.equal(src_1.Utils.default.isValidBlockId(undefined), false);
        should_1.default.equal(src_1.Utils.default.isValidBlockId(''), false);
    });
    it('should validate invalid block hash correctly', () => {
        should_1.default.equal(src_1.Utils.default.isValidBlockId(''), false);
        should_1.default.equal(src_1.Utils.default.isValidBlockId('0xade35465gfvdcsxsz24300'), false);
        should_1.default.equal(src_1.Utils.default.isValidBlockId(resources_1.blockHash.hash2 + 'ff'), false);
    });
    it('should validate public key correctly', () => {
        should_1.default.equal(src_1.Utils.default.isValidPublicKey('da025aa02990ef466069fadce5e3dcfad663914d6bf42fea3be50a8c3094d8e8'), true);
        should_1.default.equal(src_1.Utils.default.isValidPublicKey(resources_1.publicKeys.pubKey1), true);
        should_1.default.equal(src_1.Utils.default.isValidPublicKey(resources_1.publicKeys.pubKey2), true);
        should_1.default.equal(src_1.Utils.default.isValidPublicKey(resources_1.publicKeys.pubKey3), true);
        should_1.default.equal(src_1.Utils.default.isValidPublicKey(resources_1.publicKeys.pubKey4), false);
    });
    it('should validate private key correctly', () => {
        should_1.default.equal(src_1.Utils.default.isValidPrivateKey(resources_1.privateKeys.prvKeyExtended), true);
        should_1.default.equal(src_1.Utils.default.isValidPrivateKey(resources_1.privateKeys.prvKey2), true);
        should_1.default.equal(src_1.Utils.default.isValidPrivateKey(resources_1.privateKeys.prvKey3WrongFormat), false);
        should_1.default.equal(src_1.Utils.default.isValidPrivateKey(resources_1.privateKeys.prvKey4), true);
        should_1.default.equal(src_1.Utils.default.isValidPrivateKey(resources_1.privateKeys.prvKey5WrongFormat), false);
    });
    it('should validate signature correctly', () => {
        should_1.default.equal(src_1.Utils.default.isValidSignature((0, sdk_core_1.toHex)(cardano_serialization_lib_nodejs_1.Ed25519Signature.from_bech32(resources_1.signatures.signature1).to_bytes())), true);
        should_1.default.equal(src_1.Utils.default.isValidSignature((0, sdk_core_1.toHex)(cardano_serialization_lib_nodejs_1.Ed25519Signature.from_bech32(resources_1.signatures.signature2).to_bytes())), true);
    });
    it('should validate invalid signature correctly', () => {
        should_1.default.equal(src_1.Utils.default.isValidSignature(''), false);
        should_1.default.equal(src_1.Utils.default.isValidSignature('0x00'), false);
        should_1.default.equal(src_1.Utils.default.isValidSignature(resources_1.privateKeys.prvKeyExtended), false);
        should_1.default.equal(src_1.Utils.default.isValidSignature(resources_1.signatures.signature1.slice(2)), false);
        should_1.default.equal(src_1.Utils.default.isValidSignature(resources_1.signatures.signature2 + 'ff'), false);
    });
    it('should validate transaction id correctly', () => {
        should_1.default.equal(src_1.Utils.default.isValidTransactionId(resources_1.txIds.hash1), true);
        should_1.default.equal(src_1.Utils.default.isValidTransactionId(resources_1.txIds.hash2), true);
        should_1.default.equal(src_1.Utils.default.isValidTransactionId(resources_1.txIds.hash3), true);
    });
    it('should validate invalid transaction id correctly', () => {
        should_1.default.equal(src_1.Utils.default.isValidTransactionId(''), false);
        should_1.default.equal(src_1.Utils.default.isValidTransactionId(resources_1.txIds.hash1.slice(3)), false);
        should_1.default.equal(src_1.Utils.default.isValidTransactionId(resources_1.txIds.hash3 + '00'), false);
        should_1.default.equal(src_1.Utils.default.isValidTransactionId('dalij43ta0ga2dadda02'), false);
    });
    it('should validate DRepId correctly', () => {
        should_1.default.equal(src_1.Utils.default.isValidDRepId('always-abstain'), true);
        should_1.default.equal(src_1.Utils.default.isValidDRepId('not-a-correct-choice'), false);
        should_1.default.equal(src_1.Utils.default.isValidDRepId('always-no-confidence'), true);
        should_1.default.equal(src_1.Utils.default.isValidDRepId('drep13d6sxkyz6st9h65qqrzd8ukpywhr8swe9f6357qntgjqye0incorrect'), false);
        // CIP-105 standard DRepId
        should_1.default.equal(src_1.Utils.default.isValidDRepId('drep13d6sxkyz6st9h65qqrzd8ukpywhr8swe9f6357qntgjqye0gttd'), true);
        // CIP-129 standard DRepId
        should_1.default.equal(src_1.Utils.default.isValidDRepId('drep1y29h2q6cst2pvkl2sqqvf5ljcy36uv7pmy482xnczddzgqshus24w'), true);
    });
    it('should get DRep entity from DRepId correctly', () => {
        should_1.default.equal(src_1.Utils.default.getDRepFromDRepId('always-abstain').to_json(), cardano_serialization_lib_nodejs_1.DRep.new_always_abstain().to_json());
        should_1.default.equal(src_1.Utils.default.getDRepFromDRepId('always-no-confidence').to_json(), cardano_serialization_lib_nodejs_1.DRep.new_always_no_confidence().to_json());
        should_1.default.equal(src_1.Utils.default.getDRepFromDRepId('drep13d6sxkyz6st9h65qqrzd8ukpywhr8swe9f6357qntgjqye0gttd').to_json(), cardano_serialization_lib_nodejs_1.DRep.from_bech32('drep13d6sxkyz6st9h65qqrzd8ukpywhr8swe9f6357qntgjqye0gttd').to_json());
        // DRep should be the same from both CIP-105 and CIP-129 IDs
        should_1.default.equal(src_1.Utils.default.getDRepFromDRepId('drep1y29h2q6cst2pvkl2sqqvf5ljcy36uv7pmy482xnczddzgqshus24w').to_json(), src_1.Utils.default.getDRepFromDRepId('drep13d6sxkyz6st9h65qqrzd8ukpywhr8swe9f6357qntgjqye0gttd').to_json());
    });
    it('should get DRepId from DRep entity correctly', () => {
        should_1.default.equal(src_1.Utils.default.getDRepIdFromDRep(cardano_serialization_lib_nodejs_1.DRep.new_always_abstain()), 'always-abstain');
        should_1.default.equal(src_1.Utils.default.getDRepIdFromDRep(cardano_serialization_lib_nodejs_1.DRep.new_always_no_confidence()), 'always-no-confidence');
        // Regardless of whether DRep was created from CIP-105 or CIP-129 ID, the DRepId from getDRepIdFromDRep will be the ID format from `to_bech32`
        should_1.default.equal(src_1.Utils.default.getDRepIdFromDRep(src_1.Utils.default.getDRepFromDRepId('drep13d6sxkyz6st9h65qqrzd8ukpywhr8swe9f6357qntgjqye0gttd')), 'drep13d6sxkyz6st9h65qqrzd8ukpywhr8swe9f6357qntgjqye0gttd');
        should_1.default.equal(src_1.Utils.default.getDRepIdFromDRep(src_1.Utils.default.getDRepFromDRepId('drep1y29h2q6cst2pvkl2sqqvf5ljcy36uv7pmy482xnczddzgqshus24w')), 'drep13d6sxkyz6st9h65qqrzd8ukpywhr8swe9f6357qntgjqye0gttd');
    });
    it('should get transaction body correctly', () => {
        const { unsignedTx, unsignedTxBody, unsignedVoteDelegationTx, unsignedVoteDelegationTxBody, unsignedStakingActiveTx, unsignedStakingActiveTxBody, unsignedStakingDeactiveTx, unsignedStakingDeactiveTxBody, unsignedStakingWithdrawTx, unsignedStakingWithdrawTxBody, unsignedUpdatePledgeTx, unsignedUpdatePledgeTxBody, unsignedNewPledgeTx, unsignedNewPledgeTxBody, partiallySignedPledgeTx, } = resources_1.rawTx;
        should_1.default.equal(src_1.Utils.default.getTransactionBody(unsignedTx), unsignedTxBody);
        should_1.default.equal(src_1.Utils.default.getTransactionBody(unsignedVoteDelegationTx), unsignedVoteDelegationTxBody);
        should_1.default.equal(src_1.Utils.default.getTransactionBody(unsignedStakingActiveTx), unsignedStakingActiveTxBody);
        should_1.default.equal(src_1.Utils.default.getTransactionBody(unsignedStakingDeactiveTx), unsignedStakingDeactiveTxBody);
        should_1.default.equal(src_1.Utils.default.getTransactionBody(unsignedStakingWithdrawTx), unsignedStakingWithdrawTxBody);
        should_1.default.equal(src_1.Utils.default.getTransactionBody(unsignedUpdatePledgeTx), unsignedUpdatePledgeTxBody);
        should_1.default.equal(src_1.Utils.default.getTransactionBody(unsignedNewPledgeTx), unsignedNewPledgeTxBody);
        should_1.default.equal(src_1.Utils.default.getTransactionBody(partiallySignedPledgeTx), unsignedNewPledgeTxBody);
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsbUNBQTJDO0FBQzNDLDhDQUF1RDtBQUN2RCwrRkFBa0Y7QUFDbEYsNENBU3NCO0FBRXRCLFFBQVEsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFO0lBQ3JCLEVBQUUsQ0FBQyxxQ0FBcUMsRUFBRSxHQUFHLEVBQUU7UUFDN0MsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsV0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsbUJBQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuRSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxXQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxtQkFBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25FLGdCQUFNLENBQUMsS0FBSyxDQUFDLFdBQUssQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLG1CQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbkUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsV0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsbUJBQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuRSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxXQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM3RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxXQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxTQUE4QixDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbEYsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsV0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxD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LENBQUMsS0FBSyxDQUFDLFdBQUssQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsbUJBQW1CLENBQUMsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO1FBQzdGLGdCQUFNLENBQUMsS0FBSyxDQUFDLFdBQUssQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsdUJBQXVCLENBQUMsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO0lBQ25HLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyBLZXlQYWlyLCBVdGlscyB9IGZyb20gJy4uLy4uL3NyYyc7XG5pbXBvcnQgeyBBZGRyZXNzRm9ybWF0LCB0b0hleCB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBFZDI1NTE5U2lnbmF0dXJlLCBEUmVwIH0gZnJvbSAnQGVtdXJnby9jYXJkYW5vLXNlcmlhbGl6YXRpb24tbGliLW5vZGVqcyc7XG5pbXBvcnQge1xuICBhZGRyZXNzLFxuICBibG9ja0hhc2gsXG4gIGVudGVycHJpc2VBY2NvdW50cyxcbiAgcHJpdmF0ZUtleXMsXG4gIHB1YmxpY0tleXMsXG4gIHNpZ25hdHVyZXMsXG4gIHR4SWRzLFxuICByYXdUeCxcbn0gZnJvbSAnLi4vcmVzb3VyY2VzJztcblxuZGVzY3JpYmUoJ3V0aWxzJywgKCkgPT4ge1xuICBpdCgnc2hvdWxkIHZhbGlkYXRlIGFkZHJlc3NlcyBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgc2hvdWxkLmVxdWFsKFV0aWxzLmRlZmF1bHQuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcy5hZGRyZXNzMSksIHRydWUpO1xuICAgIHNob3VsZC5lcXVhbChVdGlscy5kZWZhdWx0LmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MuYWRkcmVzczIpLCB0cnVlKTtcbiAgICBzaG91bGQuZXF1YWwoVXRpbHMuZGVmYXVsdC5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzLmFkZHJlc3MzKSwgdHJ1ZSk7XG4gICAgc2hvdWxkLmVxdWFsKFV0aWxzLmRlZmF1bHQuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcy5hZGRyZXNzNCksIHRydWUpO1xuICAgIHNob3VsZC5lcXVhbChVdGlscy5kZWZhdWx0LmlzVmFsaWRBZGRyZXNzKCdkZmprMzV5JyksIGZhbHNlKTtcbiAgICBzaG91bGQuZXF1YWwoVXRpbHMuZGVmYXVsdC5pc1ZhbGlkQWRkcmVzcyh1bmRlZmluZWQgYXMgdW5rbm93biBhcyBzdHJpbmcpLCBmYWxzZSk7XG4gICAgc2hvdWxkLmVxdWFsKFV0aWxzLmRlZmF1bHQuaXNWYWxpZEFkZHJlc3MoJycpLCBmYWxzZSk7XG5cbiAgICAvLyB2YWxpZGF0b3IgYWRkcmVzc2VzXG4gICAgc2hvdWxkLmVxdWFsKFV0aWxzLmRlZmF1bHQuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcy5hZGRyZXNzNyksIHRydWUpO1xuICAgIHNob3VsZC5lcXVhbChVdGlscy5kZWZhdWx0LmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MuYWRkcmVzczgpLCB0cnVlKTtcbiAgICBzaG91bGQuZXF1YWwoVXRpbHMuZGVmYXVsdC5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzLmFkZHJlc3M5KSwgZmFsc2UpO1xuICAgIHNob3VsZC5lcXVhbChVdGlscy5kZWZhdWx0LmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MuYWRkcmVzczEwKSwgZmFsc2UpO1xuICAgIHNob3VsZC5lcXVhbChVdGlscy5kZWZhdWx0LmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MuYWRkcmVzczExKSwgZmFsc2UpO1xuICAgIHNob3VsZC5lcXVhbChVdGlscy5kZWZhdWx0LmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MuYWRkcmVzczEyKSwgZmFsc2UpO1xuICAgIHNob3VsZC5lcXVhbChVdGlscy5kZWZhdWx0LmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MuYWRkcmVzczEzKSwgZmFsc2UpO1xuICAgIHNob3VsZC5lcXVhbChVdGlscy5kZWZhdWx0LmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MuYWRkcmVzczE0KSwgZmFsc2UpO1xuICAgIHNob3VsZC5lcXVhbChVdGlscy5kZWZhdWx0LmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MuYWRkcmVzczE1KSwgZmFsc2UpO1xuICAgIHNob3VsZC5lcXVhbChVdGlscy5kZWZhdWx0LmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MuYWRkcmVzczE2KSwgZmFsc2UpO1xuXG4gICAgLy8gQnlyb24gYWRkcmVzc2VzXG4gICAgc2hvdWxkLmVxdWFsKFV0aWxzLmRlZmF1bHQuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcy5ieXJvbjEpLCB0cnVlKTtcbiAgICBzaG91bGQuZXF1YWwoVXRpbHMuZGVmYXVsdC5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzLmJ5cm9uMiksIHRydWUpO1xuICAgIHNob3VsZC5lcXVhbChVdGlscy5kZWZhdWx0LmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MuYnlyb24zKSwgdHJ1ZSk7XG4gICAgc2hvdWxkLmVxdWFsKFV0aWxzLmRlZmF1bHQuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcy5ieXJvbjQpLCBmYWxzZSk7XG4gICAgc2hvdWxkLmVxdWFsKFV0aWxzLmRlZmF1bHQuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcy5ieXJvbjUpLCBmYWxzZSk7XG4gICAgc2hvdWxkLmVxdWFsKFV0aWxzLmRlZmF1bHQuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcy5ieXJvbjYpLCBmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgY3JlYXRlIHN0YWtlIGFuZCBwYXltZW50IGtleXMgY29ycmVjdGx5JywgKCkgPT4ge1xuICAgIGNvbnN0IGtleVBhaXIxID0gbmV3IEtleVBhaXIoeyBwdWI6IGVudGVycHJpc2VBY2NvdW50cy5hY2NvdW50MS5wdWJsaWNLZXkgfSk7XG4gICAgY29uc3Qga2V5UGFpcjIgPSBuZXcgS2V5UGFpcih7IHB1YjogZW50ZXJwcmlzZUFjY291bnRzLmFjY291bnQzLnB1YmxpY0tleSB9KTtcbiAgICBzaG91bGQuZXF1YWwoXG4gICAgICBVdGlscy5kZWZhdWx0LmNyZWF0ZUJhc2VBZGRyZXNzV2l0aFN0YWtlQW5kUGF5bWVudEtleShrZXlQYWlyMSwga2V5UGFpcjIsIEFkZHJlc3NGb3JtYXQudGVzdG5ldCksXG4gICAgICAnYWRkcl90ZXN0MXFxOWFyZnE5cHVnczU3YXByMzUzNXo0NzBtYTJ0dmc4cG5qeTU0cTZzNjBtdXo1a2VsaHl0d2h6cnc5c25oNzc1OW45bThmcjJ4dXJwazR6eXc4aG12azJhdmRzZjYybW1qJ1xuICAgICk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgY3JlYXRlIHN0YWtlIGFuZCBwYXltZW50IGtleXMgY29ycmVjdGx5IGZyb20gcHJpdmF0ZSBrZXlzJywgKCkgPT4ge1xuICAgIGNvbnN0IGtleVBhaXIxID0gbmV3IEtleVBhaXIoeyBwcnY6IHByaXZhdGVLZXlzLnBydktleTQgfSk7XG4gICAgY29uc3Qga2V5UGFpcjIgPSBuZXcgS2V5UGFpcih7IHBydjogcHJpdmF0ZUtleXMucHJ2S2V5MiB9KTtcbiAgICBzaG91bGQuZXF1YWwoXG4gICAgICBVdGlscy5kZWZhdWx0LmNyZWF0ZUJhc2VBZGRyZXNzV2l0aFN0YWtlQW5kUGF5bWVudEtleShrZXlQYWlyMSwga2V5UGFpcjIsIEFkZHJlc3NGb3JtYXQudGVzdG5ldCksXG4gICAgICAnYWRkcl90ZXN0MXFxdmdsaG45azh1bTY2ZHNhaHh5dWtuOWwyZjZ6ZG1ucHk4cHV0aDAwZ2p1bGs3ZzB4cDVmOTltZHp3c3d6NHJtZnd1MDB4NzI0dzJqYWh5Z2hleWsyenFnOWxzdnoybXVqJ1xuICAgICk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgY3JlYXRlIHN0YWtlIGFuZCBwYXltZW50IGtleXMgY29ycmVjdGx5IHdpdGgga2V5cGFpcnMgaW5pdGlhbGl6ZWQgZnJvbSBub3RoaW5nJywgKCkgPT4ge1xuICAgIGNvbnN0IGtleVBhaXIxID0gbmV3IEtleVBhaXIoKTtcbiAgICBjb25zdCBrZXlQYWlyMiA9IG5ldyBLZXlQYWlyKCk7XG4gICAgc2hvdWxkLmVxdWFsKFxuICAgICAgVXRpbHMuZGVmYXVsdC5jcmVhdGVCYXNlQWRkcmVzc1dpdGhTdGFrZUFuZFBheW1lbnRLZXkoa2V5UGFpcjEsIGtleVBhaXIyLCBBZGRyZXNzRm9ybWF0LnRlc3RuZXQpLFxuICAgICAgVXRpbHMuZGVmYXVsdC5jcmVhdGVCYXNlQWRkcmVzc1dpdGhTdGFrZUFuZFBheW1lbnRLZXkoa2V5UGFpcjEsIGtleVBhaXIyLCBBZGRyZXNzRm9ybWF0LnRlc3RuZXQpXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBibG9jayBoYXNoIGNvcnJlY3RseScsICgpID0+IHtcbiAgICBzaG91bGQuZXF1YWwoVXRpbHMuZGVmYXVsdC5pc1ZhbGlkQmxvY2tJZChibG9ja0hhc2guaGFzaDEpLCB0cnVlKTtcbiAgICBzaG91bGQuZXF1YWwoVXRpbHMuZGVmYXVsdC5pc1ZhbGlkQmxvY2tJZChibG9ja0hhc2guaGFzaDIpLCB0cnVlKTtcbiAgICAvLyBwYXJhbSBpcyBjb21pbmcgYXMgdW5kZWZpbmVkIHNvIGl0IHdhcyBjYXVzaW5nIGFuIGlzc3VlXG4gICAgc2hvdWxkLmVxdWFsKFV0aWxzLmRlZmF1bHQuaXNWYWxpZEJsb2NrSWQodW5kZWZpbmVkIGFzIHVua25vd24gYXMgc3RyaW5nKSwgZmFsc2UpO1xuICAgIHNob3VsZC5lcXVhbChVdGlscy5kZWZhdWx0LmlzVmFsaWRCbG9ja0lkKCcnKSwgZmFsc2UpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHZhbGlkYXRlIGludmFsaWQgYmxvY2sgaGFzaCBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgc2hvdWxkLmVxdWFsKFV0aWxzLmRlZmF1bHQuaXNWYWxpZEJsb2NrSWQoJycpLCBmYWxzZSk7XG4gICAgc2hvdWxkLmVxdWFsKFV0aWxzLmRlZmF1bHQuaXNWYWxpZEJsb2NrSWQoJzB4YWRlMzU0NjVnZnZkY3N4c3oyNDMwMCcpLCBmYWxzZSk7XG4gICAgc2hvdWxkLmVxdWFsKFV0aWxzLmRlZmF1bHQuaXNWYWxpZEJsb2NrSWQoYmxvY2tIYXNoLmhhc2gyICsgJ2ZmJyksIGZhbHNlKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBwdWJsaWMga2V5IGNvcnJlY3RseScsICgpID0+IHtcbiAgICBzaG91bGQuZXF1YWwoXG4gICAgICBVdGlscy5kZWZhdWx0LmlzVmFsaWRQdWJsaWNLZXkoJ2RhMDI1YWEwMjk5MGVmNDY2MDY5ZmFkY2U1ZTNkY2ZhZDY2MzkxNGQ2YmY0MmZlYTNiZTUwYThjMzA5NGQ4ZTgnKSxcbiAgICAgIHRydWVcbiAgICApO1xuICAgIHNob3VsZC5lcXVhbChVdGlscy5kZWZhdWx0LmlzVmFsaWRQdWJsaWNLZXkocHVibGljS2V5cy5wdWJLZXkxKSwgdHJ1ZSk7XG4gICAgc2hvdWxkLmVxdWFsKFV0aWxzLmRlZmF1bHQuaXNWYWxpZFB1YmxpY0tleShwdWJsaWNLZXlzLnB1YktleTIpLCB0cnVlKTtcbiAgICBzaG91bGQuZXF1YWwoVXRpbHMuZGVmYXVsdC5pc1ZhbGlkUHVibGljS2V5KHB1YmxpY0tleXMucHViS2V5MyksIHRydWUpO1xuICAgIHNob3VsZC5lcXVhbChVdGlscy5kZWZhdWx0LmlzVmFsaWRQdWJsaWNLZXkocHVibGljS2V5cy5wdWJLZXk0KSwgZmFsc2UpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHZhbGlkYXRlIHByaXZhdGUga2V5IGNvcnJlY3RseScsICgpID0+IHtcbiAgICBzaG91bGQuZXF1YWwoVXRpbHMuZGVmYXVsdC5pc1ZhbGlkUHJpdmF0ZUtleShwcml2YXRlS2V5cy5wcnZLZXlFeHRlbmRlZCksIHRydWUpO1xuICAgIHNob3VsZC5lcXVhbChVdGlscy5kZWZhdWx0LmlzVmFsaWRQcml2YXRlS2V5KHByaXZhdGVLZXlzLnBydktleTIpLCB0cnVlKTtcbiAgICBzaG91bGQuZXF1YWwoVXRpbHMuZGVmYXVsdC5pc1ZhbGlkUHJpdmF0ZUtleShwcml2YXRlS2V5cy5wcnZLZXkzV3JvbmdGb3JtYXQpLCBmYWxzZSk7XG4gICAgc2hvdWxkLmVxdWFsKFV0aWxzLmRlZmF1bHQuaXNWYWxpZFByaXZhdGVLZXkocHJpdmF0ZUtleXMucHJ2S2V5NCksIHRydWUpO1xuICAgIHNob3VsZC5lcXVhbChVdGlscy5kZWZhdWx0LmlzVmFsaWRQcml2YXRlS2V5KHByaXZhdGVLZXlzLnBydktleTVXcm9uZ0Zvcm1hdCksIGZhbHNlKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBzaWduYXR1cmUgY29ycmVjdGx5JywgKCkgPT4ge1xuICAgIHNob3VsZC5lcXVhbChcbiAgICAgIFV0aWxzLmRlZmF1bHQuaXNWYWxpZFNpZ25hdHVyZSh0b0hleChFZDI1NTE5U2lnbmF0dXJlLmZyb21fYmVjaDMyKHNpZ25hdHVyZXMuc2lnbmF0dXJlMSkudG9fYnl0ZXMoKSkpLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gICAgc2hvdWxkLmVxdWFsKFxuICAgICAgVXRpbHMuZGVmYXVsdC5pc1ZhbGlkU2lnbmF0dXJlKHRvSGV4KEVkMjU1MTlTaWduYXR1cmUuZnJvbV9iZWNoMzIoc2lnbmF0dXJlcy5zaWduYXR1cmUyKS50b19ieXRlcygpKSksXG4gICAgICB0cnVlXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBpbnZhbGlkIHNpZ25hdHVyZSBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgc2hvdWxkLmVxdWFsKFV0aWxzLmRlZmF1bHQuaXNWYWxpZFNpZ25hdHVyZSgnJyksIGZhbHNlKTtcbiAgICBzaG91bGQuZXF1YWwoVXRpbHMuZGVmYXVsdC5pc1ZhbGlkU2lnbmF0dXJlKCcweDAwJyksIGZhbHNlKTtcbiAgICBzaG91bGQuZXF1YWwoVXRpbHMuZGVmYXVsdC5pc1ZhbGlkU2lnbmF0dXJlKHByaXZhdGVLZXlzLnBydktleUV4dGVuZGVkKSwgZmFsc2UpO1xuICAgIHNob3VsZC5lcXVhbChVdGlscy5kZWZhdWx0LmlzVmFsaWRTaWduYXR1cmUoc2lnbmF0dXJlcy5zaWduYXR1cmUxLnNsaWNlKDIpKSwgZmFsc2UpO1xuICAgIHNob3VsZC5lcXVhbChVdGlscy5kZWZhdWx0LmlzVmFsaWRTaWduYXR1cmUoc2lnbmF0dXJlcy5zaWduYXR1cmUyICsgJ2ZmJyksIGZhbHNlKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSB0cmFuc2FjdGlvbiBpZCBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgc2hvdWxkLmVxdWFsKFV0aWxzLmRlZmF1bHQuaXNWYWxpZFRyYW5zYWN0aW9uSWQodHhJZHMuaGFzaDEpLCB0cnVlKTtcbiAgICBzaG91bGQuZXF1YWwoVXRpbHMuZGVmYXVsdC5pc1ZhbGlkVHJhbnNhY3Rpb25JZCh0eElkcy5oYXNoMiksIHRydWUpO1xuICAgIHNob3VsZC5lcXVhbChVdGlscy5kZWZhdWx0LmlzVmFsaWRUcmFuc2FjdGlvbklkKHR4SWRzLmhhc2gzKSwgdHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdmFsaWRhdGUgaW52YWxpZCB0cmFuc2FjdGlvbiBpZCBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgc2hvdWxkLmVxdWFsKFV0aWxzLmRlZmF1bHQuaXNWYWxpZFRyYW5zYWN0aW9uSWQoJycpLCBmYWxzZSk7XG4gICAgc2hvdWxkLmVxdWFsKFV0aWxzLmRlZmF1bHQuaXNWYWxpZFRyYW5zYWN0aW9uSWQodHhJZHMuaGFzaDEuc2xpY2UoMykpLCBmYWxzZSk7XG4gICAgc2hvdWxkLmVxdWFsKFV0aWxzLmRlZmF1bHQuaXNWYWxpZFRyYW5zYWN0aW9uSWQodHhJZHMuaGFzaDMgKyAnMDAnKSwgZmFsc2UpO1xuICAgIHNob3VsZC5lcXVhbChVdGlscy5kZWZhdWx0LmlzVmFsaWRUcmFuc2FjdGlvbklkKCdkYWxpajQzdGEwZ2EyZGFkZGEwMicpLCBmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdmFsaWRhdGUgRFJlcElkIGNvcnJlY3RseScsICgpID0+IHtcbiAgICBzaG91bGQuZXF1YWwoVXRpbHMuZGVmYXVsdC5pc1ZhbGlkRFJlcElkKCdhbHdheXMtYWJzdGFpbicpLCB0cnVlKTtcbiAgICBzaG91bGQuZXF1YWwoVXRpbHMuZGVmYXVsdC5pc1ZhbGlkRFJlcElkKCdub3QtYS1jb3JyZWN0LWNob2ljZScpLCBmYWxzZSk7XG4gICAgc2hvdWxkLmVxdWFsKFV0aWxzLmRlZmF1bHQuaXNWYWxpZERSZXBJZCgnYWx3YXlzLW5vLWNvbmZpZGVuY2UnKSwgdHJ1ZSk7XG4gICAgc2hvdWxkLmVxdWFsKFV0aWxzLmRlZmF1bHQuaXNWYWxpZERSZXBJZCgnZHJlcDEzZDZzeGt5ejZzdDloNjVxcXJ6ZDh1a3B5d2hyOHN3ZTlmNjM1N3FudGdqcXllMGluY29ycmVjdCcpLCBmYWxzZSk7XG4gICAgLy8gQ0lQLTEwNSBzdGFuZGFyZCBEUmVwSWRcbiAgICBzaG91bGQuZXF1YWwoVXRpbHMuZGVmYXVsdC5pc1ZhbGlkRFJlcElkKCdkcmVwMTNkNnN4a3l6NnN0OWg2NXFxcnpkOHVrcHl3aHI4c3dlOWY2MzU3cW50Z2pxeWUwZ3R0ZCcpLCB0cnVlKTtcbiAgICAvLyBDSVAtMTI5IHN0YW5kYXJkIERSZXBJZFxuICAgIHNob3VsZC5lcXVhbChVdGlscy5kZWZhdWx0LmlzVmFsaWREUmVwSWQoJ2RyZXAxeTI5aDJxNmNzdDJwdmtsMnNxcXZmNWxqY3kzNnV2N3BteTQ4MnhuY3pkZHpncXNodXMyNHcnKSwgdHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZ2V0IERSZXAgZW50aXR5IGZyb20gRFJlcElkIGNvcnJlY3RseScsICgpID0+IHtcbiAgICBzaG91bGQuZXF1YWwoVXRpbHMuZGVmYXVsdC5nZXREUmVwRnJvbURSZXBJZCgnYWx3YXlzLWFic3RhaW4nKS50b19qc29uKCksIERSZXAubmV3X2Fsd2F5c19hYnN0YWluKCkudG9fanNvbigpKTtcbiAgICBzaG91bGQuZXF1YWwoXG4gICAgICBVdGlscy5kZWZhdWx0LmdldERSZXBGcm9tRFJlcElkKCdhbHdheXMtbm8tY29uZmlkZW5jZScpLnRvX2pzb24oKSxcbiAgICAgIERSZXAubmV3X2Fsd2F5c19ub19jb25maWRlbmNlKCkudG9fanNvbigpXG4gICAgKTtcbiAgICBzaG91bGQuZXF1YWwoXG4gICAgICBVdGlscy5kZWZhdWx0LmdldERSZXBGcm9tRFJlcElkKCdkcmVwMTNkNnN4a3l6NnN0OWg2NXFxcnpkOHVrcHl3aHI4c3dlOWY2MzU3cW50Z2pxeWUwZ3R0ZCcpLnRvX2pzb24oKSxcbiAgICAgIERSZXAuZnJvbV9iZWNoMzIoJ2RyZXAxM2Q2c3hreXo2c3Q5aDY1cXFyemQ4dWtweXdocjhzd2U5ZjYzNTdxbnRnanF5ZTBndHRkJykudG9fanNvbigpXG4gICAgKTtcbiAgICAvLyBEUmVwIHNob3VsZCBiZSB0aGUgc2FtZSBmcm9tIGJvdGggQ0lQLTEwNSBhbmQgQ0lQLTEyOSBJRHNcbiAgICBzaG91bGQuZXF1YWwoXG4gICAgICBVdGlscy5kZWZhdWx0LmdldERSZXBGcm9tRFJlcElkKCdkcmVwMXkyOWgycTZjc3QycHZrbDJzcXF2ZjVsamN5MzZ1djdwbXk0ODJ4bmN6ZGR6Z3FzaHVzMjR3JykudG9fanNvbigpLFxuICAgICAgVXRpbHMuZGVmYXVsdC5nZXREUmVwRnJvbURSZXBJZCgnZHJlcDEzZDZzeGt5ejZzdDloNjVxcXJ6ZDh1a3B5d2hyOHN3ZTlmNjM1N3FudGdqcXllMGd0dGQnKS50b19qc29uKClcbiAgICApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGdldCBEUmVwSWQgZnJvbSBEUmVwIGVudGl0eSBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgc2hvdWxkLmVxdWFsKFV0aWxzLmRlZmF1bHQuZ2V0RFJlcElkRnJvbURSZXAoRFJlcC5uZXdfYWx3YXlzX2Fic3RhaW4oKSksICdhbHdheXMtYWJzdGFpbicpO1xuICAgIHNob3VsZC5lcXVhbChVdGlscy5kZWZhdWx0LmdldERSZXBJZEZyb21EUmVwKERSZXAubmV3X2Fsd2F5c19ub19jb25maWRlbmNlKCkpLCAnYWx3YXlzLW5vLWNvbmZpZGVuY2UnKTtcbiAgICAvLyBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgRFJlcCB3YXMgY3JlYXRlZCBmcm9tIENJUC0xMDUgb3IgQ0lQLTEyOSBJRCwgdGhlIERSZXBJZCBmcm9tIGdldERSZXBJZEZyb21EUmVwIHdpbGwgYmUgdGhlIElEIGZvcm1hdCBmcm9tIGB0b19iZWNoMzJgXG4gICAgc2hvdWxkLmVxdWFsKFxuICAgICAgVXRpbHMuZGVmYXVsdC5nZXREUmVwSWRGcm9tRFJlcChcbiAgICAgICAgVXRpbHMuZGVmYXVsdC5nZXREUmVwRnJvbURSZXBJZCgnZHJlcDEzZDZzeGt5ejZzdDloNjVxcXJ6ZDh1a3B5d2hyOHN3ZTlmNjM1N3FudGdqcXllMGd0dGQnKVxuICAgICAgKSxcbiAgICAgICdkcmVwMTNkNnN4a3l6NnN0OWg2NXFxcnpkOHVrcHl3aHI4c3dlOWY2MzU3cW50Z2pxeWUwZ3R0ZCdcbiAgICApO1xuICAgIHNob3VsZC5lcXVhbChcbiAgICAgIFV0aWxzLmRlZmF1bHQuZ2V0RFJlcElkRnJvbURSZXAoXG4gICAgICAgIFV0aWxzLmRlZmF1bHQuZ2V0RFJlcEZyb21EUmVwSWQoJ2RyZXAxeTI5aDJxNmNzdDJwdmtsMnNxcXZmNWxqY3kzNnV2N3BteTQ4MnhuY3pkZHpncXNodXMyNHcnKVxuICAgICAgKSxcbiAgICAgICdkcmVwMTNkNnN4a3l6NnN0OWg2NXFxcnpkOHVrcHl3aHI4c3dlOWY2MzU3cW50Z2pxeWUwZ3R0ZCdcbiAgICApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGdldCB0cmFuc2FjdGlvbiBib2R5IGNvcnJlY3RseScsICgpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICB1bnNpZ25lZFR4LFxuICAgICAgdW5zaWduZWRUeEJvZHksXG4gICAgICB1bnNpZ25lZFZvdGVEZWxlZ2F0aW9uVHgsXG4gICAgICB1bnNpZ25lZFZvdGVEZWxlZ2F0aW9uVHhCb2R5LFxuICAgICAgdW5zaWduZWRTdGFraW5nQWN0aXZlVHgsXG4gICAgICB1bnNpZ25lZFN0YWtpbmdBY3RpdmVUeEJvZHksXG4gICAgICB1bnNpZ25lZFN0YWtpbmdEZWFjdGl2ZVR4LFxuICAgICAgdW5zaWduZWRTdGFraW5nRGVhY3RpdmVUeEJvZHksXG4gICAgICB1bnNpZ25lZFN0YWtpbmdXaXRoZHJhd1R4LFxuICAgICAgdW5zaWduZWRTdGFraW5nV2l0aGRyYXdUeEJvZHksXG4gICAgICB1bnNpZ25lZFVwZGF0ZVBsZWRnZVR4LFxuICAgICAgdW5zaWduZWRVcGRhdGVQbGVkZ2VUeEJvZHksXG4gICAgICB1bnNpZ25lZE5ld1BsZWRnZVR4LFxuICAgICAgdW5zaWduZWROZXdQbGVkZ2VUeEJvZHksXG4gICAgICBwYXJ0aWFsbHlTaWduZWRQbGVkZ2VUeCxcbiAgICB9ID0gcmF3VHg7XG4gICAgc2hvdWxkLmVxdWFsKFV0aWxzLmRlZmF1bHQuZ2V0VHJhbnNhY3Rpb25Cb2R5KHVuc2lnbmVkVHgpLCB1bnNpZ25lZFR4Qm9keSk7XG4gICAgc2hvdWxkLmVxdWFsKFV0aWxzLmRlZmF1bHQuZ2V0VHJhbnNhY3Rpb25Cb2R5KHVuc2lnbmVkVm90ZURlbGVnYXRpb25UeCksIHVuc2lnbmVkVm90ZURlbGVnYXRpb25UeEJvZHkpO1xuICAgIHNob3VsZC5lcXVhbChVdGlscy5kZWZhdWx0LmdldFRyYW5zYWN0aW9uQm9keSh1bnNpZ25lZFN0YWtpbmdBY3RpdmVUeCksIHVuc2lnbmVkU3Rha2luZ0FjdGl2ZVR4Qm9keSk7XG4gICAgc2hvdWxkLmVxdWFsKFV0aWxzLmRlZmF1bHQuZ2V0VHJhbnNhY3Rpb25Cb2R5KHVuc2lnbmVkU3Rha2luZ0RlYWN0aXZlVHgpLCB1bnNpZ25lZFN0YWtpbmdEZWFjdGl2ZVR4Qm9keSk7XG4gICAgc2hvdWxkLmVxdWFsKFV0aWxzLmRlZmF1bHQuZ2V0VHJhbnNhY3Rpb25Cb2R5KHVuc2lnbmVkU3Rha2luZ1dpdGhkcmF3VHgpLCB1bnNpZ25lZFN0YWtpbmdXaXRoZHJhd1R4Qm9keSk7XG4gICAgc2hvdWxkLmVxdWFsKFV0aWxzLmRlZmF1bHQuZ2V0VHJhbnNhY3Rpb25Cb2R5KHVuc2lnbmVkVXBkYXRlUGxlZGdlVHgpLCB1bnNpZ25lZFVwZGF0ZVBsZWRnZVR4Qm9keSk7XG4gICAgc2hvdWxkLmVxdWFsKFV0aWxzLmRlZmF1bHQuZ2V0VHJhbnNhY3Rpb25Cb2R5KHVuc2lnbmVkTmV3UGxlZGdlVHgpLCB1bnNpZ25lZE5ld1BsZWRnZVR4Qm9keSk7XG4gICAgc2hvdWxkLmVxdWFsKFV0aWxzLmRlZmF1bHQuZ2V0VHJhbnNhY3Rpb25Cb2R5KHBhcnRpYWxseVNpZ25lZFBsZWRnZVR4KSwgdW5zaWduZWROZXdQbGVkZ2VUeEJvZHkpO1xuICB9KTtcbn0pO1xuIl19

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


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