PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-coin-celo/dist/src/lib
Просмотр файла: transactionBuilder.js
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.TransactionBuilder = void 0;
const ethereumjs_abi_1 = __importDefault(require("ethereumjs-abi"));
const abstract_eth_1 = require("@bitgo/abstract-eth");
const sdk_coin_eth_1 = require("@bitgo/sdk-coin-eth");
const sdk_core_1 = require("@bitgo/sdk-core");
const stakingBuilder_1 = require("./stakingBuilder");
const utils_1 = require("./utils");
const transferBuilder_1 = require("./transferBuilder");
const bignumber_js_1 = __importDefault(require("bignumber.js"));
class TransactionBuilder extends sdk_coin_eth_1.TransactionBuilder {
constructor(_coinConfig) {
super(_coinConfig);
this._common = (0, utils_1.getCommon)(this._coinConfig.network.type);
this.transaction = new abstract_eth_1.Transaction(this._coinConfig, this._common);
}
/** @inheritdoc */
type(type) {
super.type(type);
this._stakingBuilder = undefined;
}
getTransactionData() {
switch (this._type) {
case sdk_core_1.TransactionType.StakingLock:
return this.buildLockStakeTransaction();
case sdk_core_1.TransactionType.StakingUnlock:
case sdk_core_1.TransactionType.StakingVote:
case sdk_core_1.TransactionType.StakingUnvote:
case sdk_core_1.TransactionType.StakingActivate:
case sdk_core_1.TransactionType.StakingWithdraw:
return this.buildStakingTransaction();
}
return super.getTransactionData();
}
/** @inheritdoc */
fromImplementation(rawTransaction) {
let tx;
if (/^0x?[0-9a-f]{1,}$/.test(rawTransaction.toLowerCase())) {
tx = abstract_eth_1.Transaction.fromSerialized(this._coinConfig, this._common, rawTransaction);
super.loadBuilderInput(tx.toJson());
}
else {
const txData = JSON.parse(rawTransaction);
tx = new abstract_eth_1.Transaction(this._coinConfig, this._common, txData);
}
return tx;
}
setTransactionTypeFields(decodedType, transactionJson) {
switch (decodedType) {
case sdk_core_1.TransactionType.StakingLock:
this._stakingBuilder = new stakingBuilder_1.StakingBuilder(this._coinConfig)
.type(sdk_core_1.StakingOperationTypes.LOCK)
.amount(transactionJson.value);
break;
case sdk_core_1.TransactionType.StakingUnlock:
case sdk_core_1.TransactionType.StakingVote:
case sdk_core_1.TransactionType.StakingUnvote:
case sdk_core_1.TransactionType.StakingActivate:
case sdk_core_1.TransactionType.StakingWithdraw:
this._stakingBuilder = new stakingBuilder_1.StakingBuilder(this._coinConfig, transactionJson.data);
break;
default:
super.setTransactionTypeFields(decodedType, transactionJson);
break;
}
}
/**
* Returns the smart contract encoded data
*
* @param {string[]} addresses - the contract signers
* @returns {string} - the smart contract encoded data
*/
getContractData(addresses) {
const params = [addresses];
const resultEncodedParameters = ethereumjs_abi_1.default.rawEncode(sdk_coin_eth_1.walletSimpleConstructor, params)
.toString('hex')
.replace('0x', '');
return utils_1.walletSimpleByteCode + resultEncodedParameters;
}
// region Stake methods
/**
* Gets the staking lock builder if exist, or creates a new one for this transaction and returns it
* requires: amount
*
* @returns {StakingBuilder} the staking builder
*/
lock() {
if (this._type !== sdk_core_1.TransactionType.StakingLock) {
throw new sdk_core_1.BuildTransactionError('Lock can only be set for Staking Lock transactions type');
}
return this.getBuilder(sdk_core_1.StakingOperationTypes.LOCK);
}
/**
* Gets the staking vote builder if exist, or creates a new one for this transaction and returns it
* requires: group, lesser, greater, amount
*
* @returns {StakingBuilder} the staking builder
*/
vote() {
if (this._type !== sdk_core_1.TransactionType.StakingVote) {
throw new sdk_core_1.BuildTransactionError('Votes can only be set for a staking transaction');
}
return this.getBuilder(sdk_core_1.StakingOperationTypes.VOTE);
}
/**
* Gets the staking activate builder if exist, or creates a new one for this transaction and returns it
* requires: group
*
* @returns {StakingBuilder} the staking builder
*/
activate() {
if (this._type !== sdk_core_1.TransactionType.StakingActivate) {
throw new sdk_core_1.BuildTransactionError('Activation can only be set for a staking transaction');
}
return this.getBuilder(sdk_core_1.StakingOperationTypes.ACTIVATE);
}
/**
* Gets the staking unlock builder if exist, or creates a new one for this transaction and returns it
* requires: amount
*
* @returns {StakingBuilder} the staking builder
*/
unlock() {
if (this._type !== sdk_core_1.TransactionType.StakingUnlock) {
throw new sdk_core_1.BuildTransactionError('Unlock can only be set for Staking Unlock transactions type');
}
return this.getBuilder(sdk_core_1.StakingOperationTypes.UNLOCK);
}
/**
* Gets the staking unvote builder if exist, or creates a new one for this transaction and returns it
* requires: group, lesser, greater, amount, index
*
* @returns {StakingBuilder} the staking builder
*/
unvote() {
if (this._type !== sdk_core_1.TransactionType.StakingUnvote) {
throw new sdk_core_1.BuildTransactionError('Unvote can only be set for a staking transaction');
}
return this.getBuilder(sdk_core_1.StakingOperationTypes.UNVOTE);
}
/**
* Gets the staking withdraw builder if exist, or creates a new one for this transaction and returns it
* requires: index (unlock list)
*
* @returns {StakingBuilder} the staking builder
*/
withdraw() {
if (this._type !== sdk_core_1.TransactionType.StakingWithdraw) {
throw new sdk_core_1.BuildTransactionError('Withdraw can only be set for a staking transaction');
}
return this.getBuilder(sdk_core_1.StakingOperationTypes.WITHDRAW);
}
/** @inheritdoc */
transfer(data) {
if (this._type !== sdk_core_1.TransactionType.Send) {
throw new sdk_core_1.BuildTransactionError('Transfers can only be set for send transactions');
}
if (!this._transfer) {
this._transfer = new transferBuilder_1.TransferBuilder(data);
}
return this._transfer;
}
/**
* Get the appropriate builder for the selected type
*
* @param {StakingOperationTypes} type the selected type for the staking builder
* @returns {StakingBuilder} the staking builder for the selected type
*/
getBuilder(type) {
if (!this._stakingBuilder) {
this._stakingBuilder = new stakingBuilder_1.StakingBuilder(this._coinConfig).type(type);
}
return this._stakingBuilder;
}
getStaking() {
if (!this._stakingBuilder) {
throw new sdk_core_1.BuildTransactionError('No staking information set');
}
return this._stakingBuilder.build();
}
buildLockStakeTransaction() {
const stake = this.getStaking();
const data = this.buildBase(stake.serialize());
data.to = stake.address;
data.value = stake.amount;
return data;
}
buildStakingTransaction() {
const stake = this.getStaking();
const data = this.buildBase(stake.serialize());
data.to = stake.address;
return data;
}
/**
* The value to send along with this transaction. 0 by default
*
* @param {string} value The value to send along with this transaction
*/
value(value) {
this.validatePrecision(value, 'Value');
this._value = value;
}
validatePrecision(value, context) {
context = context ? context + ' ' : '';
const valueNumber = Number(value);
// the Celo library internally converts the string value to a number and converts to hex, which can result in a loss of precision for numbers with >= 15 significant digits
const valueBigNumber = new bignumber_js_1.default(valueNumber.toString(16), 16);
if (isNaN(valueNumber)) {
throw new sdk_core_1.BuildTransactionError(`${context}${value} is not a valid number`);
}
else if (!valueBigNumber.isEqualTo(valueNumber)) {
// TODO(BG-62714): remove this check once the celo library is fixed
throw new sdk_core_1.BuildTransactionError(`${context}${value} cannot be represented by a JS number, please try using fewer significant digits. We are working to support all values in the future.`);
}
}
}
exports.TransactionBuilder = TransactionBuilder;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0Esb0VBQXlDO0FBQ3pDLHNEQUFrRDtBQUNsRCxzREFBbUg7QUFDbkgsOENBQWdHO0FBQ2hHLHFEQUFrRDtBQUVsRCxtQ0FBMEQ7QUFDMUQsdURBQW9EO0FBQ3BELGdFQUFxQztBQUVyQyxNQUFhLGtCQUFtQixTQUFRLGlDQUFxQjtJQUszRCxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUEsaUJBQVMsRUFBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksMEJBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLElBQUksQ0FBQyxJQUFxQjtRQUN4QixLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDO0lBQ25DLENBQUM7SUFFUyxrQkFBa0I7UUFDMUIsUUFBUSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbkIsS0FBSywwQkFBZSxDQUFDLFdBQVc7Z0JBQzlCLE9BQU8sSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7WUFDMUMsS0FBSywwQkFBZSxDQUFDLGFBQWEsQ0FBQztZQUNuQyxLQUFLLDBCQUFlLENBQUMsV0FBVyxDQUFDO1lBQ2pDLEtBQUssMEJBQWUsQ0FBQyxhQUFhLENBQUM7WUFDbkMsS0FBSywwQkFBZSxDQUFDLGVBQWUsQ0FBQztZQUNyQyxLQUFLLDBCQUFlLENBQUMsZUFBZTtn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Q29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IEV0aGVyZXVtQWJpIGZyb20gJ2V0aGVyZXVtanMtYWJpJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnQGJpdGdvL2Fic3RyYWN0LWV0aCc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXIgYXMgRXRoVHJhbnNhY3Rpb25CdWlsZGVyLCBUeERhdGEsIHdhbGxldFNpbXBsZUNvbnN0cnVjdG9yIH0gZnJvbSAnQGJpdGdvL3Nkay1jb2luLWV0aCc7XG5pbXBvcnQgeyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsIFRyYW5zYWN0aW9uVHlwZSwgU3Rha2luZ09wZXJhdGlvblR5cGVzIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IFN0YWtpbmdCdWlsZGVyIH0gZnJvbSAnLi9zdGFraW5nQnVpbGRlcic7XG5pbXBvcnQgeyBTdGFraW5nQ2FsbCB9IGZyb20gJy4vc3Rha2luZ0NhbGwnO1xuaW1wb3J0IHsgZ2V0Q29tbW9uLCB3YWxsZXRTaW1wbGVCeXRlQ29kZSB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNmZXJCdWlsZGVyIH0gZnJvbSAnLi90cmFuc2ZlckJ1aWxkZXInO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25CdWlsZGVyIGV4dGVuZHMgRXRoVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgLy8gU3Rha2luZyBzcGVjaWZpYyBwYXJhbWV0ZXJzXG4gIHByaXZhdGUgX3N0YWtpbmdCdWlsZGVyPzogU3Rha2luZ0J1aWxkZXI7XG4gIHByb3RlY3RlZCBfdHJhbnNmZXI6IFRyYW5zZmVyQnVpbGRlcjtcblxuICBjb25zdHJ1Y3RvcihfY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihfY29pbkNvbmZpZyk7XG4gICAgdGhpcy5fY29tbW9uID0gZ2V0Q29tbW9uKHRoaXMuX2NvaW5Db25maWcubmV0d29yay50eXBlKTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKHRoaXMuX2NvaW5Db25maWcsIHRoaXMuX2NvbW1vbik7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdHlwZSh0eXBlOiBUcmFuc2FjdGlvblR5cGUpOiB2b2lkIHtcbiAgICBzdXBlci50eXBlKHR5cGUpO1xuICAgIHRoaXMuX3N0YWtpbmdCdWlsZGVyID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFRyYW5zYWN0aW9uRGF0YSgpOiBUeERhdGEge1xuICAgIHN3aXRjaCAodGhpcy5fdHlwZSkge1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0xvY2s6XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkTG9ja1N0YWtlVHJhbnNhY3Rpb24oKTtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdVbmxvY2s6XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nVm90ZTpcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdVbnZvdGU6XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGU6XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXc6XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkU3Rha2luZ1RyYW5zYWN0aW9uKCk7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5nZXRUcmFuc2FjdGlvbkRhdGEoKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgZnJvbUltcGxlbWVudGF0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiBUcmFuc2FjdGlvbiB7XG4gICAgbGV0IHR4OiBUcmFuc2FjdGlvbjtcbiAgICBpZiAoL14weD9bMC05YS1mXXsxLH0kLy50ZXN0KHJhd1RyYW5zYWN0aW9uLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICB0eCA9IFRyYW5zYWN0aW9uLmZyb21TZXJpYWxpemVkKHRoaXMuX2NvaW5Db25maWcsIHRoaXMuX2NvbW1vbiwgcmF3VHJhbnNhY3Rpb24pO1xuICAgICAgc3VwZXIubG9hZEJ1aWxkZXJJbnB1dCh0eC50b0pzb24oKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHR4RGF0YSA9IEpTT04ucGFyc2UocmF3VHJhbnNhY3Rpb24pO1xuICAgICAgdHggPSBuZXcgVHJhbnNhY3Rpb24odGhpcy5fY29pbkNvbmZpZywgdGhpcy5fY29tbW9uLCB0eERhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gdHg7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0VHJhbnNhY3Rpb25UeXBlRmllbGRzKGRlY29kZWRUeXBlOiBUcmFuc2FjdGlvblR5cGUsIHRyYW5zYWN0aW9uSnNvbjogVHhEYXRhKTogdm9pZCB7XG4gICAgc3dpdGNoIChkZWNvZGVkVHlwZSkge1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0xvY2s6XG4gICAgICAgIHRoaXMuX3N0YWtpbmdCdWlsZGVyID0gbmV3IFN0YWtpbmdCdWlsZGVyKHRoaXMuX2NvaW5Db25maWcpXG4gICAgICAgICAgLnR5cGUoU3Rha2luZ09wZXJhdGlvblR5cGVzLkxPQ0spXG4gICAgICAgICAgLmFtb3VudCh0cmFuc2FjdGlvbkpzb24udmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdVbmxvY2s6XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nVm90ZTpcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdVbnZvdGU6XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGU6XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXc6XG4gICAgICAgIHRoaXMuX3N0YWtpbmdCdWlsZGVyID0gbmV3IFN0YWtpbmdCdWlsZGVyKHRoaXMuX2NvaW5Db25maWcsIHRyYW5zYWN0aW9uSnNvbi5kYXRhKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBzdXBlci5zZXRUcmFuc2FjdGlvblR5cGVGaWVsZHMoZGVjb2RlZFR5cGUsIHRyYW5zYWN0aW9uSnNvbik7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzbWFydCBjb250cmFjdCBlbmNvZGVkIGRhdGFcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gYWRkcmVzc2VzIC0gdGhlIGNvbnRyYWN0IHNpZ25lcnNcbiAgICogQHJldHVybnMge3N0cmluZ30gLSB0aGUgc21hcnQgY29udHJhY3QgZW5jb2RlZCBkYXRhXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0Q29udHJhY3REYXRhKGFkZHJlc3Nlczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcmFtcyA9IFthZGRyZXNzZXNdO1xuICAgIGNvbnN0IHJlc3VsdEVuY29kZWRQYXJhbWV0ZXJzID0gRXRoZXJldW1BYmkucmF3RW5jb2RlKHdhbGxldFNpbXBsZUNvbnN0cnVjdG9yLCBwYXJhbXMpXG4gICAgICAudG9TdHJpbmcoJ2hleCcpXG4gICAgICAucmVwbGFjZSgnMHgnLCAnJyk7XG4gICAgcmV0dXJuIHdhbGxldFNpbXBsZUJ5dGVDb2RlICsgcmVzdWx0RW5jb2RlZFBhcmFtZXRlcnM7XG4gIH1cblxuICAvLyByZWdpb24gU3Rha2UgbWV0aG9kc1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzdGFraW5nIGxvY2sgYnVpbGRlciBpZiBleGlzdCwgb3IgY3JlYXRlcyBhIG5ldyBvbmUgZm9yIHRoaXMgdHJhbnNhY3Rpb24gYW5kIHJldHVybnMgaXRcbiAgICogcmVxdWlyZXM6IGFtb3VudFxuICAgKlxuICAgKiBAcmV0dXJucyB7U3Rha2luZ0J1aWxkZXJ9IHRoZSBzdGFraW5nIGJ1aWxkZXJcbiAgICovXG4gIGxvY2soKTogU3Rha2luZ0J1aWxkZXIge1xuICAgIGlmICh0aGlzLl90eXBlICE9PSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0xvY2spIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0xvY2sgY2FuIG9ubHkgYmUgc2V0IGZvciBTdGFraW5nIExvY2sgdHJhbnNhY3Rpb25zIHR5cGUnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRCdWlsZGVyKFN0YWtpbmdPcGVyYXRpb25UeXBlcy5MT0NLKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzdGFraW5nIHZvdGUgYnVpbGRlciBpZiBleGlzdCwgb3IgY3JlYXRlcyBhIG5ldyBvbmUgZm9yIHRoaXMgdHJhbnNhY3Rpb24gYW5kIHJldHVybnMgaXRcbiAgICogcmVxdWlyZXM6IGdyb3VwLCBsZXNzZXIsIGdyZWF0ZXIsIGFtb3VudFxuICAgKlxuICAgKiBAcmV0dXJucyB7U3Rha2luZ0J1aWxkZXJ9IHRoZSBzdGFraW5nIGJ1aWxkZXJcbiAgICovXG4gIHZvdGUoKTogU3Rha2luZ0J1aWxkZXIge1xuICAgIGlmICh0aGlzLl90eXBlICE9PSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1ZvdGUpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1ZvdGVzIGNhbiBvbmx5IGJlIHNldCBmb3IgYSBzdGFraW5nIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0QnVpbGRlcihTdGFraW5nT3BlcmF0aW9uVHlwZXMuVk9URSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgc3Rha2luZyBhY3RpdmF0ZSBidWlsZGVyIGlmIGV4aXN0LCBvciBjcmVhdGVzIGEgbmV3IG9uZSBmb3IgdGhpcyB0cmFuc2FjdGlvbiBhbmQgcmV0dXJucyBpdFxuICAgKiByZXF1aXJlczogZ3JvdXBcbiAgICpcbiAgICogQHJldHVybnMge1N0YWtpbmdCdWlsZGVyfSB0aGUgc3Rha2luZyBidWlsZGVyXG4gICAqL1xuICBhY3RpdmF0ZSgpOiBTdGFraW5nQnVpbGRlciB7XG4gICAgaWYgKHRoaXMuX3R5cGUgIT09IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGUpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0FjdGl2YXRpb24gY2FuIG9ubHkgYmUgc2V0IGZvciBhIHN0YWtpbmcgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRCdWlsZGVyKFN0YWtpbmdPcGVyYXRpb25UeXBlcy5BQ1RJVkFURSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgc3Rha2luZyB1bmxvY2sgYnVpbGRlciBpZiBleGlzdCwgb3IgY3JlYXRlcyBhIG5ldyBvbmUgZm9yIHRoaXMgdHJhbnNhY3Rpb24gYW5kIHJldHVybnMgaXRcbiAgICogcmVxdWlyZXM6IGFtb3VudFxuICAgKlxuICAgKiBAcmV0dXJucyB7U3Rha2luZ0J1aWxkZXJ9IHRoZSBzdGFraW5nIGJ1aWxkZXJcbiAgICovXG4gIHVubG9jaygpOiBTdGFraW5nQnVpbGRlciB7XG4gICAgaWYgKHRoaXMuX3R5cGUgIT09IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nVW5sb2NrKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdVbmxvY2sgY2FuIG9ubHkgYmUgc2V0IGZvciBTdGFraW5nIFVubG9jayB0cmFuc2FjdGlvbnMgdHlwZScpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldEJ1aWxkZXIoU3Rha2luZ09wZXJhdGlvblR5cGVzLlVOTE9DSyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgc3Rha2luZyB1bnZvdGUgYnVpbGRlciBpZiBleGlzdCwgb3IgY3JlYXRlcyBhIG5ldyBvbmUgZm9yIHRoaXMgdHJhbnNhY3Rpb24gYW5kIHJldHVybnMgaXRcbiAgICogcmVxdWlyZXM6IGdyb3VwLCBsZXNzZXIsIGdyZWF0ZXIsIGFtb3VudCwgaW5kZXhcbiAgICpcbiAgICogQHJldHVybnMge1N0YWtpbmdCdWlsZGVyfSB0aGUgc3Rha2luZyBidWlsZGVyXG4gICAqL1xuICB1bnZvdGUoKTogU3Rha2luZ0J1aWxkZXIge1xuICAgIGlmICh0aGlzLl90eXBlICE9PSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1Vudm90ZSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignVW52b3RlIGNhbiBvbmx5IGJlIHNldCBmb3IgYSBzdGFraW5nIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0QnVpbGRlcihTdGFraW5nT3BlcmF0aW9uVHlwZXMuVU5WT1RFKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzdGFraW5nIHdpdGhkcmF3IGJ1aWxkZXIgaWYgZXhpc3QsIG9yIGNyZWF0ZXMgYSBuZXcgb25lIGZvciB0aGlzIHRyYW5zYWN0aW9uIGFuZCByZXR1cm5zIGl0XG4gICAqIHJlcXVpcmVzOiBpbmRleCAodW5sb2NrIGxpc3QpXG4gICAqXG4gICAqIEByZXR1cm5zIHtTdGFraW5nQnVpbGRlcn0gdGhlIHN0YWtpbmcgYnVpbGRlclxuICAgKi9cbiAgd2l0aGRyYXcoKTogU3Rha2luZ0J1aWxkZXIge1xuICAgIGlmICh0aGlzLl90eXBlICE9PSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1dpdGhkcmF3KSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdXaXRoZHJhdyBjYW4gb25seSBiZSBzZXQgZm9yIGEgc3Rha2luZyB0cmFuc2FjdGlvbicpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldEJ1aWxkZXIoU3Rha2luZ09wZXJhdGlvblR5cGVzLldJVEhEUkFXKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB0cmFuc2ZlcihkYXRhPzogc3RyaW5nKTogVHJhbnNmZXJCdWlsZGVyIHtcbiAgICBpZiAodGhpcy5fdHlwZSAhPT0gVHJhbnNhY3Rpb25UeXBlLlNlbmQpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1RyYW5zZmVycyBjYW4gb25seSBiZSBzZXQgZm9yIHNlbmQgdHJhbnNhY3Rpb25zJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5fdHJhbnNmZXIpIHtcbiAgICAgIHRoaXMuX3RyYW5zZmVyID0gbmV3IFRyYW5zZmVyQnVpbGRlcihkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zZmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgYXBwcm9wcmlhdGUgYnVpbGRlciBmb3IgdGhlIHNlbGVjdGVkIHR5cGVcbiAgICpcbiAgICogQHBhcmFtIHtTdGFraW5nT3BlcmF0aW9uVHlwZXN9IHR5cGUgdGhlIHNlbGVjdGVkIHR5cGUgZm9yIHRoZSBzdGFraW5nIGJ1aWxkZXJcbiAgICogQHJldHVybnMge1N0YWtpbmdCdWlsZGVyfSB0aGUgc3Rha2luZyBidWlsZGVyIGZvciB0aGUgc2VsZWN0ZWQgdHlwZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRCdWlsZGVyKHR5cGU6IFN0YWtpbmdPcGVyYXRpb25UeXBlcyk6IFN0YWtpbmdCdWlsZGVyIHtcbiAgICBpZiAoIXRoaXMuX3N0YWtpbmdCdWlsZGVyKSB7XG4gICAgICB0aGlzLl9zdGFraW5nQnVpbGRlciA9IG5ldyBTdGFraW5nQnVpbGRlcih0aGlzLl9jb2luQ29uZmlnKS50eXBlKHR5cGUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9zdGFraW5nQnVpbGRlcjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3Rha2luZygpOiBTdGFraW5nQ2FsbCB7XG4gICAgaWYgKCF0aGlzLl9zdGFraW5nQnVpbGRlcikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignTm8gc3Rha2luZyBpbmZvcm1hdGlvbiBzZXQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3N0YWtpbmdCdWlsZGVyLmJ1aWxkKCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkTG9ja1N0YWtlVHJhbnNhY3Rpb24oKTogVHhEYXRhIHtcbiAgICBjb25zdCBzdGFrZSA9IHRoaXMuZ2V0U3Rha2luZygpO1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmJ1aWxkQmFzZShzdGFrZS5zZXJpYWxpemUoKSk7XG4gICAgZGF0YS50byA9IHN0YWtlLmFkZHJlc3M7XG4gICAgZGF0YS52YWx1ZSA9IHN0YWtlLmFtb3VudDtcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFN0YWtpbmdUcmFuc2FjdGlvbigpOiBUeERhdGEge1xuICAgIGNvbnN0IHN0YWtlID0gdGhpcy5nZXRTdGFraW5nKCk7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuYnVpbGRCYXNlKHN0YWtlLnNlcmlhbGl6ZSgpKTtcbiAgICBkYXRhLnRvID0gc3Rha2UuYWRkcmVzcztcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSB0byBzZW5kIGFsb25nIHdpdGggdGhpcyB0cmFuc2FjdGlvbi4gMCBieSBkZWZhdWx0XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VuZCBhbG9uZyB3aXRoIHRoaXMgdHJhbnNhY3Rpb25cbiAgICovXG4gIHZhbHVlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnZhbGlkYXRlUHJlY2lzaW9uKHZhbHVlLCAnVmFsdWUnKTtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgdmFsaWRhdGVQcmVjaXNpb24odmFsdWU6IHN0cmluZywgY29udGV4dD86IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnRleHQgPSBjb250ZXh0ID8gY29udGV4dCArICcgJyA6ICcnO1xuICAgIGNvbnN0IHZhbHVlTnVtYmVyID0gTnVtYmVyKHZhbHVlKTtcbiAgICAvLyB0aGUgQ2VsbyBsaWJyYXJ5IGludGVybmFsbHkgY29udmVydHMgdGhlIHN0cmluZyB2YWx1ZSB0byBhIG51bWJlciBhbmQgY29udmVydHMgdG8gaGV4LCB3aGljaCBjYW4gcmVzdWx0IGluIGEgbG9zcyBvZiBwcmVjaXNpb24gZm9yIG51bWJlcnMgd2l0aCA+PSAxNSBzaWduaWZpY2FudCBkaWdpdHNcbiAgICBjb25zdCB2YWx1ZUJpZ051bWJlciA9IG5ldyBCaWdOdW1iZXIodmFsdWVOdW1iZXIudG9TdHJpbmcoMTYpLCAxNik7XG4gICAgaWYgKGlzTmFOKHZhbHVlTnVtYmVyKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgJHtjb250ZXh0fSR7dmFsdWV9IGlzIG5vdCBhIHZhbGlkIG51bWJlcmApO1xuICAgIH0gZWxzZSBpZiAoIXZhbHVlQmlnTnVtYmVyLmlzRXF1YWxUbyh2YWx1ZU51bWJlcikpIHtcbiAgICAgIC8vIFRPRE8oQkctNjI3MTQpOiByZW1vdmUgdGhpcyBjaGVjayBvbmNlIHRoZSBjZWxvIGxpYnJhcnkgaXMgZml4ZWRcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgIGAke2NvbnRleHR9JHt2YWx1ZX0gY2Fubm90IGJlIHJlcHJlc2VudGVkIGJ5IGEgSlMgbnVtYmVyLCBwbGVhc2UgdHJ5IHVzaW5nIGZld2VyIHNpZ25pZmljYW50IGRpZ2l0cy4gV2UgYXJlIHdvcmtpbmcgdG8gc3VwcG9ydCBhbGwgdmFsdWVzIGluIHRoZSBmdXR1cmUuYFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgLy8gZW5kcmVnaW9uXG59XG4iXX0=Выполнить команду
Для локальной разработки. Не используйте в интернете!