ETH Price: $1,674.05 (+3.44%)
Gas: 7 Gwei
 
Transaction Hash
Method
Block
From
To
Value
Tax Single174244382023-06-06 22:43:47114 days 10 hrs ago1686091427IN
Reflexer: Tax Collector
0 ETH0.0022432818.2241922
Tax Single156784822022-10-05 0:58:11359 days 8 hrs ago1664931491IN
Reflexer: Tax Collector
0 ETH0.001100398.92304742
Tax Single152194142022-07-26 17:25:20429 days 15 hrs ago1658856320IN
Reflexer: Tax Collector
0 ETH0.0026318821.72773635
Tax Single151951032022-07-22 22:17:20433 days 11 hrs ago1658528240IN
Reflexer: Tax Collector
0 ETH0.00235819.44855338
Tax Single151118752022-07-10 1:19:41446 days 8 hrs ago1657415981IN
Reflexer: Tax Collector
0 ETH0.0032828426.6064854
Tax Single149462512022-06-11 20:29:49474 days 12 hrs ago1654979389IN
Reflexer: Tax Collector
0 ETH0.0024295119.61868029
Tax Single149387582022-06-10 13:49:39475 days 19 hrs ago1654868979IN
Reflexer: Tax Collector
0 ETH0.009981580.7558428
Tax Single149234552022-06-07 23:09:33478 days 10 hrs ago1654643373IN
Reflexer: Tax Collector
0 ETH0.0069532556.30255215
Tax Single149038542022-06-04 14:59:22481 days 18 hrs ago1654354762IN
Reflexer: Tax Collector
0 ETH0.0047166138.19493475
Tax Single148967762022-06-03 11:09:50482 days 22 hrs ago1654254590IN
Reflexer: Tax Collector
0 ETH0.0043960735.53419924
Tax Single148905862022-06-02 10:59:46483 days 22 hrs ago1654167586IN
Reflexer: Tax Collector
0 ETH0.0058912547.66352771
Tax Single148726982022-05-30 13:09:46486 days 20 hrs ago1653916186IN
Reflexer: Tax Collector
0 ETH0.0036470629.58549793
Tax Single148666132022-05-29 13:09:41487 days 20 hrs ago1653829781IN
Reflexer: Tax Collector
0 ETH0.0025847720.91228713
Tax Single148123112022-05-20 17:09:47496 days 16 hrs ago1653066587IN
Reflexer: Tax Collector
0 ETH0.0074741960.63665695
Tax Single147529652022-05-11 5:23:00506 days 4 hrs ago1652246580IN
Reflexer: Tax Collector
0 ETH0.0043028234.90714144
Tax Single147451122022-05-09 23:02:50507 days 10 hrs ago1652137370IN
Reflexer: Tax Collector
0 ETH0.007508361.10223112
Tax Single147360812022-05-08 12:29:41508 days 20 hrs ago1652012981IN
Reflexer: Tax Collector
0 ETH0.0028398423.01795959
Tax Single147192222022-05-05 20:09:31511 days 13 hrs ago1651781371IN
Reflexer: Tax Collector
0 ETH0.006917356.01601107
Tax Single147122722022-05-04 17:29:45512 days 15 hrs ago1651685385IN
Reflexer: Tax Collector
0 ETH0.00713357.70996669
Tax Single147043942022-05-03 11:29:45513 days 21 hrs ago1651577385IN
Reflexer: Tax Collector
0 ETH0.0066358153.73652485
Tax Single146980242022-05-02 11:29:31514 days 21 hrs ago1651490971IN
Reflexer: Tax Collector
0 ETH0.0066475553.87655019
Tax Single146854192022-04-30 11:49:47516 days 21 hrs ago1651319387IN
Reflexer: Tax Collector
0 ETH0.0040674532.99846435
Tax Single146790102022-04-29 11:49:43517 days 21 hrs ago1651232983IN
Reflexer: Tax Collector
0 ETH0.0037872530.72521352
Tax Single146727022022-04-28 11:49:39518 days 21 hrs ago1651146579IN
Reflexer: Tax Collector
0 ETH0.0039234131.79815255
Tax Single146589842022-04-26 7:59:36521 days 1 hr ago1650959976IN
Reflexer: Tax Collector
0 ETH0.0044230735.78223748
View all transactions

Latest 1 internal transaction

Advanced mode:
Advanced Filter
Parent Txn Hash Block From To Value
118484342021-02-13 13:04:54957 days 20 hrs ago1613221494  Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TaxCollector

Compiler Version
v0.6.7+commit.b8d736ae

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-02-13
*/

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

pragma solidity 0.6.7;

abstract contract StructLike {
    function val(uint256 _id) virtual public view returns (uint256);
}

/**
 * @title LinkedList (Structured Link List)
 * @author Vittorio Minacori (https://github.com/vittominacori)
 * @dev A utility library for using sorted linked list data structures in your Solidity project.
 */
