ETH Price: $1,984.09 (-3.89%)

Contract

0x09f15F979Bf1b0CC8c8a19ed2E2feFF8EdE60e54
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Borrow From Vaul...129622652021-08-05 2:07:461695 days ago1628129266IN
0x09f15F97...8EdE60e54
0 ETH0.0031065742
Report To Vault129622482021-08-05 2:03:461695 days ago1628129026IN
0x09f15F97...8EdE60e54
0 ETH0.0031976242
Borrow From Vaul...129500952021-08-03 3:58:451697 days ago1627963125IN
0x09f15F97...8EdE60e54
0 ETH0.0033728445.6
Report To Vault129500792021-08-03 3:55:401697 days ago1627962940IN
0x09f15F97...8EdE60e54
0 ETH0.0035630746.8
Report To Vault129442852021-08-02 6:06:101698 days ago1627884370IN
0x09f15F97...8EdE60e54
0 ETH0.0021926528.8
Report To Vault129311582021-07-31 4:19:091700 days ago1627705149IN
0x09f15F97...8EdE60e54
0 ETH0.0023936531.44
Borrow From Vaul...128541252021-07-19 1:39:101712 days ago1626658750IN
0x09f15F97...8EdE60e54
0 ETH0.0010070614.00000112
Report To Vault128348632021-07-16 0:52:201715 days ago1626396740IN
0x09f15F97...8EdE60e54
0 ETH0.0023356525
Borrow From Vaul...128231452021-07-14 4:57:141717 days ago1626238634IN
0x09f15F97...8EdE60e54
0 ETH0.0041133246.2
Add Strategy To ...128169462021-07-13 5:34:561718 days ago1626154496IN
0x09f15F97...8EdE60e54
0 ETH0.0055347926.1
Approve Strategy128164022021-07-13 3:24:171718 days ago1626146657IN
0x09f15F97...8EdE60e54
0 ETH0.0017282226
Initialize128163242021-07-13 3:05:321718 days ago1626145532IN
0x09f15F97...8EdE60e54
0 ETH0.0012944326
Set Vault128162742021-07-13 2:54:091718 days ago1626144849IN
0x09f15F97...8EdE60e54
0 ETH0.0012513525

Latest 21 internal transactions

Advanced mode:
Parent Transaction Hash Method Block
From
To
-130795672021-08-23 5:00:231677 days ago1629694823
0x09f15F97...8EdE60e54
0.87208852 ETH
-130795672021-08-23 5:00:231677 days ago1629694823
0x09f15F97...8EdE60e54
0.87208852 ETH
-129622812021-08-05 2:10:441695 days ago1628129444
0x09f15F97...8EdE60e54
0.00058932 ETH
-129622652021-08-05 2:07:461695 days ago1628129266
0x09f15F97...8EdE60e54
0.00058932 ETH
-129622482021-08-05 2:03:461695 days ago1628129026
0x09f15F97...8EdE60e54
0.00060193 ETH
-129622332021-08-05 2:00:321695 days ago1628128832
0x09f15F97...8EdE60e54
0.00060193 ETH
-129501052021-08-03 4:02:381697 days ago1627963358
0x09f15F97...8EdE60e54
0.00451252 ETH
-129500952021-08-03 3:58:451697 days ago1627963125
0x09f15F97...8EdE60e54
0.00404414 ETH
-129500792021-08-03 3:55:401697 days ago1627962940
0x09f15F97...8EdE60e54
0.00024782 ETH
-129500632021-08-03 3:52:131697 days ago1627962733
0x09f15F97...8EdE60e54
0.00024782 ETH
-129442852021-08-02 6:06:101698 days ago1627884370
0x09f15F97...8EdE60e54
0.00057865 ETH
-129442682021-08-02 6:03:011698 days ago1627884181
0x09f15F97...8EdE60e54
0.00057865 ETH
-129311582021-07-31 4:19:091700 days ago1627705149
0x09f15F97...8EdE60e54
0.00341758 ETH
-129311472021-07-31 4:16:071700 days ago1627704967
0x09f15F97...8EdE60e54
0.00263945 ETH
-128541252021-07-19 1:39:101712 days ago1626658750
0x09f15F97...8EdE60e54
0.00046837 ETH
-128541052021-07-19 1:35:571712 days ago1626658557
0x09f15F97...8EdE60e54
0.00077812 ETH
-128348632021-07-16 0:52:201715 days ago1626396740
0x09f15F97...8EdE60e54
0.00049302 ETH
-128286692021-07-15 1:48:211716 days ago1626313701
0x09f15F97...8EdE60e54
0 ETH
-128284822021-07-15 1:07:231716 days ago1626311243
0x09f15F97...8EdE60e54
0.00049302 ETH
-128232232021-07-14 5:15:271717 days ago1626239727
0x09f15F97...8EdE60e54
1.06806523 ETH
-128231452021-07-14 4:57:141717 days ago1626238634
0x09f15F97...8EdE60e54
1.06806523 ETH
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Vyper_contract

Compiler Version
vyper:0.2.12

Optimization Enabled:
N/A

Other Settings:
berlin EvmVersion, GNU AGPLv3 license

Contract Source Code (Vyper language format)

# @version 0.2.12

"""
@title Unagii EthFundManager
@author stakewith.us
@license AGPL-3.0-or-later
"""

from vyper.interfaces import ERC20


interface Vault:
    def token() -> address: view
    def debt() -> uint256: view
    def borrow(amount: uint256) -> uint256: nonpayable
    def repay(amount: uint256) -> uint256: payable
    def report(gain: uint256, loss: uint256): payable


interface IStrategy:
    def fundManager() -> address: view
    def token() -> address: view
    def withdraw(amount: uint256) -> uint256: nonpayable
    def migrate(newVersion: address): nonpayable


# interface to new version of FundManager used for migration
interface FundManager:
    def token() -> address: view
    def vault() -> address: view
    def totalDebt() -> uint256: view
    def totalDebtRatio() -> uint256: view
    def queue(i: uint256) -> address: view
    def strategies(
        addr: address,
    ) -> (bool, bool, bool, uint256, uint256, uint256, uint256): view
    def initialize(): payable


# maximum number of active strategies
MAX_QUEUE: constant(uint256) = 20


struct Strategy:
    approved: bool
    active: bool
    activated: bool  # sent to True once after strategy is active
    debtRatio: uint256  # ratio of total assets this strategy can borrow
    debt: uint256  # current amount borrowed
    minBorrow: uint256  # minimum amount to borrow per call to borrow()
    maxBorrow: uint256  # maximum amount to borrow per call to borrow()


event SetNextTimeLock:
    nextTimeLock: address


event AcceptTimeLock:
    timeLock: address


event SetAdmin:
    admin: address


event SetGuardian:
    guardian: address


event SetWorker:
    worker: address


event SetPause:
    paused: bool


event SetVault:
    vault: address


event ApproveStrategy:
    strategy: indexed(address)


event RevokeStrategy:
    strategy: indexed(address)


event AddStrategyToQueue:
    strategy: indexed(address)


event RemoveStrategyFromQueue:
    strategy: indexed(address)


event SetQueue:
    queue: address[MAX_QUEUE]


event SetDebtRatios:
    debtRatios: uint256[MAX_QUEUE]


event SetMinMaxBorrow:
    strategy: indexed(address)
    minBorrow: uint256
    maxBorrow: uint256


event ReceiveEth:
    sender: indexed(address)
    amount: uint256


event BorrowFromVault:
    vault: indexed(address)
    amount: uint256
    borrowed: uint256


event RepayVault:
    vault: indexed(address)
    amount: uint256
    repaid: uint256


event ReportToVault:
    vault: indexed(address)
    total: uint256
    debt: uint256
    gain: uint256
    loss: uint256


event Withdraw:
    vault: indexed(address)
    amount: uint256
    actual: uint256
    loss: uint256


event WithdrawStrategy:
    strategy: indexed(address)
    debt: uint256
    need: uint256
    loss: uint256
    diff: uint256


event Borrow:
    strategy: indexed(address)
    amount: uint256
    borrowed: uint256


event Repay:
    strategy: indexed(address)
    amount: uint256
    repaid: uint256


event Report:
    strategy: indexed(address)
    gain: uint256
    loss: uint256
    debt: uint256


event MigrateStrategy:
    oldStrategy: indexed(address)
    newStrategy: indexed(address)


event Migrate:
    fundManager: address
    bal: uint256
    totalDebt: uint256


paused: public(bool)
initialized: public(bool)

vault: public(Vault)
ETH: constant(address) = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE
# privileges - time lock >= admin >= guardian, worker
timeLock: public(address)
nextTimeLock: public(address)
admin: public(address)
guardian: public(address)
worker: public(address)

totalDebt: public(uint256)  # sum of all debts of strategies
MAX_TOTAL_DEBT_RATIO: constant(uint256) = 10000
totalDebtRatio: public(uint256)  # sum of all debtRatios of strategies
strategies: public(HashMap[address, Strategy])  # all strategies
queue: public(address[MAX_QUEUE])  # list of active strategies

# migration
OLD_MAX_QUEUE: constant(uint256) = 20  # must be <= MAX_QUEUE
oldFundManager: public(FundManager)


@external
def __init__(guardian: address, worker: address, oldFundManager: address):
    self.timeLock = msg.sender
    self.admin = msg.sender
    self.guardian = guardian
    self.worker = worker

    if oldFundManager != ZERO_ADDRESS:
        self.oldFundManager = FundManager(oldFundManager)
        assert self.oldFundManager.token() == ETH, "old fund manager token != ETH"


@external
@payable
def __default__():
    pass
    # log ReceiveEth(msg.sender, msg.value)


@external
@view
def token() -> address:
    return ETH


@internal
def _sendEth(to: address, amount: uint256):
    assert to != ZERO_ADDRESS, "to = 0 address"
    raw_call(to, b"", value=amount)


@internal
def _safeTransfer(token: address, receiver: address, amount: uint256):
    res: Bytes[32] = raw_call(
        token,
        concat(
            method_id("transfer(address,uint256)"),
            convert(receiver, bytes32),
            convert(amount, bytes32),
        ),
        max_outsize=32,
    )
    if len(res) > 0:
        assert convert(res, bool), "transfer failed"


@external
@payable
def initialize():
    """
    @notice Initialize fund manager. Transfer ETH and copy states if
            old fund manager is set.
    """
    assert not self.initialized, "initialized"

    if self.oldFundManager.address == ZERO_ADDRESS:
        assert msg.sender in [self.timeLock, self.admin], "!auth"
    else:
        assert msg.sender == self.oldFundManager.address, "!old fund manager"

        assert (
            self.vault.address == self.oldFundManager.vault()
        ), "old fund manager vault != vault"

        self.totalDebt = self.oldFundManager.totalDebt()
        self.totalDebtRatio = self.oldFundManager.totalDebtRatio()

        for i in range(OLD_MAX_QUEUE):
            addr: address = self.oldFundManager.queue(i)
            if addr == ZERO_ADDRESS:
                break

            assert (
                IStrategy(addr).fundManager() == self
            ), "strategy fund manager != self"

            approved: bool = False
            active: bool = False
            activated: bool = False
            debtRatio: uint256 = 0
            debt: uint256 = 0
            minBorrow: uint256 = 0
            maxBorrow: uint256 = 0
            (
                approved,
                active,
                activated,
                debtRatio,
                debt,
                minBorrow,
                maxBorrow,
            ) = self.oldFundManager.strategies(addr)
            assert approved, "!approved"
            assert active, "!active"
            assert activated, "!activated"

            self.queue[i] = addr
            self.strategies[addr] = Strategy(
                {
                    approved: True,
                    active: True,
                    activated: True,
                    debtRatio: debtRatio,
                    debt: debt,
                    minBorrow: minBorrow,
                    maxBorrow: maxBorrow,
                }
            )

    self.initialized = True


# Migration steps to new fund manager
#
# v = vault
# f1 = fund manager 1
# f2 = fund manager 2
# strats = active strategies of f1
#
# action                         | caller
# ----------------------------------------
# 1. f2.setVault(v)              | time lock
# 2. f1.setPause(true)           | admin
# 3. for s in strats             |
#      s.setFundManager(f2)      | time lock
# 4. send ETH to f2              | f1
# 5. f2 copy states from f1      | f2
#    - totalDebt                 |
#    - totalDebtRatio            |
#    - queue                     |
#    - active strategy params    |
# 6. f1 reset state              | f1
#    - totalDebt                 |
#    - active strategy debt      |
# 7. v.setFundManager(f2)        | time lock


@external
def migrate(fundManager: address):
    """
    @notice Migrate to new fund manager
    @param fundManager Address of new fund manager
    """
    assert msg.sender == self.timeLock, "!time lock"
    assert self.initialized, "!initialized"
    assert self.paused, "!paused"

    assert FundManager(fundManager).token() == ETH, "new fund manager token != ETH"
    assert (
        FundManager(fundManager).vault() == self.vault.address
    ), "new fund manager vault != vault"

    for strat in self.queue:
        if strat == ZERO_ADDRESS:
            break
        assert (
            IStrategy(strat).fundManager() == fundManager
        ), "strategy fund manager != new fund manager"

    bal: uint256 = self.balance
    FundManager(fundManager).initialize(value=bal)

    log Migrate(fundManager, bal, self.totalDebt)

    self.totalDebt = 0

    for strat in self.queue:
        if strat == ZERO_ADDRESS:
            break
        self.strategies[strat].debt = 0


@external
def setNextTimeLock(nextTimeLock: address):
    """
    @notice Set next time lock
    @param nextTimeLock Address of next time lock
    """
    assert msg.sender == self.timeLock, "!time lock"
    self.nextTimeLock = nextTimeLock
    log SetNextTimeLock(nextTimeLock)


