ETH Price: $3,404.50 (-1.98%)
Gas: 5 Gwei

Contract

0x9501B3a6DcE1Bbe6094356391F3992e08EE90E3a
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Repay Vault178024442023-07-30 1:02:59355 days ago1690678979IN
0x9501B3a6...08EE90E3a
0 ETH0.0009731316.03929286
Report To Vault178023292023-07-30 0:39:47355 days ago1690677587IN
0x9501B3a6...08EE90E3a
0 ETH0.0012794116.76034753
Repay Vault176954022023-07-15 0:58:47370 days ago1689382727IN
0x9501B3a6...08EE90E3a
0 ETH0.0007793512.84283241
Report To Vault176953402023-07-15 0:46:11370 days ago1689381971IN
0x9501B3a6...08EE90E3a
0 ETH0.0010177313.33227566
Repay Vault175886252023-06-30 0:47:59385 days ago1688086079IN
0x9501B3a6...08EE90E3a
0 ETH0.0011861719.54675253
Report To Vault175885882023-06-30 0:40:35385 days ago1688085635IN
0x9501B3a6...08EE90E3a
0 ETH0.0018303719.58961292
Report To Vault174818192023-06-15 0:45:59400 days ago1686789959IN
0x9501B3a6...08EE90E3a
0 ETH0.0010690714.00711193
Repay Vault173753942023-05-31 0:46:35415 days ago1685493995IN
0x9501B3a6...08EE90E3a
0 ETH0.0017514828.86243192
Report To Vault173753632023-05-31 0:40:11415 days ago1685493611IN
0x9501B3a6...08EE90E3a
0 ETH0.0032125434.38675463
Repay Vault172417332023-05-12 4:19:59434 days ago1683865199IN
0x9501B3a6...08EE90E3a
0 ETH0.0038020362.65303599
Report To Vault172417172023-05-12 4:16:47434 days ago1683865007IN
0x9501B3a6...08EE90E3a
0 ETH0.0057115561.12802856
Repay Vault169651522023-04-03 1:08:23473 days ago1680484103IN
0x9501B3a6...08EE90E3a
0 ETH0.0009750316.06736686
Report To Vault169651042023-04-03 0:58:35473 days ago1680483515IN
0x9501B3a6...08EE90E3a
0 ETH0.001302717.06321585
Repay Vault169437132023-03-31 0:47:11476 days ago1680223631IN
0x9501B3a6...08EE90E3a
0 ETH0.001490824.56666138
Report To Vault169436812023-03-31 0:40:47476 days ago1680223247IN
0x9501B3a6...08EE90E3a
0 ETH0.0017785123.29550698
Borrow From Vaul...169251052023-03-28 10:00:35479 days ago1679997635IN
0x9501B3a6...08EE90E3a
0 ETH0.0017476223.8323091
Repay Vault169224102023-03-28 0:55:23479 days ago1679964923IN
0x9501B3a6...08EE90E3a
0 ETH0.0013056321.50679307
Report To Vault169223782023-03-28 0:48:47479 days ago1679964527IN
0x9501B3a6...08EE90E3a
0 ETH0.0018606824.37170182
Borrow From Vaul...169013742023-03-25 2:00:35482 days ago1679709635IN
0x9501B3a6...08EE90E3a
0 ETH0.0009616112.71963881
Repay Vault169010232023-03-25 0:49:35482 days ago1679705375IN
0x9501B3a6...08EE90E3a
0 ETH0.0008322113.71396842
Report To Vault169009902023-03-25 0:42:59482 days ago1679704979IN
0x9501B3a6...08EE90E3a
0 ETH0.001235416.18167481
Repay Vault168797182023-03-22 0:59:11485 days ago1679446751IN
0x9501B3a6...08EE90E3a
0 ETH0.0007566112.4631954
Report To Vault168796662023-03-22 0:48:47485 days ago1679446127IN
0x9501B3a6...08EE90E3a
0 ETH0.001017313.32499299
Borrow From Vaul...168584132023-03-19 1:09:59488 days ago1679188199IN
0x9501B3a6...08EE90E3a
0 ETH0.0010214413.51100026
Report To Vault168583962023-03-19 1:06:35488 days ago1679187995IN
0x9501B3a6...08EE90E3a
0 ETH0.0010587113.86732376
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
203375732024-07-19 2:25:2310 hrs ago1721355923
0x9501B3a6...08EE90E3a
0.10115 ETH
203375732024-07-19 2:25:2310 hrs ago1721355923
0x9501B3a6...08EE90E3a
0.10115 ETH
201501542024-06-22 22:15:1126 days ago1719094511
0x9501B3a6...08EE90E3a
0.002184 ETH
201501542024-06-22 22:15:1126 days ago1719094511
0x9501B3a6...08EE90E3a
0.002184 ETH
201501272024-06-22 22:09:4726 days ago1719094187
0x9501B3a6...08EE90E3a
0.001091 ETH
201501272024-06-22 22:09:4726 days ago1719094187
0x9501B3a6...08EE90E3a
0.001091 ETH
198529592024-05-12 9:10:4768 days ago1715505047
0x9501B3a6...08EE90E3a
0.00537016 ETH
198529592024-05-12 9:10:4768 days ago1715505047
0x9501B3a6...08EE90E3a
0.00537016 ETH
198529292024-05-12 9:04:4768 days ago1715504687
0x9501B3a6...08EE90E3a
0.0036065 ETH
198529292024-05-12 9:04:4768 days ago1715504687
0x9501B3a6...08EE90E3a
0.0036065 ETH
198289692024-05-09 0:39:5971 days ago1715215199
0x9501B3a6...08EE90E3a
0.00532301 ETH
198289692024-05-09 0:39:5971 days ago1715215199
0x9501B3a6...08EE90E3a
0.00532301 ETH
197927192024-05-03 22:58:5976 days ago1714777139
0x9501B3a6...08EE90E3a
0.00159242 ETH
197927192024-05-03 22:58:5976 days ago1714777139
0x9501B3a6...08EE90E3a
0.00159242 ETH
197850472024-05-02 21:14:2377 days ago1714684463
0x9501B3a6...08EE90E3a
0.01068415 ETH
197850472024-05-02 21:14:2377 days ago1714684463
0x9501B3a6...08EE90E3a
0.01068415 ETH
197699652024-04-30 18:38:2379 days ago1714502303
0x9501B3a6...08EE90E3a
0.02782198 ETH
197699652024-04-30 18:38:2379 days ago1714502303
0x9501B3a6...08EE90E3a
0.02782198 ETH
197698222024-04-30 18:09:3579 days ago1714500575
0x9501B3a6...08EE90E3a
0.05350381 ETH
197698222024-04-30 18:09:3579 days ago1714500575
0x9501B3a6...08EE90E3a
0.05350381 ETH
196565132024-04-14 21:40:2395 days ago1713130823
0x9501B3a6...08EE90E3a
0.10981514 ETH
196565132024-04-14 21:40:2395 days ago1713130823
0x9501B3a6...08EE90E3a
0.10981514 ETH
193523862024-03-03 4:54:23138 days ago1709441663
0x9501B3a6...08EE90E3a
0.1087257 ETH
193523862024-03-03 4:54:23138 days ago1709441663
0x9501B3a6...08EE90E3a
0.1087257 ETH
192364482024-02-15 22:57:11154 days ago1708037831
0x9501B3a6...08EE90E3a
0.03216455 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Vyper_contract

Compiler Version
vyper:0.2.12

Optimization Enabled:
N/A

Other Settings:
GNU AGPLv3 license

Contract Source Code (Vyper language format)

# @version 0.2.12