library LinkedList {

    uint256 private constant NULL = 0;
    uint256 private constant HEAD = 0;

    bool private constant PREV = false;
    bool private constant NEXT = true;

    struct List {
        mapping(uint256 => mapping(bool => uint256)) list;
    }

    /**
     * @dev Checks if the list exists
     * @param self stored linked list from contract
     * @return bool true if list exists, false otherwise
     */
    function isList(List storage self) internal view returns (bool) {
        // if the head nodes previous or next pointers both point to itself, then there are no items in the list
        if (self.list[HEAD][PREV] != HEAD || self.list[HEAD][NEXT] != HEAD) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Checks if the node exists
     * @param self stored linked list from contract
     * @param _node a node to search for
     * @return bool true if node exists, false otherwise
     */
    function isNode(List storage self, uint256 _node) internal view returns (bool) {
        if (self.list[_node][PREV] == HEAD && self.list[_node][NEXT] == HEAD) {
            if (self.list[HEAD][NEXT] == _node) {
                return true;
            } else {
                return false;
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Returns the number of elements in the list
     * @param self stored linked list from contract
     * @return uint256
     */
    function range(List storage self) internal view returns (uint256) {
        uint256 i;
        uint256 num;
        (, i) = adj(self, HEAD, NEXT);
        while (i != HEAD) {
            (, i) = adj(self, i, NEXT);
            num++;
        }
        return num;
    }

    /**
     * @dev Returns the links of a node as a tuple
     * @param self stored linked list from contract
     * @param _node id of the node to get
     * @return bool, uint256, uint256 true if node exists or false otherwise, previous node, next node
     */
    function node(List storage self, uint256 _node) internal view returns (bool, uint256, uint256) {
        if (!isNode(self, _node)) {
            return (false, 0, 0);
        } else {
            return (true, self.list[_node][PREV], self.list[_node][NEXT]);
        }
    }

    /**
     * @dev Returns the link of a node `_node` in direction `_direction`.
     * @param self stored linked list from contract
     * @param _node id of the node to step from
     * @param _direction direction to step in
     * @return bool, uint256 true if node exists or false otherwise, node in _direction
     */
    function adj(List storage self, uint256 _node, bool _direction) internal view returns (bool, uint256) {
        if (!isNode(self, _node)) {
            return (false, 0);
        } else {
            return (true, self.list[_node][_direction]);
        }
    }

    /**
     * @dev Returns the link of a node `_node` in direction `NEXT`.
     * @param self stored linked list from contract
     * @param _node id of the node to step from
     * @return bool, uint256 true if node exists or false otherwise, next node
     */
    function next(List storage self, uint256 _node) internal view returns (bool, uint256) {
        return adj(self, _node, NEXT);
    }

    /**
     * @dev Returns the link of a node `_node` in direction `PREV`.
     * @param self stored linked list from contract
     * @param _node id of the node to step from
     * @return bool, uint256 true if node exists or false otherwise, previous node
     */
    function prev(List storage self, uint256 _node) internal view returns (bool, uint256) {
        return adj(self, _node, PREV);
    }

    /**
     * @dev Can be used before `insert` to build an ordered list.
     * @dev Get the node and then `back` or `face` basing on your list order.
     * @dev If you want to order basing on other than `structure.val()` override this function
     * @param self stored linked list from contract
     * @param _struct the structure instance
     * @param _val value to seek
     * @return uint256 next node with a value less than StructLike(_struct).val(next_)
     */
    function sort(List storage self, address _struct, uint256 _val) internal view returns (uint256) {
        if (range(self) == 0) {
            return 0;
        }
        bool exists;
        uint256 next_;
        (exists, next_) = adj(self, HEAD, NEXT);
        while ((next_ != 0) && ((_val < StructLike(_struct).val(next_)) != NEXT)) {
            next_ = self.list[next_][NEXT];
        }
        return next_;
    }

    /**
     * @dev Creates a bidirectional link between two nodes on direction `_direction`
     * @param self stored linked list from contract
     * @param _node first node for linking
     * @param _link  node to link to in the _direction
     */
    function form(List storage self, uint256 _node, uint256 _link, bool _dir) internal {
        self.list[_link][!_dir] = _node;
        self.list[_node][_dir] = _link;
    }

    /**
     * @dev Insert node `_new` beside existing node `_node` in direction `_direction`.
     * @param self stored linked list from contract
     * @param _node existing node
     * @param _new  new node to insert
     * @param _direction direction to insert node in
     * @return bool true if success, false otherwise
     */
    function insert(List storage self, uint256 _node, uint256 _new, bool _direction) internal returns (bool) {
        if (!isNode(self, _new) && isNode(self, _node)) {
            uint256 c = self.list[_node][_direction];
            form(self, _node, _new, _direction);
            form(self, _new, c, _direction);
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Insert node `_new` beside existing node `_node` in direction `NEXT`.
     * @param self stored linked list from contract
     * @param _node existing node
     * @param _new  new node to insert
     * @return bool true if success, false otherwise
     */
    function face(List storage self, uint256 _node, uint256 _new) internal returns (bool) {
        return insert(self, _node, _new, NEXT);
    }

    /**
     * @dev Insert node `_new` beside existing node `_node` in direction `PREV`.
     * @param self stored linked list from contract
     * @param _node existing node
     * @param _new  new node to insert
     * @return bool true if success, false otherwise
     */
    function back(List storage self, uint256 _node, uint256 _new) internal returns (bool) {
        return insert(self, _node, _new, PREV);
    }

    /**
     * @dev Removes an entry from the linked list
     * @param self stored linked list from contract
     * @param _node node to remove from the list
     * @return uint256 the removed node
     */
    function del(List storage self, uint256 _node) internal returns (uint256) {
        if ((_node == NULL) || (!isNode(self, _node))) {
            return 0;
        }
        form(self, self.list[_node][PREV], self.list[_node][NEXT], NEXT);
        delete self.list[_node][PREV];
        delete self.list[_node][NEXT];
        return _node;
    }

    /**
     * @dev Pushes an entry to the head or tail of the linked list
     * @param self stored linked list from contract
     * @param _node new entry to push to the head
     * @param _direction push to the head (NEXT) or tail (PREV)
     * @return bool true if success, false otherwise
     */
    function push(List storage self, uint256 _node, bool _direction) internal returns (bool) {
        return insert(self, HEAD, _node, _direction);
    }

    /**
     * @dev Pops the first entry from the linked list
     * @param self stored linked list from contract
     * @param _direction pop from the head (NEXT) or the tail (PREV)
     * @return uint256 the removed node
     */
    function pop(List storage self, bool _direction) internal returns (uint256) {
        bool exists;
        uint256 adj_;
        (exists, adj_) = adj(self, HEAD, _direction);
        return del(self, adj_);
    }
}

abstract contract SAFEEngineLike {
    function collateralTypes(bytes32) virtual public view returns (
        uint256 debtAmount,       // [wad]
        uint256 accumulatedRate   // [ray]
    );
    function updateAccumulatedRate(bytes32,address,int256) virtual external;
    function coinBalance(address) virtual public view returns (uint256);
}

contract TaxCollector {
    using LinkedList for LinkedList.List;

    // --- Auth ---
    mapping (address => uint256) public authorizedAccounts;
    /**
     * @notice Add auth to an account
     * @param account Account to add auth to
     */
    function addAuthorization(address account) external isAuthorized {
        authorizedAccounts[account] = 1;
        emit AddAuthorization(account);
    }
    /**
     * @notice Remove auth from an account
     * @param account Account to remove auth from
     */
    function removeAuthorization(address account) external isAuthorized {
        authorizedAccounts[account] = 0;
        emit RemoveAuthorization(account);
    }
    /**
    * @notice Checks whether msg.sender can call an authed function
    **/
    modifier isAuthorized {
        require(authorizedAccounts[msg.sender] == 1, "TaxCollector/account-not-authorized");
        _;
    }

    // --- Events ---
    event AddAuthorization(address account);
    event RemoveAuthorization(address account);
    event InitializeCollateralType(bytes32 collateralType);
    event ModifyParameters(
      bytes32 collateralType,
      bytes32 parameter,
      uint256 data
    );
    event ModifyParameters(bytes32 parameter, uint256 data);
    event ModifyParameters(bytes32 parameter, address data);
    event ModifyParameters(
      bytes32 collateralType,
      uint256 position,
      uint256 val
    );
    event ModifyParameters(
      bytes32 collateralType,
      uint256 position,
      uint256 taxPercentage,
      address receiverAccount
    );
    event AddSecondaryReceiver(
      bytes32 indexed collateralType,
      uint256 secondaryReceiverNonce,
      uint256 latestSecondaryReceiver,
      uint256 secondaryReceiverAllotedTax,
      uint256 secondaryReceiverRevenueSources
    );
    event ModifySecondaryReceiver(
      bytes32 indexed collateralType,
      uint256 secondaryReceiverNonce,
      uint256 latestSecondaryReceiver,
      uint256 secondaryReceiverAllotedTax,
      uint256 secondaryReceiverRevenueSources
    );
    event CollectTax(bytes32 indexed collateralType, uint256 latestAccumulatedRate, int256 deltaRate);
    event DistributeTax(bytes32 indexed collateralType, address indexed target, int256 taxCut);

    // --- Data ---
    struct CollateralType {
        // Per second borrow rate for this specific collateral type
        uint256 stabilityFee;
        // When SF was last collected for this collateral type
        uint256 updateTime;
    }
    // SF receiver
    struct TaxReceiver {
        // Whether this receiver can accept a negative rate (taking SF from it)
        uint256 canTakeBackTax;                                                 // [bool]
        // Percentage of SF allocated to this receiver
        uint256 taxPercentage;                                                  // [ray%]
    }

    // Data about each collateral type
    mapping (bytes32 => CollateralType)                  public collateralTypes;
    // Percentage of each collateral's SF that goes to other addresses apart from the primary receiver
    mapping (bytes32 => uint256)                         public secondaryReceiverAllotedTax;              // [%ray]
    // Whether an address is already used for a tax receiver
    mapping (address => uint256)                         public usedSecondaryReceiver;                    // [bool]
    // Address associated to each tax receiver index
    mapping (uint256 => address)                         public secondaryReceiverAccounts;
    // How many collateral types send SF to a specific tax receiver
    mapping (address => uint256)                         public secondaryReceiverRevenueSources;
    // Tax receiver data
    mapping (bytes32 => mapping(uint256 => TaxReceiver)) public secondaryTaxReceivers;

    address    public primaryTaxReceiver;
    // Base stability fee charged to all collateral types
    uint256    public globalStabilityFee;                                                                 // [ray%]
    // Number of secondary tax receivers ever added
    uint256    public secondaryReceiverNonce;
    // Max number of secondarytax receivers a collateral type can have
    uint256    public maxSecondaryReceivers;
    // Latest secondary tax receiver that still has at least one revenue source
    uint256    public latestSecondaryReceiver;

    // All collateral types
    bytes32[]        public   collateralList;
    // Linked list with tax receiver data
    LinkedList.List  internal secondaryReceiverList;

    SAFEEngineLike public safeEngine;

    // --- Init ---
    constructor(address safeEngine_) public {
        authorizedAccounts[msg.sender] = 1;
        safeEngine = SAFEEngineLike(safeEngine_);
        emit AddAuthorization(msg.sender);
    }

    // --- Math ---
    function rpow(uint256 x, uint256 n, uint256 b) internal pure returns (uint256 z) {
      assembly {
        switch x case 0 {switch n case 0 {z := b} default {z := 0}}
        default {
          switch mod(n, 2) case 0 { z := b } default { z := x }
          let half := div(b, 2)  // for rounding.
          for { n := div(n, 2) } n { n := div(n,2) } {
            let xx := mul(x, x)
            if iszero(eq(div(xx, x), x)) { revert(0,0) }
            let xxRound := add(xx, half)
            if lt(xxRound, xx) { revert(0,0) }
            x := div(xxRound, b)
            if mod(n,2) {
              let zx := mul(z, x)
              if and(iszero(iszero(x)), iszero(eq(div(zx, x), z))) { revert(0,0) }
              let zxRound := add(zx, half)
              if lt(zxRound, zx) { revert(0,0) }
              z := div(zxRound, b)
            }
          }
        }
      }
    }
    uint256 constant RAY           = 10 ** 27;
    uint256 constant WHOLE_TAX_CUT = 10 ** 29;
    uint256 constant ONE           = 1;
    int256  constant INT256_MIN    = -2**255;

    function addition(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = x + y;
        require(z >= x, "TaxCollector/add-uint-uint-overflow");
    }
    function addition(int256 x, int256 y) internal pure returns (int256 z) {
        z = x + y;
        if (y <= 0) require(z <= x, "TaxCollector/add-int-int-underflow");
        if (y  > 0) require(z > x, "TaxCollector/add-int-int-overflow");
    }
    function subtract(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x - y) <= x, "TaxCollector/sub-uint-uint-underflow");
    }
    function subtract(int256 x, int256 y) internal pure returns (int256 z) {
        z = x - y;
        require(y <= 0 || z <= x, "TaxCollector/sub-int-int-underflow");
        require(y >= 0 || z >= x, "TaxCollector/sub-int-int-overflow");
    }
    function deduct(uint256 x, uint256 y) internal pure returns (int256 z) {
        z = int256(x) - int256(y);
        require(int256(x) >= 0 && int256(y) >= 0, "TaxCollector/ded-invalid-numbers");
    }
    function multiply(uint256 x, int256 y) internal pure returns (int256 z) {
        z = int256(x) * y;
        require(int256(x) >= 0, "TaxCollector/mul-uint-int-invalid-x");
        require(y == 0 || z / y == int256(x), "TaxCollector/mul-uint-int-overflow");
    }
    function multiply(int256 x, int256 y) internal pure returns (int256 z) {
        require(!both(x == -1, y == INT256_MIN), "TaxCollector/mul-int-int-overflow");
        require(y == 0 || (z = x * y) / y == x, "TaxCollector/mul-int-int-invalid");
    }
    function rmultiply(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = x * y;
        require(y == 0 || z / y == x, "TaxCollector/rmul-overflow");
        z = z / RAY;
    }

    // --- Boolean Logic ---
    function both(bool x, bool y) internal pure returns (bool z) {
        assembly{ z := and(x, y)}
    }
    function either(bool x, bool y) internal pure returns (bool z) {
        assembly{ z := or(x, y)}
    }

    // --- Administration ---
    /**
     * @notice Initialize a brand new collateral type
     * @param collateralType Collateral type name (e.g ETH-A, TBTC-B)
     */
    function initializeCollateralType(bytes32 collateralType) external isAuthorized {
        CollateralType storage collateralType_ = collateralTypes[collateralType];
        require(collateralType_.stabilityFee == 0, "TaxCollector/collateral-type-already-init");
        collateralType_.stabilityFee = RAY;
        collateralType_.updateTime   = now;
        collateralList.push(collateralType);
        emit InitializeCollateralType(collateralType);
    }
    /**
     * @notice Modify collateral specific uint256 params
     * @param collateralType Collateral type who's parameter is modified
     * @param parameter The name of the parameter modified
     * @param data New value for the parameter
     */
    function modifyParameters(
        bytes32 collateralType,
        bytes32 parameter,
        uint256 data
    ) external isAuthorized {
        require(now == collateralTypes[collateralType].updateTime, "TaxCollector/update-time-not-now");
        if (parameter == "stabilityFee") collateralTypes[collateralType].stabilityFee = data;
        else revert("TaxCollector/modify-unrecognized-param");
        emit ModifyParameters(
          collateralType,
          parameter,
          data
        );
    }
    /**
     * @notice Modify general uint256 params
     * @param parameter The name of the parameter modified
     * @param data New value for the parameter
     */
    function modifyParameters(bytes32 parameter, uint256 data) external isAuthorized {
        if (parameter == "globalStabilityFee") globalStabilityFee = data;
        else if (parameter == "maxSecondaryReceivers") maxSecondaryReceivers = data;
        else revert("TaxCollector/modify-unrecognized-param");
        emit ModifyParameters(parameter, data);
    }
    /**
     * @notice Modify general address params
     * @param parameter The name of the parameter modified
     * @param data New value for the parameter
     */
    function modifyParameters(bytes32 parameter, address data) external isAuthorized {
        require(data != address(0), "TaxCollector/null-data");
        if (parameter == "primaryTaxReceiver") primaryTaxReceiver = data;
        else revert("TaxCollector/modify-unrecognized-param");
        emit ModifyParameters(parameter, data);
    }
    /**
     * @notice Set whether a tax receiver can incur negative fees
     * @param collateralType Collateral type giving fees to the tax receiver
     * @param position Receiver position in the list
     * @param val Value that specifies whether a tax receiver can incur negative rates
     */
    function modifyParameters(
        bytes32 collateralType,
        uint256 position,
        uint256 val
    ) external isAuthorized {
        if (both(secondaryReceiverList.isNode(position), secondaryTaxReceivers[collateralType][position].taxPercentage > 0)) {
            secondaryTaxReceivers[collateralType][position].canTakeBackTax = val;
        }
        else revert("TaxCollector/unknown-tax-receiver");
        emit ModifyParameters(
          collateralType,
          position,
          val
        );
    }
    /**
     * @notice Create or modify a secondary tax receiver's data
     * @param collateralType Collateral type that will give SF to the tax receiver
     * @param position Receiver position in the list. Used to determine whether a new tax receiver is
              created or an existing one is edited
     * @param taxPercentage Percentage of SF offered to the tax receiver
     * @param receiverAccount Receiver address
     */
    function modifyParameters(
      bytes32 collateralType,
      uint256 position,
      uint256 taxPercentage,
      address receiverAccount
    ) external isAuthorized {
        (!secondaryReceiverList.isNode(position)) ?
          addSecondaryReceiver(collateralType, taxPercentage, receiverAccount) :
          modifySecondaryReceiver(collateralType, position, taxPercentage);
        emit ModifyParameters(
          collateralType,
          position,
          taxPercentage,
          receiverAccount
        );
    }

    // --- Tax Receiver Utils ---
    /**
     * @notice Add a new secondary tax receiver
     * @param collateralType Collateral type that will give SF to the tax receiver
     * @param taxPercentage Percentage of SF offered to the tax receiver
     * @param receiverAccount Tax receiver address
     */
    function addSecondaryReceiver(bytes32 collateralType, uint256 taxPercentage, address receiverAccount) internal {
        require(receiverAccount != address(0), "TaxCollector/null-account");
        require(receiverAccount != primaryTaxReceiver, "TaxCollector/primary-receiver-cannot-be-secondary");
        require(taxPercentage > 0, "TaxCollector/null-sf");
        require(usedSecondaryReceiver[receiverAccount] == 0, "TaxCollector/account-already-used");
        require(addition(secondaryReceiversAmount(), ONE) <= maxSecondaryReceivers, "TaxCollector/exceeds-max-receiver-limit");
        require(addition(secondaryReceiverAllotedTax[collateralType], taxPercentage) < WHOLE_TAX_CUT, "TaxCollector/tax-cut-exceeds-hundred");
        secondaryReceiverNonce                                                       = addition(secondaryReceiverNonce, 1);
        latestSecondaryReceiver                                                      = secondaryReceiverNonce;
        usedSecondaryReceiver[receiverAccount]                                       = ONE;
        secondaryReceiverAllotedTax[collateralType]                                  = addition(secondaryReceiverAllotedTax[collateralType], taxPercentage);
        secondaryTaxReceivers[collateralType][latestSecondaryReceiver].taxPercentage = taxPercentage;
        secondaryReceiverAccounts[latestSecondaryReceiver]                           = receiverAccount;
        secondaryReceiverRevenueSources[receiverAccount]                             = ONE;
        secondaryReceiverList.push(latestSecondaryReceiver, false);
        emit AddSecondaryReceiver(
          collateralType,
          secondaryReceiverNonce,
          latestSecondaryReceiver,
          secondaryReceiverAllotedTax[collateralType],
          secondaryReceiverRevenueSources[receiverAccount]
        );
    }
    /**
     * @notice Update a secondary tax receiver's data (add a new SF source or modify % of SF taken from a collateral type)
     * @param collateralType Collateral type that will give SF to the tax receiver
     * @param position Receiver's position in the tax receiver list
     * @param taxPercentage Percentage of SF offered to the tax receiver (ray%)
     */
    function modifySecondaryReceiver(bytes32 collateralType, uint256 position, uint256 taxPercentage) internal {
        if (taxPercentage == 0) {
          secondaryReceiverAllotedTax[collateralType] = subtract(
            secondaryReceiverAllotedTax[collateralType],
            secondaryTaxReceivers[collateralType][position].taxPercentage
          );

          if (secondaryReceiverRevenueSources[secondaryReceiverAccounts[position]] == 1) {
            if (position == latestSecondaryReceiver) {
              (, uint256 prevReceiver) = secondaryReceiverList.prev(latestSecondaryReceiver);
              latestSecondaryReceiver = prevReceiver;
            }
            secondaryReceiverList.del(position);
            delete(usedSecondaryReceiver[secondaryReceiverAccounts[position]]);
            delete(secondaryTaxReceivers[collateralType][position]);
            delete(secondaryReceiverRevenueSources[secondaryReceiverAccounts[position]]);
            delete(secondaryReceiverAccounts[position]);
          } else if (secondaryTaxReceivers[collateralType][position].taxPercentage > 0) {
            secondaryReceiverRevenueSources[secondaryReceiverAccounts[position]] = subtract(secondaryReceiverRevenueSources[secondaryReceiverAccounts[position]], 1);
            delete(secondaryTaxReceivers[collateralType][position]);
          }
        } else {
          uint256 secondaryReceiverAllotedTax_ = addition(
            subtract(secondaryReceiverAllotedTax[collateralType], secondaryTaxReceivers[collateralType][position].taxPercentage),
            taxPercentage
          );
          require(secondaryReceiverAllotedTax_ < WHOLE_TAX_CUT, "TaxCollector/tax-cut-too-big");
          if (secondaryTaxReceivers[collateralType][position].taxPercentage == 0) {
            secondaryReceiverRevenueSources[secondaryReceiverAccounts[position]] = addition(
              secondaryReceiverRevenueSources[secondaryReceiverAccounts[position]],
              1
            );
          }
          secondaryReceiverAllotedTax[collateralType]                   = secondaryReceiverAllotedTax_;
          secondaryTaxReceivers[collateralType][position].taxPercentage = taxPercentage;
        }
        emit ModifySecondaryReceiver(
          collateralType,
          secondaryReceiverNonce,
          latestSecondaryReceiver,
          secondaryReceiverAllotedTax[collateralType],
          secondaryReceiverRevenueSources[secondaryReceiverAccounts[position]]
        );
    }

    // --- Tax Collection Utils ---
    /**
     * @notice Check if multiple collateral types are up to date with taxation
     */
    function collectedManyTax(uint256 start, uint256 end) public view returns (bool ok) {
        require(both(start <= end, end < collateralList.length), "TaxCollector/invalid-indexes");
        for (uint256 i = start; i <= end; i++) {
          if (now > collateralTypes[collateralList[i]].updateTime) {
            ok = false;
            return ok;
          }
        }
        ok = true;
    }
    /**
     * @notice Check how much SF will be charged (to collateral types between indexes 'start' and 'end'
     *         in the collateralList) during the next taxation
     * @param start Index in collateralList from which to start looping and calculating the tax outcome
     * @param end Index in collateralList at which we stop looping and calculating the tax outcome
     */
    function taxManyOutcome(uint256 start, uint256 end) public view returns (bool ok, int256 rad) {
        require(both(start <= end, end < collateralList.length), "TaxCollector/invalid-indexes");
        int256  primaryReceiverBalance = -int256(safeEngine.coinBalance(primaryTaxReceiver));
        int256  deltaRate;
        uint256 debtAmount;
        for (uint256 i = start; i <= end; i++) {
          if (now > collateralTypes[collateralList[i]].updateTime) {
            (debtAmount, ) = safeEngine.collateralTypes(collateralList[i]);
            (, deltaRate)  = taxSingleOutcome(collateralList[i]);
            rad = addition(rad, multiply(debtAmount, deltaRate));
          }
        }
        if (rad < 0) {
          ok = (rad < primaryReceiverBalance) ? false : true;
        } else {
          ok = true;
        }
    }
    /**
     * @notice Get how much SF will be distributed after taxing a specific collateral type
     * @param collateralType Collateral type to compute the taxation outcome for
     * @return The newly accumulated rate as well as the delta between the new and the last accumulated rates
     */
    function taxSingleOutcome(bytes32 collateralType) public view returns (uint256, int256) {
        (, uint256 lastAccumulatedRate) = safeEngine.collateralTypes(collateralType);
        uint256 newlyAccumulatedRate =
          rmultiply(
            rpow(
              addition(
                globalStabilityFee,
                collateralTypes[collateralType].stabilityFee
              ),
              subtract(
                now,
                collateralTypes[collateralType].updateTime
              ),
            RAY),
          lastAccumulatedRate);
        return (newlyAccumulatedRate, deduct(newlyAccumulatedRate, lastAccumulatedRate));
    }

    // --- Tax Receiver Utils ---
    /**
     * @notice Get the secondary tax receiver list length
     */
    function secondaryReceiversAmount() public view returns (uint256) {
        return secondaryReceiverList.range();
    }
    /**
     * @notice Get the collateralList length
     */
    function collateralListLength() public view returns (uint256) {
        return collateralList.length;
    }
    /**
     * @notice Check if a tax receiver is at a certain position in the list
     */
    function isSecondaryReceiver(uint256 _receiver) public view returns (bool) {
        if (_receiver == 0) return false;
        return secondaryReceiverList.isNode(_receiver);
    }

    // --- Tax (Stability Fee) Collection ---
    /**
     * @notice Collect tax from multiple collateral types at once
     * @param start Index in collateralList from which to start looping and calculating the tax outcome
     * @param end Index in collateralList at which we stop looping and calculating the tax outcome
     */
    function taxMany(uint256 start, uint256 end) external {
        require(both(start <= end, end < collateralList.length), "TaxCollector/invalid-indexes");
        for (uint256 i = start; i <= end; i++) {
            taxSingle(collateralList[i]);
        }
    }
    /**
     * @notice Collect tax from a single collateral type
     * @param collateralType Collateral type to tax
     */
    function taxSingle(bytes32 collateralType) public returns (uint256) {
        uint256 latestAccumulatedRate;
        if (now <= collateralTypes[collateralType].updateTime) {
          (, latestAccumulatedRate) = safeEngine.collateralTypes(collateralType);
          return latestAccumulatedRate;
        }
        (, int256 deltaRate) = taxSingleOutcome(collateralType);
        // Check how much debt has been generated for collateralType
        (uint256 debtAmount, ) = safeEngine.collateralTypes(collateralType);
        splitTaxIncome(collateralType, debtAmount, deltaRate);
        (, latestAccumulatedRate) = safeEngine.collateralTypes(collateralType);
        collateralTypes[collateralType].updateTime = now;
        emit CollectTax(collateralType, latestAccumulatedRate, deltaRate);
        return latestAccumulatedRate;
    }
    /**
     * @notice Split SF between all tax receivers
     * @param collateralType Collateral type to distribute SF for
     * @param deltaRate Difference between the last and the latest accumulate rates for the collateralType
     */
    function splitTaxIncome(bytes32 collateralType, uint256 debtAmount, int256 deltaRate) internal {
        // Start looping from the latest tax receiver
        uint256 currentSecondaryReceiver = latestSecondaryReceiver;
        // While we still haven't gone through the entire tax receiver list
        while (currentSecondaryReceiver > 0) {
          // If the current tax receiver should receive SF from collateralType
          if (secondaryTaxReceivers[collateralType][currentSecondaryReceiver].taxPercentage > 0) {
            distributeTax(
              collateralType,
              secondaryReceiverAccounts[currentSecondaryReceiver],
              currentSecondaryReceiver,
              debtAmount,
              deltaRate
            );
          }
          // Continue looping
          (, currentSecondaryReceiver) = secondaryReceiverList.prev(currentSecondaryReceiver);
        }
        // Distribute to primary receiver
        distributeTax(collateralType, primaryTaxReceiver, uint256(-1), debtAmount, deltaRate);
    }

    /**
     * @notice Give/withdraw SF from a tax receiver
     * @param collateralType Collateral type to distribute SF for
     * @param receiver Tax receiver address
     * @param receiverListPosition Position of receiver in the secondaryReceiverList (if the receiver is secondary)
     * @param debtAmount Total debt currently issued
     * @param deltaRate Difference between the latest and the last accumulated rates for the collateralType
     */
    function distributeTax(
        bytes32 collateralType,
        address receiver,
        uint256 receiverListPosition,
        uint256 debtAmount,
        int256 deltaRate
    ) internal {
        require(safeEngine.coinBalance(receiver) < 2**255, "TaxCollector/coin-balance-does-not-fit-into-int256");
        // Check how many coins the receiver has and negate the value
        int256 coinBalance   = -int256(safeEngine.coinBalance(receiver));
        // Compute the % out of SF that should be allocated to the receiver
        int256 currentTaxCut = (receiver == primaryTaxReceiver) ?
          multiply(subtract(WHOLE_TAX_CUT, secondaryReceiverAllotedTax[collateralType]), deltaRate) / int256(WHOLE_TAX_CUT) :
          multiply(int256(secondaryTaxReceivers[collateralType][receiverListPosition].taxPercentage), deltaRate) / int256(WHOLE_TAX_CUT);
        /**
            If SF is negative and a tax receiver doesn't have enough coins to absorb the loss,
            compute a new tax cut that can be absorbed
        **/
        currentTaxCut  = (
          both(multiply(debtAmount, currentTaxCut) < 0, coinBalance > multiply(debtAmount, currentTaxCut))
        ) ? coinBalance / int256(debtAmount) : currentTaxCut;
        /**
          If the tax receiver's tax cut is not null and if the receiver accepts negative SF
          offer/take SF to/from them
        **/
        if (currentTaxCut != 0) {
          if (
            either(
              receiver == primaryTaxReceiver,
              either(
                deltaRate >= 0,
                both(currentTaxCut < 0, secondaryTaxReceivers[collateralType][receiverListPosition].canTakeBackTax > 0)
              )
            )
          ) {
            safeEngine.updateAccumulatedRate(collateralType, receiver, currentTaxCut);
            emit DistributeTax(collateralType, receiver, currentTaxCut);
          }
       }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"safeEngine_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"AddAuthorization","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"secondaryReceiverNonce","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"latestSecondaryReceiver","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"secondaryReceiverAllotedTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"secondaryReceiverRevenueSources","type":"uint256"}],"name":"AddSecondaryReceiver","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"latestAccumulatedRate","type":"uint256"},{"indexed":false,"internalType":"int256","name":"deltaRate","type":"int256"}],"name":"CollectTax","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"int256","name":"taxCut","type":"int256"}],"name":"DistributeTax","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"collateralType","type":"bytes32"}],"name":"InitializeCollateralType","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"parameter","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"data","type":"uint256"}],"name":"ModifyParameters","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"parameter","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"data","type":"uint256"}],"name":"ModifyParameters","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"parameter","type":"bytes32"},{"indexed":false,"internalType":"address","name":"data","type":"address"}],"name":"ModifyParameters","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"position","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"val","type":"uint256"}],"name":"ModifyParameters","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"position","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"taxPercentage","type":"uint256"},{"indexed":false,"internalType":"address","name":"receiverAccount","type":"address"}],"name":"ModifyParameters","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"secondaryReceiverNonce","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"latestSecondaryReceiver","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"secondaryReceiverAllotedTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"secondaryReceiverRevenueSources","type":"uint256"}],"name":"ModifySecondaryReceiver","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"RemoveAuthorization","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorizedAccounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"collateralList","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateralListLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"collateralTypes","outputs":[{"internalType":"uint256","name":"stabilityFee","type":"uint256"},{"internalType":"uint256","name":"updateTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"collectedManyTax","outputs":[{"internalType":"bool","name":"ok","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalStabilityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"collateralType","type":"bytes32"}],"name":"initializeCollateralType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_receiver","type":"uint256"}],"name":"isSecondaryReceiver","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestSecondaryReceiver","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSecondaryReceivers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"internalType":"uint256","name":"position","type":"uint256"},{"internalType":"uint256","name":"taxPercentage","type":"uint256"},{"internalType":"address","name":"receiverAccount","type":"address"}],"name":"modifyParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"internalType":"uint256","name":"position","type":"uint256"},{"internalType":"uint256","name":"val","type":"uint256"}],"name":"modifyParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"parameter","type":"bytes32"},{"internalType":"address","name":"data","type":"address"}],"name":"modifyParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"internalType":"bytes32","name":"parameter","type":"bytes32"},{"internalType":"uint256","name":"data","type":"uint256"}],"name":"modifyParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"parameter","type":"bytes32"},{"internalType":"uint256","name":"data","type":"uint256"}],"name":"modifyParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"primaryTaxReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"safeEngine","outputs":[{"internalType":"contract SAFEEngineLike","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"secondaryReceiverAccounts","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"secondaryReceiverAllotedTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"secondaryReceiverNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"secondaryReceiverRevenueSources","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"secondaryReceiversAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"secondaryTaxReceivers","outputs":[{"internalType":"uint256","name":"canTakeBackTax","type":"uint256"},{"internalType":"uint256","name":"taxPercentage","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"taxMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"taxManyOutcome","outputs":[{"internalType":"bool","name":"ok","type":"bool"},{"internalType":"int256","name":"rad","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"collateralType","type":"bytes32"}],"name":"taxSingle","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"collateralType","type":"bytes32"}],"name":"taxSingleOutcome","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"usedSecondaryReceiver","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

