Token Forge

 

Overview ERC-20

Price
$0.00 @ 0.000000 MATIC
Fully Diluted Market Cap
Total Supply:
42,000,001 Fge

Holders:
1,006 addresses
 
Balance
1 Fge

Value
$0.00
0xb95d435df3f8b2a8d8b9c2b7c8766c9ae6ed8cc9
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

OVERVIEW

A 100% decentralized token that distributes using Proof of Work, Proof of Auction, and Proof of Staking contracts.


Update? Click here to update the token ICO / general information
# Exchange Pair Price  24H Volume % Volume
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Forge

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 99999 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-12
*/

// Forge - Contract
//
// Distrubtion of Forge Token is as follows:
// 25% of Forge Token is Auctioned in the ForgeAuctions Contract which distributes tokens to users who use 0xBitcoin to buy tokens in fair price. Each auction lasts ~3 days. Using the Auctions contract
// +
// 25% of Forge Token is distributed as Liquidiy Pool rewards in the ForgeRewards Contract which distributes tokens to users who deposit the SpiritSwap Liquidity Pool tokens into the LPRewards contract.
// +
// 50% of Forge Token is distributed using Forge Contract(this Contract) which distributes tokens to users by using Proof of work. Computers solve a complicated problem to gain tokens!
//
// = 100% Of the Token is distributed to the users! No dev fee or premine!
//
// All distributions happen fairly using Bitcoins model of distribution using reward halvings and difficulty adjustments.  Distribution happens over 100 years!  
// 100%  on-chain, decentralized, trustless, ownerless contracts*!
//   The harder it is mined the less tokens that are awarded.
// Network: Polygon Chain 
// ChainID = 89
//
//
// Name: Forge
// Symbol: Fge
// Decimals: 18 
//
// Total supply: 42,000,001.000000000000000000
//   =
// 21,000,000 Mined over 100+ years using Bitcoins Distrubtion halvings every 4 years. Uses Proof-oF-Work to distribute the tokens. Public Miner is available.  Uses this contract.
//   +
// 10,500,000 Auctioned over 100+ years into 4 day auctions split fairly among all buyers. ALL 0xBitcoin proceeds go into THIS contract which it fairly distributes to miners.  Uses the ForgeAuctions contract
//   +
// 10,500,000 tokens goes to Liquidity Providers of the token over 100+ year using Bitcoins distribution!  Helps prevent LP losses!  Uses the ForgeRewards Contract
//
//  =
//
// 42,000,001 Tokens is the max Supply
//      
// 66% of the 0xBitcoin Token from this contract goes to the Miner to pay for the transaction cost and if the token grows enough earn 0xBitcoin per mint!!
// 33% of the 0xBitcoin TOken from this contract goes to the Liquidity Providers via ForgeRewards Contract.  Helps prevent Impermant Loss! Larger Liquidity!
//
// No premine, dev cut, or advantage taken at launch. Public miner available at launch.  100% of the token is given away fairly over 100+ years using Bitcoins model!
//
// Send this contract any ERC20 token and it will become instantly mineable and able to distribute using proof-of-work for 1 year!!!!
//
//Viva la Mineables!!! Send this contract any ERC20 complient token (Wrapped NFTs incoming!) and we will fairly to miners and Holders(
//  Each Mint prints (1/10000) of any ERC20.
//pThirdDifficulty allows for the difficulty to be cut in a third.  So difficulty 10,000 becomes 3,333.  Costs 333 Fantom  Makes mining 3x easier
//* 1 tokens in LP are burned to create the LP pool.
//
// Credits: 0xBitcoin, Vether, Synethix
//* Except for Staking Rewards additional cryptocurrencies


pragma solidity ^0.8.11;

contract Ownable {
    address public owner;

    event TransferOwnership(address _from, address _to);

    constructor() public {
        owner = msg.sender;
        emit TransferOwnership(address(0), msg.sender);
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "only owner");
        _;
    }

    function setOwner(address _owner) internal onlyOwner {
        emit TransferOwnership(owner, _owner);
        owner = _owner;
    }
}




library IsContract {
    function isContract(address _addr) internal view returns (bool) {
        bytes32 codehash;
        /* solium-disable-next-line */
        assembly { codehash := extcodehash(_addr) }
        return codehash != bytes32(0) && codehash != bytes32(0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470);
    }
}

// File: contracts/utils/SafeMath.sol

library SafeMath2 {
    function add(uint256 x, uint256 y) internal pure returns (uint256) {
        uint256 z = x + y;
        require(z >= x, "Add overflow");
        return z;
    }

    function sub(uint256 x, uint256 y) internal pure returns (uint256) {
        require(x >= y, "Sub underflow");
        return x - y;
    }

    function mult(uint256 x, uint256 y) internal pure returns (uint256) {
        if (x == 0) {
            return 0;
        }

        uint256 z = x * y;
        require(z / x == y, "Mult overflow");
        return z;
    }

    function div(uint256 x, uint256 y) internal pure returns (uint256) {
        require(y != 0, "Div by zero");
        return x / y;
    }

    function divRound(uint256 x, uint256 y) internal pure returns (uint256) {
        require(y != 0, "Div by zero");
        uint256 r = x / y;
        if (x % y != 0) {
            r = r + 1;
        }

        return r;
    }
}

// File: contracts/utils/Math.sol

library ExtendedMath2 {


    //return the smaller of the two inputs (a or b)
    function limitLessThan(uint a, uint b) internal pure returns (uint c) {

        if(a > b) return b;

        return a;

    }
}

// File: contracts/interfaces/IERC20.sol

interface IERC20 {
	function totalSupply() external view returns (uint256);
    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
    function transfer(address _to, uint _value) external returns (bool success);
    function transferFrom(address _from, address _to, uint256 _value) external returns (bool success);
    function allowance(address _owner, address _spender) external view returns (uint256 remaining);
    function approve(address _spender, uint256 _value) external returns (bool success);
    function balanceOf(address _owner) external view returns (uint256 balance);
    
}


// File: contracts/commons/AddressMinHeap.sol



abstract contract ApproveAndCallFallBack {
    function receiveApproval(address from, uint256 tokens, address token, bytes memory data) virtual public;
}


//Main contract

