Token Troves

Gaming 
 

Overview [ERC-721]

Max Total Supply:
10,000 TROVES

Holders:
336

Transfers:
-

 
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

OVERVIEW

10000 Fully On-Chain & Unique Treasure Troves on Base. Built on the ERC 404 Standard.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Troves

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 5 of 5: Troves.sol
//SPDX-License-Identifier: MIT

/*

$$$$$$$$\ $$$$$$$\   $$$$$$\  $$\    $$\ $$$$$$$$\  $$$$$$\   $$$$$$$$\ $$$$$$$$\  $$$$$$\  $$\   $$\ 
\__$$  __|$$  __$$\ $$  __$$\ $$ |   $$ |$$  _____|$$  __$$\  \__$$  __|$$  _____|$$  __$$\ $$ |  $$ |
   $$ |   $$ |  $$ |$$ /  $$ |$$ |   $$ |$$ |      $$ /  \__|    $$ |   $$ |      $$ /  \__|$$ |  $$ |
   $$ |   $$$$$$$  |$$ |  $$ |\$$\  $$  |$$$$$\    \$$$$$$\      $$ |   $$$$$\    $$ |      $$$$$$$$ |
   $$ |   $$  __$$< $$ |  $$ | \$$\$$  / $$  __|    \____$$\     $$ |   $$  __|   $$ |      $$  __$$ |
   $$ |   $$ |  $$ |$$ |  $$ |  \$$$  /  $$ |      $$\   $$ |    $$ |   $$ |      $$ |  $$\ $$ |  $$ |
   $$ |   $$ |  $$ | $$$$$$  |   \$  /   $$$$$$$$\ \$$$$$$  |$$\ $$ |   $$$$$$$$\ \$$$$$$  |$$ |  $$ |
   \__|   \__|  \__| \______/     \_/    \________| \______/ \__|\__|   \________| \______/ \__|  \__|

   Join the adventure: https://troves.tech
*/
pragma solidity ^0.8.0;

import "./ERC404.sol";
import "./Strings.sol";

contract Troves is ERC404 {
    string public dataURI;
    string public baseTokenURI;

    string[] private weapons = [
    "Stormbreaker",
    "Shadowstrike",
    "Frostfang",
    "Doomblade",
    "Blazefury",
    "Mooncleaver",
    "Wraithblade",
    "Soulreaper",
    "Bloodthorn",
    "Whisperwind",
    "Deathbringer",
    "Starfall",
    "Dawnbreaker",
    "Nightfall",
    "Thunderbolt",
    "Voidcaller",
    "Sunfire",
    "Doomhammer"
    ];

    string[] private chestArmor = [
    "Celestial Plate",
    "Dragonhide Vest",
    "Phoenix Feather Robe",
    "Titanium Mail",
    "Spectral Hauberk",
    "Obsidian Chestguard",
    "Elven Chainmail",
    "Demonic Harness",
    "Aetherium Cuirass",
    "Shadowweave Cloak",
    "Arcane Vestments",
    "Mithril Scale Mail",
    "Runed Breastplate",
    "Crystal Mail",
    "Voidforged Chestpiece",
    "Adamantine Plate"
    ];

    string[] private headArmor = [
    "Ethereal Crown",
    "Dragonbone Helm",
    "Phoenix Feather Circlet",
    "Elven Leaf Tiara",
    "Sorcerer's Hood",
    "Demonlord Helm",
    "Celestial Diadem",
    "Shadow Veil",
    "Arcane Hood",
    "Mystic Skullcap",
    "Runed Warhelm",
    "Titanium Horned Helm",
    "Infernal Mask",
    "Fey Antler Crown",
    "Crystal Helm",
    "Voidforged Headpiece"
    ];

    string[] private waistArmor = [
    "Ethereal Girdle",
    "Dragonhide Belt",
    "Phoenix Feather Sash",
    "Elven Leaf Belt",
    "Sorcerer's Chain",
    "Demonlord Sash",
    "Celestial Waistguard",
    "Shadowweave Belt",
    "Arcane Girdle",
    "Mystic Waistwrap",
    "Runed Warbelt",
    "Titanium Scale Belt",
    "Infernal Clasp",
    "Fey Silk Sash",
    "Crystal Waistband",
    "Voidforged Girdle"
    ];

    string[] private footArmor = [
    "Boots",
    "Chain Boots",
    "Leather Boots",
    "Steel Greaves",
    "Iron Boots",
    "War Boots",
    "Plated Sabatons",
    "Studded Leather Boots",
    "Reinforced Boots",
    "Heavy Boots",
    "Fur-lined Boots",
    "Cloth Shoes",
    "Sorcerer's Slippers",
    "Elven Sandals",
    "Runed Shoes",
    "Treaded Boots"
    ];

    string[] private handArmor = [
    "Gauntlets",
    "Chain Gloves",
    "Leather Gloves",
    "Steel Gauntlets",
    "Iron Gloves",
    "War Gloves",
    "Plated Gauntlets",
    "Studded Leather Gloves",
    "Reinforced Gloves",
    "Heavy Gloves",
    "Fur-lined Gloves",
    "Cloth Gloves",
    "Sorcerer's Gloves",
    "Elven Gloves",
    "Runed Gloves",
    "Tactical Gloves"
    ];

    string[] private suffixes = [
    "of Power",
    "of the Colossus",
    "of the Ancients",
    "of Arcane Might",
    "of Eternal Glory",
    "of Radiant Wisdom",
    "of Celestial Light",
    "of Divine Protection",
    "of Vengeance",
    "of Wrath",
    "of the Storm",
    "of Shadowbane",
    "of the Cunning Fox",
    "of Mystic Perception",
    "of Arcane Reflection",
    "of the Enchanted Twins"
    ];

    string[] private namePrefixes = [
    "Aether", "Arcane", "Celestial", "Chaos", "Crystal", "Dawn", "Dusk", "Eclipse", "Ethereal", "Frost", 
    "Gilded", "Golden", "Infernal", "Lunar", "Mystic", "Nether", "Nightmare", "Radiant", "Shadow", "Silent", 
    "Silver", "Solar", "Spectral", "Twilight", "Void", "Whispering", "Wraith", "Wyrm", "Zephyr", "Fiery", 
    "Ivory", "Verdant", "Baleful", "Crimson", "Umbral", "Sapphire", "Amber", "Obsidian", "Divine", "Titanic", 
    "Astral", "Moonlit", "Stellar", "Runic", "Ebon", "Azure", "Vivid", "Shimmering"
    ];

    string[] private necklaces = [
    "Ethereal Talisman",
    "Dragonheart Pendant",
    "Celestial Chain",
    "Shadowbane Amulet",
    "Phoenix Feather Necklace",
    "Elven Enchantment",
    "Sorcerer's Sigil",
    "Moonlit Medallion",
    "Abyssal Choker",
    "Sylvan Serpent Necklace",
    "Frostfire Circlet",
    "Crystal Dreamcatcher"
    ];

    string[] private rings = [
    "Ring of the Eternal Flame",
    "Ring of the Silver Moon",
    "Ring of the Ironwood",
    "Ring of the Celestial Guardian",
    "Ring of the Dragon's Eye",
    "Ring of the Shadow Walker",
    "Ring of the Frozen Heart",
    "Ring of the Crystal Lotus",
    "Ring of the Arcane Whisper",
    "Ring of the Enchanted Forest",
    "Ring of the Phoenix Feather",
    "Ring of the Abyssal Depths"
    ];

    string[] private nameSuffixes = [
      "Eternal",
    "Mystical",
    "Celestial",
    "Arcane",
    "Shadowed",
    "Abyssal",
    "Enchanted",
    "Dragonborn",
    "Fey",
    "Divine",
    "Infernal",
    "Radiant",
    "Cursed",
    "Ethereal",
    "Ancient",
    "Frostbitten",
    "Forgotten",
    "Draconic",
    "Whispering",
    "Spectral",
    "Fiery",
    "Sylvan",
    "Thundering",
    "Doomed",
    "Arcane",
    "Moonlit",
    "Crimson",
    "Windswept",
    "Vorpal",
    "Blighted",
    "Frostbound",
    "Shadowy"
    ];
    
    function random(string memory input) internal pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked(input)));
    }
    
    function getWeapon(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "WEAPON", weapons);
    }
    
    function getChest(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "CHEST", chestArmor);
    }
    
    function getHead(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "HEAD", headArmor);
    }
    
    function getWaist(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "WAIST", waistArmor);
    }

    function getFoot(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "FOOT", footArmor);
    }
    
    function getHand(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "HAND", handArmor);
    }
    
    function getNeck(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "NECK", necklaces);
    }
    
    function getRing(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "RING", rings);
    }

    function pluck(uint256 tokenId, string memory keyPrefix, string[] memory sourceArray) internal view returns (string memory) {
        uint256 rand = random(string(abi.encodePacked(keyPrefix, toString(tokenId))));
        string memory output = sourceArray[rand % sourceArray.length];
        uint256 greatness = rand % 21;
        if (greatness > 14) {
            output = string(abi.encodePacked(output, " ", suffixes[rand % suffixes.length]));
        }
        if (greatness >= 19) {
            string[2] memory name;
            name[0] = namePrefixes[rand % namePrefixes.length];
            name[1] = nameSuffixes[rand % nameSuffixes.length];
            if (greatness == 19) {
                output = string(abi.encodePacked('"', name[0], ' ', name[1], '" ', output));
            } else {
                output = string(abi.encodePacked('"', name[0], ' ', name[1], '" ', output, " +1"));
            }
        }
        return output;
    }

    function tokenURI(uint256 tokenId) override public view returns (string memory) {
        string[17] memory parts;
        parts[0] = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350"><style>@import url("https://fonts.googleapis.com/css2?family=Bellefair");.base { fill: #f5f5f5; font-family: "Bellefair", serif; font-size: 16px; } .footer {font-size: 32px;}</style><rect width="100%" height="100%" fill="black" /><text x="50%" y="95%" dominant-baseline="middle" text-anchor="middle" class="base footer">TROVES.TECH</text><text x="10" y="20" class="base">';

        parts[1] = getWeapon(tokenId);

        parts[2] = '</text><text x="10" y="40" class="base">';

        parts[3] = getChest(tokenId);

        parts[4] = '</text><text x="10" y="60" class="base">';

        parts[5] = getHead(tokenId);

        parts[6] = '</text><text x="10" y="80" class="base">';

        parts[7] = getWaist(tokenId);

        parts[8] = '</text><text x="10" y="100" class="base">';

        parts[9] = getFoot(tokenId);

        parts[10] = '</text><text x="10" y="120" class="base">';

        parts[11] = getHand(tokenId);

        parts[12] = '</text><text x="10" y="140" class="base">';

        parts[13] = getNeck(tokenId);

        parts[14] = '</text><text x="10" y="160" class="base">';

        parts[15] = getRing(tokenId);

        parts[16] = '</text></svg>';

        string memory output = string(abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7], parts[8]));
        output = string(abi.encodePacked(output, parts[9], parts[10], parts[11], parts[12], parts[13], parts[14], parts[15], parts[16]));
        
        string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "Troves #', toString(tokenId), '", "description": "Unlock the mysteries of Troves, built on the ERC 404 standard, and embark on a journey through an ever-expanding metaverse of on-chain treasures and boundless discovery.", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(output)), '"}'))));
        output = string(abi.encodePacked('data:application/json;base64,', json));

        return output;
    }

    constructor(
    ) ERC404("Troves", "TROVES", 18, 10000, msg.sender) {
        balanceOf[msg.sender] = 10000 * 10 ** 18;
    }

    function setNameSymbol(
        string memory _name,
        string memory _symbol
    ) public onlyOwner {
        _setNameSymbol(_name, _symbol);
    }

    function toString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }
}

library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

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

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

File 1 of 5: ERC404.sol
//SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

abstract contract Ownable {
    event OwnershipTransferred(address indexed user, address indexed newOwner);

    error Unauthorized();
    error InvalidOwner();

    address public owner;

    modifier onlyOwner() virtual {
        if (msg.sender != owner) revert Unauthorized();

        _;
    }

    constructor(address _owner) {
        if (_owner == address(0)) revert InvalidOwner();

        owner = _owner;

        emit OwnershipTransferred(address(0), _owner);
    }

    function transferOwnership(address _owner) public virtual onlyOwner {
        if (_owner == address(0)) revert InvalidOwner();

        owner = _owner;

        emit OwnershipTransferred(msg.sender, _owner);
    }

    function revokeOwnership() public virtual onlyOwner {
        owner = address(0);

        emit OwnershipTransferred(msg.sender, address(0));
    }
}

abstract contract ERC721Receiver {
    function onERC721Received(
        address,
        address,
        uint256,
        bytes calldata
    ) external virtual returns (bytes4) {
        return ERC721Receiver.onERC721Received.selector;
    }
}

/// @notice ERC404
///         A gas-efficient, mixed ERC20 / ERC721 implementation
///         with native liquidity and fractionalization.
///
///         This is an experimental standard designed to integrate
///         with pre-existing ERC20 / ERC721 support as smoothly as
///         possible.
///
/// @dev    In order to support full functionality of ERC20 and ERC721
///         supply assumptions are made that slightly constraint usage.
///         Ensure decimals are sufficiently large (standard 18 recommended)
///         as ids are effectively encoded in the lowest range of amounts.
///
///         NFTs are spent on ERC20 functions in a FILO queue, this is by
///         design.
///
abstract contract ERC404 is Ownable {
    // Events
    event ERC20Transfer(
        address indexed from,
        address indexed to,
        uint256 amount
    );
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 amount
    );
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed id
    );
    event ERC721Approval(
        address indexed owner,
        address indexed spender,
        uint256 indexed id
    );
    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );

    // Errors
    error NotFound();
    error AlreadyExists();
    error InvalidRecipient();
    error InvalidSender();
    error UnsafeRecipient();

    // Metadata
    /// @dev Token name
    string public name;

    /// @dev Token symbol
    string public symbol;

    /// @dev Decimals for fractional representation
    uint8 public immutable decimals;

    /// @dev Total supply in fractionalized representation
    uint256 public immutable totalSupply;

    /// @dev Current mint counter, monotonically increasing to ensure accurate ownership
    uint256 public minted;

    // Mappings
    /// @dev Balance of user in fractional representation
    mapping(address => uint256) public balanceOf;

    /// @dev Allowance of user in fractional representation
    mapping(address => mapping(address => uint256)) public allowance;

    /// @dev Approval in native representaion
    mapping(uint256 => address) public getApproved;

    /// @dev Approval for all in native representation
    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /// @dev Owner of id in native representation
    mapping(uint256 => address) internal _ownerOf;

    /// @dev Array of owned ids in native representation
    mapping(address => uint256[]) internal _owned;

    /// @dev Tracks indices for the _owned mapping
    mapping(uint256 => uint256) internal _ownedIndex;

    /// @dev Addresses whitelisted from minting / burning for gas savings (pairs, routers, etc)
    mapping(address => bool) public whitelist;

    // Constructor
    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals,
        uint256 _totalNativeSupply,
        address _owner
    ) Ownable(_owner) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;
        totalSupply = _totalNativeSupply * (10 ** decimals);
    }

    /// @notice Initialization function to set pairs / etc
    ///         saving gas by avoiding mint / burn on unnecessary targets
    function setWhitelist(address target, bool state) public onlyOwner {
        whitelist[target] = state;
    }

    /// @notice Function to find owner of a given native token
    function ownerOf(uint256 id) public view virtual returns (address owner) {
        owner = _ownerOf[id];

        if (owner == address(0)) {
            revert NotFound();
        }
    }

    /// @notice tokenURI must be implemented by child contract
    function tokenURI(uint256 id) public view virtual returns (string memory);

    /// @notice Function for token approvals
    /// @dev This function assumes id / native if amount less than or equal to current max id
    function approve(
        address spender,
        uint256 amountOrId
    ) public virtual returns (bool) {
        if (amountOrId <= minted && amountOrId > 0) {
            address owner = _ownerOf[amountOrId];

            if (msg.sender != owner && !isApprovedForAll[owner][msg.sender]) {
                revert Unauthorized();
            }

            getApproved[amountOrId] = spender;

            emit Approval(owner, spender, amountOrId);
        } else {
            allowance[msg.sender][spender] = amountOrId;

            emit Approval(msg.sender, spender, amountOrId);
        }

        return true;
    }

    /// @notice Function native approvals
    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

        emit ApprovalForAll(msg.sender, operator, approved);
    }

    /// @notice Function for mixed transfers
    /// @dev This function assumes id / native if amount less than or equal to current max id
    function transferFrom(
        address from,
        address to,
        uint256 amountOrId
    ) public virtual {
        if (amountOrId <= minted) {
            if (from != _ownerOf[amountOrId]) {
                revert InvalidSender();
            }

            if (to == address(0)) {
                revert InvalidRecipient();
            }

            if (
                msg.sender != from &&
                !isApprovedForAll[from][msg.sender] &&
                msg.sender != getApproved[amountOrId]
            ) {
                revert Unauthorized();
            }

            balanceOf[from] -= _getUnit();

            unchecked {
                balanceOf[to] += _getUnit();
            }

            _ownerOf[amountOrId] = to;
            delete getApproved[amountOrId];

            // update _owned for sender
            uint256 updatedId = _owned[from][_owned[from].length - 1];
            _owned[from][_ownedIndex[amountOrId]] = updatedId;
            // pop
            _owned[from].pop();
            // update index for the moved id
            _ownedIndex[updatedId] = _ownedIndex[amountOrId];
            // push token to to owned
            _owned[to].push(amountOrId);
            // update index for to owned
            _ownedIndex[amountOrId] = _owned[to].length - 1;

            emit Transfer(from, to, amountOrId);
            emit ERC20Transfer(from, to, _getUnit());
        } else {
            uint256 allowed = allowance[from][msg.sender];

            if (allowed != type(uint256).max)
                allowance[from][msg.sender] = allowed - amountOrId;

            _transfer(from, to, amountOrId);
        }
    }

    /// @notice Function for fractional transfers
    function transfer(
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        return _transfer(msg.sender, to, amount);
    }

    /// @notice Function for native transfers with contract support
    function safeTransferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        transferFrom(from, to, id);

        if (
            to.code.length != 0 &&
            ERC721Receiver(to).onERC721Received(msg.sender, from, id, "") !=
            ERC721Receiver.onERC721Received.selector
        ) {
            revert UnsafeRecipient();
        }
    }

    /// @notice Function for native transfers with contract support and callback data
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes calldata data
    ) public virtual {
        transferFrom(from, to, id);

        if (
            to.code.length != 0 &&
            ERC721Receiver(to).onERC721Received(msg.sender, from, id, data) !=
            ERC721Receiver.onERC721Received.selector
        ) {
            revert UnsafeRecipient();
        }
    }

    /// @notice Internal function for fractional transfers
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal returns (bool) {
        uint256 unit = _getUnit();
        uint256 balanceBeforeSender = balanceOf[from];
        uint256 balanceBeforeReceiver = balanceOf[to];

        balanceOf[from] -= amount;

        unchecked {
            balanceOf[to] += amount;
        }

        // Skip burn for certain addresses to save gas
        if (!whitelist[from]) {
            uint256 tokens_to_burn = (balanceBeforeSender / unit) -
                (balanceOf[from] / unit);
            for (uint256 i = 0; i < tokens_to_burn; i++) {
                _burn(from);
            }
        }

        // Skip minting for certain addresses to save gas
        if (!whitelist[to]) {
            uint256 tokens_to_mint = (balanceOf[to] / unit) -
                (balanceBeforeReceiver / unit);
            for (uint256 i = 0; i < tokens_to_mint; i++) {
                _mint(to);
            }
        }

        emit ERC20Transfer(from, to, amount);
        return true;
    }

    // Internal utility logic
    function _getUnit() internal view returns (uint256) {
        return 10 ** decimals;
    }

    function _mint(address to) internal virtual {
        if (to == address(0)) {
            revert InvalidRecipient();
        }

        unchecked {
            minted++;
        }

        uint256 id = minted;

        if (_ownerOf[id] != address(0)) {
            revert AlreadyExists();
        }

        _ownerOf[id] = to;
        _owned[to].push(id);
        _ownedIndex[id] = _owned[to].length - 1;

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

    function _burn(address from) internal virtual {
        if (from == address(0)) {
            revert InvalidSender();
        }

        uint256 id = _owned[from][_owned[from].length - 1];
        _owned[from].pop();
        delete _ownedIndex[id];
        delete _ownerOf[id];
        delete getApproved[id];

        emit Transfer(from, address(0), id);
    }

    function _setNameSymbol(
        string memory _name,
        string memory _symbol
    ) internal {
        name = _name;
        symbol = _symbol;
    }
}

