PHP WebShell
Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@bitgo/sdk-coin-sui/dist/src/lib
Просмотр файла: transaction.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.Transaction = void 0;
const sdk_core_1 = require("@bitgo/sdk-core");
const iface_1 = require("./iface");
const utils_1 = __importStar(require("./utils"));
const types_1 = require("./mystenlab/types");
const constants_1 = require("./constants");
const buffer_1 = require("buffer");
const bcs_1 = require("@mysten/bcs");
const bs58_1 = __importDefault(require("bs58"));
const TransactionDataBlock_1 = require("./mystenlab/builder/TransactionDataBlock");
const builder_1 = require("./mystenlab/builder");
const blake2b_1 = __importDefault(require("@bitgo/blake2b"));
const hash_1 = require("./mystenlab/cryptography/hash");
class Transaction extends sdk_core_1.BaseTransaction {
constructor(_coinConfig) {
super(_coinConfig);
}
get suiTransaction() {
return this._suiTransaction;
}
setSuiTransaction(tx) {
this._suiTransaction = tx;
}
/** @inheritDoc **/
get id() {
const dataBytes = this.getDataBytes();
const hash = (0, hash_1.hashTypedData)('TransactionData', dataBytes);
this._id = bs58_1.default.encode(hash);
return this._id;
}
addSignature(publicKey, signature) {
this._signatures.push(signature.toString('hex'));
this._signature = { publicKey, signature };
this.serialize();
}
addFeePayerSignature(publicKey, signature) {
this._signatures.push(signature.toString('hex'));
this._feePayerSignature = { publicKey, signature };
this.serialize();
}
get suiSignature() {
return this._signature;
}
get serializedSig() {
return this._serializedSig;
}
get serializedFeePayerSig() {
return this._serializedFeePayerSig;
}
setSerializedSig(publicKey, signature) {
const pubKey = buffer_1.Buffer.from(publicKey.pub, 'hex');
const serialized_sig = new Uint8Array(1 + signature.length + pubKey.length);
serialized_sig.set(constants_1.SIGNATURE_SCHEME_BYTES);
serialized_sig.set(signature, 1);
serialized_sig.set(pubKey, 1 + signature.length);
this._serializedSig = serialized_sig;
}
setSerializedFeePayerSig(publicKey, signature) {
const pubKey = buffer_1.Buffer.from(publicKey.pub, 'hex');
const serialized_sig = new Uint8Array(1 + signature.length + pubKey.length);
serialized_sig.set(constants_1.SIGNATURE_SCHEME_BYTES);
serialized_sig.set(signature, 1);
serialized_sig.set(pubKey, 1 + signature.length);
this._serializedFeePayerSig = serialized_sig;
}
/** @inheritdoc */
canSign(key) {
return true;
}
/**
* Sign this transaction
*
* @param {KeyPair} signer key
*/
sign(signer) {
if (!this._suiTransaction) {
throw new sdk_core_1.InvalidTransactionError('empty transaction to sign');
}
const intentMessage = this.signablePayload;
const signature = signer.signMessageinUint8Array(intentMessage);
this.setSerializedSig({ pub: signer.getKeys().pub }, buffer_1.Buffer.from(signature));
this.addSignature({ pub: signer.getKeys().pub }, buffer_1.Buffer.from(signature));
}
/**
* Sign transaction as the gas owner (fee payer).
*
* @param {KeyPair} ownerKey - Key for gas owner.
*/
signAsFeePayer(signer) {
if (!this._suiTransaction) {
throw new sdk_core_1.InvalidTransactionError('empty transaction to sign');
}
const intentMessage = this.signablePayload;
const signature = signer.signMessageinUint8Array(intentMessage);
this._feePayerSignature = {
publicKey: { pub: signer.getKeys().pub },
signature: buffer_1.Buffer.from(signature),
};
// Set serialized signature for fee payer
this.setSerializedFeePayerSig({ pub: signer.getKeys().pub }, buffer_1.Buffer.from(signature));
}
/** @inheritdoc */
toBroadcastFormat() {
if (!this._suiTransaction) {
throw new sdk_core_1.InvalidTransactionError('Empty transaction');
}
return this.serialize();
}
/**
* Set the transaction type.
*
* @param {TransactionType} transactionType The transaction type to be set.
*/
transactionType(transactionType) {
this._type = transactionType;
}
getDataBytes() {
const txData = this.getTxData();
const txSer = builder_1.builder.ser('TransactionData', { V1: txData }, { maxSize: TransactionDataBlock_1.TRANSACTION_DATA_MAX_SIZE });
return txSer.toBytes();
}
/** @inheritDoc */
get signablePayload() {
const dataBytes = this.getDataBytes();
const intentMessage = this.messageWithIntent(utils_1.IntentScope.TransactionData, dataBytes);
return buffer_1.Buffer.from((0, blake2b_1.default)(32).update(intentMessage).digest('binary'));
}
messageWithIntent(scope, message) {
const intent = this.intentWithScope(scope);
const intentMessage = new Uint8Array(intent.length + message.length);
intentMessage.set(intent);
intentMessage.set(message, intent.length);
return intentMessage;
}
intentWithScope(scope) {
return [scope, utils_1.IntentVersion.V0, utils_1.AppId.Sui];
}
serialize() {
const dataBytes = this.getDataBytes();
this._id = bs58_1.default.encode((0, hash_1.hashTypedData)('TransactionData', dataBytes));
return (0, bcs_1.toB64)(dataBytes);
}
static deserializeSuiTransaction(serializedTx) {
const data = (0, bcs_1.fromB64)(serializedTx);
const transactionBlock = TransactionDataBlock_1.TransactionBlockDataBuilder.fromBytes(data);
const inputs = transactionBlock.inputs.map((txInput) => txInput.value);
const transactions = transactionBlock.transactions;
const txType = this.getSuiTransactionType(transactions);
return {
id: transactionBlock.getDigest(),
type: txType,
sender: (0, types_1.normalizeSuiAddress)(transactionBlock.sender),
tx: {
inputs: inputs,
transactions: transactions,
},
gasData: {
payment: this.normalizeCoins(transactionBlock.gasConfig.payment),
owner: (0, types_1.normalizeSuiAddress)(transactionBlock.gasConfig.owner),
price: Number(transactionBlock.gasConfig.price),
budget: Number(transactionBlock.gasConfig.budget),
},
};
}
static getSuiTransactionType(transactions) {
// tricky to determine custom tx purely from a serialized tx, we can rely on following logic
if (transactions.length == 1) {
return utils_1.default.getSuiTransactionType(transactions[0]);
}
if (transactions.some((tx) => utils_1.default.getSuiTransactionType(tx) === iface_1.SuiTransactionType.WalrusStakeWithPool)) {
return iface_1.SuiTransactionType.WalrusStakeWithPool;
}
if (transactions.some((tx) => utils_1.default.getSuiTransactionType(tx) === iface_1.SuiTransactionType.WalrusRequestWithdrawStake)) {
return iface_1.SuiTransactionType.WalrusRequestWithdrawStake;
}
if (transactions.some((tx) => utils_1.default.getSuiTransactionType(tx) === iface_1.SuiTransactionType.WalrusWithdrawStake)) {
return iface_1.SuiTransactionType.WalrusWithdrawStake;
}
if (transactions.some((tx) => utils_1.default.getSuiTransactionType(tx) === iface_1.SuiTransactionType.AddStake)) {
return iface_1.SuiTransactionType.AddStake;
}
if (transactions.some((tx) => utils_1.default.getSuiTransactionType(tx) === iface_1.SuiTransactionType.WithdrawStake)) {
return iface_1.SuiTransactionType.WithdrawStake;
}
if (transactions.some((tx) => utils_1.default.getSuiTransactionType(tx) === iface_1.SuiTransactionType.TokenTransfer)) {
return iface_1.SuiTransactionType.TokenTransfer;
}
if (transactions.every((tx) => utils_1.default.getSuiTransactionType(tx) === iface_1.SuiTransactionType.Transfer)) {
return iface_1.SuiTransactionType.Transfer;
}
return iface_1.SuiTransactionType.CustomTx;
}
static getProperGasData(k) {
return {
payment: [this.normalizeSuiObjectRef(k.gasData.payment)],
owner: utils_1.default.normalizeHexId(k.gasData.owner),
price: Number(k.gasData.price),
budget: Number(k.gasData.budget),
};
}
static normalizeCoins(coins) {
return coins.map((coin) => {
return this.normalizeSuiObjectRef(coin);
});
}
static normalizeSuiObjectRef(obj) {
return {
objectId: (0, types_1.normalizeSuiObjectId)(obj.objectId),
version: Number(obj.version),
digest: obj.digest,
};
}
/**
* When building transactions with > 255 input gas payment objects, we first use MergeCoins Tranasactions to merge the
* additional inputs into the gas coin & slice them from the payment in gasData. When initializing the builder using
* decoded tx data, we need to get these inputs from MergeCoins & add them back to the gas payment to be able to
* rebuild from a raw transaction.
*/
getInputGasPaymentObjectsFromTx(tx) {
const txInputs = tx.inputs;
const transactions = tx.transactions;
const inputGasPaymentObjects = [];
transactions.forEach((transaction) => {
if (transaction.kind === 'MergeCoins') {
const { destination, sources } = transaction;
if (destination.kind === 'GasCoin') {
sources.forEach((source) => {
if (source.kind === 'Input') {
let input = txInputs[source.index];
if ('value' in input) {
input = input.value;
}
if ('Object' in input && (0, utils_1.isImmOrOwnedObj)(input.Object)) {
inputGasPaymentObjects.push(input.Object.ImmOrOwned);
}
}
});
}
}
});
return inputGasPaymentObjects;
}
}
exports.Transaction = Transaction;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDhDQU95QjtBQUN6QixtQ0FBaUc7QUFFakcsaURBQTRGO0FBQzVGLDZDQUFxRztBQUNyRywyQ0FBcUQ7QUFDckQsbUNBQWdDO0FBQ2hDLHFDQUE2QztBQUM3QyxnREFBd0I7QUFFeEIsbUZBQWtIO0FBQ2xILGlEQUFzRjtBQUN0Riw2REFBcUM7QUFDckMsd0RBQThEO0FBRTlELE1BQXNCLFdBQWUsU0FBUSwwQkFBZTtJQU8xRCxZQUFzQixXQUFpQztRQUNyRCxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUVELElBQUksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUVELGlCQUFpQixDQUFDLEVBQXFCO1FBQ3JDLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxtQkFBbUI7SUFDbkIsSUFBSSxFQUFFO1FBQ0osTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3RDLE1BQU0sSUFBSSxHQUFHLElBQUEsb0JBQWEsRUFBQyxpQkFBaUIsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsR0FBRyxHQUFHLGNBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0IsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ2xCLENBQUM7SUFFRCxZQUFZLENBQUMsU0FBd0IsRUFBRSxTQUFpQjtRQUN0RCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLFVBQVUs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QUFDOzRCQUNELElBQUksUUFBUSxJQUFJLEtBQUssSUFBSSxJQUFBLHVCQUFlLEVBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0NBQ3ZELHNCQUFzQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDOzRCQUN2RCxDQUFDO3dCQUNILENBQUM7b0JBQ0gsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sc0JBQXNCLENBQUM7SUFDaEMsQ0FBQztDQUNGO0FBbFNELGtDQWtTQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJhc2VLZXksXG4gIEJhc2VUcmFuc2FjdGlvbixcbiAgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsXG4gIFB1YmxpY0tleSBhcyBCYXNlUHVibGljS2V5LFxuICBTaWduYXR1cmUsXG4gIFRyYW5zYWN0aW9uVHlwZSBhcyBCaXRHb1RyYW5zYWN0aW9uVHlwZSxcbn0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IFN1aVByb2dyYW1tYWJsZVRyYW5zYWN0aW9uLCBTdWlUcmFuc2FjdGlvbiwgU3VpVHJhbnNhY3Rpb25UeXBlLCBUeERhdGEgfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgdXRpbHMsIHsgQXBwSWQsIEludGVudCwgSW50ZW50U2NvcGUsIEludGVudFZlcnNpb24sIGlzSW1tT3JPd25lZE9iaiB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgR2FzRGF0YSwgbm9ybWFsaXplU3VpQWRkcmVzcywgbm9ybWFsaXplU3VpT2JqZWN0SWQsIFN1aU9iamVjdFJlZiB9IGZyb20gJy4vbXlzdGVubGFiL3R5cGVzJztcbmltcG9ydCB7IFNJR05BVFVSRV9TQ0hFTUVfQllURVMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHsgZnJvbUI2NCwgdG9CNjQgfSBmcm9tICdAbXlzdGVuL2Jjcyc7XG5pbXBvcnQgYnM1OCBmcm9tICdiczU4JztcbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuL2tleVBhaXInO1xuaW1wb3J0IHsgVFJBTlNBQ1RJT05fREFUQV9NQVhfU0laRSwgVHJhbnNhY3Rpb25CbG9ja0RhdGFCdWlsZGVyIH0gZnJvbSAnLi9teXN0ZW5sYWIvYnVpbGRlci9UcmFuc2FjdGlvbkRhdGFCbG9jayc7XG5pbXBvcnQgeyBidWlsZGVyLCBNZXJnZUNvaW5zVHJhbnNhY3Rpb24sIFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJy4vbXlzdGVubGFiL2J1aWxkZXInO1xuaW1wb3J0IGJsYWtlMmIgZnJvbSAnQGJpdGdvL2JsYWtlMmInO1xuaW1wb3J0IHsgaGFzaFR5cGVkRGF0YSB9IGZyb20gJy4vbXlzdGVubGFiL2NyeXB0b2dyYXBoeS9oYXNoJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFRyYW5zYWN0aW9uPFQ+IGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uIHtcbiAgcHJvdGVjdGVkIF9zdWlUcmFuc2FjdGlvbjogU3VpVHJhbnNhY3Rpb248VD47XG4gIHByb3RlY3RlZCBfc2lnbmF0dXJlOiBTaWduYXR1cmU7XG4gIHByaXZhdGUgX3NlcmlhbGl6ZWRTaWc6IFVpbnQ4QXJyYXk7XG4gIHByb3RlY3RlZCBfZmVlUGF5ZXJTaWduYXR1cmU6IFNpZ25hdHVyZTtcbiAgcHJpdmF0ZSBfc2VyaWFsaXplZEZlZVBheWVyU2lnOiBVaW50OEFycmF5O1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihfY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihfY29pbkNvbmZpZyk7XG4gIH1cblxuICBnZXQgc3VpVHJhbnNhY3Rpb24oKTogU3VpVHJhbnNhY3Rpb248VD4ge1xuICAgIHJldHVybiB0aGlzLl9zdWlUcmFuc2FjdGlvbjtcbiAgfVxuXG4gIHNldFN1aVRyYW5zYWN0aW9uKHR4OiBTdWlUcmFuc2FjdGlvbjxUPik6IHZvaWQge1xuICAgIHRoaXMuX3N1aVRyYW5zYWN0aW9uID0gdHg7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKiovXG4gIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRhdGFCeXRlcyA9IHRoaXMuZ2V0RGF0YUJ5dGVzKCk7XG4gICAgY29uc3QgaGFzaCA9IGhhc2hUeXBlZERhdGEoJ1RyYW5zYWN0aW9uRGF0YScsIGRhdGFCeXRlcyk7XG4gICAgdGhpcy5faWQgPSBiczU4LmVuY29kZShoYXNoKTtcbiAgICByZXR1cm4gdGhpcy5faWQ7XG4gIH1cblxuICBhZGRTaWduYXR1cmUocHVibGljS2V5OiBCYXNlUHVibGljS2V5LCBzaWduYXR1cmU6IEJ1ZmZlcik6IHZvaWQge1xuICAgIHRoaXMuX3NpZ25hdHVyZXMucHVzaChzaWduYXR1cmUudG9TdHJpbmcoJ2hleCcpKTtcbiAgICB0aGlzLl9zaWduYXR1cmUgPSB7IHB1YmxpY0tleSwgc2lnbmF0dXJlIH07XG4gICAgdGhpcy5zZXJpYWxpemUoKTtcbiAgfVxuXG4gIGFkZEZlZVBheWVyU2lnbmF0dXJlKHB1YmxpY0tleTogQmFzZVB1YmxpY0tleSwgc2lnbmF0dXJlOiBCdWZmZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9zaWduYXR1cmVzLnB1c2goc2lnbmF0dXJlLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgdGhpcy5fZmVlUGF5ZXJTaWduYXR1cmUgPSB7IHB1YmxpY0tleSwgc2lnbmF0dXJlIH07XG4gICAgdGhpcy5zZXJpYWxpemUoKTtcbiAgfVxuXG4gIGdldCBzdWlTaWduYXR1cmUoKTogU2lnbmF0dXJlIHtcbiAgICByZXR1cm4gdGhpcy5fc2lnbmF0dXJlO1xuICB9XG5cbiAgZ2V0IHNlcmlhbGl6ZWRTaWcoKTogVWludDhBcnJheSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlcmlhbGl6ZWRTaWc7XG4gIH1cblxuICBnZXQgc2VyaWFsaXplZEZlZVBheWVyU2lnKCk6IFVpbnQ4QXJyYXkge1xuICAgIHJldHVybiB0aGlzLl9zZXJpYWxpemVkRmVlUGF5ZXJTaWc7XG4gIH1cblxuICBzZXRTZXJpYWxpemVkU2lnKHB1YmxpY0tleTogQmFzZVB1YmxpY0tleSwgc2lnbmF0dXJlOiBCdWZmZXIpOiB2b2lkIHtcbiAgICBjb25zdCBwdWJLZXkgPSBCdWZmZXIuZnJvbShwdWJsaWNLZXkucHViLCAnaGV4Jyk7XG4gICAgY29uc3Qgc2VyaWFsaXplZF9zaWcgPSBuZXcgVWludDhBcnJheSgxICsgc2lnbmF0dXJlLmxlbmd0aCArIHB1YktleS5sZW5ndGgpO1xuICAgIHNlcmlhbGl6ZWRfc2lnLnNldChTSUdOQVRVUkVfU0NIRU1FX0JZVEVTKTtcbiAgICBzZXJpYWxpemVkX3NpZy5zZXQoc2lnbmF0dXJlLCAxKTtcbiAgICBzZXJpYWxpemVkX3NpZy5zZXQocHViS2V5LCAxICsgc2lnbmF0dXJlLmxlbmd0aCk7XG4gICAgdGhpcy5fc2VyaWFsaXplZFNpZyA9IHNlcmlhbGl6ZWRfc2lnO1xuICB9XG5cbiAgc2V0U2VyaWFsaXplZEZlZVBheWVyU2lnKHB1YmxpY0tleTogQmFzZVB1YmxpY0tleSwgc2lnbmF0dXJlOiBCdWZmZXIpOiB2b2lkIHtcbiAgICBjb25zdCBwdWJLZXkgPSBCdWZmZXIuZnJvbShwdWJsaWNLZXkucHViLCAnaGV4Jyk7XG4gICAgY29uc3Qgc2VyaWFsaXplZF9zaWcgPSBuZXcgVWludDhBcnJheSgxICsgc2lnbmF0dXJlLmxlbmd0aCArIHB1YktleS5sZW5ndGgpO1xuICAgIHNlcmlhbGl6ZWRfc2lnLnNldChTSUdOQVRVUkVfU0NIRU1FX0JZVEVTKTtcbiAgICBzZXJpYWxpemVkX3NpZy5zZXQoc2lnbmF0dXJlLCAxKTtcbiAgICBzZXJpYWxpemVkX3NpZy5zZXQocHViS2V5LCAxICsgc2lnbmF0dXJlLmxlbmd0aCk7XG4gICAgdGhpcy5fc2VyaWFsaXplZEZlZVBheWVyU2lnID0gc2VyaWFsaXplZF9zaWc7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgY2FuU2lnbihrZXk6IEJhc2VLZXkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIHRoaXMgdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtLZXlQYWlyfSBzaWduZXIga2V5XG4gICAqL1xuXG4gIHNpZ24oc2lnbmVyOiBLZXlQYWlyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zdWlUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdlbXB0eSB0cmFuc2FjdGlvbiB0byBzaWduJyk7XG4gICAgfVxuXG4gICAgY29uc3QgaW50ZW50TWVzc2FnZSA9IHRoaXMuc2lnbmFibGVQYXlsb2FkO1xuICAgIGNvbnN0IHNpZ25hdHVyZSA9IHNpZ25lci5zaWduTWVzc2FnZWluVWludDhBcnJheShpbnRlbnRNZXNzYWdlKTtcblxuICAgIHRoaXMuc2V0U2VyaWFsaXplZFNpZyh7IHB1Yjogc2lnbmVyLmdldEtleXMoKS5wdWIgfSwgQnVmZmVyLmZyb20oc2lnbmF0dXJlKSk7XG4gICAgdGhpcy5hZGRTaWduYXR1cmUoeyBwdWI6IHNpZ25lci5nZXRLZXlzKCkucHViIH0sIEJ1ZmZlci5mcm9tKHNpZ25hdHVyZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gdHJhbnNhY3Rpb24gYXMgdGhlIGdhcyBvd25lciAoZmVlIHBheWVyKS5cbiAgICpcbiAgICogQHBhcmFtIHtLZXlQYWlyfSBvd25lcktleSAtIEtleSBmb3IgZ2FzIG93bmVyLlxuICAgKi9cbiAgc2lnbkFzRmVlUGF5ZXIoc2lnbmVyOiBLZXlQYWlyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zdWlUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdlbXB0eSB0cmFuc2FjdGlvbiB0byBzaWduJyk7XG4gICAgfVxuXG4gICAgY29uc3QgaW50ZW50TWVzc2FnZSA9IHRoaXMuc2lnbmFibGVQYXlsb2FkO1xuICAgIGNvbnN0IHNpZ25hdHVyZSA9IHNpZ25lci5zaWduTWVzc2FnZWluVWludDhBcnJheShpbnRlbnRNZXNzYWdlKTtcblxuICAgIHRoaXMuX2ZlZVBheWVyU2lnbmF0dXJlID0ge1xuICAgICAgcHVibGljS2V5OiB7IHB1Yjogc2lnbmVyLmdldEtleXMoKS5wdWIgfSxcbiAgICAgIHNpZ25hdHVyZTogQnVmZmVyLmZyb20oc2lnbmF0dXJlKSxcbiAgICB9O1xuXG4gICAgLy8gU2V0IHNlcmlhbGl6ZWQgc2lnbmF0dXJlIGZvciBmZWUgcGF5ZXJcbiAgICB0aGlzLnNldFNlcmlhbGl6ZWRGZWVQYXllclNpZyh7IHB1Yjogc2lnbmVyLmdldEtleXMoKS5wdWIgfSwgQnVmZmVyLmZyb20oc2lnbmF0dXJlKSk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdG9Ccm9hZGNhc3RGb3JtYXQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuX3N1aVRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZSgpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGFic3RyYWN0IHRvSnNvbigpOiBUeERhdGE7XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdHJhbnNhY3Rpb24gdHlwZS5cbiAgICpcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvblR5cGV9IHRyYW5zYWN0aW9uVHlwZSBUaGUgdHJhbnNhY3Rpb24gdHlwZSB0byBiZSBzZXQuXG4gICAqL1xuICB0cmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb25UeXBlOiBCaXRHb1RyYW5zYWN0aW9uVHlwZSk6IHZvaWQge1xuICAgIHRoaXMuX3R5cGUgPSB0cmFuc2FjdGlvblR5cGU7XG4gIH1cblxuICAvKipcbiAgICogIGdldCB0aGUgY29ycmVjdCB0eERhdGEgd2l0aCB0cmFuc2FjdGlvbiB0eXBlXG4gICAqL1xuICBhYnN0cmFjdCBnZXRUeERhdGEoKTogVHhEYXRhO1xuXG4gIC8qKlxuICAgKiBMb2FkIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEgb24gdGhpcyB0cmFuc2FjdGlvbi5cbiAgICovXG4gIGFic3RyYWN0IGxvYWRJbnB1dHNBbmRPdXRwdXRzKCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhpcyB0cmFuc2FjdGlvbiBwYXlsb2FkXG4gICAqXG4gICAqIEBwYXJhbSByYXdUcmFuc2FjdGlvblxuICAgKi9cbiAgYWJzdHJhY3QgZnJvbVJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiB2b2lkO1xuXG4gIGdldERhdGFCeXRlcygpOiBVaW50OEFycmF5IHtcbiAgICBjb25zdCB0eERhdGEgPSB0aGlzLmdldFR4RGF0YSgpO1xuICAgIGNvbnN0IHR4U2VyID0gYnVpbGRlci5zZXIoJ1RyYW5zYWN0aW9uRGF0YScsIHsgVjE6IHR4RGF0YSB9LCB7IG1heFNpemU6IFRSQU5TQUNUSU9OX0RBVEFfTUFYX1NJWkUgfSk7XG4gICAgcmV0dXJuIHR4U2VyLnRvQnl0ZXMoKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBnZXQgc2lnbmFibGVQYXlsb2FkKCk6IEJ1ZmZlciB7XG4gICAgY29uc3QgZGF0YUJ5dGVzID0gdGhpcy5nZXREYXRhQnl0ZXMoKTtcbiAgICBjb25zdCBpbnRlbnRNZXNzYWdlID0gdGhpcy5tZXNzYWdlV2l0aEludGVudChJbnRlbnRTY29wZS5UcmFuc2FjdGlvbkRhdGEsIGRhdGFCeXRlcyk7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGJsYWtlMmIoMzIpLnVwZGF0ZShpbnRlbnRNZXNzYWdlKS5kaWdlc3QoJ2JpbmFyeScpKTtcbiAgfVxuXG4gIHByaXZhdGUgbWVzc2FnZVdpdGhJbnRlbnQoc2NvcGU6IEludGVudFNjb3BlLCBtZXNzYWdlOiBVaW50OEFycmF5KSB7XG4gICAgY29uc3QgaW50ZW50ID0gdGhpcy5pbnRlbnRXaXRoU2NvcGUoc2NvcGUpO1xuICAgIGNvbnN0IGludGVudE1lc3NhZ2UgPSBuZXcgVWludDhBcnJheShpbnRlbnQubGVuZ3RoICsgbWVzc2FnZS5sZW5ndGgpO1xuICAgIGludGVudE1lc3NhZ2Uuc2V0KGludGVudCk7XG4gICAgaW50ZW50TWVzc2FnZS5zZXQobWVzc2FnZSwgaW50ZW50Lmxlbmd0aCk7XG4gICAgcmV0dXJuIGludGVudE1lc3NhZ2U7XG4gIH1cblxuICBwcml2YXRlIGludGVudFdpdGhTY29wZShzY29wZTogSW50ZW50U2NvcGUpOiBJbnRlbnQge1xuICAgIHJldHVybiBbc2NvcGUsIEludGVudFZlcnNpb24uVjAsIEFwcElkLlN1aV07XG4gIH1cblxuICBzZXJpYWxpemUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYXRhQnl0ZXMgPSB0aGlzLmdldERhdGFCeXRlcygpO1xuICAgIHRoaXMuX2lkID0gYnM1OC5lbmNvZGUoaGFzaFR5cGVkRGF0YSgnVHJhbnNhY3Rpb25EYXRhJywgZGF0YUJ5dGVzKSk7XG4gICAgcmV0dXJuIHRvQjY0KGRhdGFCeXRlcyk7XG4gIH1cblxuICBzdGF0aWMgZGVzZXJpYWxpemVTdWlUcmFuc2FjdGlvbihzZXJpYWxpemVkVHg6IHN0cmluZyk6IFN1aVRyYW5zYWN0aW9uPFN1aVByb2dyYW1tYWJsZVRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgZGF0YSA9IGZyb21CNjQoc2VyaWFsaXplZFR4KTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbkJsb2NrID0gVHJhbnNhY3Rpb25CbG9ja0RhdGFCdWlsZGVyLmZyb21CeXRlcyhkYXRhKTtcbiAgICBjb25zdCBpbnB1dHMgPSB0cmFuc2FjdGlvbkJsb2NrLmlucHV0cy5tYXAoKHR4SW5wdXQpID0+IHR4SW5wdXQudmFsdWUpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9ucyA9IHRyYW5zYWN0aW9uQmxvY2sudHJhbnNhY3Rpb25zO1xuICAgIGNvbnN0IHR4VHlwZSA9IHRoaXMuZ2V0U3VpVHJhbnNhY3Rpb25UeXBlKHRyYW5zYWN0aW9ucyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0cmFuc2FjdGlvbkJsb2NrLmdldERpZ2VzdCgpLFxuICAgICAgdHlwZTogdHhUeXBlLFxuICAgICAgc2VuZGVyOiBub3JtYWxpemVTdWlBZGRyZXNzKHRyYW5zYWN0aW9uQmxvY2suc2VuZGVyISksXG4gICAgICB0eDoge1xuICAgICAgICBpbnB1dHM6IGlucHV0cyxcbiAgICAgICAgdHJhbnNhY3Rpb25zOiB0cmFuc2FjdGlvbnMsXG4gICAgICB9LFxuICAgICAgZ2FzRGF0YToge1xuICAgICAgICBwYXltZW50OiB0aGlzLm5vcm1hbGl6ZUNvaW5zKHRyYW5zYWN0aW9uQmxvY2suZ2FzQ29uZmlnLnBheW1lbnQhKSxcbiAgICAgICAgb3duZXI6IG5vcm1hbGl6ZVN1aUFkZHJlc3ModHJhbnNhY3Rpb25CbG9jay5nYXNDb25maWcub3duZXIhKSxcbiAgICAgICAgcHJpY2U6IE51bWJlcih0cmFuc2FjdGlvbkJsb2NrLmdhc0NvbmZpZy5wcmljZSBhcyBzdHJpbmcpLFxuICAgICAgICBidWRnZXQ6IE51bWJlcih0cmFuc2FjdGlvbkJsb2NrLmdhc0NvbmZpZy5idWRnZXQgYXMgc3RyaW5nKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldFN1aVRyYW5zYWN0aW9uVHlwZSh0cmFuc2FjdGlvbnM6IFRyYW5zYWN0aW9uVHlwZVtdKTogU3VpVHJhbnNhY3Rpb25UeXBlIHtcbiAgICAvLyB0cmlja3kgdG8gZGV0ZXJtaW5lIGN1c3RvbSB0eCBwdXJlbHkgZnJvbSBhIHNlcmlhbGl6ZWQgdHgsIHdlIGNhbiByZWx5IG9uIGZvbGxvd2luZyBsb2dpY1xuICAgIGlmICh0cmFuc2FjdGlvbnMubGVuZ3RoID09IDEpIHtcbiAgICAgIHJldHVybiB1dGlscy5nZXRTdWlUcmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb25zWzBdKTtcbiAgICB9XG4gICAgaWYgKHRyYW5zYWN0aW9ucy5zb21lKCh0eCkgPT4gdXRpbHMuZ2V0U3VpVHJhbnNhY3Rpb25UeXBlKHR4KSA9PT0gU3VpVHJhbnNhY3Rpb25UeXBlLldhbHJ1c1N0YWtlV2l0aFBvb2wpKSB7XG4gICAgICByZXR1cm4gU3VpVHJhbnNhY3Rpb25UeXBlLldhbHJ1c1N0YWtlV2l0aFBvb2w7XG4gICAgfVxuICAgIGlmICh0cmFuc2FjdGlvbnMuc29tZSgodHgpID0+IHV0aWxzLmdldFN1aVRyYW5zYWN0aW9uVHlwZSh0eCkgPT09IFN1aVRyYW5zYWN0aW9uVHlwZS5XYWxydXNSZXF1ZXN0V2l0aGRyYXdTdGFrZSkpIHtcbiAgICAgIHJldHVybiBTdWlUcmFuc2FjdGlvblR5cGUuV2FscnVzUmVxdWVzdFdpdGhkcmF3U3Rha2U7XG4gICAgfVxuICAgIGlmICh0cmFuc2FjdGlvbnMuc29tZSgodHgpID0+IHV0aWxzLmdldFN1aVRyYW5zYWN0aW9uVHlwZSh0eCkgPT09IFN1aVRyYW5zYWN0aW9uVHlwZS5XYWxydXNXaXRoZHJhd1N0YWtlKSkge1xuICAgICAgcmV0dXJuIFN1aVRyYW5zYWN0aW9uVHlwZS5XYWxydXNXaXRoZHJhd1N0YWtlO1xuICAgIH1cbiAgICBpZiAodHJhbnNhY3Rpb25zLnNvbWUoKHR4KSA9PiB1dGlscy5nZXRTdWlUcmFuc2FjdGlvblR5cGUodHgpID09PSBTdWlUcmFuc2FjdGlvblR5cGUuQWRkU3Rha2UpKSB7XG4gICAgICByZXR1cm4gU3VpVHJhbnNhY3Rpb25UeXBlLkFkZFN0YWtlO1xuICAgIH1cbiAgICBpZiAodHJhbnNhY3Rpb25zLnNvbWUoKHR4KSA9PiB1dGlscy5nZXRTdWlUcmFuc2FjdGlvblR5cGUodHgpID09PSBTdWlUcmFuc2FjdGlvblR5cGUuV2l0aGRyYXdTdGFrZSkpIHtcbiAgICAgIHJldHVybiBTdWlUcmFuc2FjdGlvblR5cGUuV2l0aGRyYXdTdGFrZTtcbiAgICB9XG4gICAgaWYgKHRyYW5zYWN0aW9ucy5zb21lKCh0eCkgPT4gdXRpbHMuZ2V0U3VpVHJhbnNhY3Rpb25UeXBlKHR4KSA9PT0gU3VpVHJhbnNhY3Rpb25UeXBlLlRva2VuVHJhbnNmZXIpKSB7XG4gICAgICByZXR1cm4gU3VpVHJhbnNhY3Rpb25UeXBlLlRva2VuVHJhbnNmZXI7XG4gICAgfVxuICAgIGlmICh0cmFuc2FjdGlvbnMuZXZlcnkoKHR4KSA9PiB1dGlscy5nZXRTdWlUcmFuc2FjdGlvblR5cGUodHgpID09PSBTdWlUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXIpKSB7XG4gICAgICByZXR1cm4gU3VpVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyO1xuICAgIH1cblxuICAgIHJldHVybiBTdWlUcmFuc2FjdGlvblR5cGUuQ3VzdG9tVHg7XG4gIH1cblxuICBzdGF0aWMgZ2V0UHJvcGVyR2FzRGF0YShrOiBhbnkpOiBHYXNEYXRhIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGF5bWVudDogW3RoaXMubm9ybWFsaXplU3VpT2JqZWN0UmVmKGsuZ2FzRGF0YS5wYXltZW50KV0sXG4gICAgICBvd25lcjogdXRpbHMubm9ybWFsaXplSGV4SWQoay5nYXNEYXRhLm93bmVyKSxcbiAgICAgIHByaWNlOiBOdW1iZXIoay5nYXNEYXRhLnByaWNlKSxcbiAgICAgIGJ1ZGdldDogTnVtYmVyKGsuZ2FzRGF0YS5idWRnZXQpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBub3JtYWxpemVDb2lucyhjb2luczogYW55W10pOiBTdWlPYmplY3RSZWZbXSB7XG4gICAgcmV0dXJuIGNvaW5zLm1hcCgoY29pbikgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplU3VpT2JqZWN0UmVmKGNvaW4pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgbm9ybWFsaXplU3VpT2JqZWN0UmVmKG9iajogU3VpT2JqZWN0UmVmKTogU3VpT2JqZWN0UmVmIHtcbiAgICByZXR1cm4ge1xuICAgICAgb2JqZWN0SWQ6IG5vcm1hbGl6ZVN1aU9iamVjdElkKG9iai5vYmplY3RJZCksXG4gICAgICB2ZXJzaW9uOiBOdW1iZXIob2JqLnZlcnNpb24pLFxuICAgICAgZGlnZXN0OiBvYmouZGlnZXN0LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogV2hlbiBidWlsZGluZyB0cmFuc2FjdGlvbnMgd2l0aCA+IDI1NSBpbnB1dCBnYXMgcGF5bWVudCBvYmplY3RzLCB3ZSBmaXJzdCB1c2UgTWVyZ2VDb2lucyBUcmFuYXNhY3Rpb25zIHRvIG1lcmdlIHRoZVxuICAgKiBhZGRpdGlvbmFsIGlucHV0cyBpbnRvIHRoZSBnYXMgY29pbiAmIHNsaWNlIHRoZW0gZnJvbSB0aGUgcGF5bWVudCBpbiBnYXNEYXRhLiBXaGVuIGluaXRpYWxpemluZyB0aGUgYnVpbGRlciB1c2luZ1xuICAgKiBkZWNvZGVkIHR4IGRhdGEsIHdlIG5lZWQgdG8gZ2V0IHRoZXNlIGlucHV0cyBmcm9tIE1lcmdlQ29pbnMgJiBhZGQgdGhlbSBiYWNrIHRvIHRoZSBnYXMgcGF5bWVudCB0byBiZSBhYmxlIHRvXG4gICAqIHJlYnVpbGQgZnJvbSBhIHJhdyB0cmFuc2FjdGlvbi5cbiAgICovXG4gIHByb3RlY3RlZCBnZXRJbnB1dEdhc1BheW1lbnRPYmplY3RzRnJvbVR4KHR4OiBTdWlQcm9ncmFtbWFibGVUcmFuc2FjdGlvbik6IFN1aU9iamVjdFJlZltdIHtcbiAgICBjb25zdCB0eElucHV0cyA9IHR4LmlucHV0cztcbiAgICBjb25zdCB0cmFuc2FjdGlvbnMgPSB0eC50cmFuc2FjdGlvbnM7XG4gICAgY29uc3QgaW5wdXRHYXNQYXltZW50T2JqZWN0czogU3VpT2JqZWN0UmVmW10gPSBbXTtcblxuICAgIHRyYW5zYWN0aW9ucy5mb3JFYWNoKCh0cmFuc2FjdGlvbikgPT4ge1xuICAgICAgaWYgKHRyYW5zYWN0aW9uLmtpbmQgPT09ICdNZXJnZUNvaW5zJykge1xuICAgICAgICBjb25zdCB7IGRlc3RpbmF0aW9uLCBzb3VyY2VzIH0gPSB0cmFuc2FjdGlvbiBhcyBNZXJnZUNvaW5zVHJhbnNhY3Rpb247XG4gICAgICAgIGlmIChkZXN0aW5hdGlvbi5raW5kID09PSAnR2FzQ29pbicpIHtcbiAgICAgICAgICBzb3VyY2VzLmZvckVhY2goKHNvdXJjZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHNvdXJjZS5raW5kID09PSAnSW5wdXQnKSB7XG4gICAgICAgICAgICAgIGxldCBpbnB1dCA9IHR4SW5wdXRzW3NvdXJjZS5pbmRleF07XG4gICAgICAgICAgICAgIGlmICgndmFsdWUnIGluIGlucHV0KSB7XG4gICAgICAgICAgICAgICAgaW5wdXQgPSBpbnB1dC52YWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoJ09iamVjdCcgaW4gaW5wdXQgJiYgaXNJbW1Pck93bmVkT2JqKGlucHV0Lk9iamVjdCkpIHtcbiAgICAgICAgICAgICAgICBpbnB1dEdhc1BheW1lbnRPYmplY3RzLnB1c2goaW5wdXQuT2JqZWN0LkltbU9yT3duZWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBpbnB1dEdhc1BheW1lbnRPYmplY3RzO1xuICB9XG59XG4iXX0=Выполнить команду
Для локальной разработки. Не используйте в интернете!