false
true
0

Contract Address Details

0xF07674F6AC6632e253C291B694f9C2e2ED69eBBB

Contract Name
DaiFab
Creator
0x4f26ff–0b0876 at 0x099210–3b5e56
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
Fetching transactions...
Transfers
Fetching transfers...
Gas Used
Fetching gas used...
Last Balance Update
25858658
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been partially verified via Sourcify. View contract in Sourcify repository
Contract name:
DaiFab




Optimization enabled
true
Compiler version
v0.4.19+commit.c4cbbb05




Optimization runs
200
Verified at
2026-02-22T23:17:51.941251Z

Constructor Arguments

000000000000000000000000552f355ccb9b91c8fb47d9c011abad5b72ec30e900000000000000000000000068fd0899fedeeee08b77c189d2f8ac38466ea216000000000000000000000000ec4d29fd22066e75746eb68cb51d8a7df7d28356000000000000000000000000c2baca5300b95ab18eddd9ef3070a0945298ab500000000000000000000000000eda20f7499aae7bdadc4e52fd72e49663733ed4000000000000000000000000141a206ece672e3198086c5d21f7858ad03669ea00000000000000000000000001c1103d765f62a0d909499d7b615c382cdb072d

Arg [0] (address) : 0x552f355ccb9b91c8fb47d9c011abad5b72ec30e9
Arg [1] (address) : 0x68fd0899fedeeee08b77c189d2f8ac38466ea216
Arg [2] (address) : 0xec4d29fd22066e75746eb68cb51d8a7df7d28356
Arg [3] (address) : 0xc2baca5300b95ab18eddd9ef3070a0945298ab50
Arg [4] (address) : 0x0eda20f7499aae7bdadc4e52fd72e49663733ed4
Arg [5] (address) : 0x141a206ece672e3198086c5d21f7858ad03669ea
Arg [6] (address) : 0x01c1103d765f62a0d909499d7b615c382cdb072d

              

DaiFab.sol

// hevm: flattened sources of src/fab.sol
pragma solidity ^0.4.18;

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

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

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

/* pragma solidity ^0.4.13; */

contract DSAuthority {
    function canCall(
        address src, address dst, bytes4 sig
    ) public view returns (bool);
}

contract DSAuthEvents {
    event LogSetAuthority (address indexed authority);
    event LogSetOwner     (address indexed owner);
}

contract DSAuth is DSAuthEvents {
    DSAuthority  public  authority;
    address      public  owner;

    function DSAuth() public {
        owner = msg.sender;
        LogSetOwner(msg.sender);
    }

    function setOwner(address owner_)
        public
        auth
    {
        owner = owner_;
        LogSetOwner(owner);
    }

    function setAuthority(DSAuthority authority_)
        public
        auth
    {
        authority = authority_;
        LogSetAuthority(authority);
    }

    modifier auth {
        require(isAuthorized(msg.sender, msg.sig));
        _;
    }

    function isAuthorized(address src, bytes4 sig) internal view returns (bool) {
        if (src == address(this)) {
            return true;
        } else if (src == owner) {
            return true;
        } else if (authority == DSAuthority(0)) {
            return false;
        } else {
            return authority.canCall(src, this, sig);
        }
    }
}

////// lib/ds-guard/src/guard.sol
// guard.sol -- simple whitelist implementation of DSAuthority

// Copyright (C) 2017  DappHub, LLC

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

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

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

/* pragma solidity ^0.4.13; */

/* import "ds-auth/auth.sol"; */

contract DSGuardEvents {
    event LogPermit(
        bytes32 indexed src,
        bytes32 indexed dst,
        bytes32 indexed sig
    );

    event LogForbid(
        bytes32 indexed src,
        bytes32 indexed dst,
        bytes32 indexed sig
    );
}

contract DSGuard is DSAuth, DSAuthority, DSGuardEvents {
    bytes32 constant public ANY = bytes32(uint(-1));

    mapping (bytes32 => mapping (bytes32 => mapping (bytes32 => bool))) acl;

    function canCall(
        address src_, address dst_, bytes4 sig
    ) public view returns (bool) {
        var src = bytes32(src_);
        var dst = bytes32(dst_);

        return acl[src][dst][sig]
            || acl[src][dst][ANY]
            || acl[src][ANY][sig]
            || acl[src][ANY][ANY]
            || acl[ANY][dst][sig]
            || acl[ANY][dst][ANY]
            || acl[ANY][ANY][sig]
            || acl[ANY][ANY][ANY];
    }

    function permit(bytes32 src, bytes32 dst, bytes32 sig) public auth {
        acl[src][dst][sig] = true;
        LogPermit(src, dst, sig);
    }

    function forbid(bytes32 src, bytes32 dst, bytes32 sig) public auth {
        acl[src][dst][sig] = false;
        LogForbid(src, dst, sig);
    }

    function permit(address src, address dst, bytes32 sig) public {
        permit(bytes32(src), bytes32(dst), sig);
    }
    function forbid(address src, address dst, bytes32 sig) public {
        forbid(bytes32(src), bytes32(dst), sig);
    }

}

contract DSGuardFactory {
    mapping (address => bool)  public  isGuard;

    function newGuard() public returns (DSGuard guard) {
        guard = new DSGuard();
        guard.setOwner(msg.sender);
        isGuard[guard] = true;
    }
}

////// lib/ds-roles/src/roles.sol
// roles.sol - roled based authentication

// Copyright (C) 2017  DappHub, LLC

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

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

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

/* pragma solidity ^0.4.13; */

/* import 'ds-auth/auth.sol'; */

contract DSRoles is DSAuth, DSAuthority
{
    mapping(address=>bool) _root_users;
    mapping(address=>bytes32) _user_roles;
    mapping(address=>mapping(bytes4=>bytes32)) _capability_roles;
    mapping(address=>mapping(bytes4=>bool)) _public_capabilities;

    function getUserRoles(address who)
        public
        view
        returns (bytes32)
    {
        return _user_roles[who];
    }

    function getCapabilityRoles(address code, bytes4 sig)
        public
        view
        returns (bytes32)
    {
        return _capability_roles[code][sig];
    }

    function isUserRoot(address who)
        public
        view
        returns (bool)
    {
        return _root_users[who];
    }

    function isCapabilityPublic(address code, bytes4 sig)
        public
        view
        returns (bool)
    {
        return _public_capabilities[code][sig];
    }

    function hasUserRole(address who, uint8 role)
        public
        view
        returns (bool)
    {
        bytes32 roles = getUserRoles(who);
        bytes32 shifted = bytes32(uint256(uint256(2) ** uint256(role)));
        return bytes32(0) != roles & shifted;
    }

    function canCall(address caller, address code, bytes4 sig)
        public
        view
        returns (bool)
    {
        if( isUserRoot(caller) || isCapabilityPublic(code, sig) ) {
            return true;
        } else {
            var has_roles = getUserRoles(caller);
            var needs_one_of = getCapabilityRoles(code, sig);
            return bytes32(0) != has_roles & needs_one_of;
        }
    }

    function BITNOT(bytes32 input) internal pure returns (bytes32 output) {
        return (input ^ bytes32(uint(-1)));
    }

    function setRootUser(address who, bool enabled)
        public
        auth
    {
        _root_users[who] = enabled;
    }

    function setUserRole(address who, uint8 role, bool enabled)
        public
        auth
    {
        var last_roles = _user_roles[who];
        bytes32 shifted = bytes32(uint256(uint256(2) ** uint256(role)));
        if( enabled ) {
            _user_roles[who] = last_roles | shifted;
        } else {
            _user_roles[who] = last_roles & BITNOT(shifted);
        }
    }

    function setPublicCapability(address code, bytes4 sig, bool enabled)
        public
        auth
    {
        _public_capabilities[code][sig] = enabled;
    }

    function setRoleCapability(uint8 role, address code, bytes4 sig, bool enabled)
        public
        auth
    {
        var last_roles = _capability_roles[code][sig];
        bytes32 shifted = bytes32(uint256(uint256(2) ** uint256(role)));
        if( enabled ) {
            _capability_roles[code][sig] = last_roles | shifted;
        } else {
            _capability_roles[code][sig] = last_roles & BITNOT(shifted);
        }

    }

}

////// lib/ds-spell/lib/ds-note/src/note.sol
/// note.sol -- the `note' modifier, for logging calls as events

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

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

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

/* pragma solidity ^0.4.13; */

contract DSNote {
    event LogNote(
        bytes4   indexed  sig,
        address  indexed  guy,
        bytes32  indexed  foo,
        bytes32  indexed  bar,
        uint              wad,
        bytes             fax
    ) anonymous;

    modifier note {
        bytes32 foo;
        bytes32 bar;

        assembly {
            foo := calldataload(4)
            bar := calldataload(36)
        }

        LogNote(msg.sig, msg.sender, foo, bar, msg.value, msg.data);

        _;
    }
}

////// lib/ds-thing/lib/ds-math/src/math.sol
/// math.sol -- mixin for inline numerical wizardry

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

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

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

/* pragma solidity ^0.4.13; */

contract DSMath {
    function add(uint x, uint y) internal pure returns (uint z) {
        require((z = x + y) >= x);
    }
    function sub(uint x, uint y) internal pure returns (uint z) {
        require((z = x - y) <= x);
    }
    function mul(uint x, uint y) internal pure returns (uint z) {
        require(y == 0 || (z = x * y) / y == x);
    }

    function min(uint x, uint y) internal pure returns (uint z) {
        return x <= y ? x : y;
    }
    function max(uint x, uint y) internal pure returns (uint z) {
        return x >= y ? x : y;
    }
    function imin(int x, int y) internal pure returns (int z) {
        return x <= y ? x : y;
    }
    function imax(int x, int y) internal pure returns (int z) {
        return x >= y ? x : y;
    }

    uint constant WAD = 10 ** 18;
    uint constant RAY = 10 ** 27;

    function wmul(uint x, uint y) internal pure returns (uint z) {
        z = add(mul(x, y), WAD / 2) / WAD;
    }
    function rmul(uint x, uint y) internal pure returns (uint z) {
        z = add(mul(x, y), RAY / 2) / RAY;
    }
    function wdiv(uint x, uint y) internal pure returns (uint z) {
        z = add(mul(x, WAD), y / 2) / y;
    }
    function rdiv(uint x, uint y) internal pure returns (uint z) {
        z = add(mul(x, RAY), y / 2) / y;
    }

    // This famous algorithm is called "exponentiation by squaring"
    // and calculates x^n with x as fixed-point and n as regular unsigned.
    //
    // It's O(log n), instead of O(n) for naive repeated multiplication.
    //
    // These facts are why it works:
    //
    //  If n is even, then x^n = (x^2)^(n/2).
    //  If n is odd,  then x^n = x * x^(n-1),
    //   and applying the equation for even x gives
    //    x^n = x * (x^2)^((n-1) / 2).
    //
    //  Also, EVM division is flooring and
    //    floor[(n-1) / 2] = floor[n / 2].
    //
    function rpow(uint x, uint n) internal pure returns (uint z) {
        z = n % 2 != 0 ? x : RAY;

        for (n /= 2; n != 0; n /= 2) {
            x = rmul(x, x);

            if (n % 2 != 0) {
                z = rmul(z, x);
            }
        }
    }
}

