Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
NestBatchPlatform2
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-12 */ // Sources flattened with hardhat v2.6.5 https://hardhat.org // File contracts/interfaces/INestBatchPriceView.sol // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity ^0.8.6; /// @dev This contract implemented the mining logic of nest interface INestBatchPriceView { /// @dev Get the full information of latest trigger price /// @param channelId Target channelId /// @param pairIndex Target pairIndex /// @return blockNumber The block number of price /// @return price The token price. (1eth equivalent to (price) token) /// @return avgPrice Average price /// @return sigmaSQ The square of the volatility (18 decimal places). The current implementation assumes that /// the volatility cannot exceed 1. Correspondingly, when the return value is equal to 999999999999996447, /// it means that the volatility has exceeded the range that can be expressed function triggeredPriceInfo(uint channelId, uint pairIndex) external view returns ( uint blockNumber, uint price, uint avgPrice, uint sigmaSQ ); /// @dev Find the price at block number /// @param channelId Target channelId /// @param pairIndex Target pairIndex /// @param height Destination block number /// @return blockNumber The block number of price /// @return price The token price. (1eth equivalent to (price) token) function findPrice( uint channelId, uint pairIndex, uint height ) external view returns (uint blockNumber, uint price); /// @dev Get the last (num) effective price /// @param channelId Target channelId /// @param pairIndex Target pairIndex /// @param count The number of prices that want to return /// @return An array which length is num * 2, each two element expresses one price like blockNumber|price function lastPriceList(uint channelId, uint pairIndex, uint count) external view returns (uint[] memory); } // File contracts/interfaces/INestBatchPrice2.sol // GPL-3.0-or-later pragma solidity ^0.8.6; /// @dev This contract implemented the mining logic of nest interface INestBatchPrice2 { /// @dev Get the full information of latest trigger price /// @param channelId Target channelId /// @param pairIndices Array of pair indices /// @param payback Address to receive refund /// @return prices Price array, i * 4 is the block where the ith price is located, i * 4 + 1 is the ith price, /// i * 4 + 2 is the ith average price and i * 4 + 3 is the ith volatility function triggeredPriceInfo( uint channelId, uint[] calldata pairIndices, address payback ) external payable returns (uint[] memory prices); /// @dev Find the price at block number /// @param channelId Target channelId /// @param pairIndices Array of pair indices /// @param height Destination block number /// @param payback Address to receive refund /// @return prices Price array, i * 2 is the block where the ith price is located, and i * 2 + 1 is the ith price function findPrice( uint channelId, uint[] calldata pairIndices, uint height, address payback ) external payable returns (uint[] memory prices); /// @dev Get the last (num) effective price /// @param channelId Target channelId /// @param pairIndices Array of pair indices /// @param count The number of prices that want to return /// @param payback Address to receive refund /// @return prices Result array, i * count * 2 to (i + 1) * count * 2 - 1 are /// the price results of group i quotation pairs function lastPriceList( uint channelId, uint[] calldata pairIndices, uint count, address payback ) external payable returns (uint[] memory prices); } // File contracts/libs/TransferHelper.sol // GPL-3.0-or-later pragma solidity ^0.8.6; // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeApprove(address token, address to, uint value) internal { // bytes4(keccak256(bytes('approve(address,uint)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED'); } function safeTransfer(address token, address to, uint value) internal { // bytes4(keccak256(bytes('transfer(address,uint)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED'); } function safeTransferFrom(address token, address from, address to, uint value) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED'); } function safeTransferETH(address to, uint value) internal { (bool success,) = to.call{value:value,gas:5000}(new bytes(0)); require(success, 'TransferHelper: ETH_TRANSFER_FAILED'); } } // File contracts/interfaces/INestBatchMining.sol // GPL-3.0-or-later pragma solidity ^0.8.6; /// @dev This interface defines the mining methods for nest interface INestBatchMining { /// @dev PriceChannel open event /// @param channelId Target channelId /// @param token0 Address of token0, use to mensuration, 0 means eth /// @param unit Unit of token0 /// @param reward Reward token address event Open(uint channelId, address token0, uint unit, address reward); /// @dev Post event /// @param channelId Target channelId /// @param pairIndex Target pairIndex /// @param miner Address of miner /// @param index Index of the price sheet /// @param scale Scale of this post. (Which times of unit) event Post(uint channelId, uint pairIndex, address miner, uint index, uint scale, uint price); /* ========== Structures ========== */ /// @dev Nest mining configuration structure struct Config { // -- Public configuration // The number of times the sheet assets have doubled. 4 uint8 maxBiteNestedLevel; // Price effective block interval. 20 uint16 priceEffectSpan; // The amount of nest to pledge for each post (Unit: 1000). 100 uint16 pledgeNest; } /// @dev PriceSheetView structure struct PriceSheetView { // Index of the price sheet uint32 index; // Address of miner address miner; // The block number of this price sheet packaged uint32 height; // The remained scales of this sheet, this value reduced by take uint32 remainScales; // The scales of token0 left in this sheet uint32 token0Scales; // The scales of token1 left in this sheet uint32 token1Scales; // The pledged number of nest in this sheet. (Unit: 1000nest) uint24 nestNum1k; // The level of this sheet. 0 expresses initial price sheet, a value greater than 0 expresses bite price sheet uint8 level; // Post fee shares, if there are many sheets in one block, this value is used to divide up mining value uint8 shares; // The token price. (1eth equivalent to (price) token) uint152 price; } // Price channel configuration struct ChannelConfig { // Reward per block standard uint96 rewardPerBlock; // Post fee(0.0001eth, DIMI_ETHER). 1000 uint16 postFeeUnit; // Single query fee (0.0001 ether, DIMI_ETHER). 100 uint16 singleFee; // Reduction rate(10000 based). 8000 uint16 reductionRate; } /// @dev PricePair view struct PairView { // Target token address address target; // Count of price sheets uint96 sheetCount; } /// @dev Price channel view struct PriceChannelView { uint channelId; // Address of token0, use to mensuration, 0 means eth address token0; // Unit of token0 uint96 unit; // Reward token address address reward; // Reward per block standard uint96 rewardPerBlock; // Reward total uint128 vault; // The information of mining fee uint96 rewards; // Post fee(0.0001eth, DIMI_ETHER). 1000 uint16 postFeeUnit; // Count of price pairs in this channel uint16 count; // Address of opener address opener; // Genesis block of this channel uint32 genesisBlock; // Single query fee (0.0001 ether, DIMI_ETHER). 100 uint16 singleFee; // Reduction rate(10000 based). 8000 uint16 reductionRate; // Price pair array PairView[] pairs; } /* ========== Configuration ========== */ /// @dev Modify configuration /// @param config Configuration object function setConfig(Config calldata config) external; /// @dev Get configuration /// @return Configuration object function getConfig() external view returns (Config memory); /// @dev Open price channel /// @param token0 Address of token0, use to mensuration, 0 means eth /// @param unit Unit of token0 /// @param reward Reward token address /// @param tokens Target tokens /// @param config Channel configuration function open( address token0, uint96 unit, address reward, address[] calldata tokens, ChannelConfig calldata config ) external; /// @dev Modify channel configuration /// @param channelId Target channelId /// @param config Channel configuration function modify(uint channelId, ChannelConfig calldata config) external; /// @dev Increase vault to channel /// @param channelId Target channelId /// @param vault Total to increase function increase(uint channelId, uint128 vault) external payable; /// @dev Decrease vault from channel /// @param channelId Target channelId /// @param vault Total to decrease function decrease(uint channelId, uint128 vault) external; /// @dev Get channel information /// @param channelId Target channelId /// @return Information of channel function getChannelInfo(uint channelId) external view returns (PriceChannelView memory); /// @dev Post price /// @param channelId Target channelId /// @param scale Scale of this post. (Which times of unit) /// @param equivalents Price array, one to one with pairs function post(uint channelId, uint scale, uint[] calldata equivalents) external payable; /// @notice Call the function to buy TOKEN/NTOKEN from a posted price sheet /// @dev bite TOKEN(NTOKEN) by ETH, (+ethNumBal, -tokenNumBal) /// @param channelId Target price channelId /// @param pairIndex Target pairIndex. When take token0, use pairIndex direct, or add 65536 conversely /// @param index The position of the sheet in priceSheetList[token] /// @param takeNum The amount of biting (in the unit of ETH), realAmount = takeNum * newTokenAmountPerEth /// @param newEquivalent The new price of token (1 ETH : some TOKEN), here some means newTokenAmountPerEth function take(uint channelId, uint pairIndex, uint index, uint takeNum, uint newEquivalent) external payable; /// @dev List sheets by page /// @param channelId Target channelId /// @param pairIndex Target pairIndex /// @param offset Skip previous (offset) records /// @param count Return (count) records /// @param order Order. 0 reverse order, non-0 positive order /// @return List of price sheets function list( uint channelId, uint pairIndex, uint offset, uint count, uint order ) external view returns (PriceSheetView[] memory); /// @notice Close a batch of price sheets passed VERIFICATION-PHASE /// @dev Empty sheets but in VERIFICATION-PHASE aren't allowed /// @param channelId Target channelId /// @param indices Two-dimensional array of sheet indices, first means pair indices, seconds means sheet indices function close(uint channelId, uint[][] calldata indices) external; /// @dev View the number of assets specified by the user /// @param tokenAddress Destination token address /// @param addr Destination address /// @return Number of assets function balanceOf(address tokenAddress, address addr) external view returns (uint); /// @dev Withdraw assets /// @param tokenAddress Destination token address /// @param value The value to withdraw function withdraw(address tokenAddress, uint value) external; /// @dev Estimated mining amount /// @param channelId Target channelId /// @return Estimated mining amount function estimate(uint channelId) external view returns (uint); /// @dev Query the quantity of the target quotation /// @param channelId Target channelId /// @param index The index of the sheet /// @return minedBlocks Mined block period from previous block /// @return totalShares Total shares of sheets in the block function getMinedBlocks( uint channelId, uint index ) external view returns (uint minedBlocks, uint totalShares); /// @dev Pay /// @param channelId Target channelId /// @param to Address to receive /// @param value Amount to receive function pay(uint channelId, address to, uint value) external; } // File contracts/custom/ChainConfig.sol // GPL-3.0-or-later pragma solidity ^0.8.6; /// @dev Specific data for target chain contract ChainConfig { // ******** Ethereum ******** // // Ethereum average block time interval, 12090 milliseconds uint constant ETHEREUM_BLOCK_TIMESPAN = 12090; // Nest ore drawing attenuation interval. 2600000 blocks, about one year uint constant NEST_REDUCTION_SPAN = 2600000; // The decay limit of nest ore drawing becomes stable after exceeding this interval. // 24 million blocks, about 10 years uint constant NEST_REDUCTION_LIMIT = 26000000; //NEST_REDUCTION_SPAN * 10; // Attenuation gradient array, each attenuation step value occupies 16 bits. The attenuation value is an integer //uint constant NEST_REDUCTION_STEPS = 0x280035004300530068008300A300CC010001400190; // ******** BSC ******** // // // Ethereum average block time interval, 3000 milliseconds // uint constant ETHEREUM_BLOCK_TIMESPAN = 3000; // // Nest ore drawing attenuation interval. 2400000 blocks, about one year // uint constant NEST_REDUCTION_SPAN = 10000000; // // The decay limit of nest ore drawing becomes stable after exceeding this interval. // // 24 million blocks, about 10 years // uint constant NEST_REDUCTION_LIMIT = 100000000; //NEST_REDUCTION_SPAN * 10; // // Attenuation gradient array, each attenuation step value occupies 16 bits. The attenuation value is an integer // uint constant NEST_REDUCTION_STEPS = 0x280035004300530068008300A300CC010001400190; // ******** Ploygon ******** // // // Ethereum average block time interval, 2200 milliseconds // uint constant ETHEREUM_BLOCK_TIMESPAN = 2200; // // Nest ore drawing attenuation interval. 2400000 blocks, about one year // uint constant NEST_REDUCTION_SPAN = 15000000; // // The decay limit of nest ore drawing becomes stable after exceeding this interval. // // 24 million blocks, about 10 years // uint constant NEST_REDUCTION_LIMIT = 150000000; //NEST_REDUCTION_SPAN * 10; // // Attenuation gradient array, each attenuation step value occupies 16 bits. The attenuation value is an integer // uint constant NEST_REDUCTION_STEPS = 0x280035004300530068008300A300CC010001400190; } // File contracts/interfaces/INestMapping.sol // GPL-3.0-or-later pragma solidity ^0.8.6; /// @dev The interface defines methods for nest builtin contract address mapping interface INestMapping { /// @dev Set the built-in contract address of the system /// @param nestTokenAddress Address of nest token contract /// @param nestNodeAddress Address of nest node contract /// @param nestLedgerAddress INestLedger implementation contract address /// @param nestMiningAddress INestMining implementation contract address for nest /// @param ntokenMiningAddress INestMining implementation contract address for ntoken /// @param nestPriceFacadeAddress INestPriceFacade implementation contract address /// @param nestVoteAddress INestVote implementation contract address /// @param nestQueryAddress INestQuery implementation contract address /// @param nnIncomeAddress NNIncome contract address /// @param nTokenControllerAddress INTokenController implementation contract address function setBuiltinAddress( address nestTokenAddress, address nestNodeAddress, address nestLedgerAddress, address nestMiningAddress, address ntokenMiningAddress, address nestPriceFacadeAddress, address nestVoteAddress, address nestQueryAddress, address nnIncomeAddress, address nTokenControllerAddress ) external; /// @dev Get the built-in contract address of the system /// @return nestTokenAddress Address of nest token contract /// @return nestNodeAddress Address of nest node contract /// @return nestLedgerAddress INestLedger implementation contract address /// @return nestMiningAddress INestMining implementation contract address for nest /// @return ntokenMiningAddress INestMining implementation contract address for ntoken /// @return nestPriceFacadeAddress INestPriceFacade implementation contract address /// @return nestVoteAddress INestVote implementation contract address /// @return nestQueryAddress INestQuery implementation contract address /// @return nnIncomeAddress NNIncome contract address /// @return nTokenControllerAddress INTokenController implementation contract address function getBuiltinAddress() external view returns ( address nestTokenAddress, address nestNodeAddress, address nestLedgerAddress, address nestMiningAddress, address ntokenMiningAddress, address nestPriceFacadeAddress, address nestVoteAddress, address nestQueryAddress, address nnIncomeAddress, address nTokenControllerAddress ); /// @dev Get address of nest token contract /// @return Address of nest token contract function getNestTokenAddress() external view returns (address); /// @dev Get address of nest node contract /// @return Address of nest node contract function getNestNodeAddress() external view returns (address); /// @dev Get INestLedger implementation contract address /// @return INestLedger implementation contract address function getNestLedgerAddress() external view returns (address); /// @dev Get INestMining implementation contract address for nest /// @return INestMining implementation contract address for nest function getNestMiningAddress() external view returns (address); /// @dev Get INestMining implementation contract address for ntoken /// @return INestMining implementation contract address for ntoken function getNTokenMiningAddress() external view returns (address); /// @dev Get INestPriceFacade implementation contract address /// @return INestPriceFacade implementation contract address function getNestPriceFacadeAddress() external view returns (address); /// @dev Get INestVote implementation contract address /// @return INestVote implementation contract address function getNestVoteAddress() external view returns (address); /// @dev Get INestQuery implementation contract address /// @return INestQuery implementation contract address function getNestQueryAddress() external view returns (address); /// @dev Get NNIncome contract address /// @return NNIncome contract address function getNnIncomeAddress() external view returns (address); /// @dev Get INTokenController implementation contract address /// @return INTokenController implementation contract address function getNTokenControllerAddress() external view returns (address); /// @dev Registered address. The address registered here is the address accepted by nest system /// @param key The key /// @param addr Destination address. 0 means to delete the registration information function registerAddress(string memory key, address addr) external; /// @dev Get registered address /// @param key The key /// @return Destination address. 0 means empty function checkAddress(string memory key) external view returns (address); } // File contracts/interfaces/INestGovernance.sol // GPL-3.0-or-later pragma solidity ^0.8.6; /// @dev This interface defines the governance methods interface INestGovernance is INestMapping { /// @dev Set governance authority /// @param addr Destination address /// @param flag Weight. 0 means to delete the governance permission of the target address. Weight is not /// implemented in the current system, only the difference between authorized and unauthorized. /// Here, a uint96 is used to represent the weight, which is only reserved for expansion function setGovernance(address addr, uint flag) external; /// @dev Get governance rights /// @param addr Destination address /// @return Weight. 0 means to delete the governance permission of the target address. Weight is not /// implemented in the current system, only the difference between authorized and unauthorized. /// Here, a uint96 is used to represent the weight, which is only reserved for expansion function getGovernance(address addr) external view returns (uint); /// @dev Check whether the target address has governance rights for the given target /// @param addr Destination address /// @param flag Permission weight. The permission of the target address must be greater than this weight /// to pass the check /// @return True indicates permission function checkGovernance(address addr, uint flag) external view returns (bool); } // File contracts/NestBase.sol // GPL-3.0-or-later pragma solidity ^0.8.6; /// @dev Base contract of nest contract NestBase { /// @dev INestGovernance implementation contract address address public _governance; /// @dev To support open-zeppelin/upgrades /// @param governance INestGovernance implementation contract address function initialize(address governance) public virtual { require(_governance == address(0), "NEST:!initialize"); _governance = governance; } /// @dev Rewritten in the implementation contract, for load other contract addresses. Call /// super.update(newGovernance) when overriding, and override method without onlyGovernance /// @param newGovernance INestGovernance implementation contract address function update(address newGovernance) public virtual { address governance = _governance; require(governance == msg.sender || INestGovernance(governance).checkGovernance(msg.sender, 0), "NEST:!gov"); _governance = newGovernance; } //---------modifier------------ modifier onlyGovernance() { require(INestGovernance(_governance).checkGovernance(msg.sender, 0), "NEST:!gov"); _; } modifier noContract() { require(msg.sender == tx.origin, "NEST:!contract"); _; } } // File contracts/custom/NestFrequentlyUsed.sol // GPL-3.0-or-later pragma solidity ^0.8.6; /// @dev This contract include frequently used data contract NestFrequentlyUsed is NestBase { // Address of nest token contract address constant NEST_TOKEN_ADDRESS = 0x04abEdA201850aC0124161F037Efd70c74ddC74C; // Genesis block number of nest // NEST token contract is created at block height 6913517. However, because the mining algorithm of nest1.0 // is different from that at present, a new mining algorithm is adopted from nest2.0. The new algorithm // includes the attenuation logic according to the block. Therefore, it is necessary to trace the block // where the nest begins to decay. According to the circulation when nest2.0 is online, the new mining // algorithm is used to deduce and convert the nest, and the new algorithm is used to mine the nest2.0 // on-line flow, the actual block is 5120000 //uint constant NEST_GENESIS_BLOCK = 0; // /// @dev Rewritten in the implementation contract, for load other contract addresses. Call // /// super.update(newGovernance) when overriding, and override method without onlyGovernance // /// @param newGovernance IHedgeGovernance implementation contract address // function update(address newGovernance) public virtual override { // super.update(newGovernance); // NEST_TOKEN_ADDRESS = INestGovernance(newGovernance).getNestTokenAddress(); // } } // File contracts/NestBatchMining.sol // GPL-3.0-or-later pragma solidity ^0.8.6; /// @dev This contract implemented the mining logic of nest4 contract NestBatchMining is ChainConfig, NestFrequentlyUsed, INestBatchMining { /// @dev To support open-zeppelin/upgrades /// @param governance INestGovernance implementation contract address function initialize(address governance) public override { super.initialize(governance); // Placeholder in _accounts, the index of a real account must greater than 0 _accounts.push(); } /// @dev Definitions for the price sheet, include the full information. /// (use 256-bits, a storage unit in ethereum evm) struct PriceSheet { // Index of miner account in _accounts. for this way, mapping an address(which need 160-bits) to a 32-bits // integer, support 4 billion accounts uint32 miner; // The block number of this price sheet packaged uint32 height; // The remained scales of this sheet, this value reduced by take uint32 remainScales; // The scales of token0 left in this sheet uint32 token0Scales; // The scales of token1 left in this sheet uint32 token1Scales; // The pledged number of nest in this sheet. (Unit: 1000nest) uint24 nestNum1k; // The level of this sheet. 0 expresses initial price sheet, a value greater than 0 expresses bite price sheet uint8 level; // Post fee shares, if there are many sheets in one block, this value is used to divide up mining value uint8 shares; // Represent price as this way, may lose precision, the error less than 1/10^14 // price = priceFraction * 16 ^ priceExponent uint56 priceFloat; } /// @dev Definitions for the price information struct PriceInfo { // Record the index of price sheet, for update price information from price sheet next time. uint32 index; // The block number of this price uint32 height; // The remain number of this price sheet uint32 remainScales; // Price, represent as float // Represent price as this way, may lose precision, the error less than 1/10^14 uint56 priceFloat; // Avg Price, represent as float // Represent price as this way, may lose precision, the error less than 1/10^14 uint56 avgFloat; // Square of price volatility, need divide by 2^48 uint48 sigmaSQ; } // Price pair structure struct PricePair { address target; PriceInfo price; PriceSheet[] sheets; } /// @dev Price channel struct PriceChannel { // Address of token0, use to mensuration, 0 means eth address token0; // Unit of token0 uint96 unit; // Reward token address address reward; // Reward per block standard uint96 rewardPerBlock; // Reward total uint128 vault; // The information of mining fee uint96 rewards; // Post fee(0.0001eth, DIMI_ETHER). 1000 uint16 postFeeUnit; // Count of price pairs in this channel uint16 count; // Address of opener address opener; // Genesis block of this channel uint32 genesisBlock; // Single query fee (0.0001 ether, DIMI_ETHER). 100 uint16 singleFee; // Reduction rate(10000 based). 8000 uint16 reductionRate; // Price pair array PricePair[0xFFFF] pairs; } /// @dev Structure is used to represent a storage location. Storage variable can be used to avoid indexing /// from mapping many times struct UINT { uint value; } /// @dev Account information struct Account { // Address of account address addr; // Balances of mining account // tokenAddress=>balance mapping(address=>UINT) balances; } // Configuration Config _config; // Registered account information Account[] _accounts; // Mapping from address to index of account. address=>accountIndex mapping(address=>uint) _accountMapping; // Price channels PriceChannel[] _channels; // Unit of post fee. 0.0001 ether uint constant DIMI_ETHER = 0.0001 ether; /* ========== Governance ========== */ /// @dev Modify configuration /// @param config Configuration object function setConfig(Config calldata config) external override onlyGovernance { _config = config; } /// @dev Get configuration /// @return Configuration object function getConfig() external view override returns (Config memory) { return _config; } /// @dev Open price channel /// @param token0 Address of token0, use to mensuration, 0 means eth /// @param unit Unit of token0 /// @param reward Reward token address /// @param tokens Target tokens /// @param config Channel configuration function open( address token0, uint96 unit, address reward, address[] calldata tokens, ChannelConfig calldata config ) external override { require(uint(unit) > 0, "NOM:unit must > 0"); // Emit open event emit Open(_channels.length, token0, unit, reward); PriceChannel storage channel = _channels.push(); // Address of token0 channel.token0 = token0; // Unit of token0 channel.unit = unit; // Address of reward channel.reward = reward; channel.vault = uint128(0); channel.rewards = uint96(0); channel.count = uint16(tokens.length); // Address of opener channel.opener = msg.sender; // Genesis block of this channel channel.genesisBlock = uint32(block.number); // Create price pairs for (uint i = 0; i < tokens.length; ++i) { require(token0 != tokens[i], "NOM:token can't equal token0"); for (uint j = 0; j < i; ++j) { require(tokens[i] != tokens[j], "NOM:token reiterated"); } channel.pairs[i].target = tokens[i]; } _modify(channel, config); } /// @dev Modify channel configuration /// @param channelId Target channelId /// @param config Channel configuration function modify(uint channelId, ChannelConfig calldata config) external override { PriceChannel storage channel = _channels[channelId]; require(channel.opener == msg.sender, "NOM:not opener"); _modify(channel, config); } /// @dev Modify channel configuration /// @param channel Target channel /// @param config Channel configuration function _modify(PriceChannel storage channel, ChannelConfig calldata config) private { // Reward per block standard channel.rewardPerBlock = config.rewardPerBlock; // Post fee(0.0001eth, DIMI_ETHER). 1000 channel.postFeeUnit = config.postFeeUnit; // Single query fee (0.0001 ether, DIMI_ETHER). 100 channel.singleFee = config.singleFee; // Reduction rate(10000 based). 8000 channel.reductionRate = config.reductionRate; } /// @dev Add price token, make a pair with token0. (Not support remove, be careful!) /// @param channelId Target channelId /// @param target Target token address function addPair(uint channelId, address target) external { PriceChannel storage channel = _channels[channelId]; require(channel.opener == msg.sender, "NOM:not opener"); require(channel.token0 != target, "NOM:token can't equal token0"); uint count = uint(channel.count); for (uint j = 0; j < count; ++j) { require(channel.pairs[j].target != target, "NOM:token reiterated"); } channel.pairs[count].target = target; ++channel.count; } /// @dev Modify token Address /// @param channelId Target channelId /// @param tokenIndex Which token to be update, 65536 means token0, 65537 means reward, else means pairs[tokenIndex] /// @param tokenAddress New token address function modifyToken( uint channelId, uint tokenIndex, address tokenAddress ) external onlyGovernance { PriceChannel storage channel = _channels[channelId]; if (tokenIndex == 65536) { channel.token0 = tokenAddress; } else if (tokenIndex == 65537) { channel.reward = tokenAddress; } else { channel.pairs[tokenIndex].target = tokenAddress; } } /// @dev Increase vault to channel /// @param channelId Target channelId /// @param vault Total to increase function increase(uint channelId, uint128 vault) external payable override { PriceChannel storage channel = _channels[channelId]; address reward = channel.reward; if (reward == address(0)) { require(msg.value == uint(vault), "NOM:vault error"); } else { TransferHelper.safeTransferFrom(reward, msg.sender, address(this), uint(vault)); } channel.vault += vault; } /// @dev Decrease vault from channel /// @param channelId Target channelId /// @param vault Total to decrease function decrease(uint channelId, uint128 vault) external override { PriceChannel storage channel = _channels[channelId]; require(channel.opener == msg.sender, "NOM:not opener"); address reward = channel.reward; channel.vault -= vault; if (reward == address(0)) { payable(msg.sender).transfer(uint(vault)); } else { TransferHelper.safeTransfer(reward, msg.sender, uint(vault)); } } /// @dev Change opener /// @param channelId Target channelId /// @param newOpener New opener address function changeOpener(uint channelId, address newOpener) external { PriceChannel storage channel = _channels[channelId]; require(channel.opener == msg.sender, "NOM:not opener"); channel.opener = newOpener; } /// @dev Get channel information /// @param channelId Target channelId /// @return Information of channel function getChannelInfo(uint channelId) external view override returns (PriceChannelView memory) { PriceChannel storage channel = _channels[channelId]; uint count = uint(channel.count); PairView[] memory pairs = new PairView[](count); for (uint i = 0; i < count; ++i) { PricePair storage pair = channel.pairs[i]; pairs[i] = PairView(pair.target, uint96(pair.sheets.length)); } return PriceChannelView ( channelId, // Address of token0, use to mensuration, 0 means eth channel.token0, // Unit of token0 channel.unit, // Reward token address channel.reward, // Reward per block standard channel.rewardPerBlock, // Reward total channel.vault, // The information of mining fee channel.rewards, // Post fee(0.0001eth, DIMI_ETHER). 1000 channel.postFeeUnit, // Count of price pairs in this channel channel.count, // Address of opener channel.opener, // Genesis block of this channel channel.genesisBlock, // Single query fee (0.0001 ether, DIMI_ETHER). 100 channel.singleFee, // Reduction rate(10000 based). 8000 channel.reductionRate, pairs ); } /* ========== Mining ========== */ /// @dev Post price /// @param channelId Target channelId /// @param scale Scale of this post. (Which times of unit) /// @param equivalents Price array, one to one with pairs function post(uint channelId, uint scale, uint[] calldata equivalents) external payable override { // 0. Load config Config memory config = _config; // 1. Check arguments require(scale == 1, "NOM:!scale"); // 2. Load price channel PriceChannel storage channel = _channels[channelId]; // 3. Freeze assets uint accountIndex = _addressIndex(msg.sender); // Freeze token and nest // Because of the use of floating-point representation(fraction * 16 ^ exponent), it may bring some precision // loss After assets are frozen according to equivalent * scale, the part with poor accuracy may be // lost when the assets are returned, It should be frozen according to decodeFloat(fraction, exponent) * scale // However, considering that the loss is less than 1 / 10 ^ 14, the loss here is ignored, and the part of // precision loss can be transferred out as system income in the future mapping(address=>UINT) storage balances = _accounts[accountIndex].balances; uint cn = uint(channel.count); uint fee = msg.value; // Freeze nest fee = _freeze(balances, NEST_TOKEN_ADDRESS, cn * uint(config.pledgeNest) * 1000 ether, fee); // Freeze token0 fee = _freeze(balances, channel.token0, cn * uint(channel.unit), fee); // Freeze token1 while (cn > 0) { PricePair storage pair = channel.pairs[--cn]; uint equivalent = equivalents[cn]; require(equivalent > 0, "NOM:!equivalent"); fee = _freeze(balances, pair.target, equivalent, fee); // Calculate the price // According to the current mechanism, the newly added sheet cannot take effect, so the calculated price // is placed before the sheet is added, which can reduce unnecessary traversal _stat(config, pair); // 6. Create token price sheet emit Post(channelId, cn, msg.sender, pair.sheets.length, 1, equivalent); // Only pairIndex 0 has reward _create(pair.sheets, accountIndex, uint32(1), uint(config.pledgeNest), cn == 0 ? 1 : 0, equivalent); } // Remove post fee logic, and reserve postFeeUnit field // // 4. Deposit fee // // Only postFeeUnit > 0 need fee // uint postFeeUnit = uint(channel.postFeeUnit); // if (postFeeUnit > 0) { // require(fee >= postFeeUnit * DIMI_ETHER + tx.gasprice * 400000, "NM:!fee"); // } // if (fee > 0) { // channel.rewards += _toUInt96(fee); // } } /// @notice Call the function to buy TOKEN/NTOKEN from a posted price sheet /// @dev bite TOKEN(NTOKEN) by ETH, (+token0Scales, -token1Scales) /// @param channelId Target price channelId /// @param pairIndex Target pairIndex. When take token0, use pairIndex direct, or add 65536 conversely /// @param index The position of the sheet in priceSheetList[token] /// @param takeNum The amount of biting (in the unit of ETH), realAmount = takeNum * newTokenAmountPerEth /// @param newEquivalent The new price of token (1 ETH : some TOKEN), here some means newTokenAmountPerEth function take( uint channelId, uint pairIndex, uint index, uint takeNum, uint newEquivalent ) external payable override { Config memory config = _config; // 1. Check arguments require(takeNum > 0, "NM:!takeNum"); require(newEquivalent > 0, "NM:!price"); // 2. Load price sheet PriceChannel storage channel = _channels[channelId]; PricePair storage pair = channel.pairs[pairIndex < 0x10000 ? pairIndex : pairIndex - 0x10000]; PriceSheet memory sheet = pair.sheets[index]; // 3. Check state require(uint(sheet.height) + uint(config.priceEffectSpan) >= block.number, "NM:!state"); sheet.remainScales = uint32(uint(sheet.remainScales) - takeNum); uint accountIndex = _addressIndex(msg.sender); // Number of nest to be pledged // sheet.token0Scales + sheet.token1Scales is always two times to sheet.scale (a virtual variable) uint needNest1k = (takeNum << 2) * uint(sheet.nestNum1k) / (uint(sheet.token0Scales) + uint(sheet.token1Scales)); // 4. Calculate the number of eth, token and nest needed, and freeze them uint needEthNum = takeNum; uint level = uint(sheet.level); if (level < 255) { if (level < uint(config.maxBiteNestedLevel)) { // Double scale sheet needEthNum <<= 1; } ++level; } { // Freeze nest and token // Freeze assets: token0, token1, nest mapping(address=>UINT) storage balances = _accounts[accountIndex].balances; uint fee = msg.value; // Target pairIndex. When take token0, use pairIndex direct, or add 65536 conversely // pairIndex < 0x10000 means take token0 if (pairIndex < 0x10000) { // Update the bitten sheet sheet.token0Scales = uint32(uint(sheet.token0Scales) - takeNum); sheet.token1Scales = uint32(uint(sheet.token1Scales) + takeNum); pair.sheets[index] = sheet; // Freeze token0 fee = _freeze(balances, channel.token0, (needEthNum - takeNum) * uint(channel.unit), fee); // Freeze token1 fee = _freeze( balances, pair.target, needEthNum * newEquivalent + _decodeFloat(sheet.priceFloat) * takeNum, fee ); } // pairIndex >= 0x10000 means take target token1 else { pairIndex -= 0x10000; // Update the bitten sheet sheet.token0Scales = uint32(uint(sheet.token0Scales) + takeNum); sheet.token1Scales = uint32(uint(sheet.token1Scales) - takeNum); pair.sheets[index] = sheet; // Freeze token0 fee = _freeze(balances, channel.token0, (needEthNum + takeNum) * uint(channel.unit), fee); // Freeze token1 uint backTokenValue = _decodeFloat(sheet.priceFloat) * takeNum; if (needEthNum * newEquivalent > backTokenValue) { fee = _freeze(balances, pair.target, needEthNum * newEquivalent - backTokenValue, fee); } else { _unfreeze(balances, pair.target, backTokenValue - needEthNum * newEquivalent, accountIndex); } } // Freeze nest fee = _freeze(balances, NEST_TOKEN_ADDRESS, needNest1k * 1000 ether, fee); require(fee == 0, "NOM:!fee"); } // 5. Calculate the price // According to the current mechanism, the newly added sheet cannot take effect, so the calculated price // is placed before the sheet is added, which can reduce unnecessary traversal _stat(config, pair); // 6. Create price sheet emit Post(channelId, pairIndex, msg.sender, pair.sheets.length, needEthNum, newEquivalent); _create(pair.sheets, accountIndex, uint32(needEthNum), needNest1k, level << 8, newEquivalent); } /// @dev List sheets by page /// @param channelId Target channelId /// @param pairIndex Target pairIndex /// @param offset Skip previous (offset) records /// @param count Return (count) records /// @param order Order. 0 reverse order, non-0 positive order /// @return List of price sheets function list( uint channelId, uint pairIndex, uint offset, uint count, uint order ) external view override noContract returns (PriceSheetView[] memory) { PriceSheet[] storage sheets = _channels[channelId].pairs[pairIndex].sheets; PriceSheetView[] memory result = new PriceSheetView[](count); uint length = sheets.length; uint i = 0; // Reverse order if (order == 0) { uint index = length - offset; uint end = index > count ? index - count : 0; while (index > end) { --index; result[i++] = _toPriceSheetView(sheets[index], index); } } // Positive order else { uint index = offset; uint end = index + count; if (end > length) { end = length; } while (index < end) { result[i++] = _toPriceSheetView(sheets[index], index); ++index; } } return result; } /// @notice Close a batch of price sheets passed VERIFICATION-PHASE /// @dev Empty sheets but in VERIFICATION-PHASE aren't allowed /// @param channelId Target channelId /// @param indices Two-dimensional array of sheet indices, first means pair indices, seconds means sheet indices function close(uint channelId, uint[][] calldata indices) external override { Config memory config = _config; PriceChannel storage channel = _channels[channelId]; uint accountIndex = 0; uint reward = 0; uint nestNum1k = 0; uint token0Scales = 0; // storage variable must given a value at declaring, this is useless mapping(address=>UINT) storage balances = _accounts[0/*accountIndex*/].balances; uint[3] memory vars = [ uint(channel.rewardPerBlock), uint(channel.genesisBlock), uint(channel.reductionRate) ]; for (uint j = indices.length; j > 0;) { PricePair storage pair = channel.pairs[--j]; /////////////////////////////////////////////////////////////////////////////////////// uint tokenValue = 0; // 1. Traverse sheets for (uint i = indices[j].length; i > 0;) { // --------------------------------------------------------------------------------- uint index = indices[j][--i]; PriceSheet memory sheet = pair.sheets[index]; // Batch closing quotation can only close sheet of the same user if (accountIndex == 0) { // accountIndex == 0 means the first sheet, and the number of this sheet is taken accountIndex = uint(sheet.miner); balances = _accounts[accountIndex].balances; } else { // accountIndex != 0 means that it is a follow-up sheet, and the miner number must be // consistent with the previous record require(accountIndex == uint(sheet.miner), "NM:!miner"); } // Check the status of the price sheet to see if it has reached the effective block interval // or has been finished if (accountIndex > 0 && (uint(sheet.height) + uint(config.priceEffectSpan) < block.number)) { // Only pairIndex 0 has reward if (j == 0) { uint shares = uint(sheet.shares); // Mining logic // The price sheet which shares is zero doesn't mining if (shares > 0) { // Currently, mined represents the number of blocks has mined (uint mined, uint totalShares) = _calcMinedBlocks(pair.sheets, index, sheet); reward += ( mined * shares * _reduction(uint(sheet.height) - vars[1], vars[2]) * vars[0] / totalShares / 400 ); } } nestNum1k += uint(sheet.nestNum1k); token0Scales += uint(sheet.token0Scales); tokenValue += _decodeFloat(sheet.priceFloat) * uint(sheet.token1Scales); // Set sheet.miner to 0, express the sheet is closed sheet.miner = uint32(0); sheet.token0Scales = uint32(0); sheet.token1Scales = uint32(0); pair.sheets[index] = sheet; } // --------------------------------------------------------------------------------- } _stat(config, pair); /////////////////////////////////////////////////////////////////////////////////////// // Unfreeze token1 _unfreeze(balances, pair.target, tokenValue, accountIndex); } // Unfreeze token0 _unfreeze(balances, channel.token0, token0Scales * uint(channel.unit), accountIndex); // Unfreeze nest _unfreeze(balances, NEST_TOKEN_ADDRESS, nestNum1k * 1000 ether, accountIndex); uint vault = uint(channel.vault); if (reward > vault) { reward = vault; } // Record the vault for each channel to prevent the opener use the funds in this contract without increase channel.vault = uint128(vault - reward); // Record reward _unfreeze(balances, channel.reward, reward, accountIndex); } /// @dev View the number of assets specified by the user /// @param tokenAddress Destination token address /// @param addr Destination address /// @return Number of assets function balanceOf(address tokenAddress, address addr) external view override returns (uint) { return _accounts[_accountMapping[addr]].balances[tokenAddress].value; } /// @dev Withdraw assets /// @param tokenAddress Destination token address /// @param value The value to withdraw function withdraw(address tokenAddress, uint value) external override { // The user's locked nest and the mining pool's nest are stored together. When the nest is mined over, // the problem of taking the locked nest as the ore drawing will appear // As it will take a long time for nest to finish mining, this problem will not be considered for the time being UINT storage balance = _accounts[_accountMapping[msg.sender]].balances[tokenAddress]; balance.value -= value; TransferHelper.safeTransfer(tokenAddress, msg.sender, value); } /// @dev Estimated mining amount /// @param channelId Target channelId /// @return Estimated mining amount function estimate(uint channelId) external view override returns (uint) { PriceChannel storage channel = _channels[channelId]; PriceSheet[] storage sheets = channel.pairs[0].sheets; uint index = sheets.length; uint blocks = 10; while (index > 0) { PriceSheet memory sheet = sheets[--index]; if (uint(sheet.shares) > 0) { blocks = block.number - uint(sheet.height); break; } } return blocks * uint(channel.rewardPerBlock) * _reduction(block.number - uint(channel.genesisBlock), uint(channel.reductionRate)) / 400; } /// @dev Query the quantity of the target quotation /// @param channelId Target channelId /// @param index The index of the sheet /// @return minedBlocks Mined block period from previous block /// @return totalShares Total shares of sheets in the block function getMinedBlocks( uint channelId, uint index ) external view override returns (uint minedBlocks, uint totalShares) { PriceSheet[] storage sheets = _channels[channelId].pairs[0].sheets; return _calcMinedBlocks(sheets, index, sheets[index]); } /// @dev Pay /// @param channelId Target channelId /// @param to Address to receive /// @param value Amount to receive function pay(uint channelId, address to, uint value) external override { PriceChannel storage channel = _channels[channelId]; require(channel.opener == msg.sender, "NOM:!opener"); channel.rewards -= _toUInt96(value); // pay payable(to).transfer(value); } /// @dev Gets the address corresponding to the given index number /// @param index The index number of the specified address /// @return The address corresponding to the given index number function indexAddress(uint index) public view returns (address) { return _accounts[index].addr; } /// @dev Gets the registration index number of the specified address /// @param addr Destination address /// @return 0 means nonexistent, non-0 means index number function getAccountIndex(address addr) external view returns (uint) { return _accountMapping[addr]; } /// @dev Get the length of registered account array /// @return The length of registered account array function getAccountCount() external view returns (uint) { return _accounts.length; } // Convert PriceSheet to PriceSheetView function _toPriceSheetView(PriceSheet memory sheet, uint index) private view returns (PriceSheetView memory) { return PriceSheetView( // Index number uint32(index), // Miner address indexAddress(sheet.miner), // The block number of this price sheet packaged sheet.height, // The remain number of this price sheet sheet.remainScales, // The eth number which miner will got sheet.token0Scales, // The eth number which equivalent to token's value which miner will got sheet.token1Scales, // The pledged number of nest in this sheet. (Unit: 1000nest) sheet.nestNum1k, // The level of this sheet. 0 expresses initial price sheet, a value greater than 0 expresses // bite price sheet sheet.level, // Post fee shares sheet.shares, // Price uint152(_decodeFloat(sheet.priceFloat)) ); } // Create price sheet function _create( PriceSheet[] storage sheets, uint accountIndex, uint32 scale, uint nestNum1k, uint level_shares, uint equivalent ) private { sheets.push(PriceSheet( uint32(accountIndex), // uint32 miner; uint32(block.number), // uint32 height; scale, // uint32 remainScales; scale, // uint32 token0Scales; scale, // uint32 token1Scales; uint24(nestNum1k), // uint32 nestNum1k; uint8(level_shares >> 8), // uint8 level; uint8(level_shares & 0xFF), _encodeFloat(equivalent) )); } // Calculate price, average price and volatility function _stat(Config memory config, PricePair storage pair) private { PriceSheet[] storage sheets = pair.sheets; // Load token price information PriceInfo memory p0 = pair.price; // Length of sheets uint length = sheets.length; // The index of the sheet to be processed in the sheet array uint index = uint(p0.index); // The latest block number for which the price has been calculated uint prev = uint(p0.height); // It's not necessary to load the price information in p0 // Eth count variable used to calculate price uint totalToken0Scales = 0; // Token count variable for price calculation uint totalToken1Value = 0; // Block number of current sheet uint height = 0; // Traverse the sheets to find the effective price //uint effectBlock = block.number - uint(config.priceEffectSpan); PriceSheet memory sheet; for (; ; ++index) { // Gas attack analysis, each post transaction, calculated according to post, needs to write // at least one sheet and freeze two kinds of assets, which needs to consume at least 30000 gas, // In addition to the basic cost of the transaction, at least 50000 gas is required. // In addition, there are other reading and calculation operations. The gas consumed by each // transaction is impossible less than 70000 gas, The attacker can accumulate up to 20 blocks // of sheets to be generated. To ensure that the calculation can be completed in one block, // it is necessary to ensure that the consumption of each price does not exceed 70000 / 20 = 3500 gas, // According to the current logic, each calculation of a price needs to read a storage unit (800) // and calculate the consumption, which can not reach the dangerous value of 3500, so the gas attack // is not considered // Traverse the sheets that has reached the effective interval from the current position bool flag = index >= length || (height = uint((sheet = sheets[index]).height)) + uint(config.priceEffectSpan) >= block.number; // Not the same block (or flag is true), calculate the price and update it if (flag || prev != height) { // totalToken0Scales > 0 Can calculate the price if (totalToken0Scales > 0) { // Calculate average price and Volatility // Calculation method of volatility of follow-up price uint tmp = _decodeFloat(p0.priceFloat); // New price uint price = totalToken1Value / totalToken0Scales; // Update price p0.remainScales = uint32(totalToken0Scales); p0.priceFloat = _encodeFloat(price); // Clear cumulative values totalToken0Scales = 0; totalToken1Value = 0; if (tmp > 0) { // Calculate average price // avgPrice[i + 1] = avgPrice[i] * 90% + price[i] * 10% p0.avgFloat = _encodeFloat((_decodeFloat(p0.avgFloat) * 9 + price) / 10); // When the accuracy of the token is very high or the value of the token relative to // eth is very low, the price may be very large, and there may be overflow problem, // it is not considered for the moment tmp = (price << 48) / tmp; if (tmp > 0x1000000000000) { tmp = tmp - 0x1000000000000; } else { tmp = 0x1000000000000 - tmp; } // earn = price[i] / price[i - 1] - 1; // seconds = time[i] - time[i - 1]; // sigmaSQ[i + 1] = sigmaSQ[i] * 90% + (earn ^ 2 / seconds) * 10% tmp = ( uint(p0.sigmaSQ) * 9 + // It is inevitable that prev greater than p0.height ((tmp * tmp * 1000 / ETHEREUM_BLOCK_TIMESPAN / (prev - uint(p0.height))) >> 48) ) / 10; // The current implementation assumes that the volatility cannot exceed 1, and // corresponding to this, when the calculated value exceeds 1, expressed as 0xFFFFFFFFFFFF if (tmp > 0xFFFFFFFFFFFF) { tmp = 0xFFFFFFFFFFFF; } p0.sigmaSQ = uint48(tmp); } // The calculation methods of average price and volatility are different for first price else { // The average price is equal to the price //p0.avgTokenAmount = uint64(price); p0.avgFloat = p0.priceFloat; // The volatility is 0 p0.sigmaSQ = uint48(0); } // Update price block number p0.height = uint32(prev); } // Move to new block number prev = height; } if (flag) { break; } // Cumulative price information totalToken0Scales += uint(sheet.remainScales); totalToken1Value += _decodeFloat(sheet.priceFloat) * uint(sheet.remainScales); } // Update price information if (index > uint(p0.index)) { p0.index = uint32(index); pair.price = p0; } } // Calculation number of blocks which mined function _calcMinedBlocks( PriceSheet[] storage sheets, uint index, PriceSheet memory sheet ) private view returns (uint minedBlocks, uint totalShares) { uint length = sheets.length; uint height = uint(sheet.height); totalShares = uint(sheet.shares); // Backward looking for sheets in the same block for (uint i = index; ++i < length && uint(sheets[i].height) == height;) { // Multiple sheets in the same block is a small probability event at present, so it can be ignored // to read more than once, if there are always multiple sheets in the same block, it means that the // sheets are very intensive, and the gas consumed here does not have a great impact totalShares += uint(sheets[i].shares); } // Find sheets in the same block forward uint prev = height; while (index > 0 && uint(prev = sheets[--index].height) == height) { // Multiple sheets in the same block is a small probability event at present, so it can be ignored // to read more than once, if there are always multiple sheets in the same block, it means that the // sheets are very intensive, and the gas consumed here does not have a great impact totalShares += uint(sheets[index].shares); } if (index > 0 || height > prev) { minedBlocks = height - prev; } else { minedBlocks = 10; } } /// @dev freeze token /// @param balances Balances ledger /// @param tokenAddress Destination token address /// @param tokenValue token amount /// @param value The remain value function _freeze( mapping(address=>UINT) storage balances, address tokenAddress, uint tokenValue, uint value ) private returns (uint) { if (tokenAddress == address(0)) { return value - tokenValue; } else { // Unfreeze nest UINT storage balance = balances[tokenAddress]; uint balanceValue = balance.value; if (balanceValue < tokenValue) { balance.value = 0; TransferHelper.safeTransferFrom(tokenAddress, msg.sender, address(this), tokenValue - balanceValue); } else { balance.value = balanceValue - tokenValue; } return value; } } /// @dev unfreeze token /// @param balances Balances ledger /// @param tokenAddress Destination token address /// @param tokenValue token amount /// @param accountIndex target accountIndex function _unfreeze( mapping(address=>UINT) storage balances, address tokenAddress, uint tokenValue, uint accountIndex ) private { if (tokenValue > 0) { if (tokenAddress == address(0)) { payable(indexAddress(accountIndex)).transfer(tokenValue); } else { balances[tokenAddress].value += tokenValue; } } } /// @dev Gets the index number of the specified address. If it does not exist, register /// @param addr Destination address /// @return The index number of the specified address function _addressIndex(address addr) private returns (uint) { uint index = _accountMapping[addr]; if (index == 0) { // If it exceeds the maximum number that 32 bits can store, you can't continue to register a new account. // If you need to support a new account, you need to update the contract require((_accountMapping[addr] = index = _accounts.length) < 0x100000000, "NM:!accounts"); _accounts.push().addr = addr; } return index; } function _reduction(uint delta, uint reductionRate) private pure returns (uint) { if (delta < NEST_REDUCTION_LIMIT) { uint n = delta / NEST_REDUCTION_SPAN; return 400 * reductionRate ** n / 10000 ** n; } return 400 * reductionRate ** 10 / 10000 ** 10; } /* ========== Tools and methods ========== */ /// @dev Encode the uint value as a floating-point representation in the form of fraction * 16 ^ exponent /// @param value Destination uint value /// @return float format function _encodeFloat(uint value) private pure returns (uint56) { uint exponent = 0; while (value > 0x3FFFFFFFFFFFF) { value >>= 4; ++exponent; } return uint56((value << 6) | exponent); } /// @dev Decode the floating-point representation of fraction * 16 ^ exponent to uint /// @param floatValue fraction value /// @return decode format function _decodeFloat(uint56 floatValue) private pure returns (uint) { return (uint(floatValue) >> 6) << ((uint(floatValue) & 0x3F) << 2); } // Convert uint to uint96 function _toUInt96(uint value) internal pure returns (uint96) { require(value < 0x1000000000000000000000000, "NBM:can't convert to uint96"); return uint96(value); } /* ========== Price Query ========== */ /// @dev Get the full information of latest trigger price /// @param pair Target price pair /// @return blockNumber The block number of price /// @return price The token price. (1eth equivalent to (price) token) /// @return avgPrice Average price /// @return sigmaSQ The square of the volatility (18 decimal places). The current implementation assumes that /// the volatility cannot exceed 1. Correspondingly, when the return value is equal to 999999999999996447, /// it means that the volatility has exceeded the range that can be expressed function _triggeredPriceInfo(PricePair storage pair) internal view returns ( uint blockNumber, uint price, uint avgPrice, uint sigmaSQ ) { PriceInfo memory priceInfo = pair.price; if (uint(priceInfo.remainScales) > 0) { return ( uint(priceInfo.height) + uint(_config.priceEffectSpan), _decodeFloat(priceInfo.priceFloat), _decodeFloat(priceInfo.avgFloat), (uint(priceInfo.sigmaSQ) * 1 ether) >> 48 ); } return (0, 0, 0, 0); } /// @dev Find the price at block number /// @param pair Target price pair /// @param height Destination block number /// @return blockNumber The block number of price /// @return price The token price. (1eth equivalent to (price) token) function _findPrice( PricePair storage pair, uint height ) internal view returns (uint blockNumber, uint price) { PriceSheet[] storage sheets = pair.sheets; uint priceEffectSpan = uint(_config.priceEffectSpan); uint length = sheets.length; uint index = 0; uint sheetHeight; height -= priceEffectSpan; { // If there is no sheet in this channel, length is 0, length - 1 will overflow, uint right = length - 1; uint left = 0; // Find the index use Binary Search while (left < right) { index = (left + right) >> 1; sheetHeight = uint(sheets[index].height); if (height > sheetHeight) { left = ++index; } else if (height < sheetHeight) { // When index = 0, this statement will have an underflow exception, which usually // indicates that the effective block height passed during the call is lower than // the block height of the first quotation right = --index; } else { break; } } } // Calculate price uint totalToken0Scales = 0; uint totalToken1Value = 0; uint h = 0; uint remainScales; PriceSheet memory sheet; // Find sheets forward for (uint i = index; i < length;) { sheet = sheets[i++]; sheetHeight = uint(sheet.height); if (height < sheetHeight) { break; } remainScales = uint(sheet.remainScales); if (remainScales > 0) { if (h == 0) { h = sheetHeight; } else if (h != sheetHeight) { break; } totalToken0Scales += remainScales; totalToken1Value += _decodeFloat(sheet.priceFloat) * remainScales; } } // Find sheets backward while (index > 0) { sheet = sheets[--index]; remainScales = uint(sheet.remainScales); if (remainScales > 0) { sheetHeight = uint(sheet.height); if (h == 0) { h = sheetHeight; } else if (h != sheetHeight) { break; } totalToken0Scales += remainScales; totalToken1Value += _decodeFloat(sheet.priceFloat) * remainScales; } } if (totalToken0Scales > 0) { return (h + priceEffectSpan, totalToken1Value / totalToken0Scales); } return (0, 0); } /// @dev Get the last (num) effective price /// @param pair Target price pair /// @param count The number of prices that want to return /// @return An array which length is num * 2, each two element expresses one price like blockNumber|price function _lastPriceList(PricePair storage pair, uint count) internal view returns (uint[] memory) { PriceSheet[] storage sheets = pair.sheets; PriceSheet memory sheet; uint[] memory array = new uint[](count <<= 1); uint priceEffectSpan = uint(_config.priceEffectSpan); uint index = sheets.length; uint totalToken0Scales = 0; uint totalToken1Value = 0; uint height = 0; for (uint i = 0; i < count;) { bool flag = index == 0; if (flag || height != uint((sheet = sheets[--index]).height)) { if (totalToken0Scales > 0 && height + priceEffectSpan < block.number) { array[i++] = height + priceEffectSpan; array[i++] = totalToken1Value / totalToken0Scales; } if (flag) { break; } totalToken0Scales = 0; totalToken1Value = 0; height = uint(sheet.height); } uint remainScales = uint(sheet.remainScales); totalToken0Scales += remainScales; totalToken1Value += _decodeFloat(sheet.priceFloat) * remainScales; } return array; } } // File contracts/NestBatchPlatform2.sol // GPL-3.0-or-later pragma solidity ^0.8.6; /// @dev This contract implemented the query logic of nest contract NestBatchPlatform2 is NestBatchMining, INestBatchPriceView, INestBatchPrice2 { /* ========== INestBatchPriceView ========== */ /// @dev Get the full information of latest trigger price /// @param channelId Target channelId /// @param pairIndex Target pairIndex /// @return blockNumber The block number of price /// @return price The token price. (1eth equivalent to (price) token) /// @return avgPrice Average price /// @return sigmaSQ The square of the volatility (18 decimal places). The current implementation assumes that /// the volatility cannot exceed 1. Correspondingly, when the return value is equal to 999999999999996447, /// it means that the volatility has exceeded the range that can be expressed function triggeredPriceInfo(uint channelId, uint pairIndex) external view override noContract returns ( uint blockNumber, uint price, uint avgPrice, uint sigmaSQ ) { return _triggeredPriceInfo(_channels[channelId].pairs[pairIndex]); } /// @dev Find the price at block number /// @param channelId Target channelId /// @param pairIndex Target pairIndex /// @param height Destination block number /// @return blockNumber The block number of price /// @return price The token price. (1eth equivalent to (price) token) function findPrice( uint channelId, uint pairIndex, uint height ) external view override noContract returns (uint blockNumber, uint price) { return _findPrice(_channels[channelId].pairs[pairIndex], height); } /// @dev Get the last (num) effective price /// @param channelId Target channelId /// @param pairIndex Target pairIndex /// @param count The number of prices that want to return /// @return An array which length is num * 2, each two element expresses one price like blockNumber|price function lastPriceList(uint channelId, uint pairIndex, uint count) external view override noContract returns (uint[] memory) { return _lastPriceList(_channels[channelId].pairs[pairIndex], count); } /* ========== INestBatchPrice ========== */ /// @dev Get the full information of latest trigger price /// @param channelId Target channelId /// @param pairIndices Array of pair indices /// @param payback Address to receive refund /// @return prices Price array, i * 4 is the block where the ith price is located, i * 4 + 1 is the ith price, /// i * 4 + 2 is the ith average price and i * 4 + 3 is the ith volatility function triggeredPriceInfo( uint channelId, uint[] calldata pairIndices, address payback ) external payable override returns (uint[] memory prices) { PricePair[0xFFFF] storage pairs = _pay(channelId, payback).pairs; uint n = pairIndices.length << 2; prices = new uint[](n); while (n > 0) { n -= 4; (prices[n], prices[n + 1], prices[n + 2], prices[n + 3]) = _triggeredPriceInfo(pairs[pairIndices[n >> 2]]); } } /// @dev Find the price at block number /// @param channelId Target channelId /// @param pairIndices Array of pair indices /// @param height Destination block number /// @param payback Address to receive refund /// @return prices Price array, i * 2 is the block where the ith price is located, and i * 2 + 1 is the ith price function findPrice( uint channelId, uint[] calldata pairIndices, uint height, address payback ) external payable override returns (uint[] memory prices) { PricePair[0xFFFF] storage pairs = _pay(channelId, payback).pairs; uint n = pairIndices.length << 1; prices = new uint[](n); while (n > 0) { n -= 2; (prices[n], prices[n + 1]) = _findPrice(pairs[pairIndices[n >> 1]], height); } } /// @dev Get the last (num) effective price /// @param channelId Target channelId /// @param pairIndices Array of pair indices /// @param count The number of prices that want to return /// @param payback Address to receive refund /// @return prices Result array, i * count * 2 to (i + 1) * count * 2 - 1 are /// the price results of group i quotation pairs function lastPriceList( uint channelId, uint[] calldata pairIndices, uint count, address payback ) external payable override returns (uint[] memory prices) { PricePair[0xFFFF] storage pairs = _pay(channelId, payback).pairs; uint row = count << 1; uint n = pairIndices.length * row; prices = new uint[](n); while (n > 0) { n -= row; uint[] memory pi = _lastPriceList(pairs[pairIndices[n / row]], count); for (uint i = 0; i < row; ++i) { prices[n + i] = pi[i]; } } } // Payment of transfer fee function _pay(uint channelId, address payback) private returns (PriceChannel storage channel) { channel = _channels[channelId]; if (msg.value > 0) { payable(payback).transfer(msg.value); // BSC adopts the old gas calculation strategy. Direct transfer may lead to the excess of gas // in the agency contract. The following methods should be used for transfer //TransferHelper.safeTransferETH(payback, msg.value - fee); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"channelId","type":"uint256"},{"indexed":false,"internalType":"address","name":"token0","type":"address"},{"indexed":false,"internalType":"uint256","name":"unit","type":"uint256"},{"indexed":false,"internalType":"address","name":"reward","type":"address"}],"name":"Open","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"channelId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"pairIndex","type":"uint256"},{"indexed":false,"internalType":"address","name":"miner","type":"address"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"scale","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"Post","type":"event"},{"inputs":[],"name":"_governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"address","name":"target","type":"address"}],"name":"addPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"addr","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"address","name":"newOpener","type":"address"}],"name":"changeOpener","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256[][]","name":"indices","type":"uint256[][]"}],"name":"close","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint128","name":"vault","type":"uint128"}],"name":"decrease","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"}],"name":"estimate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256[]","name":"pairIndices","type":"uint256[]"},{"internalType":"uint256","name":"height","type":"uint256"},{"internalType":"address","name":"payback","type":"address"}],"name":"findPrice","outputs":[{"internalType":"uint256[]","name":"prices","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"height","type":"uint256"}],"name":"findPrice","outputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAccountCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getAccountIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"}],"name":"getChannelInfo","outputs":[{"components":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"address","name":"token0","type":"address"},{"internalType":"uint96","name":"unit","type":"uint96"},{"internalType":"address","name":"reward","type":"address"},{"internalType":"uint96","name":"rewardPerBlock","type":"uint96"},{"internalType":"uint128","name":"vault","type":"uint128"},{"internalType":"uint96","name":"rewards","type":"uint96"},{"internalType":"uint16","name":"postFeeUnit","type":"uint16"},{"internalType":"uint16","name":"count","type":"uint16"},{"internalType":"address","name":"opener","type":"address"},{"internalType":"uint32","name":"genesisBlock","type":"uint32"},{"internalType":"uint16","name":"singleFee","type":"uint16"},{"internalType":"uint16","name":"reductionRate","type":"uint16"},{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint96","name":"sheetCount","type":"uint96"}],"internalType":"struct INestBatchMining.PairView[]","name":"pairs","type":"tuple[]"}],"internalType":"struct INestBatchMining.PriceChannelView","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getConfig","outputs":[{"components":[{"internalType":"uint8","name":"maxBiteNestedLevel","type":"uint8"},{"internalType":"uint16","name":"priceEffectSpan","type":"uint16"},{"internalType":"uint16","name":"pledgeNest","type":"uint16"}],"internalType":"struct INestBatchMining.Config","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getMinedBlocks","outputs":[{"internalType":"uint256","name":"minedBlocks","type":"uint256"},{"internalType":"uint256","name":"totalShares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint128","name":"vault","type":"uint128"}],"name":"increase","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"indexAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"governance","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256[]","name":"pairIndices","type":"uint256[]"},{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"address","name":"payback","type":"address"}],"name":"lastPriceList","outputs":[{"internalType":"uint256[]","name":"prices","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"lastPriceList","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint256","name":"order","type":"uint256"}],"name":"list","outputs":[{"components":[{"internalType":"uint32","name":"index","type":"uint32"},{"internalType":"address","name":"miner","type":"address"},{"internalType":"uint32","name":"height","type":"uint32"},{"internalType":"uint32","name":"remainScales","type":"uint32"},{"internalType":"uint32","name":"token0Scales","type":"uint32"},{"internalType":"uint32","name":"token1Scales","type":"uint32"},{"internalType":"uint24","name":"nestNum1k","type":"uint24"},{"internalType":"uint8","name":"level","type":"uint8"},{"internalType":"uint8","name":"shares","type":"uint8"},{"internalType":"uint152","name":"price","type":"uint152"}],"internalType":"struct INestBatchMining.PriceSheetView[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"components":[{"internalType":"uint96","name":"rewardPerBlock","type":"uint96"},{"internalType":"uint16","name":"postFeeUnit","type":"uint16"},{"internalType":"uint16","name":"singleFee","type":"uint16"},{"internalType":"uint16","name":"reductionRate","type":"uint16"}],"internalType":"struct INestBatchMining.ChannelConfig","name":"config","type":"tuple"}],"name":"modify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256","name":"tokenIndex","type":"uint256"},{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"modifyToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"uint96","name":"unit","type":"uint96"},{"internalType":"address","name":"reward","type":"address"},{"internalType":"address[]","name":"tokens","type":"address[]"},{"components":[{"internalType":"uint96","name":"rewardPerBlock","type":"uint96"},{"internalType":"uint16","name":"postFeeUnit","type":"uint16"},{"internalType":"uint16","name":"singleFee","type":"uint16"},{"internalType":"uint16","name":"reductionRate","type":"uint16"}],"internalType":"struct INestBatchMining.ChannelConfig","name":"config","type":"tuple"}],"name":"open","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"pay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256","name":"scale","type":"uint256"},{"internalType":"uint256[]","name":"equivalents","type":"uint256[]"}],"name":"post","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint8","name":"maxBiteNestedLevel","type":"uint8"},{"internalType":"uint16","name":"priceEffectSpan","type":"uint16"},{"internalType":"uint16","name":"pledgeNest","type":"uint16"}],"internalType":"struct INestBatchMining.Config","name":"config","type":"tuple"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"takeNum","type":"uint256"},{"internalType":"uint256","name":"newEquivalent","type":"uint256"}],"name":"take","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256","name":"pairIndex","type":"uint256"}],"name":"triggeredPriceInfo","outputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"avgPrice","type":"uint256"},{"internalType":"uint256","name":"sigmaSQ","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256[]","name":"pairIndices","type":"uint256[]"},{"internalType":"address","name":"payback","type":"address"}],"name":"triggeredPriceInfo","outputs":[{"internalType":"uint256[]","name":"prices","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newGovernance","type":"address"}],"name":"update","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b5061592c80620000216000396000f3fe6080604052600436106101d85760003560e01c80639ba63e9e11610102578063c86fe65211610095578063f3a7132111610064578063f3a71321146105f7578063f3fef3a314610617578063f7888aec14610637578063fd9b53871461065757600080fd5b8063c86fe65214610571578063d2a53f6114610584578063d4aa113c146105a4578063de0777ed146105e457600080fd5b8063ba2d4a8f116100d1578063ba2d4a8f1461047d578063c3f909d41461049d578063c4d66de814610531578063c708ba0c1461055157600080fd5b80639ba63e9e146103cf5780639c79293814610413578063a98e4e7714610433578063b7e004fa1461044857600080fd5b80633ac30e4b1161017a578063594e25b511610149578063594e25b5146103695780637ba3033d1461037c578063860506801461038f578063954b756f146103af57600080fd5b80633ac30e4b146102dc578063493183541461030957806354a80f04146103295780635938b38d1461034957600080fd5b80631c1b8772116101b65780631c1b87721461023f5780631c2f3e3d1461025f5780631d7a49931461029c5780632d1e4721146102c957600080fd5b80630313766f146101dd578063045b2f44146101ff57806315994a681461021f575b600080fd5b3480156101e957600080fd5b506101fd6101f8366004614e18565b610677565b005b34801561020b57600080fd5b506101fd61021a366004614e65565b610794565b34801561022b57600080fd5b506101fd61023a366004614e92565b61081b565b34801561024b57600080fd5b506101fd61025a366004614ec7565b610981565b34801561026b57600080fd5b5060005461027f906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102a857600080fd5b506102bc6102b7366004614ee2565b610a60565b6040516102939190614f53565b6101fd6102d736600461508f565b610cd7565b3480156102e857600080fd5b506102fc6102f73660046150cb565b610dd0565b6040516102939190615106565b34801561031557600080fd5b506101fd61032436600461522d565b6110b4565b61033c610337366004615279565b61175e565b60405161029391906152e0565b34801561035557600080fd5b506101fd610364366004615324565b611891565b61033c610377366004615279565b61192d565b6101fd61038a366004615347565b611a30565b34801561039b57600080fd5b5061027f6103aa366004614ee2565b611cf9565b3480156103bb57600080fd5b506101fd6103ca36600461539a565b611d2e565b3480156103db57600080fd5b506104056103ea366004614ec7565b6001600160a01b031660009081526003602052604090205490565b604051908152602001610293565b34801561041f57600080fd5b5061040561042e366004614ee2565b611de6565b34801561043f57600080fd5b50600254610405565b34801561045457600080fd5b506104686104633660046153ac565b611f8b565b60408051928352602083019190915201610293565b34801561048957600080fd5b506101fd6104983660046153e5565b612092565b3480156104a957600080fd5b506105006040805160608101825260008082526020820181905291810191909152506040805160608101825260015460ff8116825261ffff6101008204811660208401526301000000909104169181019190915290565b60408051825160ff16815260208084015161ffff908116918301919091529282015190921690820152606001610293565b34801561053d57600080fd5b506101fd61054c366004614ec7565b612488565b34801561055d57600080fd5b506101fd61056c366004615324565b6124a0565b6101fd61057f3660046150cb565b612691565b34801561059057600080fd5b5061033c61059f36600461546c565b612ff8565b3480156105b057600080fd5b506105c46105bf3660046153ac565b613087565b604080519485526020850193909352918301526060820152608001610293565b61033c6105f2366004615498565b613120565b34801561060357600080fd5b5061046861061236600461546c565b613269565b34801561062357600080fd5b506101fd6106323660046154f6565b6132fd565b34801561064357600080fd5b50610405610652366004615520565b61336f565b34801561066357600080fd5b506101fd61067236600461508f565b6133cf565b60006004848154811061068c5761068c61554a565b6000918252602090912060036203000190920201908101549091506001600160a01b031633146107035760405162461bcd60e51b815260206004820152600b60248201527f4e4f4d3a216f70656e657200000000000000000000000000000000000000000060448201526064015b60405180910390fd5b61070c82613505565b600282018054601090610730908490600160801b90046001600160601b0316615576565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550826001600160a01b03166108fc839081150290604051600060405180830381858888f1935050505015801561078d573d6000803e3d6000fd5b5050505050565b6000600483815481106107a9576107a961554a565b6000918252602090912060036203000190920201908101549091506001600160a01b0316331461080c5760405162461bcd60e51b815260206004820152600e60248201526d2727a69d3737ba1037b832b732b960911b60448201526064016106fa565b610816818361355e565b505050565b600080546040516391e1472b60e01b815233600482015260248101929092526001600160a01b0316906391e1472b90604401602060405180830381865afa15801561086a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088e9190615596565b6108c65760405162461bcd60e51b81526020600482015260096024820152682722a9aa1d10b3b7bb60b91b60448201526064016106fa565b6000600484815481106108db576108db61554a565b9060005260206000209062030001020190508262010000036109155780546001600160a01b0319166001600160a01b03831617815561097b565b826201000103610941576001810180546001600160a01b0319166001600160a01b03841617905561097b565b81816004018461ffff81106109585761095861554a565b6003020180546001600160a01b0319166001600160a01b03929092169190911790555b50505050565b6000546001600160a01b031633811480610a0557506040516391e1472b60e01b8152336004820152600060248201526001600160a01b038216906391e1472b90604401602060405180830381865afa1580156109e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a059190615596565b610a3d5760405162461bcd60e51b81526020600482015260096024820152682722a9aa1d10b3b7bb60b91b60448201526064016106fa565b50600080546001600160a01b0319166001600160a01b0392909216919091179055565b604080516101c08101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e08201839052610100820183905261012082018390526101408201839052610160820183905261018082018390526101a08201526004805491929184908110610ae657610ae661554a565b6000918252602082206203000191909102016002810154909250600160f01b900461ffff16908167ffffffffffffffff811115610b2557610b256155b8565b604051908082528060200260200182016040528015610b6a57816020015b6040805180820190915260008082526020820152815260200190600190039081610b435790505b50905060005b82811015610bf8576000846004018261ffff8110610b9057610b9061554a565b604080518082019091526003919091029190910180546001600160a01b0316825260028101546001600160601b031660208301528451909250849084908110610bdb57610bdb61554a565b60200260200101819052505080610bf1906155ce565b9050610b70565b50604080516101c08101825295865283546001600160a01b0380821660208901526001600160601b03600160a01b92839004811693890193909352600186015480821660608a01528290048316608089015260028601546001600160801b03811660a08a0152600160801b810490931660c089015261ffff600160e01b8404811660e08a0152600160f01b909304831661010089015260039095015494851661012088015263ffffffff90850416610140870152600160c01b84048116610160870152600160d01b909304909216610180850152506101a08301525090565b600060048381548110610cec57610cec61554a565b60009182526020909120620300019091020160018101549091506001600160a01b031680610d7157826001600160801b03163414610d6c5760405162461bcd60e51b815260206004820152600f60248201527f4e4f4d3a7661756c74206572726f72000000000000000000000000000000000060448201526064016106fa565b610d86565b610d86813330866001600160801b0316613660565b600282018054849190600090610da69084906001600160801b03166155e7565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555050505050565b6060333214610e125760405162461bcd60e51b815260206004820152600e60248201526d139154d50e8858dbdb9d1c9858dd60921b60448201526064016106fa565b600060048781548110610e2757610e2761554a565b906000526020600020906203000102016004018661ffff8110610e4c57610e4c61554a565b60030201600201905060008467ffffffffffffffff811115610e7057610e706155b8565b604051908082528060200260200182016040528015610eef57816020015b604080516101408101825260008082526020808301829052928201819052606082018190526080820181905260a0820181905260c0820181905260e0820181905261010082018190526101208201528252600019909201910181610e8e5790505b5082549091506000858103611033576000610f0a8984615607565b90506000888211610f1c576000610f26565b610f268983615607565b90505b8082111561102c57610f3a8261561a565b9150610fff868381548110610f5157610f5161554a565b60009182526020918290206040805161012081018252919092015463ffffffff80821683526401000000008204811694830194909452600160401b8104841692820192909252600160601b820483166060820152600160801b8204909216608083015262ffffff600160a01b82041660a083015260ff600160b81b8204811660c0840152600160c01b82041660e083015266ffffffffffffff600160c81b90910416610100820152836137d7565b858461100a816155ce565b95508151811061101c5761101c61554a565b6020026020010181905250610f29565b50506110a6565b8760006110408983615631565b90508381111561104d5750825b808210156110a35761106a868381548110610f5157610f5161554a565b8584611075816155ce565b9550815181106110875761108761554a565b60200260200101819052508161109c906155ce565b915061104d565b50505b509098975050505050505050565b6040805160608101825260015460ff8116825261ffff610100820481166020840152630100000090910416918101919091526004805460009190869081106110fe576110fe61554a565b9060005260206000209062030001020190506000806000806000600260008154811061112c5761112c61554a565b60009182526020918290206040805160608101825260018b810154600160a01b908190046001600160601b0316835260038d015490810463ffffffff1696830196909652600160d01b90950461ffff1691810191909152600292909202019091019150885b8015611677576000600489016111a68361561a565b92508261ffff81106111ba576111ba61554a565b6003020190506000808d8d858181106111d5576111d561554a565b90506020028101906111e79190615644565b9150505b801561164d5760008e8e868181106112055761120561554a565b90506020028101906112179190615644565b6112208461561a565b9350838181106112325761123261554a565b90506020020135905060008460020182815481106112525761125261554a565b600091825260208083206040805161012081018252939091015463ffffffff80821685526401000000008204811693850193909352600160401b8104831691840191909152600160601b810482166060840152600160801b81049091166080830152600160a01b810462ffffff1660a0830152600160b81b810460ff90811660c0840152600160c01b82041660e0830152600160c81b900466ffffffffffffff1661010082015291508c900361133a57806000015163ffffffff169b5060028c815481106113225761132261554a565b90600052602060002090600202016001019750611390565b805163ffffffff168c146113905760405162461bcd60e51b815260206004820152600960248201527f4e4d3a216d696e6572000000000000000000000000000000000000000000000060448201526064016106fa565b60008c1180156113bc5750438e6020015161ffff16826020015163ffffffff166113ba9190615631565b105b1561164657856000036114615760e081015160ff16801561145f576000806113e888600201868661390f565b8b516020808e01519088015193955091935061019092849261141e91611414919063ffffffff16615607565b60408f0151613a6b565b611428878761568e565b611432919061568e565b61143c919061568e565b61144691906156a5565b61145091906156a5565b61145a908f615631565b9d5050505b505b60a08101516114759062ffffff168b615631565b9950806060015163ffffffff168961148d9190615631565b6080820151610100830151919a5063ffffffff1690600681901c6603ffffffffffff1660029190911b60fc161b6114c4919061568e565b6114ce9085615631565b60008083526060830181905260808301526002860180549195508291849081106114fa576114fa61554a565b60009182526020918290208351910180549284015160408501516060860151608087015160a088015160c089015160e08a0151610100909a015166ffffffffffffff16600160c81b0278ffffffffffffffffffffffffffffffffffffffffffffffffff60ff9b8c16600160c01b0260ff60c01b199c909316600160b81b029b909b1661ffff60b81b1962ffffff909416600160a01b0262ffffff60a01b1963ffffffff968716600160801b021676ffffffffffffff0000000000000000000000000000000019978716600160601b026fffffffff00000000000000000000000019998816600160401b02999099166fffffffffffffffff0000000000000000199a88166401000000000267ffffffffffffffff19909e1697909c16969096179b909b17979097169890981794909417929092161795909517949094161792909217929092169190911790555b50506111eb565b506116588b83613af8565b81546116709086906001600160a01b0316838c614041565b5050611191565b5086546116ab9083906001600160a01b038116906116a590600160a01b90046001600160601b03168761568e565b89614041565b6116d7827304abeda201850ac0124161f037efd70c74ddc74c6116a587683635c9adc5dea0000061568e565b60028701546001600160801b0316808611156116f1578095505b6116fb8682615607565b6002890180547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166001600160801b039290921691909117905560018801546117509084906001600160a01b0316888a614041565b505050505050505050505050565b6060600061176c87846140c9565b6004019050600184901b6000611782828861568e565b90508067ffffffffffffffff81111561179d5761179d6155b8565b6040519080825280602002602001820160405280156117c6578160200160208202803683370190505b5093505b8015611885576117da8282615607565b9050600061181f848a8a6117ee87876156a5565b8181106117fd576117fd61554a565b9050602002013561ffff81106118155761181561554a565b6003020188614135565b905060005b8381101561187e5781818151811061183e5761183e61554a565b60200260200101518682856118539190615631565b815181106118635761186361554a565b6020908102919091010152611877816155ce565b9050611824565b50506117ca565b50505095945050505050565b6000600483815481106118a6576118a661554a565b6000918252602090912060036203000190920201908101549091506001600160a01b031633146119095760405162461bcd60e51b815260206004820152600e60248201526d2727a69d3737ba1037b832b732b960911b60448201526064016106fa565b60030180546001600160a01b0319166001600160a01b039290921691909117905550565b6060600061193b87846140c9565b6004019050600185901b8067ffffffffffffffff81111561195e5761195e6155b8565b604051908082528060200260200182016040528015611987578160200160208202803683370190505b5092505b8015611a255761199c600282615607565b90506119da828888600185901c8181106119b8576119b861554a565b9050602002013561ffff81106119d0576119d061554a565b60030201866143d2565b8483815181106119ec576119ec61554a565b6020026020010185846001611a019190615631565b81518110611a1157611a1161554a565b60209081029190910101919091525261198b565b505095945050505050565b604080516060810182526001805460ff8116835261ffff61010082048116602085015263010000009091041692820192909252908414611ab25760405162461bcd60e51b815260206004820152600a60248201527f4e4f4d3a217363616c650000000000000000000000000000000000000000000060448201526064016106fa565b600060048681548110611ac757611ac761554a565b9060005260206000209062030001020190506000611ae4336147af565b9050600060028281548110611afb57611afb61554a565b60009182526020909120600285810154604088015160019290940290920101925061ffff600160f01b9091048116913491611b6c9185917304abeda201850ac0124161f037efd70c74ddc74c91611b5391168661568e565b611b6690683635c9adc5dea0000061568e565b84614894565b8554909150611b9c9084906001600160a01b03811690611b6690600160a01b90046001600160601b03168661568e565b90505b8115611ced57600060048601611bb48461561a565b93508361ffff8110611bc857611bc861554a565b6003020190506000898985818110611be257611be261554a565b90506020020135905060008111611c3b5760405162461bcd60e51b815260206004820152600f60248201527f4e4f4d3a216571756976616c656e74000000000000000000000000000000000060448201526064016106fa565b8154611c539086906001600160a01b03168386614894565b9250611c5f8883613af8565b6002820154604080518e815260208101879052338183015260608101929092526001608083015260a08201839052517fa9f51105abd325b0b448a253f5a627f7e2b99b1f2ff238d0779128d29ac3d85b9181900360c00190a1611ce6826002018760018b6040015161ffff1688600014611cda576000611cdd565b60015b60ff168661490d565b5050611b9f565b50505050505050505050565b600060028281548110611d0e57611d0e61554a565b60009182526020909120600290910201546001600160a01b031692915050565b600080546040516391e1472b60e01b815233600482015260248101929092526001600160a01b0316906391e1472b90604401602060405180830381865afa158015611d7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da19190615596565b611dd95760405162461bcd60e51b81526020600482015260096024820152682722a9aa1d10b3b7bb60b91b60448201526064016106fa565b80600161081682826156da565b60008060048381548110611dfc57611dfc61554a565b60009182526020909120620300019091020160068101805491925090600a5b8115611f1557600083611e2d8461561a565b93508381548110611e4057611e4061554a565b60009182526020918290206040805161012081018252929091015463ffffffff80821684526401000000008204811694840194909452600160401b8104841691830191909152600160601b810483166060830152600160801b81049092166080820152600160a01b820462ffffff1660a0820152600160b81b820460ff90811660c0830152600160c01b83041660e08201819052600160c81b90920466ffffffffffffff16610100820152915015611f0f576020810151611f079063ffffffff1643615607565b915050611f15565b50611e1b565b600384015461019090611f4e90611f3990600160a01b900463ffffffff1643615607565b6003870154600160d01b900461ffff16613a6b565b6001860154611f6d90600160a01b90046001600160601b03168461568e565b611f77919061568e565b611f8191906156a5565b9695505050505050565b600080600060048581548110611fa357611fa361554a565b6000918252602082206004620300019092020101906003020160020190506120858185838781548110611fd857611fd861554a565b60009182526020918290206040805161012081018252919092015463ffffffff80821683526401000000008204811694830194909452600160401b8104841692820192909252600160601b820483166060820152600160801b8204909216608083015262ffffff600160a01b82041660a083015260ff600160b81b8204811660c0840152600160c01b82041660e083015266ffffffffffffff600160c81b9091041661010082015261390f565b92509250505b9250929050565b6000856001600160601b0316116120eb5760405162461bcd60e51b815260206004820152601160248201527f4e4f4d3a756e6974206d757374203e203000000000000000000000000000000060448201526064016106fa565b600454604080519182526001600160a01b0388811660208401526001600160601b0388168383015286166060830152517fd5d675c43c23a6c1e3ad060a603f30590f57c52d5e4a71994bf009848e8fe9e19181900360800190a16004805460018101825560009182526001600160a01b03888116600160a01b6001600160601b038a168102919091177f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b620300019094029384019081557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c840180546001600160a01b031916938a16939093179092557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d830180547dffff0000000000000000000000000000000000000000000000000000000016600160f01b61ffff8916021790557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19e90920180547fffffffffffffffff00000000000000000000000000000000000000000000000016337fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff16174363ffffffff1690930292909217909155905b83811015612474578484828181106122c7576122c761554a565b90506020020160208101906122dc9190614ec7565b6001600160a01b0316886001600160a01b03160361233c5760405162461bcd60e51b815260206004820152601c60248201527f4e4f4d3a746f6b656e2063616e277420657175616c20746f6b656e300000000060448201526064016106fa565b60005b81811015612404578585828181106123595761235961554a565b905060200201602081019061236e9190614ec7565b6001600160a01b03168686848181106123895761238961554a565b905060200201602081019061239e9190614ec7565b6001600160a01b0316036123f45760405162461bcd60e51b815260206004820152601460248201527f4e4f4d3a746f6b656e207265697465726174656400000000000000000000000060448201526064016106fa565b6123fd816155ce565b905061233f565b508484828181106124175761241761554a565b905060200201602081019061242c9190614ec7565b826004018261ffff81106124425761244261554a565b6003020180546001600160a01b0319166001600160a01b039290921691909117905561246d816155ce565b90506122ad565b5061247f818361355e565b50505050505050565b61249181614ae6565b50600280546001018155600052565b6000600483815481106124b5576124b561554a565b6000918252602090912060036203000190920201908101549091506001600160a01b031633146125185760405162461bcd60e51b815260206004820152600e60248201526d2727a69d3737ba1037b832b732b960911b60448201526064016106fa565b80546001600160a01b038084169116036125745760405162461bcd60e51b815260206004820152601c60248201527f4e4f4d3a746f6b656e2063616e277420657175616c20746f6b656e300000000060448201526064016106fa565b6002810154600160f01b900461ffff1660005b8181101561261a57836001600160a01b0316836004018261ffff81106125af576125af61554a565b60030201546001600160a01b03160361260a5760405162461bcd60e51b815260206004820152601460248201527f4e4f4d3a746f6b656e207265697465726174656400000000000000000000000060448201526064016106fa565b612613816155ce565b9050612587565b5082826004018261ffff81106126325761263261554a565b6003020180546001600160a01b0319166001600160a01b0392909216919091179055600282018054601e9061267190600160f01b900461ffff1661574f565b91906101000a81548161ffff021916908361ffff16021790555050505050565b6040805160608101825260015460ff8116825261ffff61010082048116602084015263010000009091041691810191909152826127105760405162461bcd60e51b815260206004820152600b60248201527f4e4d3a2174616b654e756d00000000000000000000000000000000000000000060448201526064016106fa565b600082116127605760405162461bcd60e51b815260206004820152600960248201527f4e4d3a217072696365000000000000000000000000000000000000000000000060448201526064016106fa565b6000600487815481106127755761277561554a565b9060005260206000209062030001020190506000816004016201000088106127a9576127a46201000089615607565b6127ab565b875b61ffff81106127bc576127bc61554a565b60030201905060008160020187815481106127d9576127d961554a565b60009182526020918290206040805161012081018252929091015463ffffffff808216845264010000000082048116848601819052600160401b8304821693850193909352600160601b820481166060850152600160801b8204166080840152600160a01b810462ffffff1660a0840152600160b81b810460ff90811660c0850152600160c01b82041660e0840152600160c81b900466ffffffffffffff166101008301529186015190925043916128959161ffff1690615631565b10156128e35760405162461bcd60e51b815260206004820152600960248201527f4e4d3a217374617465000000000000000000000000000000000000000000000060448201526064016106fa565b85816040015163ffffffff166128f99190615607565b63ffffffff166040820152600061290f336147af565b90506000826080015163ffffffff16836060015163ffffffff166129339190615631565b60a084015161294b9062ffffff1660028b901b61568e565b61295591906156a5565b60c0840151909150889060ff9081169081101561298c57875160ff1681101561298057600182901b91505b612989816155ce565b90505b6000600285815481106129a1576129a161554a565b906000526020600020906002020160010190506000349050620100008e1015612c2e578b876060015163ffffffff166129da9190615607565b63ffffffff908116606089015260808801516129f8918e9116615631565b63ffffffff1660808801526002880180548891908f908110612a1c57612a1c61554a565b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001600c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160000160106101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160000160146101000a81548162ffffff021916908362ffffff16021790555060c08201518160000160176101000a81548160ff021916908360ff16021790555060e08201518160000160186101000a81548160ff021916908360ff1602179055506101008201518160000160196101000a81548166ffffffffffffff021916908366ffffffffffffff160217905550905050612bd4828a60000160009054906101000a90046001600160a01b03168b60000160149054906101000a90046001600160601b03166001600160601b03168f88612bca9190615607565b611b66919061568e565b8854610100890151919250612c279184916001600160a01b0316908f90600681901c6603ffffffffffff1660029190911b60fc161b612c13919061568e565b612c1d8f8961568e565b611b669190615631565b9050612ef3565b612c3b620100008f615607565b9d508b876060015163ffffffff16612c539190615631565b63ffffffff90811660608901526080880151612c71918e9116615607565b63ffffffff1660808801526002880180548891908f908110612c9557612c9561554a565b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001600c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160000160106101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160000160146101000a81548162ffffff021916908362ffffff16021790555060c08201518160000160176101000a81548160ff021916908360ff16021790555060e08201518160000160186101000a81548160ff021916908360ff1602179055506101008201518160000160196101000a81548166ffffffffffffff021916908366ffffffffffffff160217905550905050612e43828a60000160009054906101000a90046001600160a01b03168b60000160149054906101000a90046001600160601b03166001600160601b03168f88612bca9190615631565b6101008801519091506000908d90600681901c6603ffffffffffff1660029190911b60fc161b612e73919061568e565b905080612e808d8761568e565b1115612ec657612ebf838a60000160009054906101000a90046001600160a01b0316838f89612eaf919061568e565b612eb99190615607565b85614894565b9150612ef1565b8854612ef19084906001600160a01b0316612ee18f8961568e565b612eeb9085615607565b8a614041565b505b612f1f827304abeda201850ac0124161f037efd70c74ddc74c611b6688683635c9adc5dea0000061568e565b90508015612f6f5760405162461bcd60e51b815260206004820152600860248201527f4e4f4d3a2166656500000000000000000000000000000000000000000000000060448201526064016106fa565b5050612f7b8887613af8565b6002860154604080518f8152602081018f9052338183015260608101929092526080820184905260a082018b9052517fa9f51105abd325b0b448a253f5a627f7e2b99b1f2ff238d0779128d29ac3d85b9181900360c00190a1612fe986600201858486600886901b8e61490d565b50505050505050505050505050565b606033321461303a5760405162461bcd60e51b815260206004820152600e60248201526d139154d50e8858dbdb9d1c9858dd60921b60448201526064016106fa565b61307f600485815481106130505761305061554a565b906000526020600020906203000102016004018461ffff81106130755761307561554a565b6003020183614135565b949350505050565b60008080803332146130cc5760405162461bcd60e51b815260206004820152600e60248201526d139154d50e8858dbdb9d1c9858dd60921b60448201526064016106fa565b613110600487815481106130e2576130e261554a565b906000526020600020906203000102016004018661ffff81106131075761310761554a565b60030201614b61565b9299919850965090945092505050565b6060600061312e86846140c9565b6004019050600284901b8067ffffffffffffffff811115613151576131516155b8565b60405190808252806020026020018201604052801561317a578160200160208202803683370190505b5092505b801561325f5761318f600482615607565b90506131c3828787600285901c8181106131ab576131ab61554a565b9050602002013561ffff81106131075761310761554a565b8685815181106131d5576131d561554a565b60200260200101878660016131ea9190615631565b815181106131fa576131fa61554a565b602002602001018887600261320f9190615631565b8151811061321f5761321f61554a565b60200260200101898860036132349190615631565b815181106132445761324461554a565b6020908102919091010193909352929091529190525261317e565b5050949350505050565b6000803332146132ac5760405162461bcd60e51b815260206004820152600e60248201526d139154d50e8858dbdb9d1c9858dd60921b60448201526064016106fa565b6132f1600486815481106132c2576132c261554a565b906000526020600020906203000102016004018561ffff81106132e7576132e761554a565b60030201846143d2565b91509150935093915050565b336000908152600360205260408120546002805490919081106133225761332261554a565b600091825260208083206001600160a01b038716845260016002909302019190910190526040812080549092508391839161335e908490615607565b909155506108169050833384614c82565b6001600160a01b03811660009081526003602052604081205460028054909190811061339d5761339d61554a565b600091825260208083206001600160a01b03871684526001600290930201919091019052604090205490505b92915050565b6000600483815481106133e4576133e461554a565b6000918252602090912060036203000190920201908101549091506001600160a01b031633146134475760405162461bcd60e51b815260206004820152600e60248201526d2727a69d3737ba1037b832b732b960911b60448201526064016106fa565b60018101546002820180546001600160a01b03909216918491906000906134789084906001600160801b0316615770565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555060006001600160a01b0316816001600160a01b0316036134f15760405133906001600160801b03851680156108fc02916000818181858888f193505050501580156134eb573d6000803e3d6000fd5b5061097b565b61097b8133856001600160801b0316614c82565b6000600160601b821061355a5760405162461bcd60e51b815260206004820152601b60248201527f4e424d3a63616e277420636f6e7665727420746f2075696e743936000000000060448201526064016106fa565b5090565b61356b6020820182615790565b6001830180546001600160601b0392909216600160a01b026001600160a01b039092169190911790556135a460408201602083016157ab565b60028301805461ffff92909216600160e01b027fffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092169190911790556135f160608201604083016157ab565b60038301805461ffff92909216600160c01b027fffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffff90921691909117905561363e60808201606083016157ab565b82600301601a6101000a81548161ffff021916908361ffff1602179055505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905291516000928392908816916136f291906157c8565b6000604051808303816000865af19150503d806000811461372f576040519150601f19603f3d011682016040523d82523d6000602084013e613734565b606091505b509150915081801561375e57508051158061375e57508080602001905181019061375e9190615596565b6137cf5760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f464160448201527f494c45440000000000000000000000000000000000000000000000000000000060648201526084016106fa565b505050505050565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081018290526101208101919091526040518061014001604052808363ffffffff168152602001613853856000015163ffffffff16611cf9565b6001600160a01b03168152602001846020015163ffffffff168152602001846040015163ffffffff168152602001846060015163ffffffff168152602001846080015163ffffffff1681526020018460a0015162ffffff1681526020018460c0015160ff1681526020018460e0015160ff1681526020016138f18561010001516603ffffffffffff600682901c1660fc60029290921b919091161b90565b72ffffffffffffffffffffffffffffffffffffff1690529392505050565b8254602082015160e083015160009260ff9091169163ffffffff16855b82613936826155ce565b9150811080156139705750818882815481106139545761395461554a565b600091825260209091200154640100000000900463ffffffff16145b156139ae578781815481106139875761398761554a565b6000918252602090912001546139a790600160c01b900460ff1685615631565b935061392c565b50805b6000871180156139f9575081886139c78961561a565b985088815481106139da576139da61554a565b600091825260209091200154640100000000900463ffffffff16915081145b15613a3757878781548110613a1057613a1061554a565b600091825260209091200154613a3090600160c01b900460ff1685615631565b93506139b1565b6000871180613a4557508082115b15613a5b57613a548183615607565b9450613a60565b600a94505b505050935093915050565b600063018cba80831015613abe576000613a886227ac40856156a5565b9050613a96816127106158db565b613aa082856158db565b613aac9061019061568e565b613ab691906156a5565b9150506133c9565b701d6329f1c35ca4bfabb9f5610000000000613adb600a846158e7565b613ae79061019061568e565b613af191906156a5565b9392505050565b6040805160c08082018352600184015463ffffffff808216808552640100000000830482166020808701829052600160401b850490931686880152600160601b840466ffffffffffffff908116606080890191909152600160981b8604909116608080890191909152600160d01b90950465ffffffffffff1660a08089019190915260028a0180548a5161012081018c5260008082529781018890529a8b01879052928a01869052958901859052880184905294870183905260e087018390526101008701839052929590929190819081905b60008787101580613cac5750438c6020015161ffff168b8981548110613bf357613bf361554a565b60009182526020918290206040805161012081018252929091015463ffffffff808216845264010000000082048116948401859052600160401b8204811692840192909252600160601b810482166060840152600160801b81049091166080830152600160a01b810462ffffff1660a0830152600160b81b810460ff90811660c0840152600160c01b82041660e0830152600160c81b900466ffffffffffffff166101008201529095509350613ca99085615631565b10155b90508080613cba5750828614155b15613e94578415613e90576060890151600681901c6603ffffffffffff1660029190911b60fc161b6000613cee87876156a5565b63ffffffff881660408d01529050613d0581614dc4565b66ffffffffffffff1660608c0152600096508695508115613e665760808b0151613d6a90600a908390600681901c6603ffffffffffff1660029190911b60fc161b613d5190600961568e565b613d5b9190615631565b613d6591906156a5565b614dc4565b66ffffffffffffff1660808c0152613d8682603083901b6156a5565b91506601000000000000821115613daf57613da8660100000000000083615607565b9150613dc3565b613dc0826601000000000000615607565b91505b600a60308c6020015163ffffffff168a613ddd9190615607565b612f3a613dea868061568e565b613df6906103e861568e565b613e0091906156a5565b613e0a91906156a5565b901c8c60a0015165ffffffffffff166009613e25919061568e565b613e2f9190615631565b613e3991906156a5565b915065ffffffffffff821115613e535765ffffffffffff91505b65ffffffffffff821660a08c0152613e81565b60608b015166ffffffffffffff1660808c0152600060a08c01525b505063ffffffff861660208a01525b8295505b8015613ea05750613f0a565b6040820151613eb59063ffffffff1686615631565b604083015161010084015191965063ffffffff1690600681901c6603ffffffffffff1660029190911b60fc161b613eec919061568e565b613ef69085615631565b93505085613f03906155ce565b9550613bcb565b875163ffffffff168611156140345785886000019063ffffffff16908163ffffffff1681525050878a60010160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001600c6101000a81548166ffffffffffffff021916908366ffffffffffffff16021790555060808201518160000160136101000a81548166ffffffffffffff021916908366ffffffffffffff16021790555060a082015181600001601a6101000a81548165ffffffffffff021916908365ffffffffffff1602179055509050505b5050505050505050505050565b811561097b576001600160a01b0383166140965761405e81611cf9565b6001600160a01b03166108fc839081150290604051600060405180830381858888f193505050501580156134eb573d6000803e3d6000fd5b6001600160a01b038316600090815260208590526040812080548492906140be908490615631565b909155505050505050565b6000600483815481106140de576140de61554a565b90600052602060002090620300010201905060003411156133c9576040516001600160a01b038316903480156108fc02916000818181858888f1935050505015801561412e573d6000803e3d6000fd5b5092915050565b604080516101208101825260008082526020820181905291810182905260608181018390526080820183905260a0820183905260c0820183905260e0820183905261010082019290925260028401906000600185901b94508467ffffffffffffffff8111156141a6576141a66155b8565b6040519080825280602002602001820160405280156141cf578160200160208202803683370190505b506001548454919250610100900461ffff169060008080805b8a8110156143c257841580806142c35750896142038761561a565b965086815481106142165761421661554a565b60009182526020918290206040805161012081018252929091015463ffffffff808216845264010000000082048116948401859052600160401b8204811692840192909252600160601b810482166060840152600160801b81049091166080830152600160a01b810462ffffff1660a0830152600160b81b810460ff90811660c0840152600160c01b82041660e0830152600160c81b900466ffffffffffffff1661010082015299508314155b1561436d576000851180156142e05750436142de8885615631565b105b1561434b576142ef8784615631565b88836142fa816155ce565b94508151811061430c5761430c61554a565b602090810291909101015261432185856156a5565b888361432c816155ce565b94508151811061433e5761433e61554a565b6020026020010181815250505b801561435757506143c2565b6000945060009350886020015163ffffffff1692505b604089015163ffffffff166143828187615631565b6101008b01519096508190600681901c6603ffffffffffff1660029190911b60fc161b6143af919061568e565b6143b99086615631565b945050506141e8565b50949a9950505050505050505050565b60015460028301805460009283929161010090910461ffff169083806143f88489615607565b97506000614407600185615607565b905060005b818110156144885760016144208383615631565b901c93508684815481106144365761443661554a565b600091825260209091200154640100000000900463ffffffff169250828a111561446d57614463846155ce565b935083905061440c565b828a10156144885761447e8461561a565b935083915061440c565b50506040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052819081908190865b88811015614626578a816144ed816155ce565b9250815481106144ff576144ff61554a565b60009182526020918290206040805161012081018252929091015463ffffffff808216845264010000000082048116948401859052600160401b8204811692840192909252600160601b810482166060840152600160801b81049091166080830152600160a01b810462ffffff1660a0830152600160b81b810460ff90811660c0840152600160c01b82041660e0830152600160c81b900466ffffffffffffff166101008201529097509150868e1061462657604082015163ffffffff169250821561462157836000036145d5578693506145dd565b868403614626575b6145e78387615631565b6101008301519096508390600681901c6603ffffffffffff1660029190911b60fc161b614614919061568e565b61461e9086615631565b94505b6144da565b505b861561476c57896146388861561a565b9750878154811061464b5761464b61554a565b60009182526020918290206040805161012081018252929091015463ffffffff80821684526401000000008204811694840194909452600160401b81048416918301829052600160601b810484166060840152600160801b81049093166080830152600160a01b830462ffffff1660a0830152600160b81b830460ff90811660c0840152600160c01b84041660e0830152600160c81b90920466ffffffffffffff166101008201529092509050811561476757806020015163ffffffff1695508260000361471b57859250614723565b85830361476c575b61472d8286615631565b6101008201519095508290600681901c6603ffffffffffff1660029190911b60fc161b61475a919061568e565b6147649085615631565b93505b614628565b84156147995761477c8984615631565b61478686866156a5565b9b509b505050505050505050505061208b565b5060009d8e9d509b505050505050505050505050565b6001600160a01b0381166000908152600360205260408120548082036133c957506002546001600160a01b038316600090815260036020526040902081905564010000000081106148425760405162461bcd60e51b815260206004820152600c60248201527f4e4d3a216163636f756e7473000000000000000000000000000000000000000060448201526064016106fa565b6002805460018101825560008290527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace91020180546001600160a01b0319166001600160a01b03851617905592915050565b60006001600160a01b0384166148b5576148ae8383615607565b905061307f565b6001600160a01b03841660009081526020869052604090208054848110156148f557600082556148f08633306148eb858a615607565b613660565b614902565b6148ff8582615607565b82555b509195945050505050565b856040518061012001604052808763ffffffff1681526020014363ffffffff1681526020018663ffffffff1681526020018663ffffffff1681526020018663ffffffff1681526020018562ffffff168152602001600885901c60ff1681526020018460ff1660ff16815260200161498384614dc4565b66ffffffffffffff908116909152825460018101845560009384526020938490208351910180549484015160408501516060860151608087015160a088015160c089015160e08a0151610100909a0151909816600160c81b0278ffffffffffffffffffffffffffffffffffffffffffffffffff60ff9a8b16600160c01b0260ff60c01b199b909a16600160b81b029a909a1661ffff60b81b1962ffffff909316600160a01b0262ffffff60a01b1963ffffffff958616600160801b021676ffffffffffffff0000000000000000000000000000000019968616600160601b026fffffffff00000000000000000000000019988716600160401b02989098166fffffffffffffffff0000000000000000199987166401000000000267ffffffffffffffff19909f1696909b16959095179c909c1796909616979097179390931791909116179690961795909516949094179190911791909116179055505050505050565b6000546001600160a01b031615614b3f5760405162461bcd60e51b815260206004820152601060248201527f4e4553543a21696e697469616c697a650000000000000000000000000000000060448201526064016106fa565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6040805160c081018252600183015463ffffffff8082168352640100000000820481166020840152600160401b82041692820183905266ffffffffffffff600160601b820481166060840152600160981b820416608083015265ffffffffffff600160d01b9091041660a08201526000918291829182919015614c6b576001546020820151614bff91610100900461ffff169063ffffffff16615631565b6060820151600681901c6603ffffffffffff1660029190911b60fc161b6080830151600681901c6603ffffffffffff1660029190911b60fc161b60308460a0015165ffffffffffff16670de0b6b3a7640000614c5b919061568e565b901c945094509450945050614c7b565b6000806000809450945094509450505b9193509193565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790529151600092839290871691614d0c91906157c8565b6000604051808303816000865af19150503d8060008114614d49576040519150601f19603f3d011682016040523d82523d6000602084013e614d4e565b606091505b5091509150818015614d78575080511580614d78575080806020019051810190614d789190615596565b61078d5760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c45440060448201526064016106fa565b6000805b6603ffffffffffff831115614dee5760049290921c91614de7816155ce565b9050614dc8565b60069290921b909117919050565b80356001600160a01b0381168114614e1357600080fd5b919050565b600080600060608486031215614e2d57600080fd5b83359250614e3d60208501614dfc565b9150604084013590509250925092565b600060808284031215614e5f57600080fd5b50919050565b60008060a08385031215614e7857600080fd5b82359150614e898460208501614e4d565b90509250929050565b600080600060608486031215614ea757600080fd5b8335925060208401359150614ebe60408501614dfc565b90509250925092565b600060208284031215614ed957600080fd5b613af182614dfc565b600060208284031215614ef457600080fd5b5035919050565b600081518084526020808501945080840160005b83811015614f4857815180516001600160a01b031688528301516001600160601b03168388015260409096019590820190600101614f0f565b509495945050505050565b602081528151602082015260006020830151614f7a60408401826001600160a01b03169052565b5060408301516001600160601b03811660608401525060608301516001600160a01b03811660808401525060808301516001600160601b03811660a08401525060a08301516001600160801b03811660c08401525060c08301516001600160601b03811660e08401525060e0830151610100614ffb8185018361ffff169052565b84015190506101206150128482018361ffff169052565b840151905061014061502e848201836001600160a01b03169052565b84015190506101606150478482018363ffffffff169052565b840151905061018061505e8482018361ffff169052565b84015190506101a06150758482018361ffff169052565b8401516101c084810152905061307f6101e0840182614efb565b600080604083850312156150a257600080fd5b8235915060208301356001600160801b03811681146150c057600080fd5b809150509250929050565b600080600080600060a086880312156150e357600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b602080825282518282018190526000919060409081850190868401855b828110156151db578151805163ffffffff9081168652878201516001600160a01b0316888701528682015181168787015260608083015182169087015260808083015182169087015260a0808301519091169086015260c08082015162ffffff169086015260e08082015160ff9081169187019190915261010080830151909116908601526101209081015172ffffffffffffffffffffffffffffffffffffff16908501526101409093019290850190600101615123565b5091979650505050505050565b60008083601f8401126151fa57600080fd5b50813567ffffffffffffffff81111561521257600080fd5b6020830191508360208260051b850101111561208b57600080fd5b60008060006040848603121561524257600080fd5b83359250602084013567ffffffffffffffff81111561526057600080fd5b61526c868287016151e8565b9497909650939450505050565b60008060008060006080868803121561529157600080fd5b85359450602086013567ffffffffffffffff8111156152af57600080fd5b6152bb888289016151e8565b909550935050604086013591506152d460608701614dfc565b90509295509295909350565b6020808252825182820181905260009190848201906040850190845b81811015615318578351835292840192918401916001016152fc565b50909695505050505050565b6000806040838503121561533757600080fd5b82359150614e8960208401614dfc565b6000806000806060858703121561535d57600080fd5b8435935060208501359250604085013567ffffffffffffffff81111561538257600080fd5b61538e878288016151e8565b95989497509550505050565b600060608284031215614e5f57600080fd5b600080604083850312156153bf57600080fd5b50508035926020909101359150565b80356001600160601b0381168114614e1357600080fd5b60008060008060008061010087890312156153ff57600080fd5b61540887614dfc565b9550615416602088016153ce565b945061542460408801614dfc565b9350606087013567ffffffffffffffff81111561544057600080fd5b61544c89828a016151e8565b909450925061546090508860808901614e4d565b90509295509295509295565b60008060006060848603121561548157600080fd5b505081359360208301359350604090920135919050565b600080600080606085870312156154ae57600080fd5b84359350602085013567ffffffffffffffff8111156154cc57600080fd5b6154d8878288016151e8565b90945092506154eb905060408601614dfc565b905092959194509250565b6000806040838503121561550957600080fd5b61551283614dfc565b946020939093013593505050565b6000806040838503121561553357600080fd5b61553c83614dfc565b9150614e8960208401614dfc565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6001600160601b0382811682821603908082111561412e5761412e615560565b6000602082840312156155a857600080fd5b81518015158114613af157600080fd5b634e487b7160e01b600052604160045260246000fd5b6000600182016155e0576155e0615560565b5060010190565b6001600160801b0381811683821601908082111561412e5761412e615560565b818103818111156133c9576133c9615560565b60008161562957615629615560565b506000190190565b808201808211156133c9576133c9615560565b6000808335601e1984360301811261565b57600080fd5b83018035915067ffffffffffffffff82111561567657600080fd5b6020019150600581901b360382131561208b57600080fd5b80820281158282048414176133c9576133c9615560565b6000826156c257634e487b7160e01b600052601260045260246000fd5b500490565b61ffff811681146156d757600080fd5b50565b813560ff81168082146156ec57600080fd5b825460ff1981168217845591506020840135615707816156c7565b62ffff008160081b169050808262ffffff19851617178455604085013561572d816156c7565b64ffffffffff19939093169091171760189190911b64ffff0000001617905550565b600061ffff80831681810361576657615766615560565b6001019392505050565b6001600160801b0382811682821603908082111561412e5761412e615560565b6000602082840312156157a257600080fd5b613af1826153ce565b6000602082840312156157bd57600080fd5b8135613af1816156c7565b6000825160005b818110156157e957602081860181015185830152016157cf565b506000920191825250919050565b600181815b8085111561583257816000190482111561581857615818615560565b8085161561582557918102915b93841c93908002906157fc565b509250929050565b600082615849575060016133c9565b81615856575060006133c9565b816001811461586c576002811461587657615892565b60019150506133c9565b60ff84111561588757615887615560565b50506001821b6133c9565b5060208310610133831016604e8410600b84101617156158b5575081810a6133c9565b6158bf83836157f7565b80600019048211156158d3576158d3615560565b029392505050565b6000613af1838361583a565b6000613af160ff84168361583a56fea2646970667358221220d12072c062af38bd6545ce889d43de293e35bbcc859409f412fa330f02fd14cd64736f6c63430008110033
Deployed Bytecode
0x6080604052600436106101d85760003560e01c80639ba63e9e11610102578063c86fe65211610095578063f3a7132111610064578063f3a71321146105f7578063f3fef3a314610617578063f7888aec14610637578063fd9b53871461065757600080fd5b8063c86fe65214610571578063d2a53f6114610584578063d4aa113c146105a4578063de0777ed146105e457600080fd5b8063ba2d4a8f116100d1578063ba2d4a8f1461047d578063c3f909d41461049d578063c4d66de814610531578063c708ba0c1461055157600080fd5b80639ba63e9e146103cf5780639c79293814610413578063a98e4e7714610433578063b7e004fa1461044857600080fd5b80633ac30e4b1161017a578063594e25b511610149578063594e25b5146103695780637ba3033d1461037c578063860506801461038f578063954b756f146103af57600080fd5b80633ac30e4b146102dc578063493183541461030957806354a80f04146103295780635938b38d1461034957600080fd5b80631c1b8772116101b65780631c1b87721461023f5780631c2f3e3d1461025f5780631d7a49931461029c5780632d1e4721146102c957600080fd5b80630313766f146101dd578063045b2f44146101ff57806315994a681461021f575b600080fd5b3480156101e957600080fd5b506101fd6101f8366004614e18565b610677565b005b34801561020b57600080fd5b506101fd61021a366004614e65565b610794565b34801561022b57600080fd5b506101fd61023a366004614e92565b61081b565b34801561024b57600080fd5b506101fd61025a366004614ec7565b610981565b34801561026b57600080fd5b5060005461027f906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102a857600080fd5b506102bc6102b7366004614ee2565b610a60565b6040516102939190614f53565b6101fd6102d736600461508f565b610cd7565b3480156102e857600080fd5b506102fc6102f73660046150cb565b610dd0565b6040516102939190615106565b34801561031557600080fd5b506101fd61032436600461522d565b6110b4565b61033c610337366004615279565b61175e565b60405161029391906152e0565b34801561035557600080fd5b506101fd610364366004615324565b611891565b61033c610377366004615279565b61192d565b6101fd61038a366004615347565b611a30565b34801561039b57600080fd5b5061027f6103aa366004614ee2565b611cf9565b3480156103bb57600080fd5b506101fd6103ca36600461539a565b611d2e565b3480156103db57600080fd5b506104056103ea366004614ec7565b6001600160a01b031660009081526003602052604090205490565b604051908152602001610293565b34801561041f57600080fd5b5061040561042e366004614ee2565b611de6565b34801561043f57600080fd5b50600254610405565b34801561045457600080fd5b506104686104633660046153ac565b611f8b565b60408051928352602083019190915201610293565b34801561048957600080fd5b506101fd6104983660046153e5565b612092565b3480156104a957600080fd5b506105006040805160608101825260008082526020820181905291810191909152506040805160608101825260015460ff8116825261ffff6101008204811660208401526301000000909104169181019190915290565b60408051825160ff16815260208084015161ffff908116918301919091529282015190921690820152606001610293565b34801561053d57600080fd5b506101fd61054c366004614ec7565b612488565b34801561055d57600080fd5b506101fd61056c366004615324565b6124a0565b6101fd61057f3660046150cb565b612691565b34801561059057600080fd5b5061033c61059f36600461546c565b612ff8565b3480156105b057600080fd5b506105c46105bf3660046153ac565b613087565b604080519485526020850193909352918301526060820152608001610293565b61033c6105f2366004615498565b613120565b34801561060357600080fd5b5061046861061236600461546c565b613269565b34801561062357600080fd5b506101fd6106323660046154f6565b6132fd565b34801561064357600080fd5b50610405610652366004615520565b61336f565b34801561066357600080fd5b506101fd61067236600461508f565b6133cf565b60006004848154811061068c5761068c61554a565b6000918252602090912060036203000190920201908101549091506001600160a01b031633146107035760405162461bcd60e51b815260206004820152600b60248201527f4e4f4d3a216f70656e657200000000000000000000000000000000000000000060448201526064015b60405180910390fd5b61070c82613505565b600282018054601090610730908490600160801b90046001600160601b0316615576565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550826001600160a01b03166108fc839081150290604051600060405180830381858888f1935050505015801561078d573d6000803e3d6000fd5b5050505050565b6000600483815481106107a9576107a961554a565b6000918252602090912060036203000190920201908101549091506001600160a01b0316331461080c5760405162461bcd60e51b815260206004820152600e60248201526d2727a69d3737ba1037b832b732b960911b60448201526064016106fa565b610816818361355e565b505050565b600080546040516391e1472b60e01b815233600482015260248101929092526001600160a01b0316906391e1472b90604401602060405180830381865afa15801561086a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088e9190615596565b6108c65760405162461bcd60e51b81526020600482015260096024820152682722a9aa1d10b3b7bb60b91b60448201526064016106fa565b6000600484815481106108db576108db61554a565b9060005260206000209062030001020190508262010000036109155780546001600160a01b0319166001600160a01b03831617815561097b565b826201000103610941576001810180546001600160a01b0319166001600160a01b03841617905561097b565b81816004018461ffff81106109585761095861554a565b6003020180546001600160a01b0319166001600160a01b03929092169190911790555b50505050565b6000546001600160a01b031633811480610a0557506040516391e1472b60e01b8152336004820152600060248201526001600160a01b038216906391e1472b90604401602060405180830381865afa1580156109e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a059190615596565b610a3d5760405162461bcd60e51b81526020600482015260096024820152682722a9aa1d10b3b7bb60b91b60448201526064016106fa565b50600080546001600160a01b0319166001600160a01b0392909216919091179055565b604080516101c08101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e08201839052610100820183905261012082018390526101408201839052610160820183905261018082018390526101a08201526004805491929184908110610ae657610ae661554a565b6000918252602082206203000191909102016002810154909250600160f01b900461ffff16908167ffffffffffffffff811115610b2557610b256155b8565b604051908082528060200260200182016040528015610b6a57816020015b6040805180820190915260008082526020820152815260200190600190039081610b435790505b50905060005b82811015610bf8576000846004018261ffff8110610b9057610b9061554a565b604080518082019091526003919091029190910180546001600160a01b0316825260028101546001600160601b031660208301528451909250849084908110610bdb57610bdb61554a565b60200260200101819052505080610bf1906155ce565b9050610b70565b50604080516101c08101825295865283546001600160a01b0380821660208901526001600160601b03600160a01b92839004811693890193909352600186015480821660608a01528290048316608089015260028601546001600160801b03811660a08a0152600160801b810490931660c089015261ffff600160e01b8404811660e08a0152600160f01b909304831661010089015260039095015494851661012088015263ffffffff90850416610140870152600160c01b84048116610160870152600160d01b909304909216610180850152506101a08301525090565b600060048381548110610cec57610cec61554a565b60009182526020909120620300019091020160018101549091506001600160a01b031680610d7157826001600160801b03163414610d6c5760405162461bcd60e51b815260206004820152600f60248201527f4e4f4d3a7661756c74206572726f72000000000000000000000000000000000060448201526064016106fa565b610d86565b610d86813330866001600160801b0316613660565b600282018054849190600090610da69084906001600160801b03166155e7565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555050505050565b6060333214610e125760405162461bcd60e51b815260206004820152600e60248201526d139154d50e8858dbdb9d1c9858dd60921b60448201526064016106fa565b600060048781548110610e2757610e2761554a565b906000526020600020906203000102016004018661ffff8110610e4c57610e4c61554a565b60030201600201905060008467ffffffffffffffff811115610e7057610e706155b8565b604051908082528060200260200182016040528015610eef57816020015b604080516101408101825260008082526020808301829052928201819052606082018190526080820181905260a0820181905260c0820181905260e0820181905261010082018190526101208201528252600019909201910181610e8e5790505b5082549091506000858103611033576000610f0a8984615607565b90506000888211610f1c576000610f26565b610f268983615607565b90505b8082111561102c57610f3a8261561a565b9150610fff868381548110610f5157610f5161554a565b60009182526020918290206040805161012081018252919092015463ffffffff80821683526401000000008204811694830194909452600160401b8104841692820192909252600160601b820483166060820152600160801b8204909216608083015262ffffff600160a01b82041660a083015260ff600160b81b8204811660c0840152600160c01b82041660e083015266ffffffffffffff600160c81b90910416610100820152836137d7565b858461100a816155ce565b95508151811061101c5761101c61554a565b6020026020010181905250610f29565b50506110a6565b8760006110408983615631565b90508381111561104d5750825b808210156110a35761106a868381548110610f5157610f5161554a565b8584611075816155ce565b9550815181106110875761108761554a565b60200260200101819052508161109c906155ce565b915061104d565b50505b509098975050505050505050565b6040805160608101825260015460ff8116825261ffff610100820481166020840152630100000090910416918101919091526004805460009190869081106110fe576110fe61554a565b9060005260206000209062030001020190506000806000806000600260008154811061112c5761112c61554a565b60009182526020918290206040805160608101825260018b810154600160a01b908190046001600160601b0316835260038d015490810463ffffffff1696830196909652600160d01b90950461ffff1691810191909152600292909202019091019150885b8015611677576000600489016111a68361561a565b92508261ffff81106111ba576111ba61554a565b6003020190506000808d8d858181106111d5576111d561554a565b90506020028101906111e79190615644565b9150505b801561164d5760008e8e868181106112055761120561554a565b90506020028101906112179190615644565b6112208461561a565b9350838181106112325761123261554a565b90506020020135905060008460020182815481106112525761125261554a565b600091825260208083206040805161012081018252939091015463ffffffff80821685526401000000008204811693850193909352600160401b8104831691840191909152600160601b810482166060840152600160801b81049091166080830152600160a01b810462ffffff1660a0830152600160b81b810460ff90811660c0840152600160c01b82041660e0830152600160c81b900466ffffffffffffff1661010082015291508c900361133a57806000015163ffffffff169b5060028c815481106113225761132261554a565b90600052602060002090600202016001019750611390565b805163ffffffff168c146113905760405162461bcd60e51b815260206004820152600960248201527f4e4d3a216d696e6572000000000000000000000000000000000000000000000060448201526064016106fa565b60008c1180156113bc5750438e6020015161ffff16826020015163ffffffff166113ba9190615631565b105b1561164657856000036114615760e081015160ff16801561145f576000806113e888600201868661390f565b8b516020808e01519088015193955091935061019092849261141e91611414919063ffffffff16615607565b60408f0151613a6b565b611428878761568e565b611432919061568e565b61143c919061568e565b61144691906156a5565b61145091906156a5565b61145a908f615631565b9d5050505b505b60a08101516114759062ffffff168b615631565b9950806060015163ffffffff168961148d9190615631565b6080820151610100830151919a5063ffffffff1690600681901c6603ffffffffffff1660029190911b60fc161b6114c4919061568e565b6114ce9085615631565b60008083526060830181905260808301526002860180549195508291849081106114fa576114fa61554a565b60009182526020918290208351910180549284015160408501516060860151608087015160a088015160c089015160e08a0151610100909a015166ffffffffffffff16600160c81b0278ffffffffffffffffffffffffffffffffffffffffffffffffff60ff9b8c16600160c01b0260ff60c01b199c909316600160b81b029b909b1661ffff60b81b1962ffffff909416600160a01b0262ffffff60a01b1963ffffffff968716600160801b021676ffffffffffffff0000000000000000000000000000000019978716600160601b026fffffffff00000000000000000000000019998816600160401b02999099166fffffffffffffffff0000000000000000199a88166401000000000267ffffffffffffffff19909e1697909c16969096179b909b17979097169890981794909417929092161795909517949094161792909217929092169190911790555b50506111eb565b506116588b83613af8565b81546116709086906001600160a01b0316838c614041565b5050611191565b5086546116ab9083906001600160a01b038116906116a590600160a01b90046001600160601b03168761568e565b89614041565b6116d7827304abeda201850ac0124161f037efd70c74ddc74c6116a587683635c9adc5dea0000061568e565b60028701546001600160801b0316808611156116f1578095505b6116fb8682615607565b6002890180547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166001600160801b039290921691909117905560018801546117509084906001600160a01b0316888a614041565b505050505050505050505050565b6060600061176c87846140c9565b6004019050600184901b6000611782828861568e565b90508067ffffffffffffffff81111561179d5761179d6155b8565b6040519080825280602002602001820160405280156117c6578160200160208202803683370190505b5093505b8015611885576117da8282615607565b9050600061181f848a8a6117ee87876156a5565b8181106117fd576117fd61554a565b9050602002013561ffff81106118155761181561554a565b6003020188614135565b905060005b8381101561187e5781818151811061183e5761183e61554a565b60200260200101518682856118539190615631565b815181106118635761186361554a565b6020908102919091010152611877816155ce565b9050611824565b50506117ca565b50505095945050505050565b6000600483815481106118a6576118a661554a565b6000918252602090912060036203000190920201908101549091506001600160a01b031633146119095760405162461bcd60e51b815260206004820152600e60248201526d2727a69d3737ba1037b832b732b960911b60448201526064016106fa565b60030180546001600160a01b0319166001600160a01b039290921691909117905550565b6060600061193b87846140c9565b6004019050600185901b8067ffffffffffffffff81111561195e5761195e6155b8565b604051908082528060200260200182016040528015611987578160200160208202803683370190505b5092505b8015611a255761199c600282615607565b90506119da828888600185901c8181106119b8576119b861554a565b9050602002013561ffff81106119d0576119d061554a565b60030201866143d2565b8483815181106119ec576119ec61554a565b6020026020010185846001611a019190615631565b81518110611a1157611a1161554a565b60209081029190910101919091525261198b565b505095945050505050565b604080516060810182526001805460ff8116835261ffff61010082048116602085015263010000009091041692820192909252908414611ab25760405162461bcd60e51b815260206004820152600a60248201527f4e4f4d3a217363616c650000000000000000000000000000000000000000000060448201526064016106fa565b600060048681548110611ac757611ac761554a565b9060005260206000209062030001020190506000611ae4336147af565b9050600060028281548110611afb57611afb61554a565b60009182526020909120600285810154604088015160019290940290920101925061ffff600160f01b9091048116913491611b6c9185917304abeda201850ac0124161f037efd70c74ddc74c91611b5391168661568e565b611b6690683635c9adc5dea0000061568e565b84614894565b8554909150611b9c9084906001600160a01b03811690611b6690600160a01b90046001600160601b03168661568e565b90505b8115611ced57600060048601611bb48461561a565b93508361ffff8110611bc857611bc861554a565b6003020190506000898985818110611be257611be261554a565b90506020020135905060008111611c3b5760405162461bcd60e51b815260206004820152600f60248201527f4e4f4d3a216571756976616c656e74000000000000000000000000000000000060448201526064016106fa565b8154611c539086906001600160a01b03168386614894565b9250611c5f8883613af8565b6002820154604080518e815260208101879052338183015260608101929092526001608083015260a08201839052517fa9f51105abd325b0b448a253f5a627f7e2b99b1f2ff238d0779128d29ac3d85b9181900360c00190a1611ce6826002018760018b6040015161ffff1688600014611cda576000611cdd565b60015b60ff168661490d565b5050611b9f565b50505050505050505050565b600060028281548110611d0e57611d0e61554a565b60009182526020909120600290910201546001600160a01b031692915050565b600080546040516391e1472b60e01b815233600482015260248101929092526001600160a01b0316906391e1472b90604401602060405180830381865afa158015611d7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da19190615596565b611dd95760405162461bcd60e51b81526020600482015260096024820152682722a9aa1d10b3b7bb60b91b60448201526064016106fa565b80600161081682826156da565b60008060048381548110611dfc57611dfc61554a565b60009182526020909120620300019091020160068101805491925090600a5b8115611f1557600083611e2d8461561a565b93508381548110611e4057611e4061554a565b60009182526020918290206040805161012081018252929091015463ffffffff80821684526401000000008204811694840194909452600160401b8104841691830191909152600160601b810483166060830152600160801b81049092166080820152600160a01b820462ffffff1660a0820152600160b81b820460ff90811660c0830152600160c01b83041660e08201819052600160c81b90920466ffffffffffffff16610100820152915015611f0f576020810151611f079063ffffffff1643615607565b915050611f15565b50611e1b565b600384015461019090611f4e90611f3990600160a01b900463ffffffff1643615607565b6003870154600160d01b900461ffff16613a6b565b6001860154611f6d90600160a01b90046001600160601b03168461568e565b611f77919061568e565b611f8191906156a5565b9695505050505050565b600080600060048581548110611fa357611fa361554a565b6000918252602082206004620300019092020101906003020160020190506120858185838781548110611fd857611fd861554a565b60009182526020918290206040805161012081018252919092015463ffffffff80821683526401000000008204811694830194909452600160401b8104841692820192909252600160601b820483166060820152600160801b8204909216608083015262ffffff600160a01b82041660a083015260ff600160b81b8204811660c0840152600160c01b82041660e083015266ffffffffffffff600160c81b9091041661010082015261390f565b92509250505b9250929050565b6000856001600160601b0316116120eb5760405162461bcd60e51b815260206004820152601160248201527f4e4f4d3a756e6974206d757374203e203000000000000000000000000000000060448201526064016106fa565b600454604080519182526001600160a01b0388811660208401526001600160601b0388168383015286166060830152517fd5d675c43c23a6c1e3ad060a603f30590f57c52d5e4a71994bf009848e8fe9e19181900360800190a16004805460018101825560009182526001600160a01b03888116600160a01b6001600160601b038a168102919091177f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b620300019094029384019081557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c840180546001600160a01b031916938a16939093179092557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d830180547dffff0000000000000000000000000000000000000000000000000000000016600160f01b61ffff8916021790557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19e90920180547fffffffffffffffff00000000000000000000000000000000000000000000000016337fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff16174363ffffffff1690930292909217909155905b83811015612474578484828181106122c7576122c761554a565b90506020020160208101906122dc9190614ec7565b6001600160a01b0316886001600160a01b03160361233c5760405162461bcd60e51b815260206004820152601c60248201527f4e4f4d3a746f6b656e2063616e277420657175616c20746f6b656e300000000060448201526064016106fa565b60005b81811015612404578585828181106123595761235961554a565b905060200201602081019061236e9190614ec7565b6001600160a01b03168686848181106123895761238961554a565b905060200201602081019061239e9190614ec7565b6001600160a01b0316036123f45760405162461bcd60e51b815260206004820152601460248201527f4e4f4d3a746f6b656e207265697465726174656400000000000000000000000060448201526064016106fa565b6123fd816155ce565b905061233f565b508484828181106124175761241761554a565b905060200201602081019061242c9190614ec7565b826004018261ffff81106124425761244261554a565b6003020180546001600160a01b0319166001600160a01b039290921691909117905561246d816155ce565b90506122ad565b5061247f818361355e565b50505050505050565b61249181614ae6565b50600280546001018155600052565b6000600483815481106124b5576124b561554a565b6000918252602090912060036203000190920201908101549091506001600160a01b031633146125185760405162461bcd60e51b815260206004820152600e60248201526d2727a69d3737ba1037b832b732b960911b60448201526064016106fa565b80546001600160a01b038084169116036125745760405162461bcd60e51b815260206004820152601c60248201527f4e4f4d3a746f6b656e2063616e277420657175616c20746f6b656e300000000060448201526064016106fa565b6002810154600160f01b900461ffff1660005b8181101561261a57836001600160a01b0316836004018261ffff81106125af576125af61554a565b60030201546001600160a01b03160361260a5760405162461bcd60e51b815260206004820152601460248201527f4e4f4d3a746f6b656e207265697465726174656400000000000000000000000060448201526064016106fa565b612613816155ce565b9050612587565b5082826004018261ffff81106126325761263261554a565b6003020180546001600160a01b0319166001600160a01b0392909216919091179055600282018054601e9061267190600160f01b900461ffff1661574f565b91906101000a81548161ffff021916908361ffff16021790555050505050565b6040805160608101825260015460ff8116825261ffff61010082048116602084015263010000009091041691810191909152826127105760405162461bcd60e51b815260206004820152600b60248201527f4e4d3a2174616b654e756d00000000000000000000000000000000000000000060448201526064016106fa565b600082116127605760405162461bcd60e51b815260206004820152600960248201527f4e4d3a217072696365000000000000000000000000000000000000000000000060448201526064016106fa565b6000600487815481106127755761277561554a565b9060005260206000209062030001020190506000816004016201000088106127a9576127a46201000089615607565b6127ab565b875b61ffff81106127bc576127bc61554a565b60030201905060008160020187815481106127d9576127d961554a565b60009182526020918290206040805161012081018252929091015463ffffffff808216845264010000000082048116848601819052600160401b8304821693850193909352600160601b820481166060850152600160801b8204166080840152600160a01b810462ffffff1660a0840152600160b81b810460ff90811660c0850152600160c01b82041660e0840152600160c81b900466ffffffffffffff166101008301529186015190925043916128959161ffff1690615631565b10156128e35760405162461bcd60e51b815260206004820152600960248201527f4e4d3a217374617465000000000000000000000000000000000000000000000060448201526064016106fa565b85816040015163ffffffff166128f99190615607565b63ffffffff166040820152600061290f336147af565b90506000826080015163ffffffff16836060015163ffffffff166129339190615631565b60a084015161294b9062ffffff1660028b901b61568e565b61295591906156a5565b60c0840151909150889060ff9081169081101561298c57875160ff1681101561298057600182901b91505b612989816155ce565b90505b6000600285815481106129a1576129a161554a565b906000526020600020906002020160010190506000349050620100008e1015612c2e578b876060015163ffffffff166129da9190615607565b63ffffffff908116606089015260808801516129f8918e9116615631565b63ffffffff1660808801526002880180548891908f908110612a1c57612a1c61554a565b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001600c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160000160106101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160000160146101000a81548162ffffff021916908362ffffff16021790555060c08201518160000160176101000a81548160ff021916908360ff16021790555060e08201518160000160186101000a81548160ff021916908360ff1602179055506101008201518160000160196101000a81548166ffffffffffffff021916908366ffffffffffffff160217905550905050612bd4828a60000160009054906101000a90046001600160a01b03168b60000160149054906101000a90046001600160601b03166001600160601b03168f88612bca9190615607565b611b66919061568e565b8854610100890151919250612c279184916001600160a01b0316908f90600681901c6603ffffffffffff1660029190911b60fc161b612c13919061568e565b612c1d8f8961568e565b611b669190615631565b9050612ef3565b612c3b620100008f615607565b9d508b876060015163ffffffff16612c539190615631565b63ffffffff90811660608901526080880151612c71918e9116615607565b63ffffffff1660808801526002880180548891908f908110612c9557612c9561554a565b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001600c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160000160106101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160000160146101000a81548162ffffff021916908362ffffff16021790555060c08201518160000160176101000a81548160ff021916908360ff16021790555060e08201518160000160186101000a81548160ff021916908360ff1602179055506101008201518160000160196101000a81548166ffffffffffffff021916908366ffffffffffffff160217905550905050612e43828a60000160009054906101000a90046001600160a01b03168b60000160149054906101000a90046001600160601b03166001600160601b03168f88612bca9190615631565b6101008801519091506000908d90600681901c6603ffffffffffff1660029190911b60fc161b612e73919061568e565b905080612e808d8761568e565b1115612ec657612ebf838a60000160009054906101000a90046001600160a01b0316838f89612eaf919061568e565b612eb99190615607565b85614894565b9150612ef1565b8854612ef19084906001600160a01b0316612ee18f8961568e565b612eeb9085615607565b8a614041565b505b612f1f827304abeda201850ac0124161f037efd70c74ddc74c611b6688683635c9adc5dea0000061568e565b90508015612f6f5760405162461bcd60e51b815260206004820152600860248201527f4e4f4d3a2166656500000000000000000000000000000000000000000000000060448201526064016106fa565b5050612f7b8887613af8565b6002860154604080518f8152602081018f9052338183015260608101929092526080820184905260a082018b9052517fa9f51105abd325b0b448a253f5a627f7e2b99b1f2ff238d0779128d29ac3d85b9181900360c00190a1612fe986600201858486600886901b8e61490d565b50505050505050505050505050565b606033321461303a5760405162461bcd60e51b815260206004820152600e60248201526d139154d50e8858dbdb9d1c9858dd60921b60448201526064016106fa565b61307f600485815481106130505761305061554a565b906000526020600020906203000102016004018461ffff81106130755761307561554a565b6003020183614135565b949350505050565b60008080803332146130cc5760405162461bcd60e51b815260206004820152600e60248201526d139154d50e8858dbdb9d1c9858dd60921b60448201526064016106fa565b613110600487815481106130e2576130e261554a565b906000526020600020906203000102016004018661ffff81106131075761310761554a565b60030201614b61565b9299919850965090945092505050565b6060600061312e86846140c9565b6004019050600284901b8067ffffffffffffffff811115613151576131516155b8565b60405190808252806020026020018201604052801561317a578160200160208202803683370190505b5092505b801561325f5761318f600482615607565b90506131c3828787600285901c8181106131ab576131ab61554a565b9050602002013561ffff81106131075761310761554a565b8685815181106131d5576131d561554a565b60200260200101878660016131ea9190615631565b815181106131fa576131fa61554a565b602002602001018887600261320f9190615631565b8151811061321f5761321f61554a565b60200260200101898860036132349190615631565b815181106132445761324461554a565b6020908102919091010193909352929091529190525261317e565b5050949350505050565b6000803332146132ac5760405162461bcd60e51b815260206004820152600e60248201526d139154d50e8858dbdb9d1c9858dd60921b60448201526064016106fa565b6132f1600486815481106132c2576132c261554a565b906000526020600020906203000102016004018561ffff81106132e7576132e761554a565b60030201846143d2565b91509150935093915050565b336000908152600360205260408120546002805490919081106133225761332261554a565b600091825260208083206001600160a01b038716845260016002909302019190910190526040812080549092508391839161335e908490615607565b909155506108169050833384614c82565b6001600160a01b03811660009081526003602052604081205460028054909190811061339d5761339d61554a565b600091825260208083206001600160a01b03871684526001600290930201919091019052604090205490505b92915050565b6000600483815481106133e4576133e461554a565b6000918252602090912060036203000190920201908101549091506001600160a01b031633146134475760405162461bcd60e51b815260206004820152600e60248201526d2727a69d3737ba1037b832b732b960911b60448201526064016106fa565b60018101546002820180546001600160a01b03909216918491906000906134789084906001600160801b0316615770565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555060006001600160a01b0316816001600160a01b0316036134f15760405133906001600160801b03851680156108fc02916000818181858888f193505050501580156134eb573d6000803e3d6000fd5b5061097b565b61097b8133856001600160801b0316614c82565b6000600160601b821061355a5760405162461bcd60e51b815260206004820152601b60248201527f4e424d3a63616e277420636f6e7665727420746f2075696e743936000000000060448201526064016106fa565b5090565b61356b6020820182615790565b6001830180546001600160601b0392909216600160a01b026001600160a01b039092169190911790556135a460408201602083016157ab565b60028301805461ffff92909216600160e01b027fffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092169190911790556135f160608201604083016157ab565b60038301805461ffff92909216600160c01b027fffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffff90921691909117905561363e60808201606083016157ab565b82600301601a6101000a81548161ffff021916908361ffff1602179055505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905291516000928392908816916136f291906157c8565b6000604051808303816000865af19150503d806000811461372f576040519150601f19603f3d011682016040523d82523d6000602084013e613734565b606091505b509150915081801561375e57508051158061375e57508080602001905181019061375e9190615596565b6137cf5760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f464160448201527f494c45440000000000000000000000000000000000000000000000000000000060648201526084016106fa565b505050505050565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081018290526101208101919091526040518061014001604052808363ffffffff168152602001613853856000015163ffffffff16611cf9565b6001600160a01b03168152602001846020015163ffffffff168152602001846040015163ffffffff168152602001846060015163ffffffff168152602001846080015163ffffffff1681526020018460a0015162ffffff1681526020018460c0015160ff1681526020018460e0015160ff1681526020016138f18561010001516603ffffffffffff600682901c1660fc60029290921b919091161b90565b72ffffffffffffffffffffffffffffffffffffff1690529392505050565b8254602082015160e083015160009260ff9091169163ffffffff16855b82613936826155ce565b9150811080156139705750818882815481106139545761395461554a565b600091825260209091200154640100000000900463ffffffff16145b156139ae578781815481106139875761398761554a565b6000918252602090912001546139a790600160c01b900460ff1685615631565b935061392c565b50805b6000871180156139f9575081886139c78961561a565b985088815481106139da576139da61554a565b600091825260209091200154640100000000900463ffffffff16915081145b15613a3757878781548110613a1057613a1061554a565b600091825260209091200154613a3090600160c01b900460ff1685615631565b93506139b1565b6000871180613a4557508082115b15613a5b57613a548183615607565b9450613a60565b600a94505b505050935093915050565b600063018cba80831015613abe576000613a886227ac40856156a5565b9050613a96816127106158db565b613aa082856158db565b613aac9061019061568e565b613ab691906156a5565b9150506133c9565b701d6329f1c35ca4bfabb9f5610000000000613adb600a846158e7565b613ae79061019061568e565b613af191906156a5565b9392505050565b6040805160c08082018352600184015463ffffffff808216808552640100000000830482166020808701829052600160401b850490931686880152600160601b840466ffffffffffffff908116606080890191909152600160981b8604909116608080890191909152600160d01b90950465ffffffffffff1660a08089019190915260028a0180548a5161012081018c5260008082529781018890529a8b01879052928a01869052958901859052880184905294870183905260e087018390526101008701839052929590929190819081905b60008787101580613cac5750438c6020015161ffff168b8981548110613bf357613bf361554a565b60009182526020918290206040805161012081018252929091015463ffffffff808216845264010000000082048116948401859052600160401b8204811692840192909252600160601b810482166060840152600160801b81049091166080830152600160a01b810462ffffff1660a0830152600160b81b810460ff90811660c0840152600160c01b82041660e0830152600160c81b900466ffffffffffffff166101008201529095509350613ca99085615631565b10155b90508080613cba5750828614155b15613e94578415613e90576060890151600681901c6603ffffffffffff1660029190911b60fc161b6000613cee87876156a5565b63ffffffff881660408d01529050613d0581614dc4565b66ffffffffffffff1660608c0152600096508695508115613e665760808b0151613d6a90600a908390600681901c6603ffffffffffff1660029190911b60fc161b613d5190600961568e565b613d5b9190615631565b613d6591906156a5565b614dc4565b66ffffffffffffff1660808c0152613d8682603083901b6156a5565b91506601000000000000821115613daf57613da8660100000000000083615607565b9150613dc3565b613dc0826601000000000000615607565b91505b600a60308c6020015163ffffffff168a613ddd9190615607565b612f3a613dea868061568e565b613df6906103e861568e565b613e0091906156a5565b613e0a91906156a5565b901c8c60a0015165ffffffffffff166009613e25919061568e565b613e2f9190615631565b613e3991906156a5565b915065ffffffffffff821115613e535765ffffffffffff91505b65ffffffffffff821660a08c0152613e81565b60608b015166ffffffffffffff1660808c0152600060a08c01525b505063ffffffff861660208a01525b8295505b8015613ea05750613f0a565b6040820151613eb59063ffffffff1686615631565b604083015161010084015191965063ffffffff1690600681901c6603ffffffffffff1660029190911b60fc161b613eec919061568e565b613ef69085615631565b93505085613f03906155ce565b9550613bcb565b875163ffffffff168611156140345785886000019063ffffffff16908163ffffffff1681525050878a60010160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001600c6101000a81548166ffffffffffffff021916908366ffffffffffffff16021790555060808201518160000160136101000a81548166ffffffffffffff021916908366ffffffffffffff16021790555060a082015181600001601a6101000a81548165ffffffffffff021916908365ffffffffffff1602179055509050505b5050505050505050505050565b811561097b576001600160a01b0383166140965761405e81611cf9565b6001600160a01b03166108fc839081150290604051600060405180830381858888f193505050501580156134eb573d6000803e3d6000fd5b6001600160a01b038316600090815260208590526040812080548492906140be908490615631565b909155505050505050565b6000600483815481106140de576140de61554a565b90600052602060002090620300010201905060003411156133c9576040516001600160a01b038316903480156108fc02916000818181858888f1935050505015801561412e573d6000803e3d6000fd5b5092915050565b604080516101208101825260008082526020820181905291810182905260608181018390526080820183905260a0820183905260c0820183905260e0820183905261010082019290925260028401906000600185901b94508467ffffffffffffffff8111156141a6576141a66155b8565b6040519080825280602002602001820160405280156141cf578160200160208202803683370190505b506001548454919250610100900461ffff169060008080805b8a8110156143c257841580806142c35750896142038761561a565b965086815481106142165761421661554a565b60009182526020918290206040805161012081018252929091015463ffffffff808216845264010000000082048116948401859052600160401b8204811692840192909252600160601b810482166060840152600160801b81049091166080830152600160a01b810462ffffff1660a0830152600160b81b810460ff90811660c0840152600160c01b82041660e0830152600160c81b900466ffffffffffffff1661010082015299508314155b1561436d576000851180156142e05750436142de8885615631565b105b1561434b576142ef8784615631565b88836142fa816155ce565b94508151811061430c5761430c61554a565b602090810291909101015261432185856156a5565b888361432c816155ce565b94508151811061433e5761433e61554a565b6020026020010181815250505b801561435757506143c2565b6000945060009350886020015163ffffffff1692505b604089015163ffffffff166143828187615631565b6101008b01519096508190600681901c6603ffffffffffff1660029190911b60fc161b6143af919061568e565b6143b99086615631565b945050506141e8565b50949a9950505050505050505050565b60015460028301805460009283929161010090910461ffff169083806143f88489615607565b97506000614407600185615607565b905060005b818110156144885760016144208383615631565b901c93508684815481106144365761443661554a565b600091825260209091200154640100000000900463ffffffff169250828a111561446d57614463846155ce565b935083905061440c565b828a10156144885761447e8461561a565b935083915061440c565b50506040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052819081908190865b88811015614626578a816144ed816155ce565b9250815481106144ff576144ff61554a565b60009182526020918290206040805161012081018252929091015463ffffffff808216845264010000000082048116948401859052600160401b8204811692840192909252600160601b810482166060840152600160801b81049091166080830152600160a01b810462ffffff1660a0830152600160b81b810460ff90811660c0840152600160c01b82041660e0830152600160c81b900466ffffffffffffff166101008201529097509150868e1061462657604082015163ffffffff169250821561462157836000036145d5578693506145dd565b868403614626575b6145e78387615631565b6101008301519096508390600681901c6603ffffffffffff1660029190911b60fc161b614614919061568e565b61461e9086615631565b94505b6144da565b505b861561476c57896146388861561a565b9750878154811061464b5761464b61554a565b60009182526020918290206040805161012081018252929091015463ffffffff80821684526401000000008204811694840194909452600160401b81048416918301829052600160601b810484166060840152600160801b81049093166080830152600160a01b830462ffffff1660a0830152600160b81b830460ff90811660c0840152600160c01b84041660e0830152600160c81b90920466ffffffffffffff166101008201529092509050811561476757806020015163ffffffff1695508260000361471b57859250614723565b85830361476c575b61472d8286615631565b6101008201519095508290600681901c6603ffffffffffff1660029190911b60fc161b61475a919061568e565b6147649085615631565b93505b614628565b84156147995761477c8984615631565b61478686866156a5565b9b509b505050505050505050505061208b565b5060009d8e9d509b505050505050505050505050565b6001600160a01b0381166000908152600360205260408120548082036133c957506002546001600160a01b038316600090815260036020526040902081905564010000000081106148425760405162461bcd60e51b815260206004820152600c60248201527f4e4d3a216163636f756e7473000000000000000000000000000000000000000060448201526064016106fa565b6002805460018101825560008290527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace91020180546001600160a01b0319166001600160a01b03851617905592915050565b60006001600160a01b0384166148b5576148ae8383615607565b905061307f565b6001600160a01b03841660009081526020869052604090208054848110156148f557600082556148f08633306148eb858a615607565b613660565b614902565b6148ff8582615607565b82555b509195945050505050565b856040518061012001604052808763ffffffff1681526020014363ffffffff1681526020018663ffffffff1681526020018663ffffffff1681526020018663ffffffff1681526020018562ffffff168152602001600885901c60ff1681526020018460ff1660ff16815260200161498384614dc4565b66ffffffffffffff908116909152825460018101845560009384526020938490208351910180549484015160408501516060860151608087015160a088015160c089015160e08a0151610100909a0151909816600160c81b0278ffffffffffffffffffffffffffffffffffffffffffffffffff60ff9a8b16600160c01b0260ff60c01b199b909a16600160b81b029a909a1661ffff60b81b1962ffffff909316600160a01b0262ffffff60a01b1963ffffffff958616600160801b021676ffffffffffffff0000000000000000000000000000000019968616600160601b026fffffffff00000000000000000000000019988716600160401b02989098166fffffffffffffffff0000000000000000199987166401000000000267ffffffffffffffff19909f1696909b16959095179c909c1796909616979097179390931791909116179690961795909516949094179190911791909116179055505050505050565b6000546001600160a01b031615614b3f5760405162461bcd60e51b815260206004820152601060248201527f4e4553543a21696e697469616c697a650000000000000000000000000000000060448201526064016106fa565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6040805160c081018252600183015463ffffffff8082168352640100000000820481166020840152600160401b82041692820183905266ffffffffffffff600160601b820481166060840152600160981b820416608083015265ffffffffffff600160d01b9091041660a08201526000918291829182919015614c6b576001546020820151614bff91610100900461ffff169063ffffffff16615631565b6060820151600681901c6603ffffffffffff1660029190911b60fc161b6080830151600681901c6603ffffffffffff1660029190911b60fc161b60308460a0015165ffffffffffff16670de0b6b3a7640000614c5b919061568e565b901c945094509450945050614c7b565b6000806000809450945094509450505b9193509193565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790529151600092839290871691614d0c91906157c8565b6000604051808303816000865af19150503d8060008114614d49576040519150601f19603f3d011682016040523d82523d6000602084013e614d4e565b606091505b5091509150818015614d78575080511580614d78575080806020019051810190614d789190615596565b61078d5760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c45440060448201526064016106fa565b6000805b6603ffffffffffff831115614dee5760049290921c91614de7816155ce565b9050614dc8565b60069290921b909117919050565b80356001600160a01b0381168114614e1357600080fd5b919050565b600080600060608486031215614e2d57600080fd5b83359250614e3d60208501614dfc565b9150604084013590509250925092565b600060808284031215614e5f57600080fd5b50919050565b60008060a08385031215614e7857600080fd5b82359150614e898460208501614e4d565b90509250929050565b600080600060608486031215614ea757600080fd5b8335925060208401359150614ebe60408501614dfc565b90509250925092565b600060208284031215614ed957600080fd5b613af182614dfc565b600060208284031215614ef457600080fd5b5035919050565b600081518084526020808501945080840160005b83811015614f4857815180516001600160a01b031688528301516001600160601b03168388015260409096019590820190600101614f0f565b509495945050505050565b602081528151602082015260006020830151614f7a60408401826001600160a01b03169052565b5060408301516001600160601b03811660608401525060608301516001600160a01b03811660808401525060808301516001600160601b03811660a08401525060a08301516001600160801b03811660c08401525060c08301516001600160601b03811660e08401525060e0830151610100614ffb8185018361ffff169052565b84015190506101206150128482018361ffff169052565b840151905061014061502e848201836001600160a01b03169052565b84015190506101606150478482018363ffffffff169052565b840151905061018061505e8482018361ffff169052565b84015190506101a06150758482018361ffff169052565b8401516101c084810152905061307f6101e0840182614efb565b600080604083850312156150a257600080fd5b8235915060208301356001600160801b03811681146150c057600080fd5b809150509250929050565b600080600080600060a086880312156150e357600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b602080825282518282018190526000919060409081850190868401855b828110156151db578151805163ffffffff9081168652878201516001600160a01b0316888701528682015181168787015260608083015182169087015260808083015182169087015260a0808301519091169086015260c08082015162ffffff169086015260e08082015160ff9081169187019190915261010080830151909116908601526101209081015172ffffffffffffffffffffffffffffffffffffff16908501526101409093019290850190600101615123565b5091979650505050505050565b60008083601f8401126151fa57600080fd5b50813567ffffffffffffffff81111561521257600080fd5b6020830191508360208260051b850101111561208b57600080fd5b60008060006040848603121561524257600080fd5b83359250602084013567ffffffffffffffff81111561526057600080fd5b61526c868287016151e8565b9497909650939450505050565b60008060008060006080868803121561529157600080fd5b85359450602086013567ffffffffffffffff8111156152af57600080fd5b6152bb888289016151e8565b909550935050604086013591506152d460608701614dfc565b90509295509295909350565b6020808252825182820181905260009190848201906040850190845b81811015615318578351835292840192918401916001016152fc565b50909695505050505050565b6000806040838503121561533757600080fd5b82359150614e8960208401614dfc565b6000806000806060858703121561535d57600080fd5b8435935060208501359250604085013567ffffffffffffffff81111561538257600080fd5b61538e878288016151e8565b95989497509550505050565b600060608284031215614e5f57600080fd5b600080604083850312156153bf57600080fd5b50508035926020909101359150565b80356001600160601b0381168114614e1357600080fd5b60008060008060008061010087890312156153ff57600080fd5b61540887614dfc565b9550615416602088016153ce565b945061542460408801614dfc565b9350606087013567ffffffffffffffff81111561544057600080fd5b61544c89828a016151e8565b909450925061546090508860808901614e4d565b90509295509295509295565b60008060006060848603121561548157600080fd5b505081359360208301359350604090920135919050565b600080600080606085870312156154ae57600080fd5b84359350602085013567ffffffffffffffff8111156154cc57600080fd5b6154d8878288016151e8565b90945092506154eb905060408601614dfc565b905092959194509250565b6000806040838503121561550957600080fd5b61551283614dfc565b946020939093013593505050565b6000806040838503121561553357600080fd5b61553c83614dfc565b9150614e8960208401614dfc565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6001600160601b0382811682821603908082111561412e5761412e615560565b6000602082840312156155a857600080fd5b81518015158114613af157600080fd5b634e487b7160e01b600052604160045260246000fd5b6000600182016155e0576155e0615560565b5060010190565b6001600160801b0381811683821601908082111561412e5761412e615560565b818103818111156133c9576133c9615560565b60008161562957615629615560565b506000190190565b808201808211156133c9576133c9615560565b6000808335601e1984360301811261565b57600080fd5b83018035915067ffffffffffffffff82111561567657600080fd5b6020019150600581901b360382131561208b57600080fd5b80820281158282048414176133c9576133c9615560565b6000826156c257634e487b7160e01b600052601260045260246000fd5b500490565b61ffff811681146156d757600080fd5b50565b813560ff81168082146156ec57600080fd5b825460ff1981168217845591506020840135615707816156c7565b62ffff008160081b169050808262ffffff19851617178455604085013561572d816156c7565b64ffffffffff19939093169091171760189190911b64ffff0000001617905550565b600061ffff80831681810361576657615766615560565b6001019392505050565b6001600160801b0382811682821603908082111561412e5761412e615560565b6000602082840312156157a257600080fd5b613af1826153ce565b6000602082840312156157bd57600080fd5b8135613af1816156c7565b6000825160005b818110156157e957602081860181015185830152016157cf565b506000920191825250919050565b600181815b8085111561583257816000190482111561581857615818615560565b8085161561582557918102915b93841c93908002906157fc565b509250929050565b600082615849575060016133c9565b81615856575060006133c9565b816001811461586c576002811461587657615892565b60019150506133c9565b60ff84111561588757615887615560565b50506001821b6133c9565b5060208310610133831016604e8410600b84101617156158b5575081810a6133c9565b6158bf83836157f7565b80600019048211156158d3576158d3615560565b029392505050565b6000613af1838361583a565b6000613af160ff84168361583a56fea2646970667358221220d12072c062af38bd6545ce889d43de293e35bbcc859409f412fa330f02fd14cd64736f6c63430008110033
Deployed Bytecode Sourcemap
76128:5622:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55364:306;;;;;;;;;;-1:-1:-1;55364:306:0;;;;;:::i;:::-;;:::i;:::-;;32937:252;;;;;;;;;;-1:-1:-1;32937:252:0;;;;;:::i;:::-;;:::i;34789:463::-;;;;;;;;;;-1:-1:-1;34789:463:0;;;;;:::i;:::-;;:::i;24156:264::-;;;;;;;;;;-1:-1:-1;24156:264:0;;;;;:::i;:::-;;:::i;23550:26::-;;;;;;;;;;-1:-1:-1;23550:26:0;;;;-1:-1:-1;;;;;23550:26:0;;;;;;-1:-1:-1;;;;;1846:55:1;;;1828:74;;1816:2;1801:18;23550:26:0;;;;;;;;36930:1486;;;;;;;;;;-1:-1:-1;36930:1486:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;35383:447::-;;;;;;:::i;:::-;;:::i;46653:1127::-;;;;;;;;;;-1:-1:-1;46653:1127:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;48090:4591::-;;;;;;;;;;-1:-1:-1;48090:4591:0;;;;;:::i;:::-;;:::i;80563:638::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;36562:239::-;;;;;;;;;;-1:-1:-1;36562:239:0;;;;;:::i;:::-;;:::i;79658:504::-;;;;;;:::i;:::-;;:::i;38661:2731::-;;;;;;:::i;:::-;;:::i;55882:111::-;;;;;;;;;;-1:-1:-1;55882:111:0;;;;;:::i;:::-;;:::i;30939:::-;;;;;;;;;;-1:-1:-1;30939:111:0;;;;;:::i;:::-;;:::i;56179:115::-;;;;;;;;;;-1:-1:-1;56179:115:0;;;;;:::i;:::-;-1:-1:-1;;;;;56265:21:0;56241:4;56265:21;;;:15;:21;;;;;;;56179:115;;;;11710:25:1;;;11698:2;11683:18;56179:115:0;11564:177:1;53922:715:0;;;;;;;;;;-1:-1:-1;53922:715:0;;;;;:::i;:::-;;:::i;56415:98::-;;;;;;;;;;-1:-1:-1;56489:9:0;:16;56415:98;;54923:294;;;;;;;;;;-1:-1:-1;54923:294:0;;;;;:::i;:::-;;:::i;:::-;;;;12173:25:1;;;12229:2;12214:18;;12207:34;;;;12146:18;54923:294:0;11999:248:1;31506:1292:0;;;;;;;;;;-1:-1:-1;31506:1292:0;;;;;:::i;:::-;;:::i;31128:101::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;31207:14:0;;;;;;;;31214:7;31207:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31128:101;;;;;13470:13:1;;13485:4;13466:24;13448:43;;13538:4;13526:17;;;13520:24;13563:6;13607:21;;;13585:20;;;13578:51;;;;13677:17;;;13671:24;13667:33;;;13645:20;;;13638:63;13436:2;13421:18;31128:101:0;13256:451:1;26597:216:0;;;;;;;;;;-1:-1:-1;26597:216:0;;;;;:::i;:::-;;:::i;34012:522::-;;;;;;;;;;-1:-1:-1;34012:522:0;;;;;:::i;:::-;;:::i;42007:4314::-;;;;;;:::i;:::-;;:::i;78101:211::-;;;;;;;;;;-1:-1:-1;78101:211:0;;;;;:::i;:::-;;:::i;76924:289::-;;;;;;;;;;-1:-1:-1;76924:289:0;;;;;:::i;:::-;;:::i;:::-;;;;14264:25:1;;;14320:2;14305:18;;14298:34;;;;14348:18;;;14341:34;14406:2;14391:18;;14384:34;14251:3;14236:19;76924:289:0;14033:391:1;78774:521:0;;;;;;:::i;:::-;;:::i;77530:254::-;;;;;;;;;;-1:-1:-1;77530:254:0;;;;;:::i;:::-;;:::i;53198:594::-;;;;;;;;;;-1:-1:-1;53198:594:0;;;;;:::i;:::-;;:::i;52881:180::-;;;;;;;;;;-1:-1:-1;52881:180:0;;;;;:::i;:::-;;:::i;35963:475::-;;;;;;;;;;-1:-1:-1;35963:475:0;;;;;:::i;:::-;;:::i;55364:306::-;55448:28;55479:9;55489;55479:20;;;;;;;;:::i;:::-;;;;;;;;;55518:14;55479:20;;;;;55518:14;;;;55479:20;;-1:-1:-1;;;;;;55518:14:0;55536:10;55518:28;55510:52;;;;-1:-1:-1;;;55510:52:0;;15947:2:1;55510:52:0;;;15929:21:1;15986:2;15966:18;;;15959:30;16025:13;16005:18;;;15998:41;16056:18;;55510:52:0;;;;;;;;;55592:16;55602:5;55592:9;:16::i;:::-;55573:15;;;:35;;:15;;:35;;;;-1:-1:-1;;;55573:35:0;;-1:-1:-1;;;;;55573:35:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;55573:35:0;;;;;-1:-1:-1;;;;;55573:35:0;;;;;;55643:2;-1:-1:-1;;;;;55635:20:0;:27;55656:5;55635:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55435:235;55364:306;;;:::o;32937:252::-;33029:28;33060:9;33070;33060:20;;;;;;;;:::i;:::-;;;;;;;;;33099:14;33060:20;;;;;33099:14;;;;33060:20;;-1:-1:-1;;;;;;33099:14:0;33117:10;33099:28;33091:55;;;;-1:-1:-1;;;33091:55:0;;16672:2:1;33091:55:0;;;16654:21:1;16711:2;16691:18;;;16684:30;-1:-1:-1;;;16730:18:1;;;16723:44;16784:18;;33091:55:0;16470:338:1;33091:55:0;33157:24;33165:7;33174:6;33157:7;:24::i;:::-;33018:171;32937:252;;:::o;34789:463::-;24528:11;;;24512:59;;-1:-1:-1;;;24512:59:0;;24557:10;24512:59;;;16995:74:1;17085:18;;;17078:34;;;;-1:-1:-1;;;;;24528:11:0;;24512:44;;16968:18:1;;24512:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24504:81;;;;-1:-1:-1;;;24504:81:0;;17607:2:1;24504:81:0;;;17589:21:1;17646:1;17626:18;;;17619:29;-1:-1:-1;;;17664:18:1;;;17657:39;17713:18;;24504:81:0;17405:332:1;24504:81:0;34935:28:::1;34966:9;34976;34966:20;;;;;;;;:::i;:::-;;;;;;;;;;;34935:51;;35001:10;35015:5;35001:19:::0;34997:248:::1;;35037:29:::0;;-1:-1:-1;;;;;;35037:29:0::1;-1:-1:-1::0;;;;;35037:29:0;::::1;;::::0;;34997:248:::1;;;35088:10;35102:5;35088:19:::0;35084:161:::1;;35124:14;::::0;::::1;:29:::0;;-1:-1:-1;;;;;;35124:29:0::1;-1:-1:-1::0;;;;;35124:29:0;::::1;;::::0;;35084:161:::1;;;35221:12;35186:7;:13;;35200:10;35186:25;;;;;;;:::i;:::-;;;;:47:::0;;-1:-1:-1;;;;;;35186:47:0::1;-1:-1:-1::0;;;;;35186:47:0;;;::::1;::::0;;;::::1;::::0;;35084:161:::1;34924:328;34789:463:::0;;;:::o;24156:264::-;24223:18;24244:11;-1:-1:-1;;;;;24244:11:0;24288:10;24274:24;;;:86;;-1:-1:-1;24302:58:0;;-1:-1:-1;;;24302:58:0;;24346:10;24302:58;;;16995:74:1;24358:1:0;17085:18:1;;;17078:34;-1:-1:-1;;;;;24302:43:0;;;;;16968:18:1;;24302:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24266:108;;;;-1:-1:-1;;;24266:108:0;;17607:2:1;24266:108:0;;;17589:21:1;17646:1;17626:18;;;17619:29;-1:-1:-1;;;17664:18:1;;;17657:39;17713:18;;24266:108:0;17405:332:1;24266:108:0;-1:-1:-1;24385:11:0;:27;;-1:-1:-1;;;;;;24385:27:0;-1:-1:-1;;;;;24385:27:0;;;;;;;;;;24156:264::o;36930:1486::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37069:9:0;:20;;-1:-1:-1;;;37079:9:0;;37069:20;;;;;;:::i;:::-;;;;;;;;;;;;;;37120:13;;;;37069:20;;-1:-1:-1;;;;37120:13:0;;;;;;37171:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;37171:21:0;;;;;;;;;;;;;;;;37145:47;;37208:6;37203:176;37224:5;37220:1;:9;37203:176;;;37251:22;37276:7;:13;;37290:1;37276:16;;;;;;;:::i;:::-;37318:49;;;;;;;;;37276:16;;;;;;;;;37327:11;;-1:-1:-1;;;;;37327:11:0;37318:49;;37347:11;;;:18;-1:-1:-1;;;;;37318:49:0;;;;;37307:8;;37276:16;;-1:-1:-1;37307:5:0;;37313:1;;37307:8;;;;;;:::i;:::-;;;;;;:60;;;;37236:143;37231:3;;;;:::i;:::-;;;37203:176;;;-1:-1:-1;37398:1010:0;;;;;;;;;;;37523:14;;-1:-1:-1;;;;;37523:14:0;;;37398:1010;;;;-1:-1:-1;;;;;;;;37583:12:0;;;;;;37398:1010;;;;;;;37523:14;37649;;;;;;37398:1010;;;;37720:22;;;;;37398:1010;;;;37788:13;;;;-1:-1:-1;;;;;37788:13:0;;37398:1010;;;;-1:-1:-1;;;37862:15:0;;;;;37398:1010;;;;37946:19;-1:-1:-1;;;37946:19:0;;;;37398:1010;;;;-1:-1:-1;;;38033:13:0;;;;;37523:14;37398:1010;;;38097:14;;;;;;;;37398:1010;;;;38172:20;;;;;37398:1010;;;;-1:-1:-1;;;38272:17:0;;;;37398:1010;;;;-1:-1:-1;;;38354:21:0;;;;;;37398:1010;;;;-1:-1:-1;37398:1010:0;;;;-1:-1:-1;37398:1010:0;36930:1486::o;35383:447::-;35469:28;35500:9;35510;35500:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;35548:14;;;;35500:20;;-1:-1:-1;;;;;;35548:14:0;;35573:217;;35640:5;-1:-1:-1;;;;;35635:11:0;35622:9;:24;35614:52;;;;-1:-1:-1;;;35614:52:0;;18273:2:1;35614:52:0;;;18255:21:1;18312:2;18292:18;;;18285:30;18351:17;18331:18;;;18324:45;18386:18;;35614:52:0;18071:339:1;35614:52:0;35573:217;;;35699:79;35731:6;35739:10;35759:4;35771:5;-1:-1:-1;;;;;35766:11:0;35699:31;:79::i;:::-;35800:13;;;:22;;35817:5;;35800:13;;;:22;;35817:5;;-1:-1:-1;;;;;35800:22:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;35800:22:0;;;;;-1:-1:-1;;;;;35800:22:0;;;;;;35458:372;;35383:447;;:::o;46653:1127::-;46831:23;24654:10;24668:9;24654:23;24646:50;;;;-1:-1:-1;;;24646:50:0;;18819:2:1;24646:50:0;;;18801:21:1;18858:2;18838:18;;;18831:30;-1:-1:-1;;;18877:18:1;;;18870:44;18931:18;;24646:50:0;18617:338:1;24646:50:0;46869:27:::1;46899:9;46909;46899:20;;;;;;;;:::i;:::-;;;;;;;;;;;:26;;46926:9;46899:37;;;;;;;:::i;:::-;;;;:44;;46869:74;;46954:30;47008:5;46987:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46987:27:0;;-1:-1:-1;;46987:27:0;;;;::::1;::::0;::::1;;;;;-1:-1:-1::0;47039:13:0;;46954:60;;-1:-1:-1;47025:11:0::1;47116:10:::0;;;47112:637:::1;;47145:10;47158:15;47167:6:::0;47158;:15:::1;:::i;:::-;47145:28;;47188:8;47207:5;47199;:13;:33;;47231:1;47199:33;;;47215:13;47223:5:::0;47215;:13:::1;:::i;:::-;47188:44;;47247:134;47262:3;47254:5;:11;47247:134;;;47286:7;::::0;::::1;:::i;:::-;;;47326:39;47344:6;47351:5;47344:13;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;47326:39:::1;::::0;;::::1;::::0;::::1;::::0;;47344:13;;;::::1;47326:39:::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;47326:39:0;::::1;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;47326:39:0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;47326:39:0;::::1;::::0;;::::1;::::0;;;;::::1;-1:-1:-1::0;;;47326:39:0;::::1;;::::0;;;;::::1;-1:-1:-1::0;;;47326:39:0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;47326:39:0;::::1;;::::0;;;;::::1;-1:-1:-1::0;;;47326:39:0;;::::1;;;::::0;;;47359:5;47326:17:::1;:39::i;:::-;47312:6:::0;47319:3;::::1;::::0;::::1;:::i;:::-;;;47312:11;;;;;;;;:::i;:::-;;;;;;:53;;;;47247:134;;;47128:264;;47112:637;;;47465:6:::0;47452:10:::1;47497:13;47505:5:::0;47465:6;47497:13:::1;:::i;:::-;47486:24;;47535:6;47529:3;:12;47525:65;;;-1:-1:-1::0;47568:6:0;47525:65:::1;47619:3;47611:5;:11;47604:134;;;47657:39;47675:6;47682:5;47675:13;;;;;;;;:::i;47657:39::-;47643:6:::0;47650:3;::::1;::::0;::::1;:::i;:::-;;;47643:11;;;;;;;;:::i;:::-;;;;;;:53;;;;47715:7;;;;:::i;:::-;;;47604:134;;;47435:314;;47112:637;-1:-1:-1::0;47766:6:0;;46653:1127;-1:-1:-1;;;;;;;;46653:1127:0:o;48090:4591::-;48187:30;;;;;;;;48210:7;48187:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;48259:9;:20;;48187;;48259:9;48269;;48259:20;;;;;;:::i;:::-;;;;;;;;;;;48228:51;;48300:17;48332:11;48358:14;48387:17;48499:39;48541:9;48551:1;48541:28;;;;;;;;:::i;:::-;;;;;;;;;;48589:161;;;;;;;;48541:37;48631:22;;;;-1:-1:-1;;;48631:22:0;;;;-1:-1:-1;;;;;48631:22:0;48589:161;;48675:20;;;;;;;;;48589:161;;;;;;;-1:-1:-1;;;48717:21:0;;;;;48589:161;;;;;;;48541:28;;;;;;:37;;;;-1:-1:-1;48777:7:0;48763:3276;48793:5;;48763:3276;;48816:22;48841:13;;;48855:3;;;:::i;:::-;;;;48841:18;;;;;;;:::i;:::-;;;;48816:43;;48977:15;49053:6;49062:7;;49070:1;49062:10;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:17;-1:-1:-1;;49048:2736:0;49081:5;;49048:2736;;49212:10;49225:7;;49233:1;49225:10;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;49236:3;;;:::i;:::-;;;;49225:15;;;;;;;:::i;:::-;;;;;;;49212:28;;49259:23;49285:4;:11;;49297:5;49285:18;;;;;;;;:::i;:::-;;;;;;;;;49259:44;;;;;;;;49285:18;;;;49259:44;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;49259:44:0;;;;;;;;;;;-1:-1:-1;;;49259:44:0;;;;;;;;-1:-1:-1;;;49259:44:0;;;;;;;;;-1:-1:-1;;;49259:44:0;;;;;;;;-1:-1:-1;;;49259:44:0;;;;;;;;;;-1:-1:-1;;;49259:44:0;;;;;;;-1:-1:-1;;;49259:44:0;;;;;;;;;-1:-1:-1;49426:17:0;;;49422:539;;49591:5;:11;;;49586:17;;49571:32;;49637:9;49647:12;49637:23;;;;;;;;:::i;:::-;;;;;;;;;;;:32;;49626:43;;49422:539;;;49915:11;;49910:17;;49894:33;;49886:55;;;;-1:-1:-1;;;49886:55:0;;20116:2:1;49886:55:0;;;20098:21:1;20155:1;20135:18;;;20128:29;20193:11;20173:18;;;20166:39;20222:18;;49886:55:0;19914:332:1;49886:55:0;50152:1;50137:12;:16;:86;;;;;50210:12;50184:6;:22;;;50179:28;;50163:5;:12;;;50158:18;;:49;;;;:::i;:::-;:64;50137:86;50133:1532;;;50306:1;50311;50306:6;50302:851;;50360:12;;;;50355:18;;50525:10;;50521:609;;50662:10;50674:16;50694:43;50711:4;:11;;50724:5;50731;50694:16;:43::i;:::-;51011:7;;;50958;;;;50942:12;;;;50661:76;;-1:-1:-1;50661:76:0;;-1:-1:-1;51068:3:0;;50661:76;;50926:49;;50937:28;;50958:7;50937:18;;:28;:::i;:::-;50967:7;;;;50926:10;:49::i;:::-;50843:47;50884:6;50843:5;:47;:::i;:::-;:132;;;;:::i;:::-;:175;;;;:::i;:::-;:222;;;;:::i;:::-;:228;;;;:::i;:::-;50798:304;;;;:::i;:::-;;;50537:593;;50521:609;50314:839;50302:851;51195:15;;;;51177:34;;51190:21;;51177:34;;:::i;:::-;;;51255:5;:18;;;51250:24;;51234:40;;;;;:::i;:::-;51349:18;;;;51324:16;;;;51234:40;;-1:-1:-1;51344:24:0;;;69735:1;69715:21;;;;;69771:1;69742:30;;;;;;69714:59;51311:57;;;;:::i;:::-;51297:71;;;;:::i;:::-;51488:1;51467:23;;;51513:18;;;:30;;;51566:18;;;:30;51619:11;;;:18;;51297:71;;-1:-1:-1;51467:5:0;;51631;;51619:18;;;;;;:::i;:::-;;;;;;;;;;:26;;:18;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51619:26:0;;;;;;-1:-1:-1;;;51619:26:0;-1:-1:-1;;;;51619:26:0;;;;-1:-1:-1;;;51619:26:0;;;;;-1:-1:-1;;;;51619:26:0;;;;-1:-1:-1;;;51619:26:0;-1:-1:-1;;;;51619:26:0;;;;-1:-1:-1;;;51619:26:0;;-1:-1:-1;;51619:26:0;;;-1:-1:-1;;;51619:26:0;-1:-1:-1;;51619:26:0;;;-1:-1:-1;;;51619:26:0;;;;;-1:-1:-1;;51619:26:0;;;;;-1:-1:-1;;51619:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50133:1532;49089:2695;;49048:2736;;;;51800:19;51806:6;51814:4;51800:5;:19::i;:::-;51989:11;;51969:58;;51979:8;;-1:-1:-1;;;;;51989:11:0;52002:10;52014:12;51969:9;:58::i;:::-;48801:3238;;48763:3276;;;-1:-1:-1;52099:14:0;;52079:84;;52089:8;;-1:-1:-1;;;;;52099:14:0;;;52115:33;;-1:-1:-1;;;52135:12:0;;-1:-1:-1;;;;;52135:12:0;52115;:33;:::i;:::-;52150:12;52079:9;:84::i;:::-;52210:77;52220:8;25003:42;52250:22;:9;52262:10;52250:22;:::i;52210:77::-;52318:13;;;;-1:-1:-1;;;;;52318:13:0;52347:14;;;52343:61;;;52387:5;52378:14;;52343:61;52554:14;52562:6;52554:5;:14;:::i;:::-;52530:13;;;:39;;;;-1:-1:-1;;;;;52530:39:0;;;;;;;;;;-1:-1:-1;52636:14:0;;;52616:57;;52626:8;;-1:-1:-1;;;;;52636:14:0;52652:6;52660:12;52616:9;:57::i;:::-;48166:4515;;;;;;;;;48090:4591;;;:::o;80563:638::-;80741:20;80774:31;80808:24;80813:9;80824:7;80808:4;:24::i;:::-;:30;;;-1:-1:-1;80871:1:0;80862:10;;;80851:8;80892:24;80862:10;80892:11;:24;:::i;:::-;80883:33;;80947:1;80936:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;80936:13:0;;80927:22;;80960:234;80967:5;;80960:234;;80989:8;80994:3;80989:8;;:::i;:::-;;-1:-1:-1;81012:16:0;81031:50;81046:5;81052:11;;81064:7;81068:3;80989:8;81064:7;:::i;:::-;81052:20;;;;;;;:::i;:::-;;;;;;;81046:27;;;;;;;:::i;:::-;;;;81075:5;81031:14;:50::i;:::-;81012:69;;81101:6;81096:87;81117:3;81113:1;:7;81096:87;;;81162:2;81165:1;81162:5;;;;;;;;:::i;:::-;;;;;;;81146:6;81157:1;81153;:5;;;;:::i;:::-;81146:13;;;;;;;;:::i;:::-;;;;;;;;;;:21;81122:3;;;:::i;:::-;;;81096:87;;;;80974:220;80960:234;;;80763:438;;;80563:638;;;;;;;:::o;36562:239::-;36639:28;36670:9;36680;36670:20;;;;;;;;:::i;:::-;;;;;;;;;36709:14;36670:20;;;;;36709:14;;;;36670:20;;-1:-1:-1;;;;;;36709:14:0;36727:10;36709:28;36701:55;;;;-1:-1:-1;;;36701:55:0;;16672:2:1;36701:55:0;;;16654:21:1;16711:2;16691:18;;;16684:30;-1:-1:-1;;;16730:18:1;;;16723:44;16784:18;;36701:55:0;16470:338:1;36701:55:0;36767:14;;:26;;-1:-1:-1;;;;;;36767:26:0;-1:-1:-1;;;;;36767:26:0;;;;;;;;;;-1:-1:-1;36562:239:0:o;79658:504::-;79832:20;79865:31;79899:24;79904:9;79915:7;79899:4;:24::i;:::-;:30;;;-1:-1:-1;79973:1:0;79951:23;;;;79994:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;79994:13:0;;79985:22;;80018:137;80025:5;;80018:137;;80047:6;80052:1;80047:6;;:::i;:::-;;;80097:46;80108:5;80114:11;;80131:1;80126;:6;;80114:19;;;;;;;:::i;:::-;;;;;;;80108:26;;;;;;;:::i;:::-;;;;80136:6;80097:10;:46::i;:::-;80069:6;80076:1;80069:9;;;;;;;;:::i;:::-;;;;;;80080:6;80087:1;80091;80087:5;;;;:::i;:::-;80080:13;;;;;;;;:::i;:::-;;;;;;;;;;80068:75;;;;;80018:137;;;79854:308;;79658:504;;;;;;;:::o;38661:2731::-;38798:30;;;;;;;;38821:7;38798:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38880:10;;38872:33;;;;-1:-1:-1;;;38872:33:0;;20905:2:1;38872:33:0;;;20887:21:1;20944:2;20924:18;;;20917:30;20983:12;20963:18;;;20956:40;21013:18;;38872:33:0;20703:334:1;38872:33:0;38952:28;38983:9;38993;38983:20;;;;;;;;:::i;:::-;;;;;;;;;;;38952:51;;39045:17;39065:25;39079:10;39065:13;:25::i;:::-;39045:45;;39683:39;39725:9;39735:12;39725:23;;;;;;;;:::i;:::-;;;;;;;;;;39785:13;;;;39921:17;;;;39725:32;:23;;;;;;;:32;;-1:-1:-1;39785:13:0;-1:-1:-1;;;39785:13:0;;;;;;39821:9;;39873:85;;39725:32;;25003:42;;39911:28;;39916:23;39785:13;39911:28;:::i;:::-;:41;;39942:10;39911:41;:::i;:::-;39954:3;39873:7;:85::i;:::-;40025:14;;39867:91;;-1:-1:-1;40007:63:0;;40015:8;;-1:-1:-1;;;;;40025:14:0;;;40041:23;;-1:-1:-1;;;40051:12:0;;-1:-1:-1;;;;;40051:12:0;40041:2;:23;:::i;40007:63::-;40001:69;;40109:843;40116:6;;40109:843;;40139:22;40164:13;;;40178:4;;;:::i;:::-;;;;40164:19;;;;;;;:::i;:::-;;;;40139:44;;40198:15;40216:11;;40228:2;40216:15;;;;;;;:::i;:::-;;;;;;;40198:33;;40267:1;40254:10;:14;40246:42;;;;-1:-1:-1;;;40246:42:0;;21244:2:1;40246:42:0;;;21226:21:1;21283:2;21263:18;;;21256:30;21322:17;21302:18;;;21295:45;21357:18;;40246:42:0;21042:339:1;40246:42:0;40327:11;;40309:47;;40317:8;;-1:-1:-1;;;;;40327:11:0;40340:10;40352:3;40309:7;:47::i;:::-;40303:53;;40619:19;40625:6;40633:4;40619:5;:19::i;:::-;40748:11;;;:18;40716:66;;;21681:25:1;;;21737:2;21722:18;;21715:34;;;40736:10:0;21765:18:1;;;21758:83;21872:2;21857:18;;21850:34;;;;40768:1:0;21915:3:1;21900:19;;21893:35;21959:3;21944:19;;21937:35;;;40716:66:0;;;;;;21668:3:1;40716:66:0;;;40841:99;40849:4;:11;;40862:12;40883:1;40892:6;:17;;;40887:23;;40912:2;40918:1;40912:7;:15;;40926:1;40912:15;;;40922:1;40912:15;40841:99;;40929:10;40841:7;:99::i;:::-;40124:828;;40109:843;;;38758:2634;;;;;;38661:2731;;;;:::o;55882:111::-;55937:7;55964:9;55974:5;55964:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;55964:21:0;;55882:111;-1:-1:-1;;55882:111:0:o;30939:::-;24528:11;;;24512:59;;-1:-1:-1;;;24512:59:0;;24557:10;24512:59;;;16995:74:1;17085:18;;;17078:34;;;;-1:-1:-1;;;;;24528:11:0;;24512:44;;16968:18:1;;24512:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24504:81;;;;-1:-1:-1;;;24504:81:0;;17607:2:1;24504:81:0;;;17589:21:1;17646:1;17626:18;;;17619:29;-1:-1:-1;;;17664:18:1;;;17657:39;17713:18;;24504:81:0;17405:332:1;24504:81:0;31036:6;31026:7:::1;:16;31036:6:::0;31026:7;:16:::1;:::i;53922:715::-:0;53988:4;54007:28;54038:9;54048;54038:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;54099:23;;;54146:13;;54038:20;;-1:-1:-1;54099:23:0;54184:2;54197:231;54204:9;;54197:231;;54232:23;54258:6;54265:7;;;:::i;:::-;;;;54258:15;;;;;;;;:::i;:::-;;;;;;;;;;54232:41;;;;;;;;54258:15;;;;54232:41;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;54232:41:0;;;;;;;;;;;-1:-1:-1;;;54232:41:0;;;;;;;;-1:-1:-1;;;54232:41:0;;;;;;;;;-1:-1:-1;;;54232:41:0;;;;;;;;-1:-1:-1;;;54232:41:0;;;;;;;;;;-1:-1:-1;;;54232:41:0;;;;;;;;;-1:-1:-1;;;54232:41:0;;;;;;;;;;-1:-1:-1;54292:22:0;54288:129;;54364:12;;;;54344:33;;54359:18;;54344:12;:33;:::i;:::-;54335:42;;54396:5;;;54288:129;54215:213;54197:231;;;54559:20;;;;54626:3;;54528:82;;54539:41;;-1:-1:-1;;;54559:20:0;;;;54539:12;:41;:::i;:::-;54587:21;;;;-1:-1:-1;;;54587:21:0;;;;54528:10;:82::i;:::-;54488:22;;;;54461:50;;-1:-1:-1;;;54488:22:0;;-1:-1:-1;;;;;54488:22:0;54461:6;:50;:::i;:::-;:149;;;;:::i;:::-;:168;;;;:::i;:::-;54440:189;53922:715;-1:-1:-1;;;;;;53922:715:0:o;54923:294::-;55032:16;55050;55079:27;55109:9;55119;55109:20;;;;;;;;:::i;:::-;;;;;;;;:26;:20;;;;;:26;;:29;;;:36;;55079:66;;55163:46;55180:6;55188:5;55195:6;55202:5;55195:13;;;;;;;;:::i;:::-;;;;;;;;;;55163:46;;;;;;;;55195:13;;;;55163:46;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;55163:46:0;;;;;;;;;;;-1:-1:-1;;;55163:46:0;;;;;;;;-1:-1:-1;;;55163:46:0;;;;;;;;;;-1:-1:-1;;;55163:46:0;;;;;;;;-1:-1:-1;;;55163:46:0;;;;;;;;-1:-1:-1;;;55163:46:0;;;;;;;;-1:-1:-1;;;55163:46:0;;;;;;;;:16;:46::i;:::-;55156:53;;;;;54923:294;;;;;;:::o;31506:1292::-;31730:1;31722:4;-1:-1:-1;;;;;31717:10:0;:14;31709:44;;;;-1:-1:-1;;;31709:44:0;;23072:2:1;31709:44:0;;;23054:21:1;23111:2;23091:18;;;23084:30;23150:19;23130:18;;;23123:47;23187:18;;31709:44:0;22870:341:1;31709:44:0;31804:9;:16;31799:44;;;23446:25:1;;;-1:-1:-1;;;;;23568:15:1;;;23563:2;23548:18;;23541:43;-1:-1:-1;;;;;23620:39:1;;23600:18;;;23593:67;23696:15;;23691:2;23676:18;;23669:43;31799:44:0;;;;;;23433:3:1;31799:44:0;;;31895:9;:16;;;;;;;-1:-1:-1;31895:16:0;;;-1:-1:-1;;;;;31954:23:0;;;-1:-1:-1;;;;;;;;32015:19:0;;;;;;;;31895:16;;;;;;;;32015:19;;;32077:14;;;:23;;-1:-1:-1;;;;;;32077:23:0;;;;;;;;;;;32113:13;;;:26;;32188:37;;-1:-1:-1;;;32188:37:0;;;;;;;32276:14;;;;:27;;32356:43;;32293:10;32356:43;;;32386:12;32356:43;;;;;;;;;;;;31895:16;32443:311;32460:17;;;32443:311;;;32517:6;;32524:1;32517:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;32507:19:0;:6;-1:-1:-1;;;;;32507:19:0;;32499:60;;;;-1:-1:-1;;;32499:60:0;;23925:2:1;32499:60:0;;;23907:21:1;23964:2;23944:18;;;23937:30;24003;23983:18;;;23976:58;24051:18;;32499:60:0;23723:352:1;32499:60:0;32579:6;32574:119;32595:1;32591;:5;32574:119;;;32643:6;;32650:1;32643:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;32630:22:0;:6;;32637:1;32630:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;32630:22:0;;32622:55;;;;-1:-1:-1;;;32622:55:0;;24282:2:1;32622:55:0;;;24264:21:1;24321:2;24301:18;;;24294:30;24360:22;24340:18;;;24333:50;24400:18;;32622:55:0;24080:344:1;32622:55:0;32598:3;;;:::i;:::-;;;32574:119;;;;32733:6;;32740:1;32733:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;32707:7;:13;;32721:1;32707:16;;;;;;;:::i;:::-;;;;:35;;-1:-1:-1;;;;;;32707:35:0;-1:-1:-1;;;;;32707:35:0;;;;;;;;;;32479:3;;;:::i;:::-;;;32443:311;;;;32766:24;32774:7;32783:6;32766:7;:24::i;:::-;31696:1102;31506:1292;;;;;;:::o;26597:216::-;26664:28;26681:10;26664:16;:28::i;:::-;-1:-1:-1;26789:9:0;:16;;;;;;-1:-1:-1;26789:16:0;26597:216::o;34012:522::-;34081:28;34112:9;34122;34112:20;;;;;;;;:::i;:::-;;;;;;;;;34151:14;34112:20;;;;;34151:14;;;;34112:20;;-1:-1:-1;;;;;;34151:14:0;34169:10;34151:28;34143:55;;;;-1:-1:-1;;;34143:55:0;;16672:2:1;34143:55:0;;;16654:21:1;16711:2;16691:18;;;16684:30;-1:-1:-1;;;16730:18:1;;;16723:44;16784:18;;34143:55:0;16470:338:1;34143:55:0;34217:14;;-1:-1:-1;;;;;34217:24:0;;;:14;;:24;34209:65;;;;-1:-1:-1;;;34209:65:0;;23925:2:1;34209:65:0;;;23907:21:1;23964:2;23944:18;;;23937:30;24003;23983:18;;;23976:58;24051:18;;34209:65:0;23723:352:1;34209:65:0;34303:13;;;;-1:-1:-1;;;34303:13:0;;;;34285:10;34328:126;34349:5;34345:1;:9;34328:126;;;34411:6;-1:-1:-1;;;;;34384:33:0;:7;:13;;34398:1;34384:16;;;;;;;:::i;:::-;;;;:23;-1:-1:-1;;;;;34384:23:0;:33;34376:66;;;;-1:-1:-1;;;34376:66:0;;24282:2:1;34376:66:0;;;24264:21:1;24321:2;24301:18;;;24294:30;24360:22;24340:18;;;24333:50;24400:18;;34376:66:0;24080:344:1;34376:66:0;34356:3;;;:::i;:::-;;;34328:126;;;;34494:6;34464:7;:13;;34478:5;34464:20;;;;;;;:::i;:::-;;;;:36;;-1:-1:-1;;;;;;34464:36:0;-1:-1:-1;;;;;34464:36:0;;;;;;;;;;34513:13;;;34511:15;;34513:13;;34511:15;;-1:-1:-1;;;34511:15:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;34070:464;;34012:522;;:::o;42007:4314::-;42194:30;;;;;;;;42217:7;42194:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;42276:11;42268:35;;;;-1:-1:-1;;;42268:35:0;;24833:2:1;42268:35:0;;;24815:21:1;24872:2;24852:18;;;24845:30;24911:13;24891:18;;;24884:41;24942:18;;42268:35:0;24631:335:1;42268:35:0;42338:1;42322:13;:17;42314:39;;;;-1:-1:-1;;;42314:39:0;;25173:2:1;42314:39:0;;;25155:21:1;25212:1;25192:18;;;25185:29;25250:11;25230:18;;;25223:39;25279:18;;42314:39:0;24971:332:1;42314:39:0;42398:28;42429:9;42439;42429:20;;;;;;;;:::i;:::-;;;;;;;;;;;42398:51;;42460:22;42485:7;:13;;42511:7;42499:9;:19;:53;;42533:19;42545:7;42533:9;:19;:::i;:::-;42499:53;;;42521:9;42499:53;42485:68;;;;;;;:::i;:::-;;;;42460:93;;42564:23;42590:4;:11;;42602:5;42590:18;;;;;;;;:::i;:::-;;;;;;;;;;42564:44;;;;;;;;42590:18;;;;42564:44;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42564:44:0;;;;;;;;;;;-1:-1:-1;;;42564:44:0;;;;;;;;-1:-1:-1;;;42564:44:0;;;;;;;-1:-1:-1;;;42564:44:0;;;;;;;;-1:-1:-1;;;42564:44:0;;;;;;;;;;-1:-1:-1;;;42564:44:0;;;;;;;-1:-1:-1;;;42564:44:0;;;;;;;;42682:22;;;;42564:44;;-1:-1:-1;42709:12:0;;42656:49;;42677:28;;;42656:49;:::i;:::-;:65;;42648:87;;;;-1:-1:-1;;;42648:87:0;;25510:2:1;42648:87:0;;;25492:21:1;25549:1;25529:18;;;25522:29;25587:11;25567:18;;;25560:39;25616:18;;42648:87:0;25308:332:1;42648:87:0;42801:7;42779:5;:18;;;42774:24;;:34;;;;:::i;:::-;42746:63;;:18;;;:63;42822:17;42842:25;42856:10;42842:13;:25::i;:::-;42822:45;;43027:15;43119:5;:18;;;43114:24;;43092:5;:18;;;43087:24;;:51;;;;:::i;:::-;43067:15;;;;43045:38;;43062:21;;43057:1;43046:12;;;43045:38;:::i;:::-;:94;;;;:::i;:::-;43289:11;;;;43027:112;;-1:-1:-1;43253:7:0;;43284:17;;;;;43316:11;;43312:200;;;43361:25;;43356:31;;43348:39;;43344:135;;;43462:1;43447:16;;;;;43344:135;43493:7;;;:::i;:::-;;;43312:200;43629:39;43671:9;43681:12;43671:23;;;;;;;;:::i;:::-;;;;;;;;;;;:32;;43629:74;;43718:8;43729:9;43718:20;;43923:7;43911:9;:19;43907:1694;;;44050:7;44028:5;:18;;;44023:24;;:34;;;;:::i;:::-;43995:63;;;;:18;;;:63;44110:18;;;;44105:34;;44132:7;;44105:24;:34;:::i;:::-;44077:63;;:18;;;:63;44159:11;;;:18;;44077:5;;44159:11;44171:5;;44159:18;;;;;;:::i;:::-;;;;;;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44246:83;44254:8;44264:7;:14;;;;;;;;;;-1:-1:-1;;;;;44264:14:0;44310:7;:12;;;;;;;;;;-1:-1:-1;;;;;44310:12:0;-1:-1:-1;;;;;44305:18:0;44294:7;44281:10;:20;;;;:::i;:::-;44280:43;;;;:::i;44246:83::-;44450:11;;;44527:16;;;44240:89;;-1:-1:-1;44388:212:0;;44418:8;;-1:-1:-1;;;;;44450:11:0;;44547:7;;69735:1;69715:21;;;;;69771:1;69742:30;;;;;;69714:59;44514:40;;;;:::i;:::-;44485:26;44498:13;44485:10;:26;:::i;:::-;:69;;;;:::i;44388:212::-;44382:218;;43907:1694;;;44717:20;44730:7;44717:20;;:::i;:::-;;;44855:7;44833:5;:18;;;44828:24;;:34;;;;:::i;:::-;44800:63;;;;:18;;;:63;44915:18;;;;44910:34;;44937:7;;44910:24;:34;:::i;:::-;44882:63;;:18;;;:63;44964:11;;;:18;;44882:5;;44964:11;44976:5;;44964:18;;;;;;:::i;:::-;;;;;;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45051:83;45059:8;45069:7;:14;;;;;;;;;;-1:-1:-1;;;;;45069:14:0;45115:7;:12;;;;;;;;;;-1:-1:-1;;;;;45115:12:0;-1:-1:-1;;;;;45110:18:0;45099:7;45086:10;:20;;;;:::i;45051:83::-;45222:16;;;;45045:89;;-1:-1:-1;45187:19:0;;45242:7;;69735:1;69715:21;;;;;69771:1;69742:30;;;;;;69714:59;45209:40;;;;:::i;:::-;45187:62;-1:-1:-1;45187:62:0;45272:26;45285:13;45272:10;:26;:::i;:::-;:43;45268:318;;;45346:80;45354:8;45364:4;:11;;;;;;;;;;-1:-1:-1;;;;;45364:11:0;45406:14;45390:13;45377:10;:26;;;;:::i;:::-;:43;;;;:::i;:::-;45422:3;45346:7;:80::i;:::-;45340:86;;45268:318;;;45495:11;;45475:91;;45485:8;;-1:-1:-1;;;;;45495:11:0;45525:26;45538:13;45525:10;:26;:::i;:::-;45508:43;;:14;:43;:::i;:::-;45553:12;45475:9;:91::i;:::-;44698:903;43907:1694;45667:67;45675:8;25003:42;45705:23;:10;45718;45705:23;:::i;45667:67::-;45661:73;-1:-1:-1;45759:8:0;;45751:29;;;;-1:-1:-1;;;45751:29:0;;25847:2:1;45751:29:0;;;25829:21:1;25886:1;25866:18;;;25859:29;25924:10;25904:18;;;25897:38;25952:18;;45751:29:0;25645:331:1;45751:29:0;43524:2268;;46053:19;46059:6;46067:4;46053:5;:19::i;:::-;46163:11;;;:18;46124:85;;;21681:25:1;;;21737:2;21722:18;;21715:34;;;46151:10:0;21765:18:1;;;21758:83;21872:2;21857:18;;21850:34;;;;21915:3;21900:19;;21893:35;;;21959:3;21944:19;;21937:35;;;46124:85:0;;;;;;21668:3:1;46124:85:0;;;46220:93;46228:4;:11;;46241:12;46262:10;46275;46296:1;46287:5;:10;;46299:13;46220:7;:93::i;:::-;42181:4140;;;;;;;;42007:4314;;;;;:::o;78101:211::-;78211:13;24654:10;24668:9;24654:23;24646:50;;;;-1:-1:-1;;;24646:50:0;;18819:2:1;24646:50:0;;;18801:21:1;18858:2;18838:18;;;18831:30;-1:-1:-1;;;18877:18:1;;;18870:44;18931:18;;24646:50:0;18617:338:1;24646:50:0;78244:60:::1;78259:9;78269;78259:20;;;;;;;;:::i;:::-;;;;;;;;;;;:26;;78286:9;78259:37;;;;;;;:::i;:::-;;;;78298:5;78244:14;:60::i;:::-;78237:67:::0;78101:211;-1:-1:-1;;;;78101:211:0:o;76924:289::-;77037:16;;;;24654:10;24668:9;24654:23;24646:50;;;;-1:-1:-1;;;24646:50:0;;18819:2:1;24646:50:0;;;18801:21:1;18858:2;18838:18;;;18831:30;-1:-1:-1;;;18877:18:1;;;18870:44;18931:18;;24646:50:0;18617:338:1;24646:50:0;77147:58:::1;77167:9;77177;77167:20;;;;;;;;:::i;:::-;;;;;;;;;;;:26;;77194:9;77167:37;;;;;;;:::i;:::-;;;;77147:19;:58::i;:::-;77140:65:::0;;;;-1:-1:-1;77140:65:0;-1:-1:-1;77140:65:0;;-1:-1:-1;76924:289:0;-1:-1:-1;;;76924:289:0:o;78774:521::-;78934:20;78967:31;79001:24;79006:9;79017:7;79001:4;:24::i;:::-;:30;;;-1:-1:-1;79075:1:0;79053:23;;;;79096:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;79096:13:0;;79087:22;;79120:168;79127:5;;79120:168;;79149:6;79154:1;79149:6;;:::i;:::-;;;79229:47;79249:5;79255:11;;79272:1;79267;:6;;79255:19;;;;;;;:::i;:::-;;;;;;;79249:26;;;;;;;:::i;79229:47::-;79171:6;79178:1;79171:9;;;;;;;;:::i;:::-;;;;;;79182:6;79189:1;79193;79189:5;;;;:::i;:::-;79182:13;;;;;;;;:::i;:::-;;;;;;79197:6;79204:1;79208;79204:5;;;;:::i;:::-;79197:13;;;;;;;;:::i;:::-;;;;;;79212:6;79219:1;79223;79219:5;;;;:::i;:::-;79212:13;;;;;;;;:::i;:::-;;;;;;;;;;79170:106;;;;;;;;;;;;79120:168;;;78956:339;;78774:521;;;;;;:::o;77530:254::-;77671:16;;24654:10;24668:9;24654:23;24646:50;;;;-1:-1:-1;;;24646:50:0;;18819:2:1;24646:50:0;;;18801:21:1;18858:2;18838:18;;;18831:30;-1:-1:-1;;;18877:18:1;;;18870:44;18931:18;;24646:50:0;18617:338:1;24646:50:0;77719:57:::1;77730:9;77740;77730:20;;;;;;;;:::i;:::-;;;;;;;;;;;:26;;77757:9;77730:37;;;;;;;:::i;:::-;;;;77769:6;77719:10;:57::i;:::-;77712:64;;;;77530:254:::0;;;;;;:::o;53198:594::-;53645:10;53596:20;53629:27;;;:15;:27;;;;;;53619:9;:38;;:9;;53629:27;53619:38;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;53619:61:0;;;;:47;:38;;;;;:47;;;;:61;;;;;53691:22;;53619:61;;-1:-1:-1;53708:5:0;;53619:61;;53691:22;;53708:5;;53691:22;:::i;:::-;;;;-1:-1:-1;53724:60:0;;-1:-1:-1;53752:12:0;53766:10;53778:5;53724:27;:60::i;52881:180::-;-1:-1:-1;;;;;53002:21:0;;52968:4;53002:21;;;:15;:21;;;;;;52992:9;:32;;:9;;53002:21;52992:32;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;52992:55:0;;;;:41;:32;;;;;:41;;;;:55;;;;;:61;;-1:-1:-1;52881:180:0;;;;;:::o;35963:475::-;36041:28;36072:9;36082;36072:20;;;;;;;;:::i;:::-;;;;;;;;;36111:14;36072:20;;;;;36111:14;;;;36072:20;;-1:-1:-1;;;;;;36111:14:0;36129:10;36111:28;36103:55;;;;-1:-1:-1;;;36103:55:0;;16672:2:1;36103:55:0;;;16654:21:1;16711:2;16691:18;;;16684:30;-1:-1:-1;;;16730:18:1;;;16723:44;16784:18;;36103:55:0;16470:338:1;36103:55:0;36186:14;;;;36211:13;;;:22;;-1:-1:-1;;;;;36186:14:0;;;;36228:5;;36211:13;36169:14;;36211:22;;36228:5;;-1:-1:-1;;;;;36211:22:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;36211:22:0;;;;;-1:-1:-1;;;;;36211:22:0;;;;;;36266:1;-1:-1:-1;;;;;36248:20:0;:6;-1:-1:-1;;;;;36248:20:0;;36244:187;;36285:41;;36293:10;;-1:-1:-1;;;;;36314:11:0;;36285:41;;;;;;;;;36314:11;36293:10;36285:41;;;;;;;;;;;;;;;;;;;;;36244:187;;;36359:60;36387:6;36395:10;36412:5;-1:-1:-1;;;;;36407:11:0;36359:27;:60::i;69820:187::-;69874:6;-1:-1:-1;;;69901:5:0;:35;69893:75;;;;-1:-1:-1;;;69893:75:0;;26977:2:1;69893:75:0;;;26959:21:1;27016:2;26996:18;;;26989:30;27055:29;27035:18;;;27028:57;27102:18;;69893:75:0;26775:351:1;69893:75:0;-1:-1:-1;69993:5:0;69820:187::o;33324:503::-;33484:21;;;;:6;:21;:::i;:::-;33459:22;;;:46;;-1:-1:-1;;;;;33459:46:0;;;;-1:-1:-1;;;33459:46:0;-1:-1:-1;;;;;33459:46:0;;;;;;;;;33590:18;;;;;;;;:::i;:::-;33568:19;;;:40;;;;;;;-1:-1:-1;;;33568:40:0;;;;;;;;;;;33702:16;;;;;;;;:::i;:::-;33682:17;;;:36;;;;;;;-1:-1:-1;;;33682:36:0;;;;;;;;;;;33799:20;;;;;;;;:::i;:::-;33775:7;:21;;;:44;;;;;;;;;;;;;;;;;;33324:503;;:::o;4922:399::-;5144:51;;;-1:-1:-1;;;;;27851:15:1;;;5144:51:0;;;27833:34:1;27903:15;;;27883:18;;;27876:43;27935:18;;;;27928:34;;;5144:51:0;;;;;;;;;;27745:18:1;;;;5144:51:0;;;;;;;;;;;;;5133:63;;-1:-1:-1;;;;5133:10:0;;;;:63;;5144:51;5133:63;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5097:99;;;;5215:7;:57;;;;-1:-1:-1;5227:11:0;;:16;;:44;;;5258:4;5247:24;;;;;;;;;;;;:::i;:::-;5207:106;;;;-1:-1:-1;;;5207:106:0;;28592:2:1;5207:106:0;;;28574:21:1;28631:2;28611:18;;;28604:30;28670:34;28650:18;;;28643:62;28741:6;28721:18;;;28714:34;28765:19;;5207:106:0;28390:400:1;5207:106:0;5010:311;;4922:399;;;;:::o;56566:1076::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56695:939:0;;;;;;;;56760:5;56695:939;;;;;;56811:25;56824:5;:11;;;56811:25;;:12;:25::i;:::-;-1:-1:-1;;;;;56695:939:0;;;;;56913:5;:12;;;56695:939;;;;;;56994:5;:18;;;56695:939;;;;;;57079:5;:18;;;56695:939;;;;;;57198:5;:18;;;56695:939;;;;;;57306:5;:15;;;56695:939;;;;;;57477:5;:11;;;56695:939;;;;;;57535:5;:12;;;56695:939;;;;;;57592:30;57605:5;:16;;;69715:21;69735:1;69715:21;;;;69742:30;69771:1;69742:30;;;;;;;;69714:59;;69627:154;57592:30;56695:939;;;;56688:946;56566:1076;-1:-1:-1;;;56566:1076:0:o;64709:1560::-;64920:13;;64963:12;;;;65006;;;;64857:16;;65001:18;;;;;64958;;65104:5;65090:473;65117:6;65111:3;;;:::i;:::-;;;;:12;:48;;;;;65153:6;65132;65139:1;65132:9;;;;;;;;:::i;:::-;;;;;;;;;;:16;;;;;;65127:32;65111:48;65090:473;;;65534:6;65541:1;65534:9;;;;;;;;:::i;:::-;;;;;;;;;;:16;65514:37;;-1:-1:-1;;;65534:16:0;;;;65514:37;;:::i;:::-;;;65090:473;;;-1:-1:-1;65637:6:0;65654:461;65669:1;65661:5;:9;:58;;;;-1:-1:-1;65713:6:0;65686;65693:7;;;:::i;:::-;;;;65686:15;;;;;;;;:::i;:::-;;;;;;;;;;:22;;;;;;;-1:-1:-1;65674:45:0;;65661:58;65654:461;;;66082:6;66089:5;66082:13;;;;;;;;:::i;:::-;;;;;;;;;;:20;66062:41;;-1:-1:-1;;;66082:20:0;;;;66062:41;;:::i;:::-;;;65654:461;;;66139:1;66131:5;:9;:26;;;;66153:4;66144:6;:13;66131:26;66127:135;;;66188:13;66197:4;66188:6;:13;:::i;:::-;66174:27;;66127:135;;;66248:2;66234:16;;66127:135;64893:1376;;;64709:1560;;;;;;:::o;68640:311::-;68714:4;14940:8;68735:5;:28;68731:156;;;68780:6;68789:27;14756:7;68789:5;:27;:::i;:::-;68780:36;-1:-1:-1;68865:10:0;68780:36;68865:5;:10;:::i;:::-;68844:18;68861:1;68844:13;:18;:::i;:::-;68838:24;;:3;:24;:::i;:::-;:37;;;;:::i;:::-;68831:44;;;;;68731:156;68932:11;68910:19;68927:2;68910:13;:19;:::i;:::-;68904:25;;:3;:25;:::i;:::-;:39;;;;:::i;:::-;68897:46;68640:311;-1:-1:-1;;;68640:311:0:o;58615:6037::-;58798:32;;;;;;;;;58820:10;;;58798:32;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;58798:32:0;;;;;;;;;-1:-1:-1;;;58798:32:0;;;;;;;;;;;;;;-1:-1:-1;;;58798:32:0;;;;;;;;;;;;;-1:-1:-1;;;58798:32:0;;;;;;;;;;;;;58735:11;;;58886:13;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58798:32:0;-1:-1:-1;;;;;58735:11:0;;58798:32;;;-1:-1:-1;;;;;59589:23:0;60768:9;60789:6;60780:5;:15;;:130;;;;60898:12;60871:6;:22;;;60866:28;;60840:6;60847:5;60840:13;;;;;;;;:::i;:::-;;;;;;;;;;60832:21;;;;;;;;60840:13;;;;60832:21;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60832:21:0;;;;;;;;;;;-1:-1:-1;;;60832:21:0;;;;;;;;-1:-1:-1;;;60832:21:0;;;;;;;;;-1:-1:-1;;;60832:21:0;;;;;;;;-1:-1:-1;;;60832:21:0;;;;;;;;;;-1:-1:-1;;;60832:21:0;;;;;;;-1:-1:-1;;;60832:21:0;;;;;;;;;;-1:-1:-1;60832:21:0;-1:-1:-1;60816:78:0;;60832:21;60816:78;:::i;:::-;:94;;60780:130;60768:142;;61019:4;:22;;;;61035:6;61027:4;:14;;61019:22;61015:3196;;;61134:21;;61130:2987;;61345:13;;;;69735:1;69715:21;;;;;69771:1;69742:30;;;;;;69714:59;61321:8;61429:36;61448:17;61429:16;:36;:::i;:::-;61525:43;;;:15;;;:43;61416:49;-1:-1:-1;61607:19:0;61416:49;61607:12;:19::i;:::-;61591:35;;:13;;;:35;61717:1;;-1:-1:-1;61717:1:0;;-1:-1:-1;61790:7:0;;61786:2213;;62000:11;;;;61973:58;;62028:2;;62019:5;;69735:1;69715:21;;;;;69771:1;69742:30;;;;;;69714:59;61987:29;;62015:1;61987:29;:::i;:::-;:37;;;;:::i;:::-;61986:44;;;;:::i;:::-;61973:12;:58::i;:::-;61959:72;;:11;;;:72;62349:19;62365:3;62359:2;62350:11;;;62349:19;:::i;:::-;62343:25;;62405:15;62399:3;:21;62395:205;;;62459:21;62465:15;62459:3;:21;:::i;:::-;62453:27;;62395:205;;;62551:21;62569:3;62551:15;:21;:::i;:::-;62545:27;;62395:205;63125:2;63092;63076;:9;;;63071:15;;63064:4;:22;;;;:::i;:::-;14628:5;63018:9;63024:3;;63018:9;:::i;:::-;:16;;63030:4;63018:16;:::i;:::-;:42;;;;:::i;:::-;:69;;;;:::i;:::-;63017:77;;62886:2;:10;;;62881:16;;62900:1;62881:20;;;;:::i;:::-;:214;;;;:::i;:::-;62850:277;;;;:::i;:::-;62844:283;;63386:14;63380:3;:20;63376:105;;;63439:14;63433:20;;63376:105;63507:24;;;:10;;;:24;61786:2213;;;63863:13;;;;63849:27;;:11;;;:27;-1:-1:-1;63953:10:0;;;:22;61786:2213;-1:-1:-1;;64073:24:0;;;:9;;;:24;61130:2987;64189:6;64182:13;;61015:3196;64231:4;64227:50;;;64256:5;;;64227:50;64364:18;;;;64338:45;;64359:24;;64338:45;;:::i;:::-;64456:18;;;;64431:16;;;;64338:45;;-1:-1:-1;64451:24:0;;;69735:1;69715:21;;;;;69771:1;69742:30;;;;;;69714:59;64418:57;;;;:::i;:::-;64398:77;;;;:::i;:::-;;;59641:4846;59632:7;;;;:::i;:::-;;;59623:4864;;;64553:8;;64548:14;;64540:22;;64536:109;;;64597:5;64579:2;:8;;:24;;;;;;;;;;;64631:2;64618:4;:10;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64536:109;58684:5968;;;;;;;;;58615:6037;;:::o;67460:441::-;67646:14;;67642:252;;-1:-1:-1;;;;;67681:26:0;;67677:206;;67736:26;67749:12;67736;:26::i;:::-;-1:-1:-1;;;;;67728:44:0;:56;67773:10;67728:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67677:206;-1:-1:-1;;;;;67825:22:0;;;;;;;;;;;;;:42;;67857:10;;67825:22;:42;;67857:10;;67825:42;:::i;:::-;;;;-1:-1:-1;;67460:441:0;;;;:::o;81241:506::-;81305:28;81356:9;81366;81356:20;;;;;;;;:::i;:::-;;;;;;;;;;;81346:30;;81403:1;81391:9;:13;81387:353;;;81421:36;;-1:-1:-1;;;;;81421:25:0;;;81447:9;81421:36;;;;;;;;;81447:9;81421:25;:36;;;;;;;;;;;;;;;;;;;;;81241:506;;;;:::o;74677:1290::-;-1:-1:-1;;;;;;;;74788:27:0;-1:-1:-1;;;;;;;;;;;;;;;74760:13:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74818:11:0;;;;74874:19;74917:1;74907:11;;;;;;74896:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;74896:23:0;-1:-1:-1;74960:7:0;:23;75008:13;;74874:45;;-1:-1:-1;74960:23:0;;;;;;74932:20;;;;75133:802;75154:5;75150:1;:9;75133:802;;;75191:10;;;;75220:56;;-1:-1:-1;75252:6:0;75259:7;;;:::i;:::-;;;;75252:15;;;;;;;;:::i;:::-;;;;;;;;;;75244:23;;;;;;;;75252:15;;;;75244:23;;;;;;;;;;;;;;;;;;-1:-1:-1;;;75244:23:0;;;;;;;;;;;-1:-1:-1;;;75244:23:0;;;;;;;;-1:-1:-1;;;75244:23:0;;;;;;;;;-1:-1:-1;;;75244:23:0;;;;;;;;-1:-1:-1;;;75244:23:0;;;;;;;;;;-1:-1:-1;;;75244:23:0;;;;;;;-1:-1:-1;;;75244:23:0;;;;;;;;;-1:-1:-1;75228:48:0;;;75220:56;75216:519;;;75321:1;75301:17;:21;:64;;;;-1:-1:-1;75353:12:0;75326:24;75335:15;75326:6;:24;:::i;:::-;:39;75301:64;75297:222;;;75403:24;75412:15;75403:6;:24;:::i;:::-;75390:5;75396:3;;;;:::i;:::-;;;75390:10;;;;;;;;:::i;:::-;;;;;;;;;;:37;75463:36;75482:17;75463:16;:36;:::i;:::-;75450:5;75456:3;;;;:::i;:::-;;;75450:10;;;;;;;;:::i;:::-;;;;;;:49;;;;;75297:222;75541:4;75537:58;;;75570:5;;;75537:58;75633:1;75613:21;;75672:1;75653:20;;75706:5;:12;;;75701:18;;75692:27;;75216:519;75776:18;;;;75771:24;;75810:33;75771:24;75810:33;;:::i;:::-;75891:16;;;;75810:33;;-1:-1:-1;75911:12:0;;69735:1;69715:21;;;;;69771:1;69742:30;;;;;;69714:59;75878:45;;;;:::i;:::-;75858:65;;;;:::i;:::-;;;75162:773;;75133:802;;;-1:-1:-1;75954:5:0;;74677:1290;-1:-1:-1;;;;;;;;;;74677:1290:0:o;71541:2866::-;71769:7;:23;71719:11;;;71820:13;;71646:16;;;;71719:11;71769:23;;;;;;;71646:16;;71896:25;71769:23;71896:25;;:::i;:::-;;-1:-1:-1;72040:10:0;72053;72062:1;72053:6;:10;:::i;:::-;72040:23;;72078:9;72155:661;72169:5;72162:4;:12;72155:661;;;72223:1;72206:12;72213:5;72206:4;:12;:::i;:::-;72205:19;;72197:27;;72262:6;72269:5;72262:13;;;;;;;;:::i;:::-;;;;;;;;;;:20;;;;;;;-1:-1:-1;72306:20:0;;;72302:499;;;72358:7;;;:::i;:::-;;;;72351:14;;72155:661;;72302:499;72404:11;72395:6;:20;72391:410;;;72720:7;;;:::i;:::-;;;;72712:15;;72155:661;;72391:410;-1:-1:-1;;;;;;;;;;72867:22:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72867:22:0;;;;;;73071:5;73057:615;73082:6;73078:1;:10;73057:615;;;73116:6;73123:3;;;;:::i;:::-;;;73116:11;;;;;;;;:::i;:::-;;;;;;;;;;73108:19;;;;;;;;73116:11;;;;73108:19;;;;;;;;;;;;;;;;;;-1:-1:-1;;;73108:19:0;;;;;;;;;;;-1:-1:-1;;;73108:19:0;;;;;;;;-1:-1:-1;;;73108:19:0;;;;;;;;;-1:-1:-1;;;73108:19:0;;;;;;;;-1:-1:-1;;;73108:19:0;;;;;;;;;;-1:-1:-1;;;73108:19:0;;;;;;;-1:-1:-1;;;73108:19:0;;;;;;;;;;-1:-1:-1;73108:19:0;-1:-1:-1;73193:20:0;;;73234:5;73189:66;73289:18;;;;73284:24;;;-1:-1:-1;73327:16:0;;73323:338;;73368:1;73373;73368:6;73364:146;;73403:11;73399:15;;73364:146;;;73449:11;73444:1;:16;73485:5;73440:70;;73528:33;73549:12;73528:33;;:::i;:::-;73613:16;;;;73528:33;;-1:-1:-1;73633:12:0;;69735:1;69715:21;;;;;69771:1;69742:30;;;;;;69714:59;73600:45;;;;:::i;:::-;73580:65;;;;:::i;:::-;;;73323:338;73057:615;;;;73717:527;73724:9;;73717:527;;73760:6;73767:7;;;:::i;:::-;;;;73760:15;;;;;;;;:::i;:::-;;;;;;;;;;73752:23;;;;;;;;73760:15;;;;73752:23;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;73752:23:0;;;;;;;;;;-1:-1:-1;;;73752:23:0;;;;;;;;-1:-1:-1;;;73752:23:0;;;;;;;;;-1:-1:-1;;;73752:23:0;;;;;;;;-1:-1:-1;;;73752:23:0;;;;;;;;;;-1:-1:-1;;;73752:23:0;;;;;;;-1:-1:-1;;;73752:23:0;;;;;;;;;;;-1:-1:-1;73752:23:0;-1:-1:-1;73848:16:0;;73844:389;;73904:5;:12;;;73899:18;;73885:32;;73940:1;73945;73940:6;73936:146;;73975:11;73971:15;;73936:146;;;74021:11;74016:1;:16;74057:5;74012:70;;74100:33;74121:12;74100:33;;:::i;:::-;74185:16;;;;74100:33;;-1:-1:-1;74205:12:0;;69735:1;69715:21;;;;;69771:1;69742:30;;;;;;69714:59;74172:45;;;;:::i;:::-;74152:65;;;;:::i;:::-;;;73844:389;73717:527;;;74260:21;;74256:120;;74306:19;74310:15;74306:1;:19;:::i;:::-;74327:36;74346:17;74327:16;:36;:::i;:::-;74298:66;;;;;;;;;;;;;;;;74256:120;-1:-1:-1;74394:1:0;;;;-1:-1:-1;71541:2866:0;-1:-1:-1;;;;;;;;;;;;71541:2866:0:o;68102:530::-;-1:-1:-1;;;;;68188:21:0;;68156:4;68188:21;;;:15;:21;;;;;;68224:10;;;68220:380;;-1:-1:-1;68497:9:0;:16;-1:-1:-1;;;;;68465:21:0;;;;;;:15;:21;;;;;:48;;;68517:11;68464:64;;68456:89;;;;-1:-1:-1;;;68456:89:0;;30516:2:1;68456:89:0;;;30498:21:1;30555:2;30535:18;;;30528:30;30594:14;30574:18;;;30567:42;30626:18;;68456:89:0;30314:336:1;68456:89:0;68560:9;:16;;;;;;;-1:-1:-1;68560:16:0;;;;;;;:28;;-1:-1:-1;;;;;;68560:28:0;-1:-1:-1;;;;;68560:28:0;;;;;68619:5;68102:530;-1:-1:-1;;68102:530:0:o;66479:759::-;66650:4;-1:-1:-1;;;;;66671:26:0;;66667:564;;66721:18;66729:10;66721:5;:18;:::i;:::-;66714:25;;;;66667:564;-1:-1:-1;;;;;66825:22:0;;66802:20;66825:22;;;;;;;;;;66882:13;;66914:25;;;66910:283;;;66976:1;66960:17;;66996:99;67028:12;67042:10;67062:4;67069:25;67082:12;67069:10;:25;:::i;:::-;66996:31;:99::i;:::-;66910:283;;;67152:25;67167:10;67152:12;:25;:::i;:::-;67136:41;;66910:283;-1:-1:-1;67214:5:0;;66479:759;-1:-1:-1;;;;;66479:759:0:o;57677:876::-;57888:6;57900:644;;;;;;;;57932:12;57900:644;;;;;;58006:12;57900:644;;;;;;58074:5;57900:644;;;;;;58155:5;57900:644;;;;;;58236:5;57900:644;;;;;;58324:9;57900:644;;;;;;58417:1;58401:12;:17;;57900:644;;;;;;58474:12;58489:4;58474:19;57900:644;;;;;;58509:24;58522:10;58509:12;:24::i;:::-;57900:644;;;;;;;57888:657;;;;;;;-1:-1:-1;57888:657:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57888:657:0;;;;;;-1:-1:-1;;;57888:657:0;-1:-1:-1;;;;57888:657:0;;;;-1:-1:-1;;;57888:657:0;;;;;-1:-1:-1;;;;57888:657:0;;;;-1:-1:-1;;;57888:657:0;-1:-1:-1;;;;57888:657:0;;;;-1:-1:-1;;;57888:657:0;;-1:-1:-1;;57888:657:0;;;-1:-1:-1;;;57888:657:0;-1:-1:-1;;57888:657:0;;;-1:-1:-1;;;57888:657:0;;;;;-1:-1:-1;;57888:657:0;;;;;-1:-1:-1;;57888:657:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;57677:876:0:o;23708:163::-;23805:1;23782:11;-1:-1:-1;;;;;23782:11:0;:25;23774:54;;;;-1:-1:-1;;;23774:54:0;;30857:2:1;23774:54:0;;;30839:21:1;30896:2;30876:18;;;30869:30;30935:18;30915;;;30908:46;30971:18;;23774:54:0;30655:340:1;23774:54:0;23839:11;:24;;-1:-1:-1;;;;;;23839:24:0;-1:-1:-1;;;;;23839:24:0;;;;;;;;;;23708:163::o;70665:606::-;70856:39;;;;;;;;70885:10;;;70856:39;;;;;;;;;;;;;;;;-1:-1:-1;;;70856:39:0;;;;;;;;;;-1:-1:-1;;;70856:39:0;;;;;;;;-1:-1:-1;;;70856:39:0;;;;;;;;-1:-1:-1;;;70856:39:0;;;;;;;;70751:16;;;;;;;;70856:39;70912:32;70908:324;;71017:7;:23;70992:16;;;;70987:54;;71017:23;;;;;;70987:22;;:54;:::i;:::-;71073:20;;;;69735:1;69715:21;;;;;69771:1;69742:30;;;;;;69714:59;71126:18;;;;69735:1;69715:21;;;;;69771:1;69742:30;;;;;;69714:59;71203:2;71170:9;:17;;;71165:23;;71191:7;71165:33;;;;:::i;:::-;71164:41;;70961:259;;;;;;;;;;;70908:324;71252:1;71255;71258;71261;71244:19;;;;;;;;;70665:606;;;;;;:::o;4556:358::-;4748:45;;;-1:-1:-1;;;;;17013:55:1;;;4748:45:0;;;16995:74:1;17085:18;;;;17078:34;;;4748:45:0;;;;;;;;;;16968:18:1;;;;4748:45:0;;;;;;;;;;;;;4737:57;;-1:-1:-1;;;;4737:10:0;;;;:57;;4748:45;4737:57;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4701:93;;;;4813:7;:57;;;;-1:-1:-1;4825:11:0;;:16;;:44;;;4856:4;4845:24;;;;;;;;;;;;:::i;:::-;4805:101;;;;-1:-1:-1;;;4805:101:0;;31504:2:1;4805:101:0;;;31486:21:1;31543:2;31523:18;;;31516:30;31582:33;31562:18;;;31555:61;31633:18;;4805:101:0;31302:355:1;69198:257:0;69254:6;;69304:95;69319:15;69311:5;:23;69304:95;;;69361:1;69351:11;;;;;69377:10;;;:::i;:::-;;;69304:95;;;69433:1;69424:10;;;;69423:23;;;;69198:257;-1:-1:-1;69198:257:0:o;14:196:1:-;82:20;;-1:-1:-1;;;;;131:54:1;;121:65;;111:93;;200:1;197;190:12;111:93;14:196;;;:::o;215:322::-;292:6;300;308;361:2;349:9;340:7;336:23;332:32;329:52;;;377:1;374;367:12;329:52;413:9;400:23;390:33;;442:38;476:2;465:9;461:18;442:38;:::i;:::-;432:48;;527:2;516:9;512:18;499:32;489:42;;215:322;;;;;:::o;542:162::-;608:5;653:3;644:6;639:3;635:16;631:26;628:46;;;670:1;667;660:12;628:46;-1:-1:-1;692:6:1;542:162;-1:-1:-1;542:162:1:o;709:318::-;809:6;817;870:3;858:9;849:7;845:23;841:33;838:53;;;887:1;884;877:12;838:53;923:9;910:23;900:33;;952:69;1013:7;1008:2;997:9;993:18;952:69;:::i;:::-;942:79;;709:318;;;;;:::o;1032:322::-;1109:6;1117;1125;1178:2;1166:9;1157:7;1153:23;1149:32;1146:52;;;1194:1;1191;1184:12;1146:52;1230:9;1217:23;1207:33;;1287:2;1276:9;1272:18;1259:32;1249:42;;1310:38;1344:2;1333:9;1329:18;1310:38;:::i;:::-;1300:48;;1032:322;;;;;:::o;1359:186::-;1418:6;1471:2;1459:9;1450:7;1446:23;1442:32;1439:52;;;1487:1;1484;1477:12;1439:52;1510:29;1529:9;1510:29;:::i;1913:180::-;1972:6;2025:2;2013:9;2004:7;2000:23;1996:32;1993:52;;;2041:1;2038;2031:12;1993:52;-1:-1:-1;2064:23:1;;1913:180;-1:-1:-1;1913:180:1:o;2531:612::-;2592:3;2630:5;2624:12;2657:6;2652:3;2645:19;2683:4;2712:2;2707:3;2703:12;2696:19;;2749:2;2742:5;2738:14;2770:1;2780:338;2794:6;2791:1;2788:13;2780:338;;;2853:13;;2895:9;;-1:-1:-1;;;;;2891:58:1;2879:71;;2994:11;;2988:18;-1:-1:-1;;;;;2984:51:1;2970:12;;;2963:73;3065:4;3056:14;;;;3093:15;;;;2816:1;2809:9;2780:338;;;-1:-1:-1;3134:3:1;;2531:612;-1:-1:-1;;;;;2531:612:1:o;3148:1987::-;3343:2;3332:9;3325:21;3388:6;3382:13;3377:2;3366:9;3362:18;3355:41;3306:4;3443:2;3435:6;3431:15;3425:22;3456:52;3504:2;3493:9;3489:18;3475:12;-1:-1:-1;;;;;1616:54:1;1604:67;;1550:127;3456:52;-1:-1:-1;3557:2:1;3545:15;;3539:22;-1:-1:-1;;;;;2163:38:1;;3619:2;3604:18;;2151:51;-1:-1:-1;3672:2:1;3660:15;;3654:22;-1:-1:-1;;;;;1616:54:1;;3735:3;3720:19;;1604:67;-1:-1:-1;3789:3:1;3777:16;;3771:23;-1:-1:-1;;;;;2163:38:1;;3852:3;3837:19;;2151:51;-1:-1:-1;3906:3:1;3894:16;;3888:23;-1:-1:-1;;;;;2279:46:1;;3970:3;3955:19;;2267:59;-1:-1:-1;4024:3:1;4012:16;;4006:23;-1:-1:-1;;;;;2163:38:1;;4087:3;4072:19;;2151:51;4038:54;4141:3;4133:6;4129:16;4123:23;4165:3;4177:53;4226:2;4215:9;4211:18;4195:14;2413:6;2402:18;2390:31;;2337:90;4177:53;4267:15;;4261:22;;-1:-1:-1;4302:3:1;4314:53;4348:18;;;4261:22;2413:6;2402:18;2390:31;;2337:90;4314:53;4404:15;;4398:22;;-1:-1:-1;4439:3:1;4451:54;4486:18;;;4398:22;-1:-1:-1;;;;;1616:54:1;1604:67;;1550:127;4451:54;4542:15;;4536:22;;-1:-1:-1;4577:3:1;4589:53;4623:18;;;4536:22;2508:10;2497:22;2485:35;;2432:94;4589:53;4680:15;;4674:22;;-1:-1:-1;4715:3:1;4727:54;4762:18;;;4674:22;2413:6;2402:18;2390:31;;2337:90;4727:54;4819:15;;4813:22;;-1:-1:-1;4854:3:1;4866:54;4901:18;;;4813:22;2413:6;2402:18;2390:31;;2337:90;4866:54;4958:15;;4952:22;4993:6;5015:18;;;5008:30;4952:22;-1:-1:-1;5055:74:1;5124:3;5109:19;;4952:22;5055:74;:::i;5140:369::-;5208:6;5216;5269:2;5257:9;5248:7;5244:23;5240:32;5237:52;;;5285:1;5282;5275:12;5237:52;5321:9;5308:23;5298:33;;5381:2;5370:9;5366:18;5353:32;-1:-1:-1;;;;;5418:5:1;5414:46;5407:5;5404:57;5394:85;;5475:1;5472;5465:12;5394:85;5498:5;5488:15;;;5140:369;;;;;:::o;5514:454::-;5609:6;5617;5625;5633;5641;5694:3;5682:9;5673:7;5669:23;5665:33;5662:53;;;5711:1;5708;5701:12;5662:53;-1:-1:-1;;5734:23:1;;;5804:2;5789:18;;5776:32;;-1:-1:-1;5855:2:1;5840:18;;5827:32;;5906:2;5891:18;;5878:32;;-1:-1:-1;5957:3:1;5942:19;5929:33;;-1:-1:-1;5514:454:1;-1:-1:-1;5514:454:1:o;6280:1971::-;6513:2;6565:21;;;6635:13;;6538:18;;;6657:22;;;6484:4;;6513:2;6698;;6716:18;;;;6757:15;;;6484:4;6800:1425;6814:6;6811:1;6808:13;6800:1425;;;6873:13;;6917:9;;2508:10;2497:22;;;2485:35;;6971:11;;;6965:18;-1:-1:-1;;;;;1616:54:1;7029:12;;;1604:67;7083:11;;;7077:18;2497:22;;7142:12;;;2485:35;7178:4;7223:11;;;7217:18;2497:22;;7282:12;;;2485:35;7318:4;7363:11;;;7357:18;2497:22;;7422:12;;;2485:35;7458:4;7503:11;;;7497:18;2497:22;;;7562:12;;;2485:35;7598:4;7643:11;;;7637:18;6049:8;6038:20;7702:12;;;6026:33;7738:4;7783:11;;;7777:18;6137:4;6126:16;;;7841:12;;;6114:29;;;;7877:6;7924:11;;;7918:18;6126:16;;;7982:12;;;6114:29;8019:6;8066:12;;;8060:19;6227:40;6216:52;8127:13;;;6204:65;8170:6;8161:16;;;;8200:15;;;;6836:1;6829:9;6800:1425;;;-1:-1:-1;8242:3:1;;6280:1971;-1:-1:-1;;;;;;;6280:1971:1:o;8256:386::-;8338:8;8348:6;8402:3;8395:4;8387:6;8383:17;8379:27;8369:55;;8420:1;8417;8410:12;8369:55;-1:-1:-1;8443:20:1;;8486:18;8475:30;;8472:50;;;8518:1;8515;8508:12;8472:50;8555:4;8547:6;8543:17;8531:29;;8615:3;8608:4;8598:6;8595:1;8591:14;8583:6;8579:27;8575:38;8572:47;8569:67;;;8632:1;8629;8622:12;8647:551;8769:6;8777;8785;8838:2;8826:9;8817:7;8813:23;8809:32;8806:52;;;8854:1;8851;8844:12;8806:52;8890:9;8877:23;8867:33;;8951:2;8940:9;8936:18;8923:32;8978:18;8970:6;8967:30;8964:50;;;9010:1;9007;9000:12;8964:50;9049:89;9130:7;9121:6;9110:9;9106:22;9049:89;:::i;:::-;8647:551;;9157:8;;-1:-1:-1;9023:115:1;;-1:-1:-1;;;;8647:551:1:o;9203:667::-;9316:6;9324;9332;9340;9348;9401:3;9389:9;9380:7;9376:23;9372:33;9369:53;;;9418:1;9415;9408:12;9369:53;9454:9;9441:23;9431:33;;9515:2;9504:9;9500:18;9487:32;9542:18;9534:6;9531:30;9528:50;;;9574:1;9571;9564:12;9528:50;9613:89;9694:7;9685:6;9674:9;9670:22;9613:89;:::i;:::-;9721:8;;-1:-1:-1;9587:115:1;-1:-1:-1;;9803:2:1;9788:18;;9775:32;;-1:-1:-1;9826:38:1;9860:2;9845:18;;9826:38;:::i;:::-;9816:48;;9203:667;;;;;;;;:::o;9875:632::-;10046:2;10098:21;;;10168:13;;10071:18;;;10190:22;;;10017:4;;10046:2;10269:15;;;;10243:2;10228:18;;;10017:4;10312:169;10326:6;10323:1;10320:13;10312:169;;;10387:13;;10375:26;;10456:15;;;;10421:12;;;;10348:1;10341:9;10312:169;;;-1:-1:-1;10498:3:1;;9875:632;-1:-1:-1;;;;;;9875:632:1:o;10512:254::-;10580:6;10588;10641:2;10629:9;10620:7;10616:23;10612:32;10609:52;;;10657:1;10654;10647:12;10609:52;10693:9;10680:23;10670:33;;10722:38;10756:2;10745:9;10741:18;10722:38;:::i;10771:592::-;10875:6;10883;10891;10899;10952:2;10940:9;10931:7;10927:23;10923:32;10920:52;;;10968:1;10965;10958:12;10920:52;11004:9;10991:23;10981:33;;11061:2;11050:9;11046:18;11033:32;11023:42;;11116:2;11105:9;11101:18;11088:32;11143:18;11135:6;11132:30;11129:50;;;11175:1;11172;11165:12;11129:50;11214:89;11295:7;11286:6;11275:9;11271:22;11214:89;:::i;:::-;10771:592;;;;-1:-1:-1;11322:8:1;-1:-1:-1;;;;10771:592:1:o;11368:191::-;11452:6;11505:2;11493:9;11484:7;11480:23;11476:32;11473:52;;;11521:1;11518;11511:12;11746:248;11814:6;11822;11875:2;11863:9;11854:7;11850:23;11846:32;11843:52;;;11891:1;11888;11881:12;11843:52;-1:-1:-1;;11914:23:1;;;11984:2;11969:18;;;11956:32;;-1:-1:-1;11746:248:1:o;12252:179::-;12319:20;;-1:-1:-1;;;;;12368:38:1;;12358:49;;12348:77;;12421:1;12418;12411:12;12436:815;12589:6;12597;12605;12613;12621;12629;12682:3;12670:9;12661:7;12657:23;12653:33;12650:53;;;12699:1;12696;12689:12;12650:53;12722:29;12741:9;12722:29;:::i;:::-;12712:39;;12770:37;12803:2;12792:9;12788:18;12770:37;:::i;:::-;12760:47;;12826:38;12860:2;12849:9;12845:18;12826:38;:::i;:::-;12816:48;;12915:2;12904:9;12900:18;12887:32;12942:18;12934:6;12931:30;12928:50;;;12974:1;12971;12964:12;12928:50;13013:89;13094:7;13085:6;13074:9;13070:22;13013:89;:::i;:::-;13121:8;;-1:-1:-1;12987:115:1;-1:-1:-1;13175:70:1;;-1:-1:-1;13237:7:1;13231:3;13216:19;;13175:70;:::i;:::-;13165:80;;12436:815;;;;;;;;:::o;13712:316::-;13789:6;13797;13805;13858:2;13846:9;13837:7;13833:23;13829:32;13826:52;;;13874:1;13871;13864:12;13826:52;-1:-1:-1;;13897:23:1;;;13967:2;13952:18;;13939:32;;-1:-1:-1;14018:2:1;14003:18;;;13990:32;;13712:316;-1:-1:-1;13712:316:1:o;14429:598::-;14533:6;14541;14549;14557;14610:2;14598:9;14589:7;14585:23;14581:32;14578:52;;;14626:1;14623;14616:12;14578:52;14662:9;14649:23;14639:33;;14723:2;14712:9;14708:18;14695:32;14750:18;14742:6;14739:30;14736:50;;;14782:1;14779;14772:12;14736:50;14821:89;14902:7;14893:6;14882:9;14878:22;14821:89;:::i;:::-;14929:8;;-1:-1:-1;14795:115:1;-1:-1:-1;14983:38:1;;-1:-1:-1;15017:2:1;15002:18;;14983:38;:::i;:::-;14973:48;;14429:598;;;;;;;:::o;15032:254::-;15100:6;15108;15161:2;15149:9;15140:7;15136:23;15132:32;15129:52;;;15177:1;15174;15167:12;15129:52;15200:29;15219:9;15200:29;:::i;:::-;15190:39;15276:2;15261:18;;;;15248:32;;-1:-1:-1;;;15032:254:1:o;15291:260::-;15359:6;15367;15420:2;15408:9;15399:7;15395:23;15391:32;15388:52;;;15436:1;15433;15426:12;15388:52;15459:29;15478:9;15459:29;:::i;:::-;15449:39;;15507:38;15541:2;15530:9;15526:18;15507:38;:::i;15556:184::-;-1:-1:-1;;;15605:1:1;15598:88;15705:4;15702:1;15695:15;15729:4;15726:1;15719:15;16085:184;-1:-1:-1;;;16134:1:1;16127:88;16234:4;16231:1;16224:15;16258:4;16255:1;16248:15;16274:191;-1:-1:-1;;;;;16401:10:1;;;16389;;;16385:27;;16424:12;;;16421:38;;;16439:18;;:::i;17123:277::-;17190:6;17243:2;17231:9;17222:7;17218:23;17214:32;17211:52;;;17259:1;17256;17249:12;17211:52;17291:9;17285:16;17344:5;17337:13;17330:21;17323:5;17320:32;17310:60;;17366:1;17363;17356:12;17742:184;-1:-1:-1;;;17791:1:1;17784:88;17891:4;17888:1;17881:15;17915:4;17912:1;17905:15;17931:135;17970:3;17991:17;;;17988:43;;18011:18;;:::i;:::-;-1:-1:-1;18058:1:1;18047:13;;17931:135::o;18415:197::-;-1:-1:-1;;;;;18537:10:1;;;18549;;;18533:27;;18572:11;;;18569:37;;;18586:18;;:::i;18960:128::-;19027:9;;;19048:11;;;19045:37;;;19062:18;;:::i;19093:136::-;19132:3;19160:5;19150:39;;19169:18;;:::i;:::-;-1:-1:-1;;;19205:18:1;;19093:136::o;19234:125::-;19299:9;;;19320:10;;;19317:36;;;19333:18;;:::i;19364:545::-;19457:4;19463:6;19523:11;19510:25;19617:2;19613:7;19602:8;19586:14;19582:29;19578:43;19558:18;19554:68;19544:96;;19636:1;19633;19626:12;19544:96;19663:33;;19715:20;;;-1:-1:-1;19758:18:1;19747:30;;19744:50;;;19790:1;19787;19780:12;19744:50;19823:4;19811:17;;-1:-1:-1;19874:1:1;19870:14;;;19854;19850:35;19840:46;;19837:66;;;19899:1;19896;19889:12;20251:168;20324:9;;;20355;;20372:15;;;20366:22;;20352:37;20342:71;;20393:18;;:::i;20424:274::-;20464:1;20490;20480:189;;-1:-1:-1;;;20522:1:1;20515:88;20626:4;20623:1;20616:15;20654:4;20651:1;20644:15;20480:189;-1:-1:-1;20683:9:1;;20424:274::o;21983:117::-;22068:6;22061:5;22057:18;22050:5;22047:29;22037:57;;22090:1;22087;22080:12;22037:57;21983:117;:::o;22105:760::-;22266:5;22253:19;22304:4;22295:7;22291:18;22340:2;22331:7;22328:15;22318:43;;22357:1;22354;22347:12;22318:43;22380:11;;-1:-1:-1;;22416:17:1;;22413:25;;22400:39;;22380:11;-1:-1:-1;22487:2:1;22476:14;;22463:28;22500:32;22463:28;22500:32;:::i;:::-;22578:8;22568:7;22565:1;22561:15;22557:30;22541:46;;22644:8;22639:2;22627:8;22623:13;22619:2;22615:22;22612:30;22609:44;22603:4;22596:58;22702:2;22695:5;22691:14;22678:28;22715:32;22739:7;22715:32;:::i;:::-;-1:-1:-1;;22788:26:1;;;;22785:34;;;22772:48;22830:2;22826:16;;;;22844:12;22822:35;22769:89;22756:103;;-1:-1:-1;22105:760:1:o;24429:197::-;24467:3;24495:6;24536:2;24529:5;24525:14;24563:2;24554:7;24551:15;24548:41;;24569:18;;:::i;:::-;24618:1;24605:15;;24429:197;-1:-1:-1;;;24429:197:1:o;26570:200::-;-1:-1:-1;;;;;26706:10:1;;;26694;;;26690:27;;26729:12;;;26726:38;;;26744:18;;:::i;27131:184::-;27189:6;27242:2;27230:9;27221:7;27217:23;27213:32;27210:52;;;27258:1;27255;27248:12;27210:52;27281:28;27299:9;27281:28;:::i;27320:245::-;27378:6;27431:2;27419:9;27410:7;27406:23;27402:32;27399:52;;;27447:1;27444;27437:12;27399:52;27486:9;27473:23;27505:30;27529:5;27505:30;:::i;27973:412::-;28102:3;28140:6;28134:13;28165:1;28175:129;28189:6;28186:1;28183:13;28175:129;;;28287:4;28271:14;;;28267:25;;28261:32;28248:11;;;28241:53;28204:12;28175:129;;;-1:-1:-1;28359:1:1;28323:16;;28348:13;;;-1:-1:-1;28323:16:1;27973:412;-1:-1:-1;27973:412:1:o;28795:422::-;28884:1;28927:5;28884:1;28941:270;28962:7;28952:8;28949:21;28941:270;;;29021:4;29017:1;29013:6;29009:17;29003:4;29000:27;28997:53;;;29030:18;;:::i;:::-;29080:7;29070:8;29066:22;29063:55;;;29100:16;;;;29063:55;29179:22;;;;29139:15;;;;28941:270;;;28945:3;28795:422;;;;;:::o;29222:806::-;29271:5;29301:8;29291:80;;-1:-1:-1;29342:1:1;29356:5;;29291:80;29390:4;29380:76;;-1:-1:-1;29427:1:1;29441:5;;29380:76;29472:4;29490:1;29485:59;;;;29558:1;29553:130;;;;29465:218;;29485:59;29515:1;29506:10;;29529:5;;;29553:130;29590:3;29580:8;29577:17;29574:43;;;29597:18;;:::i;:::-;-1:-1:-1;;29653:1:1;29639:16;;29668:5;;29465:218;;29767:2;29757:8;29754:16;29748:3;29742:4;29739:13;29735:36;29729:2;29719:8;29716:16;29711:2;29705:4;29702:12;29698:35;29695:77;29692:159;;;-1:-1:-1;29804:19:1;;;29836:5;;29692:159;29883:34;29908:8;29902:4;29883:34;:::i;:::-;29953:6;29949:1;29945:6;29941:19;29932:7;29929:32;29926:58;;;29964:18;;:::i;:::-;30002:20;;29222:806;-1:-1:-1;;;29222:806:1:o;30033:131::-;30093:5;30122:36;30149:8;30143:4;30122:36;:::i;30169:140::-;30227:5;30256:47;30297:4;30287:8;30283:19;30277:4;30256:47;:::i
Swarm Source
ipfs://d12072c062af38bd6545ce889d43de293e35bbcc859409f412fa330f02fd14cd
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.