Latest 25 from a total of 386,873 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Swap Exact ETH F... | 14211925 | 36 hrs ago | IN | 516.5 GLMR | 0.0116205 | ||||
| Swap Exact ETH F... | 14211772 | 37 hrs ago | IN | 518.3 GLMR | 0.0116205 | ||||
| Swap Exact ETH F... | 14211371 | 37 hrs ago | IN | 515 GLMR | 0.0116205 | ||||
| Swap Exact ETH F... | 14211198 | 38 hrs ago | IN | 466 GLMR | 0.0116205 | ||||
| Add Liquidity ET... | 14200036 | 2 days ago | IN | 1.00033347 GLMR | 0.0168895 | ||||
| Swap Exact ETH F... | 14199948 | 2 days ago | IN | 1 GLMR | 0.0127885 | ||||
| Swap Exact Token... | 14194895 | 2 days ago | IN | 0 GLMR | 0.01405948 | ||||
| Remove Liquidity... | 14194886 | 2 days ago | IN | 0 GLMR | 0.01869289 | ||||
| Swap Exact ETH F... | 14188221 | 3 days ago | IN | 30 GLMR | 0.014516 | ||||
| Swap Exact ETH F... | 14188200 | 3 days ago | IN | 30 GLMR | 0.014516 | ||||
| Swap Exact ETH F... | 14188196 | 3 days ago | IN | 20 GLMR | 0.014516 | ||||
| Swap Exact ETH F... | 14176769 | 4 days ago | IN | 539.5 GLMR | 0.0116205 | ||||
| Swap Exact ETH F... | 14176622 | 4 days ago | IN | 538 GLMR | 0.0116205 | ||||
| Swap Exact ETH F... | 14176523 | 4 days ago | IN | 540 GLMR | 0.0116205 | ||||
| Swap Exact ETH F... | 14176365 | 4 days ago | IN | 673 GLMR | 0.0116205 | ||||
| Swap Exact ETH F... | 14176195 | 4 days ago | IN | 668 GLMR | 0.0116205 | ||||
| Swap Exact ETH F... | 14176052 | 4 days ago | IN | 659 GLMR | 0.0116205 | ||||
| Remove Liquidity | 14155091 | 5 days ago | IN | 0 GLMR | 0.01490727 | ||||
| Swap Exact Token... | 14106511 | 9 days ago | IN | 0 GLMR | 0.0118315 | ||||
| Swap Exact Token... | 14106490 | 9 days ago | IN | 0 GLMR | 0.0118315 | ||||
| Swap Exact Token... | 14106482 | 9 days ago | IN | 0 GLMR | 0.0118315 | ||||
| Swap Exact Token... | 14106478 | 9 days ago | IN | 0 GLMR | 0.0118315 | ||||
| Swap Exact Token... | 14106471 | 9 days ago | IN | 0 GLMR | 0.0118315 | ||||
| Swap Exact Token... | 14106467 | 9 days ago | IN | 0 GLMR | 0.0118315 | ||||
| Swap Exact Token... | 14106462 | 9 days ago | IN | 0 GLMR | 0.0118315 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 14211925 | 36 hrs ago | 0 GLMR | ||||
| 14211925 | 36 hrs ago | 0 GLMR | ||||
| 14211925 | 36 hrs ago | 516.5 GLMR | ||||
| 14211925 | 36 hrs ago | 0 GLMR | ||||
| 14211772 | 37 hrs ago | 0 GLMR | ||||
| 14211772 | 37 hrs ago | 0 GLMR | ||||
| 14211772 | 37 hrs ago | 518.3 GLMR | ||||
| 14211772 | 37 hrs ago | 0 GLMR | ||||
| 14211371 | 37 hrs ago | 0 GLMR | ||||
| 14211371 | 37 hrs ago | 0 GLMR | ||||
| 14211371 | 37 hrs ago | 515 GLMR | ||||
| 14211371 | 37 hrs ago | 0 GLMR | ||||
| 14211198 | 38 hrs ago | 0 GLMR | ||||
| 14211198 | 38 hrs ago | 0 GLMR | ||||
| 14211198 | 38 hrs ago | 466 GLMR | ||||
| 14211198 | 38 hrs ago | 0 GLMR | ||||
| 14200036 | 2 days ago | 0 GLMR | ||||
| 14200036 | 2 days ago | 0 GLMR | ||||
| 14200036 | 2 days ago | 1.00033347 GLMR | ||||
| 14200036 | 2 days ago | 0 GLMR | ||||
| 14200036 | 2 days ago | 0 GLMR | ||||
| 14200036 | 2 days ago | 0 GLMR | ||||
| 14199948 | 2 days ago | 0 GLMR | ||||
| 14199948 | 2 days ago | 0 GLMR | ||||
| 14199948 | 2 days ago | 1 GLMR |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
FlareRouter02
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/**
*Submitted for verification at moonbeam.moonscan.io on 2022-01-20
*/
// Sources flattened with hardhat v2.7.0 https://hardhat.org
// File contracts/FlareRouter02.sol
// Sources flattened with hardhat v2.7.0 https://hardhat.org
// File contracts/uniswapv2/interfaces/IFlarePair.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity =0.6.12;
interface IFlarePair {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint);
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
event Mint(address indexed sender, uint amount0, uint amount1);
event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
event Swap(
address indexed sender,
uint amount0In,
uint amount1In,
uint amount0Out,
uint amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint);
function factory() external view returns (address);
function token0() external view returns (address);
function token1() external view returns (address);
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function price0CumulativeLast() external view returns (uint);
function price1CumulativeLast() external view returns (uint);
function kLast() external view returns (uint);
function mint(address to) external returns (uint liquidity);
function burn(address to) external returns (uint amount0, uint amount1);
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
function skim(address to) external;
function sync() external;
function initialize(address, address) external;
}
// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)
library SafeMathFlare {
function add(uint256 x, uint256 y) internal pure returns (uint256 z) {
require((z = x + y) >= x, "ds-math-add-overflow");
}
function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {
require((z = x - y) <= x, "ds-math-sub-underflow");
}
function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {
require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow");
}
}
library FlareLibrary {
using SafeMathFlare for uint256;
// returns sorted token addresses, used to handle return values from pairs sorted in this order
function sortTokens(address tokenA, address tokenB)
internal
pure
returns (address token0, address token1)
{
require(tokenA != tokenB, "FlareLibrary: IDENTICAL_ADDRESSES");
(token0, token1) = tokenA < tokenB
? (tokenA, tokenB)
: (tokenB, tokenA);
require(token0 != address(0), "FlareLibrary: ZERO_ADDRESS");
}
// calculates the CREATE2 address for a pair without making any external calls
function pairFor(
address factory,
address tokenA,
address tokenB
) internal pure returns (address pair) {
(address token0, address token1) = sortTokens(tokenA, tokenB);
pair = address(
uint256(
keccak256(
abi.encodePacked(
hex"ff",
factory,
keccak256(abi.encodePacked(token0, token1)),
hex"e21386787732ef8059a646602f85a5ebb23848cddd90ef5a8d111ec84a4cb71f"
)
)
)
);
}
// fetches and sorts the reserves for a pair
function getReserves(
address factory,
address tokenA,
address tokenB
) internal view returns (uint256 reserveA, uint256 reserveB) {
(address token0,) = sortTokens(tokenA, tokenB);
(uint256 reserve0, uint256 reserve1, ) = IFlarePair(
pairFor(factory, tokenA, tokenB)
).getReserves();
(reserveA, reserveB) = tokenA == token0
? (reserve0, reserve1)
: (reserve1, reserve0);
}
// given some amount of an asset and pair reserves, returns an equivalent amount of the other asset
function quote(
uint256 amountA,
uint256 reserveA,
uint256 reserveB
) internal pure returns (uint256 amountB) {
require(amountA > 0, "FlareLibrary: INSUFFICIENT_AMOUNT");
require(
reserveA > 0 && reserveB > 0,
"FlareLibrary: INSUFFICIENT_LIQUIDITY"
);
amountB = amountA.mul(reserveB) / reserveA;
}
// given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
function getAmountOut(
uint256 amountIn,
uint256 reserveIn,
uint256 reserveOut
) internal pure returns (uint256 amountOut) {
require(amountIn > 0, "FlareLibrary: INSUFFICIENT_INPUT_AMOUNT");
require(
reserveIn > 0 && reserveOut > 0,
"FlareLibrary: INSUFFICIENT_LIQUIDITY"
);
uint256 feeMul = uint256(10000).sub(25);
uint256 amountInWithFee = amountIn.mul(feeMul);
uint256 numerator = amountInWithFee.mul(reserveOut);
uint256 denominator = reserveIn.mul(10000).add(amountInWithFee);
amountOut = numerator / denominator;
}
// given an output amount of an asset and pair reserves, returns a required input amount of the other asset
function getAmountIn(
uint256 amountOut,
uint256 reserveIn,
uint256 reserveOut
) internal pure returns (uint256 amountIn) {
require(amountOut > 0, "FlareLibrary: INSUFFICIENT_OUTPUT_AMOUNT");
require(
reserveIn > 0 && reserveOut > 0,
"FlareLibrary: INSUFFICIENT_LIQUIDITY"
);
uint256 feeMul = uint256(10000).sub(25);
uint256 numerator = reserveIn.mul(amountOut).mul(10000);
uint256 denominator = reserveOut.sub(amountOut).mul(feeMul);
amountIn = (numerator / denominator).add(1);
}
// performs chained getAmountOut calculations on any number of pairs
function getAmountsOut(
address factory,
uint256 amountIn,
address[] memory path
) internal view returns (uint256[] memory amounts) {
require(path.length >= 2, "FlareLibrary: INVALID_PATH");
amounts = new uint256[](path.length);
amounts[0] = amountIn;
for (uint256 i; i < path.length - 1; i++) {
(uint256 reserveIn, uint256 reserveOut) = getReserves(
factory,
path[i],
path[i + 1]
);
amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut);
}
}
// performs chained getAmountIn calculations on any number of pairs
function getAmountsIn(
address factory,
uint256 amountOut,
address[] memory path
) internal view returns (uint256[] memory amounts) {
require(path.length >= 2, "FlareLibrary: INVALID_PATH");
amounts = new uint256[](path.length);
amounts[amounts.length - 1] = amountOut;
for (uint256 i = path.length - 1; i > 0; i--) {
(uint256 reserveIn, uint256 reserveOut) = getReserves(
factory,
path[i - 1],
path[i]
);
amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
}
}
}
// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
function safeApprove(
address token,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes('approve(address,uint256)')));
(bool success, bytes memory data) = token.call(
abi.encodeWithSelector(0x095ea7b3, to, value)
);
require(
success && (data.length == 0 || abi.decode(data, (bool))),
"TransferHelper: APPROVE_FAILED"
);
}
function safeTransfer(
address token,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes('transfer(address,uint256)')));
(bool success, bytes memory data) = token.call(
abi.encodeWithSelector(0xa9059cbb, to, value)
);
require(
success && (data.length == 0 || abi.decode(data, (bool))),
"TransferHelper: TRANSFER_FAILED"
);
}
function safeTransferFrom(
address token,
address from,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
(bool success, bytes memory data) = token.call(
abi.encodeWithSelector(0x23b872dd, from, to, value)
);
require(
success && (data.length == 0 || abi.decode(data, (bool))),
"TransferHelper: TRANSFER_FROM_FAILED"
);
}
function safeTransferETH(address to, uint256 value) internal {
(bool success,) = to.call{value : value}(new bytes(0));
require(success, "TransferHelper: ETH_TRANSFER_FAILED");
}
}
interface IFlareRouter01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}
interface IFlareRouter02 is IFlareRouter01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
) external returns (uint256 amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint256 amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external;
}
interface IFlareFactory {
event PairCreated(
address indexed token0,
address indexed token1,
address pair,
uint256
);
function feeTo() external view returns (address);
function feeToSetter() external view returns (address);
function migrator() external view returns (address);
function getPair(address tokenA, address tokenB)
external
view
returns (address pair);
function allPairs(uint256) external view returns (address pair);
function allPairsLength() external view returns (uint256);
function createPair(address tokenA, address tokenB)
external
returns (address pair);
function setFeeTo(address) external;
function setFeeToSetter(address) external;
function setMigrator(address) external;
}
interface IERC20Flare {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
}
interface IWETH {
function deposit() external payable;
function transfer(address to, uint256 value) external returns (bool);
function withdraw(uint256) external;
}
contract FlareRouter02 is IFlareRouter02 {
using SafeMathFlare for uint256;
address public immutable override factory;
address public immutable override WETH;
modifier ensure(uint256 deadline) {
require(deadline >= block.timestamp, "FlareRouter: EXPIRED");
_;
}
constructor(address _factory, address _WETH) public {
factory = _factory;
WETH = _WETH;
}
receive() external payable {
assert(msg.sender == WETH); // only accept ETH via fallback from the WETH contract
}
// **** ADD LIQUIDITY ****
function _addLiquidity(
address tokenA,
address tokenB,
uint256 amountADesired,
uint256 amountBDesired,
uint256 amountAMin,
uint256 amountBMin
) internal virtual returns (uint256 amountA, uint256 amountB) {
// create the pair if it doesn't exist yet
if (IFlareFactory(factory).getPair(tokenA, tokenB) == address(0)) {
IFlareFactory(factory).createPair(tokenA, tokenB);
}
(uint256 reserveA, uint256 reserveB) = FlareLibrary.getReserves(
factory,
tokenA,
tokenB
);
if (reserveA == 0 && reserveB == 0) {
(amountA, amountB) = (amountADesired, amountBDesired);
} else {
uint256 amountBOptimal = FlareLibrary.quote(
amountADesired,
reserveA,
reserveB
);
if (amountBOptimal <= amountBDesired) {
require(
amountBOptimal >= amountBMin,
"FlareRouter: INSUFFICIENT_B_AMOUNT"
);
(amountA, amountB) = (amountADesired, amountBOptimal);
} else {
uint256 amountAOptimal = FlareLibrary.quote(
amountBDesired,
reserveB,
reserveA
);
assert(amountAOptimal <= amountADesired);
require(
amountAOptimal >= amountAMin,
"FlareRouter: INSUFFICIENT_A_AMOUNT"
);
(amountA, amountB) = (amountAOptimal, amountBDesired);
}
}
}
function addLiquidity(
address tokenA,
address tokenB,
uint256 amountADesired,
uint256 amountBDesired,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline
)
external
virtual
override
ensure(deadline)
returns (
uint256 amountA,
uint256 amountB,
uint256 liquidity
)
{
(amountA, amountB) = _addLiquidity(
tokenA,
tokenB,
amountADesired,
amountBDesired,
amountAMin,
amountBMin
);
address pair = FlareLibrary.pairFor(factory, tokenA, tokenB);
TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
liquidity = IFlarePair(pair).mint(to);
}
function addLiquidityETH(
address token,
uint256 amountTokenDesired,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
)
external
payable
virtual
override
ensure(deadline)
returns (
uint256 amountToken,
uint256 amountETH,
uint256 liquidity
)
{
(amountToken, amountETH) = _addLiquidity(
token,
WETH,
amountTokenDesired,
msg.value,
amountTokenMin,
amountETHMin
);
address pair = FlareLibrary.pairFor(factory, token, WETH);
TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
IWETH(WETH).deposit{value : amountETH}();
assert(IWETH(WETH).transfer(pair, amountETH));
liquidity = IFlarePair(pair).mint(to);
// refund dust eth, if any
if (msg.value > amountETH)
TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
}
// **** REMOVE LIQUIDITY ****
function removeLiquidity(
address tokenA,
address tokenB,
uint256 liquidity,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline
)
public
virtual
override
ensure(deadline)
returns (uint256 amountA, uint256 amountB)
{
address pair = FlareLibrary.pairFor(factory, tokenA, tokenB);
IFlarePair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
(uint256 amount0, uint256 amount1) = IFlarePair(pair).burn(to);
(address token0,) = FlareLibrary.sortTokens(tokenA, tokenB);
(amountA, amountB) = tokenA == token0
? (amount0, amount1)
: (amount1, amount0);
require(amountA >= amountAMin, "FlareRouter: INSUFFICIENT_A_AMOUNT");
require(amountB >= amountBMin, "FlareRouter: INSUFFICIENT_B_AMOUNT");
}
function removeLiquidityETH(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
)
public
virtual
override
ensure(deadline)
returns (uint256 amountToken, uint256 amountETH)
{
(amountToken, amountETH) = removeLiquidity(
token,
WETH,
liquidity,
amountTokenMin,
amountETHMin,
address(this),
deadline
);
TransferHelper.safeTransfer(token, to, amountToken);
IWETH(WETH).withdraw(amountETH);
TransferHelper.safeTransferETH(to, amountETH);
}
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint256 liquidity,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external virtual override returns (uint256 amountA, uint256 amountB) {
address pair = FlareLibrary.pairFor(factory, tokenA, tokenB);
uint256 value = approveMax ? uint256(- 1) : liquidity;
IFlarePair(pair).permit(
msg.sender,
address(this),
value,
deadline,
v,
r,
s
);
(amountA, amountB) = removeLiquidity(
tokenA,
tokenB,
liquidity,
amountAMin,
amountBMin,
to,
deadline
);
}
function removeLiquidityETHWithPermit(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
)
external
virtual
override
returns (uint256 amountToken, uint256 amountETH)
{
address pair = FlareLibrary.pairFor(factory, token, WETH);
uint256 value = approveMax ? uint256(- 1) : liquidity;
IFlarePair(pair).permit(
msg.sender,
address(this),
value,
deadline,
v,
r,
s
);
(amountToken, amountETH) = removeLiquidityETH(
token,
liquidity,
amountTokenMin,
amountETHMin,
to,
deadline
);
}
// **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
) public virtual override ensure(deadline) returns (uint256 amountETH) {
(, amountETH) = removeLiquidity(
token,
WETH,
liquidity,
amountTokenMin,
amountETHMin,
address(this),
deadline
);
TransferHelper.safeTransfer(
token,
to,
IERC20Flare(token).balanceOf(address(this))
);
IWETH(WETH).withdraw(amountETH);
TransferHelper.safeTransferETH(to, amountETH);
}
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external virtual override returns (uint256 amountETH) {
address pair = FlareLibrary.pairFor(factory, token, WETH);
uint256 value = approveMax ? uint256(- 1) : liquidity;
IFlarePair(pair).permit(
msg.sender,
address(this),
value,
deadline,
v,
r,
s
);
amountETH = removeLiquidityETHSupportingFeeOnTransferTokens(
token,
liquidity,
amountTokenMin,
amountETHMin,
to,
deadline
);
}
// **** SWAP ****
// requires the initial amount to have already been sent to the first pair
function _swap(
uint256[] memory amounts,
address[] memory path,
address _to
) internal virtual {
for (uint256 i; i < path.length - 1; i++) {
(address input, address output) = (path[i], path[i + 1]);
(address token0,) = FlareLibrary.sortTokens(input, output);
uint256 amountOut = amounts[i + 1];
(uint256 amount0Out, uint256 amount1Out) = input == token0
? (uint256(0), amountOut)
: (amountOut, uint256(0));
address to = i < path.length - 2
? FlareLibrary.pairFor(factory, output, path[i + 2])
: _to;
IFlarePair(FlareLibrary.pairFor(factory, input, output)).swap(
amount0Out,
amount1Out,
to,
new bytes(0)
);
}
}
function swapExactTokensForTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
)
external
virtual
override
ensure(deadline)
returns (uint256[] memory amounts)
{
amounts = FlareLibrary.getAmountsOut(factory, amountIn, path);
require(
amounts[amounts.length - 1] >= amountOutMin,
"FlareRouter: INSUFFICIENT_OUTPUT_AMOUNT"
);
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
FlareLibrary.pairFor(factory, path[0], path[1]),
amounts[0]
);
_swap(amounts, path, to);
}
function swapTokensForExactTokens(
uint256 amountOut,
uint256 amountInMax,
address[] calldata path,
address to,
uint256 deadline
)
external
virtual
override
ensure(deadline)
returns (uint256[] memory amounts)
{
amounts = FlareLibrary.getAmountsIn(factory, amountOut, path);
require(
amounts[0] <= amountInMax,
"FlareRouter: EXCESSIVE_INPUT_AMOUNT"
);
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
FlareLibrary.pairFor(factory, path[0], path[1]),
amounts[0]
);
_swap(amounts, path, to);
}
function swapExactETHForTokens(
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
)
external
payable
virtual
override
ensure(deadline)
returns (uint256[] memory amounts)
{
require(path[0] == WETH, "FlareRouter: INVALID_PATH");
amounts = FlareLibrary.getAmountsOut(factory, msg.value, path);
require(
amounts[amounts.length - 1] >= amountOutMin,
"FlareRouter: INSUFFICIENT_OUTPUT_AMOUNT"
);
IWETH(WETH).deposit{value : amounts[0]}();
assert(
IWETH(WETH).transfer(
FlareLibrary.pairFor(factory, path[0], path[1]),
amounts[0]
)
);
_swap(amounts, path, to);
}
function swapTokensForExactETH(
uint256 amountOut,
uint256 amountInMax,
address[] calldata path,
address to,
uint256 deadline
)
external
virtual
override
ensure(deadline)
returns (uint256[] memory amounts)
{
require(path[path.length - 1] == WETH, "FlareRouter: INVALID_PATH");
amounts = FlareLibrary.getAmountsIn(factory, amountOut, path);
require(
amounts[0] <= amountInMax,
"FlareRouter: EXCESSIVE_INPUT_AMOUNT"
);
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
FlareLibrary.pairFor(factory, path[0], path[1]),
amounts[0]
);
_swap(amounts, path, address(this));
IWETH(WETH).withdraw(amounts[amounts.length - 1]);
TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
}
function swapExactTokensForETH(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
)
external
virtual
override
ensure(deadline)
returns (uint256[] memory amounts)
{
require(path[path.length - 1] == WETH, "FlareRouter: INVALID_PATH");
amounts = FlareLibrary.getAmountsOut(factory, amountIn, path);
require(
amounts[amounts.length - 1] >= amountOutMin,
"FlareRouter: INSUFFICIENT_OUTPUT_AMOUNT"
);
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
FlareLibrary.pairFor(factory, path[0], path[1]),
amounts[0]
);
_swap(amounts, path, address(this));
IWETH(WETH).withdraw(amounts[amounts.length - 1]);
TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
}
function swapETHForExactTokens(
uint256 amountOut,
address[] calldata path,
address to,
uint256 deadline
)
external
payable
virtual
override
ensure(deadline)
returns (uint256[] memory amounts)
{
require(path[0] == WETH, "FlareRouter: INVALID_PATH");
amounts = FlareLibrary.getAmountsIn(factory, amountOut, path);
require(amounts[0] <= msg.value, "FlareRouter: EXCESSIVE_INPUT_AMOUNT");
IWETH(WETH).deposit{value : amounts[0]}();
assert(
IWETH(WETH).transfer(
FlareLibrary.pairFor(factory, path[0], path[1]),
amounts[0]
)
);
_swap(amounts, path, to);
// refund dust eth, if any
if (msg.value > amounts[0])
TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
}
// **** SWAP (supporting fee-on-transfer tokens) ****
// requires the initial amount to have already been sent to the first pair
function _swapSupportingFeeOnTransferTokens(
address[] memory path,
address _to
) internal virtual {
for (uint256 i; i < path.length - 1; i++) {
(address input, address output) = (path[i], path[i + 1]);
(address token0,) = FlareLibrary.sortTokens(input, output);
IFlarePair pair = IFlarePair(
FlareLibrary.pairFor(factory, input, output)
);
uint256 amountInput;
uint256 amountOutput;
{
// scope to avoid stack too deep errors
(uint256 reserve0, uint256 reserve1,) = pair.getReserves();
(uint256 reserveInput, uint256 reserveOutput) = input == token0
? (reserve0, reserve1)
: (reserve1, reserve0);
amountInput = IERC20Flare(input).balanceOf(address(pair)).sub(
reserveInput
);
amountOutput = FlareLibrary.getAmountOut(
amountInput,
reserveInput,
reserveOutput
);
}
(uint256 amount0Out, uint256 amount1Out) = input == token0
? (uint256(0), amountOutput)
: (amountOutput, uint256(0));
address to = i < path.length - 2
? FlareLibrary.pairFor(factory, output, path[i + 2])
: _to;
pair.swap(amount0Out, amount1Out, to, new bytes(0));
}
}
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external virtual override ensure(deadline) {
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
FlareLibrary.pairFor(factory, path[0], path[1]),
amountIn
);
uint256 balanceBefore = IERC20Flare(path[path.length - 1]).balanceOf(
to
);
_swapSupportingFeeOnTransferTokens(path, to);
require(
IERC20Flare(path[path.length - 1]).balanceOf(to).sub(
balanceBefore
) >= amountOutMin,
"FlareRouter: INSUFFICIENT_OUTPUT_AMOUNT"
);
}
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external payable virtual override ensure(deadline) {
require(path[0] == WETH, "FlareRouter: INVALID_PATH");
uint256 amountIn = msg.value;
IWETH(WETH).deposit{value : amountIn}();
assert(
IWETH(WETH).transfer(
FlareLibrary.pairFor(factory, path[0], path[1]),
amountIn
)
);
uint256 balanceBefore = IERC20Flare(path[path.length - 1]).balanceOf(
to
);
_swapSupportingFeeOnTransferTokens(path, to);
require(
IERC20Flare(path[path.length - 1]).balanceOf(to).sub(
balanceBefore
) >= amountOutMin,
"FlareRouter: INSUFFICIENT_OUTPUT_AMOUNT"
);
}
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external virtual override ensure(deadline) {
require(path[path.length - 1] == WETH, "FlareRouter: INVALID_PATH");
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
FlareLibrary.pairFor(factory, path[0], path[1]),
amountIn
);
_swapSupportingFeeOnTransferTokens(path, address(this));
uint256 amountOut = IERC20Flare(WETH).balanceOf(address(this));
require(
amountOut >= amountOutMin,
"FlareRouter: INSUFFICIENT_OUTPUT_AMOUNT"
);
IWETH(WETH).withdraw(amountOut);
TransferHelper.safeTransferETH(to, amountOut);
}
// **** LIBRARY FUNCTIONS ****
function quote(
uint256 amountA,
uint256 reserveA,
uint256 reserveB
) public pure virtual override returns (uint256 amountB) {
return FlareLibrary.quote(amountA, reserveA, reserveB);
}
function getAmountOut(
uint256 amountIn,
uint256 reserveIn,
uint256 reserveOut
) public pure virtual override returns (uint256 amountOut) {
return FlareLibrary.getAmountOut(amountIn, reserveIn, reserveOut);
}
function getAmountIn(
uint256 amountOut,
uint256 reserveIn,
uint256 reserveOut
) public pure virtual override returns (uint256 amountIn) {
return FlareLibrary.getAmountIn(amountOut, reserveIn, reserveOut);
}
function getAmountsOut(uint256 amountIn, address[] memory path)
public
view
virtual
override
returns (uint256[] memory amounts)
{
return FlareLibrary.getAmountsOut(factory, amountIn, path);
}
function getAmountsIn(uint256 amountOut, address[] memory path)
public
view
virtual
override
returns (uint256[] memory amounts)
{
return FlareLibrary.getAmountsIn(factory, amountOut, path);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60c06040523480156200001157600080fd5b506040516200561438038062005614833981810160405260408110156200003757600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c61548d62000187600039806101ac5280610e5d5280610e985280610fd5528061129852806116f252806118d65280611dec5280611f2b5280612039528061214052806122f35280612388528061262452806126cb5280612799528061289e52806129865280612a075280613054528061337452806133ca52806133fe528061347f528061366d528061381d52806138b25250806110c752806111c5528061136b52806113a4528061154f52806117e452806118b45280611aa1528061222652806123c7528061255a5280612a465280612d475280612fd952806130025280613032528061320f52806133a8528061375352806138f15280614352528061439552806146df52806148aa5280614ddd5280614eca5280614fa4525061548d6000f3fe60806040526004361061018f5760003560e01c80638803dbee116100d6578063c45a01551161007f578063e8e3370011610059578063e8e3370014610c71578063f305d71914610cfe578063fb3bdb4114610d51576101d5565b8063c45a015514610b25578063d06ca61f14610b3a578063ded9382a14610bf1576101d5565b8063af2979eb116100b0578063af2979eb146109c8578063b6f9de9514610a28578063baa2abde14610abb576101d5565b80638803dbee146108af578063ad5c464814610954578063ad615dec14610992576101d5565b80634a25d94a11610138578063791ac94711610112578063791ac947146107415780637ff36ab5146107e657806385f8c25914610879576101d5565b80634a25d94a146105775780635b0d59841461061c5780635c11d7951461069c576101d5565b80631f00ca74116101695780631f00ca74146103905780632195995c1461044757806338ed1739146104d2576101d5565b806302751cec146101da578063054d50d41461025357806318cbafe51461029b576101d5565b366101d5573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146101d357fe5b005b600080fd5b3480156101e657600080fd5b5061023a600480360360c08110156101fd57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135610de4565b6040805192835260208301919091528051918290030190f35b34801561025f57600080fd5b506102896004803603606081101561027657600080fd5b5080359060208101359060400135610f37565b60408051918252519081900360200190f35b3480156102a757600080fd5b50610340600480360360a08110156102be57600080fd5b8135916020810135918101906060810160408201356401000000008111156102e557600080fd5b8201836020820111156102f757600080fd5b8035906020019184602083028401116401000000008311171561031957600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135610f4c565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561037c578181015183820152602001610364565b505050509050019250505060405180910390f35b34801561039c57600080fd5b50610340600480360360408110156103b357600080fd5b813591908101906040810160208201356401000000008111156103d557600080fd5b8201836020820111156103e757600080fd5b8035906020019184602083028401116401000000008311171561040957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611364945050505050565b34801561045357600080fd5b5061023a600480360361016081101561046b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff610100820135169061012081013590610140013561139a565b3480156104de57600080fd5b50610340600480360360a08110156104f557600080fd5b81359160208101359181019060608101604082013564010000000081111561051c57600080fd5b82018360208201111561052e57600080fd5b8035906020019184602083028401116401000000008311171561055057600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356114d8565b34801561058357600080fd5b50610340600480360360a081101561059a57600080fd5b8135916020810135918101906060810160408201356401000000008111156105c157600080fd5b8201836020820111156105d357600080fd5b803590602001918460208302840111640100000000831117156105f557600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611669565b34801561062857600080fd5b50610289600480360361014081101561064057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356118ac565b3480156106a857600080fd5b506101d3600480360360a08110156106bf57600080fd5b8135916020810135918101906060810160408201356401000000008111156106e657600080fd5b8201836020820111156106f857600080fd5b8035906020019184602083028401116401000000008311171561071a57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356119fe565b34801561074d57600080fd5b506101d3600480360360a081101561076457600080fd5b81359160208101359181019060608101604082013564010000000081111561078b57600080fd5b82018360208201111561079d57600080fd5b803590602001918460208302840111640100000000831117156107bf57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611d65565b610340600480360360808110156107fc57600080fd5b8135919081019060408101602082013564010000000081111561081e57600080fd5b82018360208201111561083057600080fd5b8035906020019184602083028401116401000000008311171561085257600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356120cc565b34801561088557600080fd5b506102896004803603606081101561089c57600080fd5b50803590602081013590604001356124d6565b3480156108bb57600080fd5b50610340600480360360a08110156108d257600080fd5b8135916020810135918101906060810160408201356401000000008111156108f957600080fd5b82018360208201111561090b57600080fd5b8035906020019184602083028401116401000000008311171561092d57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356124e3565b34801561096057600080fd5b50610969612622565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561099e57600080fd5b50610289600480360360608110156109b557600080fd5b5080359060208101359060400135612646565b3480156109d457600080fd5b50610289600480360360c08110156109eb57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135612653565b6101d360048036036080811015610a3e57600080fd5b81359190810190604081016020820135640100000000811115610a6057600080fd5b820183602082011115610a7257600080fd5b80359060200191846020830284011164010000000083111715610a9457600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff813516906020013561282c565b348015610ac757600080fd5b5061023a600480360360e0811015610ade57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612ccd565b348015610b3157600080fd5b50610969612fd7565b348015610b4657600080fd5b5061034060048036036040811015610b5d57600080fd5b81359190810190604081016020820135640100000000811115610b7f57600080fd5b820183602082011115610b9157600080fd5b80359060200191846020830284011164010000000083111715610bb357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612ffb945050505050565b348015610bfd57600080fd5b5061023a6004803603610140811015610c1557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135613028565b348015610c7d57600080fd5b50610ce06004803603610100811015610c9557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135613180565b60408051938452602084019290925282820152519081900360600190f35b610ce0600480360360c0811015610d1457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a001356132f9565b61034060048036036080811015610d6757600080fd5b81359190810190604081016020820135640100000000811115610d8957600080fd5b820183602082011115610d9b57600080fd5b80359060200191846020830284011164010000000083111715610dbd57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356135f9565b6000808242811015610e5757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b610e86897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612ccd565b9093509150610e96898685613a32565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610f0957600080fd5b505af1158015610f1d573d6000803e3d6000fd5b50505050610f2b8583613c0f565b50965096945050505050565b6000610f44848484613d4c565b949350505050565b60608142811015610fbe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061102357fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110c257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f466c617265526f757465723a20494e56414c49445f5041544800000000000000604482015290519081900360640190fd5b6111207f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613e6892505050565b9150868260018451038151811061113357fe5b60200260200101511015611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061540f6027913960400191505060405180910390fd5b611257868660008181106111a257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff163361123d7f00000000000000000000000000000000000000000000000000000000000000008a8a60008181106111f157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168b8b600181811061121b57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16613fce565b8560008151811061124a57fe5b60200260200101516140b9565b61129682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614289915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836001855103815181106112e257fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561132057600080fd5b505af1158015611334573d6000803e3d6000fd5b50505050611359848360018551038151811061134c57fe5b6020026020010151613c0f565b509695505050505050565b60606113917f000000000000000000000000000000000000000000000000000000000000000084846144fa565b90505b92915050565b60008060006113ca7f00000000000000000000000000000000000000000000000000000000000000008f8f613fce565b90506000876113d9578c6113fb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561149757600080fd5b505af11580156114ab573d6000803e3d6000fd5b505050506114be8f8f8f8f8f8f8f612ccd565b809450819550505050509b509b9950505050505050505050565b6060814281101561154a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b6115a87f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613e6892505050565b915086826001845103815181106115bb57fe5b6020026020010151101561161a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061540f6027913960400191505060405180910390fd5b61162a868660008181106111a257fe5b61135982878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614289915050565b606081428110156116db57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061174057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117df57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f466c617265526f757465723a20494e56414c49445f5041544800000000000000604482015290519081900360640190fd5b61183d7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506144fa92505050565b9150868260008151811061184d57fe5b60200260200101511115611192576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806153386023913960400191505060405180910390fd5b6000806118fa7f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000613fce565b9050600086611909578b61192b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c48101879052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b1580156119c757600080fd5b505af11580156119db573d6000803e3d6000fd5b505050506119ed8d8d8d8d8d8d612653565b9d9c50505050505050505050505050565b8042811015611a6e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b611afd85856000818110611a7e57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1633611af77f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168a8a600181811061121b57fe5b8a6140b9565b600085857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611b2d57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611bb057600080fd5b505afa158015611bc4573d6000803e3d6000fd5b505050506040513d6020811015611bda57600080fd5b50516040805160208881028281018201909352888252929350611c1c929091899189918291850190849080828437600092019190915250889250614688915050565b86611d048288887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611c4f57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cd257600080fd5b505afa158015611ce6573d6000803e3d6000fd5b505050506040513d6020811015611cfc57600080fd5b505190614a05565b1015611d5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061540f6027913960400191505060405180910390fd5b5050505050505050565b8042811015611dd557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001685857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611e3a57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ed957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f466c617265526f757465723a20494e56414c49445f5041544800000000000000604482015290519081900360640190fd5b611ee985856000818110611a7e57fe5b611f27858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614688915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611fb057600080fd5b505afa158015611fc4573d6000803e3d6000fd5b505050506040513d6020811015611fda57600080fd5b5051905086811015612037576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061540f6027913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156120aa57600080fd5b505af11580156120be573d6000803e3d6000fd5b50505050611d5b8482613c0f565b6060814281101561213e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168686600081811061218257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461222157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f466c617265526f757465723a20494e56414c49445f5041544800000000000000604482015290519081900360640190fd5b61227f7f000000000000000000000000000000000000000000000000000000000000000034888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613e6892505050565b9150868260018451038151811061229257fe5b602002602001015110156122f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061540f6027913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061233a57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561236d57600080fd5b505af1158015612381573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6123f37f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b8460008151811061240057fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561245b57600080fd5b505af115801561246f573d6000803e3d6000fd5b505050506040513d602081101561248557600080fd5b505161248d57fe5b6124cc82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614289915050565b5095945050505050565b6000610f44848484614a77565b6060814281101561255557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b6125b37f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506144fa92505050565b915086826000815181106125c357fe5b6020026020010151111561161a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806153386023913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610f44848484614b93565b600081428110156126c557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b6126f4887f00000000000000000000000000000000000000000000000000000000000000008989893089612ccd565b90508092505061279788858a73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561276657600080fd5b505afa15801561277a573d6000803e3d6000fd5b505050506040513d602081101561279057600080fd5b5051613a32565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561280a57600080fd5b505af115801561281e573d6000803e3d6000fd5b505050506113598483613c0f565b804281101561289c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16858560008181106128e057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461297f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f466c617265526f757465723a20494e56414c49445f5041544800000000000000604482015290519081900360640190fd5b60003490507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156129ec57600080fd5b505af1158015612a00573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb612a727f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612ac657600080fd5b505af1158015612ada573d6000803e3d6000fd5b505050506040513d6020811015612af057600080fd5b5051612af857fe5b600086867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612b2857fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612bab57600080fd5b505afa158015612bbf573d6000803e3d6000fd5b505050506040513d6020811015612bd557600080fd5b50516040805160208981028281018201909352898252929350612c179290918a918a918291850190849080828437600092019190915250899250614688915050565b87611d048289897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612c4a57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cd257600080fd5b6000808242811015612d4057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b6000612d6d7f00000000000000000000000000000000000000000000000000000000000000008c8c613fce565b604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b158015612dee57600080fd5b505af1158015612e02573d6000803e3d6000fd5b505050506040513d6020811015612e1857600080fd5b5050604080517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b158015612e8b57600080fd5b505af1158015612e9f573d6000803e3d6000fd5b505050506040513d6040811015612eb557600080fd5b50805160209091015190925090506000612ecf8e8e614c6d565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff1614612f0c578183612f0f565b82825b90975095508a871015612f6d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806153166022913960400191505060405180910390fd5b89861015612fc6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806154366022913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606113917f00000000000000000000000000000000000000000000000000000000000000008484613e68565b60008060006130787f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000613fce565b9050600087613087578c6130a9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561314557600080fd5b505af1158015613159573d6000803e3d6000fd5b5050505061316b8e8e8e8e8e8e610de4565b909f909e509c50505050505050505050505050565b600080600083428110156131f557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b6132038c8c8c8c8c8c614dc0565b909450925060006132357f00000000000000000000000000000000000000000000000000000000000000008e8e613fce565b90506132438d3383886140b9565b61324f8c3383876140b9565b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156132b857600080fd5b505af11580156132cc573d6000803e3d6000fd5b505050506040513d60208110156132e257600080fd5b5051949d939c50939a509198505050505050505050565b6000806000834281101561336e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b61339c8a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614dc0565b909450925060006133ee7f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000613fce565b90506133fc8b3383886140b9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561346457600080fd5b505af1158015613478573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561350e57600080fd5b505af1158015613522573d6000803e3d6000fd5b505050506040513d602081101561353857600080fd5b505161354057fe5b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156135a957600080fd5b505af11580156135bd573d6000803e3d6000fd5b505050506040513d60208110156135d357600080fd5b50519250348410156135eb576135eb33853403613c0f565b505096509650969350505050565b6060814281101561366b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16868660008181106136af57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461374e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f466c617265526f757465723a20494e56414c49445f5041544800000000000000604482015290519081900360640190fd5b6137ac7f0000000000000000000000000000000000000000000000000000000000000000888888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506144fa92505050565b915034826000815181106137bc57fe5b6020026020010151111561381b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806153386023913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061386457fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561389757600080fd5b505af11580156138ab573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61391d7f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b8460008151811061392a57fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561398557600080fd5b505af1158015613999573d6000803e3d6000fd5b505050506040513d60208110156139af57600080fd5b50516139b757fe5b6139f682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614289915050565b81600081518110613a0357fe5b60200260200101513411156124cc576124cc3383600081518110613a2357fe5b60200260200101513403613c0f565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b60208310613b0857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613acb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613b6a576040519150601f19603f3d011682016040523d82523d6000602084013e613b6f565b606091505b5091509150818015613b9d575080511580613b9d5750808060200190516020811015613b9a57600080fd5b50515b613c0857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040518082805190602001908083835b60208310613c8657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613c49565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613ce8576040519150601f19603f3d011682016040523d82523d6000602084013e613ced565b606091505b5050905080613d47576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806153a46023913960400191505060405180910390fd5b505050565b6000808411613da6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806152ef6027913960400191505060405180910390fd5b600083118015613db65750600082115b613e0b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806153eb6024913960400191505060405180910390fd5b6000613e1a6127106019614a05565b90506000613e2886836150ed565b90506000613e3682866150ed565b90506000613e5083613e4a896127106150ed565b90615173565b9050808281613e5b57fe5b0498975050505050505050565b6060600282511015613edb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f466c6172654c6962726172793a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b815167ffffffffffffffff81118015613ef357600080fd5b50604051908082528060200260200182016040528015613f1d578160200160208202803683370190505b5090508281600081518110613f2e57fe5b60200260200101818152505060005b6001835103811015613fc657600080613f8087868581518110613f5c57fe5b6020026020010151878660010181518110613f7357fe5b60200260200101516151e5565b91509150613fa2848481518110613f9357fe5b60200260200101518383613d4c565b848460010181518110613fb157fe5b60209081029190910101525050600101613f3d565b509392505050565b6000806000613fdd8585614c6d565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527fe21386787732ef8059a646602f85a5ebb23848cddd90ef5a8d111ec84a4cb71f609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017815292518251600094606094938a169392918291908083835b6020831061419757805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161415a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146141f9576040519150601f19603f3d011682016040523d82523d6000602084013e6141fe565b606091505b509150915081801561422c57508051158061422c575080806020019051602081101561422957600080fd5b50515b614281576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806153c76024913960400191505060405180910390fd5b505050505050565b60005b60018351038110156144f4576000808483815181106142a757fe5b60200260200101518584600101815181106142be57fe5b60200260200101519150915060006142d68383614c6d565b50905060008785600101815181106142ea57fe5b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161461433257826000614336565b6000835b91509150600060028a5103881061434d578861438e565b61438e7f0000000000000000000000000000000000000000000000000000000000000000878c8b6002018151811061438157fe5b6020026020010151613fce565b90506143bb7f00000000000000000000000000000000000000000000000000000000000000008888613fce565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f84848460006040519080825280601f01601f191660200182016040528015614405576020820181803683370190505b506040518563ffffffff1660e01b8152600401808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561447a578181015183820152602001614462565b50505050905090810190601f1680156144a75780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156144c957600080fd5b505af11580156144dd573d6000803e3d6000fd5b50506001909901985061428c975050505050505050565b50505050565b606060028251101561456d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f466c6172654c6962726172793a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561458557600080fd5b506040519080825280602002602001820160405280156145af578160200160208202803683370190505b50905082816001835103815181106145c357fe5b602090810291909101015281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b8015613fc6576000806146238786600186038151811061460f57fe5b6020026020010151878681518110613f7357fe5b9150915061464584848151811061463657fe5b60200260200101518383614a77565b84600185038151811061465457fe5b602090810291909101015250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016145f3565b60005b6001835103811015613d47576000808483815181106146a657fe5b60200260200101518584600101815181106146bd57fe5b60200260200101519150915060006146d58383614c6d565b50905060006147057f00000000000000000000000000000000000000000000000000000000000000008585613fce565b90506000806000808473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561475357600080fd5b505afa158015614767573d6000803e3d6000fd5b505050506040513d606081101561477d57600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905060008073ffffffffffffffffffffffffffffffffffffffff8a8116908916146147c75782846147ca565b83835b91509150614839828b73ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cd257600080fd5b9550614846868383613d4c565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161461488a5782600061488e565b6000835b91509150600060028c51038a106148a5578a6148d9565b6148d97f0000000000000000000000000000000000000000000000000000000000000000898e8d6002018151811061438157fe5b60408051600080825260208201928390527f022c0d9f000000000000000000000000000000000000000000000000000000008352602482018781526044830187905273ffffffffffffffffffffffffffffffffffffffff8086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015614989578181015183820152602001614971565b50505050905090810190601f1680156149b65780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156149d857600080fd5b505af11580156149ec573d6000803e3d6000fd5b50506001909b019a5061468b9950505050505050505050565b8082038281111561139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6000808411614ad1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061537c6028913960400191505060405180910390fd5b600083118015614ae15750600082115b614b36576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806153eb6024913960400191505060405180910390fd5b6000614b456127106019614a05565b90506000614b5f612710614b5987896150ed565b906150ed565b90506000614b7183614b59878a614a05565b9050614b886001828481614b8157fe5b0490615173565b979650505050505050565b6000808411614bed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806152ce6021913960400191505060405180910390fd5b600083118015614bfd5750600082115b614c52576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806153eb6024913960400191505060405180910390fd5b82614c5d85846150ed565b81614c6457fe5b04949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415614cf5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061535b6021913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610614d2f578284614d32565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216614db957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f466c6172654c6962726172793a205a45524f5f41444452455353000000000000604482015290519081900360640190fd5b9250929050565b600080600073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e6a439058a8a6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015614e8057600080fd5b505afa158015614e94573d6000803e3d6000fd5b505050506040513d6020811015614eaa57600080fd5b505173ffffffffffffffffffffffffffffffffffffffff161415614f9c577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c9c6539689896040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b158015614f6f57600080fd5b505af1158015614f83573d6000803e3d6000fd5b505050506040513d6020811015614f9957600080fd5b50505b600080614fca7f00000000000000000000000000000000000000000000000000000000000000008b8b6151e5565b91509150816000148015614fdc575080155b15614fec578793508692506150e0565b6000614ff9898484614b93565b9050878111615066578581101561505b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806154366022913960400191505060405180910390fd5b8894509250826150de565b6000615073898486614b93565b90508981111561507f57fe5b878110156150d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806153166022913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806151085750508082028282828161510557fe5b04145b61139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b8082018281101561139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b60008060006151f48585614c6d565b509050600080615205888888613fce565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561524a57600080fd5b505afa15801561525e573d6000803e3d6000fd5b505050506040513d606081101561527457600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905073ffffffffffffffffffffffffffffffffffffffff878116908416146152bb5780826152be565b81815b9099909850965050505050505056fe466c6172654c6962726172793a20494e53554646494349454e545f414d4f554e54466c6172654c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54466c617265526f757465723a20494e53554646494349454e545f415f414d4f554e54466c617265526f757465723a204558434553534956455f494e5055545f414d4f554e54466c6172654c6962726172793a204944454e544943414c5f414444524553534553466c6172654c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c45445472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544466c6172654c6962726172793a20494e53554646494349454e545f4c4951554944495459466c617265526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e54466c617265526f757465723a20494e53554646494349454e545f425f414d4f554e54a264697066735822122012e68939a9da32e6ff6e7d6e000bd725520dc72623454bb69337f77c297649a164736f6c634300060c003300000000000000000000000019b85ae92947e0725d5265ffb3389e7e4f191fda000000000000000000000000acc15dc74880c9944775448304b263d191c6077f
Deployed Bytecode
0x60806040526004361061018f5760003560e01c80638803dbee116100d6578063c45a01551161007f578063e8e3370011610059578063e8e3370014610c71578063f305d71914610cfe578063fb3bdb4114610d51576101d5565b8063c45a015514610b25578063d06ca61f14610b3a578063ded9382a14610bf1576101d5565b8063af2979eb116100b0578063af2979eb146109c8578063b6f9de9514610a28578063baa2abde14610abb576101d5565b80638803dbee146108af578063ad5c464814610954578063ad615dec14610992576101d5565b80634a25d94a11610138578063791ac94711610112578063791ac947146107415780637ff36ab5146107e657806385f8c25914610879576101d5565b80634a25d94a146105775780635b0d59841461061c5780635c11d7951461069c576101d5565b80631f00ca74116101695780631f00ca74146103905780632195995c1461044757806338ed1739146104d2576101d5565b806302751cec146101da578063054d50d41461025357806318cbafe51461029b576101d5565b366101d5573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000acc15dc74880c9944775448304b263d191c6077f16146101d357fe5b005b600080fd5b3480156101e657600080fd5b5061023a600480360360c08110156101fd57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135610de4565b6040805192835260208301919091528051918290030190f35b34801561025f57600080fd5b506102896004803603606081101561027657600080fd5b5080359060208101359060400135610f37565b60408051918252519081900360200190f35b3480156102a757600080fd5b50610340600480360360a08110156102be57600080fd5b8135916020810135918101906060810160408201356401000000008111156102e557600080fd5b8201836020820111156102f757600080fd5b8035906020019184602083028401116401000000008311171561031957600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135610f4c565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561037c578181015183820152602001610364565b505050509050019250505060405180910390f35b34801561039c57600080fd5b50610340600480360360408110156103b357600080fd5b813591908101906040810160208201356401000000008111156103d557600080fd5b8201836020820111156103e757600080fd5b8035906020019184602083028401116401000000008311171561040957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611364945050505050565b34801561045357600080fd5b5061023a600480360361016081101561046b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff610100820135169061012081013590610140013561139a565b3480156104de57600080fd5b50610340600480360360a08110156104f557600080fd5b81359160208101359181019060608101604082013564010000000081111561051c57600080fd5b82018360208201111561052e57600080fd5b8035906020019184602083028401116401000000008311171561055057600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356114d8565b34801561058357600080fd5b50610340600480360360a081101561059a57600080fd5b8135916020810135918101906060810160408201356401000000008111156105c157600080fd5b8201836020820111156105d357600080fd5b803590602001918460208302840111640100000000831117156105f557600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611669565b34801561062857600080fd5b50610289600480360361014081101561064057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356118ac565b3480156106a857600080fd5b506101d3600480360360a08110156106bf57600080fd5b8135916020810135918101906060810160408201356401000000008111156106e657600080fd5b8201836020820111156106f857600080fd5b8035906020019184602083028401116401000000008311171561071a57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356119fe565b34801561074d57600080fd5b506101d3600480360360a081101561076457600080fd5b81359160208101359181019060608101604082013564010000000081111561078b57600080fd5b82018360208201111561079d57600080fd5b803590602001918460208302840111640100000000831117156107bf57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611d65565b610340600480360360808110156107fc57600080fd5b8135919081019060408101602082013564010000000081111561081e57600080fd5b82018360208201111561083057600080fd5b8035906020019184602083028401116401000000008311171561085257600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356120cc565b34801561088557600080fd5b506102896004803603606081101561089c57600080fd5b50803590602081013590604001356124d6565b3480156108bb57600080fd5b50610340600480360360a08110156108d257600080fd5b8135916020810135918101906060810160408201356401000000008111156108f957600080fd5b82018360208201111561090b57600080fd5b8035906020019184602083028401116401000000008311171561092d57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356124e3565b34801561096057600080fd5b50610969612622565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561099e57600080fd5b50610289600480360360608110156109b557600080fd5b5080359060208101359060400135612646565b3480156109d457600080fd5b50610289600480360360c08110156109eb57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135612653565b6101d360048036036080811015610a3e57600080fd5b81359190810190604081016020820135640100000000811115610a6057600080fd5b820183602082011115610a7257600080fd5b80359060200191846020830284011164010000000083111715610a9457600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff813516906020013561282c565b348015610ac757600080fd5b5061023a600480360360e0811015610ade57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612ccd565b348015610b3157600080fd5b50610969612fd7565b348015610b4657600080fd5b5061034060048036036040811015610b5d57600080fd5b81359190810190604081016020820135640100000000811115610b7f57600080fd5b820183602082011115610b9157600080fd5b80359060200191846020830284011164010000000083111715610bb357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612ffb945050505050565b348015610bfd57600080fd5b5061023a6004803603610140811015610c1557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135613028565b348015610c7d57600080fd5b50610ce06004803603610100811015610c9557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135613180565b60408051938452602084019290925282820152519081900360600190f35b610ce0600480360360c0811015610d1457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a001356132f9565b61034060048036036080811015610d6757600080fd5b81359190810190604081016020820135640100000000811115610d8957600080fd5b820183602082011115610d9b57600080fd5b80359060200191846020830284011164010000000083111715610dbd57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356135f9565b6000808242811015610e5757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b610e86897f000000000000000000000000acc15dc74880c9944775448304b263d191c6077f8a8a8a308a612ccd565b9093509150610e96898685613a32565b7f000000000000000000000000acc15dc74880c9944775448304b263d191c6077f73ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610f0957600080fd5b505af1158015610f1d573d6000803e3d6000fd5b50505050610f2b8583613c0f565b50965096945050505050565b6000610f44848484613d4c565b949350505050565b60608142811015610fbe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000acc15dc74880c9944775448304b263d191c6077f1686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061102357fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110c257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f466c617265526f757465723a20494e56414c49445f5041544800000000000000604482015290519081900360640190fd5b6111207f00000000000000000000000019b85ae92947e0725d5265ffb3389e7e4f191fda89888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613e6892505050565b9150868260018451038151811061113357fe5b60200260200101511015611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061540f6027913960400191505060405180910390fd5b611257868660008181106111a257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff163361123d7f00000000000000000000000019b85ae92947e0725d5265ffb3389e7e4f191fda8a8a60008181106111f157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168b8b600181811061121b57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16613fce565b8560008151811061124a57fe5b60200260200101516140b9565b61129682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614289915050565b7f000000000000000000000000acc15dc74880c9944775448304b263d191c6077f73ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836001855103815181106112e257fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561132057600080fd5b505af1158015611334573d6000803e3d6000fd5b50505050611359848360018551038151811061134c57fe5b6020026020010151613c0f565b509695505050505050565b60606113917f00000000000000000000000019b85ae92947e0725d5265ffb3389e7e4f191fda84846144fa565b90505b92915050565b60008060006113ca7f00000000000000000000000019b85ae92947e0725d5265ffb3389e7e4f191fda8f8f613fce565b90506000876113d9578c6113fb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561149757600080fd5b505af11580156114ab573d6000803e3d6000fd5b505050506114be8f8f8f8f8f8f8f612ccd565b809450819550505050509b509b9950505050505050505050565b6060814281101561154a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b6115a87f00000000000000000000000019b85ae92947e0725d5265ffb3389e7e4f191fda89888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613e6892505050565b915086826001845103815181106115bb57fe5b6020026020010151101561161a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061540f6027913960400191505060405180910390fd5b61162a868660008181106111a257fe5b61135982878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614289915050565b606081428110156116db57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000acc15dc74880c9944775448304b263d191c6077f1686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061174057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117df57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f466c617265526f757465723a20494e56414c49445f5041544800000000000000604482015290519081900360640190fd5b61183d7f00000000000000000000000019b85ae92947e0725d5265ffb3389e7e4f191fda898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506144fa92505050565b9150868260008151811061184d57fe5b60200260200101511115611192576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806153386023913960400191505060405180910390fd5b6000806118fa7f00000000000000000000000019b85ae92947e0725d5265ffb3389e7e4f191fda8d7f000000000000000000000000acc15dc74880c9944775448304b263d191c6077f613fce565b9050600086611909578b61192b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c48101879052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b1580156119c757600080fd5b505af11580156119db573d6000803e3d6000fd5b505050506119ed8d8d8d8d8d8d612653565b9d9c50505050505050505050505050565b8042811015611a6e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b611afd85856000818110611a7e57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1633611af77f00000000000000000000000019b85ae92947e0725d5265ffb3389e7e4f191fda89896000818110611acd57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168a8a600181811061121b57fe5b8a6140b9565b600085857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611b2d57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611bb057600080fd5b505afa158015611bc4573d6000803e3d6000fd5b505050506040513d6020811015611bda57600080fd5b50516040805160208881028281018201909352888252929350611c1c929091899189918291850190849080828437600092019190915250889250614688915050565b86611d048288887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611c4f57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cd257600080fd5b505afa158015611ce6573d6000803e3d6000fd5b505050506040513d6020811015611cfc57600080fd5b505190614a05565b1015611d5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061540f6027913960400191505060405180910390fd5b5050505050505050565b8042811015611dd557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000acc15dc74880c9944775448304b263d191c6077f1685857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611e3a57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ed957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f466c617265526f757465723a20494e56414c49445f5041544800000000000000604482015290519081900360640190fd5b611ee985856000818110611a7e57fe5b611f27858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614688915050565b60007f000000000000000000000000acc15dc74880c9944775448304b263d191c6077f73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611fb057600080fd5b505afa158015611fc4573d6000803e3d6000fd5b505050506040513d6020811015611fda57600080fd5b5051905086811015612037576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061540f6027913960400191505060405180910390fd5b7f000000000000000000000000acc15dc74880c9944775448304b263d191c6077f73ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156120aa57600080fd5b505af11580156120be573d6000803e3d6000fd5b50505050611d5b8482613c0f565b6060814281101561213e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000acc15dc74880c9944775448304b263d191c6077f73ffffffffffffffffffffffffffffffffffffffff168686600081811061218257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461222157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f466c617265526f757465723a20494e56414c49445f5041544800000000000000604482015290519081900360640190fd5b61227f7f00000000000000000000000019b85ae92947e0725d5265ffb3389e7e4f191fda34888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613e6892505050565b9150868260018451038151811061229257fe5b602002602001015110156122f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061540f6027913960400191505060405180910390fd5b7f000000000000000000000000acc15dc74880c9944775448304b263d191c6077f73ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061233a57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561236d57600080fd5b505af1158015612381573d6000803e3d6000fd5b50505050507f000000000000000000000000acc15dc74880c9944775448304b263d191c6077f73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6123f37f00000000000000000000000019b85ae92947e0725d5265ffb3389e7e4f191fda89896000818110611acd57fe5b8460008151811061240057fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561245b57600080fd5b505af115801561246f573d6000803e3d6000fd5b505050506040513d602081101561248557600080fd5b505161248d57fe5b6124cc82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614289915050565b5095945050505050565b6000610f44848484614a77565b6060814281101561255557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b6125b37f00000000000000000000000019b85ae92947e0725d5265ffb3389e7e4f191fda898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506144fa92505050565b915086826000815181106125c357fe5b6020026020010151111561161a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806153386023913960400191505060405180910390fd5b7f000000000000000000000000acc15dc74880c9944775448304b263d191c6077f81565b6000610f44848484614b93565b600081428110156126c557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b6126f4887f000000000000000000000000acc15dc74880c9944775448304b263d191c6077f8989893089612ccd565b90508092505061279788858a73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561276657600080fd5b505afa15801561277a573d6000803e3d6000fd5b505050506040513d602081101561279057600080fd5b5051613a32565b7f000000000000000000000000acc15dc74880c9944775448304b263d191c6077f73ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561280a57600080fd5b505af115801561281e573d6000803e3d6000fd5b505050506113598483613c0f565b804281101561289c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000acc15dc74880c9944775448304b263d191c6077f73ffffffffffffffffffffffffffffffffffffffff16858560008181106128e057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461297f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f466c617265526f757465723a20494e56414c49445f5041544800000000000000604482015290519081900360640190fd5b60003490507f000000000000000000000000acc15dc74880c9944775448304b263d191c6077f73ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156129ec57600080fd5b505af1158015612a00573d6000803e3d6000fd5b50505050507f000000000000000000000000acc15dc74880c9944775448304b263d191c6077f73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb612a727f00000000000000000000000019b85ae92947e0725d5265ffb3389e7e4f191fda89896000818110611acd57fe5b836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612ac657600080fd5b505af1158015612ada573d6000803e3d6000fd5b505050506040513d6020811015612af057600080fd5b5051612af857fe5b600086867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612b2857fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612bab57600080fd5b505afa158015612bbf573d6000803e3d6000fd5b505050506040513d6020811015612bd557600080fd5b50516040805160208981028281018201909352898252929350612c179290918a918a918291850190849080828437600092019190915250899250614688915050565b87611d048289897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612c4a57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cd257600080fd5b6000808242811015612d4057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b6000612d6d7f00000000000000000000000019b85ae92947e0725d5265ffb3389e7e4f191fda8c8c613fce565b604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b158015612dee57600080fd5b505af1158015612e02573d6000803e3d6000fd5b505050506040513d6020811015612e1857600080fd5b5050604080517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b158015612e8b57600080fd5b505af1158015612e9f573d6000803e3d6000fd5b505050506040513d6040811015612eb557600080fd5b50805160209091015190925090506000612ecf8e8e614c6d565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff1614612f0c578183612f0f565b82825b90975095508a871015612f6d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806153166022913960400191505060405180910390fd5b89861015612fc6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806154366022913960400191505060405180910390fd5b505050505097509795505050505050565b7f00000000000000000000000019b85ae92947e0725d5265ffb3389e7e4f191fda81565b60606113917f00000000000000000000000019b85ae92947e0725d5265ffb3389e7e4f191fda8484613e68565b60008060006130787f00000000000000000000000019b85ae92947e0725d5265ffb3389e7e4f191fda8e7f000000000000000000000000acc15dc74880c9944775448304b263d191c6077f613fce565b9050600087613087578c6130a9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561314557600080fd5b505af1158015613159573d6000803e3d6000fd5b5050505061316b8e8e8e8e8e8e610de4565b909f909e509c50505050505050505050505050565b600080600083428110156131f557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b6132038c8c8c8c8c8c614dc0565b909450925060006132357f00000000000000000000000019b85ae92947e0725d5265ffb3389e7e4f191fda8e8e613fce565b90506132438d3383886140b9565b61324f8c3383876140b9565b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156132b857600080fd5b505af11580156132cc573d6000803e3d6000fd5b505050506040513d60208110156132e257600080fd5b5051949d939c50939a509198505050505050505050565b6000806000834281101561336e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b61339c8a7f000000000000000000000000acc15dc74880c9944775448304b263d191c6077f8b348c8c614dc0565b909450925060006133ee7f00000000000000000000000019b85ae92947e0725d5265ffb3389e7e4f191fda8c7f000000000000000000000000acc15dc74880c9944775448304b263d191c6077f613fce565b90506133fc8b3383886140b9565b7f000000000000000000000000acc15dc74880c9944775448304b263d191c6077f73ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561346457600080fd5b505af1158015613478573d6000803e3d6000fd5b50505050507f000000000000000000000000acc15dc74880c9944775448304b263d191c6077f73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561350e57600080fd5b505af1158015613522573d6000803e3d6000fd5b505050506040513d602081101561353857600080fd5b505161354057fe5b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156135a957600080fd5b505af11580156135bd573d6000803e3d6000fd5b505050506040513d60208110156135d357600080fd5b50519250348410156135eb576135eb33853403613c0f565b505096509650969350505050565b6060814281101561366b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000acc15dc74880c9944775448304b263d191c6077f73ffffffffffffffffffffffffffffffffffffffff16868660008181106136af57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461374e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f466c617265526f757465723a20494e56414c49445f5041544800000000000000604482015290519081900360640190fd5b6137ac7f00000000000000000000000019b85ae92947e0725d5265ffb3389e7e4f191fda888888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506144fa92505050565b915034826000815181106137bc57fe5b6020026020010151111561381b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806153386023913960400191505060405180910390fd5b7f000000000000000000000000acc15dc74880c9944775448304b263d191c6077f73ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061386457fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561389757600080fd5b505af11580156138ab573d6000803e3d6000fd5b50505050507f000000000000000000000000acc15dc74880c9944775448304b263d191c6077f73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61391d7f00000000000000000000000019b85ae92947e0725d5265ffb3389e7e4f191fda89896000818110611acd57fe5b8460008151811061392a57fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561398557600080fd5b505af1158015613999573d6000803e3d6000fd5b505050506040513d60208110156139af57600080fd5b50516139b757fe5b6139f682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614289915050565b81600081518110613a0357fe5b60200260200101513411156124cc576124cc3383600081518110613a2357fe5b60200260200101513403613c0f565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b60208310613b0857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613acb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613b6a576040519150601f19603f3d011682016040523d82523d6000602084013e613b6f565b606091505b5091509150818015613b9d575080511580613b9d5750808060200190516020811015613b9a57600080fd5b50515b613c0857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040518082805190602001908083835b60208310613c8657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613c49565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613ce8576040519150601f19603f3d011682016040523d82523d6000602084013e613ced565b606091505b5050905080613d47576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806153a46023913960400191505060405180910390fd5b505050565b6000808411613da6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806152ef6027913960400191505060405180910390fd5b600083118015613db65750600082115b613e0b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806153eb6024913960400191505060405180910390fd5b6000613e1a6127106019614a05565b90506000613e2886836150ed565b90506000613e3682866150ed565b90506000613e5083613e4a896127106150ed565b90615173565b9050808281613e5b57fe5b0498975050505050505050565b6060600282511015613edb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f466c6172654c6962726172793a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b815167ffffffffffffffff81118015613ef357600080fd5b50604051908082528060200260200182016040528015613f1d578160200160208202803683370190505b5090508281600081518110613f2e57fe5b60200260200101818152505060005b6001835103811015613fc657600080613f8087868581518110613f5c57fe5b6020026020010151878660010181518110613f7357fe5b60200260200101516151e5565b91509150613fa2848481518110613f9357fe5b60200260200101518383613d4c565b848460010181518110613fb157fe5b60209081029190910101525050600101613f3d565b509392505050565b6000806000613fdd8585614c6d565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527fe21386787732ef8059a646602f85a5ebb23848cddd90ef5a8d111ec84a4cb71f609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017815292518251600094606094938a169392918291908083835b6020831061419757805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161415a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146141f9576040519150601f19603f3d011682016040523d82523d6000602084013e6141fe565b606091505b509150915081801561422c57508051158061422c575080806020019051602081101561422957600080fd5b50515b614281576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806153c76024913960400191505060405180910390fd5b505050505050565b60005b60018351038110156144f4576000808483815181106142a757fe5b60200260200101518584600101815181106142be57fe5b60200260200101519150915060006142d68383614c6d565b50905060008785600101815181106142ea57fe5b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161461433257826000614336565b6000835b91509150600060028a5103881061434d578861438e565b61438e7f00000000000000000000000019b85ae92947e0725d5265ffb3389e7e4f191fda878c8b6002018151811061438157fe5b6020026020010151613fce565b90506143bb7f00000000000000000000000019b85ae92947e0725d5265ffb3389e7e4f191fda8888613fce565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f84848460006040519080825280601f01601f191660200182016040528015614405576020820181803683370190505b506040518563ffffffff1660e01b8152600401808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561447a578181015183820152602001614462565b50505050905090810190601f1680156144a75780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156144c957600080fd5b505af11580156144dd573d6000803e3d6000fd5b50506001909901985061428c975050505050505050565b50505050565b606060028251101561456d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f466c6172654c6962726172793a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561458557600080fd5b506040519080825280602002602001820160405280156145af578160200160208202803683370190505b50905082816001835103815181106145c357fe5b602090810291909101015281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b8015613fc6576000806146238786600186038151811061460f57fe5b6020026020010151878681518110613f7357fe5b9150915061464584848151811061463657fe5b60200260200101518383614a77565b84600185038151811061465457fe5b602090810291909101015250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016145f3565b60005b6001835103811015613d47576000808483815181106146a657fe5b60200260200101518584600101815181106146bd57fe5b60200260200101519150915060006146d58383614c6d565b50905060006147057f00000000000000000000000019b85ae92947e0725d5265ffb3389e7e4f191fda8585613fce565b90506000806000808473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561475357600080fd5b505afa158015614767573d6000803e3d6000fd5b505050506040513d606081101561477d57600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905060008073ffffffffffffffffffffffffffffffffffffffff8a8116908916146147c75782846147ca565b83835b91509150614839828b73ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cd257600080fd5b9550614846868383613d4c565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161461488a5782600061488e565b6000835b91509150600060028c51038a106148a5578a6148d9565b6148d97f00000000000000000000000019b85ae92947e0725d5265ffb3389e7e4f191fda898e8d6002018151811061438157fe5b60408051600080825260208201928390527f022c0d9f000000000000000000000000000000000000000000000000000000008352602482018781526044830187905273ffffffffffffffffffffffffffffffffffffffff8086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015614989578181015183820152602001614971565b50505050905090810190601f1680156149b65780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156149d857600080fd5b505af11580156149ec573d6000803e3d6000fd5b50506001909b019a5061468b9950505050505050505050565b8082038281111561139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6000808411614ad1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061537c6028913960400191505060405180910390fd5b600083118015614ae15750600082115b614b36576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806153eb6024913960400191505060405180910390fd5b6000614b456127106019614a05565b90506000614b5f612710614b5987896150ed565b906150ed565b90506000614b7183614b59878a614a05565b9050614b886001828481614b8157fe5b0490615173565b979650505050505050565b6000808411614bed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806152ce6021913960400191505060405180910390fd5b600083118015614bfd5750600082115b614c52576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806153eb6024913960400191505060405180910390fd5b82614c5d85846150ed565b81614c6457fe5b04949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415614cf5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061535b6021913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610614d2f578284614d32565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216614db957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f466c6172654c6962726172793a205a45524f5f41444452455353000000000000604482015290519081900360640190fd5b9250929050565b600080600073ffffffffffffffffffffffffffffffffffffffff167f00000000000000000000000019b85ae92947e0725d5265ffb3389e7e4f191fda73ffffffffffffffffffffffffffffffffffffffff1663e6a439058a8a6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015614e8057600080fd5b505afa158015614e94573d6000803e3d6000fd5b505050506040513d6020811015614eaa57600080fd5b505173ffffffffffffffffffffffffffffffffffffffff161415614f9c577f00000000000000000000000019b85ae92947e0725d5265ffb3389e7e4f191fda73ffffffffffffffffffffffffffffffffffffffff1663c9c6539689896040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b158015614f6f57600080fd5b505af1158015614f83573d6000803e3d6000fd5b505050506040513d6020811015614f9957600080fd5b50505b600080614fca7f00000000000000000000000019b85ae92947e0725d5265ffb3389e7e4f191fda8b8b6151e5565b91509150816000148015614fdc575080155b15614fec578793508692506150e0565b6000614ff9898484614b93565b9050878111615066578581101561505b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806154366022913960400191505060405180910390fd5b8894509250826150de565b6000615073898486614b93565b90508981111561507f57fe5b878110156150d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806153166022913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806151085750508082028282828161510557fe5b04145b61139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b8082018281101561139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b60008060006151f48585614c6d565b509050600080615205888888613fce565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561524a57600080fd5b505afa15801561525e573d6000803e3d6000fd5b505050506040513d606081101561527457600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905073ffffffffffffffffffffffffffffffffffffffff878116908416146152bb5780826152be565b81815b9099909850965050505050505056fe466c6172654c6962726172793a20494e53554646494349454e545f414d4f554e54466c6172654c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54466c617265526f757465723a20494e53554646494349454e545f415f414d4f554e54466c617265526f757465723a204558434553534956455f494e5055545f414d4f554e54466c6172654c6962726172793a204944454e544943414c5f414444524553534553466c6172654c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c45445472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544466c6172654c6962726172793a20494e53554646494349454e545f4c4951554944495459466c617265526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e54466c617265526f757465723a20494e53554646494349454e545f425f414d4f554e54a264697066735822122012e68939a9da32e6ff6e7d6e000bd725520dc72623454bb69337f77c297649a164736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000019b85ae92947e0725d5265ffb3389e7e4f191fda000000000000000000000000acc15dc74880c9944775448304b263d191c6077f
-----Decoded View---------------
Arg [0] : _factory (address): 0x19B85ae92947E0725d5265fFB3389e7E4F191FDa
Arg [1] : _WETH (address): 0xAcc15dC74880C9944775448304B263D191c6077F
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000019b85ae92947e0725d5265ffb3389e7e4f191fda
Arg [1] : 000000000000000000000000acc15dc74880c9944775448304b263d191c6077f
Deployed Bytecode Sourcemap
14444:15800:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14853:10;:18;14867:4;14853:18;;14846:26;;;;14444:15800;;;;;18368:517;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18368:517:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;29404:214;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29404:214:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;24516:738;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24516:738:0;-1:-1:-1;24516:738:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30042:199;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30042:199:0;;-1:-1:-1;30042:199:0;;-1:-1:-1;;;;;30042:199:0:i;18889:613::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18889:613:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;22114:542::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22114:542:0;-1:-1:-1;22114:542:0;;;;;;;;;:::i;23796:716::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23796:716:0;-1:-1:-1;23796:716:0;;;;;;;;;:::i;20744:634::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20744:634:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;27168:607::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27168:607:0;-1:-1:-1;27168:607:0;;;;;;;;;:::i;28483:691::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28483:691:0;-1:-1:-1;28483:691:0;;;;;;;;;:::i;23184:608::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23184:608:0;-1:-1:-1;23184:608:0;;;;;;;;;:::i;29622:213::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29622:213:0;;;;;;;;;;;;:::i;22660:520::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22660:520:0;-1:-1:-1;22660:520:0;;;;;;;;;:::i;14568:38::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29210:190;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29210:190:0;;;;;;;;;;;;:::i;20194:546::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20194:546:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;27779:700::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27779:700:0;-1:-1:-1;27779:700:0;;;;;;;;;:::i;17611:753::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17611:753:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14524:41::-;;;;;;;;;;;;;:::i;29839:199::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29839:199:0;;-1:-1:-1;29839:199:0;;-1:-1:-1;;;;;29839:199:0:i;19506:617::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19506:617:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;16107:663::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16107:663:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;16774:802;;;;;;;;;;;;;;;;-1:-1:-1;16774:802:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25258:701::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25258:701:0;-1:-1:-1;25258:701:0;;;;;;;;;:::i;18368:517::-;18570:19;18591:17;18550:8;14668:15;14656:8;:27;;14648:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18641:104:::1;18659:5;18667:4;18674:9;18686:14;18703:12;18726:4;18734:8;18641:15;:104::i;:::-;18614:131:::0;;-1:-1:-1;18614:131:0;-1:-1:-1;18748:51:0::1;18776:5:::0;18783:2;18614:131;18748:27:::1;:51::i;:::-;18808:4;18802:20;;;18823:9;18802:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;18836:45;18867:2;18871:9;18836:30;:45::i;:::-;18368:517:::0;;;;;;;;;;:::o;29404:214::-;29527:17;29556:58;29582:8;29592:9;29603:10;29556:25;:58::i;:::-;29549:65;29404:214;-1:-1:-1;;;;29404:214:0:o;24516:738::-;24707:24;24687:8;14668:15;14656:8;:27;;14648:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24745:29:::1;24770:4;24745:29;:4:::0;;24750:15;;;24745:21;;::::1;;;;;;;;;;;;;:29;;;24737:67;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;24817:51;24844:7;24853:8;24863:4;;24817:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;24817:26:0::1;::::0;-1:-1:-1;;;24817:51:0:i:1;:::-;24807:61;;24912:12;24881:7;24906:1;24889:7;:14;:18;24881:27;;;;;;;;;;;;;;:43;;24871:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24974:120;25008:4;;25013:1;25008:7;;;;;;;;;;;;;;;25018:10;25031:47;25052:7;25061:4;;25066:1;25061:7;;;;;;;;;;;;;;;25070:4;;25075:1;25070:7;;;;;;;;;;;;;;;25031:20;:47::i;:::-;25081:7;25089:1;25081:10;;;;;;;;;;;;;;24974:31;:120::i;:::-;25097:35;25103:7;25112:4;;25097:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;25126:4:0::1;::::0;-1:-1:-1;25097:5:0::1;::::0;-1:-1:-1;;25097:35:0:i:1;:::-;25141:4;25135:20;;;25156:7;25181:1;25164:7;:14;:18;25156:27;;;;;;;;;;;;;;25135:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;25187:63;25218:2;25222:7;25247:1;25230:7;:14;:18;25222:27;;;;;;;;;;;;;;25187:30;:63::i;:::-;24516:738:::0;;;;;;;;;:::o;30042:199::-;30149:24;30186:51;30212:7;30221:9;30232:4;30186:25;:51::i;:::-;30179:58;;30042:199;;;;;:::o;18889:613::-;19142:15;19159;19179:12;19194:45;19215:7;19224:6;19232;19194:20;:45::i;:::-;19179:60;;19242:13;19258:10;:37;;19286:9;19258:37;;;19279:3;19258:37;19298:86;;;;;;19324:10;19298:86;;;;19345:4;19298:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19242:53;;-1:-1:-1;19298:23:0;;;;;;:86;;;;;-1:-1:-1;;19298:86:0;;;;;;;;-1:-1:-1;19298:23:0;:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19408:90;19426:6;19435;19444:9;19456:10;19469;19482:2;19487:8;19408:15;:90::i;:::-;19387:111;;;;;;;;18889:613;;;;;;;;;;;;;;;;:::o;22114:542::-;22308:24;22288:8;14668:15;14656:8;:27;;14648:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22348:51:::1;22375:7;22384:8;22394:4;;22348:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;22348:26:0::1;::::0;-1:-1:-1;;;22348:51:0:i:1;:::-;22338:61;;22443:12;22412:7;22437:1;22420:7;:14;:18;22412:27;;;;;;;;;;;;;;:43;;22402:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22505:120;22539:4;;22544:1;22539:7;;;;;;22505:120;22628:24;22634:7;22643:4;;22628:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;22649:2:0;;-1:-1:-1;22628:5:0::1;::::0;-1:-1:-1;;22628:24:0:i:1;23796:716::-:0;23987:24;23967:8;14668:15;14656:8;:27;;14648:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24025:29:::1;24050:4;24025:29;:4:::0;;24030:15;;;24025:21;;::::1;;;;;;;;;;;;;:29;;;24017:67;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;24097:51;24123:7;24132:9;24143:4;;24097:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;24097:25:0::1;::::0;-1:-1:-1;;;24097:51:0:i:1;:::-;24087:61;;24175:11;24161:7;24169:1;24161:10;;;;;;;;;;;;;;:25;;24151:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20744:634:::0;21017:17;21039:12;21054:42;21075:7;21084:5;21091:4;21054:20;:42::i;:::-;21039:57;;21099:13;21115:10;:37;;21143:9;21115:37;;;21136:3;21115:37;21155:86;;;;;;21181:10;21155:86;;;;21202:4;21155:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21099:53;;-1:-1:-1;21155:23:0;;;;;;:86;;;;;-1:-1:-1;;21155:86:0;;;;;;;;-1:-1:-1;21155:23:0;:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21256:118;21306:5;21314:9;21326:14;21343:12;21358:2;21363:8;21256:47;:118::i;:::-;21244:130;20744:634;-1:-1:-1;;;;;;;;;;;;;20744:634:0:o;27168:607::-;27367:8;14668:15;14656:8;:27;;14648:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27380:118:::1;27414:4;;27419:1;27414:7;;;;;;;;;;;;;;;27424:10;27437:47;27458:7;27467:4;;27472:1;27467:7;;;;;;;;;;;;;;;27476:4;;27481:1;27476:7;;;;;;27437:47;27487:8;27380:31;:118::i;:::-;27501:21;27537:4:::0;;27542:15;;;27537:21;;::::1;;;;;;;;;;;;;27525:44;;;27572:2;27525:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27525:52:0;27580:44:::1;::::0;;27525:52:::1;27580:44:::0;;::::1;::::0;;;;;;;;;;;27525:52;;-1:-1:-1;27580:44:0::1;::::0;;;27615:4;;;;;;27580:44;::::1;::::0;27615:4;;27580:44;27615:4;27580:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;27621:2:0;;-1:-1:-1;27580:34:0::1;::::0;-1:-1:-1;;27580:44:0:i:1;:::-;27712:12:::0;27637:71:::1;27692:13:::0;27649:4;;27654:15;;;27649:21;;::::1;;;;;;;;;;;;;27637:44;;;27682:2;27637:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27637:48:0;;:52:::1;:71::i;:::-;:87;;27627:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14711:1;27168:607:::0;;;;;;;:::o;28483:691::-;28679:8;14668:15;14656:8;:27;;14648:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28700:29:::1;28725:4;28700:29;:4:::0;;28705:15;;;28700:21;;::::1;;;;;;;;;;;;;:29;;;28692:67;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;28762:118;28796:4;;28801:1;28796:7;;;;;;28762:118;28883:55;28918:4;;28883:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;28932:4:0::1;::::0;-1:-1:-1;28883:34:0::1;::::0;-1:-1:-1;;28883:55:0:i:1;:::-;28941:17;28973:4;28961:27;;;28997:4;28961:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;28961:42:0;;-1:-1:-1;29016:25:0;;::::1;;29006:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29097:4;29091:20;;;29112:9;29091:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;29125:45;29156:2;29160:9;29125:30;:45::i;23184:608::-:0;23365:24;23345:8;14668:15;14656:8;:27;;14648:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23414:4:::1;23403:15;;:4;;23408:1;23403:7;;;;;;;;;;;;;;;:15;;;23395:53;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;23461:52;23488:7;23497:9;23508:4;;23461:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;23461:26:0::1;::::0;-1:-1:-1;;;23461:52:0:i:1;:::-;23451:62;;23557:12;23526:7;23551:1;23534:7;:14;:18;23526:27;;;;;;;;;;;;;;:43;;23516:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23625:4;23619:19;;;23647:7;23655:1;23647:10;;;;;;;;;;;;;;23619:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;23678:4;23672:20;;;23695:47;23716:7;23725:4;;23730:1;23725:7;;;;;;23695:47;23745:7;23753:1;23745:10;;;;;;;;;;;;;;23672:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;23672:86:0;23663:98:::1;;;;23764:24;23770:7;23779:4;;23764:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;23785:2:0;;-1:-1:-1;23764:5:0::1;::::0;-1:-1:-1;;23764:24:0:i:1;:::-;23184:608:::0;;;;;;;;:::o;29622:213::-;29745:16;29773:58;29798:9;29809;29820:10;29773:24;:58::i;22660:520::-;22854:24;22834:8;14668:15;14656:8;:27;;14648:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22894:51:::1;22920:7;22929:9;22940:4;;22894:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;22894:25:0::1;::::0;-1:-1:-1;;;22894:51:0:i:1;:::-;22884:61;;22972:11;22958:7;22966:1;22958:10;;;;;;;;;;;;;;:25;;22948:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14568:38:::0;;;:::o;29210:190::-;29322:15;29349:47;29368:7;29377:8;29387;29349:18;:47::i;20194:546::-;20420:17;20401:8;14668:15;14656:8;:27;;14648:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20458:104:::1;20476:5;20484:4;20491:9;20503:14;20520:12;20543:4;20551:8;20458:15;:104::i;:::-;20442:120;;;;;;20565:89;20595:5;20603:2;20620:5;20608:28;;;20645:4;20608:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20608:43:0;20565:27:::1;:89::i;:::-;20663:4;20657:20;;;20678:9;20657:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;20691:45;20722:2;20726:9;20691:30;:45::i;27779:700::-:0;27964:8;14668:15;14656:8;:27;;14648:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27996:4:::1;27985:15;;:4;;27990:1;27985:7;;;;;;;;;;;;;;;:15;;;27977:53;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;28033:16;28052:9;28033:28;;28070:4;28064:19;;;28092:8;28064:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;28121:4;28115:20;;;28138:47;28159:7;28168:4;;28173:1;28168:7;;;;;;28138:47;28188:8;28115:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;28115:84:0;28106:96:::1;;;;28205:21;28241:4:::0;;28246:15;;;28241:21;;::::1;;;;;;;;;;;;;28229:44;;;28276:2;28229:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;28229:52:0;28284:44:::1;::::0;;28229:52:::1;28284:44:::0;;::::1;::::0;;;;;;;;;;;28229:52;;-1:-1:-1;28284:44:0::1;::::0;;;28319:4;;;;;;28284:44;::::1;::::0;28319:4;;28284:44;28319:4;28284:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;28325:2:0;;-1:-1:-1;28284:34:0::1;::::0;-1:-1:-1;;28284:44:0:i:1;:::-;28416:12:::0;28341:71:::1;28396:13:::0;28353:4;;28358:15;;;28353:21;;::::1;;;;;;;;;;;;;28341:44;;;28386:2;28341:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;17611:753:::0;17822:15;17839;17802:8;14668:15;14656:8;:27;;14648:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17860:12:::1;17875:45;17896:7;17905:6;17913;17875:20;:45::i;:::-;17923:58;::::0;;;;;17953:10:::1;17923:58;::::0;::::1;::::0;:29:::1;::::0;::::1;:58:::0;;;;;;;;;;;;;;17860:60;;-1:-1:-1;17923:29:0;;::::1;::::0;:58;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;17923:29:0;:58;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;18047:25:0::1;::::0;;;;;:21:::1;:25:::0;;::::1;;::::0;::::1;::::0;;;18011:15:::1;::::0;;;18047:21;;::::1;::::0;::::1;::::0;:25;;;;;;;;;;;18011:15;18047:21;:25;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;18047:25:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;18047:25:0;-1:-1:-1;18076:14:0::1;18095:39;18119:6:::0;18127;18095:23:::1;:39::i;:::-;18075:59;;;18168:6;18158:16;;:6;:16;;;:60;;18201:7;18210;18158:60;;;18179:7;18188;18158:60;18137:81:::0;;-1:-1:-1;18137:81:0;-1:-1:-1;18229:21:0;;::::1;;18221:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18311:10;18300:7;:21;;18292:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14711:1;;;;17611:753:::0;;;;;;;;;;;:::o;14524:41::-;;;:::o;29839:199::-;29946:24;29983:51;30010:7;30019:8;30029:4;29983:26;:51::i;19506:617::-;19754:19;19775:17;19798:12;19813:42;19834:7;19843:5;19850:4;19813:20;:42::i;:::-;19798:57;;19858:13;19874:10;:37;;19902:9;19874:37;;;19895:3;19874:37;19914:86;;;;;;19940:10;19914:86;;;;19961:4;19914:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19858:53;;-1:-1:-1;19914:23:0;;;;;;:86;;;;;-1:-1:-1;;19914:86:0;;;;;;;;-1:-1:-1;19914:23:0;:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20030:89;20051:5;20059:9;20071:14;20088:12;20103:2;20108:8;20030:18;:89::i;:::-;20003:116;;;;-1:-1:-1;19506:617:0;-1:-1:-1;;;;;;;;;;;;;19506:617:0:o;16107:663::-;16349:15;16367;16385:17;16327:8;14668:15;14656:8;:27;;14648:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16431:94:::1;16447:6;16456;16465:14;16482;16499:10;16512;16431:13;:94::i;:::-;16410:115:::0;;-1:-1:-1;16410:115:0;-1:-1:-1;16528:12:0::1;16543:45;16564:7;16573:6:::0;16581;16543:20:::1;:45::i;:::-;16528:60;;16591:66;16623:6;16631:10;16643:4;16649:7;16591:31;:66::i;:::-;16660;16692:6;16700:10;16712:4;16718:7;16660:31;:66::i;:::-;16752:4;16741:21;;;16763:2;16741:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;16741:25:0;16107:663;;;;-1:-1:-1;16741:25:0;;-1:-1:-1;16107:663:0;;-1:-1:-1;;;;;;;;;16107:663:0:o;16774:802::-;16995:19;17017:17;17037;16973:8;14668:15;14656:8;:27;;14648:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17089:96:::1;17105:5;17113:4;17120:18;17141:9;17153:14;17170:12;17089:13;:96::i;:::-;17062:123:::0;;-1:-1:-1;17062:123:0;-1:-1:-1;17188:12:0::1;17203:42;17224:7;17233:5:::0;17240:4:::1;17203:20;:42::i;:::-;17188:57;;17248:69;17280:5;17287:10;17299:4;17305:11;17248:31;:69::i;:::-;17326:4;17320:19;;;17348:9;17320:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;17376:4;17370:20;;;17391:4;17397:9;17370:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;17370:37:0;17363:45:::1;;;;17434:4;17423:21;;;17445:2;17423:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;17423:25:0;;-1:-1:-1;17483:9:0::1;:21:::0;-1:-1:-1;17479:93:0::1;;;17507:65;17538:10;17562:9;17550;:21;17507:30;:65::i;:::-;14711:1;16774:802:::0;;;;;;;;;;;:::o;25258:701::-;25436:24;25416:8;14668:15;14656:8;:27;;14648:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25485:4:::1;25474:15;;:4;;25479:1;25474:7;;;;;;;;;;;;;;;:15;;;25466:53;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;25532:51;25558:7;25567:9;25578:4;;25532:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;25532:25:0::1;::::0;-1:-1:-1;;;25532:51:0:i:1;:::-;25522:61;;25608:9;25594:7;25602:1;25594:10;;;;;;;;;;;;;;:23;;25586:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25666:4;25660:19;;;25688:7;25696:1;25688:10;;;;;;;;;;;;;;25660:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;25719:4;25713:20;;;25736:47;25757:7;25766:4;;25771:1;25766:7;;;;;;25736:47;25786:7;25794:1;25786:10;;;;;;;;;;;;;;25713:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;25713:86:0;25704:98:::1;;;;25805:24;25811:7;25820:4;;25805:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;25826:2:0;;-1:-1:-1;25805:5:0::1;::::0;-1:-1:-1;;25805:24:0:i:1;:::-;25876:7;25884:1;25876:10;;;;;;;;;;;;;;25864:9;:22;25860:95;;;25889:66;25920:10;25944:7;25952:1;25944:10;;;;;;;;;;;;;;25932:9;:22;25889:30;:66::i;7747:351::-:0;7937:45;;;7924:10;7937:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7924:61;;;;7889:12;;7903:17;;7924:10;;;;7937:45;7924:61;;;7937:45;7924:61;;7937:45;7924:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7888:97;;;;7998:7;:57;;;;-1:-1:-1;8010:11:0;;:16;;:44;;;8041:4;8030:24;;;;;;;;;;;;;;;-1:-1:-1;8030:24:0;8010:44;7988:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7747:351;;;;;:::o;8499:180::-;8604:12;;;8564;8604;;;;;;;;;8581:7;;;;8597:5;;8581:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8563:54;;;8628:7;8620:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8499:180;;;:::o;4997:535::-;5105:17;5146:1;5135:8;:12;5127:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5216:1;5204:9;:13;:31;;;;;5234:1;5221:10;:14;5204:31;5194:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5282:14;5299:22;5307:5;5318:2;5299:18;:22::i;:::-;5282:39;-1:-1:-1;5324:23:0;5350:20;:8;5282:39;5350:12;:20::i;:::-;5324:46;-1:-1:-1;5373:17:0;5393:31;5324:46;5413:10;5393:19;:31::i;:::-;5373:51;-1:-1:-1;5427:19:0;5449:41;5474:15;5449:20;:9;5463:5;5449:13;:20::i;:::-;:24;;:41::i;:::-;5427:63;;5517:11;5505:9;:23;;;;;;;4997:535;-1:-1:-1;;;;;;;;4997:535:0:o;6214:469::-;6324:24;6376:1;6361:4;:11;:16;;6353:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6435:4;:11;6421:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6421:26:0;;6411:36;;6463:8;6450:7;6458:1;6450:10;;;;;;;;;;;;;:21;;;;;6479:9;6474:206;6508:1;6494:4;:11;:15;6490:1;:19;6474:206;;;6520:17;6539:18;6561:48;6575:7;6585:4;6590:1;6585:7;;;;;;;;;;;;;;6595:4;6600:1;6604;6600:5;6595:11;;;;;;;;;;;;;;6561;:48::i;:::-;6519:90;;;;6629:47;6642:7;6650:1;6642:10;;;;;;;;;;;;;;6654:9;6665:10;6629:12;:47::i;:::-;6612:7;6620:1;6624;6620:5;6612:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;6511:3:0;;6474:206;;;;6214:469;;;;;:::o;3651:385::-;3746:12;3764:14;3780;3798:26;3809:6;3817;3798:10;:26::i;:::-;3915:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3905:43;;;;;;3866:157;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3854:172;;;;;;;;;3651:385;-1:-1:-1;;;;;3651:385:0:o;8102:393::-;8323:51;;;8310:10;8323:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8310:67;;;;8275:12;;8289:17;;8310:10;;;;8323:51;8310:67;;;8323:51;8310:67;;8323:51;8310:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8274:103;;;;8390:7;:57;;;;-1:-1:-1;8402:11:0;;:16;;:44;;;8433:4;8422:24;;;;;;;;;;;;;;;-1:-1:-1;8422:24:0;8402:44;8380:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8102:393;;;;;;:::o;21477:633::-;21585:9;21580:527;21614:1;21600:4;:11;:15;21596:1;:19;21580:527;;;21626:13;21641:14;21660:4;21665:1;21660:7;;;;;;;;;;;;;;21669:4;21674:1;21678;21674:5;21669:11;;;;;;;;;;;;;;21625:56;;;;21685:14;21704:38;21728:5;21735:6;21704:23;:38::i;:::-;21684:58;;;21745:17;21765:7;21773:1;21777;21773:5;21765:14;;;;;;;;;;;;;;21745:34;;21783:18;21803;21834:6;21825:15;;:5;:15;;;:69;;21872:9;21891:1;21825:69;;;21853:1;21857:9;21825:69;21782:112;;;;21897:10;21928:1;21914:4;:11;:15;21910:1;:19;:80;;21987:3;21910:80;;;21933:50;21954:7;21963:6;21971:4;21976:1;21980;21976:5;21971:11;;;;;;;;;;;;;;21933:20;:50::i;:::-;21897:93;;22004:44;22025:7;22034:5;22041:6;22004:20;:44::i;:::-;21993:61;;;22057:10;22070;22083:2;22098:1;22088:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22088:12:0;;21993:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21617:3:0;;;;;-1:-1:-1;21580:527:0;;-1:-1:-1;;;;;;;;21580:527:0;;;21477:633;;;:::o;6756:490::-;6866:24;6918:1;6903:4;:11;:16;;6895:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6977:4;:11;6963:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6963:26:0;;6953:36;;7022:9;6992:7;7017:1;7000:7;:14;:18;6992:27;;;;;;;;;;;;;;;;;:39;7051:11;;:15;;7034:209;7068:5;;7034:209;;7084:17;7103:18;7125:48;7139:7;7149:4;7158:1;7154;:5;7149:11;;;;;;;;;;;;;;7163:4;7168:1;7163:7;;;;;;;7125:48;7083:90;;;;7193:46;7205:7;7213:1;7205:10;;;;;;;;;;;;;;7217:9;7228:10;7193:11;:46::i;:::-;7176:7;7188:1;7184;:5;7176:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;7075:3:0;;7034:209;;26094:1070;26204:9;26199:962;26233:1;26219:4;:11;:15;26215:1;:19;26199:962;;;26245:13;26260:14;26279:4;26284:1;26279:7;;;;;;;;;;;;;;26288:4;26293:1;26297;26293:5;26288:11;;;;;;;;;;;;;;26244:56;;;;26304:14;26323:38;26347:5;26354:6;26323:23;:38::i;:::-;26303:58;;;26364:15;26395:44;26416:7;26425:5;26432:6;26395:20;:44::i;:::-;26364:78;;26445:19;26467:20;26537:16;26555;26576:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26576:18:0;;;;;;;26536:58;;;;;-1:-1:-1;26536:58:0;;-1:-1:-1;26598:20:0;;26645:15;;;;;;;;:63;;26689:8;26699;26645:63;;;26665:8;26675;26645:63;26597:111;;;;26725:65;26775:12;26737:5;26725:28;;;26762:4;26725:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:65;26711:79;;26808:73;26836:11;26850:12;26865:13;26808:25;:73::i;:::-;26793:88;;26199:962;;;;26890:18;26910;26941:6;26932:15;;:5;:15;;;:75;;26982:12;27004:1;26932:75;;;26960:1;26964:12;26932:75;26889:118;;;;27010:10;27041:1;27027:4;:11;:15;27023:1;:19;:80;;27100:3;27023:80;;;27046:50;27067:7;27076:6;27084:4;27089:1;27093;27089:5;27084:11;;;;;;;27046:50;27144:12;;;27154:1;27144:12;;;;;;;;;;27106:51;;;;;;;;;;;;;;;:9;:51;;;;;;;;;;;;;;;;;;;;;;27010:93;;-1:-1:-1;27106:9:0;;;;;;27116:10;;27128;;27010:93;;27144:12;;27106:51;;;;;;;;27144:12;;27106:51;;;;27144:12;;27106:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26236:3:0;;;;;-1:-1:-1;26199:962:0;;-1:-1:-1;;;;;;;;;;26199:962:0;2813:126;2898:5;;;2893:16;;;;2885:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5645:495;5753:16;5794:1;5782:9;:13;5774:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5865:1;5853:9;:13;:31;;;;;5883:1;5870:10;:14;5853:31;5843:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5931:14;5948:22;5956:5;5967:2;5948:18;:22::i;:::-;5931:39;-1:-1:-1;5973:17:0;5993:35;6022:5;5993:24;:9;6007;5993:13;:24::i;:::-;:28;;:35::i;:::-;5973:55;-1:-1:-1;6031:19:0;6053:37;6083:6;6053:25;:10;6068:9;6053:14;:25::i;:37::-;6031:59;;6104:32;6134:1;6117:11;6105:9;:23;;;;;;;6104:29;:32::i;:::-;6093:43;5645:495;-1:-1:-1;;;;;;;5645:495:0:o;4575:308::-;4672:15;4710:1;4700:7;:11;4692:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4773:1;4762:8;:12;:28;;;;;4789:1;4778:8;:12;4762:28;4752:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4871:8;4847:21;:7;4859:8;4847:11;:21::i;:::-;:32;;;;;;;4575:308;-1:-1:-1;;;;4575:308:0:o;3248:319::-;3326:14;3342;3380:6;3370:16;;:6;:16;;;;3362:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3455:6;3446:15;;:6;:15;;;:55;;3486:6;3494;3446:55;;;3466:6;3474;3446:55;3427:74;;-1:-1:-1;3427:74:0;-1:-1:-1;3512:20:0;;;3504:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3248:319;;;;;:::o;14963:1140::-;15141:15;15158;15284:1;15226:60;;15240:7;15226:30;;;15257:6;15265;15226:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15226:46:0;:60;;;15222:122;;;15305:7;15291:33;;;15325:6;15333;15291:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15222:122:0;15347:16;15365;15385:55;15412:7;15422:6;15431;15385:24;:55::i;:::-;15346:94;;;;15447:8;15459:1;15447:13;:30;;;;-1:-1:-1;15464:13:0;;15447:30;15443:657;;;15504:14;;-1:-1:-1;15520:14:0;;-1:-1:-1;15443:657:0;;;15548:22;15573:60;15594:14;15611:8;15622;15573:18;:60::i;:::-;15548:85;;15658:14;15640;:32;15636:461;;15705:10;15687:14;:28;;15677:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15782:14;;-1:-1:-1;15798:14:0;-1:-1:-1;15798:14:0;15636:461;;;15826:22;15851:60;15872:14;15889:8;15900;15851:18;:60::i;:::-;15826:85;;15939:14;15921;:32;;15914:40;;;;15985:10;15967:14;:28;;15957:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16062:14;-1:-1:-1;16078:14:0;;-1:-1:-1;15636:461:0;15443:657;;14963:1140;;;;;;;;;;;:::o;2943:139::-;3001:9;3023:6;;;:30;;-1:-1:-1;;3038:5:0;;;3052:1;3047;3038:5;3047:1;3033:15;;;;;:20;3023:30;3015:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2684:125;2769:5;;;2764:16;;;;2756:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4086:384;4185:16;4203;4225:14;4244:26;4255:6;4263;4244:10;:26::i;:::-;4224:46;;;4274:16;4292;4327:32;4335:7;4344:6;4352;4327:7;:32::i;:::-;4314:60;;;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4314:62:0;;;;;;;4273:103;;;;;-1:-1:-1;4273:103:0;;-1:-1:-1;4402:16:0;;;;;;;;:64;;4447:8;4457;4402:64;;;4423:8;4433;4402:64;4379:87;;;;-1:-1:-1;4086:384:0;-1:-1:-1;;;;;;;4086:384:0:o
Swarm Source
ipfs://12e68939a9da32e6ff6e7d6e000bd725520dc72623454bb69337f77c297649a1
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in GLMR
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.