////// lib/ds-thing/src/thing.sol
// thing.sol - `auth` with handy mixins. your things should be DSThings

// Copyright (C) 2017  DappHub, LLC

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

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

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

/* pragma solidity ^0.4.13; */

/* import 'ds-auth/auth.sol'; */
/* import 'ds-note/note.sol'; */
/* import 'ds-math/math.sol'; */

contract DSThing is DSAuth, DSNote, DSMath {

    function S(string s) internal pure returns (bytes4) {
        return bytes4(keccak256(s));
    }

}

////// lib/ds-token/lib/ds-stop/src/stop.sol
/// stop.sol -- mixin for enable/disable functionality

// Copyright (C) 2017  DappHub, LLC

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

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

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

/* pragma solidity ^0.4.13; */

/* import "ds-auth/auth.sol"; */
/* import "ds-note/note.sol"; */

contract DSStop is DSNote, DSAuth {

    bool public stopped;

    modifier stoppable {
        require(!stopped);
        _;
    }
    function stop() public auth note {
        stopped = true;
    }
    function start() public auth note {
        stopped = false;
    }

}

////// lib/ds-token/lib/erc20/src/erc20.sol
/// erc20.sol -- API for the ERC20 token standard

// See <https://github.com/ethereum/EIPs/issues/20>.

// This file likely does not meet the threshold of originality
// required for copyright to apply.  As a result, this is free and
// unencumbered software belonging to the public domain.

/* pragma solidity ^0.4.8; */

contract ERC20Events {
    event Approval(address indexed src, address indexed guy, uint wad);
    event Transfer(address indexed src, address indexed dst, uint wad);
}

contract ERC20 is ERC20Events {
    function totalSupply() public view returns (uint);
    function balanceOf(address guy) public view returns (uint);
    function allowance(address src, address guy) public view returns (uint);

    function approve(address guy, uint wad) public returns (bool);
    function transfer(address dst, uint wad) public returns (bool);
    function transferFrom(
        address src, address dst, uint wad
    ) public returns (bool);
}

////// lib/ds-token/src/base.sol
/// base.sol -- basic ERC20 implementation

// Copyright (C) 2015, 2016, 2017  DappHub, LLC

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

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

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

/* pragma solidity ^0.4.13; */

/* import "erc20/erc20.sol"; */
/* import "ds-math/math.sol"; */

contract DSTokenBase is ERC20, DSMath {
    uint256                                            _supply;
    mapping (address => uint256)                       _balances;
    mapping (address => mapping (address => uint256))  _approvals;

    function DSTokenBase(uint supply) public {
        _balances[msg.sender] = supply;
        _supply = supply;
    }

    function totalSupply() public view returns (uint) {
        return _supply;
    }
    function balanceOf(address src) public view returns (uint) {
        return _balances[src];
    }
    function allowance(address src, address guy) public view returns (uint) {
        return _approvals[src][guy];
    }

    function transfer(address dst, uint wad) public returns (bool) {
        return transferFrom(msg.sender, dst, wad);
    }

    function transferFrom(address src, address dst, uint wad)
        public
        returns (bool)
    {
        if (src != msg.sender) {
            _approvals[src][msg.sender] = sub(_approvals[src][msg.sender], wad);
        }

        _balances[src] = sub(_balances[src], wad);
        _balances[dst] = add(_balances[dst], wad);

        Transfer(src, dst, wad);

        return true;
    }

    function approve(address guy, uint wad) public returns (bool) {
        _approvals[msg.sender][guy] = wad;

        Approval(msg.sender, guy, wad);

        return true;
    }
}

////// lib/ds-token/src/token.sol
/// token.sol -- ERC20 implementation with minting and burning

// Copyright (C) 2015, 2016, 2017  DappHub, LLC

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

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

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

/* pragma solidity ^0.4.13; */

/* import "ds-stop/stop.sol"; */

/* import "./base.sol"; */

contract DSToken is DSTokenBase(0), DSStop {

    bytes32  public  symbol;
    uint256  public  decimals = 18; // standard token precision. override to customize

    function DSToken(bytes32 symbol_) public {
        symbol = symbol_;
    }

    event Mint(address indexed guy, uint wad);
    event Burn(address indexed guy, uint wad);

    function approve(address guy) public stoppable returns (bool) {
        return super.approve(guy, uint(-1));
    }

    function approve(address guy, uint wad) public stoppable returns (bool) {
        return super.approve(guy, wad);
    }

    function transferFrom(address src, address dst, uint wad)
        public
        stoppable
        returns (bool)
    {
        if (src != msg.sender && _approvals[src][msg.sender] != uint(-1)) {
            _approvals[src][msg.sender] = sub(_approvals[src][msg.sender], wad);
        }

        _balances[src] = sub(_balances[src], wad);
        _balances[dst] = add(_balances[dst], wad);

        Transfer(src, dst, wad);

        return true;
    }

    function push(address dst, uint wad) public {
        transferFrom(msg.sender, dst, wad);
    }
    function pull(address src, uint wad) public {
        transferFrom(src, msg.sender, wad);
    }
    function move(address src, address dst, uint wad) public {
        transferFrom(src, dst, wad);
    }

    function mint(uint wad) public {
        mint(msg.sender, wad);
    }
    function burn(uint wad) public {
        burn(msg.sender, wad);
    }
    function mint(address guy, uint wad) public auth stoppable {
        _balances[guy] = add(_balances[guy], wad);
        _supply = add(_supply, wad);
        Mint(guy, wad);
    }
    function burn(address guy, uint wad) public auth stoppable {
        if (guy != msg.sender && _approvals[guy][msg.sender] != uint(-1)) {
            _approvals[guy][msg.sender] = sub(_approvals[guy][msg.sender], wad);
        }

        _balances[guy] = sub(_balances[guy], wad);
        _supply = sub(_supply, wad);
        Burn(guy, wad);
    }

    // Optional token name
    bytes32   public  name = "";

    function setName(bytes32 name_) public auth {
        name = name_;
    }
}

////// lib/ds-value/src/value.sol
/// value.sol - a value is a simple thing, it can be get and set

// Copyright (C) 2017  DappHub, LLC

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

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

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

/* pragma solidity ^0.4.13; */

/* import 'ds-thing/thing.sol'; */

contract DSValue is DSThing {
    bool    has;
    bytes32 val;
    function peek() public view returns (bytes32, bool) {
        return (val,has);
    }
    function read() public view returns (bytes32) {
        var (wut, haz) = peek();
        assert(haz);
        return wut;
    }
    function poke(bytes32 wut) public note auth {
        val = wut;
        has = true;
    }
    function void() public note auth {  // unset the value
        has = false;
    }
}

////// src/vox.sol
/// vox.sol -- target price feed

// Copyright (C) 2016, 2017  Nikolai Mushegian <nikolai@dapphub.com>
// Copyright (C) 2016, 2017  Daniel Brockman <daniel@dapphub.com>
// Copyright (C) 2017        Rain Break <rainbreak@riseup.net>

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

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

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

/* pragma solidity ^0.4.18; */

/* import "ds-thing/thing.sol"; */

contract SaiVox is DSThing {
    uint256  _par;
    uint256  _way;

    uint256  public  fix;
    uint256  public  how;
    uint256  public  tau;

    function SaiVox(uint par_) public {
        _par = fix = par_;
        _way = RAY;
        tau  = era();
    }

    function era() public view returns (uint) {
        return block.timestamp;
    }

    function mold(bytes32 param, uint val) public note auth {
        if (param == 'way') _way = val;
    }

    // Dai Target Price (ref per dai)
    function par() public returns (uint) {
        prod();
        return _par;
    }
    function way() public returns (uint) {
        prod();
        return _way;
    }

    function tell(uint256 ray) public note auth {
        fix = ray;
    }
    function tune(uint256 ray) public note auth {
        how = ray;
    }

    function prod() public note {
        var age = era() - tau;
        if (age == 0) return;  // optimised
        tau = era();

        if (_way != RAY) _par = rmul(_par, rpow(_way, age));  // optimised

        if (how == 0) return;  // optimised
        var wag = int128(how * age);
        _way = inj(prj(_way) + (fix < _par ? wag : -wag));
    }

    function inj(int128 x) internal pure returns (uint256) {
        return x >= 0 ? uint256(x) + RAY
            : rdiv(RAY, RAY + uint256(-x));
    }
    function prj(uint256 x) internal pure returns (int128) {
        return x >= RAY ? int128(x - RAY)
            : int128(RAY) - int128(rdiv(RAY, x));
    }
}

////// src/tub.sol
/// tub.sol -- simplified CDP engine (baby brother of `vat')

// Copyright (C) 2017  Nikolai Mushegian <nikolai@dapphub.com>
// Copyright (C) 2017  Daniel Brockman <daniel@dapphub.com>
// Copyright (C) 2017  Rain Break <rainbreak@riseup.net>

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

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

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

/* pragma solidity ^0.4.18; */

/* import "ds-thing/thing.sol"; */
/* import "ds-token/token.sol"; */
/* import "ds-value/value.sol"; */

/* import "./vox.sol"; */

contract SaiTubEvents {
    event LogNewCup(address indexed lad, bytes32 cup);
}

