-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path3579.bandle.js
1 lines (1 loc) · 195 KB
/
3579.bandle.js
1
"use strict";(self.webpackChunkhedge=self.webpackChunkhedge||[]).push([[3579],{33579:module=>{eval('module.exports = JSON.parse(\'{"address":"0x88eB2123ED2e5e00FF27D4b6b8445552FB5Dd742","abi":[{"inputs":[{"internalType":"contract IHegicOperationalTreasury","name":"_pool","type":"address"},{"internalType":"contract AggregatorV3Interface","name":"_priceProvider","type":"address"},{"internalType":"contract IPremiumCalculator","name":"_pricer","type":"address"},{"internalType":"uint8","name":"_spotDecimals","type":"uint8"},{"internalType":"uint256","name":"limit","type":"uint256"},{"internalType":"uint256","name":"percentage","type":"uint256"},{"internalType":"uint8","name":"_roundedDecimals","type":"uint8"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"premium","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"strike","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"expiration","type":"uint32"}],"name":"Acquired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"premium","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"atmStrike","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"otmStrike","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"expiration","type":"uint32"}],"name":"AcquiredSpread","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"premium","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"callStrike","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"putStrike","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"expiration","type":"uint32"}],"name":"AcquiredStrangle","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"limit","type":"uint256"}],"name":"SetLimit","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint128","name":"amount","type":"uint128"},{"internalType":"uint256","name":"strike","type":"uint256"}],"name":"buy","outputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint128","name":"amount","type":"uint128"},{"internalType":"uint256","name":"strike","type":"uint256"}],"name":"calculatePremium","outputs":[{"internalType":"uint256","name":"premium","type":"uint256"},{"internalType":"uint256","name":"available","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateralizationRatio","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"optionID","type":"uint256"}],"name":"exercise","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getLockedByStrategy","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"k","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockedLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pool","outputs":[{"internalType":"contract IHegicOperationalTreasury","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceProvider","outputs":[{"internalType":"contract AggregatorV3Interface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pricer","outputs":[{"internalType":"contract IPremiumCalculator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"optionID","type":"uint256"}],"name":"profitOf","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setK","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IPremiumCalculator","name":"value","type":"address"}],"name":"setPricer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"strategyData","outputs":[{"internalType":"uint128","name":"amount","type":"uint128"},{"internalType":"uint128","name":"strike","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strikePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"transactionHash":"0xd9117b7ef00ee6215a8060f4fb83be49968e58d7513259500798a7d712513678","receipt":{"to":null,"from":"0xF15968a096Fc8F47650001585d23bEE819b5affb","contractAddress":"0x88eB2123ED2e5e00FF27D4b6b8445552FB5Dd742","transactionIndex":0,"gasUsed":"30843785","logsBloom":"0x00000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000020000000000020000000800000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000010000000000000000000000000000100004000000020000000000000000000000100000000000000000000000000000000000000000000","blockHash":"0xece4ac13b0d104a6deb560b73ea71ed35c36aed82f8e96ea0d9867dfa048a7d3","transactionHash":"0xd9117b7ef00ee6215a8060f4fb83be49968e58d7513259500798a7d712513678","logs":[{"transactionIndex":0,"blockNumber":17262355,"transactionHash":"0xd9117b7ef00ee6215a8060f4fb83be49968e58d7513259500798a7d712513678","address":"0x88eB2123ED2e5e00FF27D4b6b8445552FB5Dd742","topics":["0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000f15968a096fc8f47650001585d23bee819b5affb","0x000000000000000000000000f15968a096fc8f47650001585d23bee819b5affb"],"data":"0x","logIndex":0,"blockHash":"0xece4ac13b0d104a6deb560b73ea71ed35c36aed82f8e96ea0d9867dfa048a7d3"}],"blockNumber":17262355,"cumulativeGasUsed":"13949365","status":1,"byzantium":true},"args":["0xB0F9F032158510cd4a926F9263Abc86bAF7b4Ab3","0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612","0x30CffE3CACe98D297C586831741f06f115963F56",18,33333000000,70,0],"numDeployments":1,"solcInputHash":"757bafa4a73a0c219bd892c3e1c0b361","metadata":"{\\\\"compiler\\\\":{\\\\"version\\\\":\\\\"0.8.6+commit.11564f7e\\\\"},\\\\"language\\\\":\\\\"Solidity\\\\",\\\\"output\\\\":{\\\\"abi\\\\":[{\\\\"inputs\\\\":[{\\\\"internalType\\\\":\\\\"contract IHegicOperationalTreasury\\\\",\\\\"name\\\\":\\\\"_pool\\\\",\\\\"type\\\\":\\\\"address\\\\"},{\\\\"internalType\\\\":\\\\"contract AggregatorV3Interface\\\\",\\\\"name\\\\":\\\\"_priceProvider\\\\",\\\\"type\\\\":\\\\"address\\\\"},{\\\\"internalType\\\\":\\\\"contract IPremiumCalculator\\\\",\\\\"name\\\\":\\\\"_pricer\\\\",\\\\"type\\\\":\\\\"address\\\\"},{\\\\"internalType\\\\":\\\\"uint8\\\\",\\\\"name\\\\":\\\\"_spotDecimals\\\\",\\\\"type\\\\":\\\\"uint8\\\\"},{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"limit\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"percentage\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"internalType\\\\":\\\\"uint8\\\\",\\\\"name\\\\":\\\\"_roundedDecimals\\\\",\\\\"type\\\\":\\\\"uint8\\\\"}],\\\\"stateMutability\\\\":\\\\"nonpayable\\\\",\\\\"type\\\\":\\\\"constructor\\\\"},{\\\\"anonymous\\\\":false,\\\\"inputs\\\\":[{\\\\"indexed\\\\":true,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"id\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"amount\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"premium\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"strike\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint32\\\\",\\\\"name\\\\":\\\\"expiration\\\\",\\\\"type\\\\":\\\\"uint32\\\\"}],\\\\"name\\\\":\\\\"Acquired\\\\",\\\\"type\\\\":\\\\"event\\\\"},{\\\\"anonymous\\\\":false,\\\\"inputs\\\\":[{\\\\"indexed\\\\":true,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"id\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"amount\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"premium\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"atmStrike\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"otmStrike\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint32\\\\",\\\\"name\\\\":\\\\"expiration\\\\",\\\\"type\\\\":\\\\"uint32\\\\"}],\\\\"name\\\\":\\\\"AcquiredSpread\\\\",\\\\"type\\\\":\\\\"event\\\\"},{\\\\"anonymous\\\\":false,\\\\"inputs\\\\":[{\\\\"indexed\\\\":true,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"id\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"amount\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"premium\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"callStrike\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"putStrike\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint32\\\\",\\\\"name\\\\":\\\\"expiration\\\\",\\\\"type\\\\":\\\\"uint32\\\\"}],\\\\"name\\\\":\\\\"AcquiredStrangle\\\\",\\\\"type\\\\":\\\\"event\\\\"},{\\\\"anonymous\\\\":false,\\\\"inputs\\\\":[{\\\\"indexed\\\\":true,\\\\"internalType\\\\":\\\\"bytes32\\\\",\\\\"name\\\\":\\\\"role\\\\",\\\\"type\\\\":\\\\"bytes32\\\\"},{\\\\"indexed\\\\":true,\\\\"internalType\\\\":\\\\"bytes32\\\\",\\\\"name\\\\":\\\\"previousAdminRole\\\\",\\\\"type\\\\":\\\\"bytes32\\\\"},{\\\\"indexed\\\\":true,\\\\"internalType\\\\":\\\\"bytes32\\\\",\\\\"name\\\\":\\\\"newAdminRole\\\\",\\\\"type\\\\":\\\\"bytes32\\\\"}],\\\\"name\\\\":\\\\"RoleAdminChanged\\\\",\\\\"type\\\\":\\\\"event\\\\"},{\\\\"anonymous\\\\":false,\\\\"inputs\\\\":[{\\\\"indexed\\\\":true,\\\\"internalType\\\\":\\\\"bytes32\\\\",\\\\"name\\\\":\\\\"role\\\\",\\\\"type\\\\":\\\\"bytes32\\\\"},{\\\\"indexed\\\\":true,\\\\"internalType\\\\":\\\\"address\\\\",\\\\"name\\\\":\\\\"account\\\\",\\\\"type\\\\":\\\\"address\\\\"},{\\\\"indexed\\\\":true,\\\\"internalType\\\\":\\\\"address\\\\",\\\\"name\\\\":\\\\"sender\\\\",\\\\"type\\\\":\\\\"address\\\\"}],\\\\"name\\\\":\\\\"RoleGranted\\\\",\\\\"type\\\\":\\\\"event\\\\"},{\\\\"anonymous\\\\":false,\\\\"inputs\\\\":[{\\\\"indexed\\\\":true,\\\\"internalType\\\\":\\\\"bytes32\\\\",\\\\"name\\\\":\\\\"role\\\\",\\\\"type\\\\":\\\\"bytes32\\\\"},{\\\\"indexed\\\\":true,\\\\"internalType\\\\":\\\\"address\\\\",\\\\"name\\\\":\\\\"account\\\\",\\\\"type\\\\":\\\\"address\\\\"},{\\\\"indexed\\\\":true,\\\\"internalType\\\\":\\\\"address\\\\",\\\\"name\\\\":\\\\"sender\\\\",\\\\"type\\\\":\\\\"address\\\\"}],\\\\"name\\\\":\\\\"RoleRevoked\\\\",\\\\"type\\\\":\\\\"event\\\\"},{\\\\"anonymous\\\\":false,\\\\"inputs\\\\":[{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"limit\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"name\\\\":\\\\"SetLimit\\\\",\\\\"type\\\\":\\\\"event\\\\"},{\\\\"inputs\\\\":[],\\\\"name\\\\":\\\\"DEFAULT_ADMIN_ROLE\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"bytes32\\\\",\\\\"name\\\\":\\\\"\\\\",\\\\"type\\\\":\\\\"bytes32\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[{\\\\"internalType\\\\":\\\\"address\\\\",\\\\"name\\\\":\\\\"holder\\\\",\\\\"type\\\\":\\\\"address\\\\"},{\\\\"internalType\\\\":\\\\"uint32\\\\",\\\\"name\\\\":\\\\"period\\\\",\\\\"type\\\\":\\\\"uint32\\\\"},{\\\\"internalType\\\\":\\\\"uint128\\\\",\\\\"name\\\\":\\\\"amount\\\\",\\\\"type\\\\":\\\\"uint128\\\\"},{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"strike\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"name\\\\":\\\\"buy\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"id\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"stateMutability\\\\":\\\\"nonpayable\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[{\\\\"internalType\\\\":\\\\"uint32\\\\",\\\\"name\\\\":\\\\"period\\\\",\\\\"type\\\\":\\\\"uint32\\\\"},{\\\\"internalType\\\\":\\\\"uint128\\\\",\\\\"name\\\\":\\\\"amount\\\\",\\\\"type\\\\":\\\\"uint128\\\\"},{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"strike\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"name\\\\":\\\\"calculatePremium\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"premium\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"available\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[],\\\\"name\\\\":\\\\"collateralizationRatio\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"uint8\\\\",\\\\"name\\\\":\\\\"\\\\",\\\\"type\\\\":\\\\"uint8\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"optionID\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"name\\\\":\\\\"exercise\\\\",\\\\"outputs\\\\":[],\\\\"stateMutability\\\\":\\\\"nonpayable\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[],\\\\"name\\\\":\\\\"getLockedByStrategy\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"amount\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[{\\\\"internalType\\\\":\\\\"bytes32\\\\",\\\\"name\\\\":\\\\"role\\\\",\\\\"type\\\\":\\\\"bytes32\\\\"}],\\\\"name\\\\":\\\\"getRoleAdmin\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"bytes32\\\\",\\\\"name\\\\":\\\\"\\\\",\\\\"type\\\\":\\\\"bytes32\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[{\\\\"internalType\\\\":\\\\"bytes32\\\\",\\\\"name\\\\":\\\\"role\\\\",\\\\"type\\\\":\\\\"bytes32\\\\"},{\\\\"internalType\\\\":\\\\"address\\\\",\\\\"name\\\\":\\\\"account\\\\",\\\\"type\\\\":\\\\"address\\\\"}],\\\\"name\\\\":\\\\"grantRole\\\\",\\\\"outputs\\\\":[],\\\\"stateMutability\\\\":\\\\"nonpayable\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[{\\\\"internalType\\\\":\\\\"bytes32\\\\",\\\\"name\\\\":\\\\"role\\\\",\\\\"type\\\\":\\\\"bytes32\\\\"},{\\\\"internalType\\\\":\\\\"address\\\\",\\\\"name\\\\":\\\\"account\\\\",\\\\"type\\\\":\\\\"address\\\\"}],\\\\"name\\\\":\\\\"hasRole\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"bool\\\\",\\\\"name\\\\":\\\\"\\\\",\\\\"type\\\\":\\\\"bool\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[],\\\\"name\\\\":\\\\"k\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[],\\\\"name\\\\":\\\\"lockedLimit\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[],\\\\"name\\\\":\\\\"pool\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"contract IHegicOperationalTreasury\\\\",\\\\"name\\\\":\\\\"\\\\",\\\\"type\\\\":\\\\"address\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[],\\\\"name\\\\":\\\\"priceProvider\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"contract AggregatorV3Interface\\\\",\\\\"name\\\\":\\\\"\\\\",\\\\"type\\\\":\\\\"address\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[],\\\\"name\\\\":\\\\"pricer\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"contract IPremiumCalculator\\\\",\\\\"name\\\\":\\\\"\\\\",\\\\"type\\\\":\\\\"address\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"optionID\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"name\\\\":\\\\"profitOf\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"amount\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[{\\\\"internalType\\\\":\\\\"bytes32\\\\",\\\\"name\\\\":\\\\"role\\\\",\\\\"type\\\\":\\\\"bytes32\\\\"},{\\\\"internalType\\\\":\\\\"address\\\\",\\\\"name\\\\":\\\\"account\\\\",\\\\"type\\\\":\\\\"address\\\\"}],\\\\"name\\\\":\\\\"renounceRole\\\\",\\\\"outputs\\\\":[],\\\\"stateMutability\\\\":\\\\"nonpayable\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[{\\\\"internalType\\\\":\\\\"bytes32\\\\",\\\\"name\\\\":\\\\"role\\\\",\\\\"type\\\\":\\\\"bytes32\\\\"},{\\\\"internalType\\\\":\\\\"address\\\\",\\\\"name\\\\":\\\\"account\\\\",\\\\"type\\\\":\\\\"address\\\\"}],\\\\"name\\\\":\\\\"revokeRole\\\\",\\\\"outputs\\\\":[],\\\\"stateMutability\\\\":\\\\"nonpayable\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"value\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"name\\\\":\\\\"setK\\\\",\\\\"outputs\\\\":[],\\\\"stateMutability\\\\":\\\\"nonpayable\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"value\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"name\\\\":\\\\"setLimit\\\\",\\\\"outputs\\\\":[],\\\\"stateMutability\\\\":\\\\"nonpayable\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[{\\\\"internalType\\\\":\\\\"contract IPremiumCalculator\\\\",\\\\"name\\\\":\\\\"value\\\\",\\\\"type\\\\":\\\\"address\\\\"}],\\\\"name\\\\":\\\\"setPricer\\\\",\\\\"outputs\\\\":[],\\\\"stateMutability\\\\":\\\\"nonpayable\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"name\\\\":\\\\"strategyData\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"uint128\\\\",\\\\"name\\\\":\\\\"amount\\\\",\\\\"type\\\\":\\\\"uint128\\\\"},{\\\\"internalType\\\\":\\\\"uint128\\\\",\\\\"name\\\\":\\\\"strike\\\\",\\\\"type\\\\":\\\\"uint128\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[],\\\\"name\\\\":\\\\"strikePercentage\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[{\\\\"internalType\\\\":\\\\"bytes4\\\\",\\\\"name\\\\":\\\\"interfaceId\\\\",\\\\"type\\\\":\\\\"bytes4\\\\"}],\\\\"name\\\\":\\\\"supportsInterface\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"bool\\\\",\\\\"name\\\\":\\\\"\\\\",\\\\"type\\\\":\\\\"bool\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"}],\\\\"devdoc\\\\":{\\\\"kind\\\\":\\\\"dev\\\\",\\\\"methods\\\\":{\\\\"buy(address,uint32,uint128,uint256)\\\\":{\\\\"params\\\\":{\\\\"amount\\\\":\\\\"The option/strategy amount\\\\",\\\\"holder\\\\":\\\\"The holder address\\\\",\\\\"period\\\\":\\\\"The option/strategy period\\\\",\\\\"strike\\\\":\\\\"The option/strategy strike*\\\\"}},\\\\"exercise(uint256)\\\\":{\\\\"params\\\\":{\\\\"optionID\\\\":\\\\"The option/strategy ID*\\\\"}},\\\\"getRoleAdmin(bytes32)\\\\":{\\\\"details\\\\":\\\\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role\\\'s admin, use {_setRoleAdmin}.\\\\"},\\\\"grantRole(bytes32,address)\\\\":{\\\\"details\\\\":\\\\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``\\\'s admin role.\\\\"},\\\\"hasRole(bytes32,address)\\\\":{\\\\"details\\\\":\\\\"Returns `true` if `account` has been granted `role`.\\\\"},\\\\"profitOf(uint256)\\\\":{\\\\"params\\\\":{\\\\"amount\\\\":\\\\"The unrealized profits amount*\\\\",\\\\"optionID\\\\":\\\\"The option/strategy ID\\\\"}},\\\\"renounceRole(bytes32,address)\\\\":{\\\\"details\\\\":\\\\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function\\\'s purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`.\\\\"},\\\\"revokeRole(bytes32,address)\\\\":{\\\\"details\\\\":\\\\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``\\\'s admin role.\\\\"},\\\\"setK(uint256)\\\\":{\\\\"params\\\\":{\\\\"value\\\\":\\\\"The collateralization coefficient*\\\\"}},\\\\"setLimit(uint256)\\\\":{\\\\"params\\\\":{\\\\"value\\\\":\\\\"The maximum locked liquidity*\\\\"}},\\\\"supportsInterface(bytes4)\\\\":{\\\\"details\\\\":\\\\"See {IERC165-supportsInterface}.\\\\"}},\\\\"version\\\\":1},\\\\"userdoc\\\\":{\\\\"kind\\\\":\\\\"user\\\\",\\\\"methods\\\\":{\\\\"buy(address,uint32,uint128,uint256)\\\\":{\\\\"notice\\\\":\\\\"Used for buying options/strategies\\\\"},\\\\"exercise(uint256)\\\\":{\\\\"notice\\\\":\\\\"Used for exercising an in-the-money option/strategy and taking profits\\\\"},\\\\"getLockedByStrategy()\\\\":{\\\\"notice\\\\":\\\\"Used for viewing the total liquidity locked up for a specific options strategy*\\\\"},\\\\"profitOf(uint256)\\\\":{\\\\"notice\\\\":\\\\"Used for calculating the holder\\\'s option/strategy unrealized profits\\\\"},\\\\"setK(uint256)\\\\":{\\\\"notice\\\\":\\\\"Used for setting the collateralization coefficient\\\\"},\\\\"setLimit(uint256)\\\\":{\\\\"notice\\\\":\\\\"Used for setting a limit on the total locked liquidity\\\\"}},\\\\"version\\\\":1}},\\\\"settings\\\\":{\\\\"compilationTarget\\\\":{\\\\"contracts/Strategies/HegicStrategySpreadPut.sol\\\\":\\\\"HegicStrategySpreadPut\\\\"},\\\\"evmVersion\\\\":\\\\"berlin\\\\",\\\\"libraries\\\\":{},\\\\"metadata\\\\":{\\\\"bytecodeHash\\\\":\\\\"ipfs\\\\",\\\\"useLiteralContent\\\\":true},\\\\"optimizer\\\\":{\\\\"enabled\\\\":true,\\\\"runs\\\\":200},\\\\"remappings\\\\":[]},\\\\"sources\\\\":{\\\\"@chainlink/contracts/src/v0.7/interfaces/AggregatorV3Interface.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\npragma solidity >=0.7.0;\\\\\\\\n\\\\\\\\ninterface AggregatorV3Interface {\\\\\\\\n\\\\\\\\n function decimals() external view returns (uint8);\\\\\\\\n function description() external view returns (string memory);\\\\\\\\n function version() external view returns (uint256);\\\\\\\\n\\\\\\\\n // getRoundData and latestRoundData should both raise \\\\\\\\\\\\"No data present\\\\\\\\\\\\"\\\\\\\\n // if they do not have data to report, instead of returning unset values\\\\\\\\n // which could be misinterpreted as actual reported values.\\\\\\\\n function getRoundData(uint80 _roundId)\\\\\\\\n external\\\\\\\\n view\\\\\\\\n returns (\\\\\\\\n uint80 roundId,\\\\\\\\n int256 answer,\\\\\\\\n uint256 startedAt,\\\\\\\\n uint256 updatedAt,\\\\\\\\n uint80 answeredInRound\\\\\\\\n );\\\\\\\\n function latestRoundData()\\\\\\\\n external\\\\\\\\n view\\\\\\\\n returns (\\\\\\\\n uint80 roundId,\\\\\\\\n int256 answer,\\\\\\\\n uint256 startedAt,\\\\\\\\n uint256 updatedAt,\\\\\\\\n uint80 answeredInRound\\\\\\\\n );\\\\\\\\n\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x78af5c13ec137bdbb22ec9d65c730fb6f138d3a61a3fdbb63be4838ce7faf2a6\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/access/AccessControl.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"../utils/Context.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"../utils/Strings.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"../utils/introspection/ERC165.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\\\\\\\n */\\\\\\\\ninterface IAccessControl {\\\\\\\\n function hasRole(bytes32 role, address account) external view returns (bool);\\\\\\\\n\\\\\\\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\\\\\\\n\\\\\\\\n function grantRole(bytes32 role, address account) external;\\\\\\\\n\\\\\\\\n function revokeRole(bytes32 role, address account) external;\\\\\\\\n\\\\\\\\n function renounceRole(bytes32 role, address account) external;\\\\\\\\n}\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @dev Contract module that allows children to implement role-based access\\\\\\\\n * control mechanisms. This is a lightweight version that doesn\\\'t allow enumerating role\\\\\\\\n * members except through off-chain means by accessing the contract event logs. Some\\\\\\\\n * applications may benefit from on-chain enumerability, for those cases see\\\\\\\\n * {AccessControlEnumerable}.\\\\\\\\n *\\\\\\\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\\\\\\\n * in the external API and be unique. The best way to achieve this is by\\\\\\\\n * using `public constant` hash digests:\\\\\\\\n *\\\\\\\\n * ```\\\\\\\\n * bytes32 public constant MY_ROLE = keccak256(\\\\\\\\\\\\"MY_ROLE\\\\\\\\\\\\");\\\\\\\\n * ```\\\\\\\\n *\\\\\\\\n * Roles can be used to represent a set of permissions. To restrict access to a\\\\\\\\n * function call, use {hasRole}:\\\\\\\\n *\\\\\\\\n * ```\\\\\\\\n * function foo() public {\\\\\\\\n * require(hasRole(MY_ROLE, msg.sender));\\\\\\\\n * ...\\\\\\\\n * }\\\\\\\\n * ```\\\\\\\\n *\\\\\\\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\\\\\\\n * {revokeRole} functions. Each role has an associated admin role, and only\\\\\\\\n * accounts that have a role\\\'s admin role can call {grantRole} and {revokeRole}.\\\\\\\\n *\\\\\\\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\\\\\\\n * that only accounts with this role will be able to grant or revoke other\\\\\\\\n * roles. More complex role relationships can be created by using\\\\\\\\n * {_setRoleAdmin}.\\\\\\\\n *\\\\\\\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\\\\\\\n * grant and revoke this role. Extra precautions should be taken to secure\\\\\\\\n * accounts that have been granted it.\\\\\\\\n */\\\\\\\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\\\\\\\n struct RoleData {\\\\\\\\n mapping(address => bool) members;\\\\\\\\n bytes32 adminRole;\\\\\\\\n }\\\\\\\\n\\\\\\\\n mapping(bytes32 => RoleData) private _roles;\\\\\\\\n\\\\\\\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Emitted when `newAdminRole` is set as ``role``\\\'s admin role, replacing `previousAdminRole`\\\\\\\\n *\\\\\\\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\\\\\\\n * {RoleAdminChanged} not being emitted signaling this.\\\\\\\\n *\\\\\\\\n * _Available since v3.1._\\\\\\\\n */\\\\\\\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Emitted when `account` is granted `role`.\\\\\\\\n *\\\\\\\\n * `sender` is the account that originated the contract call, an admin role\\\\\\\\n * bearer except when using {_setupRole}.\\\\\\\\n */\\\\\\\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Emitted when `account` is revoked `role`.\\\\\\\\n *\\\\\\\\n * `sender` is the account that originated the contract call:\\\\\\\\n * - if using `revokeRole`, it is the admin role bearer\\\\\\\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\\\\\\\n */\\\\\\\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Modifier that checks that an account has a specific role. Reverts\\\\\\\\n * with a standardized message including the required role.\\\\\\\\n *\\\\\\\\n * The format of the revert reason is given by the following regular expression:\\\\\\\\n *\\\\\\\\n * /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/\\\\\\\\n *\\\\\\\\n * _Available since v4.1._\\\\\\\\n */\\\\\\\\n modifier onlyRole(bytes32 role) {\\\\\\\\n _checkRole(role, _msgSender());\\\\\\\\n _;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC165-supportsInterface}.\\\\\\\\n */\\\\\\\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\\\\\\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns `true` if `account` has been granted `role`.\\\\\\\\n */\\\\\\\\n function hasRole(bytes32 role, address account) public view override returns (bool) {\\\\\\\\n return _roles[role].members[account];\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Revert with a standard message if `account` is missing `role`.\\\\\\\\n *\\\\\\\\n * The format of the revert reason is given by the following regular expression:\\\\\\\\n *\\\\\\\\n * /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/\\\\\\\\n */\\\\\\\\n function _checkRole(bytes32 role, address account) internal view {\\\\\\\\n if (!hasRole(role, account)) {\\\\\\\\n revert(\\\\\\\\n string(\\\\\\\\n abi.encodePacked(\\\\\\\\n \\\\\\\\\\\\"AccessControl: account \\\\\\\\\\\\",\\\\\\\\n Strings.toHexString(uint160(account), 20),\\\\\\\\n \\\\\\\\\\\\" is missing role \\\\\\\\\\\\",\\\\\\\\n Strings.toHexString(uint256(role), 32)\\\\\\\\n )\\\\\\\\n )\\\\\\\\n );\\\\\\\\n }\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\\\\\\\n * {revokeRole}.\\\\\\\\n *\\\\\\\\n * To change a role\\\'s admin, use {_setRoleAdmin}.\\\\\\\\n */\\\\\\\\n function getRoleAdmin(bytes32 role) public view override returns (bytes32) {\\\\\\\\n return _roles[role].adminRole;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Grants `role` to `account`.\\\\\\\\n *\\\\\\\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\\\\\\\n * event.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - the caller must have ``role``\\\'s admin role.\\\\\\\\n */\\\\\\\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\\\\\\\n _grantRole(role, account);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Revokes `role` from `account`.\\\\\\\\n *\\\\\\\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - the caller must have ``role``\\\'s admin role.\\\\\\\\n */\\\\\\\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\\\\\\\n _revokeRole(role, account);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Revokes `role` from the calling account.\\\\\\\\n *\\\\\\\\n * Roles are often managed via {grantRole} and {revokeRole}: this function\\\'s\\\\\\\\n * purpose is to provide a mechanism for accounts to lose their privileges\\\\\\\\n * if they are compromised (such as when a trusted device is misplaced).\\\\\\\\n *\\\\\\\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\\\\\\\n * event.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - the caller must be `account`.\\\\\\\\n */\\\\\\\\n function renounceRole(bytes32 role, address account) public virtual override {\\\\\\\\n require(account == _msgSender(), \\\\\\\\\\\\"AccessControl: can only renounce roles for self\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n _revokeRole(role, account);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Grants `role` to `account`.\\\\\\\\n *\\\\\\\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\\\\\\\n * event. Note that unlike {grantRole}, this function doesn\\\'t perform any\\\\\\\\n * checks on the calling account.\\\\\\\\n *\\\\\\\\n * [WARNING]\\\\\\\\n * ====\\\\\\\\n * This function should only be called from the constructor when setting\\\\\\\\n * up the initial roles for the system.\\\\\\\\n *\\\\\\\\n * Using this function in any other way is effectively circumventing the admin\\\\\\\\n * system imposed by {AccessControl}.\\\\\\\\n * ====\\\\\\\\n */\\\\\\\\n function _setupRole(bytes32 role, address account) internal virtual {\\\\\\\\n _grantRole(role, account);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Sets `adminRole` as ``role``\\\'s admin role.\\\\\\\\n *\\\\\\\\n * Emits a {RoleAdminChanged} event.\\\\\\\\n */\\\\\\\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\\\\\\\n emit RoleAdminChanged(role, getRoleAdmin(role), adminRole);\\\\\\\\n _roles[role].adminRole = adminRole;\\\\\\\\n }\\\\\\\\n\\\\\\\\n function _grantRole(bytes32 role, address account) private {\\\\\\\\n if (!hasRole(role, account)) {\\\\\\\\n _roles[role].members[account] = true;\\\\\\\\n emit RoleGranted(role, account, _msgSender());\\\\\\\\n }\\\\\\\\n }\\\\\\\\n\\\\\\\\n function _revokeRole(bytes32 role, address account) private {\\\\\\\\n if (hasRole(role, account)) {\\\\\\\\n _roles[role].members[account] = false;\\\\\\\\n emit RoleRevoked(role, account, _msgSender());\\\\\\\\n }\\\\\\\\n }\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x084f583de2c714665b0304529fe8b826a2809f29d03314e4dd9eea926e4bb0f3\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/access/Ownable.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"../utils/Context.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @dev Contract module which provides a basic access control mechanism, where\\\\\\\\n * there is an account (an owner) that can be granted exclusive access to\\\\\\\\n * specific functions.\\\\\\\\n *\\\\\\\\n * By default, the owner account will be the one that deploys the contract. This\\\\\\\\n * can later be changed with {transferOwnership}.\\\\\\\\n *\\\\\\\\n * This module is used through inheritance. It will make available the modifier\\\\\\\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\\\\\\\n * the owner.\\\\\\\\n */\\\\\\\\nabstract contract Ownable is Context {\\\\\\\\n address private _owner;\\\\\\\\n\\\\\\\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Initializes the contract setting the deployer as the initial owner.\\\\\\\\n */\\\\\\\\n constructor() {\\\\\\\\n _setOwner(_msgSender());\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the address of the current owner.\\\\\\\\n */\\\\\\\\n function owner() public view virtual returns (address) {\\\\\\\\n return _owner;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Throws if called by any account other than the owner.\\\\\\\\n */\\\\\\\\n modifier onlyOwner() {\\\\\\\\n require(owner() == _msgSender(), \\\\\\\\\\\\"Ownable: caller is not the owner\\\\\\\\\\\\");\\\\\\\\n _;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Leaves the contract without owner. It will not be possible to call\\\\\\\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\\\\\\\n *\\\\\\\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\\\\\\\n * thereby removing any functionality that is only available to the owner.\\\\\\\\n */\\\\\\\\n function renounceOwnership() public virtual onlyOwner {\\\\\\\\n _setOwner(address(0));\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\\\\\\\n * Can only be called by the current owner.\\\\\\\\n */\\\\\\\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\\\\\\\n require(newOwner != address(0), \\\\\\\\\\\\"Ownable: new owner is the zero address\\\\\\\\\\\\");\\\\\\\\n _setOwner(newOwner);\\\\\\\\n }\\\\\\\\n\\\\\\\\n function _setOwner(address newOwner) private {\\\\\\\\n address oldOwner = _owner;\\\\\\\\n _owner = newOwner;\\\\\\\\n emit OwnershipTransferred(oldOwner, newOwner);\\\\\\\\n }\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/security/ReentrancyGuard.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @dev Contract module that helps prevent reentrant calls to a function.\\\\\\\\n *\\\\\\\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\\\\\\\n * available, which can be applied to functions to make sure there are no nested\\\\\\\\n * (reentrant) calls to them.\\\\\\\\n *\\\\\\\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\\\\\\\n * `nonReentrant` may not call one another. This can be worked around by making\\\\\\\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\\\\\\\n * points to them.\\\\\\\\n *\\\\\\\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\\\\\\\n * to protect against it, check out our blog post\\\\\\\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\\\\\\\n */\\\\\\\\nabstract contract ReentrancyGuard {\\\\\\\\n // Booleans are more expensive than uint256 or any type that takes up a full\\\\\\\\n // word because each write operation emits an extra SLOAD to first read the\\\\\\\\n // slot\\\'s contents, replace the bits taken up by the boolean, and then write\\\\\\\\n // back. This is the compiler\\\'s defense against contract upgrades and\\\\\\\\n // pointer aliasing, and it cannot be disabled.\\\\\\\\n\\\\\\\\n // The values being non-zero value makes deployment a bit more expensive,\\\\\\\\n // but in exchange the refund on every call to nonReentrant will be lower in\\\\\\\\n // amount. Since refunds are capped to a percentage of the total\\\\\\\\n // transaction\\\'s gas, it is best to keep them low in cases like this one, to\\\\\\\\n // increase the likelihood of the full refund coming into effect.\\\\\\\\n uint256 private constant _NOT_ENTERED = 1;\\\\\\\\n uint256 private constant _ENTERED = 2;\\\\\\\\n\\\\\\\\n uint256 private _status;\\\\\\\\n\\\\\\\\n constructor() {\\\\\\\\n _status = _NOT_ENTERED;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\\\\\\\n * Calling a `nonReentrant` function from another `nonReentrant`\\\\\\\\n * function is not supported. It is possible to prevent this from happening\\\\\\\\n * by making the `nonReentrant` function external, and make it call a\\\\\\\\n * `private` function that does the actual work.\\\\\\\\n */\\\\\\\\n modifier nonReentrant() {\\\\\\\\n // On the first call to nonReentrant, _notEntered will be true\\\\\\\\n require(_status != _ENTERED, \\\\\\\\\\\\"ReentrancyGuard: reentrant call\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n // Any calls to nonReentrant after this point will fail\\\\\\\\n _status = _ENTERED;\\\\\\\\n\\\\\\\\n _;\\\\\\\\n\\\\\\\\n // By storing the original value once again, a refund is triggered (see\\\\\\\\n // https://eips.ethereum.org/EIPS/eip-2200)\\\\\\\\n _status = _NOT_ENTERED;\\\\\\\\n }\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x842ccf9a6cd33e17b7acef8372ca42090755217b358fe0c44c98e951ea549d3a\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/token/ERC20/ERC20.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"./IERC20.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"./extensions/IERC20Metadata.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"../../utils/Context.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @dev Implementation of the {IERC20} interface.\\\\\\\\n *\\\\\\\\n * This implementation is agnostic to the way tokens are created. This means\\\\\\\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\\\\\\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\\\\\\\n *\\\\\\\\n * TIP: For a detailed writeup see our guide\\\\\\\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\\\\\\\n * to implement supply mechanisms].\\\\\\\\n *\\\\\\\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\\\\\\\n * of returning `false` on failure. This behavior is nonetheless conventional\\\\\\\\n * and does not conflict with the expectations of ERC20 applications.\\\\\\\\n *\\\\\\\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\\\\\\\n * This allows applications to reconstruct the allowance for all accounts just\\\\\\\\n * by listening to said events. Other implementations of the EIP may not emit\\\\\\\\n * these events, as it isn\\\'t required by the specification.\\\\\\\\n *\\\\\\\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\\\\\\\n * functions have been added to mitigate the well-known issues around setting\\\\\\\\n * allowances. See {IERC20-approve}.\\\\\\\\n */\\\\\\\\ncontract ERC20 is Context, IERC20, IERC20Metadata {\\\\\\\\n mapping(address => uint256) private _balances;\\\\\\\\n\\\\\\\\n mapping(address => mapping(address => uint256)) private _allowances;\\\\\\\\n\\\\\\\\n uint256 private _totalSupply;\\\\\\\\n\\\\\\\\n string private _name;\\\\\\\\n string private _symbol;\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Sets the values for {name} and {symbol}.\\\\\\\\n *\\\\\\\\n * The default value of {decimals} is 18. To select a different value for\\\\\\\\n * {decimals} you should overload it.\\\\\\\\n *\\\\\\\\n * All two of these values are immutable: they can only be set once during\\\\\\\\n * construction.\\\\\\\\n */\\\\\\\\n constructor(string memory name_, string memory symbol_) {\\\\\\\\n _name = name_;\\\\\\\\n _symbol = symbol_;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the name of the token.\\\\\\\\n */\\\\\\\\n function name() public view virtual override returns (string memory) {\\\\\\\\n return _name;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the symbol of the token, usually a shorter version of the\\\\\\\\n * name.\\\\\\\\n */\\\\\\\\n function symbol() public view virtual override returns (string memory) {\\\\\\\\n return _symbol;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the number of decimals used to get its user representation.\\\\\\\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\\\\\\\n * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\\\\\\\n *\\\\\\\\n * Tokens usually opt for a value of 18, imitating the relationship between\\\\\\\\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\\\\\\\\n * overridden;\\\\\\\\n *\\\\\\\\n * NOTE: This information is only used for _display_ purposes: it in\\\\\\\\n * no way affects any of the arithmetic of the contract, including\\\\\\\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\\\\\\\n */\\\\\\\\n function decimals() public view virtual override returns (uint8) {\\\\\\\\n return 18;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC20-totalSupply}.\\\\\\\\n */\\\\\\\\n function totalSupply() public view virtual override returns (uint256) {\\\\\\\\n return _totalSupply;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC20-balanceOf}.\\\\\\\\n */\\\\\\\\n function balanceOf(address account) public view virtual override returns (uint256) {\\\\\\\\n return _balances[account];\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC20-transfer}.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `recipient` cannot be the zero address.\\\\\\\\n * - the caller must have a balance of at least `amount`.\\\\\\\\n */\\\\\\\\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\\\\\\\n _transfer(_msgSender(), recipient, amount);\\\\\\\\n return true;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC20-allowance}.\\\\\\\\n */\\\\\\\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\\\\\\\n return _allowances[owner][spender];\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC20-approve}.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `spender` cannot be the zero address.\\\\\\\\n */\\\\\\\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\\\\\\\n _approve(_msgSender(), spender, amount);\\\\\\\\n return true;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC20-transferFrom}.\\\\\\\\n *\\\\\\\\n * Emits an {Approval} event indicating the updated allowance. This is not\\\\\\\\n * required by the EIP. See the note at the beginning of {ERC20}.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `sender` and `recipient` cannot be the zero address.\\\\\\\\n * - `sender` must have a balance of at least `amount`.\\\\\\\\n * - the caller must have allowance for ``sender``\\\'s tokens of at least\\\\\\\\n * `amount`.\\\\\\\\n */\\\\\\\\n function transferFrom(\\\\\\\\n address sender,\\\\\\\\n address recipient,\\\\\\\\n uint256 amount\\\\\\\\n ) public virtual override returns (bool) {\\\\\\\\n _transfer(sender, recipient, amount);\\\\\\\\n\\\\\\\\n uint256 currentAllowance = _allowances[sender][_msgSender()];\\\\\\\\n require(currentAllowance >= amount, \\\\\\\\\\\\"ERC20: transfer amount exceeds allowance\\\\\\\\\\\\");\\\\\\\\n unchecked {\\\\\\\\n _approve(sender, _msgSender(), currentAllowance - amount);\\\\\\\\n }\\\\\\\\n\\\\\\\\n return true;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\\\\\\\n *\\\\\\\\n * This is an alternative to {approve} that can be used as a mitigation for\\\\\\\\n * problems described in {IERC20-approve}.\\\\\\\\n *\\\\\\\\n * Emits an {Approval} event indicating the updated allowance.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `spender` cannot be the zero address.\\\\\\\\n */\\\\\\\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\\\\\\\n _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);\\\\\\\\n return true;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\\\\\\\n *\\\\\\\\n * This is an alternative to {approve} that can be used as a mitigation for\\\\\\\\n * problems described in {IERC20-approve}.\\\\\\\\n *\\\\\\\\n * Emits an {Approval} event indicating the updated allowance.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `spender` cannot be the zero address.\\\\\\\\n * - `spender` must have allowance for the caller of at least\\\\\\\\n * `subtractedValue`.\\\\\\\\n */\\\\\\\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\\\\\\\n uint256 currentAllowance = _allowances[_msgSender()][spender];\\\\\\\\n require(currentAllowance >= subtractedValue, \\\\\\\\\\\\"ERC20: decreased allowance below zero\\\\\\\\\\\\");\\\\\\\\n unchecked {\\\\\\\\n _approve(_msgSender(), spender, currentAllowance - subtractedValue);\\\\\\\\n }\\\\\\\\n\\\\\\\\n return true;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Moves `amount` of tokens from `sender` to `recipient`.\\\\\\\\n *\\\\\\\\n * This internal function is equivalent to {transfer}, and can be used to\\\\\\\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `sender` cannot be the zero address.\\\\\\\\n * - `recipient` cannot be the zero address.\\\\\\\\n * - `sender` must have a balance of at least `amount`.\\\\\\\\n */\\\\\\\\n function _transfer(\\\\\\\\n address sender,\\\\\\\\n address recipient,\\\\\\\\n uint256 amount\\\\\\\\n ) internal virtual {\\\\\\\\n require(sender != address(0), \\\\\\\\\\\\"ERC20: transfer from the zero address\\\\\\\\\\\\");\\\\\\\\n require(recipient != address(0), \\\\\\\\\\\\"ERC20: transfer to the zero address\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n _beforeTokenTransfer(sender, recipient, amount);\\\\\\\\n\\\\\\\\n uint256 senderBalance = _balances[sender];\\\\\\\\n require(senderBalance >= amount, \\\\\\\\\\\\"ERC20: transfer amount exceeds balance\\\\\\\\\\\\");\\\\\\\\n unchecked {\\\\\\\\n _balances[sender] = senderBalance - amount;\\\\\\\\n }\\\\\\\\n _balances[recipient] += amount;\\\\\\\\n\\\\\\\\n emit Transfer(sender, recipient, amount);\\\\\\\\n\\\\\\\\n _afterTokenTransfer(sender, recipient, amount);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\\\\\\\n * the total supply.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event with `from` set to the zero address.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `account` cannot be the zero address.\\\\\\\\n */\\\\\\\\n function _mint(address account, uint256 amount) internal virtual {\\\\\\\\n require(account != address(0), \\\\\\\\\\\\"ERC20: mint to the zero address\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n _beforeTokenTransfer(address(0), account, amount);\\\\\\\\n\\\\\\\\n _totalSupply += amount;\\\\\\\\n _balances[account] += amount;\\\\\\\\n emit Transfer(address(0), account, amount);\\\\\\\\n\\\\\\\\n _afterTokenTransfer(address(0), account, amount);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Destroys `amount` tokens from `account`, reducing the\\\\\\\\n * total supply.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event with `to` set to the zero address.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `account` cannot be the zero address.\\\\\\\\n * - `account` must have at least `amount` tokens.\\\\\\\\n */\\\\\\\\n function _burn(address account, uint256 amount) internal virtual {\\\\\\\\n require(account != address(0), \\\\\\\\\\\\"ERC20: burn from the zero address\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n _beforeTokenTransfer(account, address(0), amount);\\\\\\\\n\\\\\\\\n uint256 accountBalance = _balances[account];\\\\\\\\n require(accountBalance >= amount, \\\\\\\\\\\\"ERC20: burn amount exceeds balance\\\\\\\\\\\\");\\\\\\\\n unchecked {\\\\\\\\n _balances[account] = accountBalance - amount;\\\\\\\\n }\\\\\\\\n _totalSupply -= amount;\\\\\\\\n\\\\\\\\n emit Transfer(account, address(0), amount);\\\\\\\\n\\\\\\\\n _afterTokenTransfer(account, address(0), amount);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\\\\\\\n *\\\\\\\\n * This internal function is equivalent to `approve`, and can be used to\\\\\\\\n * e.g. set automatic allowances for certain subsystems, etc.\\\\\\\\n *\\\\\\\\n * Emits an {Approval} event.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `owner` cannot be the zero address.\\\\\\\\n * - `spender` cannot be the zero address.\\\\\\\\n */\\\\\\\\n function _approve(\\\\\\\\n address owner,\\\\\\\\n address spender,\\\\\\\\n uint256 amount\\\\\\\\n ) internal virtual {\\\\\\\\n require(owner != address(0), \\\\\\\\\\\\"ERC20: approve from the zero address\\\\\\\\\\\\");\\\\\\\\n require(spender != address(0), \\\\\\\\\\\\"ERC20: approve to the zero address\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n _allowances[owner][spender] = amount;\\\\\\\\n emit Approval(owner, spender, amount);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Hook that is called before any transfer of tokens. This includes\\\\\\\\n * minting and burning.\\\\\\\\n *\\\\\\\\n * Calling conditions:\\\\\\\\n *\\\\\\\\n * - when `from` and `to` are both non-zero, `amount` of ``from``\\\'s tokens\\\\\\\\n * will be transferred to `to`.\\\\\\\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\\\\\\\n * - when `to` is zero, `amount` of ``from``\\\'s tokens will be burned.\\\\\\\\n * - `from` and `to` are never both zero.\\\\\\\\n *\\\\\\\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\\\\\\\n */\\\\\\\\n function _beforeTokenTransfer(\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 amount\\\\\\\\n ) internal virtual {}\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Hook that is called after any transfer of tokens. This includes\\\\\\\\n * minting and burning.\\\\\\\\n *\\\\\\\\n * Calling conditions:\\\\\\\\n *\\\\\\\\n * - when `from` and `to` are both non-zero, `amount` of ``from``\\\'s tokens\\\\\\\\n * has been transferred to `to`.\\\\\\\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\\\\\\\n * - when `to` is zero, `amount` of ``from``\\\'s tokens have been burned.\\\\\\\\n * - `from` and `to` are never both zero.\\\\\\\\n *\\\\\\\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\\\\\\\n */\\\\\\\\n function _afterTokenTransfer(\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 amount\\\\\\\\n ) internal virtual {}\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x418cfe64226a974419f8ab7287ad4bb413156a4d7af8ab5d9bcaa5678d1a2f22\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\\\\\\\n */\\\\\\\\ninterface IERC20 {\\\\\\\\n /**\\\\\\\\n * @dev Returns the amount of tokens in existence.\\\\\\\\n */\\\\\\\\n function totalSupply() external view returns (uint256);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the amount of tokens owned by `account`.\\\\\\\\n */\\\\\\\\n function balanceOf(address account) external view returns (uint256);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Moves `amount` tokens from the caller\\\'s account to `recipient`.\\\\\\\\n *\\\\\\\\n * Returns a boolean value indicating whether the operation succeeded.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event.\\\\\\\\n */\\\\\\\\n function transfer(address recipient, uint256 amount) external returns (bool);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the remaining number of tokens that `spender` will be\\\\\\\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\\\\\\\n * zero by default.\\\\\\\\n *\\\\\\\\n * This value changes when {approve} or {transferFrom} are called.\\\\\\\\n */\\\\\\\\n function allowance(address owner, address spender) external view returns (uint256);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Sets `amount` as the allowance of `spender` over the caller\\\'s tokens.\\\\\\\\n *\\\\\\\\n * Returns a boolean value indicating whether the operation succeeded.\\\\\\\\n *\\\\\\\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\\\\\\\n * that someone may use both the old and the new allowance by unfortunate\\\\\\\\n * transaction ordering. One possible solution to mitigate this race\\\\\\\\n * condition is to first reduce the spender\\\'s allowance to 0 and set the\\\\\\\\n * desired value afterwards:\\\\\\\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\\\\\\\n *\\\\\\\\n * Emits an {Approval} event.\\\\\\\\n */\\\\\\\\n function approve(address spender, uint256 amount) external returns (bool);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Moves `amount` tokens from `sender` to `recipient` using the\\\\\\\\n * allowance mechanism. `amount` is then deducted from the caller\\\'s\\\\\\\\n * allowance.\\\\\\\\n *\\\\\\\\n * Returns a boolean value indicating whether the operation succeeded.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event.\\\\\\\\n */\\\\\\\\n function transferFrom(\\\\\\\\n address sender,\\\\\\\\n address recipient,\\\\\\\\n uint256 amount\\\\\\\\n ) external returns (bool);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\\\\\\\n * another (`to`).\\\\\\\\n *\\\\\\\\n * Note that `value` may be zero.\\\\\\\\n */\\\\\\\\n event Transfer(address indexed from, address indexed to, uint256 value);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\\\\\\\n * a call to {approve}. `value` is the new allowance.\\\\\\\\n */\\\\\\\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x027b891937d20ccf213fdb9c31531574256de774bda99d3a70ecef6e1913ed2a\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"../IERC20.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\\\\\\\n *\\\\\\\\n * _Available since v4.1._\\\\\\\\n */\\\\\\\\ninterface IERC20Metadata is IERC20 {\\\\\\\\n /**\\\\\\\\n * @dev Returns the name of the token.\\\\\\\\n */\\\\\\\\n function name() external view returns (string memory);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the symbol of the token.\\\\\\\\n */\\\\\\\\n function symbol() external view returns (string memory);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the decimals places of the token.\\\\\\\\n */\\\\\\\\n function decimals() external view returns (uint8);\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x83fe24f5c04a56091e50f4a345ff504c8bff658a76d4c43b16878c8f940c53b2\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"../IERC20.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"../../../utils/Address.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @title SafeERC20\\\\\\\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\\\\\\\n * contract returns false). Tokens that return no value (and instead revert or\\\\\\\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\\\\\\\n * successful.\\\\\\\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\\\\\\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\\\\\\\n */\\\\\\\\nlibrary SafeERC20 {\\\\\\\\n using Address for address;\\\\\\\\n\\\\\\\\n function safeTransfer(\\\\\\\\n IERC20 token,\\\\\\\\n address to,\\\\\\\\n uint256 value\\\\\\\\n ) internal {\\\\\\\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\\\\\\\n }\\\\\\\\n\\\\\\\\n function safeTransferFrom(\\\\\\\\n IERC20 token,\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 value\\\\\\\\n ) internal {\\\\\\\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Deprecated. This function has issues similar to the ones found in\\\\\\\\n * {IERC20-approve}, and its usage is discouraged.\\\\\\\\n *\\\\\\\\n * Whenever possible, use {safeIncreaseAllowance} and\\\\\\\\n * {safeDecreaseAllowance} instead.\\\\\\\\n */\\\\\\\\n function safeApprove(\\\\\\\\n IERC20 token,\\\\\\\\n address spender,\\\\\\\\n uint256 value\\\\\\\\n ) internal {\\\\\\\\n // safeApprove should only be called when setting an initial allowance,\\\\\\\\n // or when resetting it to zero. To increase and decrease it, use\\\\\\\\n // \\\'safeIncreaseAllowance\\\' and \\\'safeDecreaseAllowance\\\'\\\\\\\\n require(\\\\\\\\n (value == 0) || (token.allowance(address(this), spender) == 0),\\\\\\\\n \\\\\\\\\\\\"SafeERC20: approve from non-zero to non-zero allowance\\\\\\\\\\\\"\\\\\\\\n );\\\\\\\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\\\\\\\n }\\\\\\\\n\\\\\\\\n function safeIncreaseAllowance(\\\\\\\\n IERC20 token,\\\\\\\\n address spender,\\\\\\\\n uint256 value\\\\\\\\n ) internal {\\\\\\\\n uint256 newAllowance = token.allowance(address(this), spender) + value;\\\\\\\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\\\\\\\n }\\\\\\\\n\\\\\\\\n function safeDecreaseAllowance(\\\\\\\\n IERC20 token,\\\\\\\\n address spender,\\\\\\\\n uint256 value\\\\\\\\n ) internal {\\\\\\\\n unchecked {\\\\\\\\n uint256 oldAllowance = token.allowance(address(this), spender);\\\\\\\\n require(oldAllowance >= value, \\\\\\\\\\\\"SafeERC20: decreased allowance below zero\\\\\\\\\\\\");\\\\\\\\n uint256 newAllowance = oldAllowance - value;\\\\\\\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\\\\\\\n }\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\\\\\\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\\\\\\\n * @param token The token targeted by the call.\\\\\\\\n * @param data The call data (encoded using abi.encode or one of its variants).\\\\\\\\n */\\\\\\\\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\\\\\\\\n // We need to perform a low level call here, to bypass Solidity\\\'s return data size checking mechanism, since\\\\\\\\n // we\\\'re implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\\\\\\\n // the target address contains contract code and also asserts for success in the low-level call.\\\\\\\\n\\\\\\\\n bytes memory returndata = address(token).functionCall(data, \\\\\\\\\\\\"SafeERC20: low-level call failed\\\\\\\\\\\\");\\\\\\\\n if (returndata.length > 0) {\\\\\\\\n // Return data is optional\\\\\\\\n require(abi.decode(returndata, (bool)), \\\\\\\\\\\\"SafeERC20: ERC20 operation did not succeed\\\\\\\\\\\\");\\\\\\\\n }\\\\\\\\n }\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x02348b2e4b9f3200c7e3907c5c2661643a6d8520e9f79939fbb9b4005a54894d\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/token/ERC721/ERC721.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"./IERC721.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"./IERC721Receiver.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"./extensions/IERC721Metadata.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"../../utils/Address.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"../../utils/Context.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"../../utils/Strings.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"../../utils/introspection/ERC165.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including\\\\\\\\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\\\\\\\\n * {ERC721Enumerable}.\\\\\\\\n */\\\\\\\\ncontract ERC721 is Context, ERC165, IERC721, IERC721Metadata {\\\\\\\\n using Address for address;\\\\\\\\n using Strings for uint256;\\\\\\\\n\\\\\\\\n // Token name\\\\\\\\n string private _name;\\\\\\\\n\\\\\\\\n // Token symbol\\\\\\\\n string private _symbol;\\\\\\\\n\\\\\\\\n // Mapping from token ID to owner address\\\\\\\\n mapping(uint256 => address) private _owners;\\\\\\\\n\\\\\\\\n // Mapping owner address to token count\\\\\\\\n mapping(address => uint256) private _balances;\\\\\\\\n\\\\\\\\n // Mapping from token ID to approved address\\\\\\\\n mapping(uint256 => address) private _tokenApprovals;\\\\\\\\n\\\\\\\\n // Mapping from owner to operator approvals\\\\\\\\n mapping(address => mapping(address => bool)) private _operatorApprovals;\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\\\\\\\\n */\\\\\\\\n constructor(string memory name_, string memory symbol_) {\\\\\\\\n _name = name_;\\\\\\\\n _symbol = symbol_;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC165-supportsInterface}.\\\\\\\\n */\\\\\\\\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\\\\\\\\n return\\\\\\\\n interfaceId == type(IERC721).interfaceId ||\\\\\\\\n interfaceId == type(IERC721Metadata).interfaceId ||\\\\\\\\n super.supportsInterface(interfaceId);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC721-balanceOf}.\\\\\\\\n */\\\\\\\\n function balanceOf(address owner) public view virtual override returns (uint256) {\\\\\\\\n require(owner != address(0), \\\\\\\\\\\\"ERC721: balance query for the zero address\\\\\\\\\\\\");\\\\\\\\n return _balances[owner];\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC721-ownerOf}.\\\\\\\\n */\\\\\\\\n function ownerOf(uint256 tokenId) public view virtual override returns (address) {\\\\\\\\n address owner = _owners[tokenId];\\\\\\\\n require(owner != address(0), \\\\\\\\\\\\"ERC721: owner query for nonexistent token\\\\\\\\\\\\");\\\\\\\\n return owner;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC721Metadata-name}.\\\\\\\\n */\\\\\\\\n function name() public view virtual override returns (string memory) {\\\\\\\\n return _name;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC721Metadata-symbol}.\\\\\\\\n */\\\\\\\\n function symbol() public view virtual override returns (string memory) {\\\\\\\\n return _symbol;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC721Metadata-tokenURI}.\\\\\\\\n */\\\\\\\\n function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\\\\\\\\n require(_exists(tokenId), \\\\\\\\\\\\"ERC721Metadata: URI query for nonexistent token\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n string memory baseURI = _baseURI();\\\\\\\\n return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : \\\\\\\\\\\\"\\\\\\\\\\\\";\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\\\\\\\\n * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\\\\\\\\n * by default, can be overriden in child contracts.\\\\\\\\n */\\\\\\\\n function _baseURI() internal view virtual returns (string memory) {\\\\\\\\n return \\\\\\\\\\\\"\\\\\\\\\\\\";\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC721-approve}.\\\\\\\\n */\\\\\\\\n function approve(address to, uint256 tokenId) public virtual override {\\\\\\\\n address owner = ERC721.ownerOf(tokenId);\\\\\\\\n require(to != owner, \\\\\\\\\\\\"ERC721: approval to current owner\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n require(\\\\\\\\n _msgSender() == owner || isApprovedForAll(owner, _msgSender()),\\\\\\\\n \\\\\\\\\\\\"ERC721: approve caller is not owner nor approved for all\\\\\\\\\\\\"\\\\\\\\n );\\\\\\\\n\\\\\\\\n _approve(to, tokenId);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC721-getApproved}.\\\\\\\\n */\\\\\\\\n function getApproved(uint256 tokenId) public view virtual override returns (address) {\\\\\\\\n require(_exists(tokenId), \\\\\\\\\\\\"ERC721: approved query for nonexistent token\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n return _tokenApprovals[tokenId];\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC721-setApprovalForAll}.\\\\\\\\n */\\\\\\\\n function setApprovalForAll(address operator, bool approved) public virtual override {\\\\\\\\n require(operator != _msgSender(), \\\\\\\\\\\\"ERC721: approve to caller\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n _operatorApprovals[_msgSender()][operator] = approved;\\\\\\\\n emit ApprovalForAll(_msgSender(), operator, approved);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC721-isApprovedForAll}.\\\\\\\\n */\\\\\\\\n function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\\\\\\\\n return _operatorApprovals[owner][operator];\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC721-transferFrom}.\\\\\\\\n */\\\\\\\\n function transferFrom(\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 tokenId\\\\\\\\n ) public virtual override {\\\\\\\\n //solhint-disable-next-line max-line-length\\\\\\\\n require(_isApprovedOrOwner(_msgSender(), tokenId), \\\\\\\\\\\\"ERC721: transfer caller is not owner nor approved\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n _transfer(from, to, tokenId);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC721-safeTransferFrom}.\\\\\\\\n */\\\\\\\\n function safeTransferFrom(\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 tokenId\\\\\\\\n ) public virtual override {\\\\\\\\n safeTransferFrom(from, to, tokenId, \\\\\\\\\\\\"\\\\\\\\\\\\");\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC721-safeTransferFrom}.\\\\\\\\n */\\\\\\\\n function safeTransferFrom(\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 tokenId,\\\\\\\\n bytes memory _data\\\\\\\\n ) public virtual override {\\\\\\\\n require(_isApprovedOrOwner(_msgSender(), tokenId), \\\\\\\\\\\\"ERC721: transfer caller is not owner nor approved\\\\\\\\\\\\");\\\\\\\\n _safeTransfer(from, to, tokenId, _data);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\\\\\\\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\\\\\\\n *\\\\\\\\n * `_data` is additional data, it has no specified format and it is sent in call to `to`.\\\\\\\\n *\\\\\\\\n * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.\\\\\\\\n * implement alternative mechanisms to perform token transfer, such as signature-based.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `from` cannot be the zero address.\\\\\\\\n * - `to` cannot be the zero address.\\\\\\\\n * - `tokenId` token must exist and be owned by `from`.\\\\\\\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event.\\\\\\\\n */\\\\\\\\n function _safeTransfer(\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 tokenId,\\\\\\\\n bytes memory _data\\\\\\\\n ) internal virtual {\\\\\\\\n _transfer(from, to, tokenId);\\\\\\\\n require(_checkOnERC721Received(from, to, tokenId, _data), \\\\\\\\\\\\"ERC721: transfer to non ERC721Receiver implementer\\\\\\\\\\\\");\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns whether `tokenId` exists.\\\\\\\\n *\\\\\\\\n * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.\\\\\\\\n *\\\\\\\\n * Tokens start existing when they are minted (`_mint`),\\\\\\\\n * and stop existing when they are burned (`_burn`).\\\\\\\\n */\\\\\\\\n function _exists(uint256 tokenId) internal view virtual returns (bool) {\\\\\\\\n return _owners[tokenId] != address(0);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns whether `spender` is allowed to manage `tokenId`.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `tokenId` must exist.\\\\\\\\n */\\\\\\\\n function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {\\\\\\\\n require(_exists(tokenId), \\\\\\\\\\\\"ERC721: operator query for nonexistent token\\\\\\\\\\\\");\\\\\\\\n address owner = ERC721.ownerOf(tokenId);\\\\\\\\n return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Safely mints `tokenId` and transfers it to `to`.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `tokenId` must not exist.\\\\\\\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event.\\\\\\\\n */\\\\\\\\n function _safeMint(address to, uint256 tokenId) internal virtual {\\\\\\\\n _safeMint(to, tokenId, \\\\\\\\\\\\"\\\\\\\\\\\\");\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\\\\\\\\n * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\\\\\\\\n */\\\\\\\\n function _safeMint(\\\\\\\\n address to,\\\\\\\\n uint256 tokenId,\\\\\\\\n bytes memory _data\\\\\\\\n ) internal virtual {\\\\\\\\n _mint(to, tokenId);\\\\\\\\n require(\\\\\\\\n _checkOnERC721Received(address(0), to, tokenId, _data),\\\\\\\\n \\\\\\\\\\\\"ERC721: transfer to non ERC721Receiver implementer\\\\\\\\\\\\"\\\\\\\\n );\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Mints `tokenId` and transfers it to `to`.\\\\\\\\n *\\\\\\\\n * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `tokenId` must not exist.\\\\\\\\n * - `to` cannot be the zero address.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event.\\\\\\\\n */\\\\\\\\n function _mint(address to, uint256 tokenId) internal virtual {\\\\\\\\n require(to != address(0), \\\\\\\\\\\\"ERC721: mint to the zero address\\\\\\\\\\\\");\\\\\\\\n require(!_exists(tokenId), \\\\\\\\\\\\"ERC721: token already minted\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n _beforeTokenTransfer(address(0), to, tokenId);\\\\\\\\n\\\\\\\\n _balances[to] += 1;\\\\\\\\n _owners[tokenId] = to;\\\\\\\\n\\\\\\\\n emit Transfer(address(0), to, tokenId);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Destroys `tokenId`.\\\\\\\\n * The approval is cleared when the token is burned.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `tokenId` must exist.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event.\\\\\\\\n */\\\\\\\\n function _burn(uint256 tokenId) internal virtual {\\\\\\\\n address owner = ERC721.ownerOf(tokenId);\\\\\\\\n\\\\\\\\n _beforeTokenTransfer(owner, address(0), tokenId);\\\\\\\\n\\\\\\\\n // Clear approvals\\\\\\\\n _approve(address(0), tokenId);\\\\\\\\n\\\\\\\\n _balances[owner] -= 1;\\\\\\\\n delete _owners[tokenId];\\\\\\\\n\\\\\\\\n emit Transfer(owner, address(0), tokenId);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Transfers `tokenId` from `from` to `to`.\\\\\\\\n * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `to` cannot be the zero address.\\\\\\\\n * - `tokenId` token must be owned by `from`.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event.\\\\\\\\n */\\\\\\\\n function _transfer(\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 tokenId\\\\\\\\n ) internal virtual {\\\\\\\\n require(ERC721.ownerOf(tokenId) == from, \\\\\\\\\\\\"ERC721: transfer of token that is not own\\\\\\\\\\\\");\\\\\\\\n require(to != address(0), \\\\\\\\\\\\"ERC721: transfer to the zero address\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n _beforeTokenTransfer(from, to, tokenId);\\\\\\\\n\\\\\\\\n // Clear approvals from the previous owner\\\\\\\\n _approve(address(0), tokenId);\\\\\\\\n\\\\\\\\n _balances[from] -= 1;\\\\\\\\n _balances[to] += 1;\\\\\\\\n _owners[tokenId] = to;\\\\\\\\n\\\\\\\\n emit Transfer(from, to, tokenId);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Approve `to` to operate on `tokenId`\\\\\\\\n *\\\\\\\\n * Emits a {Approval} event.\\\\\\\\n */\\\\\\\\n function _approve(address to, uint256 tokenId) internal virtual {\\\\\\\\n _tokenApprovals[tokenId] = to;\\\\\\\\n emit Approval(ERC721.ownerOf(tokenId), to, tokenId);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.\\\\\\\\n * The call is not executed if the target address is not a contract.\\\\\\\\n *\\\\\\\\n * @param from address representing the previous owner of the given token ID\\\\\\\\n * @param to target address that will receive the tokens\\\\\\\\n * @param tokenId uint256 ID of the token to be transferred\\\\\\\\n * @param _data bytes optional data to send along with the call\\\\\\\\n * @return bool whether the call correctly returned the expected magic value\\\\\\\\n */\\\\\\\\n function _checkOnERC721Received(\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 tokenId,\\\\\\\\n bytes memory _data\\\\\\\\n ) private returns (bool) {\\\\\\\\n if (to.isContract()) {\\\\\\\\n try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {\\\\\\\\n return retval == IERC721Receiver(to).onERC721Received.selector;\\\\\\\\n } catch (bytes memory reason) {\\\\\\\\n if (reason.length == 0) {\\\\\\\\n revert(\\\\\\\\\\\\"ERC721: transfer to non ERC721Receiver implementer\\\\\\\\\\\\");\\\\\\\\n } else {\\\\\\\\n assembly {\\\\\\\\n revert(add(32, reason), mload(reason))\\\\\\\\n }\\\\\\\\n }\\\\\\\\n }\\\\\\\\n } else {\\\\\\\\n return true;\\\\\\\\n }\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Hook that is called before any token transfer. This includes minting\\\\\\\\n * and burning.\\\\\\\\n *\\\\\\\\n * Calling conditions:\\\\\\\\n *\\\\\\\\n * - When `from` and `to` are both non-zero, ``from``\\\'s `tokenId` will be\\\\\\\\n * transferred to `to`.\\\\\\\\n * - When `from` is zero, `tokenId` will be minted for `to`.\\\\\\\\n * - When `to` is zero, ``from``\\\'s `tokenId` will be burned.\\\\\\\\n * - `from` and `to` are never both zero.\\\\\\\\n *\\\\\\\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\\\\\\\n */\\\\\\\\n function _beforeTokenTransfer(\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 tokenId\\\\\\\\n ) internal virtual {}\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0xd644260d8e4e64563a7adba96d774dbaac6ae89c2ee58ef49a19850ff1239b08\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/token/ERC721/IERC721.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"../../utils/introspection/IERC165.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @dev Required interface of an ERC721 compliant contract.\\\\\\\\n */\\\\\\\\ninterface IERC721 is IERC165 {\\\\\\\\n /**\\\\\\\\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\\\\\\\n */\\\\\\\\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\\\\\\\n */\\\\\\\\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\\\\\\\n */\\\\\\\\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the number of tokens in ``owner``\\\'s account.\\\\\\\\n */\\\\\\\\n function balanceOf(address owner) external view returns (uint256 balance);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the owner of the `tokenId` token.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `tokenId` must exist.\\\\\\\\n */\\\\\\\\n function ownerOf(uint256 tokenId) external view returns (address owner);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\\\\\\\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `from` cannot be the zero address.\\\\\\\\n * - `to` cannot be the zero address.\\\\\\\\n * - `tokenId` token must exist and be owned by `from`.\\\\\\\\n * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\\\\\\\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event.\\\\\\\\n */\\\\\\\\n function safeTransferFrom(\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 tokenId\\\\\\\\n ) external;\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Transfers `tokenId` token from `from` to `to`.\\\\\\\\n *\\\\\\\\n * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `from` cannot be the zero address.\\\\\\\\n * - `to` cannot be the zero address.\\\\\\\\n * - `tokenId` token must be owned by `from`.\\\\\\\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event.\\\\\\\\n */\\\\\\\\n function transferFrom(\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 tokenId\\\\\\\\n ) external;\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\\\\\\\n * The approval is cleared when the token is transferred.\\\\\\\\n *\\\\\\\\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - The caller must own the token or be an approved operator.\\\\\\\\n * - `tokenId` must exist.\\\\\\\\n *\\\\\\\\n * Emits an {Approval} event.\\\\\\\\n */\\\\\\\\n function approve(address to, uint256 tokenId) external;\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the account approved for `tokenId` token.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `tokenId` must exist.\\\\\\\\n */\\\\\\\\n function getApproved(uint256 tokenId) external view returns (address operator);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Approve or remove `operator` as an operator for the caller.\\\\\\\\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - The `operator` cannot be the caller.\\\\\\\\n *\\\\\\\\n * Emits an {ApprovalForAll} event.\\\\\\\\n */\\\\\\\\n function setApprovalForAll(address operator, bool _approved) external;\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\\\\\\\n *\\\\\\\\n * See {setApprovalForAll}\\\\\\\\n */\\\\\\\\n function isApprovedForAll(address owner, address operator) external view returns (bool);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Safely transfers `tokenId` token from `from` to `to`.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `from` cannot be the zero address.\\\\\\\\n * - `to` cannot be the zero address.\\\\\\\\n * - `tokenId` token must exist and be owned by `from`.\\\\\\\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\\\\\\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event.\\\\\\\\n */\\\\\\\\n function safeTransferFrom(\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 tokenId,\\\\\\\\n bytes calldata data\\\\\\\\n ) external;\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0xf101e8720213560fab41104d53b3cc7ba0456ef3a98455aa7f022391783144a0\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @title ERC721 token receiver interface\\\\\\\\n * @dev Interface for any contract that wants to support safeTransfers\\\\\\\\n * from ERC721 asset contracts.\\\\\\\\n */\\\\\\\\ninterface IERC721Receiver {\\\\\\\\n /**\\\\\\\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\\\\\\\n * by `operator` from `from`, this function is called.\\\\\\\\n *\\\\\\\\n * It must return its Solidity selector to confirm the token transfer.\\\\\\\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\\\\\\\n *\\\\\\\\n * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.\\\\\\\\n */\\\\\\\\n function onERC721Received(\\\\\\\\n address operator,\\\\\\\\n address from,\\\\\\\\n uint256 tokenId,\\\\\\\\n bytes calldata data\\\\\\\\n ) external returns (bytes4);\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0xd9517254724276e2e8de3769183c1f738f445f0095c26fd9b86d3c6687e887b9\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"../IERC721.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\\\\\\\\n * @dev See https://eips.ethereum.org/EIPS/eip-721\\\\\\\\n */\\\\\\\\ninterface IERC721Metadata is IERC721 {\\\\\\\\n /**\\\\\\\\n * @dev Returns the token collection name.\\\\\\\\n */\\\\\\\\n function name() external view returns (string memory);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the token collection symbol.\\\\\\\\n */\\\\\\\\n function symbol() external view returns (string memory);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\\\\\\\\n */\\\\\\\\n function tokenURI(uint256 tokenId) external view returns (string memory);\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0xd32fb7f530a914b1083d10a6bed3a586f2451952fec04fe542bcc670a82f7ba5\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/utils/Address.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @dev Collection of functions related to the address type\\\\\\\\n */\\\\\\\\nlibrary Address {\\\\\\\\n /**\\\\\\\\n * @dev Returns true if `account` is a contract.\\\\\\\\n *\\\\\\\\n * [IMPORTANT]\\\\\\\\n * ====\\\\\\\\n * It is unsafe to assume that an address for which this function returns\\\\\\\\n * false is an externally-owned account (EOA) and not a contract.\\\\\\\\n *\\\\\\\\n * Among others, `isContract` will return false for the following\\\\\\\\n * types of addresses:\\\\\\\\n *\\\\\\\\n * - an externally-owned account\\\\\\\\n * - a contract in construction\\\\\\\\n * - an address where a contract will be created\\\\\\\\n * - an address where a contract lived, but was destroyed\\\\\\\\n * ====\\\\\\\\n */\\\\\\\\n function isContract(address account) internal view returns (bool) {\\\\\\\\n // This method relies on extcodesize, which returns 0 for contracts in\\\\\\\\n // construction, since the code is only stored at the end of the\\\\\\\\n // constructor execution.\\\\\\\\n\\\\\\\\n uint256 size;\\\\\\\\n assembly {\\\\\\\\n size := extcodesize(account)\\\\\\\\n }\\\\\\\\n return size > 0;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Replacement for Solidity\\\'s `transfer`: sends `amount` wei to\\\\\\\\n * `recipient`, forwarding all available gas and reverting on errors.\\\\\\\\n *\\\\\\\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\\\\\\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\\\\\\\n * imposed by `transfer`, making them unable to receive funds via\\\\\\\\n * `transfer`. {sendValue} removes this limitation.\\\\\\\\n *\\\\\\\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\\\\\\\n *\\\\\\\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\\\\\\\n * taken to not create reentrancy vulnerabilities. Consider using\\\\\\\\n * {ReentrancyGuard} or the\\\\\\\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\\\\\\\n */\\\\\\\\n function sendValue(address payable recipient, uint256 amount) internal {\\\\\\\\n require(address(this).balance >= amount, \\\\\\\\\\\\"Address: insufficient balance\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n (bool success, ) = recipient.call{value: amount}(\\\\\\\\\\\\"\\\\\\\\\\\\");\\\\\\\\n require(success, \\\\\\\\\\\\"Address: unable to send value, recipient may have reverted\\\\\\\\\\\\");\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Performs a Solidity function call using a low level `call`. A\\\\\\\\n * plain `call` is an unsafe replacement for a function call: use this\\\\\\\\n * function instead.\\\\\\\\n *\\\\\\\\n * If `target` reverts with a revert reason, it is bubbled up by this\\\\\\\\n * function (like regular Solidity function calls).\\\\\\\\n *\\\\\\\\n * Returns the raw returned data. To convert to the expected return value,\\\\\\\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `target` must be a contract.\\\\\\\\n * - calling `target` with `data` must not revert.\\\\\\\\n *\\\\\\\\n * _Available since v3.1._\\\\\\\\n */\\\\\\\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\\\\\\\n return functionCall(target, data, \\\\\\\\\\\\"Address: low-level call failed\\\\\\\\\\\\");\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\\\\\\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\\\\\\\n *\\\\\\\\n * _Available since v3.1._\\\\\\\\n */\\\\\\\\n function functionCall(\\\\\\\\n address target,\\\\\\\\n bytes memory data,\\\\\\\\n string memory errorMessage\\\\\\\\n ) internal returns (bytes memory) {\\\\\\\\n return functionCallWithValue(target, data, 0, errorMessage);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\\\\\\\n * but also transferring `value` wei to `target`.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - the calling contract must have an ETH balance of at least `value`.\\\\\\\\n * - the called Solidity function must be `payable`.\\\\\\\\n *\\\\\\\\n * _Available since v3.1._\\\\\\\\n */\\\\\\\\n function functionCallWithValue(\\\\\\\\n address target,\\\\\\\\n bytes memory data,\\\\\\\\n uint256 value\\\\\\\\n ) internal returns (bytes memory) {\\\\\\\\n return functionCallWithValue(target, data, value, \\\\\\\\\\\\"Address: low-level call with value failed\\\\\\\\\\\\");\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\\\\\\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\\\\\\\n *\\\\\\\\n * _Available since v3.1._\\\\\\\\n */\\\\\\\\n function functionCallWithValue(\\\\\\\\n address target,\\\\\\\\n bytes memory data,\\\\\\\\n uint256 value,\\\\\\\\n string memory errorMessage\\\\\\\\n ) internal returns (bytes memory) {\\\\\\\\n require(address(this).balance >= value, \\\\\\\\\\\\"Address: insufficient balance for call\\\\\\\\\\\\");\\\\\\\\n require(isContract(target), \\\\\\\\\\\\"Address: call to non-contract\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\\\\\\\n return _verifyCallResult(success, returndata, errorMessage);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\\\\\\\n * but performing a static call.\\\\\\\\n *\\\\\\\\n * _Available since v3.3._\\\\\\\\n */\\\\\\\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\\\\\\\n return functionStaticCall(target, data, \\\\\\\\\\\\"Address: low-level static call failed\\\\\\\\\\\\");\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\\\\\\\n * but performing a static call.\\\\\\\\n *\\\\\\\\n * _Available since v3.3._\\\\\\\\n */\\\\\\\\n function functionStaticCall(\\\\\\\\n address target,\\\\\\\\n bytes memory data,\\\\\\\\n string memory errorMessage\\\\\\\\n ) internal view returns (bytes memory) {\\\\\\\\n require(isContract(target), \\\\\\\\\\\\"Address: static call to non-contract\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n (bool success, bytes memory returndata) = target.staticcall(data);\\\\\\\\n return _verifyCallResult(success, returndata, errorMessage);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\\\\\\\n * but performing a delegate call.\\\\\\\\n *\\\\\\\\n * _Available since v3.4._\\\\\\\\n */\\\\\\\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\\\\\\\n return functionDelegateCall(target, data, \\\\\\\\\\\\"Address: low-level delegate call failed\\\\\\\\\\\\");\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\\\\\\\n * but performing a delegate call.\\\\\\\\n *\\\\\\\\n * _Available since v3.4._\\\\\\\\n */\\\\\\\\n function functionDelegateCall(\\\\\\\\n address target,\\\\\\\\n bytes memory data,\\\\\\\\n string memory errorMessage\\\\\\\\n ) internal returns (bytes memory) {\\\\\\\\n require(isContract(target), \\\\\\\\\\\\"Address: delegate call to non-contract\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\\\\\\\n return _verifyCallResult(success, returndata, errorMessage);\\\\\\\\n }\\\\\\\\n\\\\\\\\n function _verifyCallResult(\\\\\\\\n bool success,\\\\\\\\n bytes memory returndata,\\\\\\\\n string memory errorMessage\\\\\\\\n ) private pure returns (bytes memory) {\\\\\\\\n if (success) {\\\\\\\\n return returndata;\\\\\\\\n } else {\\\\\\\\n // Look for revert reason and bubble it up if present\\\\\\\\n if (returndata.length > 0) {\\\\\\\\n // The easiest way to bubble the revert reason is using memory via assembly\\\\\\\\n\\\\\\\\n assembly {\\\\\\\\n let returndata_size := mload(returndata)\\\\\\\\n revert(add(32, returndata), returndata_size)\\\\\\\\n }\\\\\\\\n } else {\\\\\\\\n revert(errorMessage);\\\\\\\\n }\\\\\\\\n }\\\\\\\\n }\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x3b4820cac4f127869f6eb496c1d74fa6ac86ed24071e0f94742e6aef20e7252c\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/utils/Context.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\n/*\\\\\\\\n * @dev Provides information about the current execution context, including the\\\\\\\\n * sender of the transaction and its data. While these are generally available\\\\\\\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\\\\\\\n * manner, since when dealing with meta-transactions the account sending and\\\\\\\\n * paying for execution may not be the actual sender (as far as an application\\\\\\\\n * is concerned).\\\\\\\\n *\\\\\\\\n * This contract is only required for intermediate, library-like contracts.\\\\\\\\n */\\\\\\\\nabstract contract Context {\\\\\\\\n function _msgSender() internal view virtual returns (address) {\\\\\\\\n return msg.sender;\\\\\\\\n }\\\\\\\\n\\\\\\\\n function _msgData() internal view virtual returns (bytes calldata) {\\\\\\\\n return msg.data;\\\\\\\\n }\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x95098bd1d9c8dec4d80d3dedb88a0d949fa0d740ee99f2aa466bc308216ca6d5\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/utils/Strings.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @dev String operations.\\\\\\\\n */\\\\\\\\nlibrary Strings {\\\\\\\\n bytes16 private constant _HEX_SYMBOLS = \\\\\\\\\\\\"0123456789abcdef\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\\\\\\\n */\\\\\\\\n function toString(uint256 value) internal pure returns (string memory) {\\\\\\\\n // Inspired by OraclizeAPI\\\'s implementation - MIT licence\\\\\\\\n // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol\\\\\\\\n\\\\\\\\n if (value == 0) {\\\\\\\\n return \\\\\\\\\\\\"0\\\\\\\\\\\\";\\\\\\\\n }\\\\\\\\n uint256 temp = value;\\\\\\\\n uint256 digits;\\\\\\\\n while (temp != 0) {\\\\\\\\n digits++;\\\\\\\\n temp /= 10;\\\\\\\\n }\\\\\\\\n bytes memory buffer = new bytes(digits);\\\\\\\\n while (value != 0) {\\\\\\\\n digits -= 1;\\\\\\\\n buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));\\\\\\\\n value /= 10;\\\\\\\\n }\\\\\\\\n return string(buffer);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\\\\\\\n */\\\\\\\\n function toHexString(uint256 value) internal pure returns (string memory) {\\\\\\\\n if (value == 0) {\\\\\\\\n return \\\\\\\\\\\\"0x00\\\\\\\\\\\\";\\\\\\\\n }\\\\\\\\n uint256 temp = value;\\\\\\\\n uint256 length = 0;\\\\\\\\n while (temp != 0) {\\\\\\\\n length++;\\\\\\\\n temp >>= 8;\\\\\\\\n }\\\\\\\\n return toHexString(value, length);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\\\\\\\n */\\\\\\\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\\\\\\\n bytes memory buffer = new bytes(2 * length + 2);\\\\\\\\n buffer[0] = \\\\\\\\\\\\"0\\\\\\\\\\\\";\\\\\\\\n buffer[1] = \\\\\\\\\\\\"x\\\\\\\\\\\\";\\\\\\\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\\\\\\\n buffer[i] = _HEX_SYMBOLS[value & 0xf];\\\\\\\\n value >>= 4;\\\\\\\\n }\\\\\\\\n require(value == 0, \\\\\\\\\\\\"Strings: hex length insufficient\\\\\\\\\\\\");\\\\\\\\n return string(buffer);\\\\\\\\n }\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x391d3ba97ab6856a16b225d6ee29617ad15ff00db70f3b4df1ab5ea33aa47c9d\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/utils/introspection/ERC165.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"./IERC165.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @dev Implementation of the {IERC165} interface.\\\\\\\\n *\\\\\\\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\\\\\\\n * for the additional interface id that will be supported. For example:\\\\\\\\n *\\\\\\\\n * ```solidity\\\\\\\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\\\\\\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\\\\\\\n * }\\\\\\\\n * ```\\\\\\\\n *\\\\\\\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\\\\\\\n */\\\\\\\\nabstract contract ERC165 is IERC165 {\\\\\\\\n /**\\\\\\\\n * @dev See {IERC165-supportsInterface}.\\\\\\\\n */\\\\\\\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\\\\\\\n return interfaceId == type(IERC165).interfaceId;\\\\\\\\n }\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x5718c5df9bd67ac68a796961df938821bb5dc0cd4c6118d77e9145afb187409b\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/utils/introspection/IERC165.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @dev Interface of the ERC165 standard, as defined in the\\\\\\\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\\\\\\\n *\\\\\\\\n * Implementers can declare support of contract interfaces, which can then be\\\\\\\\n * queried by others ({ERC165Checker}).\\\\\\\\n *\\\\\\\\n * For an implementation, see {ERC165}.\\\\\\\\n */\\\\\\\\ninterface IERC165 {\\\\\\\\n /**\\\\\\\\n * @dev Returns true if this contract implements the interface defined by\\\\\\\\n * `interfaceId`. See the corresponding\\\\\\\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\\\\\\\n * to learn more about how these ids are created.\\\\\\\\n *\\\\\\\\n * This function call must use less than 30 000 gas.\\\\\\\\n */\\\\\\\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0xa28007762d9da9db878dd421960c8cb9a10471f47ab5c1b3309bfe48e9e79ff4\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol\\\\":{\\\\"content\\\\":\\\\"pragma solidity >=0.6.2;\\\\\\\\n\\\\\\\\ninterface IUniswapV2Router01 {\\\\\\\\n function factory() external pure returns (address);\\\\\\\\n function WETH() external pure returns (address);\\\\\\\\n\\\\\\\\n function addLiquidity(\\\\\\\\n address tokenA,\\\\\\\\n address tokenB,\\\\\\\\n uint amountADesired,\\\\\\\\n uint amountBDesired,\\\\\\\\n uint amountAMin,\\\\\\\\n uint amountBMin,\\\\\\\\n address to,\\\\\\\\n uint deadline\\\\\\\\n ) external returns (uint amountA, uint amountB, uint liquidity);\\\\\\\\n function addLiquidityETH(\\\\\\\\n address token,\\\\\\\\n uint amountTokenDesired,\\\\\\\\n uint amountTokenMin,\\\\\\\\n uint amountETHMin,\\\\\\\\n address to,\\\\\\\\n uint deadline\\\\\\\\n ) external payable returns (uint amountToken, uint amountETH, uint liquidity);\\\\\\\\n function removeLiquidity(\\\\\\\\n address tokenA,\\\\\\\\n address tokenB,\\\\\\\\n uint liquidity,\\\\\\\\n uint amountAMin,\\\\\\\\n uint amountBMin,\\\\\\\\n address to,\\\\\\\\n uint deadline\\\\\\\\n ) external returns (uint amountA, uint amountB);\\\\\\\\n function removeLiquidityETH(\\\\\\\\n address token,\\\\\\\\n uint liquidity,\\\\\\\\n uint amountTokenMin,\\\\\\\\n uint amountETHMin,\\\\\\\\n address to,\\\\\\\\n uint deadline\\\\\\\\n ) external returns (uint amountToken, uint amountETH);\\\\\\\\n function removeLiquidityWithPermit(\\\\\\\\n address tokenA,\\\\\\\\n address tokenB,\\\\\\\\n uint liquidity,\\\\\\\\n uint amountAMin,\\\\\\\\n uint amountBMin,\\\\\\\\n address to,\\\\\\\\n uint deadline,\\\\\\\\n bool approveMax, uint8 v, bytes32 r, bytes32 s\\\\\\\\n ) external returns (uint amountA, uint amountB);\\\\\\\\n function removeLiquidityETHWithPermit(\\\\\\\\n address token,\\\\\\\\n uint liquidity,\\\\\\\\n uint amountTokenMin,\\\\\\\\n uint amountETHMin,\\\\\\\\n address to,\\\\\\\\n uint deadline,\\\\\\\\n bool approveMax, uint8 v, bytes32 r, bytes32 s\\\\\\\\n ) external returns (uint amountToken, uint amountETH);\\\\\\\\n function swapExactTokensForTokens(\\\\\\\\n uint amountIn,\\\\\\\\n uint amountOutMin,\\\\\\\\n address[] calldata path,\\\\\\\\n address to,\\\\\\\\n uint deadline\\\\\\\\n ) external returns (uint[] memory amounts);\\\\\\\\n function swapTokensForExactTokens(\\\\\\\\n uint amountOut,\\\\\\\\n uint amountInMax,\\\\\\\\n address[] calldata path,\\\\\\\\n address to,\\\\\\\\n uint deadline\\\\\\\\n ) external returns (uint[] memory amounts);\\\\\\\\n function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)\\\\\\\\n external\\\\\\\\n payable\\\\\\\\n returns (uint[] memory amounts);\\\\\\\\n function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)\\\\\\\\n external\\\\\\\\n returns (uint[] memory amounts);\\\\\\\\n function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)\\\\\\\\n external\\\\\\\\n returns (uint[] memory amounts);\\\\\\\\n function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)\\\\\\\\n external\\\\\\\\n payable\\\\\\\\n returns (uint[] memory amounts);\\\\\\\\n\\\\\\\\n function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);\\\\\\\\n function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);\\\\\\\\n function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);\\\\\\\\n function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);\\\\\\\\n function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x8a3c5c449d4b7cd76513ed6995f4b86e4a86f222c770f8442f5fc128ce29b4d2\\\\"},\\\\"contracts/Interfaces/Interfaces.sol\\\\":{\\\\"content\\\\":\\\\"pragma solidity 0.8.6;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * SPDX-License-Identifier: GPL-3.0-or-later\\\\\\\\n * Hegic\\\\\\\\n * Copyright (C) 2021 Hegic Protocol\\\\\\\\n *\\\\\\\\n * This program is free software: you can redistribute it and/or modify\\\\\\\\n * it under the terms of the GNU General Public License as published by\\\\\\\\n * the Free Software Foundation, either version 3 of the License, or\\\\\\\\n * (at your option) any later version.\\\\\\\\n *\\\\\\\\n * This program is distributed in the hope that it will be useful,\\\\\\\\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\\\\\\\\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\\\\\\\\n * GNU General Public License for more details.\\\\\\\\n *\\\\\\\\n * You should have received a copy of the GNU General Public License\\\\\\\\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\\\\\\\\n **/\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"@openzeppelin/contracts/token/ERC20/ERC20.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"@openzeppelin/contracts/token/ERC721/ERC721.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"@openzeppelin/contracts/access/Ownable.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"@chainlink/contracts/src/v0.7/interfaces/AggregatorV3Interface.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\n// /**\\\\\\\\n// * @author 0mllwntrmt3\\\\\\\\n// * @title Hegic Protocol V8888 Interface\\\\\\\\n// * @notice The interface for the price calculator,\\\\\\\\n// * options, pools and staking contracts.\\\\\\\\n// **/\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @notice The interface fot the contract that calculates\\\\\\\\n * the options prices (the premiums) that are adjusted\\\\\\\\n * through balancing the `ImpliedVolRate` parameter.\\\\\\\\n **/\\\\\\\\n\\\\\\\\ninterface IIVLPriceCalculator {\\\\\\\\n event SetImpliedVolRate(uint256 value);\\\\\\\\n event SetSettlementFeeShare(uint256 value);\\\\\\\\n}\\\\\\\\n\\\\\\\\ninterface IPriceCalculator is IIVLPriceCalculator {\\\\\\\\n /**\\\\\\\\n * @param period The option period\\\\\\\\n * @param amount The option size\\\\\\\\n * @param strike The option strike\\\\\\\\n **/\\\\\\\\n function calculateTotalPremium(\\\\\\\\n uint256 period,\\\\\\\\n uint256 amount,\\\\\\\\n uint256 strike\\\\\\\\n ) external view returns (uint256 settlementFee, uint256 premium);\\\\\\\\n}\\\\\\\\n\\\\\\\\ninterface IAtmPremiumCalculator {\\\\\\\\n event SetPolinomCall(int256[5] values);\\\\\\\\n event SetPolinomPut(int256[5] values);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param period The option period\\\\\\\\n * @param amount The option size\\\\\\\\n * @param strike The option strike\\\\\\\\n **/\\\\\\\\n function calculateAtmCallPremium(\\\\\\\\n uint256 period,\\\\\\\\n uint256 amount,\\\\\\\\n uint256 strike\\\\\\\\n ) external view returns (uint256 premium);\\\\\\\\n\\\\\\\\n function calculateAtmPutPremium(\\\\\\\\n uint256 period,\\\\\\\\n uint256 amount,\\\\\\\\n uint256 strike\\\\\\\\n ) external view returns (uint256 premium);\\\\\\\\n}\\\\\\\\n\\\\\\\\ninterface IPremiumCalculator is IIVLPriceCalculator {\\\\\\\\n event SetBorders(uint256[3] values);\\\\\\\\n event SetImpliedVolRates(uint256[4] values);\\\\\\\\n event SetDiscountCall(int256[5] values);\\\\\\\\n event SetDiscountPut(int256[5] values);\\\\\\\\n event SetDiscountSpread(uint8 values);\\\\\\\\n event SetStrikePercentage(uint256 value);\\\\\\\\n event SetPeriodLimits(uint256 min, uint256 max);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param period The option period\\\\\\\\n * @param amount The option size\\\\\\\\n * @param strike The option strike\\\\\\\\n **/\\\\\\\\n function calculatePremium(\\\\\\\\n uint256 period,\\\\\\\\n uint256 amount,\\\\\\\\n uint256 strike\\\\\\\\n ) external view returns (uint256 premium);\\\\\\\\n\\\\\\\\n function priceProvider() external view returns (AggregatorV3Interface);\\\\\\\\n}\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @notice The interface for the contract that manages pools and the options parameters,\\\\\\\\n * accumulates the funds from the liquidity providers and makes the withdrawals for them,\\\\\\\\n * sells the options contracts to the options buyers and collateralizes them,\\\\\\\\n * exercises the ITM (in-the-money) options with the unrealized P&L and settles them,\\\\\\\\n * unlocks the expired options and distributes the premiums among the liquidity providers.\\\\\\\\n **/\\\\\\\\ninterface IHegicPool is IERC721, IPriceCalculator {\\\\\\\\n enum OptionState {Invalid, Active, Exercised, Expired}\\\\\\\\n enum TrancheState {Invalid, Open, Closed}\\\\\\\\n\\\\\\\\n function priceProvider() external view returns (AggregatorV3Interface);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param state The state of the option: Invalid, Active, Exercised, Expired\\\\\\\\n * @param strike The option strike\\\\\\\\n * @param amount The option size\\\\\\\\n * @param lockedAmount The option collateral size locked\\\\\\\\n * @param expired The option expiration timestamp\\\\\\\\n * @param hedgePremium The share of the premium paid for hedging from the losses\\\\\\\\n * @param unhedgePremium The share of the premium paid to the hedged liquidity provider\\\\\\\\n **/\\\\\\\\n struct Option {\\\\\\\\n OptionState state;\\\\\\\\n uint256 strike;\\\\\\\\n uint256 amount;\\\\\\\\n uint256 lockedAmount;\\\\\\\\n uint256 expired;\\\\\\\\n uint256 hedgePremium;\\\\\\\\n uint256 unhedgePremium;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param state The state of the liquidity tranche: Invalid, Open, Closed\\\\\\\\n * @param share The liquidity provider\\\'s share in the pool\\\\\\\\n * @param amount The size of liquidity provided\\\\\\\\n * @param creationTimestamp The liquidity deposit timestamp\\\\\\\\n * @param hedged The liquidity tranche type: hedged or unhedged (classic)\\\\\\\\n **/\\\\\\\\n struct Tranche {\\\\\\\\n TrancheState state;\\\\\\\\n uint256 share;\\\\\\\\n uint256 amount;\\\\\\\\n uint256 creationTimestamp;\\\\\\\\n bool hedged;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param id The ERC721 token ID linked to the option\\\\\\\\n * @param settlementFee The part of the premium that\\\\\\\\n * is distributed among the HEGIC staking participants\\\\\\\\n * @param premium The part of the premium that\\\\\\\\n * is distributed among the liquidity providers\\\\\\\\n **/\\\\\\\\n event Acquired(uint256 indexed id, uint256 settlementFee, uint256 premium);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param id The ERC721 token ID linked to the option\\\\\\\\n * @param profit The profits of the option if exercised\\\\\\\\n **/\\\\\\\\n event Exercised(uint256 indexed id, uint256 profit);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param id The ERC721 token ID linked to the option\\\\\\\\n **/\\\\\\\\n event Expired(uint256 indexed id);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param account The liquidity provider\\\'s address\\\\\\\\n * @param trancheID The liquidity tranche ID\\\\\\\\n **/\\\\\\\\n event Withdrawn(\\\\\\\\n address indexed account,\\\\\\\\n uint256 indexed trancheID,\\\\\\\\n uint256 amount\\\\\\\\n );\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param id The ERC721 token ID linked to the option\\\\\\\\n **/\\\\\\\\n function unlock(uint256 id) external;\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param id The ERC721 token ID linked to the option\\\\\\\\n **/\\\\\\\\n function exercise(uint256 id) external;\\\\\\\\n\\\\\\\\n function setLockupPeriod(uint256, uint256) external;\\\\\\\\n\\\\\\\\n function collateralizationRatio() external view returns (uint256);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param value The hedging pool address\\\\\\\\n **/\\\\\\\\n function setHedgePool(address value) external;\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param trancheID The liquidity tranche ID\\\\\\\\n * @return amount The liquidity to be received with\\\\\\\\n * the positive or negative P&L earned or lost during\\\\\\\\n * the period of holding the liquidity tranche considered\\\\\\\\n **/\\\\\\\\n function withdraw(uint256 trancheID) external returns (uint256 amount);\\\\\\\\n\\\\\\\\n function pricer() external view returns (IPriceCalculator);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @return amount The unhedged liquidity size\\\\\\\\n * (unprotected from the losses on selling the options)\\\\\\\\n **/\\\\\\\\n function unhedgedBalance() external view returns (uint256 amount);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @return amount The hedged liquidity size\\\\\\\\n * (protected from the losses on selling the options)\\\\\\\\n **/\\\\\\\\n function hedgedBalance() external view returns (uint256 amount);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param account The liquidity provider\\\'s address\\\\\\\\n * @param amount The size of the liquidity tranche\\\\\\\\n * @param hedged The type of the liquidity tranche\\\\\\\\n * @param minShare The minimum share in the pool of the user\\\\\\\\n **/\\\\\\\\n function provideFrom(\\\\\\\\n address account,\\\\\\\\n uint256 amount,\\\\\\\\n bool hedged,\\\\\\\\n uint256 minShare\\\\\\\\n ) external returns (uint256 share);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param holder The option buyer address\\\\\\\\n * @param period The option period\\\\\\\\n * @param amount The option size\\\\\\\\n * @param strike The option strike\\\\\\\\n **/\\\\\\\\n function sellOption(\\\\\\\\n address holder,\\\\\\\\n uint256 period,\\\\\\\\n uint256 amount,\\\\\\\\n uint256 strike\\\\\\\\n ) external returns (uint256 id);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param trancheID The liquidity tranche ID\\\\\\\\n * @return amount The amount to be received after the withdrawal\\\\\\\\n **/\\\\\\\\n function withdrawWithoutHedge(uint256 trancheID)\\\\\\\\n external\\\\\\\\n returns (uint256 amount);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @return amount The total liquidity provided into the pool\\\\\\\\n **/\\\\\\\\n function totalBalance() external view returns (uint256 amount);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @return amount The total liquidity locked in the pool\\\\\\\\n **/\\\\\\\\n function lockedAmount() external view returns (uint256 amount);\\\\\\\\n\\\\\\\\n function token() external view returns (IERC20);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @return state The state of the option: Invalid, Active, Exercised, Expired\\\\\\\\n * @return strike The option strike\\\\\\\\n * @return amount The option size\\\\\\\\n * @return lockedAmount The option collateral size locked\\\\\\\\n * @return expired The option expiration timestamp\\\\\\\\n * @return hedgePremium The share of the premium paid for hedging from the losses\\\\\\\\n * @return unhedgePremium The share of the premium paid to the hedged liquidity provider\\\\\\\\n **/\\\\\\\\n function options(uint256 id)\\\\\\\\n external\\\\\\\\n view\\\\\\\\n returns (\\\\\\\\n OptionState state,\\\\\\\\n uint256 strike,\\\\\\\\n uint256 amount,\\\\\\\\n uint256 lockedAmount,\\\\\\\\n uint256 expired,\\\\\\\\n uint256 hedgePremium,\\\\\\\\n uint256 unhedgePremium\\\\\\\\n );\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @return state The state of the liquidity tranche: Invalid, Open, Closed\\\\\\\\n * @return share The liquidity provider\\\'s share in the pool\\\\\\\\n * @return amount The size of liquidity provided\\\\\\\\n * @return creationTimestamp The liquidity deposit timestamp\\\\\\\\n * @return hedged The liquidity tranche type: hedged or unhedged (classic)\\\\\\\\n **/\\\\\\\\n function tranches(uint256 id)\\\\\\\\n external\\\\\\\\n view\\\\\\\\n returns (\\\\\\\\n TrancheState state,\\\\\\\\n uint256 share,\\\\\\\\n uint256 amount,\\\\\\\\n uint256 creationTimestamp,\\\\\\\\n bool hedged\\\\\\\\n );\\\\\\\\n}\\\\\\\\n\\\\\\\\ninterface ISettlementFeeRecipient {\\\\\\\\n function distributeUnrealizedRewards() external;\\\\\\\\n}\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @notice The interface for the contract that stakes HEGIC tokens\\\\\\\\n * through buying microlots (any amount of HEGIC tokens per microlot)\\\\\\\\n * and staking lots (888,000 HEGIC per lot), accumulates the staking\\\\\\\\n * rewards (settlement fees) and distributes the staking rewards among\\\\\\\\n * the microlots and staking lots holders (should be claimed manually).\\\\\\\\n **/\\\\\\\\ninterface IHegicStaking is ISettlementFeeRecipient {\\\\\\\\n event Claim(address indexed account, uint256 amount);\\\\\\\\n event Profit(uint256 amount);\\\\\\\\n event MicroLotsAcquired(address indexed account, uint256 amount);\\\\\\\\n event MicroLotsSold(address indexed account, uint256 amount);\\\\\\\\n\\\\\\\\n function claimProfits(address account) external returns (uint256 profit);\\\\\\\\n\\\\\\\\n function buyStakingLot(uint256 amount) external;\\\\\\\\n\\\\\\\\n function sellStakingLot(uint256 amount) external;\\\\\\\\n\\\\\\\\n function profitOf(address account) external view returns (uint256);\\\\\\\\n}\\\\\\\\n\\\\\\\\ninterface IWETH is IERC20 {\\\\\\\\n function deposit() external payable;\\\\\\\\n\\\\\\\\n function withdraw(uint256 value) external;\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x958c8bea8183e9896adeba8cd1e6d4f6be347feba0c3cb292e7ef8b5a371202a\\\\",\\\\"license\\\\":\\\\"GPL-3.0-or-later\\\\"},\\\\"contracts/OptionsManager/IOptionsManager.sol\\\\":{\\\\"content\\\\":\\\\"pragma solidity 0.8.6;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * SPDX-License-Identifier: GPL-3.0-or-later\\\\\\\\n * Hegic\\\\\\\\n * Copyright (C) 2021 Hegic Protocol\\\\\\\\n *\\\\\\\\n * This program is free software: you can redistribute it and/or modify\\\\\\\\n * it under the terms of the GNU General Public License as published by\\\\\\\\n * the Free Software Foundation, either version 3 of the License, or\\\\\\\\n * (at your option) any later version.\\\\\\\\n *\\\\\\\\n * This program is distributed in the hope that it will be useful,\\\\\\\\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\\\\\\\\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\\\\\\\\n * GNU General Public License for more details.\\\\\\\\n *\\\\\\\\n * You should have received a copy of the GNU General Public License\\\\\\\\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\\\\\\\\n **/\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"@openzeppelin/contracts/token/ERC721/IERC721.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @notice The interface for the contract\\\\\\\\n * that tokenizes options as ERC721.\\\\\\\\n **/\\\\\\\\n\\\\\\\\ninterface IOptionsManager is IERC721 {\\\\\\\\n /**\\\\\\\\n * @param holder The option buyer address\\\\\\\\n **/\\\\\\\\n function createOptionFor(address holder) external returns (uint256);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param tokenId The ERC721 token ID linked to the option\\\\\\\\n **/\\\\\\\\n function tokenPool(uint256 tokenId) external returns (address pool);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param spender The option buyer address or another address\\\\\\\\n * with the granted permission to buy/exercise options on the user\\\'s behalf\\\\\\\\n * @param tokenId The ERC721 token ID linked to the option\\\\\\\\n **/\\\\\\\\n function isApprovedOrOwner(address spender, uint256 tokenId)\\\\\\\\n external\\\\\\\\n view\\\\\\\\n returns (bool);\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x8112a4f2f84024d8d97414d17306134350b05e55612125d8b863d0b8892d7156\\\\",\\\\"license\\\\":\\\\"GPL-3.0-or-later\\\\"},\\\\"contracts/Pool/IHegicOperationalTreasury.sol\\\\":{\\\\"content\\\\":\\\\"pragma solidity 0.8.6;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * SPDX-License-Identifier: GPL-3.0-or-later\\\\\\\\n * Hegic\\\\\\\\n * Copyright (C) 2022 Hegic Protocol\\\\\\\\n *\\\\\\\\n * This program is free software: you can redistribute it and/or modify\\\\\\\\n * it under the terms of the GNU General Public License as published by\\\\\\\\n * the Free Software Foundation, either version 3 of the License, or\\\\\\\\n * (at your option) any later version.\\\\\\\\n *\\\\\\\\n * This program is distributed in the hope that it will be useful,\\\\\\\\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\\\\\\\\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\\\\\\\\n * GNU General Public License for more details.\\\\\\\\n *\\\\\\\\n * You should have received a copy of the GNU General Public License\\\\\\\\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\\\\\\\\n **/\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"../OptionsManager/IOptionsManager.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\ninterface IHegicOperationalTreasury {\\\\\\\\n enum LockedLiquidityState {Unlocked, Locked}\\\\\\\\n\\\\\\\\n event Expired(uint256 indexed id);\\\\\\\\n event Paid(uint256 indexed id, address indexed account, uint256 amount);\\\\\\\\n event Replenished(uint256 amount);\\\\\\\\n\\\\\\\\n struct LockedLiquidity {\\\\\\\\n LockedLiquidityState state;\\\\\\\\n address strategy;\\\\\\\\n uint128 negativepnl;\\\\\\\\n uint128 positivepnl;\\\\\\\\n uint32 expiration;\\\\\\\\n }\\\\\\\\n\\\\\\\\n function manager() external view returns (IOptionsManager);\\\\\\\\n\\\\\\\\n function token() external view returns (IERC20);\\\\\\\\n\\\\\\\\n function lockLiquidityFor(\\\\\\\\n address holder,\\\\\\\\n uint128 negativepnl,\\\\\\\\n uint32 expiration\\\\\\\\n ) external returns (uint256 optionID);\\\\\\\\n\\\\\\\\n function payOff(\\\\\\\\n uint256 lockedLiquidityID,\\\\\\\\n uint256 amount,\\\\\\\\n address account\\\\\\\\n ) external;\\\\\\\\n\\\\\\\\n function lockedByStrategy(address strategy)\\\\\\\\n external\\\\\\\\n view\\\\\\\\n returns (uint256 lockedAmount);\\\\\\\\n\\\\\\\\n function getStakeAndCoverBalance() external view returns (uint256 balance);\\\\\\\\n\\\\\\\\n function totalBalance() external view returns (uint256 totalBalance);\\\\\\\\n\\\\\\\\n function lockedPremium() external view returns (uint256 lockedPremium);\\\\\\\\n\\\\\\\\n function benchmark() external view returns (uint256 benchmark);\\\\\\\\n\\\\\\\\n function totalLocked() external view returns (uint256 totalLocked);\\\\\\\\n\\\\\\\\n function lockedLiquidity(uint256 id)\\\\\\\\n external\\\\\\\\n view\\\\\\\\n returns (\\\\\\\\n LockedLiquidityState state,\\\\\\\\n address strategy,\\\\\\\\n uint128 negativepnl,\\\\\\\\n uint128 positivepnl,\\\\\\\\n uint32 expiration\\\\\\\\n );\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @notice Used for unlocking\\\\\\\\n * liquidity after an expiration\\\\\\\\n * @param lockedLiquidityID The option contract ID\\\\\\\\n **/\\\\\\\\n function unlock(uint256 lockedLiquidityID) external;\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x493becfa3e1b0793ab65bff1ebb45554fd52ba35ddd2a0ffb32c4906b7cd8527\\\\",\\\\"license\\\\":\\\\"GPL-3.0-or-later\\\\"},\\\\"contracts/Strategies/HegicStrategy.sol\\\\":{\\\\"content\\\\":\\\\"pragma solidity 0.8.6;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * SPDX-License-Identifier: GPL-3.0-or-later\\\\\\\\n * Hegic\\\\\\\\n * Copyright (C) 2022 Hegic Protocol\\\\\\\\n *\\\\\\\\n * This program is free software: you can redistribute it and/or modify\\\\\\\\n * it under the terms of the GNU General Public License as published by\\\\\\\\n * the Free Software Foundation, either version 3 of the License, or\\\\\\\\n * (at your option) any later version.\\\\\\\\n *\\\\\\\\n * This program is distributed in the hope that it will be useful,\\\\\\\\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\\\\\\\\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\\\\\\\\n * GNU General Public License for more details.\\\\\\\\n *\\\\\\\\n * You should have received a copy of the GNU General Public License\\\\\\\\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\\\\\\\\n **/\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"@chainlink/contracts/src/v0.7/interfaces/AggregatorV3Interface.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"@openzeppelin/contracts/security/ReentrancyGuard.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"@openzeppelin/contracts/access/AccessControl.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"../Interfaces/Interfaces.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"../Pool/IHegicOperationalTreasury.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"./IHegicStrategy.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\nabstract contract HegicStrategy is\\\\\\\\n AccessControl,\\\\\\\\n IHegicStrategy,\\\\\\\\n ReentrancyGuard\\\\\\\\n{\\\\\\\\n using SafeERC20 for IERC20;\\\\\\\\n\\\\\\\\n IHegicOperationalTreasury public immutable pool;\\\\\\\\n AggregatorV3Interface public immutable priceProvider;\\\\\\\\n uint8 public collateralizationRatio;\\\\\\\\n uint256 public override lockedLimit;\\\\\\\\n IPremiumCalculator public pricer;\\\\\\\\n uint256 internal immutable spotDecimals; // 1e18\\\\\\\\n\\\\\\\\n uint256 private constant K_DECIMALS = 100;\\\\\\\\n uint256 public k = 100;\\\\\\\\n\\\\\\\\n struct StrategyData {\\\\\\\\n uint128 amount;\\\\\\\\n uint128 strike;\\\\\\\\n }\\\\\\\\n mapping(uint256 => StrategyData) public strategyData;\\\\\\\\n\\\\\\\\n constructor(\\\\\\\\n IHegicOperationalTreasury _pool,\\\\\\\\n AggregatorV3Interface _priceProvider,\\\\\\\\n IPremiumCalculator _pricer,\\\\\\\\n uint8 _collateralizationRatio,\\\\\\\\n uint256 limit,\\\\\\\\n uint8 _spotDecimals\\\\\\\\n ) {\\\\\\\\n _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);\\\\\\\\n pricer = _pricer;\\\\\\\\n pool = _pool;\\\\\\\\n priceProvider = _priceProvider;\\\\\\\\n collateralizationRatio = _collateralizationRatio;\\\\\\\\n lockedLimit = limit;\\\\\\\\n spotDecimals = 10**_spotDecimals;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @notice Used for buying options/strategies\\\\\\\\n * @param holder The holder address\\\\\\\\n * @param period The option/strategy period\\\\\\\\n * @param amount The option/strategy amount\\\\\\\\n * @param strike The option/strategy strike\\\\\\\\n **/\\\\\\\\n function buy(\\\\\\\\n address holder,\\\\\\\\n uint32 period,\\\\\\\\n uint128 amount,\\\\\\\\n uint256 strike\\\\\\\\n ) external virtual nonReentrant returns (uint256 id) {\\\\\\\\n if (strike == 0) strike = _currentPrice();\\\\\\\\n (uint128 negativepnlAmount, uint256 positivepnl) =\\\\\\\\n _calculateNegativepnlAndPositivepnl(period, amount, strike);\\\\\\\\n\\\\\\\\n require(\\\\\\\\n pool.lockedByStrategy(address(this)) + negativepnlAmount <=\\\\\\\\n lockedLimit,\\\\\\\\n \\\\\\\\\\\\"HegicStrategy: The limit is exceeded\\\\\\\\\\\\"\\\\\\\\n );\\\\\\\\n\\\\\\\\n pool.token().safeTransferFrom(msg.sender, address(pool), positivepnl);\\\\\\\\n\\\\\\\\n uint32 expiration = uint32(block.timestamp + period);\\\\\\\\n id = pool.lockLiquidityFor(holder, negativepnlAmount, expiration);\\\\\\\\n strategyData[id] = StrategyData(uint128(amount), uint128(strike));\\\\\\\\n emit Acquired(id, amount, positivepnl, strike, expiration);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @notice Used for exercising an in-the-money\\\\\\\\n * option/strategy and taking profits\\\\\\\\n * @param optionID The option/strategy ID\\\\\\\\n **/\\\\\\\\n function exercise(uint256 optionID) external {\\\\\\\\n _checkPayOff(optionID);\\\\\\\\n uint256 payOffAmount = _payOffAmount(optionID);\\\\\\\\n pool.payOff(optionID, payOffAmount, pool.manager().ownerOf(optionID));\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @notice Used for calculating the holder\\\'s\\\\\\\\n * option/strategy unrealized profits\\\\\\\\n * @param optionID The option/strategy ID\\\\\\\\n * @param amount The unrealized profits amount\\\\\\\\n **/\\\\\\\\n function profitOf(uint256 optionID) external view returns (uint256 amount) {\\\\\\\\n return _payOffAmount(optionID);\\\\\\\\n }\\\\\\\\n\\\\\\\\n function calculatePremium(\\\\\\\\n uint32 period,\\\\\\\\n uint128 amount,\\\\\\\\n uint256 strike\\\\\\\\n ) external view returns (uint256 premium, uint256 available) {\\\\\\\\n if (strike == 0) strike = _currentPrice();\\\\\\\\n (, premium) = _calculateNegativepnlAndPositivepnl(\\\\\\\\n period,\\\\\\\\n amount,\\\\\\\\n strike\\\\\\\\n );\\\\\\\\n available = _getAvailableContracts(period, strike);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @notice Used for viewing the total liquidity\\\\\\\\n * locked up for a specific options strategy\\\\\\\\n **/\\\\\\\\n function getLockedByStrategy()\\\\\\\\n external\\\\\\\\n view\\\\\\\\n override\\\\\\\\n returns (uint256 amount)\\\\\\\\n {\\\\\\\\n return pool.lockedByStrategy(address(this));\\\\\\\\n }\\\\\\\\n\\\\\\\\n function setPricer(IPremiumCalculator value)\\\\\\\\n external\\\\\\\\n onlyRole(DEFAULT_ADMIN_ROLE)\\\\\\\\n {\\\\\\\\n pricer = value;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @notice Used for setting a limit\\\\\\\\n * on the total locked liquidity\\\\\\\\n * @param value The maximum locked liquidity\\\\\\\\n **/\\\\\\\\n function setLimit(uint256 value) external onlyRole(DEFAULT_ADMIN_ROLE) {\\\\\\\\n lockedLimit = value;\\\\\\\\n emit SetLimit(value);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @notice Used for setting the collateralization coefficient\\\\\\\\n * @param value The collateralization coefficient\\\\\\\\n **/\\\\\\\\n function setK(uint256 value) external onlyRole(DEFAULT_ADMIN_ROLE) {\\\\\\\\n k = value;\\\\\\\\n }\\\\\\\\n\\\\\\\\n function _getAvailableContracts(uint32 period, uint256 strike)\\\\\\\\n internal\\\\\\\\n view\\\\\\\\n returns (uint256 available)\\\\\\\\n {\\\\\\\\n uint256 totalAvailableBalance =\\\\\\\\n pool.getStakeAndCoverBalance() +\\\\\\\\n pool.totalBalance() -\\\\\\\\n pool.totalLocked() -\\\\\\\\n pool.lockedPremium();\\\\\\\\n uint256 availableBalance =\\\\\\\\n lockedLimit - pool.lockedByStrategy(address(this));\\\\\\\\n if (strike == 0) strike = _currentPrice();\\\\\\\\n (uint256 lockedAmount, ) =\\\\\\\\n _calculateNegativepnlAndPositivepnl(\\\\\\\\n period,\\\\\\\\n uint128(spotDecimals),\\\\\\\\n strike\\\\\\\\n );\\\\\\\\n if (availableBalance > totalAvailableBalance) {\\\\\\\\n return (totalAvailableBalance * spotDecimals) / lockedAmount;\\\\\\\\n }\\\\\\\\n return (availableBalance * spotDecimals) / lockedAmount;\\\\\\\\n }\\\\\\\\n\\\\\\\\n function _checkPayOff(uint256 optionID)\\\\\\\\n internal\\\\\\\\n view\\\\\\\\n virtual\\\\\\\\n returns (uint256 payOffAmount)\\\\\\\\n {\\\\\\\\n uint256 amount = _payOffAmount(optionID);\\\\\\\\n require(\\\\\\\\n pool.manager().isApprovedOrOwner(msg.sender, optionID),\\\\\\\\n \\\\\\\\\\\\"HegicStrategy: Msg.sender can\\\'t exercise this option\\\\\\\\\\\\"\\\\\\\\n );\\\\\\\\n require(amount > 0, \\\\\\\\\\\\"HegicStrategy: The profit is zero\\\\\\\\\\\\");\\\\\\\\n }\\\\\\\\n\\\\\\\\n function _calculateCollateral(\\\\\\\\n uint32 period,\\\\\\\\n uint128 amount,\\\\\\\\n uint256 strike\\\\\\\\n ) internal view virtual returns (uint128 lockedAmount) {\\\\\\\\n return\\\\\\\\n uint128(\\\\\\\\n (pricer.calculatePremium(\\\\\\\\n uint32(period),\\\\\\\\n uint128(amount),\\\\\\\\n strike\\\\\\\\n ) * k) / K_DECIMALS\\\\\\\\n );\\\\\\\\n }\\\\\\\\n\\\\\\\\n function _calculateStrategyPremium(\\\\\\\\n uint32 period,\\\\\\\\n uint128 amount,\\\\\\\\n uint256 strike\\\\\\\\n ) internal view returns (uint128 premium) {\\\\\\\\n if (strike == 0) strike = _currentPrice();\\\\\\\\n premium = uint128(pricer.calculatePremium(period, amount, strike));\\\\\\\\n }\\\\\\\\n\\\\\\\\n function _calculateNegativepnlAndPositivepnl(\\\\\\\\n uint32 period,\\\\\\\\n uint128 amount,\\\\\\\\n uint256 strike\\\\\\\\n ) internal view virtual returns (uint128 negativepnl, uint128 positivepnl) {\\\\\\\\n negativepnl = _calculateCollateral(period, amount, strike);\\\\\\\\n positivepnl = _calculateStrategyPremium(period, amount, strike);\\\\\\\\n }\\\\\\\\n\\\\\\\\n function _calculateStrategyPayOff(uint256 optionID)\\\\\\\\n internal\\\\\\\\n view\\\\\\\\n virtual\\\\\\\\n returns (uint256 profit);\\\\\\\\n\\\\\\\\n function _payOffAmount(uint256 optionID)\\\\\\\\n internal\\\\\\\\n view\\\\\\\\n virtual\\\\\\\\n returns (uint256 profit)\\\\\\\\n {\\\\\\\\n return _calculateStrategyPayOff(optionID);\\\\\\\\n }\\\\\\\\n\\\\\\\\n function _currentPrice() internal view returns (uint256 price) {\\\\\\\\n (, int256 latestPrice, , , ) = priceProvider.latestRoundData();\\\\\\\\n price = uint256(latestPrice);\\\\\\\\n }\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x87d8bfb7413247eeaa1f54dfa6ab13391bb034520d463544da524550af18d3c3\\\\",\\\\"license\\\\":\\\\"GPL-3.0-or-later\\\\"},\\\\"contracts/Strategies/HegicStrategySpreadPut.sol\\\\":{\\\\"content\\\\":\\\\"pragma solidity 0.8.6;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * SPDX-License-Identifier: GPL-3.0-or-later\\\\\\\\n * Hegic\\\\\\\\n * Copyright (C) 2022 Hegic Protocol\\\\\\\\n *\\\\\\\\n * This program is free software: you can redistribute it and/or modify\\\\\\\\n * it under the terms of the GNU General Public License as published by\\\\\\\\n * the Free Software Foundation, either version 3 of the License, or\\\\\\\\n * (at your option) any later version.\\\\\\\\n *\\\\\\\\n * This program is distributed in the hope that it will be useful,\\\\\\\\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\\\\\\\\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\\\\\\\\n * GNU General Public License for more details.\\\\\\\\n *\\\\\\\\n * You should have received a copy of the GNU General Public License\\\\\\\\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\\\\\\\\n **/\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"./HegicStrategy.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"../Interfaces/Interfaces.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"../utils/Math.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\ncontract HegicStrategySpreadPut is HegicStrategy {\\\\\\\\n using SafeERC20 for IERC20;\\\\\\\\n using HegicMath for uint256;\\\\\\\\n // uint256 private immutable spotDecimals; // 1e18\\\\\\\\n uint256 private constant TOKEN_DECIMALS = 1e6; // 1e6\\\\\\\\n uint8 internal roundedDecimals;\\\\\\\\n uint256 public strikePercentage;\\\\\\\\n\\\\\\\\n constructor(\\\\\\\\n IHegicOperationalTreasury _pool,\\\\\\\\n AggregatorV3Interface _priceProvider,\\\\\\\\n IPremiumCalculator _pricer,\\\\\\\\n uint8 _spotDecimals,\\\\\\\\n uint256 limit,\\\\\\\\n uint256 percentage,\\\\\\\\n uint8 _roundedDecimals\\\\\\\\n ) HegicStrategy(_pool, _priceProvider, _pricer, 10, limit, _spotDecimals) {\\\\\\\\n strikePercentage = percentage;\\\\\\\\n roundedDecimals = _roundedDecimals;\\\\\\\\n }\\\\\\\\n\\\\\\\\n function _calculateStrategyPayOff(uint256 optionID)\\\\\\\\n internal\\\\\\\\n view\\\\\\\\n override\\\\\\\\n returns (uint256 amount)\\\\\\\\n {\\\\\\\\n StrategyData memory data = strategyData[optionID];\\\\\\\\n uint256 currentPrice = _currentPrice();\\\\\\\\n uint256 otmStrike =\\\\\\\\n ((data.strike * strikePercentage) / 100).round(roundedDecimals);\\\\\\\\n uint256 priceDecimals = 10**priceProvider.decimals();\\\\\\\\n if (currentPrice < data.strike && currentPrice > otmStrike) {\\\\\\\\n return\\\\\\\\n ((data.strike - currentPrice) * data.amount * TOKEN_DECIMALS) /\\\\\\\\n spotDecimals /\\\\\\\\n priceDecimals;\\\\\\\\n } else if (currentPrice < data.strike && currentPrice < otmStrike) {\\\\\\\\n return\\\\\\\\n ((data.strike - otmStrike) * data.amount * TOKEN_DECIMALS) /\\\\\\\\n spotDecimals /\\\\\\\\n priceDecimals;\\\\\\\\n }\\\\\\\\n return 0;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @notice Used for buying options/strategies\\\\\\\\n * @param holder The holder address\\\\\\\\n * @param period The option/strategy period\\\\\\\\n * @param amount The option/strategy amount\\\\\\\\n * @param strike The option/strategy strike\\\\\\\\n **/\\\\\\\\n function buy(\\\\\\\\n address holder,\\\\\\\\n uint32 period,\\\\\\\\n uint128 amount,\\\\\\\\n uint256 strike\\\\\\\\n ) external override nonReentrant returns (uint256 id) {\\\\\\\\n if (strike == 0) strike = _currentPrice();\\\\\\\\n uint256 premium = _calculateStrategyPremium(period, amount, strike);\\\\\\\\n uint128 lockedAmount = _calculateCollateral(period, amount, strike);\\\\\\\\n uint256 otmStrike =\\\\\\\\n ((strike * strikePercentage) / 100).round(roundedDecimals);\\\\\\\\n\\\\\\\\n require(\\\\\\\\n pool.lockedByStrategy(address(this)) + lockedAmount <= lockedLimit,\\\\\\\\n \\\\\\\\\\\\"HegicStrategy: The limit is exceeded\\\\\\\\\\\\"\\\\\\\\n );\\\\\\\\n\\\\\\\\n pool.token().safeTransferFrom(msg.sender, address(pool), premium);\\\\\\\\n\\\\\\\\n uint32 expiration = uint32(block.timestamp + period);\\\\\\\\n id = pool.lockLiquidityFor(holder, lockedAmount, expiration);\\\\\\\\n strategyData[id] = StrategyData(uint128(amount), uint128(strike));\\\\\\\\n emit AcquiredSpread(id, amount, premium, strike, otmStrike, expiration);\\\\\\\\n }\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0xf35513246afac06ae9132cbacda0d4ce9f9b7b471a86fbffac4efc7e5f26c0a1\\\\",\\\\"license\\\\":\\\\"GPL-3.0-or-later\\\\"},\\\\"contracts/Strategies/IHegicStrategy.sol\\\\":{\\\\"content\\\\":\\\\"pragma solidity 0.8.6;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * SPDX-License-Identifier: GPL-3.0-or-later\\\\\\\\n * Hegic\\\\\\\\n * Copyright (C) 2022 Hegic Protocol\\\\\\\\n *\\\\\\\\n * This program is free software: you can redistribute it and/or modify\\\\\\\\n * it under the terms of the GNU General Public License as published by\\\\\\\\n * the Free Software Foundation, either version 3 of the License, or\\\\\\\\n * (at your option) any later version.\\\\\\\\n *\\\\\\\\n * This program is distributed in the hope that it will be useful,\\\\\\\\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\\\\\\\\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\\\\\\\\n * GNU General Public License for more details.\\\\\\\\n *\\\\\\\\n * You should have received a copy of the GNU General Public License\\\\\\\\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\\\\\\\\n **/\\\\\\\\n\\\\\\\\ninterface IHegicStrategy {\\\\\\\\n event Acquired(\\\\\\\\n uint256 indexed id,\\\\\\\\n uint256 amount,\\\\\\\\n uint256 premium,\\\\\\\\n uint256 strike,\\\\\\\\n uint32 expiration\\\\\\\\n );\\\\\\\\n\\\\\\\\n event AcquiredStrangle(\\\\\\\\n uint256 indexed id,\\\\\\\\n uint256 amount,\\\\\\\\n uint256 premium,\\\\\\\\n uint256 callStrike,\\\\\\\\n uint256 putStrike,\\\\\\\\n uint32 expiration\\\\\\\\n );\\\\\\\\n\\\\\\\\n event AcquiredSpread(\\\\\\\\n uint256 indexed id,\\\\\\\\n uint256 amount,\\\\\\\\n uint256 premium,\\\\\\\\n uint256 atmStrike,\\\\\\\\n uint256 otmStrike,\\\\\\\\n uint32 expiration\\\\\\\\n );\\\\\\\\n\\\\\\\\n event SetLimit(uint256 limit);\\\\\\\\n\\\\\\\\n function getLockedByStrategy() external view returns (uint256 amount);\\\\\\\\n\\\\\\\\n function lockedLimit() external view returns (uint256 lockedLimit);\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x6cc1a6057f3eb6573548f4c6bae9307b3f943c338f448259a1723af150d0e572\\\\",\\\\"license\\\\":\\\\"GPL-3.0-or-later\\\\"},\\\\"contracts/utils/Math.sol\\\\":{\\\\"content\\\\":\\\\"pragma solidity 0.8.6;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * SPDX-License-Identifier: GPL-3.0-or-later\\\\\\\\n * Hegic\\\\\\\\n * Copyright (C) 2021 Hegic Protocol\\\\\\\\n *\\\\\\\\n * This program is free software: you can redistribute it and/or modify\\\\\\\\n * it under the terms of the GNU General Public License as published by\\\\\\\\n * the Free Software Foundation, either version 3 of the License, or\\\\\\\\n * (at your option) any later version.\\\\\\\\n *\\\\\\\\n * This program is distributed in the hope that it will be useful,\\\\\\\\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\\\\\\\\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\\\\\\\\n * GNU General Public License for more details.\\\\\\\\n *\\\\\\\\n * You should have received a copy of the GNU General Public License\\\\\\\\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\\\\\\\\n **/\\\\\\\\n\\\\\\\\nlibrary HegicMath {\\\\\\\\n /**\\\\\\\\n * @dev Calculates a square root of the number.\\\\\\\\n * Responds with an \\\\\\\\\\\\"invalid opcode\\\\\\\\\\\\" at uint(-1).\\\\\\\\n **/\\\\\\\\n function sqrt(uint256 x) internal pure returns (uint256 result) {\\\\\\\\n result = x;\\\\\\\\n uint256 k = (x >> 1) + 1;\\\\\\\\n while (k < result) (result, k) = (k, (x / k + k) >> 1);\\\\\\\\n }\\\\\\\\n\\\\\\\\n function round(uint256 value, uint8 decimals)\\\\\\\\n internal\\\\\\\\n pure\\\\\\\\n returns (uint256 roundedValue)\\\\\\\\n {\\\\\\\\n if (decimals == 0) return value;\\\\\\\\n uint256 a = value / 10**(decimals - 1);\\\\\\\\n if (a % 10 < 5) return (a / 10) * 10**decimals;\\\\\\\\n return (a / 10 + 1) * 10**decimals;\\\\\\\\n }\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x7b9d92cf2b4fb2c7f1285d5139288114469839e539f2a7cc39ef1329278f08ab\\\\",\\\\"license\\\\":\\\\"GPL-3.0-or-later\\\\"}},\\\\"version\\\\":1}","bytecode":"0x60e060405260646005553480156200001657600080fd5b506040516200258b3803806200258b8339810160408190526200003991620001b2565b60018055868686600a868862000051600033620000d8565b600480546001600160a01b0319166001600160a01b038616179055606086811b6001600160601b03199081166080529086901b1660a0526002805460ff191660ff85161790556003829055620000a981600a62000286565b60c05250505060089490945550506007805460ff191660ff929092169190911790555062000381945050505050565b620000e48282620000e8565b5050565b620000f4828262000170565b620000e4576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556200012c3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff165b92915050565b805160ff81168114620001ad57600080fd5b919050565b600080600080600080600060e0888a031215620001ce57600080fd5b8751620001db8162000368565b6020890151909750620001ee8162000368565b6040890151909650620002018162000368565b945062000211606089016200019b565b93506080880151925060a088015191506200022f60c089016200019b565b905092959891949750929550565b600181815b808511156200027e57816000190482111562000262576200026262000352565b808516156200027057918102915b93841c939080029062000242565b509250929050565b60006200029760ff8416836200029e565b9392505050565b600082620002af5750600162000195565b81620002be5750600062000195565b8160018114620002d75760028114620002e25762000302565b600191505062000195565b60ff841115620002f657620002f662000352565b50506001821b62000195565b5060208310610133831016604e8410600b841016171562000327575081810a62000195565b6200033383836200023d565b80600019048211156200034a576200034a62000352565b029392505050565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b03811681146200037e57600080fd5b50565b60805160601c60a05160601c60c05161214f6200043c60003960008181610ffe0152818161103d0152818161107c0152818161192f01526119ba0152600081816102de01528181610c2001526118700152600081816101be015281816105a4015281816105d50152818161076401528181610900015281816109e401528181610a0601528181610af501528181610cda01528181610d6b01528181610dfc01528181610e8d01528181610f5d015261121d015261214f6000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c806391d14854116100c3578063d03d4aee1161007c578063d03d4aee14610300578063d3d5c12114610308578063d547741f14610311578063d6c8d1b414610324578063da3c1a7614610378578063dcaf9c441461038b57600080fd5b806391d148541461028f578063a217fddf146102a2578063a6138ed9146102aa578063b07f0a41146102bd578063b4f40c61146102d0578063b888879e146102d957600080fd5b806327ea6f2b1161011557806327ea6f2b1461021b57806329390370146102305780632f2ff15d1461024357806336568abe1461025657806367de8be9146102695780637632bffb1461027c57600080fd5b806301ffc9a71461015257806302d7b5361461017a57806310ca5c0f146101a257806316f0115b146101b9578063248a9ca3146101f8575b600080fd5b610165610160366004611d0c565b6103aa565b60405190151581526020015b60405180910390f35b61018d610188366004611d6c565b6103e1565b60408051928352602083019190915201610171565b6101ab60085481565b604051908152602001610171565b6101e07f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610171565b6101ab610206366004611cc3565b60009081526020819052604090206001015490565b61022e610229366004611cc3565b610420565b005b61022e61023e366004611d36565b610468565b61022e610251366004611cdc565b610497565b61022e610264366004611cdc565b6104c2565b61022e610277366004611cc3565b610545565b6101ab61028a366004611cc3565b610557565b61016561029d366004611cdc565b610562565b6101ab600081565b6004546101e0906001600160a01b031681565b61022e6102cb366004611cc3565b61058b565b6101ab60055481565b6101e07f000000000000000000000000000000000000000000000000000000000000000081565b6101ab61074c565b6101ab60035481565b61022e61031f366004611cdc565b6107eb565b610358610332366004611cc3565b6006602052600090815260409020546001600160801b0380821691600160801b90041682565b604080516001600160801b03938416815292909116602083015201610171565b6101ab610386366004611c54565b610811565b6002546103989060ff1681565b60405160ff9091168152602001610171565b60006001600160e01b03198216637965db0b60e01b14806103db57506301ffc9a760e01b6001600160e01b03198316145b92915050565b600080826103f4576103f1610c1b565b92505b6103ff858585610cba565b6001600160801b0316925061041690508584610cd5565b9050935093915050565b600061042c81336110b5565b60038290556040518281527f479881bf41e329f328c21c2cbb11514b05a021cd33ea4e5a576ea6bc03874fd69060200160405180910390a15050565b600061047481336110b5565b50600480546001600160a01b0319166001600160a01b0392909216919091179055565b6000828152602081905260409020600101546104b381336110b5565b6104bd8383611119565b505050565b6001600160a01b03811633146105375760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b610541828261119d565b5050565b600061055181336110b5565b50600555565b60006103db82611202565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6105948161120d565b5060006105a082611202565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638127f0a183837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663481c6a756040518163ffffffff1660e01b815260040160206040518083038186803b15801561062c57600080fd5b505afa158015610640573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106649190611c37565b6001600160a01b0316636352211e876040518263ffffffff1660e01b815260040161069191815260200190565b60206040518083038186803b1580156106a957600080fd5b505afa1580156106bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e19190611c37565b6040516001600160e01b031960e086901b168152600481019390935260248301919091526001600160a01b03166044820152606401600060405180830381600087803b15801561073057600080fd5b505af1158015610744573d6000803e3d6000fd5b505050505050565b604051634485558360e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063448555839060240160206040518083038186803b1580156107ae57600080fd5b505afa1580156107c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e69190611d53565b905090565b60008281526020819052604090206001015461080781336110b5565b6104bd838361119d565b6000600260015414156108665760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161052e565b60026001558161087b57610878610c1b565b91505b60006108888585856113f5565b6001600160801b0316905060006108a08686866114a7565b6007546008549192506000916108d19160ff16906064906108c19089611ff9565b6108cb9190611ef7565b90611564565b600354604051634485558360e01b8152306004820152919250906001600160801b038416906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063448555839060240160206040518083038186803b15801561094257600080fd5b505afa158015610956573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097a9190611d53565b6109849190611edf565b11156109de5760405162461bcd60e51b8152602060048201526024808201527f486567696353747261746567793a20546865206c696d697420697320657863656044820152631959195960e21b606482015260840161052e565b610aa6337f0000000000000000000000000000000000000000000000000000000000000000857f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610a5d57600080fd5b505afa158015610a71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a959190611c37565b6001600160a01b03169291906115ff565b6000610ab863ffffffff891642611edf565b60405163d6a6367760e01b81526001600160a01b038b811660048301526001600160801b038616602483015263ffffffff831660448301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d6a6367790606401602060405180830381600087803b158015610b3b57600080fd5b505af1158015610b4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b739190611d53565b6040805180820182526001600160801b038a81168083528a82166020808501918252600087815260068252869020945191518416600160801b029190931617909255825191825281018790529081018890526060810184905263ffffffff8316608082015290955085907ff5651c3e067cd659a7ed5d7301e821e52fa3eb7e1618b8bf63ab265f5844c5a29060a00160405180910390a2505060018055509095945050505050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b158015610c7757600080fd5b505afa158015610c8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610caf9190611da8565b509195945050505050565b600080610cc88585856114a7565b91506104168585856113f5565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663797be55e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d3157600080fd5b505afa158015610d45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d699190611d53565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663568914126040518163ffffffff1660e01b815260040160206040518083038186803b158015610dc257600080fd5b505afa158015610dd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfa9190611d53565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad7a672f6040518163ffffffff1660e01b815260040160206040518083038186803b158015610e5357600080fd5b505afa158015610e67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8b9190611d53565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166346067d696040518163ffffffff1660e01b815260040160206040518083038186803b158015610ee457600080fd5b505afa158015610ef8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1c9190611d53565b610f269190611edf565b610f309190612018565b610f3a9190612018565b604051634485558360e01b81523060048201529091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063448555839060240160206040518083038186803b158015610f9f57600080fd5b505afa158015610fb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd79190611d53565b600354610fe49190612018565b905083610ff657610ff3610c1b565b93505b6000611023867f000000000000000000000000000000000000000000000000000000000000000087610cba565b506001600160801b031690508282111561107657806110627f000000000000000000000000000000000000000000000000000000000000000085611ff9565b61106c9190611ef7565b93505050506103db565b806110a17f000000000000000000000000000000000000000000000000000000000000000084611ff9565b6110ab9190611ef7565b9695505050505050565b6110bf8282610562565b610541576110d7816001600160a01b0316601461165f565b6110e283602061165f565b6040516020016110f3929190611e37565b60408051601f198184030181529082905262461bcd60e51b825261052e91600401611eac565b6111238282610562565b610541576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556111593390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6111a78282610562565b15610541576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60006103db826117fb565b60008061121983611202565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663481c6a756040518163ffffffff1660e01b815260040160206040518083038186803b15801561127457600080fd5b505afa158015611288573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ac9190611c37565b60405163430c208160e01b8152336004820152602481018590526001600160a01b03919091169063430c20819060440160206040518083038186803b1580156112f457600080fd5b505afa158015611308573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132c9190611ca1565b6113955760405162461bcd60e51b815260206004820152603460248201527f486567696353747261746567793a204d73672e73656e6465722063616e27742060448201527332bc32b931b4b9b2903a3434b99037b83a34b7b760611b606482015260840161052e565b600081116113ef5760405162461bcd60e51b815260206004820152602160248201527f486567696353747261746567793a205468652070726f666974206973207a65726044820152606f60f81b606482015260840161052e565b50919050565b60008161140757611404610c1b565b91505b6004805460405163055bc75d60e21b815263ffffffff8716928101929092526001600160801b0385166024830152604482018490526001600160a01b03169063156f1d749060640160206040518083038186803b15801561146757600080fd5b505afa15801561147b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149f9190611d53565b949350505050565b6005546004805460405163055bc75d60e21b815263ffffffff8716928101929092526001600160801b03851660248301526044820184905260009260649290916001600160a01b03169063156f1d7490840160206040518083038186803b15801561151157600080fd5b505afa158015611525573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115499190611d53565b6115539190611ff9565b61149f9190611ef7565b9392505050565b600060ff82166115755750816103db565b600061158260018461202f565b61158d90600a611f4e565b6115979085611ef7565b905060056115a6600a83612095565b10156115d4576115b783600a611f4e565b6115c2600a83611ef7565b6115cc9190611ff9565b9150506103db565b6115df83600a611f4e565b6115ea600a83611ef7565b6115f5906001611edf565b61149f9190611ff9565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611659908590611a10565b50505050565b6060600061166e836002611ff9565b611679906002611edf565b67ffffffffffffffff811115611691576116916120eb565b6040519080825280601f01601f1916602001820160405280156116bb576020820181803683370190505b509050600360fc1b816000815181106116d6576116d66120d5565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611705576117056120d5565b60200101906001600160f81b031916908160001a9053506000611729846002611ff9565b611734906001611edf565b90505b60018111156117ac576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611768576117686120d5565b1a60f81b82828151811061177e5761177e6120d5565b60200101906001600160f81b031916908160001a90535060049490941c936117a58161207e565b9050611737565b50831561155d5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161052e565b60008181526006602090815260408083208151808301909252546001600160801b038082168352600160801b90910416918101919091528161183b610c1b565b600754600854602085015192935060009261186a9260ff16916064916108c191906001600160801b0316611ff9565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156118c757600080fd5b505afa1580156118db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ff9190611df8565b61190a90600a611f4e565b905083602001516001600160801b03168310801561192757508183115b1561199757807f0000000000000000000000000000000000000000000000000000000000000000620f424086600001516001600160801b03168688602001516001600160801b03166119799190612018565b6119839190611ff9565b61198d9190611ff9565b6110a19190611ef7565b83602001516001600160801b0316831080156119b257508183105b15611a0457807f0000000000000000000000000000000000000000000000000000000000000000620f424086600001516001600160801b03168588602001516001600160801b03166119799190612018565b50600095945050505050565b6000611a65826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ae29092919063ffffffff16565b8051909150156104bd5780806020019051810190611a839190611ca1565b6104bd5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161052e565b606061149f848460008585843b611b3b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161052e565b600080866001600160a01b03168587604051611b579190611e1b565b60006040518083038185875af1925050503d8060008114611b94576040519150601f19603f3d011682016040523d82523d6000602084013e611b99565b606091505b5091509150611ba9828286611bb4565b979650505050505050565b60608315611bc357508161155d565b825115611bd35782518084602001fd5b8160405162461bcd60e51b815260040161052e9190611eac565b80356001600160801b0381168114611c0457600080fd5b919050565b803563ffffffff81168114611c0457600080fd5b805169ffffffffffffffffffff81168114611c0457600080fd5b600060208284031215611c4957600080fd5b815161155d81612101565b60008060008060808587031215611c6a57600080fd5b8435611c7581612101565b9350611c8360208601611c09565b9250611c9160408601611bed565b9396929550929360600135925050565b600060208284031215611cb357600080fd5b8151801515811461155d57600080fd5b600060208284031215611cd557600080fd5b5035919050565b60008060408385031215611cef57600080fd5b823591506020830135611d0181612101565b809150509250929050565b600060208284031215611d1e57600080fd5b81356001600160e01b03198116811461155d57600080fd5b600060208284031215611d4857600080fd5b813561155d81612101565b600060208284031215611d6557600080fd5b5051919050565b600080600060608486031215611d8157600080fd5b611d8a84611c09565b9250611d9860208501611bed565b9150604084013590509250925092565b600080600080600060a08688031215611dc057600080fd5b611dc986611c1d565b9450602086015193506040860151925060608601519150611dec60808701611c1d565b90509295509295909350565b600060208284031215611e0a57600080fd5b815160ff8116811461155d57600080fd5b60008251611e2d818460208701612052565b9190910192915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611e6f816017850160208801612052565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611ea0816028840160208801612052565b01602801949350505050565b6020815260008251806020840152611ecb816040850160208701612052565b601f01601f19169190910160400192915050565b60008219821115611ef257611ef26120a9565b500190565b600082611f0657611f066120bf565b500490565b600181815b80851115611f46578160001904821115611f2c57611f2c6120a9565b80851615611f3957918102915b93841c9390800290611f10565b509250929050565b600061155d60ff841683600082611f67575060016103db565b81611f74575060006103db565b8160018114611f8a5760028114611f9457611fb0565b60019150506103db565b60ff841115611fa557611fa56120a9565b50506001821b6103db565b5060208310610133831016604e8410600b8410161715611fd3575081810a6103db565b611fdd8383611f0b565b8060001904821115611ff157611ff16120a9565b029392505050565b6000816000190483118215151615612013576120136120a9565b500290565b60008282101561202a5761202a6120a9565b500390565b600060ff821660ff841680821015612049576120496120a9565b90039392505050565b60005b8381101561206d578181015183820152602001612055565b838111156116595750506000910152565b60008161208d5761208d6120a9565b506000190190565b6000826120a4576120a46120bf565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461211657600080fd5b5056fea2646970667358221220e8bf12d73f10acff5e70bb4c70216d29db16440516098eb6fb89bd474f1e0f2064736f6c63430008060033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061014d5760003560e01c806391d14854116100c3578063d03d4aee1161007c578063d03d4aee14610300578063d3d5c12114610308578063d547741f14610311578063d6c8d1b414610324578063da3c1a7614610378578063dcaf9c441461038b57600080fd5b806391d148541461028f578063a217fddf146102a2578063a6138ed9146102aa578063b07f0a41146102bd578063b4f40c61146102d0578063b888879e146102d957600080fd5b806327ea6f2b1161011557806327ea6f2b1461021b57806329390370146102305780632f2ff15d1461024357806336568abe1461025657806367de8be9146102695780637632bffb1461027c57600080fd5b806301ffc9a71461015257806302d7b5361461017a57806310ca5c0f146101a257806316f0115b146101b9578063248a9ca3146101f8575b600080fd5b610165610160366004611d0c565b6103aa565b60405190151581526020015b60405180910390f35b61018d610188366004611d6c565b6103e1565b60408051928352602083019190915201610171565b6101ab60085481565b604051908152602001610171565b6101e07f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610171565b6101ab610206366004611cc3565b60009081526020819052604090206001015490565b61022e610229366004611cc3565b610420565b005b61022e61023e366004611d36565b610468565b61022e610251366004611cdc565b610497565b61022e610264366004611cdc565b6104c2565b61022e610277366004611cc3565b610545565b6101ab61028a366004611cc3565b610557565b61016561029d366004611cdc565b610562565b6101ab600081565b6004546101e0906001600160a01b031681565b61022e6102cb366004611cc3565b61058b565b6101ab60055481565b6101e07f000000000000000000000000000000000000000000000000000000000000000081565b6101ab61074c565b6101ab60035481565b61022e61031f366004611cdc565b6107eb565b610358610332366004611cc3565b6006602052600090815260409020546001600160801b0380821691600160801b90041682565b604080516001600160801b03938416815292909116602083015201610171565b6101ab610386366004611c54565b610811565b6002546103989060ff1681565b60405160ff9091168152602001610171565b60006001600160e01b03198216637965db0b60e01b14806103db57506301ffc9a760e01b6001600160e01b03198316145b92915050565b600080826103f4576103f1610c1b565b92505b6103ff858585610cba565b6001600160801b0316925061041690508584610cd5565b9050935093915050565b600061042c81336110b5565b60038290556040518281527f479881bf41e329f328c21c2cbb11514b05a021cd33ea4e5a576ea6bc03874fd69060200160405180910390a15050565b600061047481336110b5565b50600480546001600160a01b0319166001600160a01b0392909216919091179055565b6000828152602081905260409020600101546104b381336110b5565b6104bd8383611119565b505050565b6001600160a01b03811633146105375760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b610541828261119d565b5050565b600061055181336110b5565b50600555565b60006103db82611202565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6105948161120d565b5060006105a082611202565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638127f0a183837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663481c6a756040518163ffffffff1660e01b815260040160206040518083038186803b15801561062c57600080fd5b505afa158015610640573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106649190611c37565b6001600160a01b0316636352211e876040518263ffffffff1660e01b815260040161069191815260200190565b60206040518083038186803b1580156106a957600080fd5b505afa1580156106bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e19190611c37565b6040516001600160e01b031960e086901b168152600481019390935260248301919091526001600160a01b03166044820152606401600060405180830381600087803b15801561073057600080fd5b505af1158015610744573d6000803e3d6000fd5b505050505050565b604051634485558360e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063448555839060240160206040518083038186803b1580156107ae57600080fd5b505afa1580156107c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e69190611d53565b905090565b60008281526020819052604090206001015461080781336110b5565b6104bd838361119d565b6000600260015414156108665760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161052e565b60026001558161087b57610878610c1b565b91505b60006108888585856113f5565b6001600160801b0316905060006108a08686866114a7565b6007546008549192506000916108d19160ff16906064906108c19089611ff9565b6108cb9190611ef7565b90611564565b600354604051634485558360e01b8152306004820152919250906001600160801b038416906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063448555839060240160206040518083038186803b15801561094257600080fd5b505afa158015610956573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097a9190611d53565b6109849190611edf565b11156109de5760405162461bcd60e51b8152602060048201526024808201527f486567696353747261746567793a20546865206c696d697420697320657863656044820152631959195960e21b606482015260840161052e565b610aa6337f0000000000000000000000000000000000000000000000000000000000000000857f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610a5d57600080fd5b505afa158015610a71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a959190611c37565b6001600160a01b03169291906115ff565b6000610ab863ffffffff891642611edf565b60405163d6a6367760e01b81526001600160a01b038b811660048301526001600160801b038616602483015263ffffffff831660448301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d6a6367790606401602060405180830381600087803b158015610b3b57600080fd5b505af1158015610b4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b739190611d53565b6040805180820182526001600160801b038a81168083528a82166020808501918252600087815260068252869020945191518416600160801b029190931617909255825191825281018790529081018890526060810184905263ffffffff8316608082015290955085907ff5651c3e067cd659a7ed5d7301e821e52fa3eb7e1618b8bf63ab265f5844c5a29060a00160405180910390a2505060018055509095945050505050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b158015610c7757600080fd5b505afa158015610c8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610caf9190611da8565b509195945050505050565b600080610cc88585856114a7565b91506104168585856113f5565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663797be55e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d3157600080fd5b505afa158015610d45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d699190611d53565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663568914126040518163ffffffff1660e01b815260040160206040518083038186803b158015610dc257600080fd5b505afa158015610dd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfa9190611d53565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad7a672f6040518163ffffffff1660e01b815260040160206040518083038186803b158015610e5357600080fd5b505afa158015610e67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8b9190611d53565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166346067d696040518163ffffffff1660e01b815260040160206040518083038186803b158015610ee457600080fd5b505afa158015610ef8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1c9190611d53565b610f269190611edf565b610f309190612018565b610f3a9190612018565b604051634485558360e01b81523060048201529091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063448555839060240160206040518083038186803b158015610f9f57600080fd5b505afa158015610fb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd79190611d53565b600354610fe49190612018565b905083610ff657610ff3610c1b565b93505b6000611023867f000000000000000000000000000000000000000000000000000000000000000087610cba565b506001600160801b031690508282111561107657806110627f000000000000000000000000000000000000000000000000000000000000000085611ff9565b61106c9190611ef7565b93505050506103db565b806110a17f000000000000000000000000000000000000000000000000000000000000000084611ff9565b6110ab9190611ef7565b9695505050505050565b6110bf8282610562565b610541576110d7816001600160a01b0316601461165f565b6110e283602061165f565b6040516020016110f3929190611e37565b60408051601f198184030181529082905262461bcd60e51b825261052e91600401611eac565b6111238282610562565b610541576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556111593390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6111a78282610562565b15610541576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60006103db826117fb565b60008061121983611202565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663481c6a756040518163ffffffff1660e01b815260040160206040518083038186803b15801561127457600080fd5b505afa158015611288573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ac9190611c37565b60405163430c208160e01b8152336004820152602481018590526001600160a01b03919091169063430c20819060440160206040518083038186803b1580156112f457600080fd5b505afa158015611308573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132c9190611ca1565b6113955760405162461bcd60e51b815260206004820152603460248201527f486567696353747261746567793a204d73672e73656e6465722063616e27742060448201527332bc32b931b4b9b2903a3434b99037b83a34b7b760611b606482015260840161052e565b600081116113ef5760405162461bcd60e51b815260206004820152602160248201527f486567696353747261746567793a205468652070726f666974206973207a65726044820152606f60f81b606482015260840161052e565b50919050565b60008161140757611404610c1b565b91505b6004805460405163055bc75d60e21b815263ffffffff8716928101929092526001600160801b0385166024830152604482018490526001600160a01b03169063156f1d749060640160206040518083038186803b15801561146757600080fd5b505afa15801561147b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149f9190611d53565b949350505050565b6005546004805460405163055bc75d60e21b815263ffffffff8716928101929092526001600160801b03851660248301526044820184905260009260649290916001600160a01b03169063156f1d7490840160206040518083038186803b15801561151157600080fd5b505afa158015611525573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115499190611d53565b6115539190611ff9565b61149f9190611ef7565b9392505050565b600060ff82166115755750816103db565b600061158260018461202f565b61158d90600a611f4e565b6115979085611ef7565b905060056115a6600a83612095565b10156115d4576115b783600a611f4e565b6115c2600a83611ef7565b6115cc9190611ff9565b9150506103db565b6115df83600a611f4e565b6115ea600a83611ef7565b6115f5906001611edf565b61149f9190611ff9565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611659908590611a10565b50505050565b6060600061166e836002611ff9565b611679906002611edf565b67ffffffffffffffff811115611691576116916120eb565b6040519080825280601f01601f1916602001820160405280156116bb576020820181803683370190505b509050600360fc1b816000815181106116d6576116d66120d5565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611705576117056120d5565b60200101906001600160f81b031916908160001a9053506000611729846002611ff9565b611734906001611edf565b90505b60018111156117ac576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611768576117686120d5565b1a60f81b82828151811061177e5761177e6120d5565b60200101906001600160f81b031916908160001a90535060049490941c936117a58161207e565b9050611737565b50831561155d5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161052e565b60008181526006602090815260408083208151808301909252546001600160801b038082168352600160801b90910416918101919091528161183b610c1b565b600754600854602085015192935060009261186a9260ff16916064916108c191906001600160801b0316611ff9565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156118c757600080fd5b505afa1580156118db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ff9190611df8565b61190a90600a611f4e565b905083602001516001600160801b03168310801561192757508183115b1561199757807f0000000000000000000000000000000000000000000000000000000000000000620f424086600001516001600160801b03168688602001516001600160801b03166119799190612018565b6119839190611ff9565b61198d9190611ff9565b6110a19190611ef7565b83602001516001600160801b0316831080156119b257508183105b15611a0457807f0000000000000000000000000000000000000000000000000000000000000000620f424086600001516001600160801b03168588602001516001600160801b03166119799190612018565b50600095945050505050565b6000611a65826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ae29092919063ffffffff16565b8051909150156104bd5780806020019051810190611a839190611ca1565b6104bd5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161052e565b606061149f848460008585843b611b3b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161052e565b600080866001600160a01b03168587604051611b579190611e1b565b60006040518083038185875af1925050503d8060008114611b94576040519150601f19603f3d011682016040523d82523d6000602084013e611b99565b606091505b5091509150611ba9828286611bb4565b979650505050505050565b60608315611bc357508161155d565b825115611bd35782518084602001fd5b8160405162461bcd60e51b815260040161052e9190611eac565b80356001600160801b0381168114611c0457600080fd5b919050565b803563ffffffff81168114611c0457600080fd5b805169ffffffffffffffffffff81168114611c0457600080fd5b600060208284031215611c4957600080fd5b815161155d81612101565b60008060008060808587031215611c6a57600080fd5b8435611c7581612101565b9350611c8360208601611c09565b9250611c9160408601611bed565b9396929550929360600135925050565b600060208284031215611cb357600080fd5b8151801515811461155d57600080fd5b600060208284031215611cd557600080fd5b5035919050565b60008060408385031215611cef57600080fd5b823591506020830135611d0181612101565b809150509250929050565b600060208284031215611d1e57600080fd5b81356001600160e01b03198116811461155d57600080fd5b600060208284031215611d4857600080fd5b813561155d81612101565b600060208284031215611d6557600080fd5b5051919050565b600080600060608486031215611d8157600080fd5b611d8a84611c09565b9250611d9860208501611bed565b9150604084013590509250925092565b600080600080600060a08688031215611dc057600080fd5b611dc986611c1d565b9450602086015193506040860151925060608601519150611dec60808701611c1d565b90509295509295909350565b600060208284031215611e0a57600080fd5b815160ff8116811461155d57600080fd5b60008251611e2d818460208701612052565b9190910192915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611e6f816017850160208801612052565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611ea0816028840160208801612052565b01602801949350505050565b6020815260008251806020840152611ecb816040850160208701612052565b601f01601f19169190910160400192915050565b60008219821115611ef257611ef26120a9565b500190565b600082611f0657611f066120bf565b500490565b600181815b80851115611f46578160001904821115611f2c57611f2c6120a9565b80851615611f3957918102915b93841c9390800290611f10565b509250929050565b600061155d60ff841683600082611f67575060016103db565b81611f74575060006103db565b8160018114611f8a5760028114611f9457611fb0565b60019150506103db565b60ff841115611fa557611fa56120a9565b50506001821b6103db565b5060208310610133831016604e8410600b8410161715611fd3575081810a6103db565b611fdd8383611f0b565b8060001904821115611ff157611ff16120a9565b029392505050565b6000816000190483118215151615612013576120136120a9565b500290565b60008282101561202a5761202a6120a9565b500390565b600060ff821660ff841680821015612049576120496120a9565b90039392505050565b60005b8381101561206d578181015183820152602001612055565b838111156116595750506000910152565b60008161208d5761208d6120a9565b506000190190565b6000826120a4576120a46120bf565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461211657600080fd5b5056fea2646970667358221220e8bf12d73f10acff5e70bb4c70216d29db16440516098eb6fb89bd474f1e0f2064736f6c63430008060033","devdoc":{"kind":"dev","methods":{"buy(address,uint32,uint128,uint256)":{"params":{"amount":"The option/strategy amount","holder":"The holder address","period":"The option/strategy period","strike":"The option/strategy strike*"}},"exercise(uint256)":{"params":{"optionID":"The option/strategy ID*"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role\\\'s admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``\\\'s admin role."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"profitOf(uint256)":{"params":{"amount":"The unrealized profits amount*","optionID":"The option/strategy ID"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function\\\'s purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``\\\'s admin role."},"setK(uint256)":{"params":{"value":"The collateralization coefficient*"}},"setLimit(uint256)":{"params":{"value":"The maximum locked liquidity*"}},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."}},"version":1},"userdoc":{"kind":"user","methods":{"buy(address,uint32,uint128,uint256)":{"notice":"Used for buying options/strategies"},"exercise(uint256)":{"notice":"Used for exercising an in-the-money option/strategy and taking profits"},"getLockedByStrategy()":{"notice":"Used for viewing the total liquidity locked up for a specific options strategy*"},"profitOf(uint256)":{"notice":"Used for calculating the holder\\\'s option/strategy unrealized profits"},"setK(uint256)":{"notice":"Used for setting the collateralization coefficient"},"setLimit(uint256)":{"notice":"Used for setting a limit on the total locked liquidity"}},"version":1},"storageLayout":{"storage":[{"astId":238,"contract":"contracts/Strategies/HegicStrategySpreadPut.sol:HegicStrategySpreadPut","label":"_roles","offset":0,"slot":"0","type":"t_mapping(t_bytes32,t_struct(RoleData)233_storage)"},{"astId":940,"contract":"contracts/Strategies/HegicStrategySpreadPut.sol:HegicStrategySpreadPut","label":"_status","offset":0,"slot":"1","type":"t_uint256"},{"astId":15266,"contract":"contracts/Strategies/HegicStrategySpreadPut.sol:HegicStrategySpreadPut","label":"collateralizationRatio","offset":0,"slot":"2","type":"t_uint8"},{"astId":15269,"contract":"contracts/Strategies/HegicStrategySpreadPut.sol:HegicStrategySpreadPut","label":"lockedLimit","offset":0,"slot":"3","type":"t_uint256"},{"astId":15272,"contract":"contracts/Strategies/HegicStrategySpreadPut.sol:HegicStrategySpreadPut","label":"pricer","offset":0,"slot":"4","type":"t_contract(IPremiumCalculator)6519"},{"astId":15280,"contract":"contracts/Strategies/HegicStrategySpreadPut.sol:HegicStrategySpreadPut","label":"k","offset":0,"slot":"5","type":"t_uint256"},{"astId":15290,"contract":"contracts/Strategies/HegicStrategySpreadPut.sol:HegicStrategySpreadPut","label":"strategyData","offset":0,"slot":"6","type":"t_mapping(t_uint256,t_struct(StrategyData)15285_storage)"},{"astId":17445,"contract":"contracts/Strategies/HegicStrategySpreadPut.sol:HegicStrategySpreadPut","label":"roundedDecimals","offset":0,"slot":"7","type":"t_uint8"},{"astId":17447,"contract":"contracts/Strategies/HegicStrategySpreadPut.sol:HegicStrategySpreadPut","label":"strikePercentage","offset":0,"slot":"8","type":"t_uint256"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_bool":{"encoding":"inplace","label":"bool","numberOfBytes":"1"},"t_bytes32":{"encoding":"inplace","label":"bytes32","numberOfBytes":"32"},"t_contract(IPremiumCalculator)6519":{"encoding":"inplace","label":"contract IPremiumCalculator","numberOfBytes":"20"},"t_mapping(t_address,t_bool)":{"encoding":"mapping","key":"t_address","label":"mapping(address => bool)","numberOfBytes":"32","value":"t_bool"},"t_mapping(t_bytes32,t_struct(RoleData)233_storage)":{"encoding":"mapping","key":"t_bytes32","label":"mapping(bytes32 => struct AccessControl.RoleData)","numberOfBytes":"32","value":"t_struct(RoleData)233_storage"},"t_mapping(t_uint256,t_struct(StrategyData)15285_storage)":{"encoding":"mapping","key":"t_uint256","label":"mapping(uint256 => struct HegicStrategy.StrategyData)","numberOfBytes":"32","value":"t_struct(StrategyData)15285_storage"},"t_struct(RoleData)233_storage":{"encoding":"inplace","label":"struct AccessControl.RoleData","members":[{"astId":230,"contract":"contracts/Strategies/HegicStrategySpreadPut.sol:HegicStrategySpreadPut","label":"members","offset":0,"slot":"0","type":"t_mapping(t_address,t_bool)"},{"astId":232,"contract":"contracts/Strategies/HegicStrategySpreadPut.sol:HegicStrategySpreadPut","label":"adminRole","offset":0,"slot":"1","type":"t_bytes32"}],"numberOfBytes":"64"},"t_struct(StrategyData)15285_storage":{"encoding":"inplace","label":"struct HegicStrategy.StrategyData","members":[{"astId":15282,"contract":"contracts/Strategies/HegicStrategySpreadPut.sol:HegicStrategySpreadPut","label":"amount","offset":0,"slot":"0","type":"t_uint128"},{"astId":15284,"contract":"contracts/Strategies/HegicStrategySpreadPut.sol:HegicStrategySpreadPut","label":"strike","offset":16,"slot":"0","type":"t_uint128"}],"numberOfBytes":"32"},"t_uint128":{"encoding":"inplace","label":"uint128","numberOfBytes":"16"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"},"t_uint8":{"encoding":"inplace","label":"uint8","numberOfBytes":"1"}}}}\');\n\n//# sourceURL=webpack://hedge/./src/deployments/arbitrum/HegicStrategySPREAD_PUT_70_ETH.json?')}}]);