File 2 of 5: Math.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol)

pragma solidity ^0.8.20;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Muldiv operation overflow.
     */
    error MathOverflowedMulDiv();

    enum Rounding {
        Floor, // Toward negative infinity
        Ceil, // Toward positive infinity
        Trunc, // Toward zero
        Expand // Away from zero
    }

    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds towards infinity instead
     * of rounding towards zero.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        if (b == 0) {
            // Guarantee the same behavior as in a regular Solidity division.
            return a / b;
        }

        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or
     * denominator == 0.
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by
     * Uniswap Labs also under MIT license.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0 = x * y; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            if (denominator <= prod1) {
                revert MathOverflowedMulDiv();
            }

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator.
            // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.

            uint256 twos = denominator & (0 - denominator);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also
            // works in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded
     * towards zero.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2 of a positive value rounded towards zero.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10 of a positive value rounded towards zero.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10 ** 64) {
                value /= 10 ** 64;
                result += 64;
            }
            if (value >= 10 ** 32) {
                value /= 10 ** 32;
                result += 32;
            }
            if (value >= 10 ** 16) {
                value /= 10 ** 16;
                result += 16;
            }
            if (value >= 10 ** 8) {
                value /= 10 ** 8;
                result += 8;
            }
            if (value >= 10 ** 4) {
                value /= 10 ** 4;
                result += 4;
            }
            if (value >= 10 ** 2) {
                value /= 10 ** 2;
                result += 2;
            }
            if (value >= 10 ** 1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256 of a positive value rounded towards zero.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0);
        }
    }

    /**
     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.
     */
    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {
        return uint8(rounding) % 2 == 1;
    }
}

File 3 of 5: SignedMath.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol)

pragma solidity ^0.8.20;

/**
 * @dev Standard signed math utilities missing in the Solidity language.
 */
