More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 33 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Withdraw ETH | 7621094 | 1896 days ago | IN | 0 ETH | 0.00017095 | ||||
Deposit ETH | 7621090 | 1896 days ago | IN | 0.00553732 ETH | 0.00023914 | ||||
Withdraw ETH | 7588532 | 1901 days ago | IN | 0 ETH | 0.00017095 | ||||
Deposit ETH | 7588482 | 1901 days ago | IN | 0.001 ETH | 0.00042232 | ||||
Limit Order | 7538115 | 1909 days ago | IN | 0 ETH | 0.00064278 | ||||
Deposit Withdraw... | 7537972 | 1909 days ago | IN | 0 ETH | 0.00027257 | ||||
Deposit ETH | 7537829 | 1909 days ago | IN | 0.001 ETH | 0.00039858 | ||||
Limit Order | 7537757 | 1909 days ago | IN | 0 ETH | 0.00040708 | ||||
Deposit Withdraw... | 7537727 | 1909 days ago | IN | 0 ETH | 0.00036383 | ||||
Set Product Info | 7537699 | 1909 days ago | IN | 0 ETH | 0.00009055 | ||||
Add Product | 7537615 | 1909 days ago | IN | 1 wei | 0.00029319 | ||||
Set Product Fee | 7537246 | 1909 days ago | IN | 0 ETH | 0.00013725 | ||||
Add Owner | 7528319 | 1911 days ago | IN | 0 ETH | 0.00018337 | ||||
Deposit ETH | 7464234 | 1921 days ago | IN | 0.01 ETH | 0.00012943 | ||||
Deposit ETH | 7464233 | 1921 days ago | IN | 0 ETH | 0.00018943 | ||||
Set Taker Fee Ra... | 7464229 | 1921 days ago | IN | 0 ETH | 0.00008531 | ||||
Set Product Fee | 7464229 | 1921 days ago | IN | 0 ETH | 0.00008554 | ||||
Set Product Info | 7464227 | 1921 days ago | IN | 0 ETH | 0.00005934 | ||||
Set Product Info | 7464225 | 1921 days ago | IN | 0 ETH | 0.00005947 | ||||
Set Product Info | 7464096 | 1921 days ago | IN | 0 ETH | 0.00005947 | ||||
Set Product Info | 7464087 | 1921 days ago | IN | 0 ETH | 0.00005947 | ||||
Set Product Info | 7463816 | 1921 days ago | IN | 0 ETH | 0.00005947 | ||||
Set Product Info | 7463802 | 1921 days ago | IN | 0 ETH | 0.0000892 | ||||
Add Owner | 7463768 | 1921 days ago | IN | 0 ETH | 0.00027505 | ||||
Add Product | 7463750 | 1921 days ago | IN | 0 ETH | 0.00023654 |
Loading...
Loading
Contract Name:
DEX
Compiler Version
v0.4.25+commit.59dbf8f1
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2019-03-29 */ pragma solidity ^0.4.25; /* * @title: SafeMath * @dev: Helper contract functions to arithmatic operations safely. */ contract SafeMath { function Sub(uint128 a, uint128 b) pure public returns (uint128) { assert(b <= a); return a - b; } function Add(uint128 a, uint128 b) pure public returns (uint128) { uint128 c = a + b; assert(c>=a && c>=b); return c; } } /* * @title: Token * @dev: Interface contract for ERC20 tokens */ contract Token { function totalSupply() public view returns (uint256 supply); function balanceOf(address _owner) public view returns (uint256 balance); function transfer(address _to, uint256 _value) public returns (bool success); function transferFrom(address _from, address _to, uint256 _value) public returns (bool success); function approve(address _spender, uint256 _value) public returns (bool success); function allowance(address _owner, address _spender) public view returns (uint256 remaining); event Transfer(address indexed _from, address indexed _to, uint256 _value); event Approval(address indexed _owner, address indexed _spender, uint256 _value); } /* * @title: Dex * @author Dexhigh Services Pvt. Ltd (https://www.dexhigh.com) * @dev The Dex Contract implement all the required functionalities viz order sharing, local exchange etc. */ contract DEX is SafeMath { uint32 public lastTransferId = 1; // Events event NewDeposit(uint32 indexed exId, uint32 prCode, uint32 indexed accountId, uint128 amount, uint64 timestamp, uint32 lastTransferId); event NewWithdraw(uint32 indexed exId, uint32 prCode, uint32 indexed accountId, uint128 amount, uint64 timestamp, uint32 lastTransferId); uint32 public lastNewOrderId = 1; event NewOrder(uint32 indexed prTrade, uint32 indexed prBase, uint32 indexed accountId, uint32 id, bool isSell, uint80 price, uint104 qty, uint32 lastNewOrderId); event NewCancel(uint32 indexed prTrade, uint32 indexed prBase, uint32 indexed accountId, uint32 id, bool isSell, uint80 price, uint104 qt, uint32 lastNewOrderId); event NewBestBidAsk(uint32 indexed prTrade, uint32 indexed prBase, bool isBid, uint80 price); uint32 public lastTradeId = 1; event NewTrade(uint32 indexed prTrade, uint32 prBase, uint32 indexed bidId, uint32 indexed askId, uint32 accountIdBid, uint32 accountIdAsk, bool isSell, uint80 price, uint104 qty, uint32 lastTradeId, uint64 timestamp); // basePrice, All the prices will be "based" by basePrice uint256 public constant basePrice = 10000000000; uint80 public constant maxPrice = 10000000000000000000001; uint104 public constant maxQty = 1000000000000000000000000000001; uint128 public constant maxBalance = 1000000000000000000000000000000000001; bool public isContractUse = true; //No Args constructor will add msg.sender as owner/operator // Add ETH product constructor() public { owner = msg.sender; operator = owner; AddOwner(msg.sender); AddProduct(18, 0x0); //lastProductId = 1; // productId == 1 -> ETH 0x0 } address public owner; // Functions with this modifier can only be executed by the owner modifier onlyOwner() { require(msg.sender == owner); _; } address public operator; // Functions with this modifier can only be executed by the operator modifier onlyOperator() { require(msg.sender == operator); _; } function transferOperator(address _operator) onlyOwner public { operator = _operator; } // Functions with this modifier can only be executed by the owner of each exchange modifier onlyExOwner() { require(owner_id[msg.sender] != 0); _; } // Functions with this modifier can only be executed when this contract is not abandoned modifier onlyContractUse { require(isContractUse == true); _; } uint32 public lastOwnerId; mapping (uint32 => address) id_owner; mapping (address => uint32) owner_id; mapping (uint32 => uint8) ownerId_takerFeeRateLocal; mapping (uint32 => uint32) ownerId_accountId; //Delete the owner of exchange function DeleteOwner(uint32 exId) onlyOperator public { require(lastOwnerId >= exId && exId > 0); owner_id[id_owner[exId]] = 0; } //Add Owner of exchange function AddOwner(address newOwner) onlyOperator public { require(owner_id[newOwner] == 0); owner_id[newOwner] = ++lastOwnerId; id_owner[lastOwnerId] = newOwner; ownerId_accountId[lastOwnerId] = FindOrAddAccount(); } //Get exchange owner list and id function GetOwnerList() view public returns (address[] owners, uint32[] ownerIds) { owners = new address[](lastOwnerId); ownerIds = new uint32[](lastOwnerId); for (uint32 i = 1; i <= lastOwnerId; i++) { owners[i - 1] = id_owner[i]; ownerIds[i - 1] = i; } } //Set local exchange fee function setTakerFeeRateLocal(uint8 _takerFeeRate) public { require (_takerFeeRate <= 100);// takerFeeRate cannot be more than 1% uint32 ownerId = owner_id[msg.sender]; require(ownerId != 0); ownerId_takerFeeRateLocal[ownerId] = _takerFeeRate;//bp } // Get fee Rate for an exchange with owner id == ownerId function getTakerFeeRateLocal(uint32 ownerId) public view returns (uint8) { return ownerId_takerFeeRateLocal[ownerId];//bp } //Air Drop events function airDrop(uint32 exId, uint32 prCode, uint32[] accountIds, uint104[] qtys) onlyExOwner public { uint32 accountId = FindOrRevertAccount(); require(accountId_freeze[accountId] == false); uint256 n = accountIds.length; require(n == qtys.length); uint128 sum = 0; for (uint32 i = 0; i < n; i++) { sum += qtys[i]; } exId_prCode_AccountId_Balance[exId][prCode][accountId].available = Sub(exId_prCode_AccountId_Balance[exId][prCode][accountId].available, sum); for (i = 0; i < n; i++) { exId_prCode_AccountId_Balance[exId][prCode][accountIds[i]].available += qtys[i]; // exId_prCode_AccountId_Balance[exId][prCode][accountIds[i]].available >> qtys[i] // 2^128 >> 2^104 -> minimum 2^24 times of airdrop need for overflow (hard to imagine) // because prCode_AccountId_Balance[prCode][accountIds[i]].available restircted by maxBalance in deposit function } } //information of product struct ProductInfo { uint256 divider; bool isTradeBid; bool isTradeAsk; bool isDeposit; bool isWithdraw; uint32 ownerId; uint104 minQty; } uint32 public lastProductId; uint256 public newProductFee; mapping (uint32 => address) prCode_product; mapping (address => uint32) product_prCode; mapping (uint32 => ProductInfo) prCode_productInfo; // Add product by exchange owner function AddProduct(uint256 decimals, address product) payable onlyExOwner public { require(msg.value >= newProductFee || msg.sender == operator); require(product_prCode[product] == 0); require(decimals <= 18); product_prCode[product] = ++lastProductId; prCode_product[lastProductId] = product; ProductInfo memory productInfo; productInfo.divider = 10 ** decimals; // max = 10 ^ 18 because of require(decimals <= 18); productInfo.ownerId = owner_id[msg.sender]; prCode_productInfo[lastProductId] = productInfo; exId_prCode_AccountId_Balance[1][1][ownerId_accountId[1]].available += uint128(msg.value); //eth transfer < 2^128 } // Set Product Information function SetProductInfo(uint32 prCode, bool isTradeBid, bool isTradeAsk, bool isDeposit, bool isWithdraw, uint104 _minQty, uint32 exId) public { ProductInfo storage prInfo = prCode_productInfo[prCode]; require(msg.sender == operator || owner_id[msg.sender] == prInfo.ownerId ); prInfo.isTradeBid = isTradeBid; prInfo.isTradeAsk = isTradeAsk; prInfo.isDeposit = isDeposit; prInfo.isWithdraw = isWithdraw; prInfo.minQty = _minQty; prInfo.ownerId = exId; } // Set product listing fee function SetProductFee(uint256 productFee) onlyOperator public { newProductFee = productFee; } // Get product address and id function GetProductList() view public returns (address[] products, uint32[] productIds) { products = new address[](lastProductId); productIds = new uint32[](lastProductId); for (uint32 i = 1; i <= lastProductId; i++) { products[i - 1] = prCode_product[i]; productIds[i - 1] = i; } } // Get infromation of product function GetProductInfo(address product) view public returns (uint32 prCode, uint256 divider, bool isTradeBid, bool isTradeAsk, bool isDeposit, bool isWithdraw, uint32 ownerId, uint104 minQty) { prCode = product_prCode[product]; divider = prCode_productInfo[prCode].divider; isTradeBid = prCode_productInfo[prCode].isTradeBid; isTradeAsk = prCode_productInfo[prCode].isTradeAsk; isDeposit = prCode_productInfo[prCode].isDeposit; isWithdraw = prCode_productInfo[prCode].isWithdraw; ownerId = prCode_productInfo[prCode].ownerId; minQty = prCode_productInfo[prCode].minQty; } uint32 public lastAcccountId; mapping (uint32 => uint8) id_announceLV; //Each announceLV open information as //0: None, 1: Trade, 2:Balance, 3:DepositWithdrawal, 4:OpenOrder mapping (uint32 => address) id_account; mapping (uint32 => bool) accountId_freeze; mapping (address => uint32) account_id; // Find or add account function FindOrAddAccount() private returns (uint32) { if (account_id[msg.sender] == 0) { account_id[msg.sender] = ++lastAcccountId; id_account[lastAcccountId] = msg.sender; } return account_id[msg.sender]; } // Find or revert account function FindOrRevertAccount() private view returns (uint32) { uint32 accountId = account_id[msg.sender]; require(accountId != 0); return accountId; } // Get account id of msg sender function GetMyAccountId() view public returns (uint32) { return account_id[msg.sender]; } // Get account id of any users function GetAccountId(address account) view public returns (uint32) { return account_id[account]; } // Get account announcement level function GetMyAnnounceLV() view public returns (uint32) { return id_announceLV[account_id[msg.sender]]; } // Set account announce level function ChangeAnnounceLV(uint8 announceLV) public { id_announceLV[FindOrRevertAccount()] = announceLV; } // Freeze or unfreez of account function SetFreezeByAddress(bool isFreeze, address account) onlyOperator public { uint32 accountId = account_id[account]; if (accountId != 0) { accountId_freeze[accountId] = isFreeze; } } // reserved: Balance held up in orderBook // available: Balance available for trade struct Balance { uint128 reserved; uint128 available; } struct ListItem { uint32 prev; uint32 next; } struct OrderLink { uint32 firstId; uint32 lastId; uint80 nextPrice; uint80 prevPrice; mapping (uint32 => ListItem) id_orderList; } struct Order { uint32 exId; uint32 accountId; uint32 prTrade; uint32 prBase; uint104 qty; uint80 price; bool isSell; } uint32 public lastOrderId; mapping (uint32 => Order) id_Order; //orderbook information struct OrderBook { uint8 tickSize; uint80 bestBidPrice; uint80 bestAskPrice; mapping (uint80 => OrderLink) bidPrice_Order; mapping (uint80 => OrderLink) askPrice_Order; } mapping (uint32 => mapping (uint32 => OrderBook)) basePID_tradePID_orderBook; function SetOrderBookTickSize(uint32 prTrade, uint32 prBase, uint8 _tickSize) onlyOperator public { basePID_tradePID_orderBook[prBase][prTrade].tickSize = _tickSize; } mapping (uint32 => mapping (uint32 => mapping (uint32 => Balance))) exId_prCode_AccountId_Balance; // open order list struct OpenOrder { uint32 startId; mapping(uint32 => ListItem) id_orderList; } mapping(uint32 => OpenOrder) accountId_OpenOrder; function AddOpenOrder(uint32 accountId, uint32 orderId) private { OpenOrder memory openOrder = accountId_OpenOrder[accountId]; if (openOrder.startId != 0) { accountId_OpenOrder[accountId].id_orderList[openOrder.startId].prev = orderId; accountId_OpenOrder[accountId].id_orderList[orderId].next = openOrder.startId; } accountId_OpenOrder[accountId].startId = orderId; } function RemoveOpenOrder(uint32 accountId, uint32 orderId) private { OpenOrder memory openOrder = accountId_OpenOrder[accountId]; uint32 nextId = accountId_OpenOrder[accountId].id_orderList[orderId].next; uint32 prevId = accountId_OpenOrder[accountId].id_orderList[orderId].prev; if (nextId != 0) { accountId_OpenOrder[accountId].id_orderList[nextId].prev = prevId; } if (prevId != 0) { accountId_OpenOrder[accountId].id_orderList[prevId].next = nextId; } if (openOrder.startId == orderId) { accountId_OpenOrder[accountId].startId = nextId; } } //withdrawal and deposit record (DW records) struct DWrecord { uint32 prCode; bool isDeposit; uint128 qty; uint64 timestamp; } struct DWrecords { uint32 N; mapping (uint32 => DWrecord) N_DWrecord; } mapping (uint32 => mapping (uint32 => DWrecords)) exId_AccountId_DWrecords; //record deposit and withdrawal function RecordDW(uint32 exId, uint32 accountId, uint32 prCode, bool isDeposit, uint128 qty) private { DWrecord memory dW; dW.isDeposit = isDeposit; dW.prCode = prCode; dW.qty = qty; dW.timestamp = uint64(now); exId_AccountId_DWrecords[exId][accountId].N_DWrecord[++exId_AccountId_DWrecords[exId][accountId].N] = dW; if (isDeposit == true) emit NewDeposit(exId, prCode, accountId, qty, dW.timestamp, lastTransferId++); else emit NewWithdraw(exId, prCode, accountId, qty, dW.timestamp, lastTransferId++); } // returns 'N', DW records with account id, accountId, for exchange id, exId function GetDWrecords(uint32 N, uint32 exId, uint32 accountId) view public returns (uint32[] prCode, bool[] isDeposit, uint128[] qty, uint64[] timestamp) { checkAnnounceLV(accountId, 3); DWrecords storage dWrecords = exId_AccountId_DWrecords[exId][accountId]; uint32 n = dWrecords.N; if (n > N) n = N; prCode = new uint32[](n); isDeposit = new bool[](n); qty = new uint128[](n); timestamp = new uint64[](n); for (uint32 i = dWrecords.N; i > dWrecords.N - n; i--) { N = dWrecords.N - i; prCode[N] = dWrecords.N_DWrecord[i].prCode; isDeposit[N] = dWrecords.N_DWrecord[i].isDeposit; qty[N] = dWrecords.N_DWrecord[i].qty; timestamp[N] = dWrecords.N_DWrecord[i].timestamp; } } //Deposit ETH to exchange function depositETH(uint32 exId) payable onlyContractUse public { require(exId <= lastOwnerId); uint32 accountId = FindOrAddAccount(); exId_prCode_AccountId_Balance[exId][1][accountId].available = Add(exId_prCode_AccountId_Balance[exId][1][accountId].available, uint128(msg.value)); RecordDW(exId, accountId, 1, true, uint104(msg.value)); } // Withdraw ETH from exchange function withdrawETH(uint32 exId, uint104 amount) public { uint32 accountId = FindOrRevertAccount(); require(accountId_freeze[accountId] == false); exId_prCode_AccountId_Balance[exId][1][accountId].available = Sub(exId_prCode_AccountId_Balance[exId][1][accountId].available, amount); require(msg.sender.send(amount)); RecordDW(exId, accountId, 1, false, amount); } // Deposit/Withdraw, ERC20's to exchange function depositWithdrawToken(uint32 exId, uint128 amount, bool isDeposit, address prAddress) public { uint32 prCode = product_prCode[prAddress]; require(amount < maxBalance && prCode != 0); uint32 accountId = FindOrAddAccount(); require(accountId_freeze[accountId] == false); if (isDeposit == true) { require(prCode_productInfo[prCode].isDeposit == true && isContractUse == true && exId <= lastOwnerId); require(Token(prAddress).transferFrom(msg.sender, this, amount)); exId_prCode_AccountId_Balance[exId][prCode][accountId].available = Add(exId_prCode_AccountId_Balance[exId][prCode][accountId].available, amount); require (exId_prCode_AccountId_Balance[exId][prCode][accountId].available < maxBalance); } else { require(prCode_productInfo[prCode].isWithdraw == true); exId_prCode_AccountId_Balance[exId][prCode][accountId].available = Sub(exId_prCode_AccountId_Balance[exId][prCode][accountId].available, amount); require(Token(prAddress).transfer(msg.sender, amount)); } RecordDW(exId, accountId, prCode, isDeposit, amount); } // This function will be never used in normal situations. // This function is only prepared for emergency case such as smart contract hacking Vulnerability or smart contract abolishment // Withdrawn fund by this function cannot belong to any exchange operators or owners. // Withdrawn fund should be distributed to individual accounts having original ownership of withdrawn fund. // After using this function, this contract cannot get any deposit or trade. // After using this function, this contract will be abolished. function emergencyWithdrawal(uint32 prCode, uint256 amount) onlyOwner public { isContractUse = false;//This cannot be return. After activating this, this contract cannot support any deposit or trade function. if (prCode == 1) require(msg.sender.send(amount)); else Token(prCode_product[prCode]).transfer(msg.sender, amount); } // Find tick size of each price function GetNextTick(bool isAsk, uint80 price, uint8 n) public pure returns (uint80) { if (price > 0) { uint80 tick = GetTick(price, n); if (isAsk == true) return (((price - 1) / tick) + 1) * tick; else return (price / tick) * tick; } else { return price; } } function GetTick(uint80 price, uint8 n) public pure returns (uint80) { if (n < 1) n = 1; uint80 x = 1; for (uint8 i=1; i <= n / 2; i++) { x *= 10; } if (price < 10 * x) return 1; else { uint80 tick = 10000; uint80 priceTenPercent = price / 10 / x; while (priceTenPercent > tick) { tick *= 10; } while (priceTenPercent < tick) { tick /= 10; } if (n % 2 == 1) { if (price >= 50 * tick * x) { tick *= 5; } } else { if (price < 50 * tick * x) { tick *= 5; } else { tick *= 10; } } return tick; } } // New limit order function LimitOrder(uint32 exId, uint32 prTrade, uint32 prBase, bool isSell, uint80 price, uint104 qty) public onlyContractUse returns (uint32) { uint32 accountId = FindOrRevertAccount(); require(accountId_freeze[accountId] == false); uint80 lastBestPrice; OrderBook storage orderBook = basePID_tradePID_orderBook[prBase][prTrade]; require(price != 0 && price <= maxPrice && qty <= maxQty && ((isSell == false && prCode_productInfo[prTrade].isTradeBid == true && prCode_productInfo[prBase].isTradeAsk == true) || (isSell == true && prCode_productInfo[prTrade].isTradeAsk == true && prCode_productInfo[prBase].isTradeBid == true)) && prCode_productInfo[prTrade].minQty <= qty); if (isSell == true) { price = GetNextTick(true, price, orderBook.tickSize); lastBestPrice = orderBook.bestAskPrice; } else { price = GetNextTick(false, price, orderBook.tickSize); lastBestPrice = orderBook.bestBidPrice; } Order memory order; order.exId = exId; order.isSell = isSell; order.prTrade = prTrade; order.prBase = prBase; order.accountId = accountId; order.price = price; order.qty = qty; require (IsPossibleLimit(exId, order)); emit NewOrder(order.prTrade, order.prBase, order.accountId, ++lastOrderId, order.isSell, order.price, order.qty, lastNewOrderId++); BalanceUpdateByLimitAfterTrade(order, qty, matchOrder(orderBook, order, lastOrderId)); if (order.qty != 0) { uint80 priceNext; uint80 price0; if (isSell == true) { price0 = orderBook.bestAskPrice; if (price0 == 0) { orderBook.askPrice_Order[price].prevPrice = 0; orderBook.askPrice_Order[price].nextPrice = 0; orderBook.bestAskPrice = price; } else if(price < price0) { orderBook.askPrice_Order[price0].prevPrice = price; orderBook.askPrice_Order[price].prevPrice = 0; orderBook.askPrice_Order[price].nextPrice = price0; orderBook.bestAskPrice = price; } else if (orderBook.askPrice_Order[price].firstId == 0) { priceNext = price0; while (priceNext != 0 && priceNext < price) { price0 = priceNext; priceNext = orderBook.askPrice_Order[price0].nextPrice; } orderBook.askPrice_Order[price0].nextPrice = price; orderBook.askPrice_Order[price].prevPrice = price0; orderBook.askPrice_Order[price].nextPrice = priceNext; if (priceNext != 0) { orderBook.askPrice_Order[priceNext].prevPrice = price; } } OrderLink storage orderLink = orderBook.askPrice_Order[price]; } else { price0 = orderBook.bestBidPrice; if (price0 == 0) { orderBook.bidPrice_Order[price].prevPrice = 0; orderBook.bidPrice_Order[price].nextPrice = 0; orderBook.bestBidPrice = price; } else if (price > price0) { orderBook.bidPrice_Order[price0].prevPrice = price; orderBook.bidPrice_Order[price].prevPrice = 0; orderBook.bidPrice_Order[price].nextPrice = price0; orderBook.bestBidPrice = price; } else if (orderBook.bidPrice_Order[price].firstId == 0) { priceNext = price0; while (priceNext != 0 && priceNext > price) { price0 = priceNext; priceNext = orderBook.bidPrice_Order[price0].nextPrice; } orderBook.bidPrice_Order[price0].nextPrice = price; orderBook.bidPrice_Order[price].prevPrice = price0; orderBook.bidPrice_Order[price].nextPrice = priceNext; if (priceNext != 0) { orderBook.bidPrice_Order[priceNext].prevPrice = price; } } orderLink = orderBook.bidPrice_Order[price]; } if (lastOrderId != 0) { orderLink.id_orderList[lastOrderId].prev = orderLink.lastId; if (orderLink.firstId != 0) { orderLink.id_orderList[orderLink.lastId].next = lastOrderId; } else { orderLink.id_orderList[lastOrderId].next = 0; orderLink.firstId = lastOrderId; } orderLink.lastId = lastOrderId; } AddOpenOrder(accountId, lastOrderId); id_Order[lastOrderId] = order; } if (isSell == true && lastBestPrice != orderBook.bestAskPrice) { emit NewBestBidAsk(prTrade, prBase, isSell, orderBook.bestAskPrice); } if (isSell == false && lastBestPrice != orderBook.bestBidPrice) { emit NewBestBidAsk(prTrade, prBase, isSell, orderBook.bestBidPrice); } return lastOrderId; } function BalanceUpdateByLimitAfterTrade(Order order, uint104 qty, uint104 tradedQty) private { uint32 exId = order.exId; uint32 accountId = order.accountId; uint32 prTrade = order.prTrade; uint32 prBase = order.prBase; uint80 price = order.price; uint104 orderQty = order.qty; if (order.isSell) { Balance storage balance = exId_prCode_AccountId_Balance[exId][prTrade][accountId]; balance.available = Sub(balance.available, qty); if (orderQty != 0) balance.reserved = Add(balance.reserved, orderQty); } else { balance = exId_prCode_AccountId_Balance[exId][prBase][accountId]; if (orderQty != 0) { // prCode_productInfo[prBase].divider * qty * price < 2^60 * 2^80 * 2^104 < 2^256 uint256 temp = prCode_productInfo[prBase].divider * orderQty * price / basePrice / prCode_productInfo[prTrade].divider; require (temp < maxQty); // temp < maxQty < 2^104 balance.available = Sub(balance.available, tradedQty + uint104(temp)); balance.reserved = Add(balance.reserved, uint104(temp)); } else { balance.available = Sub(balance.available, tradedQty); } tradedQty = qty - orderQty; prBase = prTrade; } if (tradedQty != 0) { uint104 takeFeeLocal = tradedQty * ownerId_takerFeeRateLocal[exId] / 10000; exId_prCode_AccountId_Balance[exId][prBase][accountId].available += tradedQty - takeFeeLocal; exId_prCode_AccountId_Balance[exId][prBase][ownerId_accountId[exId]].available += takeFeeLocal; } } function IsPossibleLimit(uint32 exId, Order memory order) private view returns (bool) { if (order.isSell) { if (exId_prCode_AccountId_Balance[exId][order.prTrade][order.accountId].available >= order.qty) return true; else return false; } else { if (exId_prCode_AccountId_Balance[exId][order.prBase][order.accountId].available >= prCode_productInfo[order.prBase].divider * order.qty * order.price / basePrice / prCode_productInfo[order.prTrade].divider) return true; else return false; } } // Heart of DexHI's onchain order matching algorithm function matchOrder(OrderBook storage ob, Order memory order, uint32 id) private returns (uint104) { uint32 prTrade = order.prTrade; uint32 prBase = order.prBase; uint80 tradePrice; if (order.isSell == true) tradePrice = ob.bestBidPrice; else tradePrice = ob.bestAskPrice; bool isBestPriceUpdate = false; uint104 qtyBase = 0; uint104 tradeAmount; while (tradePrice != 0 && order.qty > 0 && ((order.isSell && order.price <= tradePrice) || (!order.isSell && order.price >= tradePrice))) { if (order.isSell == true) OrderLink storage orderLink = ob.bidPrice_Order[tradePrice]; else orderLink = ob.askPrice_Order[tradePrice]; uint32 orderId = orderLink.firstId; while (orderLink.firstId != 0 && orderId != 0 && order.qty != 0) { Order storage matchingOrder = id_Order[orderId]; if (matchingOrder.qty >= order.qty) { tradeAmount = order.qty; matchingOrder.qty -= order.qty; //matchingOrder.qty cannot be negative by (matchingOrder.qty >= order.qty order.qty = 0; } else { tradeAmount = matchingOrder.qty; order.qty -= matchingOrder.qty; matchingOrder.qty = 0; } qtyBase += BalanceUpdateByTradeCp(order, matchingOrder, tradeAmount); //return value of BalanceUpdateByTradeCp < maxqty < 2^100 so qtyBase < 2 * maxqty < 2 * 101 by below require(qtyBase < maxQty) -> qtyBase cannot be overflow require(qtyBase < maxQty); uint32 orderAccountID = order.accountId; if (order.isSell == true) emit NewTrade(prTrade, prBase, orderId, id, matchingOrder.accountId, orderAccountID, true, tradePrice, tradeAmount, lastTradeId++, uint64(now)); else emit NewTrade(prTrade, prBase, id, orderId, orderAccountID, matchingOrder.accountId, false, tradePrice, tradeAmount, lastTradeId++, uint64(now)); if (matchingOrder.qty != 0) { break; } else { if (RemoveOrder(prTrade, prBase, matchingOrder.isSell, tradePrice, orderId) == true) { RemoveOpenOrder(matchingOrder.accountId, orderId); } orderId = orderLink.firstId; } } if (orderLink.firstId == 0) { tradePrice = orderLink.nextPrice; isBestPriceUpdate = true; } } if (isBestPriceUpdate == true) { if (order.isSell) { ob.bestBidPrice = tradePrice; } else { ob.bestAskPrice = tradePrice; } emit NewBestBidAsk(prTrade, prBase, !order.isSell, tradePrice); } return qtyBase; } function BalanceUpdateByTradeCp(Order order, Order matchingOrder, uint104 tradeAmount) private returns (uint104) { uint32 accountId = matchingOrder.accountId; uint32 prTrade = order.prTrade; uint32 prBase = order.prBase; require (tradeAmount < maxQty); // qtyBase < 10 ^ 18 < 2^ 60 & tradedAmount < 2^104 & matching orderprice < 2^80 -> prCode_productInfo[prBase].divider * tradeAmount * matchingOrder.price < 2^256 // so, below qtyBase cannot be overflow uint256 qtyBase = prCode_productInfo[prBase].divider * tradeAmount * matchingOrder.price / basePrice / prCode_productInfo[prTrade].divider; require (qtyBase < maxQty); Balance storage balanceTrade = exId_prCode_AccountId_Balance[matchingOrder.exId][prTrade][accountId]; Balance storage balanceBase = exId_prCode_AccountId_Balance[matchingOrder.exId][prBase][accountId]; if (order.isSell == true) { balanceTrade.available = SafeMath.Add(balanceTrade.available, tradeAmount); balanceBase.reserved = SafeMath.Sub(balanceBase.reserved, uint104(qtyBase)); } else { balanceTrade.reserved = SafeMath.Sub(balanceTrade.reserved, tradeAmount); balanceBase.available = SafeMath.Add(balanceBase.available, uint104(qtyBase)); } return uint104(qtyBase); // return value < maxQty = 1000000000000000000000000000001 < 2^100 by require (qtyBase < maxQty); } // Internal functions to remove order function RemoveOrder(uint32 prTrade, uint32 prBase, bool isSell, uint80 price, uint32 id) private returns (bool) { OrderBook storage ob = basePID_tradePID_orderBook[prBase][prTrade]; if (isSell == false) { OrderLink storage orderLink = ob.bidPrice_Order[price]; } else { orderLink = ob.askPrice_Order[price]; } if (id != 0) { ListItem memory removeItem = orderLink.id_orderList[id]; if (removeItem.next != 0) { orderLink.id_orderList[removeItem.next].prev = removeItem.prev; } if (removeItem.prev != 0) { orderLink.id_orderList[removeItem.prev].next = removeItem.next; } if (id == orderLink.lastId) { orderLink.lastId = removeItem.prev; } if (id == orderLink.firstId) { orderLink.firstId = removeItem.next; } delete orderLink.id_orderList[id]; if (orderLink.firstId == 0) { if (orderLink.nextPrice != 0) { if (isSell == true) OrderLink storage replaceLink = ob.askPrice_Order[orderLink.nextPrice]; else replaceLink = ob.bidPrice_Order[orderLink.nextPrice]; replaceLink.prevPrice = orderLink.prevPrice; } if (orderLink.prevPrice != 0) { if (isSell == true) replaceLink = ob.askPrice_Order[orderLink.prevPrice]; else replaceLink = ob.bidPrice_Order[orderLink.prevPrice]; replaceLink.nextPrice = orderLink.nextPrice; } if (price == ob.bestAskPrice) { ob.bestAskPrice = orderLink.nextPrice; } if (price == ob.bestBidPrice) { ob.bestBidPrice = orderLink.nextPrice; } } return true; } else { return false; } } // Cancel orders, keep eye on max block gas Fee function cancelOrders(uint32 exId, uint32[] id) public { for (uint32 i = 0; i < id.length; i++) { cancelOrder(exId, id[i]); } } // Cancel order function cancelOrder(uint32 exId, uint32 id) public returns (bool) { Order memory order = id_Order[id]; uint32 accountId = account_id[msg.sender]; require(order.accountId == accountId); uint32 prTrade = order.prTrade; uint32 prBase = order.prBase; bool isSell = order.isSell; uint80 price = order.price; uint104 qty = order.qty; if (RemoveOrder(prTrade, prBase, isSell, price, id) == false) return false; else { RemoveOpenOrder(accountId, id); } if (isSell) { Balance storage balance = exId_prCode_AccountId_Balance[exId][prTrade][accountId]; balance.available = SafeMath.Add(balance.available, qty); balance.reserved = SafeMath.Sub(balance.reserved, qty); } else { balance = exId_prCode_AccountId_Balance[exId][prBase][accountId]; // prCode_productInfo[prBase].divider * qty * price < 2^60 * 2^80 * 2^104 < 2^256 uint256 temp = prCode_productInfo[prBase].divider * qty * price / basePrice / prCode_productInfo[prTrade].divider; require (temp < maxQty); // temp < maxQty < 2^104 -> temp cannot be overflow balance.available = SafeMath.Add(balance.available, uint104(temp)); balance.reserved = SafeMath.Sub(balance.reserved, uint104(temp)); } emit NewCancel(prTrade, prBase, accountId, id, isSell, price, qty, lastNewOrderId++); return true; } function checkAnnounceLV(uint32 accountId, uint8 LV) private view returns (bool) { require(accountId == account_id[msg.sender] || id_announceLV[accountId] >= LV || msg.sender == operator || owner_id[msg.sender] != 0); } // Get balance by acount id function getBalance(uint32 exId, uint32[] prCode, uint32 accountId) view public returns (uint128[] available, uint128[] reserved) { if (accountId == 0) accountId = account_id[msg.sender]; checkAnnounceLV(accountId, 2); uint256 n = prCode.length; available = new uint128[](n); reserved = new uint128[](n); for (uint32 i = 0; i < n; i++) { available[i] = exId_prCode_AccountId_Balance[exId][prCode[i]][accountId].available; reserved[i] = exId_prCode_AccountId_Balance[exId][prCode[i]][accountId].reserved; } } // Get balance by product function getBalanceByProduct(uint32 exId, uint32 prCode, uint128 minQty) view public returns (uint32[] accountId, uint128[] balanceSum) { require (owner_id[msg.sender] != 0 || msg.sender == operator); uint32 n = 0; for (uint32 i = 1; i <= lastAcccountId; i++) { if (exId_prCode_AccountId_Balance[exId][prCode][i].available + exId_prCode_AccountId_Balance[exId][prCode][i].reserved > minQty) n++; } accountId = new uint32[](n); balanceSum = new uint128[](n); n = 0; uint128 temp; for (i = 1; i <= lastAcccountId; i++) { temp = exId_prCode_AccountId_Balance[exId][prCode][i].available + exId_prCode_AccountId_Balance[exId][prCode][i].reserved; if (temp >= minQty) { accountId[n] = i; balanceSum[n++] = temp; } } } // Get bestBidPrice and bestAskPrice of each orderbook function getOrderBookInfo(uint32[] prTrade, uint32 prBase) view public returns (uint80[] bestBidPrice, uint80[] bestAskPrice) { uint256 n = prTrade.length; bestBidPrice = new uint80[](n); bestAskPrice = new uint80[](n); for (uint256 i = 0; i < n; i++) { OrderBook memory orderBook = basePID_tradePID_orderBook[prBase][prTrade[i]]; bestBidPrice[i] = orderBook.bestBidPrice; bestAskPrice[i] = orderBook.bestAskPrice; } } // Get order information by order id function getOrder(uint32 id) view public returns (uint32 prTrade, uint32 prBase, bool sell, uint80 price, uint104 qty, uint32 accountId) { Order memory order = id_Order[id]; accountId = order.accountId; checkAnnounceLV(accountId, 4); prTrade = order.prTrade; prBase = order.prBase; price = order.price; sell = order.isSell; qty = order.qty; } // Get message sender's open orders function GetMyOrders(uint32 exId, uint32 accountId, uint16 orderN) view public returns (uint32[] orderId, uint32[] prTrade, uint32[] prBase, bool[] sells, uint80[] prices, uint104[] qtys) { if (accountId == 0) accountId = account_id[msg.sender]; checkAnnounceLV(accountId, 4); OpenOrder storage openOrder = accountId_OpenOrder[accountId]; orderId = new uint32[](orderN); prTrade = new uint32[](orderN); prBase = new uint32[](orderN); qtys = new uint104[](orderN); prices = new uint80[](orderN); sells = new bool[](orderN); uint32 id = openOrder.startId; if (id != 0) { Order memory order; uint32 i = 0; while (id != 0 && i < orderN) { order = id_Order[id]; if (exId == order.exId) { orderId[i] = id; prTrade[i] = order.prTrade; prBase[i] = order.prBase; qtys[i] = order.qty; prices[i] = order.price; sells[i++] = order.isSell; } id = openOrder.id_orderList[id].next; } } } // Get all order id in each price function GetHogaDetail(uint32 prTrade, uint32 prBase, uint80 price, bool isSell, uint16 orderN) view public returns (uint32[] orderIds) { if (isSell == false) { OrderLink storage orderLink = basePID_tradePID_orderBook[prBase][prTrade].bidPrice_Order[price]; } else if (isSell == true) { orderLink = basePID_tradePID_orderBook[prBase][prTrade].askPrice_Order[price]; } else { return; } orderIds = new uint32[](orderN); uint16 n = 0; uint32 id0 = orderLink.firstId; while (id0 != 0 && orderN > n) { orderIds[n++] = id0; id0 = orderLink.id_orderList[id0].next; } } // Get orderbook screen function GetHoga(uint32 prTrade, uint32 prBase, uint32 hogaN) public view returns (uint80[] priceB, uint104[] volumeB, uint80[] priceA, uint104[] volumeA) { OrderBook storage ob = basePID_tradePID_orderBook[prBase][prTrade]; (priceB, volumeB) = GetHoga(ob, hogaN, false); (priceA, volumeA) = GetHoga(ob, hogaN, true); } // Get orderbook screen function GetHoga(OrderBook storage ob, uint32 hogaN, bool isSell) private view returns (uint80[] prices, uint104[] volumes) { prices = new uint80[](hogaN); volumes = new uint104[](hogaN); uint32 n; uint32 id0; uint80 price; uint104 sum; if (isSell == false) price = ob.bestBidPrice; else price = ob.bestAskPrice; if (price != 0) { n = 0; while (price != 0 && n < hogaN) { if (isSell == false) OrderLink storage orderLink = ob.bidPrice_Order[price]; else orderLink = ob.askPrice_Order[price]; id0 = orderLink.firstId; sum = 0; while (id0 != 0) { sum += id_Order[id0].qty; id0 = orderLink.id_orderList[id0].next; } prices[n] = price; volumes[n] = sum; price = orderLink.nextPrice; n++; } if (n > 0) { while (n < hogaN) { if (isSell == true) prices[n] = GetNextTick(true, prices[n - 1] + 1, ob.tickSize); else prices[n] = GetNextTick(false, prices[n - 1] - 1, ob.tickSize); n++; } } } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[{"name":"a","type":"uint128"},{"name":"b","type":"uint128"}],"name":"Add","outputs":[{"name":"","type":"uint128"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"GetMyAccountId","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"exId","type":"uint32"},{"name":"prTrade","type":"uint32"},{"name":"prBase","type":"uint32"},{"name":"isSell","type":"bool"},{"name":"price","type":"uint80"},{"name":"qty","type":"uint104"}],"name":"LimitOrder","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_operator","type":"address"}],"name":"transferOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"lastAcccountId","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"N","type":"uint32"},{"name":"exId","type":"uint32"},{"name":"accountId","type":"uint32"}],"name":"GetDWrecords","outputs":[{"name":"prCode","type":"uint32[]"},{"name":"isDeposit","type":"bool[]"},{"name":"qty","type":"uint128[]"},{"name":"timestamp","type":"uint64[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"exId","type":"uint32"}],"name":"DeleteOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"lastOwnerId","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"GetMyAnnounceLV","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"newProductFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastNewOrderId","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastTradeId","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastOrderId","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"operator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"product","type":"address"}],"name":"GetProductInfo","outputs":[{"name":"prCode","type":"uint32"},{"name":"divider","type":"uint256"},{"name":"isTradeBid","type":"bool"},{"name":"isTradeAsk","type":"bool"},{"name":"isDeposit","type":"bool"},{"name":"isWithdraw","type":"bool"},{"name":"ownerId","type":"uint32"},{"name":"minQty","type":"uint104"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"announceLV","type":"uint8"}],"name":"ChangeAnnounceLV","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"GetOwnerList","outputs":[{"name":"owners","type":"address[]"},{"name":"ownerIds","type":"uint32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"ownerId","type":"uint32"}],"name":"getTakerFeeRateLocal","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_takerFeeRate","type":"uint8"}],"name":"setTakerFeeRateLocal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"maxBalance","outputs":[{"name":"","type":"uint128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"prCode","type":"uint32"},{"name":"isTradeBid","type":"bool"},{"name":"isTradeAsk","type":"bool"},{"name":"isDeposit","type":"bool"},{"name":"isWithdraw","type":"bool"},{"name":"_minQty","type":"uint104"},{"name":"exId","type":"uint32"}],"name":"SetProductInfo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"prTrade","type":"uint32"},{"name":"prBase","type":"uint32"},{"name":"_tickSize","type":"uint8"}],"name":"SetOrderBookTickSize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"id","type":"uint32"}],"name":"getOrder","outputs":[{"name":"prTrade","type":"uint32"},{"name":"prBase","type":"uint32"},{"name":"sell","type":"bool"},{"name":"price","type":"uint80"},{"name":"qty","type":"uint104"},{"name":"accountId","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastProductId","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"productFee","type":"uint256"}],"name":"SetProductFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"exId","type":"uint32"},{"name":"id","type":"uint32"}],"name":"cancelOrder","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"prTrade","type":"uint32"},{"name":"prBase","type":"uint32"},{"name":"price","type":"uint80"},{"name":"isSell","type":"bool"},{"name":"orderN","type":"uint16"}],"name":"GetHogaDetail","outputs":[{"name":"orderIds","type":"uint32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastTransferId","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isContractUse","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"isFreeze","type":"bool"},{"name":"account","type":"address"}],"name":"SetFreezeByAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"AddOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"prTrade","type":"uint32"},{"name":"prBase","type":"uint32"},{"name":"hogaN","type":"uint32"}],"name":"GetHoga","outputs":[{"name":"priceB","type":"uint80[]"},{"name":"volumeB","type":"uint104[]"},{"name":"priceA","type":"uint80[]"},{"name":"volumeA","type":"uint104[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"price","type":"uint80"},{"name":"n","type":"uint8"}],"name":"GetTick","outputs":[{"name":"","type":"uint80"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"exId","type":"uint32"},{"name":"id","type":"uint32[]"}],"name":"cancelOrders","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"basePrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxQty","outputs":[{"name":"","type":"uint104"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"exId","type":"uint32"},{"name":"amount","type":"uint104"}],"name":"withdrawETH","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"exId","type":"uint32"},{"name":"prCode","type":"uint32"},{"name":"accountIds","type":"uint32[]"},{"name":"qtys","type":"uint104[]"}],"name":"airDrop","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"GetAccountId","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"a","type":"uint128"},{"name":"b","type":"uint128"}],"name":"Sub","outputs":[{"name":"","type":"uint128"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"exId","type":"uint32"},{"name":"amount","type":"uint128"},{"name":"isDeposit","type":"bool"},{"name":"prAddress","type":"address"}],"name":"depositWithdrawToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"exId","type":"uint32"},{"name":"prCode","type":"uint32[]"},{"name":"accountId","type":"uint32"}],"name":"getBalance","outputs":[{"name":"available","type":"uint128[]"},{"name":"reserved","type":"uint128[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"decimals","type":"uint256"},{"name":"product","type":"address"}],"name":"AddProduct","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"isAsk","type":"bool"},{"name":"price","type":"uint80"},{"name":"n","type":"uint8"}],"name":"GetNextTick","outputs":[{"name":"","type":"uint80"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"exId","type":"uint32"}],"name":"depositETH","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"maxPrice","outputs":[{"name":"","type":"uint80"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"GetProductList","outputs":[{"name":"products","type":"address[]"},{"name":"productIds","type":"uint32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"exId","type":"uint32"},{"name":"prCode","type":"uint32"},{"name":"minQty","type":"uint128"}],"name":"getBalanceByProduct","outputs":[{"name":"accountId","type":"uint32[]"},{"name":"balanceSum","type":"uint128[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"exId","type":"uint32"},{"name":"accountId","type":"uint32"},{"name":"orderN","type":"uint16"}],"name":"GetMyOrders","outputs":[{"name":"orderId","type":"uint32[]"},{"name":"prTrade","type":"uint32[]"},{"name":"prBase","type":"uint32[]"},{"name":"sells","type":"bool[]"},{"name":"prices","type":"uint80[]"},{"name":"qtys","type":"uint104[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"prTrade","type":"uint32[]"},{"name":"prBase","type":"uint32"}],"name":"getOrderBookInfo","outputs":[{"name":"bestBidPrice","type":"uint80[]"},{"name":"bestAskPrice","type":"uint80[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"prCode","type":"uint32"},{"name":"amount","type":"uint256"}],"name":"emergencyWithdrawal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"exId","type":"uint32"},{"indexed":false,"name":"prCode","type":"uint32"},{"indexed":true,"name":"accountId","type":"uint32"},{"indexed":false,"name":"amount","type":"uint128"},{"indexed":false,"name":"timestamp","type":"uint64"},{"indexed":false,"name":"lastTransferId","type":"uint32"}],"name":"NewDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"exId","type":"uint32"},{"indexed":false,"name":"prCode","type":"uint32"},{"indexed":true,"name":"accountId","type":"uint32"},{"indexed":false,"name":"amount","type":"uint128"},{"indexed":false,"name":"timestamp","type":"uint64"},{"indexed":false,"name":"lastTransferId","type":"uint32"}],"name":"NewWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"prTrade","type":"uint32"},{"indexed":true,"name":"prBase","type":"uint32"},{"indexed":true,"name":"accountId","type":"uint32"},{"indexed":false,"name":"id","type":"uint32"},{"indexed":false,"name":"isSell","type":"bool"},{"indexed":false,"name":"price","type":"uint80"},{"indexed":false,"name":"qty","type":"uint104"},{"indexed":false,"name":"lastNewOrderId","type":"uint32"}],"name":"NewOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"prTrade","type":"uint32"},{"indexed":true,"name":"prBase","type":"uint32"},{"indexed":true,"name":"accountId","type":"uint32"},{"indexed":false,"name":"id","type":"uint32"},{"indexed":false,"name":"isSell","type":"bool"},{"indexed":false,"name":"price","type":"uint80"},{"indexed":false,"name":"qt","type":"uint104"},{"indexed":false,"name":"lastNewOrderId","type":"uint32"}],"name":"NewCancel","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"prTrade","type":"uint32"},{"indexed":true,"name":"prBase","type":"uint32"},{"indexed":false,"name":"isBid","type":"bool"},{"indexed":false,"name":"price","type":"uint80"}],"name":"NewBestBidAsk","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"prTrade","type":"uint32"},{"indexed":false,"name":"prBase","type":"uint32"},{"indexed":true,"name":"bidId","type":"uint32"},{"indexed":true,"name":"askId","type":"uint32"},{"indexed":false,"name":"accountIdBid","type":"uint32"},{"indexed":false,"name":"accountIdAsk","type":"uint32"},{"indexed":false,"name":"isSell","type":"bool"},{"indexed":false,"name":"price","type":"uint80"},{"indexed":false,"name":"qty","type":"uint104"},{"indexed":false,"name":"lastTradeId","type":"uint32"},{"indexed":false,"name":"timestamp","type":"uint64"}],"name":"NewTrade","type":"event"}]
Contract Creation Code
608060405260008054606060020a60ff0219604060020a63ffffffff021967ffffffff000000001963ffffffff199093166001179290921664010000000017919091166801000000000000000017166c010000000000000000000000001790553480156200006c57600080fd5b506001805433600160a060020a031991821681179283905560028054600160a060020a0390941693909216929092179055620000b190640100000000620000ce810204565b620000c860126000640100000000620001f9810204565b6200050b565b600254600160a060020a03163314620000e657600080fd5b600160a060020a03811660009081526004602052604090205463ffffffff16156200011057600080fd5b6002805460a060020a63ffffffff02198116740100000000000000000000000000000000000000009182900463ffffffff9081166001018116808402929092178455600160a060020a0385166000818152600460209081526040808320805463ffffffff19169096179095559554949094049091168352600390935290208054600160a060020a0319169091179055620001b26401000000006200043d810204565b60025474010000000000000000000000000000000000000000900463ffffffff9081166000908152600660205260409020805463ffffffff19169290911691909117905550565b62000203620004cf565b3360009081526004602052604090205463ffffffff1615156200022557600080fd5b60085434101580620002415750600254600160a060020a031633145b15156200024d57600080fd5b600160a060020a0382166000908152600a602052604090205463ffffffff16156200027757600080fd5b60128311156200028657600080fd5b6007805463ffffffff8082166001908101821663ffffffff1993841681178555600160a060020a039096166000818152600a602081815260408084208054909816909a17909655865485168252600986528882208054600160a060020a03191690931790925597900a85523387526004835285872054821660a08601908152935482168752600b83528587208551815585840151910180548688015160608801516080890151975160c0909901516001606860020a03166801000000000000000002604060020a60a860020a03199987166401000000000267ffffffff000000001999151563010000000263ff00000019931515620100000262ff0000199515156101000261ff001999151560ff1990981697909717989098169590951793909316959095171691909117959095169490941794909416939093179091557f3e5fec24aa4dc4e5aee2e025e51e1392c72a2500577559fae9665c6d52bd6a315490911683527fe05cd31702e6c5d366a557249766f77ad1ec870b62d942c3a61ebfada6a8e51e9052902080546001608060020a03700100000000000000000000000000000000808304821634018216029116179055565b3360009081526010602052604081205463ffffffff161515620004b557600c805463ffffffff808216600101811663ffffffff1992831681178455336000818152601060209081526040808320805490971690941790955594549092168452600e90925291208054600160a060020a03191690911790555b503360009081526010602052604090205463ffffffff1690565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b615f91806200051b6000396000f3006080604052600436106102715763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663072a0ea48114610276578063082c288f146102b95780630c145c87146102e757806329605e771461032e5780632d5a46ff146103515780633cdc23741461036657806341a6e1e0146104b35780634320a6cb146104d15780634b3488c2146104e65780634f34e1f9146104fb57806352ba28e41461052257806352bcfd5b146105375780635662ecc71461054c578063570ca73514610561578063598ecf36146105925780635a230af91461060c5780635d285c2c146106275780636422d517146106d5578063663754a31461070957806373ad468a14610724578063766fb7641461073957806376efb1e314610782578063899452e5146107ac5780638da5cb5b146108195780638dff9f921461082e5780638f95b64f14610843578063949ebfbd1461085b5780639a9f662c14610893578063a29685a51461091f578063a2b6d6d014610934578063a789044114610949578063ac1e9ef41461096f578063b5d759d914610990578063b83112ab146109ba578063ba96185a146109fd578063c7876ea414610a5d578063c7a9548014610a72578063ca7c2e4e14610aa3578063cae9de4314610acd578063cc74d6d814610b6e578063cd83644614610b8f578063cdcc799614610bb6578063cdf604e214610bf1578063d7c3595614610c59578063dd7da32214610c70578063dfdf577e14610c9c578063e38d6b5c14610cad578063e4c59a1714610cc2578063e8384e6814610cd7578063ef2e514014610d07578063f3d5d60a14610edf578063fe7d14a814610f3c575b600080fd5b34801561028257600080fd5b5061029d6001608060020a0360043581169060243516610f5d565b604080516001608060020a039092168252519081900360200190f35b3480156102c557600080fd5b506102ce610f9f565b6040805163ffffffff9092168252519081900360200190f35b3480156102f357600080fd5b506102ce63ffffffff6004358116906024358116906044351660643515156001605060020a03608435166001606860020a0360a43516610fb8565b34801561033a57600080fd5b5061034f600160a060020a0360043516611d93565b005b34801561035d57600080fd5b506102ce611dd9565b34801561037257600080fd5b5061039063ffffffff60043581169060243581169060443516611de5565b6040518080602001806020018060200180602001858103855289818151815260200191508051906020019060200280838360005b838110156103dc5781810151838201526020016103c4565b50505050905001858103845288818151815260200191508051906020019060200280838360005b8381101561041b578181015183820152602001610403565b50505050905001858103835287818151815260200191508051906020019060200280838360005b8381101561045a578181015183820152602001610442565b50505050905001858103825286818151815260200191508051906020019060200280838360005b83811015610499578181015183820152602001610481565b505050509050019850505050505050505060405180910390f35b3480156104bf57600080fd5b5061034f63ffffffff60043516612083565b3480156104dd57600080fd5b506102ce612104565b3480156104f257600080fd5b506102ce612117565b34801561050757600080fd5b50610510612140565b60408051918252519081900360200190f35b34801561052e57600080fd5b506102ce612146565b34801561054357600080fd5b506102ce61215a565b34801561055857600080fd5b506102ce61216d565b34801561056d57600080fd5b50610576612179565b60408051600160a060020a039092168252519081900360200190f35b34801561059e57600080fd5b506105b3600160a060020a0360043516612188565b6040805163ffffffff998a16815260208101989098529515158787015293151560608701529115156080860152151560a085015290931660c08301526001606860020a0390921660e08201529051908190036101000190f35b34801561061857600080fd5b5061034f60ff60043516612200565b34801561063357600080fd5b5061063c612238565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610680578181015183820152602001610668565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156106bf5781810151838201526020016106a7565b5050505090500194505050505060405180910390f35b3480156106e157600080fd5b506106f363ffffffff60043516612370565b6040805160ff9092168252519081900360200190f35b34801561071557600080fd5b5061034f60ff6004351661238b565b34801561073057600080fd5b5061029d6123e9565b34801561074557600080fd5b5061034f63ffffffff6004358116906024351515906044351515906064351515906084351515906001606860020a0360a435169060c435166123fc565b34801561078e57600080fd5b5061034f63ffffffff6004358116906024351660ff604435166124f7565b3480156107b857600080fd5b506107ca63ffffffff60043516612546565b6040805163ffffffff97881681529587166020870152931515858501526001605060020a0390921660608501526001606860020a0316608084015290921660a082015290519081900360c00190f35b34801561082557600080fd5b5061057661262e565b34801561083a57600080fd5b506102ce61263d565b34801561084f57600080fd5b5061034f600435612649565b34801561086757600080fd5b5061087f63ffffffff60043581169060243516612665565b604080519115158252519081900360200190f35b34801561089f57600080fd5b506108cf63ffffffff600435811690602435166001605060020a0360443516606435151561ffff608435166129e3565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561090b5781810151838201526020016108f3565b505050509050019250505060405180910390f35b34801561092b57600080fd5b506102ce612b39565b34801561094057600080fd5b5061087f612b45565b34801561095557600080fd5b5061034f6004351515600160a060020a0360243516612b55565b34801561097b57600080fd5b5061034f600160a060020a0360043516612bbc565b34801561099c57600080fd5b5061039063ffffffff60043581169060243581169060443516612cd3565b3480156109c657600080fd5b506109e16001605060020a036004351660ff60243516612d30565b604080516001605060020a039092168252519081900360200190f35b348015610a0957600080fd5b5060408051602060046024803582810135848102808701860190975280865261034f96843563ffffffff1696369660449591949091019291829185019084908082843750949750612e859650505050505050565b348015610a6957600080fd5b50610510612ec7565b348015610a7e57600080fd5b50610a87612ed0565b604080516001606860020a039092168252519081900360200190f35b348015610aaf57600080fd5b5061034f63ffffffff600435166001606860020a0360243516612ee1565b348015610ad957600080fd5b50604080516020600460443581810135838102808601850190965280855261034f95833563ffffffff9081169660248035909216963696956064959294930192829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750949750612fee9650505050505050565b348015610b7a57600080fd5b506102ce600160a060020a03600435166131f5565b348015610b9b57600080fd5b5061029d6001608060020a0360043581169060243516613216565b348015610bc257600080fd5b5061034f63ffffffff600435166001608060020a03602435166044351515600160a060020a0360643516613239565b348015610bfd57600080fd5b5060408051602060046024803582810135848102808701860190975280865261063c96843563ffffffff16963696604495919490910192918291850190849080828437509497505050923563ffffffff16935061360492505050565b61034f600435600160a060020a03602435166137dc565b348015610c7c57600080fd5b506109e160043515156001605060020a036024351660ff60443516613a1f565b61034f63ffffffff60043516613aab565b348015610cb957600080fd5b506109e1613b9f565b348015610cce57600080fd5b5061063c613bad565b348015610ce357600080fd5b5061063c63ffffffff600435811690602435166001608060020a0360443516613cc1565b348015610d1357600080fd5b50610d3263ffffffff6004358116906024351661ffff60443516613ebf565b6040518080602001806020018060200180602001806020018060200187810387528d818151815260200191508051906020019060200280838360005b83811015610d86578181015183820152602001610d6e565b5050505090500187810386528c818151815260200191508051906020019060200280838360005b83811015610dc5578181015183820152602001610dad565b5050505090500187810385528b818151815260200191508051906020019060200280838360005b83811015610e04578181015183820152602001610dec565b5050505090500187810384528a818151815260200191508051906020019060200280838360005b83811015610e43578181015183820152602001610e2b565b50505050905001878103835289818151815260200191508051906020019060200280838360005b83811015610e82578181015183820152602001610e6a565b50505050905001878103825288818151815260200191508051906020019060200280838360005b83811015610ec1578181015183820152602001610ea9565b505050509050019c5050505050505050505050505060405180910390f35b348015610eeb57600080fd5b506040805160206004803580820135838102808601850190965280855261063c953695939460249493850192918291850190849080828437509497505050923563ffffffff16935061426c92505050565b348015610f4857600080fd5b5061034f63ffffffff600435166024356143c9565b60008282016001608060020a0380851690821610801590610f905750826001608060020a0316816001608060020a031610155b1515610f9857fe5b9392505050565b3360009081526010602052604090205463ffffffff1690565b600080600080610fc6615e99565b6000805481908190606060020a900460ff161515600114610fe657600080fd5b610fee6144e0565b63ffffffff81166000908152600f602052604090205490975060ff161561101457600080fd5b601360008d63ffffffff1663ffffffff16815260200190815260200160002060008e63ffffffff1663ffffffff1681526020019081526020016000209450896001605060020a031660001415801561107f575069021e19e0c9bab24000016001605060020a038b1611155b80156110a157506c0c9f2c9cd04674edea400000016001606860020a038a1611155b801561116457508a1580156110d3575063ffffffff8d166000908152600b6020526040902060019081015460ff161515145b8015611101575063ffffffff8c166000908152600b60205260409020600190810154610100900460ff161515145b80611164575060018b151514801561113b575063ffffffff8d166000908152600b60205260409020600190810154610100900460ff161515145b8015611164575063ffffffff8c166000908152600b6020526040902060019081015460ff161515145b801561119b575063ffffffff8d166000908152600b60205260409020600101546001606860020a03808b16604060020a9092041611155b15156111a657600080fd5b60018b151514156111e05784546111c4906001908c9060ff16613a1f565b8554909a50605860020a90046001605060020a03169550611209565b84546111f3906000908c9060ff16613a1f565b8554909a5061010090046001605060020a031695505b63ffffffff808f1685528b151560c08601528d811660408601528c81166060860152871660208501526001605060020a038a1660a08501526001606860020a038916608085015261125a8e85614507565b151561126557600080fd5b836020015163ffffffff16846060015163ffffffff16856040015163ffffffff167f779bcb03f0f0b9518125c9665fdc55d28e5e899384a7fb39dd366ec3177671b66011600081819054906101000a900463ffffffff1660010191906101000a81548163ffffffff021916908363ffffffff16021790558860c001518960a001518a608001516000600481819054906101000a900463ffffffff168092919060010191906101000a81548163ffffffff021916908363ffffffff160217905550604051808663ffffffff1663ffffffff16815260200185151515158152602001846001605060020a03166001605060020a03168152602001836001606860020a03166001606860020a031681526020018263ffffffff1663ffffffff1681526020019550505050505060405180910390a46011546113b99085908b906113b4908990849063ffffffff16614634565b614c54565b60808401516001606860020a031615611c325760018b151514156116f9578454605860020a90046001605060020a03169150811515611459576001605060020a038a166000818152600287016020526040902080547bffffffffffffffffffffffffffffffffffffffff000000000000000019169055855474ffffffffffffffffffff00000000000000000000001916605860020a9091021785556116d9565b816001605060020a03168a6001605060020a03161015611515576001605060020a0380831660008181526002880160205260408082208054948f16609060020a8102600080516020615f4683398151915290961695909517905583825290208054604060020a9092027bffffffffffffffffffffffffffffffffffffffff0000000000000000199092169190911790558554605860020a90910274ffffffffffffffffffff0000000000000000000000199091161785556116d9565b6001605060020a038a16600090815260028601602052604090205463ffffffff1615156116d9578192505b6001605060020a038316158015906115695750896001605060020a0316836001605060020a0316105b1561159a576001605060020a038084166000908152600287016020526040902054604060020a900416929150611540565b89856002016000846001605060020a03166001605060020a0316815260200190815260200160002060000160086101000a8154816001605060020a0302191690836001605060020a03160217905550818560020160008c6001605060020a03166001605060020a0316815260200190815260200160002060000160126101000a8154816001605060020a0302191690836001605060020a03160217905550828560020160008c6001605060020a03166001605060020a0316815260200190815260200160002060000160086101000a8154816001605060020a0302191690836001605060020a03160217905550826001605060020a031660001415156116d9576001605060020a03808416600090815260028701602052604090208054918c16609060020a02600080516020615f468339815191529092169190911790555b506001605060020a038916600090815260028501602052604090206119fe565b845461010090046001605060020a0316915081151561176d576001605060020a038a166000818152600187016020526040902080547bffffffffffffffffffffffffffffffffffffffff00000000000000001916905585546affffffffffffffffffff0019166101009091021785556119e2565b816001605060020a03168a6001605060020a0316111561181e576001605060020a0380831660008181526001880160205260408082208054948f16609060020a8102600080516020615f4683398151915290961695909517905583825290208054604060020a9092027bffffffffffffffffffffffffffffffffffffffff0000000000000000199092169190911790558554610100919091026affffffffffffffffffff00199091161785556119e2565b6001605060020a038a16600090815260018601602052604090205463ffffffff1615156119e2578192505b6001605060020a038316158015906118725750896001605060020a0316836001605060020a0316115b156118a3576001605060020a038084166000908152600187016020526040902054604060020a900416929150611849565b89856001016000846001605060020a03166001605060020a0316815260200190815260200160002060000160086101000a8154816001605060020a0302191690836001605060020a03160217905550818560010160008c6001605060020a03166001605060020a0316815260200190815260200160002060000160126101000a8154816001605060020a0302191690836001605060020a03160217905550828560010160008c6001605060020a03166001605060020a0316815260200190815260200160002060000160086101000a8154816001605060020a0302191690836001605060020a03160217905550826001605060020a031660001415156119e2576001605060020a03808416600090815260018701602052604090208054918c16609060020a02600080516020615f468339815191529092169190911790555b506001605060020a038916600090815260018501602052604090205b60115463ffffffff1615611aed57805460115463ffffffff90811660009081526001840160205260409020805463ffffffff191664010000000090930482169290921790915581541615611a8e57601154815463ffffffff64010000000091829004811660009081526001850160205260409020805467ffffffff00000000191691909316909102179055611aca565b6011805463ffffffff90811660009081526001840160205260409020805467ffffffff00000000191690559054825463ffffffff191691161781555b601154815467ffffffff00000000191663ffffffff909116640100000000021781555b601154611b0190889063ffffffff16615066565b60115463ffffffff90811660009081526012602090815260409182902087518154928901519389015160608a015160808b01516001606860020a0316608060020a027cffffffffffffffffffffffffff0000000000000000000000000000000019918816606060020a026fffffffff00000000000000000000000019938916604060020a026bffffffff000000000000000019988a166401000000000267ffffffff000000001996909a1663ffffffff19909816979097179490941697909717959095169390931792909216919091179190911691909117815560a0850151600191909101805460c087015115156a0100000000000000000000026aff00000000000000000000196001605060020a0390941669ffffffffffffffffffff1990921691909117929092169190911790555b60018b1515148015611c58575084546001605060020a03878116605860020a9092041614155b15611cd8578b63ffffffff168d63ffffffff167f02a998c439d01283c50acb516486f22eb80d74d328a8aa85743fac532c6e9bab8d88600001600b9054906101000a90046001605060020a03166040518083151515158152602001826001605060020a03166001605060020a031681526020019250505060405180910390a35b8a158015611cf8575084546001605060020a038781166101009092041614155b15611d78578b63ffffffff168d63ffffffff167f02a998c439d01283c50acb516486f22eb80d74d328a8aa85743fac532c6e9bab8d8860000160019054906101000a90046001605060020a03166040518083151515158152602001826001605060020a03166001605060020a031681526020019250505060405180910390a35b505060115463ffffffff169c9b505050505050505050505050565b600154600160a060020a03163314611daa57600080fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600c5463ffffffff1681565b6060806060806000806000611dfb88600361512a565b5063ffffffff808a1660009081526016602090815260408083208c8516845290915290208054909450811692508a16821115611e35578991505b8163ffffffff16604051908082528060200260200182016040528015611e65578160200160208202803883390190505b5096508163ffffffff16604051908082528060200260200182016040528015611e98578160200160208202803883390190505b5095508163ffffffff16604051908082528060200260200182016040528015611ecb578160200160208202803883390190505b5094508163ffffffff16604051908082528060200260200182016040528015611efe578160200160208202803883390190505b50835490945063ffffffff1690505b825463ffffffff9081168390038116908216111561207757825463ffffffff808316600090815260018601602052604090205489519282168490039c5081169189918d16908110611f5a57fe5b63ffffffff9283166020918202929092018101919091528282166000908152600186019091526040902054875164010000000090910460ff16918891908d16908110611fa257fe5b91151560209283029190910182015263ffffffff8281166000908152600186019092526040909120548651650100000000009091046001608060020a0316918791908d16908110611fef57fe5b6001608060020a039290921660209283029190910182015263ffffffff8281166000908152600186019092526040909120548551750100000000000000000000000000000000000000000090910467ffffffffffffffff16918691908d1690811061205657fe5b67ffffffffffffffff90921660209283029091019091015260001901611f0d565b50505093509350935093565b600254600160a060020a0316331461209a57600080fd5b60025463ffffffff80831660a060020a90920416108015906120c2575060008163ffffffff16115b15156120cd57600080fd5b63ffffffff16600090815260036020908152604080832054600160a060020a0316835260049091529020805463ffffffff19169055565b60025460a060020a900463ffffffff1681565b3360009081526010602090815260408083205463ffffffff168352600d90915290205460ff1690565b60085481565b600054640100000000900463ffffffff1681565b600054604060020a900463ffffffff1681565b60115463ffffffff1681565b600254600160a060020a031681565b600160a060020a03166000908152600a602090815260408083205463ffffffff908116808552600b909352922080546001909101549193909260ff808416936101008104821693620100008204831693630100000083049093169264010000000083041691604060020a90046001606860020a031690565b80600d600061220d6144e0565b63ffffffff1681526020810191909152604001600020805460ff191660ff9290921691909117905550565b6060806000600260149054906101000a900463ffffffff1663ffffffff1660405190808252806020026020018201604052801561227f578160200160208202803883390190505b509250600260149054906101000a900463ffffffff1663ffffffff166040519080825280602002602001820160405280156122c4578160200160208202803883390190505b509150600190505b60025463ffffffff60a060020a90910481169082161161236b5763ffffffff8082166000908152600360205260409020548451600160a060020a03909116918591600019850190911690811061231e57fe5b600160a060020a0390921660209283029091019091015281518190839063ffffffff60001984011690811061234f57fe5b63ffffffff9092166020928302909101909101526001016122cc565b509091565b63ffffffff1660009081526005602052604090205460ff1690565b6000606460ff8316111561239e57600080fd5b503360009081526004602052604090205463ffffffff168015156123c157600080fd5b63ffffffff166000908152600560205260409020805460ff191660ff92909216919091179055565b6ec097ce7bc90715b34b9f100000000181565b63ffffffff87166000908152600b60205260409020600254600160a060020a031633148061244e575060018101543360009081526004602052604090205463ffffffff90811664010000000090920416145b151561245957600080fd5b600101805460ff19169615159690961761ff001916610100951515959095029490941762ff0000191662010000931515939093029290921763ff00000019166301000000911515919091021774ffffffffffffffffffffffffff00000000000000001916604060020a6001606860020a0392909216919091021767ffffffff00000000191664010000000063ffffffff929092169190910217905550565b600254600160a060020a0316331461250e57600080fd5b63ffffffff9182166000908152601360209081526040808320959094168252939093529120805460ff191660ff909216919091179055565b600080600080600080612557615e99565b505063ffffffff868116600090815260126020908152604091829020825160e0810184528154808616825264010000000081048616938201849052604060020a8104861694820194909452606060020a84049094166060850152608060020a9092046001606860020a031660808401526001909101546001605060020a03811660a08401526a0100000000000000000000900460ff16151560c08301529061260082600461512a565b5080604001519650806060015195508060a0015193508060c001519450806080015192505091939550919395565b600154600160a060020a031681565b60075463ffffffff1681565b600254600160a060020a0316331461266057600080fd5b600855565b600061266f615e99565b5063ffffffff8281166000908152601260209081526040808320815160e0810183528154808716825264010000000081048716828601908152604060020a8204881683860152606060020a820488166060840152608060020a9091046001606860020a031660808301526001909201546001605060020a03811660a08301526a0100000000000000000000900460ff16151560c082015233855260109093529083205490519193908116929182918291829182918291829116881461273357600080fd5b88604001519650886060015195508860c0015194508860a00151935088608001519250612763878787878f6151aa565b151561277257600099506129d4565b61277c888c61557a565b841561282d5763ffffffff8c811660009081526014602090815260408083208b851684528252808320938c1683529290522080549092506127d690608060020a90046001608060020a03166001606860020a038516610f5d565b82546001608060020a03918216608060020a029082161780845561280491166001606860020a038516613216565b82546fffffffffffffffffffffffffffffffff19166001608060020a0391909116178255612930565b63ffffffff808d1660009081526014602090815260408083208a85168085529083528184208d861685528352818420948c168452600b9092528083205491835290912054919350906402540be400906001606860020a038616026001605060020a038716020481151561289c57fe5b0490506c0c9f2c9cd04674edea4000000181106128b857600080fd5b81546128dd90608060020a90046001608060020a03166001606860020a038316610f5d565b82546001608060020a03918216608060020a029082161780845561290b91166001606860020a038316613216565b82546fffffffffffffffffffffffffffffffff19166001608060020a03919091161782555b60008054600164010000000080830463ffffffff908116928301811690910267ffffffff000000001990931692909217909255604080518e8316815288151560208201526001605060020a038816818301526001606860020a0387166060820152608081019390935251818b1692898316928b16917f6f8015e56b17b22535b1afdd1a99929ea0ef7348dfd6b4b414474f8b5caeb2f09181900360a00190a4600199505b50505050505050505092915050565b606060008080851515612a2d5763ffffffff8089166000908152601360209081526040808320938d1683529281528282206001605060020a038b1683526001019052209250612a7a565b60018615151415612a755763ffffffff8089166000908152601360209081526040808320938d1683529281528282206001605060020a038b1683526002019052209250612a7a565b612b2d565b8461ffff16604051908082528060200260200182016040528015612aa8578160200160208202803883390190505b5083549094506000925063ffffffff1690505b63ffffffff811615801590612ad757508161ffff168561ffff16115b15612b2d57835160018301928291869161ffff16908110612af457fe5b63ffffffff9283166020918202909201810191909152918116600090815260018501909252604090912054640100000000900416612abb565b50505095945050505050565b60005463ffffffff1681565b600054606060020a900460ff1681565b600254600090600160a060020a03163314612b6f57600080fd5b50600160a060020a03811660009081526010602052604090205463ffffffff168015612bb75763ffffffff81166000908152600f60205260409020805460ff19168415151790555b505050565b600254600160a060020a03163314612bd357600080fd5b600160a060020a03811660009081526004602052604090205463ffffffff1615612bfc57600080fd5b6002805477ffffffff000000000000000000000000000000000000000019811660a060020a9182900463ffffffff9081166001018116808402929092178455600160a060020a0385166000818152600460209081526040808320805463ffffffff1916909617909555955494909404909116835260039093529020805473ffffffffffffffffffffffffffffffffffffffff19169091179055612c9d6156a1565b60025460a060020a900463ffffffff9081166000908152600660205260409020805463ffffffff19169290911691909117905550565b63ffffffff8083166000908152601360209081526040808320938716835292905290812060609182918291829190612d0e908290889061573f565b9095509350612d1f8187600161573f565b959994985096509394509192505050565b600080600080600060018660ff161015612d4957600195505b60019350600192505b600260ff87160460ff168360ff16111515612d7957600a9390930292600190920191612d52565b83600a026001605060020a0316876001605060020a03161015612d9f5760019450612e7b565b61271091506001605060020a0384811690600a8982160416811515612dc057fe5b0490505b816001605060020a0316816001605060020a03161115612de957600a82029150612dc4565b816001605060020a0316816001605060020a03161015612e1757600a6001605060020a038316049150612de9565b60018087161415612e46576001605060020a03828502603202811690881610612e41576005820291505b612e77565b8382603202026001605060020a0316876001605060020a03161015612e7057600582029150612e77565b600a820291505b8194505b5050505092915050565b60005b81518163ffffffff161015612bb757612ebe83838363ffffffff16815181101515612eaf57fe5b90602001906020020151612665565b50600101612e88565b6402540be40081565b6c0c9f2c9cd04674edea4000000181565b6000612eeb6144e0565b63ffffffff81166000908152600f602052604090205490915060ff1615612f1157600080fd5b63ffffffff838116600090815260146020908152604080832060018452825280832093851683529290522054612f6090608060020a90046001608060020a03166001606860020a038416613216565b63ffffffff8085166000908152601460209081526040808320600184528252808320938616835292905281812080546001608060020a03948516608060020a029416939093179092555133916001606860020a03851680156108fc02929091818181858888f193505050501515612fd657600080fd5b612bb7838260016000866001606860020a0316615a50565b3360009081526004602052604081205481908190819063ffffffff16151561301557600080fd5b61301d6144e0565b63ffffffff81166000908152600f602052604090205490945060ff161561304357600080fd5b85518551909350831461305557600080fd5b5060009050805b828163ffffffff16101561309e57848163ffffffff1681518110151561307e57fe5b602090810290910101516001606860020a0316919091019060010161305c565b63ffffffff88811660009081526014602090815260408083208b851684528252808320938816835292905220546130e590608060020a90046001608060020a031683613216565b63ffffffff808a1660009081526014602090815260408083208c851684528252808320938916835292905290812080546001608060020a03938416608060020a0293169290921790915590505b828163ffffffff1610156131eb57848163ffffffff1681518110151561315457fe5b602090810290910181015163ffffffff808b1660009081526014845260408082208c8416835290945292832089516001606860020a0390931693909290918a919086169081106131a057fe5b602090810290910181015163ffffffff16825281019190915260400160002080546001608060020a03608060020a808304821690940181169093029216919091179055600101613132565b5050505050505050565b600160a060020a031660009081526010602052604090205463ffffffff1690565b60006001608060020a03808416908316111561322e57fe5b508082035b92915050565b600160a060020a0381166000908152600a602052604081205463ffffffff16906ec097ce7bc90715b34b9f10000000016001608060020a038616108015613285575063ffffffff821615155b151561329057600080fd5b6132986156a1565b63ffffffff81166000908152600f602052604090205490915060ff16156132be57600080fd5b600184151514156134945763ffffffff82166000908152600b6020526040902060019081015462010000900460ff16151514801561330a5750600054606060020a900460ff1615156001145b8015613329575060025463ffffffff60a060020a909104811690871611155b151561333457600080fd5b604080517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526001608060020a03871660448201529051600160a060020a038516916323b872dd9160648083019260209291908290030181600087803b1580156133aa57600080fd5b505af11580156133be573d6000803e3d6000fd5b505050506040513d60208110156133d457600080fd5b505115156133e157600080fd5b63ffffffff8681166000908152601460209081526040808320868516845282528083209385168352929052205461342890608060020a90046001608060020a031686610f5d565b63ffffffff87811660009081526014602090815260408083208785168452825280832093861683529290522080546001608060020a03908116608060020a938216840217918290556ec097ce7bc90715b34b9f100000000192909104161061348f57600080fd5b6135ef565b63ffffffff82166000908152600b602052604090206001908101546301000000900460ff161515146134c557600080fd5b63ffffffff8681166000908152601460209081526040808320868516845282528083209385168352929052205461350c90608060020a90046001608060020a031686613216565b63ffffffff808816600090815260146020908152604080832087851684528252808320938616835292815282822080546001608060020a03958616608060020a0290861617905582517fa9059cbb00000000000000000000000000000000000000000000000000000000815233600482015293891660248501529151600160a060020a0387169363a9059cbb936044808301949193928390030190829087803b1580156135b857600080fd5b505af11580156135cc573d6000803e3d6000fd5b505050506040513d60208110156135e257600080fd5b505115156135ef57600080fd5b6135fc8682848789615a50565b505050505050565b60608060008063ffffffff85161515613630573360009081526010602052604090205463ffffffff1694505b61363b85600261512a565b50855191508160405190808252806020026020018201604052801561366a578160200160208202803883390190505b50935081604051908082528060200260200182016040528015613697578160200160208202803883390190505b509250600090505b818163ffffffff1610156137d25763ffffffff80881660009081526014602052604081208851909289919085169081106136d557fe5b60209081029190910181015163ffffffff90811683528282019390935260409182016000908120898516825290915220548551608060020a9091046001608060020a031691869190841690811061372857fe5b6001608060020a03909216602092830290910182015263ffffffff80891660009081526014909252604082208851909291899190851690811061376757fe5b602090810290910181015163ffffffff908116835282820193909352604091820160009081208985168252909152205484516001608060020a039091169185919084169081106137b357fe5b6001608060020a0390921660209283029091019091015260010161369f565b5050935093915050565b6137e4615e99565b3360009081526004602052604090205463ffffffff16151561380557600080fd5b600854341015806138205750600254600160a060020a031633145b151561382b57600080fd5b600160a060020a0382166000908152600a602052604090205463ffffffff161561385457600080fd5b601283111561386257600080fd5b6007805463ffffffff8082166001908101821663ffffffff1993841681178555600160a060020a039096166000818152600a602081815260408084208054909816909a1790965586548516825260098652888220805473ffffffffffffffffffffffffffffffffffffffff191690931790925597900a85523387526004835285872054821660a08601908152935482168752600b83528587208551815585840151910180548688015160608801516080890151975160c0909901516001606860020a0316604060020a0274ffffffffffffffffffffffffff0000000000000000199987166401000000000267ffffffff000000001999151563010000000263ff00000019931515620100000262ff0000199515156101000261ff001999151560ff1990981697909717989098169590951793909316959095171691909117959095169490941794909416939093179091557f3e5fec24aa4dc4e5aee2e025e51e1392c72a2500577559fae9665c6d52bd6a315490911683527fe05cd31702e6c5d366a557249766f77ad1ec870b62d942c3a61ebfada6a8e51e9052902080546001608060020a03608060020a808304821634018216029116179055565b6000806000846001605060020a03161115613a9f57613a3e8484612d30565b905060018515151415613a785780816001605060020a0316600186036001605060020a0316811515613a6c57fe5b04600101029150613aa3565b80816001605060020a0316856001605060020a0316811515613a9657fe5b04029150613aa3565b8391505b509392505050565b60008054606060020a900460ff161515600114613ac757600080fd5b60025463ffffffff60a060020a90910481169083161115613ae757600080fd5b613aef6156a1565b63ffffffff838116600090815260146020908152604080832060018452825280832093851683529290522054909150613b3890608060020a90046001608060020a031634610f5d565b63ffffffff80841660009081526014602090815260408083206001808552908352818420948716845293909152902080546001608060020a03938416608060020a02931692909217909155613b9b9083908390806001606860020a033416615a50565b5050565b69021e19e0c9bab240000181565b6007546040805163ffffffff90921680835260208082028401019091526060918291600091908015613be9578160200160208202803883390190505b506007546040805163ffffffff9092168083526020808202840101909152919450908015613c21578160200160208202803883390190505b509150600190505b60075463ffffffff9081169082161161236b5763ffffffff8082166000908152600960205260409020548451600160a060020a039091169185916000198501909116908110613c7457fe5b600160a060020a0390921660209283029091019091015281518190839063ffffffff600019840116908110613ca557fe5b63ffffffff909216602092830290910190910152600101613c29565b3360009081526004602052604081205460609182918190819063ffffffff16151580613cf75750600254600160a060020a031633145b1515613d0257600080fd5b60009250600191505b600c5463ffffffff90811690831611613d7f5763ffffffff88811660009081526014602090815260408083208b851684528252808320938616835292905220546001608060020a03878116608060020a8304821692821692909201161115613d74576001909201915b600190910190613d0b565b8263ffffffff16604051908082528060200260200182016040528015613daf578160200160208202803883390190505b5094508263ffffffff16604051908082528060200260200182016040528015613de2578160200160208202803883390190505b50935060009250600191505b600c5463ffffffff90811690831611613eb4575063ffffffff87811660009081526014602090815260408083208a851684528252808320938516835292905220546001608060020a03808216608060020a9092048116919091019086811690821610613ea95781858463ffffffff16815181101515613e6957fe5b63ffffffff9283166020918202909201015284516001850194839287929116908110613e9157fe5b6001608060020a039092166020928302909101909101525b600190910190613dee565b505050935093915050565b606080606080606080600080613ed3615e99565b600063ffffffff8c161515613efb573360009081526010602052604090205463ffffffff169b505b613f068c600461512a565b50601560008d63ffffffff1663ffffffff16815260200190815260200160002093508a61ffff16604051908082528060200260200182016040528015613f56578160200160208202803883390190505b5099508a61ffff16604051908082528060200260200182016040528015613f87578160200160208202803883390190505b5098508a61ffff16604051908082528060200260200182016040528015613fb8578160200160208202803883390190505b5097508a61ffff16604051908082528060200260200182016040528015613fe9578160200160208202803883390190505b5094508a61ffff1660405190808252806020026020018201604052801561401a578160200160208202803883390190505b5095508a61ffff1660405190808252806020026020018201604052801561404b578160200160208202803883390190505b50845490975063ffffffff169250821561425c575060005b63ffffffff83161580159061408157508a61ffff168163ffffffff16105b1561425c5763ffffffff838116600090815260126020908152604091829020825160e08101845281548086168083526401000000008204871694830194909452604060020a8104861694820194909452606060020a840485166060820152608060020a9093046001606860020a03166080840152600101546001605060020a03811660a08401526a0100000000000000000000900460ff16151560c0830152909350908e16141561423257828a8263ffffffff1681518110151561414157fe5b63ffffffff9283166020918202909201015260408301518a5190918b9190841690811061416a57fe5b63ffffffff928316602091820290920101526060830151895190918a9190841690811061419357fe5b63ffffffff9283166020918202909201015260808301518651909187919084169081106141bc57fe5b6001606860020a0390921660209283029091019091015260a08201518651879063ffffffff84169081106141ec57fe5b6001605060020a0390921660209283029091019091015260c082015187516001830192899163ffffffff90911690811061422257fe5b9115156020928302909101909101525b63ffffffff9283166000908152600185016020526040902054640100000000900490921691614063565b5050505093975093979195509350565b60608060008061427a615ed5565b86519250826040519080825280602002602001820160405280156142a8578160200160208202803883390190505b509450826040519080825280602002602001820160405280156142d5578160200160208202803883390190505b509350600091505b828210156143bf5763ffffffff86166000908152601360205260408120885190919089908590811061430b57fe5b602090810290910181015163ffffffff1682528181019290925260409081016000208151606081018352905460ff811682526001605060020a0361010082048116948301859052605860020a9091041691810191909152865190925086908490811061437357fe5b6001605060020a039092166020928302909101909101526040810151845185908490811061439d57fe5b6001605060020a039092166020928302909101909101526001909101906142dd565b5050509250929050565b600154600160a060020a031633146143e057600080fd5b600080546cff0000000000000000000000001916905563ffffffff82166001141561443157604051339082156108fc029083906000818181858888f19350505050151561442c57600080fd5b613b9b565b63ffffffff821660009081526009602090815260408083205481517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018690529151600160a060020a039091169363a9059cbb93604480850194919392918390030190829087803b1580156144b057600080fd5b505af11580156144c4573d6000803e3d6000fd5b505050506040513d60208110156144da57600080fd5b50505050565b3360009081526010602052604081205463ffffffff1680151561450257600080fd5b919050565b60008160c001511561457d57608082015163ffffffff84811660009081526014602090815260408083208188015185168452825280832082880151909416835292905220546001606860020a03909116608060020a9091046001608060020a03161061457557506001613233565b506000613233565b60408083015163ffffffff9081166000908152600b6020528281205460a0860151608087015160608801519094168352939091205490926402540be400926001606860020a0316919091026001605060020a0390911602048115156145de57fe5b63ffffffff858116600090815260146020908152604080832060608901518516845282528083208883015190941683529290522054919004608060020a9091046001608060020a03161061457557506001613233565b60008060008060008060008060008060008c6040015199508c6060015198508c60c00151151560011515141561467b578d5461010090046001605060020a03169750614690565b8d54605860020a90046001605060020a031697505b60009650600095505b6001605060020a038816158015906146be575060008d608001516001606860020a0316115b801561471a57508c60c0015180156146ec5750876001605060020a03168d60a001516001605060020a031611155b8061471a57508c60c0015115801561471a5750876001605060020a03168d60a001516001605060020a031610155b15614b845760c08d015115156001141561474f576001605060020a038816600090815260018f0160205260409020935061476c565b6001605060020a038816600090815260028f016020526040902093505b835463ffffffff1692505b835463ffffffff1615801590614792575063ffffffff831615155b80156147aa575060808d01516001606860020a031615155b15614b585763ffffffff8316600090815260126020526040902060808e015181549193506001606860020a03908116608060020a90920416106148395760808d01805183546001606860020a03608060020a8083048216849003909116027cffffffffffffffffffffffffff000000000000000000000000000000001990911617845560009091529450614881565b815460808e0180516001606860020a03608060020a8404811691829003169091527cffffffffffffffffffffffffff0000000000000000000000000000000019909116835594505b6040805160e081018252835463ffffffff8082168352640100000000820481166020840152604060020a8204811693830193909352606060020a81049092166060820152608060020a9091046001606860020a0316608082015260018301546001605060020a03811660a08301526a0100000000000000000000900460ff16151560c0820152614913908e9087615c90565b909501946c0c9f2c9cd04674edea400000016001606860020a0387161061493957600080fd5b5060208c015160c08d0151151560011415614a2057815460008054604060020a80820463ffffffff908116600181810183169093026bffffffff00000000000000001990941693909317909355604080518e85168152640100000000909504841660208601528584168582015260608501919091526001605060020a038c1660808501526001606860020a03891660a085015260c084019190915267ffffffffffffffff421660e084015251818f1692868316928e16917fd1baace08af1f93c73aedf5f7bce6194ecd40491b8f82a51f0b218fe1e0a2971918190036101000190a4614aeb565b8154600080546001604060020a80830463ffffffff90811692830181169091026bffffffff000000000000000019909316929092178355604080518e84168152868416602082015264010000000090950483168582015260608501939093526001605060020a038c1660808501526001606860020a03891660a085015260c084015267ffffffffffffffff421660e08401529051818616928f8316928e16917fd1baace08af1f93c73aedf5f7bce6194ecd40491b8f82a51f0b218fe1e0a2971918190036101000190a45b8154608060020a90046001606860020a031615614b0757614b58565b614b258a8a84600101600a9054906101000a900460ff168b876151aa565b151560011415614b49578154614b4990640100000000900463ffffffff168461557a565b835463ffffffff169250614777565b835463ffffffff161515614b7f578354604060020a90046001605060020a03169750600196505b614699565b60018715151415614c42578c60c0015115614bbf578d546affffffffffffffffffff0019166101006001605060020a038a1602178e55614bed565b8d5474ffffffffffffffffffff00000000000000000000001916605860020a6001605060020a038a1602178e555b60c08d015160408051911582526001605060020a038a166020830152805163ffffffff808d1693908e16927f02a998c439d01283c50acb516486f22eb80d74d328a8aa85743fac532c6e9bab92918290030190a35b50939c9b505050505050505050505050565b825160208401516040850151606086015160a0870151608088015160c08901516000908190819015614d435763ffffffff89811660009081526014602090815260408083208b851684528252808320938c168352929052208054909350614cd490608060020a90046001608060020a03166001606860020a038d16613216565b83546001608060020a03918216608060020a0291161783556001606860020a03841615614d3e578254614d19906001608060020a03166001606860020a038616610f5d565b83546fffffffffffffffffffffffffffffffff19166001608060020a03919091161783555b614ea8565b63ffffffff808a1660009081526014602090815260408083208a851684528252808320938c1683529290522092506001606860020a03841615614e615763ffffffff8088166000908152600b60205260408082205492891682529020546402540be400906001606860020a038716026001605060020a0388160204811515614dc757fe5b0491506c0c9f2c9cd04674edea400000018210614de357600080fd5b8254614e0a90608060020a90046001608060020a0316838c016001606860020a0316613216565b83546001608060020a03918216608060020a0290821617808555614e3891166001606860020a038416610f5d565b83546fffffffffffffffffffffffffffffffff19166001608060020a0391909116178355614e9f565b8254614e8690608060020a90046001608060020a03166001606860020a038c16613216565b83546001608060020a03918216608060020a0291161783555b838b0399508695505b6001606860020a038a16156150585763ffffffff89166000908152600560205260409020546127109060ff168b026001606860020a0316049050808a036001606860020a0316601460008b63ffffffff1663ffffffff16815260200190815260200160002060008863ffffffff1663ffffffff16815260200190815260200160002060008a63ffffffff1663ffffffff16815260200190815260200160002060000160108282829054906101000a90046001608060020a03160192506101000a8154816001608060020a0302191690836001608060020a03160217905550806001606860020a0316601460008b63ffffffff1663ffffffff16815260200190815260200160002060008863ffffffff1663ffffffff1681526020019081526020016000206000600660008d63ffffffff1663ffffffff16815260200190815260200160002060009054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060000160108282829054906101000a90046001608060020a03160192506101000a8154816001608060020a0302191690836001608060020a031602179055505b505050505050505050505050565b61506e615ef5565b5063ffffffff80831660009081526015602090815260409182902082519182019092529054909116808252156151015763ffffffff8084166000908152601560209081526040808320855185168452600101808352818420805486891663ffffffff199091168117909155865190855292529091208054919092166401000000000267ffffffff00000000199091161790555b5063ffffffff9182166000908152601560205260409020805463ffffffff191691909216179055565b3360009081526010602052604081205463ffffffff8481169116148061516b575063ffffffff83166000908152600d602052604090205460ff808416911610155b806151805750600254600160a060020a031633145b8061519f57503360009081526004602052604090205463ffffffff1615155b151561323357600080fd5b60008060006151b7615f07565b63ffffffff8089166000908152601360209081526040808320938d1683529290529081209350871515615205576001605060020a038716600090815260018501602052604090209250615222565b6001605060020a0387166000908152600285016020526040902092505b63ffffffff8616156155685763ffffffff8087166000908152600185016020908152604091829020825180840190935254808416835264010000000090049092169181018290529250156152a257815160208084015163ffffffff9081166000908152600187019092526040909120805463ffffffff1916919092161790555b815163ffffffff16156152ef57602082810151835163ffffffff9081166000908152600187019093526040909220805467ffffffff00000000191664010000000093909216929092021790555b825463ffffffff87811664010000000090920416141561532d578151835463ffffffff9091166401000000000267ffffffff00000000199091161783555b825463ffffffff87811691161415615359576020820151835463ffffffff191663ffffffff9091161783555b63ffffffff80871660009081526001850160205260409020805467ffffffffffffffff19169055835416151561555f578254604060020a90046001605060020a03161561542457600188151514156153d357508154604060020a90046001605060020a0316600090815260028401602052604090206153f7565b508154604060020a90046001605060020a0316600090815260018401602052604090205b82548154600080516020615f4683398151915216609060020a918290046001605060020a03169091021781555b8254609060020a90046001605060020a0316156154c4576001881515141561546e57508154609060020a90046001605060020a031660009081526002840160205260409020615492565b508154609060020a90046001605060020a0316600090815260018401602052604090205b8254815471ffffffffffffffffffff00000000000000001916604060020a918290046001605060020a03169091021781555b83546001605060020a03888116605860020a909204161415615517578254845474ffffffffffffffffffff00000000000000000000001916604060020a9091046001605060020a0316605860020a021784555b83546001605060020a0388811661010090920416141561555f57825484546affffffffffffffffffff001916610100604060020a9092046001605060020a0316919091021784555b6001945061556d565b600094505b5050505095945050505050565b615582615ef5565b5063ffffffff8281166000908152601560209081526040808320815180840183528154861681528686168552600190910190925290912054909164010000000082048116911681156156075763ffffffff858116600090815260156020908152604080832086851684526001019091529020805463ffffffff19169183169190911790555b63ffffffff8116156156595763ffffffff80861660009081526015602090815260408083208585168452600101909152902080549184166401000000000267ffffffff00000000199092169190911790555b8363ffffffff16836000015163ffffffff16141561569a5763ffffffff8581166000908152601560205260409020805463ffffffff19169184169190911790555b5050505050565b3360009081526010602052604081205463ffffffff16151561572557600c805463ffffffff808216600101811663ffffffff1992831681178455336000818152601060209081526040808320805490971690941790955594549092168452600e9092529120805473ffffffffffffffffffffffffffffffffffffffff191690911790555b503360009081526010602052604090205463ffffffff1690565b60608060008060008060008863ffffffff1660405190808252806020026020018201604052801561577a578160200160208202803883390190505b5096508863ffffffff166040519080825280602002602001820160405280156157ad578160200160208202803883390190505b5095508715156157ce57895461010090046001605060020a031692506157e3565b8954605860020a90046001605060020a031692505b6001605060020a03831615615a4357600094505b6001605060020a0383161580159061581a57508863ffffffff168563ffffffff16105b156159415787151561584657506001605060020a038216600090815260018a0160205260409020615862565b506001605060020a038216600090815260028a01602052604090205b805463ffffffff169350600091505b63ffffffff8416156158c85763ffffffff9384166000908152601260209081526040808320546001850190925290912054640100000000900490941693608060020a90046001606860020a03169190910190615871565b82878663ffffffff168151811015156158dd57fe5b6001605060020a0390921660209283029091019091015285518290879063ffffffff881690811061590a57fe5b6001606860020a0390921660209283029091019091015280546001909501946001605060020a03604060020a9091041692506157f7565b60008563ffffffff161115615a43575b8863ffffffff168563ffffffff161015615a4357600188151514156159d6576159a66001886001880363ffffffff1681518110151561598c57fe5b602090810290910101518c5460019091019060ff16613a1f565b878663ffffffff168151811015156159ba57fe5b6001605060020a03909216602092830290910190910152615a38565b615a0c60006001896001890363ffffffff168151811015156159f457fe5b602090810290910101518d549190039060ff16613a1f565b878663ffffffff16815181101515615a2057fe5b6001605060020a039092166020928302909101909101525b600190940193615951565b5050505050935093915050565b615a58615f1e565b821515602080830182815263ffffffff80881685526001608060020a03808716604080880191825267ffffffffffffffff42811660608a019081528e86166000908152601689528381208f881682528952838120805480891660019081018a1663ffffffff19928316811784558452918201909a529390208a5181549851955192519093167501000000000000000000000000000000000000000000027fffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff92909616650100000000000274ffffffffffffffffffffffffffffffff0000000000199515156401000000000264ff000000001994909816989099169790971791909116949094179190911694909417919091161790551415615c00576060808201516000805463ffffffff81811660018101821663ffffffff19909316929092179092556040805189841681526001608060020a038816602082015267ffffffffffffffff90941684820152938301529151828816928916917f6235021ead958d6a16078b65a45fa3dbae50d9def6d3783497c2253303b8fde5919081900360800190a36135fc565b6060808201516000805463ffffffff81811660018101821663ffffffff19909316929092179092556040805189841681526001608060020a038816602082015267ffffffffffffffff90941684820152938301529151828816928916917f24e4b81742f08bf8c724465f6c343cbf3f771ce88cdb98b2f9b531233c7b646a919081900360800190a3505050505050565b60208201516040840151606085015160009291908380806c0c9f2c9cd04674edea400000016001606860020a03891610615cc957600080fd5b63ffffffff8086166000908152600b60205260408082205460a08d0151938816835291205490916402540be400916001606860020a038c16026001605060020a039091160204811515615d1857fe5b0492506c0c9f2c9cd04674edea400000018310615d3457600080fd5b5050865163ffffffff9081166000908152601460208181526040808420888616855282528084208986168086529083528185208d5187168652938352818520958816855294825280842094845293905291902060c08a0151151560011415615e13578154615dbb90608060020a90046001608060020a03166001606860020a038a16610f5d565b82546001608060020a03918216608060020a029082161783558154615dea91166001606860020a038516613216565b81546fffffffffffffffffffffffffffffffff19166001608060020a0391909116178155615e8b565b8154615e31906001608060020a03166001606860020a038a16613216565b82546fffffffffffffffffffffffffffffffff19166001608060020a039182161783558154615e7291608060020a909104166001606860020a038516610f5d565b81546001608060020a03918216608060020a0291161781555b509098975050505050505050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b604080516060810182526000808252602082018190529181019190915290565b60408051602081019091526000815290565b604080518082019091526000808252602082015290565b604080516080810182526000808252602082018190529181018290526060810191909152905600ffffffff00000000000000000000ffffffffffffffffffffffffffffffffffffa165627a7a72305820163017106c52a92cc0571246a2021e799d6dcf30f81bfd460c2d7f35971c8e420029
Deployed Bytecode
0x6080604052600436106102715763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663072a0ea48114610276578063082c288f146102b95780630c145c87146102e757806329605e771461032e5780632d5a46ff146103515780633cdc23741461036657806341a6e1e0146104b35780634320a6cb146104d15780634b3488c2146104e65780634f34e1f9146104fb57806352ba28e41461052257806352bcfd5b146105375780635662ecc71461054c578063570ca73514610561578063598ecf36146105925780635a230af91461060c5780635d285c2c146106275780636422d517146106d5578063663754a31461070957806373ad468a14610724578063766fb7641461073957806376efb1e314610782578063899452e5146107ac5780638da5cb5b146108195780638dff9f921461082e5780638f95b64f14610843578063949ebfbd1461085b5780639a9f662c14610893578063a29685a51461091f578063a2b6d6d014610934578063a789044114610949578063ac1e9ef41461096f578063b5d759d914610990578063b83112ab146109ba578063ba96185a146109fd578063c7876ea414610a5d578063c7a9548014610a72578063ca7c2e4e14610aa3578063cae9de4314610acd578063cc74d6d814610b6e578063cd83644614610b8f578063cdcc799614610bb6578063cdf604e214610bf1578063d7c3595614610c59578063dd7da32214610c70578063dfdf577e14610c9c578063e38d6b5c14610cad578063e4c59a1714610cc2578063e8384e6814610cd7578063ef2e514014610d07578063f3d5d60a14610edf578063fe7d14a814610f3c575b600080fd5b34801561028257600080fd5b5061029d6001608060020a0360043581169060243516610f5d565b604080516001608060020a039092168252519081900360200190f35b3480156102c557600080fd5b506102ce610f9f565b6040805163ffffffff9092168252519081900360200190f35b3480156102f357600080fd5b506102ce63ffffffff6004358116906024358116906044351660643515156001605060020a03608435166001606860020a0360a43516610fb8565b34801561033a57600080fd5b5061034f600160a060020a0360043516611d93565b005b34801561035d57600080fd5b506102ce611dd9565b34801561037257600080fd5b5061039063ffffffff60043581169060243581169060443516611de5565b6040518080602001806020018060200180602001858103855289818151815260200191508051906020019060200280838360005b838110156103dc5781810151838201526020016103c4565b50505050905001858103845288818151815260200191508051906020019060200280838360005b8381101561041b578181015183820152602001610403565b50505050905001858103835287818151815260200191508051906020019060200280838360005b8381101561045a578181015183820152602001610442565b50505050905001858103825286818151815260200191508051906020019060200280838360005b83811015610499578181015183820152602001610481565b505050509050019850505050505050505060405180910390f35b3480156104bf57600080fd5b5061034f63ffffffff60043516612083565b3480156104dd57600080fd5b506102ce612104565b3480156104f257600080fd5b506102ce612117565b34801561050757600080fd5b50610510612140565b60408051918252519081900360200190f35b34801561052e57600080fd5b506102ce612146565b34801561054357600080fd5b506102ce61215a565b34801561055857600080fd5b506102ce61216d565b34801561056d57600080fd5b50610576612179565b60408051600160a060020a039092168252519081900360200190f35b34801561059e57600080fd5b506105b3600160a060020a0360043516612188565b6040805163ffffffff998a16815260208101989098529515158787015293151560608701529115156080860152151560a085015290931660c08301526001606860020a0390921660e08201529051908190036101000190f35b34801561061857600080fd5b5061034f60ff60043516612200565b34801561063357600080fd5b5061063c612238565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610680578181015183820152602001610668565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156106bf5781810151838201526020016106a7565b5050505090500194505050505060405180910390f35b3480156106e157600080fd5b506106f363ffffffff60043516612370565b6040805160ff9092168252519081900360200190f35b34801561071557600080fd5b5061034f60ff6004351661238b565b34801561073057600080fd5b5061029d6123e9565b34801561074557600080fd5b5061034f63ffffffff6004358116906024351515906044351515906064351515906084351515906001606860020a0360a435169060c435166123fc565b34801561078e57600080fd5b5061034f63ffffffff6004358116906024351660ff604435166124f7565b3480156107b857600080fd5b506107ca63ffffffff60043516612546565b6040805163ffffffff97881681529587166020870152931515858501526001605060020a0390921660608501526001606860020a0316608084015290921660a082015290519081900360c00190f35b34801561082557600080fd5b5061057661262e565b34801561083a57600080fd5b506102ce61263d565b34801561084f57600080fd5b5061034f600435612649565b34801561086757600080fd5b5061087f63ffffffff60043581169060243516612665565b604080519115158252519081900360200190f35b34801561089f57600080fd5b506108cf63ffffffff600435811690602435166001605060020a0360443516606435151561ffff608435166129e3565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561090b5781810151838201526020016108f3565b505050509050019250505060405180910390f35b34801561092b57600080fd5b506102ce612b39565b34801561094057600080fd5b5061087f612b45565b34801561095557600080fd5b5061034f6004351515600160a060020a0360243516612b55565b34801561097b57600080fd5b5061034f600160a060020a0360043516612bbc565b34801561099c57600080fd5b5061039063ffffffff60043581169060243581169060443516612cd3565b3480156109c657600080fd5b506109e16001605060020a036004351660ff60243516612d30565b604080516001605060020a039092168252519081900360200190f35b348015610a0957600080fd5b5060408051602060046024803582810135848102808701860190975280865261034f96843563ffffffff1696369660449591949091019291829185019084908082843750949750612e859650505050505050565b348015610a6957600080fd5b50610510612ec7565b348015610a7e57600080fd5b50610a87612ed0565b604080516001606860020a039092168252519081900360200190f35b348015610aaf57600080fd5b5061034f63ffffffff600435166001606860020a0360243516612ee1565b348015610ad957600080fd5b50604080516020600460443581810135838102808601850190965280855261034f95833563ffffffff9081169660248035909216963696956064959294930192829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750949750612fee9650505050505050565b348015610b7a57600080fd5b506102ce600160a060020a03600435166131f5565b348015610b9b57600080fd5b5061029d6001608060020a0360043581169060243516613216565b348015610bc257600080fd5b5061034f63ffffffff600435166001608060020a03602435166044351515600160a060020a0360643516613239565b348015610bfd57600080fd5b5060408051602060046024803582810135848102808701860190975280865261063c96843563ffffffff16963696604495919490910192918291850190849080828437509497505050923563ffffffff16935061360492505050565b61034f600435600160a060020a03602435166137dc565b348015610c7c57600080fd5b506109e160043515156001605060020a036024351660ff60443516613a1f565b61034f63ffffffff60043516613aab565b348015610cb957600080fd5b506109e1613b9f565b348015610cce57600080fd5b5061063c613bad565b348015610ce357600080fd5b5061063c63ffffffff600435811690602435166001608060020a0360443516613cc1565b348015610d1357600080fd5b50610d3263ffffffff6004358116906024351661ffff60443516613ebf565b6040518080602001806020018060200180602001806020018060200187810387528d818151815260200191508051906020019060200280838360005b83811015610d86578181015183820152602001610d6e565b5050505090500187810386528c818151815260200191508051906020019060200280838360005b83811015610dc5578181015183820152602001610dad565b5050505090500187810385528b818151815260200191508051906020019060200280838360005b83811015610e04578181015183820152602001610dec565b5050505090500187810384528a818151815260200191508051906020019060200280838360005b83811015610e43578181015183820152602001610e2b565b50505050905001878103835289818151815260200191508051906020019060200280838360005b83811015610e82578181015183820152602001610e6a565b50505050905001878103825288818151815260200191508051906020019060200280838360005b83811015610ec1578181015183820152602001610ea9565b505050509050019c5050505050505050505050505060405180910390f35b348015610eeb57600080fd5b506040805160206004803580820135838102808601850190965280855261063c953695939460249493850192918291850190849080828437509497505050923563ffffffff16935061426c92505050565b348015610f4857600080fd5b5061034f63ffffffff600435166024356143c9565b60008282016001608060020a0380851690821610801590610f905750826001608060020a0316816001608060020a031610155b1515610f9857fe5b9392505050565b3360009081526010602052604090205463ffffffff1690565b600080600080610fc6615e99565b6000805481908190606060020a900460ff161515600114610fe657600080fd5b610fee6144e0565b63ffffffff81166000908152600f602052604090205490975060ff161561101457600080fd5b601360008d63ffffffff1663ffffffff16815260200190815260200160002060008e63ffffffff1663ffffffff1681526020019081526020016000209450896001605060020a031660001415801561107f575069021e19e0c9bab24000016001605060020a038b1611155b80156110a157506c0c9f2c9cd04674edea400000016001606860020a038a1611155b801561116457508a1580156110d3575063ffffffff8d166000908152600b6020526040902060019081015460ff161515145b8015611101575063ffffffff8c166000908152600b60205260409020600190810154610100900460ff161515145b80611164575060018b151514801561113b575063ffffffff8d166000908152600b60205260409020600190810154610100900460ff161515145b8015611164575063ffffffff8c166000908152600b6020526040902060019081015460ff161515145b801561119b575063ffffffff8d166000908152600b60205260409020600101546001606860020a03808b16604060020a9092041611155b15156111a657600080fd5b60018b151514156111e05784546111c4906001908c9060ff16613a1f565b8554909a50605860020a90046001605060020a03169550611209565b84546111f3906000908c9060ff16613a1f565b8554909a5061010090046001605060020a031695505b63ffffffff808f1685528b151560c08601528d811660408601528c81166060860152871660208501526001605060020a038a1660a08501526001606860020a038916608085015261125a8e85614507565b151561126557600080fd5b836020015163ffffffff16846060015163ffffffff16856040015163ffffffff167f779bcb03f0f0b9518125c9665fdc55d28e5e899384a7fb39dd366ec3177671b66011600081819054906101000a900463ffffffff1660010191906101000a81548163ffffffff021916908363ffffffff16021790558860c001518960a001518a608001516000600481819054906101000a900463ffffffff168092919060010191906101000a81548163ffffffff021916908363ffffffff160217905550604051808663ffffffff1663ffffffff16815260200185151515158152602001846001605060020a03166001605060020a03168152602001836001606860020a03166001606860020a031681526020018263ffffffff1663ffffffff1681526020019550505050505060405180910390a46011546113b99085908b906113b4908990849063ffffffff16614634565b614c54565b60808401516001606860020a031615611c325760018b151514156116f9578454605860020a90046001605060020a03169150811515611459576001605060020a038a166000818152600287016020526040902080547bffffffffffffffffffffffffffffffffffffffff000000000000000019169055855474ffffffffffffffffffff00000000000000000000001916605860020a9091021785556116d9565b816001605060020a03168a6001605060020a03161015611515576001605060020a0380831660008181526002880160205260408082208054948f16609060020a8102600080516020615f4683398151915290961695909517905583825290208054604060020a9092027bffffffffffffffffffffffffffffffffffffffff0000000000000000199092169190911790558554605860020a90910274ffffffffffffffffffff0000000000000000000000199091161785556116d9565b6001605060020a038a16600090815260028601602052604090205463ffffffff1615156116d9578192505b6001605060020a038316158015906115695750896001605060020a0316836001605060020a0316105b1561159a576001605060020a038084166000908152600287016020526040902054604060020a900416929150611540565b89856002016000846001605060020a03166001605060020a0316815260200190815260200160002060000160086101000a8154816001605060020a0302191690836001605060020a03160217905550818560020160008c6001605060020a03166001605060020a0316815260200190815260200160002060000160126101000a8154816001605060020a0302191690836001605060020a03160217905550828560020160008c6001605060020a03166001605060020a0316815260200190815260200160002060000160086101000a8154816001605060020a0302191690836001605060020a03160217905550826001605060020a031660001415156116d9576001605060020a03808416600090815260028701602052604090208054918c16609060020a02600080516020615f468339815191529092169190911790555b506001605060020a038916600090815260028501602052604090206119fe565b845461010090046001605060020a0316915081151561176d576001605060020a038a166000818152600187016020526040902080547bffffffffffffffffffffffffffffffffffffffff00000000000000001916905585546affffffffffffffffffff0019166101009091021785556119e2565b816001605060020a03168a6001605060020a0316111561181e576001605060020a0380831660008181526001880160205260408082208054948f16609060020a8102600080516020615f4683398151915290961695909517905583825290208054604060020a9092027bffffffffffffffffffffffffffffffffffffffff0000000000000000199092169190911790558554610100919091026affffffffffffffffffff00199091161785556119e2565b6001605060020a038a16600090815260018601602052604090205463ffffffff1615156119e2578192505b6001605060020a038316158015906118725750896001605060020a0316836001605060020a0316115b156118a3576001605060020a038084166000908152600187016020526040902054604060020a900416929150611849565b89856001016000846001605060020a03166001605060020a0316815260200190815260200160002060000160086101000a8154816001605060020a0302191690836001605060020a03160217905550818560010160008c6001605060020a03166001605060020a0316815260200190815260200160002060000160126101000a8154816001605060020a0302191690836001605060020a03160217905550828560010160008c6001605060020a03166001605060020a0316815260200190815260200160002060000160086101000a8154816001605060020a0302191690836001605060020a03160217905550826001605060020a031660001415156119e2576001605060020a03808416600090815260018701602052604090208054918c16609060020a02600080516020615f468339815191529092169190911790555b506001605060020a038916600090815260018501602052604090205b60115463ffffffff1615611aed57805460115463ffffffff90811660009081526001840160205260409020805463ffffffff191664010000000090930482169290921790915581541615611a8e57601154815463ffffffff64010000000091829004811660009081526001850160205260409020805467ffffffff00000000191691909316909102179055611aca565b6011805463ffffffff90811660009081526001840160205260409020805467ffffffff00000000191690559054825463ffffffff191691161781555b601154815467ffffffff00000000191663ffffffff909116640100000000021781555b601154611b0190889063ffffffff16615066565b60115463ffffffff90811660009081526012602090815260409182902087518154928901519389015160608a015160808b01516001606860020a0316608060020a027cffffffffffffffffffffffffff0000000000000000000000000000000019918816606060020a026fffffffff00000000000000000000000019938916604060020a026bffffffff000000000000000019988a166401000000000267ffffffff000000001996909a1663ffffffff19909816979097179490941697909717959095169390931792909216919091179190911691909117815560a0850151600191909101805460c087015115156a0100000000000000000000026aff00000000000000000000196001605060020a0390941669ffffffffffffffffffff1990921691909117929092169190911790555b60018b1515148015611c58575084546001605060020a03878116605860020a9092041614155b15611cd8578b63ffffffff168d63ffffffff167f02a998c439d01283c50acb516486f22eb80d74d328a8aa85743fac532c6e9bab8d88600001600b9054906101000a90046001605060020a03166040518083151515158152602001826001605060020a03166001605060020a031681526020019250505060405180910390a35b8a158015611cf8575084546001605060020a038781166101009092041614155b15611d78578b63ffffffff168d63ffffffff167f02a998c439d01283c50acb516486f22eb80d74d328a8aa85743fac532c6e9bab8d8860000160019054906101000a90046001605060020a03166040518083151515158152602001826001605060020a03166001605060020a031681526020019250505060405180910390a35b505060115463ffffffff169c9b505050505050505050505050565b600154600160a060020a03163314611daa57600080fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600c5463ffffffff1681565b6060806060806000806000611dfb88600361512a565b5063ffffffff808a1660009081526016602090815260408083208c8516845290915290208054909450811692508a16821115611e35578991505b8163ffffffff16604051908082528060200260200182016040528015611e65578160200160208202803883390190505b5096508163ffffffff16604051908082528060200260200182016040528015611e98578160200160208202803883390190505b5095508163ffffffff16604051908082528060200260200182016040528015611ecb578160200160208202803883390190505b5094508163ffffffff16604051908082528060200260200182016040528015611efe578160200160208202803883390190505b50835490945063ffffffff1690505b825463ffffffff9081168390038116908216111561207757825463ffffffff808316600090815260018601602052604090205489519282168490039c5081169189918d16908110611f5a57fe5b63ffffffff9283166020918202929092018101919091528282166000908152600186019091526040902054875164010000000090910460ff16918891908d16908110611fa257fe5b91151560209283029190910182015263ffffffff8281166000908152600186019092526040909120548651650100000000009091046001608060020a0316918791908d16908110611fef57fe5b6001608060020a039290921660209283029190910182015263ffffffff8281166000908152600186019092526040909120548551750100000000000000000000000000000000000000000090910467ffffffffffffffff16918691908d1690811061205657fe5b67ffffffffffffffff90921660209283029091019091015260001901611f0d565b50505093509350935093565b600254600160a060020a0316331461209a57600080fd5b60025463ffffffff80831660a060020a90920416108015906120c2575060008163ffffffff16115b15156120cd57600080fd5b63ffffffff16600090815260036020908152604080832054600160a060020a0316835260049091529020805463ffffffff19169055565b60025460a060020a900463ffffffff1681565b3360009081526010602090815260408083205463ffffffff168352600d90915290205460ff1690565b60085481565b600054640100000000900463ffffffff1681565b600054604060020a900463ffffffff1681565b60115463ffffffff1681565b600254600160a060020a031681565b600160a060020a03166000908152600a602090815260408083205463ffffffff908116808552600b909352922080546001909101549193909260ff808416936101008104821693620100008204831693630100000083049093169264010000000083041691604060020a90046001606860020a031690565b80600d600061220d6144e0565b63ffffffff1681526020810191909152604001600020805460ff191660ff9290921691909117905550565b6060806000600260149054906101000a900463ffffffff1663ffffffff1660405190808252806020026020018201604052801561227f578160200160208202803883390190505b509250600260149054906101000a900463ffffffff1663ffffffff166040519080825280602002602001820160405280156122c4578160200160208202803883390190505b509150600190505b60025463ffffffff60a060020a90910481169082161161236b5763ffffffff8082166000908152600360205260409020548451600160a060020a03909116918591600019850190911690811061231e57fe5b600160a060020a0390921660209283029091019091015281518190839063ffffffff60001984011690811061234f57fe5b63ffffffff9092166020928302909101909101526001016122cc565b509091565b63ffffffff1660009081526005602052604090205460ff1690565b6000606460ff8316111561239e57600080fd5b503360009081526004602052604090205463ffffffff168015156123c157600080fd5b63ffffffff166000908152600560205260409020805460ff191660ff92909216919091179055565b6ec097ce7bc90715b34b9f100000000181565b63ffffffff87166000908152600b60205260409020600254600160a060020a031633148061244e575060018101543360009081526004602052604090205463ffffffff90811664010000000090920416145b151561245957600080fd5b600101805460ff19169615159690961761ff001916610100951515959095029490941762ff0000191662010000931515939093029290921763ff00000019166301000000911515919091021774ffffffffffffffffffffffffff00000000000000001916604060020a6001606860020a0392909216919091021767ffffffff00000000191664010000000063ffffffff929092169190910217905550565b600254600160a060020a0316331461250e57600080fd5b63ffffffff9182166000908152601360209081526040808320959094168252939093529120805460ff191660ff909216919091179055565b600080600080600080612557615e99565b505063ffffffff868116600090815260126020908152604091829020825160e0810184528154808616825264010000000081048616938201849052604060020a8104861694820194909452606060020a84049094166060850152608060020a9092046001606860020a031660808401526001909101546001605060020a03811660a08401526a0100000000000000000000900460ff16151560c08301529061260082600461512a565b5080604001519650806060015195508060a0015193508060c001519450806080015192505091939550919395565b600154600160a060020a031681565b60075463ffffffff1681565b600254600160a060020a0316331461266057600080fd5b600855565b600061266f615e99565b5063ffffffff8281166000908152601260209081526040808320815160e0810183528154808716825264010000000081048716828601908152604060020a8204881683860152606060020a820488166060840152608060020a9091046001606860020a031660808301526001909201546001605060020a03811660a08301526a0100000000000000000000900460ff16151560c082015233855260109093529083205490519193908116929182918291829182918291829116881461273357600080fd5b88604001519650886060015195508860c0015194508860a00151935088608001519250612763878787878f6151aa565b151561277257600099506129d4565b61277c888c61557a565b841561282d5763ffffffff8c811660009081526014602090815260408083208b851684528252808320938c1683529290522080549092506127d690608060020a90046001608060020a03166001606860020a038516610f5d565b82546001608060020a03918216608060020a029082161780845561280491166001606860020a038516613216565b82546fffffffffffffffffffffffffffffffff19166001608060020a0391909116178255612930565b63ffffffff808d1660009081526014602090815260408083208a85168085529083528184208d861685528352818420948c168452600b9092528083205491835290912054919350906402540be400906001606860020a038616026001605060020a038716020481151561289c57fe5b0490506c0c9f2c9cd04674edea4000000181106128b857600080fd5b81546128dd90608060020a90046001608060020a03166001606860020a038316610f5d565b82546001608060020a03918216608060020a029082161780845561290b91166001606860020a038316613216565b82546fffffffffffffffffffffffffffffffff19166001608060020a03919091161782555b60008054600164010000000080830463ffffffff908116928301811690910267ffffffff000000001990931692909217909255604080518e8316815288151560208201526001605060020a038816818301526001606860020a0387166060820152608081019390935251818b1692898316928b16917f6f8015e56b17b22535b1afdd1a99929ea0ef7348dfd6b4b414474f8b5caeb2f09181900360a00190a4600199505b50505050505050505092915050565b606060008080851515612a2d5763ffffffff8089166000908152601360209081526040808320938d1683529281528282206001605060020a038b1683526001019052209250612a7a565b60018615151415612a755763ffffffff8089166000908152601360209081526040808320938d1683529281528282206001605060020a038b1683526002019052209250612a7a565b612b2d565b8461ffff16604051908082528060200260200182016040528015612aa8578160200160208202803883390190505b5083549094506000925063ffffffff1690505b63ffffffff811615801590612ad757508161ffff168561ffff16115b15612b2d57835160018301928291869161ffff16908110612af457fe5b63ffffffff9283166020918202909201810191909152918116600090815260018501909252604090912054640100000000900416612abb565b50505095945050505050565b60005463ffffffff1681565b600054606060020a900460ff1681565b600254600090600160a060020a03163314612b6f57600080fd5b50600160a060020a03811660009081526010602052604090205463ffffffff168015612bb75763ffffffff81166000908152600f60205260409020805460ff19168415151790555b505050565b600254600160a060020a03163314612bd357600080fd5b600160a060020a03811660009081526004602052604090205463ffffffff1615612bfc57600080fd5b6002805477ffffffff000000000000000000000000000000000000000019811660a060020a9182900463ffffffff9081166001018116808402929092178455600160a060020a0385166000818152600460209081526040808320805463ffffffff1916909617909555955494909404909116835260039093529020805473ffffffffffffffffffffffffffffffffffffffff19169091179055612c9d6156a1565b60025460a060020a900463ffffffff9081166000908152600660205260409020805463ffffffff19169290911691909117905550565b63ffffffff8083166000908152601360209081526040808320938716835292905290812060609182918291829190612d0e908290889061573f565b9095509350612d1f8187600161573f565b959994985096509394509192505050565b600080600080600060018660ff161015612d4957600195505b60019350600192505b600260ff87160460ff168360ff16111515612d7957600a9390930292600190920191612d52565b83600a026001605060020a0316876001605060020a03161015612d9f5760019450612e7b565b61271091506001605060020a0384811690600a8982160416811515612dc057fe5b0490505b816001605060020a0316816001605060020a03161115612de957600a82029150612dc4565b816001605060020a0316816001605060020a03161015612e1757600a6001605060020a038316049150612de9565b60018087161415612e46576001605060020a03828502603202811690881610612e41576005820291505b612e77565b8382603202026001605060020a0316876001605060020a03161015612e7057600582029150612e77565b600a820291505b8194505b5050505092915050565b60005b81518163ffffffff161015612bb757612ebe83838363ffffffff16815181101515612eaf57fe5b90602001906020020151612665565b50600101612e88565b6402540be40081565b6c0c9f2c9cd04674edea4000000181565b6000612eeb6144e0565b63ffffffff81166000908152600f602052604090205490915060ff1615612f1157600080fd5b63ffffffff838116600090815260146020908152604080832060018452825280832093851683529290522054612f6090608060020a90046001608060020a03166001606860020a038416613216565b63ffffffff8085166000908152601460209081526040808320600184528252808320938616835292905281812080546001608060020a03948516608060020a029416939093179092555133916001606860020a03851680156108fc02929091818181858888f193505050501515612fd657600080fd5b612bb7838260016000866001606860020a0316615a50565b3360009081526004602052604081205481908190819063ffffffff16151561301557600080fd5b61301d6144e0565b63ffffffff81166000908152600f602052604090205490945060ff161561304357600080fd5b85518551909350831461305557600080fd5b5060009050805b828163ffffffff16101561309e57848163ffffffff1681518110151561307e57fe5b602090810290910101516001606860020a0316919091019060010161305c565b63ffffffff88811660009081526014602090815260408083208b851684528252808320938816835292905220546130e590608060020a90046001608060020a031683613216565b63ffffffff808a1660009081526014602090815260408083208c851684528252808320938916835292905290812080546001608060020a03938416608060020a0293169290921790915590505b828163ffffffff1610156131eb57848163ffffffff1681518110151561315457fe5b602090810290910181015163ffffffff808b1660009081526014845260408082208c8416835290945292832089516001606860020a0390931693909290918a919086169081106131a057fe5b602090810290910181015163ffffffff16825281019190915260400160002080546001608060020a03608060020a808304821690940181169093029216919091179055600101613132565b5050505050505050565b600160a060020a031660009081526010602052604090205463ffffffff1690565b60006001608060020a03808416908316111561322e57fe5b508082035b92915050565b600160a060020a0381166000908152600a602052604081205463ffffffff16906ec097ce7bc90715b34b9f10000000016001608060020a038616108015613285575063ffffffff821615155b151561329057600080fd5b6132986156a1565b63ffffffff81166000908152600f602052604090205490915060ff16156132be57600080fd5b600184151514156134945763ffffffff82166000908152600b6020526040902060019081015462010000900460ff16151514801561330a5750600054606060020a900460ff1615156001145b8015613329575060025463ffffffff60a060020a909104811690871611155b151561333457600080fd5b604080517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526001608060020a03871660448201529051600160a060020a038516916323b872dd9160648083019260209291908290030181600087803b1580156133aa57600080fd5b505af11580156133be573d6000803e3d6000fd5b505050506040513d60208110156133d457600080fd5b505115156133e157600080fd5b63ffffffff8681166000908152601460209081526040808320868516845282528083209385168352929052205461342890608060020a90046001608060020a031686610f5d565b63ffffffff87811660009081526014602090815260408083208785168452825280832093861683529290522080546001608060020a03908116608060020a938216840217918290556ec097ce7bc90715b34b9f100000000192909104161061348f57600080fd5b6135ef565b63ffffffff82166000908152600b602052604090206001908101546301000000900460ff161515146134c557600080fd5b63ffffffff8681166000908152601460209081526040808320868516845282528083209385168352929052205461350c90608060020a90046001608060020a031686613216565b63ffffffff808816600090815260146020908152604080832087851684528252808320938616835292815282822080546001608060020a03958616608060020a0290861617905582517fa9059cbb00000000000000000000000000000000000000000000000000000000815233600482015293891660248501529151600160a060020a0387169363a9059cbb936044808301949193928390030190829087803b1580156135b857600080fd5b505af11580156135cc573d6000803e3d6000fd5b505050506040513d60208110156135e257600080fd5b505115156135ef57600080fd5b6135fc8682848789615a50565b505050505050565b60608060008063ffffffff85161515613630573360009081526010602052604090205463ffffffff1694505b61363b85600261512a565b50855191508160405190808252806020026020018201604052801561366a578160200160208202803883390190505b50935081604051908082528060200260200182016040528015613697578160200160208202803883390190505b509250600090505b818163ffffffff1610156137d25763ffffffff80881660009081526014602052604081208851909289919085169081106136d557fe5b60209081029190910181015163ffffffff90811683528282019390935260409182016000908120898516825290915220548551608060020a9091046001608060020a031691869190841690811061372857fe5b6001608060020a03909216602092830290910182015263ffffffff80891660009081526014909252604082208851909291899190851690811061376757fe5b602090810290910181015163ffffffff908116835282820193909352604091820160009081208985168252909152205484516001608060020a039091169185919084169081106137b357fe5b6001608060020a0390921660209283029091019091015260010161369f565b5050935093915050565b6137e4615e99565b3360009081526004602052604090205463ffffffff16151561380557600080fd5b600854341015806138205750600254600160a060020a031633145b151561382b57600080fd5b600160a060020a0382166000908152600a602052604090205463ffffffff161561385457600080fd5b601283111561386257600080fd5b6007805463ffffffff8082166001908101821663ffffffff1993841681178555600160a060020a039096166000818152600a602081815260408084208054909816909a1790965586548516825260098652888220805473ffffffffffffffffffffffffffffffffffffffff191690931790925597900a85523387526004835285872054821660a08601908152935482168752600b83528587208551815585840151910180548688015160608801516080890151975160c0909901516001606860020a0316604060020a0274ffffffffffffffffffffffffff0000000000000000199987166401000000000267ffffffff000000001999151563010000000263ff00000019931515620100000262ff0000199515156101000261ff001999151560ff1990981697909717989098169590951793909316959095171691909117959095169490941794909416939093179091557f3e5fec24aa4dc4e5aee2e025e51e1392c72a2500577559fae9665c6d52bd6a315490911683527fe05cd31702e6c5d366a557249766f77ad1ec870b62d942c3a61ebfada6a8e51e9052902080546001608060020a03608060020a808304821634018216029116179055565b6000806000846001605060020a03161115613a9f57613a3e8484612d30565b905060018515151415613a785780816001605060020a0316600186036001605060020a0316811515613a6c57fe5b04600101029150613aa3565b80816001605060020a0316856001605060020a0316811515613a9657fe5b04029150613aa3565b8391505b509392505050565b60008054606060020a900460ff161515600114613ac757600080fd5b60025463ffffffff60a060020a90910481169083161115613ae757600080fd5b613aef6156a1565b63ffffffff838116600090815260146020908152604080832060018452825280832093851683529290522054909150613b3890608060020a90046001608060020a031634610f5d565b63ffffffff80841660009081526014602090815260408083206001808552908352818420948716845293909152902080546001608060020a03938416608060020a02931692909217909155613b9b9083908390806001606860020a033416615a50565b5050565b69021e19e0c9bab240000181565b6007546040805163ffffffff90921680835260208082028401019091526060918291600091908015613be9578160200160208202803883390190505b506007546040805163ffffffff9092168083526020808202840101909152919450908015613c21578160200160208202803883390190505b509150600190505b60075463ffffffff9081169082161161236b5763ffffffff8082166000908152600960205260409020548451600160a060020a039091169185916000198501909116908110613c7457fe5b600160a060020a0390921660209283029091019091015281518190839063ffffffff600019840116908110613ca557fe5b63ffffffff909216602092830290910190910152600101613c29565b3360009081526004602052604081205460609182918190819063ffffffff16151580613cf75750600254600160a060020a031633145b1515613d0257600080fd5b60009250600191505b600c5463ffffffff90811690831611613d7f5763ffffffff88811660009081526014602090815260408083208b851684528252808320938616835292905220546001608060020a03878116608060020a8304821692821692909201161115613d74576001909201915b600190910190613d0b565b8263ffffffff16604051908082528060200260200182016040528015613daf578160200160208202803883390190505b5094508263ffffffff16604051908082528060200260200182016040528015613de2578160200160208202803883390190505b50935060009250600191505b600c5463ffffffff90811690831611613eb4575063ffffffff87811660009081526014602090815260408083208a851684528252808320938516835292905220546001608060020a03808216608060020a9092048116919091019086811690821610613ea95781858463ffffffff16815181101515613e6957fe5b63ffffffff9283166020918202909201015284516001850194839287929116908110613e9157fe5b6001608060020a039092166020928302909101909101525b600190910190613dee565b505050935093915050565b606080606080606080600080613ed3615e99565b600063ffffffff8c161515613efb573360009081526010602052604090205463ffffffff169b505b613f068c600461512a565b50601560008d63ffffffff1663ffffffff16815260200190815260200160002093508a61ffff16604051908082528060200260200182016040528015613f56578160200160208202803883390190505b5099508a61ffff16604051908082528060200260200182016040528015613f87578160200160208202803883390190505b5098508a61ffff16604051908082528060200260200182016040528015613fb8578160200160208202803883390190505b5097508a61ffff16604051908082528060200260200182016040528015613fe9578160200160208202803883390190505b5094508a61ffff1660405190808252806020026020018201604052801561401a578160200160208202803883390190505b5095508a61ffff1660405190808252806020026020018201604052801561404b578160200160208202803883390190505b50845490975063ffffffff169250821561425c575060005b63ffffffff83161580159061408157508a61ffff168163ffffffff16105b1561425c5763ffffffff838116600090815260126020908152604091829020825160e08101845281548086168083526401000000008204871694830194909452604060020a8104861694820194909452606060020a840485166060820152608060020a9093046001606860020a03166080840152600101546001605060020a03811660a08401526a0100000000000000000000900460ff16151560c0830152909350908e16141561423257828a8263ffffffff1681518110151561414157fe5b63ffffffff9283166020918202909201015260408301518a5190918b9190841690811061416a57fe5b63ffffffff928316602091820290920101526060830151895190918a9190841690811061419357fe5b63ffffffff9283166020918202909201015260808301518651909187919084169081106141bc57fe5b6001606860020a0390921660209283029091019091015260a08201518651879063ffffffff84169081106141ec57fe5b6001605060020a0390921660209283029091019091015260c082015187516001830192899163ffffffff90911690811061422257fe5b9115156020928302909101909101525b63ffffffff9283166000908152600185016020526040902054640100000000900490921691614063565b5050505093975093979195509350565b60608060008061427a615ed5565b86519250826040519080825280602002602001820160405280156142a8578160200160208202803883390190505b509450826040519080825280602002602001820160405280156142d5578160200160208202803883390190505b509350600091505b828210156143bf5763ffffffff86166000908152601360205260408120885190919089908590811061430b57fe5b602090810290910181015163ffffffff1682528181019290925260409081016000208151606081018352905460ff811682526001605060020a0361010082048116948301859052605860020a9091041691810191909152865190925086908490811061437357fe5b6001605060020a039092166020928302909101909101526040810151845185908490811061439d57fe5b6001605060020a039092166020928302909101909101526001909101906142dd565b5050509250929050565b600154600160a060020a031633146143e057600080fd5b600080546cff0000000000000000000000001916905563ffffffff82166001141561443157604051339082156108fc029083906000818181858888f19350505050151561442c57600080fd5b613b9b565b63ffffffff821660009081526009602090815260408083205481517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018690529151600160a060020a039091169363a9059cbb93604480850194919392918390030190829087803b1580156144b057600080fd5b505af11580156144c4573d6000803e3d6000fd5b505050506040513d60208110156144da57600080fd5b50505050565b3360009081526010602052604081205463ffffffff1680151561450257600080fd5b919050565b60008160c001511561457d57608082015163ffffffff84811660009081526014602090815260408083208188015185168452825280832082880151909416835292905220546001606860020a03909116608060020a9091046001608060020a03161061457557506001613233565b506000613233565b60408083015163ffffffff9081166000908152600b6020528281205460a0860151608087015160608801519094168352939091205490926402540be400926001606860020a0316919091026001605060020a0390911602048115156145de57fe5b63ffffffff858116600090815260146020908152604080832060608901518516845282528083208883015190941683529290522054919004608060020a9091046001608060020a03161061457557506001613233565b60008060008060008060008060008060008c6040015199508c6060015198508c60c00151151560011515141561467b578d5461010090046001605060020a03169750614690565b8d54605860020a90046001605060020a031697505b60009650600095505b6001605060020a038816158015906146be575060008d608001516001606860020a0316115b801561471a57508c60c0015180156146ec5750876001605060020a03168d60a001516001605060020a031611155b8061471a57508c60c0015115801561471a5750876001605060020a03168d60a001516001605060020a031610155b15614b845760c08d015115156001141561474f576001605060020a038816600090815260018f0160205260409020935061476c565b6001605060020a038816600090815260028f016020526040902093505b835463ffffffff1692505b835463ffffffff1615801590614792575063ffffffff831615155b80156147aa575060808d01516001606860020a031615155b15614b585763ffffffff8316600090815260126020526040902060808e015181549193506001606860020a03908116608060020a90920416106148395760808d01805183546001606860020a03608060020a8083048216849003909116027cffffffffffffffffffffffffff000000000000000000000000000000001990911617845560009091529450614881565b815460808e0180516001606860020a03608060020a8404811691829003169091527cffffffffffffffffffffffffff0000000000000000000000000000000019909116835594505b6040805160e081018252835463ffffffff8082168352640100000000820481166020840152604060020a8204811693830193909352606060020a81049092166060820152608060020a9091046001606860020a0316608082015260018301546001605060020a03811660a08301526a0100000000000000000000900460ff16151560c0820152614913908e9087615c90565b909501946c0c9f2c9cd04674edea400000016001606860020a0387161061493957600080fd5b5060208c015160c08d0151151560011415614a2057815460008054604060020a80820463ffffffff908116600181810183169093026bffffffff00000000000000001990941693909317909355604080518e85168152640100000000909504841660208601528584168582015260608501919091526001605060020a038c1660808501526001606860020a03891660a085015260c084019190915267ffffffffffffffff421660e084015251818f1692868316928e16917fd1baace08af1f93c73aedf5f7bce6194ecd40491b8f82a51f0b218fe1e0a2971918190036101000190a4614aeb565b8154600080546001604060020a80830463ffffffff90811692830181169091026bffffffff000000000000000019909316929092178355604080518e84168152868416602082015264010000000090950483168582015260608501939093526001605060020a038c1660808501526001606860020a03891660a085015260c084015267ffffffffffffffff421660e08401529051818616928f8316928e16917fd1baace08af1f93c73aedf5f7bce6194ecd40491b8f82a51f0b218fe1e0a2971918190036101000190a45b8154608060020a90046001606860020a031615614b0757614b58565b614b258a8a84600101600a9054906101000a900460ff168b876151aa565b151560011415614b49578154614b4990640100000000900463ffffffff168461557a565b835463ffffffff169250614777565b835463ffffffff161515614b7f578354604060020a90046001605060020a03169750600196505b614699565b60018715151415614c42578c60c0015115614bbf578d546affffffffffffffffffff0019166101006001605060020a038a1602178e55614bed565b8d5474ffffffffffffffffffff00000000000000000000001916605860020a6001605060020a038a1602178e555b60c08d015160408051911582526001605060020a038a166020830152805163ffffffff808d1693908e16927f02a998c439d01283c50acb516486f22eb80d74d328a8aa85743fac532c6e9bab92918290030190a35b50939c9b505050505050505050505050565b825160208401516040850151606086015160a0870151608088015160c08901516000908190819015614d435763ffffffff89811660009081526014602090815260408083208b851684528252808320938c168352929052208054909350614cd490608060020a90046001608060020a03166001606860020a038d16613216565b83546001608060020a03918216608060020a0291161783556001606860020a03841615614d3e578254614d19906001608060020a03166001606860020a038616610f5d565b83546fffffffffffffffffffffffffffffffff19166001608060020a03919091161783555b614ea8565b63ffffffff808a1660009081526014602090815260408083208a851684528252808320938c1683529290522092506001606860020a03841615614e615763ffffffff8088166000908152600b60205260408082205492891682529020546402540be400906001606860020a038716026001605060020a0388160204811515614dc757fe5b0491506c0c9f2c9cd04674edea400000018210614de357600080fd5b8254614e0a90608060020a90046001608060020a0316838c016001606860020a0316613216565b83546001608060020a03918216608060020a0290821617808555614e3891166001606860020a038416610f5d565b83546fffffffffffffffffffffffffffffffff19166001608060020a0391909116178355614e9f565b8254614e8690608060020a90046001608060020a03166001606860020a038c16613216565b83546001608060020a03918216608060020a0291161783555b838b0399508695505b6001606860020a038a16156150585763ffffffff89166000908152600560205260409020546127109060ff168b026001606860020a0316049050808a036001606860020a0316601460008b63ffffffff1663ffffffff16815260200190815260200160002060008863ffffffff1663ffffffff16815260200190815260200160002060008a63ffffffff1663ffffffff16815260200190815260200160002060000160108282829054906101000a90046001608060020a03160192506101000a8154816001608060020a0302191690836001608060020a03160217905550806001606860020a0316601460008b63ffffffff1663ffffffff16815260200190815260200160002060008863ffffffff1663ffffffff1681526020019081526020016000206000600660008d63ffffffff1663ffffffff16815260200190815260200160002060009054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060000160108282829054906101000a90046001608060020a03160192506101000a8154816001608060020a0302191690836001608060020a031602179055505b505050505050505050505050565b61506e615ef5565b5063ffffffff80831660009081526015602090815260409182902082519182019092529054909116808252156151015763ffffffff8084166000908152601560209081526040808320855185168452600101808352818420805486891663ffffffff199091168117909155865190855292529091208054919092166401000000000267ffffffff00000000199091161790555b5063ffffffff9182166000908152601560205260409020805463ffffffff191691909216179055565b3360009081526010602052604081205463ffffffff8481169116148061516b575063ffffffff83166000908152600d602052604090205460ff808416911610155b806151805750600254600160a060020a031633145b8061519f57503360009081526004602052604090205463ffffffff1615155b151561323357600080fd5b60008060006151b7615f07565b63ffffffff8089166000908152601360209081526040808320938d1683529290529081209350871515615205576001605060020a038716600090815260018501602052604090209250615222565b6001605060020a0387166000908152600285016020526040902092505b63ffffffff8616156155685763ffffffff8087166000908152600185016020908152604091829020825180840190935254808416835264010000000090049092169181018290529250156152a257815160208084015163ffffffff9081166000908152600187019092526040909120805463ffffffff1916919092161790555b815163ffffffff16156152ef57602082810151835163ffffffff9081166000908152600187019093526040909220805467ffffffff00000000191664010000000093909216929092021790555b825463ffffffff87811664010000000090920416141561532d578151835463ffffffff9091166401000000000267ffffffff00000000199091161783555b825463ffffffff87811691161415615359576020820151835463ffffffff191663ffffffff9091161783555b63ffffffff80871660009081526001850160205260409020805467ffffffffffffffff19169055835416151561555f578254604060020a90046001605060020a03161561542457600188151514156153d357508154604060020a90046001605060020a0316600090815260028401602052604090206153f7565b508154604060020a90046001605060020a0316600090815260018401602052604090205b82548154600080516020615f4683398151915216609060020a918290046001605060020a03169091021781555b8254609060020a90046001605060020a0316156154c4576001881515141561546e57508154609060020a90046001605060020a031660009081526002840160205260409020615492565b508154609060020a90046001605060020a0316600090815260018401602052604090205b8254815471ffffffffffffffffffff00000000000000001916604060020a918290046001605060020a03169091021781555b83546001605060020a03888116605860020a909204161415615517578254845474ffffffffffffffffffff00000000000000000000001916604060020a9091046001605060020a0316605860020a021784555b83546001605060020a0388811661010090920416141561555f57825484546affffffffffffffffffff001916610100604060020a9092046001605060020a0316919091021784555b6001945061556d565b600094505b5050505095945050505050565b615582615ef5565b5063ffffffff8281166000908152601560209081526040808320815180840183528154861681528686168552600190910190925290912054909164010000000082048116911681156156075763ffffffff858116600090815260156020908152604080832086851684526001019091529020805463ffffffff19169183169190911790555b63ffffffff8116156156595763ffffffff80861660009081526015602090815260408083208585168452600101909152902080549184166401000000000267ffffffff00000000199092169190911790555b8363ffffffff16836000015163ffffffff16141561569a5763ffffffff8581166000908152601560205260409020805463ffffffff19169184169190911790555b5050505050565b3360009081526010602052604081205463ffffffff16151561572557600c805463ffffffff808216600101811663ffffffff1992831681178455336000818152601060209081526040808320805490971690941790955594549092168452600e9092529120805473ffffffffffffffffffffffffffffffffffffffff191690911790555b503360009081526010602052604090205463ffffffff1690565b60608060008060008060008863ffffffff1660405190808252806020026020018201604052801561577a578160200160208202803883390190505b5096508863ffffffff166040519080825280602002602001820160405280156157ad578160200160208202803883390190505b5095508715156157ce57895461010090046001605060020a031692506157e3565b8954605860020a90046001605060020a031692505b6001605060020a03831615615a4357600094505b6001605060020a0383161580159061581a57508863ffffffff168563ffffffff16105b156159415787151561584657506001605060020a038216600090815260018a0160205260409020615862565b506001605060020a038216600090815260028a01602052604090205b805463ffffffff169350600091505b63ffffffff8416156158c85763ffffffff9384166000908152601260209081526040808320546001850190925290912054640100000000900490941693608060020a90046001606860020a03169190910190615871565b82878663ffffffff168151811015156158dd57fe5b6001605060020a0390921660209283029091019091015285518290879063ffffffff881690811061590a57fe5b6001606860020a0390921660209283029091019091015280546001909501946001605060020a03604060020a9091041692506157f7565b60008563ffffffff161115615a43575b8863ffffffff168563ffffffff161015615a4357600188151514156159d6576159a66001886001880363ffffffff1681518110151561598c57fe5b602090810290910101518c5460019091019060ff16613a1f565b878663ffffffff168151811015156159ba57fe5b6001605060020a03909216602092830290910190910152615a38565b615a0c60006001896001890363ffffffff168151811015156159f457fe5b602090810290910101518d549190039060ff16613a1f565b878663ffffffff16815181101515615a2057fe5b6001605060020a039092166020928302909101909101525b600190940193615951565b5050505050935093915050565b615a58615f1e565b821515602080830182815263ffffffff80881685526001608060020a03808716604080880191825267ffffffffffffffff42811660608a019081528e86166000908152601689528381208f881682528952838120805480891660019081018a1663ffffffff19928316811784558452918201909a529390208a5181549851955192519093167501000000000000000000000000000000000000000000027fffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff92909616650100000000000274ffffffffffffffffffffffffffffffff0000000000199515156401000000000264ff000000001994909816989099169790971791909116949094179190911694909417919091161790551415615c00576060808201516000805463ffffffff81811660018101821663ffffffff19909316929092179092556040805189841681526001608060020a038816602082015267ffffffffffffffff90941684820152938301529151828816928916917f6235021ead958d6a16078b65a45fa3dbae50d9def6d3783497c2253303b8fde5919081900360800190a36135fc565b6060808201516000805463ffffffff81811660018101821663ffffffff19909316929092179092556040805189841681526001608060020a038816602082015267ffffffffffffffff90941684820152938301529151828816928916917f24e4b81742f08bf8c724465f6c343cbf3f771ce88cdb98b2f9b531233c7b646a919081900360800190a3505050505050565b60208201516040840151606085015160009291908380806c0c9f2c9cd04674edea400000016001606860020a03891610615cc957600080fd5b63ffffffff8086166000908152600b60205260408082205460a08d0151938816835291205490916402540be400916001606860020a038c16026001605060020a039091160204811515615d1857fe5b0492506c0c9f2c9cd04674edea400000018310615d3457600080fd5b5050865163ffffffff9081166000908152601460208181526040808420888616855282528084208986168086529083528185208d5187168652938352818520958816855294825280842094845293905291902060c08a0151151560011415615e13578154615dbb90608060020a90046001608060020a03166001606860020a038a16610f5d565b82546001608060020a03918216608060020a029082161783558154615dea91166001606860020a038516613216565b81546fffffffffffffffffffffffffffffffff19166001608060020a0391909116178155615e8b565b8154615e31906001608060020a03166001606860020a038a16613216565b82546fffffffffffffffffffffffffffffffff19166001608060020a039182161783558154615e7291608060020a909104166001606860020a038516610f5d565b81546001608060020a03918216608060020a0291161781555b509098975050505050505050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b604080516060810182526000808252602082018190529181019190915290565b60408051602081019091526000815290565b604080518082019091526000808252602082015290565b604080516080810182526000808252602082018190529181018290526060810191909152905600ffffffff00000000000000000000ffffffffffffffffffffffffffffffffffffa165627a7a72305820163017106c52a92cc0571246a2021e799d6dcf30f81bfd460c2d7f35971c8e420029
Swarm Source
bzzr://163017106c52a92cc0571246a2021e799d6dcf30f81bfd460c2d7f35971c8e42
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $3,485.72 | 0.011 | $38.34 |
Loading...
Loading
[ Download: CSV Export ]
[ 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.