PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-coin-ton/dist/test/unit
Просмотр файла: singleNominatorWithdrawBuilder.js
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const should_1 = __importDefault(require("should"));
const sdk_core_1 = require("@bitgo/sdk-core");
const transactionBuilderFactory_1 = require("../../src/lib/transactionBuilderFactory");
const statics_1 = require("@bitgo/statics");
const testData = __importStar(require("../resources/ton"));
const keyPair_1 = require("../../src/lib/keyPair");
const utils = __importStar(require("../../src/lib/utils"));
const tonweb_1 = __importDefault(require("tonweb"));
describe('Ton Single Nominator Withdraw Builder', () => {
const factory = new transactionBuilderFactory_1.TransactionBuilderFactory(statics_1.coins.get('tton'));
const singleNominatorWithdrawAmount = '932178112330000';
it('should build a unsigned withdraw tx', async function () {
const txId = 'n1rr-QL61WZ7UJN7ESH2iPQO7toTy9WLqXoSIG1JtXg='.replace(/\//g, '_').replace(/\+/g, '-');
const txBuilder = factory.getSingleNominatorWithdrawBuilder();
txBuilder.sender(testData.sender.address);
txBuilder.sequenceNumber(0);
txBuilder.publicKey(testData.sender.publicKey);
txBuilder.expireTime(1234567890);
txBuilder.send(testData.recipients[0]);
txBuilder.setWithdrawAmount(singleNominatorWithdrawAmount);
txBuilder.setWithdrawMessage();
const tx = await txBuilder.build();
should_1.default.equal(tx.type, sdk_core_1.TransactionType.SingleNominatorWithdraw);
should_1.default.equal(tx.toJson().bounceable, false);
should_1.default.equal(tx.toJson().withdrawAmount, singleNominatorWithdrawAmount);
tx.inputs.length.should.equal(1);
tx.inputs[0].should.deepEqual({
address: testData.sender.address,
value: testData.recipients[0].amount,
coin: 'tton',
});
tx.outputs.length.should.equal(1);
tx.outputs[0].should.deepEqual({
address: testData.recipients[0].address,
value: testData.recipients[0].amount,
coin: 'tton',
});
tx.id.should.equal(txId);
const rawTx = tx.toBroadcastFormat();
factory.from(rawTx);
rawTx.should.equal('te6cckECGAEAA8MAAuGIADZN0H0n1tz6xkYgWqJSRmkURKYajjEgXeawBo9cifPIGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACmpoxdJlgLSAAAAAAADgEXAgE0AhYBFP8A9KQT9LzyyAsDAgEgBBECAUgFCALm0AHQ0wMhcbCSXwTgItdJwSCSXwTgAtMfIYIQcGx1Z70ighBkc3RyvbCSXwXgA/pAMCD6RAHIygfL/8nQ7UTQgQFA1yH0BDBcgQEI9ApvoTGzkl8H4AXTP8glghBwbHVnupI4MOMNA4IQZHN0crqSXwbjDQYHAHgB+gD0BDD4J28iMFAKoSG+8uBQghBwbHVngx6xcIAYUATLBSbPFlj6Ahn0AMtpF8sfUmDLPyDJgED7AAYAilAEgQEI9Fkw7UTQgQFA1yDIAc8W9ADJ7VQBcrCOI4IQZHN0coMesXCAGFAFywVQA88WI/oCE8tqyx/LP8mAQPsAkl8D4gIBIAkQAgEgCg8CAVgLDAA9sp37UTQgQFA1yH0BDACyMoHy//J0AGBAQj0Cm+hMYAIBIA0OABmtznaiaEAga5Drhf/AABmvHfaiaEAQa5DrhY/AABG4yX7UTQ1wsfgAWb0kK29qJoQICga5D6AhhHDUCAhHpJN9KZEM5pA+n/mDeBKAG3gQFImHFZ8xhAT48oMI1xgg0x/TH9MfAvgju/Jk7UTQ0x/TH9P/9ATRUUO68qFRUbryogX5AVQQZPkQ8qP4ACSkyMsfUkDLH1Iwy/9SEPQAye1U+A8B0wchwACfbFGTINdKltMH1AL7AOgw4CHAAeMAIcAC4wABwAORMOMNA6TIyx8Syx/L/xITFBUAbtIH+gDU1CL5AAXIygcVy//J0Hd0gBjIywXLAiLPFlAF+gIUy2sSzMzJc/sAyEAUgQEI9FHypwIAcIEBCNcY+gDTP8hUIEeBAQj0UfKnghBub3RlcHSAGMjLBcsCUAbPFlAE+gIUy2oSyx/LP8lz+wACAGyBAQjXGPoA0z8wUiSBAQj0WfKnghBkc3RycHSAGMjLBcsCUAXPFlAD+gITy2rLHxLLP8lz+wAACvQAye1UAFEAAAAAKamjF8DDudwJkyEh7jUbJEjFCjriVxsSlRJFyF872V1eegb4QACPQgAaRefBOjTi/hwqDjv+7I6nGj9WEAe3ls/rFuBEQvggr6A613oAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAHA0/PoUC5EIEyWuPg==');
});
it('should build a unsigned withdraw tx with bounceable flag', async function () {
const txId = 'YS3RFHZx_SKyanFNjGlvtDmx6I02deAQUJUSyVP9rag='.replace(/\//g, '_').replace(/\+/g, '-');
const txBuilder = factory.getSingleNominatorWithdrawBuilder();
txBuilder.sender(testData.sender.address);
txBuilder.sequenceNumber(0);
txBuilder.publicKey(testData.sender.publicKey);
txBuilder.expireTime(1234567890);
txBuilder.send(testData.recipients[0]);
txBuilder.setWithdrawAmount(singleNominatorWithdrawAmount);
txBuilder.setWithdrawMessage();
txBuilder.bounceable(true);
const tx = await txBuilder.build();
should_1.default.equal(tx.type, sdk_core_1.TransactionType.SingleNominatorWithdraw);
should_1.default.equal(tx.toJson().bounceable, true);
should_1.default.equal(tx.toJson().withdrawAmount, singleNominatorWithdrawAmount);
tx.inputs.length.should.equal(1);
tx.inputs[0].should.deepEqual({
address: testData.sender.address,
value: testData.recipients[0].amount,
coin: 'tton',
});
tx.outputs.length.should.equal(1);
tx.outputs[0].should.deepEqual({
address: testData.recipients[0].address,
value: testData.recipients[0].amount,
coin: 'tton',
});
tx.id.should.equal(txId);
const rawTx = tx.toBroadcastFormat();
rawTx.should.equal('te6cckECGAEAA8MAAuGIADZN0H0n1tz6xkYgWqJSRmkURKYajjEgXeawBo9cifPIGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACmpoxdJlgLSAAAAAAADgEXAgE0AhYBFP8A9KQT9LzyyAsDAgEgBBECAUgFCALm0AHQ0wMhcbCSXwTgItdJwSCSXwTgAtMfIYIQcGx1Z70ighBkc3RyvbCSXwXgA/pAMCD6RAHIygfL/8nQ7UTQgQFA1yH0BDBcgQEI9ApvoTGzkl8H4AXTP8glghBwbHVnupI4MOMNA4IQZHN0crqSXwbjDQYHAHgB+gD0BDD4J28iMFAKoSG+8uBQghBwbHVngx6xcIAYUATLBSbPFlj6Ahn0AMtpF8sfUmDLPyDJgED7AAYAilAEgQEI9Fkw7UTQgQFA1yDIAc8W9ADJ7VQBcrCOI4IQZHN0coMesXCAGFAFywVQA88WI/oCE8tqyx/LP8mAQPsAkl8D4gIBIAkQAgEgCg8CAVgLDAA9sp37UTQgQFA1yH0BDACyMoHy//J0AGBAQj0Cm+hMYAIBIA0OABmtznaiaEAga5Drhf/AABmvHfaiaEAQa5DrhY/AABG4yX7UTQ1wsfgAWb0kK29qJoQICga5D6AhhHDUCAhHpJN9KZEM5pA+n/mDeBKAG3gQFImHFZ8xhAT48oMI1xgg0x/TH9MfAvgju/Jk7UTQ0x/TH9P/9ATRUUO68qFRUbryogX5AVQQZPkQ8qP4ACSkyMsfUkDLH1Iwy/9SEPQAye1U+A8B0wchwACfbFGTINdKltMH1AL7AOgw4CHAAeMAIcAC4wABwAORMOMNA6TIyx8Syx/L/xITFBUAbtIH+gDU1CL5AAXIygcVy//J0Hd0gBjIywXLAiLPFlAF+gIUy2sSzMzJc/sAyEAUgQEI9FHypwIAcIEBCNcY+gDTP8hUIEeBAQj0UfKnghBub3RlcHSAGMjLBcsCUAbPFlAE+gIUy2oSyx/LP8lz+wACAGyBAQjXGPoA0z8wUiSBAQj0WfKnghBkc3RycHSAGMjLBcsCUAXPFlAD+gITy2rLHxLLP8lz+wAACvQAye1UAFEAAAAAKamjF8DDudwJkyEh7jUbJEjFCjriVxsSlRJFyF872V1eegb4QACPYgAaRefBOjTi/hwqDjv+7I6nGj9WEAe3ls/rFuBEQvggr6A613oAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAHA0/PoUC5EIBDddHQ==');
});
it('should build a withdraw from rawTx', async function () {
const txBuilder = factory.from(testData.signedSingleNominatorWithdrawTransaction.tx);
const builtTx = await txBuilder.build();
const jsonTx = builtTx.toJson();
should_1.default.equal(builtTx.type, sdk_core_1.TransactionType.SingleNominatorWithdraw);
should_1.default.equal(builtTx.signablePayload.toString('base64'), testData.signedSingleNominatorWithdrawTransaction.signable);
should_1.default.equal(builtTx.id, testData.signedSingleNominatorWithdrawTransaction.txId);
const builder2 = factory.from(builtTx.toBroadcastFormat());
const builtTx2 = await builder2.build();
should_1.default.equal(builtTx2.type, sdk_core_1.TransactionType.SingleNominatorWithdraw);
should_1.default.equal(builtTx.toBroadcastFormat(), testData.signedSingleNominatorWithdrawTransaction.tx);
builtTx.inputs.length.should.equal(1);
builtTx.outputs.length.should.equal(1);
jsonTx.sender.should.equal('EQAbJug-k-tufWMjEC1RKSM0iiJTDUcYkC7zWANHrkT55Fol');
jsonTx.destination.should.equal('EQA0i8-CdGnF_DhUHHf92R1ONH6sIA9vLZ_WLcCIhfBBXwtG');
jsonTx.amount.should.equal('123400000');
jsonTx.seqno.should.equal(0);
jsonTx.expirationTime.should.equal(1234567890);
jsonTx.withdrawAmount.should.equal(singleNominatorWithdrawAmount);
const builtTx3 = await txBuilder.bounceable(false).fromAddressBounceable(false).toAddressBounceable(false).build();
txBuilder.from(testData.signedSingleNominatorWithdrawTransaction.tx);
const jsonTx3 = builtTx3.toJson();
should_1.default.equal(jsonTx3.bounceable, false);
should_1.default.equal(builtTx3.signablePayload.toString('base64'), testData.signedSingleNominatorWithdrawTransaction.bounceableSignable);
should_1.default.equal(builtTx3.id, testData.signedSingleNominatorWithdrawTransaction.txIdBounceable);
should_1.default.equal(builtTx3.toBroadcastFormat(), testData.signedSingleNominatorWithdrawTransaction.tx);
jsonTx3.sender.should.equal('UQAbJug-k-tufWMjEC1RKSM0iiJTDUcYkC7zWANHrkT55Afg');
jsonTx3.destination.should.equal('UQA0i8-CdGnF_DhUHHf92R1ONH6sIA9vLZ_WLcCIhfBBX1aD');
jsonTx3.amount.should.equal('123400000');
jsonTx3.seqno.should.equal(0);
jsonTx3.expirationTime.should.equal(1234567890);
jsonTx.withdrawAmount.should.equal(singleNominatorWithdrawAmount);
});
it('should parse a raw transaction and set flags', async function () {
const factory = new transactionBuilderFactory_1.TransactionBuilderFactory(statics_1.coins.get('tton'));
const txBuilder = factory.from(testData.signedSingleNominatorWithdrawTransaction.tx);
const txBuilderBounceable = factory.from(testData.signedSingleNominatorWithdrawTransaction.txBounceable);
const tx = await txBuilder.build();
const txBounceable = await txBuilderBounceable.build();
tx.toJson().bounceable.should.equal(false);
should_1.default.equal(tx.toJson().withdrawAmount, singleNominatorWithdrawAmount);
txBounceable.toJson().bounceable.should.equal(true);
should_1.default.equal(txBounceable.toJson().withdrawAmount, singleNominatorWithdrawAmount);
});
xit('should build a signed withdraw tx and submit onchain', async function () {
const tonweb = new tonweb_1.default(new tonweb_1.default.HttpProvider('https://testnet.toncenter.com/api/v2/jsonRPC'));
const keyPair = new keyPair_1.KeyPair({ prv: testData.privateKeys.prvKey1 });
const publicKey = keyPair.getKeys().pub;
const address = await utils.default.getAddressFromPublicKey(publicKey);
const txBuilder = factory.getSingleNominatorWithdrawBuilder();
txBuilder.sender(address);
const WalletClass = tonweb.wallet.all['v4R2'];
const wallet = new WalletClass(tonweb.provider, {
publicKey: tonweb.utils.hexToBytes(publicKey),
wc: 0,
});
const seqno = await wallet.methods.seqno().call();
txBuilder.sequenceNumber(seqno);
txBuilder.publicKey(publicKey);
const expireAt = Math.floor(Date.now() / 1e3) + 60 * 60 * 24 * 7; // 7 days
txBuilder.expireTime(expireAt);
txBuilder.send({
address: 'kf9vYg5iDMPiOpv9ypv9_B7pwYee4wjcQ0SHLpN9V65YF_Ig',
amount: '100000000',
});
txBuilder.setWithdrawAmount('1');
txBuilder.setWithdrawMessage();
const tx = await txBuilder.build();
should_1.default.equal(tx.type, sdk_core_1.TransactionType.SingleNominatorWithdraw);
const signable = tx.signablePayload;
const signature = keyPair.signMessageinUint8Array(signable);
const signedTx = await txBuilder.build();
const builder2 = factory.from(signedTx.toBroadcastFormat());
builder2.addSignature(keyPair.getKeys(), Buffer.from(signature));
const tx2 = await builder2.build();
const signature2 = keyPair.signMessageinUint8Array(tx2.signablePayload);
should_1.default.equal(Buffer.from(signature).toString('hex'), Buffer.from(signature2).toString('hex'));
await new Promise((resolve) => setTimeout(resolve, 2000));
const result = await tonweb.provider.sendBoc(tx2.toBroadcastFormat());
console.log(result);
});
it('should build a signed withdraw tx using add signature', async function () {
const keyPair = new keyPair_1.KeyPair({ prv: testData.privateKeys.prvKey1 });
const publicKey = keyPair.getKeys().pub;
const address = await utils.default.getAddressFromPublicKey(publicKey);
const txBuilder = factory.getSingleNominatorWithdrawBuilder();
txBuilder.sender(address);
txBuilder.sequenceNumber(0);
txBuilder.publicKey(publicKey);
const expireAt = Math.floor(Date.now() / 1e3) + 60 * 60 * 24 * 7;
txBuilder.expireTime(expireAt);
txBuilder.send(testData.recipients[0]);
txBuilder.setWithdrawAmount('1');
txBuilder.setWithdrawMessage();
const tx = await txBuilder.build();
should_1.default.equal(tx.type, sdk_core_1.TransactionType.SingleNominatorWithdraw);
const signable = tx.signablePayload;
const signature = keyPair.signMessageinUint8Array(signable);
txBuilder.addSignature(keyPair.getKeys(), Buffer.from(signature));
const signedTx = await txBuilder.build();
const builder2 = factory.from(signedTx.toBroadcastFormat());
const tx2 = await builder2.build();
const signature2 = keyPair.signMessageinUint8Array(tx2.signablePayload);
should_1.default.equal(Buffer.from(signature).toString('hex'), Buffer.from(signature2).toString('hex'));
should_1.default.equal(tx.toBroadcastFormat(), tx2.toBroadcastFormat());
});
it('should build withdraw tx for non-bounceable address', async function () {
const txBuilder = factory.getSingleNominatorWithdrawBuilder();
txBuilder.sender(testData.sender.address);
txBuilder.sequenceNumber(0);
txBuilder.publicKey(testData.sender.publicKey);
txBuilder.expireTime(1234567890);
const address = 'EQAWzEKcdnykvXfUNouqdS62tvrp32bCxuKS6eQrS6ISgcLo';
const otherFormat = 'UQAWzEKcdnykvXfUNouqdS62tvrp32bCxuKS6eQrS6ISgZ8t';
const amount = '100000000';
txBuilder.send({ address, amount });
txBuilder.setWithdrawAmount(singleNominatorWithdrawAmount);
txBuilder.setWithdrawMessage();
const tx = await txBuilder.build();
should_1.default.equal(tx.type, sdk_core_1.TransactionType.SingleNominatorWithdraw);
tx.inputs.length.should.equal(1);
tx.inputs[0].should.deepEqual({
address: testData.sender.address,
value: amount,
coin: 'tton',
});
tx.outputs.length.should.equal(1);
tx.outputs[0].should.deepEqual({
address,
value: amount,
coin: 'tton',
});
const txJson = tx.toJson();
txJson.destination.should.equal(address);
should_1.default.equal(tx.toJson().withdrawAmount, singleNominatorWithdrawAmount);
const builder2 = factory.from(tx.toBroadcastFormat());
const tx2 = await builder2.build();
const txJson2 = tx2.toJson();
txJson2.destinationAlias.should.equal(otherFormat);
should_1.default.equal(tx.toJson().withdrawAmount, singleNominatorWithdrawAmount);
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luZ2xlTm9taW5hdG9yV2l0aGRyYXdCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L3NpbmdsZU5vbWluYXRvcldpdGhkcmF3QnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1Qiw4Q0FBa0Q7QUFDbEQsdUZBQW9GO0FBQ3BGLDRDQUF1QztBQUN2QywyREFBNkM7QUFDN0MsbURBQWdEO0FBQ2hELDJEQUE2QztBQUM3QyxvREFBNEI7QUFFNUIsUUFBUSxDQUFDLHVDQUF1QyxFQUFFLEdBQUcsRUFBRTtJQUNyRCxNQUFNLE9BQU8sR0FBRyxJQUFJLHFEQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNqRSxNQUFNLDZCQUE2QixHQUFHLGlCQUFpQixDQUFDO0lBQ3hELEVBQUUsQ0FBQyxxQ0FBcUMsRUFBRSxLQUFLO1FBQzdDLE1BQU0sSUFBSSxHQUFHLDhDQUE4QyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNwRyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsaUNBQWlDLEVBQUUsQ0FBQztRQUM5RCxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QixTQUFTLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDL0MsU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNqQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENB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Q0FBQztRQUNuRCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsY0FBYyxFQUFFLDZCQUE2QixDQUFDLENBQUM7SUFDMUUsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IH0gZnJvbSAnLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5JztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vcmVzb3VyY2VzL3Rvbic7XG5pbXBvcnQgeyBLZXlQYWlyIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi9rZXlQYWlyJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4uLy4uL3NyYy9saWIvdXRpbHMnO1xuaW1wb3J0IFRvbldlYiBmcm9tICd0b253ZWInO1xuXG5kZXNjcmliZSgnVG9uIFNpbmdsZSBOb21pbmF0b3IgV2l0aGRyYXcgQnVpbGRlcicsICgpID0+IHtcbiAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndHRvbicpKTtcbiAgY29uc3Qgc2luZ2xlTm9taW5hdG9yV2l0aGRyYXdBbW91bnQgPSAnOTMyMTc4MTEyMzMwMDAwJztcbiAgaXQoJ3Nob3VsZCBidWlsZCBhIHVuc2lnbmVkIHdpdGhkcmF3IHR4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4SWQgPSAnbjFyci1RTDYxV1o3VUpON0VTSDJpUFFPN3RvVHk5V0xxWG9TSUcxSnRYZz0nLnJlcGxhY2UoL1xcLy9nLCAnXycpLnJlcGxhY2UoL1xcKy9nLCAnLScpO1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0U2luZ2xlTm9taW5hdG9yV2l0aGRyYXdCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgdHhCdWlsZGVyLnNlcXVlbmNlTnVtYmVyKDApO1xuICAgIHR4QnVpbGRlci5wdWJsaWNLZXkodGVzdERhdGEuc2VuZGVyLnB1YmxpY0tleSk7XG4gICAgdHhCdWlsZGVyLmV4cGlyZVRpbWUoMTIzNDU2Nzg5MCk7XG4gICAgdHhCdWlsZGVyLnNlbmQodGVzdERhdGEucmVjaXBpZW50c1swXSk7XG4gICAgdHhCdWlsZGVyLnNldFdpdGhkcmF3QW1vdW50KHNpbmdsZU5vbWluYXRvcldpdGhkcmF3QW1vdW50KTtcbiAgICB0eEJ1aWxkZXIuc2V0V2l0aGRyYXdNZXNzYWdlKCk7XG4gICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNpbmdsZU5vbWluYXRvcldpdGhkcmF3KTtcbiAgICBzaG91bGQuZXF1YWwodHgudG9Kc29uKCkuYm91bmNlYWJsZSwgZmFsc2UpO1xuICAgIHNob3VsZC5lcXVhbCh0eC50b0pzb24oKS53aXRoZHJhd0Ftb3VudCwgc2luZ2xlTm9taW5hdG9yV2l0aGRyYXdBbW91bnQpO1xuICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgIHR4LmlucHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnNlbmRlci5hZGRyZXNzLFxuICAgICAgdmFsdWU6IHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYW1vdW50LFxuICAgICAgY29pbjogJ3R0b24nLFxuICAgIH0pO1xuICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICB0eC5vdXRwdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgYWRkcmVzczogdGVzdERhdGEucmVjaXBpZW50c1swXS5hZGRyZXNzLFxuICAgICAgdmFsdWU6IHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYW1vdW50LFxuICAgICAgY29pbjogJ3R0b24nLFxuICAgIH0pO1xuICAgIHR4LmlkLnNob3VsZC5lcXVhbCh0eElkKTtcbiAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgZmFjdG9yeS5mcm9tKHJhd1R4KTtcbiAgICByYXdUeC5zaG91bGQuZXF1YWwoXG4gICAgICAndGU2Y2NrRUNHQUVBQThNQUF1R0lBRFpOMEgwbjF0ejZ4a1lnV3FKU1Jta1VSS1lhampFZ1hlYXdCbzljaWZQSUdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ21wb3hkSmxnTFNBQUFBQUFBRGdFWEFnRTBBaFlCRlA4QTlLUVQ5THp5eUFzREFnRWdCQkVDQVVnRkNBTG0wQUhRMHdNaGNiQ1NYd1RnSXRkSndTQ1NYd1RnQXRNZklZSVFjR3gxWjcwaWdoQmtjM1J5dmJDU1h3WGdBL3BBTUNENlJBSEl5Z2ZMLzhuUTdVVFFnUUZBMXlIMEJEQmNnUUVJOUFwdm9UR3prbDhINEFYVFA4Z2xnaEJ3YkhWbnVwSTRNT01OQTRJUVpITjBjcnFTWHdiakRRWUhBSGdCK2dEMEJERDRKMjhpTUZBS29TRys4dUJRZ2hCd2JIVm5neDZ4Y0lBWVVBVExCU2JQRmxqNkFobjBBTXRwRjhzZlVtRExQeURKZ0VEN0FBWUFpbEFFZ1FFSTlGa3c3VVRRZ1FGQTF5RElBYzhXOUFESjdWUUJjckNPSTRJUVpITjBjb01lc1hDQUdGQUZ5d1ZRQTg4V0kvb0NFOHRxeXgvTFA4bUFRUHNBa2w4RDRnSUJJQWtRQWdFZ0NnOENBVmdMREFBOXNwMzdVVFFnUUZBMXlIMEJEQUN5TW9IeS8vSjBBR0JBUWowQ20raE1ZQUlCSUEwT0FCbXR6bmFpYUVBZ2E1RHJoZi9BQUJtdkhmYWlhRUFRYTVEcmhZL0FBQkc0eVg3VVRRMXdzZmdBV2Iwa0syOXFKb1FJQ2dhNUQ2QWhoSERVQ0FoSHBKTjlLWkVNNXBBK24vbURlQktBRzNnUUZJbUhGWjh4aEFUNDhvTUkxeGdnMHgvVEg5TWZBdmdqdS9KazdVVFEweC9USDlQLzlBVFJVVU82OHFGUlVicnlvZ1g1QVZRUVpQa1E4cVA0QUNTa3lNc2ZVa0RMSDFJd3kvOVNFUFFBeWUxVStBOEIwd2Nod0FDZmJGR1RJTmRLbHRNSDFBTDdBT2d3NENIQUFlTUFJY0FDNHdBQndBT1JNT01OQTZUSXl4OFN5eC9ML3hJVEZCVUFidElIK2dEVTFDTDVBQVhJeWdjVnkvL0owSGQwZ0JqSXl3WExBaUxQRmxBRitnSVV5MnNTek16SmMvc0F5RUFVZ1FFSTlGSHlwd0lBY0lFQkNOY1krZ0RUUDhoVUlFZUJBUWowVWZLbmdoQnViM1JsY0hTQUdNakxCY3NDVUFiUEZsQUUrZ0lVeTJvU3l4L0xQOGx6K3dBQ0FHeUJBUWpYR1BvQTB6OHdVaVNCQVFqMFdmS25naEJrYzNSeWNIU0FHTWpMQmNzQ1VBWFBGbEFEK2dJVHkyckxIeExMUDhseit3QUFDdlFBeWUxVUFGRUFBQUFBS2FtakY4RER1ZHdKa3lFaDdqVWJKRWpGQ2pyaVZ4c1NsUkpGeUY4NzJWMWVlZ2I0UUFDUFFnQWFSZWZCT2pUaS9od3FEanYrN0k2bkdqOVdFQWUzbHMvckZ1QkVRdmdncjZBNjEzb0FBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFIQTAvUG9VQzVFSUV5V3VQZz09J1xuICAgICk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYnVpbGQgYSB1bnNpZ25lZCB3aXRoZHJhdyB0eCB3aXRoIGJvdW5jZWFibGUgZmxhZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eElkID0gJ1lTM1JGSFp4X1NLeWFuRk5qR2x2dERteDZJMDJkZUFRVUpVU3lWUDlyYWc9Jy5yZXBsYWNlKC9cXC8vZywgJ18nKS5yZXBsYWNlKC9cXCsvZywgJy0nKTtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFNpbmdsZU5vbWluYXRvcldpdGhkcmF3QnVpbGRlcigpO1xuICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgIHR4QnVpbGRlci5zZXF1ZW5jZU51bWJlcigwKTtcbiAgICB0eEJ1aWxkZXIucHVibGljS2V5KHRlc3REYXRhLnNlbmRlci5wdWJsaWNLZXkpO1xuICAgIHR4QnVpbGRlci5leHBpcmVUaW1lKDEyMzQ1Njc4OTApO1xuICAgIHR4QnVpbGRlci5zZW5kKHRlc3REYXRhLnJlY2lwaWVudHNbMF0pO1xuICAgIHR4QnVpbGRlci5zZXRXaXRoZHJhd0Ftb3VudChzaW5nbGVOb21pbmF0b3JXaXRoZHJhd0Ftb3VudCk7XG4gICAgdHhCdWlsZGVyLnNldFdpdGhkcmF3TWVzc2FnZSgpO1xuICAgIHR4QnVpbGRlci5ib3VuY2VhYmxlKHRydWUpO1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TaW5nbGVOb21pbmF0b3JXaXRoZHJhdyk7XG4gICAgc2hvdWxkLmVxdWFsKHR4LnRvSnNvbigpLmJvdW5jZWFibGUsIHRydWUpO1xuICAgIHNob3VsZC5lcXVhbCh0eC50b0pzb24oKS53aXRoZHJhd0Ftb3VudCwgc2luZ2xlTm9taW5hdG9yV2l0aGRyYXdBbW91bnQpO1xuICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgIHR4LmlucHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnNlbmRlci5hZGRyZXNzLFxuICAgICAgdmFsdWU6IHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYW1vdW50LFxuICAgICAgY29pbjogJ3R0b24nLFxuICAgIH0pO1xuICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICB0eC5vdXRwdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgYWRkcmVzczogdGVzdERhdGEucmVjaXBpZW50c1swXS5hZGRyZXNzLFxuICAgICAgdmFsdWU6IHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYW1vdW50LFxuICAgICAgY29pbjogJ3R0b24nLFxuICAgIH0pO1xuICAgIHR4LmlkLnNob3VsZC5lcXVhbCh0eElkKTtcbiAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgcmF3VHguc2hvdWxkLmVxdWFsKFxuICAgICAgJ3RlNmNja0VDR0FFQUE4TUFBdUdJQURaTjBIMG4xdHo2eGtZZ1dxSlNSbWtVUktZYWpqRWdYZWF3Qm85Y2lmUElHQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNtcG94ZEpsZ0xTQUFBQUFBQURnRVhBZ0UwQWhZQkZQOEE5S1FUOUx6eXlBc0RBZ0VnQkJFQ0FVZ0ZDQUxtMEFIUTB3TWhjYkNTWHdUZ0l0ZEp3U0NTWHdUZ0F0TWZJWUlRY0d4MVo3MGlnaEJrYzNSeXZiQ1NYd1hnQS9wQU1DRDZSQUhJeWdmTC84blE3VVRRZ1FGQTF5SDBCREJjZ1FFSTlBcHZvVEd6a2w4SDRBWFRQOGdsZ2hCd2JIVm51cEk0TU9NTkE0SVFaSE4wY3JxU1h3YmpEUVlIQUhnQitnRDBCREQ0SjI4aU1GQUtvU0crOHVCUWdoQndiSFZuZ3g2eGNJQVlVQVRMQlNiUEZsajZBaG4wQU10cEY4c2ZVbURMUHlESmdFRDdBQVlBaWxBRWdRRUk5Rmt3N1VUUWdRRkExeURJQWM4VzlBREo3VlFCY3JDT0k0SVFaSE4wY29NZXNYQ0FHRkFGeXdWUUE4OFdJL29DRTh0cXl4L0xQOG1BUVBzQWtsOEQ0Z0lCSUFrUUFnRWdDZzhDQVZnTERBQTlzcDM3VVRRZ1FGQTF5SDBCREFDeU1vSHkvL0owQUdCQVFqMENtK2hNWUFJQklBME9BQm10em5haWFFQWdhNURyaGYvQUFCbXZIZmFpYUVBUWE1RHJoWS9BQUJHNHlYN1VUUTF3c2ZnQVdiMGtLMjlxSm9RSUNnYTVENkFoaEhEVUNBaEhwSk45S1pFTTVwQStuL21EZUJLQUczZ1FGSW1IRlo4eGhBVDQ4b01JMXhnZzB4L1RIOU1mQXZnanUvSms3VVRRMHgvVEg5UC85QVRSVVVPNjhxRlJVYnJ5b2dYNUFWUVFaUGtROHFQNEFDU2t5TXNmVWtETEgxSXd5LzlTRVBRQXllMVUrQThCMHdjaHdBQ2ZiRkdUSU5kS2x0TUgxQUw3QU9ndzRDSEFBZU1BSWNBQzR3QUJ3QU9STU9NTkE2VEl5eDhTeXgvTC94SVRGQlVBYnRJSCtnRFUxQ0w1QUFYSXlnY1Z5Ly9KMEhkMGdCakl5d1hMQWlMUEZsQUYrZ0lVeTJzU3pNekpjL3NBeUVBVWdRRUk5Rkh5cHdJQWNJRUJDTmNZK2dEVFA4aFVJRWVCQVFqMFVmS25naEJ1YjNSbGNIU0FHTWpMQmNzQ1VBYlBGbEFFK2dJVXkyb1N5eC9MUDhseit3QUNBR3lCQVFqWEdQb0Ewejh3VWlTQkFRajBXZktuZ2hCa2MzUnljSFNBR01qTEJjc0NVQVhQRmxBRCtnSVR5MnJMSHhMTFA4bHord0FBQ3ZRQXllMVVBRkVBQUFBQUthbWpGOEREdWR3Smt5RWg3alViSkVqRkNqcmlWeHNTbFJKRnlGODcyVjFlZWdiNFFBQ1BZZ0FhUmVmQk9qVGkvaHdxRGp2KzdJNm5HajlXRUFlM2xzL3JGdUJFUXZnZ3I2QTYxM29BQUFBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBSEEwL1BvVUM1RUlCRGRkSFE9PSdcbiAgICApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGJ1aWxkIGEgd2l0aGRyYXcgZnJvbSByYXdUeCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuc2lnbmVkU2luZ2xlTm9taW5hdG9yV2l0aGRyYXdUcmFuc2FjdGlvbi50eCk7XG4gICAgY29uc3QgYnVpbHRUeCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IGpzb25UeCA9IGJ1aWx0VHgudG9Kc29uKCk7XG4gICAgc2hvdWxkLmVxdWFsKGJ1aWx0VHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNpbmdsZU5vbWluYXRvcldpdGhkcmF3KTtcbiAgICBzaG91bGQuZXF1YWwoXG4gICAgICBidWlsdFR4LnNpZ25hYmxlUGF5bG9hZC50b1N0cmluZygnYmFzZTY0JyksXG4gICAgICB0ZXN0RGF0YS5zaWduZWRTaW5nbGVOb21pbmF0b3JXaXRoZHJhd1RyYW5zYWN0aW9uLnNpZ25hYmxlXG4gICAgKTtcbiAgICBzaG91bGQuZXF1YWwoYnVpbHRUeC5pZCwgdGVzdERhdGEuc2lnbmVkU2luZ2xlTm9taW5hdG9yV2l0aGRyYXdUcmFuc2FjdGlvbi50eElkKTtcbiAgICBjb25zdCBidWlsZGVyMiA9IGZhY3RvcnkuZnJvbShidWlsdFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgIGNvbnN0IGJ1aWx0VHgyID0gYXdhaXQgYnVpbGRlcjIuYnVpbGQoKTtcbiAgICBzaG91bGQuZXF1YWwoYnVpbHRUeDIudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNpbmdsZU5vbWluYXRvcldpdGhkcmF3KTtcbiAgICBzaG91bGQuZXF1YWwoYnVpbHRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLCB0ZXN0RGF0YS5zaWduZWRTaW5nbGVOb21pbmF0b3JXaXRoZHJhd1RyYW5zYWN0aW9uLnR4KTtcbiAgICBidWlsdFR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgIGJ1aWx0VHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgIGpzb25UeC5zZW5kZXIuc2hvdWxkLmVxdWFsKCdFUUFiSnVnLWstdHVmV01qRUMxUktTTTBpaUpURFVjWWtDN3pXQU5IcmtUNTVGb2wnKTtcbiAgICBqc29uVHguZGVzdGluYXRpb24uc2hvdWxkLmVxdWFsKCdFUUEwaTgtQ2RHbkZfRGhVSEhmOTJSMU9OSDZzSUE5dkxaX1dMY0NJaGZCQlh3dEcnKTtcbiAgICBqc29uVHguYW1vdW50LnNob3VsZC5lcXVhbCgnMTIzNDAwMDAwJyk7XG4gICAganNvblR4LnNlcW5vLnNob3VsZC5lcXVhbCgwKTtcbiAgICBqc29uVHguZXhwaXJhdGlvblRpbWUuc2hvdWxkLmVxdWFsKDEyMzQ1Njc4OTApO1xuICAgIGpzb25UeC53aXRoZHJhd0Ftb3VudC5zaG91bGQuZXF1YWwoc2luZ2xlTm9taW5hdG9yV2l0aGRyYXdBbW91bnQpO1xuXG4gICAgY29uc3QgYnVpbHRUeDMgPSBhd2FpdCB0eEJ1aWxkZXIuYm91bmNlYWJsZShmYWxzZSkuZnJvbUFkZHJlc3NCb3VuY2VhYmxlKGZhbHNlKS50b0FkZHJlc3NCb3VuY2VhYmxlKGZhbHNlKS5idWlsZCgpO1xuICAgIHR4QnVpbGRlci5mcm9tKHRlc3REYXRhLnNpZ25lZFNpbmdsZU5vbWluYXRvcldpdGhkcmF3VHJhbnNhY3Rpb24udHgpO1xuICAgIGNvbnN0IGpzb25UeDMgPSBidWlsdFR4My50b0pzb24oKTtcbiAgICBzaG91bGQuZXF1YWwoanNvblR4My5ib3VuY2VhYmxlLCBmYWxzZSk7XG4gICAgc2hvdWxkLmVxdWFsKFxuICAgICAgYnVpbHRUeDMuc2lnbmFibGVQYXlsb2FkLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAgIHRlc3REYXRhLnNpZ25lZFNpbmdsZU5vbWluYXRvcldpdGhkcmF3VHJhbnNhY3Rpb24uYm91bmNlYWJsZVNpZ25hYmxlXG4gICAgKTtcbiAgICBzaG91bGQuZXF1YWwoYnVpbHRUeDMuaWQsIHRlc3REYXRhLnNpZ25lZFNpbmdsZU5vbWluYXRvcldpdGhkcmF3VHJhbnNhY3Rpb24udHhJZEJvdW5jZWFibGUpO1xuICAgIHNob3VsZC5lcXVhbChidWlsdFR4My50b0Jyb2FkY2FzdEZvcm1hdCgpLCB0ZXN0RGF0YS5zaWduZWRTaW5nbGVOb21pbmF0b3JXaXRoZHJhd1RyYW5zYWN0aW9uLnR4KTtcbiAgICBqc29uVHgzLnNlbmRlci5zaG91bGQuZXF1YWwoJ1VRQWJKdWctay10dWZXTWpFQzFSS1NNMGlpSlREVWNZa0M3eldBTkhya1Q1NUFmZycpO1xuICAgIGpzb25UeDMuZGVzdGluYXRpb24uc2hvdWxkLmVxdWFsKCdVUUEwaTgtQ2RHbkZfRGhVSEhmOTJSMU9OSDZzSUE5dkxaX1dMY0NJaGZCQlgxYUQnKTtcbiAgICBqc29uVHgzLmFtb3VudC5zaG91bGQuZXF1YWwoJzEyMzQwMDAwMCcpO1xuICAgIGpzb25UeDMuc2Vxbm8uc2hvdWxkLmVxdWFsKDApO1xuICAgIGpzb25UeDMuZXhwaXJhdGlvblRpbWUuc2hvdWxkLmVxdWFsKDEyMzQ1Njc4OTApO1xuICAgIGpzb25UeC53aXRoZHJhd0Ftb3VudC5zaG91bGQuZXF1YWwoc2luZ2xlTm9taW5hdG9yV2l0aGRyYXdBbW91bnQpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHBhcnNlIGEgcmF3IHRyYW5zYWN0aW9uIGFuZCBzZXQgZmxhZ3MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndHRvbicpKTtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuc2lnbmVkU2luZ2xlTm9taW5hdG9yV2l0aGRyYXdUcmFuc2FjdGlvbi50eCk7XG4gICAgY29uc3QgdHhCdWlsZGVyQm91bmNlYWJsZSA9IGZhY3RvcnkuZnJvbSh0ZXN0RGF0YS5zaWduZWRTaW5nbGVOb21pbmF0b3JXaXRoZHJhd1RyYW5zYWN0aW9uLnR4Qm91bmNlYWJsZSk7XG5cbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHR4Qm91bmNlYWJsZSA9IGF3YWl0IHR4QnVpbGRlckJvdW5jZWFibGUuYnVpbGQoKTtcbiAgICB0eC50b0pzb24oKS5ib3VuY2VhYmxlLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgc2hvdWxkLmVxdWFsKHR4LnRvSnNvbigpLndpdGhkcmF3QW1vdW50LCBzaW5nbGVOb21pbmF0b3JXaXRoZHJhd0Ftb3VudCk7XG4gICAgdHhCb3VuY2VhYmxlLnRvSnNvbigpLmJvdW5jZWFibGUuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIHNob3VsZC5lcXVhbCh0eEJvdW5jZWFibGUudG9Kc29uKCkud2l0aGRyYXdBbW91bnQsIHNpbmdsZU5vbWluYXRvcldpdGhkcmF3QW1vdW50KTtcbiAgfSk7XG5cbiAgeGl0KCdzaG91bGQgYnVpbGQgYSBzaWduZWQgd2l0aGRyYXcgdHggYW5kIHN1Ym1pdCBvbmNoYWluJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHRvbndlYiA9IG5ldyBUb25XZWIobmV3IFRvbldlYi5IdHRwUHJvdmlkZXIoJ2h0dHBzOi8vdGVzdG5ldC50b25jZW50ZXIuY29tL2FwaS92Mi9qc29uUlBDJykpO1xuICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEucHJpdmF0ZUtleXMucHJ2S2V5MSB9KTtcbiAgICBjb25zdCBwdWJsaWNLZXkgPSBrZXlQYWlyLmdldEtleXMoKS5wdWI7XG4gICAgY29uc3QgYWRkcmVzcyA9IGF3YWl0IHV0aWxzLmRlZmF1bHQuZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXkocHVibGljS2V5KTtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFNpbmdsZU5vbWluYXRvcldpdGhkcmF3QnVpbGRlcigpO1xuICAgIHR4QnVpbGRlci5zZW5kZXIoYWRkcmVzcyk7XG5cbiAgICBjb25zdCBXYWxsZXRDbGFzcyA9IHRvbndlYi53YWxsZXQuYWxsWyd2NFIyJ107XG4gICAgY29uc3Qgd2FsbGV0ID0gbmV3IFdhbGxldENsYXNzKHRvbndlYi5wcm92aWRlciwge1xuICAgICAgcHVibGljS2V5OiB0b253ZWIudXRpbHMuaGV4VG9CeXRlcyhwdWJsaWNLZXkpLFxuICAgICAgd2M6IDAsXG4gICAgfSk7XG4gICAgY29uc3Qgc2Vxbm8gPSBhd2FpdCB3YWxsZXQubWV0aG9kcy5zZXFubygpLmNhbGwoKTtcbiAgICB0eEJ1aWxkZXIuc2VxdWVuY2VOdW1iZXIoc2Vxbm8gYXMgbnVtYmVyKTtcbiAgICB0eEJ1aWxkZXIucHVibGljS2V5KHB1YmxpY0tleSk7XG4gICAgY29uc3QgZXhwaXJlQXQgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxZTMpICsgNjAgKiA2MCAqIDI0ICogNzsgLy8gNyBkYXlzXG4gICAgdHhCdWlsZGVyLmV4cGlyZVRpbWUoZXhwaXJlQXQpO1xuICAgIHR4QnVpbGRlci5zZW5kKHtcbiAgICAgIGFkZHJlc3M6ICdrZjl2WWc1aURNUGlPcHY5eXB2OV9CN3B3WWVlNHdqY1EwU0hMcE45VjY1WUZfSWcnLFxuICAgICAgYW1vdW50OiAnMTAwMDAwMDAwJyxcbiAgICB9KTtcbiAgICB0eEJ1aWxkZXIuc2V0V2l0aGRyYXdBbW91bnQoJzEnKTtcbiAgICB0eEJ1aWxkZXIuc2V0V2l0aGRyYXdNZXNzYWdlKCk7XG4gICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNpbmdsZU5vbWluYXRvcldpdGhkcmF3KTtcbiAgICBjb25zdCBzaWduYWJsZSA9IHR4LnNpZ25hYmxlUGF5bG9hZDtcbiAgICBjb25zdCBzaWduYXR1cmUgPSBrZXlQYWlyLnNpZ25NZXNzYWdlaW5VaW50OEFycmF5KHNpZ25hYmxlKTtcbiAgICBjb25zdCBzaWduZWRUeCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IGJ1aWxkZXIyID0gZmFjdG9yeS5mcm9tKHNpZ25lZFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgIGJ1aWxkZXIyLmFkZFNpZ25hdHVyZShrZXlQYWlyLmdldEtleXMoKSwgQnVmZmVyLmZyb20oc2lnbmF0dXJlKSk7XG4gICAgY29uc3QgdHgyID0gYXdhaXQgYnVpbGRlcjIuYnVpbGQoKTtcbiAgICBjb25zdCBzaWduYXR1cmUyID0ga2V5UGFpci5zaWduTWVzc2FnZWluVWludDhBcnJheSh0eDIuc2lnbmFibGVQYXlsb2FkKTtcbiAgICBzaG91bGQuZXF1YWwoQnVmZmVyLmZyb20oc2lnbmF0dXJlKS50b1N0cmluZygnaGV4JyksIEJ1ZmZlci5mcm9tKHNpZ25hdHVyZTIpLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMjAwMCkpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRvbndlYi5wcm92aWRlci5zZW5kQm9jKHR4Mi50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICBjb25zb2xlLmxvZyhyZXN1bHQpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGJ1aWxkIGEgc2lnbmVkIHdpdGhkcmF3IHR4IHVzaW5nIGFkZCBzaWduYXR1cmUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qga2V5UGFpciA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5wcml2YXRlS2V5cy5wcnZLZXkxIH0pO1xuICAgIGNvbnN0IHB1YmxpY0tleSA9IGtleVBhaXIuZ2V0S2V5cygpLnB1YjtcbiAgICBjb25zdCBhZGRyZXNzID0gYXdhaXQgdXRpbHMuZGVmYXVsdC5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShwdWJsaWNLZXkpO1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0U2luZ2xlTm9taW5hdG9yV2l0aGRyYXdCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLnNlbmRlcihhZGRyZXNzKTtcbiAgICB0eEJ1aWxkZXIuc2VxdWVuY2VOdW1iZXIoMCk7XG4gICAgdHhCdWlsZGVyLnB1YmxpY0tleShwdWJsaWNLZXkpO1xuICAgIGNvbnN0IGV4cGlyZUF0ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMWUzKSArIDYwICogNjAgKiAyNCAqIDc7XG4gICAgdHhCdWlsZGVyLmV4cGlyZVRpbWUoZXhwaXJlQXQpO1xuICAgIHR4QnVpbGRlci5zZW5kKHRlc3REYXRhLnJlY2lwaWVudHNbMF0pO1xuICAgIHR4QnVpbGRlci5zZXRXaXRoZHJhd0Ftb3VudCgnMScpO1xuICAgIHR4QnVpbGRlci5zZXRXaXRoZHJhd01lc3NhZ2UoKTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2luZ2xlTm9taW5hdG9yV2l0aGRyYXcpO1xuICAgIGNvbnN0IHNpZ25hYmxlID0gdHguc2lnbmFibGVQYXlsb2FkO1xuICAgIGNvbnN0IHNpZ25hdHVyZSA9IGtleVBhaXIuc2lnbk1lc3NhZ2VpblVpbnQ4QXJyYXkoc2lnbmFibGUpO1xuICAgIHR4QnVpbGRlci5hZGRTaWduYXR1cmUoa2V5UGFpci5nZXRLZXlzKCksIEJ1ZmZlci5mcm9tKHNpZ25hdHVyZSkpO1xuICAgIGNvbnN0IHNpZ25lZFR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QgYnVpbGRlcjIgPSBmYWN0b3J5LmZyb20oc2lnbmVkVHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgY29uc3QgdHgyID0gYXdhaXQgYnVpbGRlcjIuYnVpbGQoKTtcbiAgICBjb25zdCBzaWduYXR1cmUyID0ga2V5UGFpci5zaWduTWVzc2FnZWluVWludDhBcnJheSh0eDIuc2lnbmFibGVQYXlsb2FkKTtcbiAgICBzaG91bGQuZXF1YWwoQnVmZmVyLmZyb20oc2lnbmF0dXJlKS50b1N0cmluZygnaGV4JyksIEJ1ZmZlci5mcm9tKHNpZ25hdHVyZTIpLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgc2hvdWxkLmVxdWFsKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIHR4Mi50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBidWlsZCB3aXRoZHJhdyB0eCBmb3Igbm9uLWJvdW5jZWFibGUgYWRkcmVzcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFNpbmdsZU5vbWluYXRvcldpdGhkcmF3QnVpbGRlcigpO1xuICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgIHR4QnVpbGRlci5zZXF1ZW5jZU51bWJlcigwKTtcbiAgICB0eEJ1aWxkZXIucHVibGljS2V5KHRlc3REYXRhLnNlbmRlci5wdWJsaWNLZXkpO1xuICAgIHR4QnVpbGRlci5leHBpcmVUaW1lKDEyMzQ1Njc4OTApO1xuICAgIGNvbnN0IGFkZHJlc3MgPSAnRVFBV3pFS2NkbnlrdlhmVU5vdXFkUzYydHZycDMyYkN4dUtTNmVRclM2SVNnY0xvJztcbiAgICBjb25zdCBvdGhlckZvcm1hdCA9ICdVUUFXekVLY2RueWt2WGZVTm91cWRTNjJ0dnJwMzJiQ3h1S1M2ZVFyUzZJU2daOHQnO1xuICAgIGNvbnN0IGFtb3VudCA9ICcxMDAwMDAwMDAnO1xuICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzcywgYW1vdW50IH0pO1xuICAgIHR4QnVpbGRlci5zZXRXaXRoZHJhd0Ftb3VudChzaW5nbGVOb21pbmF0b3JXaXRoZHJhd0Ftb3VudCk7XG4gICAgdHhCdWlsZGVyLnNldFdpdGhkcmF3TWVzc2FnZSgpO1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TaW5nbGVOb21pbmF0b3JXaXRoZHJhdyk7XG4gICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgdHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgYWRkcmVzczogdGVzdERhdGEuc2VuZGVyLmFkZHJlc3MsXG4gICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgY29pbjogJ3R0b24nLFxuICAgIH0pO1xuICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICB0eC5vdXRwdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgYWRkcmVzcyxcbiAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICBjb2luOiAndHRvbicsXG4gICAgfSk7XG4gICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgdHhKc29uLmRlc3RpbmF0aW9uLnNob3VsZC5lcXVhbChhZGRyZXNzKTtcbiAgICBzaG91bGQuZXF1YWwodHgudG9Kc29uKCkud2l0aGRyYXdBbW91bnQsIHNpbmdsZU5vbWluYXRvcldpdGhkcmF3QW1vdW50KTtcbiAgICBjb25zdCBidWlsZGVyMiA9IGZhY3RvcnkuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICBjb25zdCB0eDIgPSBhd2FpdCBidWlsZGVyMi5idWlsZCgpO1xuICAgIGNvbnN0IHR4SnNvbjIgPSB0eDIudG9Kc29uKCk7XG4gICAgdHhKc29uMi5kZXN0aW5hdGlvbkFsaWFzLnNob3VsZC5lcXVhbChvdGhlckZvcm1hdCk7XG4gICAgc2hvdWxkLmVxdWFsKHR4LnRvSnNvbigpLndpdGhkcmF3QW1vdW50LCBzaW5nbGVOb21pbmF0b3JXaXRoZHJhd0Ftb3VudCk7XG4gIH0pO1xufSk7XG4iXX0=Выполнить команду
Для локальной разработки. Не используйте в интернете!