PHP WebShell
Текущая директория: /opt/BitGoJS/modules/utxo-lib/dist/test
Просмотр файла: networks.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const assert = require("assert");
const networks_1 = require("../src/networks");
describe('networks', function () {
// Ideally, all properties for all coins should be distinct.
// However, there are some exceptions and some networks share the same properties.
// Here we define some groups of networks that are allowed to share properties.
const bitcoinSharedMessagePrefix = (network) => (0, networks_1.isBitcoin)(network) || (0, networks_1.isBitcoinCash)(network) || (0, networks_1.isBitcoinSV)(network);
const bitcoinMainnetSharedPubkeyPrefix = (network) => (0, networks_1.isMainnet)(network) && ((0, networks_1.isBitcoin)(network) || (0, networks_1.isBitcoinCash)(network) || (0, networks_1.isECash)(network) || (0, networks_1.isBitcoinSV)(network));
const bitcoinMainnetSharedScriptPrefix = (network) => bitcoinMainnetSharedPubkeyPrefix(network);
const bitcoinTestnetSharedPubkeyPrefix = (network) => (0, networks_1.isTestnet)(network) &&
((0, networks_1.isBitcoin)(network) ||
(0, networks_1.isBitcoinCash)(network) ||
(0, networks_1.isECash)(network) ||
(0, networks_1.isBitcoinGold)(network) ||
(0, networks_1.isBitcoinSV)(network) ||
(0, networks_1.isLitecoin)(network));
const bitcoinTestnetSharedScriptPrefix = (network) => (0, networks_1.isTestnet)(network) &&
((0, networks_1.isBitcoin)(network) ||
(0, networks_1.isBitcoinCash)(network) ||
(0, networks_1.isECash)(network) ||
(0, networks_1.isBitcoinGold)(network) ||
(0, networks_1.isBitcoinSV)(network) ||
(0, networks_1.isDogecoin)(network));
const bitcoinMainnetSharedWIFPrefix = (network) => (0, networks_1.isMainnet)(network) &&
((0, networks_1.isBitcoin)(network) ||
(0, networks_1.isBitcoinCash)(network) ||
(0, networks_1.isECash)(network) ||
(0, networks_1.isBitcoinGold)(network) ||
(0, networks_1.isBitcoinSV)(network) ||
(0, networks_1.isZcash)(network));
const bitcoinTestnetSharedWIFPrefix = (network) => (0, networks_1.isTestnet)(network) && !(0, networks_1.isDogecoin)(network);
const bech32Coins = (network) => (0, networks_1.isBitcoin)(network) || (0, networks_1.isBitcoinGold)(network) || (0, networks_1.isLitecoin)(network);
const sameGroup = (group, network, otherNetwork) => group(network) && group(otherNetwork);
describe('getNetworkList()', function () {
it('mainnets are sorted alphabetically', function () {
const mainnets = (0, networks_1.getNetworkList)().filter(networks_1.isMainnet);
const sortedMainnets = [...mainnets].sort((a, b) => (0, networks_1.getNetworkName)(a).localeCompare((0, networks_1.getNetworkName)(b)));
assert.deepStrictEqual(mainnets, sortedMainnets);
});
it('testnet(s) follow mainnets', function () {
const list = (0, networks_1.getNetworkList)();
while (list.length > 0) {
// first element is a mainnet
const mainnet = list.shift();
assert.strict(mainnet);
assert.strictEqual((0, networks_1.isMainnet)(mainnet), true);
// subsequent entries are testnets
while (list.length > 0 && (0, networks_1.isTestnet)(list[0])) {
assert.strictEqual((0, networks_1.getMainnet)(list[0]), mainnet);
list.shift();
}
}
});
});
describe('Features', function () {
it('have expected values for networks', function () {
assert.deepStrictEqual((0, networks_1.getNetworkList)().map((n) => [(0, networks_1.getNetworkName)(n), (0, networks_1.supportsSegwit)(n), (0, networks_1.supportsTaproot)(n)]), [
['bitcoin', true, true],
['testnet', true, true],
['bitcoinPublicSignet', true, true],
['bitcoinTestnet4', true, true],
['bitcoinBitGoSignet', true, true],
['bitcoincash', false, false],
['bitcoincashTestnet', false, false],
['bitcoingold', true, false],
['bitcoingoldTestnet', true, false],
['bitcoinsv', false, false],
['bitcoinsvTestnet', false, false],
['dash', false, false],
['dashTest', false, false],
['dogecoin', false, false],
['dogecoinTest', false, false],
['ecash', false, false],
['ecashTest', false, false],
['litecoin', true, false],
['litecoinTest', true, false],
['zcash', false, false],
['zcashTest', false, false],
]);
});
});
for (const name in networks_1.networks) {
const network = networks_1.networks[name];
describe(`networks.${name}`, function () {
it('is valid network', function () {
assert((0, networks_1.isValidNetwork)(network));
});
it('getNetworkName() returns network name', function () {
assert.strictEqual(name, (0, networks_1.getNetworkName)(network));
});
it('has corresponding testnet/mainnet', function () {
if ((0, networks_1.isMainnet)(network)) {
assert.strictEqual((0, networks_1.isTestnet)(network), false);
assert.strictEqual((0, networks_1.getMainnet)(network), network);
assert.strictEqual(typeof (0, networks_1.getTestnet)(network), 'object');
}
else {
assert.strictEqual((0, networks_1.isMainnet)(network), false);
assert.strictEqual((0, networks_1.getTestnet)(network), network);
assert.notStrictEqual((0, networks_1.getMainnet)(network), network);
assert.strictEqual(typeof (0, networks_1.getMainnet)(network), 'object');
}
});
it('has expected properties', function () {
assert.strictEqual(typeof network, 'object');
assert.strictEqual(typeof network.messagePrefix, 'string');
assert.strictEqual(typeof network.bech32, bech32Coins(network) ? 'string' : 'undefined');
assert.strictEqual(typeof network.bip32, 'object');
assert.strictEqual(typeof network.pubKeyHash, 'number');
assert.strictEqual(typeof network.scriptHash, 'number');
assert.strictEqual(typeof network.wif, 'number');
assert.strictEqual(typeof network.coin, 'string');
if ((0, networks_1.isMainnet)(network)) {
assert.strictEqual(network.bip32.public, networks_1.networks.bitcoin.bip32.public);
assert.strictEqual(network.bip32.private, networks_1.networks.bitcoin.bip32.private);
}
else {
assert.strictEqual(network.bip32.public, networks_1.networks.testnet.bip32.public);
assert.strictEqual(network.bip32.private, networks_1.networks.testnet.bip32.private);
}
});
for (const otherName in networks_1.networks) {
const otherNetwork = networks_1.networks[otherName];
const alternateBtcTestnets = ['bitcoinPublicSignet', 'bitcoinTestnet4', 'bitcoinBitGoSignet'];
if ((alternateBtcTestnets.includes(name) && otherName === 'testnet') ||
alternateBtcTestnets.includes(otherName)) {
continue;
}
it('isSameCoin() returns true testnet/mainnet variants', function () {
assert.strictEqual((0, networks_1.isSameCoin)(network, otherNetwork), otherNetwork === (0, networks_1.getMainnet)(network) || otherNetwork === (0, networks_1.getTestnet)(network));
assert.strictEqual(name === otherName, network === otherNetwork);
});
if (network === otherNetwork) {
continue;
}
it(`has distinct properties with ${otherName}`, function () {
assert.strictEqual(network.messagePrefix === otherNetwork.messagePrefix, (0, networks_1.isSameCoin)(network, otherNetwork) || sameGroup(bitcoinSharedMessagePrefix, network, otherNetwork));
assert.strictEqual(network.pubKeyHash === otherNetwork.pubKeyHash, sameGroup(bitcoinMainnetSharedPubkeyPrefix, network, otherNetwork) ||
sameGroup(bitcoinTestnetSharedPubkeyPrefix, network, otherNetwork));
assert.strictEqual(network.scriptHash === otherNetwork.scriptHash, sameGroup(bitcoinMainnetSharedScriptPrefix, network, otherNetwork) ||
sameGroup(bitcoinTestnetSharedScriptPrefix, network, otherNetwork));
assert.strictEqual(network.wif === otherNetwork.wif, sameGroup(bitcoinMainnetSharedWIFPrefix, network, otherNetwork) ||
sameGroup(bitcoinTestnetSharedWIFPrefix, network, otherNetwork));
});
}
});
}
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29ya3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90ZXN0L25ldHdvcmtzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsaUNBQWlDO0FBQ2pDLDhDQXFCeUI7QUFFekIsUUFBUSxDQUFDLFVBQVUsRUFBRTtJQUNuQiw0REFBNEQ7SUFDNUQsa0ZBQWtGO0lBRWxGLCtFQUErRTtJQUMvRSxNQUFNLDBCQUEwQixHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFBLG9CQUFTLEVBQUMsT0FBTyxDQUFDLElBQUksSUFBQSx3QkFBYSxFQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUEsc0JBQVcsRUFBQyxPQUFPLENBQUMsQ0FBQztJQUVySCxNQUFNLGdDQUFnQyxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FDbkQsSUFBQSxvQkFBUyxFQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBQSxvQkFBUyxFQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUEsd0JBQWEsRUFBQyxPQUFPLENBQUMsSUFBSSxJQUFBLGtCQUFPLEVBQUMsT0FBTyxDQUFDLElBQUksSUFBQSxzQkFBVyxFQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFFbkgsTUFBTSxnQ0FBZ0MsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsZ0NBQWdDLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFaEcsTUFBTSxnQ0FBZ0MsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQ25ELElBQUEsb0JBQVMsRUFBQyxPQUFPLENBQUM7UUFDbEIsQ0FBQyxJQUFBLG9CQUFTLEVBQUMsT0FBTyxDQUFDO1lBQ2pCLElBQUEsd0JBQWEsRUFBQyxPQUFPLENBQUM7WUFDdEIsSUFBQSxrQkFBTyxFQUFDLE9BQU8sQ0FBQztZQUNoQixJQUFBLHdCQUFhLEVBQUMsT0FBTyxDQUFDO1lBQ3RCLElBQUEsc0JBQVcsRUFBQyxPQUFPLENBQUM7WUFDcEIsSUFBQSxxQkFBVSxFQUFDLE9BQU8s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QUMsZ0NBQWdDLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQzt3QkFDaEUsU0FBUyxDQUFDLGdDQUFnQyxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FDckUsQ0FBQztvQkFFRixNQUFNLENBQUMsV0FBVyxDQUNoQixPQUFPLENBQUMsR0FBRyxLQUFLLFlBQVksQ0FBQyxHQUFHLEVBQ2hDLFNBQVMsQ0FBQyw2QkFBNkIsRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDO3dCQUM3RCxTQUFTLENBQUMsNkJBQTZCLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUNsRSxDQUFDO2dCQUNKLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQge1xuICBnZXRNYWlubmV0LFxuICBnZXROZXR3b3JrTGlzdCxcbiAgZ2V0TmV0d29ya05hbWUsXG4gIGdldFRlc3RuZXQsXG4gIGlzQml0Y29pbixcbiAgaXNCaXRjb2luQ2FzaCxcbiAgaXNFQ2FzaCxcbiAgaXNCaXRjb2luR29sZCxcbiAgaXNCaXRjb2luU1YsXG4gIGlzRG9nZWNvaW4sXG4gIGlzTGl0ZWNvaW4sXG4gIGlzTWFpbm5ldCxcbiAgaXNTYW1lQ29pbixcbiAgaXNUZXN0bmV0LFxuICBpc1ZhbGlkTmV0d29yayxcbiAgaXNaY2FzaCxcbiAgTmV0d29yayxcbiAgbmV0d29ya3MsXG4gIHN1cHBvcnRzU2Vnd2l0LFxuICBzdXBwb3J0c1RhcHJvb3QsXG59IGZyb20gJy4uL3NyYy9uZXR3b3Jrcyc7XG5cbmRlc2NyaWJlKCduZXR3b3JrcycsIGZ1bmN0aW9uICgpIHtcbiAgLy8gSWRlYWxseSwgYWxsIHByb3BlcnRpZXMgZm9yIGFsbCBjb2lucyBzaG91bGQgYmUgZGlzdGluY3QuXG4gIC8vIEhvd2V2ZXIsIHRoZXJlIGFyZSBzb21lIGV4Y2VwdGlvbnMgYW5kIHNvbWUgbmV0d29ya3Mgc2hhcmUgdGhlIHNhbWUgcHJvcGVydGllcy5cblxuICAvLyBIZXJlIHdlIGRlZmluZSBzb21lIGdyb3VwcyBvZiBuZXR3b3JrcyB0aGF0IGFyZSBhbGxvd2VkIHRvIHNoYXJlIHByb3BlcnRpZXMuXG4gIGNvbnN0IGJpdGNvaW5TaGFyZWRNZXNzYWdlUHJlZml4ID0gKG5ldHdvcmspID0+IGlzQml0Y29pbihuZXR3b3JrKSB8fCBpc0JpdGNvaW5DYXNoKG5ldHdvcmspIHx8IGlzQml0Y29pblNWKG5ldHdvcmspO1xuXG4gIGNvbnN0IGJpdGNvaW5NYWlubmV0U2hhcmVkUHVia2V5UHJlZml4ID0gKG5ldHdvcmspID0+XG4gICAgaXNNYWlubmV0KG5ldHdvcmspICYmIChpc0JpdGNvaW4obmV0d29yaykgfHwgaXNCaXRjb2luQ2FzaChuZXR3b3JrKSB8fCBpc0VDYXNoKG5ldHdvcmspIHx8IGlzQml0Y29pblNWKG5ldHdvcmspKTtcblxuICBjb25zdCBiaXRjb2luTWFpbm5ldFNoYXJlZFNjcmlwdFByZWZpeCA9IChuZXR3b3JrKSA9PiBiaXRjb2luTWFpbm5ldFNoYXJlZFB1YmtleVByZWZpeChuZXR3b3JrKTtcblxuICBjb25zdCBiaXRjb2luVGVzdG5ldFNoYXJlZFB1YmtleVByZWZpeCA9IChuZXR3b3JrKSA9PlxuICAgIGlzVGVzdG5ldChuZXR3b3JrKSAmJlxuICAgIChpc0JpdGNvaW4obmV0d29yaykgfHxcbiAgICAgIGlzQml0Y29pbkNhc2gobmV0d29yaykgfHxcbiAgICAgIGlzRUNhc2gobmV0d29yaykgfHxcbiAgICAgIGlzQml0Y29pbkdvbGQobmV0d29yaykgfHxcbiAgICAgIGlzQml0Y29pblNWKG5ldHdvcmspIHx8XG4gICAgICBpc0xpdGVjb2luKG5ldHdvcmspKTtcblxuICBjb25zdCBiaXRjb2luVGVzdG5ldFNoYXJlZFNjcmlwdFByZWZpeCA9IChuZXR3b3JrKSA9PlxuICAgIGlzVGVzdG5ldChuZXR3b3JrKSAmJlxuICAgIChpc0JpdGNvaW4obmV0d29yaykgfHxcbiAgICAgIGlzQml0Y29pbkNhc2gobmV0d29yaykgfHxcbiAgICAgIGlzRUNhc2gobmV0d29yaykgfHxcbiAgICAgIGlzQml0Y29pbkdvbGQobmV0d29yaykgfHxcbiAgICAgIGlzQml0Y29pblNWKG5ldHdvcmspIHx8XG4gICAgICBpc0RvZ2Vjb2luKG5ldHdvcmspKTtcblxuICBjb25zdCBiaXRjb2luTWFpbm5ldFNoYXJlZFdJRlByZWZpeCA9IChuZXR3b3JrKSA9PlxuICAgIGlzTWFpbm5ldChuZXR3b3JrKSAmJlxuICAgIChpc0JpdGNvaW4obmV0d29yaykgfHxcbiAgICAgIGlzQml0Y29pbkNhc2gobmV0d29yaykgfHxcbiAgICAgIGlzRUNhc2gobmV0d29yaykgfHxcbiAgICAgIGlzQml0Y29pbkdvbGQobmV0d29yaykgfHxcbiAgICAgIGlzQml0Y29pblNWKG5ldHdvcmspIHx8XG4gICAgICBpc1pjYXNoKG5ldHdvcmspKTtcblxuICBjb25zdCBiaXRjb2luVGVzdG5ldFNoYXJlZFdJRlByZWZpeCA9IChuZXR3b3JrKSA9PiBpc1Rlc3RuZXQobmV0d29yaykgJiYgIWlzRG9nZWNvaW4obmV0d29yayk7XG5cbiAgY29uc3QgYmVjaDMyQ29pbnMgPSAobmV0d29yaykgPT4gaXNCaXRjb2luKG5ldHdvcmspIHx8IGlzQml0Y29pbkdvbGQobmV0d29yaykgfHwgaXNMaXRlY29pbihuZXR3b3JrKTtcblxuICBjb25zdCBzYW1lR3JvdXAgPSAoZ3JvdXAsIG5ldHdvcmssIG90aGVyTmV0d29yaykgPT4gZ3JvdXAobmV0d29yaykgJiYgZ3JvdXAob3RoZXJOZXR3b3JrKTtcblxuICBkZXNjcmliZSgnZ2V0TmV0d29ya0xpc3QoKScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnbWFpbm5ldHMgYXJlIHNvcnRlZCBhbHBoYWJldGljYWxseScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1haW5uZXRzID0gZ2V0TmV0d29ya0xpc3QoKS5maWx0ZXIoaXNNYWlubmV0KTtcbiAgICAgIGNvbnN0IHNvcnRlZE1haW5uZXRzID0gWy4uLm1haW5uZXRzXS5zb3J0KChhLCBiKSA9PlxuICAgICAgICAoZ2V0TmV0d29ya05hbWUoYSkgYXMgc3RyaW5nKS5sb2NhbGVDb21wYXJlKGdldE5ldHdvcmtOYW1lKGIpIGFzIHN0cmluZylcbiAgICAgICk7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKG1haW5uZXRzLCBzb3J0ZWRNYWlubmV0cyk7XG4gICAgfSk7XG5cbiAgICBpdCgndGVzdG5ldChzKSBmb2xsb3cgbWFpbm5ldHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBsaXN0ID0gZ2V0TmV0d29ya0xpc3QoKTtcbiAgICAgIHdoaWxlIChsaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gZmlyc3QgZWxlbWVudCBpcyBhIG1haW5uZXRcbiAgICAgICAgY29uc3QgbWFpbm5ldCA9IGxpc3Quc2hpZnQoKTtcbiAgICAgICAgYXNzZXJ0LnN0cmljdChtYWlubmV0KTtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlzTWFpbm5ldChtYWlubmV0KSwgdHJ1ZSk7XG5cbiAgICAgICAgLy8gc3Vic2VxdWVudCBlbnRyaWVzIGFyZSB0ZXN0bmV0c1xuICAgICAgICB3aGlsZSAobGlzdC5sZW5ndGggPiAwICYmIGlzVGVzdG5ldChsaXN0WzBdKSkge1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChnZXRNYWlubmV0KGxpc3RbMF0pLCBtYWlubmV0KTtcbiAgICAgICAgICBsaXN0LnNoaWZ0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0ZlYXR1cmVzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdoYXZlIGV4cGVjdGVkIHZhbHVlcyBmb3IgbmV0d29ya3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKFxuICAgICAgICBnZXROZXR3b3JrTGlzdCgpLm1hcCgobikgPT4gW2dldE5ldHdvcmtOYW1lKG4pLCBzdXBwb3J0c1NlZ3dpdChuKSwgc3VwcG9ydHNUYXByb290KG4pXSksXG4gICAgICAgIFtcbiAgICAgICAgICBbJ2JpdGNvaW4nLCB0cnVlLCB0cnVlXSxcbiAgICAgICAgICBbJ3Rlc3RuZXQnLCB0cnVlLCB0cnVlXSxcbiAgICAgICAgICBbJ2JpdGNvaW5QdWJsaWNTaWduZXQnLCB0cnVlLCB0cnVlXSxcbiAgICAgICAgICBbJ2JpdGNvaW5UZXN0bmV0NCcsIHRydWUsIHRydWVdLFxuICAgICAgICAgIFsnYml0Y29pbkJpdEdvU2lnbmV0JywgdHJ1ZSwgdHJ1ZV0sXG4gICAgICAgICAgWydiaXRjb2luY2FzaCcsIGZhbHNlLCBmYWxzZV0sXG4gICAgICAgICAgWydiaXRjb2luY2FzaFRlc3RuZXQnLCBmYWxzZSwgZmFsc2VdLFxuICAgICAgICAgIFsnYml0Y29pbmdvbGQnLCB0cnVlLCBmYWxzZV0sXG4gICAgICAgICAgWydiaXRjb2luZ29sZFRlc3RuZXQnLCB0cnVlLCBmYWxzZV0sXG4gICAgICAgICAgWydiaXRjb2luc3YnLCBmYWxzZSwgZmFsc2VdLFxuICAgICAgICAgIFsnYml0Y29pbnN2VGVzdG5ldCcsIGZhbHNlLCBmYWxzZV0sXG4gICAgICAgICAgWydkYXNoJywgZmFsc2UsIGZhbHNlXSxcbiAgICAgICAgICBbJ2Rhc2hUZXN0JywgZmFsc2UsIGZhbHNlXSxcbiAgICAgICAgICBbJ2RvZ2Vjb2luJywgZmFsc2UsIGZhbHNlXSxcbiAgICAgICAgICBbJ2RvZ2Vjb2luVGVzdCcsIGZhbHNlLCBmYWxzZV0sXG4gICAgICAgICAgWydlY2FzaCcsIGZhbHNlLCBmYWxzZV0sXG4gICAgICAgICAgWydlY2FzaFRlc3QnLCBmYWxzZSwgZmFsc2VdLFxuICAgICAgICAgIFsnbGl0ZWNvaW4nLCB0cnVlLCBmYWxzZV0sXG4gICAgICAgICAgWydsaXRlY29pblRlc3QnLCB0cnVlLCBmYWxzZV0sXG4gICAgICAgICAgWyd6Y2FzaCcsIGZhbHNlLCBmYWxzZV0sXG4gICAgICAgICAgWyd6Y2FzaFRlc3QnLCBmYWxzZSwgZmFsc2VdLFxuICAgICAgICBdXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBmb3IgKGNvbnN0IG5hbWUgaW4gbmV0d29ya3MpIHtcbiAgICBjb25zdCBuZXR3b3JrOiBOZXR3b3JrID0gbmV0d29ya3NbbmFtZV07XG5cbiAgICBkZXNjcmliZShgbmV0d29ya3MuJHtuYW1lfWAsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdpcyB2YWxpZCBuZXR3b3JrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBhc3NlcnQoaXNWYWxpZE5ldHdvcmsobmV0d29yaykpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdnZXROZXR3b3JrTmFtZSgpIHJldHVybnMgbmV0d29yayBuYW1lJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwobmFtZSwgZ2V0TmV0d29ya05hbWUobmV0d29yaykpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdoYXMgY29ycmVzcG9uZGluZyB0ZXN0bmV0L21haW5uZXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChpc01haW5uZXQobmV0d29yaykpIHtcbiAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaXNUZXN0bmV0KG5ldHdvcmspLCBmYWxzZSk7XG4gICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGdldE1haW5uZXQobmV0d29yayksIG5ldHdvcmspO1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0eXBlb2YgZ2V0VGVzdG5ldChuZXR3b3JrKSwgJ29iamVjdCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChpc01haW5uZXQobmV0d29yayksIGZhbHNlKTtcbiAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZ2V0VGVzdG5ldChuZXR3b3JrKSwgbmV0d29yayk7XG4gICAgICAgICAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKGdldE1haW5uZXQobmV0d29yayksIG5ldHdvcmspO1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0eXBlb2YgZ2V0TWFpbm5ldChuZXR3b3JrKSwgJ29iamVjdCcpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2hhcyBleHBlY3RlZCBwcm9wZXJ0aWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHlwZW9mIG5ldHdvcmssICdvYmplY3QnKTtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR5cGVvZiBuZXR3b3JrLm1lc3NhZ2VQcmVmaXgsICdzdHJpbmcnKTtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR5cGVvZiAobmV0d29yayBhcyBhbnkpLmJlY2gzMiwgYmVjaDMyQ29pbnMobmV0d29yaykgPyAnc3RyaW5nJyA6ICd1bmRlZmluZWQnKTtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR5cGVvZiBuZXR3b3JrLmJpcDMyLCAnb2JqZWN0Jyk7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0eXBlb2YgbmV0d29yay5wdWJLZXlIYXNoLCAnbnVtYmVyJyk7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0eXBlb2YgbmV0d29yay5zY3JpcHRIYXNoLCAnbnVtYmVyJyk7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0eXBlb2YgbmV0d29yay53aWYsICdudW1iZXInKTtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR5cGVvZiBuZXR3b3JrLmNvaW4sICdzdHJpbmcnKTtcblxuICAgICAgICBpZiAoaXNNYWlubmV0KG5ldHdvcmspKSB7XG4gICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG5ldHdvcmsuYmlwMzIucHVibGljLCBuZXR3b3Jrcy5iaXRjb2luLmJpcDMyLnB1YmxpYyk7XG4gICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG5ldHdvcmsuYmlwMzIucHJpdmF0ZSwgbmV0d29ya3MuYml0Y29pbi5iaXAzMi5wcml2YXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwobmV0d29yay5iaXAzMi5wdWJsaWMsIG5ldHdvcmtzLnRlc3RuZXQuYmlwMzIucHVibGljKTtcbiAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwobmV0d29yay5iaXAzMi5wcml2YXRlLCBuZXR3b3Jrcy50ZXN0bmV0LmJpcDMyLnByaXZhdGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgZm9yIChjb25zdCBvdGhlck5hbWUgaW4gbmV0d29ya3MpIHtcbiAgICAgICAgY29uc3Qgb3RoZXJOZXR3b3JrID0gbmV0d29ya3Nbb3RoZXJOYW1lXTtcblxuICAgICAgICBjb25zdCBhbHRlcm5hdGVCdGNUZXN0bmV0cyA9IFsnYml0Y29pblB1YmxpY1NpZ25ldCcsICdiaXRjb2luVGVzdG5ldDQnLCAnYml0Y29pbkJpdEdvU2lnbmV0J107XG4gICAgICAgIGlmIChcbiAgICAgICAgICAoYWx0ZXJuYXRlQnRjVGVzdG5ldHMuaW5jbHVkZXMobmFtZSkgJiYgb3RoZXJOYW1lID09PSAndGVzdG5ldCcpIHx8XG4gICAgICAgICAgYWx0ZXJuYXRlQnRjVGVzdG5ldHMuaW5jbHVkZXMob3RoZXJOYW1lKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGl0KCdpc1NhbWVDb2luKCkgcmV0dXJucyB0cnVlIHRlc3RuZXQvbWFpbm5ldCB2YXJpYW50cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoXG4gICAgICAgICAgICBpc1NhbWVDb2luKG5ldHdvcmssIG90aGVyTmV0d29yayksXG4gICAgICAgICAgICBvdGhlck5ldHdvcmsgPT09IGdldE1haW5uZXQobmV0d29yaykgfHwgb3RoZXJOZXR3b3JrID09PSBnZXRUZXN0bmV0KG5ldHdvcmspXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChuYW1lID09PSBvdGhlck5hbWUsIG5ldHdvcmsgPT09IG90aGVyTmV0d29yayk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChuZXR3b3JrID09PSBvdGhlck5ldHdvcmspIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGl0KGBoYXMgZGlzdGluY3QgcHJvcGVydGllcyB3aXRoICR7b3RoZXJOYW1lfWAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoXG4gICAgICAgICAgICBuZXR3b3JrLm1lc3NhZ2VQcmVmaXggPT09IG90aGVyTmV0d29yay5tZXNzYWdlUHJlZml4LFxuICAgICAgICAgICAgaXNTYW1lQ29pbihuZXR3b3JrLCBvdGhlck5ldHdvcmspIHx8IHNhbWVHcm91cChiaXRjb2luU2hhcmVkTWVzc2FnZVByZWZpeCwgbmV0d29yaywgb3RoZXJOZXR3b3JrKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoXG4gICAgICAgICAgICBuZXR3b3JrLnB1YktleUhhc2ggPT09IG90aGVyTmV0d29yay5wdWJLZXlIYXNoLFxuICAgICAgICAgICAgc2FtZUdyb3VwKGJpdGNvaW5NYWlubmV0U2hhcmVkUHVia2V5UHJlZml4LCBuZXR3b3JrLCBvdGhlck5ldHdvcmspIHx8XG4gICAgICAgICAgICAgIHNhbWVHcm91cChiaXRjb2luVGVzdG5ldFNoYXJlZFB1YmtleVByZWZpeCwgbmV0d29yaywgb3RoZXJOZXR3b3JrKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoXG4gICAgICAgICAgICBuZXR3b3JrLnNjcmlwdEhhc2ggPT09IG90aGVyTmV0d29yay5zY3JpcHRIYXNoLFxuICAgICAgICAgICAgc2FtZUdyb3VwKGJpdGNvaW5NYWlubmV0U2hhcmVkU2NyaXB0UHJlZml4LCBuZXR3b3JrLCBvdGhlck5ldHdvcmspIHx8XG4gICAgICAgICAgICAgIHNhbWVHcm91cChiaXRjb2luVGVzdG5ldFNoYXJlZFNjcmlwdFByZWZpeCwgbmV0d29yaywgb3RoZXJOZXR3b3JrKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoXG4gICAgICAgICAgICBuZXR3b3JrLndpZiA9PT0gb3RoZXJOZXR3b3JrLndpZixcbiAgICAgICAgICAgIHNhbWVHcm91cChiaXRjb2luTWFpbm5ldFNoYXJlZFdJRlByZWZpeCwgbmV0d29yaywgb3RoZXJOZXR3b3JrKSB8fFxuICAgICAgICAgICAgICBzYW1lR3JvdXAoYml0Y29pblRlc3RuZXRTaGFyZWRXSUZQcmVmaXgsIG5ldHdvcmssIG90aGVyTmV0d29yaylcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSk7XG4iXX0=Выполнить команду
Для локальной разработки. Не используйте в интернете!