ETH Price: $3,333.27 (-0.30%)

Token

Friendly Fractals N (FRFRACN)
 

Overview

Max Total Supply

2,100 FRFRACN

Holders

977

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
feelline.eth
Balance
1 FRFRACN
0x7776caea867683fb174b6b4fc47a2b31423b95e0
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
FriendlyFractalsN

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-04
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.0;

library Address {
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

interface IERC165 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

abstract contract ERC165 is IERC165 {
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

interface IERC721 is IERC165 {
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    function balanceOf(address owner) external view returns (uint256 balance);
    function ownerOf(uint256 tokenId) external view returns (address owner);
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;
    function approve(address to, uint256 tokenId) external;
    function getApproved(uint256 tokenId) external view returns (address operator);
    function setApprovalForAll(address operator, bool _approved) external;
    function isApprovedForAll(address owner, address operator) external view returns (bool);
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

interface IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

interface IERC721Metadata is IERC721 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;

    string private _name;
    string private _symbol;
    mapping(uint256 => address) private _owners;
    mapping(address => uint256) private _balances;
    mapping(uint256 => address) private _tokenApprovals;
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        return "";
    }

    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

interface IERC721Enumerable is IERC721 {
    function totalSupply() external view returns (uint256);
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);
    function tokenByIndex(uint256 index) external view returns (uint256);
}

abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;
    mapping(uint256 => uint256) private _ownedTokensIndex;
    uint256[] private _allTokens;
    mapping(uint256 => uint256) private _allTokensIndex;

    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }
        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

abstract contract ReentrancyGuard {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

library Math {
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }
}

interface InterfaceN  {
    function ownerOf(uint256 tokenId) external view returns (address owner);

    function getFirst(uint256 tokenId) external view returns (uint256);
    function getSecond(uint256 tokenId) external view returns (uint256);
    function getThird(uint256 tokenId) external view returns (uint256);
    function getFourth(uint256 tokenId) external view returns (uint256); 
    function getFifth(uint256 tokenId) external view returns (uint256); 
    function getSixth(uint256 tokenId) external view returns (uint256); 
    function getSeventh(uint256 tokenId) external view returns (uint256);
    function getEight(uint256 tokenId) external view returns (uint256);
}

contract FriendlyFractalsN is ERC721("Friendly Fractals N", "FRFRACN"), ERC721Enumerable, ReentrancyGuard {
    address public addressN;

	bytes private uriHead1 = "data:application/json;charset=utf-8,%7B%22name%22%3A%20%22Friendly%20Fractals%20N%20";
	bytes private uriHead2 = "%22%2C%22description%22%3A%20%22Fully%20on-chain%20generative%20fractal%20patterns%20based%20on%20the%20your%20n.%22%2C%22image%22%3A%20%22data%3Aimage%2Fsvg%2Bxml%3Bcharset%3Dutf-8%2C%3Csvg%20width%3D'100%25'%20height%3D'100%25'%20viewBox%3D'0%200%20100000%20100000'%20style%3D'stroke-width%3A";
    bytes private uriHead3 = "%20background-color%3Argb(0%2C0%2C0)'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E";
	bytes private uriTail = "%3C%2Fsvg%3E%22%7D";

    constructor(address addressOfN) {
        addressN = addressOfN;
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

    function mint(uint256 tokenId) public nonReentrant {
        require(tokenId > 0 && tokenId < 8889, "FriendlyFractalsN: Token ID invalid");
    	require(InterfaceN(addressN).ownerOf(tokenId) == _msgSender(), "FriendlyFractalsN: Must own respective N");

    	_safeMint(_msgSender(), tokenId);
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        return tokenSVGFromSeed(tokenId);
    }

    function tokenSVGFromSeed(uint256 tokenId) internal view returns (string memory) {
        uint256 numIterations = 6;

        // space to store the string format of x1, y1, x2, y2
        string[4] memory vars = ["1000000", "1000000", "1000000", "1000000"];

        // Sixth N: Iterations 1 to 2 (typea)
        // Seventh N: Iterations 3 to 4 (typeb)
        // Eight N: Iterations 5 to 6 (typec)
        uint256 typea = InterfaceN(addressN).getSixth(tokenId) % 9;
        uint256 typeb = InterfaceN(addressN).getSeventh(tokenId) % 9;
        uint256 typec = InterfaceN(addressN).getEight(tokenId) % 9;

        // space for all the data to compute the fractal
        uint256[] memory data = new uint256[](2**(numIterations+1)-1);

        data[0]= compact(35000, 35000, 30000, 30000);
        for (uint256 i=0; i<2**numIterations-1; i++) {
            //generate both children
            if (i < 3) {
                data[2*i+1] = getChildData(data[i], true, typea);
                data[2*i+2] = getChildData(data[i], false, typea);
            } else if (i < 15) {
                data[2*i+1] = getChildData(data[i], true, typeb);
                data[2*i+2] = getChildData(data[i], false, typeb);
            } else {
                data[2*i+1] = getChildData(data[i], true, typec);
                data[2*i+2] = getChildData(data[i], false, typec);
            }
        }

        // generate result string
        // each line takes up to 84 characters.
        bytes memory result = new bytes(84*(2**numIterations)+580);
        bytes memory cur;
        assembly {
        	cur := add(result, 32) //offset length header
        } 
        uint256 totallen = 0;
    	uint256 linelen;


        // add head
        bytes memory head = getHeadString(tokenId);
        (linelen, cur) = copyString(cur, head);
        totallen += linelen;

    	// add body
        for (uint256 i=2**numIterations-1; i<data.length; i++) {
        	bytes memory curLine = getCurLine(data, i, vars);
        	(linelen, cur) = copyString(cur, curLine);
        	totallen += linelen;
        }

        // add tail
    	(linelen, cur) = copyString(cur, uriTail);
    	totallen += linelen;

        // reassign total length
        assembly {
        	mstore(result, totallen)
        }

        return string(result);
    }

    function getChildData(uint256 data, bool leftChild, uint256 curtype) internal view returns (uint256) {
    	int256 x;
        int256 y;
        int256 dx;
        int256 dy;

        (x, y, dx, dy) = expand(data);

		int256 sqrt2a = 14142;
		int256 sqrt2b = 10000;

		// rotate 45 degrees and scale by 1/sqrt(2). dx1,dy1 is for one direction of rotation, dx2,dy2 for the other
        // int256 dx1 = (dx * sqrt2b / sqrt2a - dy * sqrt2b / sqrt2a ) * sqrt2b / sqrt2a;
        // int256 dy1 = (dx * sqrt2b / sqrt2a + dy * sqrt2b / sqrt2a ) * sqrt2b / sqrt2a;
        // int256 dx2 = (dx * sqrt2b / sqrt2a + dy * sqrt2b / sqrt2a ) * sqrt2b / sqrt2a;
        // int256 dy2 =  (-dx * sqrt2b / sqrt2a + dy * sqrt2b / sqrt2a) * sqrt2b / sqrt2a;
        int256 dx1;
        int256 dy1;
        int256 dx2;
        int256 dy2;

        assembly {
        	dx1 := sdiv(mul(sub(sdiv(mul(dx, sqrt2b), sqrt2a),sdiv(mul(dy, sqrt2b),sqrt2a)),sqrt2b),sqrt2a)
        	dy1 := sdiv(mul(add(sdiv(mul(dx, sqrt2b), sqrt2a),sdiv(mul(dy, sqrt2b),sqrt2a)),sqrt2b),sqrt2a)
        	dx2 := sdiv(mul(add(sdiv(mul(dx, sqrt2b), sqrt2a),sdiv(mul(dy, sqrt2b),sqrt2a)),sqrt2b),sqrt2a)
        	dy2 := sdiv(mul(add(sdiv(mul(add(1,not(dx)), sqrt2b), sqrt2a),sdiv(mul(dy, sqrt2b),sqrt2a)),sqrt2b),sqrt2a)
        }


        // reuse x,y,dx,dy for return. Not enough local variables
        if (leftChild && (curtype == 3) || 
            !leftChild && (curtype == 0 || curtype == 4 || curtype == 8)) {
        	assembly {
        		x := add(x, dx)
        		y := add(y, dy)
        	}
        } else if (curtype == 6 || 
        		  !leftChild && (curtype == 1 || curtype == 3)) {
        	assembly {
        		x := add(x, dx1)
        		y := add(y, dy1)
        	}
        } else if (!leftChild && (curtype == 2 || curtype == 5 || curtype == 7)) {
        	assembly {
        		x := add(x, dx2)
        		y := add(y, dy2)
        	}
        }

        if (leftChild && (curtype == 0 || curtype == 1 || curtype == 4 || curtype == 5 || curtype == 7) ||
        	!leftChild && (curtype == 2 || curtype == 5)) {
        	dx = dx1;
        	dy = dy1;

        }  else if (leftChild && (curtype == 6) ||
        			!leftChild && (curtype == 3 || curtype == 4)) {
        	assembly {
        		dx := add(1, not(dx1))
        		dy := add(1, not(dy1))
        	}

        } else if (leftChild && (curtype == 2 || curtype == 8) || 
        		  !leftChild && (curtype == 1 || curtype == 6)) {
    		dx = dx2;
    		dy = dy2;

        } else if (leftChild && (curtype == 3) || 
        			!leftChild && (curtype == 0 || curtype == 7 || curtype == 8)) {
        	assembly {
        		dx := add(1, not(dx2))
        		dy := add(1, not(dy2))
        	}
        } 

    	return compact(x, y, dx, dy);
    }

    // compact variables into uint256
    function compact(int256 x, int256 y, int256 dx, int256 dy) internal pure returns (uint256) {
    	uint256 result = 0;
    	result |= uint256(dy & 0xffffffff);
    	result = result << 32;
    	result |= uint256(dx & 0xffffffff);
    	result = result << 32;
    	result |= uint256(y & 0xffffffff);
    	result = result << 32;
    	result |= uint256(x & 0xffffffff);

    	return result;
    }

    // expand variables from uint256
    function expand(uint256 vars) internal pure returns (int256 x, int256 y, int256 dx, int256 dy) {
    	x = int256(int32(uint32(vars)));
    	vars = vars >> 32;
    	y = int256(int32(uint32(vars)));
    	vars = vars >> 32;
    	dx = int256(int32(uint32(vars)));
    	vars = vars >> 32;
    	dy = int256(int32(uint32(vars)));
    }

    function uintToString(uint v) public pure returns (string memory) {
        uint maxlength = 8;
        bytes memory reversed = new bytes(maxlength);
        uint i = 0;
        while (v != 0) {
            uint remainder = v % 10;
            v = v / 10;
            reversed[i++] = bytes1(uint8(48 + remainder));
        }
        bytes memory s = new bytes(i); // i + 1 is inefficient
        for (uint j = 0; j < i; j++) {
            s[j] = reversed[i - j - 1]; // to avoid the off-by-one error
        }
        string memory str = string(s);  // memory isn't implicitly convertible to storage
        return str;
    }

    function getHeadString(uint256 tokenId) internal view returns (bytes memory) {
        uint256 strokeWidth = 100 + 100 * InterfaceN(addressN).getFifth(tokenId);

        return abi.encodePacked(uriHead1, "%23", uintToString(tokenId), uriHead2, uintToString(strokeWidth), "%3B%20", getColorString(tokenId), uriHead3);
    }

    function getColorString(uint256 tokenId) internal view returns (bytes memory) {
    	
        uint256 color_h = Math.min(InterfaceN(addressN).getFirst(tokenId), 10) * 33 + Math.min(Math.max(InterfaceN(addressN).getSecond(tokenId), 1), 10) * 3;
        uint256 color_s = 30 + Math.min(InterfaceN(addressN).getThird(tokenId), 10) * 7;
        uint256 color_l = 20 + Math.min(InterfaceN(addressN).getFourth(tokenId), 10) * 6;

        return abi.encodePacked("stroke%3Ahsl(", uintToString(color_h), "%2C", uintToString(color_s), "%25%2C", uintToString(color_l), "%25)%3B");
    }

    // returns length of string copied and current position of pointer
    function copyString(bytes memory curPosition, bytes memory strToCopy) internal view returns (uint256 linelen, bytes memory resPosition) {
    	uint256 numloops = (strToCopy.length + 31) / 32;
    	linelen = strToCopy.length;
    	resPosition = curPosition;

    	// copy curLine into result
    	assembly {
	        for {  let j := 0 } lt(j, numloops) { j := add(1, j) } { mstore(add(resPosition, mul(32, j)), mload(add(strToCopy, mul(32, add(1, j))))) }
	        resPosition := add(resPosition, linelen)
	    }
    }

    // get svg line output from data
    function getCurLine(uint256[] memory data, uint256 index, string[4] memory vars) internal view returns (bytes memory) {      
      	uint256 remainder;
        int256 x;
        int256 y;
        int256 dx;
        int256 dy;
        (x, y, dx, dy) = expand(data[index]);

    	uint256 curdigit;
    	uint256 numdigits;
    	string memory stringStart;

    	for (uint256 i=0; i<4; i++) {
    		curdigit = 0;
    		numdigits = 0;
	    	uint256 num;
	    	if (i == 0) {
	    		num = uint256(x);
	    	} else if (i == 1) {
	    		num = uint256(y);
	    	}  else if (i == 2) {
	    		num = uint256(x+dx);
	    	} else {
	    		num = uint256(y+dy);
	    	}

	    	assembly {
	    		stringStart := mload(add(vars, mul(32, i)))
	    	}

	    	uint256 numcopy = num;

	    	// count number of digits
	    	
	    	// while (numcopy > 0) {
	    	// 	numdigits += 1;
	    	// 	numcopy /= 10;
	    	// }
	    	assembly {
	    		for { } gt(numcopy, 0) { numcopy := div(numcopy, 10) } { numdigits := add(numdigits, 1) }
			}

			// convert integer into string format

			// assume number won't be 0, so only handle above 0 case
	        // while (num > 0) {
	        // 	remainder = ((num % 10) + 48);
	        // 	assembly {
	        // 		mstore8(add(stringStart, add(31, sub(numdigits,curdigit))), remainder)
	        // 	}
	        // 	num /= 10;
	        // 	curdigit += 1;
	        // }
	        assembly {
	        	for {} gt(num, 0) {num := div(num, 10)} {
	        		remainder := add(mod(num, 10),  48)
	        		mstore8(add(stringStart, add(31, sub(numdigits,curdigit))), remainder)
	        		curdigit := add(curdigit, 1)
	        	}
	        }

	        assembly {
	    		mstore(stringStart, curdigit)
	    	}
    	}

        return abi.encodePacked("%3Cline%20x1%3D'", vars[0] ,"'%20y1%3D'", vars[1], "'%20x2%3D'", vars[2], "'%20y2%3D'", vars[3], "'%20%2F%3E");

    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"addressOfN","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"addressN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"v","type":"uint256"}],"name":"uintToString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"}]

