ETH Price: $2,414.20 (-0.02%)

Contract

0x094C3492c21f11942e4AfB42B26449ac88BD53A8
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Add Tree Trait T...141543922022-02-06 19:29:15972 days ago1644175755IN
0x094C3492...c88BD53A8
0 ETH0.0056995464.85158198
Add Tree Trait T...141543892022-02-06 19:28:58972 days ago1644175738IN
0x094C3492...c88BD53A8
0 ETH0.0059979768.24723213
Add Tree Trait T...141440332022-02-05 5:14:05973 days ago1644038045IN
0x094C3492...c88BD53A8
0 ETH0.035996481.14316175
Add Tree Trait T...141440332022-02-05 5:14:05973 days ago1644038045IN
0x094C3492...c88BD53A8
0 ETH0.035996481.14316175
Add Tree Trait T...141440322022-02-05 5:13:28973 days ago1644038008IN
0x094C3492...c88BD53A8
0 ETH0.0336697575.89842582
Add Tree Trait T...141440322022-02-05 5:13:28973 days ago1644038008IN
0x094C3492...c88BD53A8
0 ETH0.0377382975.89842582
Add Tree Trait T...141440322022-02-05 5:13:28973 days ago1644038008IN
0x094C3492...c88BD53A8
0 ETH0.0336688475.89842582
Set Tree Legenda...141436642022-02-05 3:47:05973 days ago1644032825IN
0x094C3492...c88BD53A8
0 ETH0.2865826468.23978006
Set Tree Colors ...141436642022-02-05 3:47:05973 days ago1644032825IN
0x094C3492...c88BD53A8
0 ETH0.2839244368.23978006
Set Tree Ecoz141436252022-02-05 3:37:55973 days ago1644032275IN
0x094C3492...c88BD53A8
0 ETH0.0035466777.00462702
0x60806040141309942022-02-03 4:52:55975 days ago1643863975IN
 Create: BananaTreesURI
0 ETH0.220492966.31277684

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BananaTreesURI

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2022-02-03
*/

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0;

/// @title Base64
/// @author Brecht Devos - <[email protected]>
/// @notice Provides functions for encoding/decoding base64
library Base64 {
    string internal constant TABLE_ENCODE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    bytes  internal constant TABLE_DECODE = hex"0000000000000000000000000000000000000000000000000000000000000000"
                                            hex"00000000000000000000003e0000003f3435363738393a3b3c3d000000000000"
                                            hex"00000102030405060708090a0b0c0d0e0f101112131415161718190000000000"
                                            hex"001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132330000000000";

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return '';

        // load the table into memory
        string memory table = TABLE_ENCODE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 3 bytes at a time
            for {} lt(dataPtr, endPtr) {}
            {
                // read 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // write 4 characters
                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr( 6, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(        input,  0x3F))))
                resultPtr := add(resultPtr, 1)
            }

            // padding with '='
            switch mod(mload(data), 3)
            case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
            case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }
        }

        return result;
    }

    function decode(string memory _data) internal pure returns (bytes memory) {
        bytes memory data = bytes(_data);

        if (data.length == 0) return new bytes(0);
        require(data.length % 4 == 0, "invalid base64 decoder input");

        // load the table into memory
        bytes memory table = TABLE_DECODE;

        // every 4 characters represent 3 bytes
        uint256 decodedLen = (data.length / 4) * 3;

        // add some extra buffer at the end required for the writing
        bytes memory result = new bytes(decodedLen + 32);

        assembly {
            // padding with '='
            let lastBytes := mload(add(data, mload(data)))
            if eq(and(lastBytes, 0xFF), 0x3d) {
                decodedLen := sub(decodedLen, 1)
                if eq(and(lastBytes, 0xFFFF), 0x3d3d) {
                    decodedLen := sub(decodedLen, 1)
                }
            }

            // set the actual output length
            mstore(result, decodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 4 characters at a time
            for {} lt(dataPtr, endPtr) {}
            {
               // read 4 characters
               dataPtr := add(dataPtr, 4)
               let input := mload(dataPtr)

               // write 3 bytes
               let output := add(
                   add(
                       shl(18, and(mload(add(tablePtr, and(shr(24, input), 0xFF))), 0xFF)),
                       shl(12, and(mload(add(tablePtr, and(shr(16, input), 0xFF))), 0xFF))),
                   add(
                       shl( 6, and(mload(add(tablePtr, and(shr( 8, input), 0xFF))), 0xFF)),
                               and(mload(add(tablePtr, and(        input , 0xFF))), 0xFF)
                    )
                )
                mstore(resultPtr, shl(232, output))
                resultPtr := add(resultPtr, 3)
            }
        }

        return result;
    }
}


pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}


pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


pragma solidity >=0.7.0 <0.9.0;

