[ { "inputs": [ { "internalType": "contract IEnigmaFactory", "name": "factory_", "type": "address" } ], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [], "name": "AllowanceOverflow", "type": "error" }, { "inputs": [], "name": "AllowanceUnderflow", "type": "error" }, { "inputs": [], "name": "Enigma_AlreadyInit", "type": "error" }, { "inputs": [], "name": "Enigma_Deadline", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "factory", "type": "address" } ], "name": "Enigma_InitInvalidFactory", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "_address", "type": "address" } ], "name": "Enigma_InvalidAddress", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "amount0", "type": "uint256" }, { "internalType": "uint256", "name": "amount1", "type": "uint256" } ], "name": "Enigma_InvalidAmounts", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "index", "type": "uint256" } ], "name": "Enigma_InvalidBurnRange", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "amount0", "type": "uint256" }, { "internalType": "uint256", "name": "amount1", "type": "uint256" } ], "name": "Enigma_InvalidDesiredAmounts", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "proposedFee", "type": "uint256" } ], "name": "Enigma_InvalidFee", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "implementation", "type": "address" } ], "name": "Enigma_InvalidImplementationAddress", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" } ], "name": "Enigma_InvalidOperator", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" } ], "name": "Enigma_InvalidOwner", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "pool", "type": "address" } ], "name": "Enigma_InvalidPool", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "router", "type": "address" } ], "name": "Enigma_InvalidSwapRouter", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "toAddress", "type": "address" } ], "name": "Enigma_InvalidToAddress", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "Enigma_MaxCapReached", "type": "error" }, { "inputs": [], "name": "Enigma_MaxTotalSupply", "type": "error" }, { "inputs": [], "name": "Enigma_MinInitialAmount", "type": "error" }, { "inputs": [], "name": "Enigma_MinimumSharesToMint", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" } ], "name": "Enigma_NotOperator", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "pool", "type": "address" } ], "name": "Enigma_PoolExists", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "burnAmount", "type": "uint256" }, { "internalType": "uint256", "name": "minBurn", "type": "uint256" } ], "name": "Enigma_RebalanceBurnAmounts", "type": "error" }, { "inputs": [], "name": "Enigma_RebalanceInsufficientSwap", "type": "error" }, { "inputs": [], "name": "Enigma_RebalanceInvalidTickSpacing", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "mintAmount", "type": "uint256" }, { "internalType": "uint256", "name": "minDeposit", "type": "uint256" } ], "name": "Enigma_RebalanceMintAmounts", "type": "error" }, { "inputs": [], "name": "Enigma_RebalanceNoPool", "type": "error" }, { "inputs": [], "name": "Enigma_RebalanceNotWLPool", "type": "error" }, { "inputs": [], "name": "Enigma_RebalanceSwapError", "type": "error" }, { "inputs": [], "name": "Enigma_RescueInvalidTokens", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "caller", "type": "address" } ], "name": "Enigma_UniCallbackFail", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "shares", "type": "uint256" } ], "name": "Enigma_WithdrawInvalid", "type": "error" }, { "inputs": [], "name": "InsufficientAllowance", "type": "error" }, { "inputs": [], "name": "InsufficientBalance", "type": "error" }, { "inputs": [], "name": "InvalidPermit", "type": "error" }, { "inputs": [], "name": "PermitExpired", "type": "error" }, { "inputs": [], "name": "TotalSupplyOverflow", "type": "error" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "Approval", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "feeAmount0", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "feeAmount1", "type": "uint256" } ], "name": "Log_CollectFees", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "shares", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amount0", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amount1", "type": "uint256" } ], "name": "Log_Deposit", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "deposit0Max", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "deposit1Max", "type": "uint256" } ], "name": "Log_DepositMaxSet", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "operatorFee0", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "operatorFee1", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "enigmaFee0", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "enigmaFee1", "type": "uint256" } ], "name": "Log_DistributeFees", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "bool", "name": "", "type": "bool" } ], "name": "Log_IsPrivate", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "_maxTotalSupply", "type": "uint256" } ], "name": "Log_MaxTotalSupplySet", "type": "event" }, { "anonymous": false, "inputs": [ { "components": [ { "components": [ { "internalType": "uint128", "name": "liquidity", "type": "uint128" }, { "components": [ { "internalType": "int24", "name": "tickLower", "type": "int24" }, { "internalType": "int24", "name": "tickUpper", "type": "int24" }, { "internalType": "int24", "name": "feeTier", "type": "int24" } ], "internalType": "struct Range", "name": "range", "type": "tuple" } ], "internalType": "struct Position[]", "name": "burns", "type": "tuple[]" }, { "components": [ { "internalType": "uint128", "name": "liquidity", "type": "uint128" }, { "components": [ { "internalType": "int24", "name": "tickLower", "type": "int24" }, { "internalType": "int24", "name": "tickUpper", "type": "int24" }, { "internalType": "int24", "name": "feeTier", "type": "int24" } ], "internalType": "struct Range", "name": "range", "type": "tuple" } ], "internalType": "struct Position[]", "name": "mints", "type": "tuple[]" }, { "components": [ { "internalType": "bytes", "name": "payload", "type": "bytes" }, { "internalType": "address", "name": "router", "type": "address" }, { "internalType": "uint256", "name": "amountIn", "type": "uint256" }, { "internalType": "uint256", "name": "expectedMinReturn", "type": "uint256" }, { "internalType": "bool", "name": "zeroForOne", "type": "bool" } ], "internalType": "struct SwapPayload", "name": "swap", "type": "tuple" }, { "internalType": "uint256", "name": "minBurn0", "type": "uint256" }, { "internalType": "uint256", "name": "minBurn1", "type": "uint256" }, { "internalType": "uint256", "name": "minDeposit0", "type": "uint256" }, { "internalType": "uint256", "name": "minDeposit1", "type": "uint256" } ], "indexed": false, "internalType": "struct Rebalance", "name": "_params", "type": "tuple" }, { "indexed": false, "internalType": "uint256", "name": "balance0After", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "balance1After", "type": "uint256" } ], "name": "Log_Rebalance", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "_maxTotalSupply", "type": "uint256" } ], "name": "Log_SetEnigmaFee", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "", "type": "address" }, { "indexed": false, "internalType": "bool", "name": "isWhitelisted", "type": "bool" } ], "name": "Log_SetIsWhitelisted", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "operator", "type": "address" } ], "name": "Log_SetOperator", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "recipient", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "shares", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amount0", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amount1", "type": "uint256" } ], "name": "Log_Withdraw", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "OwnershipTransferred", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "Transfer", "type": "event" }, { "inputs": [], "name": "DOMAIN_SEPARATOR", "outputs": [ { "internalType": "bytes32", "name": "result", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "FEE_LIMIT", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "SELECTED_FEE", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "spender", "type": "address" } ], "name": "allowance", "outputs": [ { "internalType": "uint256", "name": "result", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "approve", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "result", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "decimals", "outputs": [ { "internalType": "uint8", "name": "", "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "difference", "type": "uint256" } ], "name": "decreaseAllowance", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "components": [ { "internalType": "uint256", "name": "amount0Desired", "type": "uint256" }, { "internalType": "uint256", "name": "amount1Desired", "type": "uint256" }, { "internalType": "uint256", "name": "minSharesToMint", "type": "uint256" }, { "internalType": "uint256", "name": "deadline", "type": "uint256" }, { "internalType": "address", "name": "recipient", "type": "address" } ], "internalType": "struct DepositParams", "name": "params", "type": "tuple" } ], "name": "deposit", "outputs": [ { "internalType": "uint256", "name": "shares", "type": "uint256" }, { "internalType": "uint256", "name": "amount0", "type": "uint256" }, { "internalType": "uint256", "name": "amount1", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "deposit0Max", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "deposit1Max", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "factory", "outputs": [ { "internalType": "contract IUniswapV3Factory", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getFactory", "outputs": [ { "internalType": "address", "name": "factory_", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getPools", "outputs": [ { "internalType": "address[]", "name": "", "type": "address[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getRangeLength", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getRanges", "outputs": [ { "components": [ { "internalType": "int24", "name": "tickLower", "type": "int24" }, { "internalType": "int24", "name": "tickUpper", "type": "int24" }, { "internalType": "int24", "name": "feeTier", "type": "int24" } ], "internalType": "struct Range[]", "name": "ranges_", "type": "tuple[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "gauge", "type": "address" }, { "internalType": "int24", "name": "tl", "type": "int24" }, { "internalType": "int24", "name": "tu", "type": "int24" }, { "internalType": "address", "name": "receiver", "type": "address" } ], "name": "getRewards", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "getTotalAmounts", "outputs": [ { "internalType": "uint256", "name": "total0", "type": "uint256" }, { "internalType": "uint256", "name": "total1", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "harvest", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_token", "type": "address" } ], "name": "inCaseTokensGetStuck", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "difference", "type": "uint256" } ], "name": "increaseAllowance", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_uniFactory", "type": "address" }, { "internalType": "address", "name": "_token0", "type": "address" }, { "internalType": "address", "name": "_token1", "type": "address" }, { "internalType": "uint24[]", "name": "_feeTiers", "type": "uint24[]" }, { "internalType": "uint256", "name": "_selectedFee", "type": "uint256" }, { "internalType": "address", "name": "_owner", "type": "address" }, { "internalType": "bool", "name": "_isPrivate", "type": "bool" }, { "internalType": "address", "name": "_operator", "type": "address" } ], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "isPrivate", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "maxTotalSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" } ], "name": "nonces", "outputs": [ { "internalType": "uint256", "name": "result", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "operatorAddress", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "owner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "uint256", "name": "deadline", "type": "uint256" }, { "internalType": "uint8", "name": "v", "type": "uint8" }, { "internalType": "bytes32", "name": "r", "type": "bytes32" }, { "internalType": "bytes32", "name": "s", "type": "bytes32" } ], "name": "permit", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "amount0", "type": "uint256" }, { "internalType": "uint256", "name": "amount1", "type": "uint256" }, { "internalType": "bytes", "name": "", "type": "bytes" } ], "name": "ramsesV2MintCallback", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "ranges", "outputs": [ { "internalType": "int24", "name": "tickLower", "type": "int24" }, { "internalType": "int24", "name": "tickUpper", "type": "int24" }, { "internalType": "int24", "name": "feeTier", "type": "int24" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "components": [ { "components": [ { "internalType": "uint128", "name": "liquidity", "type": "uint128" }, { "components": [ { "internalType": "int24", "name": "tickLower", "type": "int24" }, { "internalType": "int24", "name": "tickUpper", "type": "int24" }, { "internalType": "int24", "name": "feeTier", "type": "int24" } ], "internalType": "struct Range", "name": "range", "type": "tuple" } ], "internalType": "struct Position[]", "name": "burns", "type": "tuple[]" }, { "components": [ { "internalType": "uint128", "name": "liquidity", "type": "uint128" }, { "components": [ { "internalType": "int24", "name": "tickLower", "type": "int24" }, { "internalType": "int24", "name": "tickUpper", "type": "int24" }, { "internalType": "int24", "name": "feeTier", "type": "int24" } ], "internalType": "struct Range", "name": "range", "type": "tuple" } ], "internalType": "struct Position[]", "name": "mints", "type": "tuple[]" }, { "components": [ { "internalType": "bytes", "name": "payload", "type": "bytes" }, { "internalType": "address", "name": "router", "type": "address" }, { "internalType": "uint256", "name": "amountIn", "type": "uint256" }, { "internalType": "uint256", "name": "expectedMinReturn", "type": "uint256" }, { "internalType": "bool", "name": "zeroForOne", "type": "bool" } ], "internalType": "struct SwapPayload", "name": "swap", "type": "tuple" }, { "internalType": "uint256", "name": "minBurn0", "type": "uint256" }, { "internalType": "uint256", "name": "minBurn1", "type": "uint256" }, { "internalType": "uint256", "name": "minDeposit0", "type": "uint256" }, { "internalType": "uint256", "name": "minDeposit1", "type": "uint256" } ], "internalType": "struct Rebalance", "name": "rebalanceData", "type": "tuple" } ], "name": "rebalance", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_deposit0Max", "type": "uint256" }, { "internalType": "uint256", "name": "_deposit1Max", "type": "uint256" } ], "name": "setDepositMax", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_maxTotalSupply", "type": "uint256" } ], "name": "setMaxTotalSupply", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_operator", "type": "address" } ], "name": "setOperator", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_newSelectedFee", "type": "uint256" } ], "name": "setSelectedFee", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "symbol", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "token0", "outputs": [ { "internalType": "contract IERC20", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "token1", "outputs": [ { "internalType": "contract IERC20", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalSupply", "outputs": [ { "internalType": "uint256", "name": "result", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "transfer", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "transferFrom", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "shares", "type": "uint256" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "deadline", "type": "uint256" } ], "name": "withdraw", "outputs": [ { "internalType": "uint256", "name": "amount0", "type": "uint256" }, { "internalType": "uint256", "name": "amount1", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" } ]
60a060405267016345785d8a00006006556000600a553480156200002257600080fd5b506040516200613a3803806200613a8339810160408190526200004591620000f3565b6200005033620000a3565b6001600e556001600160a01b0381166200008c5760405163548c113560e01b81526001600160a01b038216600482015260240160405180910390fd5b6001600160a01b0316608052600160025562000125565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156200010657600080fd5b81516001600160a01b03811681146200011e57600080fd5b9392505050565b608051615fdd6200015d6000396000818161061601528181611a02015281816124d70152818161434501526143d80152615fdd6000f3fe608060405234801561001057600080fd5b50600436106102ff5760003560e01c806370a082311161019c578063bebc7425116100ee578063dd62ed3e11610097578063e63697c811610071578063e63697c8146107be578063f2fde38b146107d1578063faff660e146107e457600080fd5b8063dd62ed3e1461076f578063def68a9c14610798578063dfdec10b146107ab57600080fd5b8063c4a7761e116100c8578063c4a7761e1461071f578063d21220a71461073c578063d505accf1461075c57600080fd5b8063bebc7425146106d9578063c25c337c146106ec578063c45a0155146106ff57600080fd5b80638da5cb5b11610150578063a9059cbb1161012a578063a9059cbb146106a4578063b0b84374146106b7578063b3ab15fb146106c657600080fd5b80638da5cb5b1461063a57806395d89b4114610658578063a457c2d71461069157600080fd5b806373fc73b31161018157806373fc73b3146105db5780637ecebe00146105ee57806388cc58e41461061457600080fd5b806370a08231146105ad578063715018a6146105d357600080fd5b80633644e515116102555780634641257d11610209578063617a3419116101e3578063617a34191461057a578063648cab851461058f578063673a2a1f1461059857600080fd5b80634641257d146105325780634d461fbb1461053a5780635fdecdfa1461054357600080fd5b80633e091ee91161023a5780633e091ee9146104f75780633e48f4171461050c5780633f3e4c111461051f57600080fd5b80633644e5151461045757806339509351146104e457600080fd5b806318160ddd116102b75780632accd343116102915780632accd34314610437578063313ce5671461043f578063360dd6da1461044e57600080fd5b806318160ddd1461040157806323b872dd1461041b5780632ab4d0521461042e57600080fd5b8063095ea7b3116102e8578063095ea7b3146103795780630dfe16811461039c578063127effb2146103e157600080fd5b8063017466061461030457806306fdde0314610337575b600080fd5b610317610312366004614f52565b6107f1565b604080519384526020840192909252908201526060015b60405180910390f35b60408051808201909152600f81527f456e69676d61204c5020546f6b656e000000000000000000000000000000000060208201525b60405161032e9190614fd8565b61038c61038736600461501d565b610e1d565b604051901515815260200161032e565b6004546103bc9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161032e565b6001546103bc9073ffffffffffffffffffffffffffffffffffffffff1681565b6805345cdf77eb68f44c545b60405190815260200161032e565b61038c610429366004615049565b610e71565b61040d600a5481565b60075461040d565b6040516012815260200161032e565b61040d60065481565b60408051808201918290527f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f268e1b2a8acec5a7157b065a84f49168b4d7bad02b005e5b3ed7de7c69733aca60208201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc690915246606082015230608082015260a0902061040d565b61038c6104f236600461501d565b610f30565b61050a61050536600461508a565b610fa2565b005b61050a61051a3660046150ac565b611005565b61050a61052d36600461512c565b611015565b61050a611063565b61040d600c5481565b61055661055136600461512c565b611075565b60408051600294850b815292840b6020840152920b9181019190915260600161032e565b6105826110b1565b60405161032e9190615145565b61040d600b5481565b6105a0611132565b60405161032e9190615204565b61040d6105bb366004615217565b6387a211a2600c908152600091909152602090205490565b61050a6111e5565b61050a6105e9366004615234565b6111f7565b61040d6105fc366004615217565b6338377508600c908152600091909152602090205490565b7f00000000000000000000000000000000000000000000000000000000000000006103bc565b60005473ffffffffffffffffffffffffffffffffffffffff166103bc565b60408051808201909152600981527f4c505f454e49474d410000000000000000000000000000000000000000000000602082015261036c565b61038c61069f36600461501d565b6125b6565b61038c6106b236600461501d565b612629565b61040d670de0b6b3a764000081565b61050a6106d4366004615217565b6126a4565b61050a6106e7366004615288565b612784565b61050a6106fa36600461512c565b612ae3565b6003546103bc9073ffffffffffffffffffffffffffffffffffffffff1681565b610727612af4565b6040805192835260208301919091520161032e565b6005546103bc9073ffffffffffffffffffffffffffffffffffffffff1681565b61050a61076a366004615371565b612baf565b61040d61077d3660046153e8565b602052637f5e9f20600c908152600091909152603490205490565b61050a6107a6366004615217565b612d74565b61050a6107b9366004615433565b612eae565b6107276107cc36600461548b565b612fe2565b61050a6107df366004615217565b613679565b600d5461038c9060ff1681565b60008060006107fe61372d565b600061081060a0860160808701615217565b73ffffffffffffffffffffffffffffffffffffffff160361088b5761083b60a0850160808601615217565b6040517f06f25b0500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024015b60405180910390fd5b833515801561089c57506020840135155b156108e0576040517f020905ae0000000000000000000000000000000000000000000000000000000081528435600482015260208501356024820152604401610882565b600b54843511806108f65750600c548460200135115b1561093a576040517fb4b48aa90000000000000000000000000000000000000000000000000000000081528435600482015260208501356024820152604401610882565b4284606001351015610978576040517f307080d200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109806137a0565b60006109936805345cdf77eb68f44c5490565b90506000806109a0612af4565b6040517f9c9c939a0000000000000000000000000000000000000000000000000000000081526004810186905260248101839052604481018290528935606482015260208a0135608482015291935091506000908190819073b4eb5ab8a9320ef935ef723f001e74b28741971690639c9c939a9060a401606060405180830381865af4158015610a34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5891906154b2565b9250925092508960400135831015610a9c576040517f230d353000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85158015610aac5750620f424083105b15610ae3576040517f2a01ad5800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b909650945085858115610b1557600454610b159073ffffffffffffffffffffffffffffffffffffffff16333085613a85565b8015610b4057600554610b409073ffffffffffffffffffffffffffffffffffffffff16333084613a85565b8515610d2b5760075460005b81811015610d2857600060078281548110610b6957610b696154e0565b60009182526020808320604080516060810182529390910154600281810b855263010000008204810b93850193909352660100000000000090049182900b838201526003546004805460055493517f1698ee8200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821692810192909252928316602482015262ffffff909316604484015292945090911690631698ee8290606401602060405180830381865afa158015610c3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5e919061550f565b9050600073b4eb5ab8a9320ef935ef723f001e74b28741971663d47712cf83858e8c6040518563ffffffff1660e01b8152600401610c9f949392919061552c565b602060405180830381865af4158015610cbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce091906155a6565b60019094019390506fffffffffffffffffffffffffffffffff8116600003610d0a57505050610b4c565b610d1e828460000151856020015184613b61565b5050505050610b4c565b50505b610d44610d3e60a08c0160808d01615217565b84613c4f565b8298506000600a54118015610d645750600a546805345cdf77eb68f44c54115b15610d9b576040517f9418880900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610dab60a08b0160808c01615217565b604080518b8152602081018b905290810189905273ffffffffffffffffffffffffffffffffffffffff91909116907fbe04f647473608db192e6097887c6c6ddbf59971fe4802acffbef0f6e7f0a74c9060600160405180910390a2505050505050610e166001600e55565b9193909250565b600082602052637f5e9f20600c5233600052816034600c205581600052602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560206000a35060015b92915050565b60008360601b33602052637f5e9f208117600c526034600c2080546000198114610eb15780851115610eab576313be252b6000526004601cfd5b84810382555b50506387a211a28117600c526020600c20805480851115610eda5763f4d678b86000526004601cfd5b84810382555050836000526020600c208381540181555082602052600c5160601c8160601c7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a3505060015b9392505050565b600082602052637f5e9f20600c52336000526034600c20805483810181811015610f625763f90670666000526004601cfd5b80835580600052505050602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560206000a350600192915050565b610faa613cd3565b81600b5414610fb957600b8290555b80600c5414610fc857600c8190555b60408051838152602081018390527f4da129d8839413599671a24e20244003356785667e0b85a8d51eb4dcc1a5cb03910160405180910390a15050565b61100f8484613d68565b50505050565b61101d613cd3565b80600a541461106057600a8190556040518181527f44c37a018b13c83d4fa0313c1085da36a15f4bc594c1cbfcdd1ae263207bb753906020015b60405180910390a15b50565b61106b613cd3565b6110736137a0565b565b6007818154811061108557600080fd5b600091825260209091200154600281810b925063010000008204810b9166010000000000009004900b83565b60606007805480602002602001604051908101604052809291908181526020016000905b828210156111295760008481526020908190206040805160608101825291850154600281810b845263010000008204810b848601526601000000000000909104900b908201528252600190920191016110d5565b50505050905090565b606060006111406008613dff565b905060008167ffffffffffffffff81111561115d5761115d6155c3565b604051908082528060200260200182016040528015611186578160200160208202803683370190505b50905060005b828110156111de5761119f600882613e09565b8282815181106111b1576111b16154e0565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015260010161118c565b5092915050565b6111ed613e15565b6110736000613e96565b6111ff613cd3565b61120761372d565b60008060008060005b61121a86806155f2565b905081101561174257600061122f87806155f2565b8381811061123f5761123f6154e0565b905060800201803603810190611255919061571f565b60035460048054600554602085015160409081015190517f1698ee8200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff93841694810194909452908216602484015262ffffff16604483015292935060009290911690631698ee8290606401602060405180830381865afa1580156112f0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611314919061550f565b60208381015180519101516040517f7f0d9b8500000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff84166024820152600292830b6044820152910b606482015290915060009073b4eb5ab8a9320ef935ef723f001e74b28741971690637f0d9b8590608401606060405180830381865af41580156113ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113de919061577d565b505083516fffffffffffffffffffffffffffffffff9182169250600091167fffffffffffffffffffffffffffffffff000000000000000000000000000000010161142957508061143f565b5082516fffffffffffffffffffffffffffffffff165b81156115135760006040518060c001604052808573ffffffffffffffffffffffffffffffffffffffff16815260200186602001516000015160020b815260200186602001516020015160020b815260200161149984613f0b565b6fffffffffffffffffffffffffffffffff168152306020820152600060409091018190529091506114c982613fb1565b905080604001518b6114db91906157f9565b9a5080606001518a6114ed91906157f9565b8151909a506114fc908a6157f9565b985080602001518861150e91906157f9565b975050505b81811015801561152257508015155b80611540575083516fffffffffffffffffffffffffffffffff908116145b15611733576000806115836115558d806155f2565b89818110611565576115656154e0565b90506080020160200180360381019061157e919061580c565b614229565b91509150816115c1576040517fbe48d4f200000000000000000000000000000000000000000000000000000000815260048101829052602401610882565b6007546115d090600190615828565b81146116c757600780546115e690600190615828565b815481106115f6576115f66154e0565b9060005260206000200160078281548110611613576116136154e0565b6000918252602090912082549101805462ffffff9283167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000082168117835584546301000000908190048516027fffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000909216171780825592546601000000000000908190049092169091027fffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff9092169190911790555b60078054806116d8576116d861583b565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffffffffffffffffffffffffff00000000000000000016905501905550505b84600101945050505050611210565b5061174d8282614301565b5050846060013584101561179a576040517fa98828310000000000000000000000000000000000000000000000000000000081526004810185905260608601356024820152604401610882565b84608001358310156117e5576040517fa98828310000000000000000000000000000000000000000000000000000000081526004810184905260808601356024820152604401610882565b60408051838152602081018390527f6b01ac9488ee1750bcbe054111f356f1f593cf77dbd4f21cccce8637fc1cdb12910160405180910390a1600061182d604087018761586a565b604001351115611f8a57600480546040517f70a08231000000000000000000000000000000000000000000000000000000008152309281019290925260009173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa1580156118ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118cf91906158a8565b6005546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291925060009173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015611943573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196791906158a8565b90506119aa611979604089018961586a565b61198a906040810190602001615217565b60045473ffffffffffffffffffffffffffffffffffffffff1690846145b5565b6119eb6119ba604089018961586a565b6119cb906040810190602001615217565b60055473ffffffffffffffffffffffffffffffffffffffff1690836145b5565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166361771e49611a3460408a018a61586a565b611a45906040810190602001615217565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015611aae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad291906158c1565b611b3f57611ae3604088018861586a565b611af4906040810190602001615217565b6040517f03ec04e600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610882565b6000611b4e604089018961586a565b611b5f906040810190602001615217565b73ffffffffffffffffffffffffffffffffffffffff16611b8260408a018a61586a565b611b8c90806158de565b604051611b9a929190615943565b6000604051808303816000865af19150503d8060008114611bd7576040519150601f19603f3d011682016040523d82523d6000602084013e611bdc565b606091505b5050905080611c17576040517fb380d6c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600480546040517f70a08231000000000000000000000000000000000000000000000000000000008152309281019290925260009173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015611c8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611caf91906158a8565b6005546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291925060009173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015611d23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4791906158a8565b9050611d5660408b018b61586a565b611d679060a0810190608001615953565b15611e1957611d7960408b018b61586a565b611d879060600135856157f9565b811015611dc0576040517fbd5132a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611dcd60408b018b61586a565b611ddb906040013586615828565b821015611e14576040517fbd5132a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ec1565b611e2660408b018b61586a565b611e349060600135866157f9565b821015611e6d576040517fbd5132a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e7a60408b018b61586a565b611e88906040013585615828565b811015611ec1576040517fbd5132a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f03611ed160408c018c61586a565b611ee2906040810190602001615217565b60045473ffffffffffffffffffffffffffffffffffffffff169060006145b5565b611f45611f1360408c018c61586a565b611f24906040810190602001615217565b60055473ffffffffffffffffffffffffffffffffffffffff169060006145b5565b7f5982e3253a7121620d22186439359958e05bb1cdb6097924cd859030981568738a8383604051611f7893929190615c38565b60405180910390a15050505050611fc7565b7f5982e3253a7121620d22186439359958e05bb1cdb6097924cd8590309815687385600080604051611fbe93929190615c38565b60405180910390a15b60008060005b611fda60208901896155f2565b905081101561243e576000611ff260208a018a6155f2565b83818110612002576120026154e0565b905060800201803603810190612018919061571f565b604080516060810182526020838101805151600290810b84528151830151810b92840192909252805184015190910b8284015260035460048054600554935186015195517f1698ee8200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821692810192909252928316602482015262ffffff9094166044850152600196909601959394509092600092911690631698ee8290606401602060405180830381865afa1580156120ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061210e919061550f565b905073ffffffffffffffffffffffffffffffffffffffff811661215d576040517ff26048d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f88afd24700000000000000000000000000000000000000000000000000000000815273b4eb5ab8a9320ef935ef723f001e74b287419716906388afd247906121af9084908690600401615c5d565b602060405180830381865af41580156121cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f091906158c1565b612226576040517f5191c91d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f3d99414d00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8216602482015260009073b4eb5ab8a9320ef935ef723f001e74b28741971690633d99414d90604401602060405180830381865af41580156122ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122d191906158c1565b90508061230a576040517fb4b0256d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83516fffffffffffffffffffffffffffffffff1660000361232e5750505050611fcd565b600061233984614229565b509050806123f2576007805460018101825560009190915284517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68890910180546020870151604088015162ffffff9081166601000000000000027fffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff9282166301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000909416919095161791909117169190911790555b600080612415858860200151600001518960200151602001518a60000151613b61565b9092509050612424828b6157f9565b9950612430818a6157f9565b985050505050505050611fcd565b508660a0013582101561248a576040517f676652aa0000000000000000000000000000000000000000000000000000000081526004810183905260a08801356024820152604401610882565b8660c001358110156124d5576040517f676652aa0000000000000000000000000000000000000000000000000000000081526004810182905260c08801356024820152604401610882565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663702d61ce6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612540573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256491906158a8565b60075411156125a6576007546040517f8a63b5560000000000000000000000000000000000000000000000000000000081526004810191909152602401610882565b5050505050506110606001600e55565b600082602052637f5e9f20600c52336000526034600c208054838110156125e557638301ab386000526004601cfd5b8381039050808255806000525050602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560206000a350600192915050565b60006387a211a2600c52336000526020600c208054808411156126545763f4d678b86000526004601cfd5b83810382555050826000526020600c208281540181555081602052600c5160601c337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a350600192915050565b6126ac613cd3565b73ffffffffffffffffffffffffffffffffffffffff8116612711576040517ff147881100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610882565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fce71ad776a101525ec2fdbb4d872baeb5a9d040e82fa8e257382bcf2d6af897390602001611057565b60025480156127bf576040517ffd6fcfdb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8a16612824576040517f62429a4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b166004820152602401610882565b73ffffffffffffffffffffffffffffffffffffffff8416612889576040517fa89e66bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610882565b73ffffffffffffffffffffffffffffffffffffffff82166128ee576040517ff147881100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610882565b73ffffffffffffffffffffffffffffffffffffffff8916612953576040517fc9b1d75200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a166004820152602401610882565b73ffffffffffffffffffffffffffffffffffffffff88166129b8576040517fc9b1d75200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89166004820152602401610882565b6004805473ffffffffffffffffffffffffffffffffffffffff808c167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255600580548b841690831617905560038054928d1692909116919091179055612a2385614737565b612a2c84613e96565b612a3887878b8b6147ee565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600b819055600c55600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091178155600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169215159290921790915560025550505050505050565b612aeb613cd3565b61106081614737565b6003546040517f0449a096000000000000000000000000000000000000000000000000000000008152600091829173b4eb5ab8a9320ef935ef723f001e74b28741971691630449a09691612b6691309160079173ffffffffffffffffffffffffffffffffffffffff1690600401615ca7565b6040805180830381865af4158015612b82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ba69190615d49565b90939092509050565b6000612c3f60408051808201918290527f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f268e1b2a8acec5a7157b065a84f49168b4d7bad02b005e5b3ed7de7c69733aca60208201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc690915246606082015230608082015260a0902090565b905060405185421115612c5a57631a15a3cc6000526004601cfd5b8860601b60601c98508760601b60601c97506338377508600c52886000526020600c2080546001810182557f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c983528a602084015289604084015288606084015280608084015250508560a08201526119016000528160205260c081206040526042601e206000528460ff1660205283604052826060526020806080600060015afa50883d5114612d125763ddafbaef6000526004601cfd5b777f5e9f20000000000000000000000000000000000000000088176040526034602c2087905587897f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602060608501a360405250506000606052505050505050565b612d7c613e15565b60045473ffffffffffffffffffffffffffffffffffffffff82811691161480612dbf575060055473ffffffffffffffffffffffffffffffffffffffff8281169116145b15612df6576040517f6d5de8fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015612e63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e8791906158a8565b9050612eaa73ffffffffffffffffffffffffffffffffffffffff831633836149c0565b5050565b612eb6613cd3565b60008473ffffffffffffffffffffffffffffffffffffffff1663c4f59f9b6040518163ffffffff1660e01b8152600401600060405180830381865afa158015612f03573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612f499190810190615d6d565b6040517fc6cee75800000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff86169063c6cee75890612fa99030906000908990899088908a90600401615e1f565b600060405180830381600087803b158015612fc357600080fd5b505af1158015612fd7573d6000803e3d6000fd5b505050505050505050565b600080612fed61372d565b6387a211a2600c90815233600052602090205485118061300b575084155b15613045576040517f7660ebed00000000000000000000000000000000000000000000000000000000815260048101869052602401610882565b73ffffffffffffffffffffffffffffffffffffffff84166130aa576040517f06f25b0500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610882565b428310156130e4576040517f307080d200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006130f76805345cdf77eb68f44c5490565b90506131033387614a16565b6007546000908190815b818110156133de5760006007828154811061312a5761312a6154e0565b60009182526020808320604080516060810182529390910154600281810b855263010000008204810b93850193909352660100000000000090049182900b838201526003546004805460055493517f1698ee8200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821692810192909252928316602482015262ffffff909316604484015292945090911690631698ee8290606401602060405180830381865afa1580156131fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061321f919061550f565b825160208401516040517f7f0d9b8500000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff84166024820152600292830b6044820152910b606482015290915060009073b4eb5ab8a9320ef935ef723f001e74b28741971690637f0d9b8590608401606060405180830381865af41580156132c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132e5919061577d565b50506fffffffffffffffffffffffffffffffff16905060006133088e838b614a9a565b905060006040518060c001604052808573ffffffffffffffffffffffffffffffffffffffff168152602001866000015160020b8152602001866020015160020b815260200161335684613f0b565b6fffffffffffffffffffffffffffffffff1681523060208201526000604090910181905290915061338682613fb1565b905080604001518d61339891906157f9565b9c5080606001518c6133aa91906157f9565b8151909c506133b9908b6157f9565b99508060200151896133cb91906157f9565b985086600101965050505050505061310d565b506133e98383614301565b5050600480546040517f70a08231000000000000000000000000000000000000000000000000000000008152309281019290925260009161349a91899173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015613465573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061348991906158a8565b6134939190615828565b8b87614a9a565b6005546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291925060009161354991899173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015613514573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061353891906158a8565b6135429190615828565b8c88614a9a565b9050600082118061355a5750600088115b1561358d5761358d8a61356d8a856157f9565b60045473ffffffffffffffffffffffffffffffffffffffff1691906149c0565b600081118061359c5750600087115b156135cf576135cf8a6135af89846157f9565b60055473ffffffffffffffffffffffffffffffffffffffff1691906149c0565b60408051868152602081018690527f6b01ac9488ee1750bcbe054111f356f1f593cf77dbd4f21cccce8637fc1cdb12910160405180910390a1604080518c8152602081018a905290810188905273ffffffffffffffffffffffffffffffffffffffff8b16907f1dcad4a4d674439187b884e83db93ad96ed2a92cfd6c00a3da7ad4cee61b906a9060600160405180910390a25050505050506136716001600e55565b935093915050565b613681613e15565b73ffffffffffffffffffffffffffffffffffffffff8116613724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610882565b61106081613e96565b6002600e5403613799576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610882565b6002600e55565b6007546000908190815b81811015613a3a576000600782815481106137c7576137c76154e0565b60009182526020808320604080516060810182529390910154600281810b855263010000008204810b93850193909352660100000000000090049182900b838201526003546004805460055493517f1698ee8200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821692810192909252928316602482015262ffffff90931660448401526001969096019592945090911690631698ee8290606401602060405180830381865afa15801561389f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138c3919061550f565b825160208401516040517f7f0d9b8500000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff84166024820152600292830b6044820152910b606482015290915060009073b4eb5ab8a9320ef935ef723f001e74b28741971690637f0d9b8590608401606060405180830381865af4158015613965573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613989919061577d565b50509050806fffffffffffffffffffffffffffffffff166000036139af575050506137aa565b6040805160c08101825273ffffffffffffffffffffffffffffffffffffffff841681528451600290810b602080840191909152860151900b91810191909152600060608201819052306080830152600160a0830152613a0d82613fb1565b8051909150613a1c908a6157f9565b9850806020015188613a2e91906157f9565b975050505050506137aa565b50613a458383614301565b505060408051848152602081018490527f6b01ac9488ee1750bcbe054111f356f1f593cf77dbd4f21cccce8637fc1cdb12910160405180910390a1505050565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261100f9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614b6a565b6000806fffffffffffffffffffffffffffffffff831615613c46578573ffffffffffffffffffffffffffffffffffffffff1663a418e9e0306000888888600030604051602001613bcd919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6040516020818303038152906040526040518863ffffffff1660e01b8152600401613bfe9796959493929190615e7d565b60408051808303816000875af1158015613c1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c409190615d49565b90925090505b94509492505050565b6805345cdf77eb68f44c5481810181811015613c735763e5cfe9576000526004601cfd5b806805345cdf77eb68f44c5550506387a211a2600c52816000526020600c208181540181555080602052600c5160601c60007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a35050565b505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314801590613d2f575033613d1660005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614155b15611073576040517fbe291eab000000000000000000000000000000000000000000000000000000008152336004820152602401610882565b613d73600833614c79565b613dab576040517fdb871615000000000000000000000000000000000000000000000000000000008152336004820152602401610882565b8115613dd557600454613dd59073ffffffffffffffffffffffffffffffffffffffff1633846149c0565b8015612eaa57600554612eaa9073ffffffffffffffffffffffffffffffffffffffff1633836149c0565b6000610e6b825490565b6000610f298383614ca8565b60005473ffffffffffffffffffffffffffffffffffffffff163314611073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610882565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006fffffffffffffffffffffffffffffffff821115613fad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203160448201527f32382062697473000000000000000000000000000000000000000000000000006064820152608401610882565b5090565b613fdc6040518060800160405280600081526020016000815260200160008152602001600081525090565b600082606001516fffffffffffffffffffffffffffffffff16118061400257508160a001515b156141025781516020830151604080850151606086015191517fe3f9b39800000000000000000000000000000000000000000000000000000000815260006004820152600293840b6024820152920b60448301526fffffffffffffffffffffffffffffffff1660648201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff608482015273ffffffffffffffffffffffffffffffffffffffff9091169063e3f9b3989060a40160408051808303816000875af11580156140d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140f79190615d49565b606083015260408201525b81516080830151602084015160408086015190517f4f1eb3d800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9384166004820152600292830b6024820152910b60448201526fffffffffffffffffffffffffffffffff60648201819052608482015260009283921690634f1eb3d89060a40160408051808303816000875af11580156141b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141d69190615eef565b6fffffffffffffffffffffffffffffffff918216935016905081156142075760408301516142049083615828565b83525b801561422257606083015161421c9082615828565b60208401525b5050919050565b60008060005b6007548110156142f5576007818154811061424c5761424c6154e0565b6000918252602090912001548451600291820b910b14801561429e57506007818154811061427c5761427c6154e0565b6000918252602091829020015490850151600290810b6301000000909204900b145b80156142dd5750600781815481106142b8576142b86154e0565b6000918252602090912001546040850151600290810b6601000000000000909204900b145b156142ed57600194909350915050565b60010161422f565b50600093849350915050565b6006546000908190670de0b6b3a7640000908161431e8288615f1e565b6143289190615f35565b9350816143358287615f1e565b61433f9190615f35565b925060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663405726526040518163ffffffff1660e01b8152600401602060405180830381865afa1580156143ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143d2919061550f565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663945d89966040518163ffffffff1660e01b8152600401602060405180830381865afa158015614441573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061446591906158a8565b9050600080808089156144e55761447d8a868a614a9a565b9350614489848b615828565b925083156144b5576004546144b59073ffffffffffffffffffffffffffffffffffffffff1687866149c0565b82156144e5576001546004546144e59173ffffffffffffffffffffffffffffffffffffffff9182169116856149c0565b881561455e576144f689868a614a9a565b9150614502828a615828565b9050811561452e5760055461452e9073ffffffffffffffffffffffffffffffffffffffff1687846149c0565b801561455e5760015460055461455e9173ffffffffffffffffffffffffffffffffffffffff9182169116836149c0565b6040805184815260208101839052908101859052606081018390527f53359a197f990c09b8782cf3e8ddd49a172b8a628ea2ada737cc1699750330249060800160405180910390a150505050505050509250929050565b80158061465557506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa15801561462f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061465391906158a8565b155b6146e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610882565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052613cce9084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401613adf565b80600003614774576040517fb9a8f62700000000000000000000000000000000000000000000000000000000815260048101829052602401610882565b670de0b6b3a76400008111156147b9576040517fb9a8f62700000000000000000000000000000000000000000000000000000000815260048101829052602401610882565b60068190556040518181527f48396913c7890801561494ae96863d3465039f73075155dbbc6454304a946bd890602001611057565b60005b838110156149b95760035460009073ffffffffffffffffffffffffffffffffffffffff16631698ee82858589898781811061482e5761482e6154e0565b90506020020160208101906148439190615f70565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff938416600482015292909116602483015262ffffff166044820152606401602060405180830381865afa1580156148bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148e3919061550f565b905073ffffffffffffffffffffffffffffffffffffffff811661494a576040517fb491dbe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610882565b614955600882614c79565b156149a4576040517f595ed26d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610882565b6149af600882614cd2565b50506001016147f1565b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052613cce9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401613adf565b6387a211a2600c52816000526020600c20805480831115614a3f5763f4d678b86000526004601cfd5b82900390556805345cdf77eb68f44c80548290039055600081815273ffffffffffffffffffffffffffffffffffffffff83167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602083a35050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600003614af15760008411614ae657600080fd5b508290049050610f29565b808411614afd57600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b6000614bcc826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16614cf49092919063ffffffff16565b9050805160001480614bed575080806020019051810190614bed91906158c1565b613cce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610882565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610f29565b6000826000018281548110614cbf57614cbf6154e0565b9060005260206000200154905092915050565b6000610f298373ffffffffffffffffffffffffffffffffffffffff8416614d0b565b6060614d038484600085614d5a565b949350505050565b6000818152600183016020526040812054614d5257508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610e6b565b506000610e6b565b606082471015614dec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610882565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051614e159190615f95565b60006040518083038185875af1925050503d8060008114614e52576040519150601f19603f3d011682016040523d82523d6000602084013e614e57565b606091505b5091509150614e6887838387614e73565b979650505050505050565b60608315614f09578251600003614f025773ffffffffffffffffffffffffffffffffffffffff85163b614f02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610882565b5081614d03565b614d038383815115614f1e5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108829190614fd8565b600060a08284031215614f6457600080fd5b50919050565b60005b83811015614f85578181015183820152602001614f6d565b50506000910152565b60008151808452614fa6816020860160208601614f6a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610f296020830184614f8e565b73ffffffffffffffffffffffffffffffffffffffff8116811461106057600080fd5b803561501881614feb565b919050565b6000806040838503121561503057600080fd5b823561503b81614feb565b946020939093013593505050565b60008060006060848603121561505e57600080fd5b833561506981614feb565b9250602084013561507981614feb565b929592945050506040919091013590565b6000806040838503121561509d57600080fd5b50508035926020909101359150565b600080600080606085870312156150c257600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156150e857600080fd5b818701915087601f8301126150fc57600080fd5b81358181111561510b57600080fd5b88602082850101111561511d57600080fd5b95989497505060200194505050565b60006020828403121561513e57600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156151a757615194838551805160020b8252602081015160020b6020830152604081015160020b60408301525050565b9284019260609290920191600101615161565b50909695505050505050565b600081518084526020808501945080840160005b838110156151f957815173ffffffffffffffffffffffffffffffffffffffff16875295820195908201906001016151c7565b509495945050505050565b602081526000610f2960208301846151b3565b60006020828403121561522957600080fd5b8135610f2981614feb565b60006020828403121561524657600080fd5b813567ffffffffffffffff81111561525d57600080fd5b820160e08185031215610f2957600080fd5b801515811461106057600080fd5b80356150188161526f565b60008060008060008060008060006101008a8c0312156152a757600080fd5b89356152b281614feb565b985060208a01356152c281614feb565b975060408a01356152d281614feb565b965060608a013567ffffffffffffffff808211156152ef57600080fd5b818c0191508c601f83011261530357600080fd5b81358181111561531257600080fd5b8d60208260051b850101111561532757600080fd5b60208301985080975050505060808a0135935061534660a08b0161500d565b925061535460c08b0161527d565b915061536260e08b0161500d565b90509295985092959850929598565b600080600080600080600060e0888a03121561538c57600080fd5b873561539781614feb565b965060208801356153a781614feb565b95506040880135945060608801359350608088013560ff811681146153cb57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156153fb57600080fd5b823561540681614feb565b9150602083013561541681614feb565b809150509250929050565b8035600281900b811461501857600080fd5b6000806000806080858703121561544957600080fd5b843561545481614feb565b935061546260208601615421565b925061547060408601615421565b9150606085013561548081614feb565b939692955090935050565b6000806000606084860312156154a057600080fd5b83359250602084013561507981614feb565b6000806000606084860312156154c757600080fd5b8351925060208401519150604084015190509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561552157600080fd5b8151610f2981614feb565b73ffffffffffffffffffffffffffffffffffffffff8516815260c081016155766020830186805160020b8252602081015160020b6020830152604081015160020b60408301525050565b608082019390935260a0015292915050565b6fffffffffffffffffffffffffffffffff8116811461106057600080fd5b6000602082840312156155b857600080fd5b8151610f2981615588565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261562757600080fd5b83018035915067ffffffffffffffff82111561564257600080fd5b6020019150600781901b360382131561565a57600080fd5b9250929050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156156a8576156a86155c3565b604052919050565b6000606082840312156156c257600080fd5b6040516060810181811067ffffffffffffffff821117156156e5576156e56155c3565b6040529050806156f483615421565b815261570260208401615421565b602082015261571360408401615421565b60408201525092915050565b60006080828403121561573157600080fd5b6040516040810181811067ffffffffffffffff82111715615754576157546155c3565b604052823561576281615588565b815261577184602085016156b0565b60208201529392505050565b60008060006060848603121561579257600080fd5b835161579d81615588565b60208501519093506157ae81615588565b60408501519092506157bf81615588565b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610e6b57610e6b6157ca565b60006060828403121561581e57600080fd5b610f2983836156b0565b81810381811115610e6b57610e6b6157ca565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261589e57600080fd5b9190910192915050565b6000602082840312156158ba57600080fd5b5051919050565b6000602082840312156158d357600080fd5b8151610f298161526f565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261591357600080fd5b83018035915067ffffffffffffffff82111561592e57600080fd5b60200191503681900382131561565a57600080fd5b8183823760009101908152919050565b60006020828403121561596557600080fd5b8135610f298161526f565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126159a557600080fd5b830160208101925035905067ffffffffffffffff8111156159c557600080fd5b8060071b360382131561565a57600080fd5b8183526000602080850194508260005b858110156151f95781356159fa81615588565b6fffffffffffffffffffffffffffffffff168752615a19828401615421565b600290810b88850152604090615a30848301615421565b810b828a015260609150615a45828501615421565b900b9088015260809687019691909101906001016159e7565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600081357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1833603018112615adb57600080fd5b820160208101903567ffffffffffffffff811115615af857600080fd5b803603821315615b0757600080fd5b60a08552615b1960a086018284615a5e565b915050615b286020840161500d565b73ffffffffffffffffffffffffffffffffffffffff81166020860152506040830135604085015260608301356060850152615b656080840161527d565b8015156080860152509392505050565b6000615b818283615970565b60e08552615b9360e0860182846159d7565b915050615ba36020840184615970565b8583036020870152615bb68382846159d7565b9250505060408301357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61843603018112615bef57600080fd5b8482036040860152615c0382858301615aa7565b915050606083013560608501526080830135608085015260a083013560a085015260c083013560c08501528091505092915050565b606081526000615c4b6060830186615b75565b60208301949094525060400152919050565b73ffffffffffffffffffffffffffffffffffffffff8316815260808101610f296020830184805160020b8252602081015160020b6020830152604081015160020b60408301525050565b6000606080830173ffffffffffffffffffffffffffffffffffffffff87168452602082818601528187548084526080870191508860005282600020935060005b81811015615d20578454600281810b8552601882901c810b8686015260309190911c900b60408401526001948501949286019201615ce7565b505073ffffffffffffffffffffffffffffffffffffffff871660408701529350614d0392505050565b60008060408385031215615d5c57600080fd5b505080516020909101519092909150565b60006020808385031215615d8057600080fd5b825167ffffffffffffffff80821115615d9857600080fd5b818501915085601f830112615dac57600080fd5b815181811115615dbe57615dbe6155c3565b8060051b9150615dcf848301615661565b8181529183018401918481019088841115615de957600080fd5b938501935b83851015615e135784519250615e0383614feb565b8282529385019390850190615dee565b98975050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff80891683528760208401528660020b60408401528560020b606084015260c06080840152615e6760c08401866151b3565b915080841660a084015250979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff881681528660208201528560020b60408201528460020b60608201526fffffffffffffffffffffffffffffffff841660808201528260a082015260e060c08201526000615ee260e0830184614f8e565b9998505050505050505050565b60008060408385031215615f0257600080fd5b8251615f0d81615588565b602084015190925061541681615588565b8082028115828204841417610e6b57610e6b6157ca565b600082615f6b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600060208284031215615f8257600080fd5b813562ffffff81168114610f2957600080fd5b6000825161589e818460208701614f6a56fea26469706673582212205f37e2e237798a176d4b93d13ad3a53dbf58684589bc47bfb927feb3f3d3544664736f6c63430008130033000000000000000000000000653b809a4fa6ba0fc0a6dc1b3f92a362fcb6086d