PHP WebShell

Текущая директория: /opt/BitGoJS/modules/utxo-staking/dist/src/babylon

Просмотр файла: stakingParams.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.testnetFinalityProvider0 = exports.testnetStakingParams = exports.mainnetStakingParams = exports.getBabylonParamByBtcHeight = exports.getBabylonParamByVersion = void 0;
exports.toVersionedParams = toVersionedParams;
exports.getStakingParams = getStakingParams;
exports.getDescriptorBuilderForParams = getDescriptorBuilderForParams;
exports.getDescriptorProviderForStakingParams = getDescriptorProviderForStakingParams;
exports.getTestnetDescriptorBuilder = getTestnetDescriptorBuilder;
const t = __importStar(require("io-ts"));
const tt = __importStar(require("io-ts-types"));
const Either_1 = require("fp-ts/Either");
const PathReporter_1 = require("io-ts/lib/PathReporter");
const babylonlabs_io_btc_staking_ts_1 = require("@bitgo/babylonlabs-io-btc-staking-ts");
var babylonlabs_io_btc_staking_ts_2 = require("@bitgo/babylonlabs-io-btc-staking-ts");
Object.defineProperty(exports, "getBabylonParamByVersion", { enumerable: true, get: function () { return babylonlabs_io_btc_staking_ts_2.getBabylonParamByVersion; } });
Object.defineProperty(exports, "getBabylonParamByBtcHeight", { enumerable: true, get: function () { return babylonlabs_io_btc_staking_ts_2.getBabylonParamByBtcHeight; } });
const descriptor_1 = require("./descriptor");
const params_mainnet_json_1 = __importDefault(require("./params.mainnet.json"));
const params_testnet_json_1 = __importDefault(require("./params.testnet.json"));
const network_1 = require("./network");
const BabylonParamsJSON = t.type({
    covenant_pks: t.array(t.string),
    covenant_quorum: t.number,
    min_staking_value_sat: tt.NumberFromString,
    max_staking_value_sat: tt.NumberFromString,
    min_staking_time_blocks: t.number,
    max_staking_time_blocks: t.number,
    slashing_pk_script: t.string,
    min_slashing_tx_fee_sat: tt.NumberFromString,
    slashing_rate: t.string,
    unbonding_time_blocks: t.number,
    unbonding_fee_sat: tt.NumberFromString,
    min_commission_rate: tt.NumberFromString,
    delegation_creation_base_gas_fee: tt.NumberFromString,
    allow_list_expiration_height: tt.NumberFromString,
    btc_activation_height: t.number,
});
function toVersionedParams(ps) {
    return ps.map((p, version) => ({
        version,
        btcActivationHeight: p.btc_activation_height,
        covenantNoCoordPks: p.covenant_pks,
        covenantQuorum: p.covenant_quorum,
        unbondingTime: p.unbonding_time_blocks,
        unbondingFeeSat: p.unbonding_fee_sat,
        maxStakingAmountSat: p.max_staking_value_sat,
        minStakingAmountSat: p.min_staking_value_sat,
        maxStakingTimeBlocks: p.max_staking_time_blocks,
        minStakingTimeBlocks: p.min_staking_time_blocks,
        slashing: {
            slashingPkScriptHex: Buffer.from(p.slashing_pk_script, 'base64').toString('hex'),
            slashingRate: parseFloat(p.slashing_rate),
            minSlashingTxFeeSat: p.min_slashing_tx_fee_sat,
        },
    }));
}
function toVersionedParamsFromJson(jsonParams) {
    return toVersionedParams(jsonParams.map((p) => {
        const result = t.type({ params: BabylonParamsJSON }).decode(p);
        if ((0, Either_1.isLeft)(result)) {
            const msg = PathReporter_1.PathReporter.report(result).join('\n');
            throw new Error(`Invalid testnet params: ${msg}`);
        }
        return result.right.params;
    }));
}
exports.mainnetStakingParams = Object.freeze(toVersionedParamsFromJson(params_mainnet_json_1.default));
exports.testnetStakingParams = Object.freeze(toVersionedParamsFromJson(params_testnet_json_1.default));
function getStakingParams(network) {
    switch ((0, network_1.toBabylonNetwork)(network)) {
        case 'mainnet':
            return [...exports.mainnetStakingParams];
        case 'testnet':
            return [...exports.testnetStakingParams];
        default:
            throw new Error('Unsupported network');
    }
}
// Source: https://btcstaking.testnet.babylonlabs.io/ "Babylon Foundation 0"
exports.testnetFinalityProvider0 = Buffer.from('d23c2c25e1fcf8fd1c21b9a402c19e2e309e531e45e92fb1e9805b6056b0cc76', 'hex');
function getDescriptorBuilderForParams(userKey, finalityProviderKeys, stakingTimelock, params) {
    if (!Buffer.isBuffer(userKey)) {
        userKey = userKey.publicKey;
    }
    return new descriptor_1.BabylonDescriptorBuilder(userKey, finalityProviderKeys, params.covenantNoCoordPks.map((pk) => Buffer.from(pk, 'hex')), params.covenantQuorum, stakingTimelock, params.unbondingTime);
}
function getDescriptorProviderForStakingParams(stakerBtcInfo, stakingInput, stakingParams) {
    const userKey = Buffer.from(stakerBtcInfo.publicKeyNoCoordHex, 'hex');
    const finalityProviderKey = Buffer.from(stakingInput.finalityProviderPkNoCoordHex, 'hex');
    return getDescriptorBuilderForParams(userKey, [finalityProviderKey], stakingInput.stakingTimelock, stakingParams);
}
function getTestnetDescriptorBuilder(userKey, { finalityProviderKeys = [exports.testnetFinalityProvider0], params = (0, babylonlabs_io_btc_staking_ts_1.getBabylonParamByVersion)(5, getStakingParams('testnet')), stakingTimelock = params.minStakingTimeBlocks, } = {}) {
    return getDescriptorBuilderForParams(userKey, finalityProviderKeys, stakingTimelock, params);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Rha2luZ1BhcmFtcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWJ5bG9uL3N0YWtpbmdQYXJhbXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUNBLDhDQWtCQztBQXVCRCw0Q0FTQztBQWFELHNFQWlCQztBQUVELHNGQVFDO0FBRUQsa0VBYUM7QUFoSkQseUNBQTJCO0FBQzNCLGdEQUFrQztBQUNsQyx5Q0FBc0M7QUFDdEMseURBQXNEO0FBRXRELHdGQU04QztBQUM5QyxzRkFBNEc7QUFBbkcseUlBQUEsd0JBQXdCLE9BQUE7QUFBRSwySUFBQSwwQkFBMEIsT0FBQTtBQUU3RCw2Q0FBd0Q7QUFDeEQsZ0ZBQXNEO0FBQ3RELGdGQUFzRDtBQUN0RCx1Q0FBaUU7QUFFakUsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQy9CLFlBQVksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDL0IsZUFBZSxFQUFFLENBQUMsQ0FBQyxNQUFNO0lBQ3pCLHFCQUFxQixFQUFFLEVBQUUsQ0FBQyxnQkFBZ0I7SUFDMUMscUJBQXFCLEVBQUUsRUFBRSxDQUFDLGdCQUFnQjtJQUMxQyx1QkFBdUIsRUFBRSxDQUFDLENBQUMsTUFBTTtJQUNqQyx1QkFBdUIsRUFBRSxDQUFDLENBQUMsTUFBTTtJQUNqQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsTUFBTTtJQUM1Qix1QkFBdUIsRUFBRSxFQUFFLENBQUMsZ0JBQWdCO0lBQzVDLGFBQWEsRUFBRSxDQUFDLENBQUMsTUFBTTtJQUN2QixxQkFBcUIsRUFBRSxDQUFDLENBQUMsTUFBTTtJQUMvQixpQkFBaUIsRUFBRSxFQUFFLENBQUMsZ0JBQWdCO0lBQ3RDLG1CQUFtQixFQUFFLEVBQUUsQ0FBQyxnQkFBZ0I7SUFDeEMsZ0NBQWdDLEVBQUUsRUFBRSxDQUFD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cm9tICdpby10cyc7XG5pbXBvcnQgKiBhcyB0dCBmcm9tICdpby10cy10eXBlcyc7XG5pbXBvcnQgeyBpc0xlZnQgfSBmcm9tICdmcC10cy9FaXRoZXInO1xuaW1wb3J0IHsgUGF0aFJlcG9ydGVyIH0gZnJvbSAnaW8tdHMvbGliL1BhdGhSZXBvcnRlcic7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQge1xuICBnZXRCYWJ5bG9uUGFyYW1CeVZlcnNpb24sXG4gIFN0YWtlckluZm8sXG4gIFN0YWtpbmdJbnB1dHMsXG4gIFN0YWtpbmdQYXJhbXMsXG4gIFZlcnNpb25lZFN0YWtpbmdQYXJhbXMsXG59IGZyb20gJ0BiaXRnby9iYWJ5bG9ubGFicy1pby1idGMtc3Rha2luZy10cyc7XG5leHBvcnQgeyBnZXRCYWJ5bG9uUGFyYW1CeVZlcnNpb24sIGdldEJhYnlsb25QYXJhbUJ5QnRjSGVpZ2h0IH0gZnJvbSAnQGJpdGdvL2JhYnlsb25sYWJzLWlvLWJ0Yy1zdGFraW5nLXRzJztcblxuaW1wb3J0IHsgQmFieWxvbkRlc2NyaXB0b3JCdWlsZGVyIH0gZnJvbSAnLi9kZXNjcmlwdG9yJztcbmltcG9ydCBqc29uTWFpbm5ldFBhcmFtcyBmcm9tICcuL3BhcmFtcy5tYWlubmV0Lmpzb24nO1xuaW1wb3J0IGpzb25UZXN0bmV0UGFyYW1zIGZyb20gJy4vcGFyYW1zLnRlc3RuZXQuanNvbic7XG5pbXBvcnQgeyBCYWJ5bG9uTmV0d29ya0xpa2UsIHRvQmFieWxvbk5ldHdvcmsgfSBmcm9tICcuL25ldHdvcmsnO1xuXG5jb25zdCBCYWJ5bG9uUGFyYW1zSlNPTiA9IHQudHlwZSh7XG4gIGNvdmVuYW50X3BrczogdC5hcnJheSh0LnN0cmluZyksXG4gIGNvdmVuYW50X3F1b3J1bTogdC5udW1iZXIsXG4gIG1pbl9zdGFraW5nX3ZhbHVlX3NhdDogdHQuTnVtYmVyRnJvbVN0cmluZyxcbiAgbWF4X3N0YWtpbmdfdmFsdWVfc2F0OiB0dC5OdW1iZXJGcm9tU3RyaW5nLFxuICBtaW5fc3Rha2luZ190aW1lX2Jsb2NrczogdC5udW1iZXIsXG4gIG1heF9zdGFraW5nX3RpbWVfYmxvY2tzOiB0Lm51bWJlcixcbiAgc2xhc2hpbmdfcGtfc2NyaXB0OiB0LnN0cmluZyxcbiAgbWluX3NsYXNoaW5nX3R4X2ZlZV9zYXQ6IHR0Lk51bWJlckZyb21TdHJpbmcsXG4gIHNsYXNoaW5nX3JhdGU6IHQuc3RyaW5nLFxuICB1bmJvbmRpbmdfdGltZV9ibG9ja3M6IHQubnVtYmVyLFxuICB1bmJvbmRpbmdfZmVlX3NhdDogdHQuTnVtYmVyRnJvbVN0cmluZyxcbiAgbWluX2NvbW1pc3Npb25fcmF0ZTogdHQuTnVtYmVyRnJvbVN0cmluZyxcbiAgZGVsZWdhdGlvbl9jcmVhdGlvbl9iYXNlX2dhc19mZWU6IHR0Lk51bWJlckZyb21TdHJpbmcsXG4gIGFsbG93X2xpc3RfZXhwaXJhdGlvbl9oZWlnaHQ6IHR0Lk51bWJlckZyb21TdHJpbmcsXG4gIGJ0Y19hY3RpdmF0aW9uX2hlaWdodDogdC5udW1iZXIsXG59KTtcblxudHlwZSBCYWJ5bG9uUGFyYW1zSlNPTiA9IHQuVHlwZU9mPHR5cGVvZiBCYWJ5bG9uUGFyYW1zSlNPTj47XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1ZlcnNpb25lZFBhcmFtcyhwczogQmFieWxvblBhcmFtc0pTT05bXSk6IFZlcnNpb25lZFN0YWtpbmdQYXJhbXNbXSB7XG4gIHJldHVybiBwcy5tYXAoKHAsIHZlcnNpb24pID0+ICh7XG4gICAgdmVyc2lvbixcbiAgICBidGNBY3RpdmF0aW9uSGVpZ2h0OiBwLmJ0Y19hY3RpdmF0aW9uX2hlaWdodCxcbiAgICBjb3ZlbmFudE5vQ29vcmRQa3M6IHAuY292ZW5hbnRfcGtzLFxuICAgIGNvdmVuYW50UXVvcnVtOiBwLmNvdmVuYW50X3F1b3J1bSxcbiAgICB1bmJvbmRpbmdUaW1lOiBwLnVuYm9uZGluZ190aW1lX2Jsb2NrcyxcbiAgICB1bmJvbmRpbmdGZWVTYXQ6IHAudW5ib25kaW5nX2ZlZV9zYXQsXG4gICAgbWF4U3Rha2luZ0Ftb3VudFNhdDogcC5tYXhfc3Rha2luZ192YWx1ZV9zYXQsXG4gICAgbWluU3Rha2luZ0Ftb3VudFNhdDogcC5taW5fc3Rha2luZ192YWx1ZV9zYXQsXG4gICAgbWF4U3Rha2luZ1RpbWVCbG9ja3M6IHAubWF4X3N0YWtpbmdfdGltZV9ibG9ja3MsXG4gICAgbWluU3Rha2luZ1RpbWVCbG9ja3M6IHAubWluX3N0YWtpbmdfdGltZV9ibG9ja3MsXG4gICAgc2xhc2hpbmc6IHtcbiAgICAgIHNsYXNoaW5nUGtTY3JpcHRIZXg6IEJ1ZmZlci5mcm9tKHAuc2xhc2hpbmdfcGtfc2NyaXB0LCAnYmFzZTY0JykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgc2xhc2hpbmdSYXRlOiBwYXJzZUZsb2F0KHAuc2xhc2hpbmdfcmF0ZSksXG4gICAgICBtaW5TbGFzaGluZ1R4RmVlU2F0OiBwLm1pbl9zbGFzaGluZ190eF9mZWVfc2F0LFxuICAgIH0sXG4gIH0pKTtcbn1cblxuZnVuY3Rpb24gdG9WZXJzaW9uZWRQYXJhbXNGcm9tSnNvbihqc29uUGFyYW1zOiB1bmtub3duW10pOiBWZXJzaW9uZWRTdGFraW5nUGFyYW1zW10ge1xuICByZXR1cm4gdG9WZXJzaW9uZWRQYXJhbXMoXG4gICAganNvblBhcmFtcy5tYXAoKHApOiBCYWJ5bG9uUGFyYW1zSlNPTiA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0LnR5cGUoeyBwYXJhbXM6IEJhYnlsb25QYXJhbXNKU09OIH0pLmRlY29kZShwKTtcbiAgICAgIGlmIChpc0xlZnQocmVzdWx0KSkge1xuICAgICAgICBjb25zdCBtc2cgPSBQYXRoUmVwb3J0ZXIucmVwb3J0KHJlc3VsdCkuam9pbignXFxuJyk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0ZXN0bmV0IHBhcmFtczogJHttc2d9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0LnJpZ2h0LnBhcmFtcztcbiAgICB9KVxuICApO1xufVxuXG5leHBvcnQgY29uc3QgbWFpbm5ldFN0YWtpbmdQYXJhbXM6IHJlYWRvbmx5IFZlcnNpb25lZFN0YWtpbmdQYXJhbXNbXSA9IE9iamVjdC5mcmVlemUoXG4gIHRvVmVyc2lvbmVkUGFyYW1zRnJvbUpzb24oanNvbk1haW5uZXRQYXJhbXMpXG4pO1xuXG5leHBvcnQgY29uc3QgdGVzdG5ldFN0YWtpbmdQYXJhbXM6IHJlYWRvbmx5IFZlcnNpb25lZFN0YWtpbmdQYXJhbXNbXSA9IE9iamVjdC5mcmVlemUoXG4gIHRvVmVyc2lvbmVkUGFyYW1zRnJvbUpzb24oanNvblRlc3RuZXRQYXJhbXMpXG4pO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3Rha2luZ1BhcmFtcyhuZXR3b3JrOiBCYWJ5bG9uTmV0d29ya0xpa2UpOiBWZXJzaW9uZWRTdGFraW5nUGFyYW1zW10ge1xuICBzd2l0Y2ggKHRvQmFieWxvbk5ldHdvcmsobmV0d29yaykpIHtcbiAgICBjYXNlICdtYWlubmV0JzpcbiAgICAgIHJldHVybiBbLi4ubWFpbm5ldFN0YWtpbmdQYXJhbXNdO1xuICAgIGNhc2UgJ3Rlc3RuZXQnOlxuICAgICAgcmV0dXJuIFsuLi50ZXN0bmV0U3Rha2luZ1BhcmFtc107XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgbmV0d29yaycpO1xuICB9XG59XG5cbi8vIFNvdXJjZTogaHR0cHM6Ly9idGNzdGFraW5nLnRlc3RuZXQuYmFieWxvbmxhYnMuaW8vIFwiQmFieWxvbiBGb3VuZGF0aW9uIDBcIlxuZXhwb3J0IGNvbnN0IHRlc3RuZXRGaW5hbGl0eVByb3ZpZGVyMCA9IEJ1ZmZlci5mcm9tKFxuICAnZDIzYzJjMjVlMWZjZjhmZDFjMjFiOWE0MDJjMTllMmUzMDllNTMxZTQ1ZTkyZmIxZTk4MDViNjA1NmIwY2M3NicsXG4gICdoZXgnXG4pO1xuXG50eXBlIERlc2NyaXB0b3JTdGFraW5nUGFyYW1zID0gUGljazxcbiAgU3Rha2luZ1BhcmFtcyxcbiAgJ2NvdmVuYW50Tm9Db29yZFBrcycgfCAnY292ZW5hbnRRdW9ydW0nIHwgJ21pblN0YWtpbmdUaW1lQmxvY2tzJyB8ICd1bmJvbmRpbmdUaW1lJ1xuPjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlc2NyaXB0b3JCdWlsZGVyRm9yUGFyYW1zKFxuICB1c2VyS2V5OiB1dHhvbGliLkJJUDMySW50ZXJmYWNlIHwgdXR4b2xpYi5FQ1BhaXJJbnRlcmZhY2UgfCBCdWZmZXIsXG4gIGZpbmFsaXR5UHJvdmlkZXJLZXlzOiBCdWZmZXJbXSxcbiAgc3Rha2luZ1RpbWVsb2NrOiBudW1iZXIsXG4gIHBhcmFtczogRGVzY3JpcHRvclN0YWtpbmdQYXJhbXNcbik6IEJhYnlsb25EZXNjcmlwdG9yQnVpbGRlciB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHVzZXJLZXkpKSB7XG4gICAgdXNlcktleSA9IHVzZXJLZXkucHVibGljS2V5O1xuICB9XG4gIHJldHVybiBuZXcgQmFieWxvbkRlc2NyaXB0b3JCdWlsZGVyKFxuICAgIHVzZXJLZXksXG4gICAgZmluYWxpdHlQcm92aWRlcktleXMsXG4gICAgcGFyYW1zLmNvdmVuYW50Tm9Db29yZFBrcy5tYXAoKHBrKSA9PiBCdWZmZXIuZnJvbShwaywgJ2hleCcpKSxcbiAgICBwYXJhbXMuY292ZW5hbnRRdW9ydW0sXG4gICAgc3Rha2luZ1RpbWVsb2NrLFxuICAgIHBhcmFtcy51bmJvbmRpbmdUaW1lXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZXNjcmlwdG9yUHJvdmlkZXJGb3JTdGFraW5nUGFyYW1zKFxuICBzdGFrZXJCdGNJbmZvOiBQaWNrPFN0YWtlckluZm8sICdwdWJsaWNLZXlOb0Nvb3JkSGV4Jz4sXG4gIHN0YWtpbmdJbnB1dDogU3Rha2luZ0lucHV0cyxcbiAgc3Rha2luZ1BhcmFtczogRGVzY3JpcHRvclN0YWtpbmdQYXJhbXNcbik6IEJhYnlsb25EZXNjcmlwdG9yQnVpbGRlciB7XG4gIGNvbnN0IHVzZXJLZXkgPSBCdWZmZXIuZnJvbShzdGFrZXJCdGNJbmZvLnB1YmxpY0tleU5vQ29vcmRIZXgsICdoZXgnKTtcbiAgY29uc3QgZmluYWxpdHlQcm92aWRlcktleSA9IEJ1ZmZlci5mcm9tKHN0YWtpbmdJbnB1dC5maW5hbGl0eVByb3ZpZGVyUGtOb0Nvb3JkSGV4LCAnaGV4Jyk7XG4gIHJldHVybiBnZXREZXNjcmlwdG9yQnVpbGRlckZvclBhcmFtcyh1c2VyS2V5LCBbZmluYWxpdHlQcm92aWRlcktleV0sIHN0YWtpbmdJbnB1dC5zdGFraW5nVGltZWxvY2ssIHN0YWtpbmdQYXJhbXMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGVzdG5ldERlc2NyaXB0b3JCdWlsZGVyKFxuICB1c2VyS2V5OiB1dHhvbGliLkJJUDMySW50ZXJmYWNlIHwgdXR4b2xpYi5FQ1BhaXJJbnRlcmZhY2UgfCBCdWZmZXIsXG4gIHtcbiAgICBmaW5hbGl0eVByb3ZpZGVyS2V5cyA9IFt0ZXN0bmV0RmluYWxpdHlQcm92aWRlcjBdLFxuICAgIHBhcmFtcyA9IGdldEJhYnlsb25QYXJhbUJ5VmVyc2lvbig1LCBnZXRTdGFraW5nUGFyYW1zKCd0ZXN0bmV0JykpLFxuICAgIHN0YWtpbmdUaW1lbG9jayA9IHBhcmFtcy5taW5TdGFraW5nVGltZUJsb2NrcyxcbiAgfToge1xuICAgIGZpbmFsaXR5UHJvdmlkZXJLZXlzPzogQnVmZmVyW107XG4gICAgcGFyYW1zPzogU3Rha2luZ1BhcmFtcztcbiAgICBzdGFraW5nVGltZWxvY2s/OiBudW1iZXI7XG4gIH0gPSB7fVxuKTogQmFieWxvbkRlc2NyaXB0b3JCdWlsZGVyIHtcbiAgcmV0dXJuIGdldERlc2NyaXB0b3JCdWlsZGVyRm9yUGFyYW1zKHVzZXJLZXksIGZpbmFsaXR5UHJvdmlkZXJLZXlzLCBzdGFraW5nVGltZWxvY2ssIHBhcmFtcyk7XG59XG4iXX0=

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


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