PHP WebShell

Текущая директория: /opt/BitGoJS/modules/sdk-lib-mpc/dist/src/tss/ecdsa-dkls

Просмотр файла: util.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 });
exports.combinePartialSignatures = combinePartialSignatures;
exports.verifyAndConvertDklsSignature = verifyAndConvertDklsSignature;
exports.executeTillRound = executeTillRound;
exports.generateDKGKeyShares = generateDKGKeyShares;
exports.generate2of2KeyShares = generate2of2KeyShares;
const secp256k1_1 = require("@noble/curves/secp256k1");
const curves_1 = require("../../curves");
const util_1 = require("../../util");
const cbor_x_1 = require("cbor-x");
const secp256k1 = __importStar(require("secp256k1"));
const crypto_1 = require("crypto");
const dkg_1 = require("./dkg");
const assert_1 = __importDefault(require("assert"));
const delimeter = ':';
/**
 * Combines partial signatures from parties participating in DSG.
 * @param round4MessagePayloads - round 4 message payloads from participating parties
 * @param rHex - hex representation of the r value in the signature
 * @returns {DeserializedMessages} - messages to send to other parties for the next round
 */
function combinePartialSignatures(round4MessagePayloads, rHex) {
    const r = (0, util_1.bigIntFromBufferBE)(Buffer.from(rHex, 'hex').subarray(1));
    const s0Arr = round4MessagePayloads.map((p) => (0, cbor_x_1.decode)(p).s_0);
    const s1Arr = round4MessagePayloads.map((p) => (0, cbor_x_1.decode)(p).s_1);
    const s0BigInts = s0Arr.map((s0) => (0, util_1.bigIntFromBufferBE)(Buffer.from(s0)));
    const s1BigInts = s1Arr.map((s1) => (0, util_1.bigIntFromBufferBE)(Buffer.from(s1)));
    const secp256k1Curve = new curves_1.Secp256k1Curve();
    const s0Sum = s0BigInts.slice(1).reduce((sumSoFar, s0) => secp256k1Curve.scalarAdd(sumSoFar, s0), s0BigInts[0]);
    const s1Sum = s1BigInts.slice(1).reduce((sumSoFar, s1) => secp256k1Curve.scalarAdd(sumSoFar, s1), s1BigInts[0]);
    const s = secp256k1Curve.scalarMult(s0Sum, secp256k1Curve.scalarInvert(s1Sum));
    const sig = new secp256k1_1.secp256k1.Signature(r, s);
    const normalizedSig = sig.normalizeS();
    return {
        R: new Uint8Array((0, util_1.bigIntToBufferBE)(normalizedSig.r, 32)),
        S: new Uint8Array((0, util_1.bigIntToBufferBE)(normalizedSig.s, 32)),
    };
}
/**
 * Verify a DKLs Signature and serialize it to recid:r:s:publickey format.
 * @param message - message that was signed.
 * @param dklsSignature - R and S values of the ECDSA signature.
 * @param commonKeychain - public key appended to chaincode in hex.
 * @param derivationPath - optional derivation path to derive on the commonkeychain before verification.
 * @param hash - optional hash function to apply on message before verifying. Default is sha256.
 * @param shouldHash - flag to determine whether message should be hashed before verifying.
 * @returns {string} - serialized signature in `recid:r:s:publickey` format
 */