contract Forge is Ownable, IERC20, ApproveAndCallFallBack {
	uint constant public targetTime = 60 * 48;
    uint public multipler = 0;
// SUPPORTING CONTRACTS
    address public AddressAuction;
    address public AddressLPReward;
    address public AddressZeroXBTC;
//Events
    using SafeMath2 for uint256;
    using ExtendedMath2 for uint;
    event Mint(address indexed from, uint reward_amount, uint epochCount, bytes32 newChallengeNumber);
    event MegaMint(address indexed from, uint epochCount, bytes32 newChallengeNumber, uint NumberOfTokensMinted, uint256 TokenMultipler);

// Managment events
    uint256 override public totalSupply = 42000001000000000000000000;
    bytes32 private constant BALANCE_KEY = keccak256("balance");

    //BITCOIN INITALIZE Start
	
    uint _totalSupply = 21000000000000000000000000;
    uint public latestDifficultyPeriodStarted2 = block.timestamp;
    uint public epochCount = 0;//number of 'blocks' mined

    uint public _BLOCKS_PER_READJUSTMENT = 256;

    //a little number
    uint public  _MINIMUM_TARGET = 2**16;
    
    uint public  _MAXIMUM_TARGET = 2**234;
    uint public miningTarget = _MAXIMUM_TARGET.div(200000000000*25);  //1000 million difficulty to start until i enable mining
    
    bytes32 public challengeNumber = blockhash(block.number - 1);   //generate a new one when a new reward is minted
    uint public rewardEra = 0;
    uint public maxSupplyForEra = (_totalSupply - _totalSupply.div( 2**(rewardEra + 1)));
    uint public reward_amount = 0;
    
    //Stuff for Functions
    uint oldecount = 0;
    uint public previousBlockTime  =  block.timestamp;
    uint oneEthUnit =    1000000000000000000;
    uint one8unit   =              100000000;
    uint public Token2Per=           1000000;
    uint Token2Min=                       88;
    uint public tokensMinted;
    mapping(address => uint) balances;
    mapping(address => mapping(address => uint)) allowed;
    uint give0xBTC = 0;
    uint give = 1;
    // metadata
    string public name = "Forge";
    string public constant symbol = "Fge";
    uint8 public constant decimals = 18;

    uint256 lastrun = block.timestamp;
    uint public latestDifficultyPeriodStarted = block.number;
    bool initeds = false;
    
    // mint 1 token to setup LPs
	    constructor() public {
    balances[msg.sender] = 1000000000000000000;
    emit Transfer(address(0), msg.sender, 1000000000000000000);
	}

    function zinit(address AuctionAddress2, address LPGuild2, address _ZeroXBTCAddress) public onlyOwner{
        uint x = 21000000000000000000000000; 
        // Only init once
        assert(!initeds);
        initeds = true;
	    previousBlockTime = block.timestamp;
	    reward_amount = (100 * 10**uint(decimals) ).div( 2**rewardEra );
    	rewardEra = 0;
	    tokensMinted = 0;
	    epochCount = 0;
    	miningTarget = _MAXIMUM_TARGET.div(1); //5000000 = 31gh/s @ 7 min for FPGA mining
        latestDifficultyPeriodStarted2 = block.timestamp;
    	_startNewMiningEpoch();
        // Init contract variables and mint
        balances[AuctionAddress2] = x/2;
	
        emit Transfer(address(0), AuctionAddress2, x/2);
	
    	AddressAuction = AuctionAddress2;
        AddressLPReward = payable(LPGuild2);
        AddressZeroXBTC = _ZeroXBTCAddress;
	
        oldecount = epochCount;
	
		setOwner(address(0));
     
    }



	///
	// Managment
	///

	function ARewardSender() public {
		//runs every _BLOCKS_PER_READJUSTMENT / 4

		uint256 runs = block.timestamp - lastrun;

		uint256 epochsPast = epochCount - oldecount; //actually epoch
		uint256 runsperepoch = runs / epochsPast;

		reward_amount = (100 * 10**uint(decimals)).div( 2**rewardEra );
		uint256 x = (runsperepoch * 888).divRound(targetTime);
		uint256 ratio = x * 100 / 888;
		uint256 totalOwed;
		
		 if(ratio < 200){
			totalOwed = (61001200 * (x ** 2 )).div(888**2) + (40861500 * x).div(888) ;
		 }else {
			totalOwed = (340000000);
		} 

		if(IERC20(AddressZeroXBTC).balanceOf(address(this)) > (30 * 2 * (Token2Per * _BLOCKS_PER_READJUSTMENT)/4)){  // at least enough blocks to rerun this function for both LPRewards and Users
			IERC20(AddressZeroXBTC).transfer(AddressLPReward, ((epochsPast) * totalOwed * Token2Per * give0xBTC).div(2 * 100000000));
			give0xBTC = 1 * give;
		}else{
			give0xBTC = 0;
		}
		oldecount = epochCount; //actually epoch

		lastrun = block.timestamp;
	}


	//comability function
	function mint(uint256 nonce, bytes32 challenge_digest) public returns (bool success) {
		mintTo(nonce, challenge_digest, msg.sender);
	}


	function mintTo(uint256 nonce, bytes32 challenge_digest,  address mintTo) public returns (uint256 owed) {

		bytes32 digest =  keccak256(abi.encodePacked(challengeNumber, msg.sender, nonce));

		//the challenge digest must match the expected
		require(digest == challenge_digest, "Old challenge_digest or wrong challenge_digest");

		//the digest must be smaller than the target
		require(uint256(digest) < miningTarget, "Digest must be smaller than miningTarget");
		_startNewMiningEpoch();

		require(block.timestamp > previousBlockTime, "No same second solves");

		//uint diff = block.timestamp - previousBlockTime;
		uint256 x = ((block.timestamp - previousBlockTime) * 888) / targetTime;
		uint ratio = x * 100 / 888;
		uint totalOwed = 0;
		if(ratio < 314){
			totalOwed = (61001200 * (x ** 2 )).div(888 ** 2)+ (40861500 * x).div(888);
		}else {
			totalOwed = (x * 100000000).div(888) + (350000000);
		} 


		balances[mintTo] = balances[mintTo].add((reward_amount * totalOwed).div(100000000));
		balances[AddressLPReward] = balances[AddressLPReward].add((reward_amount * totalOwed).div(100000000 * 2));
				
		tokensMinted = tokensMinted.add((reward_amount * totalOwed).div(100000000));
		previousBlockTime = block.timestamp;

		if(give0xBTC > 0){
			if(ratio < 200){
				IERC20(AddressZeroXBTC).transfer(mintTo, (totalOwed * Token2Per * give0xBTC).div(100000000));
			}else{
				IERC20(AddressZeroXBTC).transfer(mintTo, (34 * Token2Per * give0xBTC).div(10));
			}
		}

		emit Mint(msg.sender, (reward_amount * totalOwed).div(100000000), epochCount, challengeNumber );

		return totalOwed;

	}


	function mintTokensArrayTo(uint256 nonce, bytes32 challenge_digest, address[] memory ExtraFunds, address[] memory MintTo) public returns (uint256 owed) {
		uint256 totalOd = mintTo(nonce,challenge_digest, MintTo[0]);
		require(totalOd > 0, "mint issue");

		require(MintTo.length == ExtraFunds.length + 1,"MintTo has to have an extra address compared to ExtraFunds");
		uint xy=0;
		for(xy = 0; xy< ExtraFunds.length; xy++)
		{
			if(epochCount % (2**(xy+1)) != 0){
				break;
			}
			require(ExtraFunds[xy] != address(this) && ExtraFunds[xy] != AddressZeroXBTC, "No base printing of tokens");
			for(uint y=xy+1; y< ExtraFunds.length; y++){
				require(ExtraFunds[y] != ExtraFunds[xy], "No printing The same tokens");
			}
		}
		
		uint256 totalOwed = 0;
		uint256 TotalOwned = 0;
		for(uint x=0; x<xy; x++)
		{
			//epoch count must evenly dividable by 2^n in order to get extra mints. 
			//ex. epoch 2 = 1 extramint, epoch 4 = 2 extra, epoch 8 = 3 extra mints, epoch 16 = 4 extra mints w/ a divRound for the 4th mint(allows small balance token minting aka NFTs)
			if(epochCount % (2**(x+1)) == 0){
				TotalOwned = IERC20(ExtraFunds[x]).balanceOf(address(this));
				if(TotalOwned != 0){
					if( x % 3 == 0 && x != 0){
						totalOwed = (TotalOwned * totalOd).divRound(100000000 * 2500);
					}else{
						totalOwed = (TotalOwned * totalOd).div(100000000 * 2500 );
					}
				}
			    IERC20(ExtraFunds[x]).transfer(MintTo[x+1], totalOwed);
			}
        }
        	
		emit MegaMint(msg.sender, epochCount, challengeNumber, xy, totalOd );

		return totalOd;

    }


	function mintTokensSameAddress(uint256 nonce, bytes32 challenge_digest, address[] memory ExtraFunds, address MintTo) public returns (bool success) {
		address[] memory dd = new address[](ExtraFunds.length + 1); 

		for(uint x=0; x< (ExtraFunds.length + 1); x++)
		{
			dd[x] = MintTo;
		}
		
		mintTokensArrayTo(nonce, challenge_digest, ExtraFunds, dd);

		return true;
	}


	function empty_mintTo(uint256 nonce, bytes32 challenge_digest, address[] memory ExtraFunds, address[] memory MintTo) public returns (uint256 owed) {
		bytes32 digest =  keccak256(abi.encodePacked(challengeNumber, msg.sender, nonce));

		//the challenge digest must match the expected
		require(digest == challenge_digest, "Old challenge_digest or wrong challenge_digest");

		//the digest must be smaller than the target
		require(uint256(digest) < miningTarget, "Digest must be smaller than miningTarget");
		_startNewMiningEpoch();

		require(block.timestamp > previousBlockTime, "No same second solves");
		require(MintTo.length == ExtraFunds.length,"MintTo has to have same number of addressses as ExtraFunds");
		uint xy=0;
		for(xy = 0; xy< ExtraFunds.length; xy++)
		{
			if(epochCount % (2**(xy+1)) != 0){
				break;
			}
			require(ExtraFunds[xy] != address(this) && ExtraFunds[xy] != AddressZeroXBTC, "No base printing of tokens");
			for(uint y=xy+1; y< ExtraFunds.length; y++){
				require(ExtraFunds[y] != ExtraFunds[xy], "No printing The same tokens");
			}
		}

		uint256 x = ((block.timestamp - previousBlockTime) * 888) / targetTime;
		uint ratio = x * 100 / 888;
		uint totalIN = 0;
		if(ratio < 314){
			totalIN = (61001200 * (x ** 2 )).div(888 ** 2)+ (40861500 * x).div(888);
		}else {
			totalIN = (x * 100000000).div(888) + (350000000);
		} 
		require(totalIN > 0, "mint issue");
		uint256 totalOwed;
		uint256 TotalOwned;
		for(uint x=0; x<xy; x++)
		{
			//epoch count must evenly dividable by 2^n in order to get extra mints. 
			//ex. epoch 2 = 1 extramint, epoch 4 = 2 extra, epoch 8 = 3 extra mints, epoch 16 = 4 extra mints w/ a divRound for the 4th mint(allows small balance token minting aka NFTs)
			if(epochCount % (2**(x+1)) == 0){
				TotalOwned = IERC20(ExtraFunds[x]).balanceOf(address(this));
				if(TotalOwned != 0){
					if( x % 3 == 0 && x != 0){
						totalOwed = (TotalOwned * totalIN).divRound(100000000 * 2500);
					}else{
						totalOwed = (TotalOwned * totalIN).div(100000000 * 2500 );
				    }
			    IERC20(ExtraFunds[x]).transfer(MintTo[x], totalOwed);
			    }
            }
        }

		previousBlockTime = block.timestamp;
		return totalIN;   
	}



	function _startNewMiningEpoch() internal {


		//if max supply for the era will be exceeded next reward round then enter the new era before that happens
		//59 is the final reward era, almost all tokens minted
		if( tokensMinted.add(reward_amount) > maxSupplyForEra && rewardEra < 60)
		{
			rewardEra = rewardEra + 1;
			maxSupplyForEra = _totalSupply - _totalSupply.div( 2**(rewardEra + 1));
		}

		//set the next minted supply at which the era will change
		// total supply of MINED tokens is 21000000000000000000000000  because of 16 decimal places

		epochCount = epochCount.add(1);

		//every so often, readjust difficulty. Dont readjust when deploying
		if((epochCount) % (_BLOCKS_PER_READJUSTMENT / 4) == 0)
		{
			ARewardSender();
			maxSupplyForEra = _totalSupply - _totalSupply.div( 2**(rewardEra + 1));

			if((epochCount % _BLOCKS_PER_READJUSTMENT== 0))
			{
				multipler = (IERC20(AddressZeroXBTC).balanceOf(address(this)) / (2000 * 10 ** 8));
				if(( IERC20(AddressZeroXBTC).balanceOf(address(this)) / Token2Per) <= (10000 + 10000*(multipler))) //chosen to give keep 250 days payouts in reserve at current payout
				{
					if(Token2Per.div(2) > Token2Min)
					{
						Token2Per = Token2Per.div(2);
					}
				}else{
					Token2Per = Token2Per.mult(3);
				}
				_reAdjustDifficulty();
			}
		}

		challengeNumber = blockhash(block.number - 1);
	}


	function _reAdjustDifficulty() internal {
		uint256 blktimestamp = block.timestamp;
		uint TimeSinceLastDifficultyPeriod2 = blktimestamp - latestDifficultyPeriodStarted2;

		uint adjusDiffTargetTime = targetTime *  _BLOCKS_PER_READJUSTMENT; //36 min per block 60 sec * 12

		//if there were less eth blocks passed in time than expected
		if( TimeSinceLastDifficultyPeriod2 < adjusDiffTargetTime )
		{
			uint excess_block_pct = (adjusDiffTargetTime.mult(100)).div( TimeSinceLastDifficultyPeriod2 );
			give = 1;
			uint excess_block_pct_extra = excess_block_pct.sub(100).limitLessThan(1000);
			//make it harder 
			miningTarget = miningTarget.sub(miningTarget.div(2000).mult(excess_block_pct_extra));   //by up to 50 %
		}else{
			uint shortage_block_pct = (TimeSinceLastDifficultyPeriod2.mult(100)).div( adjusDiffTargetTime );
			give = 2;
			uint shortage_block_pct_extra = shortage_block_pct.sub(100).limitLessThan(1000); //always between 0 and 1000
			//make it easier
			miningTarget = miningTarget.add(miningTarget.div(500).mult(shortage_block_pct_extra));   //by up to 200 %
		}

		latestDifficultyPeriodStarted2 = blktimestamp;
		latestDifficultyPeriodStarted = block.number;
		if(miningTarget < _MINIMUM_TARGET) //very difficult
		{
			miningTarget = _MINIMUM_TARGET;
		}
		if(miningTarget > _MAXIMUM_TARGET) //very easy
		{
			miningTarget = _MAXIMUM_TARGET;
		}
		
	}


		//42 m coins total
		// = 
		//21 million proof of work
		// + 
		//10.5 million proof of burn
		// +
		//10.5 million rewards for Liquidity Providers


	//help debug mining software
	function checkMintSolution(uint256 nonce, bytes32 challenge_digest, bytes32 challenge_number, uint testTarget) public view returns (bool success) {
		bytes32 digest = bytes32(keccak256(abi.encodePacked(challenge_number,msg.sender,nonce)));
		if(uint256(digest) > testTarget) revert();

		return (digest == challenge_digest);
	}


	//this is a recent ethereum block hash, used to prevent pre-mining future blocks
	function getChallengeNumber() public view returns (bytes32) {

		return challengeNumber;

	}


	//the number of zeroes the digest of the PoW solution requires.  Auto adjusts
	function getMiningDifficulty() public view returns (uint) {

		return _MAXIMUM_TARGET.div(miningTarget);
	}


	function getMiningTarget() public view returns (uint) {

		return miningTarget;

	}


	function getMiningMinted() public view returns (uint) {

		return tokensMinted;

	}


	//21m coins total
	//reward begins at 150 and is cut in half every reward era (as tokens are mined)
	function getMiningReward() public view returns (uint) {
		//once we get half way thru the coins, only get 25 per block
		//every reward era, the reward amount halves.

		return (100 * 10**uint(decimals) ).div( 2**rewardEra ) ;

		}


	function getEpoch() public view returns (uint) {

		return epochCount ;

	}


	//help debug mining software
	function getMintDigest(uint256 nonce, bytes32 challenge_digest, bytes32 challenge_number) public view returns (bytes32 digesttest) {

		bytes32 digest =  keccak256(abi.encodePacked(challengeNumber, msg.sender, nonce));

		return digest;

	}


		// ------------------------------------------------------------------------

		// Get the token balance for account `tokenOwner`

		// ------------------------------------------------------------------------

	function balanceOf(address tokenOwner) public override view returns (uint balance) {

		return balances[tokenOwner];

	}


		// ------------------------------------------------------------------------

		// Transfer the balance from token owner's account to `to` account

		// - Owner's account must have sufficient balance to transfer

		// - 0 value transfers are allowed

		// ------------------------------------------------------------------------


	function transfer(address to, uint tokens) public override returns (bool success) {

		balances[msg.sender] = balances[msg.sender].sub(tokens);
		balances[to] = balances[to].add(tokens);

		emit Transfer(msg.sender, to, tokens);

		return true;

	}


		// ------------------------------------------------------------------------

		// Token owner can approve for `spender` to transferFrom(...) `tokens`

		// from the token owner's account

		//

		// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md

		// recommends that there are no checks for the approval double-spend attack

		// as this should be implemented in user interfaces

		// ------------------------------------------------------------------------


	function approve(address spender, uint tokens) public override returns (bool success) {

		allowed[msg.sender][spender] = tokens;

		emit Approval(msg.sender, spender, tokens);

		return true;

	}


		// ------------------------------------------------------------------------

		// Transfer `tokens` from the `from` account to the `to` account

		//

		// The calling account must already have sufficient tokens approve(...)-d

		// for spending from the `from` account and

		// - From account must have sufficient balance to transfer

		// - Spender must have sufficient allowance to transfer

		// - 0 value transfers are allowed

		// ------------------------------------------------------------------------


	function transferFrom(address from, address to, uint tokens) public override returns (bool success) {

		balances[from] = balances[from].sub(tokens);
		allowed[from][msg.sender] = allowed[from][msg.sender].sub(tokens);
		balances[to] = balances[to].add(tokens);

		emit Transfer(from, to, tokens);

		return true;

	}


		// ------------------------------------------------------------------------

		// Returns the amount of tokens approved by the owner that can be

		// transferred to the spender's account

		// ------------------------------------------------------------------------


	function allowance(address tokenOwner, address spender) public override view returns (uint remaining) {

		return allowed[tokenOwner][spender];

	}


		// ------------------------------------------------------------------------

		// Token owner can approve for `spender` to transferFrom(...) `tokens`

		// from the token owner's account. The `spender` contract function

		// `receiveApproval(...)` is then executed

		// ------------------------------------------------------------------------


	function receiveApproval(address from, uint256 tokens, address token, bytes memory data) public override{

		require(token == address(this));
		IERC20(address(this)).transfer(from, tokens);  
	}


	  //Do not allow ETH to enter
	receive() external payable {

		revert();
	}


	fallback() external payable {

		revert();
	}
}

