PHP WebShell
Текущая директория: /usr/lib/node_modules/bitgo/node_modules/avalanche/typings/tests/apis/platformvm
Просмотр файла: tx.test.js
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const jest_mock_axios_1 = __importDefault(require("jest-mock-axios"));
const utxos_1 = require("../../../src/apis/platformvm/utxos");
const api_1 = require("../../../src/apis/platformvm/api");
const tx_1 = require("../../../src/apis/platformvm/tx");
const keychain_1 = require("../../../src/apis/platformvm/keychain");
const inputs_1 = require("../../../src/apis/platformvm/inputs");
const create_hash_1 = __importDefault(require("create-hash"));
const bintools_1 = __importDefault(require("../../../src/utils/bintools"));
const bn_js_1 = __importDefault(require("bn.js"));
const buffer_1 = require("buffer/");
const outputs_1 = require("../../../src/apis/platformvm/outputs");
const constants_1 = require("../../../src/apis/platformvm/constants");
const index_1 = require("../../../src/index");
const payload_1 = require("../../../src/utils/payload");
const helperfunctions_1 = require("../../../src/utils/helperfunctions");
const basetx_1 = require("../../../src/apis/platformvm/basetx");
const importtx_1 = require("../../../src/apis/platformvm/importtx");
const exporttx_1 = require("../../../src/apis/platformvm/exporttx");
const constants_2 = require("../../../src/utils/constants");
describe("Transactions", () => {
/**
* @ignore
*/
const bintools = bintools_1.default.getInstance();
const networkID = 1337;
let set;
let keymgr1;
let keymgr2;
let keymgr3;
let addrs1;
let addrs2;
let addrs3;
let utxos;
let inputs;
let outputs;
let importIns;
let importUTXOs;
let exportOuts;
let fungutxos;
let exportUTXOIDS;
let api;
const amnt = 10000;
const netid = 12345;
const blockchainID = bintools.cb58Decode(constants_2.PlatformChainID);
const alias = "X";
const assetID = buffer_1.Buffer.from((0, create_hash_1.default)("sha256")
.update("Well, now, don't you tell me to smile, you stick around I'll make it worth your while.")
.digest());
let amount;
let addresses;
let fallAddresses;
let locktime;
let fallLocktime;
let threshold;
let fallThreshold;
const ip = "127.0.0.1";
const port = 8080;
const protocol = "http";
let avalanche;
const name = "Mortycoin is the dumb as a sack of hammers.";
const symbol = "morT";
const denomination = 8;
let avaxAssetID;
const genesisDataStr = "11111DdZMhYXUZiFV9FNpfpTSQroysjHyMuT5zapYkPYrmap7t7S3sDNNwFzngxR9x1XmoRj5JK1XomX8RHvXYY5h3qYeEsMQRF8Ypia7p1CFHDo6KGSjMdiQkrmpvL8AvoezSxVWKXt2ubmBCnSkpPjnQbBSF7gNg4sPu1PXdh1eKgthaSFREqqG5FKMrWNiS6U87kxCmbKjkmBvwnAd6TpNx75YEiS9YKMyHaBZjkRDNf6Nj1";
const gd = new index_1.GenesisData();
gd.fromBuffer(bintools.cb58Decode(genesisDataStr));
const addressIndex = buffer_1.Buffer.alloc(4);
addressIndex.writeUIntBE(0x0, 0, 4);
beforeAll(() => __awaiter(void 0, void 0, void 0, function* () {
avalanche = new index_1.Avalanche(ip, port, protocol, 12345, undefined, undefined, undefined, true);
api = new api_1.PlatformVMAPI(avalanche, "/ext/bc/P");
const result = api.getAVAXAssetID();
const payload = {
result: {
name,
symbol,
assetID: bintools.cb58Encode(assetID),
denomination: `${denomination}`
}
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
avaxAssetID = yield result;
}));
beforeEach(() => {
set = new utxos_1.UTXOSet();
keymgr1 = new keychain_1.KeyChain(avalanche.getHRP(), alias);
keymgr2 = new keychain_1.KeyChain(avalanche.getHRP(), alias);
keymgr3 = new keychain_1.KeyChain(avalanche.getHRP(), alias);
addrs1 = [];
addrs2 = [];
addrs3 = [];
utxos = [];
inputs = [];
outputs = [];
importIns = [];
importUTXOs = [];
exportOuts = [];
fungutxos = [];
exportUTXOIDS = [];
for (let i = 0; i < 3; i++) {
addrs1.push(keymgr1.makeKey().getAddress());
addrs2.push(keymgr2.makeKey().getAddress());
addrs3.push(keymgr3.makeKey().getAddress());
}
amount = new bn_js_1.default(amnt);
addresses = keymgr1.getAddresses();
fallAddresses = keymgr2.getAddresses();
locktime = new bn_js_1.default(54321);
fallLocktime = locktime.add(new bn_js_1.default(50));
threshold = 3;
fallThreshold = 1;
const payload = buffer_1.Buffer.alloc(1024);
payload.write("All you Trekkies and TV addicts, Don't mean to diss don't mean to bring static.", 0, 1024, "utf8");
for (let i = 0; i < 5; i++) {
let txid = buffer_1.Buffer.from((0, create_hash_1.default)("sha256")
.update(bintools.fromBNToBuffer(new bn_js_1.default(i), 32))
.digest());
let txidx = buffer_1.Buffer.from(bintools.fromBNToBuffer(new bn_js_1.default(i), 4));
const out = new outputs_1.SECPTransferOutput(amount, addresses, locktime, threshold);
const xferout = new outputs_1.TransferableOutput(assetID, out);
outputs.push(xferout);
const u = new utxos_1.UTXO(constants_1.PlatformVMConstants.LATESTCODEC, txid, txidx, assetID, out);
utxos.push(u);
fungutxos.push(u);
importUTXOs.push(u);
txid = u.getTxID();
txidx = u.getOutputIdx();
const input = new inputs_1.SECPTransferInput(amount);
const xferin = new inputs_1.TransferableInput(txid, txidx, assetID, input);
inputs.push(xferin);
}
for (let i = 1; i < 4; i++) {
importIns.push(inputs[i]);
exportOuts.push(outputs[i]);
exportUTXOIDS.push(fungutxos[i].getUTXOID());
}
set.addArray(utxos);
});
test("Create small BaseTx that is Goose Egg Tx", () => __awaiter(void 0, void 0, void 0, function* () {
const outs = [];
const ins = [];
const outputAmt = new bn_js_1.default("266");
const output = new outputs_1.SECPTransferOutput(outputAmt, addrs1, new bn_js_1.default(0), 1);
const transferableOutput = new outputs_1.TransferableOutput(avaxAssetID, output);
outs.push(transferableOutput);
const inputAmt = new bn_js_1.default("400");
const input = new inputs_1.SECPTransferInput(inputAmt);
input.addSignatureIdx(0, addrs1[0]);
const txid = bintools.cb58Decode("n8XH5JY1EX5VYqDeAhB4Zd4GKxi9UNQy6oPpMsCAj1Q6xkiiL");
const outputIndex = buffer_1.Buffer.from(bintools.fromBNToBuffer(new bn_js_1.default(0), 4));
const transferableInput = new inputs_1.TransferableInput(txid, outputIndex, avaxAssetID, input);
ins.push(transferableInput);
const baseTx = new basetx_1.BaseTx(networkID, blockchainID, outs, ins);
const unsignedTx = new tx_1.UnsignedTx(baseTx);
expect(yield api.checkGooseEgg(unsignedTx)).toBe(true);
}));
test("confirm inputTotal, outputTotal and fee are correct", () => __awaiter(void 0, void 0, void 0, function* () {
const bintools = bintools_1.default.getInstance();
// local network P Chain ID
// AVAX assetID
const assetID = bintools.cb58Decode("n8XH5JY1EX5VYqDeAhB4Zd4GKxi9UNQy6oPpMsCAj1Q6xkiiL");
const outs = [];
const ins = [];
const outputAmt = new bn_js_1.default("266");
const output = new outputs_1.SECPTransferOutput(outputAmt, addrs1, new bn_js_1.default(0), 1);
const transferableOutput = new outputs_1.TransferableOutput(assetID, output);
outs.push(transferableOutput);
const inputAmt = new bn_js_1.default("400");
const input = new inputs_1.SECPTransferInput(inputAmt);
input.addSignatureIdx(0, addrs1[0]);
const txid = bintools.cb58Decode("n8XH5JY1EX5VYqDeAhB4Zd4GKxi9UNQy6oPpMsCAj1Q6xkiiL");
const outputIndex = buffer_1.Buffer.from(bintools.fromBNToBuffer(new bn_js_1.default(0), 4));
const transferableInput = new inputs_1.TransferableInput(txid, outputIndex, assetID, input);
ins.push(transferableInput);
const baseTx = new basetx_1.BaseTx(networkID, blockchainID, outs, ins);
const unsignedTx = new tx_1.UnsignedTx(baseTx);
const inputTotal = unsignedTx.getInputTotal(assetID);
const outputTotal = unsignedTx.getOutputTotal(assetID);
const burn = unsignedTx.getBurn(assetID);
expect(inputTotal.toNumber()).toEqual(new bn_js_1.default(400).toNumber());
expect(outputTotal.toNumber()).toEqual(new bn_js_1.default(266).toNumber());
expect(burn.toNumber()).toEqual(new bn_js_1.default(134).toNumber());
}));
test("Create small BaseTx that isn't Goose Egg Tx", () => __awaiter(void 0, void 0, void 0, function* () {
// local network X Chain ID
const outs = [];
const ins = [];
const outputAmt = new bn_js_1.default("267");
const output = new outputs_1.SECPTransferOutput(outputAmt, addrs1, new bn_js_1.default(0), 1);
const transferableOutput = new outputs_1.TransferableOutput(avaxAssetID, output);
outs.push(transferableOutput);
const inputAmt = new bn_js_1.default("400");
const input = new inputs_1.SECPTransferInput(inputAmt);
input.addSignatureIdx(0, addrs1[0]);
const txid = bintools.cb58Decode("n8XH5JY1EX5VYqDeAhB4Zd4GKxi9UNQy6oPpMsCAj1Q6xkiiL");
const outputIndex = buffer_1.Buffer.from(bintools.fromBNToBuffer(new bn_js_1.default(0), 4));
const transferableInput = new inputs_1.TransferableInput(txid, outputIndex, avaxAssetID, input);
ins.push(transferableInput);
const baseTx = new basetx_1.BaseTx(networkID, blockchainID, outs, ins);
const unsignedTx = new tx_1.UnsignedTx(baseTx);
expect(yield api.checkGooseEgg(unsignedTx)).toBe(true);
}));
test("Create large BaseTx that is Goose Egg Tx", () => __awaiter(void 0, void 0, void 0, function* () {
// local network P Chain ID
const outs = [];
const ins = [];
const outputAmt = new bn_js_1.default("609555500000");
const output = new outputs_1.SECPTransferOutput(outputAmt, addrs1, new bn_js_1.default(0), 1);
const transferableOutput = new outputs_1.TransferableOutput(avaxAssetID, output);
outs.push(transferableOutput);
const inputAmt = new bn_js_1.default("45000000000000000");
const input = new inputs_1.SECPTransferInput(inputAmt);
input.addSignatureIdx(0, addrs1[0]);
const txid = bintools.cb58Decode("n8XH5JY1EX5VYqDeAhB4Zd4GKxi9UNQy6oPpMsCAj1Q6xkiiL");
const outputIndex = buffer_1.Buffer.from(bintools.fromBNToBuffer(new bn_js_1.default(0), 4));
const transferableInput = new inputs_1.TransferableInput(txid, outputIndex, avaxAssetID, input);
ins.push(transferableInput);
const baseTx = new basetx_1.BaseTx(networkID, blockchainID, outs, ins);
const unsignedTx = new tx_1.UnsignedTx(baseTx);
expect(yield api.checkGooseEgg(unsignedTx)).toBe(false);
}));
test("Create large BaseTx that isn't Goose Egg Tx", () => __awaiter(void 0, void 0, void 0, function* () {
// local network P Chain ID
const outs = [];
const ins = [];
const outputAmt = new bn_js_1.default("44995609555500000");
const output = new outputs_1.SECPTransferOutput(outputAmt, addrs1, new bn_js_1.default(0), 1);
const transferableOutput = new outputs_1.TransferableOutput(avaxAssetID, output);
outs.push(transferableOutput);
const inputAmt = new bn_js_1.default("45000000000000000");
const input = new inputs_1.SECPTransferInput(inputAmt);
input.addSignatureIdx(0, addrs1[0]);
const txid = bintools.cb58Decode("n8XH5JY1EX5VYqDeAhB4Zd4GKxi9UNQy6oPpMsCAj1Q6xkiiL");
const outputIndex = buffer_1.Buffer.from(bintools.fromBNToBuffer(new bn_js_1.default(0), 4));
const transferableInput = new inputs_1.TransferableInput(txid, outputIndex, avaxAssetID, input);
ins.push(transferableInput);
const baseTx = new basetx_1.BaseTx(networkID, blockchainID, outs, ins);
const unsignedTx = new tx_1.UnsignedTx(baseTx);
expect(yield api.checkGooseEgg(unsignedTx)).toBe(true);
}));
test("Creation UnsignedTx", () => {
const baseTx = new basetx_1.BaseTx(netid, blockchainID, outputs, inputs);
const txu = new tx_1.UnsignedTx(baseTx);
const txins = txu.getTransaction().getIns();
const txouts = txu.getTransaction().getOuts();
expect(txins.length).toBe(inputs.length);
expect(txouts.length).toBe(outputs.length);
expect(txu.getTransaction().getTxType()).toBe(0);
expect(txu.getTransaction().getNetworkID()).toBe(12345);
expect(txu.getTransaction().getBlockchainID().toString("hex")).toBe(blockchainID.toString("hex"));
let a = [];
let b = [];
for (let i = 0; i < txins.length; i++) {
a.push(txins[i].toString());
b.push(inputs[i].toString());
}
expect(JSON.stringify(a.sort())).toBe(JSON.stringify(b.sort()));
a = [];
b = [];
for (let i = 0; i < txouts.length; i++) {
a.push(txouts[i].toString());
b.push(outputs[i].toString());
}
expect(JSON.stringify(a.sort())).toBe(JSON.stringify(b.sort()));
const txunew = new tx_1.UnsignedTx();
txunew.fromBuffer(txu.toBuffer());
expect(txunew.toBuffer().toString("hex")).toBe(txu.toBuffer().toString("hex"));
expect(txunew.toString()).toBe(txu.toString());
});
test("Creation UnsignedTx Check Amount", () => {
expect(() => {
set.buildBaseTx(netid, blockchainID, new bn_js_1.default(amnt * 1000), assetID, addrs3, addrs1, addrs1);
}).toThrow();
});
test("Creation ImportTx", () => {
const bombtx = new importtx_1.ImportTx(netid, blockchainID, outputs, inputs, new payload_1.UTF8Payload("hello world").getPayload(), undefined, importIns);
expect(() => {
bombtx.toBuffer();
}).toThrow();
const importTx = new importtx_1.ImportTx(netid, blockchainID, outputs, inputs, new payload_1.UTF8Payload("hello world").getPayload(), bintools.cb58Decode(constants_2.PlatformChainID), importIns);
const txunew = new importtx_1.ImportTx();
const importbuff = importTx.toBuffer();
txunew.fromBuffer(importbuff);
expect(importTx).toBeInstanceOf(importtx_1.ImportTx);
expect(importTx.getSourceChain().toString("hex")).toBe(bintools.cb58Decode(constants_2.PlatformChainID).toString("hex"));
expect(txunew.toBuffer().toString("hex")).toBe(importbuff.toString("hex"));
expect(txunew.toString()).toBe(importTx.toString());
expect(importTx.getImportInputs().length).toBe(importIns.length);
});
test("Creation ExportTx", () => {
const bombtx = new exporttx_1.ExportTx(netid, blockchainID, outputs, inputs, undefined, undefined, exportOuts);
expect(() => {
bombtx.toBuffer();
}).toThrow();
const exportTx = new exporttx_1.ExportTx(netid, blockchainID, outputs, inputs, undefined, bintools.cb58Decode(constants_2.PlatformChainID), exportOuts);
const txunew = new exporttx_1.ExportTx();
const exportbuff = exportTx.toBuffer();
txunew.fromBuffer(exportbuff);
expect(exportTx).toBeInstanceOf(exporttx_1.ExportTx);
expect(exportTx.getDestinationChain().toString("hex")).toBe(bintools.cb58Decode(constants_2.PlatformChainID).toString("hex"));
expect(txunew.toBuffer().toString("hex")).toBe(exportbuff.toString("hex"));
expect(txunew.toString()).toBe(exportTx.toString());
expect(exportTx.getExportOutputs().length).toBe(exportOuts.length);
});
test("Creation Tx1 with asof, locktime, threshold", () => {
const txu = set.buildBaseTx(netid, blockchainID, new bn_js_1.default(9000), assetID, addrs3, addrs1, addrs1, undefined, undefined, undefined, (0, helperfunctions_1.UnixNow)(), (0, helperfunctions_1.UnixNow)().add(new bn_js_1.default(50)), 1);
const tx = txu.sign(keymgr1);
const tx2 = new tx_1.Tx();
tx2.fromString(tx.toString());
expect(tx2.toBuffer().toString("hex")).toBe(tx.toBuffer().toString("hex"));
expect(tx2.toString()).toBe(tx.toString());
});
test("Creation Tx2 without asof, locktime, threshold", () => {
const txu = set.buildBaseTx(netid, blockchainID, new bn_js_1.default(9000), assetID, addrs3, addrs1, addrs1);
const tx = txu.sign(keymgr1);
const tx2 = new tx_1.Tx();
tx2.fromBuffer(tx.toBuffer());
expect(tx2.toBuffer().toString("hex")).toBe(tx.toBuffer().toString("hex"));
expect(tx2.toString()).toBe(tx.toString());
});
test("Creation Tx4 using ImportTx", () => {
const txu = set.buildImportTx(netid, blockchainID, addrs3, addrs1, addrs2, importUTXOs, bintools.cb58Decode(constants_2.PlatformChainID), new bn_js_1.default(90), assetID, new payload_1.UTF8Payload("hello world").getPayload(), (0, helperfunctions_1.UnixNow)());
const tx = txu.sign(keymgr1);
const tx2 = new tx_1.Tx();
tx2.fromBuffer(tx.toBuffer());
expect(tx2.toBuffer().toString("hex")).toBe(tx.toBuffer().toString("hex"));
});
test("Creation Tx5 using ExportTx", () => {
const txu = set.buildExportTx(netid, blockchainID, new bn_js_1.default(90), avaxAssetID, addrs3, addrs1, addrs2, bintools.cb58Decode(constants_2.PlatformChainID), undefined, undefined, new payload_1.UTF8Payload("hello world").getPayload(), (0, helperfunctions_1.UnixNow)());
const tx = txu.sign(keymgr1);
const tx2 = new tx_1.Tx();
tx2.fromBuffer(tx.toBuffer());
expect(tx.toBuffer().toString("hex")).toBe(tx2.toBuffer().toString("hex"));
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHgudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3RzL2FwaXMvcGxhdGZvcm12bS90eC50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBQUEsc0VBQXVDO0FBQ3ZDLDhEQUFrRTtBQUNsRSwwREFBZ0U7QUFDaEUsd0RBQWdFO0FBQ2hFLG9FQUFnRTtBQUNoRSxnRUFHNEM7QUFDNUMsOERBQW9DO0FBQ3BDLDJFQUFrRDtBQUNsRCxrREFBc0I7QUFDdEIsb0NBQWdDO0FBQ2hDLGtFQUc2QztBQUM3QyxzRUFBNEU7QUFDNUUsOENBQTJEO0FBQzNELHdEQUF3RDtBQUN4RCx3RUFHMkM7QUFDM0MsZ0VBQTREO0FBQzVELG9FQUFnRTtBQUNoRSxvRUFBZ0U7QUFDaEUsNERBQThEO0FBRzlELFFBQVEsQ0FBQyxjQUFjLEVBQUUsR0FBUyxFQUFFO0lBQ2xDOztPQUVHO0lBQ0gsTUFBTSxRQUFRLEdBQWEsa0JBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUVqRCxNQUFNLFNBQVMsR0FBVyxJQUFJLENBQUE7SUFDOUIsSUFBSSxHQUFZLENBQUE7SUFDaEIsSUFBSSxPQUFpQixDQUFBO0lBQ3JCLElBQUksT0FBaUIsQ0FBQTtJQUNyQixJQUFJLE9BQWlCLENBQUE7SUFDckIsSUFBSSxNQUFnQixDQUFBO0lBQ3BCLElBQUksTUFBZ0IsQ0FBQTtJQUNwQixJQUFJLE1BQWdCLENBQUE7SUFDcEIsSUFBSSxLQUFhLENBQUE7SUFDakIsSUFBSSxNQUEyQixDQUFBO0lBQy9CLElBQUksT0FBNkIsQ0FBQTtJQUNqQyxJQUFJLFNBQThCLENBQUE7SUFDbEMsSUFBSSxXQUFtQixDQUFBO0lBQ3ZCLElBQUksVUFBZ0MsQ0FBQTtJQUNwQyxJQUFJLFNBQWlCLENBQUE7SUFDckIsSUFBSSxhQUF1QixDQUFBO0lBQzNCLElBQUksR0FBa0IsQ0FBQTtJQUN0QixNQUFNLElBQUksR0FBVyxLQUFLLENBQUE7SUFD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QUksQ0FBQyxHQUFhLEVBQUUsQ0FBQTtRQUNwQixJQUFJLENBQUMsR0FBYSxFQUFFLENBQUE7UUFDcEIsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDN0MsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtZQUMzQixDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO1NBQzdCO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBRS9ELENBQUMsR0FBRyxFQUFFLENBQUE7UUFDTixDQUFDLEdBQUcsRUFBRSxDQUFBO1FBRU4sS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDOUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtZQUM1QixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO1NBQzlCO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBRS9ELE1BQU0sTUFBTSxHQUFlLElBQUksZUFBVSxFQUFFLENBQUE7UUFDM0MsTUFBTSxDQUFDLFVBQVUsQ0FBQyxH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Q0FBQyxDQUFBO0lBQzVFLENBQUMsQ0FBQyxDQUFBO0lBRUYsSUFBSSxDQUFDLDZCQUE2QixFQUFFLEdBQVMsRUFBRTtRQUM3QyxNQUFNLEdBQUcsR0FBZSxHQUFHLENBQUMsYUFBYSxDQUN2QyxLQUFLLEVBQ0wsWUFBWSxFQUNaLElBQUksZUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUNWLFdBQVcsRUFDWCxNQUFNLEVBQ04sTUFBTSxFQUNOLE1BQU0sRUFDTixRQUFRLENBQUMsVUFBVSxDQUFDLDJCQUFlLENBQUMsRUFDcEMsU0FBUyxFQUNULFNBQVMsRUFDVCxJQUFJLHFCQUFXLENBQUMsYUFBYSxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQzNDLElBQUEseUJBQU8sR0FBRSxDQUNWLENBQUE7UUFDRCxNQUFNLEVBQUUsR0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ2hDLE1BQU0sR0FBRyxHQUFPLElBQUksT0FBRSxFQUFFLENBQUE7UUFDeEIsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtRQUM3QixNQUFNLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7SUFDNUUsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb2NrQXhpb3MgZnJvbSBcImplc3QtbW9jay1heGlvc1wiXG5pbXBvcnQgeyBVVFhPU2V0LCBVVFhPIH0gZnJvbSBcIi4uLy4uLy4uL3NyYy9hcGlzL3BsYXRmb3Jtdm0vdXR4b3NcIlxuaW1wb3J0IHsgUGxhdGZvcm1WTUFQSSB9IGZyb20gXCIuLi8uLi8uLi9zcmMvYXBpcy9wbGF0Zm9ybXZtL2FwaVwiXG5pbXBvcnQgeyBVbnNpZ25lZFR4LCBUeCB9IGZyb20gXCIuLi8uLi8uLi9zcmMvYXBpcy9wbGF0Zm9ybXZtL3R4XCJcbmltcG9ydCB7IEtleUNoYWluIH0gZnJvbSBcIi4uLy4uLy4uL3NyYy9hcGlzL3BsYXRmb3Jtdm0va2V5Y2hhaW5cIlxuaW1wb3J0IHtcbiAgU0VDUFRyYW5zZmVySW5wdXQsXG4gIFRyYW5zZmVyYWJsZUlucHV0XG59IGZyb20gXCIuLi8uLi8uLi9zcmMvYXBpcy9wbGF0Zm9ybXZtL2lucHV0c1wiXG5pbXBvcnQgY3JlYXRlSGFzaCBmcm9tIFwiY3JlYXRlLWhhc2hcIlxuaW1wb3J0IEJpblRvb2xzIGZyb20gXCIuLi8uLi8uLi9zcmMvdXRpbHMvYmludG9vbHNcIlxuaW1wb3J0IEJOIGZyb20gXCJibi5qc1wiXG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tIFwiYnVmZmVyL1wiXG5pbXBvcnQge1xuICBTRUNQVHJhbnNmZXJPdXRwdXQsXG4gIFRyYW5zZmVyYWJsZU91dHB1dFxufSBmcm9tIFwiLi4vLi4vLi4vc3JjL2FwaXMvcGxhdGZvcm12bS9vdXRwdXRzXCJcbmltcG9ydCB7IFBsYXRmb3JtVk1Db25zdGFudHMgfSBmcm9tIFwiLi4vLi4vLi4vc3JjL2FwaXMvcGxhdGZvcm12bS9jb25zdGFudHNcIlxuaW1wb3J0IHsgQXZhbGFuY2hlLCBHZW5lc2lzRGF0YSB9IGZyb20gXCIuLi8uLi8uLi9zcmMvaW5kZXhcIlxuaW1wb3J0IHsgVVRGOFBheWxvYWQgfSBmcm9tIFwiLi4vLi4vLi4vc3JjL3V0aWxzL3BheWxvYWRcIlxuaW1wb3J0IHtcbiAgTm9kZUlEU3RyaW5nVG9CdWZmZXIsXG4gIFVuaXhOb3dcbn0gZnJvbSBcIi4uLy4uLy4uL3NyYy91dGlscy9oZWxwZXJmdW5jdGlvbnNcIlxuaW1wb3J0IHsgQmFzZVR4IH0gZnJvbSBcIi4uLy4uLy4uL3NyYy9hcGlzL3BsYXRmb3Jtdm0vYmFzZXR4XCJcbmltcG9ydCB7IEltcG9ydFR4IH0gZnJvbSBcIi4uLy4uLy4uL3NyYy9hcGlzL3BsYXRmb3Jtdm0vaW1wb3J0dHhcIlxuaW1wb3J0IHsgRXhwb3J0VHggfSBmcm9tIFwiLi4vLi4vLi4vc3JjL2FwaXMvcGxhdGZvcm12bS9leHBvcnR0eFwiXG5pbXBvcnQgeyBQbGF0Zm9ybUNoYWluSUQgfSBmcm9tIFwiLi4vLi4vLi4vc3JjL3V0aWxzL2NvbnN0YW50c1wiXG5pbXBvcnQgeyBIdHRwUmVzcG9uc2UgfSBmcm9tIFwiamVzdC1tb2NrLWF4aW9zL2Rpc3QvbGliL21vY2stYXhpb3MtdHlwZXNcIlxuXG5kZXNjcmliZShcIlRyYW5zYWN0aW9uc1wiLCAoKTogdm9pZCA9PiB7XG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBjb25zdCBiaW50b29sczogQmluVG9vbHMgPSBCaW5Ub29scy5nZXRJbnN0YW5jZSgpXG5cbiAgY29uc3QgbmV0d29ya0lEOiBudW1iZXIgPSAxMzM3XG4gIGxldCBzZXQ6IFVUWE9TZXRcbiAgbGV0IGtleW1ncjE6IEtleUNoYWluXG4gIGxldCBrZXltZ3IyOiBLZXlDaGFpblxuICBsZXQga2V5bWdyMzogS2V5Q2hhaW5cbiAgbGV0IGFkZHJzMTogQnVmZmVyW11cbiAgbGV0IGFkZHJzMjogQnVmZmVyW11cbiAgbGV0IGFkZHJzMzogQnVmZmVyW11cbiAgbGV0IHV0eG9zOiBVVFhPW11cbiAgbGV0IGlucHV0czogVHJhbnNmZXJhYmxlSW5wdXRbXVxuICBsZXQgb3V0cHV0czogVHJhbnNmZXJhYmxlT3V0cHV0W11cbiAgbGV0IGltcG9ydEluczogVHJhbnNmZXJhYmxlSW5wdXRbXVxuICBsZXQgaW1wb3J0VVRYT3M6IFVUWE9bXVxuICBsZXQgZXhwb3J0T3V0czogVHJhbnNmZXJhYmxlT3V0cHV0W11cbiAgbGV0IGZ1bmd1dHhvczogVVRYT1tdXG4gIGxldCBleHBvcnRVVFhPSURTOiBzdHJpbmdbXVxuICBsZXQgYXBpOiBQbGF0Zm9ybVZNQVBJXG4gIGNvbnN0IGFtbnQ6IG51bWJlciA9IDEwMDAwXG4gIGNvbnN0IG5ldGlkOiBudW1iZXIgPSAxMjM0NVxuICBjb25zdCBibG9ja2NoYWluSUQ6IEJ1ZmZlciA9IGJpbnRvb2xzLmNiNThEZWNvZGUoUGxhdGZvcm1DaGFpbklEKVxuICBjb25zdCBhbGlhczogc3RyaW5nID0gXCJYXCJcbiAgY29uc3QgYXNzZXRJRDogQnVmZmVyID0gQnVmZmVyLmZyb20oXG4gICAgY3JlYXRlSGFzaChcInNoYTI1NlwiKVxuICAgICAgLnVwZGF0ZShcbiAgICAgICAgXCJXZWxsLCBub3csIGRvbid0IHlvdSB0ZWxsIG1lIHRvIHNtaWxlLCB5b3Ugc3RpY2sgYXJvdW5kIEknbGwgbWFrZSBpdCB3b3J0aCB5b3VyIHdoaWxlLlwiXG4gICAgICApXG4gICAgICAuZGlnZXN0KClcbiAgKVxuICBsZXQgYW1vdW50OiBCTlxuICBsZXQgYWRkcmVzc2VzOiBCdWZmZXJbXVxuICBsZXQgZmFsbEFkZHJlc3NlczogQnVmZmVyW11cbiAgbGV0IGxvY2t0aW1lOiBCTlxuICBsZXQgZmFsbExvY2t0aW1lOiBCTlxuICBsZXQgdGhyZXNob2xkOiBudW1iZXJcbiAgbGV0IGZhbGxUaHJlc2hvbGQ6IG51bWJlclxuICBjb25zdCBpcDogc3RyaW5nID0gXCIxMjcuMC4wLjFcIlxuICBjb25zdCBwb3J0OiBudW1iZXIgPSA4MDgwXG4gIGNvbnN0IHByb3RvY29sOiBzdHJpbmcgPSBcImh0dHBcIlxuICBsZXQgYXZhbGFuY2hlOiBBdmFsYW5jaGVcbiAgY29uc3QgbmFtZTogc3RyaW5nID0gXCJNb3J0eWNvaW4gaXMgdGhlIGR1bWIgYXMgYSBzYWNrIG9mIGhhbW1lcnMuXCJcbiAgY29uc3Qgc3ltYm9sOiBzdHJpbmcgPSBcIm1vclRcIlxuICBjb25zdCBkZW5vbWluYXRpb246IG51bWJlciA9IDhcbiAgbGV0IGF2YXhBc3NldElEOiBCdWZmZXJcbiAgY29uc3QgZ2VuZXNpc0RhdGFTdHI6IHN0cmluZyA9XG4gICAgXCIxMTExMURkWk1oWVhVWmlGVjlGTnBmcFRTUXJveXNqSHlNdVQ1emFwWWtQWXJtYXA3dDdTM3NETk53RnpuZ3hSOXgxWG1vUmo1SksxWG9tWDhSSHZYWVk1aDNxWWVFc01RUkY4WXBpYTdwMUNGSERvNktHU2pNZGlRa3JtcHZMOEF2b2V6U3hWV0tYdDJ1Ym1CQ25Ta3BQam5RYkJTRjdnTmc0c1B1MVBYZGgxZUtndGhhU0ZSRXFxRzVGS01yV05pUzZVODdreENtYktqa21CdnduQWQ2VHBOeDc1WUVpUzlZS015SGFCWmprUkROZjZOajFcIlxuICBjb25zdCBnZDogR2VuZXNpc0RhdGEgPSBuZXcgR2VuZXNpc0RhdGEoKVxuICBnZC5mcm9tQnVmZmVyKGJpbnRvb2xzLmNiNThEZWNvZGUoZ2VuZXNpc0RhdGFTdHIpKVxuICBjb25zdCBhZGRyZXNzSW5kZXg6IEJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyg0KVxuICBhZGRyZXNzSW5kZXgud3JpdGVVSW50QkUoMHgwLCAwLCA0KVxuXG4gIGJlZm9yZUFsbChhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgYXZhbGFuY2hlID0gbmV3IEF2YWxhbmNoZShcbiAgICAgIGlwLFxuICAgICAgcG9ydCxcbiAgICAgIHByb3RvY29sLFxuICAgICAgMTIzNDUsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0cnVlXG4gICAgKVxuICAgIGFwaSA9IG5ldyBQbGF0Zm9ybVZNQVBJKGF2YWxhbmNoZSwgXCIvZXh0L2JjL1BcIilcbiAgICBjb25zdCByZXN1bHQ6IFByb21pc2U8QnVmZmVyPiA9IGFwaS5nZXRBVkFYQXNzZXRJRCgpXG4gICAgY29uc3QgcGF5bG9hZDogb2JqZWN0ID0ge1xuICAgICAgcmVzdWx0OiB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIHN5bWJvbCxcbiAgICAgICAgYXNzZXRJRDogYmludG9vbHMuY2I1OEVuY29kZShhc3NldElEKSxcbiAgICAgICAgZGVub21pbmF0aW9uOiBgJHtkZW5vbWluYXRpb259YFxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXNwb25zZU9iajogSHR0cFJlc3BvbnNlID0ge1xuICAgICAgZGF0YTogcGF5bG9hZFxuICAgIH1cblxuICAgIG1vY2tBeGlvcy5tb2NrUmVzcG9uc2UocmVzcG9uc2VPYmopXG4gICAgYXZheEFzc2V0SUQgPSBhd2FpdCByZXN1bHRcbiAgfSlcblxuICBiZWZvcmVFYWNoKCgpOiB2b2lkID0+IHtcbiAgICBzZXQgPSBuZXcgVVRYT1NldCgpXG4gICAga2V5bWdyMSA9IG5ldyBLZXlDaGFpbihhdmFsYW5jaGUuZ2V0SFJQKCksIGFsaWFzKVxuICAgIGtleW1ncjIgPSBuZXcgS2V5Q2hhaW4oYXZhbGFuY2hlLmdldEhSUCgpLCBhbGlhcylcbiAgICBrZXltZ3IzID0gbmV3IEtleUNoYWluKGF2YWxhbmNoZS5nZXRIUlAoKSwgYWxpYXMpXG4gICAgYWRkcnMxID0gW11cbiAgICBhZGRyczIgPSBbXVxuICAgIGFkZHJzMyA9IFtdXG4gICAgdXR4b3MgPSBbXVxuICAgIGlucHV0cyA9IFtdXG4gICAgb3V0cHV0cyA9IFtdXG4gICAgaW1wb3J0SW5zID0gW11cbiAgICBpbXBvcnRVVFhPcyA9IFtdXG4gICAgZXhwb3J0T3V0cyA9IFtdXG4gICAgZnVuZ3V0eG9zID0gW11cbiAgICBleHBvcnRVVFhPSURTID0gW11cbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgMzsgaSsrKSB7XG4gICAgICBhZGRyczEucHVzaChrZXltZ3IxLm1ha2VLZXkoKS5nZXRBZGRyZXNzKCkpXG4gICAgICBhZGRyczIucHVzaChrZXltZ3IyLm1ha2VLZXkoKS5nZXRBZGRyZXNzKCkpXG4gICAgICBhZGRyczMucHVzaChrZXltZ3IzLm1ha2VLZXkoKS5nZXRBZGRyZXNzKCkpXG4gICAgfVxuICAgIGFtb3VudCA9IG5ldyBCTihhbW50KVxuICAgIGFkZHJlc3NlcyA9IGtleW1ncjEuZ2V0QWRkcmVzc2VzKClcbiAgICBmYWxsQWRkcmVzc2VzID0ga2V5bWdyMi5nZXRBZGRyZXNzZXMoKVxuICAgIGxvY2t0aW1lID0gbmV3IEJOKDU0MzIxKVxuICAgIGZhbGxMb2NrdGltZSA9IGxvY2t0aW1lLmFkZChuZXcgQk4oNTApKVxuICAgIHRocmVzaG9sZCA9IDNcbiAgICBmYWxsVGhyZXNob2xkID0gMVxuXG4gICAgY29uc3QgcGF5bG9hZDogQnVmZmVyID0gQnVmZmVyLmFsbG9jKDEwMjQpXG4gICAgcGF5bG9hZC53cml0ZShcbiAgICAgIFwiQWxsIHlvdSBUcmVra2llcyBhbmQgVFYgYWRkaWN0cywgRG9uJ3QgbWVhbiB0byBkaXNzIGRvbid0IG1lYW4gdG8gYnJpbmcgc3RhdGljLlwiLFxuICAgICAgMCxcbiAgICAgIDEwMjQsXG4gICAgICBcInV0ZjhcIlxuICAgIClcblxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCA1OyBpKyspIHtcbiAgICAgIGxldCB0eGlkOiBCdWZmZXIgPSBCdWZmZXIuZnJvbShcbiAgICAgICAgY3JlYXRlSGFzaChcInNoYTI1NlwiKVxuICAgICAgICAgIC51cGRhdGUoYmludG9vbHMuZnJvbUJOVG9CdWZmZXIobmV3IEJOKGkpLCAzMikpXG4gICAgICAgICAgLmRpZ2VzdCgpXG4gICAgICApXG4gICAgICBsZXQgdHhpZHg6IEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGJpbnRvb2xzLmZyb21CTlRvQnVmZmVyKG5ldyBCTihpKSwgNCkpXG4gICAgICBjb25zdCBvdXQ6IFNFQ1BUcmFuc2Zlck91dHB1dCA9IG5ldyBTRUNQVHJhbnNmZXJPdXRwdXQoXG4gICAgICAgIGFtb3VudCxcbiAgICAgICAgYWRkcmVzc2VzLFxuICAgICAgICBsb2NrdGltZSxcbiAgICAgICAgdGhyZXNob2xkXG4gICAgICApXG4gICAgICBjb25zdCB4ZmVyb3V0OiBUcmFuc2ZlcmFibGVPdXRwdXQgPSBuZXcgVHJhbnNmZXJhYmxlT3V0cHV0KGFzc2V0SUQsIG91dClcbiAgICAgIG91dHB1dHMucHVzaCh4ZmVyb3V0KVxuXG4gICAgICBjb25zdCB1OiBVVFhPID0gbmV3IFVUWE8oXG4gICAgICAgIFBsYXRmb3JtVk1Db25zdGFudHMuTEFURVNUQ09ERUMsXG4gICAgICAgIHR4aWQsXG4gICAgICAgIHR4aWR4LFxuICAgICAgICBhc3NldElELFxuICAgICAgICBvdXRcbiAgICAgIClcbiAgICAgIHV0eG9zLnB1c2godSlcbiAgICAgIGZ1bmd1dHhvcy5wdXNoKHUpXG4gICAgICBpbXBvcnRVVFhPcy5wdXNoKHUpXG5cbiAgICAgIHR4aWQgPSB1LmdldFR4SUQoKVxuICAgICAgdHhpZHggPSB1LmdldE91dHB1dElkeCgpXG5cbiAgICAgIGNvbnN0IGlucHV0OiBTRUNQVHJhbnNmZXJJbnB1dCA9IG5ldyBTRUNQVHJhbnNmZXJJbnB1dChhbW91bnQpXG4gICAgICBjb25zdCB4ZmVyaW46IFRyYW5zZmVyYWJsZUlucHV0ID0gbmV3IFRyYW5zZmVyYWJsZUlucHV0KFxuICAgICAgICB0eGlkLFxuICAgICAgICB0eGlkeCxcbiAgICAgICAgYXNzZXRJRCxcbiAgICAgICAgaW5wdXRcbiAgICAgIClcbiAgICAgIGlucHV0cy5wdXNoKHhmZXJpbilcbiAgICB9XG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMTsgaSA8IDQ7IGkrKykge1xuICAgICAgaW1wb3J0SW5zLnB1c2goaW5wdXRzW2ldKVxuICAgICAgZXhwb3J0T3V0cy5wdXNoKG91dHB1dHNbaV0pXG4gICAgICBleHBvcnRVVFhPSURTLnB1c2goZnVuZ3V0eG9zW2ldLmdldFVUWE9JRCgpKVxuICAgIH1cbiAgICBzZXQuYWRkQXJyYXkodXR4b3MpXG4gIH0pXG5cbiAgdGVzdChcIkNyZWF0ZSBzbWFsbCBCYXNlVHggdGhhdCBpcyBHb29zZSBFZ2cgVHhcIiwgYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IG91dHM6IFRyYW5zZmVyYWJsZU91dHB1dFtdID0gW11cbiAgICBjb25zdCBpbnM6IFRyYW5zZmVyYWJsZUlucHV0W10gPSBbXVxuICAgIGNvbnN0IG91dHB1dEFtdDogQk4gPSBuZXcgQk4oXCIyNjZcIilcbiAgICBjb25zdCBvdXRwdXQ6IFNFQ1BUcmFuc2Zlck91dHB1dCA9IG5ldyBTRUNQVHJhbnNmZXJPdXRwdXQoXG4gICAgICBvdXRwdXRBbXQsXG4gICAgICBhZGRyczEsXG4gICAgICBuZXcgQk4oMCksXG4gICAgICAxXG4gICAgKVxuICAgIGNvbnN0IHRyYW5zZmVyYWJsZU91dHB1dDogVHJhbnNmZXJhYmxlT3V0cHV0ID0gbmV3IFRyYW5zZmVyYWJsZU91dHB1dChcbiAgICAgIGF2YXhBc3NldElELFxuICAgICAgb3V0cHV0XG4gICAgKVxuICAgIG91dHMucHVzaCh0cmFuc2ZlcmFibGVPdXRwdXQpXG4gICAgY29uc3QgaW5wdXRBbXQ6IEJOID0gbmV3IEJOKFwiNDAwXCIpXG4gICAgY29uc3QgaW5wdXQ6IFNFQ1BUcmFuc2ZlcklucHV0ID0gbmV3IFNFQ1BUcmFuc2ZlcklucHV0KGlucHV0QW10KVxuICAgIGlucHV0LmFkZFNpZ25hdHVyZUlkeCgwLCBhZGRyczFbMF0pXG4gICAgY29uc3QgdHhpZDogQnVmZmVyID0gYmludG9vbHMuY2I1OERlY29kZShcbiAgICAgIFwibjhYSDVKWTFFWDVWWXFEZUFoQjRaZDRHS3hpOVVOUXk2b1BwTXNDQWoxUTZ4a2lpTFwiXG4gICAgKVxuICAgIGNvbnN0IG91dHB1dEluZGV4OiBCdWZmZXIgPSBCdWZmZXIuZnJvbShcbiAgICAgIGJpbnRvb2xzLmZyb21CTlRvQnVmZmVyKG5ldyBCTigwKSwgNClcbiAgICApXG4gICAgY29uc3QgdHJhbnNmZXJhYmxlSW5wdXQ6IFRyYW5zZmVyYWJsZUlucHV0ID0gbmV3IFRyYW5zZmVyYWJsZUlucHV0KFxuICAgICAgdHhpZCxcbiAgICAgIG91dHB1dEluZGV4LFxuICAgICAgYXZheEFzc2V0SUQsXG4gICAgICBpbnB1dFxuICAgIClcbiAgICBpbnMucHVzaCh0cmFuc2ZlcmFibGVJbnB1dClcbiAgICBjb25zdCBiYXNlVHg6IEJhc2VUeCA9IG5ldyBCYXNlVHgobmV0d29ya0lELCBibG9ja2NoYWluSUQsIG91dHMsIGlucylcbiAgICBjb25zdCB1bnNpZ25lZFR4OiBVbnNpZ25lZFR4ID0gbmV3IFVuc2lnbmVkVHgoYmFzZVR4KVxuICAgIGV4cGVjdChhd2FpdCBhcGkuY2hlY2tHb29zZUVnZyh1bnNpZ25lZFR4KSkudG9CZSh0cnVlKVxuICB9KVxuXG4gIHRlc3QoXCJjb25maXJtIGlucHV0VG90YWwsIG91dHB1dFRvdGFsIGFuZCBmZWUgYXJlIGNvcnJlY3RcIiwgYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IGJpbnRvb2xzOiBCaW5Ub29scyA9IEJpblRvb2xzLmdldEluc3RhbmNlKClcbiAgICAvLyBsb2NhbCBuZXR3b3JrIFAgQ2hhaW4gSURcbiAgICAvLyBBVkFYIGFzc2V0SURcbiAgICBjb25zdCBhc3NldElEOiBCdWZmZXIgPSBiaW50b29scy5jYjU4RGVjb2RlKFxuICAgICAgXCJuOFhINUpZMUVYNVZZcURlQWhCNFpkNEdLeGk5VU5ReTZvUHBNc0NBajFRNnhraWlMXCJcbiAgICApXG4gICAgY29uc3Qgb3V0czogVHJhbnNmZXJhYmxlT3V0cHV0W10gPSBbXVxuICAgIGNvbnN0IGluczogVHJhbnNmZXJhYmxlSW5wdXRbXSA9IFtdXG4gICAgY29uc3Qgb3V0cHV0QW10OiBCTiA9IG5ldyBCTihcIjI2NlwiKVxuICAgIGNvbnN0IG91dHB1dDogU0VDUFRyYW5zZmVyT3V0cHV0ID0gbmV3IFNFQ1BUcmFuc2Zlck91dHB1dChcbiAgICAgIG91dHB1dEFtdCxcbiAgICAgIGFkZHJzMSxcbiAgICAgIG5ldyBCTigwKSxcbiAgICAgIDFcbiAgICApXG4gICAgY29uc3QgdHJhbnNmZXJhYmxlT3V0cHV0OiBUcmFuc2ZlcmFibGVPdXRwdXQgPSBuZXcgVHJhbnNmZXJhYmxlT3V0cHV0KFxuICAgICAgYXNzZXRJRCxcbiAgICAgIG91dHB1dFxuICAgIClcbiAgICBvdXRzLnB1c2godHJhbnNmZXJhYmxlT3V0cHV0KVxuICAgIGNvbnN0IGlucHV0QW10OiBCTiA9IG5ldyBCTihcIjQwMFwiKVxuICAgIGNvbnN0IGlucHV0OiBTRUNQVHJhbnNmZXJJbnB1dCA9IG5ldyBTRUNQVHJhbnNmZXJJbnB1dChpbnB1dEFtdClcbiAgICBpbnB1dC5hZGRTaWduYXR1cmVJZHgoMCwgYWRkcnMxWzBdKVxuICAgIGNvbnN0IHR4aWQ6IEJ1ZmZlciA9IGJpbnRvb2xzLmNiNThEZWNvZGUoXG4gICAgICBcIm44WEg1SlkxRVg1VllxRGVBaEI0WmQ0R0t4aTlVTlF5Nm9QcE1zQ0FqMVE2eGtpaUxcIlxuICAgIClcbiAgICBjb25zdCBvdXRwdXRJbmRleDogQnVmZmVyID0gQnVmZmVyLmZyb20oXG4gICAgICBiaW50b29scy5mcm9tQk5Ub0J1ZmZlcihuZXcgQk4oMCksIDQpXG4gICAgKVxuICAgIGNvbnN0IHRyYW5zZmVyYWJsZUlucHV0OiBUcmFuc2ZlcmFibGVJbnB1dCA9IG5ldyBUcmFuc2ZlcmFibGVJbnB1dChcbiAgICAgIHR4aWQsXG4gICAgICBvdXRwdXRJbmRleCxcbiAgICAgIGFzc2V0SUQsXG4gICAgICBpbnB1dFxuICAgIClcbiAgICBpbnMucHVzaCh0cmFuc2ZlcmFibGVJbnB1dClcbiAgICBjb25zdCBiYXNlVHg6IEJhc2VUeCA9IG5ldyBCYXNlVHgobmV0d29ya0lELCBibG9ja2NoYWluSUQsIG91dHMsIGlucylcbiAgICBjb25zdCB1bnNpZ25lZFR4OiBVbnNpZ25lZFR4ID0gbmV3IFVuc2lnbmVkVHgoYmFzZVR4KVxuICAgIGNvbnN0IGlucHV0VG90YWw6IEJOID0gdW5zaWduZWRUeC5nZXRJbnB1dFRvdGFsKGFzc2V0SUQpXG4gICAgY29uc3Qgb3V0cHV0VG90YWw6IEJOID0gdW5zaWduZWRUeC5nZXRPdXRwdXRUb3RhbChhc3NldElEKVxuICAgIGNvbnN0IGJ1cm46IEJOID0gdW5zaWduZWRUeC5nZXRCdXJuKGFzc2V0SUQpXG4gICAgZXhwZWN0KGlucHV0VG90YWwudG9OdW1iZXIoKSkudG9FcXVhbChuZXcgQk4oNDAwKS50b051bWJlcigpKVxuICAgIGV4cGVjdChvdXRwdXRUb3RhbC50b051bWJlcigpKS50b0VxdWFsKG5ldyBCTigyNjYpLnRvTnVtYmVyKCkpXG4gICAgZXhwZWN0KGJ1cm4udG9OdW1iZXIoKSkudG9FcXVhbChuZXcgQk4oMTM0KS50b051bWJlcigpKVxuICB9KVxuXG4gIHRlc3QoXCJDcmVhdGUgc21hbGwgQmFzZVR4IHRoYXQgaXNuJ3QgR29vc2UgRWdnIFR4XCIsIGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAvLyBsb2NhbCBuZXR3b3JrIFggQ2hhaW4gSURcbiAgICBjb25zdCBvdXRzOiBUcmFuc2ZlcmFibGVPdXRwdXRbXSA9IFtdXG4gICAgY29uc3QgaW5zOiBUcmFuc2ZlcmFibGVJbnB1dFtdID0gW11cbiAgICBjb25zdCBvdXRwdXRBbXQ6IEJOID0gbmV3IEJOKFwiMjY3XCIpXG4gICAgY29uc3Qgb3V0cHV0OiBTRUNQVHJhbnNmZXJPdXRwdXQgPSBuZXcgU0VDUFRyYW5zZmVyT3V0cHV0KFxuICAgICAgb3V0cHV0QW10LFxuICAgICAgYWRkcnMxLFxuICAgICAgbmV3IEJOKDApLFxuICAgICAgMVxuICAgIClcbiAgICBjb25zdCB0cmFuc2ZlcmFibGVPdXRwdXQ6IFRyYW5zZmVyYWJsZU91dHB1dCA9IG5ldyBUcmFuc2ZlcmFibGVPdXRwdXQoXG4gICAgICBhdmF4QXNzZXRJRCxcbiAgICAgIG91dHB1dFxuICAgIClcbiAgICBvdXRzLnB1c2godHJhbnNmZXJhYmxlT3V0cHV0KVxuICAgIGNvbnN0IGlucHV0QW10OiBCTiA9IG5ldyBCTihcIjQwMFwiKVxuICAgIGNvbnN0IGlucHV0OiBTRUNQVHJhbnNmZXJJbnB1dCA9IG5ldyBTRUNQVHJhbnNmZXJJbnB1dChpbnB1dEFtdClcbiAgICBpbnB1dC5hZGRTaWduYXR1cmVJZHgoMCwgYWRkcnMxWzBdKVxuICAgIGNvbnN0IHR4aWQ6IEJ1ZmZlciA9IGJpbnRvb2xzLmNiNThEZWNvZGUoXG4gICAgICBcIm44WEg1SlkxRVg1VllxRGVBaEI0WmQ0R0t4aTlVTlF5Nm9QcE1zQ0FqMVE2eGtpaUxcIlxuICAgIClcbiAgICBjb25zdCBvdXRwdXRJbmRleDogQnVmZmVyID0gQnVmZmVyLmZyb20oXG4gICAgICBiaW50b29scy5mcm9tQk5Ub0J1ZmZlcihuZXcgQk4oMCksIDQpXG4gICAgKVxuICAgIGNvbnN0IHRyYW5zZmVyYWJsZUlucHV0OiBUcmFuc2ZlcmFibGVJbnB1dCA9IG5ldyBUcmFuc2ZlcmFibGVJbnB1dChcbiAgICAgIHR4aWQsXG4gICAgICBvdXRwdXRJbmRleCxcbiAgICAgIGF2YXhBc3NldElELFxuICAgICAgaW5wdXRcbiAgICApXG4gICAgaW5zLnB1c2godHJhbnNmZXJhYmxlSW5wdXQpXG4gICAgY29uc3QgYmFzZVR4OiBCYXNlVHggPSBuZXcgQmFzZVR4KG5ldHdvcmtJRCwgYmxvY2tjaGFpbklELCBvdXRzLCBpbnMpXG4gICAgY29uc3QgdW5zaWduZWRUeDogVW5zaWduZWRUeCA9IG5ldyBVbnNpZ25lZFR4KGJhc2VUeClcbiAgICBleHBlY3QoYXdhaXQgYXBpLmNoZWNrR29vc2VFZ2codW5zaWduZWRUeCkpLnRvQmUodHJ1ZSlcbiAgfSlcblxuICB0ZXN0KFwiQ3JlYXRlIGxhcmdlIEJhc2VUeCB0aGF0IGlzIEdvb3NlIEVnZyBUeFwiLCBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgLy8gbG9jYWwgbmV0d29yayBQIENoYWluIElEXG4gICAgY29uc3Qgb3V0czogVHJhbnNmZXJhYmxlT3V0cHV0W10gPSBbXVxuICAgIGNvbnN0IGluczogVHJhbnNmZXJhYmxlSW5wdXRbXSA9IFtdXG4gICAgY29uc3Qgb3V0cHV0QW10OiBCTiA9IG5ldyBCTihcIjYwOTU1NTUwMDAwMFwiKVxuICAgIGNvbnN0IG91dHB1dDogU0VDUFRyYW5zZmVyT3V0cHV0ID0gbmV3IFNFQ1BUcmFuc2Zlck91dHB1dChcbiAgICAgIG91dHB1dEFtdCxcbiAgICAgIGFkZHJzMSxcbiAgICAgIG5ldyBCTigwKSxcbiAgICAgIDFcbiAgICApXG4gICAgY29uc3QgdHJhbnNmZXJhYmxlT3V0cHV0OiBUcmFuc2ZlcmFibGVPdXRwdXQgPSBuZXcgVHJhbnNmZXJhYmxlT3V0cHV0KFxuICAgICAgYXZheEFzc2V0SUQsXG4gICAgICBvdXRwdXRcbiAgICApXG4gICAgb3V0cy5wdXNoKHRyYW5zZmVyYWJsZU91dHB1dClcbiAgICBjb25zdCBpbnB1dEFtdDogQk4gPSBuZXcgQk4oXCI0NTAwMDAwMDAwMDAwMDAwMFwiKVxuICAgIGNvbnN0IGlucHV0OiBTRUNQVHJhbnNmZXJJbnB1dCA9IG5ldyBTRUNQVHJhbnNmZXJJbnB1dChpbnB1dEFtdClcbiAgICBpbnB1dC5hZGRTaWduYXR1cmVJZHgoMCwgYWRkcnMxWzBdKVxuICAgIGNvbnN0IHR4aWQ6IEJ1ZmZlciA9IGJpbnRvb2xzLmNiNThEZWNvZGUoXG4gICAgICBcIm44WEg1SlkxRVg1VllxRGVBaEI0WmQ0R0t4aTlVTlF5Nm9QcE1zQ0FqMVE2eGtpaUxcIlxuICAgIClcbiAgICBjb25zdCBvdXRwdXRJbmRleDogQnVmZmVyID0gQnVmZmVyLmZyb20oXG4gICAgICBiaW50b29scy5mcm9tQk5Ub0J1ZmZlcihuZXcgQk4oMCksIDQpXG4gICAgKVxuICAgIGNvbnN0IHRyYW5zZmVyYWJsZUlucHV0OiBUcmFuc2ZlcmFibGVJbnB1dCA9IG5ldyBUcmFuc2ZlcmFibGVJbnB1dChcbiAgICAgIHR4aWQsXG4gICAgICBvdXRwdXRJbmRleCxcbiAgICAgIGF2YXhBc3NldElELFxuICAgICAgaW5wdXRcbiAgICApXG4gICAgaW5zLnB1c2godHJhbnNmZXJhYmxlSW5wdXQpXG4gICAgY29uc3QgYmFzZVR4OiBCYXNlVHggPSBuZXcgQmFzZVR4KG5ldHdvcmtJRCwgYmxvY2tjaGFpbklELCBvdXRzLCBpbnMpXG4gICAgY29uc3QgdW5zaWduZWRUeDogVW5zaWduZWRUeCA9IG5ldyBVbnNpZ25lZFR4KGJhc2VUeClcbiAgICBleHBlY3QoYXdhaXQgYXBpLmNoZWNrR29vc2VFZ2codW5zaWduZWRUeCkpLnRvQmUoZmFsc2UpXG4gIH0pXG5cbiAgdGVzdChcIkNyZWF0ZSBsYXJnZSBCYXNlVHggdGhhdCBpc24ndCBHb29zZSBFZ2cgVHhcIiwgYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIC8vIGxvY2FsIG5ldHdvcmsgUCBDaGFpbiBJRFxuICAgIGNvbnN0IG91dHM6IFRyYW5zZmVyYWJsZU91dHB1dFtdID0gW11cbiAgICBjb25zdCBpbnM6IFRyYW5zZmVyYWJsZUlucHV0W10gPSBbXVxuICAgIGNvbnN0IG91dHB1dEFtdDogQk4gPSBuZXcgQk4oXCI0NDk5NTYwOTU1NTUwMDAwMFwiKVxuICAgIGNvbnN0IG91dHB1dDogU0VDUFRyYW5zZmVyT3V0cHV0ID0gbmV3IFNFQ1BUcmFuc2Zlck91dHB1dChcbiAgICAgIG91dHB1dEFtdCxcbiAgICAgIGFkZHJzMSxcbiAgICAgIG5ldyBCTigwKSxcbiAgICAgIDFcbiAgICApXG4gICAgY29uc3QgdHJhbnNmZXJhYmxlT3V0cHV0OiBUcmFuc2ZlcmFibGVPdXRwdXQgPSBuZXcgVHJhbnNmZXJhYmxlT3V0cHV0KFxuICAgICAgYXZheEFzc2V0SUQsXG4gICAgICBvdXRwdXRcbiAgICApXG4gICAgb3V0cy5wdXNoKHRyYW5zZmVyYWJsZU91dHB1dClcbiAgICBjb25zdCBpbnB1dEFtdDogQk4gPSBuZXcgQk4oXCI0NTAwMDAwMDAwMDAwMDAwMFwiKVxuICAgIGNvbnN0IGlucHV0OiBTRUNQVHJhbnNmZXJJbnB1dCA9IG5ldyBTRUNQVHJhbnNmZXJJbnB1dChpbnB1dEFtdClcbiAgICBpbnB1dC5hZGRTaWduYXR1cmVJZHgoMCwgYWRkcnMxWzBdKVxuICAgIGNvbnN0IHR4aWQ6IEJ1ZmZlciA9IGJpbnRvb2xzLmNiNThEZWNvZGUoXG4gICAgICBcIm44WEg1SlkxRVg1VllxRGVBaEI0WmQ0R0t4aTlVTlF5Nm9QcE1zQ0FqMVE2eGtpaUxcIlxuICAgIClcbiAgICBjb25zdCBvdXRwdXRJbmRleDogQnVmZmVyID0gQnVmZmVyLmZyb20oXG4gICAgICBiaW50b29scy5mcm9tQk5Ub0J1ZmZlcihuZXcgQk4oMCksIDQpXG4gICAgKVxuICAgIGNvbnN0IHRyYW5zZmVyYWJsZUlucHV0OiBUcmFuc2ZlcmFibGVJbnB1dCA9IG5ldyBUcmFuc2ZlcmFibGVJbnB1dChcbiAgICAgIHR4aWQsXG4gICAgICBvdXRwdXRJbmRleCxcbiAgICAgIGF2YXhBc3NldElELFxuICAgICAgaW5wdXRcbiAgICApXG4gICAgaW5zLnB1c2godHJhbnNmZXJhYmxlSW5wdXQpXG4gICAgY29uc3QgYmFzZVR4OiBCYXNlVHggPSBuZXcgQmFzZVR4KG5ldHdvcmtJRCwgYmxvY2tjaGFpbklELCBvdXRzLCBpbnMpXG4gICAgY29uc3QgdW5zaWduZWRUeDogVW5zaWduZWRUeCA9IG5ldyBVbnNpZ25lZFR4KGJhc2VUeClcbiAgICBleHBlY3QoYXdhaXQgYXBpLmNoZWNrR29vc2VFZ2codW5zaWduZWRUeCkpLnRvQmUodHJ1ZSlcbiAgfSlcblxuICB0ZXN0KFwiQ3JlYXRpb24gVW5zaWduZWRUeFwiLCAoKTogdm9pZCA9PiB7XG4gICAgY29uc3QgYmFzZVR4OiBCYXNlVHggPSBuZXcgQmFzZVR4KG5ldGlkLCBibG9ja2NoYWluSUQsIG91dHB1dHMsIGlucHV0cylcbiAgICBjb25zdCB0eHU6IFVuc2lnbmVkVHggPSBuZXcgVW5zaWduZWRUeChiYXNlVHgpXG4gICAgY29uc3QgdHhpbnM6IFRyYW5zZmVyYWJsZUlucHV0W10gPSB0eHUuZ2V0VHJhbnNhY3Rpb24oKS5nZXRJbnMoKVxuICAgIGNvbnN0IHR4b3V0czogVHJhbnNmZXJhYmxlT3V0cHV0W10gPSB0eHUuZ2V0VHJhbnNhY3Rpb24oKS5nZXRPdXRzKClcbiAgICBleHBlY3QodHhpbnMubGVuZ3RoKS50b0JlKGlucHV0cy5sZW5ndGgpXG4gICAgZXhwZWN0KHR4b3V0cy5sZW5ndGgpLnRvQmUob3V0cHV0cy5sZW5ndGgpXG5cbiAgICBleHBlY3QodHh1LmdldFRyYW5zYWN0aW9uKCkuZ2V0VHhUeXBlKCkpLnRvQmUoMClcbiAgICBleHBlY3QodHh1LmdldFRyYW5zYWN0aW9uKCkuZ2V0TmV0d29ya0lEKCkpLnRvQmUoMTIzNDUpXG4gICAgZXhwZWN0KHR4dS5nZXRUcmFuc2FjdGlvbigpLmdldEJsb2NrY2hhaW5JRCgpLnRvU3RyaW5nKFwiaGV4XCIpKS50b0JlKFxuICAgICAgYmxvY2tjaGFpbklELnRvU3RyaW5nKFwiaGV4XCIpXG4gICAgKVxuXG4gICAgbGV0IGE6IHN0cmluZ1tdID0gW11cbiAgICBsZXQgYjogc3RyaW5nW10gPSBbXVxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0eGlucy5sZW5ndGg7IGkrKykge1xuICAgICAgYS5wdXNoKHR4aW5zW2ldLnRvU3RyaW5nKCkpXG4gICAgICBiLnB1c2goaW5wdXRzW2ldLnRvU3RyaW5nKCkpXG4gICAgfVxuICAgIGV4cGVjdChKU09OLnN0cmluZ2lmeShhLnNvcnQoKSkpLnRvQmUoSlNPTi5zdHJpbmdpZnkoYi5zb3J0KCkpKVxuXG4gICAgYSA9IFtdXG4gICAgYiA9IFtdXG5cbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdHhvdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhLnB1c2godHhvdXRzW2ldLnRvU3RyaW5nKCkpXG4gICAgICBiLnB1c2gob3V0cHV0c1tpXS50b1N0cmluZygpKVxuICAgIH1cbiAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkoYS5zb3J0KCkpKS50b0JlKEpTT04uc3RyaW5naWZ5KGIuc29ydCgpKSlcblxuICAgIGNvbnN0IHR4dW5ldzogVW5zaWduZWRUeCA9IG5ldyBVbnNpZ25lZFR4KClcbiAgICB0eHVuZXcuZnJvbUJ1ZmZlcih0eHUudG9CdWZmZXIoKSlcbiAgICBleHBlY3QodHh1bmV3LnRvQnVmZmVyKCkudG9TdHJpbmcoXCJoZXhcIikpLnRvQmUoXG4gICAgICB0eHUudG9CdWZmZXIoKS50b1N0cmluZyhcImhleFwiKVxuICAgIClcbiAgICBleHBlY3QodHh1bmV3LnRvU3RyaW5nKCkpLnRvQmUodHh1LnRvU3RyaW5nKCkpXG4gIH0pXG5cbiAgdGVzdChcIkNyZWF0aW9uIFVuc2lnbmVkVHggQ2hlY2sgQW1vdW50XCIsICgpOiB2b2lkID0+IHtcbiAgICBleHBlY3QoKCk6IHZvaWQgPT4ge1xuICAgICAgc2V0LmJ1aWxkQmFzZVR4KFxuICAgICAgICBuZXRpZCxcbiAgICAgICAgYmxvY2tjaGFpbklELFxuICAgICAgICBuZXcgQk4oYW1udCAqIDEwMDApLFxuICAgICAgICBhc3NldElELFxuICAgICAgICBhZGRyczMsXG4gICAgICAgIGFkZHJzMSxcbiAgICAgICAgYWRkcnMxXG4gICAgICApXG4gICAgfSkudG9UaHJvdygpXG4gIH0pXG5cbiAgdGVzdChcIkNyZWF0aW9uIEltcG9ydFR4XCIsICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCBib21idHg6IEltcG9ydFR4ID0gbmV3IEltcG9ydFR4KFxuICAgICAgbmV0aWQsXG4gICAgICBibG9ja2NoYWluSUQsXG4gICAgICBvdXRwdXRzLFxuICAgICAgaW5wdXRzLFxuICAgICAgbmV3IFVURjhQYXlsb2FkKFwiaGVsbG8gd29ybGRcIikuZ2V0UGF5bG9hZCgpLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgaW1wb3J0SW5zXG4gICAgKVxuXG4gICAgZXhwZWN0KCgpOiB2b2lkID0+IHtcbiAgICAgIGJvbWJ0eC50b0J1ZmZlcigpXG4gICAgfSkudG9UaHJvdygpXG5cbiAgICBjb25zdCBpbXBvcnRUeDogSW1wb3J0VHggPSBuZXcgSW1wb3J0VHgoXG4gICAgICBuZXRpZCxcbiAgICAgIGJsb2NrY2hhaW5JRCxcbiAgICAgIG91dHB1dHMsXG4gICAgICBpbnB1dHMsXG4gICAgICBuZXcgVVRGOFBheWxvYWQoXCJoZWxsbyB3b3JsZFwiKS5nZXRQYXlsb2FkKCksXG4gICAgICBiaW50b29scy5jYjU4RGVjb2RlKFBsYXRmb3JtQ2hhaW5JRCksXG4gICAgICBpbXBvcnRJbnNcbiAgICApXG4gICAgY29uc3QgdHh1bmV3OiBJbXBvcnRUeCA9IG5ldyBJbXBvcnRUeCgpXG4gICAgY29uc3QgaW1wb3J0YnVmZjogQnVmZmVyID0gaW1wb3J0VHgudG9CdWZmZXIoKVxuICAgIHR4dW5ldy5mcm9tQnVmZmVyKGltcG9ydGJ1ZmYpXG5cbiAgICBleHBlY3QoaW1wb3J0VHgpLnRvQmVJbnN0YW5jZU9mKEltcG9ydFR4KVxuICAgIGV4cGVjdChpbXBvcnRUeC5nZXRTb3VyY2VDaGFpbigpLnRvU3RyaW5nKFwiaGV4XCIpKS50b0JlKFxuICAgICAgYmludG9vbHMuY2I1OERlY29kZShQbGF0Zm9ybUNoYWluSUQpLnRvU3RyaW5nKFwiaGV4XCIpXG4gICAgKVxuICAgIGV4cGVjdCh0eHVuZXcudG9CdWZmZXIoKS50b1N0cmluZyhcImhleFwiKSkudG9CZShpbXBvcnRidWZmLnRvU3RyaW5nKFwiaGV4XCIpKVxuICAgIGV4cGVjdCh0eHVuZXcudG9TdHJpbmcoKSkudG9CZShpbXBvcnRUeC50b1N0cmluZygpKVxuICAgIGV4cGVjdChpbXBvcnRUeC5nZXRJbXBvcnRJbnB1dHMoKS5sZW5ndGgpLnRvQmUoaW1wb3J0SW5zLmxlbmd0aClcbiAgfSlcblxuICB0ZXN0KFwiQ3JlYXRpb24gRXhwb3J0VHhcIiwgKCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGJvbWJ0eDogRXhwb3J0VHggPSBuZXcgRXhwb3J0VHgoXG4gICAgICBuZXRpZCxcbiAgICAgIGJsb2NrY2hhaW5JRCxcbiAgICAgIG91dHB1dHMsXG4gICAgICBpbnB1dHMsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBleHBvcnRPdXRzXG4gICAgKVxuXG4gICAgZXhwZWN0KCgpOiB2b2lkID0+IHtcbiAgICAgIGJvbWJ0eC50b0J1ZmZlcigpXG4gICAgfSkudG9UaHJvdygpXG5cbiAgICBjb25zdCBleHBvcnRUeDogRXhwb3J0VHggPSBuZXcgRXhwb3J0VHgoXG4gICAgICBuZXRpZCxcbiAgICAgIGJsb2NrY2hhaW5JRCxcbiAgICAgIG91dHB1dHMsXG4gICAgICBpbnB1dHMsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBiaW50b29scy5jYjU4RGVjb2RlKFBsYXRmb3JtQ2hhaW5JRCksXG4gICAgICBleHBvcnRPdXRzXG4gICAgKVxuICAgIGNvbnN0IHR4dW5ldzogRXhwb3J0VHggPSBuZXcgRXhwb3J0VHgoKVxuICAgIGNvbnN0IGV4cG9ydGJ1ZmY6IEJ1ZmZlciA9IGV4cG9ydFR4LnRvQnVmZmVyKClcbiAgICB0eHVuZXcuZnJvbUJ1ZmZlcihleHBvcnRidWZmKVxuXG4gICAgZXhwZWN0KGV4cG9ydFR4KS50b0JlSW5zdGFuY2VPZihFeHBvcnRUeClcbiAgICBleHBlY3QoZXhwb3J0VHguZ2V0RGVzdGluYXRpb25DaGFpbigpLnRvU3RyaW5nKFwiaGV4XCIpKS50b0JlKFxuICAgICAgYmludG9vbHMuY2I1OERlY29kZShQbGF0Zm9ybUNoYWluSUQpLnRvU3RyaW5nKFwiaGV4XCIpXG4gICAgKVxuICAgIGV4cGVjdCh0eHVuZXcudG9CdWZmZXIoKS50b1N0cmluZyhcImhleFwiKSkudG9CZShleHBvcnRidWZmLnRvU3RyaW5nKFwiaGV4XCIpKVxuICAgIGV4cGVjdCh0eHVuZXcudG9TdHJpbmcoKSkudG9CZShleHBvcnRUeC50b1N0cmluZygpKVxuICAgIGV4cGVjdChleHBvcnRUeC5nZXRFeHBvcnRPdXRwdXRzKCkubGVuZ3RoKS50b0JlKGV4cG9ydE91dHMubGVuZ3RoKVxuICB9KVxuXG4gIHRlc3QoXCJDcmVhdGlvbiBUeDEgd2l0aCBhc29mLCBsb2NrdGltZSwgdGhyZXNob2xkXCIsICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCB0eHU6IFVuc2lnbmVkVHggPSBzZXQuYnVpbGRCYXNlVHgoXG4gICAgICBuZXRpZCxcbiAgICAgIGJsb2NrY2hhaW5JRCxcbiAgICAgIG5ldyBCTig5MDAwKSxcbiAgICAgIGFzc2V0SUQsXG4gICAgICBhZGRyczMsXG4gICAgICBhZGRyczEsXG4gICAgICBhZGRyczEsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBVbml4Tm93KCksXG4gICAgICBVbml4Tm93KCkuYWRkKG5ldyBCTig1MCkpLFxuICAgICAgMVxuICAgIClcbiAgICBjb25zdCB0eDogVHggPSB0eHUuc2lnbihrZXltZ3IxKVxuXG4gICAgY29uc3QgdHgyOiBUeCA9IG5ldyBUeCgpXG4gICAgdHgyLmZyb21TdHJpbmcodHgudG9TdHJpbmcoKSlcbiAgICBleHBlY3QodHgyLnRvQnVmZmVyKCkudG9TdHJpbmcoXCJoZXhcIikpLnRvQmUodHgudG9CdWZmZXIoKS50b1N0cmluZyhcImhleFwiKSlcbiAgICBleHBlY3QodHgyLnRvU3RyaW5nKCkpLnRvQmUodHgudG9TdHJpbmcoKSlcbiAgfSlcbiAgdGVzdChcIkNyZWF0aW9uIFR4MiB3aXRob3V0IGFzb2YsIGxvY2t0aW1lLCB0aHJlc2hvbGRcIiwgKCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHR4dTogVW5zaWduZWRUeCA9IHNldC5idWlsZEJhc2VUeChcbiAgICAgIG5ldGlkLFxuICAgICAgYmxvY2tjaGFpbklELFxuICAgICAgbmV3IEJOKDkwMDApLFxuICAgICAgYXNzZXRJRCxcbiAgICAgIGFkZHJzMyxcbiAgICAgIGFkZHJzMSxcbiAgICAgIGFkZHJzMVxuICAgIClcbiAgICBjb25zdCB0eDogVHggPSB0eHUuc2lnbihrZXltZ3IxKVxuICAgIGNvbnN0IHR4MjogVHggPSBuZXcgVHgoKVxuICAgIHR4Mi5mcm9tQnVmZmVyKHR4LnRvQnVmZmVyKCkpXG4gICAgZXhwZWN0KHR4Mi50b0J1ZmZlcigpLnRvU3RyaW5nKFwiaGV4XCIpKS50b0JlKHR4LnRvQnVmZmVyKCkudG9TdHJpbmcoXCJoZXhcIikpXG4gICAgZXhwZWN0KHR4Mi50b1N0cmluZygpKS50b0JlKHR4LnRvU3RyaW5nKCkpXG4gIH0pXG5cbiAgdGVzdChcIkNyZWF0aW9uIFR4NCB1c2luZyBJbXBvcnRUeFwiLCAoKTogdm9pZCA9PiB7XG4gICAgY29uc3QgdHh1OiBVbnNpZ25lZFR4ID0gc2V0LmJ1aWxkSW1wb3J0VHgoXG4gICAgICBuZXRpZCxcbiAgICAgIGJsb2NrY2hhaW5JRCxcbiAgICAgIGFkZHJzMyxcbiAgICAgIGFkZHJzMSxcbiAgICAgIGFkZHJzMixcbiAgICAgIGltcG9ydFVUWE9zLFxuICAgICAgYmludG9vbHMuY2I1OERlY29kZShQbGF0Zm9ybUNoYWluSUQpLFxuICAgICAgbmV3IEJOKDkwKSxcbiAgICAgIGFzc2V0SUQsXG4gICAgICBuZXcgVVRGOFBheWxvYWQoXCJoZWxsbyB3b3JsZFwiKS5nZXRQYXlsb2FkKCksXG4gICAgICBVbml4Tm93KClcbiAgICApXG4gICAgY29uc3QgdHg6IFR4ID0gdHh1LnNpZ24oa2V5bWdyMSlcbiAgICBjb25zdCB0eDI6IFR4ID0gbmV3IFR4KClcbiAgICB0eDIuZnJvbUJ1ZmZlcih0eC50b0J1ZmZlcigpKVxuICAgIGV4cGVjdCh0eDIudG9CdWZmZXIoKS50b1N0cmluZyhcImhleFwiKSkudG9CZSh0eC50b0J1ZmZlcigpLnRvU3RyaW5nKFwiaGV4XCIpKVxuICB9KVxuXG4gIHRlc3QoXCJDcmVhdGlvbiBUeDUgdXNpbmcgRXhwb3J0VHhcIiwgKCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHR4dTogVW5zaWduZWRUeCA9IHNldC5idWlsZEV4cG9ydFR4KFxuICAgICAgbmV0aWQsXG4gICAgICBibG9ja2NoYWluSUQsXG4gICAgICBuZXcgQk4oOTApLFxuICAgICAgYXZheEFzc2V0SUQsXG4gICAgICBhZGRyczMsXG4gICAgICBhZGRyczEsXG4gICAgICBhZGRyczIsXG4gICAgICBiaW50b29scy5jYjU4RGVjb2RlKFBsYXRmb3JtQ2hhaW5JRCksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBuZXcgVVRGOFBheWxvYWQoXCJoZWxsbyB3b3JsZFwiKS5nZXRQYXlsb2FkKCksXG4gICAgICBVbml4Tm93KClcbiAgICApXG4gICAgY29uc3QgdHg6IFR4ID0gdHh1LnNpZ24oa2V5bWdyMSlcbiAgICBjb25zdCB0eDI6IFR4ID0gbmV3IFR4KClcbiAgICB0eDIuZnJvbUJ1ZmZlcih0eC50b0J1ZmZlcigpKVxuICAgIGV4cGVjdCh0eC50b0J1ZmZlcigpLnRvU3RyaW5nKFwiaGV4XCIpKS50b0JlKHR4Mi50b0J1ZmZlcigpLnRvU3RyaW5nKFwiaGV4XCIpKVxuICB9KVxufSlcbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!