{
  "_format": "hh-sol-artifact-1",
  "contractName": "PSM",
  "sourceName": "contracts/PSM.sol",
  "abi": [
    {
      "inputs": [],
      "name": "BurnExceedsDebt",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "DebtFloorExceeded",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InsufficientSurplus",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidFee",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "MintLimitExceeded",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "MintZero",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "MintingPaused",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NotStrategyOwner",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "RedeemPaused",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "RedeemZero",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "SurplusExceedsLimit",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ZeroAddress",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint8",
          "name": "version",
          "type": "uint8"
        }
      ],
      "name": "Initialized",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_newDebtFloor",
          "type": "uint256"
        }
      ],
      "name": "NewDebtFloorSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_newDebtLimit",
          "type": "uint256"
        }
      ],
      "name": "NewDebtLimitSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_newFeeRecipient",
          "type": "address"
        }
      ],
      "name": "NewFeeRecipientSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_mintFee",
          "type": "uint256"
        }
      ],
      "name": "NewMintFee",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_swapFee",
          "type": "uint256"
        }
      ],
      "name": "NewRedeemFee",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_newStrategy",
          "type": "address"
        }
      ],
      "name": "NewStrategySet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bool",
          "name": "_paused",
          "type": "bool"
        }
      ],
      "name": "RedeemPauseToggle",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "newVEUSDContractDebt",
          "type": "uint256"
        }
      ],
      "name": "veUSDContractDebtChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "veUSDAmount",
          "type": "uint256"
        }
      ],
      "name": "veUSDHarvested",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "veUSDAmount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "minter",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        }
      ],
      "name": "veUSDMinted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "veUSDAmount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "burner",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        }
      ],
      "name": "veUSDRedeemed",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "backing",
      "outputs": [
        {
          "internalType": "contract ERC20",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "feeRecipient",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "harvest",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "harvestAmount",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_strategy",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_feeRecipient",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_limit",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_usdc",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_veUSDToken",
          "type": "address"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "isWhitelisted",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "mintFee",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "mintFeeCompliment",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_USDCAmount",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_recipient",
          "type": "address"
        }
      ],
      "name": "mintVEUSD",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "veUSDAmount",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "redeemFee",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "redeemFeeCompliment",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "redeemPaused",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_veUSDAmount",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_recipient",
          "type": "address"
        }
      ],
      "name": "redeemVEUSD",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "USDCAmount",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_newDebtFloor",
          "type": "uint256"
        }
      ],
      "name": "setDebtFloor",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_newDebtLimit",
          "type": "uint256"
        }
      ],
      "name": "setDebtLimit",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_newFeeRecipient",
          "type": "address"
        }
      ],
      "name": "setFeeRecipient",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_newMintFee",
          "type": "uint256"
        }
      ],
      "name": "setMintFee",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_newRedeemFee",
          "type": "uint256"
        }
      ],
      "name": "setRedeemFee",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_newStrategy",
          "type": "address"
        }
      ],
      "name": "setStrategy",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "user",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "whitelisted",
          "type": "bool"
        }
      ],
      "name": "setWhitelist",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "strategy",
      "outputs": [
        {
          "internalType": "contract IStrategy",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bool",
          "name": "_paused",
          "type": "bool"
        }
      ],
      "name": "toggleRedeemPaused",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "veUSD",
      "outputs": [
        {
          "internalType": "contract IveUSDToken",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "veUSDContractDebt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "veUSDDebtFloor",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "veUSDDebtLimit",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "bytecode": "0x60806040526101f4609e556101f4609f5561251c60a05561251c60a15534801561002857600080fd5b50611c85806100386000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c8063807ef089116100f9578063c9503fe211610097578063e74b981b11610071578063e74b981b1461037a578063eddd0d9c1461038d578063f2fde38b146103a0578063f8528268146103b357600080fd5b8063c9503fe21461034b578063d04a9a1d1461035e578063df2ddf611461037157600080fd5b8063965fa21e116100d3578063965fa21e14610319578063997efee714610322578063a8c62e761461032b578063b235d4681461033e57600080fd5b8063807ef089146102ec57806381e380c2146102ff5780638da5cb5b1461030857600080fd5b806353d6fd59116101665780635d841af5116101405780635d841af5146102ab578063662112e8146102be578063715018a6146102d157806373fdc15e146102d957600080fd5b806353d6fd591461027c57806353f684111461028f5780635bb71e601461029857600080fd5b80633af32abf116101a25780633af32abf1461020d5780634641257d1461024057806346904840146102485780634817fe941461027357600080fd5b806313966db5146101c957806333a100ca146101e557806333e1a223146101fa575b600080fd5b6101d2609e5481565b6040519081526020015b60405180910390f35b6101f86101f3366004611a59565b6103c6565b005b6101f8610208366004611a7d565b610726565b61023061021b366004611a59565b60a36020526000908152604090205460ff1681565b60405190151581526020016101dc565b6101d2610af7565b60995461025b906001600160a01b031681565b6040516001600160a01b0390911681526020016101dc565b6101d2609d5481565b6101f861028a366004611af3565b610ce8565b6101d2609b5481565b6101f86102a6366004611b2c565b610d1b565b6101f86102b9366004611b2c565b610d5f565b6101f86102cc366004611b45565b610dce565b6101f8610e17565b6101d26102e7366004611b62565b610e2b565b60985461025b906001600160a01b031681565b6101d260a15481565b6065546001600160a01b031661025b565b6101d2609f5481565b6101d260a25481565b609a5461025b906001600160a01b031681565b609c546102309060ff1681565b60975461025b906001600160a01b031681565b6101f861036c366004611b2c565b61116d565b6101d260a05481565b6101f8610388366004611a59565b6111aa565b6101f861039b366004611b2c565b611227565b6101f86103ae366004611a59565b611296565b6101d26103c1366004611b62565b611326565b6103ce6115f0565b306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610416573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043a9190611b87565b6001600160a01b0316146104615760405163c6c9505d60e01b815260040160405180910390fd5b609a54604080517fe9ec2e9900000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163e9ec2e999160048083019260209291908290030181865afa1580156104c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e89190611ba4565b9050801561056157609a54604051632e1a7d4d60e01b8152600481018390526001600160a01b0390911690632e1a7d4d906024016020604051808303816000875af115801561053b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061055f9190611ba4565b505b609754609a5460405163095ea7b360e01b81526001600160a01b0391821660048201526000602482015291169063095ea7b3906044016020604051808303816000875af11580156105b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105da9190611bbd565b5060975460405163095ea7b360e01b81526001600160a01b03848116600483015260001960248301529091169063095ea7b3906044016020604051808303816000875af115801561062f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106539190611bbd565b50609a80546001600160a01b0319166001600160a01b03841617905580156106e657609a5460405163b6b55f2560e01b8152600481018390526001600160a01b039091169063b6b55f25906024016020604051808303816000875af11580156106c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e49190611ba4565b505b6040516001600160a01b03831681527f606d28393995dd5bcd8fcc49f215468b603ff5f8136d36d029d2774dc61d541f9060200160405180910390a15050565b600054610100900460ff16158080156107465750600054600160ff909116105b806107605750303b158015610760575060005460ff166001145b6107d75760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b6000805460ff1916600117905580156107fa576000805461ff0019166101001790555b609780546001600160a01b038086166001600160a01b031992831617909255609880549285169290911691909117905561083261164a565b61083a6116bd565b306001600160a01b0316866001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610882573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a69190611b87565b6001600160a01b0316146108cd5760405163c6c9505d60e01b815260040160405180910390fd5b60975460405163095ea7b360e01b81526001600160a01b03888116600483015260001960248301529091169063095ea7b3906044016020604051808303816000875af1158015610921573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109459190611bbd565b50609a80546001600160a01b0319166001600160a01b0388169081179091556040519081527f606d28393995dd5bcd8fcc49f215468b603ff5f8136d36d029d2774dc61d541f9060200160405180910390a16001600160a01b0385166109be5760405163d92e233d60e01b815260040160405180910390fd5b609980546001600160a01b0319166001600160a01b0387169081179091556040519081527f74448f8a9094bf6063f4954b84b7591aaba46b83095656e7e4d74620f56fa6b69060200160405180910390a1609b8490556040518481527f66eb1a1564331acf8d7a80a0f8dece00ea71686108e5414481ccbe1d2e7f4e709060200160405180910390a1604051600081527fcdb4366e279aa16c03ca314a4701cafbf4d9e6793b518d87a06af55bf98177229060200160405180910390a16101f4609e819055609f819055610a9490612710611bf0565b60a055609f54610aa690612710611bf0565b60a1558015610aef576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b60008064e8d4a51000609a60009054906101000a90046001600160a01b03166001600160a01b031663e9ec2e996040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b779190611ba4565b610b819190611c03565b9050609d548111610bbe576040517f94290ab900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609b54811115610bfa576040517fb1cd183400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609d54610c079082611bf0565b6098546099546040516340c10f1960e01b81526001600160a01b0391821660048201526024810184905292945016906340c10f1990604401600060405180830381600087803b158015610c5957600080fd5b505af1158015610c6d573d6000803e3d6000fd5b505050609d829055506040518281527f97e76fc02747795ae3f0fa0626e2d75a46189f9f615347666fb58f9f863b27e99060200160405180910390a17f271def9a2d350b079e8f3ded976dc3a2f531668777f4f8958612fb573fccd70f609d54604051610cdc91815260200190565b60405180910390a15090565b610cf06115f0565b6001600160a01b0391909116600090815260a360205260409020805460ff1916911515919091179055565b610d236115f0565b609b8190556040518181527f66eb1a1564331acf8d7a80a0f8dece00ea71686108e5414481ccbe1d2e7f4e70906020015b60405180910390a150565b610d676115f0565b6101f4811115610d8a576040516358d620b360e01b815260040160405180910390fd5b609f819055610d9b81612710611bf0565b60a1556040518181527fa7325d48173e48dc8fabb427e5687dfc93531115dcfb1dada450d58a196881cb90602001610d54565b610dd66115f0565b609c805460ff19168215159081179091556040519081527fcdb4366e279aa16c03ca314a4701cafbf4d9e6793b518d87a06af55bf981772290602001610d54565b610e1f6115f0565b610e296000611730565b565b6000610e35611782565b609c5460ff1615610e72576040517f60b78ed200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82600003610eac576040517f2039b62800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609854610ec4906001600160a01b03163330866117db565b33600090815260a36020526040812054819060ff1615610ee957508390506000610f13565b61271060a15486610efa9190611c03565b610f049190611c1a565b9150610f108286611bf0565b90505b610f2264e8d4a5100083611c1a565b9250609d54821115610f60576040517f62e243a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6098546040517f9dc29fac000000000000000000000000000000000000000000000000000000008152306004820152602481018490526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b158015610fc557600080fd5b505af1158015610fd9573d6000803e3d6000fd5b50505050600081111561100357609854609954611003916001600160a01b039081169116836118a5565b609a54604051632e1a7d4d60e01b8152600481018590526001600160a01b0390911690632e1a7d4d906024016020604051808303816000875af115801561104e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110729190611ba4565b60975490935061108c906001600160a01b031685856118a5565b81609d5461109a9190611bf0565b609d81905560a25411156110da576040517ff7da1df300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518381523360208201526001600160a01b0386168183015290517f7be7305515018796b4bacec04b98e5ed30fe7cf99b251afac7403ad4794ab5f69181900360600190a17f271def9a2d350b079e8f3ded976dc3a2f531668777f4f8958612fb573fccd70f609d5460405161115491815260200190565b60405180910390a1505061116760018055565b92915050565b6111756115f0565b60a28190556040518181527fb08aa98241ffa0b628a3ea20f3351ccb097459b291717463ce9920006dddfb9390602001610d54565b6111b26115f0565b6001600160a01b0381166111d95760405163d92e233d60e01b815260040160405180910390fd5b609980546001600160a01b0319166001600160a01b0383169081179091556040519081527f74448f8a9094bf6063f4954b84b7591aaba46b83095656e7e4d74620f56fa6b690602001610d54565b61122f6115f0565b6101f4811115611252576040516358d620b360e01b815260040160405180910390fd5b609e81905561126381612710611bf0565b60a0556040518181527f43eb3d1037b3c8032370545755ccba67e36710246ce1454aeb16c20447669ed690602001610d54565b61129e6115f0565b6001600160a01b03811661131a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107ce565b61132381611730565b50565b6000611330611782565b8260000361136a576040517f4406518e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609b546000036113a6576040517feb56075600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6097546113be906001600160a01b03163330866117db565b33600090815260a36020526040812054819060ff16156113e35750839050600061140d565b61271060a054866113f49190611c03565b6113fe9190611c1a565b915061140a8286611bf0565b90505b61141c64e8d4a5100083611c03565b92506000609d548461142e9190611c3c565b9050609b5481111561146c576040517fb643bfa600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b811561148f5760975460995461148f916001600160a01b039081169116846118a5565b609a5460405163b6b55f2560e01b8152600481018590526001600160a01b039091169063b6b55f25906024016020604051808303816000875af11580156114da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114fe9190611ba4565b506098546040516340c10f1960e01b81526001600160a01b03878116600483015260248201879052909116906340c10f1990604401600060405180830381600087803b15801561154d57600080fd5b505af1158015611561573d6000803e3d6000fd5b505050609d82905550604080518581523360208201526001600160a01b0387168183015290517f87b4d11529306127ba6cd9d14fba0f23e4f657358ee9a35788e912c07035369d9181900360600190a16040518181527f271def9a2d350b079e8f3ded976dc3a2f531668777f4f8958612fb573fccd70f9060200160405180910390a150505061116760018055565b6065546001600160a01b03163314610e295760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107ce565b600054610100900460ff166116b55760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016107ce565b610e29611965565b600054610100900460ff166117285760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016107ce565b610e296119d9565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6002600154036117d45760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107ce565b6002600155565b60006040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526001600160a01b03841660248201528260448201526020600060648360008a5af191505080601f3d11600160005114161516156118515750833b153d17155b8061189e5760405162461bcd60e51b815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c454400000000000000000000000060448201526064016107ce565b5050505050565b60006040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152826024820152602060006044836000895af191505080601f3d116001600051141615161561190c5750823b153d17155b806119595760405162461bcd60e51b815260206004820152600f60248201527f5452414e534645525f4641494c4544000000000000000000000000000000000060448201526064016107ce565b50505050565b60018055565b600054610100900460ff166119d05760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016107ce565b610e2933611730565b600054610100900460ff1661195f5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016107ce565b6001600160a01b038116811461132357600080fd5b600060208284031215611a6b57600080fd5b8135611a7681611a44565b9392505050565b600080600080600060a08688031215611a9557600080fd5b8535611aa081611a44565b94506020860135611ab081611a44565b9350604086013592506060860135611ac781611a44565b91506080860135611ad781611a44565b809150509295509295909350565b801515811461132357600080fd5b60008060408385031215611b0657600080fd5b8235611b1181611a44565b91506020830135611b2181611ae5565b809150509250929050565b600060208284031215611b3e57600080fd5b5035919050565b600060208284031215611b5757600080fd5b8135611a7681611ae5565b60008060408385031215611b7557600080fd5b823591506020830135611b2181611a44565b600060208284031215611b9957600080fd5b8151611a7681611a44565b600060208284031215611bb657600080fd5b5051919050565b600060208284031215611bcf57600080fd5b8151611a7681611ae5565b634e487b7160e01b600052601160045260246000fd5b8181038181111561116757611167611bda565b808202811582820484141761116757611167611bda565b600082611c3757634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561116757611167611bda56fea26469706673582212204e70426603f2216d182996abc2208b694b8381973fbb8cd1b975232bc020347064736f6c63430008130033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101c45760003560e01c8063807ef089116100f9578063c9503fe211610097578063e74b981b11610071578063e74b981b1461037a578063eddd0d9c1461038d578063f2fde38b146103a0578063f8528268146103b357600080fd5b8063c9503fe21461034b578063d04a9a1d1461035e578063df2ddf611461037157600080fd5b8063965fa21e116100d3578063965fa21e14610319578063997efee714610322578063a8c62e761461032b578063b235d4681461033e57600080fd5b8063807ef089146102ec57806381e380c2146102ff5780638da5cb5b1461030857600080fd5b806353d6fd59116101665780635d841af5116101405780635d841af5146102ab578063662112e8146102be578063715018a6146102d157806373fdc15e146102d957600080fd5b806353d6fd591461027c57806353f684111461028f5780635bb71e601461029857600080fd5b80633af32abf116101a25780633af32abf1461020d5780634641257d1461024057806346904840146102485780634817fe941461027357600080fd5b806313966db5146101c957806333a100ca146101e557806333e1a223146101fa575b600080fd5b6101d2609e5481565b6040519081526020015b60405180910390f35b6101f86101f3366004611a59565b6103c6565b005b6101f8610208366004611a7d565b610726565b61023061021b366004611a59565b60a36020526000908152604090205460ff1681565b60405190151581526020016101dc565b6101d2610af7565b60995461025b906001600160a01b031681565b6040516001600160a01b0390911681526020016101dc565b6101d2609d5481565b6101f861028a366004611af3565b610ce8565b6101d2609b5481565b6101f86102a6366004611b2c565b610d1b565b6101f86102b9366004611b2c565b610d5f565b6101f86102cc366004611b45565b610dce565b6101f8610e17565b6101d26102e7366004611b62565b610e2b565b60985461025b906001600160a01b031681565b6101d260a15481565b6065546001600160a01b031661025b565b6101d2609f5481565b6101d260a25481565b609a5461025b906001600160a01b031681565b609c546102309060ff1681565b60975461025b906001600160a01b031681565b6101f861036c366004611b2c565b61116d565b6101d260a05481565b6101f8610388366004611a59565b6111aa565b6101f861039b366004611b2c565b611227565b6101f86103ae366004611a59565b611296565b6101d26103c1366004611b62565b611326565b6103ce6115f0565b306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610416573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043a9190611b87565b6001600160a01b0316146104615760405163c6c9505d60e01b815260040160405180910390fd5b609a54604080517fe9ec2e9900000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163e9ec2e999160048083019260209291908290030181865afa1580156104c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e89190611ba4565b9050801561056157609a54604051632e1a7d4d60e01b8152600481018390526001600160a01b0390911690632e1a7d4d906024016020604051808303816000875af115801561053b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061055f9190611ba4565b505b609754609a5460405163095ea7b360e01b81526001600160a01b0391821660048201526000602482015291169063095ea7b3906044016020604051808303816000875af11580156105b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105da9190611bbd565b5060975460405163095ea7b360e01b81526001600160a01b03848116600483015260001960248301529091169063095ea7b3906044016020604051808303816000875af115801561062f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106539190611bbd565b50609a80546001600160a01b0319166001600160a01b03841617905580156106e657609a5460405163b6b55f2560e01b8152600481018390526001600160a01b039091169063b6b55f25906024016020604051808303816000875af11580156106c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e49190611ba4565b505b6040516001600160a01b03831681527f606d28393995dd5bcd8fcc49f215468b603ff5f8136d36d029d2774dc61d541f9060200160405180910390a15050565b600054610100900460ff16158080156107465750600054600160ff909116105b806107605750303b158015610760575060005460ff166001145b6107d75760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b6000805460ff1916600117905580156107fa576000805461ff0019166101001790555b609780546001600160a01b038086166001600160a01b031992831617909255609880549285169290911691909117905561083261164a565b61083a6116bd565b306001600160a01b0316866001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610882573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a69190611b87565b6001600160a01b0316146108cd5760405163c6c9505d60e01b815260040160405180910390fd5b60975460405163095ea7b360e01b81526001600160a01b03888116600483015260001960248301529091169063095ea7b3906044016020604051808303816000875af1158015610921573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109459190611bbd565b50609a80546001600160a01b0319166001600160a01b0388169081179091556040519081527f606d28393995dd5bcd8fcc49f215468b603ff5f8136d36d029d2774dc61d541f9060200160405180910390a16001600160a01b0385166109be5760405163d92e233d60e01b815260040160405180910390fd5b609980546001600160a01b0319166001600160a01b0387169081179091556040519081527f74448f8a9094bf6063f4954b84b7591aaba46b83095656e7e4d74620f56fa6b69060200160405180910390a1609b8490556040518481527f66eb1a1564331acf8d7a80a0f8dece00ea71686108e5414481ccbe1d2e7f4e709060200160405180910390a1604051600081527fcdb4366e279aa16c03ca314a4701cafbf4d9e6793b518d87a06af55bf98177229060200160405180910390a16101f4609e819055609f819055610a9490612710611bf0565b60a055609f54610aa690612710611bf0565b60a1558015610aef576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b60008064e8d4a51000609a60009054906101000a90046001600160a01b03166001600160a01b031663e9ec2e996040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b779190611ba4565b610b819190611c03565b9050609d548111610bbe576040517f94290ab900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609b54811115610bfa576040517fb1cd183400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609d54610c079082611bf0565b6098546099546040516340c10f1960e01b81526001600160a01b0391821660048201526024810184905292945016906340c10f1990604401600060405180830381600087803b158015610c5957600080fd5b505af1158015610c6d573d6000803e3d6000fd5b505050609d829055506040518281527f97e76fc02747795ae3f0fa0626e2d75a46189f9f615347666fb58f9f863b27e99060200160405180910390a17f271def9a2d350b079e8f3ded976dc3a2f531668777f4f8958612fb573fccd70f609d54604051610cdc91815260200190565b60405180910390a15090565b610cf06115f0565b6001600160a01b0391909116600090815260a360205260409020805460ff1916911515919091179055565b610d236115f0565b609b8190556040518181527f66eb1a1564331acf8d7a80a0f8dece00ea71686108e5414481ccbe1d2e7f4e70906020015b60405180910390a150565b610d676115f0565b6101f4811115610d8a576040516358d620b360e01b815260040160405180910390fd5b609f819055610d9b81612710611bf0565b60a1556040518181527fa7325d48173e48dc8fabb427e5687dfc93531115dcfb1dada450d58a196881cb90602001610d54565b610dd66115f0565b609c805460ff19168215159081179091556040519081527fcdb4366e279aa16c03ca314a4701cafbf4d9e6793b518d87a06af55bf981772290602001610d54565b610e1f6115f0565b610e296000611730565b565b6000610e35611782565b609c5460ff1615610e72576040517f60b78ed200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82600003610eac576040517f2039b62800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609854610ec4906001600160a01b03163330866117db565b33600090815260a36020526040812054819060ff1615610ee957508390506000610f13565b61271060a15486610efa9190611c03565b610f049190611c1a565b9150610f108286611bf0565b90505b610f2264e8d4a5100083611c1a565b9250609d54821115610f60576040517f62e243a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6098546040517f9dc29fac000000000000000000000000000000000000000000000000000000008152306004820152602481018490526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b158015610fc557600080fd5b505af1158015610fd9573d6000803e3d6000fd5b50505050600081111561100357609854609954611003916001600160a01b039081169116836118a5565b609a54604051632e1a7d4d60e01b8152600481018590526001600160a01b0390911690632e1a7d4d906024016020604051808303816000875af115801561104e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110729190611ba4565b60975490935061108c906001600160a01b031685856118a5565b81609d5461109a9190611bf0565b609d81905560a25411156110da576040517ff7da1df300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518381523360208201526001600160a01b0386168183015290517f7be7305515018796b4bacec04b98e5ed30fe7cf99b251afac7403ad4794ab5f69181900360600190a17f271def9a2d350b079e8f3ded976dc3a2f531668777f4f8958612fb573fccd70f609d5460405161115491815260200190565b60405180910390a1505061116760018055565b92915050565b6111756115f0565b60a28190556040518181527fb08aa98241ffa0b628a3ea20f3351ccb097459b291717463ce9920006dddfb9390602001610d54565b6111b26115f0565b6001600160a01b0381166111d95760405163d92e233d60e01b815260040160405180910390fd5b609980546001600160a01b0319166001600160a01b0383169081179091556040519081527f74448f8a9094bf6063f4954b84b7591aaba46b83095656e7e4d74620f56fa6b690602001610d54565b61122f6115f0565b6101f4811115611252576040516358d620b360e01b815260040160405180910390fd5b609e81905561126381612710611bf0565b60a0556040518181527f43eb3d1037b3c8032370545755ccba67e36710246ce1454aeb16c20447669ed690602001610d54565b61129e6115f0565b6001600160a01b03811661131a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107ce565b61132381611730565b50565b6000611330611782565b8260000361136a576040517f4406518e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609b546000036113a6576040517feb56075600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6097546113be906001600160a01b03163330866117db565b33600090815260a36020526040812054819060ff16156113e35750839050600061140d565b61271060a054866113f49190611c03565b6113fe9190611c1a565b915061140a8286611bf0565b90505b61141c64e8d4a5100083611c03565b92506000609d548461142e9190611c3c565b9050609b5481111561146c576040517fb643bfa600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b811561148f5760975460995461148f916001600160a01b039081169116846118a5565b609a5460405163b6b55f2560e01b8152600481018590526001600160a01b039091169063b6b55f25906024016020604051808303816000875af11580156114da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114fe9190611ba4565b506098546040516340c10f1960e01b81526001600160a01b03878116600483015260248201879052909116906340c10f1990604401600060405180830381600087803b15801561154d57600080fd5b505af1158015611561573d6000803e3d6000fd5b505050609d82905550604080518581523360208201526001600160a01b0387168183015290517f87b4d11529306127ba6cd9d14fba0f23e4f657358ee9a35788e912c07035369d9181900360600190a16040518181527f271def9a2d350b079e8f3ded976dc3a2f531668777f4f8958612fb573fccd70f9060200160405180910390a150505061116760018055565b6065546001600160a01b03163314610e295760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107ce565b600054610100900460ff166116b55760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016107ce565b610e29611965565b600054610100900460ff166117285760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016107ce565b610e296119d9565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6002600154036117d45760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107ce565b6002600155565b60006040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526001600160a01b03841660248201528260448201526020600060648360008a5af191505080601f3d11600160005114161516156118515750833b153d17155b8061189e5760405162461bcd60e51b815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c454400000000000000000000000060448201526064016107ce565b5050505050565b60006040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152826024820152602060006044836000895af191505080601f3d116001600051141615161561190c5750823b153d17155b806119595760405162461bcd60e51b815260206004820152600f60248201527f5452414e534645525f4641494c4544000000000000000000000000000000000060448201526064016107ce565b50505050565b60018055565b600054610100900460ff166119d05760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016107ce565b610e2933611730565b600054610100900460ff1661195f5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016107ce565b6001600160a01b038116811461132357600080fd5b600060208284031215611a6b57600080fd5b8135611a7681611a44565b9392505050565b600080600080600060a08688031215611a9557600080fd5b8535611aa081611a44565b94506020860135611ab081611a44565b9350604086013592506060860135611ac781611a44565b91506080860135611ad781611a44565b809150509295509295909350565b801515811461132357600080fd5b60008060408385031215611b0657600080fd5b8235611b1181611a44565b91506020830135611b2181611ae5565b809150509250929050565b600060208284031215611b3e57600080fd5b5035919050565b600060208284031215611b5757600080fd5b8135611a7681611ae5565b60008060408385031215611b7557600080fd5b823591506020830135611b2181611a44565b600060208284031215611b9957600080fd5b8151611a7681611a44565b600060208284031215611bb657600080fd5b5051919050565b600060208284031215611bcf57600080fd5b8151611a7681611ae5565b634e487b7160e01b600052601160045260246000fd5b8181038181111561116757611167611bda565b808202811582820484141761116757611167611bda565b600082611c3757634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561116757611167611bda56fea26469706673582212204e70426603f2216d182996abc2208b694b8381973fbb8cd1b975232bc020347064736f6c63430008130033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