/*
*
* MIT License
* ===========
*
* Copyright (c) 2022 Forge
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.   
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
*/

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"epochCount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"newChallengeNumber","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"NumberOfTokensMinted","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"TokenMultipler","type":"uint256"}],"name":"MegaMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"epochCount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"newChallengeNumber","type":"bytes32"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"address","name":"_to","type":"address"}],"name":"TransferOwnership","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"ARewardSender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"AddressAuction","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"AddressLPReward","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"AddressZeroXBTC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Token2Per","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_BLOCKS_PER_READJUSTMENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_MAXIMUM_TARGET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_MINIMUM_TARGET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"remaining","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"challengeNumber","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"},{"internalType":"bytes32","name":"challenge_number","type":"bytes32"},{"internalType":"uint256","name":"testTarget","type":"uint256"}],"name":"checkMintSolution","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"},{"internalType":"address[]","name":"ExtraFunds","type":"address[]"},{"internalType":"address[]","name":"MintTo","type":"address[]"}],"name":"empty_mintTo","outputs":[{"internalType":"uint256","name":"owed","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"epochCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChallengeNumber","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMiningDifficulty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMiningMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMiningReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMiningTarget","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"},{"internalType":"bytes32","name":"challenge_number","type":"bytes32"}],"name":"getMintDigest","outputs":[{"internalType":"bytes32","name":"digesttest","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestDifficultyPeriodStarted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestDifficultyPeriodStarted2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupplyForEra","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"miningTarget","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"}],"name":"mint","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"},{"internalType":"address","name":"mintTo","type":"address"}],"name":"mintTo","outputs":[{"internalType":"uint256","name":"owed","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"},{"internalType":"address[]","name":"ExtraFunds","type":"address[]"},{"internalType":"address[]","name":"MintTo","type":"address[]"}],"name":"mintTokensArrayTo","outputs":[{"internalType":"uint256","name":"owed","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"},{"internalType":"address[]","name":"ExtraFunds","type":"address[]"},{"internalType":"address","name":"MintTo","type":"address"}],"name":"mintTokensSameAddress","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"multipler","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"previousBlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokens","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"receiveApproval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardEra","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reward_amount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"targetTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"AuctionAddress2","type":"address"},{"internalType":"address","name":"LPGuild2","type":"address"},{"internalType":"address","name":"_ZeroXBTCAddress","type":"address"}],"name":"zinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260006001556a22bdd89dce55b0116400006005556a115eec47f6cf7e3500000060065542600755600060085561010060095562010000600a55600160ea1b600b556200006765048c27395000600b54620001f560201b620026fc1790919060201c565b600c556200007760014362000308565b40600d556000600e55620000b9600e54600162000095919062000322565b620000a29060026200043a565b600654620001f560201b620026fc1790919060201c565b600654620000c8919062000308565b600f5560006010819055601181905542601255670de0b6b3a76400006013556305f5e100601455620f42406015556058601655601a556001601b5560408051808201909152600580825264466f72676560d81b60209092019182526200013191601c916200024c565b5042601d5543601e55601f805460ff191690553480156200015157600080fd5b50600080546001600160a01b0319163390811782556040805192835260208301919091527f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c910160405180910390a1336000818152601860209081526040808320670de0b6b3a76400009081905590519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3620004a8565b600081620002375760405162461bcd60e51b815260206004820152600b60248201526a446976206279207a65726f60a81b604482015260640160405180910390fd5b62000243828462000448565b90505b92915050565b8280546200025a906200046b565b90600052602060002090601f0160209004810192826200027e5760008555620002c9565b82601f106200029957805160ff1916838001178555620002c9565b82800160010185558215620002c9579182015b82811115620002c9578251825591602001919060010190620002ac565b50620002d7929150620002db565b5090565b5b80821115620002d75760008155600101620002dc565b634e487b7160e01b600052601160045260246000fd5b6000828210156200031d576200031d620002f2565b500390565b60008219821115620003385762000338620002f2565b500190565b600181815b808511156200037e578160001904821115620003625762000362620002f2565b808516156200037057918102915b93841c939080029062000342565b509250929050565b600082620003975750600162000246565b81620003a65750600062000246565b8160018114620003bf5760028114620003ca57620003ea565b600191505062000246565b60ff841115620003de57620003de620002f2565b50506001821b62000246565b5060208310610133831016604e8410600b84101617156200040f575081810a62000246565b6200041b83836200033d565b8060001904821115620004325762000432620002f2565b029392505050565b600062000243838362000386565b6000826200046657634e487b7160e01b600052601260045260246000fd5b500490565b600181811c908216806200048057607f821691505b60208210811415620004a257634e487b7160e01b600052602260045260246000fd5b50919050565b61370a80620004b86000396000f3fe6080604052600436106102f65760003560e01c806381269a561161018f578063a68eb88e116100e1578063d0856d161161008a578063ddfbd8dd11610064578063ddfbd8dd146108b9578063e932012b146108d9578063f7a5f155146108ef57600080fd5b8063d0856d161461083b578063dc6e9cf914610850578063dd62ed3e1461086657600080fd5b8063c0abebe0116100bb578063c0abebe0146107f0578063c8a1465c14610805578063cb9ae7071461082557600080fd5b8063a68eb88e146107a4578063a9059cbb146107ba578063b5ade81b146107da57600080fd5b80638da5cb5b1161014357806395d89b411161011d57806395d89b41146106ce57806397566aa01461071757806399f584b31461078e57600080fd5b80638da5cb5b146106545780638f4ffcb11461068157806394b939ef146106a157600080fd5b806387a2a9d61161017457806387a2a9d6146106125780638a769d35146106285780638ae0368b1461063e57600080fd5b806381269a56146105dc578063829965cc146105fc57600080fd5b8063313ce567116102485780634fa972e1116101fc5780636de9f32b116101d65780636de9f32b1461056e57806370a0823114610584578063757991a8146105c757600080fd5b80634fa972e114610509578063510de0941461051f57806364e467261461054c57600080fd5b806345d8a2321161022d57806345d8a232146104c9578063490203a7146104df5780634ef37628146104f457600080fd5b8063313ce5671461048d57806332e99708146104b457600080fd5b806318160ddd116102aa57806323b872dd1161028457806323b872dd146104055780632d38bf7a146104255780632f104e0c1461043b57600080fd5b806318160ddd146103b95780631fccb33c146103cf5780632381a60e146103ef57600080fd5b806310294317116102db578063102943171461036057806317da485f146103845780631801fbe51461039957600080fd5b806306fdde0314610305578063095ea7b31461033057600080fd5b3661030057600080fd5b600080fd5b34801561031157600080fd5b5061031a61090f565b6040516103279190612e87565b60405180910390f35b34801561033c57600080fd5b5061035061034b366004612f23565b61099d565b6040519015158152602001610327565b34801561036c57600080fd5b5061037660125481565b604051908152602001610327565b34801561039057600080fd5b50610376610a17565b3480156103a557600080fd5b506103506103b4366004612f4d565b610a35565b3480156103c557600080fd5b5061037660055481565b3480156103db57600080fd5b506103506103ea366004613074565b610a49565b3480156103fb57600080fd5b5061037660105481565b34801561041157600080fd5b506103506104203660046130d5565b610b19565b34801561043157600080fd5b50610376600e5481565b34801561044757600080fd5b506003546104689073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610327565b34801561049957600080fd5b506104a2601281565b60405160ff9091168152602001610327565b3480156104c057600080fd5b50600c54610376565b3480156104d557600080fd5b50610376610b4081565b3480156104eb57600080fd5b50610376610c4b565b34801561050057600080fd5b50600d54610376565b34801561051557600080fd5b50610376600f5481565b34801561052b57600080fd5b506004546104689073ffffffffffffffffffffffffffffffffffffffff1681565b34801561055857600080fd5b5061056c610567366004613111565b610c7c565b005b34801561057a57600080fd5b5061037660175481565b34801561059057600080fd5b5061037661059f366004613154565b73ffffffffffffffffffffffffffffffffffffffff1660009081526018602052604090205490565b3480156105d357600080fd5b50600854610376565b3480156105e857600080fd5b506103506105f736600461316f565b610e7c565b34801561060857600080fd5b5061037660085481565b34801561061e57600080fd5b50610376600b5481565b34801561063457600080fd5b50610376600c5481565b34801561064a57600080fd5b50610376600d5481565b34801561066057600080fd5b506000546104689073ffffffffffffffffffffffffffffffffffffffff1681565b34801561068d57600080fd5b5061056c61069c3660046131a1565b610eec565b3480156106ad57600080fd5b506002546104689073ffffffffffffffffffffffffffffffffffffffff1681565b3480156106da57600080fd5b5061031a6040518060400160405280600381526020017f466765000000000000000000000000000000000000000000000000000000000081525081565b34801561072357600080fd5b5061037661073236600461327f565b5050600d54604080516020808201939093523360601b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001681830152605480820194909452815180820390940184526074019052815191012090565b34801561079a57600080fd5b5061037660015481565b3480156107b057600080fd5b5061037660155481565b3480156107c657600080fd5b506103506107d5366004612f23565b610fac565b3480156107e657600080fd5b5061037660095481565b3480156107fc57600080fd5b50601754610376565b34801561081157600080fd5b506103766108203660046132ab565b61105d565b34801561083157600080fd5b50610376601e5481565b34801561084757600080fd5b5061056c61165d565b34801561085c57600080fd5b50610376600a5481565b34801561087257600080fd5b50610376610881366004613322565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260196020908152604080832093909416825291909152205490565b3480156108c557600080fd5b506103766108d4366004613355565b611908565b3480156108e557600080fd5b5061037660075481565b3480156108fb57600080fd5b5061037661090a3660046132ab565b611eeb565b601c805461091c90613381565b80601f016020809104026020016040519081016040528092919081815260200182805461094890613381565b80156109955780601f1061096a57610100808354040283529160200191610995565b820191906000526020600020905b81548152906001019060200180831161097857829003601f168201915b505050505081565b33600081815260196020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610a059086815260200190565b60405180910390a35060015b92915050565b6000610a30600c54600b546126fc90919063ffffffff16565b905090565b6000610a42838333611908565b5092915050565b60008083516001610a5a9190613404565b67ffffffffffffffff811115610a7257610a72612f6f565b604051908082528060200260200182016040528015610a9b578160200160208202803683370190505b50905060005b8451610aae906001613404565b811015610aff5783828281518110610ac857610ac861341c565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015280610af78161344b565b915050610aa1565b50610b0c8686868461105d565b5060019695505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260186020526040812054610b499083612776565b73ffffffffffffffffffffffffffffffffffffffff85166000908152601860209081526040808320939093556019815282822033835290522054610b8d9083612776565b73ffffffffffffffffffffffffffffffffffffffff8086166000908152601960209081526040808320338452825280832094909455918616815260189091522054610bd890836127ec565b73ffffffffffffffffffffffffffffffffffffffff80851660008181526018602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610c399086815260200190565b60405180910390a35060019392505050565b6000610a30600e546002610c5f91906135a4565b610c6b6012600a6135a4565b610c769060646135b0565b906126fc565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c79206f776e65720000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b601f546a115eec47f6cf7e350000009060ff1615610d2257610d226135ed565b601f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905542601255600e54610d6390610c5f9060026135a4565b6010556000600e8190556017819055600855600b54610d839060016126fc565b600c5542600755610d92612865565b610d9d60028261364b565b73ffffffffffffffffffffffffffffffffffffffff8516600081815260186020526040812092909255907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef610df360028561364b565b60405190815260200160405180910390a36002805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255600380548684169083161790556004805492851692909116919091179055600854601155610e766000612b02565b50505050565b6040805160208082018590523360601b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016828401526054808301889052835180840390910181526074909201909252805191012060009082811115610ee157600080fd5b909314949350505050565b73ffffffffffffffffffffffffffffffffffffffff82163014610f0e57600080fd5b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260248101849052309063a9059cbb906044016020604051808303816000875af1158015610f81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa5919061365f565b5050505050565b33600090815260186020526040812054610fc69083612776565b336000908152601860205260408082209290925573ffffffffffffffffffffffffffffffffffffffff851681522054610fff90836127ec565b73ffffffffffffffffffffffffffffffffffffffff84166000818152601860205260409081902092909255905133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610a059086815260200190565b6000806110858686856000815181106110785761107861341c565b6020026020010151611908565b9050600081116110f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6d696e74206973737565000000000000000000000000000000000000000000006044820152606401610cf9565b83516110fe906001613404565b83511461118d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d696e74546f2068617320746f206861766520616e206578747261206164647260448201527f65737320636f6d706172656420746f20457874726146756e64730000000000006064820152608401610cf9565b60005b84518110156113d3576111a4816001613404565b6111af9060026135a4565b6008546111bc9190613681565b156111c6576113d3565b3073ffffffffffffffffffffffffffffffffffffffff168582815181106111ef576111ef61341c565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16141580156112675750600454855173ffffffffffffffffffffffffffffffffffffffff909116908690839081106112465761124661341c565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b6112cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4e6f2062617365207072696e74696e67206f6620746f6b656e730000000000006044820152606401610cf9565b60006112da826001613404565b90505b85518110156113c0578582815181106112f8576112f861341c565b602002602001015173ffffffffffffffffffffffffffffffffffffffff168682815181106113285761132861341c565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614156113ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4e6f207072696e74696e67205468652073616d6520746f6b656e7300000000006044820152606401610cf9565b806113b88161344b565b9150506112dd565b50806113cb8161344b565b915050611190565b60008060005b838110156115ff576113ec816001613404565b6113f79060026135a4565b6008546114049190613681565b6115ed5787818151811061141a5761141a61341c565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015611490573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b49190613695565b9150811561150e576114c7600382613681565b1580156114d357508015155b156114f8576114f1643a352944006114eb87856135b0565b90612c1e565b925061150e565b61150b643a35294400610c7687856135b0565b92505b8781815181106115205761152061341c565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb888360016115519190613404565b815181106115615761156161341c565b6020026020010151856040518363ffffffff1660e01b81526004016115a892919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af11580156115c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115eb919061365f565b505b806115f78161344b565b9150506113d9565b50600854600d5460408051928352602083019190915281018490526060810185905233907f87e5a7775b8ac2ead741e32752431bffeff76ec5f347cc202a6bad454653930b9060800160405180910390a25091979650505050505050565b6000601d544261166d91906136ae565b9050600060115460085461168191906136ae565b9050600061168f828461364b565b90506116a3600e546002610c5f91906135a4565b60105560006116ba610b406114eb846103786135b0565b905060006103786116cc8360646135b0565b6116d6919061364b565b9050600060c8821015611728576116f7610378610c768563026f7f3c6135b0565b611717620c08406117096002876136c5565b610c76906303a2cdf06135b0565b6117219190613404565b905061172f565b50631443fd005b600460095460155461174191906135b0565b61174c90603c6135b0565b611756919061364b565b600480546040517f70a08231000000000000000000000000000000000000000000000000000000008152309281019290925273ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156117c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e99190613695565b11156118f057600454600354601a5460155473ffffffffffffffffffffffffffffffffffffffff9384169363a9059cbb93169161184591630bebc2009190611831888d6135b0565b61183b91906135b0565b610c7691906135b0565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303816000875af11580156118b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d9919061365f565b50601b546118e89060016135b0565b601a556118f6565b6000601a555b5050600854601155505042601d555050565b600d546040805160208101929092527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b16908201526054810184905260009081906074016040516020818303038152906040528051906020012090508381146119f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4f6c64206368616c6c656e67655f646967657374206f722077726f6e6720636860448201527f616c6c656e67655f6469676573740000000000000000000000000000000000006064820152608401610cf9565b600c548110611a88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f446967657374206d75737420626520736d616c6c6572207468616e206d696e6960448201527f6e675461726765740000000000000000000000000000000000000000000000006064820152608401610cf9565b611a90612865565b6012544211611afb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f2073616d65207365636f6e6420736f6c76657300000000000000000000006044820152606401610cf9565b6000610b4060125442611b0e91906136ae565b611b1a906103786135b0565b611b24919061364b565b90506000610378611b368360646135b0565b611b40919061364b565b9050600061013a821015611b8557611b62610378610c768563026f7f3c6135b0565b611b74620c08406117096002876136c5565b611b7e9190613404565b9050611baa565b611b99610378610c76856305f5e1006135b0565b611ba7906314dc9380613404565b90505b611bef611bc36305f5e10083601054610c7691906135b0565b73ffffffffffffffffffffffffffffffffffffffff8816600090815260186020526040902054906127ec565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260186020526040902055601054611c5f90611c3190630bebc20090610c769085906135b0565b60035473ffffffffffffffffffffffffffffffffffffffff16600090815260186020526040902054906127ec565b60035473ffffffffffffffffffffffffffffffffffffffff16600090815260186020526040902055601054611cac90611ca3906305f5e10090610c769085906135b0565b601754906127ec565b60175542601255601a5415611e6e5760c8821015611d9c57600454601a5460155473ffffffffffffffffffffffffffffffffffffffff9092169163a9059cbb918991611d02916305f5e1009161183b90886135b0565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303816000875af1158015611d72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d96919061365f565b50611e6e565b600454601a5460155473ffffffffffffffffffffffffffffffffffffffff9092169163a9059cbb918991611dd891600a9161183b9060226135b0565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303816000875af1158015611e48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6c919061365f565b505b3373ffffffffffffffffffffffffffffffffffffffff167fcf6fbb9dcea7d07263ab4f5c3a92f53af33dffc421d9d121e1c74b307e68189d611ebc6305f5e10084601054610c7691906135b0565b600854600d546040805193845260208401929092529082015260600160405180910390a2979650505050505050565b600d546040805160208101929092527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b1690820152605481018590526000908190607401604051602081830303815290604052805190602001209050848114611fda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4f6c64206368616c6c656e67655f646967657374206f722077726f6e6720636860448201527f616c6c656e67655f6469676573740000000000000000000000000000000000006064820152608401610cf9565b600c54811061206b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f446967657374206d75737420626520736d616c6c6572207468616e206d696e6960448201527f6e675461726765740000000000000000000000000000000000000000000000006064820152608401610cf9565b612073612865565b60125442116120de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f2073616d65207365636f6e6420736f6c76657300000000000000000000006044820152606401610cf9565b835183511461216f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d696e74546f2068617320746f20686176652073616d65206e756d626572206f60448201527f66206164647265737373657320617320457874726146756e64730000000000006064820152608401610cf9565b60005b84518110156123b557612186816001613404565b6121919060026135a4565b60085461219e9190613681565b156121a8576123b5565b3073ffffffffffffffffffffffffffffffffffffffff168582815181106121d1576121d161341c565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16141580156122495750600454855173ffffffffffffffffffffffffffffffffffffffff909116908690839081106122285761222861341c565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b6122af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4e6f2062617365207072696e74696e67206f6620746f6b656e730000000000006044820152606401610cf9565b60006122bc826001613404565b90505b85518110156123a2578582815181106122da576122da61341c565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1686828151811061230a5761230a61341c565b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415612390576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4e6f207072696e74696e67205468652073616d6520746f6b656e7300000000006044820152606401610cf9565b8061239a8161344b565b9150506122bf565b50806123ad8161344b565b915050612172565b6000610b40601254426123c891906136ae565b6123d4906103786135b0565b6123de919061364b565b905060006103786123f08360646135b0565b6123fa919061364b565b9050600061013a82101561243f5761241c610378610c768563026f7f3c6135b0565b61242e620c08406117096002876136c5565b6124389190613404565b9050612464565b612453610378610c76856305f5e1006135b0565b612461906314dc9380613404565b90505b600081116124ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6d696e74206973737565000000000000000000000000000000000000000000006044820152606401610cf9565b60008060005b868110156126e8576124e7816001613404565b6124f29060026135a4565b6008546124ff9190613681565b6126d6578a81815181106125155761251561341c565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa15801561258b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125af9190613695565b915081156126d6576125c2600382613681565b1580156125ce57508015155b156125ed576125e6643a352944006114eb86856135b0565b9250612603565b612600643a35294400610c7686856135b0565b92505b8a81815181106126155761261561341c565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8b838151811061264a5761264a61341c565b6020026020010151856040518363ffffffff1660e01b815260040161269192919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af11580156126b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126d4919061365f565b505b806126e08161344b565b9150506124d4565b505042601255509998505050505050505050565b600081612765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f446976206279207a65726f0000000000000000000000000000000000000000006044820152606401610cf9565b61276f828461364b565b9392505050565b6000818310156127e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f53756220756e646572666c6f77000000000000000000000000000000000000006044820152606401610cf9565b61276f82846136ae565b6000806127f98385613404565b90508381101561276f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f416464206f766572666c6f7700000000000000000000000000000000000000006044820152606401610cf9565b600f54601054601754612877916127ec565b1180156128865750603c600e54105b156128d257600e54612899906001613404565b600e8190556128c1906128ad906001613404565b6128b89060026135a4565b600654906126fc565b6006546128ce91906136ae565b600f555b6008546128e09060016127ec565b6008556009546128f29060049061364b565b6008546128ff9190613681565b612af15761290b61165d565b61291d600e5460016128ad9190613404565b60065461292a91906136ae565b600f5560095460085461293d9190613681565b612af157600480546040517f70a082310000000000000000000000000000000000000000000000000000000081523092810192909252642e90edd0009173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa1580156129b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129dd9190613695565b6129e7919061364b565b60018190556129f8906127106135b0565b612a0490612710613404565b601554600480546040517f70a08231000000000000000000000000000000000000000000000000000000008152309281019290925273ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612a76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a9a9190613695565b612aa4919061364b565b11612ad757601654601554612aba9060026126fc565b1115612ad257601554612ace9060026126fc565b6015555b612ae9565b601554612ae5906003612cb7565b6015555b612af1612d46565b612afc6001436136ae565b40600d55565b60005473ffffffffffffffffffffffffffffffffffffffff163314612b83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c79206f776e6572000000000000000000000000000000000000000000006044820152606401610cf9565b6000546040805173ffffffffffffffffffffffffffffffffffffffff928316815291831660208301527f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c910160405180910390a1600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600081612c87576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f446976206279207a65726f0000000000000000000000000000000000000000006044820152606401610cf9565b6000612c93838561364b565b9050612c9f8385613681565b1561276f57612caf816001613404565b949350505050565b600082612cc657506000610a11565b6000612cd283856135b0565b905082612cdf858361364b565b1461276f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4d756c74206f766572666c6f77000000000000000000000000000000000000006044820152606401610cf9565b6007544290600090612d5890836136ae565b90506000600954610b40612d6c91906135b0565b905080821015612de1576000612d8783610c76846064612cb7565b6001601b5590506000612da76103e8612da1846064612776565b90612e6f565b9050612dd6612dcd82612dc76107d0600c546126fc90919063ffffffff16565b90612cb7565b600c5490612776565b600c5550612e3b9050565b6000612df282610c76856064612cb7565b6002601b5590506000612e0c6103e8612da1846064612776565b9050612e35612e2c82612dc76101f4600c546126fc90919063ffffffff16565b600c54906127ec565b600c5550505b600783905543601e55600a54600c541015612e5757600a54600c555b600b54600c541115612e6a57600b54600c555b505050565b600081831115612e80575080610a11565b5090919050565b600060208083528351808285015260005b81811015612eb457858101830151858201604001528201612e98565b81811115612ec6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612f1e57600080fd5b919050565b60008060408385031215612f3657600080fd5b612f3f83612efa565b946020939093013593505050565b60008060408385031215612f6057600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612fe557612fe5612f6f565b604052919050565b600082601f830112612ffe57600080fd5b8135602067ffffffffffffffff82111561301a5761301a612f6f565b8160051b613029828201612f9e565b928352848101820192828101908785111561304357600080fd5b83870192505b848310156130695761305a83612efa565b82529183019190830190613049565b979650505050505050565b6000806000806080858703121561308a57600080fd5b8435935060208501359250604085013567ffffffffffffffff8111156130af57600080fd5b6130bb87828801612fed565b9250506130ca60608601612efa565b905092959194509250565b6000806000606084860312156130ea57600080fd5b6130f384612efa565b925061310160208501612efa565b9150604084013590509250925092565b60008060006060848603121561312657600080fd5b61312f84612efa565b925061313d60208501612efa565b915061314b60408501612efa565b90509250925092565b60006020828403121561316657600080fd5b61276f82612efa565b6000806000806080858703121561318557600080fd5b5050823594602084013594506040840135936060013592509050565b600080600080608085870312156131b757600080fd5b6131c085612efa565b935060208086013593506131d660408701612efa565b9250606086013567ffffffffffffffff808211156131f357600080fd5b818801915088601f83011261320757600080fd5b81358181111561321957613219612f6f565b613249847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612f9e565b9150808252898482850101111561325f57600080fd5b808484018584013760008482840101525080935050505092959194509250565b60008060006060848603121561329457600080fd5b505081359360208301359350604090920135919050565b600080600080608085870312156132c157600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156132e757600080fd5b6132f388838901612fed565b9350606087013591508082111561330957600080fd5b5061331687828801612fed565b91505092959194509250565b6000806040838503121561333557600080fd5b61333e83612efa565b915061334c60208401612efa565b90509250929050565b60008060006060848603121561336a57600080fd5b833592506020840135915061314b60408501612efa565b600181811c9082168061339557607f821691505b602082108114156133cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115613417576134176133d5565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561347d5761347d6133d5565b5060010190565b600181815b808511156134dd57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156134c3576134c36133d5565b808516156134d057918102915b93841c9390800290613489565b509250929050565b6000826134f457506001610a11565b8161350157506000610a11565b816001811461351757600281146135215761353d565b6001915050610a11565b60ff841115613532576135326133d5565b50506001821b610a11565b5060208310610133831016604e8410600b8410161715613560575081810a610a11565b61356a8383613484565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561359c5761359c6133d5565b029392505050565b600061276f83836134e5565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156135e8576135e86133d5565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261365a5761365a61361c565b500490565b60006020828403121561367157600080fd5b8151801515811461276f57600080fd5b6000826136905761369061361c565b500690565b6000602082840312156136a757600080fd5b5051919050565b6000828210156136c0576136c06133d5565b500390565b600061276f60ff8416836134e556fea2646970667358221220bb03436d9d65562d4e1d802ec17043fb29bc5e7165ef1bc37d740d60a44194e764736f6c634300080b0033

