PHP WebShell

Текущая директория: /opt/BitGoJS/modules/utxo-core/dist/test/descriptor/psbt

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

"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    var desc = Object.getOwnPropertyDescriptor(m, k);
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
      desc = { enumerable: true, get: function() { return m[k]; } };
    }
    Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
    Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
    o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
    var ownKeys = function(o) {
        ownKeys = Object.getOwnPropertyNames || function (o) {
            var ar = [];
            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
            return ar;
        };
        return ownKeys(o);
    };
    return function (mod) {
        if (mod && mod.__esModule) return mod;
        var result = {};
        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
        __setModuleDefault(result, mod);
        return result;
    };
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const assert_1 = __importDefault(require("assert"));
const utxolib = __importStar(require("@bitgo/utxo-lib"));
const utxo_lib_1 = require("@bitgo/utxo-lib");
const wasm_miniscript_1 = require("@bitgo/wasm-miniscript");
const descriptor_1 = require("../../../src/descriptor");
const testutil_1 = require("../../../src/testutil");
const descriptor_2 = require("../../../src/testutil/descriptor");
const sign_1 = require("../../../src/descriptor/psbt/sign");
function normalize(v) {
    if (typeof v === 'bigint') {
        return v.toString();
    }
    if (v instanceof wasm_miniscript_1.Descriptor) {
        return v.toString();
    }
    if (v instanceof Buffer) {
        return v.toString('hex');
    }
    if (v instanceof utxolib.Psbt) {
        return (0, descriptor_2.toPlainObjectFromPsbt)(v);
    }
    if (v instanceof utxolib.Transaction) {
        return (0, descriptor_2.toPlainObjectFromTx)(v);
    }
    if (Array.isArray(v)) {
        return v.map(normalize);
    }
    if (typeof v === 'object' && v !== null) {
        return Object.fromEntries(Object.entries(v).flatMap(([k, v]) => (v === undefined ? [] : [[k, normalize(v)]])));
    }
    return v;
}
async function assertEqualsFixture(t, filename, value) {
    filename = __dirname + '/fixtures/' + t + '.' + filename;
    const nv = normalize(value);
    assert_1.default.deepStrictEqual(nv, await (0, testutil_1.getFixture)(filename, nv));
}
const selfKeys = (0, testutil_1.getKeyTriple)('a');
const otherKeys = (0, testutil_1.getKeyTriple)('b');
function toPlain(k) {
    assert_1.default.ok(k.privateKey);
    return utxo_lib_1.ECPair.fromPrivateKey(k.privateKey);
}
function getStages(psbt, parsed, stages) {
    return Object.fromEntries(stages.map((stage) => {
        const psbtStageWrapped = (0, descriptor_1.toWrappedPsbt)(psbt);
        for (const key of stage.keys) {
            (0, assert_1.default)((0, sign_1.getNewSignatureCount)((0, sign_1.signWithKey)(psbtStageWrapped, key)) > 0, 'No new signatures were created');
        }
        const psbtStage = (0, descriptor_1.toUtxoPsbt)(psbtStageWrapped, utxolib.networks.bitcoin);
        let psbtFinal;
        let networkTx;
        let networkTxBuffer;
        if (stage.final) {
            psbtStageWrapped.finalize();
            psbtFinal = (0, descriptor_1.toUtxoPsbt)(psbtStageWrapped, utxolib.networks.bitcoin);
            networkTx = psbtFinal.extractTransaction();
            networkTxBuffer = networkTx.toBuffer();
        }
        return [
            stage.name,
            {
                psbt: psbtStage,
                parsed,
                psbtFinal,
                networkTx,
                networkTxBuffer,
            },
        ];
    }));
}
function describeCreatePsbt(name, testParams) {
    describe(`createPsbt ${name}`, function () {
        it('creates psbt with expected properties', async function () {
            const psbtUnsigned = 'psbt' in testParams
                ? testParams.psbt
                : (0, descriptor_2.mockPsbtDefault)({
                    descriptorSelf: testParams.descriptorSelf,
                    descriptorOther: (0, descriptor_2.getDescriptor)('Wsh2Of3', otherKeys),
                    params: testParams.psbtParams,
                });
            const descriptorMap = new Map([['self', testParams.descriptorSelf]]);
            const parsed = (0, descriptor_1.parse)(psbtUnsigned, descriptorMap, utxolib.networks.bitcoin);
            assert_1.default.strictEqual(parsed.spendAmount, psbtUnsigned.txOutputs[1].value);
            await assertEqualsFixture(name, 'psbtStages.json', getStages(psbtUnsigned, parsed, testParams.stages));
        });
    });
}
const defaultStagesCombinedAB = [
    { name: 'unsigned', keys: [] },
    { name: 'signedA', keys: selfKeys.slice(0, 1) },
    { name: 'signedAB', keys: selfKeys.slice(0, 2), final: true },
];
function getDefaultStagesSeparateAB({ plain = false } = {}) {
    const keys = plain ? selfKeys.map(toPlain) : selfKeys;
    return [
        { name: 'unsigned', keys: [] },
        { name: 'signedA', keys: keys.slice(0, 1) },
        { name: 'signedB', keys: keys.slice(1, 2), final: true },
    ];
}
function describeCreatePsbt2Of3(t) {
    describeCreatePsbt(t, {
        descriptorSelf: (0, descriptor_2.getDescriptor)(t, selfKeys),
        psbtParams: (0, descriptor_2.getPsbtParams)(t),
        stages: defaultStagesCombinedAB,
    });
}
describeCreatePsbt2Of3('Wsh2Of3');
describeCreatePsbt2Of3('Wsh2Of3CltvDrop');
describeCreatePsbt2Of3('Tr2Of3-NoKeyPath');
describeCreatePsbt('Tr1Of3-NoKeyPath-Tree', {
    descriptorSelf: (0, descriptor_2.getDescriptor)('Tr1Of3-NoKeyPath-Tree', selfKeys),
    psbtParams: {},
    stages: getDefaultStagesSeparateAB(),
});
describeCreatePsbt('Tr1Of3-NoKeyPath-Tree-PlainKeys', {
    descriptorSelf: (0, descriptor_2.getDescriptor)('Tr1Of3-NoKeyPath-Tree-Plain', selfKeys),
    psbtParams: {},
    stages: getDefaultStagesSeparateAB({ plain: true }),
});
{
    const descriptorSelf = (0, descriptor_2.getDescriptor)('Wsh2Of3', selfKeys);
    const descriptorOther = (0, descriptor_2.getDescriptor)('Wsh2Of3', otherKeys);
    describeCreatePsbt('Wsh2Of3-CustomInputSequence', {
        descriptorSelf,
        psbt: (0, descriptor_2.mockPsbt)([
            { descriptor: descriptorSelf, index: 0 },
            { descriptor: descriptorSelf, index: 1, id: { vout: 1 }, sequence: 123 },
        ], [
            {
                descriptor: descriptorOther,
                index: 0,
                value: BigInt(4e5),
                external: true,
            },
            { descriptor: descriptorSelf, index: 0, value: BigInt(4e5) },
        ]),
        stages: defaultStagesCombinedAB,
    });
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHNidC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvZGVzY3JpcHRvci9wc2J0L3BzYnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFFNUIseURBQTJDO0FBQzNDLDhDQUEwRTtBQUMxRSw0REFBb0Q7QUFFcEQsd0RBQW9IO0FBQ3BILG9EQUFpRTtBQUNqRSxpRUFRMEM7QUFDMUMsNERBQXNGO0FBRXRGLFNBQVMsU0FBUyxDQUFDLENBQVU7SUFDM0IsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMxQixPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBQ0QsSUFBSSxDQUFDLFlBQVksNEJBQVUsRUFBRSxDQUFDO1FBQzVCLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFDRCxJQUFJLENBQUMsWUFBWSxNQUFNLEVBQUUsQ0FBQztRQUN4QixPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUNELElBQUksQ0FBQyxZQUFZLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM5QixPQUFPLElBQUEsa0NBQXFCLEVBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUNELElBQUksQ0FBQyxZQUFZLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQyxPQUFPLElBQUEsZ0NBQW1CLEVBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3JCLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBQ0QsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxL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dCc7XG5cbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IEJJUDMySW50ZXJmYWNlLCBFQ1BhaXIsIEVDUGFpckludGVyZmFjZSB9IGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgeyBEZXNjcmlwdG9yIH0gZnJvbSAnQGJpdGdvL3dhc20tbWluaXNjcmlwdCc7XG5cbmltcG9ydCB7IFBzYnRQYXJhbXMsIHBhcnNlLCB0b1V0eG9Qc2J0LCB0b1dyYXBwZWRQc2J0LCBQYXJzZWREZXNjcmlwdG9yVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9zcmMvZGVzY3JpcHRvcic7XG5pbXBvcnQgeyBnZXRGaXh0dXJlLCBnZXRLZXlUcmlwbGUgfSBmcm9tICcuLi8uLi8uLi9zcmMvdGVzdHV0aWwnO1xuaW1wb3J0IHtcbiAgRGVzY3JpcHRvclRlbXBsYXRlLFxuICBnZXREZXNjcmlwdG9yLFxuICBnZXRQc2J0UGFyYW1zLFxuICBtb2NrUHNidCxcbiAgbW9ja1BzYnREZWZhdWx0LFxuICB0b1BsYWluT2JqZWN0RnJvbVBzYnQsXG4gIHRvUGxhaW5PYmplY3RGcm9tVHgsXG59IGZyb20gJy4uLy4uLy4uL3NyYy90ZXN0dXRpbC9kZXNjcmlwdG9yJztcbmltcG9ydCB7IGdldE5ld1NpZ25hdHVyZUNvdW50LCBzaWduV2l0aEtleSB9IGZyb20gJy4uLy4uLy4uL3NyYy9kZXNjcmlwdG9yL3BzYnQvc2lnbic7XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZSh2OiB1bmtub3duKTogdW5rbm93biB7XG4gIGlmICh0eXBlb2YgdiA9PT0gJ2JpZ2ludCcpIHtcbiAgICByZXR1cm4gdi50b1N0cmluZygpO1xuICB9XG4gIGlmICh2IGluc3RhbmNlb2YgRGVzY3JpcHRvcikge1xuICAgIHJldHVybiB2LnRvU3RyaW5nKCk7XG4gIH1cbiAgaWYgKHYgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICByZXR1cm4gdi50b1N0cmluZygnaGV4Jyk7XG4gIH1cbiAgaWYgKHYgaW5zdGFuY2VvZiB1dHhvbGliLlBzYnQpIHtcbiAgICByZXR1cm4gdG9QbGFpbk9iamVjdEZyb21Qc2J0KHYpO1xuICB9XG4gIGlmICh2IGluc3RhbmNlb2YgdXR4b2xpYi5UcmFuc2FjdGlvbikge1xuICAgIHJldHVybiB0b1BsYWluT2JqZWN0RnJvbVR4KHYpO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHYpKSB7XG4gICAgcmV0dXJuIHYubWFwKG5vcm1hbGl6ZSk7XG4gIH1cbiAgaWYgKHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyh2KS5mbGF0TWFwKChbaywgdl0pID0+ICh2ID09PSB1bmRlZmluZWQgPyBbXSA6IFtbaywgbm9ybWFsaXplKHYpXV0pKSk7XG4gIH1cbiAgcmV0dXJuIHY7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFzc2VydEVxdWFsc0ZpeHR1cmUodDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICBmaWxlbmFtZSA9IF9fZGlybmFtZSArICcvZml4dHVyZXMvJyArIHQgKyAnLicgKyBmaWxlbmFtZTtcbiAgY29uc3QgbnYgPSBub3JtYWxpemUodmFsdWUpO1xuICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKG52LCBhd2FpdCBnZXRGaXh0dXJlKGZpbGVuYW1lLCBudikpO1xufVxuXG5jb25zdCBzZWxmS2V5cyA9IGdldEtleVRyaXBsZSgnYScpO1xuY29uc3Qgb3RoZXJLZXlzID0gZ2V0S2V5VHJpcGxlKCdiJyk7XG5cbmZ1bmN0aW9uIHRvUGxhaW4oazogQklQMzJJbnRlcmZhY2UpOiBFQ1BhaXJJbnRlcmZhY2Uge1xuICBhc3NlcnQub2soay5wcml2YXRlS2V5KTtcbiAgcmV0dXJuIEVDUGFpci5mcm9tUHJpdmF0ZUtleShrLnByaXZhdGVLZXkpO1xufVxuXG50eXBlIFBzYnRTdGFnZSA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBrZXlzOiAoQklQMzJJbnRlcmZhY2UgfCBFQ1BhaXJJbnRlcmZhY2UpW107XG4gIGZpbmFsPzogYm9vbGVhbjtcbn07XG5cbnR5cGUgRml4dHVyZVN0YWdlID0ge1xuICBwc2J0OiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0O1xuICBuZXR3b3JrVHg/OiB1dHhvbGliLlRyYW5zYWN0aW9uPGJpZ2ludD47XG4gIG5ldHdvcmtUeEJ1ZmZlcj86IEJ1ZmZlcjtcbn07XG5cbmZ1bmN0aW9uIGdldFN0YWdlcyhcbiAgcHNidDogdXR4b2xpYi5iaXRnby5VdHhvUHNidCxcbiAgcGFyc2VkOiBQYXJzZWREZXNjcmlwdG9yVHJhbnNhY3Rpb24sXG4gIHN0YWdlczogUHNidFN0YWdlW11cbik6IFJlY29yZDxzdHJpbmcsIEZpeHR1cmVTdGFnZT4ge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIHN0YWdlcy5tYXAoKHN0YWdlKSA9PiB7XG4gICAgICBjb25zdCBwc2J0U3RhZ2VXcmFwcGVkID0gdG9XcmFwcGVkUHNidChwc2J0KTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIHN0YWdlLmtleXMpIHtcbiAgICAgICAgYXNzZXJ0KGdldE5ld1NpZ25hdHVyZUNvdW50KHNpZ25XaXRoS2V5KHBzYnRTdGFnZVdyYXBwZWQsIGtleSkpID4gMCwgJ05vIG5ldyBzaWduYXR1cmVzIHdlcmUgY3JlYXRlZCcpO1xuICAgICAgfVxuICAgICAgY29uc3QgcHNidFN0YWdlID0gdG9VdHhvUHNidChwc2J0U3RhZ2VXcmFwcGVkLCB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4pO1xuICAgICAgbGV0IHBzYnRGaW5hbDogdXR4b2xpYi5iaXRnby5VdHhvUHNidCB8IHVuZGVmaW5lZDtcbiAgICAgIGxldCBuZXR3b3JrVHg6IHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4gfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgbmV0d29ya1R4QnVmZmVyOiBCdWZmZXIgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoc3RhZ2UuZmluYWwpIHtcbiAgICAgICAgcHNidFN0YWdlV3JhcHBlZC5maW5hbGl6ZSgpO1xuICAgICAgICBwc2J0RmluYWwgPSB0b1V0eG9Qc2J0KHBzYnRTdGFnZVdyYXBwZWQsIHV0eG9saWIubmV0d29ya3MuYml0Y29pbik7XG4gICAgICAgIG5ldHdvcmtUeCA9IHBzYnRGaW5hbC5leHRyYWN0VHJhbnNhY3Rpb24oKTtcbiAgICAgICAgbmV0d29ya1R4QnVmZmVyID0gbmV0d29ya1R4LnRvQnVmZmVyKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gW1xuICAgICAgICBzdGFnZS5uYW1lLFxuICAgICAgICB7XG4gICAgICAgICAgcHNidDogcHNidFN0YWdlLFxuICAgICAgICAgIHBhcnNlZCxcbiAgICAgICAgICBwc2J0RmluYWwsXG4gICAgICAgICAgbmV0d29ya1R4LFxuICAgICAgICAgIG5ldHdvcmtUeEJ1ZmZlcixcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgfSlcbiAgKTtcbn1cblxudHlwZSBUZXN0UGFyYW1zID0ge1xuICBkZXNjcmlwdG9yU2VsZjogRGVzY3JpcHRvcjtcbiAgc3RhZ2VzOiBQc2J0U3RhZ2VbXTtcbn0gJiAoXG4gIHwge1xuICAgICAgcHNidFBhcmFtczogUGFydGlhbDxQc2J0UGFyYW1zPjtcbiAgICB9XG4gIHwge1xuICAgICAgcHNidDogdXR4b2xpYi5iaXRnby5VdHhvUHNidDtcbiAgICB9XG4pO1xuXG5mdW5jdGlvbiBkZXNjcmliZUNyZWF0ZVBzYnQobmFtZTogc3RyaW5nLCB0ZXN0UGFyYW1zOiBUZXN0UGFyYW1zKSB7XG4gIGRlc2NyaWJlKGBjcmVhdGVQc2J0ICR7bmFtZX1gLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ2NyZWF0ZXMgcHNidCB3aXRoIGV4cGVjdGVkIHByb3BlcnRpZXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwc2J0VW5zaWduZWQgPVxuICAgICAgICAncHNidCcgaW4gdGVzdFBhcmFtc1xuICAgICAgICAgID8gdGVzdFBhcmFtcy5wc2J0XG4gICAgICAgICAgOiBtb2NrUHNidERlZmF1bHQoe1xuICAgICAgICAgICAgICBkZXNjcmlwdG9yU2VsZjogdGVzdFBhcmFtcy5kZXNjcmlwdG9yU2VsZixcbiAgICAgICAgICAgICAgZGVzY3JpcHRvck90aGVyOiBnZXREZXNjcmlwdG9yKCdXc2gyT2YzJywgb3RoZXJLZXlzKSxcbiAgICAgICAgICAgICAgcGFyYW1zOiB0ZXN0UGFyYW1zLnBzYnRQYXJhbXMsXG4gICAgICAgICAgICB9KTtcbiAgICAgIGNvbnN0IGRlc2NyaXB0b3JNYXAgPSBuZXcgTWFwKFtbJ3NlbGYnLCB0ZXN0UGFyYW1zLmRlc2NyaXB0b3JTZWxmXV0pO1xuICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2UocHNidFVuc2lnbmVkLCBkZXNjcmlwdG9yTWFwLCB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHBhcnNlZC5zcGVuZEFtb3VudCwgcHNidFVuc2lnbmVkLnR4T3V0cHV0c1sxXS52YWx1ZSk7XG4gICAgICBhd2FpdCBhc3NlcnRFcXVhbHNGaXh0dXJlKG5hbWUsICdwc2J0U3RhZ2VzLmpzb24nLCBnZXRTdGFnZXMocHNidFVuc2lnbmVkLCBwYXJzZWQsIHRlc3RQYXJhbXMuc3RhZ2VzKSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5jb25zdCBkZWZhdWx0U3RhZ2VzQ29tYmluZWRBQjogUHNidFN0YWdlW10gPSBbXG4gIHsgbmFtZTogJ3Vuc2lnbmVkJywga2V5czogW10gfSxcbiAgeyBuYW1lOiAnc2lnbmVkQScsIGtleXM6IHNlbGZLZXlzLnNsaWNlKDAsIDEpIH0sXG4gIHsgbmFtZTogJ3NpZ25lZEFCJywga2V5czogc2VsZktleXMuc2xpY2UoMCwgMiksIGZpbmFsOiB0cnVlIH0sXG5dO1xuXG5mdW5jdGlvbiBnZXREZWZhdWx0U3RhZ2VzU2VwYXJhdGVBQih7IHBsYWluID0gZmFsc2UgfSA9IHt9KTogUHNidFN0YWdlW10ge1xuICBjb25zdCBrZXlzID0gcGxhaW4gPyBzZWxmS2V5cy5tYXAodG9QbGFpbikgOiBzZWxmS2V5cztcbiAgcmV0dXJuIFtcbiAgICB7IG5hbWU6ICd1bnNpZ25lZCcsIGtleXM6IFtdIH0sXG4gICAgeyBuYW1lOiAnc2lnbmVkQScsIGtleXM6IGtleXMuc2xpY2UoMCwgMSkgfSxcbiAgICB7IG5hbWU6ICdzaWduZWRCJywga2V5czoga2V5cy5zbGljZSgxLCAyKSwgZmluYWw6IHRydWUgfSxcbiAgXTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVDcmVhdGVQc2J0Mk9mMyh0OiBEZXNjcmlwdG9yVGVtcGxhdGUpIHtcbiAgZGVzY3JpYmVDcmVhdGVQc2J0KHQsIHtcbiAgICBkZXNjcmlwdG9yU2VsZjogZ2V0RGVzY3JpcHRvcih0LCBzZWxmS2V5cyksXG4gICAgcHNidFBhcmFtczogZ2V0UHNidFBhcmFtcyh0KSxcbiAgICBzdGFnZXM6IGRlZmF1bHRTdGFnZXNDb21iaW5lZEFCLFxuICB9KTtcbn1cblxuZGVzY3JpYmVDcmVhdGVQc2J0Mk9mMygnV3NoMk9mMycpO1xuZGVzY3JpYmVDcmVhdGVQc2J0Mk9mMygnV3NoMk9mM0NsdHZEcm9wJyk7XG5kZXNjcmliZUNyZWF0ZVBzYnQyT2YzKCdUcjJPZjMtTm9LZXlQYXRoJyk7XG5kZXNjcmliZUNyZWF0ZVBzYnQoJ1RyMU9mMy1Ob0tleVBhdGgtVHJlZScsIHtcbiAgZGVzY3JpcHRvclNlbGY6IGdldERlc2NyaXB0b3IoJ1RyMU9mMy1Ob0tleVBhdGgtVHJlZScsIHNlbGZLZXlzKSxcbiAgcHNidFBhcmFtczoge30sXG4gIHN0YWdlczogZ2V0RGVmYXVsdFN0YWdlc1NlcGFyYXRlQUIoKSxcbn0pO1xuZGVzY3JpYmVDcmVhdGVQc2J0KCdUcjFPZjMtTm9LZXlQYXRoLVRyZWUtUGxhaW5LZXlzJywge1xuICBkZXNjcmlwdG9yU2VsZjogZ2V0RGVzY3JpcHRvcignVHIxT2YzLU5vS2V5UGF0aC1UcmVlLVBsYWluJywgc2VsZktleXMpLFxuICBwc2J0UGFyYW1zOiB7fSxcbiAgc3RhZ2VzOiBnZXREZWZhdWx0U3RhZ2VzU2VwYXJhdGVBQih7IHBsYWluOiB0cnVlIH0pLFxufSk7XG5cbntcbiAgY29uc3QgZGVzY3JpcHRvclNlbGYgPSBnZXREZXNjcmlwdG9yKCdXc2gyT2YzJywgc2VsZktleXMpO1xuICBjb25zdCBkZXNjcmlwdG9yT3RoZXIgPSBnZXREZXNjcmlwdG9yKCdXc2gyT2YzJywgb3RoZXJLZXlzKTtcbiAgZGVzY3JpYmVDcmVhdGVQc2J0KCdXc2gyT2YzLUN1c3RvbUlucHV0U2VxdWVuY2UnLCB7XG4gICAgZGVzY3JpcHRvclNlbGYsXG4gICAgcHNidDogbW9ja1BzYnQoXG4gICAgICBbXG4gICAgICAgIHsgZGVzY3JpcHRvcjogZGVzY3JpcHRvclNlbGYsIGluZGV4OiAwIH0sXG4gICAgICAgIHsgZGVzY3JpcHRvcjogZGVzY3JpcHRvclNlbGYsIGluZGV4OiAxLCBpZDogeyB2b3V0OiAxIH0sIHNlcXVlbmNlOiAxMjMgfSxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgIHtcbiAgICAgICAgICBkZXNjcmlwdG9yOiBkZXNjcmlwdG9yT3RoZXIsXG4gICAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgICAgdmFsdWU6IEJpZ0ludCg0ZTUpLFxuICAgICAgICAgIGV4dGVybmFsOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICB7IGRlc2NyaXB0b3I6IGRlc2NyaXB0b3JTZWxmLCBpbmRleDogMCwgdmFsdWU6IEJpZ0ludCg0ZTUpIH0sXG4gICAgICBdXG4gICAgKSxcbiAgICBzdGFnZXM6IGRlZmF1bHRTdGFnZXNDb21iaW5lZEFCLFxuICB9KTtcbn1cbiJdfQ==

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


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