60806040526040518060800160405280605481526020016200541860549139600c9080519060200190620000359291906200020e565b5060405180610160016040528061012681526020016200546c6101269139600d90805190602001906200006a9291906200020e565b50604051806080016040528060598152602001620053bf60599139600e90805190602001906200009c9291906200020e565b506040518060400160405280601281526020017f2533432532467376672533452532322537440000000000000000000000000000815250600f9080519060200190620000ea9291906200020e565b50348015620000f857600080fd5b50604051620055923803806200559283398181016040528101906200011e919062000366565b6040518060400160405280601381526020017f467269656e646c79204672616374616c73204e000000000000000000000000008152506040518060400160405280600781526020017f4652465241434e000000000000000000000000000000000000000000000000008152508160009080519060200190620001a29291906200029f565b508060019080519060200190620001bb9291906200029f565b5050506001600a8190555080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505062000445565b8280546200021c90620003c6565b90600052602060002090601f0160209004810192826200024057600085556200028c565b82601f106200025b57805160ff19168380011785556200028c565b828001600101855582156200028c579182015b828111156200028b5782518255916020019190600101906200026e565b5b5090506200029b919062000330565b5090565b828054620002ad90620003c6565b90600052602060002090601f016020900481019282620002d157600085556200031d565b82601f10620002ec57805160ff19168380011785556200031d565b828001600101855582156200031d579182015b828111156200031c578251825591602001919060010190620002ff565b5b5090506200032c919062000330565b5090565b5b808211156200034b57600081600090555060010162000331565b5090565b60008151905062000360816200042b565b92915050565b6000602082840312156200037957600080fd5b600062000389848285016200034f565b91505092915050565b60006200039f82620003a6565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006002820490506001821680620003df57607f821691505b60208210811415620003f657620003f5620003fc565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b620004368162000392565b81146200044257600080fd5b50565b614f6a80620004556000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c80636352211e116100ad578063a22cb46511610071578063a22cb4651461032e578063b88d4fde1461034a578063c87b56dd14610366578063e939567914610396578063e985e9c5146103c657610121565b80636352211e1461027657806370a08231146102a657806376f62f3f146102d657806395d89b41146102f4578063a0712d681461031257610121565b806318160ddd116100f457806318160ddd146101c057806323b872dd146101de5780632f745c59146101fa57806342842e0e1461022a5780634f6ccce71461024657610121565b806301ffc9a71461012657806306fdde0314610156578063081812fc14610174578063095ea7b3146101a4575b600080fd5b610140600480360381019061013b9190613877565b6103f6565b60405161014d91906145fc565b60405180910390f35b61015e610408565b60405161016b9190614617565b60405180910390f35b61018e600480360381019061018991906138c9565b61049a565b60405161019b9190614595565b60405180910390f35b6101be60048036038101906101b9919061383b565b61051f565b005b6101c8610637565b6040516101d59190614899565b60405180910390f35b6101f860048036038101906101f39190613735565b610644565b005b610214600480360381019061020f919061383b565b6106a4565b6040516102219190614899565b60405180910390f35b610244600480360381019061023f9190613735565b610749565b005b610260600480360381019061025b91906138c9565b610769565b60405161026d9190614899565b60405180910390f35b610290600480360381019061028b91906138c9565b610800565b60405161029d9190614595565b60405180910390f35b6102c060048036038101906102bb91906136a7565b6108b2565b6040516102cd9190614899565b60405180910390f35b6102de61096a565b6040516102eb9190614595565b60405180910390f35b6102fc610990565b6040516103099190614617565b60405180910390f35b61032c600480360381019061032791906138c9565b610a22565b005b610348600480360381019061034391906137ff565b610bfb565b005b610364600480360381019061035f9190613784565b610d7c565b005b610380600480360381019061037b91906138c9565b610dde565b60405161038d9190614617565b60405180910390f35b6103b060048036038101906103ab91906138c9565b610e38565b6040516103bd9190614617565b60405180910390f35b6103e060048036038101906103db91906136f9565b6110d7565b6040516103ed91906145fc565b60405180910390f35b60006104018261116b565b9050919050565b60606000805461041790614d52565b80601f016020809104026020016040519081016040528092919081815260200182805461044390614d52565b80156104905780601f1061046557610100808354040283529160200191610490565b820191906000526020600020905b81548152906001019060200180831161047357829003601f168201915b5050505050905090565b60006104a5826111e5565b6104e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104db906147b9565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061052a82610800565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561059b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059290614819565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166105ba611251565b73ffffffffffffffffffffffffffffffffffffffff1614806105e957506105e8816105e3611251565b6110d7565b5b610628576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061f90614719565b60405180910390fd5b6106328383611259565b505050565b6000600880549050905090565b61065561064f611251565b82611312565b610694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068b90614839565b60405180910390fd5b61069f8383836113f0565b505050565b60006106af836108b2565b82106106f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e790614639565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61076483838360405180602001604052806000815250610d7c565b505050565b6000610773610637565b82106107b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ab90614859565b60405180910390fd5b600882815481106107ee577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156108a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a090614779565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610923576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091a90614739565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606001805461099f90614d52565b80601f01602080910402602001604051908101604052809291908181526020018280546109cb90614d52565b8015610a185780601f106109ed57610100808354040283529160200191610a18565b820191906000526020600020905b8154815290600101906020018083116109fb57829003601f168201915b5050505050905090565b6002600a541415610a68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5f90614879565b60405180910390fd5b6002600a81905550600081118015610a8157506122b981105b610ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab790614759565b60405180910390fd5b610ac8611251565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610b399190614899565b60206040518083038186803b158015610b5157600080fd5b505afa158015610b65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8991906136d0565b73ffffffffffffffffffffffffffffffffffffffff1614610bdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd690614699565b60405180910390fd5b610bf0610bea611251565b8261164c565b6001600a8190555050565b610c03611251565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c68906146d9565b60405180910390fd5b8060056000610c7e611251565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610d2b611251565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610d7091906145fc565b60405180910390a35050565b610d8d610d87611251565b83611312565b610dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc390614839565b60405180910390fd5b610dd88484848461166a565b50505050565b6060610de9826111e5565b610e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1f906147f9565b60405180910390fd5b610e31826116c6565b9050919050565b606060006008905060008167ffffffffffffffff811115610e82577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015610eb45781602001600182028036833780820191505090505b50905060005b60008514610f6c576000600a86610ed19190614dcd565b9050600a86610ee09190614a62565b9550806030610eef9190614a0c565b60f81b838380610efe90614d84565b945081518110610f37577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050610eba565b60008167ffffffffffffffff811115610fae577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015610fe05781602001600182028036833780820191505090505b50905060005b828110156110c4578360018285610ffd9190614c5e565b6110079190614c5e565b8151811061103e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b828281518110611082577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806110bc90614d84565b915050610fe6565b5060008190508095505050505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806111de57506111dd8261212d565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166112cc83610800565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061131d826111e5565b61135c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611353906146f9565b60405180910390fd5b600061136783610800565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806113d657508373ffffffffffffffffffffffffffffffffffffffff166113be8461049a565b73ffffffffffffffffffffffffffffffffffffffff16145b806113e757506113e681856110d7565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661141082610800565b73ffffffffffffffffffffffffffffffffffffffff1614611466576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145d906147d9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cd906146b9565b60405180910390fd5b6114e183838361220f565b6114ec600082611259565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461153c9190614c5e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115939190614a0c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61166682826040518060200160405280600081525061221f565b5050565b6116758484846113f0565b6116818484848461227a565b6116c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b790614659565b60405180910390fd5b50505050565b6060600060069050600060405180608001604052806040518060400160405280600781526020017f313030303030300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f313030303030300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f313030303030300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f3130303030303000000000000000000000000000000000000000000000000000815250815250905060006009600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342d9d876876040518263ffffffff1660e01b81526004016118269190614899565b60206040518083038186803b15801561183e57600080fd5b505afa158015611852573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187691906138f2565b6118809190614dcd565b905060006009600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638c921d06886040518263ffffffff1660e01b81526004016118e19190614899565b60206040518083038186803b1580156118f957600080fd5b505afa15801561190d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193191906138f2565b61193b9190614dcd565b905060006009600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639347e43f896040518263ffffffff1660e01b815260040161199c9190614899565b60206040518083038186803b1580156119b457600080fd5b505afa1580156119c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ec91906138f2565b6119f69190614dcd565b9050600060018087611a089190614a0c565b6002611a149190614ae6565b611a1e9190614c5e565b67ffffffffffffffff811115611a5d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611a8b5781602001602082028036833780820191505090505b509050611a9e6188b88061753080612411565b81600081518110611ad8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505060005b6001876002611af69190614ae6565b611b009190614c5e565b811015611f2e576003811015611c6757611b5c828281518110611b4c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600187612465565b826001836002611b6c9190614c04565b611b769190614a0c565b81518110611bad577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050611c05828281518110611bf5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600087612465565b826002836002611c159190614c04565b611c1f9190614a0c565b81518110611c56577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050611f1b565b600f811015611dc757611cbc828281518110611cac577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600186612465565b826001836002611ccc9190614c04565b611cd69190614a0c565b81518110611d0d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050611d65828281518110611d55577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600086612465565b826002836002611d759190614c04565b611d7f9190614a0c565b81518110611db6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050611f1a565b611e13828281518110611e03577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600185612465565b826001836002611e239190614c04565b611e2d9190614a0c565b81518110611e64577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050611ebc828281518110611eac577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600085612465565b826002836002611ecc9190614c04565b611ed69190614a0c565b81518110611f0d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250505b5b8080611f2690614d84565b915050611ae7565b506000610244876002611f419190614ae6565b6054611f4d9190614c04565b611f579190614a0c565b67ffffffffffffffff811115611f96577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611fc85781602001600182028036833780820191505090505b509050606060208201905060008080611fe08d612700565b9050611fec8482612816565b809550819350505081836120009190614a0c565b9250600060018c60026120139190614ae6565b61201d9190614c5e565b90505b865181101561206c57600061203688838e612874565b90506120428682612816565b809750819550505083856120569190614a0c565b945050808061206490614d84565b915050612020565b5061210184600f805461207e90614d52565b80601f01602080910402602001604051908101604052809291908181526020018280546120aa90614d52565b80156120f75780601f106120cc576101008083540402835291602001916120f7565b820191906000526020600020905b8154815290600101906020018083116120da57829003601f168201915b5050505050612816565b809550819350505081836121159190614a0c565b9250828552849b505050505050505050505050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806121f857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612208575061220782612adf565b5b9050919050565b61221a838383612b49565b505050565b6122298383612c5d565b612236600084848461227a565b612275576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226c90614659565b60405180910390fd5b505050565b600061229b8473ffffffffffffffffffffffffffffffffffffffff16612e2b565b15612404578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122c4611251565b8786866040518563ffffffff1660e01b81526004016122e694939291906145b0565b602060405180830381600087803b15801561230057600080fd5b505af192505050801561233157506040513d601f19601f8201168201806040525081019061232e91906138a0565b60015b6123b4573d8060008114612361576040519150601f19603f3d011682016040523d82523d6000602084013e612366565b606091505b506000815114156123ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a390614659565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612409565b600190505b949350505050565b6000806000905063ffffffff831681179050602081901b905063ffffffff841681179050602081901b905063ffffffff851681179050602081901b905063ffffffff86168117905080915050949350505050565b600080600080600061247688612e3e565b80945081955082965083975050505050600061373e905060006127109050600080600080858587878a020588888c02050302059350858587878a020588888c02050102059250858587878a020588888c02050102059150858587878a020588888c19600101020501020590508c80156124ef575060038c145b8061251a57508c158015612519575060008c148061250d575060048c145b80612518575060088c145b5b5b1561252e57878a019950868901985061259c565b60068c148061255257508c158015612551575060018c1480612550575060038c145b5b5b1561256657838a019950828901985061259b565b8c15801561258a575060028c148061257e575060058c145b80612589575060078c145b5b1561259a57818a01995080890198505b5b5b8c80156125d5575060008c14806125b3575060018c145b806125be575060048c145b806125c9575060058c145b806125d4575060078c145b5b806125f557508c1580156125f4575060028c14806125f3575060058c145b5b5b15612605578397508296506126e1565b8c8015612612575060068c145b8061263257508c158015612631575060038c1480612630575060048c145b5b5b1561264a5783196001019750821960010196506126e0565b8c8015612662575060028c1480612661575060088c145b5b8061268257508c158015612681575060018c1480612680575060068c145b5b5b15612692578197508096506126df565b8c801561269f575060038c145b806126ca57508c1580156126c9575060008c14806126bd575060078c145b806126c8575060088c145b5b5b156126de5781196001019750801960010196505b5b5b5b6126ed8a8a8a8a612411565b9a50505050505050505050509392505050565b60606000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630b2503a6846040518263ffffffff1660e01b815260040161275f9190614899565b60206040518083038186803b15801561277757600080fd5b505afa15801561278b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127af91906138f2565b60646127bb9190614c04565b60646127c79190614a0c565b9050600c6127d484610e38565b600d6127df84610e38565b6127e887612e78565b600e6040516020016127ff96959493929190614455565b604051602081830303815290604052915050919050565b6000606060006020601f855161282c9190614a0c565b6128369190614a62565b90508351925084915060005b81811015612866578060010160200285015181602002840152806001019050612842565b508282019150509250929050565b606060008060008060006128c78989815181106128ba577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151612e3e565b80945081955082965083975050505050600080606060005b60048110156129af57600093506000925060008082141561290257889050612940565b60018214156129135787905061293f565b600282141561292f5786896129289190614978565b905061293e565b858861293b9190614978565b90505b5b5b816020028c0151925060008190505b600081111561296957600185019450600a8104905061294f565b5b6000821115612997576030600a8306019a508a868603601f01850153600186019550600a8204915061296a565b858452505080806129a790614d84565b9150506128df565b50896000600481106129ea577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518a600160048110612a29577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518b600260048110612a68577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518c600360048110612aa7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151604051602001612abf9493929190614520565b604051602081830303815290604052985050505050505050509392505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612b548383836131fc565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b9757612b9281613201565b612bd6565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612bd557612bd4838261324a565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c1957612c14816133b7565b612c58565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612c5757612c5682826134fa565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ccd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc490614799565b60405180910390fd5b612cd6816111e5565b15612d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0d90614679565b60405180910390fd5b612d226000838361220f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d729190614a0c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6000806000808460030b9350602085901c94508460030b9250602085901c94508460030b9150602085901c94508460030b90509193509193565b606060006003612f3d612f36600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638aa001fc876040518263ffffffff1660e01b8152600401612edf9190614899565b60206040518083038186803b158015612ef757600080fd5b505afa158015612f0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f2f91906138f2565b6001613579565b600a613593565b612f479190614c04565b6021612ffe600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663667386f7876040518263ffffffff1660e01b8152600401612fa79190614899565b60206040518083038186803b158015612fbf57600080fd5b505afa158015612fd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ff791906138f2565b600a613593565b6130089190614c04565b6130129190614a0c565b9050600060076130cd600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fa7f71b1876040518263ffffffff1660e01b81526004016130769190614899565b60206040518083038186803b15801561308e57600080fd5b505afa1580156130a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130c691906138f2565b600a613593565b6130d79190614c04565b601e6130e39190614a0c565b90506000600661319e600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639ec29b82886040518263ffffffff1660e01b81526004016131479190614899565b60206040518083038186803b15801561315f57600080fd5b505afa158015613173573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061319791906138f2565b600a613593565b6131a89190614c04565b60146131b49190614a0c565b90506131bf83610e38565b6131c883610e38565b6131d183610e38565b6040516020016131e3939291906144c3565b6040516020818303038152906040529350505050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613257846108b2565b6132619190614c5e565b9050600060076000848152602001908152602001600020549050818114613346576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506133cb9190614c5e565b9050600060096000848152602001908152602001600020549050600060088381548110613421577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613469577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806134de577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613505836108b2565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600081831015613589578161358b565b825b905092915050565b60008183106135a257816135a4565b825b905092915050565b60006135bf6135ba846148e5565b6148b4565b9050828152602081018484840111156135d757600080fd5b6135e2848285614d10565b509392505050565b6000813590506135f981614ed8565b92915050565b60008151905061360e81614ed8565b92915050565b60008135905061362381614eef565b92915050565b60008135905061363881614f06565b92915050565b60008151905061364d81614f06565b92915050565b600082601f83011261366457600080fd5b81356136748482602086016135ac565b91505092915050565b60008135905061368c81614f1d565b92915050565b6000815190506136a181614f1d565b92915050565b6000602082840312156136b957600080fd5b60006136c7848285016135ea565b91505092915050565b6000602082840312156136e257600080fd5b60006136f0848285016135ff565b91505092915050565b6000806040838503121561370c57600080fd5b600061371a858286016135ea565b925050602061372b858286016135ea565b9150509250929050565b60008060006060848603121561374a57600080fd5b6000613758868287016135ea565b9350506020613769868287016135ea565b925050604061377a8682870161367d565b9150509250925092565b6000806000806080858703121561379a57600080fd5b60006137a8878288016135ea565b94505060206137b9878288016135ea565b93505060406137ca8782880161367d565b925050606085013567ffffffffffffffff8111156137e757600080fd5b6137f387828801613653565b91505092959194509250565b6000806040838503121561381257600080fd5b6000613820858286016135ea565b925050602061383185828601613614565b9150509250929050565b6000806040838503121561384e57600080fd5b600061385c858286016135ea565b925050602061386d8582860161367d565b9150509250929050565b60006020828403121561388957600080fd5b600061389784828501613629565b91505092915050565b6000602082840312156138b257600080fd5b60006138c08482850161363e565b91505092915050565b6000602082840312156138db57600080fd5b60006138e98482850161367d565b91505092915050565b60006020828403121561390457600080fd5b600061391284828501613692565b91505092915050565b61392481614c92565b82525050565b61393381614ca4565b82525050565b60006139448261492a565b61394e8185614940565b935061395e818560208601614d1f565b61396781614eba565b840191505092915050565b600061397d8261492a565b6139878185614951565b9350613997818560208601614d1f565b80840191505092915050565b600081546139b081614d52565b6139ba8186614951565b945060018216600081146139d557600181146139e657613a19565b60ff19831686528186019350613a19565b6139ef85614915565b60005b83811015613a11578154818901526001820191506020810190506139f2565b838801955050505b50505092915050565b6000613a2d82614935565b613a37818561495c565b9350613a47818560208601614d1f565b613a5081614eba565b840191505092915050565b6000613a6682614935565b613a70818561496d565b9350613a80818560208601614d1f565b80840191505092915050565b6000613a99602b8361495c565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613aff60328361495c565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613b65601c8361495c565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613ba5600a8361496d565b91507f27253230793125334427000000000000000000000000000000000000000000006000830152600a82019050919050565b6000613be560288361495c565b91507f467269656e646c794672616374616c734e3a204d757374206f776e207265737060008301527f656374697665204e0000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c4b60248361495c565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613cb160198361495c565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613cf160068361496d565b91507f25334225323000000000000000000000000000000000000000000000000000006000830152600682019050919050565b6000613d31600a8361496d565b91507f27253230253246253345000000000000000000000000000000000000000000006000830152600a82019050919050565b6000613d71600a8361496d565b91507f27253230793225334427000000000000000000000000000000000000000000006000830152600a82019050919050565b6000613db1602c8361495c565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613e1760388361495c565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613e7d602a8361495c565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ee360238361495c565b91507f467269656e646c794672616374616c734e3a20546f6b656e20494420696e766160008301527f6c696400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f4960068361496d565b91507f25323525324300000000000000000000000000000000000000000000000000006000830152600682019050919050565b6000613f8960298361495c565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613fef60208361495c565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061402f602c8361495c565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061409560298361495c565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006140fb602f8361495c565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614161600d8361496d565b91507f7374726f6b6525334168736c28000000000000000000000000000000000000006000830152600d82019050919050565b60006141a160218361495c565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061420760078361496d565b91507f25323529253342000000000000000000000000000000000000000000000000006000830152600782019050919050565b600061424760318361495c565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006142ad602c8361495c565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b600061431360038361496d565b91507f25323300000000000000000000000000000000000000000000000000000000006000830152600382019050919050565b600061435360108361496d565b91507f2533436c696e65253230783125334427000000000000000000000000000000006000830152601082019050919050565b6000614393600a8361496d565b91507f27253230783225334427000000000000000000000000000000000000000000006000830152600a82019050919050565b60006143d3601f8361495c565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b600061441360038361496d565b91507f25324300000000000000000000000000000000000000000000000000000000006000830152600382019050919050565b61444f81614d06565b82525050565b600061446182896139a3565b915061446c82614306565b91506144788288613a5b565b915061448482876139a3565b91506144908286613a5b565b915061449b82613ce4565b91506144a78285613972565b91506144b382846139a3565b9150819050979650505050505050565b60006144ce82614154565b91506144da8286613a5b565b91506144e582614406565b91506144f18285613a5b565b91506144fc82613f3c565b91506145088284613a5b565b9150614513826141fa565b9150819050949350505050565b600061452b82614346565b91506145378287613a5b565b915061454282613b98565b915061454e8286613a5b565b915061455982614386565b91506145658285613a5b565b915061457082613d64565b915061457c8284613a5b565b915061458782613d24565b915081905095945050505050565b60006020820190506145aa600083018461391b565b92915050565b60006080820190506145c5600083018761391b565b6145d2602083018661391b565b6145df6040830185614446565b81810360608301526145f18184613939565b905095945050505050565b6000602082019050614611600083018461392a565b92915050565b600060208201905081810360008301526146318184613a22565b905092915050565b6000602082019050818103600083015261465281613a8c565b9050919050565b6000602082019050818103600083015261467281613af2565b9050919050565b6000602082019050818103600083015261469281613b58565b9050919050565b600060208201905081810360008301526146b281613bd8565b9050919050565b600060208201905081810360008301526146d281613c3e565b9050919050565b600060208201905081810360008301526146f281613ca4565b9050919050565b6000602082019050818103600083015261471281613da4565b9050919050565b6000602082019050818103600083015261473281613e0a565b9050919050565b6000602082019050818103600083015261475281613e70565b9050919050565b6000602082019050818103600083015261477281613ed6565b9050919050565b6000602082019050818103600083015261479281613f7c565b9050919050565b600060208201905081810360008301526147b281613fe2565b9050919050565b600060208201905081810360008301526147d281614022565b9050919050565b600060208201905081810360008301526147f281614088565b9050919050565b60006020820190508181036000830152614812816140ee565b9050919050565b6000602082019050818103600083015261483281614194565b9050919050565b600060208201905081810360008301526148528161423a565b9050919050565b60006020820190508181036000830152614872816142a0565b9050919050565b60006020820190508181036000830152614892816143c6565b9050919050565b60006020820190506148ae6000830184614446565b92915050565b6000604051905081810181811067ffffffffffffffff821117156148db576148da614e8b565b5b8060405250919050565b600067ffffffffffffffff821115614900576148ff614e8b565b5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061498382614cdc565b915061498e83614cdc565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038313600083121516156149c9576149c8614dfe565b5b817f8000000000000000000000000000000000000000000000000000000000000000038312600083121615614a0157614a00614dfe565b5b828201905092915050565b6000614a1782614d06565b9150614a2283614d06565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a5757614a56614dfe565b5b828201905092915050565b6000614a6d82614d06565b9150614a7883614d06565b925082614a8857614a87614e2d565b5b828204905092915050565b6000808291508390505b6001851115614add57808604811115614ab957614ab8614dfe565b5b6001851615614ac85780820291505b8081029050614ad685614ecb565b9450614a9d565b94509492505050565b6000614af182614d06565b9150614afc83614d06565b9250614b297fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614b31565b905092915050565b600082614b415760019050614bfd565b81614b4f5760009050614bfd565b8160018114614b655760028114614b6f57614b9e565b6001915050614bfd565b60ff841115614b8157614b80614dfe565b5b8360020a915084821115614b9857614b97614dfe565b5b50614bfd565b5060208310610133831016604e8410600b8410161715614bd35782820a905083811115614bce57614bcd614dfe565b5b614bfd565b614be08484846001614a93565b92509050818404811115614bf757614bf6614dfe565b5b81810290505b9392505050565b6000614c0f82614d06565b9150614c1a83614d06565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614c5357614c52614dfe565b5b828202905092915050565b6000614c6982614d06565b9150614c7483614d06565b925082821015614c8757614c86614dfe565b5b828203905092915050565b6000614c9d82614ce6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614d3d578082015181840152602081019050614d22565b83811115614d4c576000848401525b50505050565b60006002820490506001821680614d6a57607f821691505b60208210811415614d7e57614d7d614e5c565b5b50919050565b6000614d8f82614d06565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614dc257614dc1614dfe565b5b600182019050919050565b6000614dd882614d06565b9150614de383614d06565b925082614df357614df2614e2d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b614ee181614c92565b8114614eec57600080fd5b50565b614ef881614ca4565b8114614f0357600080fd5b50565b614f0f81614cb0565b8114614f1a57600080fd5b50565b614f2681614d06565b8114614f3157600080fd5b5056fea26469706673582212207b59fef3b6c4424000f682120dadacdec2ad331c255e55df88ac0965cd0783e564736f6c634300080000332532306261636b67726f756e642d636f6c6f72253341726762283025324330253243302927253230786d6c6e7325334427687474702533412532462532467777772e77332e6f72672532463230303025324673766727253345646174613a6170706c69636174696f6e2f6a736f6e3b636861727365743d7574662d382c2537422532326e616d65253232253341253230253232467269656e646c792532304672616374616c732532304e2532302532322532432532326465736372697074696f6e25323225334125323025323246756c6c792532306f6e2d636861696e25323067656e657261746976652532306672616374616c2532307061747465726e7325323062617365642532306f6e253230746865253230796f75722532306e2e253232253243253232696d61676525323225334125323025323264617461253341696d616765253246737667253242786d6c253342636861727365742533447574662d3825324325334373766725323077696474682533442731303025323527253230686569676874253344273130302532352725323076696577426f78253344273025323030253230313030303030253230313030303030272532307374796c65253344277374726f6b652d776964746825334100000000000000000000000005a46f1e545526fb803ff974c790acea34d1f2d6

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101215760003560e01c80636352211e116100ad578063a22cb46511610071578063a22cb4651461032e578063b88d4fde1461034a578063c87b56dd14610366578063e939567914610396578063e985e9c5146103c657610121565b80636352211e1461027657806370a08231146102a657806376f62f3f146102d657806395d89b41146102f4578063a0712d681461031257610121565b806318160ddd116100f457806318160ddd146101c057806323b872dd146101de5780632f745c59146101fa57806342842e0e1461022a5780634f6ccce71461024657610121565b806301ffc9a71461012657806306fdde0314610156578063081812fc14610174578063095ea7b3146101a4575b600080fd5b610140600480360381019061013b9190613877565b6103f6565b60405161014d91906145fc565b60405180910390f35b61015e610408565b60405161016b9190614617565b60405180910390f35b61018e600480360381019061018991906138c9565b61049a565b60405161019b9190614595565b60405180910390f35b6101be60048036038101906101b9919061383b565b61051f565b005b6101c8610637565b6040516101d59190614899565b60405180910390f35b6101f860048036038101906101f39190613735565b610644565b005b610214600480360381019061020f919061383b565b6106a4565b6040516102219190614899565b60405180910390f35b610244600480360381019061023f9190613735565b610749565b005b610260600480360381019061025b91906138c9565b610769565b60405161026d9190614899565b60405180910390f35b610290600480360381019061028b91906138c9565b610800565b60405161029d9190614595565b60405180910390f35b6102c060048036038101906102bb91906136a7565b6108b2565b6040516102cd9190614899565b60405180910390f35b6102de61096a565b6040516102eb9190614595565b60405180910390f35b6102fc610990565b6040516103099190614617565b60405180910390f35b61032c600480360381019061032791906138c9565b610a22565b005b610348600480360381019061034391906137ff565b610bfb565b005b610364600480360381019061035f9190613784565b610d7c565b005b610380600480360381019061037b91906138c9565b610dde565b60405161038d9190614617565b60405180910390f35b6103b060048036038101906103ab91906138c9565b610e38565b6040516103bd9190614617565b60405180910390f35b6103e060048036038101906103db91906136f9565b6110d7565b6040516103ed91906145fc565b60405180910390f35b60006104018261116b565b9050919050565b60606000805461041790614d52565b80601f016020809104026020016040519081016040528092919081815260200182805461044390614d52565b80156104905780601f1061046557610100808354040283529160200191610490565b820191906000526020600020905b81548152906001019060200180831161047357829003601f168201915b5050505050905090565b60006104a5826111e5565b6104e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104db906147b9565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061052a82610800565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561059b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059290614819565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166105ba611251565b73ffffffffffffffffffffffffffffffffffffffff1614806105e957506105e8816105e3611251565b6110d7565b5b610628576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061f90614719565b60405180910390fd5b6106328383611259565b505050565b6000600880549050905090565b61065561064f611251565b82611312565b610694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068b90614839565b60405180910390fd5b61069f8383836113f0565b505050565b60006106af836108b2565b82106106f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e790614639565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61076483838360405180602001604052806000815250610d7c565b505050565b6000610773610637565b82106107b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ab90614859565b60405180910390fd5b600882815481106107ee577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156108a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a090614779565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610923576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091a90614739565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606001805461099f90614d52565b80601f01602080910402602001604051908101604052809291908181526020018280546109cb90614d52565b8015610a185780601f106109ed57610100808354040283529160200191610a18565b820191906000526020600020905b8154815290600101906020018083116109fb57829003601f168201915b5050505050905090565b6002600a541415610a68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5f90614879565b60405180910390fd5b6002600a81905550600081118015610a8157506122b981105b610ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab790614759565b60405180910390fd5b610ac8611251565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610b399190614899565b60206040518083038186803b158015610b5157600080fd5b505afa158015610b65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8991906136d0565b73ffffffffffffffffffffffffffffffffffffffff1614610bdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd690614699565b60405180910390fd5b610bf0610bea611251565b8261164c565b6001600a8190555050565b610c03611251565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c68906146d9565b60405180910390fd5b8060056000610c7e611251565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610d2b611251565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610d7091906145fc565b60405180910390a35050565b610d8d610d87611251565b83611312565b610dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc390614839565b60405180910390fd5b610dd88484848461166a565b50505050565b6060610de9826111e5565b610e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1f906147f9565b60405180910390fd5b610e31826116c6565b9050919050565b606060006008905060008167ffffffffffffffff811115610e82577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015610eb45781602001600182028036833780820191505090505b50905060005b60008514610f6c576000600a86610ed19190614dcd565b9050600a86610ee09190614a62565b9550806030610eef9190614a0c565b60f81b838380610efe90614d84565b945081518110610f37577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050610eba565b60008167ffffffffffffffff811115610fae577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015610fe05781602001600182028036833780820191505090505b50905060005b828110156110c4578360018285610ffd9190614c5e565b6110079190614c5e565b8151811061103e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b828281518110611082577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806110bc90614d84565b915050610fe6565b5060008190508095505050505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806111de57506111dd8261212d565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166112cc83610800565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061131d826111e5565b61135c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611353906146f9565b60405180910390fd5b600061136783610800565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806113d657508373ffffffffffffffffffffffffffffffffffffffff166113be8461049a565b73ffffffffffffffffffffffffffffffffffffffff16145b806113e757506113e681856110d7565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661141082610800565b73ffffffffffffffffffffffffffffffffffffffff1614611466576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145d906147d9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cd906146b9565b60405180910390fd5b6114e183838361220f565b6114ec600082611259565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461153c9190614c5e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115939190614a0c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61166682826040518060200160405280600081525061221f565b5050565b6116758484846113f0565b6116818484848461227a565b6116c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b790614659565b60405180910390fd5b50505050565b6060600060069050600060405180608001604052806040518060400160405280600781526020017f313030303030300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f313030303030300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f313030303030300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f3130303030303000000000000000000000000000000000000000000000000000815250815250905060006009600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342d9d876876040518263ffffffff1660e01b81526004016118269190614899565b60206040518083038186803b15801561183e57600080fd5b505afa158015611852573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187691906138f2565b6118809190614dcd565b905060006009600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638c921d06886040518263ffffffff1660e01b81526004016118e19190614899565b60206040518083038186803b1580156118f957600080fd5b505afa15801561190d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193191906138f2565b61193b9190614dcd565b905060006009600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639347e43f896040518263ffffffff1660e01b815260040161199c9190614899565b60206040518083038186803b1580156119b457600080fd5b505afa1580156119c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ec91906138f2565b6119f69190614dcd565b9050600060018087611a089190614a0c565b6002611a149190614ae6565b611a1e9190614c5e565b67ffffffffffffffff811115611a5d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611a8b5781602001602082028036833780820191505090505b509050611a9e6188b88061753080612411565b81600081518110611ad8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505060005b6001876002611af69190614ae6565b611b009190614c5e565b811015611f2e576003811015611c6757611b5c828281518110611b4c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600187612465565b826001836002611b6c9190614c04565b611b769190614a0c565b81518110611bad577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050611c05828281518110611bf5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600087612465565b826002836002611c159190614c04565b611c1f9190614a0c565b81518110611c56577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050611f1b565b600f811015611dc757611cbc828281518110611cac577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600186612465565b826001836002611ccc9190614c04565b611cd69190614a0c565b81518110611d0d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050611d65828281518110611d55577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600086612465565b826002836002611d759190614c04565b611d7f9190614a0c565b81518110611db6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050611f1a565b611e13828281518110611e03577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600185612465565b826001836002611e239190614c04565b611e2d9190614a0c565b81518110611e64577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050611ebc828281518110611eac577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600085612465565b826002836002611ecc9190614c04565b611ed69190614a0c565b81518110611f0d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250505b5b8080611f2690614d84565b915050611ae7565b506000610244876002611f419190614ae6565b6054611f4d9190614c04565b611f579190614a0c565b67ffffffffffffffff811115611f96577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611fc85781602001600182028036833780820191505090505b509050606060208201905060008080611fe08d612700565b9050611fec8482612816565b809550819350505081836120009190614a0c565b9250600060018c60026120139190614ae6565b61201d9190614c5e565b90505b865181101561206c57600061203688838e612874565b90506120428682612816565b809750819550505083856120569190614a0c565b945050808061206490614d84565b915050612020565b5061210184600f805461207e90614d52565b80601f01602080910402602001604051908101604052809291908181526020018280546120aa90614d52565b80156120f75780601f106120cc576101008083540402835291602001916120f7565b820191906000526020600020905b8154815290600101906020018083116120da57829003601f168201915b5050505050612816565b809550819350505081836121159190614a0c565b9250828552849b505050505050505050505050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806121f857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612208575061220782612adf565b5b9050919050565b61221a838383612b49565b505050565b6122298383612c5d565b612236600084848461227a565b612275576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226c90614659565b60405180910390fd5b505050565b600061229b8473ffffffffffffffffffffffffffffffffffffffff16612e2b565b15612404578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122c4611251565b8786866040518563ffffffff1660e01b81526004016122e694939291906145b0565b602060405180830381600087803b15801561230057600080fd5b505af192505050801561233157506040513d601f19601f8201168201806040525081019061232e91906138a0565b60015b6123b4573d8060008114612361576040519150601f19603f3d011682016040523d82523d6000602084013e612366565b606091505b506000815114156123ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a390614659565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612409565b600190505b949350505050565b6000806000905063ffffffff831681179050602081901b905063ffffffff841681179050602081901b905063ffffffff851681179050602081901b905063ffffffff86168117905080915050949350505050565b600080600080600061247688612e3e565b80945081955082965083975050505050600061373e905060006127109050600080600080858587878a020588888c02050302059350858587878a020588888c02050102059250858587878a020588888c02050102059150858587878a020588888c19600101020501020590508c80156124ef575060038c145b8061251a57508c158015612519575060008c148061250d575060048c145b80612518575060088c145b5b5b1561252e57878a019950868901985061259c565b60068c148061255257508c158015612551575060018c1480612550575060038c145b5b5b1561256657838a019950828901985061259b565b8c15801561258a575060028c148061257e575060058c145b80612589575060078c145b5b1561259a57818a01995080890198505b5b5b8c80156125d5575060008c14806125b3575060018c145b806125be575060048c145b806125c9575060058c145b806125d4575060078c145b5b806125f557508c1580156125f4575060028c14806125f3575060058c145b5b5b15612605578397508296506126e1565b8c8015612612575060068c145b8061263257508c158015612631575060038c1480612630575060048c145b5b5b1561264a5783196001019750821960010196506126e0565b8c8015612662575060028c1480612661575060088c145b5b8061268257508c158015612681575060018c1480612680575060068c145b5b5b15612692578197508096506126df565b8c801561269f575060038c145b806126ca57508c1580156126c9575060008c14806126bd575060078c145b806126c8575060088c145b5b5b156126de5781196001019750801960010196505b5b5b5b6126ed8a8a8a8a612411565b9a50505050505050505050509392505050565b60606000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630b2503a6846040518263ffffffff1660e01b815260040161275f9190614899565b60206040518083038186803b15801561277757600080fd5b505afa15801561278b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127af91906138f2565b60646127bb9190614c04565b60646127c79190614a0c565b9050600c6127d484610e38565b600d6127df84610e38565b6127e887612e78565b600e6040516020016127ff96959493929190614455565b604051602081830303815290604052915050919050565b6000606060006020601f855161282c9190614a0c565b6128369190614a62565b90508351925084915060005b81811015612866578060010160200285015181602002840152806001019050612842565b508282019150509250929050565b606060008060008060006128c78989815181106128ba577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151612e3e565b80945081955082965083975050505050600080606060005b60048110156129af57600093506000925060008082141561290257889050612940565b60018214156129135787905061293f565b600282141561292f5786896129289190614978565b905061293e565b858861293b9190614978565b90505b5b5b816020028c0151925060008190505b600081111561296957600185019450600a8104905061294f565b5b6000821115612997576030600a8306019a508a868603601f01850153600186019550600a8204915061296a565b858452505080806129a790614d84565b9150506128df565b50896000600481106129ea577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518a600160048110612a29577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518b600260048110612a68577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518c600360048110612aa7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151604051602001612abf9493929190614520565b604051602081830303815290604052985050505050505050509392505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612b548383836131fc565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b9757612b9281613201565b612bd6565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612bd557612bd4838261324a565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c1957612c14816133b7565b612c58565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612c5757612c5682826134fa565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ccd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc490614799565b60405180910390fd5b612cd6816111e5565b15612d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0d90614679565b60405180910390fd5b612d226000838361220f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d729190614a0c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6000806000808460030b9350602085901c94508460030b9250602085901c94508460030b9150602085901c94508460030b90509193509193565b606060006003612f3d612f36600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638aa001fc876040518263ffffffff1660e01b8152600401612edf9190614899565b60206040518083038186803b158015612ef757600080fd5b505afa158015612f0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f2f91906138f2565b6001613579565b600a613593565b612f479190614c04565b6021612ffe600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663667386f7876040518263ffffffff1660e01b8152600401612fa79190614899565b60206040518083038186803b158015612fbf57600080fd5b505afa158015612fd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ff791906138f2565b600a613593565b6130089190614c04565b6130129190614a0c565b9050600060076130cd600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fa7f71b1876040518263ffffffff1660e01b81526004016130769190614899565b60206040518083038186803b15801561308e57600080fd5b505afa1580156130a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130c691906138f2565b600a613593565b6130d79190614c04565b601e6130e39190614a0c565b90506000600661319e600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639ec29b82886040518263ffffffff1660e01b81526004016131479190614899565b60206040518083038186803b15801561315f57600080fd5b505afa158015613173573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061319791906138f2565b600a613593565b6131a89190614c04565b60146131b49190614a0c565b90506131bf83610e38565b6131c883610e38565b6131d183610e38565b6040516020016131e3939291906144c3565b6040516020818303038152906040529350505050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613257846108b2565b6132619190614c5e565b9050600060076000848152602001908152602001600020549050818114613346576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506133cb9190614c5e565b9050600060096000848152602001908152602001600020549050600060088381548110613421577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613469577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806134de577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613505836108b2565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600081831015613589578161358b565b825b905092915050565b60008183106135a257816135a4565b825b905092915050565b60006135bf6135ba846148e5565b6148b4565b9050828152602081018484840111156135d757600080fd5b6135e2848285614d10565b509392505050565b6000813590506135f981614ed8565b92915050565b60008151905061360e81614ed8565b92915050565b60008135905061362381614eef565b92915050565b60008135905061363881614f06565b92915050565b60008151905061364d81614f06565b92915050565b600082601f83011261366457600080fd5b81356136748482602086016135ac565b91505092915050565b60008135905061368c81614f1d565b92915050565b6000815190506136a181614f1d565b92915050565b6000602082840312156136b957600080fd5b60006136c7848285016135ea565b91505092915050565b6000602082840312156136e257600080fd5b60006136f0848285016135ff565b91505092915050565b6000806040838503121561370c57600080fd5b600061371a858286016135ea565b925050602061372b858286016135ea565b9150509250929050565b60008060006060848603121561374a57600080fd5b6000613758868287016135ea565b9350506020613769868287016135ea565b925050604061377a8682870161367d565b9150509250925092565b6000806000806080858703121561379a57600080fd5b60006137a8878288016135ea565b94505060206137b9878288016135ea565b93505060406137ca8782880161367d565b925050606085013567ffffffffffffffff8111156137e757600080fd5b6137f387828801613653565b91505092959194509250565b6000806040838503121561381257600080fd5b6000613820858286016135ea565b925050602061383185828601613614565b9150509250929050565b6000806040838503121561384e57600080fd5b600061385c858286016135ea565b925050602061386d8582860161367d565b9150509250929050565b60006020828403121561388957600080fd5b600061389784828501613629565b91505092915050565b6000602082840312156138b257600080fd5b60006138c08482850161363e565b91505092915050565b6000602082840312156138db57600080fd5b60006138e98482850161367d565b91505092915050565b60006020828403121561390457600080fd5b600061391284828501613692565b91505092915050565b61392481614c92565b82525050565b61393381614ca4565b82525050565b60006139448261492a565b61394e8185614940565b935061395e818560208601614d1f565b61396781614eba565b840191505092915050565b600061397d8261492a565b6139878185614951565b9350613997818560208601614d1f565b80840191505092915050565b600081546139b081614d52565b6139ba8186614951565b945060018216600081146139d557600181146139e657613a19565b60ff19831686528186019350613a19565b6139ef85614915565b60005b83811015613a11578154818901526001820191506020810190506139f2565b838801955050505b50505092915050565b6000613a2d82614935565b613a37818561495c565b9350613a47818560208601614d1f565b613a5081614eba565b840191505092915050565b6000613a6682614935565b613a70818561496d565b9350613a80818560208601614d1f565b80840191505092915050565b6000613a99602b8361495c565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613aff60328361495c565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613b65601c8361495c565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613ba5600a8361496d565b91507f27253230793125334427000000000000000000000000000000000000000000006000830152600a82019050919050565b6000613be560288361495c565b91507f467269656e646c794672616374616c734e3a204d757374206f776e207265737060008301527f656374697665204e0000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c4b60248361495c565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613cb160198361495c565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613cf160068361496d565b91507f25334225323000000000000000000000000000000000000000000000000000006000830152600682019050919050565b6000613d31600a8361496d565b91507f27253230253246253345000000000000000000000000000000000000000000006000830152600a82019050919050565b6000613d71600a8361496d565b91507f27253230793225334427000000000000000000000000000000000000000000006000830152600a82019050919050565b6000613db1602c8361495c565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613e1760388361495c565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613e7d602a8361495c565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ee360238361495c565b91507f467269656e646c794672616374616c734e3a20546f6b656e20494420696e766160008301527f6c696400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f4960068361496d565b91507f25323525324300000000000000000000000000000000000000000000000000006000830152600682019050919050565b6000613f8960298361495c565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613fef60208361495c565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061402f602c8361495c565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061409560298361495c565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006140fb602f8361495c565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614161600d8361496d565b91507f7374726f6b6525334168736c28000000000000000000000000000000000000006000830152600d82019050919050565b60006141a160218361495c565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061420760078361496d565b91507f25323529253342000000000000000000000000000000000000000000000000006000830152600782019050919050565b600061424760318361495c565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006142ad602c8361495c565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b600061431360038361496d565b91507f25323300000000000000000000000000000000000000000000000000000000006000830152600382019050919050565b600061435360108361496d565b91507f2533436c696e65253230783125334427000000000000000000000000000000006000830152601082019050919050565b6000614393600a8361496d565b91507f27253230783225334427000000000000000000000000000000000000000000006000830152600a82019050919050565b60006143d3601f8361495c565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b600061441360038361496d565b91507f25324300000000000000000000000000000000000000000000000000000000006000830152600382019050919050565b61444f81614d06565b82525050565b600061446182896139a3565b915061446c82614306565b91506144788288613a5b565b915061448482876139a3565b91506144908286613a5b565b915061449b82613ce4565b91506144a78285613972565b91506144b382846139a3565b9150819050979650505050505050565b60006144ce82614154565b91506144da8286613a5b565b91506144e582614406565b91506144f18285613a5b565b91506144fc82613f3c565b91506145088284613a5b565b9150614513826141fa565b9150819050949350505050565b600061452b82614346565b91506145378287613a5b565b915061454282613b98565b915061454e8286613a5b565b915061455982614386565b91506145658285613a5b565b915061457082613d64565b915061457c8284613a5b565b915061458782613d24565b915081905095945050505050565b60006020820190506145aa600083018461391b565b92915050565b60006080820190506145c5600083018761391b565b6145d2602083018661391b565b6145df6040830185614446565b81810360608301526145f18184613939565b905095945050505050565b6000602082019050614611600083018461392a565b92915050565b600060208201905081810360008301526146318184613a22565b905092915050565b6000602082019050818103600083015261465281613a8c565b9050919050565b6000602082019050818103600083015261467281613af2565b9050919050565b6000602082019050818103600083015261469281613b58565b9050919050565b600060208201905081810360008301526146b281613bd8565b9050919050565b600060208201905081810360008301526146d281613c3e565b9050919050565b600060208201905081810360008301526146f281613ca4565b9050919050565b6000602082019050818103600083015261471281613da4565b9050919050565b6000602082019050818103600083015261473281613e0a565b9050919050565b6000602082019050818103600083015261475281613e70565b9050919050565b6000602082019050818103600083015261477281613ed6565b9050919050565b6000602082019050818103600083015261479281613f7c565b9050919050565b600060208201905081810360008301526147b281613fe2565b9050919050565b600060208201905081810360008301526147d281614022565b9050919050565b600060208201905081810360008301526147f281614088565b9050919050565b60006020820190508181036000830152614812816140ee565b9050919050565b6000602082019050818103600083015261483281614194565b9050919050565b600060208201905081810360008301526148528161423a565b9050919050565b60006020820190508181036000830152614872816142a0565b9050919050565b60006020820190508181036000830152614892816143c6565b9050919050565b60006020820190506148ae6000830184614446565b92915050565b6000604051905081810181811067ffffffffffffffff821117156148db576148da614e8b565b5b8060405250919050565b600067ffffffffffffffff821115614900576148ff614e8b565b5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061498382614cdc565b915061498e83614cdc565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038313600083121516156149c9576149c8614dfe565b5b817f8000000000000000000000000000000000000000000000000000000000000000038312600083121615614a0157614a00614dfe565b5b828201905092915050565b6000614a1782614d06565b9150614a2283614d06565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a5757614a56614dfe565b5b828201905092915050565b6000614a6d82614d06565b9150614a7883614d06565b925082614a8857614a87614e2d565b5b828204905092915050565b6000808291508390505b6001851115614add57808604811115614ab957614ab8614dfe565b5b6001851615614ac85780820291505b8081029050614ad685614ecb565b9450614a9d565b94509492505050565b6000614af182614d06565b9150614afc83614d06565b9250614b297fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614b31565b905092915050565b600082614b415760019050614bfd565b81614b4f5760009050614bfd565b8160018114614b655760028114614b6f57614b9e565b6001915050614bfd565b60ff841115614b8157614b80614dfe565b5b8360020a915084821115614b9857614b97614dfe565b5b50614bfd565b5060208310610133831016604e8410600b8410161715614bd35782820a905083811115614bce57614bcd614dfe565b5b614bfd565b614be08484846001614a93565b92509050818404811115614bf757614bf6614dfe565b5b81810290505b9392505050565b6000614c0f82614d06565b9150614c1a83614d06565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614c5357614c52614dfe565b5b828202905092915050565b6000614c6982614d06565b9150614c7483614d06565b925082821015614c8757614c86614dfe565b5b828203905092915050565b6000614c9d82614ce6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614d3d578082015181840152602081019050614d22565b83811115614d4c576000848401525b50505050565b60006002820490506001821680614d6a57607f821691505b60208210811415614d7e57614d7d614e5c565b5b50919050565b6000614d8f82614d06565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614dc257614dc1614dfe565b5b600182019050919050565b6000614dd882614d06565b9150614de383614d06565b925082614df357614df2614e2d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b614ee181614c92565b8114614eec57600080fd5b50565b614ef881614ca4565b8114614f0357600080fd5b50565b614f0f81614cb0565b8114614f1a57600080fd5b50565b614f2681614d06565b8114614f3157600080fd5b5056fea26469706673582212207b59fef3b6c4424000f682120dadacdec2ad331c255e55df88ac0965cd0783e564736f6c63430008000033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000005a46f1e545526fb803ff974c790acea34d1f2d6