608060405234801561001057600080fd5b506040516128e33803806128e38339818101604052602081101561003357600080fd5b5051336000818152602081815260409182902060019055600e80546001600160a01b0319166001600160a01b038616179055815192835290517f599a298163e1678bb1c676052a8930bf0b8a1261ed6e01b8a2391e55f70001029281900390910190a15061283d806100a66000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806392a448a211610104578063d07900bb116100a2578063de8b062111610071578063de8b06211461052e578063e372ee4414610554578063f0cccf4314610577578063fe4f58901461057f576101da565b8063d07900bb146104ae578063d4b9311d146104cb578063d54635f4146104f4578063dd9dbe3114610511576101da565b8063b7536364116100de578063b753636414610455578063bf4320491461045d578063c78c829514610465578063cc780be214610488576101da565b806392a448a2146103eb57806394f3f81d14610427578063abfbc5b01461044d576101da565b8063498fb99a1161017c5780635e4128581161014b5780635e4128581461037d5780636614f0101461039a57806367aea313146103c65780636c50dbba146103ce576101da565b8063498fb99a14610313578063542f76a61461031b578063555ec74f1461032357806356c057641461034c576101da565b806324ba5884116101b857806324ba58841461026c5780632697dce2146102925780633024a912146102d057806335b28153146102ed576101da565b806315f5fb48146101df578063203dcb581461021857806324341e0114610232575b600080fd5b6101fc600480360360208110156101f557600080fd5b50356105a2565b604080516001600160a01b039092168252519081900360200190f35b6102206105bd565b60408051918252519081900360200190f35b61026a6004803603608081101561024857600080fd5b50803590602081013590604081013590606001356001600160a01b03166105c3565b005b6102206004803603602081101561028257600080fd5b50356001600160a01b0316610697565b6102b5600480360360408110156102a857600080fd5b50803590602001356106a9565b60408051921515835260208301919091528051918290030190f35b610220600480360360208110156102e657600080fd5b50356108dd565b61026a6004803603602081101561030357600080fd5b50356001600160a01b03166108fb565b61022061099b565b6101fc6109a1565b61026a6004803603606081101561033957600080fd5b50803590602081013590604001356109b0565b6103696004803603602081101561036257600080fd5b5035610ad8565b604080519115158252519081900360200190f35b61026a6004803603602081101561039357600080fd5b5035610b00565b61026a600480360360408110156103b057600080fd5b50803590602001356001600160a01b0316610c1b565b6101fc610d78565b610220600480360360208110156103e457600080fd5b5035610d87565b61040e6004803603604081101561040157600080fd5b5080359060200135610f89565b6040805192835260208301919091528051918290030190f35b61026a6004803603602081101561043d57600080fd5b50356001600160a01b0316610fad565b61022061104c565b610220611052565b610220611058565b6103696004803603604081101561047b57600080fd5b5080359060200135611069565b6102206004803603602081101561049e57600080fd5b50356001600160a01b031661112c565b61040e600480360360208110156104c457600080fd5b503561113e565b61026a600480360360608110156104e157600080fd5b5080359060208101359060400135611157565b6102206004803603602081101561050a57600080fd5b5035611278565b61040e6004803603602081101561052757600080fd5b503561128a565b6102206004803603602081101561054457600080fd5b50356001600160a01b0316611380565b61026a6004803603604081101561056a57600080fd5b5080359060200135611392565b61022061142d565b61026a6004803603604081101561059557600080fd5b5080359060200135611433565b6004602052600090815260409020546001600160a01b031681565b600b5481565b336000908152602081905260409020546001146106115760405162461bcd60e51b815260040180806020018281038252602381526020018061278f6023913960400191505060405180910390fd5b610622600d8463ffffffff61150d16565b1561063757610632848484611585565b610642565b6106428483836118ef565b60408051858152602081018590528082018490526001600160a01b038316606082015290517fdd816bbb74e9c8d56d70daaa112136781e45da3cedaf93060401b5fa79cc21059181900360800190a150505050565b60006020819052908152604090205481565b6000806106c083851115600c805490508510611c21565b610711576040805162461bcd60e51b815260206004820152601c60248201527f546178436f6c6c6563746f722f696e76616c69642d696e646578657300000000604482015290519081900360640190fd5b600e5460075460408051633eaf7a0360e21b81526001600160a01b0392831660048201529051600093929092169163fabde80c91602480820192602092909190829003018186803b15801561076557600080fd5b505afa158015610779573d6000803e3d6000fd5b505050506040513d602081101561078f57600080fd5b50516000908103915080865b8681116108ac5760016000600c83815481106107b357fe5b90600052602060002001548152602001908152602001600020600101544211156108a457600e54600c80546001600160a01b039092169163d07900bb9190849081106107fb57fe5b90600052602060002001546040518263ffffffff1660e01b815260040180828152602001915050604080518083038186803b15801561083957600080fd5b505afa15801561084d573d6000803e3d6000fd5b505050506040513d604081101561086357600080fd5b5051600c805491935061088a918390811061087a57fe5b906000526020600020015461128a565b93506108a190508561089c8486611c25565b611cb8565b94505b60010161079b565b5060008412156108ce578284126108c45760016108c7565b60005b94506108d3565b600194505b5050509250929050565b600c81815481106108ea57fe5b600091825260209091200154905081565b336000908152602081905260409020546001146109495760405162461bcd60e51b815260040180806020018281038252602381526020018061278f6023913960400191505060405180910390fd5b6001600160a01b0381166000818152602081815260409182902060019055815192835290517f599a298163e1678bb1c676052a8930bf0b8a1261ed6e01b8a2391e55f70001029281900390910190a150565b60085481565b6007546001600160a01b031681565b336000908152602081905260409020546001146109fe5760405162461bcd60e51b815260040180806020018281038252602381526020018061278f6023913960400191505060405180910390fd5b610a36610a12600d8463ffffffff61150d16565b60008581526006602090815260408083208784529091529020600101541515611c21565b15610a5c5760008381526006602090815260408083208584529091529020819055610a93565b60405162461bcd60e51b815260040180806020018281038252602181526020018061268d6021913960400191505060405180910390fd5b604080518481526020810184905280820183905290517fab4951554135af54806ae8b8c0860008dbf001b33208f80e3ef0e8a54d23528b9181900360600190a1505050565b600081610ae757506000610afb565b610af8600d8363ffffffff61150d16565b90505b919050565b33600090815260208190526040902054600114610b4e5760405162461bcd60e51b815260040180806020018281038252602381526020018061278f6023913960400191505060405180910390fd5b6000818152600160205260409020805415610b9a5760405162461bcd60e51b81526004018080602001828103825260298152602001806126ae6029913960400191505060405180910390fd5b6b033b2e3c9fd0803ce8000000815542600180830191909155600c805491820181556000527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7018290556040805183815290517f715b265758bcd4ecd311bede8dcca05c4b5819e0a2a5c4103abd702862ae2c359181900360200190a15050565b33600090815260208190526040902054600114610c695760405162461bcd60e51b815260040180806020018281038252602381526020018061278f6023913960400191505060405180910390fd5b6001600160a01b038116610cbd576040805162461bcd60e51b8152602060048201526016602482015275546178436f6c6c6563746f722f6e756c6c2d6461746160501b604482015290519081900360640190fd5b8171383934b6b0b93caa30bc2932b1b2b4bb32b960711b1415610cfa57600780546001600160a01b0319166001600160a01b038316179055610d31565b60405162461bcd60e51b815260040180806020018281038252602681526020018061261c6026913960400191505060405180910390fd5b604080518381526001600160a01b038316602082015281517fd91f38cf03346b5dc15fb60f9076f866295231ad3c3841a1051f8443f25170d1929181900390910190a15050565b600e546001600160a01b031681565b60008181526001602081905260408220015481904211610e2257600e546040805163d07900bb60e01b81526004810186905281516001600160a01b039093169263d07900bb92602480840193919291829003018186803b158015610dea57600080fd5b505afa158015610dfe573d6000803e3d6000fd5b505050506040513d6040811015610e1457600080fd5b50602001519150610afb9050565b6000610e2d8461128a565b600e546040805163d07900bb60e01b8152600481018990528151939550600094506001600160a01b039092169263d07900bb926024808201939291829003018186803b158015610e7c57600080fd5b505afa158015610e90573d6000803e3d6000fd5b505050506040513d6040811015610ea657600080fd5b50519050610eb5858284611d49565b600e546040805163d07900bb60e01b81526004810188905281516001600160a01b039093169263d07900bb92602480840193919291829003018186803b158015610efe57600080fd5b505afa158015610f12573d6000803e3d6000fd5b505050506040513d6040811015610f2857600080fd5b5060209081015160008781526001808452604091829020429101558051828152928301859052805191955087927f584c2e3a292b065d3d3a0edd7e25bb572b4c171192c33ab9c3b0f5d4448adf8b929081900390910190a250909392505050565b60066020908152600092835260408084209091529082529020805460019091015482565b33600090815260208190526040902054600114610ffb5760405162461bcd60e51b815260040180806020018281038252602381526020018061278f6023913960400191505060405180910390fd5b6001600160a01b03811660008181526020818152604080832092909255815192835290517f8834a87e641e9716be4f34527af5d23e11624f1ddeefede6ad75a9acfc31b9039281900390910190a150565b60095481565b600c5490565b6000611064600d611dd7565b905090565b600061107f82841115600c805490508410611c21565b6110d0576040805162461bcd60e51b815260206004820152601c60248201527f546178436f6c6c6563746f722f696e76616c69642d696e646578657300000000604482015290519081900360640190fd5b825b8281116111205760016000600c83815481106110ea57fe5b9060005260206000200154815260200190815260200160002060010154421115611118575060009050611126565b6001016110d2565b50600190505b92915050565b60056020526000908152604090205481565b6001602081905260009182526040909120805491015482565b336000908152602081905260409020546001146111a55760405162461bcd60e51b815260040180806020018281038252602381526020018061278f6023913960400191505060405180910390fd5b60008381526001602081905260409091200154421461120b576040805162461bcd60e51b815260206004820181905260248201527f546178436f6c6c6563746f722f7570646174652d74696d652d6e6f742d6e6f77604482015290519081900360640190fd5b816b73746162696c69747946656560a01b1415610cfa576000838152600160205260409020819055604080518481526020810184905280820183905290517fc59b1109b54f213212d2f5af5c1dae5e887f9daa63b595578fae847cb048e8f49181900360600190a1505050565b60026020526000908152604090205481565b600e546040805163d07900bb60e01b8152600481018490528151600093849384936001600160a01b039092169263d07900bb926024808201939291829003018186803b1580156112d957600080fd5b505afa1580156112ed573d6000803e3d6000fd5b505050506040513d604081101561130357600080fd5b50602090810151600854600087815260019093526040832054919350611368916113629161133091611e11565b61135042600160008b815260200190815260200160002060010154611e53565b6b033b2e3c9fd0803ce8000000611e95565b83611f53565b9050806113758284611fd1565b935093505050915091565b60036020526000908152604090205481565b600c546113a59082841115908310611c21565b6113f6576040805162461bcd60e51b815260206004820152601c60248201527f546178436f6c6c6563746f722f696e76616c69642d696e646578657300000000604482015290519081900360640190fd5b815b8181116114285761141f600c828154811061140f57fe5b9060005260206000200154610d87565b506001016113f8565b505050565b600a5481565b336000908152602081905260409020546001146114815760405162461bcd60e51b815260040180806020018281038252602381526020018061278f6023913960400191505060405180910390fd5b8171676c6f62616c53746162696c69747946656560701b14156114a85760088190556114ce565b81746d61785365636f6e6461727952656365697665727360581b1415610cfa57600a8190555b604080518381526020810183905281517fac7c5c1afaef770ec56ac6268cd3f2fbb1035858ead2601d6553157c33036c3a929181900390910190a15050565b600081815260208381526040808320838052909152812054158015611548575060008281526020848152604080832060018452909152902054155b1561157d576000808052602084815260408083206001845290915290205482141561157557506001611126565b506000611126565b506001611126565b806117325760008381526002602090815260408083205460068352818420868552909252909120600101546115ba9190611e53565b60008481526002602090815260408083209390935584825260048152828220546001600160a01b031682526005905220546001141561169957600b5482141561161b576000611615600b54600d61203790919063ffffffff16565b600b5550505b61162c600d8363ffffffff61205116565b50600082815260046020818152604080842080546001600160a01b03908116865260038452828620869055888652600684528286208887528452828620868155600101869055815416855260058352908420849055928590525280546001600160a01b031916905561172d565b60008381526006602090815260408083208584529091529020600101541561172d576000828152600460209081526040808320546001600160a01b0316835260059091529020546116eb906001611e53565b6000838152600460209081526040808320546001600160a01b031683526005825280832093909355858252600681528282208583529052908120818155600101555b61186d565b6000838152600260209081526040808320546006835281842086855290925282206001015461176a9161176491611e53565b83611e11565b90506c01431e0fae6d7217caa000000081106117cd576040805162461bcd60e51b815260206004820152601c60248201527f546178436f6c6c6563746f722f7461782d6375742d746f6f2d62696700000000604482015290519081900360640190fd5b6000848152600660209081526040808320868452909152902060010154611844576000838152600460209081526040808320546001600160a01b03168352600590915290205461181e906001611e11565b6000848152600460209081526040808320546001600160a01b0316835260059091529020555b600084815260026020908152604080832093909355600681528282208583529052206001018190555b600954600b5460008581526002602090815260408083205487845260048352818420546001600160a01b031684526005835292819020548151958652918501939093528383019190915260608301525184917f93dd084738077accc9983c441821583d23638cfa27021cdfc189cf3a583810a9919081900360800190a2505050565b6001600160a01b03811661194a576040805162461bcd60e51b815260206004820152601960248201527f546178436f6c6c6563746f722f6e756c6c2d6163636f756e7400000000000000604482015290519081900360640190fd5b6007546001600160a01b03828116911614156119975760405162461bcd60e51b81526004018080602001828103825260318152602001806126d76031913960400191505060405180910390fd5b600082116119e3576040805162461bcd60e51b81526020600482015260146024820152732a30bc21b7b63632b1ba37b917b73ab63616b9b360611b604482015290519081900360640190fd5b6001600160a01b03811660009081526003602052604090205415611a385760405162461bcd60e51b81526004018080602001828103825260218152602001806125d96021913960400191505060405180910390fd5b600a54611a4d611a46611058565b6001611e11565b1115611a8a5760405162461bcd60e51b81526004018080602001828103825260278152602001806126666027913960400191505060405180910390fd5b6000838152600260205260409020546c01431e0fae6d7217caa000000090611ab29084611e11565b10611aee5760405162461bcd60e51b81526004018080602001828103825260248152602001806127b26024913960400191505060405180910390fd5b611afb6009546001611e11565b6009819055600b556001600160a01b0381166000908152600360209081526040808320600190558583526002909152902054611b379083611e11565b60008481526002602090815260408083209390935560068152828220600b805484529082528383206001908101879055815484526004835284842080546001600160a01b0319166001600160a01b03881690811790915584526005909252928220559054611ba891600d91906120cf565b50600954600b546000858152600260209081526040808320546001600160a01b03871684526005835292819020548151958652918501939093528383019190915260608301525184917f086fff5d978796ef618ca584578a9142f3990d864bc943358a776080e73f754f919081900360800190a2505050565b1690565b8181026000831215611c685760405162461bcd60e51b815260040180806020018281038252602381526020018061276c6023913960400191505060405180910390fd5b811580611c7d575082828281611c7a57fe5b05145b6111265760405162461bcd60e51b815260040180806020018281038252602281526020018061274a6022913960400191505060405180910390fd5b81810160008213611d025782811315611d025760405162461bcd60e51b81526004018080602001828103825260228152602001806125fa6022913960400191505060405180910390fd5b6000821315611126578281136111265760405162461bcd60e51b81526004018080602001828103825260218152602001806127296021913960400191505060405180910390fd5b600b545b8015611db557600084815260066020908152604080832084845290915290206001015415611d9b57600081815260046020526040902054611d9b9085906001600160a01b03168386866120e6565b611dac600d8263ffffffff61203716565b9150611d4d9050565b600754611dd19085906001600160a01b031660001986866120e6565b50505050565b6000806000611de98460006001612416565b9250505b8115611e0a57611dff84836001612416565b925050600101611ded565b9392505050565b818101828110156111265760405162461bcd60e51b81526004018080602001828103825260238152602001806125b66023913960400191505060405180910390fd5b808203828111156111265760405162461bcd60e51b81526004018080602001828103825260248152602001806126426024913960400191505060405180910390fd5b6000838015611f3557600184168015611eb057859250611eb4565b8392505b50600283046002850494505b8415611f2f578586028687820414611ed757600080fd5b81810181811015611ee757600080fd5b8590049650506001851615611f24578583028387820414158715151615611f0d57600080fd5b81810181811015611f1d57600080fd5b8590049350505b600285049450611ec0565b50611f4b565b838015611f455760009250611f49565b8392505b505b509392505050565b818102811580611f6b575082828281611f6857fe5b04145b611fbc576040805162461bcd60e51b815260206004820152601a60248201527f546178436f6c6c6563746f722f726d756c2d6f766572666c6f77000000000000604482015290519081900360640190fd5b6b033b2e3c9fd0803ce8000000900492915050565b80820360008312801590611fe6575060008212155b611126576040805162461bcd60e51b815260206004820181905260248201527f546178436f6c6c6563746f722f6465642d696e76616c69642d6e756d62657273604482015290519081900360640190fd5b60008061204684846000612416565b915091509250929050565b60008115806120675750612065838361150d565b155b1561207457506000611126565b60008281526020848152604080832083805290915280822054600180845291909220546120a592869290919061245a565b50600081815260209283526040808220828052909352828120819055600181529182209190915590565b60006120de846000858561248b565b949350505050565b600e5460408051633eaf7a0360e21b81526001600160a01b0387811660048301529151600160ff1b93929092169163fabde80c91602480820192602092909190829003018186803b15801561213a57600080fd5b505afa15801561214e573d6000803e3d6000fd5b505050506040513d602081101561216457600080fd5b5051106121a25760405162461bcd60e51b81526004018080602001828103825260328152602001806127d66032913960400191505060405180910390fd5b600e5460408051633eaf7a0360e21b81526001600160a01b0387811660048301529151600093929092169163fabde80c91602480820192602092909190829003018186803b1580156121f357600080fd5b505afa158015612207573d6000803e3d6000fd5b505050506040513d602081101561221d57600080fd5b5051600754600091820392506001600160a01b0387811691161461227e5760008781526006602090815260408083208884529091529020600101546c01431e0fae6d7217caa00000009061227190856124f5565b8161227857fe5b056122c8565b6c01431e0fae6d7217caa00000006122bf6122b96c01431e0fae6d7217caa0000000600260008c815260200190815260200160002054611e53565b85611c25565b816122c657fe5b055b90506122eb60006122d98684611c25565b126122e48684611c25565b8413611c21565b6122f55780612300565b8382816122fe57fe5b055b9050801561240d576007546000888152600660209081526040808320898452909152812054612353926001600160a01b038a81169116149161234e9181881215918391908712901515611c21565b6125b1565b1561240d57600e5460408051630e9e11d360e01b8152600481018a90526001600160a01b0389811660248301526044820185905291519190921691630e9e11d391606480830192600092919082900301818387803b1580156123b457600080fd5b505af11580156123c8573d6000803e3d6000fd5b50506040805184815290516001600160a01b038a1693508a92507f6d8843b6550b78e189b1bbdd8e46d5163232388e76a545e02013acb1879b3a459181900360200190a35b50505050505050565b600080612423858561150d565b61243257506000905080612452565b505060008281526020848152604080832084151584529091529020546001905b935093915050565b6000828152602085815260408083209315808452938252808320869055948252948552838120911581529352912055565b6000612497858461150d565b1580156124a957506124a9858561150d565b156124ea5760008481526020868152604080832085151584529091529020546124d48686868661245a565b6124e08685838661245a565b60019150506120de565b506000949350505050565b600061250b8360001914600160ff1b8414611c21565b156125475760405162461bcd60e51b81526004018080602001828103825260218152602001806127086021913960400191505060405180910390fd5b8115806125605750508082028282828161255d57fe5b05145b611126576040805162461bcd60e51b815260206004820181905260248201527f546178436f6c6c6563746f722f6d756c2d696e742d696e742d696e76616c6964604482015290519081900360640190fd5b179056fe546178436f6c6c6563746f722f6164642d75696e742d75696e742d6f766572666c6f77546178436f6c6c6563746f722f6163636f756e742d616c72656164792d75736564546178436f6c6c6563746f722f6164642d696e742d696e742d756e646572666c6f77546178436f6c6c6563746f722f6d6f646966792d756e7265636f676e697a65642d706172616d546178436f6c6c6563746f722f7375622d75696e742d75696e742d756e646572666c6f77546178436f6c6c6563746f722f657863656564732d6d61782d72656365697665722d6c696d6974546178436f6c6c6563746f722f756e6b6e6f776e2d7461782d7265636569766572546178436f6c6c6563746f722f636f6c6c61746572616c2d747970652d616c72656164792d696e6974546178436f6c6c6563746f722f7072696d6172792d72656365697665722d63616e6e6f742d62652d7365636f6e64617279546178436f6c6c6563746f722f6d756c2d696e742d696e742d6f766572666c6f77546178436f6c6c6563746f722f6164642d696e742d696e742d6f766572666c6f77546178436f6c6c6563746f722f6d756c2d75696e742d696e742d6f766572666c6f77546178436f6c6c6563746f722f6d756c2d75696e742d696e742d696e76616c69642d78546178436f6c6c6563746f722f6163636f756e742d6e6f742d617574686f72697a6564546178436f6c6c6563746f722f7461782d6375742d657863656564732d68756e64726564546178436f6c6c6563746f722f636f696e2d62616c616e63652d646f65732d6e6f742d6669742d696e746f2d696e74323536a26469706673582212203776e56da8953ece38b6fcc21aea3ccdc20cc4e5e4056338bc40d0ea0e2e19d564736f6c63430006070033000000000000000000000000cc88a9d330da1133df3a7bd823b95e52511a6962

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101da5760003560e01c806392a448a211610104578063d07900bb116100a2578063de8b062111610071578063de8b06211461052e578063e372ee4414610554578063f0cccf4314610577578063fe4f58901461057f576101da565b8063d07900bb146104ae578063d4b9311d146104cb578063d54635f4146104f4578063dd9dbe3114610511576101da565b8063b7536364116100de578063b753636414610455578063bf4320491461045d578063c78c829514610465578063cc780be214610488576101da565b806392a448a2146103eb57806394f3f81d14610427578063abfbc5b01461044d576101da565b8063498fb99a1161017c5780635e4128581161014b5780635e4128581461037d5780636614f0101461039a57806367aea313146103c65780636c50dbba146103ce576101da565b8063498fb99a14610313578063542f76a61461031b578063555ec74f1461032357806356c057641461034c576101da565b806324ba5884116101b857806324ba58841461026c5780632697dce2146102925780633024a912146102d057806335b28153146102ed576101da565b806315f5fb48146101df578063203dcb581461021857806324341e0114610232575b600080fd5b6101fc600480360360208110156101f557600080fd5b50356105a2565b604080516001600160a01b039092168252519081900360200190f35b6102206105bd565b60408051918252519081900360200190f35b61026a6004803603608081101561024857600080fd5b50803590602081013590604081013590606001356001600160a01b03166105c3565b005b6102206004803603602081101561028257600080fd5b50356001600160a01b0316610697565b6102b5600480360360408110156102a857600080fd5b50803590602001356106a9565b60408051921515835260208301919091528051918290030190f35b610220600480360360208110156102e657600080fd5b50356108dd565b61026a6004803603602081101561030357600080fd5b50356001600160a01b03166108fb565b61022061099b565b6101fc6109a1565b61026a6004803603606081101561033957600080fd5b50803590602081013590604001356109b0565b6103696004803603602081101561036257600080fd5b5035610ad8565b604080519115158252519081900360200190f35b61026a6004803603602081101561039357600080fd5b5035610b00565b61026a600480360360408110156103b057600080fd5b50803590602001356001600160a01b0316610c1b565b6101fc610d78565b610220600480360360208110156103e457600080fd5b5035610d87565b61040e6004803603604081101561040157600080fd5b5080359060200135610f89565b6040805192835260208301919091528051918290030190f35b61026a6004803603602081101561043d57600080fd5b50356001600160a01b0316610fad565b61022061104c565b610220611052565b610220611058565b6103696004803603604081101561047b57600080fd5b5080359060200135611069565b6102206004803603602081101561049e57600080fd5b50356001600160a01b031661112c565b61040e600480360360208110156104c457600080fd5b503561113e565b61026a600480360360608110156104e157600080fd5b5080359060208101359060400135611157565b6102206004803603602081101561050a57600080fd5b5035611278565b61040e6004803603602081101561052757600080fd5b503561128a565b6102206004803603602081101561054457600080fd5b50356001600160a01b0316611380565b61026a6004803603604081101561056a57600080fd5b5080359060200135611392565b61022061142d565b61026a6004803603604081101561059557600080fd5b5080359060200135611433565b6004602052600090815260409020546001600160a01b031681565b600b5481565b336000908152602081905260409020546001146106115760405162461bcd60e51b815260040180806020018281038252602381526020018061278f6023913960400191505060405180910390fd5b610622600d8463ffffffff61150d16565b1561063757610632848484611585565b610642565b6106428483836118ef565b60408051858152602081018590528082018490526001600160a01b038316606082015290517fdd816bbb74e9c8d56d70daaa112136781e45da3cedaf93060401b5fa79cc21059181900360800190a150505050565b60006020819052908152604090205481565b6000806106c083851115600c805490508510611c21565b610711576040805162461bcd60e51b815260206004820152601c60248201527f546178436f6c6c6563746f722f696e76616c69642d696e646578657300000000604482015290519081900360640190fd5b600e5460075460408051633eaf7a0360e21b81526001600160a01b0392831660048201529051600093929092169163fabde80c91602480820192602092909190829003018186803b15801561076557600080fd5b505afa158015610779573d6000803e3d6000fd5b505050506040513d602081101561078f57600080fd5b50516000908103915080865b8681116108ac5760016000600c83815481106107b357fe5b90600052602060002001548152602001908152602001600020600101544211156108a457600e54600c80546001600160a01b039092169163d07900bb9190849081106107fb57fe5b90600052602060002001546040518263ffffffff1660e01b815260040180828152602001915050604080518083038186803b15801561083957600080fd5b505afa15801561084d573d6000803e3d6000fd5b505050506040513d604081101561086357600080fd5b5051600c805491935061088a918390811061087a57fe5b906000526020600020015461128a565b93506108a190508561089c8486611c25565b611cb8565b94505b60010161079b565b5060008412156108ce578284126108c45760016108c7565b60005b94506108d3565b600194505b5050509250929050565b600c81815481106108ea57fe5b600091825260209091200154905081565b336000908152602081905260409020546001146109495760405162461bcd60e51b815260040180806020018281038252602381526020018061278f6023913960400191505060405180910390fd5b6001600160a01b0381166000818152602081815260409182902060019055815192835290517f599a298163e1678bb1c676052a8930bf0b8a1261ed6e01b8a2391e55f70001029281900390910190a150565b60085481565b6007546001600160a01b031681565b336000908152602081905260409020546001146109fe5760405162461bcd60e51b815260040180806020018281038252602381526020018061278f6023913960400191505060405180910390fd5b610a36610a12600d8463ffffffff61150d16565b60008581526006602090815260408083208784529091529020600101541515611c21565b15610a5c5760008381526006602090815260408083208584529091529020819055610a93565b60405162461bcd60e51b815260040180806020018281038252602181526020018061268d6021913960400191505060405180910390fd5b604080518481526020810184905280820183905290517fab4951554135af54806ae8b8c0860008dbf001b33208f80e3ef0e8a54d23528b9181900360600190a1505050565b600081610ae757506000610afb565b610af8600d8363ffffffff61150d16565b90505b919050565b33600090815260208190526040902054600114610b4e5760405162461bcd60e51b815260040180806020018281038252602381526020018061278f6023913960400191505060405180910390fd5b6000818152600160205260409020805415610b9a5760405162461bcd60e51b81526004018080602001828103825260298152602001806126ae6029913960400191505060405180910390fd5b6b033b2e3c9fd0803ce8000000815542600180830191909155600c805491820181556000527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7018290556040805183815290517f715b265758bcd4ecd311bede8dcca05c4b5819e0a2a5c4103abd702862ae2c359181900360200190a15050565b33600090815260208190526040902054600114610c695760405162461bcd60e51b815260040180806020018281038252602381526020018061278f6023913960400191505060405180910390fd5b6001600160a01b038116610cbd576040805162461bcd60e51b8152602060048201526016602482015275546178436f6c6c6563746f722f6e756c6c2d6461746160501b604482015290519081900360640190fd5b8171383934b6b0b93caa30bc2932b1b2b4bb32b960711b1415610cfa57600780546001600160a01b0319166001600160a01b038316179055610d31565b60405162461bcd60e51b815260040180806020018281038252602681526020018061261c6026913960400191505060405180910390fd5b604080518381526001600160a01b038316602082015281517fd91f38cf03346b5dc15fb60f9076f866295231ad3c3841a1051f8443f25170d1929181900390910190a15050565b600e546001600160a01b031681565b60008181526001602081905260408220015481904211610e2257600e546040805163d07900bb60e01b81526004810186905281516001600160a01b039093169263d07900bb92602480840193919291829003018186803b158015610dea57600080fd5b505afa158015610dfe573d6000803e3d6000fd5b505050506040513d6040811015610e1457600080fd5b50602001519150610afb9050565b6000610e2d8461128a565b600e546040805163d07900bb60e01b8152600481018990528151939550600094506001600160a01b039092169263d07900bb926024808201939291829003018186803b158015610e7c57600080fd5b505afa158015610e90573d6000803e3d6000fd5b505050506040513d6040811015610ea657600080fd5b50519050610eb5858284611d49565b600e546040805163d07900bb60e01b81526004810188905281516001600160a01b039093169263d07900bb92602480840193919291829003018186803b158015610efe57600080fd5b505afa158015610f12573d6000803e3d6000fd5b505050506040513d6040811015610f2857600080fd5b5060209081015160008781526001808452604091829020429101558051828152928301859052805191955087927f584c2e3a292b065d3d3a0edd7e25bb572b4c171192c33ab9c3b0f5d4448adf8b929081900390910190a250909392505050565b60066020908152600092835260408084209091529082529020805460019091015482565b33600090815260208190526040902054600114610ffb5760405162461bcd60e51b815260040180806020018281038252602381526020018061278f6023913960400191505060405180910390fd5b6001600160a01b03811660008181526020818152604080832092909255815192835290517f8834a87e641e9716be4f34527af5d23e11624f1ddeefede6ad75a9acfc31b9039281900390910190a150565b60095481565b600c5490565b6000611064600d611dd7565b905090565b600061107f82841115600c805490508410611c21565b6110d0576040805162461bcd60e51b815260206004820152601c60248201527f546178436f6c6c6563746f722f696e76616c69642d696e646578657300000000604482015290519081900360640190fd5b825b8281116111205760016000600c83815481106110ea57fe5b9060005260206000200154815260200190815260200160002060010154421115611118575060009050611126565b6001016110d2565b50600190505b92915050565b60056020526000908152604090205481565b6001602081905260009182526040909120805491015482565b336000908152602081905260409020546001146111a55760405162461bcd60e51b815260040180806020018281038252602381526020018061278f6023913960400191505060405180910390fd5b60008381526001602081905260409091200154421461120b576040805162461bcd60e51b815260206004820181905260248201527f546178436f6c6c6563746f722f7570646174652d74696d652d6e6f742d6e6f77604482015290519081900360640190fd5b816b73746162696c69747946656560a01b1415610cfa576000838152600160205260409020819055604080518481526020810184905280820183905290517fc59b1109b54f213212d2f5af5c1dae5e887f9daa63b595578fae847cb048e8f49181900360600190a1505050565b60026020526000908152604090205481565b600e546040805163d07900bb60e01b8152600481018490528151600093849384936001600160a01b039092169263d07900bb926024808201939291829003018186803b1580156112d957600080fd5b505afa1580156112ed573d6000803e3d6000fd5b505050506040513d604081101561130357600080fd5b50602090810151600854600087815260019093526040832054919350611368916113629161133091611e11565b61135042600160008b815260200190815260200160002060010154611e53565b6b033b2e3c9fd0803ce8000000611e95565b83611f53565b9050806113758284611fd1565b935093505050915091565b60036020526000908152604090205481565b600c546113a59082841115908310611c21565b6113f6576040805162461bcd60e51b815260206004820152601c60248201527f546178436f6c6c6563746f722f696e76616c69642d696e646578657300000000604482015290519081900360640190fd5b815b8181116114285761141f600c828154811061140f57fe5b9060005260206000200154610d87565b506001016113f8565b505050565b600a5481565b336000908152602081905260409020546001146114815760405162461bcd60e51b815260040180806020018281038252602381526020018061278f6023913960400191505060405180910390fd5b8171676c6f62616c53746162696c69747946656560701b14156114a85760088190556114ce565b81746d61785365636f6e6461727952656365697665727360581b1415610cfa57600a8190555b604080518381526020810183905281517fac7c5c1afaef770ec56ac6268cd3f2fbb1035858ead2601d6553157c33036c3a929181900390910190a15050565b600081815260208381526040808320838052909152812054158015611548575060008281526020848152604080832060018452909152902054155b1561157d576000808052602084815260408083206001845290915290205482141561157557506001611126565b506000611126565b506001611126565b806117325760008381526002602090815260408083205460068352818420868552909252909120600101546115ba9190611e53565b60008481526002602090815260408083209390935584825260048152828220546001600160a01b031682526005905220546001141561169957600b5482141561161b576000611615600b54600d61203790919063ffffffff16565b600b5550505b61162c600d8363ffffffff61205116565b50600082815260046020818152604080842080546001600160a01b03908116865260038452828620869055888652600684528286208887528452828620868155600101869055815416855260058352908420849055928590525280546001600160a01b031916905561172d565b60008381526006602090815260408083208584529091529020600101541561172d576000828152600460209081526040808320546001600160a01b0316835260059091529020546116eb906001611e53565b6000838152600460209081526040808320546001600160a01b031683526005825280832093909355858252600681528282208583529052908120818155600101555b61186d565b6000838152600260209081526040808320546006835281842086855290925282206001015461176a9161176491611e53565b83611e11565b90506c01431e0fae6d7217caa000000081106117cd576040805162461bcd60e51b815260206004820152601c60248201527f546178436f6c6c6563746f722f7461782d6375742d746f6f2d62696700000000604482015290519081900360640190fd5b6000848152600660209081526040808320868452909152902060010154611844576000838152600460209081526040808320546001600160a01b03168352600590915290205461181e906001611e11565b6000848152600460209081526040808320546001600160a01b0316835260059091529020555b600084815260026020908152604080832093909355600681528282208583529052206001018190555b600954600b5460008581526002602090815260408083205487845260048352818420546001600160a01b031684526005835292819020548151958652918501939093528383019190915260608301525184917f93dd084738077accc9983c441821583d23638cfa27021cdfc189cf3a583810a9919081900360800190a2505050565b6001600160a01b03811661194a576040805162461bcd60e51b815260206004820152601960248201527f546178436f6c6c6563746f722f6e756c6c2d6163636f756e7400000000000000604482015290519081900360640190fd5b6007546001600160a01b03828116911614156119975760405162461bcd60e51b81526004018080602001828103825260318152602001806126d76031913960400191505060405180910390fd5b600082116119e3576040805162461bcd60e51b81526020600482015260146024820152732a30bc21b7b63632b1ba37b917b73ab63616b9b360611b604482015290519081900360640190fd5b6001600160a01b03811660009081526003602052604090205415611a385760405162461bcd60e51b81526004018080602001828103825260218152602001806125d96021913960400191505060405180910390fd5b600a54611a4d611a46611058565b6001611e11565b1115611a8a5760405162461bcd60e51b81526004018080602001828103825260278152602001806126666027913960400191505060405180910390fd5b6000838152600260205260409020546c01431e0fae6d7217caa000000090611ab29084611e11565b10611aee5760405162461bcd60e51b81526004018080602001828103825260248152602001806127b26024913960400191505060405180910390fd5b611afb6009546001611e11565b6009819055600b556001600160a01b0381166000908152600360209081526040808320600190558583526002909152902054611b379083611e11565b60008481526002602090815260408083209390935560068152828220600b805484529082528383206001908101879055815484526004835284842080546001600160a01b0319166001600160a01b03881690811790915584526005909252928220559054611ba891600d91906120cf565b50600954600b546000858152600260209081526040808320546001600160a01b03871684526005835292819020548151958652918501939093528383019190915260608301525184917f086fff5d978796ef618ca584578a9142f3990d864bc943358a776080e73f754f919081900360800190a2505050565b1690565b8181026000831215611c685760405162461bcd60e51b815260040180806020018281038252602381526020018061276c6023913960400191505060405180910390fd5b811580611c7d575082828281611c7a57fe5b05145b6111265760405162461bcd60e51b815260040180806020018281038252602281526020018061274a6022913960400191505060405180910390fd5b81810160008213611d025782811315611d025760405162461bcd60e51b81526004018080602001828103825260228152602001806125fa6022913960400191505060405180910390fd5b6000821315611126578281136111265760405162461bcd60e51b81526004018080602001828103825260218152602001806127296021913960400191505060405180910390fd5b600b545b8015611db557600084815260066020908152604080832084845290915290206001015415611d9b57600081815260046020526040902054611d9b9085906001600160a01b03168386866120e6565b611dac600d8263ffffffff61203716565b9150611d4d9050565b600754611dd19085906001600160a01b031660001986866120e6565b50505050565b6000806000611de98460006001612416565b9250505b8115611e0a57611dff84836001612416565b925050600101611ded565b9392505050565b818101828110156111265760405162461bcd60e51b81526004018080602001828103825260238152602001806125b66023913960400191505060405180910390fd5b808203828111156111265760405162461bcd60e51b81526004018080602001828103825260248152602001806126426024913960400191505060405180910390fd5b6000838015611f3557600184168015611eb057859250611eb4565b8392505b50600283046002850494505b8415611f2f578586028687820414611ed757600080fd5b81810181811015611ee757600080fd5b8590049650506001851615611f24578583028387820414158715151615611f0d57600080fd5b81810181811015611f1d57600080fd5b8590049350505b600285049450611ec0565b50611f4b565b838015611f455760009250611f49565b8392505b505b509392505050565b818102811580611f6b575082828281611f6857fe5b04145b611fbc576040805162461bcd60e51b815260206004820152601a60248201527f546178436f6c6c6563746f722f726d756c2d6f766572666c6f77000000000000604482015290519081900360640190fd5b6b033b2e3c9fd0803ce8000000900492915050565b80820360008312801590611fe6575060008212155b611126576040805162461bcd60e51b815260206004820181905260248201527f546178436f6c6c6563746f722f6465642d696e76616c69642d6e756d62657273604482015290519081900360640190fd5b60008061204684846000612416565b915091509250929050565b60008115806120675750612065838361150d565b155b1561207457506000611126565b60008281526020848152604080832083805290915280822054600180845291909220546120a592869290919061245a565b50600081815260209283526040808220828052909352828120819055600181529182209190915590565b60006120de846000858561248b565b949350505050565b600e5460408051633eaf7a0360e21b81526001600160a01b0387811660048301529151600160ff1b93929092169163fabde80c91602480820192602092909190829003018186803b15801561213a57600080fd5b505afa15801561214e573d6000803e3d6000fd5b505050506040513d602081101561216457600080fd5b5051106121a25760405162461bcd60e51b81526004018080602001828103825260328152602001806127d66032913960400191505060405180910390fd5b600e5460408051633eaf7a0360e21b81526001600160a01b0387811660048301529151600093929092169163fabde80c91602480820192602092909190829003018186803b1580156121f357600080fd5b505afa158015612207573d6000803e3d6000fd5b505050506040513d602081101561221d57600080fd5b5051600754600091820392506001600160a01b0387811691161461227e5760008781526006602090815260408083208884529091529020600101546c01431e0fae6d7217caa00000009061227190856124f5565b8161227857fe5b056122c8565b6c01431e0fae6d7217caa00000006122bf6122b96c01431e0fae6d7217caa0000000600260008c815260200190815260200160002054611e53565b85611c25565b816122c657fe5b055b90506122eb60006122d98684611c25565b126122e48684611c25565b8413611c21565b6122f55780612300565b8382816122fe57fe5b055b9050801561240d576007546000888152600660209081526040808320898452909152812054612353926001600160a01b038a81169116149161234e9181881215918391908712901515611c21565b6125b1565b1561240d57600e5460408051630e9e11d360e01b8152600481018a90526001600160a01b0389811660248301526044820185905291519190921691630e9e11d391606480830192600092919082900301818387803b1580156123b457600080fd5b505af11580156123c8573d6000803e3d6000fd5b50506040805184815290516001600160a01b038a1693508a92507f6d8843b6550b78e189b1bbdd8e46d5163232388e76a545e02013acb1879b3a459181900360200190a35b50505050505050565b600080612423858561150d565b61243257506000905080612452565b505060008281526020848152604080832084151584529091529020546001905b935093915050565b6000828152602085815260408083209315808452938252808320869055948252948552838120911581529352912055565b6000612497858461150d565b1580156124a957506124a9858561150d565b156124ea5760008481526020868152604080832085151584529091529020546124d48686868661245a565b6124e08685838661245a565b60019150506120de565b506000949350505050565b600061250b8360001914600160ff1b8414611c21565b156125475760405162461bcd60e51b81526004018080602001828103825260218152602001806127086021913960400191505060405180910390fd5b8115806125605750508082028282828161255d57fe5b05145b611126576040805162461bcd60e51b815260206004820181905260248201527f546178436f6c6c6563746f722f6d756c2d696e742d696e742d696e76616c6964604482015290519081900360640190fd5b179056fe546178436f6c6c6563746f722f6164642d75696e742d75696e742d6f766572666c6f77546178436f6c6c6563746f722f6163636f756e742d616c72656164792d75736564546178436f6c6c6563746f722f6164642d696e742d696e742d756e646572666c6f77546178436f6c6c6563746f722f6d6f646966792d756e7265636f676e697a65642d706172616d546178436f6c6c6563746f722f7375622d75696e742d75696e742d756e646572666c6f77546178436f6c6c6563746f722f657863656564732d6d61782d72656365697665722d6c696d6974546178436f6c6c6563746f722f756e6b6e6f776e2d7461782d7265636569766572546178436f6c6c6563746f722f636f6c6c61746572616c2d747970652d616c72656164792d696e6974546178436f6c6c6563746f722f7072696d6172792d72656365697665722d63616e6e6f742d62652d7365636f6e64617279546178436f6c6c6563746f722f6d756c2d696e742d696e742d6f766572666c6f77546178436f6c6c6563746f722f6164642d696e742d696e742d6f766572666c6f77546178436f6c6c6563746f722f6d756c2d75696e742d696e742d6f766572666c6f77546178436f6c6c6563746f722f6d756c2d75696e742d696e742d696e76616c69642d78546178436f6c6c6563746f722f6163636f756e742d6e6f742d617574686f72697a6564546178436f6c6c6563746f722f7461782d6375742d657863656564732d68756e64726564546178436f6c6c6563746f722f636f696e2d62616c616e63652d646f65732d6e6f742d6669742d696e746f2d696e74323536a26469706673582212203776e56da8953ece38b6fcc21aea3ccdc20cc4e5e4056338bc40d0ea0e2e19d564736f6c63430006070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000cc88a9d330da1133df3a7bd823b95e52511a6962

