PHP WebShell

Текущая директория: /usr/lib/node_modules/bitgo/node_modules/avalanche/typings/tests/apis/evm

Просмотр файла: inputs.test.js

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const utxos_1 = require("../../../src/apis/avm/utxos");
const keychain_1 = require("../../../src/apis/avm/keychain");
const inputs_1 = require("../../../src/apis/avm/inputs");
const create_hash_1 = __importDefault(require("create-hash"));
const bintools_1 = __importDefault(require("../../../src/utils/bintools"));
const bn_js_1 = __importDefault(require("bn.js"));
const buffer_1 = require("buffer/");
const outputs_1 = require("../../../src/apis/avm/outputs");
const constants_1 = require("../../../src/apis/evm/constants");
const input_1 = require("../../../src/common/input");
const evm_1 = require("../../../src/apis/evm");
/**
 * @ignore
 */
const bintools = bintools_1.default.getInstance();
describe("Inputs", () => {
    let set;
    let keymgr1;
    let keymgr2;
    let addrs1;
    let addrs2;
    let utxos;
    let hrp = "tests";
    const amnt = 10000;
    beforeEach(() => {
        set = new utxos_1.UTXOSet();
        keymgr1 = new keychain_1.KeyChain(hrp, "C");
        keymgr2 = new keychain_1.KeyChain(hrp, "C");
        addrs1 = [];
        addrs2 = [];
        utxos = [];
        for (let i = 0; i < 3; i++) {
            addrs1.push(keymgr1.makeKey().getAddress());
            addrs2.push(keymgr2.makeKey().getAddress());
        }
        const amount = new bn_js_1.default(amnt);
        const addresses = keymgr1.getAddresses();
        const locktime = new bn_js_1.default(54321);
        const threshold = 3;
        for (let i = 0; i < 3; i++) {
            const txid = buffer_1.Buffer.from((0, create_hash_1.default)("sha256")
                .update(bintools.fromBNToBuffer(new bn_js_1.default(i), 32))
                .digest());
            const txidx = buffer_1.Buffer.from(bintools.fromBNToBuffer(new bn_js_1.default(i), 4));
            const assetID = buffer_1.Buffer.from((0, create_hash_1.default)("sha256").update(txid).digest());
            const out = new outputs_1.SECPTransferOutput(amount.add(new bn_js_1.default(i)), addresses, locktime, threshold);
            const xferout = new outputs_1.TransferableOutput(assetID, out);
            const u = new utxos_1.UTXO(constants_1.EVMConstants.LATESTCODEC, txid, txidx, assetID, out);
            u.fromBuffer(buffer_1.Buffer.concat([u.getCodecIDBuffer(), txid, txidx, xferout.toBuffer()]));
            utxos.push(u);
        }
        set.addArray(utxos);
    });
    test("SECPInput", () => {
        let u;
        let txid;
        let txidx;
        const amount = new bn_js_1.default(amnt);
        let input;
        let xferinput;
        u = utxos[0];
        txid = u.getTxID();
        txidx = u.getOutputIdx();
        const asset = u.getAssetID();
        input = new inputs_1.SECPTransferInput(amount);
        xferinput = new inputs_1.TransferableInput(txid, txidx, asset, input);
        expect(xferinput.getUTXOID()).toBe(u.getUTXOID());
        expect(input.getInputID()).toBe(constants_1.EVMConstants.SECPINPUTID);
        input.addSignatureIdx(0, addrs2[0]);
        input.addSignatureIdx(1, addrs2[1]);
        const newin = new inputs_1.SECPTransferInput();
        newin.fromBuffer(bintools.b58ToBuffer(input.toString()));
        expect(newin.toBuffer().toString("hex")).toBe(input.toBuffer().toString("hex"));
        expect(newin.getSigIdxs().toString()).toBe(input.getSigIdxs().toString());
    });
    test("Input comparator", () => {
        const inpt1 = new inputs_1.SECPTransferInput(utxos[0].getOutput().getAmount());
        const inpt2 = new inputs_1.SECPTransferInput(utxos[1].getOutput().getAmount());
        const inpt3 = new inputs_1.SECPTransferInput(utxos[2].getOutput().getAmount());
        const cmp = input_1.Input.comparator();
        expect(cmp(inpt1, inpt2)).toBe(-1);
        expect(cmp(inpt1, inpt3)).toBe(-1);
        expect(cmp(inpt1, inpt1)).toBe(0);
        expect(cmp(inpt2, inpt2)).toBe(0);
        expect(cmp(inpt3, inpt3)).toBe(0);
    });
    test("TransferableInput comparator", () => {
        const inpt1 = new inputs_1.SECPTransferInput(utxos[0].getOutput().getAmount());
        const in1 = new inputs_1.TransferableInput(utxos[0].getTxID(), utxos[0].getOutputIdx(), utxos[0].getAssetID(), inpt1);
        const inpt2 = new inputs_1.SECPTransferInput(utxos[1].getOutput().getAmount());
        const in2 = new inputs_1.TransferableInput(utxos[1].getTxID(), utxos[1].getOutputIdx(), utxos[1].getAssetID(), inpt2);
        const inpt3 = new inputs_1.SECPTransferInput(utxos[2].getOutput().getAmount());
        const in3 = new inputs_1.TransferableInput(utxos[2].getTxID(), utxos[2].getOutputIdx(), utxos[2].getAssetID(), inpt3);
        const cmp = inputs_1.TransferableInput.comparator();
        expect(cmp(in1, in2)).toBe(-1);
        expect(cmp(in1, in3)).toBe(-1);
        expect(cmp(in1, in1)).toBe(0);
        expect(cmp(in2, in2)).toBe(0);
        expect(cmp(in3, in3)).toBe(0);
    });
    test("EVMInput comparator", () => {
        let inputs = [];
        const address1 = "0x55ee05dF718f1a5C1441e76190EB1a19eE2C9430";
        const address3 = "0x9632a79656af553F58738B0FB750320158495942";
        const address4 = "0x4Cf2eD3665F6bFA95cE6A11CFDb7A2EF5FC1C7E4";
        const address6 = "0x3C7daE394BBf8e9EE1359ad14C1C47003bD06293";
        const address8 = "0x0Fa8EA536Be85F32724D57A37758761B86416123";
        const amount1 = 1;
        const amount2 = 2;
        const amount3 = 3;
        const amount4 = 4;
        const amount5 = 5;
        const amount6 = 6;
        const amount7 = 7;
        const amount8 = 8;
        const assetID1 = "2fombhL7aGPwj3KH4bfrmJwW6PVnMobf9Y2fn9GwxiAAJyFDbe"; // dbcf890f77f49b96857648b72b77f9f82937f28a68704af05da0dc12ba53f2db
        const assetID2 = "vvKCjrpggyQ8FhJ2D5EAKPh8x8y4JK93JQiWRpTKpEouydRbG"; // 7a6e1e3c9c66ed8f076180f89d01320795628dca633001ff437ac6ab58b455be
        const assetID3 = "eRo1eb2Yxd87KuMYANBSha3n138wtqRhFz2xjftsXWnmpCxyh"; // 54fbd087a8a9c739c2c7926d742ea7b937adbd512b9ff0fd51f460a763d1371a
        const assetID5 = "2QqUTT3XTgR6HLbCLGtjN2uDHHqNRaBgtBGJ5KCqW7BUaH1P8X"; // b9d16d7c7d2674c3c67c5c26d9d6e39a09a5991c588cdf60c4cca732b66fa749
        const assetID6 = "ZWXaLcAy1YWS3Vvjcrt2KcVA4VxBsMFt8yNDZABJkgBvgpRti"; // 49d0dc67846a20dfea79b7beeba84769efa4a0273575f65ca79f9dee1cd1250e
        const assetID7 = "FHfS61NfF5XdZU62bcXp9yRfgrZeiQC7VNJWKcpdb9QMLHs4L"; // 2070e77e34941439dc7bcf502dcf555c6ef0e3cc46bbac8a03b22e15c84a81f1
        const assetID8 = "ZL6NeWgcnxR2zhhKDx7h9Kg2mZgScC5N4RG5FCDayWY7W3whZ"; // 496849239bb1541e97fa8f89256965bf7e657f3bb530cad820dd41706c5e3836
        const nonce1 = 0;
        const nonce2 = 1;
        const nonce3 = 2;
        const nonce4 = 3;
        const nonce5 = 4;
        const nonce6 = 5;
        const nonce7 = 6;
        const nonce8 = 7;
        const input1 = new evm_1.EVMInput(address1, amount1, assetID1, nonce1);
        inputs.push(input1);
        const input2 = new evm_1.EVMInput(address1, amount2, assetID2, nonce2);
        inputs.push(input2);
        const input3 = new evm_1.EVMInput(address3, amount3, assetID2, nonce3);
        inputs.push(input3);
        const input4 = new evm_1.EVMInput(address4, amount4, assetID3, nonce4);
        inputs.push(input4);
        const input5 = new evm_1.EVMInput(address1, amount5, assetID5, nonce5);
        inputs.push(input5);
        const input6 = new evm_1.EVMInput(address6, amount6, assetID6, nonce6);
        inputs.push(input6);
        const input7 = new evm_1.EVMInput(address1, amount7, assetID7, nonce7);
        inputs.push(input7);
        const input8 = new evm_1.EVMInput(address8, amount8, assetID8, nonce8);
        inputs.push(input8);
        inputs = inputs.sort(evm_1.EVMInput.comparator());
        expect(inputs[0].getAmount().toString()).toBe("8");
        expect(inputs[1].getAmount().toString()).toBe("6");
        expect(inputs[2].getAmount().toString()).toBe("4");
        expect(inputs[3].getAmount().toString()).toBe("7");
        expect(inputs[4].getAmount().toString()).toBe("2");
        expect(inputs[5].getAmount().toString()).toBe("5");
        expect(inputs[6].getAmount().toString()).toBe("1");
        expect(inputs[7].getAmount().toString()).toBe("3");
        const cmp = evm_1.EVMInput.comparator();
        expect(cmp(input2, input1)).toBe(-1);
        expect(cmp(input1, input3)).toBe(-1);
        expect(cmp(input2, input3)).toBe(-1);
        expect(cmp(input1, input1)).toBe(0);
        expect(cmp(input2, input2)).toBe(0);
        expect(cmp(input3, input3)).toBe(0);
        expect(cmp(input1, input2)).toBe(1);
        expect(cmp(input3, input1)).toBe(1);
        expect(cmp(input3, input2)).toBe(1);
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXRzLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0cy9hcGlzL2V2bS9pbnB1dHMudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHVEQUEyRDtBQUMzRCw2REFBeUQ7QUFDekQseURBR3FDO0FBQ3JDLDhEQUFvQztBQUNwQywyRUFBa0Q7QUFDbEQsa0RBQXNCO0FBQ3RCLG9DQUFnQztBQUNoQywyREFJc0M7QUFDdEMsK0RBQThEO0FBQzlELHFEQUFpRDtBQUVqRCwrQ0FBZ0Q7QUFFaEQ7O0dBRUc7QUFDSCxNQUFNLFFBQVEsR0FBYSxrQkFBUSxDQUFDLFdBQVcsRUFBRSxDQUFBO0FBQ2pELFFBQVEsQ0FBQyxRQUFRLEVBQUUsR0FBUyxFQUFFO0lBQzVCLElBQUksR0FBWSxDQUFBO0lBQ2hCLElBQUksT0FBaUIsQ0FBQTtJQUNyQixJQUFJLE9BQWlCLENBQUE7SUFDckIsSUFBSSxNQUFnQixDQUFBO0lBQ3BCLElBQUksTUFBZ0IsQ0FBQTtJQUNwQixJQUFJLEtBQWEsQ0FBQTtJQUNqQixJQUFJLEdBQUcsR0FBVyxPQUFPLENBQUE7SUFDekIsTUFBTSxJQUFJLEdBQVcsS0FBSyxDQUFBO0lBQzFCLFVBQVUsQ0FBQyxHQUFTLEVBQUU7UUFDcEIsR0FBRyxHQUFHLElBQUksZUFBTyxFQUFFLENBQUE7UUFDbkIsT0FBTyxHQUFHLElBQUksbUJBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUE7UUFDaEMsT0FBTyxHQUFHLElBQUksbUJBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUE7UUFDaEMsTUFBTSxHQUFHLEVBQUUsQ0FBQTtRQUNYLE1BQU0sR0FBRyxFQUFFLENBQUE7UUFDWCxLQUFLLEdBQUcsRUFBRSxDQUFBO1FBQ1YsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNsQyxNQUFNLENB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QU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNsRCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ2xELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDbEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUVsRCxNQUFNLEdBQUcsR0FBRyxjQUFRLENBQUMsVUFBVSxFQUFFLENBQUE7UUFDakMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNwQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3BDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDcEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDbkMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDbkMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDbkMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDbkMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDbkMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDckMsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFVUWE9TZXQsIFVUWE8gfSBmcm9tIFwiLi4vLi4vLi4vc3JjL2FwaXMvYXZtL3V0eG9zXCJcbmltcG9ydCB7IEtleUNoYWluIH0gZnJvbSBcIi4uLy4uLy4uL3NyYy9hcGlzL2F2bS9rZXljaGFpblwiXG5pbXBvcnQge1xuICBTRUNQVHJhbnNmZXJJbnB1dCxcbiAgVHJhbnNmZXJhYmxlSW5wdXRcbn0gZnJvbSBcIi4uLy4uLy4uL3NyYy9hcGlzL2F2bS9pbnB1dHNcIlxuaW1wb3J0IGNyZWF0ZUhhc2ggZnJvbSBcImNyZWF0ZS1oYXNoXCJcbmltcG9ydCBCaW5Ub29scyBmcm9tIFwiLi4vLi4vLi4vc3JjL3V0aWxzL2JpbnRvb2xzXCJcbmltcG9ydCBCTiBmcm9tIFwiYm4uanNcIlxuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSBcImJ1ZmZlci9cIlxuaW1wb3J0IHtcbiAgU0VDUFRyYW5zZmVyT3V0cHV0LFxuICBBbW91bnRPdXRwdXQsXG4gIFRyYW5zZmVyYWJsZU91dHB1dFxufSBmcm9tIFwiLi4vLi4vLi4vc3JjL2FwaXMvYXZtL291dHB1dHNcIlxuaW1wb3J0IHsgRVZNQ29uc3RhbnRzIH0gZnJvbSBcIi4uLy4uLy4uL3NyYy9hcGlzL2V2bS9jb25zdGFudHNcIlxuaW1wb3J0IHsgSW5wdXQgfSBmcm9tIFwiLi4vLi4vLi4vc3JjL2NvbW1vbi9pbnB1dFwiXG5pbXBvcnQgeyBPdXRwdXQgfSBmcm9tIFwiLi4vLi4vLi4vc3JjL2NvbW1vbi9vdXRwdXRcIlxuaW1wb3J0IHsgRVZNSW5wdXQgfSBmcm9tIFwiLi4vLi4vLi4vc3JjL2FwaXMvZXZtXCJcblxuLyoqXG4gKiBAaWdub3JlXG4gKi9cbmNvbnN0IGJpbnRvb2xzOiBCaW5Ub29scyA9IEJpblRvb2xzLmdldEluc3RhbmNlKClcbmRlc2NyaWJlKFwiSW5wdXRzXCIsICgpOiB2b2lkID0+IHtcbiAgbGV0IHNldDogVVRYT1NldFxuICBsZXQga2V5bWdyMTogS2V5Q2hhaW5cbiAgbGV0IGtleW1ncjI6IEtleUNoYWluXG4gIGxldCBhZGRyczE6IEJ1ZmZlcltdXG4gIGxldCBhZGRyczI6IEJ1ZmZlcltdXG4gIGxldCB1dHhvczogVVRYT1tdXG4gIGxldCBocnA6IHN0cmluZyA9IFwidGVzdHNcIlxuICBjb25zdCBhbW50OiBudW1iZXIgPSAxMDAwMFxuICBiZWZvcmVFYWNoKCgpOiB2b2lkID0+IHtcbiAgICBzZXQgPSBuZXcgVVRYT1NldCgpXG4gICAga2V5bWdyMSA9IG5ldyBLZXlDaGFpbihocnAsIFwiQ1wiKVxuICAgIGtleW1ncjIgPSBuZXcgS2V5Q2hhaW4oaHJwLCBcIkNcIilcbiAgICBhZGRyczEgPSBbXVxuICAgIGFkZHJzMiA9IFtdXG4gICAgdXR4b3MgPSBbXVxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCAzOyBpKyspIHtcbiAgICAgIGFkZHJzMS5wdXNoKGtleW1ncjEubWFrZUtleSgpLmdldEFkZHJlc3MoKSlcbiAgICAgIGFkZHJzMi5wdXNoKGtleW1ncjIubWFrZUtleSgpLmdldEFkZHJlc3MoKSlcbiAgICB9XG4gICAgY29uc3QgYW1vdW50OiBCTiA9IG5ldyBCTihhbW50KVxuICAgIGNvbnN0IGFkZHJlc3NlczogQnVmZmVyW10gPSBrZXltZ3IxLmdldEFkZHJlc3NlcygpXG4gICAgY29uc3QgbG9ja3RpbWU6IEJOID0gbmV3IEJOKDU0MzIxKVxuICAgIGNvbnN0IHRocmVzaG9sZDogbnVtYmVyID0gM1xuXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IDM7IGkrKykge1xuICAgICAgY29uc3QgdHhpZDogQnVmZmVyID0gQnVmZmVyLmZyb20oXG4gICAgICAgIGNyZWF0ZUhhc2goXCJzaGEyNTZcIilcbiAgICAgICAgICAudXBkYXRlKGJpbnRvb2xzLmZyb21CTlRvQnVmZmVyKG5ldyBCTihpKSwgMzIpKVxuICAgICAgICAgIC5kaWdlc3QoKVxuICAgICAgKVxuICAgICAgY29uc3QgdHhpZHg6IEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGJpbnRvb2xzLmZyb21CTlRvQnVmZmVyKG5ldyBCTihpKSwgNCkpXG4gICAgICBjb25zdCBhc3NldElEOiBCdWZmZXIgPSBCdWZmZXIuZnJvbShcbiAgICAgICAgY3JlYXRlSGFzaChcInNoYTI1NlwiKS51cGRhdGUodHhpZCkuZGlnZXN0KClcbiAgICAgIClcbiAgICAgIGNvbnN0IG91dDogT3V0cHV0ID0gbmV3IFNFQ1BUcmFuc2Zlck91dHB1dChcbiAgICAgICAgYW1vdW50LmFkZChuZXcgQk4oaSkpLFxuICAgICAgICBhZGRyZXNzZXMsXG4gICAgICAgIGxvY2t0aW1lLFxuICAgICAgICB0aHJlc2hvbGRcbiAgICAgIClcbiAgICAgIGNvbnN0IHhmZXJvdXQ6IFRyYW5zZmVyYWJsZU91dHB1dCA9IG5ldyBUcmFuc2ZlcmFibGVPdXRwdXQoYXNzZXRJRCwgb3V0KVxuICAgICAgY29uc3QgdTogVVRYTyA9IG5ldyBVVFhPKFxuICAgICAgICBFVk1Db25zdGFudHMuTEFURVNUQ09ERUMsXG4gICAgICAgIHR4aWQsXG4gICAgICAgIHR4aWR4LFxuICAgICAgICBhc3NldElELFxuICAgICAgICBvdXRcbiAgICAgIClcbiAgICAgIHUuZnJvbUJ1ZmZlcihcbiAgICAgICAgQnVmZmVyLmNvbmNhdChbdS5nZXRDb2RlY0lEQnVmZmVyKCksIHR4aWQsIHR4aWR4LCB4ZmVyb3V0LnRvQnVmZmVyKCldKVxuICAgICAgKVxuICAgICAgdXR4b3MucHVzaCh1KVxuICAgIH1cbiAgICBzZXQuYWRkQXJyYXkodXR4b3MpXG4gIH0pXG4gIHRlc3QoXCJTRUNQSW5wdXRcIiwgKCk6IHZvaWQgPT4ge1xuICAgIGxldCB1OiBVVFhPXG4gICAgbGV0IHR4aWQ6IEJ1ZmZlclxuICAgIGxldCB0eGlkeDogQnVmZmVyXG4gICAgY29uc3QgYW1vdW50OiBCTiA9IG5ldyBCTihhbW50KVxuICAgIGxldCBpbnB1dDogU0VDUFRyYW5zZmVySW5wdXRcbiAgICBsZXQgeGZlcmlucHV0OiBUcmFuc2ZlcmFibGVJbnB1dFxuXG4gICAgdSA9IHV0eG9zWzBdXG4gICAgdHhpZCA9IHUuZ2V0VHhJRCgpXG4gICAgdHhpZHggPSB1LmdldE91dHB1dElkeCgpXG4gICAgY29uc3QgYXNzZXQgPSB1LmdldEFzc2V0SUQoKVxuXG4gICAgaW5wdXQgPSBuZXcgU0VDUFRyYW5zZmVySW5wdXQoYW1vdW50KVxuICAgIHhmZXJpbnB1dCA9IG5ldyBUcmFuc2ZlcmFibGVJbnB1dCh0eGlkLCB0eGlkeCwgYXNzZXQsIGlucHV0KVxuICAgIGV4cGVjdCh4ZmVyaW5wdXQuZ2V0VVRYT0lEKCkpLnRvQmUodS5nZXRVVFhPSUQoKSlcbiAgICBleHBlY3QoaW5wdXQuZ2V0SW5wdXRJRCgpKS50b0JlKEVWTUNvbnN0YW50cy5TRUNQSU5QVVRJRClcblxuICAgIGlucHV0LmFkZFNpZ25hdHVyZUlkeCgwLCBhZGRyczJbMF0pXG4gICAgaW5wdXQuYWRkU2lnbmF0dXJlSWR4KDEsIGFkZHJzMlsxXSlcblxuICAgIGNvbnN0IG5ld2luOiBTRUNQVHJhbnNmZXJJbnB1dCA9IG5ldyBTRUNQVHJhbnNmZXJJbnB1dCgpXG4gICAgbmV3aW4uZnJvbUJ1ZmZlcihiaW50b29scy5iNThUb0J1ZmZlcihpbnB1dC50b1N0cmluZygpKSlcbiAgICBleHBlY3QobmV3aW4udG9CdWZmZXIoKS50b1N0cmluZyhcImhleFwiKSkudG9CZShcbiAgICAgIGlucHV0LnRvQnVmZmVyKCkudG9TdHJpbmcoXCJoZXhcIilcbiAgICApXG4gICAgZXhwZWN0KG5ld2luLmdldFNpZ0lkeHMoKS50b1N0cmluZygpKS50b0JlKGlucHV0LmdldFNpZ0lkeHMoKS50b1N0cmluZygpKVxuICB9KVxuXG4gIHRlc3QoXCJJbnB1dCBjb21wYXJhdG9yXCIsICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCBpbnB0MTogU0VDUFRyYW5zZmVySW5wdXQgPSBuZXcgU0VDUFRyYW5zZmVySW5wdXQoXG4gICAgICAodXR4b3NbMF0uZ2V0T3V0cHV0KCkgYXMgQW1vdW50T3V0cHV0KS5nZXRBbW91bnQoKVxuICAgIClcblxuICAgIGNvbnN0IGlucHQyOiBTRUNQVHJhbnNmZXJJbnB1dCA9IG5ldyBTRUNQVHJhbnNmZXJJbnB1dChcbiAgICAgICh1dHhvc1sxXS5nZXRPdXRwdXQoKSBhcyBBbW91bnRPdXRwdXQpLmdldEFtb3VudCgpXG4gICAgKVxuXG4gICAgY29uc3QgaW5wdDM6IFNFQ1BUcmFuc2ZlcklucHV0ID0gbmV3IFNFQ1BUcmFuc2ZlcklucHV0KFxuICAgICAgKHV0eG9zWzJdLmdldE91dHB1dCgpIGFzIEFtb3VudE91dHB1dCkuZ2V0QW1vdW50KClcbiAgICApXG5cbiAgICBjb25zdCBjbXAgPSBJbnB1dC5jb21wYXJhdG9yKClcbiAgICBleHBlY3QoY21wKGlucHQxLCBpbnB0MikpLnRvQmUoLTEpXG4gICAgZXhwZWN0KGNtcChpbnB0MSwgaW5wdDMpKS50b0JlKC0xKVxuICAgIGV4cGVjdChjbXAoaW5wdDEsIGlucHQxKSkudG9CZSgwKVxuICAgIGV4cGVjdChjbXAoaW5wdDIsIGlucHQyKSkudG9CZSgwKVxuICAgIGV4cGVjdChjbXAoaW5wdDMsIGlucHQzKSkudG9CZSgwKVxuICB9KVxuXG4gIHRlc3QoXCJUcmFuc2ZlcmFibGVJbnB1dCBjb21wYXJhdG9yXCIsICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCBpbnB0MTogU0VDUFRyYW5zZmVySW5wdXQgPSBuZXcgU0VDUFRyYW5zZmVySW5wdXQoXG4gICAgICAodXR4b3NbMF0uZ2V0T3V0cHV0KCkgYXMgQW1vdW50T3V0cHV0KS5nZXRBbW91bnQoKVxuICAgIClcbiAgICBjb25zdCBpbjE6IFRyYW5zZmVyYWJsZUlucHV0ID0gbmV3IFRyYW5zZmVyYWJsZUlucHV0KFxuICAgICAgdXR4b3NbMF0uZ2V0VHhJRCgpLFxuICAgICAgdXR4b3NbMF0uZ2V0T3V0cHV0SWR4KCksXG4gICAgICB1dHhvc1swXS5nZXRBc3NldElEKCksXG4gICAgICBpbnB0MVxuICAgIClcblxuICAgIGNvbnN0IGlucHQyOiBTRUNQVHJhbnNmZXJJbnB1dCA9IG5ldyBTRUNQVHJhbnNmZXJJbnB1dChcbiAgICAgICh1dHhvc1sxXS5nZXRPdXRwdXQoKSBhcyBBbW91bnRPdXRwdXQpLmdldEFtb3VudCgpXG4gICAgKVxuICAgIGNvbnN0IGluMjogVHJhbnNmZXJhYmxlSW5wdXQgPSBuZXcgVHJhbnNmZXJhYmxlSW5wdXQoXG4gICAgICB1dHhvc1sxXS5nZXRUeElEKCksXG4gICAgICB1dHhvc1sxXS5nZXRPdXRwdXRJZHgoKSxcbiAgICAgIHV0eG9zWzFdLmdldEFzc2V0SUQoKSxcbiAgICAgIGlucHQyXG4gICAgKVxuXG4gICAgY29uc3QgaW5wdDM6IFNFQ1BUcmFuc2ZlcklucHV0ID0gbmV3IFNFQ1BUcmFuc2ZlcklucHV0KFxuICAgICAgKHV0eG9zWzJdLmdldE91dHB1dCgpIGFzIEFtb3VudE91dHB1dCkuZ2V0QW1vdW50KClcbiAgICApXG4gICAgY29uc3QgaW4zOiBUcmFuc2ZlcmFibGVJbnB1dCA9IG5ldyBUcmFuc2ZlcmFibGVJbnB1dChcbiAgICAgIHV0eG9zWzJdLmdldFR4SUQoKSxcbiAgICAgIHV0eG9zWzJdLmdldE91dHB1dElkeCgpLFxuICAgICAgdXR4b3NbMl0uZ2V0QXNzZXRJRCgpLFxuICAgICAgaW5wdDNcbiAgICApXG5cbiAgICBjb25zdCBjbXAgPSBUcmFuc2ZlcmFibGVJbnB1dC5jb21wYXJhdG9yKClcbiAgICBleHBlY3QoY21wKGluMSwgaW4yKSkudG9CZSgtMSlcbiAgICBleHBlY3QoY21wKGluMSwgaW4zKSkudG9CZSgtMSlcbiAgICBleHBlY3QoY21wKGluMSwgaW4xKSkudG9CZSgwKVxuICAgIGV4cGVjdChjbXAoaW4yLCBpbjIpKS50b0JlKDApXG4gICAgZXhwZWN0KGNtcChpbjMsIGluMykpLnRvQmUoMClcbiAgfSlcblxuICB0ZXN0KFwiRVZNSW5wdXQgY29tcGFyYXRvclwiLCAoKTogdm9pZCA9PiB7XG4gICAgbGV0IGlucHV0czogRVZNSW5wdXRbXSA9IFtdXG4gICAgY29uc3QgYWRkcmVzczE6IHN0cmluZyA9IFwiMHg1NWVlMDVkRjcxOGYxYTVDMTQ0MWU3NjE5MEVCMWExOWVFMkM5NDMwXCJcbiAgICBjb25zdCBhZGRyZXNzMzogc3RyaW5nID0gXCIweDk2MzJhNzk2NTZhZjU1M0Y1ODczOEIwRkI3NTAzMjAxNTg0OTU5NDJcIlxuICAgIGNvbnN0IGFkZHJlc3M0OiBzdHJpbmcgPSBcIjB4NENmMmVEMzY2NUY2YkZBOTVjRTZBMTFDRkRiN0EyRUY1RkMxQzdFNFwiXG4gICAgY29uc3QgYWRkcmVzczY6IHN0cmluZyA9IFwiMHgzQzdkYUUzOTRCQmY4ZTlFRTEzNTlhZDE0QzFDNDcwMDNiRDA2MjkzXCJcbiAgICBjb25zdCBhZGRyZXNzODogc3RyaW5nID0gXCIweDBGYThFQTUzNkJlODVGMzI3MjRENTdBMzc3NTg3NjFCODY0MTYxMjNcIlxuICAgIGNvbnN0IGFtb3VudDE6IG51bWJlciA9IDFcbiAgICBjb25zdCBhbW91bnQyOiBudW1iZXIgPSAyXG4gICAgY29uc3QgYW1vdW50MzogbnVtYmVyID0gM1xuICAgIGNvbnN0IGFtb3VudDQ6IG51bWJlciA9IDRcbiAgICBjb25zdCBhbW91bnQ1OiBudW1iZXIgPSA1XG4gICAgY29uc3QgYW1vdW50NjogbnVtYmVyID0gNlxuICAgIGNvbnN0IGFtb3VudDc6IG51bWJlciA9IDdcbiAgICBjb25zdCBhbW91bnQ4OiBudW1iZXIgPSA4XG4gICAgY29uc3QgYXNzZXRJRDE6IHN0cmluZyA9XG4gICAgICBcIjJmb21iaEw3YUdQd2ozS0g0YmZybUp3VzZQVm5Nb2JmOVkyZm45R3d4aUFBSnlGRGJlXCIgLy8gZGJjZjg5MGY3N2Y0OWI5Njg1NzY0OGI3MmI3N2Y5ZjgyOTM3ZjI4YTY4NzA0YWYwNWRhMGRjMTJiYTUzZjJkYlxuICAgIGNvbnN0IGFzc2V0SUQyOiBzdHJpbmcgPSBcInZ2S0NqcnBnZ3lROEZoSjJENUVBS1BoOHg4eTRKSzkzSlFpV1JwVEtwRW91eWRSYkdcIiAvLyA3YTZlMWUzYzljNjZlZDhmMDc2MTgwZjg5ZDAxMzIwNzk1NjI4ZGNhNjMzMDAxZmY0MzdhYzZhYjU4YjQ1NWJlXG4gICAgY29uc3QgYXNzZXRJRDM6IHN0cmluZyA9IFwiZVJvMWViMll4ZDg3S3VNWUFOQlNoYTNuMTM4d3RxUmhGejJ4amZ0c1hXbm1wQ3h5aFwiIC8vIDU0ZmJkMDg3YThhOWM3MzljMmM3OTI2ZDc0MmVhN2I5MzdhZGJkNTEyYjlmZjBmZDUxZjQ2MGE3NjNkMTM3MWFcbiAgICBjb25zdCBhc3NldElENTogc3RyaW5nID1cbiAgICAgIFwiMlFxVVRUM1hUZ1I2SExiQ0xHdGpOMnVESEhxTlJhQmd0QkdKNUtDcVc3QlVhSDFQOFhcIiAvLyBiOWQxNmQ3YzdkMjY3NGMzYzY3YzVjMjZkOWQ2ZTM5YTA5YTU5OTFjNTg4Y2RmNjBjNGNjYTczMmI2NmZhNzQ5XG4gICAgY29uc3QgYXNzZXRJRDY6IHN0cmluZyA9IFwiWldYYUxjQXkxWVdTM1Z2amNydDJLY1ZBNFZ4QnNNRnQ4eU5EWkFCSmtnQnZncFJ0aVwiIC8vIDQ5ZDBkYzY3ODQ2YTIwZGZlYTc5YjdiZWViYTg0NzY5ZWZhNGEwMjczNTc1ZjY1Y2E3OWY5ZGVlMWNkMTI1MGVcbiAgICBjb25zdCBhc3NldElENzogc3RyaW5nID0gXCJGSGZTNjFOZkY1WGRaVTYyYmNYcDl5UmZnclplaVFDN1ZOSldLY3BkYjlRTUxIczRMXCIgLy8gMjA3MGU3N2UzNDk0MTQzOWRjN2JjZjUwMmRjZjU1NWM2ZWYwZTNjYzQ2YmJhYzhhMDNiMjJlMTVjODRhODFmMVxuICAgIGNvbnN0IGFzc2V0SUQ4OiBzdHJpbmcgPSBcIlpMNk5lV2djbnhSMnpoaEtEeDdoOUtnMm1aZ1NjQzVONFJHNUZDRGF5V1k3VzN3aFpcIiAvLyA0OTY4NDkyMzliYjE1NDFlOTdmYThmODkyNTY5NjViZjdlNjU3ZjNiYjUzMGNhZDgyMGRkNDE3MDZjNWUzODM2XG4gICAgY29uc3Qgbm9uY2UxOiBudW1iZXIgPSAwXG4gICAgY29uc3Qgbm9uY2UyOiBudW1iZXIgPSAxXG4gICAgY29uc3Qgbm9uY2UzOiBudW1iZXIgPSAyXG4gICAgY29uc3Qgbm9uY2U0OiBudW1iZXIgPSAzXG4gICAgY29uc3Qgbm9uY2U1OiBudW1iZXIgPSA0XG4gICAgY29uc3Qgbm9uY2U2OiBudW1iZXIgPSA1XG4gICAgY29uc3Qgbm9uY2U3OiBudW1iZXIgPSA2XG4gICAgY29uc3Qgbm9uY2U4OiBudW1iZXIgPSA3XG5cbiAgICBjb25zdCBpbnB1dDE6IEVWTUlucHV0ID0gbmV3IEVWTUlucHV0KGFkZHJlc3MxLCBhbW91bnQxLCBhc3NldElEMSwgbm9uY2UxKVxuICAgIGlucHV0cy5wdXNoKGlucHV0MSlcbiAgICBjb25zdCBpbnB1dDI6IEVWTUlucHV0ID0gbmV3IEVWTUlucHV0KGFkZHJlc3MxLCBhbW91bnQyLCBhc3NldElEMiwgbm9uY2UyKVxuICAgIGlucHV0cy5wdXNoKGlucHV0MilcbiAgICBjb25zdCBpbnB1dDM6IEVWTUlucHV0ID0gbmV3IEVWTUlucHV0KGFkZHJlc3MzLCBhbW91bnQzLCBhc3NldElEMiwgbm9uY2UzKVxuICAgIGlucHV0cy5wdXNoKGlucHV0MylcbiAgICBjb25zdCBpbnB1dDQ6IEVWTUlucHV0ID0gbmV3IEVWTUlucHV0KGFkZHJlc3M0LCBhbW91bnQ0LCBhc3NldElEMywgbm9uY2U0KVxuICAgIGlucHV0cy5wdXNoKGlucHV0NClcbiAgICBjb25zdCBpbnB1dDU6IEVWTUlucHV0ID0gbmV3IEVWTUlucHV0KGFkZHJlc3MxLCBhbW91bnQ1LCBhc3NldElENSwgbm9uY2U1KVxuICAgIGlucHV0cy5wdXNoKGlucHV0NSlcbiAgICBjb25zdCBpbnB1dDY6IEVWTUlucHV0ID0gbmV3IEVWTUlucHV0KGFkZHJlc3M2LCBhbW91bnQ2LCBhc3NldElENiwgbm9uY2U2KVxuICAgIGlucHV0cy5wdXNoKGlucHV0NilcbiAgICBjb25zdCBpbnB1dDc6IEVWTUlucHV0ID0gbmV3IEVWTUlucHV0KGFkZHJlc3MxLCBhbW91bnQ3LCBhc3NldElENywgbm9uY2U3KVxuICAgIGlucHV0cy5wdXNoKGlucHV0NylcbiAgICBjb25zdCBpbnB1dDg6IEVWTUlucHV0ID0gbmV3IEVWTUlucHV0KGFkZHJlc3M4LCBhbW91bnQ4LCBhc3NldElEOCwgbm9uY2U4KVxuICAgIGlucHV0cy5wdXNoKGlucHV0OClcbiAgICBpbnB1dHMgPSBpbnB1dHMuc29ydChFVk1JbnB1dC5jb21wYXJhdG9yKCkpXG4gICAgZXhwZWN0KGlucHV0c1swXS5nZXRBbW91bnQoKS50b1N0cmluZygpKS50b0JlKFwiOFwiKVxuICAgIGV4cGVjdChpbnB1dHNbMV0uZ2V0QW1vdW50KCkudG9TdHJpbmcoKSkudG9CZShcIjZcIilcbiAgICBleHBlY3QoaW5wdXRzWzJdLmdldEFtb3VudCgpLnRvU3RyaW5nKCkpLnRvQmUoXCI0XCIpXG4gICAgZXhwZWN0KGlucHV0c1szXS5nZXRBbW91bnQoKS50b1N0cmluZygpKS50b0JlKFwiN1wiKVxuICAgIGV4cGVjdChpbnB1dHNbNF0uZ2V0QW1vdW50KCkudG9TdHJpbmcoKSkudG9CZShcIjJcIilcbiAgICBleHBlY3QoaW5wdXRzWzVdLmdldEFtb3VudCgpLnRvU3RyaW5nKCkpLnRvQmUoXCI1XCIpXG4gICAgZXhwZWN0KGlucHV0c1s2XS5nZXRBbW91bnQoKS50b1N0cmluZygpKS50b0JlKFwiMVwiKVxuICAgIGV4cGVjdChpbnB1dHNbN10uZ2V0QW1vdW50KCkudG9TdHJpbmcoKSkudG9CZShcIjNcIilcblxuICAgIGNvbnN0IGNtcCA9IEVWTUlucHV0LmNvbXBhcmF0b3IoKVxuICAgIGV4cGVjdChjbXAoaW5wdXQyLCBpbnB1dDEpKS50b0JlKC0xKVxuICAgIGV4cGVjdChjbXAoaW5wdXQxLCBpbnB1dDMpKS50b0JlKC0xKVxuICAgIGV4cGVjdChjbXAoaW5wdXQyLCBpbnB1dDMpKS50b0JlKC0xKVxuICAgIGV4cGVjdChjbXAoaW5wdXQxLCBpbnB1dDEpKS50b0JlKDApXG4gICAgZXhwZWN0KGNtcChpbnB1dDIsIGlucHV0MikpLnRvQmUoMClcbiAgICBleHBlY3QoY21wKGlucHV0MywgaW5wdXQzKSkudG9CZSgwKVxuICAgIGV4cGVjdChjbXAoaW5wdXQxLCBpbnB1dDIpKS50b0JlKDEpXG4gICAgZXhwZWN0KGNtcChpbnB1dDMsIGlucHV0MSkpLnRvQmUoMSlcbiAgICBleHBlY3QoY21wKGlucHV0MywgaW5wdXQyKSkudG9CZSgxKVxuICB9KVxufSlcbiJdfQ==

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


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