contract SaiTub is DSThing, SaiTubEvents {
    DSToken  public  sai;  // Stablecoin
    DSToken  public  sin;  // Debt (negative sai)

    DSToken  public  skr;  // Abstracted collateral
    ERC20    public  gem;  // Underlying collateral

    DSToken  public  gov;  // Governance token

    SaiVox   public  vox;  // Target price feed
    DSValue  public  pip;  // Reference price feed
    DSValue  public  pep;  // Governance price feed

    address  public  tap;  // Liquidator
    address  public  pit;  // Governance Vault

    uint256  public  axe;  // Liquidation penalty
    uint256  public  cap;  // Debt ceiling
    uint256  public  mat;  // Liquidation ratio
    uint256  public  tax;  // Stability fee
    uint256  public  fee;  // Governance fee
    uint256  public  gap;  // Join-Exit Spread

    bool     public  off;  // Cage flag
    bool     public  out;  // Post cage exit

    uint256  public  fit;  // REF per SKR (just before settlement)

    uint256  public  rho;  // Time of last drip
    uint256         _chi;  // Accumulated Tax Rates
    uint256         _rhi;  // Accumulated Tax + Fee Rates
    uint256  public  rum;  // Total normalised debt

    uint256                   public  cupi;
    mapping (bytes32 => Cup)  public  cups;

    struct Cup {
        address  lad;      // CDP owner
        uint256  ink;      // Locked collateral (in SKR)
        uint256  art;      // Outstanding normalised debt (tax only)
        uint256  ire;      // Outstanding normalised debt
    }

    function lad(bytes32 cup) public view returns (address) {
        return cups[cup].lad;
    }
    function ink(bytes32 cup) public view returns (uint) {
        return cups[cup].ink;
    }
    function tab(bytes32 cup) public returns (uint) {
        return rmul(cups[cup].art, chi());
    }
    function rap(bytes32 cup) public returns (uint) {
        return sub(rmul(cups[cup].ire, rhi()), tab(cup));
    }

    // Total CDP Debt
    function din() public returns (uint) {
        return rmul(rum, chi());
    }
    // Backing collateral
    function air() public view returns (uint) {
        return skr.balanceOf(this);
    }
    // Raw collateral
    function pie() public view returns (uint) {
        return gem.balanceOf(this);
    }

    //------------------------------------------------------------------

    function SaiTub(
        DSToken  sai_,
        DSToken  sin_,
        DSToken  skr_,
        ERC20    gem_,
        DSToken  gov_,
        DSValue  pip_,
        DSValue  pep_,
        SaiVox   vox_,
        address  pit_
    ) public {
        gem = gem_;
        skr = skr_;

        sai = sai_;
        sin = sin_;

        gov = gov_;
        pit = pit_;

        pip = pip_;
        pep = pep_;
        vox = vox_;

        axe = RAY;
        mat = RAY;
        tax = RAY;
        fee = RAY;
        gap = WAD;

        _chi = RAY;
        _rhi = RAY;

        rho = era();
    }

    function era() public constant returns (uint) {
        return block.timestamp;
    }

    //--Risk-parameter-config-------------------------------------------

    function mold(bytes32 param, uint val) public note auth {
        if      (param == 'cap') cap = val;
        else if (param == 'mat') { require(val >= RAY); mat = val; }
        else if (param == 'tax') { require(val >= RAY); drip(); tax = val; }
        else if (param == 'fee') { require(val >= RAY); drip(); fee = val; }
        else if (param == 'axe') { require(val >= RAY); axe = val; }
        else if (param == 'gap') { require(val >= WAD); gap = val; }
        else return;
    }

    //--Price-feed-setters----------------------------------------------

    function setPip(DSValue pip_) public note auth {
        pip = pip_;
    }
    function setPep(DSValue pep_) public note auth {
        pep = pep_;
    }
    function setVox(SaiVox vox_) public note auth {
        vox = vox_;
    }

    //--Tap-setter------------------------------------------------------
    function turn(address tap_) public note {
        require(tap  == 0);
        require(tap_ != 0);
        tap = tap_;
    }

    //--Collateral-wrapper----------------------------------------------

    // Wrapper ratio (gem per skr)
    function per() public view returns (uint ray) {
        return skr.totalSupply() == 0 ? RAY : rdiv(pie(), skr.totalSupply());
    }
    // Join price (gem per skr)
    function ask(uint wad) public view returns (uint) {
        return rmul(wad, wmul(per(), gap));
    }
    // Exit price (gem per skr)
    function bid(uint wad) public view returns (uint) {
        return rmul(wad, wmul(per(), sub(2 * WAD, gap)));
    }
    function join(uint wad) public note {
        require(!off);
        require(ask(wad) > 0);
        require(gem.transferFrom(msg.sender, this, ask(wad)));
        skr.mint(msg.sender, wad);
    }
    function exit(uint wad) public note {
        require(!off || out);
        require(gem.transfer(msg.sender, bid(wad)));
        skr.burn(msg.sender, wad);
    }

    //--Stability-fee-accumulation--------------------------------------

    // Accumulated Rates
    function chi() public returns (uint) {
        drip();
        return _chi;
    }
    function rhi() public returns (uint) {
        drip();
        return _rhi;
    }
    function drip() public note {
        if (off) return;

        var rho_ = era();
        var age = rho_ - rho;
        if (age == 0) return;    // optimised
        rho = rho_;

        var inc = RAY;

        if (tax != RAY) {  // optimised
            var _chi_ = _chi;
            inc = rpow(tax, age);
            _chi = rmul(_chi, inc);
            sai.mint(tap, rmul(sub(_chi, _chi_), rum));
        }

        // optimised
        if (fee != RAY) inc = rmul(inc, rpow(fee, age));
        if (inc != RAY) _rhi = rmul(_rhi, inc);
    }


    //--CDP-risk-indicator----------------------------------------------

    // Abstracted collateral price (ref per skr)
    function tag() public view returns (uint wad) {
        return off ? fit : wmul(per(), uint(pip.read()));
    }
    // Returns true if cup is well-collateralized
    function safe(bytes32 cup) public returns (bool) {
        var pro = rmul(tag(), ink(cup));
        var con = rmul(vox.par(), tab(cup));
        var min = rmul(con, mat);
        return pro >= min;
    }


    //--CDP-operations--------------------------------------------------

    function open() public note returns (bytes32 cup) {
        require(!off);
        cupi = add(cupi, 1);
        cup = bytes32(cupi);
        cups[cup].lad = msg.sender;
        LogNewCup(msg.sender, cup);
    }
    function give(bytes32 cup, address guy) public note {
        require(msg.sender == cups[cup].lad);
        require(guy != 0);
        cups[cup].lad = guy;
    }

    function lock(bytes32 cup, uint wad) public note {
        require(!off);
        cups[cup].ink = add(cups[cup].ink, wad);
        skr.pull(msg.sender, wad);
        require(cups[cup].ink == 0 || cups[cup].ink > 0.005 ether);
    }
    function free(bytes32 cup, uint wad) public note {
        require(msg.sender == cups[cup].lad);
        cups[cup].ink = sub(cups[cup].ink, wad);
        skr.push(msg.sender, wad);
        require(safe(cup));
        require(cups[cup].ink == 0 || cups[cup].ink > 0.005 ether);
    }

    function draw(bytes32 cup, uint wad) public note {
        require(!off);
        require(msg.sender == cups[cup].lad);
        require(rdiv(wad, chi()) > 0);

        cups[cup].art = add(cups[cup].art, rdiv(wad, chi()));
        rum = add(rum, rdiv(wad, chi()));

        cups[cup].ire = add(cups[cup].ire, rdiv(wad, rhi()));
        sai.mint(cups[cup].lad, wad);

        require(safe(cup));
        require(sai.totalSupply() <= cap);
    }
    function wipe(bytes32 cup, uint wad) public note {
        require(!off);

        var owe = rmul(wad, rdiv(rap(cup), tab(cup)));

        cups[cup].art = sub(cups[cup].art, rdiv(wad, chi()));
        rum = sub(rum, rdiv(wad, chi()));

        cups[cup].ire = sub(cups[cup].ire, rdiv(add(wad, owe), rhi()));
        sai.burn(msg.sender, wad);

        var (val, ok) = pep.peek();
        if (ok && val != 0) gov.move(msg.sender, pit, wdiv(owe, uint(val)));
    }

    function shut(bytes32 cup) public note {
        require(!off);
        require(msg.sender == cups[cup].lad);
        if (tab(cup) != 0) wipe(cup, tab(cup));
        if (ink(cup) != 0) free(cup, ink(cup));
        delete cups[cup];
    }

    function bite(bytes32 cup) public note {
        require(!safe(cup) || off);

        // Take on all of the debt, except unpaid fees
        var rue = tab(cup);
        sin.mint(tap, rue);
        rum = sub(rum, cups[cup].art);
        cups[cup].art = 0;
        cups[cup].ire = 0;

        // Amount owed in SKR, including liquidation penalty
        var owe = rdiv(rmul(rmul(rue, axe), vox.par()), tag());

        if (owe > cups[cup].ink) {
            owe = cups[cup].ink;
        }

        skr.push(tap, owe);
        cups[cup].ink = sub(cups[cup].ink, owe);
    }

    //------------------------------------------------------------------

    function cage(uint fit_, uint jam) public note auth {
        require(!off && fit_ != 0);
        off = true;
        axe = RAY;
        gap = WAD;
        fit = fit_;         // ref per skr
        require(gem.transfer(tap, jam));
    }
    function flow() public note auth {
        require(off);
        out = true;
    }
}

////// src/tap.sol
/// tap.sol -- liquidation engine (see also `vow`)

// Copyright (C) 2017  Nikolai Mushegian <nikolai@dapphub.com>
// Copyright (C) 2017  Daniel Brockman <daniel@dapphub.com>
// Copyright (C) 2017  Rain Break <rainbreak@riseup.net>

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

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

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

/* pragma solidity ^0.4.18; */

/* import "./tub.sol"; */

contract SaiTap is DSThing {
    DSToken  public  sai;
    DSToken  public  sin;
    DSToken  public  skr;

    SaiVox   public  vox;
    SaiTub   public  tub;

    uint256  public  gap;  // Boom-Bust Spread
    bool     public  off;  // Cage flag
    uint256  public  fix;  // Cage price

    // Surplus
    function joy() public view returns (uint) {
        return sai.balanceOf(this);
    }
    // Bad debt
    function woe() public view returns (uint) {
        return sin.balanceOf(this);
    }
    // Collateral pending liquidation
    function fog() public view returns (uint) {
        return skr.balanceOf(this);
    }


    function SaiTap(SaiTub tub_) public {
        tub = tub_;

        sai = tub.sai();
        sin = tub.sin();
        skr = tub.skr();

        vox = tub.vox();

        gap = WAD;
    }

    function mold(bytes32 param, uint val) public note auth {
        if (param == 'gap') gap = val;
    }

    // Cancel debt
    function heal() public note {
        if (joy() == 0 || woe() == 0) return;  // optimised
        var wad = min(joy(), woe());
        sai.burn(wad);
        sin.burn(wad);
    }

    // Feed price (sai per skr)
    function s2s() public returns (uint) {
        var tag = tub.tag();    // ref per skr
        var par = vox.par();    // ref per sai
        return rdiv(tag, par);  // sai per skr
    }
    // Boom price (sai per skr)
    function bid(uint wad) public returns (uint) {
        return rmul(wad, wmul(s2s(), sub(2 * WAD, gap)));
    }
    // Bust price (sai per skr)
    function ask(uint wad) public returns (uint) {
        return rmul(wad, wmul(s2s(), gap));
    }
    function flip(uint wad) internal {
        require(ask(wad) > 0);
        skr.push(msg.sender, wad);
        sai.pull(msg.sender, ask(wad));
        heal();
    }
    function flop(uint wad) internal {
        skr.mint(sub(wad, fog()));
        flip(wad);
        require(joy() == 0);  // can't flop into surplus
    }
    function flap(uint wad) internal {
        heal();
        sai.push(msg.sender, bid(wad));
        skr.burn(msg.sender, wad);
    }
    function bust(uint wad) public note {
        require(!off);
        if (wad > fog()) flop(wad);
        else flip(wad);
    }
    function boom(uint wad) public note {
        require(!off);
        flap(wad);
    }

    //------------------------------------------------------------------

    function cage(uint fix_) public note auth {
        require(!off);
        off = true;
        fix = fix_;
    }
    function cash(uint wad) public note {
        require(off);
        sai.burn(msg.sender, wad);
        require(tub.gem().transfer(msg.sender, rmul(wad, fix)));
    }
    function mock(uint wad) public note {
        require(off);
        sai.mint(msg.sender, wad);
        require(tub.gem().transferFrom(msg.sender, this, rmul(wad, fix)));
    }
    function vent() public note {
        require(off);
        skr.burn(fog());
    }
}

////// src/top.sol
/// top.sol -- global settlement manager

// Copyright (C) 2017  Nikolai Mushegian <nikolai@dapphub.com>
// Copyright (C) 2017  Daniel Brockman <daniel@dapphub.com>
// Copyright (C) 2017  Rain Break <rainbreak@riseup.net>

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

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

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

/* pragma solidity ^0.4.18; */

/* import "./tub.sol"; */
/* import "./tap.sol"; */