library Library {
    string internal constant TABLE =
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return "";

        // load the table into memory
        string memory table = TABLE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)
            
            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))
            
            // result ptr, jump over length
            let resultPtr := add(result, 32)
            
            // run over the input, 3 bytes at a time
            for {
            
            } lt(dataPtr, endPtr) {
            
            } {
                dataPtr := add(dataPtr, 3)

                // read 3 bytes
                let input := mload(dataPtr)

                // write 4 characters
                mstore(
                    resultPtr,
                    shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
                mstore(
                    resultPtr,
                    shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
                mstore(
                    resultPtr,
                    shl(248, mload(add(tablePtr, and(shr(6, input), 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
                mstore(
                    resultPtr,
                    shl(248, mload(add(tablePtr, and(input, 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
            }

            // padding with '='
            switch mod(mload(data), 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }
        }

        return result;
    }
    
    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    function parseInt(string memory _a)
        internal
        pure
        returns (uint8 _parsedInt)
    {
        bytes memory bresult = bytes(_a);
        uint8 mint = 0;
        for (uint8 i = 0; i < bresult.length; i++) {
            if (
                (uint8(uint8(bresult[i])) >= 48) &&
                (uint8(uint8(bresult[i])) <= 57)
            ) {
                mint *= 10;
                mint += uint8(bresult[i]) - 48;
            }
        }
        return mint;
    }
    
    function substring(
        string memory str,
        uint256 startIndex,
        uint256 endIndex
    ) internal pure returns (string memory) {
        bytes memory strBytes = bytes(str);
        bytes memory result = new bytes(endIndex - startIndex);
        for (uint256 i = startIndex; i < endIndex; i++) {
            result[i - startIndex] = strBytes[i];
        }
        return string(result);
    }
}

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

interface IEcoz {}

contract BananaTreesURI is Ownable {
    IEcoz public ecozContract;
    
    uint256 traitCount = 5;
    uint256 babyTraitCount = 5;

    uint8 randI = 0;

    string []Colors;

    //Encode pixel colors and locations using a 3 digit code per pixel
    string[] LETTERS;
  
    struct Trait {
        string traitName;
        string traitType;
        string pixels;
        uint256 pixelCount;
    }

    bool public revealed = false;

    string[4] Leg;

    mapping (uint256 => Trait[]) public traitTypes;
    
    mapping (uint256 => Trait[]) public babyTraitTypes;

    mapping (uint256 => string) treeIDToHash;

    mapping (uint256 => uint256) traitTypeCount;
    
    mapping (uint256 => uint256) babyTraitTypeCount;

    function traitGenerator(uint256 thisTraitCount, uint256 traitProbability) internal view returns(uint256) {
        uint256 thisTrait;

        if (traitProbability >= 8000 && traitProbability < 10000) {//common
            thisTrait = 0;
        }   
        else if (traitProbability >=6000 && traitProbability < 8000) {//common
            if(thisTraitCount < 2) {
                thisTrait = 1 % thisTraitCount;
            }
            else {
                thisTrait = 1;
            }
        }
        else if (traitProbability >=4750 && traitProbability < 6000) {//uncommon
            if(thisTraitCount < 3) {
                thisTrait = 2 % thisTraitCount;
            }
            else {
                thisTrait = 2;
            }
        }
        else if (traitProbability >=3500 && traitProbability < 4750) {//uncommon
            if(thisTraitCount < 4) {
                thisTrait = 3 % thisTraitCount;
            }
            else {
                thisTrait = 3;
            }
            
        }
        else if (traitProbability >=2750 && traitProbability < 3500) {//rare
            if(thisTraitCount < 5) {
                thisTrait = 4 % thisTraitCount;
            }
            else {
                thisTrait = 4;
            }
        }
        else if (traitProbability >=2000 && traitProbability < 2750) {//rare
            if(thisTraitCount < 6) {
                thisTrait = 5 % thisTraitCount;
            }
            else {
                thisTrait = 5;
            }
        }
        else if (traitProbability >=1250 && traitProbability < 2000) {//rare
            if(thisTraitCount < 7) {
                thisTrait = 6 % thisTraitCount;
            }
            else {
                thisTrait = 6;
            }
        }
        else if (traitProbability >=750 && traitProbability < 1250) {//super rare
            if(thisTraitCount < 8) {
                thisTrait = 7 % thisTraitCount;
            }
            else {
                thisTrait = 7;
            }
        }
        else if (traitProbability >=250 && traitProbability < 750) {//super rare
            if(traitCount < 9) {
                thisTrait = 8 % thisTraitCount;
            }
            else {
                thisTrait = 8;
            }
        }
        else if (traitProbability >=0 && traitProbability < 250) {//legendary
            if(thisTraitCount < 10) {
                thisTrait = 9 % thisTraitCount;
            }
            else {
                thisTrait = 9;
            }
        }
        return thisTrait;
    }
    
    function treeRandomizer(address user, uint256 treeID) external returns(uint256) {
        require(msg.sender == address(ecozContract));
        uint256 thisTrait;
        if (treeID <= 5850 && treeID > 4053) {
            uint256 value = 7;

            for (uint256 i = 0; i < traitCount; i++) {
                uint256 rand = random(user, treeID);
                thisTrait = traitGenerator(traitTypeCount[i], rand);

                if (i != 3) {
                    treeIDToHash[treeID] = string(abi.encodePacked(treeIDToHash[treeID], Library.toString(thisTrait)));              
                }
                else {
                    treeIDToHash[treeID] = string(abi.encodePacked(treeIDToHash[treeID], Library.toString(thisTrait), Library.toString(thisTrait)));
                    i++;
                }
                value = value + thisTrait;
            }
            if (value < 16) {
                return 5;
            }
            else if (value >= 16 && value < 20) {
                return 6;
            }
            else {
                return 7;
            }
        }
        else if (treeID > 5850) {
            for (uint256 i = 0; i < babyTraitCount; i++) {
                uint256 rand = random(user, treeID);
                treeIDToHash[treeID] = string(abi.encodePacked(treeIDToHash[treeID], Library.toString(traitGenerator(babyTraitTypeCount[i], rand))));
            }
            return 0;
        }
        else {
            return 7;
        }
    } 

    function random(address user, uint256 treeID) internal returns (uint256) {
        randI = randI + 1;
        
        if (randI >= 10) {
            randI = 0;
        }
        return uint256(keccak256(abi.encodePacked(block.difficulty, block.timestamp, user, treeID, randI))) % 10000;
    }

    function letterToNumber(string memory _inputLetter) internal view returns (uint8) {
        for (uint8 i = 0; i < LETTERS.length; i++) {   

            if (keccak256(abi.encodePacked((LETTERS[i]))) ==keccak256(abi.encodePacked((_inputLetter)))) return (i);
        }
        revert();
    }
        
    function letterToColor(string memory _inputLetter) internal view returns (string memory) {
        for (uint8 i = 0; i < LETTERS.length; i++) {

            if (keccak256(abi.encodePacked((LETTERS[i]))) == keccak256(abi.encodePacked((_inputLetter)))) {
                return Colors[i];
                }
            }
            revert();
    }

    function bananaTreeTokenURI(uint256 treeID, uint256 treeWeight) external view virtual returns(string memory) {
        require(msg.sender == address(ecozContract));

        if (treeID <= 5850) {
            string memory metadataString = '{"trait_type":"Species","value":"Banana Tree"},';
            string memory svgString;
            bool[32][32] memory placedPixels;
            uint256 count;
            string memory thisPixel;
            string memory thisTrait;
            uint8 thisTraitIndex;
            string memory BGcolor = 'B6EAFF';

            if (revealed == false && treeID > 4053) {
                thisTrait = Leg[3];
                metadataString = string(abi.encodePacked(metadataString,'{"trait_type":"','Status','","value":"','Unrevealed''"}'));
                BGcolor = '6c6c6c';
                count = bytes(Leg[3]).length / 3;

                for (uint16 j = 0; j < count; j++) {
                    thisPixel = Library.substring(thisTrait, j * 3, j * 3 + 3);
                    uint8 x = letterToNumber(Library.substring(thisPixel, 0, 1));
                    uint8 y = letterToNumber(Library.substring(thisPixel, 1, 2));
            
                    if (placedPixels[x][y]) continue;
            
                    svgString = string(abi.encodePacked(svgString,"<rect fill='#",letterToColor(Library.substring(thisPixel, 2, 3)),"' x='",Library.toString(x),"' y='",Library.toString(y),"'/>"));
                    placedPixels[x][y] = true;
                }

                svgString = string(
                Library.encode(bytes(abi.encodePacked(
                '<svg id="ecoz-svg" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 32 32"> <rect class="bg" x="0" y="0" />',
                svgString,
                '<style>rect.bg{width:32px;height:32px;fill:#',BGcolor,'} rect{width:1px;height:1px;} #ecoz-svg{shape-rendering: crispedges;} </style></svg>'
                )))
                );

                return string(abi.encodePacked(
                    'data:application/json;base64,',Base64.encode(bytes(abi.encodePacked(
                    '{"name":',
                    '"Banana Tree #',
                    Library.toString(treeID),
                    '", "description":"',
                    "The Banana Tree Ecoz is the abundant producer of the Ecozystem. Their population stays strong and fruitful unless the Bush Bucks get too hungry...",
                    '", "image": "',
                    'data:image/svg+xml;base64,',
                    svgString,'",',
                     '"attributes": [',
                    metadataString,']',
                    '}')))));      
            }     

            if (treeID == 4051) {
                thisTrait = Leg[0];
                metadataString = string(abi.encodePacked(metadataString,'{"trait_type":"','1/1','","value":"','Treedenza''"},','{"trait_type":"','Generation','","value":"','Genesis''"},','{"trait_type":"','Thrive Production','","value":"',Library.toString(treeWeight),'"}'));
                BGcolor = 'e0d195';
            }

            else if (treeID == 4052) {
                thisTrait = Leg[1];
                metadataString = string(abi.encodePacked(metadataString,'{"trait_type":"','1/1','","value":"','Alien''"},','{"trait_type":"','Generation','","value":"','Genesis''"},','{"trait_type":"','Thrive Production','","value":"',Library.toString(treeWeight),'"}'));
                BGcolor = '98e2bb';
            }

            else if (treeID == 4053) {
                thisTrait = Leg[2];
                metadataString = string(abi.encodePacked(metadataString,'{"trait_type":"','1/1','","value":"','Bubble Gum Blossom''"},','{"trait_type":"','Generation','","value":"','Genesis''"},','{"trait_type":"','Thrive Production','","value":"',Library.toString(treeWeight),'"}'));
                BGcolor = '4e3e6f';
            }
            else {
                metadataString = string(abi.encodePacked(metadataString,'{"trait_type":"','Generation','","value":"','Genesis''"},','{"trait_type":"','Thrive Production','","value":"',Library.toString(treeWeight),'"},'));
            }
            
            //Get the metadata from the Traits using the hash
            if (treeID > 4053) {
                for (uint256 i = 0; i < traitCount; i++) {
                    if (i != 4) {
                        thisTraitIndex = Library.parseInt(Library.substring(treeIDToHash[treeID], i, i + 1));
                        metadataString = string(abi.encodePacked(metadataString,'{"trait_type":"',traitTypes[i][thisTraitIndex].traitType,'","value":"',traitTypes[i][thisTraitIndex].traitName,'"}'));
                    }
                    
                    if (i != 3 && i != 4) {
                        metadataString = string(abi.encodePacked(metadataString, ","));
                    }
                }
            } 
            
            //Get the SVG from the Traits using the hash
            for (uint256 i = traitCount-1; i >=0 ; i--) {
                if (treeID > 4053) {
                    thisTraitIndex = Library.parseInt(Library.substring(treeIDToHash[treeID], i, i + 1));
                    count = traitTypes[i][thisTraitIndex].pixelCount;
                }
                else {
                    if (treeID == 4051) {
                        count = bytes(Leg[0]).length / 3;
                    }
                    else if (treeID == 4052) {
                        count = bytes(Leg[1]).length / 3;
                    }
                    else if (treeID == 4053) {
                        count = bytes(Leg[2]).length / 3;
                    }
                }

                for (uint16 j = 0; j < count; j++) {
                    if (treeID < 4054) {
                        thisPixel = Library.substring(thisTrait, j * 3, j * 3 + 3);
                    }
                    else {
                        thisPixel = Library.substring(traitTypes[i][thisTraitIndex].pixels, j * 3, j * 3 + 3);
                    }

                    uint8 x = letterToNumber(Library.substring(thisPixel, 0, 1));
                    uint8 y = letterToNumber(Library.substring(thisPixel, 1, 2));
            
                    if (placedPixels[x][y]) continue;
            
                    svgString = string(abi.encodePacked(svgString,"<rect fill='#",letterToColor(Library.substring(thisPixel, 2, 3)),"' x='",Library.toString(x),"' y='",Library.toString(y),"'/>"));
                    placedPixels[x][y] = true;
                }

                if (i == 0 || treeID < 4054) {
                    break;
                }
            }
                

            svgString = string(
                Library.encode(bytes(abi.encodePacked(
                '<svg id="ecoz-svg" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 32 32"> <rect class="bg" x="0" y="0" />',
                svgString,
                '<style>rect.bg{width:32px;height:32px;fill:#',BGcolor,'} rect{width:1px;height:1px;} #ecoz-svg{shape-rendering: crispedges;} </style></svg>'
                )))
                );

            return string(abi.encodePacked(
                'data:application/json;base64,',Base64.encode(bytes(abi.encodePacked(
                '{"name":',
                '"Banana Tree #',
                Library.toString(treeID),
                '", "description":"',
                "The Banana Tree Ecoz is the abundant producer of the Ecozystem. Their population stays strong and fruitful unless the Bush Bucks get too hungry...",
                '", "image": "',
                'data:image/svg+xml;base64,',
                svgString,'",',
                 '"attributes": [',
                metadataString,']',
                '}')))));
        }
        else {
            string memory metadataString = '{"trait_type":"Species","value":"Banana Tree"},';
            string memory svgString;
            bool[32][32] memory placedPixels;
            uint256 count;
            string memory thisPixel;
            uint8 thisTraitIndex;
            string memory BGcolor = 'B6EAFF';
            metadataString = string(abi.encodePacked(metadataString,'{"trait_type":"','Generation','","value":"','Baby''"},'));

            //Get the metadata from the Traits using the hash
            for (uint256 i = 0; i < babyTraitCount; i++) {
                thisTraitIndex = Library.parseInt(Library.substring(treeIDToHash[treeID], i, i + 1));
                metadataString = string(abi.encodePacked(metadataString,'{"trait_type":"',babyTraitTypes[i][thisTraitIndex].traitType,'","value":"',babyTraitTypes[i][thisTraitIndex].traitName,'"}'));
                    
                if (i != babyTraitCount-1) {
                    metadataString = string(abi.encodePacked(metadataString, ","));
                }
            }
            
            //Get the SVG from the Traits using the hash
            for (uint256 i = babyTraitCount-1; i >=0; i--) {
                thisTraitIndex = Library.parseInt(Library.substring(treeIDToHash[treeID], i, i + 1));
                count = babyTraitTypes[i][thisTraitIndex].pixelCount;

                for (uint16 j = 0; j < count; j++) {
                    thisPixel = Library.substring(babyTraitTypes[i][thisTraitIndex].pixels, j * 3, j * 3 + 3);
                    uint8 x = letterToNumber(Library.substring(thisPixel, 0, 1));
                    uint8 y = letterToNumber(Library.substring(thisPixel, 1, 2));

                    if (placedPixels[x][y]) continue;

                    svgString = string(abi.encodePacked(svgString,"<rect fill='#",letterToColor(Library.substring(thisPixel, 2, 3)),"' x='",Library.toString(x),"' y='",Library.toString(y),"'/>"));
                    placedPixels[x][y] = true;
                }

                if (i == 0) {
                    break;
                }
            }
        

            svgString = string(
                Library.encode(bytes(abi.encodePacked(
                '<svg id="ecoz-svg" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 32 32"> <rect class="bg" x="0" y="0" />',
                svgString,
                '<style>rect.bg{width:32px;height:32px;fill:#',BGcolor,'} rect{width:1px;height:1px;} #ecoz-svg{shape-rendering: crispedges;} </style></svg>'
                )))
                );

            return string(abi.encodePacked(
                'data:application/json;base64,',Base64.encode(bytes(abi.encodePacked(
                '{"name":',
                '"Banana Tree #',
                Library.toString(treeID),
                '", "description":"',
                "The Banana Tree Ecoz is the abundant producer of the Ecozystem. Their population stays strong and fruitful unless the Bush Bucks get too hungry...",
                '", "image": "',
                'data:image/svg+xml;base64,',
                svgString,'",',
                 '"attributes": [',
                metadataString,']',
                '}')))));    
        }
    }

    function setTreeLegendary(string memory leg1, string memory leg2, string memory leg3, string memory unrevealed) public onlyOwner {
        Leg[0] = leg1;
        Leg[1] = leg2;
        Leg[2] = leg3;
        Leg[3] = unrevealed;
        return;
    }
    
    function setTreeColorsLETTERS(string[87] memory colors, string[87] memory letters) public onlyOwner {
        Colors = colors;
        LETTERS = letters;
        return;
    }

    function addTreeTraitType(uint256 _traitTypeIndex, Trait[] memory traits) public onlyOwner {
        for (uint256 i = 0; i < traits.length; i++) {
            traitTypes[_traitTypeIndex].push(
                Trait(
                    traits[i].traitName,
                    traits[i].traitType,
                    traits[i].pixels,
                    traits[i].pixelCount
                )
            );
        }
        
        traitTypeCount[_traitTypeIndex] = traitTypeCount[_traitTypeIndex] + traits.length;

        return;
    }

    function addBabyTreeTraitType(uint256 _traitTypeIndex, Trait[] memory traits) public onlyOwner {
        for (uint256 i = 0; i < traits.length; i++) {
            babyTraitTypes[_traitTypeIndex].push(
                Trait(
                    traits[i].traitName,
                    traits[i].traitType,
                    traits[i].pixels,
                    traits[i].pixelCount
                )
            );
        }
        babyTraitTypeCount[_traitTypeIndex] = babyTraitTypeCount[_traitTypeIndex] + traits.length;

        return;
    }

    function clearTraitType(uint256 index) public onlyOwner {
        delete traitTypes[index];
        traitTypeCount[index] = 0;
        return;
    }
    function clearBabyTraitType(uint256 index) public onlyOwner {
        delete babyTraitTypes[index];
        babyTraitTypeCount[index] = 0;
        return;
    }

    function setTreeEcoz(address ecozAddress) external onlyOwner {
        ecozContract = IEcoz(ecozAddress);
        return;
    }
    
    function reveal() public onlyOwner {
        revealed = true;
        return;
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"uint256","name":"_traitTypeIndex","type":"uint256"},{"components":[{"internalType":"string","name":"traitName","type":"string"},{"internalType":"string","name":"traitType","type":"string"},{"internalType":"string","name":"pixels","type":"string"},{"internalType":"uint256","name":"pixelCount","type":"uint256"}],"internalType":"struct BananaTreesURI.Trait[]","name":"traits","type":"tuple[]"}],"name":"addBabyTreeTraitType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_traitTypeIndex","type":"uint256"},{"components":[{"internalType":"string","name":"traitName","type":"string"},{"internalType":"string","name":"traitType","type":"string"},{"internalType":"string","name":"pixels","type":"string"},{"internalType":"uint256","name":"pixelCount","type":"uint256"}],"internalType":"struct BananaTreesURI.Trait[]","name":"traits","type":"tuple[]"}],"name":"addTreeTraitType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"babyTraitTypes","outputs":[{"internalType":"string","name":"traitName","type":"string"},{"internalType":"string","name":"traitType","type":"string"},{"internalType":"string","name":"pixels","type":"string"},{"internalType":"uint256","name":"pixelCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"treeID","type":"uint256"},{"internalType":"uint256","name":"treeWeight","type":"uint256"}],"name":"bananaTreeTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"clearBabyTraitType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"clearTraitType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ecozContract","outputs":[{"internalType":"contract IEcoz","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string[87]","name":"colors","type":"string[87]"},{"internalType":"string[87]","name":"letters","type":"string[87]"}],"name":"setTreeColorsLETTERS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ecozAddress","type":"address"}],"name":"setTreeEcoz","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"leg1","type":"string"},{"internalType":"string","name":"leg2","type":"string"},{"internalType":"string","name":"leg3","type":"string"},{"internalType":"string","name":"unrevealed","type":"string"}],"name":"setTreeLegendary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"traitTypes","outputs":[{"internalType":"string","name":"traitName","type":"string"},{"internalType":"string","name":"traitType","type":"string"},{"internalType":"string","name":"pixels","type":"string"},{"internalType":"uint256","name":"pixelCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"treeID","type":"uint256"}],"name":"treeRandomizer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]

6080604052600560028190556003556004805460ff199081169091556007805490911690553480156200003157600080fd5b506200003d3362000043565b62000093565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6139d480620000a36000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c80639e35277c116100a2578063d0df1d1411610071578063d0df1d1414610223578063d5926a3714610236578063d8e6545d14610249578063f2fde38b1461025c578063f54f30ba1461026f57600080fd5b80639e35277c146101d4578063a475b5dd146101e7578063b5ebe114146101ef578063c60a426a1461021057600080fd5b80636790461a116100de5780636790461a14610181578063715018a6146101945780638d2a4d131461019c5780638da5cb5b146101af57600080fd5b80632fb098d2146101105780633223bbe81461013c578063518302271461015157806356691c9a1461016e575b600080fd5b61012361011e366004612b68565b61028f565b60405161013394939291906135f4565b60405180910390f35b61014f61014a366004612946565b610474565b005b60075461015e9060ff1681565b6040519015158152602001610133565b61012361017c366004612b68565b6104fe565b61014f61018f3660046129f3565b61051a565b61014f61056e565b61014f6101aa366004612a0c565b6105a4565b6000546001600160a01b03165b6040516001600160a01b039091168152602001610133565b61014f6101e2366004612a0c565b610735565b61014f6108c6565b6102026101fd3660046128b8565b6108ff565b604051908152602001610133565b61014f61021e3660046129f3565b610b68565b61014f61023136600461289d565b610bba565b6001546101bc906001600160a01b031681565b61014f6102573660046128e2565b610c04565b61014f61026a36600461289d565b610c4e565b61028261027d366004612b68565b610ce6565b60405161013391906135e1565b600c60205281600052604060002081815481106102ab57600080fd5b9060005260206000209060040201600091509150508060000180546102cf9061382b565b80601f01602080910402602001604051908101604052809291908181526020018280546102fb9061382b565b80156103485780601f1061031d57610100808354040283529160200191610348565b820191906000526020600020905b81548152906001019060200180831161032b57829003601f168201915b50505050509080600101805461035d9061382b565b80601f01602080910402602001604051908101604052809291908181526020018280546103899061382b565b80156103d65780601f106103ab576101008083540402835291602001916103d6565b820191906000526020600020905b8154815290600101906020018083116103b957829003601f168201915b5050505050908060020180546103eb9061382b565b80601f01602080910402602001604051908101604052809291908181526020018280546104179061382b565b80156104645780601f1061043957610100808354040283529160200191610464565b820191906000526020600020905b81548152906001019060200180831161044757829003601f168201915b5050505050908060030154905084565b6000546001600160a01b031633146104a75760405162461bcd60e51b815260040161049e9061363f565b60405180910390fd5b83516104ba906008906020870190612580565b5082516104ce906009906020860190612580565b5081516104e290600a906020850190612580565b5080516104f690600b906020840190612580565b505b50505050565b600d60205281600052604060002081815481106102ab57600080fd5b6000546001600160a01b031633146105445760405162461bcd60e51b815260040161049e9061363f565b6000818152600d6020526040812061055b91612604565b6000818152601060205260408120555b50565b6000546001600160a01b031633146105985760405162461bcd60e51b815260040161049e9061363f565b6105a26000611b87565b565b6000546001600160a01b031633146105ce5760405162461bcd60e51b815260040161049e9061363f565b60005b815181101561070657600d6000848152602001908152602001600020604051806080016040528084848151811061060a5761060a613903565b602002602001015160000151815260200184848151811061062d5761062d613903565b602002602001015160200151815260200184848151811061065057610650613903565b602002602001015160400151815260200184848151811061067357610673613903565b602090810291909101810151606001519091528254600181018455600093845292819020825180519394600402909101926106b19284920190612580565b5060208281015180516106ca9260018501920190612580565b50604082015180516106e6916002840191602090910190612580565b5060608201518160030155505080806106fe90613888565b9150506105d1565b50805160008381526010602052604090205461072291906136eb565b6000838152601060205260409020555050565b6000546001600160a01b0316331461075f5760405162461bcd60e51b815260040161049e9061363f565b60005b815181101561089757600c6000848152602001908152602001600020604051806080016040528084848151811061079b5761079b613903565b60200260200101516000015181526020018484815181106107be576107be613903565b60200260200101516020015181526020018484815181106107e1576107e1613903565b602002602001015160400151815260200184848151811061080457610804613903565b602090810291909101810151606001519091528254600181018455600093845292819020825180519394600402909101926108429284920190612580565b50602082810151805161085b9260018501920190612580565b5060408201518051610877916002840191602090910190612580565b50606082015181600301555050808061088f90613888565b915050610762565b5080516000838152600f60205260409020546108b391906136eb565b6000838152600f60205260409020555050565b6000546001600160a01b031633146108f05760405162461bcd60e51b815260040161049e9061363f565b6007805460ff19166001179055565b6001546000906001600160a01b0316331461091957600080fd5b60006116da831115801561092e5750610fd583115b15610aa457600760005b600254811015610a6357600061094e8787611bd7565b6000838152600f602052604090205490915061096a9082611c8a565b9350816003146109d2576000868152600e6020526040902061098b85611e7c565b60405160200161099c9291906131ed565b60408051601f198184030181529181526000888152600e602090815291902082516109cc93919290910190612580565b50610a43565b6000868152600e602052604090206109e985611e7c565b6109f286611e7c565b604051602001610a0493929190613212565b60408051601f198184030181529181526000888152600e60209081529190208251610a3493919290910190612580565b5081610a3f81613888565b9250505b610a4d84846136eb565b9250508080610a5b90613888565b915050610938565b506010811015610a7857600592505050610b62565b60108110158015610a895750601481105b15610a9957600692505050610b62565b600792505050610b62565b6116da831115610b5c5760005b600354811015610b51576000610ac78686611bd7565b6000868152600e6020908152604080832086845260109092529091205491925090610afb90610af69084611c8a565b611e7c565b604051602001610b0c9291906131ed565b60408051601f198184030181529181526000878152600e60209081529190208251610b3c93919290910190612580565b50508080610b4990613888565b915050610ab1565b506000915050610b62565b60079150505b92915050565b6000546001600160a01b03163314610b925760405162461bcd60e51b815260040161049e9061363f565b6000818152600c60205260408120610ba991612604565b6000908152600f6020526040812055565b6000546001600160a01b03163314610be45760405162461bcd60e51b815260040161049e9061363f565b600180546001600160a01b0383166001600160a01b031990911617905550565b6000546001600160a01b03163314610c2e5760405162461bcd60e51b815260040161049e9061363f565b610c3b6005836057612625565b50610c496006826057612625565b505050565b6000546001600160a01b03163314610c785760405162461bcd60e51b815260040161049e9061363f565b6001600160a01b038116610cdd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161049e565b61056b81611b87565b6001546060906001600160a01b03163314610d0057600080fd5b6116da83116117da5760006040518060600160405280602f8152602001613930602f913990506060610d3061267e565b604080518082019091526006815265211b22a0a32360d11b60208201526007546000916060918291849160ff16158015610d6b5750610fd58b115b1561103557600b8054610d7d9061382b565b80601f0160208091040260200160405190810160405280929190818152602001828054610da99061382b565b8015610df65780601f10610dcb57610100808354040283529160200191610df6565b820191906000526020600020905b815481529060010190602001808311610dd957829003601f168201915b5050505050925087604051602001610e0e9190612d1a565b60408051601f19818403018152828201909152600682526536633663366360d01b6020830152985090506003600881018054610e499061382b565b610e54929150613728565b945060005b858161ffff161015610fa657610e9784610e7483600361373c565b61ffff16610e8384600361373c565b610e8e9060036136ce565b61ffff16611f82565b94506000610eb0610eab8760006001611f82565b61204f565b90506000610ec4610eab8860016002611f82565b9050888260ff1660208110610edb57610edb613903565b60200201518160ff1660208110610ef457610ef4613903565b602002015115610f05575050610f94565b89610f1b610f168960026003611f82565b6120f1565b610f278460ff16611e7c565b610f338460ff16611e7c565b604051602001610f46949392919061313b565b60405160208183030381529060405299506001898360ff1660208110610f6e57610f6e613903565b60200201518260ff1660208110610f8757610f87613903565b9115156020909202015250505b80610f9e81613866565b915050610e59565b50610fd18782604051602001610fbd92919061340f565b604051602081830303815290604052612239565b9650611007610fdf8c611e7c565b888a604051602001610ff39392919061324b565b6040516020818303038152906040526123a1565b604051602001611017919061359c565b60405160208183030381529060405298505050505050505050610b62565b8a610fd31415611116576008805461104c9061382b565b80601f01602080910402602001604051908101604052809291908181526020018280546110789061382b565b80156110c55780601f1061109a576101008083540402835291602001916110c5565b820191906000526020600020905b8154815290600101906020018083116110a857829003601f168201915b50505050509250876110d68b611e7c565b6040516020016110e7929190612eaf565b60408051601f19818403018152828201909152600682526565306431393560d01b602083015298509050611305565b8a610fd414156111f7576009805461112d9061382b565b80601f01602080910402602001604051908101604052809291908181526020018280546111599061382b565b80156111a65780601f1061117b576101008083540402835291602001916111a6565b820191906000526020600020905b81548152906001019060200180831161118957829003601f168201915b50505050509250876111b78b611e7c565b6040516020016111c8929190612f96565b60408051601f1981840301815282820190915260068252651c9c3299313160d11b602083015298509050611305565b8a610fd514156112d857600a805461120e9061382b565b80601f016020809104026020016040519081016040528092919081815260200182805461123a9061382b565b80156112875780601f1061125c57610100808354040283529160200191611287565b820191906000526020600020905b81548152906001019060200180831161126a57829003601f168201915b50505050509250876112988b611e7c565b6040516020016112a9929190613062565b60408051601f1981840301815282820190915260068252651a3299b29b3360d11b602083015298509050611305565b876112e28b611e7c565b6040516020016112f3929190612d85565b60405160208183030381529060405297505b610fd58b11156114be5760005b6002548110156114bc57806004146114705760008c8152600e6020526040902080546113db916113d6916113459061382b565b80601f01602080910402602001604051908101604052809291908181526020018280546113719061382b565b80156113be5780601f10611393576101008083540402835291602001916113be565b820191906000526020600020905b8154815290600101906020018083116113a157829003601f168201915b5050505050838460016113d191906136eb565b611f82565b6124c2565b6000828152600c6020526040902080549194508a9160ff861690811061140357611403613903565b9060005260206000209060040201600101600c60008481526020019081526020016000208560ff168154811061143b5761143b613903565b906000526020600020906004020160000160405160200161145e93929190612cad565b60405160208183030381529060405298505b80600314158015611482575080600414155b156114aa57886040516020016114989190612c88565b60405160208183030381529060405298505b806114b481613888565b915050611312565b505b600060016002546114cf91906137ae565b90505b610fd58c111561153d5760008c8152600e6020526040902080546114fd916113d6916113459061382b565b6000828152600c6020526040902080549194509060ff851690811061152457611524613903565b90600052602060002090600402016003015495506115ab565b8b610fd3141561156c576003600860005b01805461155a9061382b565b611565929150613728565b95506115ab565b8b610fd414156115815760036008600161154e565b8b610fd514156115ab5760036008600201805461159d9061382b565b6115a8929150613728565b95505b60005b868161ffff1610156117af57610fd68d10156115da576115d385610e7483600361373c565b95506116ac565b6000828152600c6020526040902080546116a9919060ff871690811061160257611602613903565b9060005260206000209060040201600201805461161e9061382b565b80601f016020809104026020016040519081016040528092919081815260200182805461164a9061382b565b80156116975780601f1061166c57610100808354040283529160200191611697565b820191906000526020600020905b81548152906001019060200180831161167a57829003601f168201915b5050505050826003610e74919061373c565b95505b60006116be610eab8860006001611f82565b905060006116d2610eab8960016002611f82565b9050898260ff16602081106116e9576116e9613903565b60200201518160ff166020811061170257611702613903565b60200201511561171357505061179d565b8a611724610f168a60026003611f82565b6117308460ff16611e7c565b61173c8460ff16611e7c565b60405160200161174f949392919061313b565b6040516020818303038152906040529a5060018a8360ff166020811061177757611777613903565b60200201518260ff166020811061179057611790613903565b9115156020909202015250505b806117a781613866565b9150506115ae565b508015806117be5750610fd68c105b156117c857610fa6565b806117d281613814565b9150506114d2565b60006040518060600160405280602f8152602001613930602f91399050606061180161267e565b6000606060008060405180604001604052806006815260200165211b22a0a32360d11b81525090508660405160200161183a9190612e45565b604051602081830303815290604052965060005b6003548110156119575760008b8152600e602052604090208054611879916113d6916113459061382b565b6000828152600d602052604090208054919450899160ff86169081106118a1576118a1613903565b9060005260206000209060040201600101600d60008481526020019081526020016000208560ff16815481106118d9576118d9613903565b90600052602060002090600402016000016040516020016118fc93929190612cad565b6040516020818303038152906040529750600160035461191c91906137ae565b811461194557876040516020016119339190612c88565b60405160208183030381529060405297505b8061194f81613888565b91505061184e565b506000600160035461196991906137ae565b90505b60008b8152600e60205260409020805461198d916113d6916113459061382b565b6000828152600d6020526040902080549194509060ff85169081106119b4576119b4613903565b906000526020600020906004020160030154945060005b858161ffff161015611b04576000828152600d6020526040902080546119ff919060ff871690811061160257611602613903565b94506000611a13610eab8760006001611f82565b90506000611a27610eab8860016002611f82565b9050888260ff1660208110611a3e57611a3e613903565b60200201518160ff1660208110611a5757611a57613903565b602002015115611a68575050611af2565b89611a79610f168960026003611f82565b611a858460ff16611e7c565b611a918460ff16611e7c565b604051602001611aa4949392919061313b565b60405160208183030381529060405299506001898360ff1660208110611acc57611acc613903565b60200201518260ff1660208110611ae557611ae5613903565b9115156020909202015250505b80611afc81613866565b9150506119cb565b5080611b0f57611b21565b80611b1981613814565b91505061196c565b50611b388682604051602001610fbd92919061340f565b9550611b5a611b468b611e7c565b8789604051602001610ff39392919061324b565b604051602001611b6a919061359c565b604051602081830303815290604052975050505050505050610b62565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600454600090611beb9060ff166001613703565b6004805460ff191660ff929092169182179055600a11611c10576004805460ff191690555b600454604080514460208201524291810191909152606085811b6bffffffffffffffffffffffff1916908201526074810184905260f89190911b6001600160f81b0319166094820152612710906095016040516020818303038152906040528051906020012060001c611c8391906138c3565b9392505050565b600080611f408310158015611ca0575061271083105b15611cad57506000611c83565b6117708310158015611cc05750611f4083105b15611ce8576002841015611ce057611cd98460016138c3565b9050611c83565b506001611c83565b61128e8310158015611cfb575061177083105b15611d1c576003841015611d1457611cd98460026138c3565b506002611c83565b610dac8310158015611d2f575061128e83105b15611d50576004841015611d4857611cd98460036138c3565b506003611c83565b610abe8310158015611d635750610dac83105b15611d84576005841015611d7c57611cd98460046138c3565b506004611c83565b6107d08310158015611d975750610abe83105b15611db8576006841015611db057611cd98460056138c3565b506005611c83565b6104e28310158015611dcb57506107d083105b15611dec576007841015611de457611cd98460066138c3565b506006611c83565b6102ee8310158015611dff57506104e283105b15611e20576008841015611e1857611cd98460076138c3565b506007611c83565b60fa8310158015611e3257506102ee83105b15611e555760096002541015611e4d57611cd98460086138c3565b506008611c83565b60fa831015611c8357600a841015611e7257611cd98460096138c3565b5060099392505050565b606081611ea05750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611eca5780611eb481613888565b9150611ec39050600a83613728565b9150611ea4565b60008167ffffffffffffffff811115611ee557611ee5613919565b6040519080825280601f01601f191660200182016040528015611f0f576020820181803683370190505b5090505b8415611f7a57611f246001836137ae565b9150611f31600a866138c3565b611f3c9060306136eb565b60f81b818381518110611f5157611f51613903565b60200101906001600160f81b031916908160001a905350611f73600a86613728565b9450611f13565b949350505050565b6060836000611f9185856137ae565b67ffffffffffffffff811115611fa957611fa9613919565b6040519080825280601f01601f191660200182016040528015611fd3576020820181803683370190505b509050845b8481101561204557828181518110611ff257611ff2613903565b01602001516001600160f81b0319168261200c88846137ae565b8151811061201c5761201c613903565b60200101906001600160f81b031916908160001a9053508061203d81613888565b915050611fd8565b5095945050505050565b6000805b60065460ff821610156120eb57826040516020016120719190612c6c565b6040516020818303038152906040528051906020012060068260ff168154811061209d5761209d613903565b906000526020600020016040516020016120b791906131e1565b6040516020818303038152906040528051906020012014156120d95792915050565b806120e3816138a3565b915050612053565b50600080fd5b606060005b60065460ff821610156120eb57826040516020016121149190612c6c565b6040516020818303038152906040528051906020012060068260ff168154811061214057612140613903565b9060005260206000200160405160200161215a91906131e1565b6040516020818303038152906040528051906020012014156122275760058160ff168154811061218c5761218c613903565b9060005260206000200180546121a19061382b565b80601f01602080910402602001604051908101604052809291908181526020018280546121cd9061382b565b801561221a5780601f106121ef5761010080835404028352916020019161221a565b820191906000526020600020905b8154815290600101906020018083116121fd57829003601f168201915b5050505050915050919050565b80612231816138a3565b9150506120f6565b606081516000141561225957505060408051602081019091526000815290565b600060405180606001604052806040815260200161395f604091399050600060038451600261228891906136eb565b6122929190613728565b61229d906004613766565b905060006122ac8260206136eb565b67ffffffffffffffff8111156122c4576122c4613919565b6040519080825280601f01601f1916602001820160405280156122ee576020820181803683370190505b509050818152600183018586518101602084015b8183101561235c5760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401612302565b600389510660018114612376576002811461238757612393565b613d3d60f01b600119830152612393565b603d60f81b6000198301525b509398975050505050505050565b60608151600014156123c157505060408051602081019091526000815290565b600060405180606001604052806040815260200161395f60409139905060006003845160026123f091906136eb565b6123fa9190613728565b612405906004613766565b905060006124148260206136eb565b67ffffffffffffffff81111561242c5761242c613919565b6040519080825280601f01601f191660200182016040528015612456576020820181803683370190505b509050818152600183018586518101602084015b8183101561235c576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f811685015182535060010161246a565b60008181805b82518160ff161015612578576030838260ff16815181106124eb576124eb613903565b016020015160f81c1080159061251e57506039838260ff168151811061251357612513613903565b016020015160f81c11155b156125665761252e600a83613785565b91506030838260ff168151811061254757612547613903565b0160200151612559919060f81c6137c5565b6125639083613703565b91505b80612570816138a3565b9150506124c8565b509392505050565b82805461258c9061382b565b90600052602060002090601f0160209004810192826125ae57600085556125f4565b82601f106125c757805160ff19168380011785556125f4565b828001600101855582156125f4579182015b828111156125f45782518255916020019190600101906125d9565b506126009291506126ac565b5090565b508054600082556004029060005260206000209081019061056b91906126c1565b828054828255906000526020600020908101928215612672579160200282015b828111156126725782518051612662918491602090910190612580565b5091602001919060010190612645565b50612600929150612701565b6040518061040001604052806020905b61269661271e565b81526020019060019003908161268e5790505090565b5b8082111561260057600081556001016126ad565b808211156126005760006126d5828261273d565b6126e360018301600061273d565b6126f160028301600061273d565b50600060038201556004016126c1565b80821115612600576000612715828261273d565b50600101612701565b6040518061040001604052806020906020820280368337509192915050565b5080546127499061382b565b6000825580601f10612759575050565b601f01602090049060005260206000209081019061056b91906126ac565b80356001600160a01b038116811461278e57600080fd5b919050565b600082601f8301126127a457600080fd5b604051610ae080820167ffffffffffffffff83821081831117156127ca576127ca613919565b81604052839150858784880111156127e157600080fd5b60009350835b6057811015612820578135838111156127fe578586fd5b61280a8a828b0161282d565b85525060209384019391909101906001016127e7565b5093979650505050505050565b600082601f83011261283e57600080fd5b813567ffffffffffffffff81111561285857612858613919565b61286b601f8201601f191660200161369d565b81815284602083860101111561288057600080fd5b816020850160208301376000918101602001919091529392505050565b6000602082840312156128af57600080fd5b611c8382612777565b600080604083850312156128cb57600080fd5b6128d483612777565b946020939093013593505050565b600080604083850312156128f557600080fd5b823567ffffffffffffffff8082111561290d57600080fd5b61291986838701612793565b9350602085013591508082111561292f57600080fd5b5061293c85828601612793565b9150509250929050565b6000806000806080858703121561295c57600080fd5b843567ffffffffffffffff8082111561297457600080fd5b6129808883890161282d565b9550602087013591508082111561299657600080fd5b6129a28883890161282d565b945060408701359150808211156129b857600080fd5b6129c48883890161282d565b935060608701359150808211156129da57600080fd5b506129e78782880161282d565b91505092959194509250565b600060208284031215612a0557600080fd5b5035919050565b60008060408385031215612a1f57600080fd5b8235915060208084013567ffffffffffffffff80821115612a3f57600080fd5b818601915086601f830112612a5357600080fd5b813581811115612a6557612a65613919565b8060051b612a7485820161369d565b8281528581019085870183870188018c1015612a8f57600080fd5b600093505b84841015612b5657803586811115612aab57600080fd5b87016080818e03601f19011215612ac157600080fd5b612ac9613674565b8982013588811115612ada57600080fd5b612ae88f8c8386010161282d565b825250604082013588811115612afd57600080fd5b612b0b8f8c8386010161282d565b8b83015250606082013588811115612b2257600080fd5b612b308f8c8386010161282d565b604083015250608091909101356060820152835260019390930192918701918701612a94565b50809750505050505050509250929050565b60008060408385031215612b7b57600080fd5b50508035926020909101359150565b60008151808452612ba28160208601602086016137e8565b601f01601f19169290920160200192915050565b60008151612bc88185602086016137e8565b9290920192915050565b8054600090600181811c9080831680612bec57607f831692505b6020808410821415612c0e57634e487b7160e01b600052602260045260246000fd5b818015612c225760018114612c3357612c60565b60ff19861689528489019650612c60565b60008881526020902060005b86811015612c585781548b820152908501908301612c3f565b505084890196505b50505050505092915050565b60008251612c7e8184602087016137e8565b9190910192915050565b60008251612c9a8184602087016137e8565b600b60fa1b920191825250600101919050565b60008451612cbf8184602089016137e8565b6e3d913a3930b4ba2fba3cb832911d1160891b908301908152612ce5600f820186612bd2565b6a1116113b30b63ab2911d1160a91b81529050612d05600b820185612bd2565b61227d60f01b81526002019695505050505050565b60008251612d2c8184602087016137e8565b6e3d913a3930b4ba2fba3cb832911d1160891b9201918252506553746174757360d01b600f8201526a1116113b30b63ab2911d1160a91b60158201526b556e72657665616c6564227d60a01b6020820152602c01919050565b60008351612d978184602088016137e8565b6e3d913a3930b4ba2fba3cb832911d1160891b9083018181526923b2b732b930ba34b7b760b11b600f8201526a1116113b30b63ab2911d1160a91b601982018190526911d95b995cda5cc89f4b60b21b6024830152602e820192909252702a343934bb3290283937b23ab1ba34b7b760791b603d820152604e8101919091528351612e298160598401602088016137e8565b62089f4b60ea1b60599290910191820152605c01949350505050565b60008251612e578184602087016137e8565b6e3d913a3930b4ba2fba3cb832911d1160891b9201918252506923b2b732b930ba34b7b760b11b600f8201526a1116113b30b63ab2911d1160a91b6019820152661098589e489f4b60ca1b6024820152602b01919050565b60008351612ec18184602088016137e8565b6e3d913a3930b4ba2fba3cb832911d1160891b90830181815262312f3160e81b600f8201526a1116113b30b63ab2911d1160a91b601282018190526b151c995959195b9e98489f4b60a21b601d830152602982018390526923b2b732b930ba34b7b760b11b6038830152604282018190526911d95b995cda5cc89f4b60b21b604d8301526057820192909252702a343934bb3290283937b23ab1ba34b7b760791b60668201526077810191909152612f8d612f7f6082830186612bb6565b61227d60f01b815260020190565b95945050505050565b60008351612fa88184602088016137e8565b6e3d913a3930b4ba2fba3cb832911d1160891b90830181815262312f3160e81b600f8201526a1116113b30b63ab2911d1160a91b6012820181905267105b1a595b889f4b60c21b601d830152602582018390526923b2b732b930ba34b7b760b11b6034830152603e82018190526911d95b995cda5cc89f4b60b21b60498301526053820192909252702a343934bb3290283937b23ab1ba34b7b760791b60628201526073810191909152612f8d612f7f607e830186612bb6565b600083516130748184602088016137e8565b6e3d913a3930b4ba2fba3cb832911d1160891b90830181815262312f3160e81b600f8201526a1116113b30b63ab2911d1160a91b6012820181905274109d58989b194811dd5b48109b1bdcdcdbdb489f4b605a1b601d830152603282018390526923b2b732b930ba34b7b760b11b6041830152604b82018190526911d95b995cda5cc89f4b60b21b60568301526060820192909252702a343934bb3290283937b23ab1ba34b7b760791b606f8201526080810191909152612f8d612f7f608b830186612bb6565b6000855161314d818460208a016137e8565b6c3c726563742066696c6c3d272360981b908301908152855161317781600d840160208a016137e8565b642720783d2760d81b600d9290910191820152845161319d8160128401602089016137e8565b642720793d2760d81b6012929091019182015283516131c38160178401602088016137e8565b6213979f60e91b60179290910191820152601a019695505050505050565b6000611c838284612bd2565b60006131f98285612bd2565b83516132098183602088016137e8565b01949350505050565b600061321e8286612bd2565b845161322e8183602089016137e8565b84519101906132418183602088016137e8565b0195945050505050565b673d913730b6b2911d60c11b81526d2242616e616e612054726565202360901b600882015283516000906132868160168501602089016137e8565b71111610113232b9b1b934b83a34b7b7111d1160711b6016918401918201527f5468652042616e616e6120547265652045636f7a20697320746865206162756e60288201527f64616e742070726f6475636572206f66207468652045636f7a797374656d2e2060488201527f546865697220706f70756c6174696f6e207374617973207374726f6e6720616e60688201527f6420667275697466756c20756e6c657373207468652042757368204275636b736088820152711033b2ba103a37b790343ab733b93c97171760711b60a88201526134056133f86133eb6133e56133ca6133bc6133b661338d60ba89016c1116101134b6b0b3b2911d101160991b8152600d0190565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c0000000000008152601a0190565b8b612bb6565b61088b60f21b815260020190565b6e2261747472696275746573223a205b60881b8152600f0190565b87612bb6565b605d60f81b815260010190565b607d60f81b815260010190565b9695505050505050565b7f3c7376672069643d2265636f7a2d7376672220786d6c6e733d22687474703a2f81527f2f7777772e77332e6f72672f323030302f73766722207072657365727665417360208201527f70656374526174696f3d22784d696e594d696e206d656574222076696577426f60408201527f783d22302030203332203332223e203c7265637420636c6173733d226267222060608201526d3c1e911811103c9e91181110179f60911b6080820152600083516134d081608e8501602088016137e8565b7f3c7374796c653e726563742e62677b77696474683a333270783b686569676874608e918401918201526b3a333270783b66696c6c3a2360a01b60ae82015283516135228160ba8401602088016137e8565b7f7d20726563747b77696474683a3170783b6865696768743a3170783b7d20236560ba92909101918201527f636f7a2d7376677b73686170652d72656e646572696e673a206372697370656460da8201527333b2b99dbe901e17b9ba3cb6329f1e17b9bb339f60611b60fa82015261010e01949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516135d481601d8501602087016137e8565b91909101601d0192915050565b602081526000611c836020830184612b8a565b6080815260006136076080830187612b8a565b82810360208401526136198187612b8a565b9050828103604084015261362d8186612b8a565b91505082606083015295945050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6040516080810167ffffffffffffffff8111828210171561369757613697613919565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156136c6576136c6613919565b604052919050565b600061ffff808316818516808303821115613209576132096138d7565b600082198211156136fe576136fe6138d7565b500190565b600060ff821660ff84168060ff03821115613720576137206138d7565b019392505050565b600082613737576137376138ed565b500490565b600061ffff8083168185168183048111821515161561375d5761375d6138d7565b02949350505050565b6000816000190483118215151615613780576137806138d7565b500290565b600060ff821660ff84168160ff04811182151516156137a6576137a66138d7565b029392505050565b6000828210156137c0576137c06138d7565b500390565b600060ff821660ff8416808210156137df576137df6138d7565b90039392505050565b60005b838110156138035781810151838201526020016137eb565b838111156104f85750506000910152565b600081613823576138236138d7565b506000190190565b600181811c9082168061383f57607f821691505b6020821081141561386057634e487b7160e01b600052602260045260246000fd5b50919050565b600061ffff8083168181141561387e5761387e6138d7565b6001019392505050565b600060001982141561389c5761389c6138d7565b5060010190565b600060ff821660ff8114156138ba576138ba6138d7565b60010192915050565b6000826138d2576138d26138ed565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfe7b2274726169745f74797065223a2253706563696573222c2276616c7565223a2242616e616e612054726565227d2c4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220960f26e447614541314ea8ba96e8f8e64f4fbf68b9b9f1309540b0f94da00ee164736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061010b5760003560e01c80639e35277c116100a2578063d0df1d1411610071578063d0df1d1414610223578063d5926a3714610236578063d8e6545d14610249578063f2fde38b1461025c578063f54f30ba1461026f57600080fd5b80639e35277c146101d4578063a475b5dd146101e7578063b5ebe114146101ef578063c60a426a1461021057600080fd5b80636790461a116100de5780636790461a14610181578063715018a6146101945780638d2a4d131461019c5780638da5cb5b146101af57600080fd5b80632fb098d2146101105780633223bbe81461013c578063518302271461015157806356691c9a1461016e575b600080fd5b61012361011e366004612b68565b61028f565b60405161013394939291906135f4565b60405180910390f35b61014f61014a366004612946565b610474565b005b60075461015e9060ff1681565b6040519015158152602001610133565b61012361017c366004612b68565b6104fe565b61014f61018f3660046129f3565b61051a565b61014f61056e565b61014f6101aa366004612a0c565b6105a4565b6000546001600160a01b03165b6040516001600160a01b039091168152602001610133565b61014f6101e2366004612a0c565b610735565b61014f6108c6565b6102026101fd3660046128b8565b6108ff565b604051908152602001610133565b61014f61021e3660046129f3565b610b68565b61014f61023136600461289d565b610bba565b6001546101bc906001600160a01b031681565b61014f6102573660046128e2565b610c04565b61014f61026a36600461289d565b610c4e565b61028261027d366004612b68565b610ce6565b60405161013391906135e1565b600c60205281600052604060002081815481106102ab57600080fd5b9060005260206000209060040201600091509150508060000180546102cf9061382b565b80601f01602080910402602001604051908101604052809291908181526020018280546102fb9061382b565b80156103485780601f1061031d57610100808354040283529160200191610348565b820191906000526020600020905b81548152906001019060200180831161032b57829003601f168201915b50505050509080600101805461035d9061382b565b80601f01602080910402602001604051908101604052809291908181526020018280546103899061382b565b80156103d65780601f106103ab576101008083540402835291602001916103d6565b820191906000526020600020905b8154815290600101906020018083116103b957829003601f168201915b5050505050908060020180546103eb9061382b565b80601f01602080910402602001604051908101604052809291908181526020018280546104179061382b565b80156104645780601f1061043957610100808354040283529160200191610464565b820191906000526020600020905b81548152906001019060200180831161044757829003601f168201915b5050505050908060030154905084565b6000546001600160a01b031633146104a75760405162461bcd60e51b815260040161049e9061363f565b60405180910390fd5b83516104ba906008906020870190612580565b5082516104ce906009906020860190612580565b5081516104e290600a906020850190612580565b5080516104f690600b906020840190612580565b505b50505050565b600d60205281600052604060002081815481106102ab57600080fd5b6000546001600160a01b031633146105445760405162461bcd60e51b815260040161049e9061363f565b6000818152600d6020526040812061055b91612604565b6000818152601060205260408120555b50565b6000546001600160a01b031633146105985760405162461bcd60e51b815260040161049e9061363f565b6105a26000611b87565b565b6000546001600160a01b031633146105ce5760405162461bcd60e51b815260040161049e9061363f565b60005b815181101561070657600d6000848152602001908152602001600020604051806080016040528084848151811061060a5761060a613903565b602002602001015160000151815260200184848151811061062d5761062d613903565b602002602001015160200151815260200184848151811061065057610650613903565b602002602001015160400151815260200184848151811061067357610673613903565b602090810291909101810151606001519091528254600181018455600093845292819020825180519394600402909101926106b19284920190612580565b5060208281015180516106ca9260018501920190612580565b50604082015180516106e6916002840191602090910190612580565b5060608201518160030155505080806106fe90613888565b9150506105d1565b50805160008381526010602052604090205461072291906136eb565b6000838152601060205260409020555050565b6000546001600160a01b0316331461075f5760405162461bcd60e51b815260040161049e9061363f565b60005b815181101561089757600c6000848152602001908152602001600020604051806080016040528084848151811061079b5761079b613903565b60200260200101516000015181526020018484815181106107be576107be613903565b60200260200101516020015181526020018484815181106107e1576107e1613903565b602002602001015160400151815260200184848151811061080457610804613903565b602090810291909101810151606001519091528254600181018455600093845292819020825180519394600402909101926108429284920190612580565b50602082810151805161085b9260018501920190612580565b5060408201518051610877916002840191602090910190612580565b50606082015181600301555050808061088f90613888565b915050610762565b5080516000838152600f60205260409020546108b391906136eb565b6000838152600f60205260409020555050565b6000546001600160a01b031633146108f05760405162461bcd60e51b815260040161049e9061363f565b6007805460ff19166001179055565b6001546000906001600160a01b0316331461091957600080fd5b60006116da831115801561092e5750610fd583115b15610aa457600760005b600254811015610a6357600061094e8787611bd7565b6000838152600f602052604090205490915061096a9082611c8a565b9350816003146109d2576000868152600e6020526040902061098b85611e7c565b60405160200161099c9291906131ed565b60408051601f198184030181529181526000888152600e602090815291902082516109cc93919290910190612580565b50610a43565b6000868152600e602052604090206109e985611e7c565b6109f286611e7c565b604051602001610a0493929190613212565b60408051601f198184030181529181526000888152600e60209081529190208251610a3493919290910190612580565b5081610a3f81613888565b9250505b610a4d84846136eb565b9250508080610a5b90613888565b915050610938565b506010811015610a7857600592505050610b62565b60108110158015610a895750601481105b15610a9957600692505050610b62565b600792505050610b62565b6116da831115610b5c5760005b600354811015610b51576000610ac78686611bd7565b6000868152600e6020908152604080832086845260109092529091205491925090610afb90610af69084611c8a565b611e7c565b604051602001610b0c9291906131ed565b60408051601f198184030181529181526000878152600e60209081529190208251610b3c93919290910190612580565b50508080610b4990613888565b915050610ab1565b506000915050610b62565b60079150505b92915050565b6000546001600160a01b03163314610b925760405162461bcd60e51b815260040161049e9061363f565b6000818152600c60205260408120610ba991612604565b6000908152600f6020526040812055565b6000546001600160a01b03163314610be45760405162461bcd60e51b815260040161049e9061363f565b600180546001600160a01b0383166001600160a01b031990911617905550565b6000546001600160a01b03163314610c2e5760405162461bcd60e51b815260040161049e9061363f565b610c3b6005836057612625565b50610c496006826057612625565b505050565b6000546001600160a01b03163314610c785760405162461bcd60e51b815260040161049e9061363f565b6001600160a01b038116610cdd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161049e565b61056b81611b87565b6001546060906001600160a01b03163314610d0057600080fd5b6116da83116117da5760006040518060600160405280602f8152602001613930602f913990506060610d3061267e565b604080518082019091526006815265211b22a0a32360d11b60208201526007546000916060918291849160ff16158015610d6b5750610fd58b115b1561103557600b8054610d7d9061382b565b80601f0160208091040260200160405190810160405280929190818152602001828054610da99061382b565b8015610df65780601f10610dcb57610100808354040283529160200191610df6565b820191906000526020600020905b815481529060010190602001808311610dd957829003601f168201915b5050505050925087604051602001610e0e9190612d1a565b60408051601f19818403018152828201909152600682526536633663366360d01b6020830152985090506003600881018054610e499061382b565b610e54929150613728565b945060005b858161ffff161015610fa657610e9784610e7483600361373c565b61ffff16610e8384600361373c565b610e8e9060036136ce565b61ffff16611f82565b94506000610eb0610eab8760006001611f82565b61204f565b90506000610ec4610eab8860016002611f82565b9050888260ff1660208110610edb57610edb613903565b60200201518160ff1660208110610ef457610ef4613903565b602002015115610f05575050610f94565b89610f1b610f168960026003611f82565b6120f1565b610f278460ff16611e7c565b610f338460ff16611e7c565b604051602001610f46949392919061313b565b60405160208183030381529060405299506001898360ff1660208110610f6e57610f6e613903565b60200201518260ff1660208110610f8757610f87613903565b9115156020909202015250505b80610f9e81613866565b915050610e59565b50610fd18782604051602001610fbd92919061340f565b604051602081830303815290604052612239565b9650611007610fdf8c611e7c565b888a604051602001610ff39392919061324b565b6040516020818303038152906040526123a1565b604051602001611017919061359c565b60405160208183030381529060405298505050505050505050610b62565b8a610fd31415611116576008805461104c9061382b565b80601f01602080910402602001604051908101604052809291908181526020018280546110789061382b565b80156110c55780601f1061109a576101008083540402835291602001916110c5565b820191906000526020600020905b8154815290600101906020018083116110a857829003601f168201915b50505050509250876110d68b611e7c565b6040516020016110e7929190612eaf565b60408051601f19818403018152828201909152600682526565306431393560d01b602083015298509050611305565b8a610fd414156111f7576009805461112d9061382b565b80601f01602080910402602001604051908101604052809291908181526020018280546111599061382b565b80156111a65780601f1061117b576101008083540402835291602001916111a6565b820191906000526020600020905b81548152906001019060200180831161118957829003601f168201915b50505050509250876111b78b611e7c565b6040516020016111c8929190612f96565b60408051601f1981840301815282820190915260068252651c9c3299313160d11b602083015298509050611305565b8a610fd514156112d857600a805461120e9061382b565b80601f016020809104026020016040519081016040528092919081815260200182805461123a9061382b565b80156112875780601f1061125c57610100808354040283529160200191611287565b820191906000526020600020905b81548152906001019060200180831161126a57829003601f168201915b50505050509250876112988b611e7c565b6040516020016112a9929190613062565b60408051601f1981840301815282820190915260068252651a3299b29b3360d11b602083015298509050611305565b876112e28b611e7c565b6040516020016112f3929190612d85565b60405160208183030381529060405297505b610fd58b11156114be5760005b6002548110156114bc57806004146114705760008c8152600e6020526040902080546113db916113d6916113459061382b565b80601f01602080910402602001604051908101604052809291908181526020018280546113719061382b565b80156113be5780601f10611393576101008083540402835291602001916113be565b820191906000526020600020905b8154815290600101906020018083116113a157829003601f168201915b5050505050838460016113d191906136eb565b611f82565b6124c2565b6000828152600c6020526040902080549194508a9160ff861690811061140357611403613903565b9060005260206000209060040201600101600c60008481526020019081526020016000208560ff168154811061143b5761143b613903565b906000526020600020906004020160000160405160200161145e93929190612cad565b60405160208183030381529060405298505b80600314158015611482575080600414155b156114aa57886040516020016114989190612c88565b60405160208183030381529060405298505b806114b481613888565b915050611312565b505b600060016002546114cf91906137ae565b90505b610fd58c111561153d5760008c8152600e6020526040902080546114fd916113d6916113459061382b565b6000828152600c6020526040902080549194509060ff851690811061152457611524613903565b90600052602060002090600402016003015495506115ab565b8b610fd3141561156c576003600860005b01805461155a9061382b565b611565929150613728565b95506115ab565b8b610fd414156115815760036008600161154e565b8b610fd514156115ab5760036008600201805461159d9061382b565b6115a8929150613728565b95505b60005b868161ffff1610156117af57610fd68d10156115da576115d385610e7483600361373c565b95506116ac565b6000828152600c6020526040902080546116a9919060ff871690811061160257611602613903565b9060005260206000209060040201600201805461161e9061382b565b80601f016020809104026020016040519081016040528092919081815260200182805461164a9061382b565b80156116975780601f1061166c57610100808354040283529160200191611697565b820191906000526020600020905b81548152906001019060200180831161167a57829003601f168201915b5050505050826003610e74919061373c565b95505b60006116be610eab8860006001611f82565b905060006116d2610eab8960016002611f82565b9050898260ff16602081106116e9576116e9613903565b60200201518160ff166020811061170257611702613903565b60200201511561171357505061179d565b8a611724610f168a60026003611f82565b6117308460ff16611e7c565b61173c8460ff16611e7c565b60405160200161174f949392919061313b565b6040516020818303038152906040529a5060018a8360ff166020811061177757611777613903565b60200201518260ff166020811061179057611790613903565b9115156020909202015250505b806117a781613866565b9150506115ae565b508015806117be5750610fd68c105b156117c857610fa6565b806117d281613814565b9150506114d2565b60006040518060600160405280602f8152602001613930602f91399050606061180161267e565b6000606060008060405180604001604052806006815260200165211b22a0a32360d11b81525090508660405160200161183a9190612e45565b604051602081830303815290604052965060005b6003548110156119575760008b8152600e602052604090208054611879916113d6916113459061382b565b6000828152600d602052604090208054919450899160ff86169081106118a1576118a1613903565b9060005260206000209060040201600101600d60008481526020019081526020016000208560ff16815481106118d9576118d9613903565b90600052602060002090600402016000016040516020016118fc93929190612cad565b6040516020818303038152906040529750600160035461191c91906137ae565b811461194557876040516020016119339190612c88565b60405160208183030381529060405297505b8061194f81613888565b91505061184e565b506000600160035461196991906137ae565b90505b60008b8152600e60205260409020805461198d916113d6916113459061382b565b6000828152600d6020526040902080549194509060ff85169081106119b4576119b4613903565b906000526020600020906004020160030154945060005b858161ffff161015611b04576000828152600d6020526040902080546119ff919060ff871690811061160257611602613903565b94506000611a13610eab8760006001611f82565b90506000611a27610eab8860016002611f82565b9050888260ff1660208110611a3e57611a3e613903565b60200201518160ff1660208110611a5757611a57613903565b602002015115611a68575050611af2565b89611a79610f168960026003611f82565b611a858460ff16611e7c565b611a918460ff16611e7c565b604051602001611aa4949392919061313b565b60405160208183030381529060405299506001898360ff1660208110611acc57611acc613903565b60200201518260ff1660208110611ae557611ae5613903565b9115156020909202015250505b80611afc81613866565b9150506119cb565b5080611b0f57611b21565b80611b1981613814565b91505061196c565b50611b388682604051602001610fbd92919061340f565b9550611b5a611b468b611e7c565b8789604051602001610ff39392919061324b565b604051602001611b6a919061359c565b604051602081830303815290604052975050505050505050610b62565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600454600090611beb9060ff166001613703565b6004805460ff191660ff929092169182179055600a11611c10576004805460ff191690555b600454604080514460208201524291810191909152606085811b6bffffffffffffffffffffffff1916908201526074810184905260f89190911b6001600160f81b0319166094820152612710906095016040516020818303038152906040528051906020012060001c611c8391906138c3565b9392505050565b600080611f408310158015611ca0575061271083105b15611cad57506000611c83565b6117708310158015611cc05750611f4083105b15611ce8576002841015611ce057611cd98460016138c3565b9050611c83565b506001611c83565b61128e8310158015611cfb575061177083105b15611d1c576003841015611d1457611cd98460026138c3565b506002611c83565b610dac8310158015611d2f575061128e83105b15611d50576004841015611d4857611cd98460036138c3565b506003611c83565b610abe8310158015611d635750610dac83105b15611d84576005841015611d7c57611cd98460046138c3565b506004611c83565b6107d08310158015611d975750610abe83105b15611db8576006841015611db057611cd98460056138c3565b506005611c83565b6104e28310158015611dcb57506107d083105b15611dec576007841015611de457611cd98460066138c3565b506006611c83565b6102ee8310158015611dff57506104e283105b15611e20576008841015611e1857611cd98460076138c3565b506007611c83565b60fa8310158015611e3257506102ee83105b15611e555760096002541015611e4d57611cd98460086138c3565b506008611c83565b60fa831015611c8357600a841015611e7257611cd98460096138c3565b5060099392505050565b606081611ea05750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611eca5780611eb481613888565b9150611ec39050600a83613728565b9150611ea4565b60008167ffffffffffffffff811115611ee557611ee5613919565b6040519080825280601f01601f191660200182016040528015611f0f576020820181803683370190505b5090505b8415611f7a57611f246001836137ae565b9150611f31600a866138c3565b611f3c9060306136eb565b60f81b818381518110611f5157611f51613903565b60200101906001600160f81b031916908160001a905350611f73600a86613728565b9450611f13565b949350505050565b6060836000611f9185856137ae565b67ffffffffffffffff811115611fa957611fa9613919565b6040519080825280601f01601f191660200182016040528015611fd3576020820181803683370190505b509050845b8481101561204557828181518110611ff257611ff2613903565b01602001516001600160f81b0319168261200c88846137ae565b8151811061201c5761201c613903565b60200101906001600160f81b031916908160001a9053508061203d81613888565b915050611fd8565b5095945050505050565b6000805b60065460ff821610156120eb57826040516020016120719190612c6c565b6040516020818303038152906040528051906020012060068260ff168154811061209d5761209d613903565b906000526020600020016040516020016120b791906131e1565b6040516020818303038152906040528051906020012014156120d95792915050565b806120e3816138a3565b915050612053565b50600080fd5b606060005b60065460ff821610156120eb57826040516020016121149190612c6c565b6040516020818303038152906040528051906020012060068260ff168154811061214057612140613903565b9060005260206000200160405160200161215a91906131e1565b6040516020818303038152906040528051906020012014156122275760058160ff168154811061218c5761218c613903565b9060005260206000200180546121a19061382b565b80601f01602080910402602001604051908101604052809291908181526020018280546121cd9061382b565b801561221a5780601f106121ef5761010080835404028352916020019161221a565b820191906000526020600020905b8154815290600101906020018083116121fd57829003601f168201915b5050505050915050919050565b80612231816138a3565b9150506120f6565b606081516000141561225957505060408051602081019091526000815290565b600060405180606001604052806040815260200161395f604091399050600060038451600261228891906136eb565b6122929190613728565b61229d906004613766565b905060006122ac8260206136eb565b67ffffffffffffffff8111156122c4576122c4613919565b6040519080825280601f01601f1916602001820160405280156122ee576020820181803683370190505b509050818152600183018586518101602084015b8183101561235c5760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401612302565b600389510660018114612376576002811461238757612393565b613d3d60f01b600119830152612393565b603d60f81b6000198301525b509398975050505050505050565b60608151600014156123c157505060408051602081019091526000815290565b600060405180606001604052806040815260200161395f60409139905060006003845160026123f091906136eb565b6123fa9190613728565b612405906004613766565b905060006124148260206136eb565b67ffffffffffffffff81111561242c5761242c613919565b6040519080825280601f01601f191660200182016040528015612456576020820181803683370190505b509050818152600183018586518101602084015b8183101561235c576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f811685015182535060010161246a565b60008181805b82518160ff161015612578576030838260ff16815181106124eb576124eb613903565b016020015160f81c1080159061251e57506039838260ff168151811061251357612513613903565b016020015160f81c11155b156125665761252e600a83613785565b91506030838260ff168151811061254757612547613903565b0160200151612559919060f81c6137c5565b6125639083613703565b91505b80612570816138a3565b9150506124c8565b509392505050565b82805461258c9061382b565b90600052602060002090601f0160209004810192826125ae57600085556125f4565b82601f106125c757805160ff19168380011785556125f4565b828001600101855582156125f4579182015b828111156125f45782518255916020019190600101906125d9565b506126009291506126ac565b5090565b508054600082556004029060005260206000209081019061056b91906126c1565b828054828255906000526020600020908101928215612672579160200282015b828111156126725782518051612662918491602090910190612580565b5091602001919060010190612645565b50612600929150612701565b6040518061040001604052806020905b61269661271e565b81526020019060019003908161268e5790505090565b5b8082111561260057600081556001016126ad565b808211156126005760006126d5828261273d565b6126e360018301600061273d565b6126f160028301600061273d565b50600060038201556004016126c1565b80821115612600576000612715828261273d565b50600101612701565b6040518061040001604052806020906020820280368337509192915050565b5080546127499061382b565b6000825580601f10612759575050565b601f01602090049060005260206000209081019061056b91906126ac565b80356001600160a01b038116811461278e57600080fd5b919050565b600082601f8301126127a457600080fd5b604051610ae080820167ffffffffffffffff83821081831117156127ca576127ca613919565b81604052839150858784880111156127e157600080fd5b60009350835b6057811015612820578135838111156127fe578586fd5b61280a8a828b0161282d565b85525060209384019391909101906001016127e7565b5093979650505050505050565b600082601f83011261283e57600080fd5b813567ffffffffffffffff81111561285857612858613919565b61286b601f8201601f191660200161369d565b81815284602083860101111561288057600080fd5b816020850160208301376000918101602001919091529392505050565b6000602082840312156128af57600080fd5b611c8382612777565b600080604083850312156128cb57600080fd5b6128d483612777565b946020939093013593505050565b600080604083850312156128f557600080fd5b823567ffffffffffffffff8082111561290d57600080fd5b61291986838701612793565b9350602085013591508082111561292f57600080fd5b5061293c85828601612793565b9150509250929050565b6000806000806080858703121561295c57600080fd5b843567ffffffffffffffff8082111561297457600080fd5b6129808883890161282d565b9550602087013591508082111561299657600080fd5b6129a28883890161282d565b945060408701359150808211156129b857600080fd5b6129c48883890161282d565b935060608701359150808211156129da57600080fd5b506129e78782880161282d565b91505092959194509250565b600060208284031215612a0557600080fd5b5035919050565b60008060408385031215612a1f57600080fd5b8235915060208084013567ffffffffffffffff80821115612a3f57600080fd5b818601915086601f830112612a5357600080fd5b813581811115612a6557612a65613919565b8060051b612a7485820161369d565b8281528581019085870183870188018c1015612a8f57600080fd5b600093505b84841015612b5657803586811115612aab57600080fd5b87016080818e03601f19011215612ac157600080fd5b612ac9613674565b8982013588811115612ada57600080fd5b612ae88f8c8386010161282d565b825250604082013588811115612afd57600080fd5b612b0b8f8c8386010161282d565b8b83015250606082013588811115612b2257600080fd5b612b308f8c8386010161282d565b604083015250608091909101356060820152835260019390930192918701918701612a94565b50809750505050505050509250929050565b60008060408385031215612b7b57600080fd5b50508035926020909101359150565b60008151808452612ba28160208601602086016137e8565b601f01601f19169290920160200192915050565b60008151612bc88185602086016137e8565b9290920192915050565b8054600090600181811c9080831680612bec57607f831692505b6020808410821415612c0e57634e487b7160e01b600052602260045260246000fd5b818015612c225760018114612c3357612c60565b60ff19861689528489019650612c60565b60008881526020902060005b86811015612c585781548b820152908501908301612c3f565b505084890196505b50505050505092915050565b60008251612c7e8184602087016137e8565b9190910192915050565b60008251612c9a8184602087016137e8565b600b60fa1b920191825250600101919050565b60008451612cbf8184602089016137e8565b6e3d913a3930b4ba2fba3cb832911d1160891b908301908152612ce5600f820186612bd2565b6a1116113b30b63ab2911d1160a91b81529050612d05600b820185612bd2565b61227d60f01b81526002019695505050505050565b60008251612d2c8184602087016137e8565b6e3d913a3930b4ba2fba3cb832911d1160891b9201918252506553746174757360d01b600f8201526a1116113b30b63ab2911d1160a91b60158201526b556e72657665616c6564227d60a01b6020820152602c01919050565b60008351612d978184602088016137e8565b6e3d913a3930b4ba2fba3cb832911d1160891b9083018181526923b2b732b930ba34b7b760b11b600f8201526a1116113b30b63ab2911d1160a91b601982018190526911d95b995cda5cc89f4b60b21b6024830152602e820192909252702a343934bb3290283937b23ab1ba34b7b760791b603d820152604e8101919091528351612e298160598401602088016137e8565b62089f4b60ea1b60599290910191820152605c01949350505050565b60008251612e578184602087016137e8565b6e3d913a3930b4ba2fba3cb832911d1160891b9201918252506923b2b732b930ba34b7b760b11b600f8201526a1116113b30b63ab2911d1160a91b6019820152661098589e489f4b60ca1b6024820152602b01919050565b60008351612ec18184602088016137e8565b6e3d913a3930b4ba2fba3cb832911d1160891b90830181815262312f3160e81b600f8201526a1116113b30b63ab2911d1160a91b601282018190526b151c995959195b9e98489f4b60a21b601d830152602982018390526923b2b732b930ba34b7b760b11b6038830152604282018190526911d95b995cda5cc89f4b60b21b604d8301526057820192909252702a343934bb3290283937b23ab1ba34b7b760791b60668201526077810191909152612f8d612f7f6082830186612bb6565b61227d60f01b815260020190565b95945050505050565b60008351612fa88184602088016137e8565b6e3d913a3930b4ba2fba3cb832911d1160891b90830181815262312f3160e81b600f8201526a1116113b30b63ab2911d1160a91b6012820181905267105b1a595b889f4b60c21b601d830152602582018390526923b2b732b930ba34b7b760b11b6034830152603e82018190526911d95b995cda5cc89f4b60b21b60498301526053820192909252702a343934bb3290283937b23ab1ba34b7b760791b60628201526073810191909152612f8d612f7f607e830186612bb6565b600083516130748184602088016137e8565b6e3d913a3930b4ba2fba3cb832911d1160891b90830181815262312f3160e81b600f8201526a1116113b30b63ab2911d1160a91b6012820181905274109d58989b194811dd5b48109b1bdcdcdbdb489f4b605a1b601d830152603282018390526923b2b732b930ba34b7b760b11b6041830152604b82018190526911d95b995cda5cc89f4b60b21b60568301526060820192909252702a343934bb3290283937b23ab1ba34b7b760791b606f8201526080810191909152612f8d612f7f608b830186612bb6565b6000855161314d818460208a016137e8565b6c3c726563742066696c6c3d272360981b908301908152855161317781600d840160208a016137e8565b642720783d2760d81b600d9290910191820152845161319d8160128401602089016137e8565b642720793d2760d81b6012929091019182015283516131c38160178401602088016137e8565b6213979f60e91b60179290910191820152601a019695505050505050565b6000611c838284612bd2565b60006131f98285612bd2565b83516132098183602088016137e8565b01949350505050565b600061321e8286612bd2565b845161322e8183602089016137e8565b84519101906132418183602088016137e8565b0195945050505050565b673d913730b6b2911d60c11b81526d2242616e616e612054726565202360901b600882015283516000906132868160168501602089016137e8565b71111610113232b9b1b934b83a34b7b7111d1160711b6016918401918201527f5468652042616e616e6120547265652045636f7a20697320746865206162756e60288201527f64616e742070726f6475636572206f66207468652045636f7a797374656d2e2060488201527f546865697220706f70756c6174696f6e207374617973207374726f6e6720616e60688201527f6420667275697466756c20756e6c657373207468652042757368204275636b736088820152711033b2ba103a37b790343ab733b93c97171760711b60a88201526134056133f86133eb6133e56133ca6133bc6133b661338d60ba89016c1116101134b6b0b3b2911d101160991b8152600d0190565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c0000000000008152601a0190565b8b612bb6565b61088b60f21b815260020190565b6e2261747472696275746573223a205b60881b8152600f0190565b87612bb6565b605d60f81b815260010190565b607d60f81b815260010190565b9695505050505050565b7f3c7376672069643d2265636f7a2d7376672220786d6c6e733d22687474703a2f81527f2f7777772e77332e6f72672f323030302f73766722207072657365727665417360208201527f70656374526174696f3d22784d696e594d696e206d656574222076696577426f60408201527f783d22302030203332203332223e203c7265637420636c6173733d226267222060608201526d3c1e911811103c9e91181110179f60911b6080820152600083516134d081608e8501602088016137e8565b7f3c7374796c653e726563742e62677b77696474683a333270783b686569676874608e918401918201526b3a333270783b66696c6c3a2360a01b60ae82015283516135228160ba8401602088016137e8565b7f7d20726563747b77696474683a3170783b6865696768743a3170783b7d20236560ba92909101918201527f636f7a2d7376677b73686170652d72656e646572696e673a206372697370656460da8201527333b2b99dbe901e17b9ba3cb6329f1e17b9bb339f60611b60fa82015261010e01949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516135d481601d8501602087016137e8565b91909101601d0192915050565b602081526000611c836020830184612b8a565b6080815260006136076080830187612b8a565b82810360208401526136198187612b8a565b9050828103604084015261362d8186612b8a565b91505082606083015295945050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6040516080810167ffffffffffffffff8111828210171561369757613697613919565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156136c6576136c6613919565b604052919050565b600061ffff808316818516808303821115613209576132096138d7565b600082198211156136fe576136fe6138d7565b500190565b600060ff821660ff84168060ff03821115613720576137206138d7565b019392505050565b600082613737576137376138ed565b500490565b600061ffff8083168185168183048111821515161561375d5761375d6138d7565b02949350505050565b6000816000190483118215151615613780576137806138d7565b500290565b600060ff821660ff84168160ff04811182151516156137a6576137a66138d7565b029392505050565b6000828210156137c0576137c06138d7565b500390565b600060ff821660ff8416808210156137df576137df6138d7565b90039392505050565b60005b838110156138035781810151838201526020016137eb565b838111156104f85750506000910152565b600081613823576138236138d7565b506000190190565b600181811c9082168061383f57607f821691505b6020821081141561386057634e487b7160e01b600052602260045260246000fd5b50919050565b600061ffff8083168181141561387e5761387e6138d7565b6001019392505050565b600060001982141561389c5761389c6138d7565b5060010190565b600060ff821660ff8114156138ba576138ba6138d7565b60010192915050565b6000826138d2576138d26138ed565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfe7b2274726169745f74797065223a2253706563696573222c2276616c7565223a2242616e616e612054726565227d2c4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220960f26e447614541314ea8ba96e8f8e64f4fbf68b9b9f1309540b0f94da00ee164736f6c63430008070033

Deployed Bytecode Sourcemap

12225:19391:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12711:46;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;29464:256;;;;;;:::i;:::-;;:::i;:::-;;12652:28;;;;;;;;;;;;28181:14:1;;28174:22;28156:41;;28144:2;28129:18;12652:28:0;28016:187:1;12770:50:0;;;;;;:::i;:::-;;:::i;31213:164::-;;;;;;:::i;:::-;;:::i;7332:94::-;;;:::i;30484:563::-;;;;;;:::i;:::-;;:::i;6681:87::-;6727:7;6754:6;-1:-1:-1;;;;;6754:6:0;6681:87;;;-1:-1:-1;;;;;27972:32:1;;;27954:51;;27942:2;27927:18;6681:87:0;27808:203:1;29919:557:0;;;;;;:::i;:::-;;:::i;31527:86::-;;;:::i;15644:1536::-;;;;;;:::i;:::-;;:::i;:::-;;;30236:25:1;;;30224:2;30209:18;15644:1536:0;30090:177:1;31055:152:0;;;;;;:::i;:::-;;:::i;31385:130::-;;;;;;:::i;:::-;;:::i;12267:25::-;;;;;-1:-1:-1;;;;;12267:25:0;;;29732:179;;;;;;:::i;:::-;;:::i;7581:192::-;;;;;;:::i;:::-;;:::i;18172:11284::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;12711:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29464:256::-;6727:7;6754:6;-1:-1:-1;;;;;6754:6:0;5606:10;6901:23;6893:68;;;;-1:-1:-1;;;6893:68:0;;;;;;;:::i;:::-;;;;;;;;;29604:13;;::::1;::::0;:3:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;29628:13:0;;::::1;::::0;:6;;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;29652:13:0;;::::1;::::0;:6;;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;29676:19:0;;::::1;::::0;:6;;:19:::1;::::0;::::1;::::0;::::1;:::i;:::-;;6972:1;29464:256:::0;;;;:::o;12770:50::-;;;;;;;;;;;;;;;;;;;;31213:164;6727:7;6754:6;-1:-1:-1;;;;;6754:6:0;5606:10;6901:23;6893:68;;;;-1:-1:-1;;;6893:68:0;;;;;;;:::i;:::-;31291:21:::1;::::0;;;:14:::1;:21;::::0;;;;31284:28:::1;::::0;::::1;:::i;:::-;31351:1;31323:25:::0;;;:18:::1;:25;::::0;;;;:29;6972:1:::1;31213:164:::0;:::o;7332:94::-;6727:7;6754:6;-1:-1:-1;;;;;6754:6:0;5606:10;6901:23;6893:68;;;;-1:-1:-1;;;6893:68:0;;;;;;;:::i;:::-;7397:21:::1;7415:1;7397:9;:21::i;:::-;7332:94::o:0;30484:563::-;6727:7;6754:6;-1:-1:-1;;;;;6754:6:0;5606:10;6901:23;6893:68;;;;-1:-1:-1;;;6893:68:0;;;;;;;:::i;:::-;30595:9:::1;30590:331;30614:6;:13;30610:1;:17;30590:331;;;30649:14;:31;30664:15;30649:31;;;;;;;;;;;30704:190;;;;;;;;30732:6;30739:1;30732:9;;;;;;;;:::i;:::-;;;;;;;:19;;;30704:190;;;;30774:6;30781:1;30774:9;;;;;;;;:::i;:::-;;;;;;;:19;;;30704:190;;;;30816:6;30823:1;30816:9;;;;;;;;:::i;:::-;;;;;;;:16;;;30704:190;;;;30855:6;30862:1;30855:9;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;:20:::1;;::::0;30704:190;;;30649:260;;::::1;::::0;::::1;::::0;;-1:-1:-1;30649:260:0;;;;;;;;;;;;;::::1;;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;30649:260:0::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;30649:260:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;30629:3;;;;;:::i;:::-;;;;30590:331;;;-1:-1:-1::0;31007:13:0;;30969:35:::1;::::0;;;:18:::1;:35;::::0;;;;;:51:::1;::::0;31007:13;30969:51:::1;:::i;:::-;30931:35;::::0;;;:18:::1;:35;::::0;;;;:89;30484:563;;:::o;29919:557::-;6727:7;6754:6;-1:-1:-1;;;;;6754:6:0;5606:10;6901:23;6893:68;;;;-1:-1:-1;;;6893:68:0;;;;;;;:::i;:::-;30026:9:::1;30021:327;30045:6;:13;30041:1;:17;30021:327;;;30080:10;:27;30091:15;30080:27;;;;;;;;;;;30131:190;;;;;;;;30159:6;30166:1;30159:9;;;;;;;;:::i;:::-;;;;;;;:19;;;30131:190;;;;30201:6;30208:1;30201:9;;;;;;;;:::i;:::-;;;;;;;:19;;;30131:190;;;;30243:6;30250:1;30243:9;;;;;;;;:::i;:::-;;;;;;;:16;;;30131:190;;;;30282:6;30289:1;30282:9;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;:20:::1;;::::0;30131:190;;;30080:256;;::::1;::::0;::::1;::::0;;-1:-1:-1;30080:256:0;;;;;;;;;;;;;::::1;;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;30080:256:0::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;30080:256:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;30060:3;;;;;:::i;:::-;;;;30021:327;;;-1:-1:-1::0;30436:13:0;;30402:31:::1;::::0;;;:14:::1;:31;::::0;;;;;:47:::1;::::0;30436:13;30402:47:::1;:::i;:::-;30368:31;::::0;;;:14:::1;:31;::::0;;;;:81;29919:557;;:::o;31527:86::-;6727:7;6754:6;-1:-1:-1;;;;;6754:6:0;5606:10;6901:23;6893:68;;;;-1:-1:-1;;;6893:68:0;;;;;;;:::i;:::-;31573:8:::1;:15:::0;;-1:-1:-1;;31573:15:0::1;31584:4;31573:15;::::0;;31527:86::o;15644:1536::-;15765:12;;15715:7;;-1:-1:-1;;;;;15765:12:0;15743:10;:35;15735:44;;;;;;15790:17;15832:4;15822:6;:14;;:31;;;;;15849:4;15840:6;:13;15822:31;15818:1355;;;15886:1;15870:13;15904:631;15928:10;;15924:1;:14;15904:631;;;15964:12;15979:20;15986:4;15992:6;15979;:20::i;:::-;16045:17;;;;:14;:17;;;;;;15964:35;;-1:-1:-1;16030:39:0;;15964:35;16030:14;:39::i;:::-;16018:51;;16094:1;16099;16094:6;16090:386;;16172:20;;;;:12;:20;;;;;16194:27;16211:9;16194:16;:27::i;:::-;16155:67;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;16155:67:0;;;;;;;;;16125:20;;;;:12;16155:67;16125:20;;;;;;:98;;;;:20;;:98;;;;;:::i;:::-;;16090:386;;;16350:20;;;;:12;:20;;;;;16372:27;16389:9;16372:16;:27::i;:::-;16401;16418:9;16401:16;:27::i;:::-;16333:96;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;16333:96:0;;;;;;;;;16303:20;;;;:12;16333:96;16303:20;;;;;;:127;;;;:20;;:127;;;;;:::i;:::-;-1:-1:-1;16453:3:0;;;;:::i;:::-;;;;16090:386;16502:17;16510:9;16502:5;:17;:::i;:::-;16494:25;;15945:590;15940:3;;;;;:::i;:::-;;;;15904:631;;;;16561:2;16553:5;:10;16549:214;;;16591:1;16584:8;;;;;;16549:214;16640:2;16631:5;:11;;:25;;;;;16654:2;16646:5;:10;16631:25;16627:136;;;16684:1;16677:8;;;;;;16627:136;16746:1;16739:8;;;;;;15818:1355;16802:4;16793:6;:13;16789:384;;;16828:9;16823:266;16847:14;;16843:1;:18;16823:266;;;16887:12;16902:20;16909:4;16915:6;16902;:20::i;:::-;16988;;;;:12;:20;;;;;;;;17042:21;;;:18;:21;;;;;;;16887:35;;-1:-1:-1;16988:20:0;17010:61;;17027:43;;16887:35;17027:14;:43::i;:::-;17010:16;:61::i;:::-;16971:101;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;16971:101:0;;;;;;;;;16941:20;;;;:12;16971:101;16941:20;;;;;;:132;;;;:20;;:132;;;;;:::i;:::-;;16868:221;16863:3;;;;;:::i;:::-;;;;16823:266;;;;17110:1;17103:8;;;;;16789:384;17160:1;17153:8;;;15644:1536;;;;;:::o;31055:152::-;6727:7;6754:6;-1:-1:-1;;;;;6754:6:0;5606:10;6901:23;6893:68;;;;-1:-1:-1;;;6893:68:0;;;;;;;:::i;:::-;31129:17:::1;::::0;;;:10:::1;:17;::::0;;;;31122:24:::1;::::0;::::1;:::i;:::-;31181:1;31157:21:::0;;;:14:::1;:21;::::0;;;;:25;31055:152::o;31385:130::-;6727:7;6754:6;-1:-1:-1;;;;;6754:6:0;5606:10;6901:23;6893:68;;;;-1:-1:-1;;;6893:68:0;;;;;;;:::i;:::-;31457:12:::1;:33:::0;;-1:-1:-1;;;;;31457:33:0;::::1;-1:-1:-1::0;;;;;;31457:33:0;;::::1;;::::0;;31385:130;:::o;29732:179::-;6727:7;6754:6;-1:-1:-1;;;;;6754:6:0;5606:10;6901:23;6893:68;;;;-1:-1:-1;;;6893:68:0;;;;;;;:::i;:::-;29843:15:::1;:6;29852::::0;29843:15:::1;;:::i;:::-;-1:-1:-1::0;29869:17:0::1;:7;29879::::0;29869:17:::1;;:::i;:::-;;29732:179:::0;;:::o;7581:192::-;6727:7;6754:6;-1:-1:-1;;;;;6754:6:0;5606:10;6901:23;6893:68;;;;-1:-1:-1;;;6893:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7670:22:0;::::1;7662:73;;;::::0;-1:-1:-1;;;7662:73:0;;29524:2:1;7662:73:0::1;::::0;::::1;29506:21:1::0;29563:2;29543:18;;;29536:30;29602:34;29582:18;;;29575:62;-1:-1:-1;;;29653:18:1;;;29646:36;29699:19;;7662:73:0::1;29322:402:1::0;7662:73:0::1;7746:19;7756:8;7746:9;:19::i;18172:11284::-:0;18322:12;;18266:13;;-1:-1:-1;;;;;18322:12:0;18300:10;:35;18292:44;;;;;;18363:4;18353:6;:14;18349:11100;;18384:28;:80;;;;;;;;;;;;;;;;;;;18479:23;18517:32;;:::i;:::-;18703;;;;;;;;;;;;-1:-1:-1;;;18703:32:0;;;;18756:8;;18564:13;;18592:23;;;;18564:13;;18756:8;;:17;;;:34;;;18786:4;18777:6;:13;18756:34;18752:2172;;;18823:6;18811:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18889:14;18872:90;;;;;;;;:::i;:::-;;;;-1:-1:-1;;18872:90:0;;;;;;18982:18;;;;;;;;;-1:-1:-1;;;18872:90:0;18982:18;;;18872:90;-1:-1:-1;18872:90:0;-1:-1:-1;19050:1:0;19033:3;19050:1;19033:6;19027:20;;;;;:::i;:::-;:24;;;-1:-1:-1;19027:24:0;:::i;:::-;19019:32;;19077:8;19072:631;19095:5;19091:1;:9;;;19072:631;;;19142:46;19160:9;19171:5;:1;19175;19171:5;:::i;:::-;19142:46;;19178:5;:1;19182;19178:5;:::i;:::-;:9;;19186:1;19178:9;:::i;:::-;19142:46;;:17;:46::i;:::-;19130:58;;19211:7;19221:50;19236:34;19254:9;19265:1;19268;19236:17;:34::i;:::-;19221:14;:50::i;:::-;19211:60;;19294:7;19304:50;19319:34;19337:9;19348:1;19351;19319:17;:34::i;19304:50::-;19294:60;;19395:12;19408:1;19395:15;;;;;;;;;:::i;:::-;;;;;19411:1;19395:18;;;;;;;;;:::i;:::-;;;;;19391:32;;;19415:8;;;;19391:32;19496:9;19522:49;19536:34;19554:9;19565:1;19568;19536:17;:34::i;:::-;19522:13;:49::i;:::-;19580:19;19597:1;19580:19;;:16;:19::i;:::-;19608;19625:1;19608:19;;:16;:19::i;:::-;19479:155;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;19460:175;;19679:4;19658:12;19671:1;19658:15;;;;;;;;;:::i;:::-;;;;;19674:1;19658:18;;;;;;;;;:::i;:::-;:25;;;:18;;;;;:25;-1:-1:-1;;19072:631:0;19102:3;;;;:::i;:::-;;;;19072:631;;;;19760:409;19979:9;20054:7;19781:386;;;;;;;;;:::i;:::-;;;;;;;;;;;;;19760:14;:409::i;:::-;19723:465;;20294:606;20425:24;20442:6;20425:16;:24::i;:::-;20775:9;20853:14;20314:584;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20294:13;:606::i;:::-;20223:678;;;;;;;;:::i;:::-;;;;;;;;;;;;;20209:693;;;;;;;;;;;;18752:2172;20949:6;20959:4;20949:14;20945:1466;;;20996:3;20984:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21062:14;21244:28;21261:10;21244:16;:28::i;:::-;21045:233;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;21045:233:0;;;;;;21298:18;;;;;;;;;-1:-1:-1;;;21045:233:0;21298:18;;;21045:233;-1:-1:-1;21045:233:0;-1:-1:-1;20945:1466:0;;;21357:6;21367:4;21357:14;21353:1058;;;21404:6;21392:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21470:14;21648:28;21665:10;21648:16;:28::i;:::-;21453:229;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;21453:229:0;;;;;;21702:18;;;;;;;;;-1:-1:-1;;;21453:229:0;21702:18;;;21453:229;-1:-1:-1;21453:229:0;-1:-1:-1;21353:1058:0;;;21761:6;21771:4;21761:14;21757:654;;;21808:6;21796:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21874:14;22065:28;22082:10;22065:16;:28::i;:::-;21857:242;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;21857:242:0;;;;;;22119:18;;;;;;;;;-1:-1:-1;;;21857:242:0;22119:18;;;21857:242;-1:-1:-1;21857:242:0;-1:-1:-1;21757:654:0;;;22232:14;22359:28;22376:10;22359:16;:28::i;:::-;22215:179;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22191:204;;21757:654;22515:4;22506:6;:13;22502:663;;;22545:9;22540:610;22564:10;;22560:1;:14;22540:610;;;22608:1;22613;22608:6;22604:348;;22695:20;;;;:12;:20;;;;;22677:49;;22660:67;;22677:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22717:1;22720;22724;22720:5;;;;:::i;:::-;22677:17;:49::i;:::-;22660:16;:67::i;:::-;22828:13;;;;:10;:13;;;;;:29;;22643:84;;-1:-1:-1;22795:14:0;;22828:29;;;;;;;;;;:::i;:::-;;;;;;;;;;;:39;;22882:10;:13;22893:1;22882:13;;;;;;;;;;;22896:14;22882:29;;;;;;;;;;:::i;:::-;;;;;;;;;;;:39;;22778:149;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22754:174;;22604:348;23000:1;23005;23000:6;;:16;;;;;23010:1;23015;23010:6;;23000:16;22996:135;;;23086:14;23069:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;23045:62;;22996:135;22576:3;;;;:::i;:::-;;;;22540:610;;;;22502:663;23257:9;23280:1;23269:10;;:12;;;;:::i;:::-;23257:24;;23252:1705;23328:4;23319:6;:13;23315:645;;;23409:20;;;;:12;:20;;;;;23391:49;;23374:67;;23391:49;;;;;:::i;23374:67::-;23472:13;;;;:10;:13;;;;;:29;;23357:84;;-1:-1:-1;23472:13:0;:29;;;;;;;;;;:::i;:::-;;;;;;;;;;;:40;;;23464:48;;23315:645;;;23582:6;23592:4;23582:14;23578:363;;;23656:1;23639:3;23643:1;23639:6;;23633:20;;;;;:::i;:::-;:24;;;-1:-1:-1;23633:24:0;:::i;:::-;23625:32;;23578:363;;;23712:6;23722:4;23712:14;23708:233;;;23786:1;23769:3;23773:1;23769:6;;23708:233;23842:6;23852:4;23842:14;23838:103;;;23916:1;23899:3;23903:1;23899:6;23893:20;;;;;:::i;:::-;:24;;;-1:-1:-1;23893:24:0;:::i;:::-;23885:32;;23838:103;23985:8;23980:865;24003:5;23999:1;:9;;;23980:865;;;24051:4;24042:6;:13;24038:291;;;24096:46;24114:9;24125:5;:1;24129;24125:5;:::i;24096:46::-;24084:58;;24038:291;;;24250:13;;;;:10;:13;;;;;:29;;24232:73;;24250:13;:29;;;;;;;;;;:::i;:::-;;;;;;;;;;;:36;;24232:73;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24288:1;24292;24288:5;;;;:::i;24232:73::-;24220:85;;24038:291;24353:7;24363:50;24378:34;24396:9;24407:1;24410;24378:17;:34::i;24363:50::-;24353:60;;24436:7;24446:50;24461:34;24479:9;24490:1;24493;24461:17;:34::i;24446:50::-;24436:60;;24537:12;24550:1;24537:15;;;;;;;;;:::i;:::-;;;;;24553:1;24537:18;;;;;;;;;:::i;:::-;;;;;24533:32;;;24557:8;;;;24533:32;24638:9;24664:49;24678:34;24696:9;24707:1;24710;24678:17;:34::i;24664:49::-;24722:19;24739:1;24722:19;;:16;:19::i;:::-;24750;24767:1;24750:19;;:16;:19::i;:::-;24621:155;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24602:175;;24821:4;24800:12;24813:1;24800:15;;;;;;;;;:::i;:::-;;;;;24816:1;24800:18;;;;;;;;;:::i;:::-;:25;;;:18;;;;;:25;-1:-1:-1;;23980:865:0;24010:3;;;;:::i;:::-;;;;23980:865;;;-1:-1:-1;24869:6:0;;;:23;;;24888:4;24879:6;:13;24869:23;24865:77;;;24917:5;;24865:77;23291:3;;;;:::i;:::-;;;;23252:1705;;18349:11100;26160:28;:80;;;;;;;;;;;;;;;;;;;26255:23;26293:32;;:::i;:::-;26340:13;26368:23;26406:20;26441:21;:32;;;;;;;;;;;;;-1:-1:-1;;;26441:32:0;;;;;26529:14;26512:89;;;;;;;;:::i;:::-;;;;;;;;;;;;;26488:114;;26687:9;26682:537;26706:14;;26702:1;:18;26682:537;;;26798:20;;;;:12;:20;;;;;26780:49;;26763:67;;26780:49;;;;;:::i;26763:67::-;26923:17;;;;:14;:17;;;;;:33;;26746:84;;-1:-1:-1;26890:14:0;;26923:33;;;;;;;;;;:::i;:::-;;;;;;;;;;;:43;;26981:14;:17;26996:1;26981:17;;;;;;;;;;;26999:14;26981:33;;;;;;;;;;:::i;:::-;;;;;;;;;;;:43;;26873:157;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26849:182;;27096:1;27081:14;;:16;;;;:::i;:::-;27076:1;:21;27072:132;;27163:14;27146:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;27122:62;;27072:132;26722:3;;;;:::i;:::-;;;;26682:537;;;;27310:9;27337:1;27322:14;;:16;;;;:::i;:::-;27310:28;;27305:975;27423:20;;;;:12;:20;;;;;27405:49;;27388:67;;27405:49;;;;;:::i;27388:67::-;27482:17;;;;:14;:17;;;;;:33;;27371:84;;-1:-1:-1;27482:17:0;:33;;;;;;;;;;:::i;:::-;;;;;;;;;;;:44;;;27474:52;;27552:8;27547:638;27570:5;27566:1;:9;;;27547:638;;;27635:17;;;;:14;:17;;;;;:33;;27617:77;;27635:17;:33;;;;;;;;;;:::i;27617:77::-;27605:89;;27717:7;27727:50;27742:34;27760:9;27771:1;27774;27742:17;:34::i;27727:50::-;27717:60;;27800:7;27810:50;27825:34;27843:9;27854:1;27857;27825:17;:34::i;27810:50::-;27800:60;;27889:12;27902:1;27889:15;;;;;;;;;:::i;:::-;;;;;27905:1;27889:18;;;;;;;;;:::i;:::-;;;;;27885:32;;;27909:8;;;;27885:32;27978:9;28004:49;28018:34;28036:9;28047:1;28050;28018:17;:34::i;28004:49::-;28062:19;28079:1;28062:19;;:16;:19::i;:::-;28090;28107:1;28090:19;;:16;:19::i;:::-;27961:155;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27942:175;;28161:4;28140:12;28153:1;28140:15;;;;;;;;;:::i;:::-;;;;;28156:1;28140:18;;;;;;;;;:::i;:::-;:25;;;:18;;;;;:25;-1:-1:-1;;27547:638:0;27577:3;;;;:::i;:::-;;;;27547:638;;;-1:-1:-1;28209:6:0;28205:60;;28240:5;;28205:60;27347:3;;;;:::i;:::-;;;;27305:975;;;;28343:409;28562:9;28637:7;28364:386;;;;;;;;;:::i;28343:409::-;28306:465;;28869:562;28988:24;29005:6;28988:16;:24::i;:::-;29318:9;29388:14;28889:540;;;;;;;;;;:::i;28869:562::-;28802:630;;;;;;;;:::i;:::-;;;;;;;;;;;;;28788:645;;;;;;;;;;;7781:173;7837:16;7856:6;;-1:-1:-1;;;;;7873:17:0;;;-1:-1:-1;;;;;;7873:17:0;;;;;;7906:40;;7856:6;;;;;;;7906:40;;7837:16;7906:40;7826:128;7781:173;:::o;17189:300::-;17281:5;;17253:7;;17281:9;;:5;;;:9;:::i;:::-;17273:5;:17;;-1:-1:-1;;17273:17:0;;;;;;;;;;;17324:2;-1:-1:-1;17311:53:0;;17343:5;:9;;-1:-1:-1;;17343:9:0;;;17311:53;17465:5;;17399:72;;;17416:16;17399:72;;;27523:19:1;17434:15:0;27558:12:1;;;27551:28;;;;27617:2;27613:15;;;-1:-1:-1;;27609:53:1;27595:12;;;27588:75;27679:12;;;27672:28;;;27757:3;27735:16;;;;-1:-1:-1;;;;;;27735:16:1;27716:13;;;27709:59;17476:5:0;;27784:13:1;;17399:72:0;;;;;;;;;;;;17389:83;;;;;;17381:92;;:100;;;;:::i;:::-;17374:107;17189:300;-1:-1:-1;;;17189:300:0:o;12990:2642::-;13086:7;13106:17;13160:4;13140:16;:24;;:52;;;;;13187:5;13168:16;:24;13140:52;13136:2462;;;-1:-1:-1;13229:1:0;13136:2462;;;13283:4;13264:16;:23;;:50;;;;;13310:4;13291:16;:23;13264:50;13260:2338;;;13359:1;13342:14;:18;13339:155;;;13393:18;13397:14;13393:1;:18;:::i;:::-;13381:30;;13260:2338;;13339:155;-1:-1:-1;13477:1:0;13260:2338;;;13543:4;13524:16;:23;;:50;;;;;13570:4;13551:16;:23;13524:50;13520:2078;;;13621:1;13604:14;:18;13601:155;;;13655:18;13659:14;13655:1;:18;:::i;13601:155::-;-1:-1:-1;13739:1:0;13520:2078;;;13805:4;13786:16;:23;;:50;;;;;13832:4;13813:16;:23;13786:50;13782:1816;;;13883:1;13866:14;:18;13863:155;;;13917:18;13921:14;13917:1;:18;:::i;13863:155::-;-1:-1:-1;14001:1:0;13782:1816;;;14081:4;14062:16;:23;;:50;;;;;14108:4;14089:16;:23;14062:50;14058:1540;;;14155:1;14138:14;:18;14135:155;;;14189:18;14193:14;14189:1;:18;:::i;14135:155::-;-1:-1:-1;14273:1:0;14058:1540;;;14339:4;14320:16;:23;;:50;;;;;14366:4;14347:16;:23;14320:50;14316:1282;;;14413:1;14396:14;:18;14393:155;;;14447:18;14451:14;14447:1;:18;:::i;14393:155::-;-1:-1:-1;14531:1:0;14316:1282;;;14597:4;14578:16;:23;;:50;;;;;14624:4;14605:16;:23;14578:50;14574:1024;;;14671:1;14654:14;:18;14651:155;;;14705:18;14709:14;14705:1;:18;:::i;14651:155::-;-1:-1:-1;14789:1:0;14574:1024;;;14855:3;14836:16;:22;;:49;;;;;14881:4;14862:16;:23;14836:49;14832:766;;;14934:1;14917:14;:18;14914:155;;;14968:18;14972:14;14968:1;:18;:::i;14914:155::-;-1:-1:-1;15052:1:0;14832:766;;;15118:3;15099:16;:22;;:48;;;;;15144:3;15125:16;:22;15099:48;15095:503;;;15192:1;15179:10;;:14;15176:151;;;15226:18;15230:14;15226:1;:18;:::i;15176:151::-;-1:-1:-1;15310:1:0;15095:503;;;15400:3;15381:16;:22;15353:245;;;15451:2;15434:14;:19;15431:156;;;15486:18;15490:14;15486:1;:18;:::i;15431:156::-;-1:-1:-1;15570:1:0;15615:9;12990:2642;-1:-1:-1;;;12990:2642:0:o;10564:532::-;10620:13;10650:10;10646:53;;-1:-1:-1;;10677:10:0;;;;;;;;;;;;-1:-1:-1;;;10677:10:0;;;;;10564:532::o;10646:53::-;10724:5;10709:12;10765:78;10772:9;;10765:78;;10798:8;;;;:::i;:::-;;-1:-1:-1;10821:10:0;;-1:-1:-1;10829:2:0;10821:10;;:::i;:::-;;;10765:78;;;10853:19;10885:6;10875:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10875:17:0;;10853:39;;10903:154;10910:10;;10903:154;;10937:11;10947:1;10937:11;;:::i;:::-;;-1:-1:-1;11006:10:0;11014:2;11006:5;:10;:::i;:::-;10993:24;;:2;:24;:::i;:::-;10980:39;;10963:6;10970;10963:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;10963:56:0;;;;;;;;-1:-1:-1;11034:11:0;11043:2;11034:11;;:::i;:::-;;;10903:154;;;11081:6;10564:532;-1:-1:-1;;;;10564:532:0:o;11619:419::-;11752:13;11808:3;11778:21;11855;11866:10;11855:8;:21;:::i;:::-;11845:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11845:32:0;-1:-1:-1;11823:54:0;-1:-1:-1;11905:10:0;11888:111;11921:8;11917:1;:12;11888:111;;;11976:8;11985:1;11976:11;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;11976:11:0;11951:6;11958:14;11962:10;11958:1;:14;:::i;:::-;11951:22;;;;;;;;:::i;:::-;;;;:36;-1:-1:-1;;;;;11951:36:0;;;;;;;;-1:-1:-1;11931:3:0;;;;:::i;:::-;;;;11888:111;;;-1:-1:-1;12023:6:0;11619:419;-1:-1:-1;;;;;11619:419:0:o;17497:297::-;17572:5;;17590:178;17612:7;:14;17608:18;;;;17590:178;;;17729:12;17711:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;17701:43;;;;;;17685:7;17693:1;17685:10;;;;;;;;;;:::i;:::-;;;;;;;;17667:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;17657:41;;;;;;:87;17653:103;;;17754:1;17497:297;-1:-1:-1;;17497:297:0:o;17653:103::-;17628:3;;;;:::i;:::-;;;;17590:178;;;;17778:8;;;17810:354;17884:13;17915:7;17910:224;17932:7;:14;17928:18;;;;17910:224;;;18047:12;18029:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;18019:43;;;;;;18002:7;18010:1;18002:10;;;;;;;;;;:::i;:::-;;;;;;;;17984:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;17974:41;;;;;;:88;17970:149;;;18090:6;18097:1;18090:9;;;;;;;;;;:::i;:::-;;;;;;;;18083:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17810:354;;;:::o;17970:149::-;17948:3;;;;:::i;:::-;;;;17910:224;;8138:2316;8196:13;8226:4;:11;8241:1;8226:16;8222:31;;;-1:-1:-1;;8244:9:0;;;;;;;;;-1:-1:-1;8244:9:0;;;8138:2316::o;8222:31::-;8305:19;8327:5;;;;;;;;;;;;;;;;;8305:27;;8384:18;8430:1;8411:4;:11;8425:1;8411:15;;;;:::i;:::-;8410:21;;;;:::i;:::-;8405:27;;:1;:27;:::i;:::-;8384:48;-1:-1:-1;8515:20:0;8549:15;8384:48;8562:2;8549:15;:::i;:::-;8538:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8538:27:0;;8515:50;;8662:10;8654:6;8647:26;8757:1;8750:5;8746:13;8828:4;8879;8873:11;8864:7;8860:25;8987:2;8979:6;8975:15;9072:1069;9119:6;9110:7;9107:19;9072:1069;;;9201:1;9188:15;;;9269:14;;9452:4;9440:2;9436:14;;;9432:25;;9418:40;;9412:47;9407:3;9403:57;;;9342:137;;9643:2;9639:14;;;9635:25;;9621:40;;9615:47;9606:57;;9525:1;9510:17;;9545:137;9846:1;9842:13;;;9838:24;;9824:39;;9818:46;9809:56;;9713:17;;;9748:136;10040:16;;10026:31;;10020:38;10011:48;;9915:17;;;9950:128;;;;10109:17;;9072:1069;;;10214:1;10207:4;10201:11;10197:19;10235:1;10230:84;;;;10333:1;10328:82;;;;10190:220;;10230:84;-1:-1:-1;;;;;10263:17:0;;10256:43;10230:84;;10328:82;-1:-1:-1;;;;;10361:17:0;;10354:41;10190:220;-1:-1:-1;10440:6:0;;8138:2316;-1:-1:-1;;;;;;;;8138:2316:0:o;791:1912::-;849:13;879:4;:11;894:1;879:16;875:31;;;-1:-1:-1;;897:9:0;;;;;;;;;-1:-1:-1;897:9:0;;;791:1912::o;875:31::-;958:19;980:12;;;;;;;;;;;;;;;;;958:34;;1044:18;1090:1;1071:4;:11;1085:1;1071:15;;;;:::i;:::-;1070:21;;;;:::i;:::-;1065:27;;:1;:27;:::i;:::-;1044:48;-1:-1:-1;1175:20:0;1209:15;1044:48;1222:2;1209:15;:::i;:::-;1198:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1198:27:0;;1175:50;;1322:10;1314:6;1307:26;1417:1;1410:5;1406:13;1476:4;1527;1521:11;1512:7;1508:25;1623:2;1615:6;1611:15;1696:754;1715:6;1706:7;1703:19;1696:754;;;1815:1;1806:7;1802:15;1791:26;;1854:7;1848:14;1980:4;1972:5;1968:2;1964:14;1960:25;1950:8;1946:40;1940:47;1929:9;1921:67;2034:1;2023:9;2019:17;2006:30;;2113:4;2105:5;2101:2;2097:14;2093:25;2083:8;2079:40;2073:47;2062:9;2054:67;2167:1;2156:9;2152:17;2139:30;;2246:4;2238:5;2235:1;2230:14;2226:25;2216:8;2212:40;2206:47;2195:9;2187:67;2300:1;2289:9;2285:17;2272:30;;2379:4;2371:5;2359:25;2349:8;2345:40;2339:47;2328:9;2320:67;-1:-1:-1;2433:1:0;2418:17;1696:754;;11104:503;11190:16;11253:2;11190:16;;11292:286;11314:7;:14;11310:1;:18;;;11292:286;;;11401:2;11385:7;11393:1;11385:10;;;;;;;;;;:::i;:::-;;;;;;;11373:30;;;;11372:85;;;11454:2;11438:7;11446:1;11438:10;;;;;;;;;;:::i;:::-;;;;;;;11426:30;;11372:85;11350:217;;;11492:10;11500:2;11492:10;;:::i;:::-;;;11549:2;11535:7;11543:1;11535:10;;;;;;;;;;:::i;:::-;;;;;11529:22;;;11535:10;;11529:22;:::i;:::-;11521:30;;;;:::i;:::-;;;11350:217;11330:3;;;;:::i;:::-;;;;11292:286;;;-1:-1:-1;11595:4:0;11104:503;-1:-1:-1;;;11104:503:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:884::-;241:5;294:3;287:4;279:6;275:17;271:27;261:55;;312:1;309;302:12;261:55;345:2;339:9;367:4;410:2;402:6;398:15;432:18;500:6;488:10;485:22;480:2;468:10;465:18;462:46;459:72;;;511:18;;:::i;:::-;551:10;547:2;540:22;582:6;571:17;;608:6;646:3;641:2;633:6;629:15;626:24;623:44;;;663:1;660;653:12;623:44;685:1;676:10;;706:1;716:330;732:4;727:3;724:13;716:330;;;815:3;802:17;851:2;838:11;835:19;832:39;;;867:1;864;857:12;832:39;896:48;940:3;926:11;918:6;914:24;896:48;:::i;:::-;884:61;;-1:-1:-1;968:4:1;992:12;;;;1024;;;;;756:1;747:11;716:330;;;-1:-1:-1;1064:6:1;;192:884;-1:-1:-1;;;;;;;192:884:1:o;1081:531::-;1124:5;1177:3;1170:4;1162:6;1158:17;1154:27;1144:55;;1195:1;1192;1185:12;1144:55;1231:6;1218:20;1257:18;1253:2;1250:26;1247:52;;;1279:18;;:::i;:::-;1323:55;1366:2;1347:13;;-1:-1:-1;;1343:27:1;1372:4;1339:38;1323:55;:::i;:::-;1403:2;1394:7;1387:19;1449:3;1442:4;1437:2;1429:6;1425:15;1421:26;1418:35;1415:55;;;1466:1;1463;1456:12;1415:55;1531:2;1524:4;1516:6;1512:17;1505:4;1496:7;1492:18;1479:55;1579:1;1554:16;;;1572:4;1550:27;1543:38;;;;1558:7;1081:531;-1:-1:-1;;;1081:531:1:o;1617:186::-;1676:6;1729:2;1717:9;1708:7;1704:23;1700:32;1697:52;;;1745:1;1742;1735:12;1697:52;1768:29;1787:9;1768:29;:::i;1808:254::-;1876:6;1884;1937:2;1925:9;1916:7;1912:23;1908:32;1905:52;;;1953:1;1950;1943:12;1905:52;1976:29;1995:9;1976:29;:::i;:::-;1966:39;2052:2;2037:18;;;;2024:32;;-1:-1:-1;;;1808:254:1:o;2067:603::-;2203:6;2211;2264:2;2252:9;2243:7;2239:23;2235:32;2232:52;;;2280:1;2277;2270:12;2232:52;2320:9;2307:23;2349:18;2390:2;2382:6;2379:14;2376:34;;;2406:1;2403;2396:12;2376:34;2429:56;2477:7;2468:6;2457:9;2453:22;2429:56;:::i;:::-;2419:66;;2538:2;2527:9;2523:18;2510:32;2494:48;;2567:2;2557:8;2554:16;2551:36;;;2583:1;2580;2573:12;2551:36;;2606:58;2656:7;2645:8;2634:9;2630:24;2606:58;:::i;:::-;2596:68;;;2067:603;;;;;:::o;2675:944::-;2801:6;2809;2817;2825;2878:3;2866:9;2857:7;2853:23;2849:33;2846:53;;;2895:1;2892;2885:12;2846:53;2935:9;2922:23;2964:18;3005:2;2997:6;2994:14;2991:34;;;3021:1;3018;3011:12;2991:34;3044:50;3086:7;3077:6;3066:9;3062:22;3044:50;:::i;:::-;3034:60;;3147:2;3136:9;3132:18;3119:32;3103:48;;3176:2;3166:8;3163:16;3160:36;;;3192:1;3189;3182:12;3160:36;3215:52;3259:7;3248:8;3237:9;3233:24;3215:52;:::i;:::-;3205:62;;3320:2;3309:9;3305:18;3292:32;3276:48;;3349:2;3339:8;3336:16;3333:36;;;3365:1;3362;3355:12;3333:36;3388:52;3432:7;3421:8;3410:9;3406:24;3388:52;:::i;:::-;3378:62;;3493:2;3482:9;3478:18;3465:32;3449:48;;3522:2;3512:8;3509:16;3506:36;;;3538:1;3535;3528:12;3506:36;;3561:52;3605:7;3594:8;3583:9;3579:24;3561:52;:::i;:::-;3551:62;;;2675:944;;;;;;;:::o;3624:180::-;3683:6;3736:2;3724:9;3715:7;3711:23;3707:32;3704:52;;;3752:1;3749;3742:12;3704:52;-1:-1:-1;3775:23:1;;3624:180;-1:-1:-1;3624:180:1:o;3809:1938::-;3924:6;3932;3985:2;3973:9;3964:7;3960:23;3956:32;3953:52;;;4001:1;3998;3991:12;3953:52;4037:9;4024:23;4014:33;;4066:2;4119;4108:9;4104:18;4091:32;4142:18;4183:2;4175:6;4172:14;4169:34;;;4199:1;4196;4189:12;4169:34;4237:6;4226:9;4222:22;4212:32;;4282:7;4275:4;4271:2;4267:13;4263:27;4253:55;;4304:1;4301;4294:12;4253:55;4340:2;4327:16;4362:2;4358;4355:10;4352:36;;;4368:18;;:::i;:::-;4414:2;4411:1;4407:10;4437:28;4461:2;4457;4453:11;4437:28;:::i;:::-;4499:15;;;4530:12;;;;4562:11;;;4592;;;4588:20;;4585:33;-1:-1:-1;4582:53:1;;;4631:1;4628;4621:12;4582:53;4653:1;4644:10;;4663:1054;4677:2;4674:1;4671:9;4663:1054;;;4754:3;4741:17;4790:2;4777:11;4774:19;4771:39;;;4806:1;4803;4796:12;4771:39;4833:20;;4905:4;4877:16;;;-1:-1:-1;;4873:30:1;4869:41;4866:61;;;4923:1;4920;4913:12;4866:61;4953:22;;:::i;:::-;5025:2;5021;5017:11;5004:25;5058:2;5048:8;5045:16;5042:36;;;5074:1;5071;5064:12;5042:36;5105:54;5151:7;5146:2;5135:8;5131:2;5127:17;5123:26;5105:54;:::i;:::-;5098:5;5091:69;;5210:2;5206;5202:11;5189:25;5243:2;5233:8;5230:16;5227:36;;;5259:1;5256;5249:12;5227:36;5299:54;5345:7;5340:2;5329:8;5325:2;5321:17;5317:26;5299:54;:::i;:::-;5294:2;5287:5;5283:14;5276:78;;5404:2;5400;5396:11;5383:25;5437:2;5427:8;5424:16;5421:36;;;5453:1;5450;5443:12;5421:36;5493:54;5539:7;5534:2;5523:8;5519:2;5515:17;5511:26;5493:54;:::i;:::-;5488:2;5477:14;;5470:78;-1:-1:-1;5605:4:1;5597:13;;;;5584:27;5579:2;5568:14;;5561:51;5625:18;;4695:1;4688:9;;;;;5663:12;;;;5695;;4663:1054;;;4667:3;5736:5;5726:15;;;;;;;;;3809:1938;;;;;:::o;5752:248::-;5820:6;5828;5881:2;5869:9;5860:7;5856:23;5852:32;5849:52;;;5897:1;5894;5887:12;5849:52;-1:-1:-1;;5920:23:1;;;5990:2;5975:18;;;5962:32;;-1:-1:-1;5752:248:1:o;6005:269::-;6058:3;6096:5;6090:12;6123:6;6118:3;6111:19;6139:63;6195:6;6188:4;6183:3;6179:14;6172:4;6165:5;6161:16;6139:63;:::i;:::-;6256:2;6235:15;-1:-1:-1;;6231:29:1;6222:39;;;;6263:4;6218:50;;6005:269;-1:-1:-1;;6005:269:1:o;6279:185::-;6321:3;6359:5;6353:12;6374:52;6419:6;6414:3;6407:4;6400:5;6396:16;6374:52;:::i;:::-;6442:16;;;;;6279:185;-1:-1:-1;;6279:185:1:o;6469:973::-;6554:12;;6519:3;;6609:1;6629:18;;;;6682;;;;6709:61;;6763:4;6755:6;6751:17;6741:27;;6709:61;6789:2;6837;6829:6;6826:14;6806:18;6803:38;6800:161;;;6883:10;6878:3;6874:20;6871:1;6864:31;6918:4;6915:1;6908:15;6946:4;6943:1;6936:15;6800:161;6977:18;7004:104;;;;7122:1;7117:319;;;;6970:466;;7004:104;-1:-1:-1;;7037:24:1;;7025:37;;7082:16;;;;-1:-1:-1;7004:104:1;;7117:319;30883:1;30876:14;;;30920:4;30907:18;;7211:1;7225:165;7239:6;7236:1;7233:13;7225:165;;;7317:14;;7304:11;;;7297:35;7360:16;;;;7254:10;;7225:165;;;7229:3;;7419:6;7414:3;7410:16;7403:23;;6970:466;;;;;;;6469:973;;;;:::o;8399:276::-;8530:3;8568:6;8562:13;8584:53;8630:6;8625:3;8618:4;8610:6;8606:17;8584:53;:::i;:::-;8653:16;;;;;8399:276;-1:-1:-1;;8399:276:1:o;8680:439::-;8912:3;8950:6;8944:13;8966:53;9012:6;9007:3;9000:4;8992:6;8988:17;8966:53;:::i;:::-;-1:-1:-1;;;9041:16:1;;9066:18;;;-1:-1:-1;9111:1:1;9100:13;;8680:439;-1:-1:-1;8680:439:1:o;9124:990::-;9648:3;9686:6;9680:13;9702:53;9748:6;9743:3;9736:4;9728:6;9724:17;9702:53;:::i;:::-;-1:-1:-1;;;9777:16:1;;;9802:57;;;9878:49;9923:2;9912:14;;9904:6;9878:49;:::i;:::-;-1:-1:-1;;;9936:46:1;;9868:59;-1:-1:-1;10001:46:1;10043:2;10035:11;;10027:6;10001:46;:::i;:::-;-1:-1:-1;;;10056:26:1;;10106:1;10098:10;;9124:990;-1:-1:-1;;;;;;9124:990:1:o;10119:961::-;10654:3;10692:6;10686:13;10708:53;10754:6;10749:3;10742:4;10734:6;10730:17;10708:53;:::i;:::-;-1:-1:-1;;;10783:16:1;;10808:57;;;-1:-1:-1;;;;10892:2:1;10881:14;;10874:32;-1:-1:-1;;;10933:2:1;10922:14;;10915:58;-1:-1:-1;;;11000:4:1;10989:16;;10982:62;11071:2;11060:14;;10119:961;-1:-1:-1;10119:961:1:o;11085:1770::-;12072:3;12110:6;12104:13;12126:53;12172:6;12167:3;12160:4;12152:6;12148:17;12126:53;:::i;:::-;-1:-1:-1;;;12201:16:1;;;12287:17;;;-1:-1:-1;;;12331:2:1;12320:14;;12313:36;-1:-1:-1;;;12429:2:1;12418:14;;12411:26;;;-1:-1:-1;;;12464:2:1;12453:14;;12446:56;12529:2;12518:14;;12511:26;;;;-1:-1:-1;;;12564:2:1;12553:14;;12546:43;12616:2;12605:14;;12598:26;;;;12649:13;;12671:66;12649:13;12723:2;12712:14;;12705:4;12693:17;;12671:66;:::i;:::-;-1:-1:-1;;;12800:2:1;12756:20;;;;12792:11;;;12785:37;12846:2;12838:11;;11085:1770;-1:-1:-1;;;;11085:1770:1:o;12860:953::-;13395:3;13433:6;13427:13;13449:53;13495:6;13490:3;13483:4;13475:6;13471:17;13449:53;:::i;:::-;-1:-1:-1;;;13524:16:1;;13549:57;;;-1:-1:-1;;;;13633:2:1;13622:14;;13615:36;-1:-1:-1;;;13678:2:1;13667:14;;13660:58;-1:-1:-1;;;13745:2:1;13734:14;;13727:50;13804:2;13793:14;;12860:953;-1:-1:-1;12860:953:1:o;13818:2217::-;15209:3;15247:6;15241:13;15263:53;15309:6;15304:3;15297:4;15289:6;15285:17;15263:53;:::i;:::-;-1:-1:-1;;;15338:16:1;;;15424:17;;;-1:-1:-1;;;15468:2:1;15457:14;;15450:29;-1:-1:-1;;;15559:2:1;15548:14;;15541:26;;;-1:-1:-1;;;15594:2:1;15583:14;;15576:60;15663:2;15652:14;;15645:26;;;-1:-1:-1;;;15698:2:1;15687:14;;15680:36;15743:2;15732:14;;15725:26;;;-1:-1:-1;;;15778:2:1;15767:14;;15760:56;15843:2;15832:14;;15825:26;;;;-1:-1:-1;;;15878:3:1;15867:15;;15860:44;15931:3;15920:15;;15913:27;;;;15956:73;15986:42;16023:3;16012:15;;16004:6;15986:42;:::i;:::-;-1:-1:-1;;;7637:27:1;;7689:1;7680:11;;7572:125;15956:73;15949:80;13818:2217;-1:-1:-1;;;;;13818:2217:1:o;16040:2208::-;17431:3;17469:6;17463:13;17485:53;17531:6;17526:3;17519:4;17511:6;17507:17;17485:53;:::i;:::-;-1:-1:-1;;;17560:16:1;;;17646:17;;;-1:-1:-1;;;17690:2:1;17679:14;;17672:29;-1:-1:-1;;;17781:2:1;17770:14;;17763:26;;;-1:-1:-1;;;17816:2:1;17805:14;;17798:52;17877:2;17866:14;;17859:26;;;-1:-1:-1;;;17912:2:1;17901:14;;17894:36;17957:2;17946:14;;17939:26;;;-1:-1:-1;;;17992:2:1;17981:14;;17974:56;18057:2;18046:14;;18039:26;;;;-1:-1:-1;;;18092:2:1;18081:14;;18074:43;18144:3;18133:15;;18126:27;;;;18169:73;18199:42;18236:3;18225:15;;18217:6;18199:42;:::i;18253:2234::-;19644:3;19682:6;19676:13;19698:53;19744:6;19739:3;19732:4;19724:6;19720:17;19698:53;:::i;:::-;-1:-1:-1;;;19773:16:1;;;19859:17;;;-1:-1:-1;;;19903:2:1;19892:14;;19885:29;-1:-1:-1;;;19994:2:1;19983:14;;19976:26;;;-1:-1:-1;;;20029:2:1;20018:14;;20011:77;20115:2;20104:14;;20097:26;;;-1:-1:-1;;;20150:2:1;20139:14;;20132:36;20195:2;20184:14;;20177:26;;;-1:-1:-1;;;20230:2:1;20219:14;;20212:56;20295:2;20284:14;;20277:26;;;;-1:-1:-1;;;20330:3:1;20319:15;;20312:44;20383:3;20372:15;;20365:27;;;;20408:73;20438:42;20475:3;20464:15;;20456:6;20438:42;:::i;20492:1449::-;21171:3;21209:6;21203:13;21225:53;21271:6;21266:3;21259:4;21251:6;21247:17;21225:53;:::i;:::-;-1:-1:-1;;;21300:16:1;;;21325:30;;;21380:13;;21402:66;21380:13;21454:2;21443:14;;21436:4;21424:17;;21402:66;:::i;:::-;-1:-1:-1;;;21531:2:1;21487:20;;;;21523:11;;;21516:28;21569:13;;21591:63;21569:13;21640:2;21632:11;;21625:4;21613:17;;21591:63;:::i;:::-;-1:-1:-1;;;21714:2:1;21673:17;;;;21706:11;;;21699:28;21752:13;;21774:63;21752:13;21823:2;21815:11;;21808:4;21796:17;;21774:63;:::i;:::-;-1:-1:-1;;;21897:2:1;21856:17;;;;21889:11;;;21882:26;21932:2;21924:11;;20492:1449;-1:-1:-1;;;;;;20492:1449:1:o;21946:197::-;22074:3;22099:38;22133:3;22125:6;22099:38;:::i;22148:376::-;22324:3;22352:38;22386:3;22378:6;22352:38;:::i;:::-;22419:6;22413:13;22435:52;22480:6;22476:2;22469:4;22461:6;22457:17;22435:52;:::i;:::-;22503:15;;22148:376;-1:-1:-1;;;;22148:376:1:o;22529:570::-;22753:3;22781:38;22815:3;22807:6;22781:38;:::i;:::-;22848:6;22842:13;22864:52;22909:6;22905:2;22898:4;22890:6;22886:17;22864:52;:::i;:::-;22978:13;;22938:15;;;23000:57;22978:13;22938:15;23034:4;23022:17;;23000:57;:::i;:::-;23073:20;;22529:570;-1:-1:-1;;;;;22529:570:1:o;23104:2164::-;-1:-1:-1;;;24359:41:1;;-1:-1:-1;;;24425:1:1;24416:11;;24409:61;24493:13;;-1:-1:-1;;24515:62:1;24493:13;24565:2;24556:12;;24549:4;24537:17;;24515:62;:::i;:::-;-1:-1:-1;;;24636:2:1;24596:16;;;24628:11;;;24621:69;24719:34;24714:2;24706:11;;24699:55;24783:34;24778:2;24770:11;;24763:55;24848:34;24842:3;24834:12;;24827:56;24913:34;24907:3;24899:12;;24892:56;-1:-1:-1;;;24972:3:1;24964:12;;24957:42;25015:247;25045:216;25075:185;25101:158;25131:127;25156:101;25182:74;25212:43;25250:3;25242:12;;-1:-1:-1;;;7767:51:1;;7843:2;7834:12;;7702:150;25212:43;8331:28;8319:41;;8385:2;8376:12;;8254:140;25182:74;25174:6;25156:101;:::i;:::-;-1:-1:-1;;;7507:27:1;;7559:1;7550:11;;7447:120;25131:127;-1:-1:-1;;;8041:55:1;;8121:2;8112:12;;7976:154;25101:158;25093:6;25075:185;:::i;:::-;-1:-1:-1;;;8200:16:1;;8241:1;8232:11;;8135:114;25045:216;-1:-1:-1;;;7922:16:1;;7963:1;7954:11;;7857:114;25015:247;25008:254;23104:2164;-1:-1:-1;;;;;;23104:2164:1:o;25273:1555::-;25785:66;25780:3;25773:79;25882:66;25877:2;25872:3;25868:12;25861:88;25979:66;25974:2;25969:3;25965:12;25958:88;26076:66;26071:2;26066:3;26062:12;26055:88;26183:30;26178:3;26174:40;26168:3;26163;26159:13;26152:63;25755:3;26244:6;26238:13;26260:61;26314:6;26308:3;26303;26299:13;26294:2;26286:6;26282:15;26260:61;:::i;:::-;26386:34;26380:3;26340:16;;;26372:12;;;26365:56;-1:-1:-1;;;26445:3:1;26437:12;;26430:36;26491:13;;26513:62;26491:13;26560:3;26552:12;;26547:2;26535:15;;26513:62;:::i;:::-;26641:34;26635:3;26594:17;;;;26627:12;;;26620:56;26706:34;26700:3;26692:12;;26685:56;-1:-1:-1;;;26765:3:1;26757:12;;26750:44;26818:3;26810:12;;25273:1555;-1:-1:-1;;;;25273:1555:1:o;26833:448::-;27095:31;27090:3;27083:44;27065:3;27156:6;27150:13;27172:62;27227:6;27222:2;27217:3;27213:12;27206:4;27198:6;27194:17;27172:62;:::i;:::-;27254:16;;;;27272:2;27250:25;;26833:448;-1:-1:-1;;26833:448:1:o;28429:231::-;28578:2;28567:9;28560:21;28541:4;28598:56;28650:2;28639:9;28635:18;28627:6;28598:56;:::i;28665:652::-;28938:3;28927:9;28920:22;28901:4;28965:57;29017:3;29006:9;29002:19;28994:6;28965:57;:::i;:::-;29070:9;29062:6;29058:22;29053:2;29042:9;29038:18;29031:50;29104:44;29141:6;29133;29104:44;:::i;:::-;29090:58;;29196:9;29188:6;29184:22;29179:2;29168:9;29164:18;29157:50;29224:44;29261:6;29253;29224:44;:::i;:::-;29216:52;;;29304:6;29299:2;29288:9;29284:18;29277:34;28665:652;;;;;;;:::o;29729:356::-;29931:2;29913:21;;;29950:18;;;29943:30;30009:34;30004:2;29989:18;;29982:62;30076:2;30061:18;;29729:356::o;30272:253::-;30344:2;30338:9;30386:4;30374:17;;30421:18;30406:34;;30442:22;;;30403:62;30400:88;;;30468:18;;:::i;:::-;30504:2;30497:22;30272:253;:::o;30530:275::-;30601:2;30595:9;30666:2;30647:13;;-1:-1:-1;;30643:27:1;30631:40;;30701:18;30686:34;;30722:22;;;30683:62;30680:88;;;30748:18;;:::i;:::-;30784:2;30777:22;30530:275;;-1:-1:-1;30530:275:1:o;30936:224::-;30975:3;31003:6;31036:2;31033:1;31029:10;31066:2;31063:1;31059:10;31097:3;31093:2;31089:12;31084:3;31081:21;31078:47;;;31105:18;;:::i;31165:128::-;31205:3;31236:1;31232:6;31229:1;31226:13;31223:39;;;31242:18;;:::i;:::-;-1:-1:-1;31278:9:1;;31165:128::o;31298:204::-;31336:3;31372:4;31369:1;31365:12;31404:4;31401:1;31397:12;31439:3;31433:4;31429:14;31424:3;31421:23;31418:49;;;31447:18;;:::i;:::-;31483:13;;31298:204;-1:-1:-1;;;31298:204:1:o;31507:120::-;31547:1;31573;31563:35;;31578:18;;:::i;:::-;-1:-1:-1;31612:9:1;;31507:120::o;31632:258::-;31671:7;31703:6;31736:2;31733:1;31729:10;31766:2;31763:1;31759:10;31822:3;31818:2;31814:12;31809:3;31806:21;31799:3;31792:11;31785:19;31781:47;31778:73;;;31831:18;;:::i;:::-;31871:13;;31632:258;-1:-1:-1;;;;31632:258:1:o;31895:168::-;31935:7;32001:1;31997;31993:6;31989:14;31986:1;31983:21;31978:1;31971:9;31964:17;31960:45;31957:71;;;32008:18;;:::i;:::-;-1:-1:-1;32048:9:1;;31895:168::o;32068:238::-;32106:7;32146:4;32143:1;32139:12;32178:4;32175:1;32171:12;32238:3;32232:4;32228:14;32223:3;32220:23;32213:3;32206:11;32199:19;32195:49;32192:75;;;32247:18;;:::i;:::-;32287:13;;32068:238;-1:-1:-1;;;32068:238:1:o;32311:125::-;32351:4;32379:1;32376;32373:8;32370:34;;;32384:18;;:::i;:::-;-1:-1:-1;32421:9:1;;32311:125::o;32441:195::-;32479:4;32516;32513:1;32509:12;32548:4;32545:1;32541:12;32573:3;32568;32565:12;32562:38;;;32580:18;;:::i;:::-;32617:13;;;32441:195;-1:-1:-1;;;32441:195:1:o;32641:258::-;32713:1;32723:113;32737:6;32734:1;32731:13;32723:113;;;32813:11;;;32807:18;32794:11;;;32787:39;32759:2;32752:10;32723:113;;;32854:6;32851:1;32848:13;32845:48;;;-1:-1:-1;;32889:1:1;32871:16;;32864:27;32641:258::o;32904:136::-;32943:3;32971:5;32961:39;;32980:18;;:::i;:::-;-1:-1:-1;;;33016:18:1;;32904:136::o;33045:380::-;33124:1;33120:12;;;;33167;;;33188:61;;33242:4;33234:6;33230:17;33220:27;;33188:61;33295:2;33287:6;33284:14;33264:18;33261:38;33258:161;;;33341:10;33336:3;33332:20;33329:1;33322:31;33376:4;33373:1;33366:15;33404:4;33401:1;33394:15;33258:161;;33045:380;;;:::o;33430:197::-;33468:3;33496:6;33537:2;33530:5;33526:14;33564:2;33555:7;33552:15;33549:41;;;33570:18;;:::i;:::-;33619:1;33606:15;;33430:197;-1:-1:-1;;;33430:197:1:o;33632:135::-;33671:3;-1:-1:-1;;33692:17:1;;33689:43;;;33712:18;;:::i;:::-;-1:-1:-1;33759:1:1;33748:13;;33632:135::o;33772:175::-;33809:3;33853:4;33846:5;33842:16;33882:4;33873:7;33870:17;33867:43;;;33890:18;;:::i;:::-;33939:1;33926:15;;33772:175;-1:-1:-1;;33772:175:1:o;33952:112::-;33984:1;34010;34000:35;;34015:18;;:::i;:::-;-1:-1:-1;34049:9:1;;33952:112::o;34069:127::-;34130:10;34125:3;34121:20;34118:1;34111:31;34161:4;34158:1;34151:15;34185:4;34182:1;34175:15;34201:127;34262:10;34257:3;34253:20;34250:1;34243:31;34293:4;34290:1;34283:15;34317:4;34314:1;34307:15;34333:127;34394:10;34389:3;34385:20;34382:1;34375:31;34425:4;34422:1;34415:15;34449:4;34446:1;34439:15;34465:127;34526:10;34521:3;34517:20;34514:1;34507:31;34557:4;34554:1;34547:15;34581:4;34578:1;34571:15

Swarm Source

ipfs://960f26e447614541314ea8ba96e8f8e64f4fbf68b9b9f1309540b0f94da00ee1

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.