library SignedMath {
    /**
     * @dev Returns the largest of two signed numbers.
     */
    function max(int256 a, int256 b) internal pure returns (int256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two signed numbers.
     */
    function min(int256 a, int256 b) internal pure returns (int256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two signed numbers without overflow.
     * The result is rounded towards zero.
     */
    function average(int256 a, int256 b) internal pure returns (int256) {
        // Formula from the book "Hacker's Delight"
        int256 x = (a & b) + ((a ^ b) >> 1);
        return x + (int256(uint256(x) >> 255) & (a ^ b));
    }

    /**
     * @dev Returns the absolute unsigned value of a signed value.
     */
    function abs(int256 n) internal pure returns (uint256) {
        unchecked {
            // must be unchecked in order to support `n = type(int256).min`
            return uint256(n >= 0 ? n : -n);
        }
    }
}

File 4 of 5: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol)

pragma solidity ^0.8.20;

import {Math} from "./Math.sol";
import {SignedMath} from "./SignedMath.sol";

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant HEX_DIGITS = "0123456789abcdef";
    uint8 private constant ADDRESS_LENGTH = 20;

    /**
     * @dev The `value` string doesn't fit in the specified `length`.
     */
    error StringsInsufficientHexLength(uint256 value, uint256 length);

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `int256` to its ASCII `string` decimal representation.
     */
    function toStringSigned(int256 value) internal pure returns (string memory) {
        return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value)));
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        uint256 localValue = value;
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = HEX_DIGITS[localValue & 0xf];
            localValue >>= 4;
        }
        if (localValue != 0) {
            revert StringsInsufficientHexLength(value, length);
        }
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal
     * representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);
    }

    /**
     * @dev Returns true if the two strings are equal.
     */
    function equal(string memory a, string memory b) internal pure returns (bool) {
        return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyExists","type":"error"},{"inputs":[],"name":"InvalidOwner","type":"error"},{"inputs":[],"name":"InvalidRecipient","type":"error"},{"inputs":[],"name":"InvalidSender","type":"error"},{"inputs":[],"name":"NotFound","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"UnsafeRecipient","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","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":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ERC721Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amountOrId","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getChest","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFoot","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getHand","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getHead","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getNeck","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getRing","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getWaist","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getWeapon","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revokeOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","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":"id","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":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"setNameSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amountOrId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60c06040526040518061024001604052806040518060400160405280600c81526020017f53746f726d627265616b6572000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f536861646f77737472696b65000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f46726f737466616e67000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f446f6f6d626c616465000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f426c617a6566757279000000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f4d6f6f6e636c656176657200000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f577261697468626c61646500000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f536f756c7265617065720000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f426c6f6f6474686f726e0000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f5768697370657277696e6400000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f44656174686272696e676572000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f5374617266616c6c00000000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f4461776e627265616b657200000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f4e6967687466616c6c000000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f5468756e646572626f6c7400000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f566f696463616c6c65720000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f53756e666972650000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f446f6f6d68616d6d657200000000000000000000000000000000000000000000815250815250600e90601262000446929190620035af565b506040518061020001604052806040518060400160405280600f81526020017f43656c65737469616c20506c617465000000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f447261676f6e686964652056657374000000000000000000000000000000000081525081526020016040518060400160405280601481526020017f50686f656e6978204665617468657220526f626500000000000000000000000081525081526020016040518060400160405280600d81526020017f546974616e69756d204d61696c0000000000000000000000000000000000000081525081526020016040518060400160405280601081526020017f537065637472616c204861756265726b0000000000000000000000000000000081525081526020016040518060400160405280601381526020017f4f6273696469616e20436865737467756172640000000000000000000000000081525081526020016040518060400160405280600f81526020017f456c76656e20436861696e6d61696c000000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f44656d6f6e6963204861726e657373000000000000000000000000000000000081525081526020016040518060400160405280601181526020017f41657468657269756d204375697261737300000000000000000000000000000081525081526020016040518060400160405280601181526020017f536861646f77776561766520436c6f616b00000000000000000000000000000081525081526020016040518060400160405280601081526020017f417263616e6520566573746d656e74730000000000000000000000000000000081525081526020016040518060400160405280601281526020017f4d69746872696c205363616c65204d61696c000000000000000000000000000081525081526020016040518060400160405280601181526020017f52756e656420427265617374706c61746500000000000000000000000000000081525081526020016040518060400160405280600c81526020017f4372797374616c204d61696c000000000000000000000000000000000000000081525081526020016040518060400160405280601581526020017f566f6964666f726765642043686573747069656365000000000000000000000081525081526020016040518060400160405280601081526020017f4164616d616e74696e6520506c61746500000000000000000000000000000000815250815250600f906010620008139291906200360d565b506040518061020001604052806040518060400160405280600e81526020017f457468657265616c2043726f776e00000000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f447261676f6e626f6e652048656c6d000000000000000000000000000000000081525081526020016040518060400160405280601781526020017f50686f656e6978204665617468657220436972636c657400000000000000000081525081526020016040518060400160405280601081526020017f456c76656e204c6561662054696172610000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f536f726365726572277320486f6f64000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f44656d6f6e6c6f72642048656c6d00000000000000000000000000000000000081525081526020016040518060400160405280601081526020017f43656c65737469616c2044696164656d0000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f536861646f77205665696c00000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f417263616e6520486f6f6400000000000000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f4d797374696320536b756c6c636170000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f52756e65642057617268656c6d0000000000000000000000000000000000000081525081526020016040518060400160405280601481526020017f546974616e69756d20486f726e65642048656c6d00000000000000000000000081525081526020016040518060400160405280600d81526020017f496e6665726e616c204d61736b0000000000000000000000000000000000000081525081526020016040518060400160405280601081526020017f46657920416e746c65722043726f776e0000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f4372797374616c2048656c6d000000000000000000000000000000000000000081525081526020016040518060400160405280601481526020017f566f6964666f7267656420486561647069656365000000000000000000000000815250815250601090601062000be09291906200360d565b506040518061020001604052806040518060400160405280600f81526020017f457468657265616c20476972646c65000000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f447261676f6e686964652042656c74000000000000000000000000000000000081525081526020016040518060400160405280601481526020017f50686f656e69782046656174686572205361736800000000000000000000000081525081526020016040518060400160405280600f81526020017f456c76656e204c6561662042656c74000000000000000000000000000000000081525081526020016040518060400160405280601081526020017f536f726365726572277320436861696e0000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f44656d6f6e6c6f7264205361736800000000000000000000000000000000000081525081526020016040518060400160405280601481526020017f43656c65737469616c205761697374677561726400000000000000000000000081525081526020016040518060400160405280601081526020017f536861646f7777656176652042656c740000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f417263616e6520476972646c650000000000000000000000000000000000000081525081526020016040518060400160405280601081526020017f4d7973746963205761697374777261700000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f52756e65642057617262656c740000000000000000000000000000000000000081525081526020016040518060400160405280601381526020017f546974616e69756d205363616c652042656c740000000000000000000000000081525081526020016040518060400160405280600e81526020017f496e6665726e616c20436c61737000000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f4665792053696c6b20536173680000000000000000000000000000000000000081525081526020016040518060400160405280601181526020017f4372797374616c20576169737462616e6400000000000000000000000000000081525081526020016040518060400160405280601181526020017f566f6964666f7267656420476972646c65000000000000000000000000000000815250815250601190601062000fad9291906200360d565b506040518061020001604052806040518060400160405280600581526020017f426f6f747300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f436861696e20426f6f747300000000000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f4c65617468657220426f6f74730000000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f537465656c20477265617665730000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f49726f6e20426f6f74730000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f57617220426f6f7473000000000000000000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f506c617465642053616261746f6e73000000000000000000000000000000000081525081526020016040518060400160405280601581526020017f53747564646564204c65617468657220426f6f7473000000000000000000000081525081526020016040518060400160405280601081526020017f5265696e666f7263656420426f6f74730000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f486561767920426f6f747300000000000000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f4675722d6c696e656420426f6f7473000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f436c6f74682053686f657300000000000000000000000000000000000000000081525081526020016040518060400160405280601381526020017f536f726365726572277320536c6970706572730000000000000000000000000081525081526020016040518060400160405280600d81526020017f456c76656e2053616e64616c730000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f52756e65642053686f657300000000000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f5472656164656420426f6f74730000000000000000000000000000000000000081525081525060129060106200137a9291906200360d565b506040518061020001604052806040518060400160405280600981526020017f4761756e746c657473000000000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f436861696e20476c6f766573000000000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f4c65617468657220476c6f76657300000000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f537465656c204761756e746c657473000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f49726f6e20476c6f76657300000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f57617220476c6f7665730000000000000000000000000000000000000000000081525081526020016040518060400160405280601081526020017f506c61746564204761756e746c6574730000000000000000000000000000000081525081526020016040518060400160405280601681526020017f53747564646564204c65617468657220476c6f7665730000000000000000000081525081526020016040518060400160405280601181526020017f5265696e666f7263656420476c6f76657300000000000000000000000000000081525081526020016040518060400160405280600c81526020017f486561767920476c6f766573000000000000000000000000000000000000000081525081526020016040518060400160405280601081526020017f4675722d6c696e656420476c6f7665730000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f436c6f746820476c6f766573000000000000000000000000000000000000000081525081526020016040518060400160405280601181526020017f536f726365726572277320476c6f76657300000000000000000000000000000081525081526020016040518060400160405280600c81526020017f456c76656e20476c6f766573000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f52756e656420476c6f766573000000000000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f546163746963616c20476c6f76657300000000000000000000000000000000008152508152506013906010620017479291906200360d565b506040518061020001604052806040518060400160405280600881526020017f6f6620506f77657200000000000000000000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f6f662074686520436f6c6f73737573000000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f6f662074686520416e6369656e7473000000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f6f6620417263616e65204d69676874000000000000000000000000000000000081525081526020016040518060400160405280601081526020017f6f6620457465726e616c20476c6f72790000000000000000000000000000000081525081526020016040518060400160405280601181526020017f6f662052616469616e7420576973646f6d00000000000000000000000000000081525081526020016040518060400160405280601281526020017f6f662043656c65737469616c204c69676874000000000000000000000000000081525081526020016040518060400160405280601481526020017f6f6620446976696e652050726f74656374696f6e00000000000000000000000081525081526020016040518060400160405280600c81526020017f6f662056656e6765616e6365000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f6f6620577261746800000000000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f6f66207468652053746f726d000000000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f6f6620536861646f7762616e650000000000000000000000000000000000000081525081526020016040518060400160405280601281526020017f6f66207468652043756e6e696e6720466f78000000000000000000000000000081525081526020016040518060400160405280601481526020017f6f66204d79737469632050657263657074696f6e00000000000000000000000081525081526020016040518060400160405280601481526020017f6f6620417263616e65205265666c656374696f6e00000000000000000000000081525081526020016040518060400160405280601681526020017f6f662074686520456e6368616e746564205477696e7300000000000000000000815250815250601490601062001b149291906200360d565b506040518061060001604052806040518060400160405280600681526020017f416574686572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f417263616e65000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f43656c65737469616c000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4368616f7300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4372797374616c0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4461776e0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4475736b0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f45636c697073650000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f457468657265616c00000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f46726f737400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f47696c646564000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f476f6c64656e000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f496e6665726e616c00000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4c756e617200000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4d7973746963000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4e6574686572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f4e696768746d617265000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f52616469616e740000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f536861646f77000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f53696c656e74000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f53696c766572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f536f6c617200000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f537065637472616c00000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f5477696c6967687400000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f566f69640000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f57686973706572696e670000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f577261697468000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f5779726d0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f5a6570687972000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f466965727900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f49766f727900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f56657264616e740000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f42616c6566756c0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4372696d736f6e0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f556d6272616c000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f536170706869726500000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f416d62657200000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f4f6273696469616e00000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f446976696e65000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f546974616e69630000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f41737472616c000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4d6f6f6e6c69740000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f5374656c6c61720000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f52756e696300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f45626f6e0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f417a75726500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f566976696400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f5368696d6d6572696e67000000000000000000000000000000000000000000008152508152506015906030620026419291906200366b565b506040518061018001604052806040518060400160405280601181526020017f457468657265616c2054616c69736d616e00000000000000000000000000000081525081526020016040518060400160405280601381526020017f447261676f6e68656172742050656e64616e740000000000000000000000000081525081526020016040518060400160405280600f81526020017f43656c65737469616c20436861696e000000000000000000000000000000000081525081526020016040518060400160405280601181526020017f536861646f7762616e6520416d756c657400000000000000000000000000000081525081526020016040518060400160405280601881526020017f50686f656e69782046656174686572204e65636b6c616365000000000000000081525081526020016040518060400160405280601181526020017f456c76656e20456e6368616e746d656e7400000000000000000000000000000081525081526020016040518060400160405280601081526020017f536f726365726572277320536967696c0000000000000000000000000000000081525081526020016040518060400160405280601181526020017f4d6f6f6e6c6974204d6564616c6c696f6e00000000000000000000000000000081525081526020016040518060400160405280600e81526020017f4162797373616c2043686f6b657200000000000000000000000000000000000081525081526020016040518060400160405280601781526020017f53796c76616e2053657270656e74204e65636b6c61636500000000000000000081525081526020016040518060400160405280601181526020017f46726f73746669726520436972636c657400000000000000000000000000000081525081526020016040518060400160405280601481526020017f4372797374616c20447265616d63617463686572000000000000000000000000815250815250601690600c62002922929190620036c9565b506040518061018001604052806040518060400160405280601981526020017f52696e67206f662074686520457465726e616c20466c616d650000000000000081525081526020016040518060400160405280601781526020017f52696e67206f66207468652053696c766572204d6f6f6e00000000000000000081525081526020016040518060400160405280601481526020017f52696e67206f66207468652049726f6e776f6f6400000000000000000000000081525081526020016040518060400160405280601e81526020017f52696e67206f66207468652043656c65737469616c20477561726469616e000081525081526020016040518060400160405280601881526020017f52696e67206f662074686520447261676f6e277320457965000000000000000081525081526020016040518060400160405280601981526020017f52696e67206f662074686520536861646f772057616c6b65720000000000000081525081526020016040518060400160405280601881526020017f52696e67206f66207468652046726f7a656e204865617274000000000000000081525081526020016040518060400160405280601981526020017f52696e67206f6620746865204372797374616c204c6f7475730000000000000081525081526020016040518060400160405280601a81526020017f52696e67206f662074686520417263616e65205768697370657200000000000081525081526020016040518060400160405280601c81526020017f52696e67206f662074686520456e6368616e74656420466f726573740000000081525081526020016040518060400160405280601b81526020017f52696e67206f66207468652050686f656e69782046656174686572000000000081525081526020016040518060400160405280601a81526020017f52696e67206f6620746865204162797373616c20446570746873000000000000815250815250601790600c62002c03929190620036c9565b506040518061040001604052806040518060400160405280600781526020017f457465726e616c0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f4d7973746963616c00000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f43656c65737469616c000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f417263616e65000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f536861646f77656400000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4162797373616c0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f456e6368616e746564000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f447261676f6e626f726e0000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f466579000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f446976696e65000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f496e6665726e616c00000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f52616469616e740000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f437572736564000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f457468657265616c00000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f416e6369656e740000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f46726f737462697474656e00000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f466f72676f7474656e000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f447261636f6e696300000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f57686973706572696e670000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f537065637472616c00000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f466965727900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f53796c76616e000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f5468756e646572696e670000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f446f6f6d6564000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f417263616e65000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4d6f6f6e6c69740000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4372696d736f6e0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f57696e647377657074000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f566f7270616c000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f426c69676874656400000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f46726f7374626f756e640000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f536861646f77790000000000000000000000000000000000000000000000000081525081525060189060206200338092919062003727565b503480156200338d575f80fd5b506040518060400160405280600681526020017f54726f76657300000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f54524f5645530000000000000000000000000000000000000000000000000000815250601261271033805f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362003467576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350846001908162003512919062003a70565b50836002908162003524919062003a70565b508260ff1660808160ff1681525050608051600a62003544919062003cdd565b8262003551919062003d2d565b60a08181525050505050505069021e19e0c9bab240000060045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555062003d77565b828054828255905f5260205f20908101928215620035fa579160200282015b82811115620035f9578251829081620035e8919062003a70565b5091602001919060010190620035ce565b5b50905062003609919062003785565b5090565b828054828255905f5260205f2090810192821562003658579160200282015b828111156200365757825182908162003646919062003a70565b50916020019190600101906200362c565b5b50905062003667919062003785565b5090565b828054828255905f5260205f20908101928215620036b6579160200282015b82811115620036b5578251829081620036a4919062003a70565b50916020019190600101906200368a565b5b509050620036c5919062003785565b5090565b828054828255905f5260205f2090810192821562003714579160200282015b828111156200371357825182908162003702919062003a70565b5091602001919060010190620036e8565b5b50905062003723919062003785565b5090565b828054828255905f5260205f2090810192821562003772579160200282015b828111156200377157825182908162003760919062003a70565b509160200191906001019062003746565b5b50905062003781919062003785565b5090565b5b80821115620037a8575f81816200379e9190620037ac565b5060010162003786565b5090565b508054620037ba9062003870565b5f825580601f10620037cd5750620037ec565b601f0160209004905f5260205f2090810190620037eb9190620037ef565b5b50565b5b8082111562003808575f815f905550600101620037f0565b5090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200388857607f821691505b6020821081036200389e576200389d62003843565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620039027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620038c5565b6200390e8683620038c5565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f62003958620039526200394c8462003926565b6200392f565b62003926565b9050919050565b5f819050919050565b620039738362003938565b6200398b62003982826200395f565b848454620038d1565b825550505050565b5f90565b620039a162003993565b620039ae81848462003968565b505050565b5b81811015620039d557620039c95f8262003997565b600181019050620039b4565b5050565b601f82111562003a2457620039ee81620038a4565b620039f984620038b6565b8101602085101562003a09578190505b62003a2162003a1885620038b6565b830182620039b3565b50505b505050565b5f82821c905092915050565b5f62003a465f198460080262003a29565b1980831691505092915050565b5f62003a60838362003a35565b9150826002028217905092915050565b62003a7b826200380c565b67ffffffffffffffff81111562003a975762003a9662003816565b5b62003aa3825462003870565b62003ab0828285620039d9565b5f60209050601f83116001811462003ae6575f841562003ad1578287015190505b62003add858262003a53565b86555062003b4c565b601f19841662003af686620038a4565b5f5b8281101562003b1f5784890151825560018201915060208501945060208101905062003af8565b8683101562003b3f578489015162003b3b601f89168262003a35565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b600185111562003bde5780860481111562003bb65762003bb562003b54565b5b600185161562003bc65780820291505b808102905062003bd68562003b81565b945062003b96565b94509492505050565b5f8262003bf8576001905062003cca565b8162003c07575f905062003cca565b816001811462003c20576002811462003c2b5762003c61565b600191505062003cca565b60ff84111562003c405762003c3f62003b54565b5b8360020a91508482111562003c5a5762003c5962003b54565b5b5062003cca565b5060208310610133831016604e8410600b841016171562003c9b5782820a90508381111562003c955762003c9462003b54565b5b62003cca565b62003caa848484600162003b8d565b9250905081840481111562003cc45762003cc362003b54565b5b81810290505b9392505050565b5f60ff82169050919050565b5f62003ce98262003926565b915062003cf68362003cd1565b925062003d257fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462003be7565b905092915050565b5f62003d398262003926565b915062003d468362003926565b925082820262003d568162003926565b9150828204841483151762003d705762003d6f62003b54565b5b5092915050565b60805160a0516151ad62003da05f395f610ba501525f81816114df0152612eb001526151ad5ff3fe608060405234801561000f575f80fd5b50600436106101f9575f3560e01c806395d89b4111610118578063c08a5dd5116100ab578063dd62ed3e1161007a578063dd62ed3e14610621578063e985e9c514610651578063ef68075a14610681578063f28ca1dd146106b1578063f2fde38b146106cf576101f9565b8063c08a5dd514610573578063c87b56dd146105a3578063d47f269e146105d3578063d547cfb714610603576101f9565b80639e41b73f116100e75780639e41b73f146104db578063a22cb4651461050b578063a9059cbb14610527578063b88d4fde14610557576101f9565b806395d89b411461042d5780639720c9691461044b5780639b19251a1461047b5780639bdc1b69146104ab576101f9565b806342842e0e116101905780636352211e1161015f5780636352211e1461037f57806367209aa8146103af57806370a08231146103df5780638da5cb5b1461040f576101f9565b806342842e0e1461030d5780634f02c42014610329578063504334c21461034757806353d6fd5914610363576101f9565b806318160ddd116101cc57806318160ddd146102ab57806323b872dd146102c95780632b968958146102e5578063313ce567146102ef576101f9565b806306fdde03146101fd578063081812fc1461021b578063095ea7b31461024b5780630e99990d1461027b575b5f80fd5b6102056106eb565b6040516102129190613b02565b60405180910390f35b61023560048036038101906102309190613b66565b610777565b6040516102429190613bd0565b60405180910390f35b61026560048036038101906102609190613c13565b6107a7565b6040516102729190613c6b565b60405180910390f35b61029560048036038101906102909190613b66565b610a8e565b6040516102a29190613b02565b60405180910390f35b6102b3610ba3565b6040516102c09190613c93565b60405180910390f35b6102e360048036038101906102de9190613cac565b610bc7565b005b6102ed6113be565b005b6102f76114dd565b6040516103049190613d17565b60405180910390f35b61032760048036038101906103229190613cac565b611501565b005b610331611630565b60405161033e9190613c93565b60405180910390f35b610361600480360381019061035c9190613e5c565b611636565b005b61037d60048036038101906103789190613efc565b6116c8565b005b61039960048036038101906103949190613b66565b6117a4565b6040516103a69190613bd0565b60405180910390f35b6103c960048036038101906103c49190613b66565b611842565b6040516103d69190613b02565b60405180910390f35b6103f960048036038101906103f49190613f3a565b611957565b6040516104069190613c93565b60405180910390f35b61041761196c565b6040516104249190613bd0565b60405180910390f35b61043561198f565b6040516104429190613b02565b60405180910390f35b61046560048036038101906104609190613b66565b611a1b565b6040516104729190613b02565b60405180910390f35b61049560048036038101906104909190613f3a565b611b30565b6040516104a29190613c6b565b60405180910390f35b6104c560048036038101906104c09190613b66565b611b4d565b6040516104d29190613b02565b60405180910390f35b6104f560048036038101906104f09190613b66565b611c62565b6040516105029190613b02565b60405180910390f35b61052560048036038101906105209190613efc565b611d77565b005b610541600480360381019061053c9190613c13565b611e6f565b60405161054e9190613c6b565b60405180910390f35b610571600480360381019061056c9190613fc2565b611e83565b005b61058d60048036038101906105889190613b66565b611fb8565b60405161059a9190613b02565b60405180910390f35b6105bd60048036038101906105b89190613b66565b6120cd565b6040516105ca9190613b02565b60405180910390f35b6105ed60048036038101906105e89190613b66565b612661565b6040516105fa9190613b02565b60405180910390f35b61060b612776565b6040516106189190613b02565b60405180910390f35b61063b60048036038101906106369190614046565b612802565b6040516106489190613c93565b60405180910390f35b61066b60048036038101906106669190614046565b612822565b6040516106789190613c6b565b60405180910390f35b61069b60048036038101906106969190613b66565b61284c565b6040516106a89190613b02565b60405180910390f35b6106b9612961565b6040516106c69190613b02565b60405180910390f35b6106e960048036038101906106e49190613f3a565b6129ed565b005b600180546106f8906140b1565b80601f0160208091040260200160405190810160405280929190818152602001828054610724906140b1565b801561076f5780601f106107465761010080835404028352916020019161076f565b820191905f5260205f20905b81548152906001019060200180831161075257829003601f168201915b505050505081565b6006602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60035482111580156107b957505f82115b156109a1575f60085f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156108b0575060075f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156108e7576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360065f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040516109939190613c93565b60405180910390a350610a84565b8160055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610a7b9190613c93565b60405180910390a35b6001905092915050565b6060610b9c826040518060400160405280600481526020017f464f4f54000000000000000000000000000000000000000000000000000000008152506012805480602002602001604051908101604052809291908181526020015f905b82821015610b93578382905f5260205f20018054610b08906140b1565b80601f0160208091040260200160405190810160405280929190818152602001828054610b34906140b1565b8015610b7f5780601f10610b5657610100808354040283529160200191610b7f565b820191905f5260205f20905b815481529060010190602001808311610b6257829003601f168201915b505050505081526020019060010190610aeb565b50505050612b72565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600354811161127f5760085f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610c65576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610cca576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610d88575060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015610df0575060065f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610e27576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e2f612ead565b60045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610e7a919061410e565b92505081905550610e89612ead565b60045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160085f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060065f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555f60095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600160095f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050610fdf919061410e565b81548110610ff057610fef614141565b5b905f5260205f20015490508060095f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600a5f8581526020019081526020015f20548154811061105c5761105b614141565b5b905f5260205f20018190555060095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054806110b5576110b461416e565b5b600190038181905f5260205f20015f90559055600a5f8381526020019081526020015f2054600a5f8381526020019081526020015f208190555060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082908060018154018082558091505060019003905f5260205f20015f9091909190915055600160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905061119d919061410e565b600a5f8481526020019081526020015f2081905550818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487611264612ead565b6040516112719190613c93565b60405180910390a3506113b9565b5f60055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146113ab57818161132e919061410e565b60055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b6113b6848484612ee0565b50505b505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611442576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3565b7f000000000000000000000000000000000000000000000000000000000000000081565b61150c838383610bc7565b5f8273ffffffffffffffffffffffffffffffffffffffff163b141580156115f4575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b8152600401611592939291906141ce565b6020604051808303815f875af11580156115ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115d2919061426b565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b1561162b576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60035481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116ba576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116c48282613224565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461174c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f60085f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361183d576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6060611950826040518060400160405280600481526020017f4e45434b000000000000000000000000000000000000000000000000000000008152506016805480602002602001604051908101604052809291908181526020015f905b82821015611947578382905f5260205f200180546118bc906140b1565b80601f01602080910402602001604051908101604052809291908181526020018280546118e8906140b1565b80156119335780601f1061190a57610100808354040283529160200191611933565b820191905f5260205f20905b81548152906001019060200180831161191657829003601f168201915b50505050508152602001906001019061189f565b50505050612b72565b9050919050565b6004602052805f5260405f205f915090505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002805461199c906140b1565b80601f01602080910402602001604051908101604052809291908181526020018280546119c8906140b1565b8015611a135780601f106119ea57610100808354040283529160200191611a13565b820191905f5260205f20905b8154815290600101906020018083116119f657829003601f168201915b505050505081565b6060611b29826040518060400160405280600481526020017f48454144000000000000000000000000000000000000000000000000000000008152506010805480602002602001604051908101604052809291908181526020015f905b82821015611b20578382905f5260205f20018054611a95906140b1565b80601f0160208091040260200160405190810160405280929190818152602001828054611ac1906140b1565b8015611b0c5780601f10611ae357610100808354040283529160200191611b0c565b820191905f5260205f20905b815481529060010190602001808311611aef57829003601f168201915b505050505081526020019060010190611a78565b50505050612b72565b9050919050565b600b602052805f5260405f205f915054906101000a900460ff1681565b6060611c5b826040518060400160405280600581526020017f57414953540000000000000000000000000000000000000000000000000000008152506011805480602002602001604051908101604052809291908181526020015f905b82821015611c52578382905f5260205f20018054611bc7906140b1565b80601f0160208091040260200160405190810160405280929190818152602001828054611bf3906140b1565b8015611c3e5780601f10611c1557610100808354040283529160200191611c3e565b820191905f5260205f20905b815481529060010190602001808311611c2157829003601f168201915b505050505081526020019060010190611baa565b50505050612b72565b9050919050565b6060611d70826040518060400160405280600681526020017f574541504f4e0000000000000000000000000000000000000000000000000000815250600e805480602002602001604051908101604052809291908181526020015f905b82821015611d67578382905f5260205f20018054611cdc906140b1565b80601f0160208091040260200160405190810160405280929190818152602001828054611d08906140b1565b8015611d535780601f10611d2a57610100808354040283529160200191611d53565b820191905f5260205f20905b815481529060010190602001808311611d3657829003601f168201915b505050505081526020019060010190611cbf565b50505050612b72565b9050919050565b8060075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e639190613c6b565b60405180910390a35050565b5f611e7b338484612ee0565b905092915050565b611e8e858585610bc7565b5f8473ffffffffffffffffffffffffffffffffffffffff163b14158015611f7a575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff1663150b7a0233888787876040518663ffffffff1660e01b8152600401611f189594939291906142c2565b6020604051808303815f875af1158015611f34573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f58919061426b565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b15611fb1576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b60606120c6826040518060400160405280600481526020017f52494e47000000000000000000000000000000000000000000000000000000008152506017805480602002602001604051908101604052809291908181526020015f905b828210156120bd578382905f5260205f20018054612032906140b1565b80601f016020809104026020016040519081016040528092919081815260200182805461205e906140b1565b80156120a95780601f10612080576101008083540402835291602001916120a9565b820191905f5260205f20905b81548152906001019060200180831161208c57829003601f168201915b505050505081526020019060010190612015565b50505050612b72565b9050919050565b60606120d7613a29565b6040518061020001604052806101d58152602001614f7b6101d59139815f6011811061210657612105614141565b5b602002018190525061211783611c62565b8160016011811061212b5761212a614141565b5b602002018190525060405180606001604052806028815260200161515060289139816002601181106121605761215f614141565b5b60200201819052506121718361284c565b8160036011811061218557612184614141565b5b6020020181905250604051806060016040528060288152602001614e4760289139816004601181106121ba576121b9614141565b5b60200201819052506121cb83611a1b565b816005601181106121df576121de614141565b5b6020020181905250604051806060016040528060288152602001614ec1602891398160066011811061221457612213614141565b5b602002018190525061222583611b4d565b8160076011811061223957612238614141565b5b6020020181905250604051806060016040528060298152602001614ee9602991398160086011811061226e5761226d614141565b5b602002018190525061227f83610a8e565b8160096011811061229357612292614141565b5b6020020181905250604051806060016040528060298152602001614e986029913981600a601181106122c8576122c7614141565b5b60200201819052506122d983612661565b81600b601181106122ed576122ec614141565b5b6020020181905250604051806060016040528060298152602001614f126029913981600c6011811061232257612321614141565b5b602002018190525061233383611842565b81600d6011811061234757612346614141565b5b6020020181905250604051806060016040528060298152602001614e6f6029913981600e6011811061237c5761237b614141565b5b602002018190525061238d83611fb8565b81600f601181106123a1576123a0614141565b5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e00000000000000000000000000000000000000815250816010601181106123f3576123f2614141565b5b60200201819052505f815f6011811061240f5761240e614141565b5b60200201518260016011811061242857612427614141565b5b60200201518360026011811061244157612440614141565b5b60200201518460036011811061245a57612459614141565b5b60200201518560046011811061247357612472614141565b5b60200201518660056011811061248c5761248b614141565b5b6020020151876006601181106124a5576124a4614141565b5b6020020151886007601181106124be576124bd614141565b5b6020020151896008601181106124d7576124d6614141565b5b60200201516040516020016124f499989796959493929190614348565b6040516020818303038152906040529050808260096011811061251a57612519614141565b5b602002015183600a6011811061253357612532614141565b5b602002015184600b6011811061254c5761254b614141565b5b602002015185600c6011811061256557612564614141565b5b602002015186600d6011811061257e5761257d614141565b5b602002015187600e6011811061259757612596614141565b5b602002015188600f601181106125b0576125af614141565b5b6020020151896010601181106125c9576125c8614141565b5b60200201516040516020016125e699989796959493929190614348565b60405160208183030381529060405290505f61263261260486613248565b61260d846133a1565b60405160200161261e9291906145ae565b6040516020818303038152906040526133a1565b905080604051602001612645919061463c565b6040516020818303038152906040529150819350505050919050565b606061276f826040518060400160405280600481526020017f48414e44000000000000000000000000000000000000000000000000000000008152506013805480602002602001604051908101604052809291908181526020015f905b82821015612766578382905f5260205f200180546126db906140b1565b80601f0160208091040260200160405190810160405280929190818152602001828054612707906140b1565b80156127525780601f1061272957610100808354040283529160200191612752565b820191905f5260205f20905b81548152906001019060200180831161273557829003601f168201915b5050505050815260200190600101906126be565b50505050612b72565b9050919050565b600d8054612783906140b1565b80601f01602080910402602001604051908101604052809291908181526020018280546127af906140b1565b80156127fa5780601f106127d1576101008083540402835291602001916127fa565b820191905f5260205f20905b8154815290600101906020018083116127dd57829003601f168201915b505050505081565b6005602052815f5260405f20602052805f5260405f205f91509150505481565b6007602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b606061295a826040518060400160405280600581526020017f4348455354000000000000000000000000000000000000000000000000000000815250600f805480602002602001604051908101604052809291908181526020015f905b82821015612951578382905f5260205f200180546128c6906140b1565b80601f01602080910402602001604051908101604052809291908181526020018280546128f2906140b1565b801561293d5780601f106129145761010080835404028352916020019161293d565b820191905f5260205f20905b81548152906001019060200180831161292057829003601f168201915b5050505050815260200190600101906128a9565b50505050612b72565b9050919050565b600c805461296e906140b1565b80601f016020809104026020016040519081016040528092919081815260200182805461299a906140b1565b80156129e55780601f106129bc576101008083540402835291602001916129e5565b820191905f5260205f20905b8154815290600101906020018083116129c857829003601f168201915b505050505081565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612a71576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612ad6576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b60605f612ba784612b8287613248565b604051602001612b9392919061465d565b604051602081830303815290604052613531565b90505f83845183612bb891906146ad565b81518110612bc957612bc8614141565b5b602002602001015190505f601583612be191906146ad565b9050600e811115612c3b57816014808054905085612bff91906146ad565b81548110612c1057612c0f614141565b5b905f5260205f2001604051602001612c299291906147b9565b60405160208183030381529060405291505b60138110612ea057612c4b613a51565b6015808054905085612c5d91906146ad565b81548110612c6e57612c6d614141565b5b905f5260205f20018054612c81906140b1565b80601f0160208091040260200160405190810160405280929190818152602001828054612cad906140b1565b8015612cf85780601f10612ccf57610100808354040283529160200191612cf8565b820191905f5260205f20905b815481529060010190602001808311612cdb57829003601f168201915b5050505050815f60028110612d1057612d0f614141565b5b60200201819052506018808054905085612d2a91906146ad565b81548110612d3b57612d3a614141565b5b905f5260205f20018054612d4e906140b1565b80601f0160208091040260200160405190810160405280929190818152602001828054612d7a906140b1565b8015612dc55780601f10612d9c57610100808354040283529160200191612dc5565b820191905f5260205f20905b815481529060010190602001808311612da857829003601f168201915b505050505081600160028110612dde57612ddd614141565b5b602002018190525060138203612e4857805f60028110612e0157612e00614141565b5b602002015181600160028110612e1a57612e19614141565b5b602002015184604051602001612e329392919061487b565b6040516020818303038152906040529250612e9e565b805f60028110612e5b57612e5a614141565b5b602002015181600160028110612e7457612e73614141565b5b602002015184604051602001612e8c93929190614916565b60405160208183030381529060405292505b505b8193505050509392505050565b5f7f0000000000000000000000000000000000000000000000000000000000000000600a612edb9190614aa1565b905090565b5f80612eea612ead565b90505f60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508460045f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612fba919061410e565b925050819055508460045f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550600b5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166130de575f8360045f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546130a39190614aeb565b84846130af9190614aeb565b6130b9919061410e565b90505f5b818110156130db576130ce89613562565b80806001019150506130bd565b50505b600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166131b1575f83826131399190614aeb565b8460045f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546131829190614aeb565b61318c919061410e565b90505f5b818110156131ae576131a1886137a7565b8080600101915050613190565b50505b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314878760405161320e9190613c93565b60405180910390a3600193505050509392505050565b81600190816132339190614ca6565b5080600290816132439190614ca6565b505050565b60605f820361328e576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061339c565b5f8290505f5b5f82146132bd5780806132a690614d75565b915050600a826132b69190614aeb565b9150613294565b5f8167ffffffffffffffff8111156132d8576132d7613d38565b5b6040519080825280601f01601f19166020018201604052801561330a5781602001600182028036833780820191505090505b5090505b5f851461339557600182613322919061410e565b9150600a8561333191906146ad565b603061333d9190614dbc565b60f81b81838151811061335357613352614141565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a8561338e9190614aeb565b945061330e565b8093505050505b919050565b60605f825190505f81036133c65760405180602001604052805f81525091505061352c565b5f60036002836133d69190614dbc565b6133e09190614aeb565b60046133ec9190614def565b90505f6020826133fc9190614dbc565b67ffffffffffffffff81111561341557613414613d38565b5b6040519080825280601f01601f1916602001820160405280156134475781602001600182028036833780820191505090505b5090505f604051806060016040528060408152602001614f3b60409139905060018101602083015f5b868110156134e95760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050613470565b50600386066001811461350357600281146135135761351e565b613d3d60f01b600283035261351e565b603d60f81b60018303525b508484525050819450505050505b919050565b5f816040516020016135439190614e30565b604051602081830303815290604052805190602001205f1c9050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036135c7576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050613652919061410e565b8154811061366357613662614141565b5b905f5260205f200154905060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054806136bb576136ba61416e565b5b600190038181905f5260205f20015f90559055600a5f8281526020019081526020015f205f905560085f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560065f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055805f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361380c576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035f81548092919060010191905055505f60035490505f73ffffffffffffffffffffffffffffffffffffffff1660085f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146138b8576040517f23369fa600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160085f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f9091909190915055600160095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506139b5919061410e565b600a5f8381526020019081526020015f2081905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6040518061022001604052806011905b6060815260200190600190039081613a395790505090565b60405180604001604052806002905b6060815260200190600190039081613a605790505090565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613aaf578082015181840152602081019050613a94565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613ad482613a78565b613ade8185613a82565b9350613aee818560208601613a92565b613af781613aba565b840191505092915050565b5f6020820190508181035f830152613b1a8184613aca565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b613b4581613b33565b8114613b4f575f80fd5b50565b5f81359050613b6081613b3c565b92915050565b5f60208284031215613b7b57613b7a613b2b565b5b5f613b8884828501613b52565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613bba82613b91565b9050919050565b613bca81613bb0565b82525050565b5f602082019050613be35f830184613bc1565b92915050565b613bf281613bb0565b8114613bfc575f80fd5b50565b5f81359050613c0d81613be9565b92915050565b5f8060408385031215613c2957613c28613b2b565b5b5f613c3685828601613bff565b9250506020613c4785828601613b52565b9150509250929050565b5f8115159050919050565b613c6581613c51565b82525050565b5f602082019050613c7e5f830184613c5c565b92915050565b613c8d81613b33565b82525050565b5f602082019050613ca65f830184613c84565b92915050565b5f805f60608486031215613cc357613cc2613b2b565b5b5f613cd086828701613bff565b9350506020613ce186828701613bff565b9250506040613cf286828701613b52565b9150509250925092565b5f60ff82169050919050565b613d1181613cfc565b82525050565b5f602082019050613d2a5f830184613d08565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613d6e82613aba565b810181811067ffffffffffffffff82111715613d8d57613d8c613d38565b5b80604052505050565b5f613d9f613b22565b9050613dab8282613d65565b919050565b5f67ffffffffffffffff821115613dca57613dc9613d38565b5b613dd382613aba565b9050602081019050919050565b828183375f83830152505050565b5f613e00613dfb84613db0565b613d96565b905082815260208101848484011115613e1c57613e1b613d34565b5b613e27848285613de0565b509392505050565b5f82601f830112613e4357613e42613d30565b5b8135613e53848260208601613dee565b91505092915050565b5f8060408385031215613e7257613e71613b2b565b5b5f83013567ffffffffffffffff811115613e8f57613e8e613b2f565b5b613e9b85828601613e2f565b925050602083013567ffffffffffffffff811115613ebc57613ebb613b2f565b5b613ec885828601613e2f565b9150509250929050565b613edb81613c51565b8114613ee5575f80fd5b50565b5f81359050613ef681613ed2565b92915050565b5f8060408385031215613f1257613f11613b2b565b5b5f613f1f85828601613bff565b9250506020613f3085828601613ee8565b9150509250929050565b5f60208284031215613f4f57613f4e613b2b565b5b5f613f5c84828501613bff565b91505092915050565b5f80fd5b5f80fd5b5f8083601f840112613f8257613f81613d30565b5b8235905067ffffffffffffffff811115613f9f57613f9e613f65565b5b602083019150836001820283011115613fbb57613fba613f69565b5b9250929050565b5f805f805f60808688031215613fdb57613fda613b2b565b5b5f613fe888828901613bff565b9550506020613ff988828901613bff565b945050604061400a88828901613b52565b935050606086013567ffffffffffffffff81111561402b5761402a613b2f565b5b61403788828901613f6d565b92509250509295509295909350565b5f806040838503121561405c5761405b613b2b565b5b5f61406985828601613bff565b925050602061407a85828601613bff565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806140c857607f821691505b6020821081036140db576140da614084565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61411882613b33565b915061412383613b33565b925082820390508181111561413b5761413a6140e1565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f82825260208201905092915050565b50565b5f6141b95f8361419b565b91506141c4826141ab565b5f82019050919050565b5f6080820190506141e15f830186613bc1565b6141ee6020830185613bc1565b6141fb6040830184613c84565b818103606083015261420c816141ae565b9050949350505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61424a81614216565b8114614254575f80fd5b50565b5f8151905061426581614241565b92915050565b5f602082840312156142805761427f613b2b565b5b5f61428d84828501614257565b91505092915050565b5f6142a1838561419b565b93506142ae838584613de0565b6142b783613aba565b840190509392505050565b5f6080820190506142d55f830188613bc1565b6142e26020830187613bc1565b6142ef6040830186613c84565b8181036060830152614302818486614296565b90509695505050505050565b5f81905092915050565b5f61432282613a78565b61432c818561430e565b935061433c818560208601613a92565b80840191505092915050565b5f614353828c614318565b915061435f828b614318565b915061436b828a614318565b91506143778289614318565b91506143838288614318565b915061438f8287614318565b915061439b8286614318565b91506143a78285614318565b91506143b38284614318565b91508190509a9950505050505050505050565b7f7b226e616d65223a202254726f766573202300000000000000000000000000005f82015250565b5f6143fa60128361430e565b9150614405826143c6565b601282019050919050565b7f222c20226465736372697074696f6e223a2022556e6c6f636b20746865206d795f8201527f73746572696573206f662054726f7665732c206275696c74206f6e207468652060208201527f45524320343034207374616e646172642c20616e6420656d6261726b206f6e2060408201527f61206a6f75726e6579207468726f75676820616e20657665722d657870616e6460608201527f696e67206d6574617665727365206f66206f6e2d636861696e2074726561737560808201527f72657320616e6420626f756e646c65737320646973636f766572792e222c202260a08201527f696d616765223a2022646174613a696d6167652f7376672b786d6c3b6261736560c08201527f36342c000000000000000000000000000000000000000000000000000000000060e082015250565b5f61454e60e38361430e565b915061455982614410565b60e382019050919050565b7f227d0000000000000000000000000000000000000000000000000000000000005f82015250565b5f61459860028361430e565b91506145a382614564565b600282019050919050565b5f6145b8826143ee565b91506145c48285614318565b91506145cf82614542565b91506145db8284614318565b91506145e68261458c565b91508190509392505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000005f82015250565b5f614626601d8361430e565b9150614631826145f2565b601d82019050919050565b5f6146468261461a565b91506146528284614318565b915081905092915050565b5f6146688285614318565b91506146748284614318565b91508190509392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6146b782613b33565b91506146c283613b33565b9250826146d2576146d1614680565b5b828206905092915050565b7f20000000000000000000000000000000000000000000000000000000000000005f82015250565b5f61471160018361430e565b915061471c826146dd565b600182019050919050565b5f819050815f5260205f209050919050565b5f8154614745816140b1565b61474f818661430e565b9450600182165f8114614769576001811461477e576147b0565b60ff19831686528115158202860193506147b0565b61478785614727565b5f5b838110156147a857815481890152600182019150602081019050614789565b838801955050505b50505092915050565b5f6147c48285614318565b91506147cf82614705565b91506147db8284614739565b91508190509392505050565b7f22000000000000000000000000000000000000000000000000000000000000005f82015250565b5f61481b60018361430e565b9150614826826147e7565b600182019050919050565b7f22200000000000000000000000000000000000000000000000000000000000005f82015250565b5f61486560028361430e565b915061487082614831565b600282019050919050565b5f6148858261480f565b91506148918286614318565b915061489c82614705565b91506148a88285614318565b91506148b382614859565b91506148bf8284614318565b9150819050949350505050565b7f202b3100000000000000000000000000000000000000000000000000000000005f82015250565b5f61490060038361430e565b915061490b826148cc565b600382019050919050565b5f6149208261480f565b915061492c8286614318565b915061493782614705565b91506149438285614318565b915061494e82614859565b915061495a8284614318565b9150614965826148f4565b9150819050949350505050565b5f8160011c9050919050565b5f808291508390505b60018511156149c7578086048111156149a3576149a26140e1565b5b60018516156149b25780820291505b80810290506149c085614972565b9450614987565b94509492505050565b5f826149df5760019050614a9a565b816149ec575f9050614a9a565b8160018114614a025760028114614a0c57614a3b565b6001915050614a9a565b60ff841115614a1e57614a1d6140e1565b5b8360020a915084821115614a3557614a346140e1565b5b50614a9a565b5060208310610133831016604e8410600b8410161715614a705782820a905083811115614a6b57614a6a6140e1565b5b614a9a565b614a7d848484600161497e565b92509050818404811115614a9457614a936140e1565b5b81810290505b9392505050565b5f614aab82613b33565b9150614ab683613cfc565b9250614ae37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846149d0565b905092915050565b5f614af582613b33565b9150614b0083613b33565b925082614b1057614b0f614680565b5b828204905092915050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302614b657fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614b2a565b614b6f8683614b2a565b95508019841693508086168417925050509392505050565b5f819050919050565b5f614baa614ba5614ba084613b33565b614b87565b613b33565b9050919050565b5f819050919050565b614bc383614b90565b614bd7614bcf82614bb1565b848454614b36565b825550505050565b5f90565b614beb614bdf565b614bf6818484614bba565b505050565b5b81811015614c1957614c0e5f82614be3565b600181019050614bfc565b5050565b601f821115614c5e57614c2f81614727565b614c3884614b1b565b81016020851015614c47578190505b614c5b614c5385614b1b565b830182614bfb565b50505b505050565b5f82821c905092915050565b5f614c7e5f1984600802614c63565b1980831691505092915050565b5f614c968383614c6f565b9150826002028217905092915050565b614caf82613a78565b67ffffffffffffffff811115614cc857614cc7613d38565b5b614cd282546140b1565b614cdd828285614c1d565b5f60209050601f831160018114614d0e575f8415614cfc578287015190505b614d068582614c8b565b865550614d6d565b601f198416614d1c86614727565b5f5b82811015614d4357848901518255600182019150602085019450602081019050614d1e565b86831015614d605784890151614d5c601f891682614c6f565b8355505b6001600288020188555050505b505050505050565b5f614d7f82613b33565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614db157614db06140e1565b5b600182019050919050565b5f614dc682613b33565b9150614dd183613b33565b9250828201905080821115614de957614de86140e1565b5b92915050565b5f614df982613b33565b9150614e0483613b33565b9250828202614e1281613b33565b91508282048414831517614e2957614e286140e1565b5b5092915050565b5f614e3b8284614318565b91508190509291505056fe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223136302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223134302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e40696d706f72742075726c282268747470733a2f2f666f6e74732e676f6f676c65617069732e636f6d2f637373323f66616d696c793d42656c6c656661697222293b2e62617365207b2066696c6c3a20236635663566353b20666f6e742d66616d696c793a202242656c6c6566616972222c2073657269663b20666f6e742d73697a653a20313670783b207d202e666f6f746572207b666f6e742d73697a653a20333270783b7d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3e3c7465787420783d223530252220793d223935252220646f6d696e616e742d626173656c696e653d226d6964646c652220746578742d616e63686f723d226d6964646c652220636c6173733d226261736520666f6f746572223e54524f5645532e544543483c2f746578743e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea2646970667358221220154bc9e66abf160188aecd5a069cca0808d560572e3fcf4fcae7bded4b52d10064736f6c63430008180033

Deployed Bytecode

0x608060405234801561000f575f80fd5b50600436106101f9575f3560e01c806395d89b4111610118578063c08a5dd5116100ab578063dd62ed3e1161007a578063dd62ed3e14610621578063e985e9c514610651578063ef68075a14610681578063f28ca1dd146106b1578063f2fde38b146106cf576101f9565b8063c08a5dd514610573578063c87b56dd146105a3578063d47f269e146105d3578063d547cfb714610603576101f9565b80639e41b73f116100e75780639e41b73f146104db578063a22cb4651461050b578063a9059cbb14610527578063b88d4fde14610557576101f9565b806395d89b411461042d5780639720c9691461044b5780639b19251a1461047b5780639bdc1b69146104ab576101f9565b806342842e0e116101905780636352211e1161015f5780636352211e1461037f57806367209aa8146103af57806370a08231146103df5780638da5cb5b1461040f576101f9565b806342842e0e1461030d5780634f02c42014610329578063504334c21461034757806353d6fd5914610363576101f9565b806318160ddd116101cc57806318160ddd146102ab57806323b872dd146102c95780632b968958146102e5578063313ce567146102ef576101f9565b806306fdde03146101fd578063081812fc1461021b578063095ea7b31461024b5780630e99990d1461027b575b5f80fd5b6102056106eb565b6040516102129190613b02565b60405180910390f35b61023560048036038101906102309190613b66565b610777565b6040516102429190613bd0565b60405180910390f35b61026560048036038101906102609190613c13565b6107a7565b6040516102729190613c6b565b60405180910390f35b61029560048036038101906102909190613b66565b610a8e565b6040516102a29190613b02565b60405180910390f35b6102b3610ba3565b6040516102c09190613c93565b60405180910390f35b6102e360048036038101906102de9190613cac565b610bc7565b005b6102ed6113be565b005b6102f76114dd565b6040516103049190613d17565b60405180910390f35b61032760048036038101906103229190613cac565b611501565b005b610331611630565b60405161033e9190613c93565b60405180910390f35b610361600480360381019061035c9190613e5c565b611636565b005b61037d60048036038101906103789190613efc565b6116c8565b005b61039960048036038101906103949190613b66565b6117a4565b6040516103a69190613bd0565b60405180910390f35b6103c960048036038101906103c49190613b66565b611842565b6040516103d69190613b02565b60405180910390f35b6103f960048036038101906103f49190613f3a565b611957565b6040516104069190613c93565b60405180910390f35b61041761196c565b6040516104249190613bd0565b60405180910390f35b61043561198f565b6040516104429190613b02565b60405180910390f35b61046560048036038101906104609190613b66565b611a1b565b6040516104729190613b02565b60405180910390f35b61049560048036038101906104909190613f3a565b611b30565b6040516104a29190613c6b565b60405180910390f35b6104c560048036038101906104c09190613b66565b611b4d565b6040516104d29190613b02565b60405180910390f35b6104f560048036038101906104f09190613b66565b611c62565b6040516105029190613b02565b60405180910390f35b61052560048036038101906105209190613efc565b611d77565b005b610541600480360381019061053c9190613c13565b611e6f565b60405161054e9190613c6b565b60405180910390f35b610571600480360381019061056c9190613fc2565b611e83565b005b61058d60048036038101906105889190613b66565b611fb8565b60405161059a9190613b02565b60405180910390f35b6105bd60048036038101906105b89190613b66565b6120cd565b6040516105ca9190613b02565b60405180910390f35b6105ed60048036038101906105e89190613b66565b612661565b6040516105fa9190613b02565b60405180910390f35b61060b612776565b6040516106189190613b02565b60405180910390f35b61063b60048036038101906106369190614046565b612802565b6040516106489190613c93565b60405180910390f35b61066b60048036038101906106669190614046565b612822565b6040516106789190613c6b565b60405180910390f35b61069b60048036038101906106969190613b66565b61284c565b6040516106a89190613b02565b60405180910390f35b6106b9612961565b6040516106c69190613b02565b60405180910390f35b6106e960048036038101906106e49190613f3a565b6129ed565b005b600180546106f8906140b1565b80601f0160208091040260200160405190810160405280929190818152602001828054610724906140b1565b801561076f5780601f106107465761010080835404028352916020019161076f565b820191905f5260205f20905b81548152906001019060200180831161075257829003601f168201915b505050505081565b6006602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60035482111580156107b957505f82115b156109a1575f60085f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156108b0575060075f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156108e7576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360065f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040516109939190613c93565b60405180910390a350610a84565b8160055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610a7b9190613c93565b60405180910390a35b6001905092915050565b6060610b9c826040518060400160405280600481526020017f464f4f54000000000000000000000000000000000000000000000000000000008152506012805480602002602001604051908101604052809291908181526020015f905b82821015610b93578382905f5260205f20018054610b08906140b1565b80601f0160208091040260200160405190810160405280929190818152602001828054610b34906140b1565b8015610b7f5780601f10610b5657610100808354040283529160200191610b7f565b820191905f5260205f20905b815481529060010190602001808311610b6257829003601f168201915b505050505081526020019060010190610aeb565b50505050612b72565b9050919050565b7f00000000000000000000000000000000000000000000021e19e0c9bab240000081565b600354811161127f5760085f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610c65576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610cca576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610d88575060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015610df0575060065f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610e27576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e2f612ead565b60045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610e7a919061410e565b92505081905550610e89612ead565b60045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160085f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060065f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555f60095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600160095f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050610fdf919061410e565b81548110610ff057610fef614141565b5b905f5260205f20015490508060095f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600a5f8581526020019081526020015f20548154811061105c5761105b614141565b5b905f5260205f20018190555060095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054806110b5576110b461416e565b5b600190038181905f5260205f20015f90559055600a5f8381526020019081526020015f2054600a5f8381526020019081526020015f208190555060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082908060018154018082558091505060019003905f5260205f20015f9091909190915055600160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905061119d919061410e565b600a5f8481526020019081526020015f2081905550818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487611264612ead565b6040516112719190613c93565b60405180910390a3506113b9565b5f60055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146113ab57818161132e919061410e565b60055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b6113b6848484612ee0565b50505b505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611442576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3565b7f000000000000000000000000000000000000000000000000000000000000001281565b61150c838383610bc7565b5f8273ffffffffffffffffffffffffffffffffffffffff163b141580156115f4575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b8152600401611592939291906141ce565b6020604051808303815f875af11580156115ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115d2919061426b565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b1561162b576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60035481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116ba576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116c48282613224565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461174c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f60085f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361183d576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6060611950826040518060400160405280600481526020017f4e45434b000000000000000000000000000000000000000000000000000000008152506016805480602002602001604051908101604052809291908181526020015f905b82821015611947578382905f5260205f200180546118bc906140b1565b80601f01602080910402602001604051908101604052809291908181526020018280546118e8906140b1565b80156119335780601f1061190a57610100808354040283529160200191611933565b820191905f5260205f20905b81548152906001019060200180831161191657829003601f168201915b50505050508152602001906001019061189f565b50505050612b72565b9050919050565b6004602052805f5260405f205f915090505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002805461199c906140b1565b80601f01602080910402602001604051908101604052809291908181526020018280546119c8906140b1565b8015611a135780601f106119ea57610100808354040283529160200191611a13565b820191905f5260205f20905b8154815290600101906020018083116119f657829003601f168201915b505050505081565b6060611b29826040518060400160405280600481526020017f48454144000000000000000000000000000000000000000000000000000000008152506010805480602002602001604051908101604052809291908181526020015f905b82821015611b20578382905f5260205f20018054611a95906140b1565b80601f0160208091040260200160405190810160405280929190818152602001828054611ac1906140b1565b8015611b0c5780601f10611ae357610100808354040283529160200191611b0c565b820191905f5260205f20905b815481529060010190602001808311611aef57829003601f168201915b505050505081526020019060010190611a78565b50505050612b72565b9050919050565b600b602052805f5260405f205f915054906101000a900460ff1681565b6060611c5b826040518060400160405280600581526020017f57414953540000000000000000000000000000000000000000000000000000008152506011805480602002602001604051908101604052809291908181526020015f905b82821015611c52578382905f5260205f20018054611bc7906140b1565b80601f0160208091040260200160405190810160405280929190818152602001828054611bf3906140b1565b8015611c3e5780601f10611c1557610100808354040283529160200191611c3e565b820191905f5260205f20905b815481529060010190602001808311611c2157829003601f168201915b505050505081526020019060010190611baa565b50505050612b72565b9050919050565b6060611d70826040518060400160405280600681526020017f574541504f4e0000000000000000000000000000000000000000000000000000815250600e805480602002602001604051908101604052809291908181526020015f905b82821015611d67578382905f5260205f20018054611cdc906140b1565b80601f0160208091040260200160405190810160405280929190818152602001828054611d08906140b1565b8015611d535780601f10611d2a57610100808354040283529160200191611d53565b820191905f5260205f20905b815481529060010190602001808311611d3657829003601f168201915b505050505081526020019060010190611cbf565b50505050612b72565b9050919050565b8060075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e639190613c6b565b60405180910390a35050565b5f611e7b338484612ee0565b905092915050565b611e8e858585610bc7565b5f8473ffffffffffffffffffffffffffffffffffffffff163b14158015611f7a575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff1663150b7a0233888787876040518663ffffffff1660e01b8152600401611f189594939291906142c2565b6020604051808303815f875af1158015611f34573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f58919061426b565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b15611fb1576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b60606120c6826040518060400160405280600481526020017f52494e47000000000000000000000000000000000000000000000000000000008152506017805480602002602001604051908101604052809291908181526020015f905b828210156120bd578382905f5260205f20018054612032906140b1565b80601f016020809104026020016040519081016040528092919081815260200182805461205e906140b1565b80156120a95780601f10612080576101008083540402835291602001916120a9565b820191905f5260205f20905b81548152906001019060200180831161208c57829003601f168201915b505050505081526020019060010190612015565b50505050612b72565b9050919050565b60606120d7613a29565b6040518061020001604052806101d58152602001614f7b6101d59139815f6011811061210657612105614141565b5b602002018190525061211783611c62565b8160016011811061212b5761212a614141565b5b602002018190525060405180606001604052806028815260200161515060289139816002601181106121605761215f614141565b5b60200201819052506121718361284c565b8160036011811061218557612184614141565b5b6020020181905250604051806060016040528060288152602001614e4760289139816004601181106121ba576121b9614141565b5b60200201819052506121cb83611a1b565b816005601181106121df576121de614141565b5b6020020181905250604051806060016040528060288152602001614ec1602891398160066011811061221457612213614141565b5b602002018190525061222583611b4d565b8160076011811061223957612238614141565b5b6020020181905250604051806060016040528060298152602001614ee9602991398160086011811061226e5761226d614141565b5b602002018190525061227f83610a8e565b8160096011811061229357612292614141565b5b6020020181905250604051806060016040528060298152602001614e986029913981600a601181106122c8576122c7614141565b5b60200201819052506122d983612661565b81600b601181106122ed576122ec614141565b5b6020020181905250604051806060016040528060298152602001614f126029913981600c6011811061232257612321614141565b5b602002018190525061233383611842565b81600d6011811061234757612346614141565b5b6020020181905250604051806060016040528060298152602001614e6f6029913981600e6011811061237c5761237b614141565b5b602002018190525061238d83611fb8565b81600f601181106123a1576123a0614141565b5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e00000000000000000000000000000000000000815250816010601181106123f3576123f2614141565b5b60200201819052505f815f6011811061240f5761240e614141565b5b60200201518260016011811061242857612427614141565b5b60200201518360026011811061244157612440614141565b5b60200201518460036011811061245a57612459614141565b5b60200201518560046011811061247357612472614141565b5b60200201518660056011811061248c5761248b614141565b5b6020020151876006601181106124a5576124a4614141565b5b6020020151886007601181106124be576124bd614141565b5b6020020151896008601181106124d7576124d6614141565b5b60200201516040516020016124f499989796959493929190614348565b6040516020818303038152906040529050808260096011811061251a57612519614141565b5b602002015183600a6011811061253357612532614141565b5b602002015184600b6011811061254c5761254b614141565b5b602002015185600c6011811061256557612564614141565b5b602002015186600d6011811061257e5761257d614141565b5b602002015187600e6011811061259757612596614141565b5b602002015188600f601181106125b0576125af614141565b5b6020020151896010601181106125c9576125c8614141565b5b60200201516040516020016125e699989796959493929190614348565b60405160208183030381529060405290505f61263261260486613248565b61260d846133a1565b60405160200161261e9291906145ae565b6040516020818303038152906040526133a1565b905080604051602001612645919061463c565b6040516020818303038152906040529150819350505050919050565b606061276f826040518060400160405280600481526020017f48414e44000000000000000000000000000000000000000000000000000000008152506013805480602002602001604051908101604052809291908181526020015f905b82821015612766578382905f5260205f200180546126db906140b1565b80601f0160208091040260200160405190810160405280929190818152602001828054612707906140b1565b80156127525780601f1061272957610100808354040283529160200191612752565b820191905f5260205f20905b81548152906001019060200180831161273557829003601f168201915b5050505050815260200190600101906126be565b50505050612b72565b9050919050565b600d8054612783906140b1565b80601f01602080910402602001604051908101604052809291908181526020018280546127af906140b1565b80156127fa5780601f106127d1576101008083540402835291602001916127fa565b820191905f5260205f20905b8154815290600101906020018083116127dd57829003601f168201915b505050505081565b6005602052815f5260405f20602052805f5260405f205f91509150505481565b6007602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b606061295a826040518060400160405280600581526020017f4348455354000000000000000000000000000000000000000000000000000000815250600f805480602002602001604051908101604052809291908181526020015f905b82821015612951578382905f5260205f200180546128c6906140b1565b80601f01602080910402602001604051908101604052809291908181526020018280546128f2906140b1565b801561293d5780601f106129145761010080835404028352916020019161293d565b820191905f5260205f20905b81548152906001019060200180831161292057829003601f168201915b5050505050815260200190600101906128a9565b50505050612b72565b9050919050565b600c805461296e906140b1565b80601f016020809104026020016040519081016040528092919081815260200182805461299a906140b1565b80156129e55780601f106129bc576101008083540402835291602001916129e5565b820191905f5260205f20905b8154815290600101906020018083116129c857829003601f168201915b505050505081565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612a71576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612ad6576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b60605f612ba784612b8287613248565b604051602001612b9392919061465d565b604051602081830303815290604052613531565b90505f83845183612bb891906146ad565b81518110612bc957612bc8614141565b5b602002602001015190505f601583612be191906146ad565b9050600e811115612c3b57816014808054905085612bff91906146ad565b81548110612c1057612c0f614141565b5b905f5260205f2001604051602001612c299291906147b9565b60405160208183030381529060405291505b60138110612ea057612c4b613a51565b6015808054905085612c5d91906146ad565b81548110612c6e57612c6d614141565b5b905f5260205f20018054612c81906140b1565b80601f0160208091040260200160405190810160405280929190818152602001828054612cad906140b1565b8015612cf85780601f10612ccf57610100808354040283529160200191612cf8565b820191905f5260205f20905b815481529060010190602001808311612cdb57829003601f168201915b5050505050815f60028110612d1057612d0f614141565b5b60200201819052506018808054905085612d2a91906146ad565b81548110612d3b57612d3a614141565b5b905f5260205f20018054612d4e906140b1565b80601f0160208091040260200160405190810160405280929190818152602001828054612d7a906140b1565b8015612dc55780601f10612d9c57610100808354040283529160200191612dc5565b820191905f5260205f20905b815481529060010190602001808311612da857829003601f168201915b505050505081600160028110612dde57612ddd614141565b5b602002018190525060138203612e4857805f60028110612e0157612e00614141565b5b602002015181600160028110612e1a57612e19614141565b5b602002015184604051602001612e329392919061487b565b6040516020818303038152906040529250612e9e565b805f60028110612e5b57612e5a614141565b5b602002015181600160028110612e7457612e73614141565b5b602002015184604051602001612e8c93929190614916565b60405160208183030381529060405292505b505b8193505050509392505050565b5f7f0000000000000000000000000000000000000000000000000000000000000012600a612edb9190614aa1565b905090565b5f80612eea612ead565b90505f60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508460045f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612fba919061410e565b925050819055508460045f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550600b5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166130de575f8360045f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546130a39190614aeb565b84846130af9190614aeb565b6130b9919061410e565b90505f5b818110156130db576130ce89613562565b80806001019150506130bd565b50505b600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166131b1575f83826131399190614aeb565b8460045f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546131829190614aeb565b61318c919061410e565b90505f5b818110156131ae576131a1886137a7565b8080600101915050613190565b50505b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314878760405161320e9190613c93565b60405180910390a3600193505050509392505050565b81600190816132339190614ca6565b5080600290816132439190614ca6565b505050565b60605f820361328e576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061339c565b5f8290505f5b5f82146132bd5780806132a690614d75565b915050600a826132b69190614aeb565b9150613294565b5f8167ffffffffffffffff8111156132d8576132d7613d38565b5b6040519080825280601f01601f19166020018201604052801561330a5781602001600182028036833780820191505090505b5090505b5f851461339557600182613322919061410e565b9150600a8561333191906146ad565b603061333d9190614dbc565b60f81b81838151811061335357613352614141565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a8561338e9190614aeb565b945061330e565b8093505050505b919050565b60605f825190505f81036133c65760405180602001604052805f81525091505061352c565b5f60036002836133d69190614dbc565b6133e09190614aeb565b60046133ec9190614def565b90505f6020826133fc9190614dbc565b67ffffffffffffffff81111561341557613414613d38565b5b6040519080825280601f01601f1916602001820160405280156134475781602001600182028036833780820191505090505b5090505f604051806060016040528060408152602001614f3b60409139905060018101602083015f5b868110156134e95760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050613470565b50600386066001811461350357600281146135135761351e565b613d3d60f01b600283035261351e565b603d60f81b60018303525b508484525050819450505050505b919050565b5f816040516020016135439190614e30565b604051602081830303815290604052805190602001205f1c9050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036135c7576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050613652919061410e565b8154811061366357613662614141565b5b905f5260205f200154905060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054806136bb576136ba61416e565b5b600190038181905f5260205f20015f90559055600a5f8281526020019081526020015f205f905560085f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560065f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055805f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361380c576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035f81548092919060010191905055505f60035490505f73ffffffffffffffffffffffffffffffffffffffff1660085f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146138b8576040517f23369fa600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160085f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f9091909190915055600160095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506139b5919061410e565b600a5f8381526020019081526020015f2081905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6040518061022001604052806011905b6060815260200190600190039081613a395790505090565b60405180604001604052806002905b6060815260200190600190039081613a605790505090565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613aaf578082015181840152602081019050613a94565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613ad482613a78565b613ade8185613a82565b9350613aee818560208601613a92565b613af781613aba565b840191505092915050565b5f6020820190508181035f830152613b1a8184613aca565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b613b4581613b33565b8114613b4f575f80fd5b50565b5f81359050613b6081613b3c565b92915050565b5f60208284031215613b7b57613b7a613b2b565b5b5f613b8884828501613b52565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613bba82613b91565b9050919050565b613bca81613bb0565b82525050565b5f602082019050613be35f830184613bc1565b92915050565b613bf281613bb0565b8114613bfc575f80fd5b50565b5f81359050613c0d81613be9565b92915050565b5f8060408385031215613c2957613c28613b2b565b5b5f613c3685828601613bff565b9250506020613c4785828601613b52565b9150509250929050565b5f8115159050919050565b613c6581613c51565b82525050565b5f602082019050613c7e5f830184613c5c565b92915050565b613c8d81613b33565b82525050565b5f602082019050613ca65f830184613c84565b92915050565b5f805f60608486031215613cc357613cc2613b2b565b5b5f613cd086828701613bff565b9350506020613ce186828701613bff565b9250506040613cf286828701613b52565b9150509250925092565b5f60ff82169050919050565b613d1181613cfc565b82525050565b5f602082019050613d2a5f830184613d08565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613d6e82613aba565b810181811067ffffffffffffffff82111715613d8d57613d8c613d38565b5b80604052505050565b5f613d9f613b22565b9050613dab8282613d65565b919050565b5f67ffffffffffffffff821115613dca57613dc9613d38565b5b613dd382613aba565b9050602081019050919050565b828183375f83830152505050565b5f613e00613dfb84613db0565b613d96565b905082815260208101848484011115613e1c57613e1b613d34565b5b613e27848285613de0565b509392505050565b5f82601f830112613e4357613e42613d30565b5b8135613e53848260208601613dee565b91505092915050565b5f8060408385031215613e7257613e71613b2b565b5b5f83013567ffffffffffffffff811115613e8f57613e8e613b2f565b5b613e9b85828601613e2f565b925050602083013567ffffffffffffffff811115613ebc57613ebb613b2f565b5b613ec885828601613e2f565b9150509250929050565b613edb81613c51565b8114613ee5575f80fd5b50565b5f81359050613ef681613ed2565b92915050565b5f8060408385031215613f1257613f11613b2b565b5b5f613f1f85828601613bff565b9250506020613f3085828601613ee8565b9150509250929050565b5f60208284031215613f4f57613f4e613b2b565b5b5f613f5c84828501613bff565b91505092915050565b5f80fd5b5f80fd5b5f8083601f840112613f8257613f81613d30565b5b8235905067ffffffffffffffff811115613f9f57613f9e613f65565b5b602083019150836001820283011115613fbb57613fba613f69565b5b9250929050565b5f805f805f60808688031215613fdb57613fda613b2b565b5b5f613fe888828901613bff565b9550506020613ff988828901613bff565b945050604061400a88828901613b52565b935050606086013567ffffffffffffffff81111561402b5761402a613b2f565b5b61403788828901613f6d565b92509250509295509295909350565b5f806040838503121561405c5761405b613b2b565b5b5f61406985828601613bff565b925050602061407a85828601613bff565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806140c857607f821691505b6020821081036140db576140da614084565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61411882613b33565b915061412383613b33565b925082820390508181111561413b5761413a6140e1565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f82825260208201905092915050565b50565b5f6141b95f8361419b565b91506141c4826141ab565b5f82019050919050565b5f6080820190506141e15f830186613bc1565b6141ee6020830185613bc1565b6141fb6040830184613c84565b818103606083015261420c816141ae565b9050949350505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61424a81614216565b8114614254575f80fd5b50565b5f8151905061426581614241565b92915050565b5f602082840312156142805761427f613b2b565b5b5f61428d84828501614257565b91505092915050565b5f6142a1838561419b565b93506142ae838584613de0565b6142b783613aba565b840190509392505050565b5f6080820190506142d55f830188613bc1565b6142e26020830187613bc1565b6142ef6040830186613c84565b8181036060830152614302818486614296565b90509695505050505050565b5f81905092915050565b5f61432282613a78565b61432c818561430e565b935061433c818560208601613a92565b80840191505092915050565b5f614353828c614318565b915061435f828b614318565b915061436b828a614318565b91506143778289614318565b91506143838288614318565b915061438f8287614318565b915061439b8286614318565b91506143a78285614318565b91506143b38284614318565b91508190509a9950505050505050505050565b7f7b226e616d65223a202254726f766573202300000000000000000000000000005f82015250565b5f6143fa60128361430e565b9150614405826143c6565b601282019050919050565b7f222c20226465736372697074696f6e223a2022556e6c6f636b20746865206d795f8201527f73746572696573206f662054726f7665732c206275696c74206f6e207468652060208201527f45524320343034207374616e646172642c20616e6420656d6261726b206f6e2060408201527f61206a6f75726e6579207468726f75676820616e20657665722d657870616e6460608201527f696e67206d6574617665727365206f66206f6e2d636861696e2074726561737560808201527f72657320616e6420626f756e646c65737320646973636f766572792e222c202260a08201527f696d616765223a2022646174613a696d6167652f7376672b786d6c3b6261736560c08201527f36342c000000000000000000000000000000000000000000000000000000000060e082015250565b5f61454e60e38361430e565b915061455982614410565b60e382019050919050565b7f227d0000000000000000000000000000000000000000000000000000000000005f82015250565b5f61459860028361430e565b91506145a382614564565b600282019050919050565b5f6145b8826143ee565b91506145c48285614318565b91506145cf82614542565b91506145db8284614318565b91506145e68261458c565b91508190509392505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000005f82015250565b5f614626601d8361430e565b9150614631826145f2565b601d82019050919050565b5f6146468261461a565b91506146528284614318565b915081905092915050565b5f6146688285614318565b91506146748284614318565b91508190509392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6146b782613b33565b91506146c283613b33565b9250826146d2576146d1614680565b5b828206905092915050565b7f20000000000000000000000000000000000000000000000000000000000000005f82015250565b5f61471160018361430e565b915061471c826146dd565b600182019050919050565b5f819050815f5260205f209050919050565b5f8154614745816140b1565b61474f818661430e565b9450600182165f8114614769576001811461477e576147b0565b60ff19831686528115158202860193506147b0565b61478785614727565b5f5b838110156147a857815481890152600182019150602081019050614789565b838801955050505b50505092915050565b5f6147c48285614318565b91506147cf82614705565b91506147db8284614739565b91508190509392505050565b7f22000000000000000000000000000000000000000000000000000000000000005f82015250565b5f61481b60018361430e565b9150614826826147e7565b600182019050919050565b7f22200000000000000000000000000000000000000000000000000000000000005f82015250565b5f61486560028361430e565b915061487082614831565b600282019050919050565b5f6148858261480f565b91506148918286614318565b915061489c82614705565b91506148a88285614318565b91506148b382614859565b91506148bf8284614318565b9150819050949350505050565b7f202b3100000000000000000000000000000000000000000000000000000000005f82015250565b5f61490060038361430e565b915061490b826148cc565b600382019050919050565b5f6149208261480f565b915061492c8286614318565b915061493782614705565b91506149438285614318565b915061494e82614859565b915061495a8284614318565b9150614965826148f4565b9150819050949350505050565b5f8160011c9050919050565b5f808291508390505b60018511156149c7578086048111156149a3576149a26140e1565b5b60018516156149b25780820291505b80810290506149c085614972565b9450614987565b94509492505050565b5f826149df5760019050614a9a565b816149ec575f9050614a9a565b8160018114614a025760028114614a0c57614a3b565b6001915050614a9a565b60ff841115614a1e57614a1d6140e1565b5b8360020a915084821115614a3557614a346140e1565b5b50614a9a565b5060208310610133831016604e8410600b8410161715614a705782820a905083811115614a6b57614a6a6140e1565b5b614a9a565b614a7d848484600161497e565b92509050818404811115614a9457614a936140e1565b5b81810290505b9392505050565b5f614aab82613b33565b9150614ab683613cfc565b9250614ae37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846149d0565b905092915050565b5f614af582613b33565b9150614b0083613b33565b925082614b1057614b0f614680565b5b828204905092915050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302614b657fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614b2a565b614b6f8683614b2a565b95508019841693508086168417925050509392505050565b5f819050919050565b5f614baa614ba5614ba084613b33565b614b87565b613b33565b9050919050565b5f819050919050565b614bc383614b90565b614bd7614bcf82614bb1565b848454614b36565b825550505050565b5f90565b614beb614bdf565b614bf6818484614bba565b505050565b5b81811015614c1957614c0e5f82614be3565b600181019050614bfc565b5050565b601f821115614c5e57614c2f81614727565b614c3884614b1b565b81016020851015614c47578190505b614c5b614c5385614b1b565b830182614bfb565b50505b505050565b5f82821c905092915050565b5f614c7e5f1984600802614c63565b1980831691505092915050565b5f614c968383614c6f565b9150826002028217905092915050565b614caf82613a78565b67ffffffffffffffff811115614cc857614cc7613d38565b5b614cd282546140b1565b614cdd828285614c1d565b5f60209050601f831160018114614d0e575f8415614cfc578287015190505b614d068582614c8b565b865550614d6d565b601f198416614d1c86614727565b5f5b82811015614d4357848901518255600182019150602085019450602081019050614d1e565b86831015614d605784890151614d5c601f891682614c6f565b8355505b6001600288020188555050505b505050505050565b5f614d7f82613b33565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614db157614db06140e1565b5b600182019050919050565b5f614dc682613b33565b9150614dd183613b33565b9250828201905080821115614de957614de86140e1565b5b92915050565b5f614df982613b33565b9150614e0483613b33565b9250828202614e1281613b33565b91508282048414831517614e2957614e286140e1565b5b5092915050565b5f614e3b8284614318565b91508190509291505056fe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223136302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223134302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e40696d706f72742075726c282268747470733a2f2f666f6e74732e676f6f676c65617069732e636f6d2f637373323f66616d696c793d42656c6c656661697222293b2e62617365207b2066696c6c3a20236635663566353b20666f6e742d66616d696c793a202242656c6c6566616972222c2073657269663b20666f6e742d73697a653a20313670783b207d202e666f6f746572207b666f6e742d73697a653a20333270783b7d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3e3c7465787420783d223530252220793d223935252220646f6d696e616e742d626173656c696e653d226d6964646c652220746578742d616e63686f723d226d6964646c652220636c6173733d226261736520666f6f746572223e54524f5645532e544543483c2f746578743e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea2646970667358221220154bc9e66abf160188aecd5a069cca0808d560572e3fcf4fcae7bded4b52d10064736f6c63430008180033

Deployed ByteCode Sourcemap

980:10031:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2690:18:0;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3379:46;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5159:621;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6497:127:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2917:36:0;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6176:1663;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;758:147;;;:::i;:::-;;2820:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8124:391;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3049:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10335:153:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4506:109:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4684:187;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6771:127:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3151:44:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;223:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2741;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6224:127:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3975:41:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6361:130:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5945:129;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5828:203:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7895:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8607:422;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6908:123:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7995:2202;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6634:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1039:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3262:64:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3487:68;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6084:130:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1012:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;539:213:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2690:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3379:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;5159:621::-;5259:4;5293:6;;5279:10;:20;;:38;;;;;5316:1;5303:10;:14;5279:38;5275:477;;;5333:13;5349:8;:20;5358:10;5349:20;;;;;;;;;;;;;;;;;;;;;5333:36;;5402:5;5388:19;;:10;:19;;;;:59;;;;;5412:16;:23;5429:5;5412:23;;;;;;;;;;;;;;;:35;5436:10;5412:35;;;;;;;;;;;;;;;;;;;;;;;;;5411:36;5388:59;5384:119;;;5474:14;;;;;;;;;;;;;;5384:119;5543:7;5517:11;:23;5529:10;5517:23;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;5586:7;5570:36;;5579:5;5570:36;;;5595:10;5570:36;;;;;;:::i;:::-;;;;;;;;5319:298;5275:477;;;5670:10;5637:9;:21;5647:10;5637:21;;;;;;;;;;;;;;;:30;5659:7;5637:30;;;;;;;;;;;;;;;:43;;;;5721:7;5700:41;;5709:10;5700:41;;;5730:10;5700:41;;;;;;:::i;:::-;;;;;;;;5275:477;5769:4;5762:11;;5159:621;;;;:::o;6497:127:4:-;6552:13;6584:33;6590:7;6584:33;;;;;;;;;;;;;;;;;6607:9;6584:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:33::i;:::-;6577:40;;6497:127;;;:::o;2917:36:0:-;;;:::o;6176:1663::-;6317:6;;6303:10;:20;6299:1534;;6351:8;:20;6360:10;6351:20;;;;;;;;;;;;;;;;;;;;;6343:28;;:4;:28;;;6339:89;;6398:15;;;;;;;;;;;;;;6339:89;6460:1;6446:16;;:2;:16;;;6442:80;;6489:18;;;;;;;;;;;;;;6442:80;6571:4;6557:18;;:10;:18;;;;:73;;;;;6596:16;:22;6613:4;6596:22;;;;;;;;;;;;;;;:34;6619:10;6596:34;;;;;;;;;;;;;;;;;;;;;;;;;6595:35;6557:73;:130;;;;;6664:11;:23;6676:10;6664:23;;;;;;;;;;;;;;;;;;;;;6650:37;;:10;:37;;;;6557:130;6536:220;;;6727:14;;;;;;;;;;;;;;6536:220;6789:10;:8;:10::i;:::-;6770:9;:15;6780:4;6770:15;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;6859:10;:8;:10::i;:::-;6842:9;:13;6852:2;6842:13;;;;;;;;;;;;;;;;:27;;;;;;;;;;;6921:2;6898:8;:20;6907:10;6898:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;6944:11;:23;6956:10;6944:23;;;;;;;;;;;;6937:30;;;;;;;;;;;7022:17;7042:6;:12;7049:4;7042:12;;;;;;;;;;;;;;;7077:1;7055:6;:12;7062:4;7055:12;;;;;;;;;;;;;;;:19;;;;:23;;;;:::i;:::-;7042:37;;;;;;;;:::i;:::-;;;;;;;;;;7022:57;;7133:9;7093:6;:12;7100:4;7093:12;;;;;;;;;;;;;;;7106:11;:23;7118:10;7106:23;;;;;;;;;;;;7093:37;;;;;;;;:::i;:::-;;;;;;;;;:49;;;;7175:6;:12;7182:4;7175:12;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7277:11;:23;7289:10;7277:23;;;;;;;;;;;;7252:11;:22;7264:9;7252:22;;;;;;;;;;;:48;;;;7352:6;:10;7359:2;7352:10;;;;;;;;;;;;;;;7368;7352:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7480:1;7460:6;:10;7467:2;7460:10;;;;;;;;;;;;;;;:17;;;;:21;;;;:::i;:::-;7434:11;:23;7446:10;7434:23;;;;;;;;;;;:47;;;;7520:10;7516:2;7501:30;;7510:4;7501:30;;;;;;;;;;;;7570:2;7550:35;;7564:4;7550:35;;;7574:10;:8;:10::i;:::-;7550:35;;;;;;:::i;:::-;;;;;;;;6325:1271;6299:1534;;;7616:15;7634:9;:15;7644:4;7634:15;;;;;;;;;;;;;;;:27;7650:10;7634:27;;;;;;;;;;;;;;;;7616:45;;7691:17;7680:7;:28;7676:100;;7766:10;7756:7;:20;;;;:::i;:::-;7726:9;:15;7736:4;7726:15;;;;;;;;;;;;;;;:27;7742:10;7726:27;;;;;;;;;;;;;;;:50;;;;7676:100;7791:31;7801:4;7807:2;7811:10;7791:9;:31::i;:::-;;7602:231;6299:1534;6176:1663;;;:::o;758:147::-;307:5;;;;;;;;;;293:19;;:10;:19;;;289:46;;321:14;;;;;;;;;;;;;;289:46;836:1:::1;820:5:::0;::::1;:18;;;;;;;;;;;;;;;;;;895:1;854:44;;875:10;854:44;;;;;;;;;;;;758:147::o:0;2820:31::-;;;:::o;8124:391::-;8243:26;8256:4;8262:2;8266;8243:12;:26::i;:::-;8315:1;8297:2;:14;;;:19;;:152;;;;;8409:40;;;8332:117;;;8347:2;8332:35;;;8368:10;8380:4;8386:2;8332:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:117;;;;;8297:152;8280:229;;;8481:17;;;;;;;;;;;;;;8280:229;8124:391;;;:::o;3049:21::-;;;;:::o;10335:153:4:-;307:5:0;;;;;;;;;;293:19;;:10;:19;;;289:46;;321:14;;;;;;;;;;;;;;289:46;10451:30:4::1;10466:5;10473:7;10451:14;:30::i;:::-;10335:153:::0;;:::o;4506:109:0:-;307:5;;;;;;;;;;293:19;;:10;:19;;;289:46;;321:14;;;;;;;;;;;;;;289:46;4603:5:::1;4583:9;:17;4593:6;4583:17;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;4506:109:::0;;:::o;4684:187::-;4742:13;4775:8;:12;4784:2;4775:12;;;;;;;;;;;;;;;;;;;;;4767:20;;4819:1;4802:19;;:5;:19;;;4798:67;;4844:10;;;;;;;;;;;;;;4798:67;4684:187;;;:::o;6771:127:4:-;6826:13;6858:33;6864:7;6858:33;;;;;;;;;;;;;;;;;6881:9;6858:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:33::i;:::-;6851:40;;6771:127;;;:::o;3151:44:0:-;;;;;;;;;;;;;;;;;:::o;223:20::-;;;;;;;;;;;;:::o;2741:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6224:127:4:-;6279:13;6311:33;6317:7;6311:33;;;;;;;;;;;;;;;;;6334:9;6311:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:33::i;:::-;6304:40;;6224:127;;;:::o;3975:41:0:-;;;;;;;;;;;;;;;;;;;;;;:::o;6361:130:4:-;6417:13;6449:35;6455:7;6449:35;;;;;;;;;;;;;;;;;6473:10;6449:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:35::i;:::-;6442:42;;6361:130;;;:::o;5945:129::-;6002:13;6034:33;6040:7;6034:33;;;;;;;;;;;;;;;;;6059:7;6034:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:33::i;:::-;6027:40;;5945:129;;;:::o;5828:203:0:-;5954:8;5913:16;:28;5930:10;5913:28;;;;;;;;;;;;;;;:38;5942:8;5913:38;;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;6005:8;5978:46;;5993:10;5978:46;;;6015:8;5978:46;;;;;;:::i;:::-;;;;;;;;5828:203;;:::o;7895:155::-;7987:4;8010:33;8020:10;8032:2;8036:6;8010:9;:33::i;:::-;8003:40;;7895:155;;;;:::o;8607:422::-;8755:26;8768:4;8774:2;8778;8755:12;:26::i;:::-;8827:1;8809:2;:14;;;:19;;:154;;;;;8923:40;;;8844:119;;;8859:2;8844:35;;;8880:10;8892:4;8898:2;8902:4;;8844:63;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:119;;;;;8809:154;8792:231;;;8995:17;;;;;;;;;;;;;;8792:231;8607:422;;;;;:::o;6908:123:4:-;6963:13;6995:29;7001:7;6995:29;;;;;;;;;;;;;;;;;7018:5;6995:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:29::i;:::-;6988:36;;6908:123;;;:::o;7995:2202::-;8060:13;8085:23;;:::i;:::-;8118:482;;;;;;;;;;;;;;;;;:5;8124:1;8118:8;;;;;;;:::i;:::-;;;;;:482;;;;8622:18;8632:7;8622:9;:18::i;:::-;8611:5;8617:1;8611:8;;;;;;;:::i;:::-;;;;;:29;;;;8651:53;;;;;;;;;;;;;;;;;:5;8657:1;8651:8;;;;;;;:::i;:::-;;;;;:53;;;;8726:17;8735:7;8726:8;:17::i;:::-;8715:5;8721:1;8715:8;;;;;;;:::i;:::-;;;;;:28;;;;8754:53;;;;;;;;;;;;;;;;;:5;8760:1;8754:8;;;;;;;:::i;:::-;;;;;:53;;;;8829:16;8837:7;8829;:16::i;:::-;8818:5;8824:1;8818:8;;;;;;;:::i;:::-;;;;;:27;;;;8856:53;;;;;;;;;;;;;;;;;:5;8862:1;8856:8;;;;;;;:::i;:::-;;;;;:53;;;;8931:17;8940:7;8931:8;:17::i;:::-;8920:5;8926:1;8920:8;;;;;;;:::i;:::-;;;;;:28;;;;8959:54;;;;;;;;;;;;;;;;;:5;8965:1;8959:8;;;;;;;:::i;:::-;;;;;:54;;;;9035:16;9043:7;9035;:16::i;:::-;9024:5;9030:1;9024:8;;;;;;;:::i;:::-;;;;;:27;;;;9062:55;;;;;;;;;;;;;;;;;:5;9068:2;9062:9;;;;;;;:::i;:::-;;;;;:55;;;;9140:16;9148:7;9140;:16::i;:::-;9128:5;9134:2;9128:9;;;;;;;:::i;:::-;;;;;:28;;;;9167:55;;;;;;;;;;;;;;;;;:5;9173:2;9167:9;;;;;;;:::i;:::-;;;;;:55;;;;9245:16;9253:7;9245;:16::i;:::-;9233:5;9239:2;9233:9;;;;;;;:::i;:::-;;;;;:28;;;;9272:55;;;;;;;;;;;;;;;;;:5;9278:2;9272:9;;;;;;;:::i;:::-;;;;;:55;;;;9350:16;9358:7;9350;:16::i;:::-;9338:5;9344:2;9338:9;;;;;;;:::i;:::-;;;;;:28;;;;9377:27;;;;;;;;;;;;;;;;;:5;9383:2;9377:9;;;;;;;:::i;:::-;;;;;:27;;;;9415:20;9462:5;9468:1;9462:8;;;;;;;:::i;:::-;;;;;;9472:5;9478:1;9472:8;;;;;;;:::i;:::-;;;;;;9482:5;9488:1;9482:8;;;;;;;:::i;:::-;;;;;;9492:5;9498:1;9492:8;;;;;;;:::i;:::-;;;;;;9502:5;9508:1;9502:8;;;;;;;:::i;:::-;;;;;;9512:5;9518:1;9512:8;;;;;;;:::i;:::-;;;;;;9522:5;9528:1;9522:8;;;;;;;:::i;:::-;;;;;;9532:5;9538:1;9532:8;;;;;;;:::i;:::-;;;;;;9542:5;9548:1;9542:8;;;;;;;:::i;:::-;;;;;;9445:106;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;9415:137;;9595:6;9603:5;9609:1;9603:8;;;;;;;:::i;:::-;;;;;;9613:5;9619:2;9613:9;;;;;;;:::i;:::-;;;;;;9624:5;9630:2;9624:9;;;;;;;:::i;:::-;;;;;;9635:5;9641:2;9635:9;;;;;;;:::i;:::-;;;;;;9646:5;9652:2;9646:9;;;;;;;:::i;:::-;;;;;;9657:5;9663:2;9657:9;;;;;;;:::i;:::-;;;;;;9668:5;9674:2;9668:9;;;;;;;:::i;:::-;;;;;;9679:5;9685:2;9679:9;;;;;;;:::i;:::-;;;;;;9578:111;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;9562:128;;9709:18;9730:354;9796:17;9805:7;9796:8;:17::i;:::-;10046:28;10066:6;10046:13;:28::i;:::-;9757:324;;;;;;;;;:::i;:::-;;;;;;;;;;;;;9730:13;:354::i;:::-;9709:375;;10160:4;10110:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;10094:72;;10184:6;10177:13;;;;;7995:2202;;;:::o;6634:127::-;6689:13;6721:33;6727:7;6721:33;;;;;;;;;;;;;;;;;6744:9;6721:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:33::i;:::-;6714:40;;6634:127;;;:::o;1039:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3262:64:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3487:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6084:130:4:-;6140:13;6172:35;6178:7;6172:35;;;;;;;;;;;;;;;;;6196:10;6172:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:35::i;:::-;6165:42;;6084:130;;;:::o;1012:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;539:213:0:-;307:5;;;;;;;;;;293:19;;:10;:19;;;289:46;;321:14;;;;;;;;;;;;;;289:46;639:1:::1;621:20;;:6;:20;;::::0;617:47:::1;;650:14;;;;;;;;;;;;;;617:47;683:6;675:5;::::0;:14:::1;;;;;;;;;;;;;;;;;;738:6;705:40;;726:10;705:40;;;;;;;;;;;;539:213:::0;:::o;7037:952:4:-;7146:13;7171:12;7186:62;7217:9;7228:17;7237:7;7228:8;:17::i;:::-;7200:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7186:6;:62::i;:::-;7171:77;;7258:20;7281:11;7300;:18;7293:4;:25;;;;:::i;:::-;7281:38;;;;;;;;:::i;:::-;;;;;;;;7258:61;;7329:17;7356:2;7349:4;:9;;;;:::i;:::-;7329:29;;7384:2;7372:9;:14;7368:125;;;7435:6;7448:8;7464;:15;;;;7457:4;:22;;;;:::i;:::-;7448:32;;;;;;;;:::i;:::-;;;;;;;;;7418:63;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7402:80;;7368:125;7519:2;7506:9;:15;7502:458;;7537:21;;:::i;:::-;7582:12;7602;:19;;;;7595:4;:26;;;;:::i;:::-;7582:40;;;;;;;;:::i;:::-;;;;;;;;;7572:50;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;7577:1;7572:7;;;;;;;:::i;:::-;;;;;:50;;;;7646:12;7666;:19;;;;7659:4;:26;;;;:::i;:::-;7646:40;;;;;;;;:::i;:::-;;;;;;;;;7636:50;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;7641:1;7636:7;;;;;;;:::i;:::-;;;;;:50;;;;7717:2;7704:9;:15;7700:250;;7777:4;7782:1;7777:7;;;;;;;:::i;:::-;;;;;;7791:4;7796:1;7791:7;;;;;;;:::i;:::-;;;;;;7806:6;7755:58;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7739:75;;7700:250;;;7891:4;7896:1;7891:7;;;;;;;:::i;:::-;;;;;;7905:4;7910:1;7905:7;;;;;;;:::i;:::-;;;;;;7920:6;7869:65;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7853:82;;7700:250;7523:437;7502:458;7976:6;7969:13;;;;;7037:952;;;;;:::o;10188:90:0:-;10231:7;10263:8;10257:2;:14;;;;:::i;:::-;10250:21;;10188:90;:::o;9094:1058::-;9203:4;9219:12;9234:10;:8;:10::i;:::-;9219:25;;9254:27;9284:9;:15;9294:4;9284:15;;;;;;;;;;;;;;;;9254:45;;9309:29;9341:9;:13;9351:2;9341:13;;;;;;;;;;;;;;;;9309:45;;9384:6;9365:9;:15;9375:4;9365:15;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;9442:6;9425:9;:13;9435:2;9425:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;9529:9;:15;9539:4;9529:15;;;;;;;;;;;;;;;;;;;;;;;;;9524:245;;9560:22;9651:4;9633:9;:15;9643:4;9633:15;;;;;;;;;;;;;;;;:22;;;;:::i;:::-;9608:4;9586:19;:26;;;;:::i;:::-;9585:71;;;;:::i;:::-;9560:96;;9675:9;9670:89;9694:14;9690:1;:18;9670:89;;;9733:11;9739:4;9733:5;:11::i;:::-;9710:3;;;;;;;9670:89;;;;9546:223;9524:245;9842:9;:13;9852:2;9842:13;;;;;;;;;;;;;;;;;;;;;;;;;9837:241;;9871:22;9962:4;9938:21;:28;;;;:::i;:::-;9913:4;9897:9;:13;9907:2;9897:13;;;;;;;;;;;;;;;;:20;;;;:::i;:::-;9896:71;;;;:::i;:::-;9871:96;;9986:9;9981:87;10005:14;10001:1;:18;9981:87;;;10044:9;10050:2;10044:5;:9::i;:::-;10021:3;;;;;;;9981:87;;;;9857:221;9837:241;10113:2;10093:31;;10107:4;10093:31;;;10117:6;10093:31;;;;;;:::i;:::-;;;;;;;;10141:4;10134:11;;;;;9094:1058;;;;;:::o;11111:154::-;11227:5;11220:4;:12;;;;;;:::i;:::-;;11251:7;11242:6;:16;;;;;;:::i;:::-;;11111:154;;:::o;10494:515:4:-;10550:13;10588:1;10579:5;:10;10575:51;;10605:10;;;;;;;;;;;;;;;;;;;;;10575:51;10635:12;10650:5;10635:20;;10665:14;10689:75;10704:1;10696:4;:9;10689:75;;10721:8;;;;;:::i;:::-;;;;10751:2;10743:10;;;;;:::i;:::-;;;10689:75;;;10773:19;10805:6;10795:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10773:39;;10822:150;10838:1;10829:5;:10;10822:150;;10865:1;10855:11;;;;;:::i;:::-;;;10931:2;10923:5;:10;;;;:::i;:::-;10910:2;:24;;;;:::i;:::-;10897:39;;10880:6;10887;10880:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;10959:2;10950:11;;;;;:::i;:::-;;;10822:150;;;10995:6;10981:21;;;;;10494:515;;;;:::o;11203:1557::-;11261:13;11286:11;11300:4;:11;11286:25;;11332:1;11325:3;:8;11321:23;;11335:9;;;;;;;;;;;;;;;;;11321:23;11393:18;11431:1;11426;11420:3;:7;;;;:::i;:::-;11419:13;;;;:::i;:::-;11414:1;:19;;;;:::i;:::-;11393:40;;11488:19;11533:2;11520:10;:15;;;;:::i;:::-;11510:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11488:48;;11547:18;11568:5;;;;;;;;;;;;;;;;;11547:26;;11634:1;11627:5;11623:13;11678:2;11670:6;11666:15;11726:1;11695:757;11748:3;11745:1;11742:10;11695:757;;;11800:1;11797;11793:9;11788:14;;11857:8;11852:1;11846:4;11842:12;11836:19;11832:34;11935:4;11927:5;11923:2;11919:14;11915:25;11905:8;11901:40;11895:47;11973:3;11970:1;11966:11;11959:18;;12063:4;12054;12046:5;12042:2;12038:14;12034:25;12024:8;12020:40;12014:47;12010:58;12005:3;12001:68;11994:75;;12100:3;12097:1;12093:11;12086:18;;12189:4;12180;12172:5;12169:1;12165:13;12161:24;12151:8;12147:39;12141:46;12137:57;12132:3;12128:67;12121:74;;12226:3;12223:1;12219:11;12212:18;;12307:4;12298;12291:5;12287:16;12277:8;12273:31;12267:38;12263:49;12258:3;12254:59;12247:66;;12346:3;12341;12337:13;12330:20;;12386:3;12375:9;12368:22;12436:1;12425:9;12421:17;12408:30;;11770:682;;11695:757;;;11699:42;12482:1;12477:3;12473:11;12502:1;12497:82;;;;12597:1;12592:80;;;;12466:206;;12497:82;12557:6;12552:3;12548:16;12544:1;12533:9;12529:17;12522:43;12497:82;;12592:80;12652:4;12647:3;12643:14;12639:1;12628:9;12624:17;12617:41;12466:206;;12701:10;12693:6;12686:26;11593:1129;;12746:6;12732:21;;;;;;11203:1557;;;;:::o;5799:136::-;5859:7;5920:5;5903:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;5893:34;;;;;;5885:43;;5878:50;;5799:136;;;:::o;10744:361:0:-;10820:1;10804:18;;:4;:18;;;10800:71;;10845:15;;;;;;;;;;;;;;10800:71;10881:10;10894:6;:12;10901:4;10894:12;;;;;;;;;;;;;;;10929:1;10907:6;:12;10914:4;10907:12;;;;;;;;;;;;;;;:19;;;;:23;;;;:::i;:::-;10894:37;;;;;;;;:::i;:::-;;;;;;;;;;10881:50;;10941:6;:12;10948:4;10941:12;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;10976:11;:15;10988:2;10976:15;;;;;;;;;;;10969:22;;;11008:8;:12;11017:2;11008:12;;;;;;;;;;;;11001:19;;;;;;;;;;;11037:11;:15;11049:2;11037:15;;;;;;;;;;;;11030:22;;;;;;;;;;;11095:2;11091:1;11068:30;;11077:4;11068:30;;;;;;;;;;;;10790:315;10744:361;:::o;10284:454::-;10356:1;10342:16;;:2;:16;;;10338:72;;10381:18;;;;;;;;;;;;;;10338:72;10444:6;;:8;;;;;;;;;;;;;10473:10;10486:6;;10473:19;;10531:1;10507:26;;:8;:12;10516:2;10507:12;;;;;;;;;;;;;;;;;;;;;:26;;;10503:79;;10556:15;;;;;;;;;;;;;;10503:79;10607:2;10592:8;:12;10601:2;10592:12;;;;;;;;;;;;:17;;;;;;;;;;;;;;;;;;10619:6;:10;10626:2;10619:10;;;;;;;;;;;;;;;10635:2;10619:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10686:1;10666:6;:10;10673:2;10666:10;;;;;;;;;;;;;;;:17;;;;:21;;;;:::i;:::-;10648:11;:15;10660:2;10648:15;;;;;;;;;;;:39;;;;10728:2;10724;10703:28;;10720:1;10703:28;;;;;;;;;;;;10328:410;10284:454;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:99:5:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1349:75::-;1382:6;1415:2;1409:9;1399:19;;1349:75;:::o;1430:117::-;1539:1;1536;1529:12;1553:117;1662:1;1659;1652:12;1676:77;1713:7;1742:5;1731:16;;1676:77;;;:::o;1759:122::-;1832:24;1850:5;1832:24;:::i;:::-;1825:5;1822:35;1812:63;;1871:1;1868;1861:12;1812:63;1759:122;:::o;1887:139::-;1933:5;1971:6;1958:20;1949:29;;1987:33;2014:5;1987:33;:::i;:::-;1887:139;;;;:::o;2032:329::-;2091:6;2140:2;2128:9;2119:7;2115:23;2111:32;2108:119;;;2146:79;;:::i;:::-;2108:119;2266:1;2291:53;2336:7;2327:6;2316:9;2312:22;2291:53;:::i;:::-;2281:63;;2237:117;2032:329;;;;:::o;2367:126::-;2404:7;2444:42;2437:5;2433:54;2422:65;;2367:126;;;:::o;2499:96::-;2536:7;2565:24;2583:5;2565:24;:::i;:::-;2554:35;;2499:96;;;:::o;2601:118::-;2688:24;2706:5;2688:24;:::i;:::-;2683:3;2676:37;2601:118;;:::o;2725:222::-;2818:4;2856:2;2845:9;2841:18;2833:26;;2869:71;2937:1;2926:9;2922:17;2913:6;2869:71;:::i;:::-;2725:222;;;;:::o;2953:122::-;3026:24;3044:5;3026:24;:::i;:::-;3019:5;3016:35;3006:63;;3065:1;3062;3055:12;3006:63;2953:122;:::o;3081:139::-;3127:5;3165:6;3152:20;3143:29;;3181:33;3208:5;3181:33;:::i;:::-;3081:139;;;;:::o;3226:474::-;3294:6;3302;3351:2;3339:9;3330:7;3326:23;3322:32;3319:119;;;3357:79;;:::i;:::-;3319:119;3477:1;3502:53;3547:7;3538:6;3527:9;3523:22;3502:53;:::i;:::-;3492:63;;3448:117;3604:2;3630:53;3675:7;3666:6;3655:9;3651:22;3630:53;:::i;:::-;3620:63;;3575:118;3226:474;;;;;:::o;3706:90::-;3740:7;3783:5;3776:13;3769:21;3758:32;;3706:90;;;:::o;3802:109::-;3883:21;3898:5;3883:21;:::i;:::-;3878:3;3871:34;3802:109;;:::o;3917:210::-;4004:4;4042:2;4031:9;4027:18;4019:26;;4055:65;4117:1;4106:9;4102:17;4093:6;4055:65;:::i;:::-;3917:210;;;;:::o;4133:118::-;4220:24;4238:5;4220:24;:::i;:::-;4215:3;4208:37;4133:118;;:::o;4257:222::-;4350:4;4388:2;4377:9;4373:18;4365:26;;4401:71;4469:1;4458:9;4454:17;4445:6;4401:71;:::i;:::-;4257:222;;;;:::o;4485:619::-;4562:6;4570;4578;4627:2;4615:9;4606:7;4602:23;4598:32;4595:119;;;4633:79;;:::i;:::-;4595:119;4753:1;4778:53;4823:7;4814:6;4803:9;4799:22;4778:53;:::i;:::-;4768:63;;4724:117;4880:2;4906:53;4951:7;4942:6;4931:9;4927:22;4906:53;:::i;:::-;4896:63;;4851:118;5008:2;5034:53;5079:7;5070:6;5059:9;5055:22;5034:53;:::i;:::-;5024:63;;4979:118;4485:619;;;;;:::o;5110:86::-;5145:7;5185:4;5178:5;5174:16;5163:27;;5110:86;;;:::o;5202:112::-;5285:22;5301:5;5285:22;:::i;:::-;5280:3;5273:35;5202:112;;:::o;5320:214::-;5409:4;5447:2;5436:9;5432:18;5424:26;;5460:67;5524:1;5513:9;5509:17;5500:6;5460:67;:::i;:::-;5320:214;;;;:::o;5540:117::-;5649:1;5646;5639:12;5663:117;5772:1;5769;5762:12;5786:180;5834:77;5831:1;5824:88;5931:4;5928:1;5921:15;5955:4;5952:1;5945:15;5972:281;6055:27;6077:4;6055:27;:::i;:::-;6047:6;6043:40;6185:6;6173:10;6170:22;6149:18;6137:10;6134:34;6131:62;6128:88;;;6196:18;;:::i;:::-;6128:88;6236:10;6232:2;6225:22;6015:238;5972:281;;:::o;6259:129::-;6293:6;6320:20;;:::i;:::-;6310:30;;6349:33;6377:4;6369:6;6349:33;:::i;:::-;6259:129;;;:::o;6394:308::-;6456:4;6546:18;6538:6;6535:30;6532:56;;;6568:18;;:::i;:::-;6532:56;6606:29;6628:6;6606:29;:::i;:::-;6598:37;;6690:4;6684;6680:15;6672:23;;6394:308;;;:::o;6708:146::-;6805:6;6800:3;6795;6782:30;6846:1;6837:6;6832:3;6828:16;6821:27;6708:146;;;:::o;6860:425::-;6938:5;6963:66;6979:49;7021:6;6979:49;:::i;:::-;6963:66;:::i;:::-;6954:75;;7052:6;7045:5;7038:21;7090:4;7083:5;7079:16;7128:3;7119:6;7114:3;7110:16;7107:25;7104:112;;;7135:79;;:::i;:::-;7104:112;7225:54;7272:6;7267:3;7262;7225:54;:::i;:::-;6944:341;6860:425;;;;;:::o;7305:340::-;7361:5;7410:3;7403:4;7395:6;7391:17;7387:27;7377:122;;7418:79;;:::i;:::-;7377:122;7535:6;7522:20;7560:79;7635:3;7627:6;7620:4;7612:6;7608:17;7560:79;:::i;:::-;7551:88;;7367:278;7305:340;;;;:::o;7651:834::-;7739:6;7747;7796:2;7784:9;7775:7;7771:23;7767:32;7764:119;;;7802:79;;:::i;:::-;7764:119;7950:1;7939:9;7935:17;7922:31;7980:18;7972:6;7969:30;7966:117;;;8002:79;;:::i;:::-;7966:117;8107:63;8162:7;8153:6;8142:9;8138:22;8107:63;:::i;:::-;8097:73;;7893:287;8247:2;8236:9;8232:18;8219:32;8278:18;8270:6;8267:30;8264:117;;;8300:79;;:::i;:::-;8264:117;8405:63;8460:7;8451:6;8440:9;8436:22;8405:63;:::i;:::-;8395:73;;8190:288;7651:834;;;;;:::o;8491:116::-;8561:21;8576:5;8561:21;:::i;:::-;8554:5;8551:32;8541:60;;8597:1;8594;8587:12;8541:60;8491:116;:::o;8613:133::-;8656:5;8694:6;8681:20;8672:29;;8710:30;8734:5;8710:30;:::i;:::-;8613:133;;;;:::o;8752:468::-;8817:6;8825;8874:2;8862:9;8853:7;8849:23;8845:32;8842:119;;;8880:79;;:::i;:::-;8842:119;9000:1;9025:53;9070:7;9061:6;9050:9;9046:22;9025:53;:::i;:::-;9015:63;;8971:117;9127:2;9153:50;9195:7;9186:6;9175:9;9171:22;9153:50;:::i;:::-;9143:60;;9098:115;8752:468;;;;;:::o;9226:329::-;9285:6;9334:2;9322:9;9313:7;9309:23;9305:32;9302:119;;;9340:79;;:::i;:::-;9302:119;9460:1;9485:53;9530:7;9521:6;9510:9;9506:22;9485:53;:::i;:::-;9475:63;;9431:117;9226:329;;;;:::o;9561:117::-;9670:1;9667;9660:12;9684:117;9793:1;9790;9783:12;9820:552;9877:8;9887:6;9937:3;9930:4;9922:6;9918:17;9914:27;9904:122;;9945:79;;:::i;:::-;9904:122;10058:6;10045:20;10035:30;;10088:18;10080:6;10077:30;10074:117;;;10110:79;;:::i;:::-;10074:117;10224:4;10216:6;10212:17;10200:29;;10278:3;10270:4;10262:6;10258:17;10248:8;10244:32;10241:41;10238:128;;;10285:79;;:::i;:::-;10238:128;9820:552;;;;;:::o;10378:963::-;10475:6;10483;10491;10499;10507;10556:3;10544:9;10535:7;10531:23;10527:33;10524:120;;;10563:79;;:::i;:::-;10524:120;10683:1;10708:53;10753:7;10744:6;10733:9;10729:22;10708:53;:::i;:::-;10698:63;;10654:117;10810:2;10836:53;10881:7;10872:6;10861:9;10857:22;10836:53;:::i;:::-;10826:63;;10781:118;10938:2;10964:53;11009:7;11000:6;10989:9;10985:22;10964:53;:::i;:::-;10954:63;;10909:118;11094:2;11083:9;11079:18;11066:32;11125:18;11117:6;11114:30;11111:117;;;11147:79;;:::i;:::-;11111:117;11260:64;11316:7;11307:6;11296:9;11292:22;11260:64;:::i;:::-;11242:82;;;;11037:297;10378:963;;;;;;;;:::o;11347:474::-;11415:6;11423;11472:2;11460:9;11451:7;11447:23;11443:32;11440:119;;;11478:79;;:::i;:::-;11440:119;11598:1;11623:53;11668:7;11659:6;11648:9;11644:22;11623:53;:::i;:::-;11613:63;;11569:117;11725:2;11751:53;11796:7;11787:6;11776:9;11772:22;11751:53;:::i;:::-;11741:63;;11696:118;11347:474;;;;;:::o;11827:180::-;11875:77;11872:1;11865:88;11972:4;11969:1;11962:15;11996:4;11993:1;11986:15;12013:320;12057:6;12094:1;12088:4;12084:12;12074:22;;12141:1;12135:4;12131:12;12162:18;12152:81;;12218:4;12210:6;12206:17;12196:27;;12152:81;12280:2;12272:6;12269:14;12249:18;12246:38;12243:84;;12299:18;;:::i;:::-;12243:84;12064:269;12013:320;;;:::o;12339:180::-;12387:77;12384:1;12377:88;12484:4;12481:1;12474:15;12508:4;12505:1;12498:15;12525:194;12565:4;12585:20;12603:1;12585:20;:::i;:::-;12580:25;;12619:20;12637:1;12619:20;:::i;:::-;12614:25;;12663:1;12660;12656:9;12648:17;;12687:1;12681:4;12678:11;12675:37;;;12692:18;;:::i;:::-;12675:37;12525:194;;;;:::o;12725:180::-;12773:77;12770:1;12763:88;12870:4;12867:1;12860:15;12894:4;12891:1;12884:15;12911:180;12959:77;12956:1;12949:88;13056:4;13053:1;13046:15;13080:4;13077:1;13070:15;13097:168;13180:11;13214:6;13209:3;13202:19;13254:4;13249:3;13245:14;13230:29;;13097:168;;;;:::o;13271:114::-;;:::o;13391:362::-;13532:3;13553:65;13616:1;13611:3;13553:65;:::i;:::-;13546:72;;13627:93;13716:3;13627:93;:::i;:::-;13745:1;13740:3;13736:11;13729:18;;13391:362;;;:::o;13759:748::-;14008:4;14046:3;14035:9;14031:19;14023:27;;14060:71;14128:1;14117:9;14113:17;14104:6;14060:71;:::i;:::-;14141:72;14209:2;14198:9;14194:18;14185:6;14141:72;:::i;:::-;14223;14291:2;14280:9;14276:18;14267:6;14223:72;:::i;:::-;14342:9;14336:4;14332:20;14327:2;14316:9;14312:18;14305:48;14370:130;14495:4;14370:130;:::i;:::-;14362:138;;13759:748;;;;;;:::o;14513:149::-;14549:7;14589:66;14582:5;14578:78;14567:89;;14513:149;;;:::o;14668:120::-;14740:23;14757:5;14740:23;:::i;:::-;14733:5;14730:34;14720:62;;14778:1;14775;14768:12;14720:62;14668:120;:::o;14794:141::-;14850:5;14881:6;14875:13;14866:22;;14897:32;14923:5;14897:32;:::i;:::-;14794:141;;;;:::o;14941:349::-;15010:6;15059:2;15047:9;15038:7;15034:23;15030:32;15027:119;;;15065:79;;:::i;:::-;15027:119;15185:1;15210:63;15265:7;15256:6;15245:9;15241:22;15210:63;:::i;:::-;15200:73;;15156:127;14941:349;;;;:::o;15318:314::-;15414:3;15435:70;15498:6;15493:3;15435:70;:::i;:::-;15428:77;;15515:56;15564:6;15559:3;15552:5;15515:56;:::i;:::-;15596:29;15618:6;15596:29;:::i;:::-;15591:3;15587:39;15580:46;;15318:314;;;;;:::o;15638:660::-;15843:4;15881:3;15870:9;15866:19;15858:27;;15895:71;15963:1;15952:9;15948:17;15939:6;15895:71;:::i;:::-;15976:72;16044:2;16033:9;16029:18;16020:6;15976:72;:::i;:::-;16058;16126:2;16115:9;16111:18;16102:6;16058:72;:::i;:::-;16177:9;16171:4;16167:20;16162:2;16151:9;16147:18;16140:48;16205:86;16286:4;16277:6;16269;16205:86;:::i;:::-;16197:94;;15638:660;;;;;;;;:::o;16304:148::-;16406:11;16443:3;16428:18;;16304:148;;;;:::o;16458:390::-;16564:3;16592:39;16625:5;16592:39;:::i;:::-;16647:89;16729:6;16724:3;16647:89;:::i;:::-;16640:96;;16745:65;16803:6;16798:3;16791:4;16784:5;16780:16;16745:65;:::i;:::-;16835:6;16830:3;16826:16;16819:23;;16568:280;16458:390;;;;:::o;16854:1555::-;17370:3;17392:95;17483:3;17474:6;17392:95;:::i;:::-;17385:102;;17504:95;17595:3;17586:6;17504:95;:::i;:::-;17497:102;;17616:95;17707:3;17698:6;17616:95;:::i;:::-;17609:102;;17728:95;17819:3;17810:6;17728:95;:::i;:::-;17721:102;;17840:95;17931:3;17922:6;17840:95;:::i;:::-;17833:102;;17952:95;18043:3;18034:6;17952:95;:::i;:::-;17945:102;;18064:95;18155:3;18146:6;18064:95;:::i;:::-;18057:102;;18176:95;18267:3;18258:6;18176:95;:::i;:::-;18169:102;;18288:95;18379:3;18370:6;18288:95;:::i;:::-;18281:102;;18400:3;18393:10;;16854:1555;;;;;;;;;;;;:::o;18415:214::-;18555:66;18551:1;18543:6;18539:14;18532:90;18415:214;:::o;18635:402::-;18795:3;18816:85;18898:2;18893:3;18816:85;:::i;:::-;18809:92;;18910:93;18999:3;18910:93;:::i;:::-;19028:2;19023:3;19019:12;19012:19;;18635:402;;;:::o;19043:736::-;19183:66;19179:1;19171:6;19167:14;19160:90;19284:34;19279:2;19271:6;19267:15;19260:59;19353:34;19348:2;19340:6;19336:15;19329:59;19422:34;19417:2;19409:6;19405:15;19398:59;19492:34;19486:3;19478:6;19474:16;19467:60;19562:66;19556:3;19548:6;19544:16;19537:92;19664:66;19658:3;19650:6;19646:16;19639:92;19766:5;19760:3;19752:6;19748:16;19741:31;19043:736;:::o;19785:404::-;19945:3;19966:86;20048:3;20043;19966:86;:::i;:::-;19959:93;;20061;20150:3;20061:93;:::i;:::-;20179:3;20174;20170:13;20163:20;;19785:404;;;:::o;20195:214::-;20335:66;20331:1;20323:6;20319:14;20312:90;20195:214;:::o;20415:400::-;20575:3;20596:84;20678:1;20673:3;20596:84;:::i;:::-;20589:91;;20689:93;20778:3;20689:93;:::i;:::-;20807:1;20802:3;20798:11;20791:18;;20415:400;;;:::o;20821:1233::-;21304:3;21326:148;21470:3;21326:148;:::i;:::-;21319:155;;21491:95;21582:3;21573:6;21491:95;:::i;:::-;21484:102;;21603:148;21747:3;21603:148;:::i;:::-;21596:155;;21768:95;21859:3;21850:6;21768:95;:::i;:::-;21761:102;;21880:148;22024:3;21880:148;:::i;:::-;21873:155;;22045:3;22038:10;;20821:1233;;;;;:::o;22060:179::-;22200:31;22196:1;22188:6;22184:14;22177:55;22060:179;:::o;22245:402::-;22405:3;22426:85;22508:2;22503:3;22426:85;:::i;:::-;22419:92;;22520:93;22609:3;22520:93;:::i;:::-;22638:2;22633:3;22629:12;22622:19;;22245:402;;;:::o;22653:541::-;22886:3;22908:148;23052:3;22908:148;:::i;:::-;22901:155;;23073:95;23164:3;23155:6;23073:95;:::i;:::-;23066:102;;23185:3;23178:10;;22653:541;;;;:::o;23200:435::-;23380:3;23402:95;23493:3;23484:6;23402:95;:::i;:::-;23395:102;;23514:95;23605:3;23596:6;23514:95;:::i;:::-;23507:102;;23626:3;23619:10;;23200:435;;;;;:::o;23641:180::-;23689:77;23686:1;23679:88;23786:4;23783:1;23776:15;23810:4;23807:1;23800:15;23827:176;23859:1;23876:20;23894:1;23876:20;:::i;:::-;23871:25;;23910:20;23928:1;23910:20;:::i;:::-;23905:25;;23949:1;23939:35;;23954:18;;:::i;:::-;23939:35;23995:1;23992;23988:9;23983:14;;23827:176;;;;:::o;24009:151::-;24149:3;24145:1;24137:6;24133:14;24126:27;24009:151;:::o;24166:400::-;24326:3;24347:84;24429:1;24424:3;24347:84;:::i;:::-;24340:91;;24440:93;24529:3;24440:93;:::i;:::-;24558:1;24553:3;24549:11;24542:18;;24166:400;;;:::o;24572:141::-;24621:4;24644:3;24636:11;;24667:3;24664:1;24657:14;24701:4;24698:1;24688:18;24680:26;;24572:141;;;:::o;24743:874::-;24846:3;24883:5;24877:12;24912:36;24938:9;24912:36;:::i;:::-;24964:89;25046:6;25041:3;24964:89;:::i;:::-;24957:96;;25084:1;25073:9;25069:17;25100:1;25095:166;;;;25275:1;25270:341;;;;25062:549;;25095:166;25179:4;25175:9;25164;25160:25;25155:3;25148:38;25241:6;25234:14;25227:22;25219:6;25215:35;25210:3;25206:45;25199:52;;25095:166;;25270:341;25337:38;25369:5;25337:38;:::i;:::-;25397:1;25411:154;25425:6;25422:1;25419:13;25411:154;;;25499:7;25493:14;25489:1;25484:3;25480:11;25473:35;25549:1;25540:7;25536:15;25525:26;;25447:4;25444:1;25440:12;25435:17;;25411:154;;;25594:6;25589:3;25585:16;25578:23;;25277:334;;25062:549;;24850:767;;24743:874;;;;:::o;25623:695::-;25901:3;25923:95;26014:3;26005:6;25923:95;:::i;:::-;25916:102;;26035:148;26179:3;26035:148;:::i;:::-;26028:155;;26200:92;26288:3;26279:6;26200:92;:::i;:::-;26193:99;;26309:3;26302:10;;25623:695;;;;;:::o;26324:214::-;26464:66;26460:1;26452:6;26448:14;26441:90;26324:214;:::o;26544:400::-;26704:3;26725:84;26807:1;26802:3;26725:84;:::i;:::-;26718:91;;26818:93;26907:3;26818:93;:::i;:::-;26936:1;26931:3;26927:11;26920:18;;26544:400;;;:::o;26950:214::-;27090:66;27086:1;27078:6;27074:14;27067:90;26950:214;:::o;27170:400::-;27330:3;27351:84;27433:1;27428:3;27351:84;:::i;:::-;27344:91;;27444:93;27533:3;27444:93;:::i;:::-;27562:1;27557:3;27553:11;27546:18;;27170:400;;;:::o;27576:1393::-;28107:3;28129:148;28273:3;28129:148;:::i;:::-;28122:155;;28294:95;28385:3;28376:6;28294:95;:::i;:::-;28287:102;;28406:148;28550:3;28406:148;:::i;:::-;28399:155;;28571:95;28662:3;28653:6;28571:95;:::i;:::-;28564:102;;28683:148;28827:3;28683:148;:::i;:::-;28676:155;;28848:95;28939:3;28930:6;28848:95;:::i;:::-;28841:102;;28960:3;28953:10;;27576:1393;;;;;;:::o;28975:153::-;29115:5;29111:1;29103:6;29099:14;29092:29;28975:153;:::o;29134:400::-;29294:3;29315:84;29397:1;29392:3;29315:84;:::i;:::-;29308:91;;29408:93;29497:3;29408:93;:::i;:::-;29526:1;29521:3;29517:11;29510:18;;29134:400;;;:::o;29540:1659::-;30172:3;30194:148;30338:3;30194:148;:::i;:::-;30187:155;;30359:95;30450:3;30441:6;30359:95;:::i;:::-;30352:102;;30471:148;30615:3;30471:148;:::i;:::-;30464:155;;30636:95;30727:3;30718:6;30636:95;:::i;:::-;30629:102;;30748:148;30892:3;30748:148;:::i;:::-;30741:155;;30913:95;31004:3;30995:6;30913:95;:::i;:::-;30906:102;;31025:148;31169:3;31025:148;:::i;:::-;31018:155;;31190:3;31183:10;;29540:1659;;;;;;:::o;31205:102::-;31247:8;31294:5;31291:1;31287:13;31266:34;;31205:102;;;:::o;31313:848::-;31374:5;31381:4;31405:6;31396:15;;31429:5;31420:14;;31443:712;31464:1;31454:8;31451:15;31443:712;;;31559:4;31554:3;31550:14;31544:4;31541:24;31538:50;;;31568:18;;:::i;:::-;31538:50;31618:1;31608:8;31604:16;31601:451;;;32033:4;32026:5;32022:16;32013:25;;31601:451;32083:4;32077;32073:15;32065:23;;32113:32;32136:8;32113:32;:::i;:::-;32101:44;;31443:712;;;31313:848;;;;;;;:::o;32167:1073::-;32221:5;32412:8;32402:40;;32433:1;32424:10;;32435:5;;32402:40;32461:4;32451:36;;32478:1;32469:10;;32480:5;;32451:36;32547:4;32595:1;32590:27;;;;32631:1;32626:191;;;;32540:277;;32590:27;32608:1;32599:10;;32610:5;;;32626:191;32671:3;32661:8;32658:17;32655:43;;;32678:18;;:::i;:::-;32655:43;32727:8;32724:1;32720:16;32711:25;;32762:3;32755:5;32752:14;32749:40;;;32769:18;;:::i;:::-;32749:40;32802:5;;;32540:277;;32926:2;32916:8;32913:16;32907:3;32901:4;32898:13;32894:36;32876:2;32866:8;32863:16;32858:2;32852:4;32849:12;32845:35;32829:111;32826:246;;;32982:8;32976:4;32972:19;32963:28;;33017:3;33010:5;33007:14;33004:40;;;33024:18;;:::i;:::-;33004:40;33057:5;;32826:246;33097:42;33135:3;33125:8;33119:4;33116:1;33097:42;:::i;:::-;33082:57;;;;33171:4;33166:3;33162:14;33155:5;33152:25;33149:51;;;33180:18;;:::i;:::-;33149:51;33229:4;33222:5;33218:16;33209:25;;32167:1073;;;;;;:::o;33246:281::-;33304:5;33328:23;33346:4;33328:23;:::i;:::-;33320:31;;33372:25;33388:8;33372:25;:::i;:::-;33360:37;;33416:104;33453:66;33443:8;33437:4;33416:104;:::i;:::-;33407:113;;33246:281;;;;:::o;33533:185::-;33573:1;33590:20;33608:1;33590:20;:::i;:::-;33585:25;;33624:20;33642:1;33624:20;:::i;:::-;33619:25;;33663:1;33653:35;;33668:18;;:::i;:::-;33653:35;33710:1;33707;33703:9;33698:14;;33533:185;;;;:::o;33724:93::-;33761:6;33808:2;33803;33796:5;33792:14;33788:23;33778:33;;33724:93;;;:::o;33823:107::-;33867:8;33917:5;33911:4;33907:16;33886:37;;33823:107;;;;:::o;33936:393::-;34005:6;34055:1;34043:10;34039:18;34078:97;34108:66;34097:9;34078:97;:::i;:::-;34196:39;34226:8;34215:9;34196:39;:::i;:::-;34184:51;;34268:4;34264:9;34257:5;34253:21;34244:30;;34317:4;34307:8;34303:19;34296:5;34293:30;34283:40;;34012:317;;33936:393;;;;;:::o;34335:60::-;34363:3;34384:5;34377:12;;34335:60;;;:::o;34401:142::-;34451:9;34484:53;34502:34;34511:24;34529:5;34511:24;:::i;:::-;34502:34;:::i;:::-;34484:53;:::i;:::-;34471:66;;34401:142;;;:::o;34549:75::-;34592:3;34613:5;34606:12;;34549:75;;;:::o;34630:269::-;34740:39;34771:7;34740:39;:::i;:::-;34801:91;34850:41;34874:16;34850:41;:::i;:::-;34842:6;34835:4;34829:11;34801:91;:::i;:::-;34795:4;34788:105;34706:193;34630:269;;;:::o;34905:73::-;34950:3;34905:73;:::o;34984:189::-;35061:32;;:::i;:::-;35102:65;35160:6;35152;35146:4;35102:65;:::i;:::-;35037:136;34984:189;;:::o;35179:186::-;35239:120;35256:3;35249:5;35246:14;35239:120;;;35310:39;35347:1;35340:5;35310:39;:::i;:::-;35283:1;35276:5;35272:13;35263:22;;35239:120;;;35179:186;;:::o;35371:543::-;35472:2;35467:3;35464:11;35461:446;;;35506:38;35538:5;35506:38;:::i;:::-;35590:29;35608:10;35590:29;:::i;:::-;35580:8;35576:44;35773:2;35761:10;35758:18;35755:49;;;35794:8;35779:23;;35755:49;35817:80;35873:22;35891:3;35873:22;:::i;:::-;35863:8;35859:37;35846:11;35817:80;:::i;:::-;35476:431;;35461:446;35371:543;;;:::o;35920:117::-;35974:8;36024:5;36018:4;36014:16;35993:37;;35920:117;;;;:::o;36043:169::-;36087:6;36120:51;36168:1;36164:6;36156:5;36153:1;36149:13;36120:51;:::i;:::-;36116:56;36201:4;36195;36191:15;36181:25;;36094:118;36043:169;;;;:::o;36217:295::-;36293:4;36439:29;36464:3;36458:4;36439:29;:::i;:::-;36431:37;;36501:3;36498:1;36494:11;36488:4;36485:21;36477:29;;36217:295;;;;:::o;36517:1395::-;36634:37;36667:3;36634:37;:::i;:::-;36736:18;36728:6;36725:30;36722:56;;;36758:18;;:::i;:::-;36722:56;36802:38;36834:4;36828:11;36802:38;:::i;:::-;36887:67;36947:6;36939;36933:4;36887:67;:::i;:::-;36981:1;37005:4;36992:17;;37037:2;37029:6;37026:14;37054:1;37049:618;;;;37711:1;37728:6;37725:77;;;37777:9;37772:3;37768:19;37762:26;37753:35;;37725:77;37828:67;37888:6;37881:5;37828:67;:::i;:::-;37822:4;37815:81;37684:222;37019:887;;37049:618;37101:4;37097:9;37089:6;37085:22;37135:37;37167:4;37135:37;:::i;:::-;37194:1;37208:208;37222:7;37219:1;37216:14;37208:208;;;37301:9;37296:3;37292:19;37286:26;37278:6;37271:42;37352:1;37344:6;37340:14;37330:24;;37399:2;37388:9;37384:18;37371:31;;37245:4;37242:1;37238:12;37233:17;;37208:208;;;37444:6;37435:7;37432:19;37429:179;;;37502:9;37497:3;37493:19;37487:26;37545:48;37587:4;37579:6;37575:17;37564:9;37545:48;:::i;:::-;37537:6;37530:64;37452:156;37429:179;37654:1;37650;37642:6;37638:14;37634:22;37628:4;37621:36;37056:611;;;37019:887;;36609:1303;;;36517:1395;;:::o;37918:233::-;37957:3;37980:24;37998:5;37980:24;:::i;:::-;37971:33;;38026:66;38019:5;38016:77;38013:103;;38096:18;;:::i;:::-;38013:103;38143:1;38136:5;38132:13;38125:20;;37918:233;;;:::o;38157:191::-;38197:3;38216:20;38234:1;38216:20;:::i;:::-;38211:25;;38250:20;38268:1;38250:20;:::i;:::-;38245:25;;38293:1;38290;38286:9;38279:16;;38314:3;38311:1;38308:10;38305:36;;;38321:18;;:::i;:::-;38305:36;38157:191;;;;:::o;38354:410::-;38394:7;38417:20;38435:1;38417:20;:::i;:::-;38412:25;;38451:20;38469:1;38451:20;:::i;:::-;38446:25;;38506:1;38503;38499:9;38528:30;38546:11;38528:30;:::i;:::-;38517:41;;38707:1;38698:7;38694:15;38691:1;38688:22;38668:1;38661:9;38641:83;38618:139;;38737:18;;:::i;:::-;38618:139;38402:362;38354:410;;;;:::o;38770:275::-;38902:3;38924:95;39015:3;39006:6;38924:95;:::i;:::-;38917:102;;39036:3;39029:10;;38770:275;;;;:::o

Swarm Source

ipfs://154bc9e66abf160188aecd5a069cca0808d560572e3fcf4fcae7bded4b52d100
Loading