[ { "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": [], "name": "Enigma_Private", "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": "listed", "type": "address[]" } ], "name": "appendList", "outputs": [], "stateMutability": "nonpayable", "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": [], "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": "address", "name": "", "type": "address" } ], "name": "privateList", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "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": [ { "internalType": "address", "name": "listed", "type": "address" } ], "name": "removeListed", "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": "togglePrivate", "outputs": [], "stateMutability": "nonpayable", "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": "amount0", "type": "uint256" }, { "internalType": "uint256", "name": "amount1", "type": "uint256" }, { "internalType": "bytes", "name": "", "type": "bytes" } ], "name": "uniswapV3MintCallback", "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" } ]
60a060405267016345785d8a00006006556000600a553480156200002257600080fd5b506040516200610f3803806200610f8339810160408190526200004591620000f3565b6200005033620000a3565b6001600f556001600160a01b0381166200008c5760405163548c113560e01b81526001600160a01b038216600482015260240160405180910390fd5b6001600160a01b0316608052600160025562000125565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156200010657600080fd5b81516001600160a01b03811681146200011e57600080fd5b9392505050565b608051615fb26200015d6000396000818161064a01528181611b360152818161260b0152818161441d01526144b00152615fb26000f3fe608060405234801561001057600080fd5b50600436106103205760003560e01c806373fc73b3116101a7578063c15850ec116100ee578063d505accf11610097578063e63697c811610071578063e63697c81461081d578063f2fde38b14610830578063faff660e1461084357600080fd5b8063d505accf146107ce578063dd62ed3e146107e1578063def68a9c1461080a57600080fd5b8063c4a7761e116100c8578063c4a7761e1461077e578063d21220a71461079b578063d3487997146107bb57600080fd5b8063c15850ec14610743578063c25c337c1461074b578063c45a01551461075e57600080fd5b806395d89b4111610150578063b0b843741161012a578063b0b843741461070e578063b3ab15fb1461071d578063bebc74251461073057600080fd5b806395d89b41146106af578063a457c2d7146106e8578063a9059cbb146106fb57600080fd5b806388cc58e41161018157806388cc58e4146106485780638da5cb5b1461066e57806394667c171461068c57600080fd5b806373fc73b3146105fc5780637ecebe001461060f5780637fe75b071461063557600080fd5b80633644e5151161026b5780635fdecdfa11610214578063673a2a1f116101ee578063673a2a1f146105b957806370a08231146105ce578063715018a6146105f457600080fd5b80635fdecdfa14610564578063617a34191461059b578063648cab85146105b057600080fd5b80633f3e4c11116102455780633f3e4c11146105405780634641257d146105535780634d461fbb1461055b57600080fd5b80633644e5151461048d578063395093511461051a5780633e091ee91461052d57600080fd5b806323b872dd116102cd5780632accd343116102a75780632accd3431461046d578063313ce56714610475578063360dd6da1461048457600080fd5b806323b872dd1461043c57806328b0e4cc1461044f5780632ab4d0521461046457600080fd5b80630dfe1681116102fe5780630dfe1681146103bd578063127effb21461040257806318160ddd1461042257600080fd5b8063017466061461032557806306fdde0314610358578063095ea7b31461039a575b600080fd5b6103386103333660046150bd565b610850565b604080519384526020840192909252908201526060015b60405180910390f35b60408051808201909152600f81527f456e69676d61204c5020546f6b656e000000000000000000000000000000000060208201525b60405161034f91906150f9565b6103ad6103a836600461517c565b610ed5565b604051901515815260200161034f565b6004546103dd9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161034f565b6001546103dd9073ffffffffffffffffffffffffffffffffffffffff1681565b6805345cdf77eb68f44c545b60405190815260200161034f565b6103ad61044a3660046151a8565b610f29565b61046261045d3660046151e9565b610fe8565b005b61042e600a5481565b60075461042e565b6040516012815260200161034f565b61042e60065481565b60408051808201918290527f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f268e1b2a8acec5a7157b065a84f49168b4d7bad02b005e5b3ed7de7c69733aca60208201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc690915246606082015230608082015260a0902061042e565b6103ad61052836600461517c565b611079565b61046261053b366004615206565b6110eb565b61046261054e366004615228565b61114e565b610462611197565b61042e600c5481565b610577610572366004615228565b6111a9565b60408051600294850b815292840b6020840152920b9181019190915260600161034f565b6105a36111e5565b60405161034f9190615241565b61042e600b5481565b6105c1611266565b60405161034f91906152af565b61042e6105dc3660046151e9565b6387a211a2600c908152600091909152602090205490565b610462611319565b61046261060a3660046152fd565b61132b565b61042e61061d3660046151e9565b6338377508600c908152600091909152602090205490565b610462610643366004615384565b6126ea565b7f00000000000000000000000000000000000000000000000000000000000000006103dd565b60005473ffffffffffffffffffffffffffffffffffffffff166103dd565b6103ad61069a3660046151e9565b600e6020526000908152604090205460ff1681565b60408051808201909152600981527f4c505f454e49474d410000000000000000000000000000000000000000000000602082015261038d565b6103ad6106f636600461517c565b612800565b6103ad61070936600461517c565b612873565b61042e670de0b6b3a764000081565b61046261072b3660046151e9565b6128ee565b61046261073e3660046153df565b6129ce565b610462612d32565b610462610759366004615228565b612da5565b6003546103dd9073ffffffffffffffffffffffffffffffffffffffff1681565b610786612db6565b6040805192835260208301919091520161034f565b6005546103dd9073ffffffffffffffffffffffffffffffffffffffff1681565b6104626107c936600461549d565b612e71565b6104626107dc36600461551d565b612e81565b61042e6107ef366004615594565b602052637f5e9f20600c908152600091909152603490205490565b6104626108183660046151e9565b613046565b61078661082b3660046155cd565b613180565b61046261083e3660046151e9565b613817565b600d546103ad9060ff1681565b600080600061085d6138cb565b600061086f60a08601608087016151e9565b73ffffffffffffffffffffffffffffffffffffffff16036108ea5761089a60a08501608086016151e9565b6040517f06f25b0500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024015b60405180910390fd5b83351580156108fb57506020840135155b1561093f576040517f020905ae00000000000000000000000000000000000000000000000000000000815284356004820152602085013560248201526044016108e1565b600b54843511806109555750600c548460200135115b15610999576040517fb4b48aa900000000000000000000000000000000000000000000000000000000815284356004820152602085013560248201526044016108e1565b600d5460ff1680156109bb5750336000908152600e602052604090205460ff16155b156109f2576040517fb4f0a27300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4284606001351015610a30576040517f307080d200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a3861393e565b6000610a4b6805345cdf77eb68f44c5490565b9050600080610a58612db6565b6040517f9c9c939a0000000000000000000000000000000000000000000000000000000081526004810186905260248101839052604481018290528935606482015260208a0135608482015291935091506000908190819073402086c4a160f17c863b45151e8fb4eecbb152b390639c9c939a9060a401606060405180830381865af4158015610aec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1091906155f4565b9250925092508960400135831015610b54576040517f230d353000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85158015610b645750620f424083105b15610b9b576040517f2a01ad5800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b909650945085858115610bcd57600454610bcd9073ffffffffffffffffffffffffffffffffffffffff16333085613c23565b8015610bf857600554610bf89073ffffffffffffffffffffffffffffffffffffffff16333084613c23565b8515610de35760075460005b81811015610de057600060078281548110610c2157610c21615622565b60009182526020808320604080516060810182529390910154600281810b855263010000008204810b93850193909352660100000000000090049182900b838201526003546004805460055493517f1698ee8200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821692810192909252928316602482015262ffffff909316604484015292945090911690631698ee8290606401602060405180830381865afa158015610cf2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d169190615651565b9050600073402086c4a160f17c863b45151e8fb4eecbb152b363d47712cf83858e8c6040518563ffffffff1660e01b8152600401610d57949392919061566e565b602060405180830381865af4158015610d74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9891906156e8565b60019094019390506fffffffffffffffffffffffffffffffff8116600003610dc257505050610c04565b610dd6828460000151856020015184613cff565b5050505050610c04565b50505b610dfc610df660a08c0160808d016151e9565b84613df0565b8298506000600a54118015610e1c5750600a546805345cdf77eb68f44c54115b15610e53576040517f9418880900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e6360a08b0160808c016151e9565b604080518b8152602081018b905290810189905273ffffffffffffffffffffffffffffffffffffffff91909116907fbe04f647473608db192e6097887c6c6ddbf59971fe4802acffbef0f6e7f0a74c9060600160405180910390a2505050505050610ece6001600f55565b9193909250565b600082602052637f5e9f20600c5233600052816034600c205581600052602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560206000a35060015b92915050565b60008360601b33602052637f5e9f208117600c526034600c2080546000198114610f695780851115610f63576313be252b6000526004601cfd5b84810382555b50506387a211a28117600c526020600c20805480851115610f925763f4d678b86000526004601cfd5b84810382555050836000526020600c208381540181555082602052600c5160601c8160601c7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a3505060015b9392505050565b610ff0613e6f565b73ffffffffffffffffffffffffffffffffffffffff81166000818152600e6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051938452908301919091527ff9fd438d1867080392f5292aed35357b0adacf770e684f6579d4eef24049ae0291015b60405180910390a150565b600082602052637f5e9f20600c52336000526034600c208054838101818110156110ab5763f90670666000526004601cfd5b80835580600052505050602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560206000a350600192915050565b6110f3613e6f565b81600b541461110257600b8290555b80600c541461111157600c8190555b60408051838152602081018390527f4da129d8839413599671a24e20244003356785667e0b85a8d51eb4dcc1a5cb03910160405180910390a15050565b611156613e6f565b80600a541461119457600a8190556040518181527f44c37a018b13c83d4fa0313c1085da36a15f4bc594c1cbfcdd1ae263207bb7539060200161106e565b50565b61119f613e6f565b6111a761393e565b565b600781815481106111b957600080fd5b600091825260209091200154600281810b925063010000008204810b9166010000000000009004900b83565b60606007805480602002602001604051908101604052809291908181526020016000905b8282101561125d5760008481526020908190206040805160608101825291850154600281810b845263010000008204810b848601526601000000000000909104900b90820152825260019092019101611209565b50505050905090565b606060006112746008613f04565b905060008167ffffffffffffffff81111561129157611291615705565b6040519080825280602002602001820160405280156112ba578160200160208202803683370190505b50905060005b82811015611312576112d3600882613f0e565b8282815181106112e5576112e5615622565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526001016112c0565b5092915050565b611321613f1a565b6111a76000613f9b565b611333613e6f565b61133b6138cb565b60008060008060005b61134e8680615734565b90508110156118765760006113638780615734565b8381811061137357611373615622565b9050608002018036038101906113899190615844565b60035460048054600554602085015160409081015190517f1698ee8200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff93841694810194909452908216602484015262ffffff16604483015292935060009290911690631698ee8290606401602060405180830381865afa158015611424573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114489190615651565b60208381015180519101516040517f7f0d9b8500000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff84166024820152600292830b6044820152910b606482015290915060009073402086c4a160f17c863b45151e8fb4eecbb152b390637f0d9b8590608401606060405180830381865af41580156114ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151291906158c9565b505083516fffffffffffffffffffffffffffffffff9182169250600091167fffffffffffffffffffffffffffffffff000000000000000000000000000000010161155d575080611573565b5082516fffffffffffffffffffffffffffffffff165b81156116475760006040518060c001604052808573ffffffffffffffffffffffffffffffffffffffff16815260200186602001516000015160020b815260200186602001516020015160020b81526020016115cd84614010565b6fffffffffffffffffffffffffffffffff168152306020820152600060409091018190529091506115fd826140b6565b905080604001518b61160f9190615945565b9a5080606001518a6116219190615945565b8151909a50611630908a615945565b98508060200151886116429190615945565b975050505b81811015801561165657508015155b80611674575083516fffffffffffffffffffffffffffffffff908116145b15611867576000806116b76116898d80615734565b8981811061169957611699615622565b9050608002016020018036038101906116b29190615958565b614301565b91509150816116f5576040517fbe48d4f2000000000000000000000000000000000000000000000000000000008152600481018290526024016108e1565b60075461170490600190615974565b81146117fb576007805461171a90600190615974565b8154811061172a5761172a615622565b906000526020600020016007828154811061174757611747615622565b6000918252602090912082549101805462ffffff9283167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000082168117835584546301000000908190048516027fffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000909216171780825592546601000000000000908190049092169091027fffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff9092169190911790555b600780548061180c5761180c615987565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffffffffffffffffffffffffff00000000000000000016905501905550505b84600101945050505050611344565b5061188182826143d9565b505084606001358410156118ce576040517fa988283100000000000000000000000000000000000000000000000000000000815260048101859052606086013560248201526044016108e1565b8460800135831015611919576040517fa988283100000000000000000000000000000000000000000000000000000000815260048101849052608086013560248201526044016108e1565b60408051838152602081018390527f6b01ac9488ee1750bcbe054111f356f1f593cf77dbd4f21cccce8637fc1cdb12910160405180910390a1600061196160408701876159b6565b6040013511156120be57600480546040517f70a08231000000000000000000000000000000000000000000000000000000008152309281019290925260009173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa1580156119df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0391906159f4565b6005546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291925060009173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015611a77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9b91906159f4565b9050611ade611aad60408901896159b6565b611abe9060408101906020016151e9565b60045473ffffffffffffffffffffffffffffffffffffffff16908461468d565b611b1f611aee60408901896159b6565b611aff9060408101906020016151e9565b60055473ffffffffffffffffffffffffffffffffffffffff16908361468d565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166361771e49611b6860408a018a6159b6565b611b799060408101906020016151e9565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015611be2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c069190615a0d565b611c7357611c1760408801886159b6565b611c289060408101906020016151e9565b6040517f03ec04e600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016108e1565b6000611c8260408901896159b6565b611c939060408101906020016151e9565b73ffffffffffffffffffffffffffffffffffffffff16611cb660408a018a6159b6565b611cc09080615a2a565b604051611cce929190615a8f565b6000604051808303816000865af19150503d8060008114611d0b576040519150601f19603f3d011682016040523d82523d6000602084013e611d10565b606091505b5050905080611d4b576040517fb380d6c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600480546040517f70a08231000000000000000000000000000000000000000000000000000000008152309281019290925260009173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015611dbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de391906159f4565b6005546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291925060009173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015611e57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e7b91906159f4565b9050611e8a60408b018b6159b6565b611e9b9060a0810190608001615a9f565b15611f4d57611ead60408b018b6159b6565b611ebb906060013585615945565b811015611ef4576040517fbd5132a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f0160408b018b6159b6565b611f0f906040013586615974565b821015611f48576040517fbd5132a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ff5565b611f5a60408b018b6159b6565b611f68906060013586615945565b821015611fa1576040517fbd5132a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611fae60408b018b6159b6565b611fbc906040013585615974565b811015611ff5576040517fbd5132a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61203761200560408c018c6159b6565b6120169060408101906020016151e9565b60045473ffffffffffffffffffffffffffffffffffffffff1690600061468d565b61207961204760408c018c6159b6565b6120589060408101906020016151e9565b60055473ffffffffffffffffffffffffffffffffffffffff1690600061468d565b7f5982e3253a7121620d22186439359958e05bb1cdb6097924cd859030981568738a83836040516120ac93929190615d8f565b60405180910390a150505050506120fb565b7f5982e3253a7121620d22186439359958e05bb1cdb6097924cd85903098156873856000806040516120f293929190615d8f565b60405180910390a15b60008060005b61210e6020890189615734565b905081101561257257600061212660208a018a615734565b8381811061213657612136615622565b90506080020180360381019061214c9190615844565b604080516060810182526020838101805151600290810b84528151830151810b92840192909252805184015190910b8284015260035460048054600554935186015195517f1698ee8200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821692810192909252928316602482015262ffffff9094166044850152600196909601959394509092600092911690631698ee8290606401602060405180830381865afa15801561221e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122429190615651565b905073ffffffffffffffffffffffffffffffffffffffff8116612291576040517ff26048d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f88afd24700000000000000000000000000000000000000000000000000000000815273402086c4a160f17c863b45151e8fb4eecbb152b3906388afd247906122e39084908690600401615db4565b602060405180830381865af4158015612300573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123249190615a0d565b61235a576040517f5191c91d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f3d99414d00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8216602482015260009073402086c4a160f17c863b45151e8fb4eecbb152b390633d99414d90604401602060405180830381865af41580156123e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124059190615a0d565b90508061243e576040517fb4b0256d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83516fffffffffffffffffffffffffffffffff166000036124625750505050612101565b600061246d84614301565b50905080612526576007805460018101825560009190915284517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68890910180546020870151604088015162ffffff9081166601000000000000027fffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff9282166301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000909416919095161791909117169190911790555b600080612549858860200151600001518960200151602001518a60000151613cff565b9092509050612558828b615945565b9950612564818a615945565b985050505050505050612101565b508660a001358210156125be576040517f676652aa0000000000000000000000000000000000000000000000000000000081526004810183905260a088013560248201526044016108e1565b8660c00135811015612609576040517f676652aa0000000000000000000000000000000000000000000000000000000081526004810182905260c088013560248201526044016108e1565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663702d61ce6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612674573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061269891906159f4565b60075411156126da576007546040517f8a63b55600000000000000000000000000000000000000000000000000000000815260048101919091526024016108e1565b5050505050506111946001600f55565b6126f2613e6f565b60005b818110156127fb576001600e600085858581811061271557612715615622565b905060200201602081019061272a91906151e9565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790557ff9fd438d1867080392f5292aed35357b0adacf770e684f6579d4eef24049ae028383838181106127b0576127b0615622565b90506020020160208101906127c591906151e9565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252600160208301520160405180910390a16001016126f5565b505050565b600082602052637f5e9f20600c52336000526034600c2080548381101561282f57638301ab386000526004601cfd5b8381039050808255806000525050602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560206000a350600192915050565b60006387a211a2600c52336000526020600c2080548084111561289e5763f4d678b86000526004601cfd5b83810382555050826000526020600c208281540181555081602052600c5160601c337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a350600192915050565b6128f6613e6f565b73ffffffffffffffffffffffffffffffffffffffff811661295b576040517ff147881100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024016108e1565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fce71ad776a101525ec2fdbb4d872baeb5a9d040e82fa8e257382bcf2d6af89739060200161106e565b6002548015612a09576040517ffd6fcfdb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8a16612a6e576040517f62429a4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b1660048201526024016108e1565b73ffffffffffffffffffffffffffffffffffffffff8416612ad3576040517fa89e66bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016108e1565b73ffffffffffffffffffffffffffffffffffffffff8216612b38576040517ff147881100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016108e1565b73ffffffffffffffffffffffffffffffffffffffff8916612b9d576040517fc9b1d75200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a1660048201526024016108e1565b73ffffffffffffffffffffffffffffffffffffffff8816612c02576040517fc9b1d75200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff891660048201526024016108e1565b6004805473ffffffffffffffffffffffffffffffffffffffff808c167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255600580548b841690831617905560038054928d1692909116919091179055612c6d8561480f565b612c7684613f9b565b612c8287878b8b6148c6565b506000600a557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600b819055600c55600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091178155600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169215159290921790915560025550505050505050565b612d3a613e6f565b600d805460ff808216157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921682179092556040519116151581527fadfce479a0f126beaf94ab9607c8e548218b009b81f7816db678ce368f8764369060200160405180910390a1565b612dad613e6f565b6111948161480f565b6003546040517f0449a096000000000000000000000000000000000000000000000000000000008152600091829173402086c4a160f17c863b45151e8fb4eecbb152b391630449a09691612e2891309160079173ffffffffffffffffffffffffffffffffffffffff1690600401615dfe565b6040805180830381865af4158015612e44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e689190615ea0565b90939092509050565b612e7b8484614a98565b50505050565b6000612f1160408051808201918290527f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f268e1b2a8acec5a7157b065a84f49168b4d7bad02b005e5b3ed7de7c69733aca60208201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc690915246606082015230608082015260a0902090565b905060405185421115612f2c57631a15a3cc6000526004601cfd5b8860601b60601c98508760601b60601c97506338377508600c52886000526020600c2080546001810182557f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c983528a602084015289604084015288606084015280608084015250508560a08201526119016000528160205260c081206040526042601e206000528460ff1660205283604052826060526020806080600060015afa50883d5114612fe45763ddafbaef6000526004601cfd5b777f5e9f20000000000000000000000000000000000000000088176040526034602c2087905587897f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602060608501a360405250506000606052505050505050565b61304e613f1a565b60045473ffffffffffffffffffffffffffffffffffffffff82811691161480613091575060055473ffffffffffffffffffffffffffffffffffffffff8281169116145b156130c8576040517f6d5de8fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015613135573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061315991906159f4565b905061317c73ffffffffffffffffffffffffffffffffffffffff83163383614b2b565b5050565b60008061318b6138cb565b6387a211a2600c9081523360005260209020548511806131a9575084155b156131e3576040517f7660ebed000000000000000000000000000000000000000000000000000000008152600481018690526024016108e1565b73ffffffffffffffffffffffffffffffffffffffff8416613248576040517f06f25b0500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016108e1565b42831015613282576040517f307080d200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006132956805345cdf77eb68f44c5490565b90506132a13387614b81565b6007546000908190815b8181101561357c576000600782815481106132c8576132c8615622565b60009182526020808320604080516060810182529390910154600281810b855263010000008204810b93850193909352660100000000000090049182900b838201526003546004805460055493517f1698ee8200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821692810192909252928316602482015262ffffff909316604484015292945090911690631698ee8290606401602060405180830381865afa158015613399573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133bd9190615651565b825160208401516040517f7f0d9b8500000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff84166024820152600292830b6044820152910b606482015290915060009073402086c4a160f17c863b45151e8fb4eecbb152b390637f0d9b8590608401606060405180830381865af415801561345f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061348391906158c9565b50506fffffffffffffffffffffffffffffffff16905060006134a68e838b614c05565b905060006040518060c001604052808573ffffffffffffffffffffffffffffffffffffffff168152602001866000015160020b8152602001866020015160020b81526020016134f484614010565b6fffffffffffffffffffffffffffffffff16815230602082015260006040909101819052909150613524826140b6565b905080604001518d6135369190615945565b9c5080606001518c6135489190615945565b8151909c50613557908b615945565b99508060200151896135699190615945565b98508660010196505050505050506132ab565b5061358783836143d9565b5050600480546040517f70a08231000000000000000000000000000000000000000000000000000000008152309281019290925260009161363891899173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015613603573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061362791906159f4565b6136319190615974565b8b87614c05565b6005546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529192506000916136e791899173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa1580156136b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136d691906159f4565b6136e09190615974565b8c88614c05565b905060008211806136f85750600088115b1561372b5761372b8a61370b8a85615945565b60045473ffffffffffffffffffffffffffffffffffffffff169190614b2b565b600081118061373a5750600087115b1561376d5761376d8a61374d8984615945565b60055473ffffffffffffffffffffffffffffffffffffffff169190614b2b565b60408051868152602081018690527f6b01ac9488ee1750bcbe054111f356f1f593cf77dbd4f21cccce8637fc1cdb12910160405180910390a1604080518c8152602081018a905290810188905273ffffffffffffffffffffffffffffffffffffffff8b16907f1dcad4a4d674439187b884e83db93ad96ed2a92cfd6c00a3da7ad4cee61b906a9060600160405180910390a250505050505061380f6001600f55565b935093915050565b61381f613f1a565b73ffffffffffffffffffffffffffffffffffffffff81166138c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108e1565b61119481613f9b565b6002600f5403613937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108e1565b6002600f55565b6007546000908190815b81811015613bd85760006007828154811061396557613965615622565b60009182526020808320604080516060810182529390910154600281810b855263010000008204810b93850193909352660100000000000090049182900b838201526003546004805460055493517f1698ee8200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821692810192909252928316602482015262ffffff90931660448401526001969096019592945090911690631698ee8290606401602060405180830381865afa158015613a3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a619190615651565b825160208401516040517f7f0d9b8500000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff84166024820152600292830b6044820152910b606482015290915060009073402086c4a160f17c863b45151e8fb4eecbb152b390637f0d9b8590608401606060405180830381865af4158015613b03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b2791906158c9565b50509050806fffffffffffffffffffffffffffffffff16600003613b4d57505050613948565b6040805160c08101825273ffffffffffffffffffffffffffffffffffffffff841681528451600290810b602080840191909152860151900b91810191909152600060608201819052306080830152600160a0830152613bab826140b6565b8051909150613bba908a615945565b9850806020015188613bcc9190615945565b97505050505050613948565b50613be383836143d9565b505060408051848152602081018490527f6b01ac9488ee1750bcbe054111f356f1f593cf77dbd4f21cccce8637fc1cdb12910160405180910390a1505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612e7b9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614cd5565b6000806fffffffffffffffffffffffffffffffff831615613de7576040517f3c8a7d8d000000000000000000000000000000000000000000000000000000008152306004820152600286810b602483015285900b60448201526fffffffffffffffffffffffffffffffff8416606482015260a06084820152600060a482015273ffffffffffffffffffffffffffffffffffffffff871690633c8a7d8d9060c40160408051808303816000875af1158015613dbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613de19190615ea0565b90925090505b94509492505050565b6805345cdf77eb68f44c5481810181811015613e145763e5cfe9576000526004601cfd5b806805345cdf77eb68f44c5550506387a211a2600c52816000526020600c208181540181555080602052600c5160601c60007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a35050565b60015473ffffffffffffffffffffffffffffffffffffffff163314801590613ecb575033613eb260005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614155b156111a7576040517fbe291eab0000000000000000000000000000000000000000000000000000000081523360048201526024016108e1565b6000610f23825490565b6000610fe18383614de4565b60005473ffffffffffffffffffffffffffffffffffffffff1633146111a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e1565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006fffffffffffffffffffffffffffffffff8211156140b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203160448201527f323820626974730000000000000000000000000000000000000000000000000060648201526084016108e1565b5090565b6140e16040518060800160405280600081526020016000815260200160008152602001600081525090565b600082606001516fffffffffffffffffffffffffffffffff16118061410757508160a001515b156141da5781516020830151604080850151606086015191517fa34123a7000000000000000000000000000000000000000000000000000000008152600293840b6004820152920b60248301526fffffffffffffffffffffffffffffffff16604482015273ffffffffffffffffffffffffffffffffffffffff9091169063a34123a79060640160408051808303816000875af11580156141ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141cf9190615ea0565b606083015260408201525b81516080830151602084015160408086015190517f4f1eb3d800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9384166004820152600292830b6024820152910b60448201526fffffffffffffffffffffffffffffffff60648201819052608482015260009283921690634f1eb3d89060a40160408051808303816000875af115801561428a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142ae9190615ec4565b6fffffffffffffffffffffffffffffffff918216935016905081156142df5760408301516142dc9083615974565b83525b80156142fa5760608301516142f49082615974565b60208401525b5050919050565b60008060005b6007548110156143cd576007818154811061432457614324615622565b6000918252602090912001548451600291820b910b14801561437657506007818154811061435457614354615622565b6000918252602091829020015490850151600290810b6301000000909204900b145b80156143b557506007818154811061439057614390615622565b6000918252602090912001546040850151600290810b6601000000000000909204900b145b156143c557600194909350915050565b600101614307565b50600093849350915050565b6006546000908190670de0b6b3a764000090816143f68288615ef3565b6144009190615f0a565b93508161440d8287615ef3565b6144179190615f0a565b925060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663405726526040518163ffffffff1660e01b8152600401602060405180830381865afa158015614486573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144aa9190615651565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663945d89966040518163ffffffff1660e01b8152600401602060405180830381865afa158015614519573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061453d91906159f4565b9050600080808089156145bd576145558a868a614c05565b9350614561848b615974565b9250831561458d5760045461458d9073ffffffffffffffffffffffffffffffffffffffff168786614b2b565b82156145bd576001546004546145bd9173ffffffffffffffffffffffffffffffffffffffff918216911685614b2b565b8815614636576145ce89868a614c05565b91506145da828a615974565b90508115614606576005546146069073ffffffffffffffffffffffffffffffffffffffff168784614b2b565b8015614636576001546005546146369173ffffffffffffffffffffffffffffffffffffffff918216911683614b2b565b6040805184815260208101839052908101859052606081018390527f53359a197f990c09b8782cf3e8ddd49a172b8a628ea2ada737cc1699750330249060800160405180910390a150505050505050509250929050565b80158061472d57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015614707573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061472b91906159f4565b155b6147b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016108e1565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526127fb9084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401613c7d565b8060000361484c576040517fb9a8f627000000000000000000000000000000000000000000000000000000008152600481018290526024016108e1565b670de0b6b3a7640000811115614891576040517fb9a8f627000000000000000000000000000000000000000000000000000000008152600481018290526024016108e1565b60068190556040518181527f48396913c7890801561494ae96863d3465039f73075155dbbc6454304a946bd89060200161106e565b60005b83811015614a915760035460009073ffffffffffffffffffffffffffffffffffffffff16631698ee82858589898781811061490657614906615622565b905060200201602081019061491b9190615f45565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff938416600482015292909116602483015262ffffff166044820152606401602060405180830381865afa158015614997573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906149bb9190615651565b905073ffffffffffffffffffffffffffffffffffffffff8116614a22576040517fb491dbe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024016108e1565b614a2d600882614e0e565b15614a7c576040517f595ed26d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024016108e1565b614a87600882614e3d565b50506001016148c9565b5050505050565b614aa3600833614e0e565b614adb576040517fdb8716150000000000000000000000000000000000000000000000000000000081523360048201526024016108e1565b8115614b0557600454614b059073ffffffffffffffffffffffffffffffffffffffff163384614b2b565b801561317c5760055461317c9073ffffffffffffffffffffffffffffffffffffffff1633835b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526127fb9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401613c7d565b6387a211a2600c52816000526020600c20805480831115614baa5763f4d678b86000526004601cfd5b82900390556805345cdf77eb68f44c80548290039055600081815273ffffffffffffffffffffffffffffffffffffffff83167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602083a35050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600003614c5c5760008411614c5157600080fd5b508290049050610fe1565b808411614c6857600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b6000614d37826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16614e5f9092919063ffffffff16565b9050805160001480614d58575080806020019051810190614d589190615a0d565b6127fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016108e1565b6000826000018281548110614dfb57614dfb615622565b9060005260206000200154905092915050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610fe1565b6000610fe18373ffffffffffffffffffffffffffffffffffffffff8416614e76565b6060614e6e8484600085614ec5565b949350505050565b6000818152600183016020526040812054614ebd57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610f23565b506000610f23565b606082471015614f57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016108e1565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051614f809190615f6a565b60006040518083038185875af1925050503d8060008114614fbd576040519150601f19603f3d011682016040523d82523d6000602084013e614fc2565b606091505b5091509150614fd387838387614fde565b979650505050505050565b6060831561507457825160000361506d5773ffffffffffffffffffffffffffffffffffffffff85163b61506d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108e1565b5081614e6e565b614e6e83838151156150895781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e191906150f9565b600060a082840312156150cf57600080fd5b50919050565b60005b838110156150f05781810151838201526020016150d8565b50506000910152565b60208152600082518060208401526151188160408501602087016150d5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461119457600080fd5b80356151778161514a565b919050565b6000806040838503121561518f57600080fd5b823561519a8161514a565b946020939093013593505050565b6000806000606084860312156151bd57600080fd5b83356151c88161514a565b925060208401356151d88161514a565b929592945050506040919091013590565b6000602082840312156151fb57600080fd5b8135610fe18161514a565b6000806040838503121561521957600080fd5b50508035926020909101359150565b60006020828403121561523a57600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156152a357615290838551805160020b8252602081015160020b6020830152604081015160020b60408301525050565b928401926060929092019160010161525d565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156152a357835173ffffffffffffffffffffffffffffffffffffffff16835292840192918401916001016152cb565b60006020828403121561530f57600080fd5b813567ffffffffffffffff81111561532657600080fd5b820160e08185031215610fe157600080fd5b60008083601f84011261534a57600080fd5b50813567ffffffffffffffff81111561536257600080fd5b6020830191508360208260051b850101111561537d57600080fd5b9250929050565b6000806020838503121561539757600080fd5b823567ffffffffffffffff8111156153ae57600080fd5b6153ba85828601615338565b90969095509350505050565b801515811461119457600080fd5b8035615177816153c6565b60008060008060008060008060006101008a8c0312156153fe57600080fd5b89356154098161514a565b985060208a01356154198161514a565b975060408a01356154298161514a565b965060608a013567ffffffffffffffff81111561544557600080fd5b6154518c828d01615338565b90975095505060808a0135935060a08a013561546c8161514a565b925060c08a013561547c816153c6565b915060e08a013561548c8161514a565b809150509295985092959850929598565b600080600080606085870312156154b357600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156154d957600080fd5b818701915087601f8301126154ed57600080fd5b8135818111156154fc57600080fd5b88602082850101111561550e57600080fd5b95989497505060200194505050565b600080600080600080600060e0888a03121561553857600080fd5b87356155438161514a565b965060208801356155538161514a565b95506040880135945060608801359350608088013560ff8116811461557757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156155a757600080fd5b82356155b28161514a565b915060208301356155c28161514a565b809150509250929050565b6000806000606084860312156155e257600080fd5b8335925060208401356151d88161514a565b60008060006060848603121561560957600080fd5b8351925060208401519150604084015190509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561566357600080fd5b8151610fe18161514a565b73ffffffffffffffffffffffffffffffffffffffff8516815260c081016156b86020830186805160020b8252602081015160020b6020830152604081015160020b60408301525050565b608082019390935260a0015292915050565b6fffffffffffffffffffffffffffffffff8116811461119457600080fd5b6000602082840312156156fa57600080fd5b8151610fe1816156ca565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261576957600080fd5b83018035915067ffffffffffffffff82111561578457600080fd5b6020019150600781901b360382131561537d57600080fd5b8035600281900b811461517757600080fd5b6000606082840312156157c057600080fd5b6040516060810181811067ffffffffffffffff8211171561580a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040529050806158198361579c565b81526158276020840161579c565b60208201526158386040840161579c565b60408201525092915050565b60006080828403121561585657600080fd5b6040516040810181811067ffffffffffffffff821117156158a0577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405282356158ae816156ca565b81526158bd84602085016157ae565b60208201529392505050565b6000806000606084860312156158de57600080fd5b83516158e9816156ca565b60208501519093506158fa816156ca565b604085015190925061590b816156ca565b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610f2357610f23615916565b60006060828403121561596a57600080fd5b610fe183836157ae565b81810381811115610f2357610f23615916565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff618336030181126159ea57600080fd5b9190910192915050565b600060208284031215615a0657600080fd5b5051919050565b600060208284031215615a1f57600080fd5b8151610fe1816153c6565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615a5f57600080fd5b83018035915067ffffffffffffffff821115615a7a57600080fd5b60200191503681900382131561537d57600080fd5b8183823760009101908152919050565b600060208284031215615ab157600080fd5b8135610fe1816153c6565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615af157600080fd5b830160208101925035905067ffffffffffffffff811115615b1157600080fd5b8060071b360382131561537d57600080fd5b8183526000602080850194508260005b85811015615baa578135615b46816156ca565b6fffffffffffffffffffffffffffffffff168752615b6582840161579c565b600290810b88850152604090615b7c84830161579c565b810b828a015260609150615b9182850161579c565b900b908801526080968701969190910190600101615b33565b509495945050505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600081357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1833603018112615c3257600080fd5b820160208101903567ffffffffffffffff811115615c4f57600080fd5b803603821315615c5e57600080fd5b60a08552615c7060a086018284615bb5565b915050615c7f6020840161516c565b73ffffffffffffffffffffffffffffffffffffffff81166020860152506040830135604085015260608301356060850152615cbc608084016153d4565b8015156080860152509392505050565b6000615cd88283615abc565b60e08552615cea60e086018284615b23565b915050615cfa6020840184615abc565b8583036020870152615d0d838284615b23565b9250505060408301357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61843603018112615d4657600080fd5b8482036040860152615d5a82858301615bfe565b915050606083013560608501526080830135608085015260a083013560a085015260c083013560c08501528091505092915050565b606081526000615da26060830186615ccc565b60208301949094525060400152919050565b73ffffffffffffffffffffffffffffffffffffffff8316815260808101610fe16020830184805160020b8252602081015160020b6020830152604081015160020b60408301525050565b6000606080830173ffffffffffffffffffffffffffffffffffffffff87168452602082818601528187548084526080870191508860005282600020935060005b81811015615e77578454600281810b8552601882901c810b8686015260309190911c900b60408401526001948501949286019201615e3e565b505073ffffffffffffffffffffffffffffffffffffffff871660408701529350614e6e92505050565b60008060408385031215615eb357600080fd5b505080516020909101519092909150565b60008060408385031215615ed757600080fd5b8251615ee2816156ca565b60208401519092506155c2816156ca565b8082028115828204841417610f2357610f23615916565b600082615f40577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600060208284031215615f5757600080fd5b813562ffffff81168114610fe157600080fd5b600082516159ea8184602087016150d556fea2646970667358221220c77a2fefc0b3decd6e5069eaf6d89772c3a0360b3d79df10dc4079e02086f71c64736f6c63430008130033000000000000000000000000d751e0940cfadc35f84e60075d0f940a2545fb8d