@external
def acceptTimeLock():
    """
    @notice Accept time lock
    @dev Only `nextTimeLock` can claim time lock
    """
    assert msg.sender == self.nextTimeLock, "!next time lock"
    self.timeLock = msg.sender
    log AcceptTimeLock(msg.sender)


@external
def setAdmin(admin: address):
    assert msg.sender in [self.timeLock, self.admin], "!auth"
    self.admin = admin
    log SetAdmin(admin)


@external
def setGuardian(guardian: address):
    assert msg.sender in [self.timeLock, self.admin], "!auth"
    self.guardian = guardian
    log SetGuardian(guardian)


@external
def setWorker(worker: address):
    assert msg.sender in [self.timeLock, self.admin], "!auth"
    self.worker = worker
    log SetWorker(worker)


@external
def setPause(paused: bool):
    assert msg.sender in [self.timeLock, self.admin, self.guardian], "!auth"
    self.paused = paused
    log SetPause(paused)


@external
def setVault(vault: address):
    """
    @notice Set vault
    @param vault Address of vault
    """
    assert msg.sender == self.timeLock, "!time lock"
    assert Vault(vault).token() == ETH, "vault token != ETH"

    self.vault = Vault(vault)

    log SetVault(vault)


@internal
@view
def _totalAssets() -> uint256:
    """
    @notice Total amount of ETH in this fund manager + total amount borrowed
            by strategies
    @dev Returns total amount of ETH managed by this contract
    """
    return self.balance + self.totalDebt


@external
@view
def totalAssets() -> uint256:
    return self._totalAssets()


# array functions tested in test/Array.vy
@internal
def _pack():
    arr: address[MAX_QUEUE] = empty(address[MAX_QUEUE])
    i: uint256 = 0
    for strat in self.queue:
        if strat != ZERO_ADDRESS:
            arr[i] = strat
            i += 1
    self.queue = arr


@internal
def _append(strategy: address):
    assert self.queue[MAX_QUEUE - 1] == ZERO_ADDRESS, "queue > max"
    self.queue[MAX_QUEUE - 1] = strategy
    self._pack()


@internal
def _remove(i: uint256):
    assert i < MAX_QUEUE, "i >= max"
    assert self.queue[i] != ZERO_ADDRESS, "!zero address"
    self.queue[i] = ZERO_ADDRESS
    self._pack()


@internal
@view
def _find(strategy: address) -> uint256:
    for i in range(MAX_QUEUE):
        if self.queue[i] == strategy:
            return i
    raise "not found"


@external
def approveStrategy(strategy: address):
    """
    @notice Approve strategy
    @param strategy Address of strategy
    """
    assert msg.sender == self.timeLock, "!time lock"

    assert not self.strategies[strategy].approved, "approved"
    assert IStrategy(strategy).fundManager() == self, "strategy fund manager != this"
    assert IStrategy(strategy).token() == ETH, "strategy token != ETH"

    self.strategies[strategy] = Strategy(
        {
            approved: True,
            active: False,
            activated: False,
            debtRatio: 0,
            debt: 0,
            minBorrow: 0,
            maxBorrow: 0,
        }
    )

    log ApproveStrategy(strategy)


@external
def revokeStrategy(strategy: address):
    """
    @notice Disapprove strategy
    @param strategy Address of strategy
    """
    assert msg.sender in [self.timeLock, self.admin], "!auth"
    assert self.strategies[strategy].approved, "!approved"
    assert not self.strategies[strategy].active, "active"

    self.strategies[strategy].approved = False
    log RevokeStrategy(strategy)


@external
def addStrategyToQueue(
    strategy: address, debtRatio: uint256, minBorrow: uint256, maxBorrow: uint256
):
    """
    @notice Activate strategy
    @param strategy Address of strategy
    @param debtRatio Ratio of total assets this strategy can borrow
    @param minBorrow Minimum amount to borrow per call to borrow()
    @param maxBorrow Maximum amount to borrow per call to borrow()
    """
    assert msg.sender in [self.timeLock, self.admin], "!auth"
    assert self.strategies[strategy].approved, "!approved"
    assert not self.strategies[strategy].active, "active"
    assert self.totalDebtRatio + debtRatio <= MAX_TOTAL_DEBT_RATIO, "ratio > max"
    assert minBorrow <= maxBorrow, "min borrow > max borrow"

    self._append(strategy)
    self.strategies[strategy].active = True
    self.strategies[strategy].activated = True
    self.strategies[strategy].debtRatio = debtRatio
    self.strategies[strategy].minBorrow = minBorrow
    self.strategies[strategy].maxBorrow = maxBorrow
    self.totalDebtRatio += debtRatio

    log AddStrategyToQueue(strategy)


@external
def removeStrategyFromQueue(strategy: address):
    """
    @notice Deactivate strategy
    @param strategy Addres of strategy
    """
    assert msg.sender in [self.timeLock, self.admin, self.guardian], "!auth"
    assert self.strategies[strategy].active, "!active"

    self._remove(self._find(strategy))
    self.strategies[strategy].active = False
    self.totalDebtRatio -= self.strategies[strategy].debtRatio
    self.strategies[strategy].debtRatio = 0

    log RemoveStrategyFromQueue(strategy)


@external
def setQueue(queue: address[MAX_QUEUE]):
    """
    @notice Reorder queue
    @param queue Array of active strategies
    """
    assert msg.sender in [self.timeLock, self.admin], "!auth"

    # check no gaps in new queue
    zero: bool = False
    for i in range(MAX_QUEUE):
        strat: address = queue[i]
        if strat == ZERO_ADDRESS:
            if not zero:
                zero = True
        else:
            assert not zero, "gap"

    # Check old and new queue counts of non zero strategies are equal
    for i in range(MAX_QUEUE):
        oldStrat: address = self.queue[i]
        newStrat: address = queue[i]
        if oldStrat == ZERO_ADDRESS:
            assert newStrat == ZERO_ADDRESS, "new != 0"
        else:
            assert newStrat != ZERO_ADDRESS, "new = 0"

    # Check new strategy is active and no duplicate
    for i in range(MAX_QUEUE):
        strat: address = queue[i]
        if strat == ZERO_ADDRESS:
            break
        # code below will fail if duplicate strategy in new queue
        assert self.strategies[strat].active, "!active"
        self.strategies[strat].active = False

    # update queue
    for i in range(MAX_QUEUE):
        strat: address = queue[i]
        if strat == ZERO_ADDRESS:
            break
        self.strategies[strat].active = True
        self.queue[i] = strat

    log SetQueue(queue)


@external
def setDebtRatios(debtRatios: uint256[MAX_QUEUE]):
    """
    @notice Update debt ratios of active strategies
    @param debtRatios Array of debt ratios
    """
    assert msg.sender in [self.timeLock, self.admin], "!auth"

    # check that we're only setting debt ratio on active strategy
    for i in range(MAX_QUEUE):
        if self.queue[i] == ZERO_ADDRESS:
            assert debtRatios[i] == 0, "debt ratio != 0"

    # use memory to save gas
    totalDebtRatio: uint256 = 0
    for i in range(MAX_QUEUE):
        addr: address = self.queue[i]
        if addr == ZERO_ADDRESS:
            break

        debtRatio: uint256 = debtRatios[i]
        self.strategies[addr].debtRatio = debtRatio
        totalDebtRatio += debtRatio

    self.totalDebtRatio = totalDebtRatio

    assert self.totalDebtRatio <= MAX_TOTAL_DEBT_RATIO, "total > max"

    log SetDebtRatios(debtRatios)


@external
def setMinMaxBorrow(strategy: address, minBorrow: uint256, maxBorrow: uint256):
    """
    @notice Update `minBorrow` and `maxBorrow` of approved strategy
    @param minBorrow Minimum amount to borrow per call to borrow()
    @param maxBorrow Maximum amount to borrow per call to borrow()
    """
    assert msg.sender in [self.timeLock, self.admin], "!auth"
    assert self.strategies[strategy].approved, "!approved"
    assert minBorrow <= maxBorrow, "min borrow > max borrow"

    self.strategies[strategy].minBorrow = minBorrow
    self.strategies[strategy].maxBorrow = maxBorrow

    log SetMinMaxBorrow(strategy, minBorrow, maxBorrow)


# functions between Vault and this contract #
@external
def borrowFromVault(amount: uint256, _min: uint256):
    """
    @notice Borrow ETH from vault
    @param amount Amount of ETH to borrow
    @param _min Minimum amount to borrow
    """
    assert self.initialized, "!initialized"
    assert msg.sender in [self.timeLock, self.admin, self.worker], "!auth"
    # fails if vault not set
    borrowed: uint256 = self.vault.borrow(amount)
    assert borrowed >= _min, "borrowed < min"

    log BorrowFromVault(self.vault.address, amount, borrowed)


@external
def repayVault(amount: uint256, _min: uint256):
    """
    @notice Repay ETH to vault
    @param amount Amount to repay
    @param _min Minimum amount to repay
    """
    assert self.initialized, "!initialized"
    assert msg.sender in [self.timeLock, self.admin, self.worker], "!auth"
    # fails if vault not set
    repaid: uint256 = self.vault.repay(amount, value=amount)
    assert repaid >= _min, "repaid < min"

    log RepayVault(self.vault.address, amount, repaid)


@external
def reportToVault(_minTotal: uint256, _maxTotal: uint256):
    """
    @notice Report gain and loss to vault
    @param _minTotal Minumum of total assets
    @param _maxTotal Maximum of total assets
    @dev `_minTotal` and `_maxTotal` is used to check that totalAssets is
         within a reasonable range before this function is called
    """
    assert self.initialized, "!initialized"
    assert msg.sender in [self.timeLock, self.admin, self.worker], "!auth"

    total: uint256 = self._totalAssets()
    assert total >= _minTotal and total <= _maxTotal, "total not in range"

    debt: uint256 = self.vault.debt()
    gain: uint256 = 0
    loss: uint256 = 0

    if total > debt:
        gain = min(total - debt, self.balance)
    else:
        loss = debt - total

    if gain > 0 or loss > 0:
        self.vault.report(gain, loss, value=gain)

    log ReportToVault(self.vault.address, total, debt, gain, loss)


# functions between vault -> this contract -> strategies #
@internal
def _withdraw(amount: uint256) -> uint256:
    """
    @notice Withdraw ETH from active strategies
    @param amount Amount of ETH to withdraw
    @dev Returns sum of losses from active strategies that were withdrawn.
    """
    _amount: uint256 = amount
    totalLoss: uint256 = 0
    for strategy in self.queue:
        if strategy == ZERO_ADDRESS:
            break

        bal: uint256 = self.balance
        if bal >= _amount:
            break

        debt: uint256 = self.strategies[strategy].debt
        need: uint256 = min(_amount - bal, debt)
        if need == 0:
            continue

        # loss must be <= debt
        loss: uint256 = IStrategy(strategy).withdraw(need)
        diff: uint256 = self.balance - bal

        if loss > 0:
            _amount -= loss
            totalLoss += loss
            self.strategies[strategy].debt -= loss
            self.totalDebt -= loss

        self.strategies[strategy].debt -= diff
        self.totalDebt -= diff

        log WithdrawStrategy(strategy, debt, need, loss, diff)

    return totalLoss


@external
def withdraw(amount: uint256) -> uint256:
    """
    @notice Withdraw ETH from fund manager back to vault
    @param amount Amount of ETH to withdraw
    @dev Returns sum of losses from active strategies that were withdrawn.
    """
    assert self.initialized, "!initialized"
    assert msg.sender == self.vault.address, "!vault"

    total: uint256 = self._totalAssets()
    _amount: uint256 = min(amount, total)
    assert _amount > 0, "withdraw = 0"

    debt: uint256 = self.vault.debt()
    loss: uint256 = 0
    if debt > total:
        # debt > total can occur when strategies reported losses to this contract
        # but this contract has not reported losses back to vault
        loss = debt - total

    bal: uint256 = self.balance
    if _amount > bal:
        # try to withdraw until balance of fund manager >= _amount
        loss += self._withdraw(_amount)
        _amount = min(_amount, self.balance)

    if _amount > 0:
        self._sendEth(msg.sender, _amount)

    log Withdraw(msg.sender, amount, _amount, loss)

    return loss


# functions between this contract and strategies #
@internal
@view
def _calcMaxBorrow(strategy: address) -> uint256:
    """
    @notice Calculate how much ETH strategy can borrow
    @param strategy Address of strategy
    @dev Returns amount of ETH that `strategy` can borrow
    """
    if (not self.initialized) or self.paused or self.totalDebtRatio == 0:
        return 0

    # strategy debtRatio > 0 only if strategy is active
    limit: uint256 = (
        self.strategies[strategy].debtRatio * self._totalAssets() / self.totalDebtRatio
    )
    debt: uint256 = self.strategies[strategy].debt

    if debt >= limit:
        return 0

    available: uint256 = min(limit - debt, self.balance)

    if available < self.strategies[strategy].minBorrow:
        return 0
    else:
        return min(available, self.strategies[strategy].maxBorrow)


@external
@view
def calcMaxBorrow(strategy: address) -> uint256:
    return self._calcMaxBorrow(strategy)


