@tatumio/tatum-v1
Version:
Tatum API client allows browsers and Node.js clients to interact with Tatum API.
410 lines • 44.1 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const fs_1 = require("fs");
const model_1 = require("../model");
const transaction_1 = require("../transaction");
const nft_1 = require("./nft");
describe('NFT tests', () => {
jest.setTimeout(99999);
describe('NFT CELO transactions', () => {
it('should test valid deploy 721 transaction', async () => {
const body = new model_1.CeloDeployErc721();
body.fromPrivateKey = '0xa488a82b8b57c3ece4307525741fd8256781906c5fad948b85f1d63000948236';
body.name = 'Tatum';
body.symbol = 'TTM';
body.feeCurrency = model_1.Currency.CUSD;
body.chain = model_1.Currency.CELO;
const test = await nft_1.deployNFT(true, body, 'https://alfajores-forno.celo-testnet.org');
console.log(test);
expect(test).toBeDefined();
});
it('should test celo 721 mint multiple transaction with cashback', async () => {
const firstTokenId = new Date().getTime();
const secondTokenId = firstTokenId + 1;
const mintedTokens = await nft_1.mintMultipleNFTWithUri(true, {
to: ['0x811dfbff13adfbc3cf653dcc373c03616d3471c9', '0x811dfbff13adfbc3cf653dcc373c03616d3471c9'],
chain: model_1.Currency.CELO,
tokenId: [firstTokenId.toString(), secondTokenId.toString()],
url: ['https://www.seznam.cz', 'https://www.seznam.cz'],
fromPrivateKey: '0x4874827a55d87f2309c55b835af509e3427aa4d52321eeb49a2b93b5c0f8edfb',
contractAddress: '0x69aBb0b2d0fEd5f1Be31b007689181CeE0ed909B',
authorAddresses: [['0x6c4A48886b77D1197eCFBDaA3D3f35d81d584342', '0x811dfbff13adfbc3cf653dcc373c03616d3471c9'], ['0x6c4A48886b77D1197eCFBDaA3D3f35d81d584342', '0x811dfbff13adfbc3cf653dcc373c03616d3471c9']],
cashbackValues: [['0.25', '0.25'], ['0.25', '0.25']],
fee: { gasLimit: '6000000', gasPrice: '100' },
feeCurrency: model_1.Currency.CUSD
});
console.log(mintedTokens);
expect(mintedTokens).not.toBeNull();
});
it('should test valid mint cashback 721 transaction', async () => {
const body = new model_1.CeloMintErc721();
body.fromPrivateKey = '0xa488a82b8b57c3ece4307525741fd8256781906c5fad948b85f1d63000948236';
body.to = '0x48d4bA7B2698A4b89635b9a2E391152350DB740f';
body.contractAddress = '0x28980D12Ce9E7Bf6C20f568Db998E9A4d8F13271';
body.authorAddresses = ['0x7100f8FF8AF3F5e527141039A1ceE9D244f39862'];
body.cashbackValues = ['0.25'];
body.tokenId = '1';
body.url = 'https://google.com';
body.feeCurrency = model_1.Currency.CUSD;
body.chain = model_1.Currency.CELO;
const test = await nft_1.mintNFTWithUri(true, body, 'https://alfajores-forno.celo-testnet.org');
console.log('test results', test);
expect(test).toBeDefined();
});
it('should test valid mint 721 transaction', async () => {
const body = new model_1.CeloMintErc721();
body.fromPrivateKey = '0xa488a82b8b57c3ece4307525741fd8256781906c5fad948b85f1d63000948236';
body.to = '0x48d4bA7B2698A4b89635b9a2E391152350DB740f';
body.contractAddress = '0x1214BEada6b25bc98f7494C7BDBf22C095FDCaBD';
body.tokenId = '33334';
body.url = 'https://google.com';
body.feeCurrency = model_1.Currency.CUSD;
body.chain = model_1.Currency.CELO;
expect(await nft_1.mintNFTWithUri(true, body, 'https://alfajores-forno.celo-testnet.org')).toBeDefined();
});
it('should test valid mint 721 transaction on IPFS', async () => {
const body = new model_1.CeloMintErc721();
body.fromPrivateKey = '0xa488a82b8b57c3ece4307525741fd8256781906c5fad948b85f1d63000948236';
body.to = '0x48d4bA7B2698A4b89635b9a2E391152350DB740f';
body.contractAddress = '0x1214BEada6b25bc98f7494C7BDBf22C095FDCaBD';
body.tokenId = `${Date.now()}`;
body.feeCurrency = model_1.Currency.CUSD;
body.chain = model_1.Currency.CELO;
console.log(await nft_1.createNFT(true, body, fs_1.readFileSync('/Users/ssramko/Downloads/logo_tatum.png'), 'Tatum LOGO', 'description', undefined, 'https://alfajores-forno.celo-testnet.org'));
});
it('should test valid mint multiple 721 transaction', async () => {
const body = new model_1.CeloMintMultipleErc721();
body.fromPrivateKey = '0xa488a82b8b57c3ece4307525741fd8256781906c5fad948b85f1d63000948236';
body.to = ['0x8cb76aed9c5e336ef961265c6079c14e9cd3d2ea', '0x8cb76aed9c5e336ef961265c6079c14e9cd3d2ea'];
body.contractAddress = '0x3e1a302DA9345ae6f8188607C017d342A4CCf22e';
body.tokenId = ['4', '5'];
body.url = ['https://google.com', 'https://google.com'];
body.feeCurrency = model_1.Currency.CUSD;
body.chain = model_1.Currency.CELO;
expect(await nft_1.mintMultipleNFTWithUri(true, body, 'https://alfajores-forno.celo-testnet.org')).toBeDefined();
});
it('should test valid burn 721 transaction', async () => {
const body = new model_1.CeloBurnErc721();
body.fromPrivateKey = '0xa488a82b8b57c3ece4307525741fd8256781906c5fad948b85f1d63000948236';
body.contractAddress = '0x3e1a302DA9345ae6f8188607C017d342A4CCf22e';
body.tokenId = '3';
body.feeCurrency = model_1.Currency.CUSD;
body.chain = model_1.Currency.CELO;
expect(await nft_1.burnNFT(true, body, 'https://alfajores-forno.celo-testnet.org')).toBeDefined();
});
it('should test valid transfer 721 transaction', async () => {
const body = new model_1.CeloTransferErc721();
body.fromPrivateKey = '0xa488a82b8b57c3ece4307525741fd8256781906c5fad948b85f1d63000948236';
body.to = '0xd093bEd4BC06403bfEABB54667B42C48533D3Fd9';
body.contractAddress = '0x1214BEada6b25bc98f7494C7BDBf22C095FDCaBD';
body.tokenId = '33334';
body.feeCurrency = model_1.Currency.CUSD;
body.chain = model_1.Currency.CELO;
expect(await nft_1.transferNFT(true, body, 'https://alfajores-forno.celo-testnet.org')).toBeDefined();
});
});
describe('NFT ETH transactions', () => {
it('should test eth 721 deploy transaction', async () => {
const deployErc721Token = await nft_1.deployNFT(true, {
symbol: 'TatumToken',
chain: model_1.Currency.ETH,
fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29',
name: 'TatumToken',
fee: { gasLimit: '6000000', gasPrice: '100' }
});
expect(deployErc721Token).not.toBeNull();
console.log('response::', deployErc721Token);
});
it('should test eth 721 mint transaction', async () => {
const tokenId = new Date().getTime().toString();
const mintedToken = await nft_1.mintNFTWithUri(true, {
to: '0x687422eEA2cB73B5d3e242bA5456b782919AFc85',
chain: model_1.Currency.ETH,
tokenId,
url: 'https://www.seznam.cz',
fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29',
contractAddress: '0xE4966098662cF4c8e9BB63D643336b163cB9FFE1'
});
console.log(tokenId);
expect(mintedToken).not.toBeNull();
});
it('should test eth 721 mint transaction with cashback', async () => {
const tokenId = new Date().getTime().toString();
const mintedToken = await nft_1.mintNFTWithUri(true, {
to: '0x4b812a77b109A150C2Fc89eD133EaBC78bC9EC8f',
chain: model_1.Currency.ETH,
tokenId,
url: 'test.com',
fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29',
contractAddress: '0xE4966098662cF4c8e9BB63D643336b163cB9FFE1',
authorAddresses: ['0x6c4A48886b77D1197eCFBDaA3D3f35d81d584342'],
cashbackValues: ['0.25']
});
console.log(mintedToken);
expect(mintedToken).not.toBeNull();
});
it('should test eth 721 mint multiple transaction with cashback', async () => {
const firstTokenId = new Date().getTime();
const secondTokenId = firstTokenId + 1;
const mintedTokens = await nft_1.mintMultipleNFTWithUri(true, {
to: ['0x811dfbff13adfbc3cf653dcc373c03616d3471c9', '0x811dfbff13adfbc3cf653dcc373c03616d3471c9'],
chain: model_1.Currency.ETH,
tokenId: [firstTokenId.toString(), secondTokenId.toString()],
url: ['https://www.seznam.cz', 'https://www.seznam.cz'],
fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29',
contractAddress: '0x17683adfe031d13caca13fc234f222fa3837d4aa',
authorAddresses: [['0x6c4A48886b77D1197eCFBDaA3D3f35d81d584342', '0x811dfbff13adfbc3cf653dcc373c03616d3471c9'], ['0x6c4A48886b77D1197eCFBDaA3D3f35d81d584342', '0x811dfbff13adfbc3cf653dcc373c03616d3471c9']],
cashbackValues: [['0.25', '0.25'], ['0.25', '0.25']]
});
console.log(mintedTokens);
expect(mintedTokens).not.toBeNull();
});
it('should test eth 721 mint multiple transaction', async () => {
const firstTokenId = new Date().getTime();
const secondTokenId = firstTokenId + 1;
const mintedTokens = await nft_1.mintMultipleNFTWithUri(true, {
to: ['0x811dfbff13adfbc3cf653dcc373c03616d3471c9', '0x811dfbff13adfbc3cf653dcc373c03616d3471c9'],
chain: model_1.Currency.ETH,
tokenId: [firstTokenId.toString(), secondTokenId.toString()],
url: ['https://www.seznam.cz', 'https://www.seznam.cz'],
fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29',
contractAddress: '0xab12c6c926cc3c9547aad71d6082fa724152a442',
fee: {
gasLimit: '500000',
gasPrice: '100'
}
});
console.log(mintedTokens);
expect(mintedTokens).not.toBeNull();
});
it('should test eth 721 burn transaction', async () => {
const burnErc721Token = await nft_1.burnNFT(true, {
tokenId: '1615884747446',
chain: model_1.Currency.ETH,
fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29',
contractAddress: '0xab12c6c926cc3c9547aad71d6082fa724152a442',
fee: {
gasLimit: '5000000',
gasPrice: '1100'
},
});
expect(burnErc721Token).not.toBeNull();
});
it('should test eth 721 send transaction', async () => {
const sendErc721Token = await nft_1.transferNFT(true, {
to: '0x4b812a77b109A150C2Fc89eD133EaBC78bC9EC8f',
chain: model_1.Currency.ETH,
tokenId: '2',
fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29',
contractAddress: '0xE4966098662cF4c8e9BB63D643336b163cB9FFE1',
value: '1'
});
expect(sendErc721Token).not.toBeNull();
});
it('should test eth 721 send transaction', async () => {
const sendErc721Token = await nft_1.transferNFT(true, {
to: '0x811dfbff13adfbc3cf653dcc373c03616d3471c9',
chain: model_1.Currency.ETH,
tokenId: '1615884907854',
fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29',
contractAddress: '0xab12c6c926cc3c9547aad71d6082fa724152a442',
fee: {
gasLimit: '5000000',
gasPrice: '100'
},
value: '1'
});
expect(sendErc721Token).not.toBeNull();
});
});
describe('NFT BSC transactions', () => {
it('should test eth 721 deploy transaction', async () => {
const deployErc721Token = await nft_1.deployNFT(true, {
symbol: 'TatumToken',
chain: model_1.Currency.BSC,
fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29',
name: 'TatumToken',
fee: { gasLimit: '6000000', gasPrice: '100' }
});
expect(deployErc721Token).not.toBeNull();
console.log(deployErc721Token);
});
it('should test bep 721 mint multiple transaction with cashback', async () => {
const firstTokenId = new Date().getTime();
const secondTokenId = firstTokenId + 1;
const mintedTokens = await nft_1.mintMultipleNFTWithUri(true, {
to: ['0x811dfbff13adfbc3cf653dcc373c03616d3471c9', '0x811dfbff13adfbc3cf653dcc373c03616d3471c9'],
chain: model_1.Currency.BSC,
tokenId: [firstTokenId.toString(), secondTokenId.toString()],
url: ['https://www.seznam.cz', 'https://www.seznam.cz'],
fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29',
contractAddress: '0xf59d331098f721fd4f6d4651c27e32daae5c1fdd',
authorAddresses: [['0x6c4A48886b77D1197eCFBDaA3D3f35d81d584342', '0x811dfbff13adfbc3cf653dcc373c03616d3471c9'], ['0x6c4A48886b77D1197eCFBDaA3D3f35d81d584342', '0x811dfbff13adfbc3cf653dcc373c03616d3471c9']],
cashbackValues: [['0.25', '0.25'], ['0.25', '0.25']],
fee: { gasLimit: '6000000', gasPrice: '100' }
});
console.log(mintedTokens);
expect(mintedTokens).not.toBeNull();
});
it('should test bep 721 mint transaction', async () => {
try {
const mintedToken = await nft_1.mintNFTWithUri(true, {
to: '0x4b812a77b109A150C2Fc89eD133EaBC78bC9EC8f',
chain: model_1.Currency.BSC,
tokenId: '1',
url: 'test.com',
fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29',
contractAddress: '0xdf82c2f74aa7b629bda65b1cfd258248c9c2b7d3',
authorAddresses: ['0x6c4A48886b77D1197eCFBDaA3D3f35d81d584342'],
cashbackValues: ['0.25']
});
console.log('mintedToken', mintedToken);
expect(mintedToken).not.toBeNull();
}
catch (e) {
console.log(e);
}
});
it('should test valid mint 721 transaction on IPFS', async () => {
const body = {
to: '0x811dfbff13adfbc3cf653dcc373c03616d3471c9',
chain: model_1.Currency.BSC,
tokenId: `${Date.now()}`,
url: '',
fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29',
contractAddress: '0xC25f71fEaD66A160758265321e4c2Fb93b83BabF',
};
console.log(await nft_1.createNFT(true, body, fs_1.readFileSync('/Users/ssramko/Downloads/logo_tatum.png'), 'Tatum LOGO', 'description'));
});
it('should test BSC send transaction', async () => {
const sendErc721Token = await nft_1.transferNFT(true, {
to: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29',
chain: model_1.Currency.BSC,
tokenId: '1',
fromPrivateKey: '0x4874827a55d87f2309c55b835af509e3427aa4d52321eeb49a2b93b5c0f8edfb',
contractAddress: '0xdf82c2f74aa7b629bda65b1cfd258248c9c2b7d3',
value: '1'
});
console.log('response: ', sendErc721Token);
expect(sendErc721Token).not.toBeNull();
});
});
describe('NFT POLYGON transactions', () => {
it('should test MATIC 721 deploy transaction', async () => {
const deployErc721Token = await nft_1.deployNFT(true, {
symbol: 'TatumToken',
chain: model_1.Currency.MATIC,
fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29',
name: 'TatumToken',
fee: { gasLimit: '6000000', gasPrice: '5' }
}, 'https://rpc-mumbai.matic.today');
expect(deployErc721Token).not.toBeNull();
console.log(deployErc721Token);
});
it('should test MATIC 721 mint multiple transaction with cashback', async () => {
const firstTokenId = new Date().getTime();
const secondTokenId = firstTokenId + 1;
const mintedTokens = await nft_1.mintMultipleNFTWithUri(true, {
to: ['0x811dfbff13adfbc3cf653dcc373c03616d3471c9', '0x811dfbff13adfbc3cf653dcc373c03616d3471c9'],
chain: model_1.Currency.MATIC,
tokenId: [firstTokenId.toString(), secondTokenId.toString()],
url: ['https://www.seznam.cz', 'https://www.seznam.cz'],
fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29',
contractAddress: '0xf59d331098f721fd4f6d4651c27e32daae5c1fdd',
authorAddresses: [['0x6c4A48886b77D1197eCFBDaA3D3f35d81d584342', '0x811dfbff13adfbc3cf653dcc373c03616d3471c9'], ['0x6c4A48886b77D1197eCFBDaA3D3f35d81d584342', '0x811dfbff13adfbc3cf653dcc373c03616d3471c9']],
cashbackValues: [['0.25', '0.25'], ['0.25', '0.25']],
fee: { gasLimit: '6000000', gasPrice: '100' }
}, 'https://rpc-mumbai.matic.today');
console.log(mintedTokens);
expect(mintedTokens).not.toBeNull();
});
it('should test valid mint 721 transaction on IPFS', async () => {
const body = {
to: '0x811dfbff13adfbc3cf653dcc373c03616d3471c9',
chain: model_1.Currency.MATIC,
tokenId: `${Date.now()}`,
url: '',
fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29',
contractAddress: '0xdb778b39bd7a7c479b3bb1d70df6665fe73e7e1d',
};
console.log(await nft_1.createNFT(true, body, fs_1.readFileSync('/Users/ssramko/Downloads/logo_tatum.png'), 'Tatum LOGO', 'description', undefined, 'https://rpc-mumbai.matic.today'));
});
it('should obtain metadata from NFT on IPFS on MATIC', async () => {
const data = await nft_1.getNFTImage(model_1.Currency.MATIC, '0x6d8eae641416b8b79e0fb3a92b17448cfff02b11', '1629193549967');
expect(data.publicUrl).toBe('https://gateway.pinata.cloud/ipfs/Qmaiu5NAXe2gwH734hWhvyharurBjoxi8Kv37sGp1ZhRpf');
expect(data.originalUrl).toBe('ipfs://Qmaiu5NAXe2gwH734hWhvyharurBjoxi8Kv37sGp1ZhRpf');
});
it('should obtain metadata from NFT on IPFS on FLOW', async () => {
const data = await nft_1.getNFTImage(model_1.Currency.FLOW, '2d103773-50e2-4a37-ac3d-61bc6af8faee', '145', '0x10247089e55180c9');
expect(data.publicUrl).toBe('https://gateway.pinata.cloud/ipfs/Qmaiu5NAXe2gwH734hWhvyharurBjoxi8Kv37sGp1ZhRpf');
expect(data.originalUrl).toBe('ipfs://Qmaiu5NAXe2gwH734hWhvyharurBjoxi8Kv37sGp1ZhRpf');
});
it('should test MATIC 721 mint transaction', async () => {
try {
const mintedToken = await nft_1.mintNFTWithUri(true, {
to: '0x4b812a77b109A150C2Fc89eD133EaBC78bC9EC8f',
chain: model_1.Currency.MATIC,
tokenId: '1',
url: 'test.com',
fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29',
contractAddress: '0xdf82c2f74aa7b629bda65b1cfd258248c9c2b7d3',
authorAddresses: ['0x6c4A48886b77D1197eCFBDaA3D3f35d81d584342'],
cashbackValues: ['0.25']
}, 'https://rpc-mumbai.matic.today');
console.log('mintedToken', mintedToken);
expect(mintedToken).not.toBeNull();
}
catch (e) {
console.log(e);
}
});
it('should test MATIC send transaction', async () => {
const sendErc721Token = await nft_1.transferNFT(true, {
to: '0x4b812a77b109A150C2Fc89eD133EaBC78bC9EC8f',
chain: model_1.Currency.MATIC,
tokenId: '1',
fromPrivateKey: '0x4874827a55d87f2309c55b835af509e3427aa4d52321eeb49a2b93b5c0f8edfb',
contractAddress: '0xdf82c2f74aa7b629bda65b1cfd258248c9c2b7d3',
value: '1'
}, 'https://rpc-mumbai.matic.today');
console.log('response: ', sendErc721Token);
expect(sendErc721Token).not.toBeNull();
});
});
describe('NFT built in private key transactions', () => {
it('should test CELO send mint transaction with built in key', async () => {
const sendErc721Token = await transaction_1.sendCeloMintErc721Transaction(true, {
to: '0x4b812a77b109A150C2Fc89eD133EaBC78bC9EC8f',
chain: model_1.Currency.CELO,
url: 'https://url'
});
console.log('response: ', sendErc721Token);
expect(sendErc721Token).not.toBeNull();
});
it('should test CELO send mint transaction with key', async () => {
const sendErc721Token = await transaction_1.sendCeloMintErc721Transaction(true, {
to: '0x4b812a77b109A150C2Fc89eD133EaBC78bC9EC8f',
chain: model_1.Currency.CELO,
url: 'https://url',
fromPrivateKey: '0x4874827a55d87f2309c55b835af509e3427aa4d52321eeb49a2b93b5c0f8edfb',
tokenId: '1',
contractAddress: '0xdf82c2f74aa7b629bda65b1cfd258248c9c2b7d3',
feeCurrency: model_1.Currency.CELO,
});
console.log('response: ', sendErc721Token);
expect(sendErc721Token).not.toBeNull();
});
it('should test CELO send add minter transaction', async () => {
const sendErc721Token = await nft_1.sendAddNFTMinter(true, {
minter: '0x80d8bac9a6901698b3749fe336bbd1385c1f98f2',
chain: model_1.Currency.CELO,
fromPrivateKey: '0x4874827a55d87f2309c55b835af509e3427aa4d52321eeb49a2b93b5c0f8edfb',
contractAddress: '0xdf82c2f74aa7b629bda65b1cfd258248c9c2b7d3',
feeCurrency: model_1.Currency.CELO,
});
console.log('response: ', sendErc721Token);
expect(sendErc721Token).not.toBeNull();
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmZ0LnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbmZ0L25mdC5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsMkJBQWdDO0FBQ2hDLG9DQUE2STtBQUM3SSxnREFBNkQ7QUFDN0QsK0JBQXdJO0FBRXhJLFFBQVEsQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFO0lBQ3ZCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkIsUUFBUSxDQUFDLHVCQUF1QixFQUFFLEdBQUcsRUFBRTtRQUNuQyxFQUFFLENBQUMsMENBQTBDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDdEQsTUFBTSxJQUFJLEdBQUcsSUFBSSx3QkFBZ0IsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxjQUFjLEdBQUcsb0VBQW9FLENBQUM7WUFDM0YsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUM7WUFDcEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFDcEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxnQkFBUSxDQUFDLElBQUksQ0FBQztZQUNqQyxJQUFJLENBQUMsS0FBSyxHQUFHLGdCQUFRLENBQUMsSUFBSSxDQUFDO1lBQzNCLE1BQU0sSUFBSSxHQUFHLE1BQU0sZUFBUyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsMENBQTBDLENBQUMsQ0FBQztZQUNyRixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xCLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyw4REFBOEQsRUFBRSxLQUFLLElBQUksRUFBRTtZQUMxRSxNQUFNLFlBQVksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzFDLE1BQU0sYUFBYSxHQUFHLFlBQVksR0FBRyxDQUFDLENBQUM7WUFDdkMs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