function verifyAndConvertDklsSignature(message, dklsSignature, commonKeychain, derivationPath, hash, shouldHash = true) {
    let truePub = '';
    if (derivationPath && derivationPath !== 'm') {
        const hdTree = new curves_1.Secp256k1Bip32HdTree();
        const derivedPub = hdTree.publicDerive({
            pk: (0, util_1.bigIntFromBufferBE)(Buffer.from(commonKeychain.slice(0, 66), 'hex')),
            chaincode: (0, util_1.bigIntFromBufferBE)(Buffer.from(commonKeychain.slice(66), 'hex')),
        }, derivationPath);
        truePub = (0, util_1.bigIntToBufferBE)(derivedPub.pk).toString('hex');
    }
    else {
        truePub = commonKeychain.slice(0, 66);
    }
    const messageToVerify = shouldHash ? (hash || (0, crypto_1.createHash)('sha256')).update(message).digest() : message;
    const pub0 = secp256k1.ecdsaRecover(Buffer.concat([dklsSignature.R, dklsSignature.S]), 0, messageToVerify, true);
    const pub1 = secp256k1.ecdsaRecover(Buffer.concat([dklsSignature.R, dklsSignature.S]), 1, messageToVerify, true);
    let recId;
    if (truePub === Buffer.from(pub0).toString('hex')) {
        recId = 0;
    }
    else if (truePub === Buffer.from(pub1).toString('hex')) {
        recId = 1;
    }
    else {
        throw Error('Invalid Signature');
    }
    return `${recId}${delimeter}${Buffer.from(dklsSignature.R).toString('hex')}${delimeter}${Buffer.from(dklsSignature.S).toString('hex')}${delimeter}${truePub}`;
}
async function executeTillRound(round, party1Dsg, party2Dsg) {
    if (round < 1 || round > 5) {
        throw Error('Invalid round number');
    }
    const party1Round1Message = await party1Dsg.init();
    const party2Round1Message = await party2Dsg.init();
    const party2Round2Messages = party2Dsg.handleIncomingMessages({
        p2pMessages: [],
        broadcastMessages: [party1Round1Message],
    });
    const party1Round2Messages = party1Dsg.handleIncomingMessages({
        p2pMessages: [],
        broadcastMessages: [party2Round1Message],
    });
    if (round === 2)
        return [party1Round2Messages, party2Round2Messages];
    const party1Round3Messages = party1Dsg.handleIncomingMessages({
        p2pMessages: party2Round2Messages.p2pMessages,
        broadcastMessages: [],
    });
    const party2Round3Messages = party2Dsg.handleIncomingMessages({
        p2pMessages: party1Round2Messages.p2pMessages,
        broadcastMessages: [],
    });
    if (round === 3)
        return [party1Round3Messages, party2Round3Messages];
    const party2Round4Messages = party2Dsg.handleIncomingMessages({
        p2pMessages: party1Round3Messages.p2pMessages,
        broadcastMessages: [],
    });
    const party1Round4Messages = party1Dsg.handleIncomingMessages({
        p2pMessages: party2Round3Messages.p2pMessages,
        broadcastMessages: [],
    });
    if (round === 4)
        return [party1Round4Messages, party2Round4Messages];
    party1Dsg.handleIncomingMessages({
        p2pMessages: [],
        broadcastMessages: party2Round4Messages.broadcastMessages,
    });
    party2Dsg.handleIncomingMessages({
        p2pMessages: [],
        broadcastMessages: party1Round4Messages.broadcastMessages,
    });
    (0, assert_1.default)(Buffer.from(party1Dsg.signature.R).toString('hex') === Buffer.from(party2Dsg.signature.R).toString('hex'));
    (0, assert_1.default)(Buffer.from(party1Dsg.signature.S).toString('hex') === Buffer.from(party2Dsg.signature.S).toString('hex'));
    return party1Dsg.signature;
}
async function generateDKGKeyShares(retrofitDataA, retrofitDataB, retrofitDataC, seedUser, seedBackup, seedBitgo) {
    const user = new dkg_1.Dkg(3, 2, 0, seedUser, retrofitDataA);
    const backup = new dkg_1.Dkg(3, 2, 1, seedBackup, retrofitDataB);
    const bitgo = new dkg_1.Dkg(3, 2, 2, seedBitgo, retrofitDataC);
    // #region round 1
    const userRound1Message = await user.initDkg();
    const backupRound1Message = await backup.initDkg();
    const bitgoRound1Message = await bitgo.initDkg();
    const bitgoRound2Messages = bitgo.handleIncomingMessages({
        p2pMessages: [],
        broadcastMessages: [userRound1Message, backupRound1Message],
    });
    // #endregion
    // #region round 2
    const userRound2Messages = user.handleIncomingMessages({
        p2pMessages: [],
        broadcastMessages: [bitgoRound1Message, backupRound1Message],
    });
    const backupRound2Messages = backup.handleIncomingMessages({
        p2pMessages: [],
        broadcastMessages: [userRound1Message, bitgoRound1Message],
    });
    const bitgoRound3Messages = bitgo.handleIncomingMessages({
        p2pMessages: backupRound2Messages.p2pMessages
            .filter((m) => m.to === 2)
            .concat(userRound2Messages.p2pMessages.filter((m) => m.to === 2)),
        broadcastMessages: [],
    });
    // #endregion
    // #region round 3
    const userRound3Messages = user.handleIncomingMessages({
        p2pMessages: backupRound2Messages.p2pMessages
            .filter((m) => m.to === 0)
            .concat(bitgoRound2Messages.p2pMessages.filter((m) => m.to === 0)),
        broadcastMessages: [],
    });
    const backupRound3Messages = backup.handleIncomingMessages({
        p2pMessages: bitgoRound2Messages.p2pMessages
            .filter((m) => m.to === 1)
            .concat(userRound2Messages.p2pMessages.filter((m) => m.to === 1)),
        broadcastMessages: [],
    });
    const userRound4Messages = user.handleIncomingMessages({
        p2pMessages: backupRound3Messages.p2pMessages
            .filter((m) => m.to === 0)
            .concat(bitgoRound3Messages.p2pMessages.filter((m) => m.to === 0)),
        broadcastMessages: [],
    });
    const backupRound4Messages = backup.handleIncomingMessages({
        p2pMessages: bitgoRound3Messages.p2pMessages
            .filter((m) => m.to === 1)
            .concat(userRound3Messages.p2pMessages.filter((m) => m.to === 1)),
        broadcastMessages: [],
    });
    const bitgoRound4Messages = bitgo.handleIncomingMessages({
        p2pMessages: backupRound3Messages.p2pMessages
            .filter((m) => m.to === 2)
            .concat(userRound3Messages.p2pMessages.filter((m) => m.to === 2)),
        broadcastMessages: [],
    });
    // #endregion
    user.handleIncomingMessages({
        p2pMessages: [],
        broadcastMessages: bitgoRound4Messages.broadcastMessages.concat(backupRound4Messages.broadcastMessages),
    });
    bitgo.handleIncomingMessages({
        p2pMessages: [],
        broadcastMessages: backupRound4Messages.broadcastMessages.concat(userRound4Messages.broadcastMessages),
    });
    backup.handleIncomingMessages({
        p2pMessages: [],
        broadcastMessages: bitgoRound4Messages.broadcastMessages.concat(userRound4Messages.broadcastMessages),
    });
    return [user, backup, bitgo];
}
async function generate2of2KeyShares(retrofitDataA, retrofitDataB) {
    const partyA = new dkg_1.Dkg(2, 2, 0, undefined, retrofitDataA);
    const partyB = new dkg_1.Dkg(2, 2, 1, undefined, retrofitDataB);
    const partyARound1Message = await partyA.initDkg();
    const partyBRound1Message = await partyB.initDkg();
    const partyARound2Messages = partyA.handleIncomingMessages({
        p2pMessages: [],
        broadcastMessages: [partyBRound1Message],
    });
    const partyBRound2Messages = partyB.handleIncomingMessages({
        p2pMessages: [],
        broadcastMessages: [partyARound1Message],
    });
    const partyARound3Messages = partyA.handleIncomingMessages({
        p2pMessages: partyBRound2Messages.p2pMessages.filter((m) => m.to === 0),
        broadcastMessages: [],
    });
    const partyBRound3Messages = partyB.handleIncomingMessages({
        p2pMessages: partyARound2Messages.p2pMessages.filter((m) => m.to === 1),
        broadcastMessages: [],
    });
    const partyARound4Messages = partyA.handleIncomingMessages({
        p2pMessages: partyBRound3Messages.p2pMessages.filter((m) => m.to === 0),
        broadcastMessages: [],
    });
    const partyBRound4Messages = partyB.handleIncomingMessages({
        p2pMessages: partyARound3Messages.p2pMessages.filter((m) => m.to === 1),
        broadcastMessages: [],
    });
    partyA.handleIncomingMessages({
        p2pMessages: [],
        broadcastMessages: partyBRound4Messages.broadcastMessages,
    });
    partyB.handleIncomingMessages({
        p2pMessages: [],
        broadcastMessages: partyARound4Messages.broadcastMessages,
    });
    return [partyA, partyB];
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90c3MvZWNkc2EtZGtscy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbUJBLDREQWdCQztBQVlELHNFQW9DQztBQUVELDRDQW9EQztBQUVELG9EQW9GQztBQUVELHNEQXlDQztBQTFRRCx1REFBNEQ7QUFDNUQseUNBQTRFO0FBQzVFLHFDQUFrRTtBQUVsRSxtQ0FBZ0M7QUFDaEMscURBQXVDO0FBQ3ZDLG1DQUEwQztBQUUxQywrQkFBNEI7QUFDNUIsb0RBQTRCO0FBRTVCLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQztBQUV0Qjs7Ozs7R0FLRztBQUNILFNBQWdCLHdCQUF3QixDQUFDLHFCQUFtQyxFQUFFLElBQVk7SUFDeEYsTUFBTSxDQUFDLEdBQUcsSUFBQSx5QkFBa0IsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuRSxNQUFNLEtBQUssR0FBRyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUEsZUFBTSxFQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlELE1BQU0sS0FBSyxHQUFHLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBQSxlQUFNLEVBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUQsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBQSx5QkFBa0IsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6RSxNQUFNLFNBQVMsR0FBRyxL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Q0FBQyxDQUFDO0lBQ0gsTUFBTSxDQUFDLHNCQUFzQixDQUFDO1FBQzVCLFdBQVcsRUFBRSxFQUFFO1FBQ2YsaUJBQWlCLEVBQUUsb0JBQW9CLENBQUMsaUJBQWlCO0tBQzFELENBQUMsQ0FBQztJQUNILE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDMUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNlY3AyNTZrMSBhcyBzZWNwIH0gZnJvbSAnQG5vYmxlL2N1cnZlcy9zZWNwMjU2azEnO1xuaW1wb3J0IHsgSERUcmVlLCBTZWNwMjU2azFCaXAzMkhkVHJlZSwgU2VjcDI1NmsxQ3VydmUgfSBmcm9tICcuLi8uLi9jdXJ2ZXMnO1xuaW1wb3J0IHsgYmlnSW50RnJvbUJ1ZmZlckJFLCBiaWdJbnRUb0J1ZmZlckJFIH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBEZXNlcmlhbGl6ZWREa2xzU2lnbmF0dXJlLCBEZXNlcmlhbGl6ZWRNZXNzYWdlcywgUmV0cm9maXREYXRhIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBkZWNvZGUgfSBmcm9tICdjYm9yLXgnO1xuaW1wb3J0ICogYXMgc2VjcDI1NmsxIGZyb20gJ3NlY3AyNTZrMSc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoLCBIYXNoIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IERzZyB9IGZyb20gJy4vZHNnJztcbmltcG9ydCB7IERrZyB9IGZyb20gJy4vZGtnJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuY29uc3QgZGVsaW1ldGVyID0gJzonO1xuXG4vKipcbiAqIENvbWJpbmVzIHBhcnRpYWwgc2lnbmF0dXJlcyBmcm9tIHBhcnRpZXMgcGFydGljaXBhdGluZyBpbiBEU0cuXG4gKiBAcGFyYW0gcm91bmQ0TWVzc2FnZVBheWxvYWRzIC0gcm91bmQgNCBtZXNzYWdlIHBheWxvYWRzIGZyb20gcGFydGljaXBhdGluZyBwYXJ0aWVzXG4gKiBAcGFyYW0gckhleCAtIGhleCByZXByZXNlbnRhdGlvbiBvZiB0aGUgciB2YWx1ZSBpbiB0aGUgc2lnbmF0dXJlXG4gKiBAcmV0dXJucyB7RGVzZXJpYWxpemVkTWVzc2FnZXN9IC0gbWVzc2FnZXMgdG8gc2VuZCB0byBvdGhlciBwYXJ0aWVzIGZvciB0aGUgbmV4dCByb3VuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tYmluZVBhcnRpYWxTaWduYXR1cmVzKHJvdW5kNE1lc3NhZ2VQYXlsb2FkczogVWludDhBcnJheVtdLCBySGV4OiBzdHJpbmcpOiBEZXNlcmlhbGl6ZWREa2xzU2lnbmF0dXJlIHtcbiAgY29uc3QgciA9IGJpZ0ludEZyb21CdWZmZXJCRShCdWZmZXIuZnJvbShySGV4LCAnaGV4Jykuc3ViYXJyYXkoMSkpO1xuICBjb25zdCBzMEFyciA9IHJvdW5kNE1lc3NhZ2VQYXlsb2Fkcy5tYXAoKHApID0+IGRlY29kZShwKS5zXzApO1xuICBjb25zdCBzMUFyciA9IHJvdW5kNE1lc3NhZ2VQYXlsb2Fkcy5tYXAoKHApID0+IGRlY29kZShwKS5zXzEpO1xuICBjb25zdCBzMEJpZ0ludHMgPSBzMEFyci5tYXAoKHMwKSA9PiBiaWdJbnRGcm9tQnVmZmVyQkUoQnVmZmVyLmZyb20oczApKSk7XG4gIGNvbnN0IHMxQmlnSW50cyA9IHMxQXJyLm1hcCgoczEpID0+IGJpZ0ludEZyb21CdWZmZXJCRShCdWZmZXIuZnJvbShzMSkpKTtcbiAgY29uc3Qgc2VjcDI1NmsxQ3VydmUgPSBuZXcgU2VjcDI1NmsxQ3VydmUoKTtcbiAgY29uc3QgczBTdW0gPSBzMEJpZ0ludHMuc2xpY2UoMSkucmVkdWNlKChzdW1Tb0ZhciwgczApID0+IHNlY3AyNTZrMUN1cnZlLnNjYWxhckFkZChzdW1Tb0ZhciwgczApLCBzMEJpZ0ludHNbMF0pO1xuICBjb25zdCBzMVN1bSA9IHMxQmlnSW50cy5zbGljZSgxKS5yZWR1Y2UoKHN1bVNvRmFyLCBzMSkgPT4gc2VjcDI1NmsxQ3VydmUuc2NhbGFyQWRkKHN1bVNvRmFyLCBzMSksIHMxQmlnSW50c1swXSk7XG4gIGNvbnN0IHMgPSBzZWNwMjU2azFDdXJ2ZS5zY2FsYXJNdWx0KHMwU3VtLCBzZWNwMjU2azFDdXJ2ZS5zY2FsYXJJbnZlcnQoczFTdW0pKTtcbiAgY29uc3Qgc2lnID0gbmV3IHNlY3AuU2lnbmF0dXJlKHIsIHMpO1xuICBjb25zdCBub3JtYWxpemVkU2lnID0gc2lnLm5vcm1hbGl6ZVMoKTtcbiAgcmV0dXJuIHtcbiAgICBSOiBuZXcgVWludDhBcnJheShiaWdJbnRUb0J1ZmZlckJFKG5vcm1hbGl6ZWRTaWcuciwgMzIpKSxcbiAgICBTOiBuZXcgVWludDhBcnJheShiaWdJbnRUb0J1ZmZlckJFKG5vcm1hbGl6ZWRTaWcucywgMzIpKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBWZXJpZnkgYSBES0xzIFNpZ25hdHVyZSBhbmQgc2VyaWFsaXplIGl0IHRvIHJlY2lkOnI6czpwdWJsaWNrZXkgZm9ybWF0LlxuICogQHBhcmFtIG1lc3NhZ2UgLSBtZXNzYWdlIHRoYXQgd2FzIHNpZ25lZC5cbiAqIEBwYXJhbSBka2xzU2lnbmF0dXJlIC0gUiBhbmQgUyB2YWx1ZXMgb2YgdGhlIEVDRFNBIHNpZ25hdHVyZS5cbiAqIEBwYXJhbSBjb21tb25LZXljaGFpbiAtIHB1YmxpYyBrZXkgYXBwZW5kZWQgdG8gY2hhaW5jb2RlIGluIGhleC5cbiAqIEBwYXJhbSBkZXJpdmF0aW9uUGF0aCAtIG9wdGlvbmFsIGRlcml2YXRpb24gcGF0aCB0byBkZXJpdmUgb24gdGhlIGNvbW1vbmtleWNoYWluIGJlZm9yZSB2ZXJpZmljYXRpb24uXG4gKiBAcGFyYW0gaGFzaCAtIG9wdGlvbmFsIGhhc2ggZnVuY3Rpb24gdG8gYXBwbHkgb24gbWVzc2FnZSBiZWZvcmUgdmVyaWZ5aW5nLiBEZWZhdWx0IGlzIHNoYTI1Ni5cbiAqIEBwYXJhbSBzaG91bGRIYXNoIC0gZmxhZyB0byBkZXRlcm1pbmUgd2hldGhlciBtZXNzYWdlIHNob3VsZCBiZSBoYXNoZWQgYmVmb3JlIHZlcmlmeWluZy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gc2VyaWFsaXplZCBzaWduYXR1cmUgaW4gYHJlY2lkOnI6czpwdWJsaWNrZXlgIGZvcm1hdFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmVyaWZ5QW5kQ29udmVydERrbHNTaWduYXR1cmUoXG4gIG1lc3NhZ2U6IEJ1ZmZlcixcbiAgZGtsc1NpZ25hdHVyZTogRGVzZXJpYWxpemVkRGtsc1NpZ25hdHVyZSxcbiAgY29tbW9uS2V5Y2hhaW46IHN0cmluZyxcbiAgZGVyaXZhdGlvblBhdGg/OiBzdHJpbmcsXG4gIGhhc2g/OiBIYXNoLFxuICBzaG91bGRIYXNoID0gdHJ1ZVxuKTogc3RyaW5nIHtcbiAgbGV0IHRydWVQdWIgPSAnJztcbiAgaWYgKGRlcml2YXRpb25QYXRoICYmIGRlcml2YXRpb25QYXRoICE9PSAnbScpIHtcbiAgICBjb25zdCBoZFRyZWU6IEhEVHJlZSA9IG5ldyBTZWNwMjU2azFCaXAzMkhkVHJlZSgpO1xuICAgIGNvbnN0IGRlcml2ZWRQdWIgPSBoZFRyZWUucHVibGljRGVyaXZlKFxuICAgICAge1xuICAgICAgICBwazogYmlnSW50RnJvbUJ1ZmZlckJFKEJ1ZmZlci5mcm9tKGNvbW1vbktleWNoYWluLnNsaWNlKDAsIDY2KSwgJ2hleCcpKSxcbiAgICAgICAgY2hhaW5jb2RlOiBiaWdJbnRGcm9tQnVmZmVyQkUoQnVmZmVyLmZyb20oY29tbW9uS2V5Y2hhaW4uc2xpY2UoNjYpLCAnaGV4JykpLFxuICAgICAgfSxcbiAgICAgIGRlcml2YXRpb25QYXRoXG4gICAgKTtcbiAgICB0cnVlUHViID0gYmlnSW50VG9CdWZmZXJCRShkZXJpdmVkUHViLnBrKS50b1N0cmluZygnaGV4Jyk7XG4gIH0gZWxzZSB7XG4gICAgdHJ1ZVB1YiA9IGNvbW1vbktleWNoYWluLnNsaWNlKDAsIDY2KTtcbiAgfVxuICBjb25zdCBtZXNzYWdlVG9WZXJpZnkgPSBzaG91bGRIYXNoID8gKGhhc2ggfHwgY3JlYXRlSGFzaCgnc2hhMjU2JykpLnVwZGF0ZShtZXNzYWdlKS5kaWdlc3QoKSA6IG1lc3NhZ2U7XG4gIGNvbnN0IHB1YjAgPSBzZWNwMjU2azEuZWNkc2FSZWNvdmVyKEJ1ZmZlci5jb25jYXQoW2RrbHNTaWduYXR1cmUuUiwgZGtsc1NpZ25hdHVyZS5TXSksIDAsIG1lc3NhZ2VUb1ZlcmlmeSwgdHJ1ZSk7XG4gIGNvbnN0IHB1YjEgPSBzZWNwMjU2azEuZWNkc2FSZWNvdmVyKEJ1ZmZlci5jb25jYXQoW2RrbHNTaWduYXR1cmUuUiwgZGtsc1NpZ25hdHVyZS5TXSksIDEsIG1lc3NhZ2VUb1ZlcmlmeSwgdHJ1ZSk7XG4gIGxldCByZWNJZDogbnVtYmVyO1xuICBpZiAodHJ1ZVB1YiA9PT0gQnVmZmVyLmZyb20ocHViMCkudG9TdHJpbmcoJ2hleCcpKSB7XG4gICAgcmVjSWQgPSAwO1xuICB9IGVsc2UgaWYgKHRydWVQdWIgPT09IEJ1ZmZlci5mcm9tKHB1YjEpLnRvU3RyaW5nKCdoZXgnKSkge1xuICAgIHJlY0lkID0gMTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBFcnJvcignSW52YWxpZCBTaWduYXR1cmUnKTtcbiAgfVxuICByZXR1cm4gYCR7cmVjSWR9JHtkZWxpbWV0ZXJ9JHtCdWZmZXIuZnJvbShka2xzU2lnbmF0dXJlLlIpLnRvU3RyaW5nKCdoZXgnKX0ke2RlbGltZXRlcn0ke0J1ZmZlci5mcm9tKFxuICAgIGRrbHNTaWduYXR1cmUuU1xuICApLnRvU3RyaW5nKCdoZXgnKX0ke2RlbGltZXRlcn0ke3RydWVQdWJ9YDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVUaWxsUm91bmQoXG4gIHJvdW5kOiBudW1iZXIsXG4gIHBhcnR5MURzZzogRHNnLFxuICBwYXJ0eTJEc2c6IERzZ1xuKTogUHJvbWlzZTxEZXNlcmlhbGl6ZWRNZXNzYWdlc1tdIHwgRGVzZXJpYWxpemVkRGtsc1NpZ25hdHVyZT4ge1xuICBpZiAocm91bmQgPCAxIHx8IHJvdW5kID4gNSkge1xuICAgIHRocm93IEVycm9yKCdJbnZhbGlkIHJvdW5kIG51bWJlcicpO1xuICB9XG4gIGNvbnN0IHBhcnR5MVJvdW5kMU1lc3NhZ2UgPSBhd2FpdCBwYXJ0eTFEc2cuaW5pdCgpO1xuICBjb25zdCBwYXJ0eTJSb3VuZDFNZXNzYWdlID0gYXdhaXQgcGFydHkyRHNnLmluaXQoKTtcblxuICBjb25zdCBwYXJ0eTJSb3VuZDJNZXNzYWdlcyA9IHBhcnR5MkRzZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogW10sXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtwYXJ0eTFSb3VuZDFNZXNzYWdlXSxcbiAgfSk7XG4gIGNvbnN0IHBhcnR5MVJvdW5kMk1lc3NhZ2VzID0gcGFydHkxRHNnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogW3BhcnR5MlJvdW5kMU1lc3NhZ2VdLFxuICB9KTtcbiAgaWYgKHJvdW5kID09PSAyKSByZXR1cm4gW3BhcnR5MVJvdW5kMk1lc3NhZ2VzLCBwYXJ0eTJSb3VuZDJNZXNzYWdlc107XG5cbiAgY29uc3QgcGFydHkxUm91bmQzTWVzc2FnZXMgPSBwYXJ0eTFEc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IHBhcnR5MlJvdW5kMk1lc3NhZ2VzLnAycE1lc3NhZ2VzLFxuICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgfSk7XG4gIGNvbnN0IHBhcnR5MlJvdW5kM01lc3NhZ2VzID0gcGFydHkyRHNnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgIHAycE1lc3NhZ2VzOiBwYXJ0eTFSb3VuZDJNZXNzYWdlcy5wMnBNZXNzYWdlcyxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gIH0pO1xuICBpZiAocm91bmQgPT09IDMpIHJldHVybiBbcGFydHkxUm91bmQzTWVzc2FnZXMsIHBhcnR5MlJvdW5kM01lc3NhZ2VzXTtcblxuICBjb25zdCBwYXJ0eTJSb3VuZDRNZXNzYWdlcyA9IHBhcnR5MkRzZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogcGFydHkxUm91bmQzTWVzc2FnZXMucDJwTWVzc2FnZXMsXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICB9KTtcbiAgY29uc3QgcGFydHkxUm91bmQ0TWVzc2FnZXMgPSBwYXJ0eTFEc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IHBhcnR5MlJvdW5kM01lc3NhZ2VzLnAycE1lc3NhZ2VzLFxuICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgfSk7XG4gIGlmIChyb3VuZCA9PT0gNCkgcmV0dXJuIFtwYXJ0eTFSb3VuZDRNZXNzYWdlcywgcGFydHkyUm91bmQ0TWVzc2FnZXNdO1xuXG4gIHBhcnR5MURzZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogW10sXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IHBhcnR5MlJvdW5kNE1lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzLFxuICB9KTtcbiAgcGFydHkyRHNnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogcGFydHkxUm91bmQ0TWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMsXG4gIH0pO1xuICBhc3NlcnQoQnVmZmVyLmZyb20ocGFydHkxRHNnLnNpZ25hdHVyZS5SKS50b1N0cmluZygnaGV4JykgPT09IEJ1ZmZlci5mcm9tKHBhcnR5MkRzZy5zaWduYXR1cmUuUikudG9TdHJpbmcoJ2hleCcpKTtcbiAgYXNzZXJ0KEJ1ZmZlci5mcm9tKHBhcnR5MURzZy5zaWduYXR1cmUuUykudG9TdHJpbmcoJ2hleCcpID09PSBCdWZmZXIuZnJvbShwYXJ0eTJEc2cuc2lnbmF0dXJlLlMpLnRvU3RyaW5nKCdoZXgnKSk7XG4gIHJldHVybiBwYXJ0eTFEc2cuc2lnbmF0dXJlO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVES0dLZXlTaGFyZXMoXG4gIHJldHJvZml0RGF0YUE/OiBSZXRyb2ZpdERhdGEsXG4gIHJldHJvZml0RGF0YUI/OiBSZXRyb2ZpdERhdGEsXG4gIHJldHJvZml0RGF0YUM/OiBSZXRyb2ZpdERhdGEsXG4gIHNlZWRVc2VyPzogQnVmZmVyLFxuICBzZWVkQmFja3VwPzogQnVmZmVyLFxuICBzZWVkQml0Z28/OiBCdWZmZXJcbik6IFByb21pc2U8W0RrZywgRGtnLCBEa2ddPiB7XG4gIGNvbnN0IHVzZXIgPSBuZXcgRGtnKDMsIDIsIDAsIHNlZWRVc2VyLCByZXRyb2ZpdERhdGFBKTtcbiAgY29uc3QgYmFja3VwID0gbmV3IERrZygzLCAyLCAxLCBzZWVkQmFja3VwLCByZXRyb2ZpdERhdGFCKTtcbiAgY29uc3QgYml0Z28gPSBuZXcgRGtnKDMsIDIsIDIsIHNlZWRCaXRnbywgcmV0cm9maXREYXRhQyk7XG4gIC8vICNyZWdpb24gcm91bmQgMVxuICBjb25zdCB1c2VyUm91bmQxTWVzc2FnZSA9IGF3YWl0IHVzZXIuaW5pdERrZygpO1xuICBjb25zdCBiYWNrdXBSb3VuZDFNZXNzYWdlID0gYXdhaXQgYmFja3VwLmluaXREa2coKTtcbiAgY29uc3QgYml0Z29Sb3VuZDFNZXNzYWdlID0gYXdhaXQgYml0Z28uaW5pdERrZygpO1xuICBjb25zdCBiaXRnb1JvdW5kMk1lc3NhZ2VzID0gYml0Z28uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbdXNlclJvdW5kMU1lc3NhZ2UsIGJhY2t1cFJvdW5kMU1lc3NhZ2VdLFxuICB9KTtcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gcm91bmQgMlxuICBjb25zdCB1c2VyUm91bmQyTWVzc2FnZXMgPSB1c2VyLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogW2JpdGdvUm91bmQxTWVzc2FnZSwgYmFja3VwUm91bmQxTWVzc2FnZV0sXG4gIH0pO1xuICBjb25zdCBiYWNrdXBSb3VuZDJNZXNzYWdlcyA9IGJhY2t1cC5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogW10sXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFt1c2VyUm91bmQxTWVzc2FnZSwgYml0Z29Sb3VuZDFNZXNzYWdlXSxcbiAgfSk7XG4gIGNvbnN0IGJpdGdvUm91bmQzTWVzc2FnZXMgPSBiaXRnby5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogYmFja3VwUm91bmQyTWVzc2FnZXMucDJwTWVzc2FnZXNcbiAgICAgIC5maWx0ZXIoKG0pID0+IG0udG8gPT09IDIpXG4gICAgICAuY29uY2F0KHVzZXJSb3VuZDJNZXNzYWdlcy5wMnBNZXNzYWdlcy5maWx0ZXIoKG0pID0+IG0udG8gPT09IDIpKSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gIH0pO1xuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiByb3VuZCAzXG4gIGNvbnN0IHVzZXJSb3VuZDNNZXNzYWdlcyA9IHVzZXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IGJhY2t1cFJvdW5kMk1lc3NhZ2VzLnAycE1lc3NhZ2VzXG4gICAgICAuZmlsdGVyKChtKSA9PiBtLnRvID09PSAwKVxuICAgICAgLmNvbmNhdChiaXRnb1JvdW5kMk1lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbHRlcigobSkgPT4gbS50byA9PT0gMCkpLFxuICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgfSk7XG4gIGNvbnN0IGJhY2t1cFJvdW5kM01lc3NhZ2VzID0gYmFja3VwLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgIHAycE1lc3NhZ2VzOiBiaXRnb1JvdW5kMk1lc3NhZ2VzLnAycE1lc3NhZ2VzXG4gICAgICAuZmlsdGVyKChtKSA9PiBtLnRvID09PSAxKVxuICAgICAgLmNvbmNhdCh1c2VyUm91bmQyTWVzc2FnZXMucDJwTWVzc2FnZXMuZmlsdGVyKChtKSA9PiBtLnRvID09PSAxKSksXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICB9KTtcbiAgY29uc3QgdXNlclJvdW5kNE1lc3NhZ2VzID0gdXNlci5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogYmFja3VwUm91bmQzTWVzc2FnZXMucDJwTWVzc2FnZXNcbiAgICAgIC5maWx0ZXIoKG0pID0+IG0udG8gPT09IDApXG4gICAgICAuY29uY2F0KGJpdGdvUm91bmQzTWVzc2FnZXMucDJwTWVzc2FnZXMuZmlsdGVyKChtKSA9PiBtLnRvID09PSAwKSksXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICB9KTtcbiAgY29uc3QgYmFja3VwUm91bmQ0TWVzc2FnZXMgPSBiYWNrdXAuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IGJpdGdvUm91bmQzTWVzc2FnZXMucDJwTWVzc2FnZXNcbiAgICAgIC5maWx0ZXIoKG0pID0+IG0udG8gPT09IDEpXG4gICAgICAuY29uY2F0KHVzZXJSb3VuZDNNZXNzYWdlcy5wMnBNZXNzYWdlcy5maWx0ZXIoKG0pID0+IG0udG8gPT09IDEpKSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gIH0pO1xuICBjb25zdCBiaXRnb1JvdW5kNE1lc3NhZ2VzID0gYml0Z28uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IGJhY2t1cFJvdW5kM01lc3NhZ2VzLnAycE1lc3NhZ2VzXG4gICAgICAuZmlsdGVyKChtKSA9PiBtLnRvID09PSAyKVxuICAgICAgLmNvbmNhdCh1c2VyUm91bmQzTWVzc2FnZXMucDJwTWVzc2FnZXMuZmlsdGVyKChtKSA9PiBtLnRvID09PSAyKSksXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICB9KTtcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIHVzZXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBiaXRnb1JvdW5kNE1lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzLmNvbmNhdChiYWNrdXBSb3VuZDRNZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlcyksXG4gIH0pO1xuICBiaXRnby5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogW10sXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IGJhY2t1cFJvdW5kNE1lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzLmNvbmNhdCh1c2VyUm91bmQ0TWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMpLFxuICB9KTtcbiAgYmFja3VwLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogYml0Z29Sb3VuZDRNZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlcy5jb25jYXQodXNlclJvdW5kNE1lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzKSxcbiAgfSk7XG4gIHJldHVybiBbdXNlciwgYmFja3VwLCBiaXRnb107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZTJvZjJLZXlTaGFyZXMoXG4gIHJldHJvZml0RGF0YUE/OiBSZXRyb2ZpdERhdGEsXG4gIHJldHJvZml0RGF0YUI/OiBSZXRyb2ZpdERhdGFcbik6IFByb21pc2U8W0RrZywgRGtnXT4ge1xuICBjb25zdCBwYXJ0eUEgPSBuZXcgRGtnKDIsIDIsIDAsIHVuZGVmaW5lZCwgcmV0cm9maXREYXRhQSk7XG4gIGNvbnN0IHBhcnR5QiA9IG5ldyBEa2coMiwgMiwgMSwgdW5kZWZpbmVkLCByZXRyb2ZpdERhdGFCKTtcbiAgY29uc3QgcGFydHlBUm91bmQxTWVzc2FnZSA9IGF3YWl0IHBhcnR5QS5pbml0RGtnKCk7XG4gIGNvbnN0IHBhcnR5QlJvdW5kMU1lc3NhZ2UgPSBhd2FpdCBwYXJ0eUIuaW5pdERrZygpO1xuICBjb25zdCBwYXJ0eUFSb3VuZDJNZXNzYWdlcyA9IHBhcnR5QS5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogW10sXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtwYXJ0eUJSb3VuZDFNZXNzYWdlXSxcbiAgfSk7XG4gIGNvbnN0IHBhcnR5QlJvdW5kMk1lc3NhZ2VzID0gcGFydHlCLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogW3BhcnR5QVJvdW5kMU1lc3NhZ2VdLFxuICB9KTtcbiAgY29uc3QgcGFydHlBUm91bmQzTWVzc2FnZXMgPSBwYXJ0eUEuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IHBhcnR5QlJvdW5kMk1lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbHRlcigobSkgPT4gbS50byA9PT0gMCksXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICB9KTtcbiAgY29uc3QgcGFydHlCUm91bmQzTWVzc2FnZXMgPSBwYXJ0eUIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IHBhcnR5QVJvdW5kMk1lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbHRlcigobSkgPT4gbS50byA9PT0gMSksXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICB9KTtcbiAgY29uc3QgcGFydHlBUm91bmQ0TWVzc2FnZXMgPSBwYXJ0eUEuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IHBhcnR5QlJvdW5kM01lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbHRlcigobSkgPT4gbS50byA9PT0gMCksXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICB9KTtcbiAgY29uc3QgcGFydHlCUm91bmQ0TWVzc2FnZXMgPSBwYXJ0eUIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IHBhcnR5QVJvdW5kM01lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbHRlcigobSkgPT4gbS50byA9PT0gMSksXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICB9KTtcbiAgcGFydHlBLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogcGFydHlCUm91bmQ0TWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMsXG4gIH0pO1xuICBwYXJ0eUIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBwYXJ0eUFSb3VuZDRNZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlcyxcbiAgfSk7XG4gIHJldHVybiBbcGFydHlBLCBwYXJ0eUJdO1xufVxuIl19

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


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