@internal
@view
def _calcOutstandingDebt(strategy: address) -> uint256:
    """
    @notice Calculate amount of ETH that `strategy` should pay back to fund manager
    @param strategy Address of strategy
    @dev Returns minimum amount of ETH strategy should repay
    """
    if not self.initialized:
        return 0

    if self.totalDebtRatio == 0:
        return self.strategies[strategy].debt

    limit: uint256 = (
        self.strategies[strategy].debtRatio * self.totalDebt / self.totalDebtRatio
    )
    debt: uint256 = self.strategies[strategy].debt

    if self.paused:
        return debt
    elif debt <= limit:
        return 0
    else:
        return debt - limit


@external
@view
def calcOutstandingDebt(strategy: address) -> uint256:
    return self._calcOutstandingDebt(strategy)


@external
@view
def getDebt(strategy: address) -> uint256:
    """
    @notice Return debt of strategy
    @param strategy Address of strategy
    @dev Returns current debt of strategy
    """
    return self.strategies[strategy].debt


@external
def borrow(amount: uint256) -> uint256:
    """
    @notice Borrow ETH from fund manager
    @param amount Amount of ETH to borrow
    @dev Returns actual amount sent
    @dev Only active strategy can borrow
    """
    assert self.initialized, "!initialized"
    assert not self.paused, "paused"
    assert self.strategies[msg.sender].active, "!active"

    _amount: uint256 = min(amount, self._calcMaxBorrow(msg.sender))
    assert _amount > 0, "borrow = 0"

    self._sendEth(msg.sender, _amount)

    # include any fee on transfer to debt
    self.strategies[msg.sender].debt += _amount
    self.totalDebt += _amount

    log Borrow(msg.sender, amount, _amount)

    return _amount


@external
@payable
def repay(amount: uint256) -> uint256:
    """
    @notice Repay debt to fund manager
    @param amount Amount of ETH to repay
    @dev Returns actual amount repaid
    @dev Only approved strategy can repay
    """
    assert self.initialized, "!initialized"
    assert self.strategies[msg.sender].approved, "!approved"

    assert amount == msg.value, "amount != msg.value"
    assert amount > 0, "repay = 0"

    self.strategies[msg.sender].debt -= amount
    self.totalDebt -= amount

    log Repay(msg.sender, amount, amount)

    return amount


@external
@payable
def report(gain: uint256, loss: uint256):
    """
    @notice Report gain and loss from strategy
    @param gain Amount of profit
    @param loss Amount of loss
    """
    assert self.initialized, "!initialized"
    assert self.strategies[msg.sender].active, "!active"
    # can't have both gain and loss > 0
    assert (gain >= 0 and loss == 0) or (gain == 0 and loss >= 0), "gain and loss > 0"
    assert gain == msg.value, "gain != msg.value"

    if gain > 0:
        pass
    elif loss > 0:
        self.strategies[msg.sender].debt -= loss
        self.totalDebt -= loss

    log Report(msg.sender, gain, loss, self.strategies[msg.sender].debt)


@external
def migrateStrategy(oldStrat: address, newStrat: address):
    """
    @notice Migrate strategy
    @param oldStrat Address of current strategy
    @param newStrat Address of strategy to migrate to
    """
    assert self.initialized, "!initialized"
    assert msg.sender in [self.timeLock, self.admin], "!auth"
    assert self.strategies[oldStrat].active, "old !active"
    assert self.strategies[newStrat].approved, "new !approved"
    assert not self.strategies[newStrat].activated, "activated"

    strat: Strategy = self.strategies[oldStrat]

    self.strategies[newStrat] = Strategy(
        {
            approved: True,
            active: True,
            activated: True,
            debtRatio: strat.debtRatio,
            debt: strat.debt,
            minBorrow: strat.minBorrow,
            maxBorrow: strat.maxBorrow,
        }
    )

    self.strategies[oldStrat].active = False
    self.strategies[oldStrat].debtRatio = 0
    self.strategies[oldStrat].debt = 0
    self.strategies[oldStrat].minBorrow = 0
    self.strategies[oldStrat].maxBorrow = 0

    # find and replace strategy
    i: uint256 = self._find(oldStrat)
    self.queue[i] = newStrat

    IStrategy(oldStrat).migrate(newStrat)
    log MigrateStrategy(oldStrat, newStrat)


@external
def sweep(token: address):
    """
    @notice Transfer any token accidentally sent to this contract to admin or
            time lock
    """
    assert msg.sender in [self.timeLock, self.admin], "!auth"
    self._safeTransfer(token, msg.sender, ERC20(token).balanceOf(self))

Contract Security Audit

Contract ABI

