bitgo
Version:
BitGo JavaScript SDK
209 lines • 40 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const should = require("should");
const nock = require("nock");
const sdk_core_1 = require("@bitgo/sdk-core");
const sdk_test_1 = require("@bitgo/sdk-test");
const src_1 = require("../../../../src");
const amsTokenConfig_1 = require("../../resources/amsTokenConfig");
const sdk_coin_evm_1 = require("@bitgo/sdk-coin-evm");
const sdk_coin_bsc_1 = require("@bitgo/sdk-coin-bsc");
describe('Asset metadata service', () => {
const microservicesUri = sdk_core_1.Environments['mock'].uri;
let bitgo;
before(function () {
bitgo = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'mock', microservicesUri, useAms: true });
bitgo.initializeTestVars();
});
it('should create a custom coin factory from ams response', async () => {
bitgo.initCoinFactory(amsTokenConfig_1.reducedAmsTokenConfig);
const coin = bitgo.coin('hteth:faketoken');
should.exist(coin);
coin.type.should.equal('hteth:faketoken');
coin.name.should.equal('Hoodi Testnet fake token');
coin.decimalPlaces.should.equal(6);
coin.tokenContractAddress.should.equal('0x89a959b9184b4f8c8633646d5dfd049d2ebc983a');
});
it('should not fetch coin from custom coin factory when useAms is false', async () => {
const bitgoNoAms = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'mock', microservicesUri, useAms: false });
bitgoNoAms.initializeTestVars();
bitgoNoAms.initCoinFactory(amsTokenConfig_1.reducedAmsTokenConfig);
(() => {
bitgoNoAms.coin('hteth:faketoken');
}).should.throw('Coin or token type hteth:faketoken not supported or not compiled. Please be sure that you are using the latest version of BitGoJS. If using @bitgo/sdk-api, please confirm you have registered hteth:faketoken first.');
});
it('should be able to register a token in the coin factory', () => {
const tokenName = 'hteth:faketoken';
bitgo.registerToken(tokenName);
const coin = bitgo.coin(tokenName);
should.exist(coin);
coin.type.should.equal(tokenName);
coin.name.should.equal('Hoodi Testnet fake token');
coin.decimalPlaces.should.equal(6);
coin.tokenContractAddress.should.equal('0x89a959b9184b4f8c8633646d5dfd049d2ebc983a');
});
it('should fetch all assets from AMS and initialize the coin factory', async () => {
const bitgo = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'mock', microservicesUri, useAms: true });
bitgo.initializeTestVars();
// Setup nocks
nock(microservicesUri).get('/api/v1/assets/list/testnet').reply(200, amsTokenConfig_1.reducedAmsTokenConfig);
await bitgo.registerAllTokens();
const coin = bitgo.coin('hteth:faketoken');
should.exist(coin);
});
describe('registerToken', () => {
it('should throw an error when useAms is false', async () => {
const bitgoNoAms = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'mock', microservicesUri, useAms: false });
bitgoNoAms.initializeTestVars();
await bitgoNoAms
.registerToken('hteth:faketoken')
.should.be.rejectedWith('registerToken is only supported when useAms is set to true');
});
it('should register a token from statics library if available', async () => {
const bitgo = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'mock', microservicesUri, useAms: true });
bitgo.initializeTestVars();
await bitgo.registerToken('hteth:bgerchv2');
const coin = bitgo.coin('hteth:bgerchv2');
should.exist(coin);
});
it('should fetch token information from AMS if not in statics library', async () => {
const bitgo = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'mock', microservicesUri, useAms: true });
bitgo.initializeTestVars();
const tokenName = 'hteth:faketoken';
// Setup nocks
nock(microservicesUri).get(`/api/v1/assets/name/${tokenName}`).reply(200, amsTokenConfig_1.reducedAmsTokenConfig[tokenName][0]);
await bitgo.registerToken(tokenName);
const coin = bitgo.coin(tokenName);
should.exist(coin);
});
it('should be able to register the ofc token', async () => {
const bitgo = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'mock', microservicesUri, useAms: true });
bitgo.initializeTestVars();
const tokenName = 'ofc';
await bitgo.registerToken(tokenName);
const coin = bitgo.coin(tokenName);
should.exist(coin);
});
it('should register a EVM coin token from statics library if available', async () => {
const bitgo = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'mock', microservicesUri, useAms: true });
bitgo.initializeTestVars();
await bitgo.registerToken('tip:usdc');
const coin = bitgo.coin('tip:usdc');
should.exist(coin);
});
it('should register an EVM coin token from AMS', async () => {
const bitgo = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'mock', microservicesUri, useAms: true });
bitgo.initializeTestVars();
const tokenName = 'tip:faketoken';
// Setup nocks for AMS API call
nock(microservicesUri).get(`/api/v1/assets/name/${tokenName}`).reply(200, amsTokenConfig_1.reducedAmsTokenConfig[tokenName][0]);
await bitgo.registerToken(tokenName);
const coin = bitgo.coin(tokenName);
should.exist(coin);
coin.type.should.equal(tokenName);
const staticsCoin = coin.getConfig();
staticsCoin.name.should.equal('tip');
staticsCoin.decimalPlaces.should.equal(18);
// For EVM tokens, contractAddress is available on the statics coin
if ('contractAddress' in staticsCoin && staticsCoin.contractAddress) {
staticsCoin.contractAddress.should.equal('0x1234567890123456789012345678901234567890');
}
staticsCoin.family.should.equal('ip');
});
it('should register a thypeevm EVM coin token from AMS', async () => {
const bitgo = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'mock', microservicesUri, useAms: true });
bitgo.initializeTestVars();
const tokenName = 'thypeevm:faketoken';
// Setup nocks for AMS API call
nock(microservicesUri).get(`/api/v1/assets/name/${tokenName}`).reply(200, amsTokenConfig_1.reducedAmsTokenConfig[tokenName][0]);
await bitgo.registerToken(tokenName);
const coin = bitgo.coin(tokenName);
should.exist(coin);
coin.type.should.equal(tokenName);
const staticsCoin = coin.getConfig();
staticsCoin.name.should.equal('thypeevm');
staticsCoin.decimalPlaces.should.equal(18);
// For EVM tokens, contractAddress is available on the statics coin
if ('contractAddress' in staticsCoin && staticsCoin.contractAddress) {
staticsCoin.contractAddress.should.equal('0xabcdefabcdefabcdefabcdefabcdefabcdefabcd');
}
staticsCoin.family.should.equal('hypeevm');
});
it('should register an AMS-only token on a new-gen EVM family via the lazy path', async () => {
const bitgo = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'mock', microservicesUri, useAms: true });
bitgo.initializeTestVars();
const tokenName = 'thypeevm:faketoken';
// Setup nocks for AMS API call
nock(microservicesUri).get(`/api/v1/assets/name/${tokenName}`).reply(200, amsTokenConfig_1.reducedAmsTokenConfig[tokenName][0]);
await bitgo.registerToken(tokenName);
const coin = bitgo.coin(tokenName);
should.exist(coin);
coin.type.should.equal(tokenName);
coin.tokenContractAddress.should.equal('0xabcdefabcdefabcdefabcdefabcdefabcdefabcd');
});
it('should register a statics ERC721 token on a dual-standard EVM family via the lazy path', async () => {
const bitgo = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'mock', microservicesUri, useAms: true });
bitgo.initializeTestVars();
const tokenName = 'erc721:hbarevmtoken';
await bitgo.registerToken(tokenName);
const coin = bitgo.coin(tokenName);
should.exist(coin);
coin.type.should.equal(tokenName);
coin.should.be.an.instanceOf(sdk_coin_evm_1.EthLikeErc721Token);
});
it('should register a testnet ERC721 token on a dual-standard EVM family via the lazy path', async () => {
const bitgo = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'mock', microservicesUri, useAms: true });
bitgo.initializeTestVars();
const tokenName = 'thbarevm:tmnft';
await bitgo.registerToken(tokenName);
const coin = bitgo.coin(tokenName);
should.exist(coin);
coin.type.should.equal(tokenName);
coin.should.be.an.instanceOf(sdk_coin_evm_1.EthLikeErc721Token);
});
it('should register a SOL token from statics library if available', async () => {
const bitgo = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'mock', microservicesUri, useAms: true });
bitgo.initializeTestVars();
await bitgo.registerToken('tsol:usdc');
const coin = bitgo.coin('tsol:usdc');
should.exist(coin);
coin.type.should.equal('tsol:usdc');
coin.getBaseFactor().should.equal(1e9);
});
});
it('should create a custom coin factory from ams response and include SOL tokens from statics', async () => {
bitgo.initCoinFactory(amsTokenConfig_1.reducedAmsTokenConfig);
const coin = bitgo.coin('tsol:usdc');
should.exist(coin);
coin.type.should.equal('tsol:usdc');
coin.getBaseFactor().should.equal(1e9);
});
it('should resolve an AMS-only token on a new-gen EVM family after initCoinFactory', () => {
bitgo.initCoinFactory(amsTokenConfig_1.reducedAmsTokenConfig);
const coin = bitgo.coin('thypeevm:faketoken');
should.exist(coin);
coin.type.should.equal('thypeevm:faketoken');
coin.name.should.equal('Hyperliquid EVM Testnet Faketoken');
coin.decimalPlaces.should.equal(18);
coin.tokenContractAddress.should.equal('0xabcdefabcdefabcdefabcdefabcdefabcdefabcd');
});
it('should resolve an AMS-only token on a legacy EVM family after initCoinFactory', () => {
bitgo.initCoinFactory(amsTokenConfig_1.reducedAmsTokenConfig);
const coin = bitgo.coin('tbsc:faketoken');
should.exist(coin);
coin.type.should.equal('tbsc:faketoken');
coin.name.should.equal('Testnet BNB fake token');
coin.decimalPlaces.should.equal(18);
coin.tokenContractAddress.should.equal('0x9876543210987654321098765432109876543210');
// AMS-only tokens on legacy families are registered through the family-agnostic
// EthLikeErc20Token, not the legacy BscToken class.
coin.should.be.an.instanceOf(sdk_coin_evm_1.EthLikeErc20Token);
});
it('should not flip a statics token on a legacy EVM family to the generic token class', () => {
bitgo.initCoinFactory(amsTokenConfig_1.reducedAmsTokenConfig);
const coin = bitgo.coin('bsc:solv');
should.exist(coin);
coin.should.be.an.instanceOf(sdk_coin_bsc_1.BscToken);
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW1zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC92Mi91bml0L2Ftcy9hbXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxpQ0FBa0M7QUFDbEMsNkJBQThCO0FBRTlCLDhDQUErQztBQUMvQyw4Q0FBNEM7QUFDNUMseUNBQXNEO0FBQ3RELG1FQUF1RTtBQUN2RSxzREFBNEU7QUFDNUUsc0RBQStDO0FBRS9DLFFBQVEsQ0FBQyx3QkFBd0IsRUFBRSxHQUFHLEVBQUU7SUFDdEMsTUFBTSxnQkFBZ0IsR0FBRyx1QkFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUNsRCxJQUFJLEtBQUssQ0FBQztJQUNWLE1BQU0sQ0FBQztRQUNMLEtBQUssR0FBRyxvQkFBUyxDQUFDLFFBQVEsQ0FBQyxXQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQWtCLENBQUMsQ0FBQztRQUNuRyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUM3QixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyx1REFBdUQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNyRSxLQUFLLENBQUMsZUFBZSxDQUFDLHNDQUFxQixDQUFDLENBQUM7UUFDN0MsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7SUFDdkYsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMscUVBQXFFLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDbkYsTUFBTSxVQUFVLEdBQUcsb0JBQVMsQ0FBQyxRQUFRLENBQUMsV0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFTLENBQUMsQ0FBQztRQUN0RyxVQUFVLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUNoQyxVQUFVLENBQUMsZUFBZSxDQUFDLHNDQUFxQixDQUFDLENBQUM7UUFDbEQsQ0FBQyxHQUFHLEVBQUU7WUFDSixVQUFVLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDYix1TkFBdU4sQ0FDeE4sQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHdEQUF3RCxFQUFFLEdBQUcsRUFBRTtRQUNoRSxNQUFNLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQztRQUNwQyxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQy9CLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbkMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7SUFDdkYsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsa0VBQWtFLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDaEYsTUFBTSxLQUFLLEdBQUcsb0JBQVMsQ0FBQyxRQUFRLENBQUMsV0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFrQixDQUFDLENBQUM7UUFDekcsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFFM0IsY0FBYztRQUNkLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsc0NBQXFCLENBQUMsQ0FBQztRQUU1RixNQUFNLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMzQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JCLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGVBQWUsRUFBRSxHQUFHLEVBQUU7UUFDN0IsRUFBRSxDQUFDLDRDQUE0QyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzFELE1BQU0sVUFBVSxHQUFHLG9CQUFTLENBQUMsUUFBUSxDQUFDLFdBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBa0IsQ0FBQyxDQUFDO1lBQy9HLFVBQVUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBRWhDLE1BQU0sVUFBVTtpQkFDYixhQUFhLENBQUMsaUJBQWlCLENBQUM7aUJBQ2hDLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLDREQUE0RCxDQUFDLENBQUM7UUFDMUYsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMkRBQTJELEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDekUsTUFBTSxLQUFLLEdBQUcsb0JBQVMsQ0FBQyxRQUFRLENBQUMsV0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFrQixDQUFDLENBQUM7WUFDekcsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDM0IsTUFBTSxLQUFLLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDNUMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsbUVBQW1FLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDakYsTUFBTSxLQUFLLEdBQUcsb0JBQVMsQ0FBQyxRQUFRLENBQUMsV0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFrQixDQUFDLENBQUM7WUFDekcsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFFM0IsTUFBTSxTQUFTLEdBQUcsaUJBQWlCLENBQUM7WUFFcEMsY0FBYztZQUNkLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsU0FBUyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLHNDQUFxQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFL0csTUFBTSxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3JDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDbkMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywwQ0FBMEMsRUFBRSxLQUFLLElBQUksRUFBRTtZQUN4RCxNQUFNLEtBQUssR0FBRyxvQkFBUyxDQUFDLFFBQVEsQ0FBQyxXQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQWtCLENBQUMsQ0FBQztZQUN6RyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUUzQixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFFeEIsTUFBTSxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3JDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDbkMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxvRUFBb0UsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNsRixNQUFNLEtBQUssR0FBRyxvQkFBUyxDQUFDLFFBQVEsQ0FBQyxXQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQWtCLENBQUMsQ0FBQztZQUN6RyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMzQixNQUFNLEtBQUssQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdEMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNwQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDRDQUE0QyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzFELE1BQU0sS0FBSyxHQUFHLG9CQUFTLENBQUMsUUFBUSxDQUFDLFdBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBa0IsQ0FBQyxDQUFDO1lBQ3pHLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBRTNCLE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQztZQUVsQywrQkFBK0I7WUFDL0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsR0FBRyxDQUFDLHVCQUF1QixTQUFTLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsc0NBQXFCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUUvRyxNQUFNLEtBQUssQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDckMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNuQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNsQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDckMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JDLFdBQVcsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMzQyxtRUFBbUU7WUFDbkUsSUFBSSxpQkFBaUIsSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUNuRSxXQUFXLENBQUMsZUFBMEIsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7WUFDckcsQ0FBQztZQUNELFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxvREFBb0QsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNsRSxNQUFNLEtBQUssR0FBRyxvQkFBUyxDQUFDLFFBQVEsQ0FBQyxXQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQWtCLENBQUMsQ0FBQztZQUN6RyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUUzQixNQUFNLFNBQVMsR0FBRyxvQkFBb0IsQ0FBQztZQUV2QywrQkFBK0I7WUFDL0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsR0FBRyxDQUFDLHVCQUF1QixTQUFTLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsc0NBQXFCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUUvRyxNQUFNLEtBQUssQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDckMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNuQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNsQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDckMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMzQyxtRUFBbUU7WUFDbkUsSUFBSSxpQkFBaUIsSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUNuRSxXQUFXLENBQUMsZUFBMEIsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7WUFDckcsQ0FBQztZQUNELFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw2RUFBNkUsRUFBRSxLQUFLLElBQUksRUFBRTtZQUMzRixNQUFNLEtBQUssR0FBRyxvQkFBUyxDQUFDLFFBQVEsQ0FBQyxXQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQWtCLENBQUMsQ0FBQztZQUN6RyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUUzQixNQUFNLFNBQVMsR0FBRyxvQkFBb0IsQ0FBQztZQUV2QywrQkFBK0I7WUFDL0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsR0FBRyxDQUFDLHVCQUF1QixTQUFTLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsc0NBQXFCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUUvRyxNQUFNLEtBQUssQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDckMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNuQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNqQyxJQUEwQixDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQztRQUM5RyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx3RkFBd0YsRUFBRSxLQUFLLElBQUksRUFBRTtZQUN0RyxNQUFNLEtBQUssR0FBRyxvQkFBUyxDQUFDLFFBQVEsQ0FBQyxXQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQWtCLENBQUMsQ0FBQztZQUN6RyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUUzQixNQUFNLFNBQVMsR0FBRyxxQkFBcUIsQ0FBQztZQUN4QyxNQUFNLEtBQUssQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDckMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNuQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLGlDQUFrQixDQUFDLENBQUM7UUFDbkQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsd0ZBQXdGLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDdEcsTUFBTSxLQUFLLEdBQUcsb0JBQVMsQ0FBQyxRQUFRLENBQUMsV0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFrQixDQUFDLENBQUM7WUFDekcsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFFM0IsTUFBTSxTQUFTLEdBQUcsZ0JBQWdCLENBQUM7WUFDbkMsTUFBTSxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3JDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDbkMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxpQ0FBa0IsQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLCtEQUErRCxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzdFLE1BQU0sS0FBSyxHQUFHLG9CQUFTLENBQUMsUUFBUSxDQUFDLFdBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBa0IsQ0FBQyxDQUFDO1lBQ3pHLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzNCLE1BQU0sS0FBSyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN2QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3JDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsMkZBQTJGLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDekcsS0FBSyxDQUFDLGVBQWUsQ0FBQyxzQ0FBcUIsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDckMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsZ0ZBQWdGLEVBQUUsR0FBRyxFQUFFO1FBQ3hGLEtBQUssQ0FBQyxlQUFlLENBQUMsc0NBQXFCLENBQUMsQ0FBQztRQUM3QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDOUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQztJQUN2RixDQUFDLENBQUMsQ0FBQztJQUNILEVBQUUsQ0FBQywrRUFBK0UsRUFBRSxHQUFHLEVBQUU7UUFDdkYsS0FBSyxDQUFDLGVBQWUsQ0FBQyxzQ0FBcUIsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUMxQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1FBQ3JGLGdGQUFnRjtRQUNoRixvREFBb0Q7UUFDcEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxnQ0FBaUIsQ0FBQyxDQUFDO0lBQ2xELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLG1GQUFtRixFQUFFLEdBQUcsRUFBRTtRQUMzRixLQUFLLENBQUMsZUFBZSxDQUFDLHNDQUFxQixDQUFDLENBQUM7UUFDN0MsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNwQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsdUJBQVEsQ0FBQyxDQUFDO0lBQ3pDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2hvdWxkID0gcmVxdWlyZSgnc2hvdWxkJyk7XG5pbXBvcnQgbm9jayA9IHJlcXVpcmUoJ25vY2snKTtcblxuaW1wb3J0IHsgRW52aXJvbm1lbnRzIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IFRlc3RCaXRHbyB9IGZyb20gJ0BiaXRnby9zZGstdGVzdCc7XG5pbXBvcnQgeyBCaXRHbywgQml0R29PcHRpb25zIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjJztcbmltcG9ydCB7IHJlZHVjZWRBbXNUb2tlbkNvbmZpZyB9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9hbXNUb2tlbkNvbmZpZyc7XG5pbXBvcnQgeyBFdGhMaWtlRXJjMjBUb2tlbiwgRXRoTGlrZUVyYzcyMVRva2VuIH0gZnJvbSAnQGJpdGdvL3Nkay1jb2luLWV2bSc7XG5pbXBvcnQgeyBCc2NUb2tlbiB9IGZyb20gJ0BiaXRnby9zZGstY29pbi1ic2MnO1xuXG5kZXNjcmliZSgnQXNzZXQgbWV0YWRhdGEgc2VydmljZScsICgpID0+IHtcbiAgY29uc3QgbWljcm9zZXJ2aWNlc1VyaSA9IEVudmlyb25tZW50c1snbW9jayddLnVyaTtcbiAgbGV0IGJpdGdvO1xuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvLCB7IGVudjogJ21vY2snLCBtaWNyb3NlcnZpY2VzVXJpLCB1c2VBbXM6IHRydWUgfSBhcyBCaXRHb09wdGlvbnMpO1xuICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNyZWF0ZSBhIGN1c3RvbSBjb2luIGZhY3RvcnkgZnJvbSBhbXMgcmVzcG9uc2UnLCBhc3luYyAoKSA9PiB7XG4gICAgYml0Z28uaW5pdENvaW5GYWN0b3J5KHJlZHVjZWRBbXNUb2tlbkNvbmZpZyk7XG4gICAgY29uc3QgY29pbiA9IGJpdGdvLmNvaW4oJ2h0ZXRoOmZha2V0b2tlbicpO1xuICAgIHNob3VsZC5leGlzdChjb2luKTtcbiAgICBjb2luLnR5cGUuc2hvdWxkLmVxdWFsKCdodGV0aDpmYWtldG9rZW4nKTtcbiAgICBjb2luLm5hbWUuc2hvdWxkLmVxdWFsKCdIb29kaSBUZXN0bmV0IGZha2UgdG9rZW4nKTtcbiAgICBjb2luLmRlY2ltYWxQbGFjZXMuc2hvdWxkLmVxdWFsKDYpO1xuICAgIGNvaW4udG9rZW5Db250cmFjdEFkZHJlc3Muc2hvdWxkLmVxdWFsKCcweDg5YTk1OWI5MTg0YjRmOGM4NjMzNjQ2ZDVkZmQwNDlkMmViYzk4M2EnKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBub3QgZmV0Y2ggY29pbiBmcm9tIGN1c3RvbSBjb2luIGZhY3Rvcnkgd2hlbiB1c2VBbXMgaXMgZmFsc2UnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYml0Z29Ob0FtcyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHbywgeyBlbnY6ICdtb2NrJywgbWljcm9zZXJ2aWNlc1VyaSwgdXNlQW1zOiBmYWxzZSB9IGFzIGFueSk7XG4gICAgYml0Z29Ob0Ftcy5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICBiaXRnb05vQW1zLmluaXRDb2luRmFjdG9yeShyZWR1Y2VkQW1zVG9rZW5Db25maWcpO1xuICAgICgoKSA9PiB7XG4gICAgICBiaXRnb05vQW1zLmNvaW4oJ2h0ZXRoOmZha2V0b2tlbicpO1xuICAgIH0pLnNob3VsZC50aHJvdyhcbiAgICAgICdDb2luIG9yIHRva2VuIHR5cGUgaHRldGg6ZmFrZXRva2VuIG5vdCBzdXBwb3J0ZWQgb3Igbm90IGNvbXBpbGVkLiBQbGVhc2UgYmUgc3VyZSB0aGF0IHlvdSBhcmUgdXNpbmcgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIEJpdEdvSlMuIElmIHVzaW5nIEBiaXRnby9zZGstYXBpLCBwbGVhc2UgY29uZmlybSB5b3UgaGF2ZSByZWdpc3RlcmVkIGh0ZXRoOmZha2V0b2tlbiBmaXJzdC4nXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBiZSBhYmxlIHRvIHJlZ2lzdGVyIGEgdG9rZW4gaW4gdGhlIGNvaW4gZmFjdG9yeScsICgpID0+IHtcbiAgICBjb25zdCB0b2tlbk5hbWUgPSAnaHRldGg6ZmFrZXRva2VuJztcbiAgICBiaXRnby5yZWdpc3RlclRva2VuKHRva2VuTmFtZSk7XG4gICAgY29uc3QgY29pbiA9IGJpdGdvLmNvaW4odG9rZW5OYW1lKTtcbiAgICBzaG91bGQuZXhpc3QoY29pbik7XG4gICAgY29pbi50eXBlLnNob3VsZC5lcXVhbCh0b2tlbk5hbWUpO1xuICAgIGNvaW4ubmFtZS5zaG91bGQuZXF1YWwoJ0hvb2RpIFRlc3RuZXQgZmFrZSB0b2tlbicpO1xuICAgIGNvaW4uZGVjaW1hbFBsYWNlcy5zaG91bGQuZXF1YWwoNik7XG4gICAgY29pbi50b2tlbkNvbnRyYWN0QWRkcmVzcy5zaG91bGQuZXF1YWwoJzB4ODlhOTU5YjkxODRiNGY4Yzg2MzM2NDZkNWRmZDA0OWQyZWJjOTgzYScpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGZldGNoIGFsbCBhc3NldHMgZnJvbSBBTVMgYW5kIGluaXRpYWxpemUgdGhlIGNvaW4gZmFjdG9yeScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBiaXRnbyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHbywgeyBlbnY6ICdtb2NrJywgbWljcm9zZXJ2aWNlc1VyaSwgdXNlQW1zOiB0cnVlIH0gYXMgQml0R29PcHRpb25zKTtcbiAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcblxuICAgIC8vIFNldHVwIG5vY2tzXG4gICAgbm9jayhtaWNyb3NlcnZpY2VzVXJpKS5nZXQoJy9hcGkvdjEvYXNzZXRzL2xpc3QvdGVzdG5ldCcpLnJlcGx5KDIwMCwgcmVkdWNlZEFtc1Rva2VuQ29uZmlnKTtcblxuICAgIGF3YWl0IGJpdGdvLnJlZ2lzdGVyQWxsVG9rZW5zKCk7XG4gICAgY29uc3QgY29pbiA9IGJpdGdvLmNvaW4oJ2h0ZXRoOmZha2V0b2tlbicpO1xuICAgIHNob3VsZC5leGlzdChjb2luKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JlZ2lzdGVyVG9rZW4nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBhbiBlcnJvciB3aGVuIHVzZUFtcyBpcyBmYWxzZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJpdGdvTm9BbXMgPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R28sIHsgZW52OiAnbW9jaycsIG1pY3Jvc2VydmljZXNVcmksIHVzZUFtczogZmFsc2UgfSBhcyBCaXRHb09wdGlvbnMpO1xuICAgICAgYml0Z29Ob0Ftcy5pbml0aWFsaXplVGVzdFZhcnMoKTtcblxuICAgICAgYXdhaXQgYml0Z29Ob0Ftc1xuICAgICAgICAucmVnaXN0ZXJUb2tlbignaHRldGg6ZmFrZXRva2VuJylcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ3JlZ2lzdGVyVG9rZW4gaXMgb25seSBzdXBwb3J0ZWQgd2hlbiB1c2VBbXMgaXMgc2V0IHRvIHRydWUnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVnaXN0ZXIgYSB0b2tlbiBmcm9tIHN0YXRpY3MgbGlicmFyeSBpZiBhdmFpbGFibGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBiaXRnbyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHbywgeyBlbnY6ICdtb2NrJywgbWljcm9zZXJ2aWNlc1VyaSwgdXNlQW1zOiB0cnVlIH0gYXMgQml0R29PcHRpb25zKTtcbiAgICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICAgICAgYXdhaXQgYml0Z28ucmVnaXN0ZXJUb2tlbignaHRldGg6YmdlcmNodjInKTtcbiAgICAgIGNvbnN0IGNvaW4gPSBiaXRnby5jb2luKCdodGV0aDpiZ2VyY2h2MicpO1xuICAgICAgc2hvdWxkLmV4aXN0KGNvaW4pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmZXRjaCB0b2tlbiBpbmZvcm1hdGlvbiBmcm9tIEFNUyBpZiBub3QgaW4gc3RhdGljcyBsaWJyYXJ5JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R28sIHsgZW52OiAnbW9jaycsIG1pY3Jvc2VydmljZXNVcmksIHVzZUFtczogdHJ1ZSB9IGFzIEJpdEdvT3B0aW9ucyk7XG4gICAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcblxuICAgICAgY29uc3QgdG9rZW5OYW1lID0gJ2h0ZXRoOmZha2V0b2tlbic7XG5cbiAgICAgIC8vIFNldHVwIG5vY2tzXG4gICAgICBub2NrKG1pY3Jvc2VydmljZXNVcmkpLmdldChgL2FwaS92MS9hc3NldHMvbmFtZS8ke3Rva2VuTmFtZX1gKS5yZXBseSgyMDAsIHJlZHVjZWRBbXNUb2tlbkNvbmZpZ1t0b2tlbk5hbWVdWzBdKTtcblxuICAgICAgYXdhaXQgYml0Z28ucmVnaXN0ZXJUb2tlbih0b2tlbk5hbWUpO1xuICAgICAgY29uc3QgY29pbiA9IGJpdGdvLmNvaW4odG9rZW5OYW1lKTtcbiAgICAgIHNob3VsZC5leGlzdChjb2luKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYmUgYWJsZSB0byByZWdpc3RlciB0aGUgb2ZjIHRva2VuJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R28sIHsgZW52OiAnbW9jaycsIG1pY3Jvc2VydmljZXNVcmksIHVzZUFtczogdHJ1ZSB9IGFzIEJpdEdvT3B0aW9ucyk7XG4gICAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcblxuICAgICAgY29uc3QgdG9rZW5OYW1lID0gJ29mYyc7XG5cbiAgICAgIGF3YWl0IGJpdGdvLnJlZ2lzdGVyVG9rZW4odG9rZW5OYW1lKTtcbiAgICAgIGNvbnN0IGNvaW4gPSBiaXRnby5jb2luKHRva2VuTmFtZSk7XG4gICAgICBzaG91bGQuZXhpc3QoY29pbik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlZ2lzdGVyIGEgRVZNIGNvaW4gdG9rZW4gZnJvbSBzdGF0aWNzIGxpYnJhcnkgaWYgYXZhaWxhYmxlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R28sIHsgZW52OiAnbW9jaycsIG1pY3Jvc2VydmljZXNVcmksIHVzZUFtczogdHJ1ZSB9IGFzIEJpdEdvT3B0aW9ucyk7XG4gICAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICAgIGF3YWl0IGJpdGdvLnJlZ2lzdGVyVG9rZW4oJ3RpcDp1c2RjJyk7XG4gICAgICBjb25zdCBjb2luID0gYml0Z28uY29pbigndGlwOnVzZGMnKTtcbiAgICAgIHNob3VsZC5leGlzdChjb2luKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVnaXN0ZXIgYW4gRVZNIGNvaW4gdG9rZW4gZnJvbSBBTVMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBiaXRnbyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHbywgeyBlbnY6ICdtb2NrJywgbWljcm9zZXJ2aWNlc1VyaSwgdXNlQW1zOiB0cnVlIH0gYXMgQml0R29PcHRpb25zKTtcbiAgICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuXG4gICAgICBjb25zdCB0b2tlbk5hbWUgPSAndGlwOmZha2V0b2tlbic7XG5cbiAgICAgIC8vIFNldHVwIG5vY2tzIGZvciBBTVMgQVBJIGNhbGxcbiAgICAgIG5vY2sobWljcm9zZXJ2aWNlc1VyaSkuZ2V0KGAvYXBpL3YxL2Fzc2V0cy9uYW1lLyR7dG9rZW5OYW1lfWApLnJlcGx5KDIwMCwgcmVkdWNlZEFtc1Rva2VuQ29uZmlnW3Rva2VuTmFtZV1bMF0pO1xuXG4gICAgICBhd2FpdCBiaXRnby5yZWdpc3RlclRva2VuKHRva2VuTmFtZSk7XG4gICAgICBjb25zdCBjb2luID0gYml0Z28uY29pbih0b2tlbk5hbWUpO1xuICAgICAgc2hvdWxkLmV4aXN0KGNvaW4pO1xuICAgICAgY29pbi50eXBlLnNob3VsZC5lcXVhbCh0b2tlbk5hbWUpO1xuICAgICAgY29uc3Qgc3RhdGljc0NvaW4gPSBjb2luLmdldENvbmZpZygpO1xuICAgICAgc3RhdGljc0NvaW4ubmFtZS5zaG91bGQuZXF1YWwoJ3RpcCcpO1xuICAgICAgc3RhdGljc0NvaW4uZGVjaW1hbFBsYWNlcy5zaG91bGQuZXF1YWwoMTgpO1xuICAgICAgLy8gRm9yIEVWTSB0b2tlbnMsIGNvbnRyYWN0QWRkcmVzcyBpcyBhdmFpbGFibGUgb24gdGhlIHN0YXRpY3MgY29pblxuICAgICAgaWYgKCdjb250cmFjdEFkZHJlc3MnIGluIHN0YXRpY3NDb2luICYmIHN0YXRpY3NDb2luLmNvbnRyYWN0QWRkcmVzcykge1xuICAgICAgICAoc3RhdGljc0NvaW4uY29udHJhY3RBZGRyZXNzIGFzIHN0cmluZykuc2hvdWxkLmVxdWFsKCcweDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAnKTtcbiAgICAgIH1cbiAgICAgIHN0YXRpY3NDb2luLmZhbWlseS5zaG91bGQuZXF1YWwoJ2lwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlZ2lzdGVyIGEgdGh5cGVldm0gRVZNIGNvaW4gdG9rZW4gZnJvbSBBTVMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBiaXRnbyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHbywgeyBlbnY6ICdtb2NrJywgbWljcm9zZXJ2aWNlc1VyaSwgdXNlQW1zOiB0cnVlIH0gYXMgQml0R29PcHRpb25zKTtcbiAgICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuXG4gICAgICBjb25zdCB0b2tlbk5hbWUgPSAndGh5cGVldm06ZmFrZXRva2VuJztcblxuICAgICAgLy8gU2V0dXAgbm9ja3MgZm9yIEFNUyBBUEkgY2FsbFxuICAgICAgbm9jayhtaWNyb3NlcnZpY2VzVXJpKS5nZXQoYC9hcGkvdjEvYXNzZXRzL25hbWUvJHt0b2tlbk5hbWV9YCkucmVwbHkoMjAwLCByZWR1Y2VkQW1zVG9rZW5Db25maWdbdG9rZW5OYW1lXVswXSk7XG5cbiAgICAgIGF3YWl0IGJpdGdvLnJlZ2lzdGVyVG9rZW4odG9rZW5OYW1lKTtcbiAgICAgIGNvbnN0IGNvaW4gPSBiaXRnby5jb2luKHRva2VuTmFtZSk7XG4gICAgICBzaG91bGQuZXhpc3QoY29pbik7XG4gICAgICBjb2luLnR5cGUuc2hvdWxkLmVxdWFsKHRva2VuTmFtZSk7XG4gICAgICBjb25zdCBzdGF0aWNzQ29pbiA9IGNvaW4uZ2V0Q29uZmlnKCk7XG4gICAgICBzdGF0aWNzQ29pbi5uYW1lLnNob3VsZC5lcXVhbCgndGh5cGVldm0nKTtcbiAgICAgIHN0YXRpY3NDb2luLmRlY2ltYWxQbGFjZXMuc2hvdWxkLmVxdWFsKDE4KTtcbiAgICAgIC8vIEZvciBFVk0gdG9rZW5zLCBjb250cmFjdEFkZHJlc3MgaXMgYXZhaWxhYmxlIG9uIHRoZSBzdGF0aWNzIGNvaW5cbiAgICAgIGlmICgnY29udHJhY3RBZGRyZXNzJyBpbiBzdGF0aWNzQ29pbiAmJiBzdGF0aWNzQ29pbi5jb250cmFjdEFkZHJlc3MpIHtcbiAgICAgICAgKHN0YXRpY3NDb2luLmNvbnRyYWN0QWRkcmVzcyBhcyBzdHJpbmcpLnNob3VsZC5lcXVhbCgnMHhhYmNkZWZhYmNkZWZhYmNkZWZhYmNkZWZhYmNkZWZhYmNkZWZhYmNkJyk7XG4gICAgICB9XG4gICAgICBzdGF0aWNzQ29pbi5mYW1pbHkuc2hvdWxkLmVxdWFsKCdoeXBlZXZtJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlZ2lzdGVyIGFuIEFNUy1vbmx5IHRva2VuIG9uIGEgbmV3LWdlbiBFVk0gZmFtaWx5IHZpYSB0aGUgbGF6eSBwYXRoJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R28sIHsgZW52OiAnbW9jaycsIG1pY3Jvc2VydmljZXNVcmksIHVzZUFtczogdHJ1ZSB9IGFzIEJpdEdvT3B0aW9ucyk7XG4gICAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcblxuICAgICAgY29uc3QgdG9rZW5OYW1lID0gJ3RoeXBlZXZtOmZha2V0b2tlbic7XG5cbiAgICAgIC8vIFNldHVwIG5vY2tzIGZvciBBTVMgQVBJIGNhbGxcbiAgICAgIG5vY2sobWljcm9zZXJ2aWNlc1VyaSkuZ2V0KGAvYXBpL3YxL2Fzc2V0cy9uYW1lLyR7dG9rZW5OYW1lfWApLnJlcGx5KDIwMCwgcmVkdWNlZEFtc1Rva2VuQ29uZmlnW3Rva2VuTmFtZV1bMF0pO1xuXG4gICAgICBhd2FpdCBiaXRnby5yZWdpc3RlclRva2VuKHRva2VuTmFtZSk7XG4gICAgICBjb25zdCBjb2luID0gYml0Z28uY29pbih0b2tlbk5hbWUpO1xuICAgICAgc2hvdWxkLmV4aXN0KGNvaW4pO1xuICAgICAgY29pbi50eXBlLnNob3VsZC5lcXVhbCh0b2tlbk5hbWUpO1xuICAgICAgKGNvaW4gYXMgRXRoTGlrZUVyYzIwVG9rZW4pLnRva2VuQ29udHJhY3RBZGRyZXNzLnNob3VsZC5lcXVhbCgnMHhhYmNkZWZhYmNkZWZhYmNkZWZhYmNkZWZhYmNkZWZhYmNkZWZhYmNkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlZ2lzdGVyIGEgc3RhdGljcyBFUkM3MjEgdG9rZW4gb24gYSBkdWFsLXN0YW5kYXJkIEVWTSBmYW1pbHkgdmlhIHRoZSBsYXp5IHBhdGgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBiaXRnbyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHbywgeyBlbnY6ICdtb2NrJywgbWljcm9zZXJ2aWNlc1VyaSwgdXNlQW1zOiB0cnVlIH0gYXMgQml0R29PcHRpb25zKTtcbiAgICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuXG4gICAgICBjb25zdCB0b2tlbk5hbWUgPSAnZXJjNzIxOmhiYXJldm10b2tlbic7XG4gICAgICBhd2FpdCBiaXRnby5yZWdpc3RlclRva2VuKHRva2VuTmFtZSk7XG4gICAgICBjb25zdCBjb2luID0gYml0Z28uY29pbih0b2tlbk5hbWUpO1xuICAgICAgc2hvdWxkLmV4aXN0KGNvaW4pO1xuICAgICAgY29pbi50eXBlLnNob3VsZC5lcXVhbCh0b2tlbk5hbWUpO1xuICAgICAgY29pbi5zaG91bGQuYmUuYW4uaW5zdGFuY2VPZihFdGhMaWtlRXJjNzIxVG9rZW4pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWdpc3RlciBhIHRlc3RuZXQgRVJDNzIxIHRva2VuIG9uIGEgZHVhbC1zdGFuZGFyZCBFVk0gZmFtaWx5IHZpYSB0aGUgbGF6eSBwYXRoJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R28sIHsgZW52OiAnbW9jaycsIG1pY3Jvc2VydmljZXNVcmksIHVzZUFtczogdHJ1ZSB9IGFzIEJpdEdvT3B0aW9ucyk7XG4gICAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcblxuICAgICAgY29uc3QgdG9rZW5OYW1lID0gJ3RoYmFyZXZtOnRtbmZ0JztcbiAgICAgIGF3YWl0IGJpdGdvLnJlZ2lzdGVyVG9rZW4odG9rZW5OYW1lKTtcbiAgICAgIGNvbnN0IGNvaW4gPSBiaXRnby5jb2luKHRva2VuTmFtZSk7XG4gICAgICBzaG91bGQuZXhpc3QoY29pbik7XG4gICAgICBjb2luLnR5cGUuc2hvdWxkLmVxdWFsKHRva2VuTmFtZSk7XG4gICAgICBjb2luLnNob3VsZC5iZS5hbi5pbnN0YW5jZU9mKEV0aExpa2VFcmM3MjFUb2tlbik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlZ2lzdGVyIGEgU09MIHRva2VuIGZyb20gc3RhdGljcyBsaWJyYXJ5IGlmIGF2YWlsYWJsZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvLCB7IGVudjogJ21vY2snLCBtaWNyb3NlcnZpY2VzVXJpLCB1c2VBbXM6IHRydWUgfSBhcyBCaXRHb09wdGlvbnMpO1xuICAgICAgYml0Z28uaW5pdGlhbGl6ZVRlc3RWYXJzKCk7XG4gICAgICBhd2FpdCBiaXRnby5yZWdpc3RlclRva2VuKCd0c29sOnVzZGMnKTtcbiAgICAgIGNvbnN0IGNvaW4gPSBiaXRnby5jb2luKCd0c29sOnVzZGMnKTtcbiAgICAgIHNob3VsZC5leGlzdChjb2luKTtcbiAgICAgIGNvaW4udHlwZS5zaG91bGQuZXF1YWwoJ3Rzb2w6dXNkYycpO1xuICAgICAgY29pbi5nZXRCYXNlRmFjdG9yKCkuc2hvdWxkLmVxdWFsKDFlOSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgY3JlYXRlIGEgY3VzdG9tIGNvaW4gZmFjdG9yeSBmcm9tIGFtcyByZXNwb25zZSBhbmQgaW5jbHVkZSBTT0wgdG9rZW5zIGZyb20gc3RhdGljcycsIGFzeW5jICgpID0+IHtcbiAgICBiaXRnby5pbml0Q29pbkZhY3RvcnkocmVkdWNlZEFtc1Rva2VuQ29uZmlnKTtcbiAgICBjb25zdCBjb2luID0gYml0Z28uY29pbigndHNvbDp1c2RjJyk7XG4gICAgc2hvdWxkLmV4aXN0KGNvaW4pO1xuICAgIGNvaW4udHlwZS5zaG91bGQuZXF1YWwoJ3Rzb2w6dXNkYycpO1xuICAgIGNvaW4uZ2V0QmFzZUZhY3RvcigpLnNob3VsZC5lcXVhbCgxZTkpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJlc29sdmUgYW4gQU1TLW9ubHkgdG9rZW4gb24gYSBuZXctZ2VuIEVWTSBmYW1pbHkgYWZ0ZXIgaW5pdENvaW5GYWN0b3J5JywgKCkgPT4ge1xuICAgIGJpdGdvLmluaXRDb2luRmFjdG9yeShyZWR1Y2VkQW1zVG9rZW5Db25maWcpO1xuICAgIGNvbnN0IGNvaW4gPSBiaXRnby5jb2luKCd0aHlwZWV2bTpmYWtldG9rZW4nKTtcbiAgICBzaG91bGQuZXhpc3QoY29pbik7XG4gICAgY29pbi50eXBlLnNob3VsZC5lcXVhbCgndGh5cGVldm06ZmFrZXRva2VuJyk7XG4gICAgY29pbi5uYW1lLnNob3VsZC5lcXVhbCgnSHlwZXJsaXF1aWQgRVZNIFRlc3RuZXQgRmFrZXRva2VuJyk7XG4gICAgY29pbi5kZWNpbWFsUGxhY2VzLnNob3VsZC5lcXVhbCgxOCk7XG4gICAgY29pbi50b2tlbkNvbnRyYWN0QWRkcmVzcy5zaG91bGQuZXF1YWwoJzB4YWJjZGVmYWJjZGVmYWJjZGVmYWJjZGVmYWJjZGVmYWJjZGVmYWJjZCcpO1xuICB9KTtcbiAgaXQoJ3Nob3VsZCByZXNvbHZlIGFuIEFNUy1vbmx5IHRva2VuIG9uIGEgbGVnYWN5IEVWTSBmYW1pbHkgYWZ0ZXIgaW5pdENvaW5GYWN0b3J5JywgKCkgPT4ge1xuICAgIGJpdGdvLmluaXRDb2luRmFjdG9yeShyZWR1Y2VkQW1zVG9rZW5Db25maWcpO1xuICAgIGNvbnN0IGNvaW4gPSBiaXRnby5jb2luKCd0YnNjOmZha2V0b2tlbicpO1xuICAgIHNob3VsZC5leGlzdChjb2luKTtcbiAgICBjb2luLnR5cGUuc2hvdWxkLmVxdWFsKCd0YnNjOmZha2V0b2tlbicpO1xuICAgIGNvaW4ubmFtZS5zaG91bGQuZXF1YWwoJ1Rlc3RuZXQgQk5CIGZha2UgdG9rZW4nKTtcbiAgICBjb2luLmRlY2ltYWxQbGFjZXMuc2hvdWxkLmVxdWFsKDE4KTtcbiAgICBjb2luLnRva2VuQ29udHJhY3RBZGRyZXNzLnNob3VsZC5lcXVhbCgnMHg5ODc2NTQzMjEwOTg3NjU0MzIxMDk4NzY1NDMyMTA5ODc2NTQzMjEwJyk7XG4gICAgLy8gQU1TLW9ubHkgdG9rZW5zIG9uIGxlZ2FjeSBmYW1pbGllcyBhcmUgcmVnaXN0ZXJlZCB0aHJvdWdoIHRoZSBmYW1pbHktYWdub3N0aWNcbiAgICAvLyBFdGhMaWtlRXJjMjBUb2tlbiwgbm90IHRoZSBsZWdhY3kgQnNjVG9rZW4gY2xhc3MuXG4gICAgY29pbi5zaG91bGQuYmUuYW4uaW5zdGFuY2VPZihFdGhMaWtlRXJjMjBUb2tlbik7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgbm90IGZsaXAgYSBzdGF0aWNzIHRva2VuIG9uIGEgbGVnYWN5IEVWTSBmYW1pbHkgdG8gdGhlIGdlbmVyaWMgdG9rZW4gY2xhc3MnLCAoKSA9PiB7XG4gICAgYml0Z28uaW5pdENvaW5GYWN0b3J5KHJlZHVjZWRBbXNUb2tlbkNvbmZpZyk7XG4gICAgY29uc3QgY29pbiA9IGJpdGdvLmNvaW4oJ2JzYzpzb2x2Jyk7XG4gICAgc2hvdWxkLmV4aXN0KGNvaW4pO1xuICAgIGNvaW4uc2hvdWxkLmJlLmFuLmluc3RhbmNlT2YoQnNjVG9rZW4pO1xuICB9KTtcbn0pO1xuIl19