"""
@title Unagii EthFundManager 0.1.1
@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__():
    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
    self.nextTimeLock = ZERO_ADDRESS
    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
@nonreentrant("lock")
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

[{"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":59029},{"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":227174},{"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}]

6060614b04610140396020614b0460c03960c05160a01c1561002057600080fd5b60206020614b040160c03960c05160a01c1561003b57600080fd5b60206040614b040160c03960c05160a01c1561005657600080fd5b3360035533600555610140516006556101605160075560006101805118156101155761018051600c5573eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6020610200600463fc0c546a6101a0526101bc600c545afa6100b557600080fd5b601f3d116100c257600080fd5b60005061020051141515610115576308c379a061022052602061024052601d610260527f6f6c642066756e64206d616e6167657220746f6b656e20213d204554480000006102805261026050606461023cfd5b614aec56600436101561000d57613e45565b600035601c52600051638129fc1c8114156105ac57600154151515610071576308c379a061014052602061016052600b610180527f696e697469616c697a65640000000000000000000000000000000000000000006101a05261018050606461015cfd5b600c54151561012057600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156100b957600183526100c9565b815160010180835281141561009d575b50505061014051151561011b576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b6105a5565b600c5433141515610170576308c379a0610140526020610160526011610180527f216f6c642066756e64206d616e616765720000000000000000000000000000006101a05261018050606461015cfd5b60206101a0600463fbfa77cf6101405261015c600c545afa61019157600080fd5b601f3d1161019e57600080fd5b6000506101a0516002541415156101f4576308c379a06101c05260206101e052601f610200527f6f6c642066756e64206d616e61676572207661756c7420213d207661756c7400610220526102005060646101dcfd5b60206101a0600463fc7b9c186101405261015c600c545afa61021557600080fd5b601f3d1161022257600080fd5b6000506101a05160085560206101a06004632df9eab96101405261015c600c545afa61024d57600080fd5b601f3d1161025a57600080fd5b6000506101a05160095561014060006014818352015b6020610200602463ddf0b00961018052610140516101a05261019c600c545afa61029957600080fd5b601f3d116102a657600080fd5b60005061020051610160526101605115156102c0576105a2565b3060206101e06004636209ec2d6101805261019c610160515afa6102e357600080fd5b601f3d116102f057600080fd5b6000506101e051141515610343576308c379a061020052602061022052601d610240527f73747261746567792066756e64206d616e6167657220213d2073656c660000006102605261024050606461021cfd5b60e0366101803760e06102e060246339ebf82361026052610160516102805261027c600c545afa61037357600080fd5b60df3d1161038057600080fd5b6102e080808080516103c0525050602081019050808080516103e0525050602081019050808080516104005250506020810190508080805161042052505060208101905080808051610440525050602081019050808080516104605250506020810190508080805161048052505050506000506103c080516101805280602001516101a05280604001516101c05280606001516101e0528060800151610200528060a00151610220528060c001516102405250610180511515610482576308c379a06102605260206102805260096102a0527f21617070726f76656400000000000000000000000000000000000000000000006102c0526102a050606461027cfd5b6101a05115156104d1576308c379a06102605260206102805260076102a0527f21616374697665000000000000000000000000000000000000000000000000006102c0526102a050606461027cfd5b6101c0511515610520576308c379a061026052602061028052600a6102a0527f21616374697661746564000000000000000000000000000000000000000000006102c0526102a050606461027cfd5b61016051610140516014811061053557600080fd5b600b60c052602060c0200155600a6101605160e05260c052604060c02060c052602060c0206001815560016001820155600160028201556101e0516003820155610200516004820155610220516005820155610240516006820155505b8151600101808352811415610270575b50505b6001600155005b63371fd8e681141561079e576001541515610606576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b600a3360e05260c052604060c02060c052602060c020541515610668576308c379a0610140526020610160526009610180527f21617070726f76656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b346004351415156106b8576308c379a0610140526020610160526013610180527f616d6f756e7420213d206d73672e76616c7565000000000000000000000000006101a05261018050606461015cfd5b6000600435111515610709576308c379a0610140526020610160526009610180527f7265706179203d203000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6004600a3360e05260c052604060c02060c052602060c0200180546004358082101561073457600080fd5b80820390509050815550600880546004358082101561075257600080fd5b808203905090508155506004356101405260043561016052337f77c6871227e5d2dec8dadd5354f78453203e22e669cd0ec4c19d9a8c5edb31d06040610140a260043560005260206000f35b63753c09858114156109f35760015415156107f8576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b6001600a3360e05260c052604060c02060c052602060c0200154151561085d576308c379a0610140526020610160526007610180527f21616374697665000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b60006004351015156108725760243515610875565b60005b15610881576001610899565b60043515156108965760006024351015610899565b60005b15156108e4576308c379a0610140526020610160526011610180527f6761696e20616e64206c6f7373203e20300000000000000000000000000000006101a05261018050606461015cfd5b34600435141515610934576308c379a0610140526020610160526011610180527f6761696e20213d206d73672e76616c75650000000000000000000000000000006101a05261018050606461015cfd5b60006004351115610944576109a3565b600060243511156109a3576004600a3360e05260c052604060c02060c052602060c0200180546024358082101561097a57600080fd5b80820390509050815550600880546024358082101561099857600080fd5b808203905090508155505b60406004610140376004600a3360e05260c052604060c02060c052602060c020015461018052337f36d8646df39e8831ab3926651692b6a0ea874e6cc807ea1c428fcf2ba32859f86060610140a2005b63fc0c546a811415610a28573415610a0a57600080fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60005260206000f35b63ce5494bb811415610e1b573415610a3f57600080fd5b60043560a01c15610a4f57600080fd5b60035433141515610a9f576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6001541515610aed576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b6000541515610b3b576308c379a0610140526020610160526007610180527f21706175736564000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60206101a0600463fc0c546a6101405261015c6004355afa610b7157600080fd5b601f3d11610b7e57600080fd5b6000506101a051141515610bd1576308c379a06101c05260206101e052601d610200527f6e65772066756e64206d616e6167657220746f6b656e20213d20455448000000610220526102005060646101dcfd5b60025460206101a0600463fbfa77cf6101405261015c6004355afa610bf557600080fd5b601f3d11610c0257600080fd5b6000506101a051141515610c55576308c379a06101c05260206101e052601f610200527f6e65772066756e64206d616e61676572207661756c7420213d207661756c7400610220526102005060646101dcfd5b61016060006014818352015b61016051600b60c052602060c020015461014052610140511515610c8457610d3e565b60043560206101e06004636209ec2d6101805261019c610140515afa610ca957600080fd5b601f3d11610cb657600080fd5b6000506101e051141515610d2e576308c379a0610200526020610220526029610240527f73747261746567792066756e64206d616e6167657220213d206e65772066756e610260527f64206d616e6167657200000000000000000000000000000000000000000000006102805261024050608461021cfd5b8151600101808352811415610c61575b505047610140526004353b610d5257600080fd5b600060006004638129fc1c6101605261017c610140516004355af1610d7657600080fd5b6004356101605261014051610180526008546101a0527fd44a6dd2bfac4f6bc02d116d96aa12c24e8580626b95cb6a2f543f18cb61bd4c6060610160a1600060085561018060006014818352015b61018051600b60c052602060c020015461016052610160511515610de757610e17565b60006004600a6101605160e05260c052604060c02060c052602060c02001555b8151600101808352811415610dc4575b5050005b6347a02a44811415610ec8573415610e3257600080fd5b60043560a01c15610e4257600080fd5b60035433141515610e92576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b600435600455600435610140527f5c06d5a6f95a574bb95a214c88933831c63fcd6f6c5d1d61a21efb92be19bc2c6020610140a1005b631e39831e811415610f66573415610edf57600080fd5b60045433141515610f2f576308c379a061014052602061016052600f610180527f216e6578742074696d65206c6f636b00000000000000000000000000000000006101a05261018050606461015cfd5b33600355600060045533610140527f77b69635186d51fb2d031f67a7995795c8384acb800219c7d30861125d154f026020610140a1005b63704b6c02811415611064573415610f7d57600080fd5b60043560a01c15610f8d57600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b610120516020026101600151331415610fcc5760018352610fdc565b8151600101808352811415610fb0575b50505061014051151561102e576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600435600555600435610140527f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a16020610140a1005b638a0dac4a81141561116257341561107b57600080fd5b60043560a01c1561108b57600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156110ca57600183526110da565b81516001018083528114156110ae575b50505061014051151561112c576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600435600655600435610140527f31845eceb9cde510c7e8b37f76301c688feb70bc9653aa4c28a3734999840fd86020610140a1005b63c26f6d4481141561126057341561117957600080fd5b60043560a01c1561118957600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156111c857600183526111d8565b81516001018083528114156111ac575b50505061014051151561122a576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600435600755600435610140527fcabc8521621c89fc973d8f1e8455da2ce64a666915af33e0ebaa69cd5215083b6020610140a1005b63bedb86fb81141561136557341561127757600080fd5b60043560011c1561128757600080fd5b60035461016052600554610180526006546101a05260006101405261014061012060006003818352015b6101205160200261016001513314156112cd57600183526112dd565b81516001018083528114156112b1575b50505061014051151561132f576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b600435600055600435610140527f140eb9f8b591138e129e4caf389c92df4f0545b902523eee9e63153ecdb2026e6020610140a1005b636817031b8114156114a857341561137c57600080fd5b60043560a01c1561138c57600080fd5b600354331415156113dc576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60206101a0600463fc0c546a6101405261015c6004355afa61141257600080fd5b601f3d1161141f57600080fd5b6000506101a051141515611472576308c379a06101c05260206101e0526012610200527f7661756c7420746f6b656e20213d204554480000000000000000000000000000610220526102005060646101dcfd5b600435600255600435610140527fd459c7242e23d490831b5676a611c4342d899d28f342d89ae80793e56a930f306020610140a1005b6301e1d1148114156114d95734156114bf57600080fd5b600658016140b6565b610140526101405160005260206000f35b633b8ae39781141561173f5734156114f057600080fd5b60043560a01c1561150057600080fd5b60035433141515611550576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b600a60043560e05260c052604060c02060c052602060c020541515156115b5576308c379a0610140526020610160526008610180527f617070726f7665640000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b3060206101a06004636209ec2d6101405261015c6004355afa6115d757600080fd5b601f3d116115e457600080fd5b6000506101a051141515611637576308c379a06101c05260206101e052601d610200527f73747261746567792066756e64206d616e6167657220213d2074686973000000610220526102005060646101dcfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60206101a0600463fc0c546a6101405261015c6004355afa61166d57600080fd5b601f3d1161167a57600080fd5b6000506101a0511415156116cd576308c379a06101c05260206101e0526015610200527f737472617465677920746f6b656e20213d204554480000000000000000000000610220526102005060646101dcfd5b600a60043560e05260c052604060c02060c052602060c02060018155600060018201556000600282015560006003820155600060048201556000600582015560006006820155506004357f4c6d0fbb89373829bc56000a87d561331bca06f725fd8861d055215ed90f209b60006000a2005b63bb994d4881141561191957341561175657600080fd5b60043560a01c1561176657600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156117a557600183526117b5565b8151600101808352811415611789575b505050610140511515611807576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600a60043560e05260c052604060c02060c052602060c02054151561186b576308c379a0610140526020610160526009610180527f21617070726f76656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6001600a60043560e05260c052604060c02060c052602060c02001541515156118d3576308c379a0610140526020610160526006610180527f61637469766500000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6000600a60043560e05260c052604060c02060c052602060c020556004357f7d3e35e217272b8400fec8397b08eb8c60c4db9ae834af14ac0fc9c0bb914a8f60006000a2005b635f1ac310811415611c6757341561193057600080fd5b60043560a01c1561194057600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b61012051602002610160015133141561197f576001835261198f565b8151600101808352811415611963575b5050506101405115156119e1576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600a60043560e05260c052604060c02060c052602060c020541515611a45576308c379a0610140526020610160526009610180527f21617070726f76656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6001600a60043560e05260c052604060c02060c052602060c0200154151515611aad576308c379a0610140526020610160526006610180527f61637469766500000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b612710600954602435818183011015611ac557600080fd5b8082019050905011151515611b19576308c379a061014052602061016052600b610180527f726174696f203e206d61780000000000000000000000000000000000000000006101a05261018050606461015cfd5b60643560443511151515611b6c576308c379a0610140526020610160526017610180527f6d696e20626f72726f77203e206d617820626f72726f770000000000000000006101a05261018050606461015cfd5b60043561014052610140516006580161422a565b60005060016001600a60043560e05260c052604060c02060c052602060c020015560016002600a60043560e05260c052604060c02060c052602060c02001556024356003600a60043560e05260c052604060c02060c052602060c02001556044356005600a60043560e05260c052604060c02060c052602060c02001556064356006600a60043560e05260c052604060c02060c052602060c020015560098054602435818183011015611c3257600080fd5b808201905090508155506004357fa3cbd67e6583e6c7ef034e5f87b7b40b0a0e87182a8377dfb42e59aa414c6cd560006000a2005b63b22439f5811415611e9b573415611c7e57600080fd5b60043560a01c15611c8e57600080fd5b60035461016052600554610180526006546101a05260006101405261014061012060006003818352015b610120516020026101600151331415611cd45760018352611ce4565b8151600101808352811415611cb8575b505050610140511515611d36576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b6001600a60043560e05260c052604060c02060c052602060c02001541515611d9d576308c379a0610140526020610160526007610180527f21616374697665000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6004356101405261014051600658016143c7565b6101a0526101a0516101c0526101405161016051610180516101a0516101c0516101c0516101e0526101e051600658016142c0565b6101c0526101a05261018052610160526101405260005060006001600a60043560e05260c052604060c02060c052602060c0200155600980546003600a60043560e05260c052604060c02060c052602060c020015480821015611e4857600080fd5b8082039050905081555060006003600a60043560e05260c052604060c02060c052602060c02001556004357fff2f97c1f3529c6b02543b63f7efae22cdc885048adf65c679a1c5c4ea3b2fa860006000a2005b63c5cde90b811415612366573415611eb257600080fd5b6000610120525b610120516004013560a01c15611ece57600080fd5b6020610120510161012052610280610120511015611eeb57611eb9565b600354610160526005546101805260006101405261014061012060006002818352015b610120516020026101600151331415611f2a5760018352611f3a565b8151600101808352811415611f0e575b505050610140511515611f8c576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b60006101405261016060006014818352015b60046101605160148110611fb157600080fd5b602002013561018052610180511515611fda57610140511515611fd5576001610140525b61202a565b6101405115151561202a576308c379a06101a05260206101c05260036101e0527f6761700000000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b8151600101808352811415611f9e575b505061016060006014818352015b610160516014811061205957600080fd5b600b60c052602060c0200154610180526004610160516014811061207c57600080fd5b60200201356101a0526101805115156120e4576101a0511515156120df576308c379a06101c05260206101e0526008610200527f6e657720213d2030000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b612137565b60006101a05114151515612137576308c379a06101c05260206101e0526007610200527f6e6577203d203000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b8151600101808352811415612048575b505061016060006014818352015b6004610160516014811061216857600080fd5b60200201356101805261018051151561218057612218565b6001600a6101805160e05260c052604060c02060c052602060c020015415156121e8576308c379a06101a05260206101c05260076101e0527f2161637469766500000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b60006001600a6101805160e05260c052604060c02060c052602060c02001555b8151600101808352811415612155575b505061016060006014818352015b6004610160516014811061223957600080fd5b602002013561018052610180511515612251576122a2565b60016001600a6101805160e05260c052604060c02060c052602060c020015561018051610160516014811061228557600080fd5b600b60c052602060c02001555b8151600101808352811415612226575b505060043561016052602435610180526044356101a0526064356101c0526084356101e05260a4356102005260c4356102205260e4356102405261010435610260526101243561028052610144356102a052610164356102c052610184356102e0526101a435610300526101c435610320526101e4356103405261020435610360526102243561038052610244356103a052610264356103c0527fa03ab32749bdff946d914bdbc7fadedf2bdeb6a83f2b56effa25a0eae1012675610280610160a1005b63260829c081141561269357341561237d57600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156123bc57600183526123cc565b81516001018083528114156123a0575b50505061014051151561241e576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b61014060006014818352015b610140516014811061243b57600080fd5b600b60c052602060c020015415156124b1576004610140516014811061246057600080fd5b60200201351515156124b1576308c379a061016052602061018052600f6101a0527f6465627420726174696f20213d203000000000000000000000000000000000006101c0526101a050606461017cfd5b815160010180835281141561242a575b505060006101405261016060006014818352015b61016051601481106124e657600080fd5b600b60c052602060c02001546101805261018051151561250557612575565b6004610160516014811061251857600080fd5b60200201356101a0526101a0516003600a6101805160e05260c052604060c02060c052602060c020015561014080516101a05181818301101561255a57600080fd5b808201905090508152505b81516001018083528114156124d5575b505061014051600955612710600954111515156125d1576308c379a061016052602061018052600b6101a0527f746f74616c203e206d61780000000000000000000000000000000000000000006101c0526101a050606461017cfd5b60043561016052602435610180526044356101a0526064356101c0526084356101e05260a4356102005260c4356102205260e4356102405261010435610260526101243561028052610144356102a052610164356102c052610184356102e0526101a435610300526101c435610320526101e4356103405261020435610360526102243561038052610244356103a052610264356103c0527f8edb07c0d6dfa3d8e47f8faaeffa94a7c21b80ebb98ccf264581f64c8270a906610280610160a1005b63da17143181141561288a5734156126aa57600080fd5b60043560a01c156126ba57600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156126f95760018352612709565b81516001018083528114156126dd575b50505061014051151561275b576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600a60043560e05260c052604060c02060c052602060c0205415156127bf576308c379a0610140526020610160526009610180527f21617070726f76656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b60443560243511151515612812576308c379a0610140526020610160526017610180527f6d696e20626f72726f77203e206d617820626f72726f770000000000000000006101a05261018050606461015cfd5b6024356005600a60043560e05260c052604060c02060c052602060c02001556044356006600a60043560e05260c052604060c02060c052602060c020015560243561014052604435610160526004357ffedf8d30e937b57e4e95271e9f17cfab1a1315ac6d612ef72912405e9524f7d56040610140a2005b63505b6a76811415612a685734156128a157600080fd5b60015415156128ef576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60035461016052600554610180526007546101a05260006101405261014061012060006003818352015b6101205160200261016001513314156129355760018352612945565b8151600101808352811415612919575b505050610140511515612997576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b60206101e0602463c5ebeaec610160526004356101805261017c60006002545af16129c157600080fd5b601f3d116129ce57600080fd5b6000506101e051610140526024356101405110151515612a2d576308c379a061016052602061018052600e6101a0527f626f72726f776564203c206d696e0000000000000000000000000000000000006101c0526101a050606461017cfd5b6004356101605261014051610180526002547fb87de9931230544a0b3a00e753f5ab70f79a54e84e47bcad4239e1c1c97588d36040610160a2005b6348b8a1f9811415612c47573415612a7f57600080fd5b6001541515612acd576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60035461016052600554610180526007546101a05260006101405261014061012060006003818352015b610120516020026101600151331415612b135760018352612b23565b8151600101808352811415612af7575b505050610140511515612b75576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b60206101e0602463371fd8e6610160526004356101805261017c6004356002545af1612ba057600080fd5b601f3d11612bad57600080fd5b6000506101e051610140526024356101405110151515612c0c576308c379a061016052602061018052600c6101a0527f726570616964203c206d696e00000000000000000000000000000000000000006101c0526101a050606461017cfd5b6004356101605261014051610180526002547f447949f39e7c140dbba1469e2e065abd8a278ac561449a4fcd1c51f5aadc91d86040610160a2005b63d5b6e219811415612f31573415612c5e57600080fd5b6001541515612cac576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60035461016052600554610180526007546101a05260006101405261014061012060006003818352015b610120516020026101600151331415612cf25760018352612d02565b8151600101808352811415612cd6575b505050610140511515612d54576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b61014051600658016140b6565b6101605261014052610160516101405260043561014051101515612d8d57602435610140511115612d90565b60005b1515612ddb576308c379a06101605260206101805260126101a0527f746f74616c206e6f7420696e2072616e676500000000000000000000000000006101c0526101a050606461017cfd5b60206101e06004630dca59c16101805261019c6002545afa612dfc57600080fd5b601f3d11612e0957600080fd5b6000506101e051610160526040366101803761016051610140511115612e6357610140516101605180821015612e3e57600080fd5b808203905090504780821115612e545780612e56565b815b9050905061018052612e84565b610160516101405180821015612e7857600080fd5b808203905090506101a0525b6000610180511115612e97576001612e9f565b60006101a051115b15612ee5576002543b612eb157600080fd5b60006000604463753c09856101c052610180516101e0526101a051610200526101dc610180516002545af1612ee557600080fd5b610140516101c052610160516101e05261018051610200526101a051610220526002547fd94ac81cdb49ea558800854e3bfd1aedf2a0a02abc471047c34e382fd5137cbd60806101c0a2005b632e1a7d4d811415613218573415612f4857600080fd5b6001541515612f96576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60025433141515612fe6576308c379a0610140526020610160526006610180527f217661756c7400000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b61014051600658016140b6565b610160526101405261016051610140526004356101405180821115613018578061301a565b815b9050905061016052600061016051111515613074576308c379a06101805260206101a052600c6101c0527f7769746864726177203d203000000000000000000000000000000000000000006101e0526101c050606461019cfd5b60206102006004630dca59c16101a0526101bc6002545afa61309557600080fd5b601f3d116130a257600080fd5b600050610200516101805260006101a052610140516101805111156130e2576101805161014051808210156130d657600080fd5b808203905090506101a0525b476101c0526101c051610160511115613176576101a080516101405161016051610180516101a0516101c051610160516101e0526101e0516006580161446b565b610240526101c0526101a0526101805261016052610140526102405181818301101561314e57600080fd5b8082019050905081525061016051478082111561316b578061316d565b815b90509050610160525b60006101605111156131cc576101405161016051610180516101a0516101c051336101e0526101605161020052610200516101e05160065801613e74565b6101c0526101a0526101805261016052610140526000505b6004356101e05261016051610200526101a05161022052337f02f25270a4d87bea75db541cdfe559334a275b4a233520ed6c0a2429667cca9460606101e0a26101a05160005260206000f35b63f19f054281141561326457341561322f57600080fd5b60043560a01c1561323f57600080fd5b6004356101405261014051600658016146ff565b6101a0526101a05160005260206000f35b63c6f2be588114156132b057341561327b57600080fd5b60043560a01c1561328b57600080fd5b6004356101405261014051600658016148a6565b6101a0526101a05160005260206000f35b639a78e72e8114156132fc5734156132c757600080fd5b60043560a01c156132d757600080fd5b6004600a60043560e05260c052604060c02060c052602060c020015460005260206000f35b63c5ebeaec81141561358157600d541561331557600080fd5b6001600d55341561332557600080fd5b6001541515613373576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b6000541515156133c2576308c379a0610140526020610160526006610180527f70617573656400000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6001600a3360e05260c052604060c02060c052602060c02001541515613427576308c379a0610140526020610160526007610180527f21616374697665000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b60043561014051336101605261016051600658016146ff565b6101c052610140526101c0518082111561345a578061345c565b815b90509050610140526000610140511115156134b6576308c379a061016052602061018052600a6101a0527f626f72726f77203d2030000000000000000000000000000000000000000000006101c0526101a050606461017cfd5b6101405133610160526101405161018052610180516101605160065801613e74565b610140526000506004600a3360e05260c052604060c02060c052602060c0200180546101405181818301101561350d57600080fd5b80820190509050815550600880546101405181818301101561352e57600080fd5b80820190509050815550600435610160526101405161018052337fe1979fe4c35e0cef342fef5668e2c8e7a7e9f5d5d1ca8fee0ac6c427fa4153af6040610160a2610140516000526000600d5560206000f35b636cb56d19811415613a3057341561359857600080fd5b60043560a01c156135a857600080fd5b60243560a01c156135b857600080fd5b6001541515613606576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156136455760018352613655565b8151600101808352811415613629575b5050506101405115156136a7576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b6001600a60043560e05260c052604060c02060c052602060c0200154151561370e576308c379a061014052602061016052600b610180527f6f6c6420216163746976650000000000000000000000000000000000000000006101a05261018050606461015cfd5b600a60243560e05260c052604060c02060c052602060c020541515613772576308c379a061014052602061016052600d610180527f6e65772021617070726f766564000000000000000000000000000000000000006101a05261018050606461015cfd5b6002600a60243560e05260c052604060c02060c052602060c02001541515156137da576308c379a0610140526020610160526009610180527f61637469766174656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b610140600a60043560e05260c052604060c0208060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015260048160c052602060c0200154826080015260058160c052602060c02001548260a0015260068160c052602060c02001548260c001525050600a60243560e05260c052604060c02060c052602060c0206001815560016001820155600160028201556101a05160038201556101c05160048201556101e05160058201556102005160068201555060006001600a60043560e05260c052604060c02060c052602060c020015560006003600a60043560e05260c052604060c02060c052602060c020015560006004600a60043560e05260c052604060c02060c052602060c020015560006005600a60043560e05260c052604060c02060c052602060c020015560006006600a60043560e05260c052604060c02060c052602060c02001556101405161016051610180516101a0516101c0516101e05161020051610220516004356102405261024051600658016143c7565b6102a05261022052610200526101e0526101c0526101a0526101805261016052610140526102a0516102205260243561022051601481106139c057600080fd5b600b60c052602060c02001556004353b6139d957600080fd5b60006000602463ce5494bb610240526024356102605261025c60006004355af1613a0257600080fd5b6024356004357f9249d6a64288c19c5be5f4f1bb9b763ad4afac803128f1ef65b88acb13df9aa460006000a3005b6301681a62811415613b94573415613a4757600080fd5b60043560a01c15613a5757600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b610120516020026101600151331415613a965760018352613aa6565b8151600101808352811415613a7a575b505050610140511515613af8576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b60206101c060246370a0823161014052306101605261015c6004355afa613b1e57600080fd5b601f3d11613b2b57600080fd5b6000506101c0516101e0526101405161016051610180516101a0516101c0516101e0516004356102005233610220526101e0516102405261024051610220516102005160065801613f1c565b6101e0526101c0526101a052610180526101605261014052600050005b635c975abb811415613bb7573415613bab57600080fd5b60005460005260206000f35b63158ef93e811415613bda573415613bce57600080fd5b60015460005260206000f35b63fbfa77cf811415613bfd573415613bf157600080fd5b60025460005260206000f35b63d085835a811415613c20573415613c1457600080fd5b60035460005260206000f35b63b127df87811415613c43573415613c3757600080fd5b60045460005260206000f35b63f851a440811415613c66573415613c5a57600080fd5b60055460005260206000f35b63452a9320811415613c89573415613c7d57600080fd5b60065460005260206000f35b634d547ada811415613cac573415613ca057600080fd5b60075460005260206000f35b63fc7b9c18811415613ccf573415613cc357600080fd5b60085460005260206000f35b632df9eab9811415613cf2573415613ce657600080fd5b60095460005260206000f35b6339ebf823811415613de4573415613d0957600080fd5b60043560a01c15613d1957600080fd5b600a60043560e05260c052604060c0206101408080808460c052602060c0205481525050602081019050808060018560c052602060c020015481525050602081019050808060028560c052602060c020015481525050602081019050808060038560c052602060c020015481525050602081019050808060048560c052602060c020015481525050602081019050808060058560c052602060c020015481525050602081019050808060068560c052602060c02001548152505060e09050905060c05260c051610140f35b63ddf0b009811415613e20573415613dfb57600080fd5b60043560148110613e0b57600080fd5b600b60c052602060c020015460005260206000f35b63a598adff811415613e43573415613e3757600080fd5b600c5460005260206000f35b505b3461014052337fefc0288202e432ade6bf71491d0001d7e389ad4f8e4e9c7aa038dd1a563efc606020610140a2005b61018052610140526101605260006101405114151515613ed3576308c379a06101a05260206101c052600e6101e0527f746f203d20302061646472657373000000000000000000000000000000000000610200526101e05060646101bcfd5b60006101a0526101a08051602001806101e08284600060045af1613ef657600080fd5b5050600060006101e05161020061016051610140515af1613f1657600080fd5b61018051565b6101a05261014052610160526101805260006004610220527fa9059cbb000000000000000000000000000000000000000000000000000000006102405261022060048060208461028001018260208501600060045af15050805182019150506101605160208261028001015260208101905061018051602082610280010152602081019050806102805261028090508051602001806103208284600060045af1613fc557600080fd5b505060206103e0610320516103406000610140515af1613fe457600080fd5b60203d80821115613ff55780613ff7565b815b905090506103c0526103c08051602001806101c08284600060045af161401c57600080fd5b505060006101c05111156140b0576101c080602001516000825180602090131561404557600080fd5b809190121561405357600080fd5b806020036101000a8204905090509050151515156140b0576308c379a061022052602061024052600f610260527f7472616e73666572206661696c656400000000000000000000000000000000006102805261026050606461023cfd5b6101a051565b61014052476008548181830110156140cd57600080fd5b8082019050905060005260005161014051565b610140526102a0366101603761042060006014818352015b61042051600b60c052602060c020015461040052600061040051181561415657610400516101606103e0516014811061413057600080fd5b60200201526103e08051600181818301101561414b57600080fd5b808201905090508152505b81516001018083528114156140f8575b5050600b60c052602060c0206101605181556101805160018201556101a05160028201556101c05160038201556101e05160048201556102005160058201556102205160068201556102405160078201556102605160088201556102805160098201556102a051600a8201556102c051600b8201556102e051600c82015561030051600d82015561032051600e82015561034051600f8201556103605160108201556103805160118201556103a05160128201556103c05160138201555061014051565b61016052610140526013600b60c052602060c020015415151561428c576308c379a06101805260206101a052600b6101c0527f7175657565203e206d61780000000000000000000000000000000000000000006101e0526101c050606461019cfd5b610140516013600b60c052602060c02001556101405161016051600658016140e0565b610160526101405260005061016051565b610160526101405260146101405110151561431a576308c379a06101805260206101a05260086101c0527f69203e3d206d61780000000000000000000000000000000000000000000000006101e0526101c050606461019cfd5b6000610140516014811061432d57600080fd5b600b60c052602060c020015414151515614386576308c379a06101805260206101a052600d6101c0527f217a65726f2061646472657373000000000000000000000000000000000000006101e0526101c050606461019cfd5b6000610140516014811061439957600080fd5b600b60c052602060c02001556101405161016051600658016140e0565b610160526101405260005061016051565b610160526101405261018060006014818352015b6101405161018051601481106143f057600080fd5b600b60c052602060c020015414156144145761018051600052505060005161016051565b81516001018083528114156143db575b50506308c379a06101805260206101a05260096101c0527f6e6f7420666f756e6400000000000000000000000000000000000000000000006101e0526101c050606461019cfd5b6101605261014052610140516101805260006101a0526101e060006014818352015b6101e051600b60c052602060c02001546101c0526101c05115156144b0576146ed565b476102005261018051610200511015156144c9576146ed565b6004600a6101c05160e05260c052604060c02060c052602060c0200154610220526101805161020051808210156144ff57600080fd5b808203905090506102205180821115614518578061451a565b815b9050905061024052610240511515614531576146dd565b60206103006024632e1a7d4d61028052610240516102a05261029c60006101c0515af161455d57600080fd5b601f3d1161456a57600080fd5b600050610300516102605247610200518082101561458757600080fd5b8082039050905061028052600061026051111561463957610180805161026051808210156145b457600080fd5b808203905090508152506101a08051610260518181830110156145d657600080fd5b808201905090508152506004600a6101c05160e05260c052604060c02060c052602060c020018054610260518082101561460f57600080fd5b8082039050905081555060088054610260518082101561462e57600080fd5b808203905090508155505b6004600a6101c05160e05260c052604060c02060c052602060c020018054610280518082101561466857600080fd5b8082039050905081555060088054610280518082101561468757600080fd5b80820390509050815550610220516102a052610240516102c052610260516102e05261028051610300526101c0517fa1db2d4488a8004dde12ff73253859b508b0458878ea4086047bab6672f9f1d760806102a0a25b815160010180835281141561448d575b50506101a05160005260005161016051565b6101605261014052600154151561471757600161472b565b6000541561472657600161472b565b600954155b1561473e57600060005260005161016051565b6003600a6101405160e05260c052604060c02060c052602060c0200154610140516101605161018051600658016140b6565b6101a0526101805261016052610140526101a051808202821582848304141761479857600080fd5b8090509050905060095480806147ad57600080fd5b820490509050610180526004600a6101405160e05260c052604060c02060c052602060c02001546101a052610180516101a0511015156147f557600060005260005161016051565b610180516101a0518082101561480a57600080fd5b8082039050905047808211156148205780614822565b815b905090506101c0526005600a6101405160e05260c052604060c02060c052602060c02001546101c051101561486357600060005260005161016051566148a4565b6101c0516006600a6101405160e05260c052604060c02060c052602060c0200154808211156148925780614894565b815b9050905060005260005161016051565b005b610160526101405260015415156148c557600060005260005161016051565b60095415156148f7576004600a6101405160e05260c052604060c02060c052602060c020015460005260005161016051565b6003600a6101405160e05260c052604060c02060c052602060c0200154600854808202821582848304141761492b57600080fd5b80905090509050600954808061494057600080fd5b820490509050610180526004600a6101405160e05260c052604060c02060c052602060c02001546101a05260005415614987576101a05160005260005161016051566149d0565b610180516101a0511115156149a857600060005260005161016051566149d0565b6101a05161018051808210156149bd57600080fd5b8082039050905060005260005161016051565b005b61011a614aec0361011a60003961011a614aec036000f300000000000000000000000086d10751b18f3fe331c146546868a07224a8598b00000000000000000000000086d10751b18f3fe331c146546868a07224a8598b0000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x600436101561000d57613e45565b600035601c52600051638129fc1c8114156105ac57600154151515610071576308c379a061014052602061016052600b610180527f696e697469616c697a65640000000000000000000000000000000000000000006101a05261018050606461015cfd5b600c54151561012057600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156100b957600183526100c9565b815160010180835281141561009d575b50505061014051151561011b576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b6105a5565b600c5433141515610170576308c379a0610140526020610160526011610180527f216f6c642066756e64206d616e616765720000000000000000000000000000006101a05261018050606461015cfd5b60206101a0600463fbfa77cf6101405261015c600c545afa61019157600080fd5b601f3d1161019e57600080fd5b6000506101a0516002541415156101f4576308c379a06101c05260206101e052601f610200527f6f6c642066756e64206d616e61676572207661756c7420213d207661756c7400610220526102005060646101dcfd5b60206101a0600463fc7b9c186101405261015c600c545afa61021557600080fd5b601f3d1161022257600080fd5b6000506101a05160085560206101a06004632df9eab96101405261015c600c545afa61024d57600080fd5b601f3d1161025a57600080fd5b6000506101a05160095561014060006014818352015b6020610200602463ddf0b00961018052610140516101a05261019c600c545afa61029957600080fd5b601f3d116102a657600080fd5b60005061020051610160526101605115156102c0576105a2565b3060206101e06004636209ec2d6101805261019c610160515afa6102e357600080fd5b601f3d116102f057600080fd5b6000506101e051141515610343576308c379a061020052602061022052601d610240527f73747261746567792066756e64206d616e6167657220213d2073656c660000006102605261024050606461021cfd5b60e0366101803760e06102e060246339ebf82361026052610160516102805261027c600c545afa61037357600080fd5b60df3d1161038057600080fd5b6102e080808080516103c0525050602081019050808080516103e0525050602081019050808080516104005250506020810190508080805161042052505060208101905080808051610440525050602081019050808080516104605250506020810190508080805161048052505050506000506103c080516101805280602001516101a05280604001516101c05280606001516101e0528060800151610200528060a00151610220528060c001516102405250610180511515610482576308c379a06102605260206102805260096102a0527f21617070726f76656400000000000000000000000000000000000000000000006102c0526102a050606461027cfd5b6101a05115156104d1576308c379a06102605260206102805260076102a0527f21616374697665000000000000000000000000000000000000000000000000006102c0526102a050606461027cfd5b6101c0511515610520576308c379a061026052602061028052600a6102a0527f21616374697661746564000000000000000000000000000000000000000000006102c0526102a050606461027cfd5b61016051610140516014811061053557600080fd5b600b60c052602060c0200155600a6101605160e05260c052604060c02060c052602060c0206001815560016001820155600160028201556101e0516003820155610200516004820155610220516005820155610240516006820155505b8151600101808352811415610270575b50505b6001600155005b63371fd8e681141561079e576001541515610606576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b600a3360e05260c052604060c02060c052602060c020541515610668576308c379a0610140526020610160526009610180527f21617070726f76656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b346004351415156106b8576308c379a0610140526020610160526013610180527f616d6f756e7420213d206d73672e76616c7565000000000000000000000000006101a05261018050606461015cfd5b6000600435111515610709576308c379a0610140526020610160526009610180527f7265706179203d203000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6004600a3360e05260c052604060c02060c052602060c0200180546004358082101561073457600080fd5b80820390509050815550600880546004358082101561075257600080fd5b808203905090508155506004356101405260043561016052337f77c6871227e5d2dec8dadd5354f78453203e22e669cd0ec4c19d9a8c5edb31d06040610140a260043560005260206000f35b63753c09858114156109f35760015415156107f8576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b6001600a3360e05260c052604060c02060c052602060c0200154151561085d576308c379a0610140526020610160526007610180527f21616374697665000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b60006004351015156108725760243515610875565b60005b15610881576001610899565b60043515156108965760006024351015610899565b60005b15156108e4576308c379a0610140526020610160526011610180527f6761696e20616e64206c6f7373203e20300000000000000000000000000000006101a05261018050606461015cfd5b34600435141515610934576308c379a0610140526020610160526011610180527f6761696e20213d206d73672e76616c75650000000000000000000000000000006101a05261018050606461015cfd5b60006004351115610944576109a3565b600060243511156109a3576004600a3360e05260c052604060c02060c052602060c0200180546024358082101561097a57600080fd5b80820390509050815550600880546024358082101561099857600080fd5b808203905090508155505b60406004610140376004600a3360e05260c052604060c02060c052602060c020015461018052337f36d8646df39e8831ab3926651692b6a0ea874e6cc807ea1c428fcf2ba32859f86060610140a2005b63fc0c546a811415610a28573415610a0a57600080fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60005260206000f35b63ce5494bb811415610e1b573415610a3f57600080fd5b60043560a01c15610a4f57600080fd5b60035433141515610a9f576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6001541515610aed576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b6000541515610b3b576308c379a0610140526020610160526007610180527f21706175736564000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60206101a0600463fc0c546a6101405261015c6004355afa610b7157600080fd5b601f3d11610b7e57600080fd5b6000506101a051141515610bd1576308c379a06101c05260206101e052601d610200527f6e65772066756e64206d616e6167657220746f6b656e20213d20455448000000610220526102005060646101dcfd5b60025460206101a0600463fbfa77cf6101405261015c6004355afa610bf557600080fd5b601f3d11610c0257600080fd5b6000506101a051141515610c55576308c379a06101c05260206101e052601f610200527f6e65772066756e64206d616e61676572207661756c7420213d207661756c7400610220526102005060646101dcfd5b61016060006014818352015b61016051600b60c052602060c020015461014052610140511515610c8457610d3e565b60043560206101e06004636209ec2d6101805261019c610140515afa610ca957600080fd5b601f3d11610cb657600080fd5b6000506101e051141515610d2e576308c379a0610200526020610220526029610240527f73747261746567792066756e64206d616e6167657220213d206e65772066756e610260527f64206d616e6167657200000000000000000000000000000000000000000000006102805261024050608461021cfd5b8151600101808352811415610c61575b505047610140526004353b610d5257600080fd5b600060006004638129fc1c6101605261017c610140516004355af1610d7657600080fd5b6004356101605261014051610180526008546101a0527fd44a6dd2bfac4f6bc02d116d96aa12c24e8580626b95cb6a2f543f18cb61bd4c6060610160a1600060085561018060006014818352015b61018051600b60c052602060c020015461016052610160511515610de757610e17565b60006004600a6101605160e05260c052604060c02060c052602060c02001555b8151600101808352811415610dc4575b5050005b6347a02a44811415610ec8573415610e3257600080fd5b60043560a01c15610e4257600080fd5b60035433141515610e92576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b600435600455600435610140527f5c06d5a6f95a574bb95a214c88933831c63fcd6f6c5d1d61a21efb92be19bc2c6020610140a1005b631e39831e811415610f66573415610edf57600080fd5b60045433141515610f2f576308c379a061014052602061016052600f610180527f216e6578742074696d65206c6f636b00000000000000000000000000000000006101a05261018050606461015cfd5b33600355600060045533610140527f77b69635186d51fb2d031f67a7995795c8384acb800219c7d30861125d154f026020610140a1005b63704b6c02811415611064573415610f7d57600080fd5b60043560a01c15610f8d57600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b610120516020026101600151331415610fcc5760018352610fdc565b8151600101808352811415610fb0575b50505061014051151561102e576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600435600555600435610140527f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a16020610140a1005b638a0dac4a81141561116257341561107b57600080fd5b60043560a01c1561108b57600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156110ca57600183526110da565b81516001018083528114156110ae575b50505061014051151561112c576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600435600655600435610140527f31845eceb9cde510c7e8b37f76301c688feb70bc9653aa4c28a3734999840fd86020610140a1005b63c26f6d4481141561126057341561117957600080fd5b60043560a01c1561118957600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156111c857600183526111d8565b81516001018083528114156111ac575b50505061014051151561122a576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600435600755600435610140527fcabc8521621c89fc973d8f1e8455da2ce64a666915af33e0ebaa69cd5215083b6020610140a1005b63bedb86fb81141561136557341561127757600080fd5b60043560011c1561128757600080fd5b60035461016052600554610180526006546101a05260006101405261014061012060006003818352015b6101205160200261016001513314156112cd57600183526112dd565b81516001018083528114156112b1575b50505061014051151561132f576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b600435600055600435610140527f140eb9f8b591138e129e4caf389c92df4f0545b902523eee9e63153ecdb2026e6020610140a1005b636817031b8114156114a857341561137c57600080fd5b60043560a01c1561138c57600080fd5b600354331415156113dc576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60206101a0600463fc0c546a6101405261015c6004355afa61141257600080fd5b601f3d1161141f57600080fd5b6000506101a051141515611472576308c379a06101c05260206101e0526012610200527f7661756c7420746f6b656e20213d204554480000000000000000000000000000610220526102005060646101dcfd5b600435600255600435610140527fd459c7242e23d490831b5676a611c4342d899d28f342d89ae80793e56a930f306020610140a1005b6301e1d1148114156114d95734156114bf57600080fd5b600658016140b6565b610140526101405160005260206000f35b633b8ae39781141561173f5734156114f057600080fd5b60043560a01c1561150057600080fd5b60035433141515611550576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b600a60043560e05260c052604060c02060c052602060c020541515156115b5576308c379a0610140526020610160526008610180527f617070726f7665640000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b3060206101a06004636209ec2d6101405261015c6004355afa6115d757600080fd5b601f3d116115e457600080fd5b6000506101a051141515611637576308c379a06101c05260206101e052601d610200527f73747261746567792066756e64206d616e6167657220213d2074686973000000610220526102005060646101dcfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60206101a0600463fc0c546a6101405261015c6004355afa61166d57600080fd5b601f3d1161167a57600080fd5b6000506101a0511415156116cd576308c379a06101c05260206101e0526015610200527f737472617465677920746f6b656e20213d204554480000000000000000000000610220526102005060646101dcfd5b600a60043560e05260c052604060c02060c052602060c02060018155600060018201556000600282015560006003820155600060048201556000600582015560006006820155506004357f4c6d0fbb89373829bc56000a87d561331bca06f725fd8861d055215ed90f209b60006000a2005b63bb994d4881141561191957341561175657600080fd5b60043560a01c1561176657600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156117a557600183526117b5565b8151600101808352811415611789575b505050610140511515611807576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600a60043560e05260c052604060c02060c052602060c02054151561186b576308c379a0610140526020610160526009610180527f21617070726f76656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6001600a60043560e05260c052604060c02060c052602060c02001541515156118d3576308c379a0610140526020610160526006610180527f61637469766500000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6000600a60043560e05260c052604060c02060c052602060c020556004357f7d3e35e217272b8400fec8397b08eb8c60c4db9ae834af14ac0fc9c0bb914a8f60006000a2005b635f1ac310811415611c6757341561193057600080fd5b60043560a01c1561194057600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b61012051602002610160015133141561197f576001835261198f565b8151600101808352811415611963575b5050506101405115156119e1576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600a60043560e05260c052604060c02060c052602060c020541515611a45576308c379a0610140526020610160526009610180527f21617070726f76656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6001600a60043560e05260c052604060c02060c052602060c0200154151515611aad576308c379a0610140526020610160526006610180527f61637469766500000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b612710600954602435818183011015611ac557600080fd5b8082019050905011151515611b19576308c379a061014052602061016052600b610180527f726174696f203e206d61780000000000000000000000000000000000000000006101a05261018050606461015cfd5b60643560443511151515611b6c576308c379a0610140526020610160526017610180527f6d696e20626f72726f77203e206d617820626f72726f770000000000000000006101a05261018050606461015cfd5b60043561014052610140516006580161422a565b60005060016001600a60043560e05260c052604060c02060c052602060c020015560016002600a60043560e05260c052604060c02060c052602060c02001556024356003600a60043560e05260c052604060c02060c052602060c02001556044356005600a60043560e05260c052604060c02060c052602060c02001556064356006600a60043560e05260c052604060c02060c052602060c020015560098054602435818183011015611c3257600080fd5b808201905090508155506004357fa3cbd67e6583e6c7ef034e5f87b7b40b0a0e87182a8377dfb42e59aa414c6cd560006000a2005b63b22439f5811415611e9b573415611c7e57600080fd5b60043560a01c15611c8e57600080fd5b60035461016052600554610180526006546101a05260006101405261014061012060006003818352015b610120516020026101600151331415611cd45760018352611ce4565b8151600101808352811415611cb8575b505050610140511515611d36576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b6001600a60043560e05260c052604060c02060c052602060c02001541515611d9d576308c379a0610140526020610160526007610180527f21616374697665000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6004356101405261014051600658016143c7565b6101a0526101a0516101c0526101405161016051610180516101a0516101c0516101c0516101e0526101e051600658016142c0565b6101c0526101a05261018052610160526101405260005060006001600a60043560e05260c052604060c02060c052602060c0200155600980546003600a60043560e05260c052604060c02060c052602060c020015480821015611e4857600080fd5b8082039050905081555060006003600a60043560e05260c052604060c02060c052602060c02001556004357fff2f97c1f3529c6b02543b63f7efae22cdc885048adf65c679a1c5c4ea3b2fa860006000a2005b63c5cde90b811415612366573415611eb257600080fd5b6000610120525b610120516004013560a01c15611ece57600080fd5b6020610120510161012052610280610120511015611eeb57611eb9565b600354610160526005546101805260006101405261014061012060006002818352015b610120516020026101600151331415611f2a5760018352611f3a565b8151600101808352811415611f0e575b505050610140511515611f8c576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b60006101405261016060006014818352015b60046101605160148110611fb157600080fd5b602002013561018052610180511515611fda57610140511515611fd5576001610140525b61202a565b6101405115151561202a576308c379a06101a05260206101c05260036101e0527f6761700000000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b8151600101808352811415611f9e575b505061016060006014818352015b610160516014811061205957600080fd5b600b60c052602060c0200154610180526004610160516014811061207c57600080fd5b60200201356101a0526101805115156120e4576101a0511515156120df576308c379a06101c05260206101e0526008610200527f6e657720213d2030000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b612137565b60006101a05114151515612137576308c379a06101c05260206101e0526007610200527f6e6577203d203000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b8151600101808352811415612048575b505061016060006014818352015b6004610160516014811061216857600080fd5b60200201356101805261018051151561218057612218565b6001600a6101805160e05260c052604060c02060c052602060c020015415156121e8576308c379a06101a05260206101c05260076101e0527f2161637469766500000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b60006001600a6101805160e05260c052604060c02060c052602060c02001555b8151600101808352811415612155575b505061016060006014818352015b6004610160516014811061223957600080fd5b602002013561018052610180511515612251576122a2565b60016001600a6101805160e05260c052604060c02060c052602060c020015561018051610160516014811061228557600080fd5b600b60c052602060c02001555b8151600101808352811415612226575b505060043561016052602435610180526044356101a0526064356101c0526084356101e05260a4356102005260c4356102205260e4356102405261010435610260526101243561028052610144356102a052610164356102c052610184356102e0526101a435610300526101c435610320526101e4356103405261020435610360526102243561038052610244356103a052610264356103c0527fa03ab32749bdff946d914bdbc7fadedf2bdeb6a83f2b56effa25a0eae1012675610280610160a1005b63260829c081141561269357341561237d57600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156123bc57600183526123cc565b81516001018083528114156123a0575b50505061014051151561241e576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b61014060006014818352015b610140516014811061243b57600080fd5b600b60c052602060c020015415156124b1576004610140516014811061246057600080fd5b60200201351515156124b1576308c379a061016052602061018052600f6101a0527f6465627420726174696f20213d203000000000000000000000000000000000006101c0526101a050606461017cfd5b815160010180835281141561242a575b505060006101405261016060006014818352015b61016051601481106124e657600080fd5b600b60c052602060c02001546101805261018051151561250557612575565b6004610160516014811061251857600080fd5b60200201356101a0526101a0516003600a6101805160e05260c052604060c02060c052602060c020015561014080516101a05181818301101561255a57600080fd5b808201905090508152505b81516001018083528114156124d5575b505061014051600955612710600954111515156125d1576308c379a061016052602061018052600b6101a0527f746f74616c203e206d61780000000000000000000000000000000000000000006101c0526101a050606461017cfd5b60043561016052602435610180526044356101a0526064356101c0526084356101e05260a4356102005260c4356102205260e4356102405261010435610260526101243561028052610144356102a052610164356102c052610184356102e0526101a435610300526101c435610320526101e4356103405261020435610360526102243561038052610244356103a052610264356103c0527f8edb07c0d6dfa3d8e47f8faaeffa94a7c21b80ebb98ccf264581f64c8270a906610280610160a1005b63da17143181141561288a5734156126aa57600080fd5b60043560a01c156126ba57600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156126f95760018352612709565b81516001018083528114156126dd575b50505061014051151561275b576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600a60043560e05260c052604060c02060c052602060c0205415156127bf576308c379a0610140526020610160526009610180527f21617070726f76656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b60443560243511151515612812576308c379a0610140526020610160526017610180527f6d696e20626f72726f77203e206d617820626f72726f770000000000000000006101a05261018050606461015cfd5b6024356005600a60043560e05260c052604060c02060c052602060c02001556044356006600a60043560e05260c052604060c02060c052602060c020015560243561014052604435610160526004357ffedf8d30e937b57e4e95271e9f17cfab1a1315ac6d612ef72912405e9524f7d56040610140a2005b63505b6a76811415612a685734156128a157600080fd5b60015415156128ef576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60035461016052600554610180526007546101a05260006101405261014061012060006003818352015b6101205160200261016001513314156129355760018352612945565b8151600101808352811415612919575b505050610140511515612997576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b60206101e0602463c5ebeaec610160526004356101805261017c60006002545af16129c157600080fd5b601f3d116129ce57600080fd5b6000506101e051610140526024356101405110151515612a2d576308c379a061016052602061018052600e6101a0527f626f72726f776564203c206d696e0000000000000000000000000000000000006101c0526101a050606461017cfd5b6004356101605261014051610180526002547fb87de9931230544a0b3a00e753f5ab70f79a54e84e47bcad4239e1c1c97588d36040610160a2005b6348b8a1f9811415612c47573415612a7f57600080fd5b6001541515612acd576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60035461016052600554610180526007546101a05260006101405261014061012060006003818352015b610120516020026101600151331415612b135760018352612b23565b8151600101808352811415612af7575b505050610140511515612b75576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b60206101e0602463371fd8e6610160526004356101805261017c6004356002545af1612ba057600080fd5b601f3d11612bad57600080fd5b6000506101e051610140526024356101405110151515612c0c576308c379a061016052602061018052600c6101a0527f726570616964203c206d696e00000000000000000000000000000000000000006101c0526101a050606461017cfd5b6004356101605261014051610180526002547f447949f39e7c140dbba1469e2e065abd8a278ac561449a4fcd1c51f5aadc91d86040610160a2005b63d5b6e219811415612f31573415612c5e57600080fd5b6001541515612cac576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60035461016052600554610180526007546101a05260006101405261014061012060006003818352015b610120516020026101600151331415612cf25760018352612d02565b8151600101808352811415612cd6575b505050610140511515612d54576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b61014051600658016140b6565b6101605261014052610160516101405260043561014051101515612d8d57602435610140511115612d90565b60005b1515612ddb576308c379a06101605260206101805260126101a0527f746f74616c206e6f7420696e2072616e676500000000000000000000000000006101c0526101a050606461017cfd5b60206101e06004630dca59c16101805261019c6002545afa612dfc57600080fd5b601f3d11612e0957600080fd5b6000506101e051610160526040366101803761016051610140511115612e6357610140516101605180821015612e3e57600080fd5b808203905090504780821115612e545780612e56565b815b9050905061018052612e84565b610160516101405180821015612e7857600080fd5b808203905090506101a0525b6000610180511115612e97576001612e9f565b60006101a051115b15612ee5576002543b612eb157600080fd5b60006000604463753c09856101c052610180516101e0526101a051610200526101dc610180516002545af1612ee557600080fd5b610140516101c052610160516101e05261018051610200526101a051610220526002547fd94ac81cdb49ea558800854e3bfd1aedf2a0a02abc471047c34e382fd5137cbd60806101c0a2005b632e1a7d4d811415613218573415612f4857600080fd5b6001541515612f96576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60025433141515612fe6576308c379a0610140526020610160526006610180527f217661756c7400000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b61014051600658016140b6565b610160526101405261016051610140526004356101405180821115613018578061301a565b815b9050905061016052600061016051111515613074576308c379a06101805260206101a052600c6101c0527f7769746864726177203d203000000000000000000000000000000000000000006101e0526101c050606461019cfd5b60206102006004630dca59c16101a0526101bc6002545afa61309557600080fd5b601f3d116130a257600080fd5b600050610200516101805260006101a052610140516101805111156130e2576101805161014051808210156130d657600080fd5b808203905090506101a0525b476101c0526101c051610160511115613176576101a080516101405161016051610180516101a0516101c051610160516101e0526101e0516006580161446b565b610240526101c0526101a0526101805261016052610140526102405181818301101561314e57600080fd5b8082019050905081525061016051478082111561316b578061316d565b815b90509050610160525b60006101605111156131cc576101405161016051610180516101a0516101c051336101e0526101605161020052610200516101e05160065801613e74565b6101c0526101a0526101805261016052610140526000505b6004356101e05261016051610200526101a05161022052337f02f25270a4d87bea75db541cdfe559334a275b4a233520ed6c0a2429667cca9460606101e0a26101a05160005260206000f35b63f19f054281141561326457341561322f57600080fd5b60043560a01c1561323f57600080fd5b6004356101405261014051600658016146ff565b6101a0526101a05160005260206000f35b63c6f2be588114156132b057341561327b57600080fd5b60043560a01c1561328b57600080fd5b6004356101405261014051600658016148a6565b6101a0526101a05160005260206000f35b639a78e72e8114156132fc5734156132c757600080fd5b60043560a01c156132d757600080fd5b6004600a60043560e05260c052604060c02060c052602060c020015460005260206000f35b63c5ebeaec81141561358157600d541561331557600080fd5b6001600d55341561332557600080fd5b6001541515613373576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b6000541515156133c2576308c379a0610140526020610160526006610180527f70617573656400000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6001600a3360e05260c052604060c02060c052602060c02001541515613427576308c379a0610140526020610160526007610180527f21616374697665000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b60043561014051336101605261016051600658016146ff565b6101c052610140526101c0518082111561345a578061345c565b815b90509050610140526000610140511115156134b6576308c379a061016052602061018052600a6101a0527f626f72726f77203d2030000000000000000000000000000000000000000000006101c0526101a050606461017cfd5b6101405133610160526101405161018052610180516101605160065801613e74565b610140526000506004600a3360e05260c052604060c02060c052602060c0200180546101405181818301101561350d57600080fd5b80820190509050815550600880546101405181818301101561352e57600080fd5b80820190509050815550600435610160526101405161018052337fe1979fe4c35e0cef342fef5668e2c8e7a7e9f5d5d1ca8fee0ac6c427fa4153af6040610160a2610140516000526000600d5560206000f35b636cb56d19811415613a3057341561359857600080fd5b60043560a01c156135a857600080fd5b60243560a01c156135b857600080fd5b6001541515613606576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156136455760018352613655565b8151600101808352811415613629575b5050506101405115156136a7576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b6001600a60043560e05260c052604060c02060c052602060c0200154151561370e576308c379a061014052602061016052600b610180527f6f6c6420216163746976650000000000000000000000000000000000000000006101a05261018050606461015cfd5b600a60243560e05260c052604060c02060c052602060c020541515613772576308c379a061014052602061016052600d610180527f6e65772021617070726f766564000000000000000000000000000000000000006101a05261018050606461015cfd5b6002600a60243560e05260c052604060c02060c052602060c02001541515156137da576308c379a0610140526020610160526009610180527f61637469766174656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b610140600a60043560e05260c052604060c0208060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015260048160c052602060c0200154826080015260058160c052602060c02001548260a0015260068160c052602060c02001548260c001525050600a60243560e05260c052604060c02060c052602060c0206001815560016001820155600160028201556101a05160038201556101c05160048201556101e05160058201556102005160068201555060006001600a60043560e05260c052604060c02060c052602060c020015560006003600a60043560e05260c052604060c02060c052602060c020015560006004600a60043560e05260c052604060c02060c052602060c020015560006005600a60043560e05260c052604060c02060c052602060c020015560006006600a60043560e05260c052604060c02060c052602060c02001556101405161016051610180516101a0516101c0516101e05161020051610220516004356102405261024051600658016143c7565b6102a05261022052610200526101e0526101c0526101a0526101805261016052610140526102a0516102205260243561022051601481106139c057600080fd5b600b60c052602060c02001556004353b6139d957600080fd5b60006000602463ce5494bb610240526024356102605261025c60006004355af1613a0257600080fd5b6024356004357f9249d6a64288c19c5be5f4f1bb9b763ad4afac803128f1ef65b88acb13df9aa460006000a3005b6301681a62811415613b94573415613a4757600080fd5b60043560a01c15613a5757600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b610120516020026101600151331415613a965760018352613aa6565b8151600101808352811415613a7a575b505050610140511515613af8576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b60206101c060246370a0823161014052306101605261015c6004355afa613b1e57600080fd5b601f3d11613b2b57600080fd5b6000506101c0516101e0526101405161016051610180516101a0516101c0516101e0516004356102005233610220526101e0516102405261024051610220516102005160065801613f1c565b6101e0526101c0526101a052610180526101605261014052600050005b635c975abb811415613bb7573415613bab57600080fd5b60005460005260206000f35b63158ef93e811415613bda573415613bce57600080fd5b60015460005260206000f35b63fbfa77cf811415613bfd573415613bf157600080fd5b60025460005260206000f35b63d085835a811415613c20573415613c1457600080fd5b60035460005260206000f35b63b127df87811415613c43573415613c3757600080fd5b60045460005260206000f35b63f851a440811415613c66573415613c5a57600080fd5b60055460005260206000f35b63452a9320811415613c89573415613c7d57600080fd5b60065460005260206000f35b634d547ada811415613cac573415613ca057600080fd5b60075460005260206000f35b63fc7b9c18811415613ccf573415613cc357600080fd5b60085460005260206000f35b632df9eab9811415613cf2573415613ce657600080fd5b60095460005260206000f35b6339ebf823811415613de4573415613d0957600080fd5b60043560a01c15613d1957600080fd5b600a60043560e05260c052604060c0206101408080808460c052602060c0205481525050602081019050808060018560c052602060c020015481525050602081019050808060028560c052602060c020015481525050602081019050808060038560c052602060c020015481525050602081019050808060048560c052602060c020015481525050602081019050808060058560c052602060c020015481525050602081019050808060068560c052602060c02001548152505060e09050905060c05260c051610140f35b63ddf0b009811415613e20573415613dfb57600080fd5b60043560148110613e0b57600080fd5b600b60c052602060c020015460005260206000f35b63a598adff811415613e43573415613e3757600080fd5b600c5460005260206000f35b505b3461014052337fefc0288202e432ade6bf71491d0001d7e389ad4f8e4e9c7aa038dd1a563efc606020610140a2005b61018052610140526101605260006101405114151515613ed3576308c379a06101a05260206101c052600e6101e0527f746f203d20302061646472657373000000000000000000000000000000000000610200526101e05060646101bcfd5b60006101a0526101a08051602001806101e08284600060045af1613ef657600080fd5b5050600060006101e05161020061016051610140515af1613f1657600080fd5b61018051565b6101a05261014052610160526101805260006004610220527fa9059cbb000000000000000000000000000000000000000000000000000000006102405261022060048060208461028001018260208501600060045af15050805182019150506101605160208261028001015260208101905061018051602082610280010152602081019050806102805261028090508051602001806103208284600060045af1613fc557600080fd5b505060206103e0610320516103406000610140515af1613fe457600080fd5b60203d80821115613ff55780613ff7565b815b905090506103c0526103c08051602001806101c08284600060045af161401c57600080fd5b505060006101c05111156140b0576101c080602001516000825180602090131561404557600080fd5b809190121561405357600080fd5b806020036101000a8204905090509050151515156140b0576308c379a061022052602061024052600f610260527f7472616e73666572206661696c656400000000000000000000000000000000006102805261026050606461023cfd5b6101a051565b61014052476008548181830110156140cd57600080fd5b8082019050905060005260005161014051565b610140526102a0366101603761042060006014818352015b61042051600b60c052602060c020015461040052600061040051181561415657610400516101606103e0516014811061413057600080fd5b60200201526103e08051600181818301101561414b57600080fd5b808201905090508152505b81516001018083528114156140f8575b5050600b60c052602060c0206101605181556101805160018201556101a05160028201556101c05160038201556101e05160048201556102005160058201556102205160068201556102405160078201556102605160088201556102805160098201556102a051600a8201556102c051600b8201556102e051600c82015561030051600d82015561032051600e82015561034051600f8201556103605160108201556103805160118201556103a05160128201556103c05160138201555061014051565b61016052610140526013600b60c052602060c020015415151561428c576308c379a06101805260206101a052600b6101c0527f7175657565203e206d61780000000000000000000000000000000000000000006101e0526101c050606461019cfd5b610140516013600b60c052602060c02001556101405161016051600658016140e0565b610160526101405260005061016051565b610160526101405260146101405110151561431a576308c379a06101805260206101a05260086101c0527f69203e3d206d61780000000000000000000000000000000000000000000000006101e0526101c050606461019cfd5b6000610140516014811061432d57600080fd5b600b60c052602060c020015414151515614386576308c379a06101805260206101a052600d6101c0527f217a65726f2061646472657373000000000000000000000000000000000000006101e0526101c050606461019cfd5b6000610140516014811061439957600080fd5b600b60c052602060c02001556101405161016051600658016140e0565b610160526101405260005061016051565b610160526101405261018060006014818352015b6101405161018051601481106143f057600080fd5b600b60c052602060c020015414156144145761018051600052505060005161016051565b81516001018083528114156143db575b50506308c379a06101805260206101a05260096101c0527f6e6f7420666f756e6400000000000000000000000000000000000000000000006101e0526101c050606461019cfd5b6101605261014052610140516101805260006101a0526101e060006014818352015b6101e051600b60c052602060c02001546101c0526101c05115156144b0576146ed565b476102005261018051610200511015156144c9576146ed565b6004600a6101c05160e05260c052604060c02060c052602060c0200154610220526101805161020051808210156144ff57600080fd5b808203905090506102205180821115614518578061451a565b815b9050905061024052610240511515614531576146dd565b60206103006024632e1a7d4d61028052610240516102a05261029c60006101c0515af161455d57600080fd5b601f3d1161456a57600080fd5b600050610300516102605247610200518082101561458757600080fd5b8082039050905061028052600061026051111561463957610180805161026051808210156145b457600080fd5b808203905090508152506101a08051610260518181830110156145d657600080fd5b808201905090508152506004600a6101c05160e05260c052604060c02060c052602060c020018054610260518082101561460f57600080fd5b8082039050905081555060088054610260518082101561462e57600080fd5b808203905090508155505b6004600a6101c05160e05260c052604060c02060c052602060c020018054610280518082101561466857600080fd5b8082039050905081555060088054610280518082101561468757600080fd5b80820390509050815550610220516102a052610240516102c052610260516102e05261028051610300526101c0517fa1db2d4488a8004dde12ff73253859b508b0458878ea4086047bab6672f9f1d760806102a0a25b815160010180835281141561448d575b50506101a05160005260005161016051565b6101605261014052600154151561471757600161472b565b6000541561472657600161472b565b600954155b1561473e57600060005260005161016051565b6003600a6101405160e05260c052604060c02060c052602060c0200154610140516101605161018051600658016140b6565b6101a0526101805261016052610140526101a051808202821582848304141761479857600080fd5b8090509050905060095480806147ad57600080fd5b820490509050610180526004600a6101405160e05260c052604060c02060c052602060c02001546101a052610180516101a0511015156147f557600060005260005161016051565b610180516101a0518082101561480a57600080fd5b8082039050905047808211156148205780614822565b815b905090506101c0526005600a6101405160e05260c052604060c02060c052602060c02001546101c051101561486357600060005260005161016051566148a4565b6101c0516006600a6101405160e05260c052604060c02060c052602060c0200154808211156148925780614894565b815b9050905060005260005161016051565b005b610160526101405260015415156148c557600060005260005161016051565b60095415156148f7576004600a6101405160e05260c052604060c02060c052602060c020015460005260005161016051565b6003600a6101405160e05260c052604060c02060c052602060c0200154600854808202821582848304141761492b57600080fd5b80905090509050600954808061494057600080fd5b820490509050610180526004600a6101405160e05260c052604060c02060c052602060c02001546101a05260005415614987576101a05160005260005161016051566149d0565b610180516101a0511115156149a857600060005260005161016051566149d0565b6101a05161018051808210156149bd57600080fd5b8082039050905060005260005161016051565b00

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 Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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