-----Decoded View---------------
Arg [0] : safeEngine_ (address): 0xCC88a9d330da1133Df3A7bD823B95e52511A6962

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000cc88a9d330da1133df3a7bd823b95e52511a6962


Deployed Bytecode Sourcemap

9668:26242:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9668:26242:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;13190:85:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;13190:85:0;;:::i;:::-;;;;-1:-1:-1;;;;;13190:85:0;;;;;;;;;;;;;;14083:41;;;:::i;:::-;;;;;;;;;;;;;;;;21500:538;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;21500:538:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21500:538:0;;:::i;:::-;;9763:54;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;9763:54:0;-1:-1:-1;;;;;9763:54:0;;:::i;28065:846::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;28065:846:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;14162:40;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;14162:40:0;;:::i;9927:156::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;9927:156:0;-1:-1:-1;;;;;9927:156:0;;:::i;13667:36::-;;;:::i;13565:::-;;;:::i;20517:533::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;20517:533:0;;;;;;;;;;;;:::i;30415:183::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;30415:183:0;;:::i;:::-;;;;;;;;;;;;;;;;;;17901:461;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;17901:461:0;;:::i;19865:341::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;19865:341:0;;;;;;-1:-1:-1;;;;;19865:341:0;;:::i;14308:32::-;;;:::i;31343:850::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;31343:850:0;;:::i;13475:81::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;13475:81:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;10202:162;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;10202:162:0;-1:-1:-1;;;;;10202:162:0;;:::i;13837:40::-;;;:::i;30205:109::-;;;:::i;30014:121::-;;;:::i;27263:404::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;27263:404:0;;;;;;;:::i;13351:91::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;13351:91:0;-1:-1:-1;;;;;13351:91:0;;:::i;12654:75::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;12654:75:0;;:::i;18626:520::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;18626:520:0;;;;;;;;;;;;:::i;12840:87::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;12840:87:0;;:::i;29220:674::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;29220:674:0;;:::i;13019:81::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;13019:81:0;-1:-1:-1;;;;;13019:81:0;;:::i;30943:265::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;30943:265:0;;;;;;;:::i;13956:39::-;;;:::i;19324:363::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;19324:363:0;;;;;;;:::i;13190:85::-;;;;;;;;;;;;-1:-1:-1;;;;;13190:85:0;;:::o;14083:41::-;;;;:::o;21500:538::-;10517:10;10498:18;:30;;;;;;;;;;;10532:1;10498:35;10490:83;;;;-1:-1:-1;;;10490:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21686:38:::1;:21;21715:8:::0;21686:38:::1;:28;:38;:::i;:::-;21685:39;21684:201;;21821:64;21845:14;21861:8;21871:13;21821:23;:64::i;:::-;21684:201;;;21739:68;21760:14;21776:13;21791:15;21739:20;:68::i;:::-;21901:129;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;21901:129:0;::::1;::::0;;;;;;::::1;::::0;;;;;;;::::1;21500:538:::0;;;;:::o;9763:54::-;;;;;;;;;;;;;;:::o;28065:846::-;28138:7;28147:10;28178:47;28192:3;28183:5;:12;;28203:14;:21;;;;28197:3;:27;28178:4;:47::i;:::-;28170:88;;;;;-1:-1:-1;;;28170:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;28310:10;;28333:18;;28310:42;;;-1:-1:-1;;;28310:42:0;;-1:-1:-1;;;;;28333:18:0;;;28310:42;;;;;;28269:30;;28310:10;;;;;:22;;:42;;;;;;;;;;;;;;;:10;:42;;;2:2:-1;;;;27:1;24;17:12;2:2;28310:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28310:42:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;28310:42:0;28302:51;;;;;-1:-1:-1;28302:51:0;28438:5;28421:345;28450:3;28445:1;:8;28421:345;;28483:15;:34;28499:14;28514:1;28499:17;;;;;;;;;;;;;;;;28483:34;;;;;;;;;;;:45;;;28477:3;:51;28473:282;;;28562:10;;28589:14;:17;;-1:-1:-1;;;;;28562:10:0;;;;:26;;28589:14;28604:1;;28589:17;;;;;;;;;;;;;;28562:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28562:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28562:45:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;28562:45:0;28656:14;:17;;28562:45;;-1:-1:-1;28639:35:0;;28671:1;;28656:17;;;;;;;;;;;;;;28639:16;:35::i;:::-;28622:52;-1:-1:-1;28695:46:0;;-1:-1:-1;28704:3:0;28709:31;28718:10;28622:52;28709:8;:31::i;:::-;28695:8;:46::i;:::-;28689:52;;28473:282;28455:3;;28421:345;;;;28786:1;28780:3;:7;28776:128;;;28814:22;28808:3;:28;28807:45;;28848:4;28807:45;;;28840:5;28807:45;28802:50;;28776:128;;;28888:4;28883:9;;28776:128;28065:846;;;;;;;;:::o;14162:40::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14162:40:0;:::o;9927:156::-;10517:10;10498:18;:30;;;;;;;;;;;10532:1;10498:35;10490:83;;;;-1:-1:-1;;;10490:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10003:27:0;::::1;:18;:27:::0;;;::::1;::::0;;;;;;;;10033:1:::1;10003:31:::0;;10050:25;;;;;;;::::1;::::0;;;;;;;;::::1;9927:156:::0;:::o;13667:36::-;;;;:::o;13565:::-;;;-1:-1:-1;;;;;13565:36:0;;:::o;20517:533::-;10517:10;10498:18;:30;;;;;;;;;;;10532:1;10498:35;10490:83;;;;-1:-1:-1;;;10490:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20669:111:::1;20674:38;:21;20703:8:::0;20674:38:::1;:28;:38;:::i;:::-;20778:1;20714:37:::0;;;:21:::1;:37;::::0;;;;;;;:47;;;;;;;;:61:::1;;::::0;:65;;20669:4:::1;:111::i;:::-;20665:270;;;20797:37;::::0;;;:21:::1;:37;::::0;;;;;;;:47;;;;;;;;:68;;;20665:270:::1;;;20892:43;;-1:-1:-1::0;;;20892:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20665:270;20951:91;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;::::1;::::0;;;;;;;::::1;20517:533:::0;;;:::o;30415:183::-;30484:4;30505:14;30501:32;;-1:-1:-1;30528:5:0;30521:12;;30501:32;30551:39;:21;30580:9;30551:39;:28;:39;:::i;:::-;30544:46;;30415:183;;;;:::o;17901:461::-;10517:10;10498:18;:30;;;;;;;;;;;10532:1;10498:35;10490:83;;;;-1:-1:-1;;;10490:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17992:38:::1;18033:31:::0;;;:15:::1;:31;::::0;;;;18083:28;;:33;18075:87:::1;;;;-1:-1:-1::0;;;18075:87:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15532:8;18173:34:::0;;18249:3:::1;18218:26;::::0;;::::1;:34:::0;;;;18263:14:::1;27:10:-1::0;;23:18;;::::1;45:23:::0;;18173:28:0::1;18263:35:::0;;::::1;::::0;;;18314:40:::1;::::0;;;;;;;::::1;::::0;;;;18263:35:::1;18314:40:::0;;::::1;10584:1;17901:461:::0;:::o;19865:341::-;10517:10;10498:18;:30;;;;;;;;;;;10532:1;10498:35;10490:83;;;;-1:-1:-1;;;10490:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19965:18:0;::::1;19957:53;;;::::0;;-1:-1:-1;;;19957:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;19957:53:0;;;;;;;;;;;;;::::1;;20025:9;-1:-1:-1::0;;;20025:33:0::1;20021:128;;;20060:18;:25:::0;;-1:-1:-1;;;;;;20060:25:0::1;-1:-1:-1::0;;;;;20060:25:0;::::1;;::::0;;20021:128:::1;;;20101:48;;-1:-1:-1::0;;;20101:48:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20021:128;20165:33;::::0;;;;;-1:-1:-1;;;;;20165:33:0;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;::::1;19865:341:::0;;:::o;14308:32::-;;;-1:-1:-1;;;;;14308:32:0;;:::o;31343:850::-;31402:7;31473:31;;;:15;:31;;;;;;;:42;;31402:7;;31466:3;:49;31462:191;;31558:10;;:42;;;-1:-1:-1;;;31558:42:0;;;;;;;;;;-1:-1:-1;;;;;31558:10:0;;;;:26;;:42;;;;;;;;;;;;;:10;:42;;;2:2:-1;;;;27:1;24;17:12;2:2;31558:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31558:42:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;31558:42:0;;;;-1:-1:-1;31613:28:0;;-1:-1:-1;31613:28:0;31462:191;31666:16;31686:32;31703:14;31686:16;:32::i;:::-;31824:10;;:42;;;-1:-1:-1;;;31824:42:0;;;;;;;;;;31663:55;;-1:-1:-1;31800:18:0;;-1:-1:-1;;;;;;31824:10:0;;;;:26;;:42;;;;;;;;;;;;:10;:42;;;2:2:-1;;;;27:1;24;17:12;2:2;31824:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31824:42:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;31824:42:0;;-1:-1:-1;31877:53:0;31892:14;31824:42;31920:9;31877:14;:53::i;:::-;31969:10;;:42;;;-1:-1:-1;;;31969:42:0;;;;;;;;;;-1:-1:-1;;;;;31969:10:0;;;;:26;;:42;;;;;;;;;;;;;:10;:42;;;2:2:-1;;;;27:1;24;17:12;2:2;31969:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31969:42:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;31969:42:0;;;;;32022:31;;;;:15;:31;;;31969:42;32022:31;;;;32067:3;32022:42;;:48;32086:60;;;;;;;;;;;;;31969:42;;-1:-1:-1;32038:14:0;;32086:60;;;;;;;;;;;-1:-1:-1;32164:21:0;;31343:850;-1:-1:-1;;;31343:850:0:o;13475:81::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;10202:162::-;10517:10;10498:18;:30;;;;;;;;;;;10532:1;10498:35;10490:83;;;;-1:-1:-1;;;10490:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10281:27:0;::::1;10311:1;10281:27:::0;;;::::1;::::0;;;;;;;:31;;;;10328:28;;;;;;;::::1;::::0;;;;;;;;::::1;10202:162:::0;:::o;13837:40::-;;;;:::o;30205:109::-;30285:14;:21;30205:109;:::o;30014:121::-;30071:7;30098:29;:21;:27;:29::i;:::-;30091:36;;30014:121;:::o;27263:404::-;27338:7;27366:47;27380:3;27371:5;:12;;27391:14;:21;;;;27385:3;:27;27366:4;:47::i;:::-;27358:88;;;;;-1:-1:-1;;;27358:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27474:5;27457:183;27486:3;27481:1;:8;27457:183;;27519:15;:34;27535:14;27550:1;27535:17;;;;;;;;;;;;;;;;27519:34;;;;;;;;;;;:45;;;27513:3;:51;27509:120;;;-1:-1:-1;27586:5:0;;-1:-1:-1;27606:9:0;;27509:120;27491:3;;27457:183;;;;27655:4;27650:9;;27263:404;;;;;:::o;13351:91::-;;;;;;;;;;;;;:::o;12654:75::-;;;;;;;;;;;;;;;;;;;;:::o;18626:520::-;10517:10;10498:18;:30;;;;;;;;;;;10532:1;10498:35;10490:83;;;;-1:-1:-1;;;10490:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18791:31:::1;::::0;;;:15:::1;:31;::::0;;;;;;;:42:::1;::::0;18784:3:::1;:49;18776:94;;;::::0;;-1:-1:-1;;;18776:94:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;18885:9;-1:-1:-1::0;;;18885:27:0::1;18881:148;;;18914:31;::::0;;;:15:::1;:31;::::0;;;;:51;;;19045:93:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;::::1;::::0;;;;;;;::::1;18626:520:::0;;;:::o;12840:87::-;;;;;;;;;;;;;:::o;29220:674::-;29353:10;;:42;;;-1:-1:-1;;;29353:42:0;;;;;;;;;;29291:7;;;;;;-1:-1:-1;;;;;29353:10:0;;;;:26;;:42;;;;;;;;;;;;:10;:42;;;2:2:-1;;;;27:1;24;17:12;2:2;29353:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29353:42:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;29353:42:0;;;;;29520:18;;29406:28;29557:31;;;:15;:31;;;29353:42;29557:31;;:44;29353:42;;-1:-1:-1;29448:347:0;;29472:290;;29493:125;;:8;:125::i;:::-;29635:108;29662:3;29684:15;:31;29700:14;29684:31;;;;;;;;;;;:42;;;29635:8;:108::i;:::-;15532:8;29472:4;:290::i;:::-;29775:19;29448:9;:347::i;:::-;29406:389;;29814:20;29836:49;29843:20;29865:19;29836:6;:49::i;:::-;29806:80;;;;;;29220:674;;;:::o;13019:81::-;;;;;;;;;;;;;:::o;30943:265::-;31041:14;:21;31016:47;;31021:12;;;;;31035:27;;31016:4;:47::i;:::-;31008:88;;;;;-1:-1:-1;;;31008:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31124:5;31107:94;31136:3;31131:1;:8;31107:94;;31161:28;31171:14;31186:1;31171:17;;;;;;;;;;;;;;;;31161:9;:28::i;:::-;-1:-1:-1;31141:3:0;;31107:94;;;;30943:265;;:::o;13956:39::-;;;;:::o;19324:363::-;10517:10;10498:18;:30;;;;;;;;;;;10532:1;10498:35;10490:83;;;;-1:-1:-1;;;10490:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19420:9:::1;-1:-1:-1::0;;;19420:33:0::1;19416:214;;;19455:18;:25:::0;;;19416:214:::1;;;19500:9;-1:-1:-1::0;;;19500:36:0::1;19496:134;;;19538:21;:28:::0;;;19496:134:::1;19646:33;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;19324:363:::0;;:::o;2021:372::-;2094:4;2115:16;;;;;;;;;;;:22;;;;;;;;;:30;:64;;;;-1:-1:-1;1107:1:0;2149:16;;;;;;;;;;;1187:4;2149:22;;;;;;;;:30;2115:64;2111:275;;;2200:9;:15;;;;;;;;;;;1187:4;2200:21;;;;;;;;:30;;2196:135;;;-1:-1:-1;2258:4:0;2251:11;;2196:135;-1:-1:-1;2310:5:0;2303:12;;2111:275;-1:-1:-1;2370:4:0;2363:11;;24601:2519;24723:18;24719:2109;;24825:43;;;;:27;:43;;;;;;;;;24883:21;:37;;;;;:47;;;;;;;;;:61;;;24802:155;;24825:43;24802:8;:155::i;:::-;24756:43;;;;:27;:43;;;;;;;;:201;;;;25008:35;;;:25;:35;;;;;;-1:-1:-1;;;;;25008:35:0;24976:68;;:31;:68;;;;25008:35;24976:73;24972:992;;;25082:23;;25070:8;:35;25066:207;;;25127:20;25151:51;25178:23;;25151:21;:26;;:51;;;;:::i;:::-;25219:23;:38;-1:-1:-1;;25066:207:0;25287:35;:21;25313:8;25287:35;:25;:35;:::i;:::-;-1:-1:-1;25344:58:0;25366:35;;;:25;:35;;;;;;;;;;-1:-1:-1;;;;;25366:35:0;;;25344:58;;:21;:58;;;;;25337:66;;;25425:37;;;:21;:37;;;;;:47;;;;;;;;25418:55;;;25366:35;25418:55;;;;25527:35;;;25495:68;;:31;:68;;;;;25488:76;;;25586:35;;;;;25579:43;;-1:-1:-1;;;;;;25579:43:0;;;24972:992;;;25710:1;25646:37;;;:21;:37;;;;;;;;:47;;;;;;;;:61;;;:65;25642:322;;25808:68;25840:35;;;:25;:35;;;;;;;;;-1:-1:-1;;;;;25840:35:0;25808:68;;:31;:68;;;;;;25799:81;;25840:35;25799:8;:81::i;:::-;25728:68;25760:35;;;:25;:35;;;;;;;;;-1:-1:-1;;;;;25760:35:0;25728:68;;:31;:68;;;;;:152;;;;25902:37;;;:21;:37;;;;;:47;;;;;;;;25895:55;;;25760:35;25895:55;;25642:322;24719:2109;;;25994:36;26065:43;;;:27;:43;;;;;;;;;26110:21;:37;;;;;:47;;;;;;;;:61;;;26033:180;;26056:116;;:8;:116::i;:::-;26187:13;26033:8;:180::i;:::-;25994:219;;15580:8;26234:28;:44;26226:85;;;;;-1:-1:-1;;;26226:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26328:37;;;;:21;:37;;;;;;;;:47;;;;;;;;:61;;;26324:298;;26507:68;26539:35;;;:25;:35;;;;;;;;;-1:-1:-1;;;;;26539:35:0;26507:68;;:31;:68;;;;;;26482:126;;26539:35;26482:8;:126::i;:::-;26411:68;26443:35;;;:25;:35;;;;;;;;;-1:-1:-1;;;;;26443:35:0;26411:68;;:31;:68;;;;;:197;26324:298;26634:43;;;;:27;:43;;;;;;;;:92;;;;26739:21;:37;;;;;:47;;;;;;:61;;:77;;;24719:2109;26906:22;;26941:23;;26977:43;;;;:27;:43;;;;;;;;;27065:35;;;:25;:35;;;;;;-1:-1:-1;;;;;27065:35:0;27033:68;;:31;:68;;;;;;;26843:269;;;;;;;;;;;;;;;;;;;;;;;;26879:14;;26843:269;;;;;;;;;;24601:2519;;;:::o;22358:1861::-;-1:-1:-1;;;;;22488:29:0;;22480:67;;;;;-1:-1:-1;;;22480:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;22585:18;;-1:-1:-1;;;;;22566:37:0;;;22585:18;;22566:37;;22558:99;;;;-1:-1:-1;;;22558:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22692:1;22676:13;:17;22668:50;;;;;-1:-1:-1;;;22668:50:0;;;;;;;;;;;;-1:-1:-1;;;22668:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;22737:38:0;;;;;;:21;:38;;;;;;:43;22729:89;;;;-1:-1:-1;;;22729:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22882:21;;22837:41;22846:26;:24;:26::i;:::-;15628:1;22837:8;:41::i;:::-;:66;;22829:118;;;;-1:-1:-1;;;22829:118:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22975:43;;;;:27;:43;;;;;;15580:8;;22966:68;;23020:13;22966:8;:68::i;:::-;:84;22958:133;;;;-1:-1:-1;;;22958:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23181:35;23190:22;;23214:1;23181:8;:35::i;:::-;23102:22;:114;;;23227:23;:101;-1:-1:-1;;;;;23339:38:0;;-1:-1:-1;23339:38:0;;;:21;:38;;;;;;;;15628:1;23339:82;;23520:43;;;:27;:43;;;;;;23511:68;;23565:13;23511:8;:68::i;:::-;23432:43;;;;:27;:43;;;;;;;;:147;;;;23590:21;:37;;;;;23628:23;;;23590:62;;;;;;;;:76;;;;:92;;;23719:23;;23693:50;;:25;:50;;;;;:94;;-1:-1:-1;;;;;;23693:94:0;-1:-1:-1;;;;;23693:94:0;;;;;;;;23798:48;;:31;:48;;;;;;:82;23918:23;;23891:58;;:21;;23918:23;23891:26;:58::i;:::-;-1:-1:-1;24025:22:0;;24060:23;;24096:43;;;;:27;:43;;;;;;;;;-1:-1:-1;;;;;24152:48:0;;;;:31;:48;;;;;;;23965:246;;;;;;;;;;;;;;;;;;;;;;;;23998:14;;23965:246;;;;;;;;;;22358:1861;;;:::o;17503:104::-;17590:9;;17583:17::o;16738:267::-;16825:13;;;16800:8;16857:14;;;16849:62;;;;-1:-1:-1;;;16849:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16930:6;;;:28;;;16956:1;16944;16940;:5;;;;;;:18;16930:28;16922:75;;;;-1:-1:-1;;;16922:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15858:249;15944:5;;;15919:8;15964:6;;15960:65;;15985:1;15980;:6;;15972:53;;;;-1:-1:-1;;;15972:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16045:1;16040;:6;16036:63;;;16060:1;16056;:5;16048:51;;;;-1:-1:-1;;;16048:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32443:1058;32639:23;;32750:605;32757:28;;32750:605;;32964:1;32884:37;;;:21;:37;;;;;;;;:63;;;;;;;;:77;;;:81;32880:337;;33043:51;;;;:25;:51;;;;;;32982:221;;33012:14;;-1:-1:-1;;;;;33043:51:0;33069:24;33152:10;33179:9;32982:13;:221::i;:::-;33291:52;:21;33318:24;33291:52;:26;:52;:::i;:::-;33260:83;-1:-1:-1;32750:605:0;;-1:-1:-1;32750:605:0;;33438:18;;33408:85;;33422:14;;-1:-1:-1;;;;;33438:18:0;-1:-1:-1;;33471:10:0;33483:9;33408:13;:85::i;:::-;32443:1058;;;;:::o;2552:278::-;2609:7;2629:9;2649:11;2679:21;2683:4;1107:1;1187:4;2679:3;:21::i;:::-;2671:29;-1:-1:-1;;2711:91:0;2718:9;;2711:91;;2752:18;2756:4;2762:1;1187:4;2752:3;:18::i;:::-;2744:26;-1:-1:-1;;2785:5:0;;2711:91;;;2819:3;2552:278;-1:-1:-1;;;2552:278:0:o;15685:167::-;15774:5;;;15798:6;;;;15790:54;;;;-1:-1:-1;;;15790:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16113:158;16211:5;;;16206:16;;;;16198:65;;;;-1:-1:-1;;;16198:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14587:906;14657:9;14704:1;14706:50;;;;14794:9;;;14804:17;;;;14837:1;14832:6;;14787:53;;14804:17;14818:1;14813:6;;14787:53;;14871:1;14868;14864:9;14921:1;14918;14914:9;14909:14;;14903:563;14926:1;14903:563;;;14978:1;14975;14971:9;15019:1;15015;15011:2;15007:10;15004:17;14994:2;;15034:1;15032;15025:11;14994:2;15075:4;15071:2;15067:13;15109:2;15100:7;15097:15;15094:2;;;15124:1;15122;15115:11;15094:2;15147:15;;;;-1:-1:-1;;15179:8:0;;;15176:2;;;15222:1;15219;15215:9;15288:1;15284;15280:2;15276:10;15273:17;15266:25;15261:1;15254:9;15247:17;15243:49;15240:2;;;15304:1;15302;15295:11;15240:2;15347:4;15343:2;15339:13;15383:2;15374:7;15371:15;15368:2;;;15398:1;15396;15389:11;15368:2;15423:15;;;;-1:-1:-1;;15176:2:0;14941:1;14939;14935:8;14930:13;;14903:563;;;14907:18;14697:780;;14706:50;14721:1;14723:15;;;;14753:1;14748:6;;14714:41;;14723:15;14736:1;14731:6;;14714:41;;14697:780;;14686:800;;;;;:::o;17270:195::-;17360:5;;;17384:6;;;:20;;;17403:1;17398;17394;:5;;;;;;:10;17384:20;17376:59;;;;;-1:-1:-1;;;17376:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15532:8;17450:7;;;;-1:-1:-1;;17270:195:0:o;16529:203::-;16615:21;;;16590:8;16655:14;;;;;:32;;;16686:1;16680;16673:14;;16655:32;16647:77;;;;;-1:-1:-1;;;16647:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;4685:134;4756:4;4762:7;4789:22;4793:4;4799:5;1146;4789:3;:22::i;:::-;4782:29;;;;4685:134;;;;;:::o;8020:352::-;8085:7;8110:13;;;8109:41;;;8130:19;8137:4;8143:5;8130:6;:19::i;:::-;8129:20;8109:41;8105:82;;;-1:-1:-1;8174:1:0;8167:8;;8105:82;8208:9;:16;;;;;;;;;;;:22;;;;;;;;;;;8232;;;;;;;;8197:64;;8208:16;;:22;;8232;8197:4;:64::i;:::-;-1:-1:-1;8279:9:0;:16;;;;;;;;;;;:22;;;;;;;;;8272:29;;;8279:22;8319;;;;;8312:29;;;;8279:16;8020:352::o;8689:152::-;8772:4;8796:37;8803:4;1107:1;8815:5;8822:10;8796:6;:37::i;:::-;8789:44;8689:152;-1:-1:-1;;;;8689:152:0:o;33972:1935::-;34185:10;;:32;;;-1:-1:-1;;;34185:32:0;;-1:-1:-1;;;;;34185:32:0;;;;;;;;;-1:-1:-1;;;34220:6:0;34185:10;;;;;:22;;:32;;;;;;;;;;;;;;;:10;:32;;;2:2:-1;;;;27:1;24;17:12;2:2;34185:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34185:32:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;34185:32:0;:41;34177:104;;;;-1:-1:-1;;;34177:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34394:10;;:32;;;-1:-1:-1;;;34394:32:0;;-1:-1:-1;;;;;34394:32:0;;;;;;;;;34363:18;;34394:10;;;;;:22;;:32;;;;;;;;;;;;;;;:10;:32;;;2:2:-1;;;;27:1;24;17:12;2:2;34394:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34394:32:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;34394:32:0;34551:18;;34386:41;;;;;-1:-1:-1;;;;;;34539:30:0;;;34551:18;;34539:30;34538:299;;34727:37;;;;:21;:37;;;;;;;;:59;;;;;;;;:73;;;15580:8;;34711:102;;34803:9;34711:8;:102::i;:::-;:126;;;;;;34538:299;;;15580:8;34584:89;34593:68;15580:8;34617:27;:43;34645:14;34617:43;;;;;;;;;;;;34593:8;:68::i;:::-;34663:9;34584:8;:89::i;:::-;:113;;;;;;34538:299;34515:322;;35056:96;35099:1;35061:35;35070:10;35082:13;35061:8;:35::i;:::-;:39;35116:35;35125:10;35137:13;35116:8;:35::i;:::-;35102:11;:49;35056:4;:96::i;:::-;35043:171;;35201:13;35043:171;;;35187:10;35166:11;:32;;;;;;35043:171;35026:188;-1:-1:-1;35386:18:0;;35382:518;;35472:18;;;35589:37;;;:21;:37;;;;;;;;:59;;;;;;;;:74;35437:263;;-1:-1:-1;;;;;35460:30:0;;;35472:18;;35460:30;;35507:178;;35532:14;;;;;35507:178;;35570:17;;;;35589:78;;35565:4;:103::i;:::-;35507:6;:178::i;35437:263::-;35419:471;;;35729:10;;:73;;;-1:-1:-1;;;35729:73:0;;;;;;;;-1:-1:-1;;;;;35729:73:0;;;;;;;;;;;;;;;:10;;;;;:32;;:73;;;;;:10;;:73;;;;;;;:10;;:73;;;2:2:-1;;;;27:1;24;17:12;2:2;35729:73:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;35822:54:0;;;;;;;;-1:-1:-1;;;;;35822:54:0;;;-1:-1:-1;35836:14:0;;-1:-1:-1;35822:54:0;;;;;;;;;35419:471;33972:1935;;;;;;;:::o;3727:266::-;3814:4;3820:7;3845:19;3852:4;3858:5;3845:6;:19::i;:::-;3840:146;;-1:-1:-1;3889:5:0;;-1:-1:-1;3889:5:0;3881:17;;3840:146;-1:-1:-1;;3945:9:0;:16;;;;;;;;;;;:28;;;;;;;;;;;3939:4;;3840:146;3727:266;;;;;;:::o;6004:174::-;6098:9;:16;;;;;;;;;;;6115:5;;6098:23;;;;;;;;;:31;;;6140:16;;;;;;;;;6098:23;;6140:22;;;;;;:30;6004:174::o;6528:405::-;6627:4;6649:18;6656:4;6662;6649:6;:18::i;:::-;6648:19;:42;;;;;6671:19;6678:4;6684:5;6671:6;:19::i;:::-;6644:282;;;6707:9;6719:16;;;;;;;;;;;:28;;;;;;;;;;;6762:35;6719:4;6729:5;6780:4;6736:10;6762:4;:35::i;:::-;6812:31;6817:4;6823;6829:1;6832:10;6812:4;:31::i;:::-;6865:4;6858:11;;;;;6644:282;-1:-1:-1;6909:5:0;6528:405;;;;;;:::o;17011:253::-;17072:8;17102:30;17107:1;-1:-1:-1;;17107:7:0;-1:-1:-1;;;17116:1:0;:15;17102:4;:30::i;:::-;17101:31;17093:77;;;;-1:-1:-1;;;17093:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17189:6;;;:30;;-1:-1:-1;;17204:5:0;;;17218:1;17213;17204:5;17213:1;17199:15;;;;;:20;17189:30;17181:75;;;;;-1:-1:-1;;;17181:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17613:105;17702:8;;17695:16::o

Swarm Source

ipfs://3776e56da8953ece38b6fcc21aea3ccdc20cc4e5e4056338bc40d0ea0e2e19d5

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

OVERVIEW

The TaxCollector stores data about each CollateralType's stability fee. It also collects fees from currently opened SAFEs and distributes them to the AccountingEngine and to other auxiliary system components such as the StabilityFeeTreasury

Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

Validator Index Block Amount
View All Withdrawals

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.