-----Decoded View---------------
Arg [0] : addressOfN (address): 0x05a46f1E545526FB803FF974C790aCeA34D1f2D6

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000005a46f1e545526fb803ff974c790acea34d1f2d6


Deployed Bytecode Sourcemap

15065:12028:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16126:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3765:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4617:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4198:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10641:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5321:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10377:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5668:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10762:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3518:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3302:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15178:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3873:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16346:303;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4846:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5861:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16657:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22937:640;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5149:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16126:212;16265:4;16294:36;16318:11;16294:23;:36::i;:::-;16287:43;;16126:212;;;:::o;3765:100::-;3819:13;3852:5;3845:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3765:100;:::o;4617:221::-;4693:7;4721:16;4729:7;4721;:16::i;:::-;4713:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4806:15;:24;4822:7;4806:24;;;;;;;;;;;;;;;;;;;;;4799:31;;4617:221;;;:::o;4198:411::-;4279:13;4295:23;4310:7;4295:14;:23::i;:::-;4279:39;;4343:5;4337:11;;:2;:11;;;;4329:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;4437:5;4421:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;4446:37;4463:5;4470:12;:10;:12::i;:::-;4446:16;:37::i;:::-;4421:62;4399:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;4580:21;4589:2;4593:7;4580:8;:21::i;:::-;4198:411;;;:::o;10641:113::-;10702:7;10729:10;:17;;;;10722:24;;10641:113;:::o;5321:339::-;5516:41;5535:12;:10;:12::i;:::-;5549:7;5516:18;:41::i;:::-;5508:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5624:28;5634:4;5640:2;5644:7;5624:9;:28::i;:::-;5321:339;;;:::o;10377:256::-;10474:7;10510:23;10527:5;10510:16;:23::i;:::-;10502:5;:31;10494:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;10599:12;:19;10612:5;10599:19;;;;;;;;;;;;;;;:26;10619:5;10599:26;;;;;;;;;;;;10592:33;;10377:256;;;;:::o;5668:185::-;5806:39;5823:4;5829:2;5833:7;5806:39;;;;;;;;;;;;:16;:39::i;:::-;5668:185;;;:::o;10762:233::-;10837:7;10873:30;:28;:30::i;:::-;10865:5;:38;10857:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;10970:10;10981:5;10970:17;;;;;;;;;;;;;;;;;;;;;;;;10963:24;;10762:233;;;:::o;3518:239::-;3590:7;3610:13;3626:7;:16;3634:7;3626:16;;;;;;;;;;;;;;;;;;;;;3610:32;;3678:1;3661:19;;:5;:19;;;;3653:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3744:5;3737:12;;;3518:239;;;:::o;3302:208::-;3374:7;3419:1;3402:19;;:5;:19;;;;3394:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;3486:9;:16;3496:5;3486:16;;;;;;;;;;;;;;;;3479:23;;3302:208;;;:::o;15178:23::-;;;;;;;;;;;;;:::o;3873:104::-;3929:13;3962:7;3955:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3873:104;:::o;16346:303::-;13547:1;13767:7;;:19;;13759:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;13547:1;13900:7;:18;;;;16426:1:::1;16416:7;:11;:29;;;;;16441:4;16431:7;:14;16416:29;16408:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;16542:12;:10;:12::i;:::-;16501:53;;16512:8;;;;;;;;;;;16501:28;;;16530:7;16501:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;16493:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;16609:32;16619:12;:10;:12::i;:::-;16633:7;16609:9;:32::i;:::-;13503:1:::0;14079:7;:22;;;;16346:303;:::o;4846:295::-;4961:12;:10;:12::i;:::-;4949:24;;:8;:24;;;;4941:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;5061:8;5016:18;:32;5035:12;:10;:12::i;:::-;5016:32;;;;;;;;;;;;;;;:42;5049:8;5016:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;5114:8;5085:48;;5100:12;:10;:12::i;:::-;5085:48;;;5124:8;5085:48;;;;;;:::i;:::-;;;;;;;;4846:295;;:::o;5861:328::-;6036:41;6055:12;:10;:12::i;:::-;6069:7;6036:18;:41::i;:::-;6028:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;6142:39;6156:4;6162:2;6166:7;6175:5;6142:13;:39::i;:::-;5861:328;;;;:::o;16657:218::-;16722:13;16756:16;16764:7;16756;:16::i;:::-;16748:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;16842:25;16859:7;16842:16;:25::i;:::-;16835:32;;16657:218;;;:::o;22937:640::-;22988:13;23014:14;23031:1;23014:18;;23043:21;23077:9;23067:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23043:44;;23098:6;23119:150;23131:1;23126;:6;23119:150;;23149:14;23170:2;23166:1;:6;;;;:::i;:::-;23149:23;;23195:2;23191:1;:6;;;;:::i;:::-;23187:10;;23246:9;23241:2;:14;;;;:::i;:::-;23228:29;;23212:8;23221:3;;;;;:::i;:::-;;;23212:13;;;;;;;;;;;;;;;;;;;:45;;;;;;;;;;;23119:150;;;;23279:14;23306:1;23296:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23279:29;;23348:6;23343:115;23364:1;23360;:5;23343:115;;;23394:8;23411:1;23407;23403;:5;;;;:::i;:::-;:9;;;;:::i;:::-;23394:19;;;;;;;;;;;;;;;;;;;;;;;;23387:1;23389;23387:4;;;;;;;;;;;;;;;;;;;:26;;;;;;;;;;;23367:3;;;;;:::i;:::-;;;;23343:115;;;;23468:17;23495:1;23468:29;;23566:3;23559:10;;;;;;;22937:640;;;:::o;5149:164::-;5246:4;5270:18;:25;5289:5;5270:25;;;;;;;;;;;;;;;:35;5296:8;5270:35;;;;;;;;;;;;;;;;;;;;;;;;;5263:42;;5149:164;;;;:::o;10145:224::-;10247:4;10286:35;10271:50;;;:11;:50;;;;:90;;;;10325:36;10349:11;10325:23;:36::i;:::-;10271:90;10264:97;;10145:224;;;:::o;6520:127::-;6585:4;6637:1;6609:30;;:7;:16;6617:7;6609:16;;;;;;;;;;;;;;;;;;;;;:30;;;;6602:37;;6520:127;;;:::o;320:98::-;373:7;400:10;393:17;;320:98;:::o;8434:174::-;8536:2;8509:15;:24;8525:7;8509:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;8592:7;8588:2;8554:46;;8563:23;8578:7;8563:14;:23::i;:::-;8554:46;;;;;;;;;;;;8434:174;;:::o;6655:348::-;6748:4;6773:16;6781:7;6773;:16::i;:::-;6765:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6849:13;6865:23;6880:7;6865:14;:23::i;:::-;6849:39;;6918:5;6907:16;;:7;:16;;;:51;;;;6951:7;6927:31;;:20;6939:7;6927:11;:20::i;:::-;:31;;;6907:51;:87;;;;6962:32;6979:5;6986:7;6962:16;:32::i;:::-;6907:87;6899:96;;;6655:348;;;;:::o;7848:578::-;8007:4;7980:31;;:23;7995:7;7980:14;:23::i;:::-;:31;;;7972:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;8090:1;8076:16;;:2;:16;;;;8068:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;8146:39;8167:4;8173:2;8177:7;8146:20;:39::i;:::-;8250:29;8267:1;8271:7;8250:8;:29::i;:::-;8311:1;8292:9;:15;8302:4;8292:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;8340:1;8323:9;:13;8333:2;8323:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;8371:2;8352:7;:16;8360:7;8352:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;8410:7;8406:2;8391:27;;8400:4;8391:27;;;;;;;;;;;;7848:578;;;:::o;7011:110::-;7087:26;7097:2;7101:7;7087:26;;;;;;;;;;;;:9;:26::i;:::-;7011:110;;:::o;6197:315::-;6354:28;6364:4;6370:2;6374:7;6354:9;:28::i;:::-;6401:48;6424:4;6430:2;6434:7;6443:5;6401:22;:48::i;:::-;6393:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6197:315;;;;:::o;16883:2376::-;16949:13;16975:21;16999:1;16975:25;;17076:21;:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17300:13;17357:1;17327:8;;;;;;;;;;;17316:29;;;17346:7;17316:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;;;:::i;:::-;17300:58;;17369:13;17428:1;17396:8;;;;;;;;;;;17385:31;;;17417:7;17385:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;;;;:::i;:::-;17369:60;;17440:13;17497:1;17467:8;;;;;;;;;;;17456:29;;;17486:7;17456:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;;;:::i;:::-;17440:58;;17569:21;17628:1;17625;17611:13;:15;;;;:::i;:::-;17607:1;:20;;;;:::i;:::-;:22;;;;:::i;:::-;17593:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17569:61;;17652:35;17660:5;17667;17674;17681;17652:7;:35::i;:::-;17643:4;17648:1;17643:7;;;;;;;;;;;;;;;;;;;;;:44;;;;;17703:9;17698:597;17735:1;17721:13;17718:1;:16;;;;:::i;:::-;:18;;;;:::i;:::-;17716:1;:20;17698:597;;;17804:1;17800;:5;17796:488;;;17840:34;17853:4;17858:1;17853:7;;;;;;;;;;;;;;;;;;;;;;17862:4;17868:5;17840:12;:34::i;:::-;17826:4;17835:1;17833;17831;:3;;;;:::i;:::-;:5;;;;:::i;:::-;17826:11;;;;;;;;;;;;;;;;;;;;;:48;;;;;17907:35;17920:4;17925:1;17920:7;;;;;;;;;;;;;;;;;;;;;;17929:5;17936;17907:12;:35::i;:::-;17893:4;17902:1;17900;17898;:3;;;;:::i;:::-;:5;;;;:::i;:::-;17893:11;;;;;;;;;;;;;;;;;;;;;:49;;;;;17796:488;;;17972:2;17968:1;:6;17964:320;;;18009:34;18022:4;18027:1;18022:7;;;;;;;;;;;;;;;;;;;;;;18031:4;18037:5;18009:12;:34::i;:::-;17995:4;18004:1;18002;18000;:3;;;;:::i;:::-;:5;;;;:::i;:::-;17995:11;;;;;;;;;;;;;;;;;;;;;:48;;;;;18076:35;18089:4;18094:1;18089:7;;;;;;;;;;;;;;;;;;;;;;18098:5;18105;18076:12;:35::i;:::-;18062:4;18071:1;18069;18067;:3;;;;:::i;:::-;:5;;;;:::i;:::-;18062:11;;;;;;;;;;;;;;;;;;;;;:49;;;;;17964:320;;;18166:34;18179:4;18184:1;18179:7;;;;;;;;;;;;;;;;;;;;;;18188:4;18194:5;18166:12;:34::i;:::-;18152:4;18161:1;18159;18157;:3;;;;:::i;:::-;:5;;;;:::i;:::-;18152:11;;;;;;;;;;;;;;;;;;;;;:48;;;;;18233:35;18246:4;18251:1;18246:7;;;;;;;;;;;;;;;;;;;;;;18255:5;18262;18233:12;:35::i;:::-;18219:4;18228:1;18226;18224;:3;;;;:::i;:::-;:5;;;;:::i;:::-;18219:11;;;;;;;;;;;;;;;;;;;;;:49;;;;;17964:320;17796:488;17738:3;;;;;:::i;:::-;;;;17698:597;;;;18391:19;18445:3;18430:13;18427:1;:16;;;;:::i;:::-;18423:2;:21;;;;:::i;:::-;:25;;;;:::i;:::-;18413:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18391:58;;18460:16;18527:2;18519:6;18515:15;18508:22;;18575:16;18603:15;18654:17;18674:22;18688:7;18674:13;:22::i;:::-;18654:42;;18724:21;18735:3;18740:4;18724:10;:21::i;:::-;18707:38;;;;;;;;18768:7;18756:19;;;;;:::i;:::-;;;18811:9;18838:1;18824:13;18821:1;:16;;;;:::i;:::-;:18;;;;:::i;:::-;18811:28;;18806:211;18843:4;:11;18841:1;:13;18806:211;;;18873:20;18896:25;18907:4;18913:1;18916:4;18896:10;:25::i;:::-;18873:48;;18950:24;18961:3;18966:7;18950:10;:24::i;:::-;18933:41;;;;;;;;18998:7;18986:19;;;;;:::i;:::-;;;18806:211;18856:3;;;;;:::i;:::-;;;;18806:211;;;;19064:24;19075:3;19080:7;19064:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:10;:24::i;:::-;19047:41;;;;;;;;19108:7;19096:19;;;;;:::i;:::-;;;19198:8;19190:6;19183:24;19244:6;19230:21;;;;;;;;;;;;;16883:2376;;;:::o;2989:305::-;3091:4;3143:25;3128:40;;;:11;:40;;;;:105;;;;3200:33;3185:48;;;:11;:48;;;;3128:105;:158;;;;3250:36;3274:11;3250:23;:36::i;:::-;3128:158;3108:178;;2989:305;;;:::o;15903:215::-;16065:45;16092:4;16098:2;16102:7;16065:26;:45::i;:::-;15903:215;;;:::o;7129:321::-;7259:18;7265:2;7269:7;7259:5;:18::i;:::-;7310:54;7341:1;7345:2;7349:7;7358:5;7310:22;:54::i;:::-;7288:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;7129:321;;;:::o;8616:799::-;8771:4;8792:15;:2;:13;;;:15::i;:::-;8788:620;;;8844:2;8828:36;;;8865:12;:10;:12::i;:::-;8879:4;8885:7;8894:5;8828:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;8824:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9087:1;9070:6;:13;:18;9066:272;;;9113:60;;;;;;;;;;:::i;:::-;;;;;;;;9066:272;9288:6;9282:13;9273:6;9269:2;9265:15;9258:38;8824:529;8961:41;;;8951:51;;;:6;:51;;;;8944:58;;;;;8788:620;9392:4;9385:11;;8616:799;;;;;;;:::o;22146:401::-;22228:7;22245:14;22262:1;22245:18;;22294:10;22289:2;:15;22271:34;;;;22332:2;22322:6;:12;;22313:21;;22365:10;22360:2;:15;22342:34;;;;22403:2;22393:6;:12;;22384:21;;22435:10;22431:1;:14;22413:33;;;;22473:2;22463:6;:12;;22454:21;;22505:10;22501:1;:14;22483:33;;;;22533:6;22526:13;;;22146:401;;;;;;:::o;19267:2832::-;19359:7;19376:8;19395;19414:9;19434;19473:12;19480:4;19473:6;:12::i;:::-;19456:29;;;;;;;;;;;;;;;;19492:13;19508:5;19492:21;;19518:13;19534:5;19518:21;;20029:10;20050;20071;20092;20224:6;20216;20207;20199;20195:2;20191:15;20186:28;20178:6;20169;20165:2;20161:15;20156:29;20152:63;20148:75;20143:88;20136:95;;20330:6;20322;20313;20305;20301:2;20297:15;20292:28;20284:6;20275;20271:2;20267:15;20262:29;20258:63;20254:75;20249:88;20242:95;;20436:6;20428;20419;20411;20407:2;20403:15;20398:28;20390:6;20381;20377:2;20373:15;20368:29;20364:63;20360:75;20355:88;20348:95;;20554:6;20546;20537;20529;20525:2;20521:15;20516:28;20508:6;20499;20493:2;20489:7;20487:1;20483:14;20479:27;20474:41;20470:75;20466:87;20461:100;20454:107;;20657:9;:27;;;;;20682:1;20671:7;:12;20657:27;:105;;;;20703:9;20702:10;:60;;;;;20728:1;20717:7;:12;:28;;;;20744:1;20733:7;:12;20717:28;:44;;;;20760:1;20749:7;:12;20717:44;20702:60;20657:105;20653:570;;;20810:2;20807:1;20803:10;20798:15;;20837:2;20834:1;20830:10;20825:15;;20785:67;;;20884:1;20873:7;:12;:74;;;;20904:9;20903:10;:44;;;;;20929:1;20918:7;:12;:28;;;;20945:1;20934:7;:12;20918:28;20903:44;20873:74;20869:354;;;20995:3;20992:1;20988:11;20983:16;;21023:3;21020:1;21016:11;21011:16;;20970:69;;;21061:9;21060:10;:60;;;;;21086:1;21075:7;:12;:28;;;;21102:1;21091:7;:12;21075:28;:44;;;;21118:1;21107:7;:12;21075:44;21060:60;21056:167;;;21168:3;21165:1;21161:11;21156:16;;21196:3;21193:1;21189:11;21184:16;;21143:69;20869:354;20653:570;21239:9;:91;;;;;21264:1;21253:7;:12;:28;;;;21280:1;21269:7;:12;21253:28;:44;;;;21296:1;21285:7;:12;21253:44;:60;;;;21312:1;21301:7;:12;21253:60;:76;;;;21328:1;21317:7;:12;21253:76;21239:91;:149;;;;21345:9;21344:10;:44;;;;;21370:1;21359:7;:12;:28;;;;21386:1;21375:7;:12;21359:28;21344:44;21239:149;21235:818;;;21407:3;21402:8;;21427:3;21422:8;;21235:818;;;21455:9;:27;;;;;21480:1;21469:7;:12;21455:27;:87;;;;21499:9;21498:10;:44;;;;;21524:1;21513:7;:12;:28;;;;21540:1;21529:7;:12;21513:28;21498:44;21455:87;21451:602;;;21595:3;21591:8;21588:1;21584:16;21578:22;;21629:3;21625:8;21622:1;21618:16;21612:22;;21565:81;;;21669:9;:43;;;;;21694:1;21683:7;:12;:28;;;;21710:1;21699:7;:12;21683:28;21669:43;:105;;;;21731:9;21730:10;:44;;;;;21756:1;21745:7;:12;:28;;;;21772:1;21761:7;:12;21745:28;21730:44;21669:105;21665:388;;;21790:3;21785:8;;21807:3;21802:8;;21665:388;;;21834:9;:27;;;;;21859:1;21848:7;:12;21834:27;:104;;;;21879:9;21878:10;:60;;;;;21904:1;21893:7;:12;:28;;;;21920:1;21909:7;:12;21893:28;:44;;;;21936:1;21925:7;:12;21893:44;21878:60;21834:104;21830:223;;;21991:3;21987:8;21984:1;21980:16;21974:22;;22025:3;22021:8;22018:1;22014:16;22008:22;;21961:81;21665:388;21451:602;21235:818;22070:21;22078:1;22081;22084:2;22088;22070:7;:21::i;:::-;22063:28;;;;;;;;;;;;19267:2832;;;;;:::o;23585:326::-;23648:12;23673:19;23718:8;;;;;;;;;;;23707:29;;;23737:7;23707:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23701:3;:44;;;;:::i;:::-;23695:3;:50;;;;:::i;:::-;23673:72;;23782:8;23799:21;23812:7;23799:12;:21::i;:::-;23822:8;23832:25;23845:11;23832:12;:25::i;:::-;23869:23;23884:7;23869:14;:23::i;:::-;23894:8;23765:138;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23758:145;;;23585:326;;;:::o;24582:527::-;24675:15;24692:24;24726:16;24771:2;24765;24746:9;:16;:21;;;;:::i;:::-;24745:28;;;;:::i;:::-;24726:47;;24791:9;:16;24781:26;;24829:11;24815:25;;24921:1;24905:138;24931:8;24928:1;24925:15;24905:138;;;25035:1;25032;25028:9;25024:2;25020:18;25009:9;25005:34;24999:41;24994:1;24990:2;24986:10;24973:11;24969:28;24962:79;24955:1;24952;24948:9;24943:14;;24905:138;;;24909:15;25086:7;25073:11;25069:25;25054:40;;24893:209;;;;;;:::o;25155:1935::-;25259:12;25289:17;25317:8;25336;25355:9;25375;25412:19;25419:4;25424:5;25419:11;;;;;;;;;;;;;;;;;;;;;;25412:6;:19::i;:::-;25395:36;;;;;;;;;;;;;;;;25441:16;25465:17;25490:25;25530:9;25525:1408;25545:1;25543;:3;25525:1408;;;25573:1;25562:12;;25595:1;25583:13;;25605:11;25634:1;25629;:6;25625:205;;;25661:1;25647:16;;25625:205;;;25688:1;25683;:6;25679:151;;;25715:1;25701:16;;25679:151;;;25743:1;25738;:6;25734:96;;;25772:2;25770:1;:4;;;;:::i;:::-;25756:19;;25734:96;;;25817:2;25815:1;:4;;;;:::i;:::-;25801:19;;25734:96;25679:151;25625:205;25898:1;25894:2;25890:10;25884:4;25880:21;25874:28;25859:43;;25921:15;25939:3;25921:21;;26110:89;26130:1;26121:7;26118:14;26110:89;;;26195:1;26184:9;26180:17;26167:30;;26159:2;26150:7;26146:16;26135:27;;26110:89;;;26617:226;26632:1;26627:3;26624:10;26617:226;;;26703:2;26697;26692:3;26688:12;26684:22;26671:35;;26779:9;26766:8;26756:9;26752:23;26748:2;26744:32;26731:11;26727:50;26719:70;26828:1;26818:8;26814:16;26802:28;;26652:2;26647:3;26643:12;26636:19;;26617:226;;;26907:8;26894:11;26887:29;26877:48;;25548:3;;;;;:::i;:::-;;;;25525:1408;;;;26989:4;26994:1;26989:7;;;;;;;;;;;;;;;;;;;27012:4;27017:1;27012:7;;;;;;;;;;;;;;;;;;;27035:4;27040:1;27035:7;;;;;;;;;;;;;;;;;;;27058:4;27063:1;27058:7;;;;;;;;;;;;;;;;;;;26952:128;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26945:135;;;;;;;;;;25155:1935;;;;;:::o;685:157::-;770:4;809:25;794:40;;;:11;:40;;;;787:47;;685:157;;;:::o;11003:589::-;11147:45;11174:4;11180:2;11184:7;11147:26;:45::i;:::-;11225:1;11209:18;;:4;:18;;;11205:187;;;11244:40;11276:7;11244:31;:40::i;:::-;11205:187;;;11314:2;11306:10;;:4;:10;;;11302:90;;11333:47;11366:4;11372:7;11333:32;:47::i;:::-;11302:90;11205:187;11420:1;11406:16;;:2;:16;;;11402:183;;;11439:45;11476:7;11439:36;:45::i;:::-;11402:183;;;11512:4;11506:10;;:2;:10;;;11502:83;;11533:40;11561:2;11565:7;11533:27;:40::i;:::-;11502:83;11402:183;11003:589;;;:::o;7458:382::-;7552:1;7538:16;;:2;:16;;;;7530:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;7611:16;7619:7;7611;:16::i;:::-;7610:17;7602:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;7673:45;7702:1;7706:2;7710:7;7673:20;:45::i;:::-;7748:1;7731:9;:13;7741:2;7731:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;7779:2;7760:7;:16;7768:7;7760:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;7824:7;7820:2;7799:33;;7816:1;7799:33;;;;;;;;;;;;7458:382;;:::o;84:196::-;144:4;161:12;228:7;216:20;208:28;;271:1;264:4;:8;257:15;;;84:196;;;:::o;22593:336::-;22646:8;22656;22666:9;22677;22720:4;22700:27;;22696:31;;22750:2;22742:4;:10;;22735:17;;22784:4;22764:27;;22760:31;;22814:2;22806:4;:10;;22799:17;;22849:4;22829:27;;22824:32;;22879:2;22871:4;:10;;22864:17;;22914:4;22894:27;;22889:32;;22593:336;;;;;:::o;23919:583::-;23983:12;24015:15;24162:1;24093:66;24102:52;24122:8;;;;;;;;;;;24111:30;;;24142:7;24111:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24152:1;24102:8;:52::i;:::-;24156:2;24093:8;:66::i;:::-;:70;;;;:::i;:::-;24088:2;24033:52;24053:8;;;;;;;;;;;24042:29;;;24072:7;24042:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24082:2;24033:8;:52::i;:::-;:57;;;;:::i;:::-;:130;;;;:::i;:::-;24015:148;;24174:15;24252:1;24197:52;24217:8;;;;;;;;;;;24206:29;;;24236:7;24206:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24246:2;24197:8;:52::i;:::-;:56;;;;:::i;:::-;24192:2;:61;;;;:::i;:::-;24174:79;;24264:15;24343:1;24287:53;24307:8;;;;;;;;;;;24296:30;;;24327:7;24296:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24337:2;24287:8;:53::i;:::-;:57;;;;:::i;:::-;24282:2;:62;;;;:::i;:::-;24264:80;;24398:21;24411:7;24398:12;:21::i;:::-;24428;24441:7;24428:12;:21::i;:::-;24461;24474:7;24461:12;:21::i;:::-;24364:130;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24357:137;;;;;23919:583;;;:::o;9423:126::-;;;;:::o;11829:164::-;11933:10;:17;;;;11906:15;:24;11922:7;11906:24;;;;;;;;;;;:44;;;;11961:10;11977:7;11961:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11829:164;:::o;12001:812::-;12093:22;12143:1;12118:22;12135:4;12118:16;:22::i;:::-;:26;;;;:::i;:::-;12093:51;;12155:18;12176:17;:26;12194:7;12176:26;;;;;;;;;;;;12155:47;;12323:14;12309:10;:28;12305:328;;12354:19;12376:12;:18;12389:4;12376:18;;;;;;;;;;;;;;;:34;12395:14;12376:34;;;;;;;;;;;;12354:56;;12460:11;12427:12;:18;12440:4;12427:18;;;;;;;;;;;;;;;:30;12446:10;12427:30;;;;;;;;;;;:44;;;;12577:10;12544:17;:30;12562:11;12544:30;;;;;;;;;;;:43;;;;12305:328;;12727:17;:26;12745:7;12727:26;;;;;;;;;;;12720:33;;;12771:12;:18;12784:4;12771:18;;;;;;;;;;;;;;;:34;12790:14;12771:34;;;;;;;;;;;12764:41;;;12001:812;;;;:::o;12821:594::-;12903:22;12948:1;12928:10;:17;;;;:21;;;;:::i;:::-;12903:46;;12960:18;12981:15;:24;12997:7;12981:24;;;;;;;;;;;;12960:45;;13018:19;13040:10;13051:14;13040:26;;;;;;;;;;;;;;;;;;;;;;;;13018:48;;13104:11;13079:10;13090;13079:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;13215:10;13184:15;:28;13200:11;13184:28;;;;;;;;;;;:41;;;;13356:15;:24;13372:7;13356:24;;;;;;;;;;;13349:31;;;13391:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12821:594;;;;:::o;11600:221::-;11685:14;11702:20;11719:2;11702:16;:20::i;:::-;11685:37;;11760:7;11733:12;:16;11746:2;11733:16;;;;;;;;;;;;;;;:24;11750:6;11733:24;;;;;;;;;;;:34;;;;11807:6;11778:17;:26;11796:7;11778:26;;;;;;;;;;;:35;;;;11600:221;;;:::o;14136:107::-;14194:7;14226:1;14221;:6;;:14;;14234:1;14221:14;;;14230:1;14221:14;14214:21;;14136:107;;;;:::o;14251:106::-;14309:7;14340:1;14336;:5;:13;;14348:1;14336:13;;;14344:1;14336:13;14329:20;;14251:106;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:139::-;;439:6;426:20;417:29;;455:33;482:5;455:33;:::i;:::-;407:87;;;;:::o;500:143::-;;588:6;582:13;573:22;;604:33;631:5;604:33;:::i;:::-;563:80;;;;:::o;649:133::-;;730:6;717:20;708:29;;746:30;770:5;746:30;:::i;:::-;698:84;;;;:::o;788:137::-;;871:6;858:20;849:29;;887:32;913:5;887:32;:::i;:::-;839:86;;;;:::o;931:141::-;;1018:6;1012:13;1003:22;;1034:32;1060:5;1034:32;:::i;:::-;993:79;;;;:::o;1091:271::-;;1195:3;1188:4;1180:6;1176:17;1172:27;1162:2;;1213:1;1210;1203:12;1162:2;1253:6;1240:20;1278:78;1352:3;1344:6;1337:4;1329:6;1325:17;1278:78;:::i;:::-;1269:87;;1152:210;;;;;:::o;1368:139::-;;1452:6;1439:20;1430:29;;1468:33;1495:5;1468:33;:::i;:::-;1420:87;;;;:::o;1513:143::-;;1601:6;1595:13;1586:22;;1617:33;1644:5;1617:33;:::i;:::-;1576:80;;;;:::o;1662:262::-;;1770:2;1758:9;1749:7;1745:23;1741:32;1738:2;;;1786:1;1783;1776:12;1738:2;1829:1;1854:53;1899:7;1890:6;1879:9;1875:22;1854:53;:::i;:::-;1844:63;;1800:117;1728:196;;;;:::o;1930:284::-;;2049:2;2037:9;2028:7;2024:23;2020:32;2017:2;;;2065:1;2062;2055:12;2017:2;2108:1;2133:64;2189:7;2180:6;2169:9;2165:22;2133:64;:::i;:::-;2123:74;;2079:128;2007:207;;;;:::o;2220:407::-;;;2345:2;2333:9;2324:7;2320:23;2316:32;2313:2;;;2361:1;2358;2351:12;2313:2;2404:1;2429:53;2474:7;2465:6;2454:9;2450:22;2429:53;:::i;:::-;2419:63;;2375:117;2531:2;2557:53;2602:7;2593:6;2582:9;2578:22;2557:53;:::i;:::-;2547:63;;2502:118;2303:324;;;;;:::o;2633:552::-;;;;2775:2;2763:9;2754:7;2750:23;2746:32;2743:2;;;2791:1;2788;2781:12;2743:2;2834:1;2859:53;2904:7;2895:6;2884:9;2880:22;2859:53;:::i;:::-;2849:63;;2805:117;2961:2;2987:53;3032:7;3023:6;3012:9;3008:22;2987:53;:::i;:::-;2977:63;;2932:118;3089:2;3115:53;3160:7;3151:6;3140:9;3136:22;3115:53;:::i;:::-;3105:63;;3060:118;2733:452;;;;;:::o;3191:809::-;;;;;3359:3;3347:9;3338:7;3334:23;3330:33;3327:2;;;3376:1;3373;3366:12;3327:2;3419:1;3444:53;3489:7;3480:6;3469:9;3465:22;3444:53;:::i;:::-;3434:63;;3390:117;3546:2;3572:53;3617:7;3608:6;3597:9;3593:22;3572:53;:::i;:::-;3562:63;;3517:118;3674:2;3700:53;3745:7;3736:6;3725:9;3721:22;3700:53;:::i;:::-;3690:63;;3645:118;3830:2;3819:9;3815:18;3802:32;3861:18;3853:6;3850:30;3847:2;;;3893:1;3890;3883:12;3847:2;3921:62;3975:7;3966:6;3955:9;3951:22;3921:62;:::i;:::-;3911:72;;3773:220;3317:683;;;;;;;:::o;4006:401::-;;;4128:2;4116:9;4107:7;4103:23;4099:32;4096:2;;;4144:1;4141;4134:12;4096:2;4187:1;4212:53;4257:7;4248:6;4237:9;4233:22;4212:53;:::i;:::-;4202:63;;4158:117;4314:2;4340:50;4382:7;4373:6;4362:9;4358:22;4340:50;:::i;:::-;4330:60;;4285:115;4086:321;;;;;:::o;4413:407::-;;;4538:2;4526:9;4517:7;4513:23;4509:32;4506:2;;;4554:1;4551;4544:12;4506:2;4597:1;4622:53;4667:7;4658:6;4647:9;4643:22;4622:53;:::i;:::-;4612:63;;4568:117;4724:2;4750:53;4795:7;4786:6;4775:9;4771:22;4750:53;:::i;:::-;4740:63;;4695:118;4496:324;;;;;:::o;4826:260::-;;4933:2;4921:9;4912:7;4908:23;4904:32;4901:2;;;4949:1;4946;4939:12;4901:2;4992:1;5017:52;5061:7;5052:6;5041:9;5037:22;5017:52;:::i;:::-;5007:62;;4963:116;4891:195;;;;:::o;5092:282::-;;5210:2;5198:9;5189:7;5185:23;5181:32;5178:2;;;5226:1;5223;5216:12;5178:2;5269:1;5294:63;5349:7;5340:6;5329:9;5325:22;5294:63;:::i;:::-;5284:73;;5240:127;5168:206;;;;:::o;5380:262::-;;5488:2;5476:9;5467:7;5463:23;5459:32;5456:2;;;5504:1;5501;5494:12;5456:2;5547:1;5572:53;5617:7;5608:6;5597:9;5593:22;5572:53;:::i;:::-;5562:63;;5518:117;5446:196;;;;:::o;5648:284::-;;5767:2;5755:9;5746:7;5742:23;5738:32;5735:2;;;5783:1;5780;5773:12;5735:2;5826:1;5851:64;5907:7;5898:6;5887:9;5883:22;5851:64;:::i;:::-;5841:74;;5797:128;5725:207;;;;:::o;5938:118::-;6025:24;6043:5;6025:24;:::i;:::-;6020:3;6013:37;6003:53;;:::o;6062:109::-;6143:21;6158:5;6143:21;:::i;:::-;6138:3;6131:34;6121:50;;:::o;6177:360::-;;6291:38;6323:5;6291:38;:::i;:::-;6345:70;6408:6;6403:3;6345:70;:::i;:::-;6338:77;;6424:52;6469:6;6464:3;6457:4;6450:5;6446:16;6424:52;:::i;:::-;6501:29;6523:6;6501:29;:::i;:::-;6496:3;6492:39;6485:46;;6267:270;;;;;:::o;6543:373::-;;6675:38;6707:5;6675:38;:::i;:::-;6729:88;6810:6;6805:3;6729:88;:::i;:::-;6722:95;;6826:52;6871:6;6866:3;6859:4;6852:5;6848:16;6826:52;:::i;:::-;6903:6;6898:3;6894:16;6887:23;;6651:265;;;;;:::o;6944:841::-;;7082:5;7076:12;7111:36;7137:9;7111:36;:::i;:::-;7163:88;7244:6;7239:3;7163:88;:::i;:::-;7156:95;;7282:1;7271:9;7267:17;7298:1;7293:137;;;;7444:1;7439:340;;;;7260:519;;7293:137;7377:4;7373:9;7362;7358:25;7353:3;7346:38;7413:6;7408:3;7404:16;7397:23;;7293:137;;7439:340;7506:37;7537:5;7506:37;:::i;:::-;7565:1;7579:154;7593:6;7590:1;7587:13;7579:154;;;7667:7;7661:14;7657:1;7652:3;7648:11;7641:35;7717:1;7708:7;7704:15;7693:26;;7615:4;7612:1;7608:12;7603:17;;7579:154;;;7762:6;7757:3;7753:16;7746:23;;7446:333;;7260:519;;7049:736;;;;;;:::o;7791:364::-;;7907:39;7940:5;7907:39;:::i;:::-;7962:71;8026:6;8021:3;7962:71;:::i;:::-;7955:78;;8042:52;8087:6;8082:3;8075:4;8068:5;8064:16;8042:52;:::i;:::-;8119:29;8141:6;8119:29;:::i;:::-;8114:3;8110:39;8103:46;;7883:272;;;;;:::o;8161:377::-;;8295:39;8328:5;8295:39;:::i;:::-;8350:89;8432:6;8427:3;8350:89;:::i;:::-;8343:96;;8448:52;8493:6;8488:3;8481:4;8474:5;8470:16;8448:52;:::i;:::-;8525:6;8520:3;8516:16;8509:23;;8271:267;;;;;:::o;8544:375::-;;8707:67;8771:2;8766:3;8707:67;:::i;:::-;8700:74;;8804:34;8800:1;8795:3;8791:11;8784:55;8870:13;8865:2;8860:3;8856:12;8849:35;8910:2;8905:3;8901:12;8894:19;;8690:229;;;:::o;8925:382::-;;9088:67;9152:2;9147:3;9088:67;:::i;:::-;9081:74;;9185:34;9181:1;9176:3;9172:11;9165:55;9251:20;9246:2;9241:3;9237:12;9230:42;9298:2;9293:3;9289:12;9282:19;;9071:236;;;:::o;9313:326::-;;9476:67;9540:2;9535:3;9476:67;:::i;:::-;9469:74;;9573:30;9569:1;9564:3;9560:11;9553:51;9630:2;9625:3;9621:12;9614:19;;9459:180;;;:::o;9645:344::-;;9826:85;9908:2;9903:3;9826:85;:::i;:::-;9819:92;;9941:12;9937:1;9932:3;9928:11;9921:33;9980:2;9975:3;9971:12;9964:19;;9809:180;;;:::o;9995:372::-;;10158:67;10222:2;10217:3;10158:67;:::i;:::-;10151:74;;10255:34;10251:1;10246:3;10242:11;10235:55;10321:10;10316:2;10311:3;10307:12;10300:32;10358:2;10353:3;10349:12;10342:19;;10141:226;;;:::o;10373:368::-;;10536:67;10600:2;10595:3;10536:67;:::i;:::-;10529:74;;10633:34;10629:1;10624:3;10620:11;10613:55;10699:6;10694:2;10689:3;10685:12;10678:28;10732:2;10727:3;10723:12;10716:19;;10519:222;;;:::o;10747:323::-;;10910:67;10974:2;10969:3;10910:67;:::i;:::-;10903:74;;11007:27;11003:1;10998:3;10994:11;10987:48;11061:2;11056:3;11052:12;11045:19;;10893:177;;;:::o;11076:338::-;;11257:84;11339:1;11334:3;11257:84;:::i;:::-;11250:91;;11371:8;11367:1;11362:3;11358:11;11351:29;11406:1;11401:3;11397:11;11390:18;;11240:174;;;:::o;11420:344::-;;11601:85;11683:2;11678:3;11601:85;:::i;:::-;11594:92;;11716:12;11712:1;11707:3;11703:11;11696:33;11755:2;11750:3;11746:12;11739:19;;11584:180;;;:::o;11770:344::-;;11951:85;12033:2;12028:3;11951:85;:::i;:::-;11944:92;;12066:12;12062:1;12057:3;12053:11;12046:33;12105:2;12100:3;12096:12;12089:19;;11934:180;;;:::o;12120:376::-;;12283:67;12347:2;12342:3;12283:67;:::i;:::-;12276:74;;12380:34;12376:1;12371:3;12367:11;12360:55;12446:14;12441:2;12436:3;12432:12;12425:36;12487:2;12482:3;12478:12;12471:19;;12266:230;;;:::o;12502:388::-;;12665:67;12729:2;12724:3;12665:67;:::i;:::-;12658:74;;12762:34;12758:1;12753:3;12749:11;12742:55;12828:26;12823:2;12818:3;12814:12;12807:48;12881:2;12876:3;12872:12;12865:19;;12648:242;;;:::o;12896:374::-;;13059:67;13123:2;13118:3;13059:67;:::i;:::-;13052:74;;13156:34;13152:1;13147:3;13143:11;13136:55;13222:12;13217:2;13212:3;13208:12;13201:34;13261:2;13256:3;13252:12;13245:19;;13042:228;;;:::o;13276:367::-;;13439:67;13503:2;13498:3;13439:67;:::i;:::-;13432:74;;13536:34;13532:1;13527:3;13523:11;13516:55;13602:5;13597:2;13592:3;13588:12;13581:27;13634:2;13629:3;13625:12;13618:19;;13422:221;;;:::o;13649:338::-;;13830:84;13912:1;13907:3;13830:84;:::i;:::-;13823:91;;13944:8;13940:1;13935:3;13931:11;13924:29;13979:1;13974:3;13970:11;13963:18;;13813:174;;;:::o;13993:373::-;;14156:67;14220:2;14215:3;14156:67;:::i;:::-;14149:74;;14253:34;14249:1;14244:3;14240:11;14233:55;14319:11;14314:2;14309:3;14305:12;14298:33;14357:2;14352:3;14348:12;14341:19;;14139:227;;;:::o;14372:330::-;;14535:67;14599:2;14594:3;14535:67;:::i;:::-;14528:74;;14632:34;14628:1;14623:3;14619:11;14612:55;14693:2;14688:3;14684:12;14677:19;;14518:184;;;:::o;14708:376::-;;14871:67;14935:2;14930:3;14871:67;:::i;:::-;14864:74;;14968:34;14964:1;14959:3;14955:11;14948:55;15034:14;15029:2;15024:3;15020:12;15013:36;15075:2;15070:3;15066:12;15059:19;;14854:230;;;:::o;15090:373::-;;15253:67;15317:2;15312:3;15253:67;:::i;:::-;15246:74;;15350:34;15346:1;15341:3;15337:11;15330:55;15416:11;15411:2;15406:3;15402:12;15395:33;15454:2;15449:3;15445:12;15438:19;;15236:227;;;:::o;15469:379::-;;15632:67;15696:2;15691:3;15632:67;:::i;:::-;15625:74;;15729:34;15725:1;15720:3;15716:11;15709:55;15795:17;15790:2;15785:3;15781:12;15774:39;15839:2;15834:3;15830:12;15823:19;;15615:233;;;:::o;15854:355::-;;16035:85;16117:2;16112:3;16035:85;:::i;:::-;16028:92;;16150:15;16146:1;16141:3;16137:11;16130:36;16196:2;16191:3;16187:12;16180:19;;16018:191;;;:::o;16219:385::-;;16386:67;16450:2;16445:3;16386:67;:::i;:::-;16379:74;;16487:34;16483:1;16478:3;16474:11;16467:55;16557:3;16552:2;16547:3;16543:12;16536:25;16591:2;16586:3;16582:12;16575:19;;16365:239;;;:::o;16614:343::-;;16799:84;16881:1;16876:3;16799:84;:::i;:::-;16792:91;;16913:9;16909:1;16904:3;16900:11;16893:30;16949:1;16944:3;16940:11;16933:18;;16778:179;;;:::o;16963:381::-;;17126:67;17190:2;17185:3;17126:67;:::i;:::-;17119:74;;17223:34;17219:1;17214:3;17210:11;17203:55;17289:19;17284:2;17279:3;17275:12;17268:41;17335:2;17330:3;17326:12;17319:19;;17109:235;;;:::o;17350:376::-;;17513:67;17577:2;17572:3;17513:67;:::i;:::-;17506:74;;17610:34;17606:1;17601:3;17597:11;17590:55;17676:14;17671:2;17666:3;17662:12;17655:36;17717:2;17712:3;17708:12;17701:19;;17496:230;;;:::o;17732:335::-;;17913:84;17995:1;17990:3;17913:84;:::i;:::-;17906:91;;18027:5;18023:1;18018:3;18014:11;18007:26;18059:1;18054:3;18050:11;18043:18;;17896:171;;;:::o;18073:350::-;;18254:85;18336:2;18331:3;18254:85;:::i;:::-;18247:92;;18369:18;18365:1;18360:3;18356:11;18349:39;18414:2;18409:3;18405:12;18398:19;;18237:186;;;:::o;18429:344::-;;18610:85;18692:2;18687:3;18610:85;:::i;:::-;18603:92;;18725:12;18721:1;18716:3;18712:11;18705:33;18764:2;18759:3;18755:12;18748:19;;18593:180;;;:::o;18779:329::-;;18942:67;19006:2;19001:3;18942:67;:::i;:::-;18935:74;;19039:33;19035:1;19030:3;19026:11;19019:54;19099:2;19094:3;19090:12;19083:19;;18925:183;;;:::o;19114:335::-;;19295:84;19377:1;19372:3;19295:84;:::i;:::-;19288:91;;19409:5;19405:1;19400:3;19396:11;19389:26;19441:1;19436:3;19432:11;19425:18;;19278:171;;;:::o;19455:118::-;19542:24;19560:5;19542:24;:::i;:::-;19537:3;19530:37;19520:53;;:::o;19579:1573::-;;20158:90;20244:3;20235:6;20158:90;:::i;:::-;20151:97;;20265:148;20409:3;20265:148;:::i;:::-;20258:155;;20430:95;20521:3;20512:6;20430:95;:::i;:::-;20423:102;;20542:90;20628:3;20619:6;20542:90;:::i;:::-;20535:97;;20649:95;20740:3;20731:6;20649:95;:::i;:::-;20642:102;;20761:148;20905:3;20761:148;:::i;:::-;20754:155;;20926:93;21015:3;21006:6;20926:93;:::i;:::-;20919:100;;21036:90;21122:3;21113:6;21036:90;:::i;:::-;21029:97;;21143:3;21136:10;;20140:1012;;;;;;;;;:::o;21158:1659::-;;21812:148;21956:3;21812:148;:::i;:::-;21805:155;;21977:95;22068:3;22059:6;21977:95;:::i;:::-;21970:102;;22089:148;22233:3;22089:148;:::i;:::-;22082:155;;22254:95;22345:3;22336:6;22254:95;:::i;:::-;22247:102;;22366:148;22510:3;22366:148;:::i;:::-;22359:155;;22531:95;22622:3;22613:6;22531:95;:::i;:::-;22524:102;;22643:148;22787:3;22643:148;:::i;:::-;22636:155;;22808:3;22801:10;;21794:1023;;;;;;:::o;22823:2085::-;;23626:148;23770:3;23626:148;:::i;:::-;23619:155;;23791:95;23882:3;23873:6;23791:95;:::i;:::-;23784:102;;23903:148;24047:3;23903:148;:::i;:::-;23896:155;;24068:95;24159:3;24150:6;24068:95;:::i;:::-;24061:102;;24180:148;24324:3;24180:148;:::i;:::-;24173:155;;24345:95;24436:3;24427:6;24345:95;:::i;:::-;24338:102;;24457:148;24601:3;24457:148;:::i;:::-;24450:155;;24622:95;24713:3;24704:6;24622:95;:::i;:::-;24615:102;;24734:148;24878:3;24734:148;:::i;:::-;24727:155;;24899:3;24892:10;;23608:1300;;;;;;;:::o;24914:222::-;;25045:2;25034:9;25030:18;25022:26;;25058:71;25126:1;25115:9;25111:17;25102:6;25058:71;:::i;:::-;25012:124;;;;:::o;25142:640::-;;25375:3;25364:9;25360:19;25352:27;;25389:71;25457:1;25446:9;25442:17;25433:6;25389:71;:::i;:::-;25470:72;25538:2;25527:9;25523:18;25514:6;25470:72;:::i;:::-;25552;25620:2;25609:9;25605:18;25596:6;25552:72;:::i;:::-;25671:9;25665:4;25661:20;25656:2;25645:9;25641:18;25634:48;25699:76;25770:4;25761:6;25699:76;:::i;:::-;25691:84;;25342:440;;;;;;;:::o;25788:210::-;;25913:2;25902:9;25898:18;25890:26;;25926:65;25988:1;25977:9;25973:17;25964:6;25926:65;:::i;:::-;25880:118;;;;:::o;26004:313::-;;26155:2;26144:9;26140:18;26132:26;;26204:9;26198:4;26194:20;26190:1;26179:9;26175:17;26168:47;26232:78;26305:4;26296:6;26232:78;:::i;:::-;26224:86;;26122:195;;;;:::o;26323:419::-;;26527:2;26516:9;26512:18;26504:26;;26576:9;26570:4;26566:20;26562:1;26551:9;26547:17;26540:47;26604:131;26730:4;26604:131;:::i;:::-;26596:139;;26494:248;;;:::o;26748:419::-;;26952:2;26941:9;26937:18;26929:26;;27001:9;26995:4;26991:20;26987:1;26976:9;26972:17;26965:47;27029:131;27155:4;27029:131;:::i;:::-;27021:139;;26919:248;;;:::o;27173:419::-;;27377:2;27366:9;27362:18;27354:26;;27426:9;27420:4;27416:20;27412:1;27401:9;27397:17;27390:47;27454:131;27580:4;27454:131;:::i;:::-;27446:139;;27344:248;;;:::o;27598:419::-;;27802:2;27791:9;27787:18;27779:26;;27851:9;27845:4;27841:20;27837:1;27826:9;27822:17;27815:47;27879:131;28005:4;27879:131;:::i;:::-;27871:139;;27769:248;;;:::o;28023:419::-;;28227:2;28216:9;28212:18;28204:26;;28276:9;28270:4;28266:20;28262:1;28251:9;28247:17;28240:47;28304:131;28430:4;28304:131;:::i;:::-;28296:139;;28194:248;;;:::o;28448:419::-;;28652:2;28641:9;28637:18;28629:26;;28701:9;28695:4;28691:20;28687:1;28676:9;28672:17;28665:47;28729:131;28855:4;28729:131;:::i;:::-;28721:139;;28619:248;;;:::o;28873:419::-;;29077:2;29066:9;29062:18;29054:26;;29126:9;29120:4;29116:20;29112:1;29101:9;29097:17;29090:47;29154:131;29280:4;29154:131;:::i;:::-;29146:139;;29044:248;;;:::o;29298:419::-;;29502:2;29491:9;29487:18;29479:26;;29551:9;29545:4;29541:20;29537:1;29526:9;29522:17;29515:47;29579:131;29705:4;29579:131;:::i;:::-;29571:139;;29469:248;;;:::o;29723:419::-;;29927:2;29916:9;29912:18;29904:26;;29976:9;29970:4;29966:20;29962:1;29951:9;29947:17;29940:47;30004:131;30130:4;30004:131;:::i;:::-;29996:139;;29894:248;;;:::o;30148:419::-;;30352:2;30341:9;30337:18;30329:26;;30401:9;30395:4;30391:20;30387:1;30376:9;30372:17;30365:47;30429:131;30555:4;30429:131;:::i;:::-;30421:139;;30319:248;;;:::o;30573:419::-;;30777:2;30766:9;30762:18;30754:26;;30826:9;30820:4;30816:20;30812:1;30801:9;30797:17;30790:47;30854:131;30980:4;30854:131;:::i;:::-;30846:139;;30744:248;;;:::o;30998:419::-;;31202:2;31191:9;31187:18;31179:26;;31251:9;31245:4;31241:20;31237:1;31226:9;31222:17;31215:47;31279:131;31405:4;31279:131;:::i;:::-;31271:139;;31169:248;;;:::o;31423:419::-;;31627:2;31616:9;31612:18;31604:26;;31676:9;31670:4;31666:20;31662:1;31651:9;31647:17;31640:47;31704:131;31830:4;31704:131;:::i;:::-;31696:139;;31594:248;;;:::o;31848:419::-;;32052:2;32041:9;32037:18;32029:26;;32101:9;32095:4;32091:20;32087:1;32076:9;32072:17;32065:47;32129:131;32255:4;32129:131;:::i;:::-;32121:139;;32019:248;;;:::o;32273:419::-;;32477:2;32466:9;32462:18;32454:26;;32526:9;32520:4;32516:20;32512:1;32501:9;32497:17;32490:47;32554:131;32680:4;32554:131;:::i;:::-;32546:139;;32444:248;;;:::o;32698:419::-;;32902:2;32891:9;32887:18;32879:26;;32951:9;32945:4;32941:20;32937:1;32926:9;32922:17;32915:47;32979:131;33105:4;32979:131;:::i;:::-;32971:139;;32869:248;;;:::o;33123:419::-;;33327:2;33316:9;33312:18;33304:26;;33376:9;33370:4;33366:20;33362:1;33351:9;33347:17;33340:47;33404:131;33530:4;33404:131;:::i;:::-;33396:139;;33294:248;;;:::o;33548:419::-;;33752:2;33741:9;33737:18;33729:26;;33801:9;33795:4;33791:20;33787:1;33776:9;33772:17;33765:47;33829:131;33955:4;33829:131;:::i;:::-;33821:139;;33719:248;;;:::o;33973:419::-;;34177:2;34166:9;34162:18;34154:26;;34226:9;34220:4;34216:20;34212:1;34201:9;34197:17;34190:47;34254:131;34380:4;34254:131;:::i;:::-;34246:139;;34144:248;;;:::o;34398:222::-;;34529:2;34518:9;34514:18;34506:26;;34542:71;34610:1;34599:9;34595:17;34586:6;34542:71;:::i;:::-;34496:124;;;;:::o;34626:283::-;;34692:2;34686:9;34676:19;;34734:4;34726:6;34722:17;34841:6;34829:10;34826:22;34805:18;34793:10;34790:34;34787:62;34784:2;;;34852:18;;:::i;:::-;34784:2;34892:10;34888:2;34881:22;34666:243;;;;:::o;34915:331::-;;35066:18;35058:6;35055:30;35052:2;;;35088:18;;:::i;:::-;35052:2;35173:4;35169:9;35162:4;35154:6;35150:17;35146:33;35138:41;;35234:4;35228;35224:15;35216:23;;34981:265;;;:::o;35252:140::-;;35323:3;35315:11;;35346:3;35343:1;35336:14;35380:4;35377:1;35367:18;35359:26;;35305:87;;;:::o;35398:98::-;;35483:5;35477:12;35467:22;;35456:40;;;:::o;35502:99::-;;35588:5;35582:12;35572:22;;35561:40;;;:::o;35607:168::-;;35724:6;35719:3;35712:19;35764:4;35759:3;35755:14;35740:29;;35702:73;;;;:::o;35781:147::-;;35919:3;35904:18;;35894:34;;;;:::o;35934:169::-;;36052:6;36047:3;36040:19;36092:4;36087:3;36083:14;36068:29;;36030:73;;;;:::o;36109:148::-;;36248:3;36233:18;;36223:34;;;;:::o;36263:525::-;;36321:19;36338:1;36321:19;:::i;:::-;36316:24;;36354:19;36371:1;36354:19;:::i;:::-;36349:24;;36542:1;36474:66;36470:74;36467:1;36463:82;36458:1;36455;36451:9;36444:17;36440:106;36437:2;;;36549:18;;:::i;:::-;36437:2;36729:1;36661:66;36657:74;36654:1;36650:82;36646:1;36643;36639:9;36635:98;36632:2;;;36736:18;;:::i;:::-;36632:2;36780:1;36777;36773:9;36766:16;;36306:482;;;;:::o;36794:305::-;;36853:20;36871:1;36853:20;:::i;:::-;36848:25;;36887:20;36905:1;36887:20;:::i;:::-;36882:25;;37041:1;36973:66;36969:74;36966:1;36963:81;36960:2;;;37047:18;;:::i;:::-;36960:2;37091:1;37088;37084:9;37077:16;;36838:261;;;;:::o;37105:185::-;;37162:20;37180:1;37162:20;:::i;:::-;37157:25;;37196:20;37214:1;37196:20;:::i;:::-;37191:25;;37235:1;37225:2;;37240:18;;:::i;:::-;37225:2;37282:1;37279;37275:9;37270:14;;37147:143;;;;:::o;37296:848::-;;;37388:6;37379:15;;37412:5;37403:14;;37426:712;37447:1;37437:8;37434:15;37426:712;;;37542:4;37537:3;37533:14;37527:4;37524:24;37521:2;;;37551:18;;:::i;:::-;37521:2;37601:1;37591:8;37587:16;37584:2;;;38016:4;38009:5;38005:16;37996:25;;37584:2;38066:4;38060;38056:15;38048:23;;38096:32;38119:8;38096:32;:::i;:::-;38084:44;;37426:712;;;37369:775;;;;;;;:::o;38150:285::-;;38234:23;38252:4;38234:23;:::i;:::-;38226:31;;38278:27;38296:8;38278:27;:::i;:::-;38266:39;;38324:104;38361:66;38351:8;38345:4;38324:104;:::i;:::-;38315:113;;38216:219;;;;:::o;38441:1073::-;;38686:8;38676:2;;38707:1;38698:10;;38709:5;;38676:2;38735:4;38725:2;;38752:1;38743:10;;38754:5;;38725:2;38821:4;38869:1;38864:27;;;;38905:1;38900:191;;;;38814:277;;38864:27;38882:1;38873:10;;38884:5;;;38900:191;38945:3;38935:8;38932:17;38929:2;;;38952:18;;:::i;:::-;38929:2;39001:8;38998:1;38994:16;38985:25;;39036:3;39029:5;39026:14;39023:2;;;39043:18;;:::i;:::-;39023:2;39076:5;;;38814:277;;39200:2;39190:8;39187:16;39181:3;39175:4;39172:13;39168:36;39150:2;39140:8;39137:16;39132:2;39126:4;39123:12;39119:35;39103:111;39100:2;;;39256:8;39250:4;39246:19;39237:28;;39291:3;39284:5;39281:14;39278:2;;;39298:18;;:::i;:::-;39278:2;39331:5;;39100:2;39371:42;39409:3;39399:8;39393:4;39390:1;39371:42;:::i;:::-;39356:57;;;;39445:4;39440:3;39436:14;39429:5;39426:25;39423:2;;;39454:18;;:::i;:::-;39423:2;39503:4;39496:5;39492:16;39483:25;;38501:1013;;;;;;:::o;39520:348::-;;39583:20;39601:1;39583:20;:::i;:::-;39578:25;;39617:20;39635:1;39617:20;:::i;:::-;39612:25;;39805:1;39737:66;39733:74;39730:1;39727:81;39722:1;39715:9;39708:17;39704:105;39701:2;;;39812:18;;:::i;:::-;39701:2;39860:1;39857;39853:9;39842:20;;39568:300;;;;:::o;39874:191::-;;39934:20;39952:1;39934:20;:::i;:::-;39929:25;;39968:20;39986:1;39968:20;:::i;:::-;39963:25;;40007:1;40004;40001:8;39998:2;;;40012:18;;:::i;:::-;39998:2;40057:1;40054;40050:9;40042:17;;39919:146;;;;:::o;40071:96::-;;40137:24;40155:5;40137:24;:::i;:::-;40126:35;;40116:51;;;:::o;40173:90::-;;40250:5;40243:13;40236:21;40225:32;;40215:48;;;:::o;40269:149::-;;40345:66;40338:5;40334:78;40323:89;;40313:105;;;:::o;40424:76::-;;40489:5;40478:16;;40468:32;;;:::o;40506:126::-;;40583:42;40576:5;40572:54;40561:65;;40551:81;;;:::o;40638:77::-;;40704:5;40693:16;;40683:32;;;:::o;40721:154::-;40805:6;40800:3;40795;40782:30;40867:1;40858:6;40853:3;40849:16;40842:27;40772:103;;;:::o;40881:307::-;40949:1;40959:113;40973:6;40970:1;40967:13;40959:113;;;41058:1;41053:3;41049:11;41043:18;41039:1;41034:3;41030:11;41023:39;40995:2;40992:1;40988:10;40983:15;;40959:113;;;41090:6;41087:1;41084:13;41081:2;;;41170:1;41161:6;41156:3;41152:16;41145:27;41081:2;40930:258;;;;:::o;41194:320::-;;41275:1;41269:4;41265:12;41255:22;;41322:1;41316:4;41312:12;41343:18;41333:2;;41399:4;41391:6;41387:17;41377:27;;41333:2;41461;41453:6;41450:14;41430:18;41427:38;41424:2;;;41480:18;;:::i;:::-;41424:2;41245:269;;;;:::o;41520:233::-;;41582:24;41600:5;41582:24;:::i;:::-;41573:33;;41628:66;41621:5;41618:77;41615:2;;;41698:18;;:::i;:::-;41615:2;41745:1;41738:5;41734:13;41727:20;;41563:190;;;:::o;41759:176::-;;41808:20;41826:1;41808:20;:::i;:::-;41803:25;;41842:20;41860:1;41842:20;:::i;:::-;41837:25;;41881:1;41871:2;;41886:18;;:::i;:::-;41871:2;41927:1;41924;41920:9;41915:14;;41793:142;;;;:::o;41941:180::-;41989:77;41986:1;41979:88;42086:4;42083:1;42076:15;42110:4;42107:1;42100:15;42127:180;42175:77;42172:1;42165:88;42272:4;42269:1;42262:15;42296:4;42293:1;42286:15;42313:180;42361:77;42358:1;42351:88;42458:4;42455:1;42448:15;42482:4;42479:1;42472:15;42499:180;42547:77;42544:1;42537:88;42644:4;42641:1;42634:15;42668:4;42665:1;42658:15;42685:102;;42777:2;42773:7;42768:2;42761:5;42757:14;42753:28;42743:38;;42733:54;;;:::o;42793:102::-;;42882:5;42879:1;42875:13;42854:34;;42844:51;;;:::o;42901:122::-;42974:24;42992:5;42974:24;:::i;:::-;42967:5;42964:35;42954:2;;43013:1;43010;43003:12;42954:2;42944:79;:::o;43029:116::-;43099:21;43114:5;43099:21;:::i;:::-;43092:5;43089:32;43079:2;;43135:1;43132;43125:12;43079:2;43069:76;:::o;43151:120::-;43223:23;43240:5;43223:23;:::i;:::-;43216:5;43213:34;43203:2;;43261:1;43258;43251:12;43203:2;43193:78;:::o;43277:122::-;43350:24;43368:5;43350:24;:::i;:::-;43343:5;43340:35;43330:2;;43389:1;43386;43379:12;43330:2;43320:79;:::o

Swarm Source

ipfs://7b59fef3b6c4424000f682120dadacdec2ad331c255e55df88ac0965cd0783e5
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.