Deployed ByteCode Sourcemap

6107:18933:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25024:8;;;6107:18933;;;;;;;;;;;;;;;;25024:8;;;6107:18933;;;;;;;;;;;;;;;;;;;;;25024:8;;;6107:18933;;;;;;;;;;;;;;;;25024:8;;;6107:18933;;;;;;;;;;;;;;;;;;;;;;;;;;25024:8;;;6107:18933;;;;;;;;;;;;;;;;25024:8;;;6107:18933;;;;;;;;;;;;;;;;;;;;;25024:8;;;6107:18933;;;;;;;;;;;25024:8;;;6107:18933;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25024:8;;;6107:18933;;;;;;;;;;;;;;;;25024:8;;;6107:18933;;;;;;;;;;;;;;;;;;;;;25024:8;;;6107:18933;;;;;;;;;;;25024:8;;;6107:18933;;;;;;;;;;;;;;;;;;;;;;;;;;25024:8;;;6107:18933;;;;;;;;;;;;;;;;25024:8;;;6107:18933;;;;;;;;;;;;;;;;;;;;;25024:8;;;6107:18933;;;;;;;;;;;25024:8;;;6107:18933;;;;24969:8;;;6107:18933;25024:8;;;8155:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22820:204;;;;;;;;;;-1:-1:-1;22820:204:0;;;;;:::i;:::-;;:::i;:::-;;;1300:14:1;;1293:22;1275:41;;1263:2;1248:18;22820:204:0;1135:187:1;7719:49:0;;;;;;;;;;;;;;;;;;;1473:25:1;;;1461:2;1446:18;7719:49:0;1327:177:1;20335:110:0;;;;;;;;;;;;;:::i;10640:138::-;;;;;;;;;;-1:-1:-1;10640:138:0;;;;;:::i;:::-;;:::i;6729:64::-;;;;;;;;;;;;;;;;14051:383;;;;;;;;;;-1:-1:-1;14051:383:0;;;;;:::i;:::-;;:::i;7625:29::-;;;;;;;;;;;;;;;;23566:327;;;;;;;;;;-1:-1:-1;23566:327:0;;;;;:::i;:::-;;:::i;7502:25::-;;;;;;;;;;;;;;;;6310:30;;;;;;;;;;-1:-1:-1;6310:30:0;;;;;;;;;;;4086:42:1;4074:55;;;4056:74;;4044:2;4029:18;6310:30:0;3910:226:1;8234:35:0;;;;;;;;;;;;8267:2;8234:35;;;;;4313:4:1;4301:17;;;4283:36;;4271:2;4256:18;8234:35:0;4141:184:1;20452:87:0;;;;;;;;;;-1:-1:-1;20520:12:0;;20452:87;;6169:41;;;;;;;;;;;;6203:7;6169:41;;20743:237;;;;;;;;;;;;;:::i;20152:96::-;;;;;;;;;;-1:-1:-1;20226:15:0;;20152:96;;7534:84;;;;;;;;;;;;;;;;6347:30;;;;;;;;;;-1:-1:-1;6347:30:0;;;;;;;;8597:945;;;;;;;;;;-1:-1:-1;8597:945:0;;;;;:::i;:::-;;:::i;:::-;;7963:24;;;;;;;;;;;;;;;;21574:124;;;;;;;;;;-1:-1:-1;21574:124:0;;;;;:::i;:::-;21671:20;;21643:12;21671:20;;;:8;:20;;;;;;;21574:124;20987:79;;;;;;;;;;-1:-1:-1;21048:10:0;;20987:79;;19730:332;;;;;;;;;;-1:-1:-1;19730:332:0;;;;;:::i;:::-;;:::i;7022:26::-;;;;;;;;;;;;;;;;7206:37;;;;;;;;;;;;;;;;7250:63;;;;;;;;;;;;;;;;7384:60;;;;;;;;;;;;;;;;3025:20;;;;;;;;;;-1:-1:-1;3025:20:0;;;;;;;;24698:198;;;;;;;;;;-1:-1:-1;24698:198:0;;;;;:::i;:::-;;:::i;6274:29::-;;;;;;;;;;-1:-1:-1;6274:29:0;;;;;;;;8190:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21104:246;;;;;;;;;;-1:-1:-1;21104:246:0;;;;;:::i;:::-;-1:-1:-1;;21287:15:0;;21270:52;;;;;;;12033:19:1;;;;21304:10:0;12090:2:1;12086:15;12103:66;12082:88;12068:12;;;12061:110;12187:12;;;;12180:28;;;;21270:52:0;;;;;;;;;;12224:12:1;;21270:52:0;;21260:63;;;;;;21104:246;6217:25;;;;;;;;;;;;;;;;7869:40;;;;;;;;;;;;;;;;22048:257;;;;;;;;;;-1:-1:-1;22048:257:0;;;;;:::i;:::-;;:::i;7083:42::-;;;;;;;;;;;;;;;;20546:87;;;;;;;;;;-1:-1:-1;20614:12:0;;20546:87;;12435:1609;;;;;;;;;;-1:-1:-1;12435:1609:0;;;;;:::i;:::-;;:::i;8318:56::-;;;;;;;;;;;;;;;;9580:1029;;;;;;;;;;;;;:::i;7157:36::-;;;;;;;;;;;;;;;;24180:151;;;;;;;;;;-1:-1:-1;24180:151:0;;;;;:::i;:::-;24296:19;;;;24266:14;24296:19;;;:7;:19;;;;;;;;:28;;;;;;;;;;;;;24180:151;10785:1643;;;;;;;;;;-1:-1:-1;10785:1643:0;;;;;:::i;:::-;;:::i;6955:60::-;;;;;;;;;;;;;;;;14441:2255;;;;;;;;;;-1:-1:-1;14441:2255:0;;;;;:::i;:::-;;:::i;8155:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22820:204::-;22921:10;22892:12;22913:19;;;:7;:19;;;;;;;;;:28;;;;;;;;;;:37;;;22962;22892:12;;22913:28;;22962:37;;;;22944:6;1473:25:1;;1461:2;1446:18;;1327:177;22962:37:0;;;;;;;;-1:-1:-1;23013:4:0;22820:204;;;;;:::o;20335:110::-;20387:4;20407:33;20427:12;;20407:15;;:19;;:33;;;;:::i;:::-;20400:40;;20335:110;:::o;10640:138::-;10711:12;10730:43;10737:5;10744:16;10762:10;10730:6;:43::i;:::-;;10640:138;;;;:::o;14051:383::-;14184:12;14203:19;14239:10;:17;14259:1;14239:21;;;;:::i;:::-;14225:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14225:36:0;;14203:58;;14273:6;14269:76;14287:17;;:21;;14307:1;14287:21;:::i;:::-;14283:1;:26;14269:76;;;14333:6;14325:2;14328:1;14325:5;;;;;;;;:::i;:::-;:14;;;;:5;;;;;;;;;;;:14;14311:3;;;;:::i;:::-;;;;14269:76;;;;14353:58;14371:5;14378:16;14396:10;14408:2;14353:17;:58::i;:::-;-1:-1:-1;14425:4:0;;14051:383;-1:-1:-1;;;;;;14051:383:0:o;23566:327::-;23690:14;;;23652:12;23690:14;;;:8;:14;;;;;;:26;;23709:6;23690:18;:26::i;:::-;23673:14;;;;;;;:8;:14;;;;;;;;:43;;;;23749:7;:13;;;;;23763:10;23749:25;;;;;;:37;;23779:6;23749:29;:37::i;:::-;23721:13;;;;;;;;:7;:13;;;;;;;;23735:10;23721:25;;;;;;;:65;;;;23806:12;;;;;:8;:12;;;;;:24;;23823:6;23806:16;:24::i;:::-;23791:12;;;;;;;;:8;:12;;;;;;;:39;;;;23842:26;;;;;;;;;;23861:6;1473:25:1;;1461:2;1446:18;;1327:177;23842:26:0;;;;;;;;-1:-1:-1;23882:4:0;23566:327;;;;;:::o;20743:237::-;20791:4;20924:47;20960:9;;20957:1;:12;;;;:::i;:::-;20931:18;8267:2;20931;:18;:::i;:::-;20925:24;;:3;:24;:::i;:::-;20924:31;;:47::i;8597:945::-;3291:5;;;;3277:10;:19;3269:42;;;;;;;11208:2:1;3269:42:0;;;11190:21:1;11247:2;11227:18;;;11220:30;11286:12;11266:18;;;11259:40;11316:18;;3269:42:0;;;;;;;;;8790:7:::1;::::0;8717:26:::1;::::0;8790:7:::1;;8789:8;8782:16;;;;:::i;:::-;8809:7;:14:::0;;;::::1;8819:4;8809:14;::::0;;8851:15:::1;8831:17;:35:::0;8926:9:::1;::::0;8890:47:::1;::::0;8923:12:::1;::::0;:1:::1;:12;:::i;8890:47::-;8874:13;:63:::0;8957:1:::1;8945:9;:13:::0;;;8966:12:::1;:16:::0;;;8990:10:::1;:14:::0;9027:15:::1;::::0;:22:::1;::::0;9047:1:::1;9027:19;:22::i;:::-;9012:12;:37:::0;9136:15:::1;9103:30;:48:::0;9159:22:::1;:20;:22::i;:::-;9265:3;9267:1;9265::::0;:3:::1;:::i;:::-;9237:25;::::0;::::1;;::::0;;;:8:::1;:25;::::0;;;;:31;;;;:25;9287:42:::1;9325:3;9327:1;9325::::0;:3:::1;:::i;:::-;9287:42;::::0;1473:25:1;;;1461:2;1446:18;9287:42:0::1;;;;;;;9340:14;:32:::0;;::::1;::::0;;::::1;::::0;;;::::1;;::::0;;;9383:15:::1;:35:::0;;;;::::1;::::0;;::::1;;::::0;;9429:15:::1;:34:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;9489:10:::1;::::0;9477:9:::1;:22:::0;9507:20:::1;9340:14;9507:8;:20::i;:::-;8697:845;8597:945:::0;;;:::o;19730:332::-;19916:51;;;;;;;12033:19:1;;;19950:10:0;12090:2:1;12086:15;12103:66;12082:88;12068:12;;;12061:110;12187:12;;;;12180:28;;;19916:51:0;;;;;;;;;;12224:12:1;;;;19916:51:0;;;19906:62;;;;;-1:-1:-1;;19977:28:0;;;19974:41;;;20007:8;;;19974:41;20030:26;;;;19730:332;-1:-1:-1;;;;19730:332:0:o;24698:198::-;24817:22;;;24834:4;24817:22;24809:31;;;;;;24845:44;;;;;12451:42:1;12439:55;;24845:44:0;;;12421:74:1;12511:18;;;12504:34;;;24860:4:0;;24845:30;;12394:18:1;;24845:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;24698:198;;;;:::o;22048:257::-;22169:10;22116:12;22160:20;;;:8;:20;;;;;;:32;;22185:6;22160:24;:32::i;:::-;22146:10;22137:20;;;;:8;:20;;;;;;:55;;;;:20;22212:12;;;;;;:24;;22229:6;22212:16;:24::i;:::-;22197:12;;;;;;;:8;:12;;;;;;;:39;;;;22248:32;;22257:10;;22248:32;;;;22273:6;1473:25:1;;1461:2;1446:18;;1327:177;12435:1609:0;12573:12;12592:15;12610:41;12617:5;12623:16;12641:6;12648:1;12641:9;;;;;;;;:::i;:::-;;;;;;;12610:6;:41::i;:::-;12592:59;;12674:1;12664:7;:11;12656:34;;;;;;;13033:2:1;12656:34:0;;;13015:21:1;13072:2;13052:18;;;13045:30;13111:12;13091:18;;;13084:40;13141:18;;12656:34:0;12831:334:1;12656:34:0;12722:17;;:21;;12742:1;12722:21;:::i;:::-;12705:6;:13;:38;12697:108;;;;;;;13372:2:1;12697:108:0;;;13354:21:1;13411:2;13391:18;;;13384:30;13450:34;13430:18;;;13423:62;13521:28;13501:18;;;13494:56;13567:19;;12697:108:0;13170:422:1;12697:108:0;12810:7;12824:353;12840:10;:17;12836:2;:21;12824:353;;;12895:4;:2;12898:1;12895:4;:::i;:::-;12891:9;;:1;:9;:::i;:::-;12877:10;;:24;;;;:::i;:::-;:29;12874:52;;12914:5;;12874:52;12965:4;12939:31;;:10;12950:2;12939:14;;;;;;;;:::i;:::-;;;;;;;:31;;;;:68;;;;-1:-1:-1;12992:15:0;;12974:14;;12992:15;;;;;12974:10;;12985:2;;12974:14;;;;;;:::i;:::-;;;;;;;:33;;;;12939:68;12931:107;;;;;;;13916:2:1;12931:107:0;;;13898:21:1;13955:2;13935:18;;;13928:30;13994:28;13974:18;;;13967:56;14040:18;;12931:107:0;13714:350:1;12931:107:0;13048:6;13055:4;:2;13058:1;13055:4;:::i;:::-;13048:11;;13044:128;13064:10;:17;13061:1;:20;13044:128;;;13119:10;13130:2;13119:14;;;;;;;;:::i;:::-;;;;;;;13102:31;;:10;13113:1;13102:13;;;;;;;;:::i;:::-;;;;;;;:31;;;;13094:71;;;;;;;14271:2:1;13094:71:0;;;14253:21:1;14310:2;14290:18;;;14283:30;14349:29;14329:18;;;14322:57;14396:18;;13094:71:0;14069:351:1;13094:71:0;13083:3;;;;:::i;:::-;;;;13044:128;;;-1:-1:-1;12859:4:0;;;;:::i;:::-;;;;12824:353;;;13185:17;13211:18;13242:6;13238:692;13254:2;13252:1;:4;13238:692;;;13548:3;:1;13550;13548:3;:::i;:::-;13544:8;;:1;:8;:::i;:::-;13530:10;;:23;;;;:::i;:::-;13527:392;;13586:10;13597:1;13586:13;;;;;;;;:::i;:::-;;;;;;;;;;;13579:46;;;;;13619:4;13579:46;;;4056:74:1;13579:31:0;;;;;;;4029:18:1;;13579:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13566:59;-1:-1:-1;13635:15:0;;13632:217;;13663:5;13667:1;13663;:5;:::i;:::-;:10;:20;;;;-1:-1:-1;13677:6:0;;;13663:20;13659:183;;;13705:49;13737:16;13706:20;13719:7;13706:10;:20;:::i;:::-;13705:31;;:49::i;:::-;13693:61;;13659:183;;;13788:45;13815:16;13789:20;13802:7;13789:10;:20;:::i;13788:45::-;13776:57;;13659:183;13865:10;13876:1;13865:13;;;;;;;;:::i;:::-;;;;;;;13858:30;;;13889:6;13896:1;13898;13896:3;;;;:::i;:::-;13889:11;;;;;;;;:::i;:::-;;;;;;;13902:9;13858:54;;;;;;;;;;;;;;;12451:42:1;12439:55;;;;12421:74;;12526:2;12511:18;;12504:34;12409:2;12394:18;;12247:297;13858:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;13527:392;13258:3;;;;:::i;:::-;;;;13238:692;;;-1:-1:-1;13971:10:0;;13983:15;;13950:63;;;14845:25:1;;;14901:2;14886:18;;14879:34;;;;14929:18;;14922:34;;;14987:2;14972:18;;14965:34;;;13959:10:0;;13950:63;;14832:3:1;14817:19;13950:63:0;;;;;;;-1:-1:-1;14027:7:0;;12435:1609;-1:-1:-1;;;;;;;12435:1609:0:o;9580:1029::-;9664:12;9697:7;;9679:15;:25;;;;:::i;:::-;9664:40;;9711:18;9745:9;;9732:10;;:22;;;;:::i;:::-;9711:43;-1:-1:-1;9776:20:0;9799:17;9711:43;9799:4;:17;:::i;:::-;9776:40;;9839:46;9874:9;;9871:1;:12;;;;:::i;9839:46::-;9823:13;:62;9890:9;9902:41;6203:7;9903:18;:12;9918:3;9903:18;:::i;9902:41::-;9890:53;-1:-1:-1;9948:13:0;9974:3;9964:7;9890:53;9968:3;9964:7;:::i;:::-;:13;;;;:::i;:::-;9948:29;;9982:17;10020:3;10012:5;:11;10009:141;;;10079:23;10098:3;10080:12;10091:1;10080:8;:12;:::i;10079:23::-;10042:34;10069:6;10055;10060:1;10055;:6;:::i;:::-;10043:20;;:8;:20;:::i;10042:34::-;:60;;;;:::i;:::-;10030:72;;10009:141;;;-1:-1:-1;10134:9:0;10009:141;10260:1;10234:24;;10222:9;;:36;;;;:::i;:::-;10212:47;;:6;:47;:::i;:::-;:49;;;;:::i;:::-;10167:15;;;10160:48;;;;;10202:4;10160:48;;;4056:74:1;;;;10167:15:0;;;10160:33;;4029:18:1;;10160:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:102;10157:372;;;10355:15;;10381;;10438:9;;10426;;10355:15;;;;;10348:32;;10381:15;;10398:69;;10453:13;;10438:9;10399:24;10414:9;10400:10;10399:24;:::i;:::-;:36;;;;:::i;:::-;:48;;;;:::i;10398:69::-;10348:120;;;;;;;;;;12451:42:1;12439:55;;;10348:120:0;;;12421:74:1;12511:18;;;12504:34;12394:18;;10348:120:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;10490:4:0;;10486:8;;:1;:8;:::i;:::-;10474:9;:20;10157:372;;;10522:1;10510:9;:13;10157:372;-1:-1:-1;;10545:10:0;;10533:9;:22;-1:-1:-1;;10589:15:0;10579:7;:25;-1:-1:-1;;9580:1029:0:o;10785:1643::-;10941:15;;10924:52;;;;;;12033:19:1;;;;12103:66;10958:10:0;12090:2:1;12086:15;12082:88;12068:12;;;12061:110;12187:12;;;12180:28;;;10875:12:0;;;;12224::1;;10924:52:0;;;;;;;;;;;;10914:63;;;;;;10896:81;;11052:16;11042:6;:26;11034:85;;;;;;;15487:2:1;11034:85:0;;;15469:21:1;15526:2;15506:18;;;15499:30;15565:34;15545:18;;;15538:62;15636:16;15616:18;;;15609:44;15670:19;;11034:85:0;15285:410:1;11034:85:0;11200:12;;11182:30;;11174:83;;;;;;;15902:2:1;11174:83:0;;;15884:21:1;15941:2;15921:18;;;15914:30;15980:34;15960:18;;;15953:62;16051:10;16031:18;;;16024:38;16079:19;;11174:83:0;15700:404:1;11174:83:0;11262:22;:20;:22::i;:::-;11317:17;;11299:15;:35;11291:69;;;;;;;16311:2:1;11291:69:0;;;16293:21:1;16350:2;16330:18;;;16323:30;16389:23;16369:18;;;16362:51;16430:18;;11291:69:0;16109:345:1;11291:69:0;11421:9;6203:7;11453:17;;11435:15;:35;;;;:::i;:::-;11434:43;;11474:3;11434:43;:::i;:::-;11433:58;;;;:::i;:::-;11421:70;-1:-1:-1;11496:10:0;11519:3;11509:7;11421:70;11513:3;11509:7;:::i;:::-;:13;;;;:::i;:::-;11496:26;;11527:14;11561:3;11553:5;:11;11550:167;;;11621:23;11640:3;11622:12;11633:1;11622:8;:12;:::i;11621:23::-;11583:36;11610:8;11596:6;11601:1;11596;:6;:::i;11583:36::-;:61;;;;:::i;:::-;11571:73;;11550:167;;;11673:24;11693:3;11674:13;:1;11678:9;11674:13;:::i;11673:24::-;:38;;11701:9;11673:38;:::i;:::-;11661:50;;11550:167;11745:64;11766:42;11798:9;11783;11767:13;;:25;;;;:::i;11766:42::-;11745:16;;;;;;;:8;:16;;;;;;;:20;:64::i;:::-;11726:16;;;;;;;:8;:16;;;;;:83;11873:13;;11842:77;;11872:46;;11904:13;;11873:25;;11889:9;;11873:25;:::i;11872:46::-;11851:15;;;;11842:25;;;;:8;:25;;;;;;;:29;:77::i;:::-;11823:15;;;;11814:25;;;;:8;:25;;;;;:105;11963:13;;11945:60;;11962:42;;11994:9;;11963:25;;11979:9;;11963:25;:::i;11962:42::-;11945:12;;;:16;:60::i;:::-;11930:12;:75;12030:15;12010:17;:35;12055:9;;:13;12052:245;;12086:3;12078:5;:11;12075:217;;;12104:15;;12163:9;;12151;;12104:15;;;;;12097:32;;12130:6;;12138:50;;12178:9;;12139:21;;:9;:21;:::i;12138:50::-;12097:92;;;;;;;;;;12451:42:1;12439:55;;;12097:92:0;;;12421:74:1;12511:18;;;12504:34;12394:18;;12097:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;12075:217;;;12214:15;;12266:9;;12254;;12214:15;;;;;12207:32;;12240:6;;12248:36;;12281:2;;12249:14;;:2;:14;:::i;12248:36::-;12207:78;;;;;;;;;;12451:42:1;12439:55;;;12207:78:0;;;12421:74:1;12511:18;;;12504:34;12394:18;;12207:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;12075:217;12313:10;12308:90;;;12325:42;12357:9;12342;12326:13;;:25;;;;:::i;12325:42::-;12369:10;;12381:15;;12308:90;;;16661:25:1;;;16717:2;16702:18;;16695:34;;;;16745:18;;;16738:34;16649:2;16634:18;12308:90:0;;;;;;;12412:9;10785:1643;-1:-1:-1;;;;;;;10785:1643:0:o;14441:2255::-;14638:15;;14621:52;;;;;;12033:19:1;;;;12103:66;14655:10:0;12090:2:1;12086:15;12082:88;12068:12;;;12061:110;12187:12;;;12180:28;;;14574:12:0;;;;12224::1;;14621:52:0;;;;;;;;;;;;14611:63;;;;;;14593:81;;14749:16;14739:6;:26;14731:85;;;;;;;15487:2:1;14731:85:0;;;15469:21:1;15526:2;15506:18;;;15499:30;15565:34;15545:18;;;15538:62;15636:16;15616:18;;;15609:44;15670:19;;14731:85:0;15285:410:1;14731:85:0;14897:12;;14879:30;;14871:83;;;;;;;15902:2:1;14871:83:0;;;15884:21:1;15941:2;15921:18;;;15914:30;15980:34;15960:18;;;15953:62;16051:10;16031:18;;;16024:38;16079:19;;14871:83:0;15700:404:1;14871:83:0;14959:22;:20;:22::i;:::-;15014:17;;14996:15;:35;14988:69;;;;;;;16311:2:1;14988:69:0;;;16293:21:1;16350:2;16330:18;;;16323:30;16389:23;16369:18;;;16362:51;16430:18;;14988:69:0;16109:345:1;14988:69:0;15087:10;:17;15070:6;:13;:34;15062:104;;;;;;;16985:2:1;15062:104:0;;;16967:21:1;17024:2;17004:18;;;16997:30;17063:34;17043:18;;;17036:62;17134:28;17114:18;;;17107:56;17180:19;;15062:104:0;16783:422:1;15062:104:0;15171:7;15185:353;15201:10;:17;15197:2;:21;15185:353;;;15256:4;:2;15259:1;15256:4;:::i;:::-;15252:9;;:1;:9;:::i;:::-;15238:10;;:24;;;;:::i;:::-;:29;15235:52;;15275:5;;15235:52;15326:4;15300:31;;:10;15311:2;15300:14;;;;;;;;:::i;:::-;;;;;;;:31;;;;:68;;;;-1:-1:-1;15353:15:0;;15335:14;;15353:15;;;;;15335:10;;15346:2;;15335:14;;;;;;:::i;:::-;;;;;;;:33;;;;15300:68;15292:107;;;;;;;13916:2:1;15292:107:0;;;13898:21:1;13955:2;13935:18;;;13928:30;13994:28;13974:18;;;13967:56;14040:18;;15292:107:0;13714:350:1;15292:107:0;15409:6;15416:4;:2;15419:1;15416:4;:::i;:::-;15409:11;;15405:128;15425:10;:17;15422:1;:20;15405:128;;;15480:10;15491:2;15480:14;;;;;;;;:::i;:::-;;;;;;;15463:31;;:10;15474:1;15463:13;;;;;;;;:::i;:::-;;;;;;;:31;;;;15455:71;;;;;;;14271:2:1;15455:71:0;;;14253:21:1;14310:2;14290:18;;;14283:30;14349:29;14329:18;;;14322:57;14396:18;;15455:71:0;14069:351:1;15455:71:0;15444:3;;;;:::i;:::-;;;;15405:128;;;-1:-1:-1;15220:4:0;;;;:::i;:::-;;;;15185:353;;;15544:9;6203:7;15576:17;;15558:15;:35;;;;:::i;:::-;15557:43;;15597:3;15557:43;:::i;:::-;15556:58;;;;:::i;:::-;15544:70;-1:-1:-1;15619:10:0;15642:3;15632:7;15544:70;15636:3;15632:7;:::i;:::-;:13;;;;:::i;:::-;15619:26;;15650:12;15682:3;15674:5;:11;15671:163;;;15740:23;15759:3;15741:12;15752:1;15741:8;:12;:::i;15740:23::-;15702:36;15729:8;15715:6;15720:1;15715;:6;:::i;15702:36::-;:61;;;;:::i;:::-;15692:71;;15671:163;;;15790:24;15810:3;15791:13;:1;15795:9;15791:13;:::i;15790:24::-;:38;;15818:9;15790:38;:::i;:::-;15780:48;;15671:163;15857:1;15847:7;:11;15839:34;;;;;;;13033:2:1;15839:34:0;;;13015:21:1;13072:2;13052:18;;;13045:30;13111:12;13091:18;;;13084:40;13141:18;;15839:34:0;12831:334:1;15839:34:0;15878:17;15900:18;15927:6;15923:705;15939:2;15937:1;:4;15923:705;;;16233:3;:1;16235;16233:3;:::i;:::-;16229:8;;:1;:8;:::i;:::-;16215:10;;:23;;;;:::i;:::-;16212:405;;16271:10;16282:1;16271:13;;;;;;;;:::i;:::-;;;;;;;;;;;16264:46;;;;;16304:4;16264:46;;;4056:74:1;16264:31:0;;;;;;;4029:18:1;;16264:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16251:59;-1:-1:-1;16320:15:0;;16317:285;;16348:5;16352:1;16348;:5;:::i;:::-;:10;:20;;;;-1:-1:-1;16362:6:0;;;16348:20;16344:186;;;16390:49;16422:16;16391:20;16404:7;16391:10;:20;:::i;16390:49::-;16378:61;;16344:186;;;16473:45;16500:16;16474:20;16487:7;16474:10;:20;:::i;16473:45::-;16461:57;;16344:186;16546:10;16557:1;16546:13;;;;;;;;:::i;:::-;;;;;;;16539:30;;;16570:6;16577:1;16570:9;;;;;;;;:::i;:::-;;;;;;;16581;16539:52;;;;;;;;;;;;;;;12451:42:1;12439:55;;;;12421:74;;12526:2;12511:18;;12504:34;12409:2;12394:18;;12247:297;16539:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16317:285;15943:3;;;;:::i;:::-;;;;15923:705;;;-1:-1:-1;;16654:15:0;16634:17;:35;-1:-1:-1;16681:7:0;14441:2255;-1:-1:-1;;;;;;;;;14441:2255:0:o;4466:139::-;4524:7;4552:6;4544:30;;;;;;;17412:2:1;4544:30:0;;;17394:21:1;17451:2;17431:18;;;17424:30;17490:13;17470:18;;;17463:41;17521:18;;4544:30:0;17210:335:1;4544:30:0;4592:5;4596:1;4592;:5;:::i;:::-;4585:12;4466:139;-1:-1:-1;;;4466:139:0:o;4080:141::-;4138:7;4171:1;4166;:6;;4158:32;;;;;;;17752:2:1;4158:32:0;;;17734:21:1;17791:2;17771:18;;;17764:30;17830:15;17810:18;;;17803:43;17863:18;;4158:32:0;17550:337:1;4158:32:0;4208:5;4212:1;4208;:5;:::i;3908:164::-;3966:7;;3998:5;4002:1;3998;:5;:::i;:::-;3986:17;;4027:1;4022;:6;;4014:31;;;;;;;18094:2:1;4014:31:0;;;18076:21:1;18133:2;18113:18;;;18106:30;18172:14;18152:18;;;18145:42;18204:18;;4014:31:0;17892:336:1;16705:1404:0;16960:15;;16943:13;;16926:12;;:31;;:16;:31::i;:::-;:49;:67;;;;;16991:2;16979:9;;:14;16926:67;16922:189;;;17016:9;;:13;;17028:1;17016:13;:::i;:::-;17004:9;:25;;;17068:37;;17090:13;;17102:1;17090:13;:::i;:::-;17086:18;;:1;:18;:::i;:::-;17068:12;;;:16;:37::i;:::-;17053:12;;:52;;;;:::i;:::-;17035:15;:70;16922:189;17288:10;;:17;;17303:1;17288:14;:17::i;:::-;17275:10;:30;17402:24;;:28;;17429:1;;17402:28;:::i;:::-;17387:10;;17386:45;;;;:::i;:::-;17383:670;;17447:15;:13;:15::i;:::-;17501:37;17523:9;;17535:1;17523:13;;;;:::i;17501:37::-;17486:12;;:52;;;;:::i;:::-;17468:15;:70;17563:24;;17550:10;;:37;;17563:24;17550:37;:::i;:::-;17546:502;;17625:15;;;17618:48;;;;;17660:4;17618:48;;;4056:74:1;;;;17670:14:0;;17625:15;;;;;17618:33;;4029:18:1;;17618:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;;;:::i;:::-;17605:9;:81;;;17772:17;;:5;:17;:::i;:::-;17764:25;;:5;:25;:::i;:::-;17749:9;;17705:15;;;17698:48;;;;;17740:4;17698:48;;;4056:74:1;;;;17705:15:0;;;17698:33;;4029:18:1;;17698:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:60;;;;:::i;:::-;17696:94;17693:321;;17895:9;;17876;;:16;;17890:1;17876:13;:16::i;:::-;:28;17873:85;;;17933:9;;:16;;17947:1;17933:13;:16::i;:::-;17921:9;:28;17873:85;17693:321;;;17989:9;;:17;;18004:1;17989:14;:17::i;:::-;17977:9;:29;17693:321;18020:21;:19;:21::i;:::-;18087:16;18102:1;18087:12;:16;:::i;:::-;18077:27;18059:15;:45;16705:1404::o;3339:134::-;3291:5;;;;3277:10;:19;3269:42;;;;;;;11208:2:1;3269:42:0;;;11190:21:1;11247:2;11227:18;;;11220:30;11286:12;11266:18;;;11259:40;11316:18;;3269:42:0;11006:334:1;3269:42:0;3426:5:::1;::::0;3408:32:::1;::::0;;3426:5:::1;::::0;;::::1;18468:34:1::0;;18538:15;;;18533:2;18518:18;;18511:43;3408:32:0::1;::::0;18380:18:1;3408:32:0::1;;;;;;;3451:5;:14:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;3339:134::o;4613:232::-;4676:7;4704:6;4696:30;;;;;;;17412:2:1;4696:30:0;;;17394:21:1;17451:2;17431:18;;;17424:30;17490:13;17470:18;;;17463:41;17521:18;;4696:30:0;17210:335:1;4696:30:0;4737:9;4749:5;4753:1;4749;:5;:::i;:::-;4737:17;-1:-1:-1;4769:5:0;4773:1;4769;:5;:::i;:::-;:10;4765:52;;4800:5;:1;4804;4800:5;:::i;:::-;4796:9;4613:232;-1:-1:-1;;;;4613:232:0:o;4229:229::-;4288:7;4312:6;4308:47;;-1:-1:-1;4342:1:0;4335:8;;4308:47;4367:9;4379:5;4383:1;4379;:5;:::i;:::-;4367:17;-1:-1:-1;4412:1:0;4403:5;4407:1;4367:17;4403:5;:::i;:::-;:10;4395:36;;;;;;;18767:2:1;4395:36:0;;;18749:21:1;18806:2;18786:18;;;18779:30;18845:15;18825:18;;;18818:43;18878:18;;4395:36:0;18565:337:1;18116:1412:0;18257:30;;18184:15;;18161:20;;18242:45;;18184:15;18242:45;:::i;:::-;18204:83;;18294:24;18335;;6203:7;18321:38;;;;:::i;:::-;18294:65;;18498:19;18465:30;:52;18461:761;;;18529:21;18553:69;18590:30;18554:29;:19;18579:3;18554:24;:29::i;18553:69::-;18635:1;18628:4;:8;18529:93;-1:-1:-1;18642:27:0;18672:45;18712:4;18672:25;18529:93;18693:3;18672:20;:25::i;:::-;:39;;:45::i;:::-;18642:75;;18760:69;18777:51;18805:22;18777;18794:4;18777:12;;:16;;:22;;;;:::i;:::-;:27;;:51::i;:::-;18760:12;;;:16;:69::i;:::-;18745:12;:84;-1:-1:-1;18461:761:0;;-1:-1:-1;18461:761:0;;18863:23;18889:69;18937:19;18890:40;:30;18926:3;18890:35;:40::i;18889:69::-;18971:1;18964:4;:8;18863:95;-1:-1:-1;18978:29:0;19010:47;19052:4;19010:27;18863:95;19033:3;19010:22;:27::i;:47::-;18978:79;;19127:70;19144:52;19171:24;19144:21;19161:3;19144:12;;:16;;:21;;;;:::i;:52::-;19127:12;;;:16;:70::i;:::-;19112:12;:85;-1:-1:-1;;18461:761:0;19228:30;:45;;;19310:12;19278:29;:44;19345:15;;19330:12;;:30;19327:97;;;19403:15;;19388:12;:30;19327:97;19446:15;;19431:12;;:30;19428:92;;;19499:15;;19484:12;:30;19428:92;18156:1372;;;18116:1412::o;4975:132::-;5037:6;5065:1;5061;:5;5058:18;;;-1:-1:-1;5075:1:0;5068:8;;5058:18;-1:-1:-1;5096:1:0;;4975:132;-1:-1:-1;4975:132:0:o;14:656:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;586:2:1;574:15;591:66;570:88;555:104;;;;661:2;551:113;;14:656;-1:-1:-1;;;14:656:1:o;675:196::-;743:20;;803:42;792:54;;782:65;;772:93;;861:1;858;851:12;772:93;675:196;;;:::o;876:254::-;944:6;952;1005:2;993:9;984:7;980:23;976:32;973:52;;;1021:1;1018;1011:12;973:52;1044:29;1063:9;1044:29;:::i;:::-;1034:39;1120:2;1105:18;;;;1092:32;;-1:-1:-1;;;876:254:1:o;1509:248::-;1577:6;1585;1638:2;1626:9;1617:7;1613:23;1609:32;1606:52;;;1654:1;1651;1644:12;1606:52;-1:-1:-1;;1677:23:1;;;1747:2;1732:18;;;1719:32;;-1:-1:-1;1509:248:1:o;1762:184::-;1814:77;1811:1;1804:88;1911:4;1908:1;1901:15;1935:4;1932:1;1925:15;1951:334;2022:2;2016:9;2078:2;2068:13;;2083:66;2064:86;2052:99;;2181:18;2166:34;;2202:22;;;2163:62;2160:88;;;2228:18;;:::i;:::-;2264:2;2257:22;1951:334;;-1:-1:-1;1951:334:1:o;2290:718::-;2344:5;2397:3;2390:4;2382:6;2378:17;2374:27;2364:55;;2415:1;2412;2405:12;2364:55;2451:6;2438:20;2477:4;2500:18;2496:2;2493:26;2490:52;;;2522:18;;:::i;:::-;2568:2;2565:1;2561:10;2591:28;2615:2;2611;2607:11;2591:28;:::i;:::-;2653:15;;;2723;;;2719:24;;;2684:12;;;;2755:15;;;2752:35;;;2783:1;2780;2773:12;2752:35;2819:2;2811:6;2807:15;2796:26;;2831:148;2847:6;2842:3;2839:15;2831:148;;;2913:23;2932:3;2913:23;:::i;:::-;2901:36;;2864:12;;;;2957;;;;2831:148;;;2997:5;2290:718;-1:-1:-1;;;;;;;2290:718:1:o;3013:559::-;3124:6;3132;3140;3148;3201:3;3189:9;3180:7;3176:23;3172:33;3169:53;;;3218:1;3215;3208:12;3169:53;3254:9;3241:23;3231:33;;3311:2;3300:9;3296:18;3283:32;3273:42;;3366:2;3355:9;3351:18;3338:32;3393:18;3385:6;3382:30;3379:50;;;3425:1;3422;3415:12;3379:50;3448:61;3501:7;3492:6;3481:9;3477:22;3448:61;:::i;:::-;3438:71;;;3528:38;3562:2;3551:9;3547:18;3528:38;:::i;:::-;3518:48;;3013:559;;;;;;;:::o;3577:328::-;3654:6;3662;3670;3723:2;3711:9;3702:7;3698:23;3694:32;3691:52;;;3739:1;3736;3729:12;3691:52;3762:29;3781:9;3762:29;:::i;:::-;3752:39;;3810:38;3844:2;3833:9;3829:18;3810:38;:::i;:::-;3800:48;;3895:2;3884:9;3880:18;3867:32;3857:42;;3577:328;;;;;:::o;4512:334::-;4589:6;4597;4605;4658:2;4646:9;4637:7;4633:23;4629:32;4626:52;;;4674:1;4671;4664:12;4626:52;4697:29;4716:9;4697:29;:::i;:::-;4687:39;;4745:38;4779:2;4768:9;4764:18;4745:38;:::i;:::-;4735:48;;4802:38;4836:2;4825:9;4821:18;4802:38;:::i;:::-;4792:48;;4512:334;;;;;:::o;4851:186::-;4910:6;4963:2;4951:9;4942:7;4938:23;4934:32;4931:52;;;4979:1;4976;4969:12;4931:52;5002:29;5021:9;5002:29;:::i;5042:385::-;5128:6;5136;5144;5152;5205:3;5193:9;5184:7;5180:23;5176:33;5173:53;;;5222:1;5219;5212:12;5173:53;-1:-1:-1;;5245:23:1;;;5315:2;5300:18;;5287:32;;-1:-1:-1;5366:2:1;5351:18;;5338:32;;5417:2;5402:18;5389:32;;-1:-1:-1;5042:385:1;-1:-1:-1;5042:385:1:o;5432:1039::-;5527:6;5535;5543;5551;5604:3;5592:9;5583:7;5579:23;5575:33;5572:53;;;5621:1;5618;5611:12;5572:53;5644:29;5663:9;5644:29;:::i;:::-;5634:39;;5692:2;5741;5730:9;5726:18;5713:32;5703:42;;5764:38;5798:2;5787:9;5783:18;5764:38;:::i;:::-;5754:48;;5853:2;5842:9;5838:18;5825:32;5876:18;5917:2;5909:6;5906:14;5903:34;;;5933:1;5930;5923:12;5903:34;5971:6;5960:9;5956:22;5946:32;;6016:7;6009:4;6005:2;6001:13;5997:27;5987:55;;6038:1;6035;6028:12;5987:55;6074:2;6061:16;6096:2;6092;6089:10;6086:36;;;6102:18;;:::i;:::-;6144:112;6252:2;6183:66;6176:4;6172:2;6168:13;6164:86;6160:95;6144:112;:::i;:::-;6131:125;;6279:2;6272:5;6265:17;6319:7;6314:2;6309;6305;6301:11;6297:20;6294:33;6291:53;;;6340:1;6337;6330:12;6291:53;6395:2;6390;6386;6382:11;6377:2;6370:5;6366:14;6353:45;6439:1;6434:2;6429;6422:5;6418:14;6414:23;6407:34;;6460:5;6450:15;;;;;5432:1039;;;;;;;:::o;6476:316::-;6553:6;6561;6569;6622:2;6610:9;6601:7;6597:23;6593:32;6590:52;;;6638:1;6635;6628:12;6590:52;-1:-1:-1;;6661:23:1;;;6731:2;6716:18;;6703:32;;-1:-1:-1;6782:2:1;6767:18;;;6754:32;;6476:316;-1:-1:-1;6476:316:1:o;6797:732::-;6933:6;6941;6949;6957;7010:3;6998:9;6989:7;6985:23;6981:33;6978:53;;;7027:1;7024;7017:12;6978:53;7063:9;7050:23;7040:33;;7120:2;7109:9;7105:18;7092:32;7082:42;;7175:2;7164:9;7160:18;7147:32;7198:18;7239:2;7231:6;7228:14;7225:34;;;7255:1;7252;7245:12;7225:34;7278:61;7331:7;7322:6;7311:9;7307:22;7278:61;:::i;:::-;7268:71;;7392:2;7381:9;7377:18;7364:32;7348:48;;7421:2;7411:8;7408:16;7405:36;;;7437:1;7434;7427:12;7405:36;;7460:63;7515:7;7504:8;7493:9;7489:24;7460:63;:::i;:::-;7450:73;;;6797:732;;;;;;;:::o;7534:260::-;7602:6;7610;7663:2;7651:9;7642:7;7638:23;7634:32;7631:52;;;7679:1;7676;7669:12;7631:52;7702:29;7721:9;7702:29;:::i;:::-;7692:39;;7750:38;7784:2;7773:9;7769:18;7750:38;:::i;:::-;7740:48;;7534:260;;;;;:::o;7799:322::-;7876:6;7884;7892;7945:2;7933:9;7924:7;7920:23;7916:32;7913:52;;;7961:1;7958;7951:12;7913:52;7997:9;7984:23;7974:33;;8054:2;8043:9;8039:18;8026:32;8016:42;;8077:38;8111:2;8100:9;8096:18;8077:38;:::i;8126:437::-;8205:1;8201:12;;;;8248;;;8269:61;;8323:4;8315:6;8311:17;8301:27;;8269:61;8376:2;8368:6;8365:14;8345:18;8342:38;8339:218;;;8413:77;8410:1;8403:88;8514:4;8511:1;8504:15;8542:4;8539:1;8532:15;8339:218;;8126:437;;;:::o;8568:184::-;8620:77;8617:1;8610:88;8717:4;8714:1;8707:15;8741:4;8738:1;8731:15;8757:128;8797:3;8828:1;8824:6;8821:1;8818:13;8815:39;;;8834:18;;:::i;:::-;-1:-1:-1;8870:9:1;;8757:128::o;8890:184::-;8942:77;8939:1;8932:88;9039:4;9036:1;9029:15;9063:4;9060:1;9053:15;9079:195;9118:3;9149:66;9142:5;9139:77;9136:103;;;9219:18;;:::i;:::-;-1:-1:-1;9266:1:1;9255:13;;9079:195::o;9279:482::-;9368:1;9411:5;9368:1;9425:330;9446:7;9436:8;9433:21;9425:330;;;9565:4;9497:66;9493:77;9487:4;9484:87;9481:113;;;9574:18;;:::i;:::-;9624:7;9614:8;9610:22;9607:55;;;9644:16;;;;9607:55;9723:22;;;;9683:15;;;;9425:330;;;9429:3;9279:482;;;;;:::o;9766:866::-;9815:5;9845:8;9835:80;;-1:-1:-1;9886:1:1;9900:5;;9835:80;9934:4;9924:76;;-1:-1:-1;9971:1:1;9985:5;;9924:76;10016:4;10034:1;10029:59;;;;10102:1;10097:130;;;;10009:218;;10029:59;10059:1;10050:10;;10073:5;;;10097:130;10134:3;10124:8;10121:17;10118:43;;;10141:18;;:::i;:::-;-1:-1:-1;;10197:1:1;10183:16;;10212:5;;10009:218;;10311:2;10301:8;10298:16;10292:3;10286:4;10283:13;10279:36;10273:2;10263:8;10260:16;10255:2;10249:4;10246:12;10242:35;10239:77;10236:159;;;-1:-1:-1;10348:19:1;;;10380:5;;10236:159;10427:34;10452:8;10446:4;10427:34;:::i;:::-;10557:6;10489:66;10485:79;10476:7;10473:92;10470:118;;;10568:18;;:::i;:::-;10606:20;;9766:866;-1:-1:-1;;;9766:866:1:o;10637:131::-;10697:5;10726:36;10753:8;10747:4;10726:36;:::i;10773:228::-;10813:7;10939:1;10871:66;10867:74;10864:1;10861:81;10856:1;10849:9;10842:17;10838:105;10835:131;;;10946:18;;:::i;:::-;-1:-1:-1;10986:9:1;;10773:228::o;11345:184::-;11397:77;11394:1;11387:88;11494:4;11491:1;11484:15;11518:4;11515:1;11508:15;11534:184;11586:77;11583:1;11576:88;11683:4;11680:1;11673:15;11707:4;11704:1;11697:15;11723:120;11763:1;11789;11779:35;;11794:18;;:::i;:::-;-1:-1:-1;11828:9:1;;11723:120::o;12549:277::-;12616:6;12669:2;12657:9;12648:7;12644:23;12640:32;12637:52;;;12685:1;12682;12675:12;12637:52;12717:9;12711:16;12770:5;12763:13;12756:21;12749:5;12746:32;12736:60;;12792:1;12789;12782:12;13597:112;13629:1;13655;13645:35;;13660:18;;:::i;:::-;-1:-1:-1;13694:9:1;;13597:112::o;14425:184::-;14495:6;14548:2;14536:9;14527:7;14523:23;14519:32;14516:52;;;14564:1;14561;14554:12;14516:52;-1:-1:-1;14587:16:1;;14425:184;-1:-1:-1;14425:184:1:o;15010:125::-;15050:4;15078:1;15075;15072:8;15069:34;;;15083:18;;:::i;:::-;-1:-1:-1;15120:9:1;;15010:125::o;15140:140::-;15198:5;15227:47;15268:4;15258:8;15254:19;15248:4;15227:47;:::i

Swarm Source

ipfs://bb03436d9d65562d4e1d802ec17043fb29bc5e7165ef1bc37d740d60a44194e7
Loading