API
[{"name":"SetNextTimeLock","inputs":[{"name":"nextTimeLock","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"AcceptTimeLock","inputs":[{"name":"timeLock","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"SetAdmin","inputs":[{"name":"admin","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"SetGuardian","inputs":[{"name":"guardian","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"SetWorker","inputs":[{"name":"worker","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"SetPause","inputs":[{"name":"paused","type":"bool","indexed":false}],"anonymous":false,"type":"event"},{"name":"SetVault","inputs":[{"name":"vault","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"ApproveStrategy","inputs":[{"name":"strategy","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"name":"RevokeStrategy","inputs":[{"name":"strategy","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"name":"AddStrategyToQueue","inputs":[{"name":"strategy","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"name":"RemoveStrategyFromQueue","inputs":[{"name":"strategy","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"name":"SetQueue","inputs":[{"name":"queue","type":"address[20]","indexed":false}],"anonymous":false,"type":"event"},{"name":"SetDebtRatios","inputs":[{"name":"debtRatios","type":"uint256[20]","indexed":false}],"anonymous":false,"type":"event"},{"name":"SetMinMaxBorrow","inputs":[{"name":"strategy","type":"address","indexed":true},{"name":"minBorrow","type":"uint256","indexed":false},{"name":"maxBorrow","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"ReceiveEth","inputs":[{"name":"sender","type":"address","indexed":true},{"name":"amount","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"BorrowFromVault","inputs":[{"name":"vault","type":"address","indexed":true},{"name":"amount","type":"uint256","indexed":false},{"name":"borrowed","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RepayVault","inputs":[{"name":"vault","type":"address","indexed":true},{"name":"amount","type":"uint256","indexed":false},{"name":"repaid","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"ReportToVault","inputs":[{"name":"vault","type":"address","indexed":true},{"name":"total","type":"uint256","indexed":false},{"name":"debt","type":"uint256","indexed":false},{"name":"gain","type":"uint256","indexed":false},{"name":"loss","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"Withdraw","inputs":[{"name":"vault","type":"address","indexed":true},{"name":"amount","type":"uint256","indexed":false},{"name":"actual","type":"uint256","indexed":false},{"name":"loss","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"WithdrawStrategy","inputs":[{"name":"strategy","type":"address","indexed":true},{"name":"debt","type":"uint256","indexed":false},{"name":"need","type":"uint256","indexed":false},{"name":"loss","type":"uint256","indexed":false},{"name":"diff","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"Borrow","inputs":[{"name":"strategy","type":"address","indexed":true},{"name":"amount","type":"uint256","indexed":false},{"name":"borrowed","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"Repay","inputs":[{"name":"strategy","type":"address","indexed":true},{"name":"amount","type":"uint256","indexed":false},{"name":"repaid","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"Report","inputs":[{"name":"strategy","type":"address","indexed":true},{"name":"gain","type":"uint256","indexed":false},{"name":"loss","type":"uint256","indexed":false},{"name":"debt","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"MigrateStrategy","inputs":[{"name":"oldStrategy","type":"address","indexed":true},{"name":"newStrategy","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"name":"Migrate","inputs":[{"name":"fundManager","type":"address","indexed":false},{"name":"bal","type":"uint256","indexed":false},{"name":"totalDebt","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"stateMutability":"nonpayable","type":"constructor","inputs":[{"name":"guardian","type":"address"},{"name":"worker","type":"address"},{"name":"oldFundManager","type":"address"}],"outputs":[]},{"stateMutability":"payable","type":"fallback"},{"stateMutability":"view","type":"function","name":"token","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":378},{"stateMutability":"payable","type":"function","name":"initialize","inputs":[],"outputs":[],"gas":5994021},{"stateMutability":"nonpayable","type":"function","name":"migrate","inputs":[{"name":"fundManager","type":"address"}],"outputs":[],"gas":625644},{"stateMutability":"nonpayable","type":"function","name":"setNextTimeLock","inputs":[{"name":"nextTimeLock","type":"address"}],"outputs":[],"gas":39101},{"stateMutability":"nonpayable","type":"function","name":"acceptTimeLock","inputs":[],"outputs":[],"gas":39023},{"stateMutability":"nonpayable","type":"function","name":"setAdmin","inputs":[{"name":"admin","type":"address"}],"outputs":[],"gas":41682},{"stateMutability":"nonpayable","type":"function","name":"setGuardian","inputs":[{"name":"guardian","type":"address"}],"outputs":[],"gas":41712},{"stateMutability":"nonpayable","type":"function","name":"setWorker","inputs":[{"name":"worker","type":"address"}],"outputs":[],"gas":41742},{"stateMutability":"nonpayable","type":"function","name":"setPause","inputs":[{"name":"paused","type":"bool"}],"outputs":[],"gas":44040},{"stateMutability":"nonpayable","type":"function","name":"setVault","inputs":[{"name":"vault","type":"address"}],"outputs":[],"gas":41776},{"stateMutability":"view","type":"function","name":"totalAssets","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3635},{"stateMutability":"nonpayable","type":"function","name":"approveStrategy","inputs":[{"name":"strategy","type":"address"}],"outputs":[],"gas":166804},{"stateMutability":"nonpayable","type":"function","name":"revokeStrategy","inputs":[{"name":"strategy","type":"address"}],"outputs":[],"gas":31656},{"stateMutability":"nonpayable","type":"function","name":"addStrategyToQueue","inputs":[{"name":"strategy","type":"address"},{"name":"debtRatio","type":"uint256"},{"name":"minBorrow","type":"uint256"},{"name":"maxBorrow","type":"uint256"}],"outputs":[],"gas":1773871},{"stateMutability":"nonpayable","type":"function","name":"removeStrategyFromQueue","inputs":[{"name":"strategy","type":"address"}],"outputs":[],"gas":1673031},{"stateMutability":"nonpayable","type":"function","name":"setQueue","inputs":[{"name":"queue","type":"address[20]"}],"outputs":[],"gas":1941256},{"stateMutability":"nonpayable","type":"function","name":"setDebtRatios","inputs":[{"name":"debtRatios","type":"uint256[20]"}],"outputs":[],"gas":862108},{"stateMutability":"nonpayable","type":"function","name":"setMinMaxBorrow","inputs":[{"name":"strategy","type":"address"},{"name":"minBorrow","type":"uint256"},{"name":"maxBorrow","type":"uint256"}],"outputs":[],"gas":80916},{"stateMutability":"nonpayable","type":"function","name":"borrowFromVault","inputs":[{"name":"amount","type":"uint256"},{"name":"_min","type":"uint256"}],"outputs":[],"gas":19116},{"stateMutability":"nonpayable","type":"function","name":"repayVault","inputs":[{"name":"amount","type":"uint256"},{"name":"_min","type":"uint256"}],"outputs":[],"gas":53149},{"stateMutability":"nonpayable","type":"function","name":"reportToVault","inputs":[{"name":"_minTotal","type":"uint256"},{"name":"_maxTotal","type":"uint256"}],"outputs":[],"gas":66905},{"stateMutability":"nonpayable","type":"function","name":"withdraw","inputs":[{"name":"amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":3286612},{"stateMutability":"view","type":"function","name":"calcMaxBorrow","inputs":[{"name":"strategy","type":"address"}],"outputs":[{"name":"","type":"uint256"}],"gas":26763},{"stateMutability":"view","type":"function","name":"calcOutstandingDebt","inputs":[{"name":"strategy","type":"address"}],"outputs":[{"name":"","type":"uint256"}],"gas":20613},{"stateMutability":"view","type":"function","name":"getDebt","inputs":[{"name":"strategy","type":"address"}],"outputs":[{"name":"","type":"uint256"}],"gas":3491},{"stateMutability":"nonpayable","type":"function","name":"borrow","inputs":[{"name":"amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":149965},{"stateMutability":"payable","type":"function","name":"repay","inputs":[{"name":"amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":82977},{"stateMutability":"payable","type":"function","name":"report","inputs":[{"name":"gain","type":"uint256"},{"name":"loss","type":"uint256"}],"outputs":[],"gas":86034},{"stateMutability":"nonpayable","type":"function","name":"migrateStrategy","inputs":[{"name":"oldStrat","type":"address"},{"name":"newStrat","type":"address"}],"outputs":[],"gas":468847},{"stateMutability":"nonpayable","type":"function","name":"sweep","inputs":[{"name":"token","type":"address"}],"outputs":[],"gas":18727},{"stateMutability":"view","type":"function","name":"paused","inputs":[],"outputs":[{"name":"","type":"bool"}],"gas":3378},{"stateMutability":"view","type":"function","name":"initialized","inputs":[],"outputs":[{"name":"","type":"bool"}],"gas":3408},{"stateMutability":"view","type":"function","name":"vault","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3438},{"stateMutability":"view","type":"function","name":"timeLock","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3468},{"stateMutability":"view","type":"function","name":"nextTimeLock","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3498},{"stateMutability":"view","type":"function","name":"admin","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3528},{"stateMutability":"view","type":"function","name":"guardian","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3558},{"stateMutability":"view","type":"function","name":"worker","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3588},{"stateMutability":"view","type":"function","name":"totalDebt","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3618},{"stateMutability":"view","type":"function","name":"totalDebtRatio","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3648},{"stateMutability":"view","type":"function","name":"strategies","inputs":[{"name":"arg0","type":"address"}],"outputs":[{"name":"approved","type":"bool"},{"name":"active","type":"bool"},{"name":"activated","type":"bool"},{"name":"debtRatio","type":"uint256"},{"name":"debt","type":"uint256"},{"name":"minBorrow","type":"uint256"},{"name":"maxBorrow","type":"uint256"}],"gas":17837},{"stateMutability":"view","type":"function","name":"queue","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"address"}],"gas":3817},{"stateMutability":"view","type":"function","name":"oldFundManager","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3738}]

6060614abb610140396020614abb60c03960c05160a01c1561002057600080fd5b60206020614abb0160c03960c05160a01c1561003b57600080fd5b60206040614abb0160c03960c05160a01c1561005657600080fd5b3360035533600555610140516006556101605160075560006101805118156101155761018051600c5573eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6020610200600463fc0c546a6101a0526101bc600c545afa6100b557600080fd5b601f3d116100c257600080fd5b60005061020051141515610115576308c379a061022052602061024052601d610260527f6f6c642066756e64206d616e6167657220746f6b656e20213d204554480000006102805261026050606461023cfd5b614aa356600436101561000d57613e29565b600035601c52600051638129fc1c8114156105ac57600154151515610071576308c379a061014052602061016052600b610180527f696e697469616c697a65640000000000000000000000000000000000000000006101a05261018050606461015cfd5b600c54151561012057600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156100b957600183526100c9565b815160010180835281141561009d575b50505061014051151561011b576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b6105a5565b600c5433141515610170576308c379a0610140526020610160526011610180527f216f6c642066756e64206d616e616765720000000000000000000000000000006101a05261018050606461015cfd5b60206101a0600463fbfa77cf6101405261015c600c545afa61019157600080fd5b601f3d1161019e57600080fd5b6000506101a0516002541415156101f4576308c379a06101c05260206101e052601f610200527f6f6c642066756e64206d616e61676572207661756c7420213d207661756c7400610220526102005060646101dcfd5b60206101a0600463fc7b9c186101405261015c600c545afa61021557600080fd5b601f3d1161022257600080fd5b6000506101a05160085560206101a06004632df9eab96101405261015c600c545afa61024d57600080fd5b601f3d1161025a57600080fd5b6000506101a05160095561014060006014818352015b6020610200602463ddf0b00961018052610140516101a05261019c600c545afa61029957600080fd5b601f3d116102a657600080fd5b60005061020051610160526101605115156102c0576105a2565b3060206101e06004636209ec2d6101805261019c610160515afa6102e357600080fd5b601f3d116102f057600080fd5b6000506101e051141515610343576308c379a061020052602061022052601d610240527f73747261746567792066756e64206d616e6167657220213d2073656c660000006102605261024050606461021cfd5b60e0366101803760e06102e060246339ebf82361026052610160516102805261027c600c545afa61037357600080fd5b60df3d1161038057600080fd5b6102e080808080516103c0525050602081019050808080516103e0525050602081019050808080516104005250506020810190508080805161042052505060208101905080808051610440525050602081019050808080516104605250506020810190508080805161048052505050506000506103c080516101805280602001516101a05280604001516101c05280606001516101e0528060800151610200528060a00151610220528060c001516102405250610180511515610482576308c379a06102605260206102805260096102a0527f21617070726f76656400000000000000000000000000000000000000000000006102c0526102a050606461027cfd5b6101a05115156104d1576308c379a06102605260206102805260076102a0527f21616374697665000000000000000000000000000000000000000000000000006102c0526102a050606461027cfd5b6101c0511515610520576308c379a061026052602061028052600a6102a0527f21616374697661746564000000000000000000000000000000000000000000006102c0526102a050606461027cfd5b61016051610140516014811061053557600080fd5b600b60c052602060c0200155600a6101605160e05260c052604060c02060c052602060c0206001815560016001820155600160028201556101e0516003820155610200516004820155610220516005820155610240516006820155505b8151600101808352811415610270575b50505b6001600155005b63371fd8e681141561079e576001541515610606576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b600a3360e05260c052604060c02060c052602060c020541515610668576308c379a0610140526020610160526009610180527f21617070726f76656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b346004351415156106b8576308c379a0610140526020610160526013610180527f616d6f756e7420213d206d73672e76616c7565000000000000000000000000006101a05261018050606461015cfd5b6000600435111515610709576308c379a0610140526020610160526009610180527f7265706179203d203000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6004600a3360e05260c052604060c02060c052602060c0200180546004358082101561073457600080fd5b80820390509050815550600880546004358082101561075257600080fd5b808203905090508155506004356101405260043561016052337f77c6871227e5d2dec8dadd5354f78453203e22e669cd0ec4c19d9a8c5edb31d06040610140a260043560005260206000f35b63753c09858114156109f35760015415156107f8576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b6001600a3360e05260c052604060c02060c052602060c0200154151561085d576308c379a0610140526020610160526007610180527f21616374697665000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b60006004351015156108725760243515610875565b60005b15610881576001610899565b60043515156108965760006024351015610899565b60005b15156108e4576308c379a0610140526020610160526011610180527f6761696e20616e64206c6f7373203e20300000000000000000000000000000006101a05261018050606461015cfd5b34600435141515610934576308c379a0610140526020610160526011610180527f6761696e20213d206d73672e76616c75650000000000000000000000000000006101a05261018050606461015cfd5b60006004351115610944576109a3565b600060243511156109a3576004600a3360e05260c052604060c02060c052602060c0200180546024358082101561097a57600080fd5b80820390509050815550600880546024358082101561099857600080fd5b808203905090508155505b60406004610140376004600a3360e05260c052604060c02060c052602060c020015461018052337f36d8646df39e8831ab3926651692b6a0ea874e6cc807ea1c428fcf2ba32859f86060610140a2005b63fc0c546a811415610a28573415610a0a57600080fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60005260206000f35b63ce5494bb811415610e1b573415610a3f57600080fd5b60043560a01c15610a4f57600080fd5b60035433141515610a9f576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6001541515610aed576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b6000541515610b3b576308c379a0610140526020610160526007610180527f21706175736564000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60206101a0600463fc0c546a6101405261015c6004355afa610b7157600080fd5b601f3d11610b7e57600080fd5b6000506101a051141515610bd1576308c379a06101c05260206101e052601d610200527f6e65772066756e64206d616e6167657220746f6b656e20213d20455448000000610220526102005060646101dcfd5b60025460206101a0600463fbfa77cf6101405261015c6004355afa610bf557600080fd5b601f3d11610c0257600080fd5b6000506101a051141515610c55576308c379a06101c05260206101e052601f610200527f6e65772066756e64206d616e61676572207661756c7420213d207661756c7400610220526102005060646101dcfd5b61016060006014818352015b61016051600b60c052602060c020015461014052610140511515610c8457610d3e565b60043560206101e06004636209ec2d6101805261019c610140515afa610ca957600080fd5b601f3d11610cb657600080fd5b6000506101e051141515610d2e576308c379a0610200526020610220526029610240527f73747261746567792066756e64206d616e6167657220213d206e65772066756e610260527f64206d616e6167657200000000000000000000000000000000000000000000006102805261024050608461021cfd5b8151600101808352811415610c61575b505047610140526004353b610d5257600080fd5b600060006004638129fc1c6101605261017c610140516004355af1610d7657600080fd5b6004356101605261014051610180526008546101a0527fd44a6dd2bfac4f6bc02d116d96aa12c24e8580626b95cb6a2f543f18cb61bd4c6060610160a1600060085561018060006014818352015b61018051600b60c052602060c020015461016052610160511515610de757610e17565b60006004600a6101605160e05260c052604060c02060c052602060c02001555b8151600101808352811415610dc4575b5050005b6347a02a44811415610ec8573415610e3257600080fd5b60043560a01c15610e4257600080fd5b60035433141515610e92576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b600435600455600435610140527f5c06d5a6f95a574bb95a214c88933831c63fcd6f6c5d1d61a21efb92be19bc2c6020610140a1005b631e39831e811415610f61573415610edf57600080fd5b60045433141515610f2f576308c379a061014052602061016052600f610180527f216e6578742074696d65206c6f636b00000000000000000000000000000000006101a05261018050606461015cfd5b3360035533610140527f77b69635186d51fb2d031f67a7995795c8384acb800219c7d30861125d154f026020610140a1005b63704b6c0281141561105f573415610f7857600080fd5b60043560a01c15610f8857600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b610120516020026101600151331415610fc75760018352610fd7565b8151600101808352811415610fab575b505050610140511515611029576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600435600555600435610140527f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a16020610140a1005b638a0dac4a81141561115d57341561107657600080fd5b60043560a01c1561108657600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156110c557600183526110d5565b81516001018083528114156110a9575b505050610140511515611127576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600435600655600435610140527f31845eceb9cde510c7e8b37f76301c688feb70bc9653aa4c28a3734999840fd86020610140a1005b63c26f6d4481141561125b57341561117457600080fd5b60043560a01c1561118457600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156111c357600183526111d3565b81516001018083528114156111a7575b505050610140511515611225576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600435600755600435610140527fcabc8521621c89fc973d8f1e8455da2ce64a666915af33e0ebaa69cd5215083b6020610140a1005b63bedb86fb81141561136057341561127257600080fd5b60043560011c1561128257600080fd5b60035461016052600554610180526006546101a05260006101405261014061012060006003818352015b6101205160200261016001513314156112c857600183526112d8565b81516001018083528114156112ac575b50505061014051151561132a576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b600435600055600435610140527f140eb9f8b591138e129e4caf389c92df4f0545b902523eee9e63153ecdb2026e6020610140a1005b636817031b8114156114a357341561137757600080fd5b60043560a01c1561138757600080fd5b600354331415156113d7576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60206101a0600463fc0c546a6101405261015c6004355afa61140d57600080fd5b601f3d1161141a57600080fd5b6000506101a05114151561146d576308c379a06101c05260206101e0526012610200527f7661756c7420746f6b656e20213d204554480000000000000000000000000000610220526102005060646101dcfd5b600435600255600435610140527fd459c7242e23d490831b5676a611c4342d899d28f342d89ae80793e56a930f306020610140a1005b6301e1d1148114156114d45734156114ba57600080fd5b6006580161406d565b610140526101405160005260206000f35b633b8ae39781141561173a5734156114eb57600080fd5b60043560a01c156114fb57600080fd5b6003543314151561154b576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b600a60043560e05260c052604060c02060c052602060c020541515156115b0576308c379a0610140526020610160526008610180527f617070726f7665640000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b3060206101a06004636209ec2d6101405261015c6004355afa6115d257600080fd5b601f3d116115df57600080fd5b6000506101a051141515611632576308c379a06101c05260206101e052601d610200527f73747261746567792066756e64206d616e6167657220213d2074686973000000610220526102005060646101dcfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60206101a0600463fc0c546a6101405261015c6004355afa61166857600080fd5b601f3d1161167557600080fd5b6000506101a0511415156116c8576308c379a06101c05260206101e0526015610200527f737472617465677920746f6b656e20213d204554480000000000000000000000610220526102005060646101dcfd5b600a60043560e05260c052604060c02060c052602060c02060018155600060018201556000600282015560006003820155600060048201556000600582015560006006820155506004357f4c6d0fbb89373829bc56000a87d561331bca06f725fd8861d055215ed90f209b60006000a2005b63bb994d4881141561191457341561175157600080fd5b60043560a01c1561176157600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156117a057600183526117b0565b8151600101808352811415611784575b505050610140511515611802576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600a60043560e05260c052604060c02060c052602060c020541515611866576308c379a0610140526020610160526009610180527f21617070726f76656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6001600a60043560e05260c052604060c02060c052602060c02001541515156118ce576308c379a0610140526020610160526006610180527f61637469766500000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6000600a60043560e05260c052604060c02060c052602060c020556004357f7d3e35e217272b8400fec8397b08eb8c60c4db9ae834af14ac0fc9c0bb914a8f60006000a2005b635f1ac310811415611c6257341561192b57600080fd5b60043560a01c1561193b57600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b61012051602002610160015133141561197a576001835261198a565b815160010180835281141561195e575b5050506101405115156119dc576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600a60043560e05260c052604060c02060c052602060c020541515611a40576308c379a0610140526020610160526009610180527f21617070726f76656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6001600a60043560e05260c052604060c02060c052602060c0200154151515611aa8576308c379a0610140526020610160526006610180527f61637469766500000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b612710600954602435818183011015611ac057600080fd5b8082019050905011151515611b14576308c379a061014052602061016052600b610180527f726174696f203e206d61780000000000000000000000000000000000000000006101a05261018050606461015cfd5b60643560443511151515611b67576308c379a0610140526020610160526017610180527f6d696e20626f72726f77203e206d617820626f72726f770000000000000000006101a05261018050606461015cfd5b6004356101405261014051600658016141e1565b60005060016001600a60043560e05260c052604060c02060c052602060c020015560016002600a60043560e05260c052604060c02060c052602060c02001556024356003600a60043560e05260c052604060c02060c052602060c02001556044356005600a60043560e05260c052604060c02060c052602060c02001556064356006600a60043560e05260c052604060c02060c052602060c020015560098054602435818183011015611c2d57600080fd5b808201905090508155506004357fa3cbd67e6583e6c7ef034e5f87b7b40b0a0e87182a8377dfb42e59aa414c6cd560006000a2005b63b22439f5811415611e96573415611c7957600080fd5b60043560a01c15611c8957600080fd5b60035461016052600554610180526006546101a05260006101405261014061012060006003818352015b610120516020026101600151331415611ccf5760018352611cdf565b8151600101808352811415611cb3575b505050610140511515611d31576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b6001600a60043560e05260c052604060c02060c052602060c02001541515611d98576308c379a0610140526020610160526007610180527f21616374697665000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b60043561014052610140516006580161437e565b6101a0526101a0516101c0526101405161016051610180516101a0516101c0516101c0516101e0526101e05160065801614277565b6101c0526101a05261018052610160526101405260005060006001600a60043560e05260c052604060c02060c052602060c0200155600980546003600a60043560e05260c052604060c02060c052602060c020015480821015611e4357600080fd5b8082039050905081555060006003600a60043560e05260c052604060c02060c052602060c02001556004357fff2f97c1f3529c6b02543b63f7efae22cdc885048adf65c679a1c5c4ea3b2fa860006000a2005b63c5cde90b811415612361573415611ead57600080fd5b6000610120525b610120516004013560a01c15611ec957600080fd5b6020610120510161012052610280610120511015611ee657611eb4565b600354610160526005546101805260006101405261014061012060006002818352015b610120516020026101600151331415611f255760018352611f35565b8151600101808352811415611f09575b505050610140511515611f87576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b60006101405261016060006014818352015b60046101605160148110611fac57600080fd5b602002013561018052610180511515611fd557610140511515611fd0576001610140525b612025565b61014051151515612025576308c379a06101a05260206101c05260036101e0527f6761700000000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b8151600101808352811415611f99575b505061016060006014818352015b610160516014811061205457600080fd5b600b60c052602060c0200154610180526004610160516014811061207757600080fd5b60200201356101a0526101805115156120df576101a0511515156120da576308c379a06101c05260206101e0526008610200527f6e657720213d2030000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b612132565b60006101a05114151515612132576308c379a06101c05260206101e0526007610200527f6e6577203d203000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b8151600101808352811415612043575b505061016060006014818352015b6004610160516014811061216357600080fd5b60200201356101805261018051151561217b57612213565b6001600a6101805160e05260c052604060c02060c052602060c020015415156121e3576308c379a06101a05260206101c05260076101e0527f2161637469766500000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b60006001600a6101805160e05260c052604060c02060c052602060c02001555b8151600101808352811415612150575b505061016060006014818352015b6004610160516014811061223457600080fd5b60200201356101805261018051151561224c5761229d565b60016001600a6101805160e05260c052604060c02060c052602060c020015561018051610160516014811061228057600080fd5b600b60c052602060c02001555b8151600101808352811415612221575b505060043561016052602435610180526044356101a0526064356101c0526084356101e05260a4356102005260c4356102205260e4356102405261010435610260526101243561028052610144356102a052610164356102c052610184356102e0526101a435610300526101c435610320526101e4356103405261020435610360526102243561038052610244356103a052610264356103c0527fa03ab32749bdff946d914bdbc7fadedf2bdeb6a83f2b56effa25a0eae1012675610280610160a1005b63260829c081141561268e57341561237857600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156123b757600183526123c7565b815160010180835281141561239b575b505050610140511515612419576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b61014060006014818352015b610140516014811061243657600080fd5b600b60c052602060c020015415156124ac576004610140516014811061245b57600080fd5b60200201351515156124ac576308c379a061016052602061018052600f6101a0527f6465627420726174696f20213d203000000000000000000000000000000000006101c0526101a050606461017cfd5b8151600101808352811415612425575b505060006101405261016060006014818352015b61016051601481106124e157600080fd5b600b60c052602060c02001546101805261018051151561250057612570565b6004610160516014811061251357600080fd5b60200201356101a0526101a0516003600a6101805160e05260c052604060c02060c052602060c020015561014080516101a05181818301101561255557600080fd5b808201905090508152505b81516001018083528114156124d0575b505061014051600955612710600954111515156125cc576308c379a061016052602061018052600b6101a0527f746f74616c203e206d61780000000000000000000000000000000000000000006101c0526101a050606461017cfd5b60043561016052602435610180526044356101a0526064356101c0526084356101e05260a4356102005260c4356102205260e4356102405261010435610260526101243561028052610144356102a052610164356102c052610184356102e0526101a435610300526101c435610320526101e4356103405261020435610360526102243561038052610244356103a052610264356103c0527f8edb07c0d6dfa3d8e47f8faaeffa94a7c21b80ebb98ccf264581f64c8270a906610280610160a1005b63da1714318114156128855734156126a557600080fd5b60043560a01c156126b557600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156126f45760018352612704565b81516001018083528114156126d8575b505050610140511515612756576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600a60043560e05260c052604060c02060c052602060c0205415156127ba576308c379a0610140526020610160526009610180527f21617070726f76656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6044356024351115151561280d576308c379a0610140526020610160526017610180527f6d696e20626f72726f77203e206d617820626f72726f770000000000000000006101a05261018050606461015cfd5b6024356005600a60043560e05260c052604060c02060c052602060c02001556044356006600a60043560e05260c052604060c02060c052602060c020015560243561014052604435610160526004357ffedf8d30e937b57e4e95271e9f17cfab1a1315ac6d612ef72912405e9524f7d56040610140a2005b63505b6a76811415612a6357341561289c57600080fd5b60015415156128ea576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60035461016052600554610180526007546101a05260006101405261014061012060006003818352015b6101205160200261016001513314156129305760018352612940565b8151600101808352811415612914575b505050610140511515612992576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b60206101e0602463c5ebeaec610160526004356101805261017c60006002545af16129bc57600080fd5b601f3d116129c957600080fd5b6000506101e051610140526024356101405110151515612a28576308c379a061016052602061018052600e6101a0527f626f72726f776564203c206d696e0000000000000000000000000000000000006101c0526101a050606461017cfd5b6004356101605261014051610180526002547fb87de9931230544a0b3a00e753f5ab70f79a54e84e47bcad4239e1c1c97588d36040610160a2005b6348b8a1f9811415612c42573415612a7a57600080fd5b6001541515612ac8576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60035461016052600554610180526007546101a05260006101405261014061012060006003818352015b610120516020026101600151331415612b0e5760018352612b1e565b8151600101808352811415612af2575b505050610140511515612b70576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b60206101e0602463371fd8e6610160526004356101805261017c6004356002545af1612b9b57600080fd5b601f3d11612ba857600080fd5b6000506101e051610140526024356101405110151515612c07576308c379a061016052602061018052600c6101a0527f726570616964203c206d696e00000000000000000000000000000000000000006101c0526101a050606461017cfd5b6004356101605261014051610180526002547f447949f39e7c140dbba1469e2e065abd8a278ac561449a4fcd1c51f5aadc91d86040610160a2005b63d5b6e219811415612f2c573415612c5957600080fd5b6001541515612ca7576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60035461016052600554610180526007546101a05260006101405261014061012060006003818352015b610120516020026101600151331415612ced5760018352612cfd565b8151600101808352811415612cd1575b505050610140511515612d4f576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b610140516006580161406d565b6101605261014052610160516101405260043561014051101515612d8857602435610140511115612d8b565b60005b1515612dd6576308c379a06101605260206101805260126101a0527f746f74616c206e6f7420696e2072616e676500000000000000000000000000006101c0526101a050606461017cfd5b60206101e06004630dca59c16101805261019c6002545afa612df757600080fd5b601f3d11612e0457600080fd5b6000506101e051610160526040366101803761016051610140511115612e5e57610140516101605180821015612e3957600080fd5b808203905090504780821115612e4f5780612e51565b815b9050905061018052612e7f565b610160516101405180821015612e7357600080fd5b808203905090506101a0525b6000610180511115612e92576001612e9a565b60006101a051115b15612ee0576002543b612eac57600080fd5b60006000604463753c09856101c052610180516101e0526101a051610200526101dc610180516002545af1612ee057600080fd5b610140516101c052610160516101e05261018051610200526101a051610220526002547fd94ac81cdb49ea558800854e3bfd1aedf2a0a02abc471047c34e382fd5137cbd60806101c0a2005b632e1a7d4d811415613213573415612f4357600080fd5b6001541515612f91576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60025433141515612fe1576308c379a0610140526020610160526006610180527f217661756c7400000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b610140516006580161406d565b6101605261014052610160516101405260043561014051808211156130135780613015565b815b905090506101605260006101605111151561306f576308c379a06101805260206101a052600c6101c0527f7769746864726177203d203000000000000000000000000000000000000000006101e0526101c050606461019cfd5b60206102006004630dca59c16101a0526101bc6002545afa61309057600080fd5b601f3d1161309d57600080fd5b600050610200516101805260006101a052610140516101805111156130dd576101805161014051808210156130d157600080fd5b808203905090506101a0525b476101c0526101c051610160511115613171576101a080516101405161016051610180516101a0516101c051610160516101e0526101e05160065801614422565b610240526101c0526101a0526101805261016052610140526102405181818301101561314957600080fd5b808201905090508152506101605147808211156131665780613168565b815b90509050610160525b60006101605111156131c7576101405161016051610180516101a0516101c051336101e0526101605161020052610200516101e05160065801613e2b565b6101c0526101a0526101805261016052610140526000505b6004356101e05261016051610200526101a05161022052337f02f25270a4d87bea75db541cdfe559334a275b4a233520ed6c0a2429667cca9460606101e0a26101a05160005260206000f35b63f19f054281141561325f57341561322a57600080fd5b60043560a01c1561323a57600080fd5b6004356101405261014051600658016146b6565b6101a0526101a05160005260206000f35b63c6f2be588114156132ab57341561327657600080fd5b60043560a01c1561328657600080fd5b60043561014052610140516006580161485d565b6101a0526101a05160005260206000f35b639a78e72e8114156132f75734156132c257600080fd5b60043560a01c156132d257600080fd5b6004600a60043560e05260c052604060c02060c052602060c020015460005260206000f35b63c5ebeaec81141561356557341561330e57600080fd5b600154151561335c576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b6000541515156133ab576308c379a0610140526020610160526006610180527f70617573656400000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6001600a3360e05260c052604060c02060c052602060c02001541515613410576308c379a0610140526020610160526007610180527f21616374697665000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b60043561014051336101605261016051600658016146b6565b6101c052610140526101c051808211156134435780613445565b815b905090506101405260006101405111151561349f576308c379a061016052602061018052600a6101a0527f626f72726f77203d2030000000000000000000000000000000000000000000006101c0526101a050606461017cfd5b6101405133610160526101405161018052610180516101605160065801613e2b565b610140526000506004600a3360e05260c052604060c02060c052602060c020018054610140518181830110156134f657600080fd5b80820190509050815550600880546101405181818301101561351757600080fd5b80820190509050815550600435610160526101405161018052337fe1979fe4c35e0cef342fef5668e2c8e7a7e9f5d5d1ca8fee0ac6c427fa4153af6040610160a26101405160005260206000f35b636cb56d19811415613a1457341561357c57600080fd5b60043560a01c1561358c57600080fd5b60243560a01c1561359c57600080fd5b60015415156135ea576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156136295760018352613639565b815160010180835281141561360d575b50505061014051151561368b576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b6001600a60043560e05260c052604060c02060c052602060c020015415156136f2576308c379a061014052602061016052600b610180527f6f6c6420216163746976650000000000000000000000000000000000000000006101a05261018050606461015cfd5b600a60243560e05260c052604060c02060c052602060c020541515613756576308c379a061014052602061016052600d610180527f6e65772021617070726f766564000000000000000000000000000000000000006101a05261018050606461015cfd5b6002600a60243560e05260c052604060c02060c052602060c02001541515156137be576308c379a0610140526020610160526009610180527f61637469766174656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b610140600a60043560e05260c052604060c0208060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015260048160c052602060c0200154826080015260058160c052602060c02001548260a0015260068160c052602060c02001548260c001525050600a60243560e05260c052604060c02060c052602060c0206001815560016001820155600160028201556101a05160038201556101c05160048201556101e05160058201556102005160068201555060006001600a60043560e05260c052604060c02060c052602060c020015560006003600a60043560e05260c052604060c02060c052602060c020015560006004600a60043560e05260c052604060c02060c052602060c020015560006005600a60043560e05260c052604060c02060c052602060c020015560006006600a60043560e05260c052604060c02060c052602060c02001556101405161016051610180516101a0516101c0516101e051610200516102205160043561024052610240516006580161437e565b6102a05261022052610200526101e0526101c0526101a0526101805261016052610140526102a0516102205260243561022051601481106139a457600080fd5b600b60c052602060c02001556004353b6139bd57600080fd5b60006000602463ce5494bb610240526024356102605261025c60006004355af16139e657600080fd5b6024356004357f9249d6a64288c19c5be5f4f1bb9b763ad4afac803128f1ef65b88acb13df9aa460006000a3005b6301681a62811415613b78573415613a2b57600080fd5b60043560a01c15613a3b57600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b610120516020026101600151331415613a7a5760018352613a8a565b8151600101808352811415613a5e575b505050610140511515613adc576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b60206101c060246370a0823161014052306101605261015c6004355afa613b0257600080fd5b601f3d11613b0f57600080fd5b6000506101c0516101e0526101405161016051610180516101a0516101c0516101e0516004356102005233610220526101e0516102405261024051610220516102005160065801613ed3565b6101e0526101c0526101a052610180526101605261014052600050005b635c975abb811415613b9b573415613b8f57600080fd5b60005460005260206000f35b63158ef93e811415613bbe573415613bb257600080fd5b60015460005260206000f35b63fbfa77cf811415613be1573415613bd557600080fd5b60025460005260206000f35b63d085835a811415613c04573415613bf857600080fd5b60035460005260206000f35b63b127df87811415613c27573415613c1b57600080fd5b60045460005260206000f35b63f851a440811415613c4a573415613c3e57600080fd5b60055460005260206000f35b63452a9320811415613c6d573415613c6157600080fd5b60065460005260206000f35b634d547ada811415613c90573415613c8457600080fd5b60075460005260206000f35b63fc7b9c18811415613cb3573415613ca757600080fd5b60085460005260206000f35b632df9eab9811415613cd6573415613cca57600080fd5b60095460005260206000f35b6339ebf823811415613dc8573415613ced57600080fd5b60043560a01c15613cfd57600080fd5b600a60043560e05260c052604060c0206101408080808460c052602060c0205481525050602081019050808060018560c052602060c020015481525050602081019050808060028560c052602060c020015481525050602081019050808060038560c052602060c020015481525050602081019050808060048560c052602060c020015481525050602081019050808060058560c052602060c020015481525050602081019050808060068560c052602060c02001548152505060e09050905060c05260c051610140f35b63ddf0b009811415613e04573415613ddf57600080fd5b60043560148110613def57600080fd5b600b60c052602060c020015460005260206000f35b63a598adff811415613e27573415613e1b57600080fd5b600c5460005260206000f35b505b005b61018052610140526101605260006101405114151515613e8a576308c379a06101a05260206101c052600e6101e0527f746f203d20302061646472657373000000000000000000000000000000000000610200526101e05060646101bcfd5b60006101a0526101a08051602001806101e08284600060045af1613ead57600080fd5b5050600060006101e05161020061016051610140515af1613ecd57600080fd5b61018051565b6101a05261014052610160526101805260006004610220527fa9059cbb000000000000000000000000000000000000000000000000000000006102405261022060048060208461028001018260208501600060045af15050805182019150506101605160208261028001015260208101905061018051602082610280010152602081019050806102805261028090508051602001806103208284600060045af1613f7c57600080fd5b505060206103e0610320516103406000610140515af1613f9b57600080fd5b60203d80821115613fac5780613fae565b815b905090506103c0526103c08051602001806101c08284600060045af1613fd357600080fd5b505060006101c0511115614067576101c0806020015160008251806020901315613ffc57600080fd5b809190121561400a57600080fd5b806020036101000a820490509050905015151515614067576308c379a061022052602061024052600f610260527f7472616e73666572206661696c656400000000000000000000000000000000006102805261026050606461023cfd5b6101a051565b610140524760085481818301101561408457600080fd5b8082019050905060005260005161014051565b610140526102a0366101603761042060006014818352015b61042051600b60c052602060c020015461040052600061040051181561410d57610400516101606103e051601481106140e757600080fd5b60200201526103e08051600181818301101561410257600080fd5b808201905090508152505b81516001018083528114156140af575b5050600b60c052602060c0206101605181556101805160018201556101a05160028201556101c05160038201556101e05160048201556102005160058201556102205160068201556102405160078201556102605160088201556102805160098201556102a051600a8201556102c051600b8201556102e051600c82015561030051600d82015561032051600e82015561034051600f8201556103605160108201556103805160118201556103a05160128201556103c05160138201555061014051565b61016052610140526013600b60c052602060c0200154151515614243576308c379a06101805260206101a052600b6101c0527f7175657565203e206d61780000000000000000000000000000000000000000006101e0526101c050606461019cfd5b610140516013600b60c052602060c0200155610140516101605160065801614097565b610160526101405260005061016051565b61016052610140526014610140511015156142d1576308c379a06101805260206101a05260086101c0527f69203e3d206d61780000000000000000000000000000000000000000000000006101e0526101c050606461019cfd5b600061014051601481106142e457600080fd5b600b60c052602060c02001541415151561433d576308c379a06101805260206101a052600d6101c0527f217a65726f2061646472657373000000000000000000000000000000000000006101e0526101c050606461019cfd5b6000610140516014811061435057600080fd5b600b60c052602060c0200155610140516101605160065801614097565b610160526101405260005061016051565b610160526101405261018060006014818352015b6101405161018051601481106143a757600080fd5b600b60c052602060c020015414156143cb5761018051600052505060005161016051565b8151600101808352811415614392575b50506308c379a06101805260206101a05260096101c0527f6e6f7420666f756e6400000000000000000000000000000000000000000000006101e0526101c050606461019cfd5b6101605261014052610140516101805260006101a0526101e060006014818352015b6101e051600b60c052602060c02001546101c0526101c0511515614467576146a4565b47610200526101805161020051101515614480576146a4565b6004600a6101c05160e05260c052604060c02060c052602060c0200154610220526101805161020051808210156144b657600080fd5b8082039050905061022051808211156144cf57806144d1565b815b90509050610240526102405115156144e857614694565b60206103006024632e1a7d4d61028052610240516102a05261029c60006101c0515af161451457600080fd5b601f3d1161452157600080fd5b600050610300516102605247610200518082101561453e57600080fd5b808203905090506102805260006102605111156145f0576101808051610260518082101561456b57600080fd5b808203905090508152506101a080516102605181818301101561458d57600080fd5b808201905090508152506004600a6101c05160e05260c052604060c02060c052602060c02001805461026051808210156145c657600080fd5b808203905090508155506008805461026051808210156145e557600080fd5b808203905090508155505b6004600a6101c05160e05260c052604060c02060c052602060c020018054610280518082101561461f57600080fd5b8082039050905081555060088054610280518082101561463e57600080fd5b80820390509050815550610220516102a052610240516102c052610260516102e05261028051610300526101c0517fa1db2d4488a8004dde12ff73253859b508b0458878ea4086047bab6672f9f1d760806102a0a25b8151600101808352811415614444575b50506101a05160005260005161016051565b610160526101405260015415156146ce5760016146e2565b600054156146dd5760016146e2565b600954155b156146f557600060005260005161016051565b6003600a6101405160e05260c052604060c02060c052602060c02001546101405161016051610180516006580161406d565b6101a0526101805261016052610140526101a051808202821582848304141761474f57600080fd5b80905090509050600954808061476457600080fd5b820490509050610180526004600a6101405160e05260c052604060c02060c052602060c02001546101a052610180516101a0511015156147ac57600060005260005161016051565b610180516101a051808210156147c157600080fd5b8082039050905047808211156147d757806147d9565b815b905090506101c0526005600a6101405160e05260c052604060c02060c052602060c02001546101c051101561481a576000600052600051610160515661485b565b6101c0516006600a6101405160e05260c052604060c02060c052602060c020015480821115614849578061484b565b815b9050905060005260005161016051565b005b6101605261014052600154151561487c57600060005260005161016051565b60095415156148ae576004600a6101405160e05260c052604060c02060c052602060c020015460005260005161016051565b6003600a6101405160e05260c052604060c02060c052602060c020015460085480820282158284830414176148e257600080fd5b8090509050905060095480806148f757600080fd5b820490509050610180526004600a6101405160e05260c052604060c02060c052602060c02001546101a0526000541561493e576101a0516000526000516101605156614987565b610180516101a05111151561495f5760006000526000516101605156614987565b6101a051610180518082101561497457600080fd5b8082039050905060005260005161016051565b005b61011a614aa30361011a60003961011a614aa3036000f300000000000000000000000086d10751b18f3fe331c146546868a07224a8598b00000000000000000000000086d10751b18f3fe331c146546868a07224a8598b0000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x600436101561000d57613e29565b600035601c52600051638129fc1c8114156105ac57600154151515610071576308c379a061014052602061016052600b610180527f696e697469616c697a65640000000000000000000000000000000000000000006101a05261018050606461015cfd5b600c54151561012057600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156100b957600183526100c9565b815160010180835281141561009d575b50505061014051151561011b576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b6105a5565b600c5433141515610170576308c379a0610140526020610160526011610180527f216f6c642066756e64206d616e616765720000000000000000000000000000006101a05261018050606461015cfd5b60206101a0600463fbfa77cf6101405261015c600c545afa61019157600080fd5b601f3d1161019e57600080fd5b6000506101a0516002541415156101f4576308c379a06101c05260206101e052601f610200527f6f6c642066756e64206d616e61676572207661756c7420213d207661756c7400610220526102005060646101dcfd5b60206101a0600463fc7b9c186101405261015c600c545afa61021557600080fd5b601f3d1161022257600080fd5b6000506101a05160085560206101a06004632df9eab96101405261015c600c545afa61024d57600080fd5b601f3d1161025a57600080fd5b6000506101a05160095561014060006014818352015b6020610200602463ddf0b00961018052610140516101a05261019c600c545afa61029957600080fd5b601f3d116102a657600080fd5b60005061020051610160526101605115156102c0576105a2565b3060206101e06004636209ec2d6101805261019c610160515afa6102e357600080fd5b601f3d116102f057600080fd5b6000506101e051141515610343576308c379a061020052602061022052601d610240527f73747261746567792066756e64206d616e6167657220213d2073656c660000006102605261024050606461021cfd5b60e0366101803760e06102e060246339ebf82361026052610160516102805261027c600c545afa61037357600080fd5b60df3d1161038057600080fd5b6102e080808080516103c0525050602081019050808080516103e0525050602081019050808080516104005250506020810190508080805161042052505060208101905080808051610440525050602081019050808080516104605250506020810190508080805161048052505050506000506103c080516101805280602001516101a05280604001516101c05280606001516101e0528060800151610200528060a00151610220528060c001516102405250610180511515610482576308c379a06102605260206102805260096102a0527f21617070726f76656400000000000000000000000000000000000000000000006102c0526102a050606461027cfd5b6101a05115156104d1576308c379a06102605260206102805260076102a0527f21616374697665000000000000000000000000000000000000000000000000006102c0526102a050606461027cfd5b6101c0511515610520576308c379a061026052602061028052600a6102a0527f21616374697661746564000000000000000000000000000000000000000000006102c0526102a050606461027cfd5b61016051610140516014811061053557600080fd5b600b60c052602060c0200155600a6101605160e05260c052604060c02060c052602060c0206001815560016001820155600160028201556101e0516003820155610200516004820155610220516005820155610240516006820155505b8151600101808352811415610270575b50505b6001600155005b63371fd8e681141561079e576001541515610606576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b600a3360e05260c052604060c02060c052602060c020541515610668576308c379a0610140526020610160526009610180527f21617070726f76656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b346004351415156106b8576308c379a0610140526020610160526013610180527f616d6f756e7420213d206d73672e76616c7565000000000000000000000000006101a05261018050606461015cfd5b6000600435111515610709576308c379a0610140526020610160526009610180527f7265706179203d203000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6004600a3360e05260c052604060c02060c052602060c0200180546004358082101561073457600080fd5b80820390509050815550600880546004358082101561075257600080fd5b808203905090508155506004356101405260043561016052337f77c6871227e5d2dec8dadd5354f78453203e22e669cd0ec4c19d9a8c5edb31d06040610140a260043560005260206000f35b63753c09858114156109f35760015415156107f8576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b6001600a3360e05260c052604060c02060c052602060c0200154151561085d576308c379a0610140526020610160526007610180527f21616374697665000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b60006004351015156108725760243515610875565b60005b15610881576001610899565b60043515156108965760006024351015610899565b60005b15156108e4576308c379a0610140526020610160526011610180527f6761696e20616e64206c6f7373203e20300000000000000000000000000000006101a05261018050606461015cfd5b34600435141515610934576308c379a0610140526020610160526011610180527f6761696e20213d206d73672e76616c75650000000000000000000000000000006101a05261018050606461015cfd5b60006004351115610944576109a3565b600060243511156109a3576004600a3360e05260c052604060c02060c052602060c0200180546024358082101561097a57600080fd5b80820390509050815550600880546024358082101561099857600080fd5b808203905090508155505b60406004610140376004600a3360e05260c052604060c02060c052602060c020015461018052337f36d8646df39e8831ab3926651692b6a0ea874e6cc807ea1c428fcf2ba32859f86060610140a2005b63fc0c546a811415610a28573415610a0a57600080fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60005260206000f35b63ce5494bb811415610e1b573415610a3f57600080fd5b60043560a01c15610a4f57600080fd5b60035433141515610a9f576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6001541515610aed576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b6000541515610b3b576308c379a0610140526020610160526007610180527f21706175736564000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60206101a0600463fc0c546a6101405261015c6004355afa610b7157600080fd5b601f3d11610b7e57600080fd5b6000506101a051141515610bd1576308c379a06101c05260206101e052601d610200527f6e65772066756e64206d616e6167657220746f6b656e20213d20455448000000610220526102005060646101dcfd5b60025460206101a0600463fbfa77cf6101405261015c6004355afa610bf557600080fd5b601f3d11610c0257600080fd5b6000506101a051141515610c55576308c379a06101c05260206101e052601f610200527f6e65772066756e64206d616e61676572207661756c7420213d207661756c7400610220526102005060646101dcfd5b61016060006014818352015b61016051600b60c052602060c020015461014052610140511515610c8457610d3e565b60043560206101e06004636209ec2d6101805261019c610140515afa610ca957600080fd5b601f3d11610cb657600080fd5b6000506101e051141515610d2e576308c379a0610200526020610220526029610240527f73747261746567792066756e64206d616e6167657220213d206e65772066756e610260527f64206d616e6167657200000000000000000000000000000000000000000000006102805261024050608461021cfd5b8151600101808352811415610c61575b505047610140526004353b610d5257600080fd5b600060006004638129fc1c6101605261017c610140516004355af1610d7657600080fd5b6004356101605261014051610180526008546101a0527fd44a6dd2bfac4f6bc02d116d96aa12c24e8580626b95cb6a2f543f18cb61bd4c6060610160a1600060085561018060006014818352015b61018051600b60c052602060c020015461016052610160511515610de757610e17565b60006004600a6101605160e05260c052604060c02060c052602060c02001555b8151600101808352811415610dc4575b5050005b6347a02a44811415610ec8573415610e3257600080fd5b60043560a01c15610e4257600080fd5b60035433141515610e92576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b600435600455600435610140527f5c06d5a6f95a574bb95a214c88933831c63fcd6f6c5d1d61a21efb92be19bc2c6020610140a1005b631e39831e811415610f61573415610edf57600080fd5b60045433141515610f2f576308c379a061014052602061016052600f610180527f216e6578742074696d65206c6f636b00000000000000000000000000000000006101a05261018050606461015cfd5b3360035533610140527f77b69635186d51fb2d031f67a7995795c8384acb800219c7d30861125d154f026020610140a1005b63704b6c0281141561105f573415610f7857600080fd5b60043560a01c15610f8857600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b610120516020026101600151331415610fc75760018352610fd7565b8151600101808352811415610fab575b505050610140511515611029576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600435600555600435610140527f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a16020610140a1005b638a0dac4a81141561115d57341561107657600080fd5b60043560a01c1561108657600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156110c557600183526110d5565b81516001018083528114156110a9575b505050610140511515611127576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600435600655600435610140527f31845eceb9cde510c7e8b37f76301c688feb70bc9653aa4c28a3734999840fd86020610140a1005b63c26f6d4481141561125b57341561117457600080fd5b60043560a01c1561118457600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156111c357600183526111d3565b81516001018083528114156111a7575b505050610140511515611225576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600435600755600435610140527fcabc8521621c89fc973d8f1e8455da2ce64a666915af33e0ebaa69cd5215083b6020610140a1005b63bedb86fb81141561136057341561127257600080fd5b60043560011c1561128257600080fd5b60035461016052600554610180526006546101a05260006101405261014061012060006003818352015b6101205160200261016001513314156112c857600183526112d8565b81516001018083528114156112ac575b50505061014051151561132a576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b600435600055600435610140527f140eb9f8b591138e129e4caf389c92df4f0545b902523eee9e63153ecdb2026e6020610140a1005b636817031b8114156114a357341561137757600080fd5b60043560a01c1561138757600080fd5b600354331415156113d7576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60206101a0600463fc0c546a6101405261015c6004355afa61140d57600080fd5b601f3d1161141a57600080fd5b6000506101a05114151561146d576308c379a06101c05260206101e0526012610200527f7661756c7420746f6b656e20213d204554480000000000000000000000000000610220526102005060646101dcfd5b600435600255600435610140527fd459c7242e23d490831b5676a611c4342d899d28f342d89ae80793e56a930f306020610140a1005b6301e1d1148114156114d45734156114ba57600080fd5b6006580161406d565b610140526101405160005260206000f35b633b8ae39781141561173a5734156114eb57600080fd5b60043560a01c156114fb57600080fd5b6003543314151561154b576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b600a60043560e05260c052604060c02060c052602060c020541515156115b0576308c379a0610140526020610160526008610180527f617070726f7665640000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b3060206101a06004636209ec2d6101405261015c6004355afa6115d257600080fd5b601f3d116115df57600080fd5b6000506101a051141515611632576308c379a06101c05260206101e052601d610200527f73747261746567792066756e64206d616e6167657220213d2074686973000000610220526102005060646101dcfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60206101a0600463fc0c546a6101405261015c6004355afa61166857600080fd5b601f3d1161167557600080fd5b6000506101a0511415156116c8576308c379a06101c05260206101e0526015610200527f737472617465677920746f6b656e20213d204554480000000000000000000000610220526102005060646101dcfd5b600a60043560e05260c052604060c02060c052602060c02060018155600060018201556000600282015560006003820155600060048201556000600582015560006006820155506004357f4c6d0fbb89373829bc56000a87d561331bca06f725fd8861d055215ed90f209b60006000a2005b63bb994d4881141561191457341561175157600080fd5b60043560a01c1561176157600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156117a057600183526117b0565b8151600101808352811415611784575b505050610140511515611802576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600a60043560e05260c052604060c02060c052602060c020541515611866576308c379a0610140526020610160526009610180527f21617070726f76656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6001600a60043560e05260c052604060c02060c052602060c02001541515156118ce576308c379a0610140526020610160526006610180527f61637469766500000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6000600a60043560e05260c052604060c02060c052602060c020556004357f7d3e35e217272b8400fec8397b08eb8c60c4db9ae834af14ac0fc9c0bb914a8f60006000a2005b635f1ac310811415611c6257341561192b57600080fd5b60043560a01c1561193b57600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b61012051602002610160015133141561197a576001835261198a565b815160010180835281141561195e575b5050506101405115156119dc576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600a60043560e05260c052604060c02060c052602060c020541515611a40576308c379a0610140526020610160526009610180527f21617070726f76656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6001600a60043560e05260c052604060c02060c052602060c0200154151515611aa8576308c379a0610140526020610160526006610180527f61637469766500000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b612710600954602435818183011015611ac057600080fd5b8082019050905011151515611b14576308c379a061014052602061016052600b610180527f726174696f203e206d61780000000000000000000000000000000000000000006101a05261018050606461015cfd5b60643560443511151515611b67576308c379a0610140526020610160526017610180527f6d696e20626f72726f77203e206d617820626f72726f770000000000000000006101a05261018050606461015cfd5b6004356101405261014051600658016141e1565b60005060016001600a60043560e05260c052604060c02060c052602060c020015560016002600a60043560e05260c052604060c02060c052602060c02001556024356003600a60043560e05260c052604060c02060c052602060c02001556044356005600a60043560e05260c052604060c02060c052602060c02001556064356006600a60043560e05260c052604060c02060c052602060c020015560098054602435818183011015611c2d57600080fd5b808201905090508155506004357fa3cbd67e6583e6c7ef034e5f87b7b40b0a0e87182a8377dfb42e59aa414c6cd560006000a2005b63b22439f5811415611e96573415611c7957600080fd5b60043560a01c15611c8957600080fd5b60035461016052600554610180526006546101a05260006101405261014061012060006003818352015b610120516020026101600151331415611ccf5760018352611cdf565b8151600101808352811415611cb3575b505050610140511515611d31576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b6001600a60043560e05260c052604060c02060c052602060c02001541515611d98576308c379a0610140526020610160526007610180527f21616374697665000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b60043561014052610140516006580161437e565b6101a0526101a0516101c0526101405161016051610180516101a0516101c0516101c0516101e0526101e05160065801614277565b6101c0526101a05261018052610160526101405260005060006001600a60043560e05260c052604060c02060c052602060c0200155600980546003600a60043560e05260c052604060c02060c052602060c020015480821015611e4357600080fd5b8082039050905081555060006003600a60043560e05260c052604060c02060c052602060c02001556004357fff2f97c1f3529c6b02543b63f7efae22cdc885048adf65c679a1c5c4ea3b2fa860006000a2005b63c5cde90b811415612361573415611ead57600080fd5b6000610120525b610120516004013560a01c15611ec957600080fd5b6020610120510161012052610280610120511015611ee657611eb4565b600354610160526005546101805260006101405261014061012060006002818352015b610120516020026101600151331415611f255760018352611f35565b8151600101808352811415611f09575b505050610140511515611f87576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b60006101405261016060006014818352015b60046101605160148110611fac57600080fd5b602002013561018052610180511515611fd557610140511515611fd0576001610140525b612025565b61014051151515612025576308c379a06101a05260206101c05260036101e0527f6761700000000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b8151600101808352811415611f99575b505061016060006014818352015b610160516014811061205457600080fd5b600b60c052602060c0200154610180526004610160516014811061207757600080fd5b60200201356101a0526101805115156120df576101a0511515156120da576308c379a06101c05260206101e0526008610200527f6e657720213d2030000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b612132565b60006101a05114151515612132576308c379a06101c05260206101e0526007610200527f6e6577203d203000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b8151600101808352811415612043575b505061016060006014818352015b6004610160516014811061216357600080fd5b60200201356101805261018051151561217b57612213565b6001600a6101805160e05260c052604060c02060c052602060c020015415156121e3576308c379a06101a05260206101c05260076101e0527f2161637469766500000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b60006001600a6101805160e05260c052604060c02060c052602060c02001555b8151600101808352811415612150575b505061016060006014818352015b6004610160516014811061223457600080fd5b60200201356101805261018051151561224c5761229d565b60016001600a6101805160e05260c052604060c02060c052602060c020015561018051610160516014811061228057600080fd5b600b60c052602060c02001555b8151600101808352811415612221575b505060043561016052602435610180526044356101a0526064356101c0526084356101e05260a4356102005260c4356102205260e4356102405261010435610260526101243561028052610144356102a052610164356102c052610184356102e0526101a435610300526101c435610320526101e4356103405261020435610360526102243561038052610244356103a052610264356103c0527fa03ab32749bdff946d914bdbc7fadedf2bdeb6a83f2b56effa25a0eae1012675610280610160a1005b63260829c081141561268e57341561237857600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156123b757600183526123c7565b815160010180835281141561239b575b505050610140511515612419576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b61014060006014818352015b610140516014811061243657600080fd5b600b60c052602060c020015415156124ac576004610140516014811061245b57600080fd5b60200201351515156124ac576308c379a061016052602061018052600f6101a0527f6465627420726174696f20213d203000000000000000000000000000000000006101c0526101a050606461017cfd5b8151600101808352811415612425575b505060006101405261016060006014818352015b61016051601481106124e157600080fd5b600b60c052602060c02001546101805261018051151561250057612570565b6004610160516014811061251357600080fd5b60200201356101a0526101a0516003600a6101805160e05260c052604060c02060c052602060c020015561014080516101a05181818301101561255557600080fd5b808201905090508152505b81516001018083528114156124d0575b505061014051600955612710600954111515156125cc576308c379a061016052602061018052600b6101a0527f746f74616c203e206d61780000000000000000000000000000000000000000006101c0526101a050606461017cfd5b60043561016052602435610180526044356101a0526064356101c0526084356101e05260a4356102005260c4356102205260e4356102405261010435610260526101243561028052610144356102a052610164356102c052610184356102e0526101a435610300526101c435610320526101e4356103405261020435610360526102243561038052610244356103a052610264356103c0527f8edb07c0d6dfa3d8e47f8faaeffa94a7c21b80ebb98ccf264581f64c8270a906610280610160a1005b63da1714318114156128855734156126a557600080fd5b60043560a01c156126b557600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156126f45760018352612704565b81516001018083528114156126d8575b505050610140511515612756576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600a60043560e05260c052604060c02060c052602060c0205415156127ba576308c379a0610140526020610160526009610180527f21617070726f76656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6044356024351115151561280d576308c379a0610140526020610160526017610180527f6d696e20626f72726f77203e206d617820626f72726f770000000000000000006101a05261018050606461015cfd5b6024356005600a60043560e05260c052604060c02060c052602060c02001556044356006600a60043560e05260c052604060c02060c052602060c020015560243561014052604435610160526004357ffedf8d30e937b57e4e95271e9f17cfab1a1315ac6d612ef72912405e9524f7d56040610140a2005b63505b6a76811415612a6357341561289c57600080fd5b60015415156128ea576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60035461016052600554610180526007546101a05260006101405261014061012060006003818352015b6101205160200261016001513314156129305760018352612940565b8151600101808352811415612914575b505050610140511515612992576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b60206101e0602463c5ebeaec610160526004356101805261017c60006002545af16129bc57600080fd5b601f3d116129c957600080fd5b6000506101e051610140526024356101405110151515612a28576308c379a061016052602061018052600e6101a0527f626f72726f776564203c206d696e0000000000000000000000000000000000006101c0526101a050606461017cfd5b6004356101605261014051610180526002547fb87de9931230544a0b3a00e753f5ab70f79a54e84e47bcad4239e1c1c97588d36040610160a2005b6348b8a1f9811415612c42573415612a7a57600080fd5b6001541515612ac8576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60035461016052600554610180526007546101a05260006101405261014061012060006003818352015b610120516020026101600151331415612b0e5760018352612b1e565b8151600101808352811415612af2575b505050610140511515612b70576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b60206101e0602463371fd8e6610160526004356101805261017c6004356002545af1612b9b57600080fd5b601f3d11612ba857600080fd5b6000506101e051610140526024356101405110151515612c07576308c379a061016052602061018052600c6101a0527f726570616964203c206d696e00000000000000000000000000000000000000006101c0526101a050606461017cfd5b6004356101605261014051610180526002547f447949f39e7c140dbba1469e2e065abd8a278ac561449a4fcd1c51f5aadc91d86040610160a2005b63d5b6e219811415612f2c573415612c5957600080fd5b6001541515612ca7576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60035461016052600554610180526007546101a05260006101405261014061012060006003818352015b610120516020026101600151331415612ced5760018352612cfd565b8151600101808352811415612cd1575b505050610140511515612d4f576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b610140516006580161406d565b6101605261014052610160516101405260043561014051101515612d8857602435610140511115612d8b565b60005b1515612dd6576308c379a06101605260206101805260126101a0527f746f74616c206e6f7420696e2072616e676500000000000000000000000000006101c0526101a050606461017cfd5b60206101e06004630dca59c16101805261019c6002545afa612df757600080fd5b601f3d11612e0457600080fd5b6000506101e051610160526040366101803761016051610140511115612e5e57610140516101605180821015612e3957600080fd5b808203905090504780821115612e4f5780612e51565b815b9050905061018052612e7f565b610160516101405180821015612e7357600080fd5b808203905090506101a0525b6000610180511115612e92576001612e9a565b60006101a051115b15612ee0576002543b612eac57600080fd5b60006000604463753c09856101c052610180516101e0526101a051610200526101dc610180516002545af1612ee057600080fd5b610140516101c052610160516101e05261018051610200526101a051610220526002547fd94ac81cdb49ea558800854e3bfd1aedf2a0a02abc471047c34e382fd5137cbd60806101c0a2005b632e1a7d4d811415613213573415612f4357600080fd5b6001541515612f91576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60025433141515612fe1576308c379a0610140526020610160526006610180527f217661756c7400000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b610140516006580161406d565b6101605261014052610160516101405260043561014051808211156130135780613015565b815b905090506101605260006101605111151561306f576308c379a06101805260206101a052600c6101c0527f7769746864726177203d203000000000000000000000000000000000000000006101e0526101c050606461019cfd5b60206102006004630dca59c16101a0526101bc6002545afa61309057600080fd5b601f3d1161309d57600080fd5b600050610200516101805260006101a052610140516101805111156130dd576101805161014051808210156130d157600080fd5b808203905090506101a0525b476101c0526101c051610160511115613171576101a080516101405161016051610180516101a0516101c051610160516101e0526101e05160065801614422565b610240526101c0526101a0526101805261016052610140526102405181818301101561314957600080fd5b808201905090508152506101605147808211156131665780613168565b815b90509050610160525b60006101605111156131c7576101405161016051610180516101a0516101c051336101e0526101605161020052610200516101e05160065801613e2b565b6101c0526101a0526101805261016052610140526000505b6004356101e05261016051610200526101a05161022052337f02f25270a4d87bea75db541cdfe559334a275b4a233520ed6c0a2429667cca9460606101e0a26101a05160005260206000f35b63f19f054281141561325f57341561322a57600080fd5b60043560a01c1561323a57600080fd5b6004356101405261014051600658016146b6565b6101a0526101a05160005260206000f35b63c6f2be588114156132ab57341561327657600080fd5b60043560a01c1561328657600080fd5b60043561014052610140516006580161485d565b6101a0526101a05160005260206000f35b639a78e72e8114156132f75734156132c257600080fd5b60043560a01c156132d257600080fd5b6004600a60043560e05260c052604060c02060c052602060c020015460005260206000f35b63c5ebeaec81141561356557341561330e57600080fd5b600154151561335c576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b6000541515156133ab576308c379a0610140526020610160526006610180527f70617573656400000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6001600a3360e05260c052604060c02060c052602060c02001541515613410576308c379a0610140526020610160526007610180527f21616374697665000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b60043561014051336101605261016051600658016146b6565b6101c052610140526101c051808211156134435780613445565b815b905090506101405260006101405111151561349f576308c379a061016052602061018052600a6101a0527f626f72726f77203d2030000000000000000000000000000000000000000000006101c0526101a050606461017cfd5b6101405133610160526101405161018052610180516101605160065801613e2b565b610140526000506004600a3360e05260c052604060c02060c052602060c020018054610140518181830110156134f657600080fd5b80820190509050815550600880546101405181818301101561351757600080fd5b80820190509050815550600435610160526101405161018052337fe1979fe4c35e0cef342fef5668e2c8e7a7e9f5d5d1ca8fee0ac6c427fa4153af6040610160a26101405160005260206000f35b636cb56d19811415613a1457341561357c57600080fd5b60043560a01c1561358c57600080fd5b60243560a01c1561359c57600080fd5b60015415156135ea576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156136295760018352613639565b815160010180835281141561360d575b50505061014051151561368b576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b6001600a60043560e05260c052604060c02060c052602060c020015415156136f2576308c379a061014052602061016052600b610180527f6f6c6420216163746976650000000000000000000000000000000000000000006101a05261018050606461015cfd5b600a60243560e05260c052604060c02060c052602060c020541515613756576308c379a061014052602061016052600d610180527f6e65772021617070726f766564000000000000000000000000000000000000006101a05261018050606461015cfd5b6002600a60243560e05260c052604060c02060c052602060c02001541515156137be576308c379a0610140526020610160526009610180527f61637469766174656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b610140600a60043560e05260c052604060c0208060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015260048160c052602060c0200154826080015260058160c052602060c02001548260a0015260068160c052602060c02001548260c001525050600a60243560e05260c052604060c02060c052602060c0206001815560016001820155600160028201556101a05160038201556101c05160048201556101e05160058201556102005160068201555060006001600a60043560e05260c052604060c02060c052602060c020015560006003600a60043560e05260c052604060c02060c052602060c020015560006004600a60043560e05260c052604060c02060c052602060c020015560006005600a60043560e05260c052604060c02060c052602060c020015560006006600a60043560e05260c052604060c02060c052602060c02001556101405161016051610180516101a0516101c0516101e051610200516102205160043561024052610240516006580161437e565b6102a05261022052610200526101e0526101c0526101a0526101805261016052610140526102a0516102205260243561022051601481106139a457600080fd5b600b60c052602060c02001556004353b6139bd57600080fd5b60006000602463ce5494bb610240526024356102605261025c60006004355af16139e657600080fd5b6024356004357f9249d6a64288c19c5be5f4f1bb9b763ad4afac803128f1ef65b88acb13df9aa460006000a3005b6301681a62811415613b78573415613a2b57600080fd5b60043560a01c15613a3b57600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b610120516020026101600151331415613a7a5760018352613a8a565b8151600101808352811415613a5e575b505050610140511515613adc576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b60206101c060246370a0823161014052306101605261015c6004355afa613b0257600080fd5b601f3d11613b0f57600080fd5b6000506101c0516101e0526101405161016051610180516101a0516101c0516101e0516004356102005233610220526101e0516102405261024051610220516102005160065801613ed3565b6101e0526101c0526101a052610180526101605261014052600050005b635c975abb811415613b9b573415613b8f57600080fd5b60005460005260206000f35b63158ef93e811415613bbe573415613bb257600080fd5b60015460005260206000f35b63fbfa77cf811415613be1573415613bd557600080fd5b60025460005260206000f35b63d085835a811415613c04573415613bf857600080fd5b60035460005260206000f35b63b127df87811415613c27573415613c1b57600080fd5b60045460005260206000f35b63f851a440811415613c4a573415613c3e57600080fd5b60055460005260206000f35b63452a9320811415613c6d573415613c6157600080fd5b60065460005260206000f35b634d547ada811415613c90573415613c8457600080fd5b60075460005260206000f35b63fc7b9c18811415613cb3573415613ca757600080fd5b60085460005260206000f35b632df9eab9811415613cd6573415613cca57600080fd5b60095460005260206000f35b6339ebf823811415613dc8573415613ced57600080fd5b60043560a01c15613cfd57600080fd5b600a60043560e05260c052604060c0206101408080808460c052602060c0205481525050602081019050808060018560c052602060c020015481525050602081019050808060028560c052602060c020015481525050602081019050808060038560c052602060c020015481525050602081019050808060048560c052602060c020015481525050602081019050808060058560c052602060c020015481525050602081019050808060068560c052602060c02001548152505060e09050905060c05260c051610140f35b63ddf0b009811415613e04573415613ddf57600080fd5b60043560148110613def57600080fd5b600b60c052602060c020015460005260206000f35b63a598adff811415613e27573415613e1b57600080fd5b600c5460005260206000f35b505b005b61018052610140526101605260006101405114151515613e8a576308c379a06101a05260206101c052600e6101e0527f746f203d20302061646472657373000000000000000000000000000000000000610200526101e05060646101bcfd5b60006101a0526101a08051602001806101e08284600060045af1613ead57600080fd5b5050600060006101e05161020061016051610140515af1613ecd57600080fd5b61018051565b6101a05261014052610160526101805260006004610220527fa9059cbb000000000000000000000000000000000000000000000000000000006102405261022060048060208461028001018260208501600060045af15050805182019150506101605160208261028001015260208101905061018051602082610280010152602081019050806102805261028090508051602001806103208284600060045af1613f7c57600080fd5b505060206103e0610320516103406000610140515af1613f9b57600080fd5b60203d80821115613fac5780613fae565b815b905090506103c0526103c08051602001806101c08284600060045af1613fd357600080fd5b505060006101c0511115614067576101c0806020015160008251806020901315613ffc57600080fd5b809190121561400a57600080fd5b806020036101000a820490509050905015151515614067576308c379a061022052602061024052600f610260527f7472616e73666572206661696c656400000000000000000000000000000000006102805261026050606461023cfd5b6101a051565b610140524760085481818301101561408457600080fd5b8082019050905060005260005161014051565b610140526102a0366101603761042060006014818352015b61042051600b60c052602060c020015461040052600061040051181561410d57610400516101606103e051601481106140e757600080fd5b60200201526103e08051600181818301101561410257600080fd5b808201905090508152505b81516001018083528114156140af575b5050600b60c052602060c0206101605181556101805160018201556101a05160028201556101c05160038201556101e05160048201556102005160058201556102205160068201556102405160078201556102605160088201556102805160098201556102a051600a8201556102c051600b8201556102e051600c82015561030051600d82015561032051600e82015561034051600f8201556103605160108201556103805160118201556103a05160128201556103c05160138201555061014051565b61016052610140526013600b60c052602060c0200154151515614243576308c379a06101805260206101a052600b6101c0527f7175657565203e206d61780000000000000000000000000000000000000000006101e0526101c050606461019cfd5b610140516013600b60c052602060c0200155610140516101605160065801614097565b610160526101405260005061016051565b61016052610140526014610140511015156142d1576308c379a06101805260206101a05260086101c0527f69203e3d206d61780000000000000000000000000000000000000000000000006101e0526101c050606461019cfd5b600061014051601481106142e457600080fd5b600b60c052602060c02001541415151561433d576308c379a06101805260206101a052600d6101c0527f217a65726f2061646472657373000000000000000000000000000000000000006101e0526101c050606461019cfd5b6000610140516014811061435057600080fd5b600b60c052602060c0200155610140516101605160065801614097565b610160526101405260005061016051565b610160526101405261018060006014818352015b6101405161018051601481106143a757600080fd5b600b60c052602060c020015414156143cb5761018051600052505060005161016051565b8151600101808352811415614392575b50506308c379a06101805260206101a05260096101c0527f6e6f7420666f756e6400000000000000000000000000000000000000000000006101e0526101c050606461019cfd5b6101605261014052610140516101805260006101a0526101e060006014818352015b6101e051600b60c052602060c02001546101c0526101c0511515614467576146a4565b47610200526101805161020051101515614480576146a4565b6004600a6101c05160e05260c052604060c02060c052602060c0200154610220526101805161020051808210156144b657600080fd5b8082039050905061022051808211156144cf57806144d1565b815b90509050610240526102405115156144e857614694565b60206103006024632e1a7d4d61028052610240516102a05261029c60006101c0515af161451457600080fd5b601f3d1161452157600080fd5b600050610300516102605247610200518082101561453e57600080fd5b808203905090506102805260006102605111156145f0576101808051610260518082101561456b57600080fd5b808203905090508152506101a080516102605181818301101561458d57600080fd5b808201905090508152506004600a6101c05160e05260c052604060c02060c052602060c02001805461026051808210156145c657600080fd5b808203905090508155506008805461026051808210156145e557600080fd5b808203905090508155505b6004600a6101c05160e05260c052604060c02060c052602060c020018054610280518082101561461f57600080fd5b8082039050905081555060088054610280518082101561463e57600080fd5b80820390509050815550610220516102a052610240516102c052610260516102e05261028051610300526101c0517fa1db2d4488a8004dde12ff73253859b508b0458878ea4086047bab6672f9f1d760806102a0a25b8151600101808352811415614444575b50506101a05160005260005161016051565b610160526101405260015415156146ce5760016146e2565b600054156146dd5760016146e2565b600954155b156146f557600060005260005161016051565b6003600a6101405160e05260c052604060c02060c052602060c02001546101405161016051610180516006580161406d565b6101a0526101805261016052610140526101a051808202821582848304141761474f57600080fd5b80905090509050600954808061476457600080fd5b820490509050610180526004600a6101405160e05260c052604060c02060c052602060c02001546101a052610180516101a0511015156147ac57600060005260005161016051565b610180516101a051808210156147c157600080fd5b8082039050905047808211156147d757806147d9565b815b905090506101c0526005600a6101405160e05260c052604060c02060c052602060c02001546101c051101561481a576000600052600051610160515661485b565b6101c0516006600a6101405160e05260c052604060c02060c052602060c020015480821115614849578061484b565b815b9050905060005260005161016051565b005b6101605261014052600154151561487c57600060005260005161016051565b60095415156148ae576004600a6101405160e05260c052604060c02060c052602060c020015460005260005161016051565b6003600a6101405160e05260c052604060c02060c052602060c020015460085480820282158284830414176148e257600080fd5b8090509050905060095480806148f757600080fd5b820490509050610180526004600a6101405160e05260c052604060c02060c052602060c02001546101a0526000541561493e576101a0516000526000516101605156614987565b610180516101a05111151561495f5760006000526000516101605156614987565b6101a051610180518082101561497457600080fd5b8082039050905060005260005161016051565b00

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

00000000000000000000000086d10751b18f3fe331c146546868a07224a8598b00000000000000000000000086d10751b18f3fe331c146546868a07224a8598b0000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : guardian (address): 0x86d10751B18F3fE331C146546868a07224A8598B
Arg [1] : worker (address): 0x86d10751B18F3fE331C146546868a07224A8598B
Arg [2] : oldFundManager (address): 0x0000000000000000000000000000000000000000

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000086d10751b18f3fe331c146546868a07224a8598b
Arg [1] : 00000000000000000000000086d10751b18f3fe331c146546868a07224a8598b
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000


Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.