contract SaiTop is DSThing {
    SaiVox   public  vox;
    SaiTub   public  tub;
    SaiTap   public  tap;

    DSToken  public  sai;
    DSToken  public  sin;
    DSToken  public  skr;
    ERC20    public  gem;

    uint256  public  fix;  // sai cage price (gem per sai)
    uint256  public  fit;  // skr cage price (ref per skr)
    uint256  public  caged;
    uint256  public  cooldown = 6 hours;

    function SaiTop(SaiTub tub_, SaiTap tap_) public {
        tub = tub_;
        tap = tap_;

        vox = tub.vox();

        sai = tub.sai();
        sin = tub.sin();
        skr = tub.skr();
        gem = tub.gem();
    }

    function era() public view returns (uint) {
        return block.timestamp;
    }

    // force settlement of the system at a given price (sai per gem).
    // This is nearly the equivalent of biting all cups at once.
    // Important consideration: the gems associated with free skr can
    // be tapped to make sai whole.
    function cage(uint price) internal {
        require(!tub.off() && price != 0);
        caged = era();

        tub.drip();  // collect remaining fees
        tap.heal();  // absorb any pending fees

        fit = rmul(wmul(price, vox.par()), tub.per());
        // Most gems we can get per sai is the full balance of the tub.
        // If there is no sai issued, we should still be able to cage.
        if (sai.totalSupply() == 0) {
            fix = rdiv(WAD, price);
        } else {
            fix = min(rdiv(WAD, price), rdiv(tub.pie(), sai.totalSupply()));
        }

        tub.cage(fit, rmul(fix, sai.totalSupply()));
        tap.cage(fix);

        tap.vent();    // burn pending sale skr
    }
    // cage by reading the last value from the feed for the price
    function cage() public note auth {
        cage(rdiv(uint(tub.pip().read()), vox.par()));
    }

    function flow() public note {
        require(tub.off());
        var empty = tub.din() == 0 && tap.fog() == 0;
        var ended = era() > caged + cooldown;
        require(empty || ended);
        tub.flow();
    }

    function setCooldown(uint cooldown_) public auth {
        cooldown = cooldown_;
    }
}

////// src/mom.sol
/// mom.sol -- admin manager

// Copyright (C) 2017  Nikolai Mushegian <nikolai@dapphub.com>
// Copyright (C) 2017  Daniel Brockman <daniel@dapphub.com>
// Copyright (C) 2017  Rain <rainbreak@riseup.net>

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

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

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

/* pragma solidity ^0.4.18; */

/* import 'ds-thing/thing.sol'; */
/* import './tub.sol'; */
/* import './top.sol'; */
/* import './tap.sol'; */

contract SaiMom is DSThing {
    SaiTub  public  tub;
    SaiTap  public  tap;
    SaiVox  public  vox;

    function SaiMom(SaiTub tub_, SaiTap tap_, SaiVox vox_) public {
        tub = tub_;
        tap = tap_;
        vox = vox_;
    }
    // Debt ceiling
    function setCap(uint wad) public note auth {
        tub.mold("cap", wad);
    }
    // Liquidation ratio
    function setMat(uint ray) public note auth {
        tub.mold("mat", ray);
        var axe = tub.axe();
        var mat = tub.mat();
        require(axe >= RAY && axe <= mat);
    }
    // Stability fee
    function setTax(uint ray) public note auth {
        tub.mold("tax", ray);
        var tax = tub.tax();
        require(RAY <= tax);
        require(tax < 1000001100000000000000000000);  // 10% / day
    }
    // Governance fee
    function setFee(uint ray) public note auth {
        tub.mold("fee", ray);
        var fee = tub.fee();
        require(RAY <= fee);
        require(fee < 1000001100000000000000000000);  // 10% / day
    }
    // Liquidation fee
    function setAxe(uint ray) public note auth {
        tub.mold("axe", ray);
        var axe = tub.axe();
        var mat = tub.mat();
        require(axe >= RAY && axe <= mat);
    }
    // Join/Exit Spread
    function setTubGap(uint wad) public note auth {
        tub.mold("gap", wad);
    }
    // ETH/USD Feed
    function setPip(DSValue pip_) public note auth {
        tub.setPip(pip_);
    }
    // MKR/USD Feed
    function setPep(DSValue pep_) public note auth {
        tub.setPep(pep_);
    }
    // TRFM
    function setVox(SaiVox vox_) public note auth {
        tub.setVox(vox_);
    }
    // Boom/Bust Spread
    function setTapGap(uint wad) public note auth {
        tap.mold("gap", wad);
        var gap = tap.gap();
        require(gap <= 1.05 ether);
        require(gap >= 0.95 ether);
    }
    // Rate of change of target price (per second)
    function setWay(uint ray) public note auth {
        require(ray < 1000001100000000000000000000);  // 10% / day
        require(ray >  999998800000000000000000000);
        vox.mold("way", ray);
    }
    function setHow(uint ray) public note auth {
        vox.tune(ray);
    }
}

////// src/fab.sol
/* pragma solidity ^0.4.18; */

/* import "ds-auth/auth.sol"; */
/* import 'ds-token/token.sol'; */
/* import 'ds-guard/guard.sol'; */
/* import 'ds-roles/roles.sol'; */
/* import 'ds-value/value.sol'; */

/* import './mom.sol'; */

contract GemFab {
    function newTok(bytes32 name) public returns (DSToken token) {
        token = new DSToken(name);
        token.setOwner(msg.sender);
    }
}

contract VoxFab {
    function newVox() public returns (SaiVox vox) {
        vox = new SaiVox(10 ** 27);
        vox.setOwner(msg.sender);
    }
}

contract TubFab {
    function newTub(DSToken sai, DSToken sin, DSToken skr, ERC20 gem, DSToken gov, DSValue pip, DSValue pep, SaiVox vox, address pit) public returns (SaiTub tub) {
        tub = new SaiTub(sai, sin, skr, gem, gov, pip, pep, vox, pit);
        tub.setOwner(msg.sender);
    }
}

contract TapFab {
    function newTap(SaiTub tub) public returns (SaiTap tap) {
        tap = new SaiTap(tub);
        tap.setOwner(msg.sender);
    }
}

contract TopFab {
    function newTop(SaiTub tub, SaiTap tap) public returns (SaiTop top) {
        top = new SaiTop(tub, tap);
        top.setOwner(msg.sender);
    }
}

contract MomFab {
    function newMom(SaiTub tub, SaiTap tap, SaiVox vox) public returns (SaiMom mom) {
        mom = new SaiMom(tub, tap, vox);
        mom.setOwner(msg.sender);
    }
}

contract DadFab {
    function newDad() public returns (DSGuard dad) {
        dad = new DSGuard();
        dad.setOwner(msg.sender);
    }
}

contract DaiFab is DSAuth {
    GemFab public gemFab;
    VoxFab public voxFab;
    TapFab public tapFab;
    TubFab public tubFab;
    TopFab public topFab;
    MomFab public momFab;
    DadFab public dadFab;

    DSToken public sai;
    DSToken public sin;
    DSToken public skr;

    SaiVox public vox;
    SaiTub public tub;
    SaiTap public tap;
    SaiTop public top;

    SaiMom public mom;
    DSGuard public dad;

    uint8 public step = 0;

    function DaiFab(GemFab gemFab_, VoxFab voxFab_, TubFab tubFab_, TapFab tapFab_, TopFab topFab_, MomFab momFab_, DadFab dadFab_) public {
        gemFab = gemFab_;
        voxFab = voxFab_;
        tubFab = tubFab_;
        tapFab = tapFab_;
        topFab = topFab_;
        momFab = momFab_;
        dadFab = dadFab_;
    }

    function makeTokens() public auth {
        require(step == 0);
        sai = gemFab.newTok('DAI');
        sin = gemFab.newTok('SIN');
        skr = gemFab.newTok('PETH');
        sai.setName('Dai Stablecoin v1.0');
        sin.setName('SIN');
        skr.setName('Pooled Ether');
        step += 1;
    }

    function makeVoxTub(ERC20 gem, DSToken gov, DSValue pip, DSValue pep, address pit) public auth {
        require(step == 1);
        require(address(gem) != 0x0);
        require(address(gov) != 0x0);
        require(address(pip) != 0x0);
        require(address(pep) != 0x0);
        require(pit != 0x0);
        vox = voxFab.newVox();
        tub = tubFab.newTub(sai, sin, skr, gem, gov, pip, pep, vox, pit);
        step += 1;
    }

    function makeTapTop() public auth {
        require(step == 2);
        tap = tapFab.newTap(tub);
        tub.turn(tap);
        top = topFab.newTop(tub, tap);
        step += 1;
    }

    function S(string s) internal pure returns (bytes4) {
        return bytes4(keccak256(s));
    }

    function ray(uint256 wad) internal pure returns (uint256) {
        return wad * 10 ** 9;
    }

    // Liquidation Ratio   150%
    // Liquidation Penalty 13%
    // Stability Fee       0.05%
    // PETH Fee            0%
    // Boom/Bust Spread   -3%
    // Join/Exit Spread    0%
    // Debt Ceiling        0
    function configParams() public auth {
        require(step == 3);

        tub.mold("cap", 0);
        tub.mold("mat", ray(1.5  ether));
        tub.mold("axe", ray(1.13 ether));
        tub.mold("fee", 1000000000158153903837946257);  // 0.5% / year
        tub.mold("tax", ray(1 ether));
        tub.mold("gap", 1 ether);

        tap.mold("gap", 0.97 ether);

        step += 1;
    }

    function verifyParams() public auth {
        require(step == 4);

        require(tub.cap() == 0);
        require(tub.mat() == 1500000000000000000000000000);
        require(tub.axe() == 1130000000000000000000000000);
        require(tub.fee() == 1000000000158153903837946257);
        require(tub.tax() == 1000000000000000000000000000);
        require(tub.gap() == 1000000000000000000);

        require(tap.gap() == 970000000000000000);

        require(vox.par() == 1000000000000000000000000000);
        require(vox.how() == 0);

        step += 1;
    }

    function configAuth(DSAuthority authority) public auth {
        require(step == 5);
        require(address(authority) != 0x0);

        mom = momFab.newMom(tub, tap, vox);
        dad = dadFab.newDad();

        vox.setAuthority(dad);
        vox.setOwner(0);
        tub.setAuthority(dad);
        tub.setOwner(0);
        tap.setAuthority(dad);
        tap.setOwner(0);
        sai.setAuthority(dad);
        sai.setOwner(0);
        sin.setAuthority(dad);
        sin.setOwner(0);
        skr.setAuthority(dad);
        skr.setOwner(0);

        top.setAuthority(authority);
        top.setOwner(0);
        mom.setAuthority(authority);
        mom.setOwner(0);

        dad.permit(top, tub, S("cage(uint256,uint256)"));
        dad.permit(top, tub, S("flow()"));
        dad.permit(top, tap, S("cage(uint256)"));

        dad.permit(tub, skr, S('mint(address,uint256)'));
        dad.permit(tub, skr, S('burn(address,uint256)'));

        dad.permit(tub, sai, S('mint(address,uint256)'));
        dad.permit(tub, sai, S('burn(address,uint256)'));

        dad.permit(tub, sin, S('mint(address,uint256)'));

        dad.permit(tap, sai, S('mint(address,uint256)'));
        dad.permit(tap, sai, S('burn(address,uint256)'));
        dad.permit(tap, sai, S('burn(uint256)'));
        dad.permit(tap, sin, S('burn(uint256)'));

        dad.permit(tap, skr, S('mint(uint256)'));
        dad.permit(tap, skr, S('burn(uint256)'));
        dad.permit(tap, skr, S('burn(address,uint256)'));

        dad.permit(mom, vox, S("mold(bytes32,uint256)"));
        dad.permit(mom, vox, S("tune(uint256)"));
        dad.permit(mom, tub, S("mold(bytes32,uint256)"));
        dad.permit(mom, tap, S("mold(bytes32,uint256)"));
        dad.permit(mom, tub, S("setPip(address)"));
        dad.permit(mom, tub, S("setPep(address)"));
        dad.permit(mom, tub, S("setVox(address)"));

        dad.setOwner(0);
        step += 1;
    }
}
        

