@kubectl/caminojs
Version:
Camino Platform JS Library
256 lines • 31.2 kB
JavaScript
"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 (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
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 });
exports.utils = exports.platformvm = exports.metrics = exports.keystore = exports.info = exports.index = exports.health = exports.evm = exports.common = exports.avm = exports.auth = exports.admin = exports.Socket = exports.PubSub = exports.Mnemonic = exports.GenesisData = exports.GenesisAsset = exports.HDNode = exports.DB = exports.Buffer = exports.BN = exports.BinTools = exports.AvalancheCore = exports.Avalanche = void 0;
/**
* @packageDocumentation
* @module Avalanche
*/
const camino_1 = __importDefault(require("./camino"));
exports.AvalancheCore = camino_1.default;
const api_1 = require("./apis/admin/api");
const api_2 = require("./apis/auth/api");
const api_3 = require("./apis/avm/api");
const api_4 = require("./apis/evm/api");
const genesisasset_1 = require("./apis/avm/genesisasset");
Object.defineProperty(exports, "GenesisAsset", { enumerable: true, get: function () { return genesisasset_1.GenesisAsset; } });
const genesisdata_1 = require("./apis/avm/genesisdata");
Object.defineProperty(exports, "GenesisData", { enumerable: true, get: function () { return genesisdata_1.GenesisData; } });
const api_5 = require("./apis/health/api");
const api_6 = require("./apis/index/api");
const api_7 = require("./apis/info/api");
const api_8 = require("./apis/keystore/api");
const api_9 = require("./apis/metrics/api");
const api_10 = require("./apis/platformvm/api");
const socket_1 = require("./apis/socket/socket");
Object.defineProperty(exports, "Socket", { enumerable: true, get: function () { return socket_1.Socket; } });
const bintools_1 = __importDefault(require("./utils/bintools"));
exports.BinTools = bintools_1.default;
const db_1 = __importDefault(require("./utils/db"));
exports.DB = db_1.default;
const mnemonic_1 = __importDefault(require("./utils/mnemonic"));
exports.Mnemonic = mnemonic_1.default;
const pubsub_1 = __importDefault(require("./utils/pubsub"));
exports.PubSub = pubsub_1.default;
const hdnode_1 = __importDefault(require("./utils/hdnode"));
exports.HDNode = hdnode_1.default;
const bn_js_1 = __importDefault(require("bn.js"));
exports.BN = bn_js_1.default;
const buffer_1 = require("buffer/");
Object.defineProperty(exports, "Buffer", { enumerable: true, get: function () { return buffer_1.Buffer; } });
const networks_1 = __importDefault(require("./utils/networks"));
const constants_1 = require("./utils/constants");
const utils_1 = require("./utils");
/**
* CaminoJS is middleware for interacting with Camino node RPC APIs.
*
* Example usage:
* ```js
* const avalanche: Avalanche = new Avalanche("127.0.0.1", 9650, "https")
* ```
*
*/
class Avalanche extends camino_1.default {
/**
* Creates a new Avalanche instance. Sets the address and port of the main Avalanche Client.
*
* @param host The hostname to resolve to reach the Avalanche Client RPC APIs
* @param port The port to resolve to reach the Avalanche Client RPC APIs
* @param protocol The protocol string to use before a "://" in a request,
* ex: "http", "https", "git", "ws", etc. Defaults to http
* @param networkID Sets the NetworkID of the class. Default [[DefaultNetworkID]]
* @param XChainID Sets the blockchainID for the AVM. Will try to auto-detect,
* otherwise default "2eNy1mUFdmaxXNj1eQHUe7Np4gju9sJsEtWQ4MX3ToiNKuADed"
* @param CChainID Sets the blockchainID for the EVM. Will try to auto-detect,
* otherwise default "2CA6j5zYzasynPsFeNoqWkmTCt3VScMvXUZHbfDJ8k3oGzAPtU"
* @param hrp The human-readable part of the bech32 addresses
* @param skipinit Skips creating the APIs. Defaults to false
*/
constructor(host, port, protocol, networkID = undefined, XChainID = undefined, CChainID = undefined, skipinit = false) {
super(host, port, protocol, networkID);
/**
* Returns a reference to the Admin RPC.
*/
this.Admin = () => this.apis.admin;
/**
* Returns a reference to the Auth RPC.
*/
this.Auth = () => this.apis.auth;
/**
* Returns a reference to the EVMAPI RPC pointed at the C-Chain.
*/
this.CChain = () => this.apis.cchain;
/**
* Returns a reference to the AVM RPC pointed at the X-Chain.
*/
this.XChain = () => this.apis.xchain;
/**
* Returns a reference to the Health RPC for a node.
*/
this.Health = () => this.apis.health;
/**
* Returns a reference to the Index RPC for a node.
*/
this.Index = () => this.apis.index;
/**
* Returns a reference to the Info RPC for a node.
*/
this.Info = () => this.apis.info;
/**
* Returns a reference to the Metrics RPC.
*/
this.Metrics = () => this.apis.metrics;
/**
* Returns a reference to the Keystore RPC for a node. We label it "NodeKeys" to reduce
* confusion about what it's accessing.
*/
this.NodeKeys = () => this.apis.keystore;
/**
* Returns a reference to the PlatformVM RPC pointed at the P-Chain.
*/
this.PChain = () => this.apis.pchain;
this.fetchNetworkSettings = () => __awaiter(this, void 0, void 0, function* () {
// Nothing to do if network is known
if (this.network)
return true;
// We need this be able to make next call
this.addAPI("pchain", api_10.PlatformVMAPI);
//Get platform configuration
let response;
try {
response = yield this.PChain().getConfiguration();
this.networkID = response.networkID;
}
catch (error) {
this.networkID = yield this.Info().getNetworkID();
}
if ((this.network = networks_1.default.getNetwork(this.networkID)))
return this.refreshAPI();
if (!response) {
throw new Error("Configuration required");
}
const xchain = response.blockchains.find((b) => b["name"] === "X-Chain");
const cchain = response.blockchains.find((b) => b["name"] === "C-Chain");
const fees = yield this.Info().getTxFee();
this.network = {
hrp: response.hrp,
X: {
alias: constants_1.XChainAlias,
avaxAssetID: response.assetID,
avaxAssetAlias: response.assetSymbol,
blockchainID: xchain["id"],
vm: constants_1.XChainVMName,
creationTxFee: fees.creationTxFee,
txFee: fees.txFee
},
P: {
alias: constants_1.PChainAlias,
blockchainID: utils_1.DefaultPlatformChainID,
creationTxFee: fees.creationTxFee,
createSubnetTx: fees.createSubnetTxFee,
createChainTx: fees.createBlockchainTxFee,
maxConsumption: response.maxConsumptionRate,
maxStakeDuration: response.maxStakeDuration,
maxStakingDuration: new bn_js_1.default(response.maxStakeDuration),
maxSupply: response.supplyCap,
minConsumption: response.minConsumptionRate,
minDelegationFee: response.minDelegationFee,
minDelegationStake: response.minDelegatorStake,
minStake: response.minValidatorStake,
minStakeDuration: response.minStakeDuration,
vm: constants_1.PChainVMName,
txFee: fees.txFee
},
C: {
alias: constants_1.CChainAlias,
blockchainID: cchain["id"],
chainID: 43112,
costPerSignature: 1000,
gasPrice: constants_1.GWEI.mul(new bn_js_1.default(225)),
maxGasPrice: constants_1.GWEI.mul(new bn_js_1.default(1000)),
minGasPrice: constants_1.GWEI.mul(new bn_js_1.default(25)),
txBytesGas: 1,
txFee: constants_1.MILLIAVAX,
vm: constants_1.CChainVMName
}
};
networks_1.default.registerNetwork(this.networkID, this.network);
return this.refreshAPI();
});
this.refreshAPI = () => {
// Re-apply pchain which creates the correct keychain
this.addAPI("pchain", api_10.PlatformVMAPI);
// Finally register x and c chains
this.addAPI("xchain", api_3.AVMAPI, "/ext/bc/X", this.network.X.blockchainID);
this.addAPI("cchain", api_4.EVMAPI, "/ext/bc/C/avax", this.network.C.blockchainID);
return true;
};
if (!skipinit) {
this.addAPI("admin", api_1.AdminAPI);
this.addAPI("auth", api_2.AuthAPI);
this.addAPI("health", api_5.HealthAPI);
this.addAPI("info", api_7.InfoAPI);
this.addAPI("index", api_6.IndexAPI);
this.addAPI("keystore", api_8.KeystoreAPI);
this.addAPI("metrics", api_9.MetricsAPI);
}
// Static initializing
if (networkID && (this.network = networks_1.default.getNetwork(networkID))) {
this.networkID = networkID;
if (!skipinit) {
this.addAPI("pchain", api_10.PlatformVMAPI);
this.addAPI("xchain", api_3.AVMAPI, "/ext/bc/X", XChainID ? XChainID : this.network.X.blockchainID);
this.addAPI("cchain", api_4.EVMAPI, "/ext/bc/C/avax", CChainID ? CChainID : this.network.C.blockchainID);
}
}
}
}
exports.default = Avalanche;
exports.Avalanche = Avalanche;
exports.admin = __importStar(require("./apis/admin"));
exports.auth = __importStar(require("./apis/auth"));
exports.avm = __importStar(require("./apis/avm"));
exports.common = __importStar(require("./common"));
exports.evm = __importStar(require("./apis/evm"));
exports.health = __importStar(require("./apis/health"));
exports.index = __importStar(require("./apis/index"));
exports.info = __importStar(require("./apis/info"));
exports.keystore = __importStar(require("./apis/keystore"));
exports.metrics = __importStar(require("./apis/metrics"));
exports.platformvm = __importStar(require("./apis/platformvm"));
exports.utils = __importStar(require("./utils"));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7O0dBR0c7QUFDSCxzREFBb0M7QUFnUDNCLHdCQWhQRixnQkFBYSxDQWdQRTtBQS9PdEIsMENBQTJDO0FBQzNDLHlDQUF5QztBQUN6Qyx3Q0FBdUM7QUFDdkMsd0NBQXVDO0FBQ3ZDLDBEQUFzRDtBQWlQN0MsNkZBalBBLDJCQUFZLE9BaVBBO0FBaFByQix3REFBb0Q7QUFpUDNDLDRGQWpQQSx5QkFBVyxPQWlQQTtBQWhQcEIsMkNBQTZDO0FBQzdDLDBDQUEyQztBQUMzQyx5Q0FBeUM7QUFDekMsNkNBQWlEO0FBQ2pELDRDQUErQztBQUMvQyxnREFBcUQ7QUFDckQsaURBQTZDO0FBNk9wQyx1RkE3T0EsZUFBTSxPQTZPQTtBQTVPZixnRUFBdUM7QUFtTzlCLG1CQW5PRixrQkFBUSxDQW1PRTtBQWxPakIsb0RBQTJCO0FBcU9sQixhQXJPRixZQUFFLENBcU9FO0FBcE9YLGdFQUF1QztBQXdPOUIsbUJBeE9GLGtCQUFRLENBd09FO0FBdk9qQiw0REFBbUM7QUF3TzFCLGlCQXhPRixnQkFBTSxDQXdPRTtBQXZPZiw0REFBbUM7QUFtTzFCLGlCQW5PRixnQkFBTSxDQW1PRTtBQWxPZixrREFBc0I7QUErTmIsYUEvTkYsZUFBRSxDQStORTtBQTlOWCxvQ0FBZ0M7QUErTnZCLHVGQS9OQSxlQUFNLE9BK05BO0FBOU5mLGdFQUF1QztBQUN2QyxpREFTMEI7QUFDMUIsbUNBQWdEO0FBR2hEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBcUIsU0FBVSxTQUFRLGdCQUFhO0lBb0RsRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNILFlBQ0UsSUFBWSxFQUNaLElBQVksRUFDWixRQUFnQixFQUNoQixZQUFvQixTQUFTLEVBQzdCLFdBQW1CLFNBQVMsRUFDNUIsV0FBbUIs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MkM7QUFDM0MsMERBQXlDO0FBQ3pDLGdFQUErQztBQUMvQyxpREFBZ0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICogQG1vZHVsZSBBdmFsYW5jaGVcbiAqL1xuaW1wb3J0IEF2YWxhbmNoZUNvcmUgZnJvbSBcIi4vY2FtaW5vXCJcbmltcG9ydCB7IEFkbWluQVBJIH0gZnJvbSBcIi4vYXBpcy9hZG1pbi9hcGlcIlxuaW1wb3J0IHsgQXV0aEFQSSB9IGZyb20gXCIuL2FwaXMvYXV0aC9hcGlcIlxuaW1wb3J0IHsgQVZNQVBJIH0gZnJvbSBcIi4vYXBpcy9hdm0vYXBpXCJcbmltcG9ydCB7IEVWTUFQSSB9IGZyb20gXCIuL2FwaXMvZXZtL2FwaVwiXG5pbXBvcnQgeyBHZW5lc2lzQXNzZXQgfSBmcm9tIFwiLi9hcGlzL2F2bS9nZW5lc2lzYXNzZXRcIlxuaW1wb3J0IHsgR2VuZXNpc0RhdGEgfSBmcm9tIFwiLi9hcGlzL2F2bS9nZW5lc2lzZGF0YVwiXG5pbXBvcnQgeyBIZWFsdGhBUEkgfSBmcm9tIFwiLi9hcGlzL2hlYWx0aC9hcGlcIlxuaW1wb3J0IHsgSW5kZXhBUEkgfSBmcm9tIFwiLi9hcGlzL2luZGV4L2FwaVwiXG5pbXBvcnQgeyBJbmZvQVBJIH0gZnJvbSBcIi4vYXBpcy9pbmZvL2FwaVwiXG5pbXBvcnQgeyBLZXlzdG9yZUFQSSB9IGZyb20gXCIuL2FwaXMva2V5c3RvcmUvYXBpXCJcbmltcG9ydCB7IE1ldHJpY3NBUEkgfSBmcm9tIFwiLi9hcGlzL21ldHJpY3MvYXBpXCJcbmltcG9ydCB7IFBsYXRmb3JtVk1BUEkgfSBmcm9tIFwiLi9hcGlzL3BsYXRmb3Jtdm0vYXBpXCJcbmltcG9ydCB7IFNvY2tldCB9IGZyb20gXCIuL2FwaXMvc29ja2V0L3NvY2tldFwiXG5pbXBvcnQgQmluVG9vbHMgZnJvbSBcIi4vdXRpbHMvYmludG9vbHNcIlxuaW1wb3J0IERCIGZyb20gXCIuL3V0aWxzL2RiXCJcbmltcG9ydCBNbmVtb25pYyBmcm9tIFwiLi91dGlscy9tbmVtb25pY1wiXG5pbXBvcnQgUHViU3ViIGZyb20gXCIuL3V0aWxzL3B1YnN1YlwiXG5pbXBvcnQgSEROb2RlIGZyb20gXCIuL3V0aWxzL2hkbm9kZVwiXG5pbXBvcnQgQk4gZnJvbSBcImJuLmpzXCJcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gXCJidWZmZXIvXCJcbmltcG9ydCBuZXR3b3JrcyBmcm9tIFwiLi91dGlscy9uZXR3b3Jrc1wiXG5pbXBvcnQge1xuICBDQ2hhaW5BbGlhcyxcbiAgQ0NoYWluVk1OYW1lLFxuICBHV0VJLFxuICBNSUxMSUFWQVgsXG4gIFBDaGFpbkFsaWFzLFxuICBQQ2hhaW5WTU5hbWUsXG4gIFhDaGFpbkFsaWFzLFxuICBYQ2hhaW5WTU5hbWVcbn0gZnJvbSBcIi4vdXRpbHMvY29uc3RhbnRzXCJcbmltcG9ydCB7IERlZmF1bHRQbGF0Zm9ybUNoYWluSUQgfSBmcm9tIFwiLi91dGlsc1wiXG5pbXBvcnQgeyBHZXRDb25maWd1cmF0aW9uUmVzcG9uc2UgfSBmcm9tIFwiLi9hcGlzL3BsYXRmb3Jtdm0vaW50ZXJmYWNlc1wiXG5cbi8qKlxuICogQ2FtaW5vSlMgaXMgbWlkZGxld2FyZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBDYW1pbm8gbm9kZSBSUEMgQVBJcy5cbiAqXG4gKiBFeGFtcGxlIHVzYWdlOlxuICogYGBganNcbiAqIGNvbnN0IGF2YWxhbmNoZTogQXZhbGFuY2hlID0gbmV3IEF2YWxhbmNoZShcIjEyNy4wLjAuMVwiLCA5NjUwLCBcImh0dHBzXCIpXG4gKiBgYGBcbiAqXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEF2YWxhbmNoZSBleHRlbmRzIEF2YWxhbmNoZUNvcmUge1xuICAvKipcbiAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgQWRtaW4gUlBDLlxuICAgKi9cbiAgQWRtaW4gPSAoKSA9PiB0aGlzLmFwaXMuYWRtaW4gYXMgQWRtaW5BUElcblxuICAvKipcbiAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgQXV0aCBSUEMuXG4gICAqL1xuICBBdXRoID0gKCkgPT4gdGhpcy5hcGlzLmF1dGggYXMgQXV0aEFQSVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBFVk1BUEkgUlBDIHBvaW50ZWQgYXQgdGhlIEMtQ2hhaW4uXG4gICAqL1xuICBDQ2hhaW4gPSAoKSA9PiB0aGlzLmFwaXMuY2NoYWluIGFzIEVWTUFQSVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBBVk0gUlBDIHBvaW50ZWQgYXQgdGhlIFgtQ2hhaW4uXG4gICAqL1xuICBYQ2hhaW4gPSAoKSA9PiB0aGlzLmFwaXMueGNoYWluIGFzIEFWTUFQSVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBIZWFsdGggUlBDIGZvciBhIG5vZGUuXG4gICAqL1xuICBIZWFsdGggPSAoKSA9PiB0aGlzLmFwaXMuaGVhbHRoIGFzIEhlYWx0aEFQSVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBJbmRleCBSUEMgZm9yIGEgbm9kZS5cbiAgICovXG4gIEluZGV4ID0gKCkgPT4gdGhpcy5hcGlzLmluZGV4IGFzIEluZGV4QVBJXG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIEluZm8gUlBDIGZvciBhIG5vZGUuXG4gICAqL1xuICBJbmZvID0gKCkgPT4gdGhpcy5hcGlzLmluZm8gYXMgSW5mb0FQSVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBNZXRyaWNzIFJQQy5cbiAgICovXG4gIE1ldHJpY3MgPSAoKSA9PiB0aGlzLmFwaXMubWV0cmljcyBhcyBNZXRyaWNzQVBJXG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIEtleXN0b3JlIFJQQyBmb3IgYSBub2RlLiBXZSBsYWJlbCBpdCBcIk5vZGVLZXlzXCIgdG8gcmVkdWNlXG4gICAqIGNvbmZ1c2lvbiBhYm91dCB3aGF0IGl0J3MgYWNjZXNzaW5nLlxuICAgKi9cbiAgTm9kZUtleXMgPSAoKSA9PiB0aGlzLmFwaXMua2V5c3RvcmUgYXMgS2V5c3RvcmVBUElcblxuICAvKipcbiAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgUGxhdGZvcm1WTSBSUEMgcG9pbnRlZCBhdCB0aGUgUC1DaGFpbi5cbiAgICovXG4gIFBDaGFpbiA9ICgpID0+IHRoaXMuYXBpcy5wY2hhaW4gYXMgUGxhdGZvcm1WTUFQSVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IEF2YWxhbmNoZSBpbnN0YW5jZS4gU2V0cyB0aGUgYWRkcmVzcyBhbmQgcG9ydCBvZiB0aGUgbWFpbiBBdmFsYW5jaGUgQ2xpZW50LlxuICAgKlxuICAgKiBAcGFyYW0gaG9zdCBUaGUgaG9zdG5hbWUgdG8gcmVzb2x2ZSB0byByZWFjaCB0aGUgQXZhbGFuY2hlIENsaWVudCBSUEMgQVBJc1xuICAgKiBAcGFyYW0gcG9ydCBUaGUgcG9ydCB0byByZXNvbHZlIHRvIHJlYWNoIHRoZSBBdmFsYW5jaGUgQ2xpZW50IFJQQyBBUElzXG4gICAqIEBwYXJhbSBwcm90b2NvbCBUaGUgcHJvdG9jb2wgc3RyaW5nIHRvIHVzZSBiZWZvcmUgYSBcIjovL1wiIGluIGEgcmVxdWVzdCxcbiAgICogZXg6IFwiaHR0cFwiLCBcImh0dHBzXCIsIFwiZ2l0XCIsIFwid3NcIiwgZXRjLiBEZWZhdWx0cyB0byBodHRwXG4gICAqIEBwYXJhbSBuZXR3b3JrSUQgU2V0cyB0aGUgTmV0d29ya0lEIG9mIHRoZSBjbGFzcy4gRGVmYXVsdCBbW0RlZmF1bHROZXR3b3JrSURdXVxuICAgKiBAcGFyYW0gWENoYWluSUQgU2V0cyB0aGUgYmxvY2tjaGFpbklEIGZvciB0aGUgQVZNLiBXaWxsIHRyeSB0byBhdXRvLWRldGVjdCxcbiAgICogb3RoZXJ3aXNlIGRlZmF1bHQgXCIyZU55MW1VRmRtYXhYTmoxZVFIVWU3TnA0Z2p1OXNKc0V0V1E0TVgzVG9pTkt1QURlZFwiXG4gICAqIEBwYXJhbSBDQ2hhaW5JRCBTZXRzIHRoZSBibG9ja2NoYWluSUQgZm9yIHRoZSBFVk0uIFdpbGwgdHJ5IHRvIGF1dG8tZGV0ZWN0LFxuICAgKiBvdGhlcndpc2UgZGVmYXVsdCBcIjJDQTZqNXpZemFzeW5Qc0ZlTm9xV2ttVEN0M1ZTY012WFVaSGJmREo4azNvR3pBUHRVXCJcbiAgICogQHBhcmFtIGhycCBUaGUgaHVtYW4tcmVhZGFibGUgcGFydCBvZiB0aGUgYmVjaDMyIGFkZHJlc3Nlc1xuICAgKiBAcGFyYW0gc2tpcGluaXQgU2tpcHMgY3JlYXRpbmcgdGhlIEFQSXMuIERlZmF1bHRzIHRvIGZhbHNlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBob3N0OiBzdHJpbmcsXG4gICAgcG9ydDogbnVtYmVyLFxuICAgIHByb3RvY29sOiBzdHJpbmcsXG4gICAgbmV0d29ya0lEOiBudW1iZXIgPSB1bmRlZmluZWQsXG4gICAgWENoYWluSUQ6IHN0cmluZyA9IHVuZGVmaW5lZCxcbiAgICBDQ2hhaW5JRDogc3RyaW5nID0gdW5kZWZpbmVkLFxuICAgIHNraXBpbml0OiBib29sZWFuID0gZmFsc2VcbiAgKSB7XG4gICAgc3VwZXIoaG9zdCwgcG9ydCwgcHJvdG9jb2wsIG5ldHdvcmtJRClcbiAgICBpZiAoIXNraXBpbml0KSB7XG4gICAgICB0aGlzLmFkZEFQSShcImFkbWluXCIsIEFkbWluQVBJKVxuICAgICAgdGhpcy5hZGRBUEkoXCJhdXRoXCIsIEF1dGhBUEkpXG4gICAgICB0aGlzLmFkZEFQSShcImhlYWx0aFwiLCBIZWFsdGhBUEkpXG4gICAgICB0aGlzLmFkZEFQSShcImluZm9cIiwgSW5mb0FQSSlcbiAgICAgIHRoaXMuYWRkQVBJKFwiaW5kZXhcIiwgSW5kZXhBUEkpXG4gICAgICB0aGlzLmFkZEFQSShcImtleXN0b3JlXCIsIEtleXN0b3JlQVBJKVxuICAgICAgdGhpcy5hZGRBUEkoXCJtZXRyaWNzXCIsIE1ldHJpY3NBUEkpXG4gICAgfVxuXG4gICAgLy8gU3RhdGljIGluaXRpYWxpemluZ1xuICAgIGlmIChuZXR3b3JrSUQgJiYgKHRoaXMubmV0d29yayA9IG5ldHdvcmtzLmdldE5ldHdvcmsobmV0d29ya0lEKSkpIHtcbiAgICAgIHRoaXMubmV0d29ya0lEID0gbmV0d29ya0lEXG4gICAgICBpZiAoIXNraXBpbml0KSB7XG4gICAgICAgIHRoaXMuYWRkQVBJKFwicGNoYWluXCIsIFBsYXRmb3JtVk1BUEkpXG4gICAgICAgIHRoaXMuYWRkQVBJKFxuICAgICAgICAgIFwieGNoYWluXCIsXG4gICAgICAgICAgQVZNQVBJLFxuICAgICAgICAgIFwiL2V4dC9iYy9YXCIsXG4gICAgICAgICAgWENoYWluSUQgPyBYQ2hhaW5JRCA6IHRoaXMubmV0d29yay5YLmJsb2NrY2hhaW5JRFxuICAgICAgICApXG4gICAgICAgIHRoaXMuYWRkQVBJKFxuICAgICAgICAgIFwiY2NoYWluXCIsXG4gICAgICAgICAgRVZNQVBJLFxuICAgICAgICAgIFwiL2V4dC9iYy9DL2F2YXhcIixcbiAgICAgICAgICBDQ2hhaW5JRCA/IENDaGFpbklEIDogdGhpcy5uZXR3b3JrLkMuYmxvY2tjaGFpbklEXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmZXRjaE5ldHdvcmtTZXR0aW5ncyA9IGFzeW5jICgpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAvLyBOb3RoaW5nIHRvIGRvIGlmIG5ldHdvcmsgaXMga25vd25cbiAgICBpZiAodGhpcy5uZXR3b3JrKSByZXR1cm4gdHJ1ZVxuICAgIC8vIFdlIG5lZWQgdGhpcyBiZSBhYmxlIHRvIG1ha2UgbmV4dCBjYWxsXG4gICAgdGhpcy5hZGRBUEkoXCJwY2hhaW5cIiwgUGxhdGZvcm1WTUFQSSlcbiAgICAvL0dldCBwbGF0Zm9ybSBjb25maWd1cmF0aW9uXG4gICAgbGV0IHJlc3BvbnNlOiBHZXRDb25maWd1cmF0aW9uUmVzcG9uc2VcblxuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMuUENoYWluKCkuZ2V0Q29uZmlndXJhdGlvbigpXG4gICAgICB0aGlzLm5ldHdvcmtJRCA9IHJlc3BvbnNlLm5ldHdvcmtJRFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLm5ldHdvcmtJRCA9IGF3YWl0IHRoaXMuSW5mbygpLmdldE5ldHdvcmtJRCgpXG4gICAgfVxuXG4gICAgaWYgKCh0aGlzLm5ldHdvcmsgPSBuZXR3b3Jrcy5nZXROZXR3b3JrKHRoaXMubmV0d29ya0lEKSkpXG4gICAgICByZXR1cm4gdGhpcy5yZWZyZXNoQVBJKClcblxuICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbmZpZ3VyYXRpb24gcmVxdWlyZWRcIilcbiAgICB9XG5cbiAgICBjb25zdCB4Y2hhaW4gPSByZXNwb25zZS5ibG9ja2NoYWlucy5maW5kKChiKSA9PiBiW1wibmFtZVwiXSA9PT0gXCJYLUNoYWluXCIpXG4gICAgY29uc3QgY2NoYWluID0gcmVzcG9uc2UuYmxvY2tjaGFpbnMuZmluZCgoYikgPT4gYltcIm5hbWVcIl0gPT09IFwiQy1DaGFpblwiKVxuXG4gICAgY29uc3QgZmVlcyA9IGF3YWl0IHRoaXMuSW5mbygpLmdldFR4RmVlKClcblxuICAgIHRoaXMubmV0d29yayA9IHtcbiAgICAgIGhycDogcmVzcG9uc2UuaHJwLFxuICAgICAgWDoge1xuICAgICAgICBhbGlhczogWENoYWluQWxpYXMsXG4gICAgICAgIGF2YXhBc3NldElEOiByZXNwb25zZS5hc3NldElELFxuICAgICAgICBhdmF4QXNzZXRBbGlhczogcmVzcG9uc2UuYXNzZXRTeW1ib2wsXG4gICAgICAgIGJsb2NrY2hhaW5JRDogeGNoYWluW1wiaWRcIl0sXG4gICAgICAgIHZtOiBYQ2hhaW5WTU5hbWUsXG4gICAgICAgIGNyZWF0aW9uVHhGZWU6IGZlZXMuY3JlYXRpb25UeEZlZSxcbiAgICAgICAgdHhGZWU6IGZlZXMudHhGZWVcbiAgICAgIH0sXG4gICAgICBQOiB7XG4gICAgICAgIGFsaWFzOiBQQ2hhaW5BbGlhcyxcbiAgICAgICAgYmxvY2tjaGFpbklEOiBEZWZhdWx0UGxhdGZvcm1DaGFpbklELFxuICAgICAgICBjcmVhdGlvblR4RmVlOiBmZWVzLmNyZWF0aW9uVHhGZWUsXG4gICAgICAgIGNyZWF0ZVN1Ym5ldFR4OiBmZWVzLmNyZWF0ZVN1Ym5ldFR4RmVlLFxuICAgICAgICBjcmVhdGVDaGFpblR4OiBmZWVzLmNyZWF0ZUJsb2NrY2hhaW5UeEZlZSxcbiAgICAgICAgbWF4Q29uc3VtcHRpb246IHJlc3BvbnNlLm1heENvbnN1bXB0aW9uUmF0ZSxcbiAgICAgICAgbWF4U3Rha2VEdXJhdGlvbjogcmVzcG9uc2UubWF4U3Rha2VEdXJhdGlvbixcbiAgICAgICAgbWF4U3Rha2luZ0R1cmF0aW9uOiBuZXcgQk4ocmVzcG9uc2UubWF4U3Rha2VEdXJhdGlvbiksXG4gICAgICAgIG1heFN1cHBseTogcmVzcG9uc2Uuc3VwcGx5Q2FwLFxuICAgICAgICBtaW5Db25zdW1wdGlvbjogcmVzcG9uc2UubWluQ29uc3VtcHRpb25SYXRlLFxuICAgICAgICBtaW5EZWxlZ2F0aW9uRmVlOiByZXNwb25zZS5taW5EZWxlZ2F0aW9uRmVlLFxuICAgICAgICBtaW5EZWxlZ2F0aW9uU3Rha2U6IHJlc3BvbnNlLm1pbkRlbGVnYXRvclN0YWtlLFxuICAgICAgICBtaW5TdGFrZTogcmVzcG9uc2UubWluVmFsaWRhdG9yU3Rha2UsXG4gICAgICAgIG1pblN0YWtlRHVyYXRpb246IHJlc3BvbnNlLm1pblN0YWtlRHVyYXRpb24sXG4gICAgICAgIHZtOiBQQ2hhaW5WTU5hbWUsXG4gICAgICAgIHR4RmVlOiBmZWVzLnR4RmVlXG4gICAgICB9LFxuICAgICAgQzoge1xuICAgICAgICBhbGlhczogQ0NoYWluQWxpYXMsXG4gICAgICAgIGJsb2NrY2hhaW5JRDogY2NoYWluW1wiaWRcIl0sXG4gICAgICAgIGNoYWluSUQ6IDQzMTEyLFxuICAgICAgICBjb3N0UGVyU2lnbmF0dXJlOiAxMDAwLFxuICAgICAgICBnYXNQcmljZTogR1dFSS5tdWwobmV3IEJOKDIyNSkpLFxuICAgICAgICBtYXhHYXNQcmljZTogR1dFSS5tdWwobmV3IEJOKDEwMDApKSxcbiAgICAgICAgbWluR2FzUHJpY2U6IEdXRUkubXVsKG5ldyBCTigyNSkpLFxuICAgICAgICB0eEJ5dGVzR2FzOiAxLFxuICAgICAgICB0eEZlZTogTUlMTElBVkFYLFxuICAgICAgICB2bTogQ0NoYWluVk1OYW1lXG4gICAgICB9XG4gICAgfVxuXG4gICAgbmV0d29ya3MucmVnaXN0ZXJOZXR3b3JrKHRoaXMubmV0d29ya0lELCB0aGlzLm5ldHdvcmspXG5cbiAgICByZXR1cm4gdGhpcy5yZWZyZXNoQVBJKClcbiAgfVxuXG4gIHByb3RlY3RlZCByZWZyZXNoQVBJID0gKCk6IGJvb2xlYW4gPT4ge1xuICAgIC8vIFJlLWFwcGx5IHBjaGFpbiB3aGljaCBjcmVhdGVzIHRoZSBjb3JyZWN0IGtleWNoYWluXG4gICAgdGhpcy5hZGRBUEkoXCJwY2hhaW5cIiwgUGxhdGZvcm1WTUFQSSlcblxuICAgIC8vIEZpbmFsbHkgcmVnaXN0ZXIgeCBhbmQgYyBjaGFpbnNcbiAgICB0aGlzLmFkZEFQSShcInhjaGFpblwiLCBBVk1BUEksIFwiL2V4dC9iYy9YXCIsIHRoaXMubmV0d29yay5YLmJsb2NrY2hhaW5JRClcbiAgICB0aGlzLmFkZEFQSShcImNjaGFpblwiLCBFVk1BUEksIFwiL2V4dC9iYy9DL2F2YXhcIiwgdGhpcy5uZXR3b3JrLkMuYmxvY2tjaGFpbklEKVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxufVxuXG5leHBvcnQgeyBBdmFsYW5jaGUgfVxuZXhwb3J0IHsgQXZhbGFuY2hlQ29yZSB9XG5leHBvcnQgeyBCaW5Ub29scyB9XG5leHBvcnQgeyBCTiB9XG5leHBvcnQgeyBCdWZmZXIgfVxuZXhwb3J0IHsgREIgfVxuZXhwb3J0IHsgSEROb2RlIH1cbmV4cG9ydCB7IEdlbmVzaXNBc3NldCB9XG5leHBvcnQgeyBHZW5lc2lzRGF0YSB9XG5leHBvcnQgeyBNbmVtb25pYyB9XG5leHBvcnQgeyBQdWJTdWIgfVxuZXhwb3J0IHsgU29ja2V0IH1cblxuZXhwb3J0ICogYXMgYWRtaW4gZnJvbSBcIi4vYXBpcy9hZG1pblwiXG5leHBvcnQgKiBhcyBhdXRoIGZyb20gXCIuL2FwaXMvYXV0aFwiXG5leHBvcnQgKiBhcyBhdm0gZnJvbSBcIi4vYXBpcy9hdm1cIlxuZXhwb3J0ICogYXMgY29tbW9uIGZyb20gXCIuL2NvbW1vblwiXG5leHBvcnQgKiBhcyBldm0gZnJvbSBcIi4vYXBpcy9ldm1cIlxuZXhwb3J0ICogYXMgaGVhbHRoIGZyb20gXCIuL2FwaXMvaGVhbHRoXCJcbmV4cG9ydCAqIGFzIGluZGV4IGZyb20gXCIuL2FwaXMvaW5kZXhcIlxuZXhwb3J0ICogYXMgaW5mbyBmcm9tIFwiLi9hcGlzL2luZm9cIlxuZXhwb3J0ICogYXMga2V5c3RvcmUgZnJvbSBcIi4vYXBpcy9rZXlzdG9yZVwiXG5leHBvcnQgKiBhcyBtZXRyaWNzIGZyb20gXCIuL2FwaXMvbWV0cmljc1wiXG5leHBvcnQgKiBhcyBwbGF0Zm9ybXZtIGZyb20gXCIuL2FwaXMvcGxhdGZvcm12bVwiXG5leHBvcnQgKiBhcyB1dGlscyBmcm9tIFwiLi91dGlsc1wiXG4iXX0=