Compiler Settings

{"remappings":[],"optimizer":{"runs":200,"enabled":true},"libraries":{},"compilationTarget":{"DaiFab.sol":"DaiFab"}}
              

Contract ABI

[{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"momFab","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"sin","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"skr","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"setOwner","inputs":[{"type":"address","name":"owner_"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"tubFab","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"verifyParams","inputs":[],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"tub","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"mom","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"tapFab","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"vox","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"dad","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"dadFab","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"topFab","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"setAuthority","inputs":[{"type":"address","name":"authority_"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"voxFab","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"configParams","inputs":[],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"owner","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"sai","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"configAuth","inputs":[{"type":"address","name":"authority"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"gemFab","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"makeTokens","inputs":[],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"authority","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint8","name":""}],"name":"step","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"makeTapTop","inputs":[],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"makeVoxTub","inputs":[{"type":"address","name":"gem"},{"type":"address","name":"gov"},{"type":"address","name":"pip"},{"type":"address","name":"pep"},{"type":"address","name":"pit"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"tap","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"top","inputs":[],"constant":true},{"type":"constructor","stateMutability":"nonpayable","payable":false,"inputs":[{"type":"address","name":"gemFab_"},{"type":"address","name":"voxFab_"},{"type":"address","name":"tubFab_"},{"type":"address","name":"tapFab_"},{"type":"address","name":"topFab_"},{"type":"address","name":"momFab_"},{"type":"address","name":"dadFab_"}]},{"type":"event","name":"LogSetAuthority","inputs":[{"type":"address","name":"authority","indexed":true}],"anonymous":false},{"type":"event","name":"LogSetOwner","inputs":[{"type":"address","name":"owner","indexed":true}],"anonymous":false}]
              

Contract Creation Code

Verify & Publish
0x60606040526011805460a060020a60ff0219169055341561001f57600080fd5b60405160e0806132a38339810160405280805191906020018051919060200180519190602001805191906020018051919060200180519190602001805160018054600160a060020a03191633600160a060020a031690811790915590925090507fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9460405160405180910390a260028054600160a060020a0319908116600160a060020a03998a161790915560038054821697891697909717909655600580548716958816959095179094556004805486169387169390931790925560068054851691861691909117905560078054841691851691909117905560088054909216921691909117905561316d806101366000396000f3006060604052600436106101455763ffffffff60e060020a6000350416630253fbd1811461014a578063071bafb5146101795780630f8a771e1461018c57806313af40351461019f5780631cb6adec146101c05780632592e921146101d357806334e70cc2146101e65780633df7c86d146101f95780636411273f1461020c57806367550a351461021f578063689da08e146102325780636e97786514610245578063768433c2146102585780637a9e5e4b1461026b5780637f3ded931461028a57806388ec838f1461029d5780638da5cb5b146102b05780639166cba4146102c357806395f6f2b2146102d6578063ab6d8a9a146102f5578063be28f5db14610308578063bf7e214f1461031b578063e25fe1751461032e578063e3dac95914610357578063f55a17261461036a578063fd221031146103a1578063fe6dcdba146103b4575b600080fd5b341561015557600080fd5b61015d6103c7565b604051600160a060020a03909116815260200160405180910390f35b341561018457600080fd5b61015d6103d6565b341561019757600080fd5b61015d6103e5565b34156101aa57600080fd5b6101be600160a060020a03600435166103f4565b005b34156101cb57600080fd5b61015d610466565b34156101de57600080fd5b6101be610475565b34156101f157600080fd5b61015d61090d565b341561020457600080fd5b61015d61091c565b341561021757600080fd5b61015d61092b565b341561022a57600080fd5b61015d61093a565b341561023d57600080fd5b61015d610949565b341561025057600080fd5b61015d610958565b341561026357600080fd5b61015d610967565b341561027657600080fd5b6101be600160a060020a0360043516610976565b341561029557600080fd5b61015d6109e8565b34156102a857600080fd5b6101be6109f7565b34156102bb57600080fd5b61015d610e48565b34156102ce57600080fd5b61015d610e57565b34156102e157600080fd5b6101be600160a060020a0360043516610e66565b341561030057600080fd5b61015d61278d565b341561031357600080fd5b6101be61279c565b341561032657600080fd5b61015d612b04565b341561033957600080fd5b610341612b13565b60405160ff909116815260200160405180910390f35b341561036257600080fd5b6101be612b23565b341561037557600080fd5b6101be600160a060020a0360043581169060243581169060443581169060643581169060843516612d33565b34156103ac57600080fd5b61015d612f7d565b34156103bf57600080fd5b61015d612f8c565b600754600160a060020a031681565b600a54600160a060020a031681565b600b54600160a060020a031681565b61040a33600035600160e060020a031916612f9b565b151561041557600080fd5b60018054600160a060020a031916600160a060020a038381169190911791829055167fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9460405160405180910390a250565b600554600160a060020a031681565b61048b33600035600160e060020a031916612f9b565b151561049657600080fd5b60115460a060020a900460ff166004146104af57600080fd5b600d54600160a060020a031663355274ea6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156104f757600080fd5b6102c65a03f1151561050857600080fd5b505050604051805115905061051c57600080fd5b600d54600160a060020a031663ab0783da6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561056457600080fd5b6102c65a03f1151561057557600080fd5b50505060405180516b04d8c55aefb8c05b5c00000014905061059657600080fd5b600d54600160a060020a031663509bf2bf6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156105de57600080fd5b6102c65a03f115156105ef57600080fd5b50505060405180516b03a6b6cebed490e8aa00000014905061061057600080fd5b600d54600160a060020a031663ddca3f436000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561065857600080fd5b6102c65a03f1151561066957600080fd5b50505060405180516b033b2e3ca2026060221a219114905061068a57600080fd5b600d54600160a060020a03166399c8d5566000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156106d257600080fd5b6102c65a03f115156106e357600080fd5b50505060405180516b033b2e3c9fd0803ce800000014905061070457600080fd5b600d54600160a060020a0316636c32c0a66000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561074c57600080fd5b6102c65a03f1151561075d57600080fd5b5050506040518051670de0b6b3a764000014905061077a57600080fd5b600e54600160a060020a0316636c32c0a66000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156107c257600080fd5b6102c65a03f115156107d357600080fd5b5050506040518051670d7621dc582100001490506107f057600080fd5b600c54600160a060020a031663495d32cb6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561083857600080fd5b6102c65a03f1151561084957600080fd5b50505060405180516b033b2e3c9fd0803ce800000014905061086a57600080fd5b600c54600160a060020a0316633a4a42336000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156108b257600080fd5b6102c65a03f115156108c357600080fd5b50505060405180511590506108d757600080fd5b6011805460ff60a060020a80830482166001019091160274ff000000000000000000000000000000000000000019909116179055565b600d54600160a060020a031681565b601054600160a060020a031681565b600454600160a060020a031681565b600c54600160a060020a031681565b601154600160a060020a031681565b600854600160a060020a031681565b600654600160a060020a031681565b61098c33600035600160e060020a031916612f9b565b151561099757600080fd5b60008054600160a060020a031916600160a060020a038381169190911791829055167f1abebea81bfa2637f28358c371278fb15ede7ea8dd28d2e03b112ff6d936ada460405160405180910390a250565b600354600160a060020a031681565b610a0d33600035600160e060020a031916612f9b565b1515610a1857600080fd5b60115460a060020a900460ff16600314610a3157600080fd5b600d54600160a060020a03166392b0d721600060405160e060020a63ffffffff84160281527f636170000000000000000000000000000000000000000000000000000000000060048201526024810191909152604401600060405180830381600087803b1515610aa057600080fd5b6102c65a03f11515610ab157600080fd5b5050600d54600160a060020a031690506392b0d721610ad76714d1120d7b160000613093565b60405160e060020a63ffffffff84160281527f6d6174000000000000000000000000000000000000000000000000000000000060048201526024810191909152604401600060405180830381600087803b1515610b3357600080fd5b6102c65a03f11515610b4457600080fd5b5050600d54600160a060020a031690506392b0d721610b6a670fae910354310000613093565b60405160e060020a63ffffffff84160281527f617865000000000000000000000000000000000000000000000000000000000060048201526024810191909152604401600060405180830381600087803b1515610bc657600080fd5b6102c65a03f11515610bd757600080fd5b5050600d54600160a060020a031690506392b0d7216b033b2e3ca2026060221a219160405160e060020a63ffffffff84160281527f666565000000000000000000000000000000000000000000000000000000000060048201526024810191909152604401600060405180830381600087803b1515610c5557600080fd5b6102c65a03f11515610c6657600080fd5b5050600d54600160a060020a031690506392b0d721610c8c670de0b6b3a7640000613093565b60405160e060020a63ffffffff84160281527f746178000000000000000000000000000000000000000000000000000000000060048201526024810191909152604401600060405180830381600087803b1515610ce857600080fd5b6102c65a03f11515610cf957600080fd5b5050600d54600160a060020a031690506392b0d721670de0b6b3a764000060405160e060020a63ffffffff84160281527f676170000000000000000000000000000000000000000000000000000000000060048201526024810191909152604401600060405180830381600087803b1515610d7357600080fd5b6102c65a03f11515610d8457600080fd5b5050600e54600160a060020a031690506392b0d721670d7621dc5821000060405160e060020a63ffffffff84160281527f676170000000000000000000000000000000000000000000000000000000000060048201526024810191909152604401600060405180830381600087803b1515610dfe57600080fd5b6102c65a03f11515610e0f57600080fd5b50506011805460ff60a060020a80830482166001019091160274ff00000000000000000000000000000000000000001990911617905550565b600154600160a060020a031681565b600954600160a060020a031681565b610e7c33600035600160e060020a031916612f9b565b1515610e8757600080fd5b60115460a060020a900460ff16600514610ea057600080fd5b600160a060020a0381161515610eb557600080fd5b600754600d54600e54600c54600160a060020a03938416936367b48f68938116928116911660006040516020015260405160e060020a63ffffffff8616028152600160a060020a03938416600482015291831660248301529091166044820152606401602060405180830381600087803b1515610f3157600080fd5b6102c65a03f11515610f4257600080fd5b505050604051805160108054600160a060020a031916600160a060020a039283161790556008541690506350a7755e6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610fa857600080fd5b6102c65a03f11515610fb957600080fd5b505050604051805160118054600160a060020a031916600160a060020a039283161790819055600c5482169250637a9e5e4b911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561102b57600080fd5b6102c65a03f1151561103c57600080fd5b5050600c54600160a060020a031690506313af4035600060405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561109157600080fd5b6102c65a03f115156110a257600080fd5b5050600d54601154600160a060020a039182169250637a9e5e4b911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156110fc57600080fd5b6102c65a03f1151561110d57600080fd5b5050600d54600160a060020a031690506313af4035600060405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561116257600080fd5b6102c65a03f1151561117357600080fd5b5050600e54601154600160a060020a039182169250637a9e5e4b911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156111cd57600080fd5b6102c65a03f115156111de57600080fd5b5050600e54600160a060020a031690506313af4035600060405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561123357600080fd5b6102c65a03f1151561124457600080fd5b5050600954601154600160a060020a039182169250637a9e5e4b911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561129e57600080fd5b6102c65a03f115156112af57600080fd5b5050600954600160a060020a031690506313af4035600060405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561130457600080fd5b6102c65a03f1151561131557600080fd5b5050600a54601154600160a060020a039182169250637a9e5e4b911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561136f57600080fd5b6102c65a03f1151561138057600080fd5b5050600a54600160a060020a031690506313af4035600060405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156113d557600080fd5b6102c65a03f115156113e657600080fd5b5050600b54601154600160a060020a039182169250637a9e5e4b911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561144057600080fd5b6102c65a03f1151561145157600080fd5b5050600b54600160a060020a031690506313af4035600060405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156114a657600080fd5b6102c65a03f115156114b757600080fd5b5050600f54600160a060020a03169050637a9e5e4b8260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561150b57600080fd5b6102c65a03f1151561151c57600080fd5b5050600f54600160a060020a031690506313af4035600060405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561157157600080fd5b6102c65a03f1151561158257600080fd5b5050601054600160a060020a03169050637a9e5e4b8260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156115d657600080fd5b6102c65a03f115156115e757600080fd5b5050601054600160a060020a031690506313af4035600060405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561163c57600080fd5b6102c65a03f1151561164d57600080fd5b5050601154600f54600d54600160a060020a03928316935063cbeea68c9291821691166116ac60408051908101604052601581527f636167652875696e743235362c75696e74323536290000000000000000000000602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b151561170457600080fd5b6102c65a03f1151561171557600080fd5b5050601154600f54600d54600160a060020a03928316935063cbeea68c92918216911661177460408051908101604052600681527f666c6f7728290000000000000000000000000000000000000000000000000000602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b15156117cc57600080fd5b6102c65a03f115156117dd57600080fd5b5050601154600f54600e54600160a060020a03928316935063cbeea68c92918216911661183c60408051908101604052600d81527f636167652875696e743235362900000000000000000000000000000000000000602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b151561189457600080fd5b6102c65a03f115156118a557600080fd5b5050601154600d54600b54600160a060020a03928316935063cbeea68c9291821691166118f26040805190810160405260158152600080516020613102833981519152602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b151561194a57600080fd5b6102c65a03f1151561195b57600080fd5b5050601154600d54600b54600160a060020a03928316935063cbeea68c9291821691166119a86040805190810160405260158152600080516020613122833981519152602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b1515611a0057600080fd5b6102c65a03f11515611a1157600080fd5b5050601154600d54600954600160a060020a03928316935063cbeea68c929182169116611a5e6040805190810160405260158152600080516020613102833981519152602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b1515611ab657600080fd5b6102c65a03f11515611ac757600080fd5b5050601154600d54600954600160a060020a03928316935063cbeea68c929182169116611b146040805190810160405260158152600080516020613122833981519152602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b1515611b6c57600080fd5b6102c65a03f11515611b7d57600080fd5b5050601154600d54600a54600160a060020a03928316935063cbeea68c929182169116611bca6040805190810160405260158152600080516020613102833981519152602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b1515611c2257600080fd5b6102c65a03f11515611c3357600080fd5b5050601154600e54600954600160a060020a03928316935063cbeea68c929182169116611c806040805190810160405260158152600080516020613102833981519152602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b1515611cd857600080fd5b6102c65a03f11515611ce957600080fd5b5050601154600e54600954600160a060020a03928316935063cbeea68c929182169116611d366040805190810160405260158152600080516020613122833981519152602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b1515611d8e57600080fd5b6102c65a03f11515611d9f57600080fd5b5050601154600e54600954600160a060020a03928316935063cbeea68c929182169116611dfe60408051908101604052600d81527f6275726e2875696e743235362900000000000000000000000000000000000000602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b1515611e5657600080fd5b6102c65a03f11515611e6757600080fd5b5050601154600e54600a54600160a060020a03928316935063cbeea68c929182169116611ec660408051908101604052600d81527f6275726e2875696e743235362900000000000000000000000000000000000000602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b1515611f1e57600080fd5b6102c65a03f11515611f2f57600080fd5b5050601154600e54600b54600160a060020a03928316935063cbeea68c929182169116611f8e60408051908101604052600d81527f6d696e742875696e743235362900000000000000000000000000000000000000602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b1515611fe657600080fd5b6102c65a03f11515611ff757600080fd5b5050601154600e54600b54600160a060020a03928316935063cbeea68c92918216911661205660408051908101604052600d81527f6275726e2875696e743235362900000000000000000000000000000000000000602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b15156120ae57600080fd5b6102c65a03f115156120bf57600080fd5b5050601154600e54600b54600160a060020a03928316935063cbeea68c92918216911661210c6040805190810160405260158152600080516020613122833981519152602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b151561216457600080fd5b6102c65a03f1151561217557600080fd5b5050601154601054600c54600160a060020a03928316935063cbeea68c9291821691166121d460408051908101604052601581527f6d6f6c6428627974657333322c75696e74323536290000000000000000000000602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b151561222c57600080fd5b6102c65a03f1151561223d57600080fd5b5050601154601054600c54600160a060020a03928316935063cbeea68c92918216911661229c60408051908101604052600d81527f74756e652875696e743235362900000000000000000000000000000000000000602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b15156122f457600080fd5b6102c65a03f1151561230557600080fd5b5050601154601054600d54600160a060020a03928316935063cbeea68c92918216911661236460408051908101604052601581527f6d6f6c6428627974657333322c75696e74323536290000000000000000000000602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b15156123bc57600080fd5b6102c65a03f115156123cd57600080fd5b5050601154601054600e54600160a060020a03928316935063cbeea68c92918216911661242c60408051908101604052601581527f6d6f6c6428627974657333322c75696e74323536290000000000000000000000602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b151561248457600080fd5b6102c65a03f1151561249557600080fd5b5050601154601054600d54600160a060020a03928316935063cbeea68c9291821691166124f460408051908101604052600f81527f7365745069702861646472657373290000000000000000000000000000000000602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b151561254c57600080fd5b6102c65a03f1151561255d57600080fd5b5050601154601054600d54600160a060020a03928316935063cbeea68c9291821691166125bc60408051908101604052600f81527f7365745065702861646472657373290000000000000000000000000000000000602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b151561261457600080fd5b6102c65a03f1151561262557600080fd5b5050601154601054600d54600160a060020a03928316935063cbeea68c92918216911661268460408051908101604052600f81527f736574566f782861646472657373290000000000000000000000000000000000602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b15156126dc57600080fd5b6102c65a03f115156126ed57600080fd5b5050601154600160a060020a031690506313af4035600060405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561274257600080fd5b6102c65a03f1151561275357600080fd5b50506011805460ff60a060020a80830482166001019091160274ff0000000000000000000000000000000000000000199091161790555050565b600254600160a060020a031681565b6127b233600035600160e060020a031916612f9b565b15156127bd57600080fd5b60115460a060020a900460ff16156127d457600080fd5b600254600160a060020a031663b476ae3e60006040516020015260405160e060020a63ffffffff83160281527f44414900000000000000000000000000000000000000000000000000000000006004820152602401602060405180830381600087803b151561284257600080fd5b6102c65a03f1151561285357600080fd5b505050604051805160098054600160a060020a031916600160a060020a0392831617905560025416905063b476ae3e60006040516020015260405160e060020a63ffffffff83160281527f53494e00000000000000000000000000000000000000000000000000000000006004820152602401602060405180830381600087803b15156128df57600080fd5b6102c65a03f115156128f057600080fd5b5050506040518051600a8054600160a060020a031916600160a060020a0392831617905560025416905063b476ae3e60006040516020015260405160e060020a63ffffffff83160281527f50455448000000000000000000000000000000000000000000000000000000006004820152602401602060405180830381600087803b151561297c57600080fd5b6102c65a03f1151561298d57600080fd5b5050506040518051600b8054600160a060020a031916600160a060020a03928316179055600954169050635ac801fe60405160e060020a63ffffffff83160281527f44616920537461626c65636f696e2076312e30000000000000000000000000006004820152602401600060405180830381600087803b1515612a1057600080fd5b6102c65a03f11515612a2157600080fd5b5050600a54600160a060020a03169050635ac801fe60405160e060020a63ffffffff83160281527f53494e00000000000000000000000000000000000000000000000000000000006004820152602401600060405180830381600087803b1515612a8a57600080fd5b6102c65a03f11515612a9b57600080fd5b5050600b54600160a060020a03169050635ac801fe60405160e060020a63ffffffff83160281527f506f6f6c656420457468657200000000000000000000000000000000000000006004820152602401600060405180830381600087803b1515610dfe57600080fd5b600054600160a060020a031681565b60115460a060020a900460ff1681565b612b3933600035600160e060020a031916612f9b565b1515612b4457600080fd5b60115460a060020a900460ff16600214612b5d57600080fd5b600454600d54600160a060020a03918216916372239db0911660006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515612bbd57600080fd5b6102c65a03f11515612bce57600080fd5b5050506040518051600e8054600160a060020a031916600160a060020a039283161790819055600d5482169250637e74325f911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515612c4057600080fd5b6102c65a03f11515612c5157600080fd5b5050600654600d54600e54600160a060020a03928316935063b90440d292918216911660006040516020015260405160e060020a63ffffffff8516028152600160a060020a03928316600482015291166024820152604401602060405180830381600087803b1515612cc257600080fd5b6102c65a03f11515612cd357600080fd5b5050506040518051600f8054600160a060020a03909216600160a060020a0319909216919091179055506011805460ff60a060020a80830482166001019091160274ff000000000000000000000000000000000000000019909116179055565b612d4933600035600160e060020a031916612f9b565b1515612d5457600080fd5b60115460a060020a900460ff16600114612d6d57600080fd5b600160a060020a0385161515612d8257600080fd5b600160a060020a0384161515612d9757600080fd5b600160a060020a0383161515612dac57600080fd5b600160a060020a0382161515612dc157600080fd5b600160a060020a0381161515612dd657600080fd5b600354600160a060020a03166369d3b2526000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515612e1e57600080fd5b6102c65a03f11515612e2f57600080fd5b5050506040518051600c8054600160a060020a031916600160a060020a039283161790819055600554600954600a54600b54928516955063f40a20689491821693908216928216918b918b918b918b91168a60006040516020015260405160e060020a63ffffffff8c16028152600160a060020a03998a1660048201529789166024890152958816604488015293871660648701529186166084860152851660a4850152841660c4840152831660e483015290911661010482015261012401602060405180830381600087803b1515612f0757600080fd5b6102c65a03f11515612f1857600080fd5b5050506040518051600d8054600160a060020a03909216600160a060020a031990921691909117905550506011805460ff60a060020a80830482166001019091160274ff00000000000000000000000000000000000000001990911617905550505050565b600e54600160a060020a031681565b600f54600160a060020a031681565b600030600160a060020a031683600160a060020a03161415612fbf5750600161308d565b600154600160a060020a0384811691161415612fdd5750600161308d565b600054600160a060020a03161515612ff75750600061308d565b60008054600160a060020a03169063b7009613908590309086906040516020015260405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401602060405180830381600087803b151561307057600080fd5b6102c65a03f1151561308157600080fd5b50505060405180519150505b92915050565b633b9aca000290565b6000816040518082805190602001908083835b602083106130ce5780518252601f1990920191602091820191016130af565b6001836020036101000a03801982511681845116179092525050509190910192506040915050518091039020905091905056006d696e7428616464726573732c75696e743235362900000000000000000000006275726e28616464726573732c75696e74323536290000000000000000000000a165627a7a7230582058c6c40202739855d80b09a35b125539573c108d725a772ae80beb3626c9c9830029000000000000000000000000552f355ccb9b91c8fb47d9c011abad5b72ec30e900000000000000000000000068fd0899fedeeee08b77c189d2f8ac38466ea216000000000000000000000000ec4d29fd22066e75746eb68cb51d8a7df7d28356000000000000000000000000c2baca5300b95ab18eddd9ef3070a0945298ab500000000000000000000000000eda20f7499aae7bdadc4e52fd72e49663733ed4000000000000000000000000141a206ece672e3198086c5d21f7858ad03669ea00000000000000000000000001c1103d765f62a0d909499d7b615c382cdb072d

Deployed ByteCode

0x6060604052600436106101455763ffffffff60e060020a6000350416630253fbd1811461014a578063071bafb5146101795780630f8a771e1461018c57806313af40351461019f5780631cb6adec146101c05780632592e921146101d357806334e70cc2146101e65780633df7c86d146101f95780636411273f1461020c57806367550a351461021f578063689da08e146102325780636e97786514610245578063768433c2146102585780637a9e5e4b1461026b5780637f3ded931461028a57806388ec838f1461029d5780638da5cb5b146102b05780639166cba4146102c357806395f6f2b2146102d6578063ab6d8a9a146102f5578063be28f5db14610308578063bf7e214f1461031b578063e25fe1751461032e578063e3dac95914610357578063f55a17261461036a578063fd221031146103a1578063fe6dcdba146103b4575b600080fd5b341561015557600080fd5b61015d6103c7565b604051600160a060020a03909116815260200160405180910390f35b341561018457600080fd5b61015d6103d6565b341561019757600080fd5b61015d6103e5565b34156101aa57600080fd5b6101be600160a060020a03600435166103f4565b005b34156101cb57600080fd5b61015d610466565b34156101de57600080fd5b6101be610475565b34156101f157600080fd5b61015d61090d565b341561020457600080fd5b61015d61091c565b341561021757600080fd5b61015d61092b565b341561022a57600080fd5b61015d61093a565b341561023d57600080fd5b61015d610949565b341561025057600080fd5b61015d610958565b341561026357600080fd5b61015d610967565b341561027657600080fd5b6101be600160a060020a0360043516610976565b341561029557600080fd5b61015d6109e8565b34156102a857600080fd5b6101be6109f7565b34156102bb57600080fd5b61015d610e48565b34156102ce57600080fd5b61015d610e57565b34156102e157600080fd5b6101be600160a060020a0360043516610e66565b341561030057600080fd5b61015d61278d565b341561031357600080fd5b6101be61279c565b341561032657600080fd5b61015d612b04565b341561033957600080fd5b610341612b13565b60405160ff909116815260200160405180910390f35b341561036257600080fd5b6101be612b23565b341561037557600080fd5b6101be600160a060020a0360043581169060243581169060443581169060643581169060843516612d33565b34156103ac57600080fd5b61015d612f7d565b34156103bf57600080fd5b61015d612f8c565b600754600160a060020a031681565b600a54600160a060020a031681565b600b54600160a060020a031681565b61040a33600035600160e060020a031916612f9b565b151561041557600080fd5b60018054600160a060020a031916600160a060020a038381169190911791829055167fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9460405160405180910390a250565b600554600160a060020a031681565b61048b33600035600160e060020a031916612f9b565b151561049657600080fd5b60115460a060020a900460ff166004146104af57600080fd5b600d54600160a060020a031663355274ea6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156104f757600080fd5b6102c65a03f1151561050857600080fd5b505050604051805115905061051c57600080fd5b600d54600160a060020a031663ab0783da6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561056457600080fd5b6102c65a03f1151561057557600080fd5b50505060405180516b04d8c55aefb8c05b5c00000014905061059657600080fd5b600d54600160a060020a031663509bf2bf6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156105de57600080fd5b6102c65a03f115156105ef57600080fd5b50505060405180516b03a6b6cebed490e8aa00000014905061061057600080fd5b600d54600160a060020a031663ddca3f436000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561065857600080fd5b6102c65a03f1151561066957600080fd5b50505060405180516b033b2e3ca2026060221a219114905061068a57600080fd5b600d54600160a060020a03166399c8d5566000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156106d257600080fd5b6102c65a03f115156106e357600080fd5b50505060405180516b033b2e3c9fd0803ce800000014905061070457600080fd5b600d54600160a060020a0316636c32c0a66000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561074c57600080fd5b6102c65a03f1151561075d57600080fd5b5050506040518051670de0b6b3a764000014905061077a57600080fd5b600e54600160a060020a0316636c32c0a66000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156107c257600080fd5b6102c65a03f115156107d357600080fd5b5050506040518051670d7621dc582100001490506107f057600080fd5b600c54600160a060020a031663495d32cb6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561083857600080fd5b6102c65a03f1151561084957600080fd5b50505060405180516b033b2e3c9fd0803ce800000014905061086a57600080fd5b600c54600160a060020a0316633a4a42336000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156108b257600080fd5b6102c65a03f115156108c357600080fd5b50505060405180511590506108d757600080fd5b6011805460ff60a060020a80830482166001019091160274ff000000000000000000000000000000000000000019909116179055565b600d54600160a060020a031681565b601054600160a060020a031681565b600454600160a060020a031681565b600c54600160a060020a031681565b601154600160a060020a031681565b600854600160a060020a031681565b600654600160a060020a031681565b61098c33600035600160e060020a031916612f9b565b151561099757600080fd5b60008054600160a060020a031916600160a060020a038381169190911791829055167f1abebea81bfa2637f28358c371278fb15ede7ea8dd28d2e03b112ff6d936ada460405160405180910390a250565b600354600160a060020a031681565b610a0d33600035600160e060020a031916612f9b565b1515610a1857600080fd5b60115460a060020a900460ff16600314610a3157600080fd5b600d54600160a060020a03166392b0d721600060405160e060020a63ffffffff84160281527f636170000000000000000000000000000000000000000000000000000000000060048201526024810191909152604401600060405180830381600087803b1515610aa057600080fd5b6102c65a03f11515610ab157600080fd5b5050600d54600160a060020a031690506392b0d721610ad76714d1120d7b160000613093565b60405160e060020a63ffffffff84160281527f6d6174000000000000000000000000000000000000000000000000000000000060048201526024810191909152604401600060405180830381600087803b1515610b3357600080fd5b6102c65a03f11515610b4457600080fd5b5050600d54600160a060020a031690506392b0d721610b6a670fae910354310000613093565b60405160e060020a63ffffffff84160281527f617865000000000000000000000000000000000000000000000000000000000060048201526024810191909152604401600060405180830381600087803b1515610bc657600080fd5b6102c65a03f11515610bd757600080fd5b5050600d54600160a060020a031690506392b0d7216b033b2e3ca2026060221a219160405160e060020a63ffffffff84160281527f666565000000000000000000000000000000000000000000000000000000000060048201526024810191909152604401600060405180830381600087803b1515610c5557600080fd5b6102c65a03f11515610c6657600080fd5b5050600d54600160a060020a031690506392b0d721610c8c670de0b6b3a7640000613093565b60405160e060020a63ffffffff84160281527f746178000000000000000000000000000000000000000000000000000000000060048201526024810191909152604401600060405180830381600087803b1515610ce857600080fd5b6102c65a03f11515610cf957600080fd5b5050600d54600160a060020a031690506392b0d721670de0b6b3a764000060405160e060020a63ffffffff84160281527f676170000000000000000000000000000000000000000000000000000000000060048201526024810191909152604401600060405180830381600087803b1515610d7357600080fd5b6102c65a03f11515610d8457600080fd5b5050600e54600160a060020a031690506392b0d721670d7621dc5821000060405160e060020a63ffffffff84160281527f676170000000000000000000000000000000000000000000000000000000000060048201526024810191909152604401600060405180830381600087803b1515610dfe57600080fd5b6102c65a03f11515610e0f57600080fd5b50506011805460ff60a060020a80830482166001019091160274ff00000000000000000000000000000000000000001990911617905550565b600154600160a060020a031681565b600954600160a060020a031681565b610e7c33600035600160e060020a031916612f9b565b1515610e8757600080fd5b60115460a060020a900460ff16600514610ea057600080fd5b600160a060020a0381161515610eb557600080fd5b600754600d54600e54600c54600160a060020a03938416936367b48f68938116928116911660006040516020015260405160e060020a63ffffffff8616028152600160a060020a03938416600482015291831660248301529091166044820152606401602060405180830381600087803b1515610f3157600080fd5b6102c65a03f11515610f4257600080fd5b505050604051805160108054600160a060020a031916600160a060020a039283161790556008541690506350a7755e6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610fa857600080fd5b6102c65a03f11515610fb957600080fd5b505050604051805160118054600160a060020a031916600160a060020a039283161790819055600c5482169250637a9e5e4b911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561102b57600080fd5b6102c65a03f1151561103c57600080fd5b5050600c54600160a060020a031690506313af4035600060405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561109157600080fd5b6102c65a03f115156110a257600080fd5b5050600d54601154600160a060020a039182169250637a9e5e4b911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156110fc57600080fd5b6102c65a03f1151561110d57600080fd5b5050600d54600160a060020a031690506313af4035600060405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561116257600080fd5b6102c65a03f1151561117357600080fd5b5050600e54601154600160a060020a039182169250637a9e5e4b911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156111cd57600080fd5b6102c65a03f115156111de57600080fd5b5050600e54600160a060020a031690506313af4035600060405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561123357600080fd5b6102c65a03f1151561124457600080fd5b5050600954601154600160a060020a039182169250637a9e5e4b911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561129e57600080fd5b6102c65a03f115156112af57600080fd5b5050600954600160a060020a031690506313af4035600060405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561130457600080fd5b6102c65a03f1151561131557600080fd5b5050600a54601154600160a060020a039182169250637a9e5e4b911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561136f57600080fd5b6102c65a03f1151561138057600080fd5b5050600a54600160a060020a031690506313af4035600060405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156113d557600080fd5b6102c65a03f115156113e657600080fd5b5050600b54601154600160a060020a039182169250637a9e5e4b911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561144057600080fd5b6102c65a03f1151561145157600080fd5b5050600b54600160a060020a031690506313af4035600060405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156114a657600080fd5b6102c65a03f115156114b757600080fd5b5050600f54600160a060020a03169050637a9e5e4b8260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561150b57600080fd5b6102c65a03f1151561151c57600080fd5b5050600f54600160a060020a031690506313af4035600060405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561157157600080fd5b6102c65a03f1151561158257600080fd5b5050601054600160a060020a03169050637a9e5e4b8260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156115d657600080fd5b6102c65a03f115156115e757600080fd5b5050601054600160a060020a031690506313af4035600060405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561163c57600080fd5b6102c65a03f1151561164d57600080fd5b5050601154600f54600d54600160a060020a03928316935063cbeea68c9291821691166116ac60408051908101604052601581527f636167652875696e743235362c75696e74323536290000000000000000000000602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b151561170457600080fd5b6102c65a03f1151561171557600080fd5b5050601154600f54600d54600160a060020a03928316935063cbeea68c92918216911661177460408051908101604052600681527f666c6f7728290000000000000000000000000000000000000000000000000000602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b15156117cc57600080fd5b6102c65a03f115156117dd57600080fd5b5050601154600f54600e54600160a060020a03928316935063cbeea68c92918216911661183c60408051908101604052600d81527f636167652875696e743235362900000000000000000000000000000000000000602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b151561189457600080fd5b6102c65a03f115156118a557600080fd5b5050601154600d54600b54600160a060020a03928316935063cbeea68c9291821691166118f26040805190810160405260158152600080516020613102833981519152602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b151561194a57600080fd5b6102c65a03f1151561195b57600080fd5b5050601154600d54600b54600160a060020a03928316935063cbeea68c9291821691166119a86040805190810160405260158152600080516020613122833981519152602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b1515611a0057600080fd5b6102c65a03f11515611a1157600080fd5b5050601154600d54600954600160a060020a03928316935063cbeea68c929182169116611a5e6040805190810160405260158152600080516020613102833981519152602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b1515611ab657600080fd5b6102c65a03f11515611ac757600080fd5b5050601154600d54600954600160a060020a03928316935063cbeea68c929182169116611b146040805190810160405260158152600080516020613122833981519152602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b1515611b6c57600080fd5b6102c65a03f11515611b7d57600080fd5b5050601154600d54600a54600160a060020a03928316935063cbeea68c929182169116611bca6040805190810160405260158152600080516020613102833981519152602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b1515611c2257600080fd5b6102c65a03f11515611c3357600080fd5b5050601154600e54600954600160a060020a03928316935063cbeea68c929182169116611c806040805190810160405260158152600080516020613102833981519152602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b1515611cd857600080fd5b6102c65a03f11515611ce957600080fd5b5050601154600e54600954600160a060020a03928316935063cbeea68c929182169116611d366040805190810160405260158152600080516020613122833981519152602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b1515611d8e57600080fd5b6102c65a03f11515611d9f57600080fd5b5050601154600e54600954600160a060020a03928316935063cbeea68c929182169116611dfe60408051908101604052600d81527f6275726e2875696e743235362900000000000000000000000000000000000000602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b1515611e5657600080fd5b6102c65a03f11515611e6757600080fd5b5050601154600e54600a54600160a060020a03928316935063cbeea68c929182169116611ec660408051908101604052600d81527f6275726e2875696e743235362900000000000000000000000000000000000000602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b1515611f1e57600080fd5b6102c65a03f11515611f2f57600080fd5b5050601154600e54600b54600160a060020a03928316935063cbeea68c929182169116611f8e60408051908101604052600d81527f6d696e742875696e743235362900000000000000000000000000000000000000602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b1515611fe657600080fd5b6102c65a03f11515611ff757600080fd5b5050601154600e54600b54600160a060020a03928316935063cbeea68c92918216911661205660408051908101604052600d81527f6275726e2875696e743235362900000000000000000000000000000000000000602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b15156120ae57600080fd5b6102c65a03f115156120bf57600080fd5b5050601154600e54600b54600160a060020a03928316935063cbeea68c92918216911661210c6040805190810160405260158152600080516020613122833981519152602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b151561216457600080fd5b6102c65a03f1151561217557600080fd5b5050601154601054600c54600160a060020a03928316935063cbeea68c9291821691166121d460408051908101604052601581527f6d6f6c6428627974657333322c75696e74323536290000000000000000000000602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b151561222c57600080fd5b6102c65a03f1151561223d57600080fd5b5050601154601054600c54600160a060020a03928316935063cbeea68c92918216911661229c60408051908101604052600d81527f74756e652875696e743235362900000000000000000000000000000000000000602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b15156122f457600080fd5b6102c65a03f1151561230557600080fd5b5050601154601054600d54600160a060020a03928316935063cbeea68c92918216911661236460408051908101604052601581527f6d6f6c6428627974657333322c75696e74323536290000000000000000000000602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b15156123bc57600080fd5b6102c65a03f115156123cd57600080fd5b5050601154601054600e54600160a060020a03928316935063cbeea68c92918216911661242c60408051908101604052601581527f6d6f6c6428627974657333322c75696e74323536290000000000000000000000602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b151561248457600080fd5b6102c65a03f1151561249557600080fd5b5050601154601054600d54600160a060020a03928316935063cbeea68c9291821691166124f460408051908101604052600f81527f7365745069702861646472657373290000000000000000000000000000000000602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b151561254c57600080fd5b6102c65a03f1151561255d57600080fd5b5050601154601054600d54600160a060020a03928316935063cbeea68c9291821691166125bc60408051908101604052600f81527f7365745065702861646472657373290000000000000000000000000000000000602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b151561261457600080fd5b6102c65a03f1151561262557600080fd5b5050601154601054600d54600160a060020a03928316935063cbeea68c92918216911661268460408051908101604052600f81527f736574566f782861646472657373290000000000000000000000000000000000602082015261309c565b60405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401600060405180830381600087803b15156126dc57600080fd5b6102c65a03f115156126ed57600080fd5b5050601154600160a060020a031690506313af4035600060405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561274257600080fd5b6102c65a03f1151561275357600080fd5b50506011805460ff60a060020a80830482166001019091160274ff0000000000000000000000000000000000000000199091161790555050565b600254600160a060020a031681565b6127b233600035600160e060020a031916612f9b565b15156127bd57600080fd5b60115460a060020a900460ff16156127d457600080fd5b600254600160a060020a031663b476ae3e60006040516020015260405160e060020a63ffffffff83160281527f44414900000000000000000000000000000000000000000000000000000000006004820152602401602060405180830381600087803b151561284257600080fd5b6102c65a03f1151561285357600080fd5b505050604051805160098054600160a060020a031916600160a060020a0392831617905560025416905063b476ae3e60006040516020015260405160e060020a63ffffffff83160281527f53494e00000000000000000000000000000000000000000000000000000000006004820152602401602060405180830381600087803b15156128df57600080fd5b6102c65a03f115156128f057600080fd5b5050506040518051600a8054600160a060020a031916600160a060020a0392831617905560025416905063b476ae3e60006040516020015260405160e060020a63ffffffff83160281527f50455448000000000000000000000000000000000000000000000000000000006004820152602401602060405180830381600087803b151561297c57600080fd5b6102c65a03f1151561298d57600080fd5b5050506040518051600b8054600160a060020a031916600160a060020a03928316179055600954169050635ac801fe60405160e060020a63ffffffff83160281527f44616920537461626c65636f696e2076312e30000000000000000000000000006004820152602401600060405180830381600087803b1515612a1057600080fd5b6102c65a03f11515612a2157600080fd5b5050600a54600160a060020a03169050635ac801fe60405160e060020a63ffffffff83160281527f53494e00000000000000000000000000000000000000000000000000000000006004820152602401600060405180830381600087803b1515612a8a57600080fd5b6102c65a03f11515612a9b57600080fd5b5050600b54600160a060020a03169050635ac801fe60405160e060020a63ffffffff83160281527f506f6f6c656420457468657200000000000000000000000000000000000000006004820152602401600060405180830381600087803b1515610dfe57600080fd5b600054600160a060020a031681565b60115460a060020a900460ff1681565b612b3933600035600160e060020a031916612f9b565b1515612b4457600080fd5b60115460a060020a900460ff16600214612b5d57600080fd5b600454600d54600160a060020a03918216916372239db0911660006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515612bbd57600080fd5b6102c65a03f11515612bce57600080fd5b5050506040518051600e8054600160a060020a031916600160a060020a039283161790819055600d5482169250637e74325f911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515612c4057600080fd5b6102c65a03f11515612c5157600080fd5b5050600654600d54600e54600160a060020a03928316935063b90440d292918216911660006040516020015260405160e060020a63ffffffff8516028152600160a060020a03928316600482015291166024820152604401602060405180830381600087803b1515612cc257600080fd5b6102c65a03f11515612cd357600080fd5b5050506040518051600f8054600160a060020a03909216600160a060020a0319909216919091179055506011805460ff60a060020a80830482166001019091160274ff000000000000000000000000000000000000000019909116179055565b612d4933600035600160e060020a031916612f9b565b1515612d5457600080fd5b60115460a060020a900460ff16600114612d6d57600080fd5b600160a060020a0385161515612d8257600080fd5b600160a060020a0384161515612d9757600080fd5b600160a060020a0383161515612dac57600080fd5b600160a060020a0382161515612dc157600080fd5b600160a060020a0381161515612dd657600080fd5b600354600160a060020a03166369d3b2526000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515612e1e57600080fd5b6102c65a03f11515612e2f57600080fd5b5050506040518051600c8054600160a060020a031916600160a060020a039283161790819055600554600954600a54600b54928516955063f40a20689491821693908216928216918b918b918b918b91168a60006040516020015260405160e060020a63ffffffff8c16028152600160a060020a03998a1660048201529789166024890152958816604488015293871660648701529186166084860152851660a4850152841660c4840152831660e483015290911661010482015261012401602060405180830381600087803b1515612f0757600080fd5b6102c65a03f11515612f1857600080fd5b5050506040518051600d8054600160a060020a03909216600160a060020a031990921691909117905550506011805460ff60a060020a80830482166001019091160274ff00000000000000000000000000000000000000001990911617905550505050565b600e54600160a060020a031681565b600f54600160a060020a031681565b600030600160a060020a031683600160a060020a03161415612fbf5750600161308d565b600154600160a060020a0384811691161415612fdd5750600161308d565b600054600160a060020a03161515612ff75750600061308d565b60008054600160a060020a03169063b7009613908590309086906040516020015260405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401602060405180830381600087803b151561307057600080fd5b6102c65a03f1151561308157600080fd5b50505060405180519150505b92915050565b633b9aca000290565b6000816040518082805190602001908083835b602083106130ce5780518252601f1990920191602091820191016130af565b6001836020036101000a03801982511681845116179092525050509190910192506040915050518091039020905091905056006d696e7428616464726573732c75696e743235362900000000000000000000006275726e28616464726573732c75696e74323536290000000000000000000000a165627a7a7230582058c6c40202739855d80b09a35b125539573c108d725a772ae80beb3626c9c9830029