{
  "_format": "hh-sol-artifact-1",
  "contractName": "ACL",
  "sourceName": "contracts/ACL.sol",
  "abi": [
    {
      "inputs": [],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        }
      ],
      "name": "AddressEmptyCode",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "delegatee",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "contractAddress",
          "type": "address"
        }
      ],
      "name": "AlreadyDelegated",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ContractAddressesIsEmpty",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ContractAddressesMaxLengthExceeded",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "implementation",
          "type": "address"
        }
      ],
      "name": "ERC1967InvalidImplementation",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ERC1967NonPayable",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "FailedCall",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "HandlesListIsEmpty",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidInitialization",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "delegatee",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "contractAddress",
          "type": "address"
        }
      ],
      "name": "NotDelegatedYet",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NotInitializing",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "OwnableInvalidOwner",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "OwnableUnauthorizedAccount",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "contractAddress",
          "type": "address"
        }
      ],
      "name": "SenderCannotBeContractAddress",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "SenderNotAllowed",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "UUPSUnauthorizedCallContext",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "slot",
          "type": "bytes32"
        }
      ],
      "name": "UUPSUnsupportedProxiableUUID",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "caller",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "handle",
          "type": "bytes32"
        }
      ],
      "name": "Allowed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "caller",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bytes32[]",
          "name": "handlesList",
          "type": "bytes32[]"
        }
      ],
      "name": "AllowedForDecryption",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint64",
          "name": "version",
          "type": "uint64"
        }
      ],
      "name": "Initialized",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "caller",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "delegatee",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address[]",
          "name": "contractAddresses",
          "type": "address[]"
        }
      ],
      "name": "NewDelegation",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferStarted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "caller",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "delegatee",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address[]",
          "name": "contractAddresses",
          "type": "address[]"
        }
      ],
      "name": "RevokedDelegation",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "implementation",
          "type": "address"
        }
      ],
      "name": "Upgraded",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "UPGRADE_INTERFACE_VERSION",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "acceptOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "handle",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "allow",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32[]",
          "name": "handlesList",
          "type": "bytes32[]"
        }
      ],
      "name": "allowForDecryption",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "handle",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "allowTransient",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "delegatee",
          "type": "address"
        },
        {
          "internalType": "bytes32",
          "name": "handle",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "contractAddress",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "allowedOnBehalf",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "handle",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "allowedTransient",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "cleanTransientStorage",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "delegatee",
          "type": "address"
        },
        {
          "internalType": "address[]",
          "name": "contractAddresses",
          "type": "address[]"
        }
      ],
      "name": "delegateAccount",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getFHEVMExecutorAddress",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getVersion",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "handle",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "isAllowed",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "handle",
          "type": "bytes32"
        }
      ],
      "name": "isAllowedForDecryption",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "pendingOwner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "handle",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "persistAllowed",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "proxiableUUID",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "reinitialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "delegatee",
          "type": "address"
        },
        {
          "internalType": "address[]",
          "name": "contractAddresses",
          "type": "address[]"
        }
      ],
      "name": "revokeDelegation",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newImplementation",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "upgradeToAndCall",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    }
  ],
  "bytecode": "0x60a060405230608052348015610013575f80fd5b5061001c610021565b6100d3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100715760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d05780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051611abc6100f95f395f818161101e0152818161104701526111ac0152611abc5ff3fe60806040526004361061016d575f3560e01c806374b79a5a116100c6578063b9496b621161007c578063f2fde38b11610057578063f2fde38b14610446578063f72164de14610465578063fadd224614610484575f80fd5b8063b9496b62146103c6578063c0d02943146103e5578063e30c397814610432575f80fd5b806382027b6d116100ac57806382027b6d1461034b5780638da5cb5b1461036a578063ad3cb1cc1461037e575f80fd5b806374b79a5a1461031857806379ba509714610337575f80fd5b80633e395cec11610126578063531efc9211610101578063531efc92146102d15780636c2eb350146102f0578063715018a614610304575f80fd5b80633e395cec1461027d5780634f1ef2861461029c57806352d1902d146102af575f80fd5b80631e2f86ba116101565780631e2f86ba146101bc578063268d6d311461022f57806335334c2314610269575f80fd5b8063088563e8146101715780630d8e6e2c14610192575b5f80fd5b34801561017c575f80fd5b5061019061018b36600461169a565b6104a3565b005b34801561019d575f80fd5b506101a6610670565b6040516101b39190611767565b60405180910390f35b3480156101c7575f80fd5b5061021f6101d6366004611799565b5f9182527fa688f31953c2015baaf8c0a488ee1ee22eb0e05273cc1fd31ea4cbee42febc00602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60405190151581526020016101b3565b34801561023a575f80fd5b5073cd3ab3bd6bcc0c0bf3e27912a92043e817b1cf695b6040516001600160a01b0390911681526020016101b3565b348015610274575f80fd5b506101906106d1565b348015610288575f80fd5b50610190610297366004611799565b6106fb565b6101906102aa3660046117c3565b61079b565b3480156102ba575f80fd5b506102c36107ba565b6040519081526020016101b3565b3480156102dc575f80fd5b506101906102eb36600461169a565b6107e8565b3480156102fb575f80fd5b50610190610a37565b34801561030f575f80fd5b50610190610b2c565b348015610323575f80fd5b5061021f610332366004611799565b610b3f565b348015610342575f80fd5b50610190610b92565b348015610356575f80fd5b5061021f610365366004611799565b610bda565b348015610375575f80fd5b50610251610c37565b348015610389575f80fd5b506101a66040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b3480156103d1575f80fd5b506101906103e0366004611799565b610c6b565b3480156103f0575f80fd5b5061021f6103ff366004611863565b5f9081527fa688f31953c2015baaf8c0a488ee1ee22eb0e05273cc1fd31ea4cbee42febc01602052604090205460ff1690565b34801561043d575f80fd5b50610251610d18565b348015610451575f80fd5b5061019061046036600461187a565b610d40565b348015610470575f80fd5b5061021f61047f366004611893565b610dc5565b34801561048f575f80fd5b5061019061049e3660046118dd565b610e7a565b80515f8190036104c6576040516317d7ad0760e21b815260040160405180910390fd5b7fa688f31953c2015baaf8c0a488ee1ee22eb0e05273cc1fd31ea4cbee42febc005f5b8281101561061e57335f90815260028301602090815260408083206001600160a01b03891684529091528120855190919086908490811061052c5761052c611969565b6020908102919091018101516001600160a01b031682528101919091526040015f205460ff16156105ab578484828151811061056a5761056a611969565b6020026020010151604051632210106160e01b81526004016105a29291906001600160a01b0392831681529116602082015260400190565b60405180910390fd5b335f90815260028301602090815260408083206001600160a01b03891684529091528120855182908790859081106105e5576105e5611969565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff19169115159190911790556001016104e9565b50836001600160a01b0316336001600160a01b03167f7c0a18a6132447b7c9f34ae509fec1dba0cb0ff0bdd1704b99779a1c744a138e85604051610662919061197d565b60405180910390a350505050565b6060604051806040016040528060038152602001621050d360ea1b8152506106975f610f76565b6106a16001610f76565b6106aa5f610f76565b6040516020016106bd94939291906119c9565b604051602081830303815290604052905090565b5f5c5f805d600190810190805b828110156106f657805c5f825d5f815d5081016106de565b505050565b3373cd3ab3bd6bcc0c0bf3e27912a92043e817b1cf691461073f576107208233610bda565b61073f576040516368692cbb60e11b81523360048201526024016105a2565b5f828260405160200161076e92919091825260601b6bffffffffffffffffffffffff1916602082015260340190565b6040516020818303038152906040528051906020012090506001815d60015f5c0181815d805f5d50505050565b6107a3611013565b6107ac826110ca565b6107b682826110d2565b5050565b5f6107c36111a1565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b80515f81900361080b576040516317d7ad0760e21b815260040160405180910390fd5b600a81111561082d576040516365ac366b60e11b815260040160405180910390fd5b7fa688f31953c2015baaf8c0a488ee1ee22eb0e05273cc1fd31ea4cbee42febc005f5b828110156109f357336001600160a01b031684828151811061087457610874611969565b60200260200101516001600160a01b0316036108cd5783818151811061089c5761089c611969565b6020026020010151604051630c24836b60e31b81526004016105a291906001600160a01b0391909116815260200190565b335f90815260028301602090815260408083206001600160a01b03891684529091528120855190919086908490811061090857610908611969565b6020908102919091018101516001600160a01b031682528101919091526040015f205460ff161561097e578484828151811061094657610946611969565b6020026020010151604051633e39e40f60e21b81526004016105a29291906001600160a01b0392831681529116602082015260400190565b335f90815260028301602090815260408083206001600160a01b038916845290915281208551600192908790859081106109ba576109ba611969565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101610850565b50836001600160a01b0316336001600160a01b03167f6ac533ce8df9b9d2a4842715e991ef317c4a8148d2dbc0a5109ce6979de353e585604051610662919061197d565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0080546002919068010000000000000000900460ff1680610a865750805467ffffffffffffffff808416911610155b15610aa45760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff191667ffffffffffffffff83161768010000000000000000178155610adb610ad6610c37565b6111ea565b805468ff00000000000000001916815560405167ffffffffffffffff831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15050565b610b346111fb565b610b3d5f61122d565b565b5f805f8484604051602001610b7092919091825260601b6bffffffffffffffffffffffff1916602082015260340190565b60408051808303601f1901815291905280516020909101205c95945050505050565b3380610b9c610d18565b6001600160a01b031614610bce5760405163118cdaa760e01b81526001600160a01b03821660048201526024016105a2565b610bd78161122d565b50565b5f610be58383610b3f565b80610c3057505f8381527fa688f31953c2015baaf8c0a488ee1ee22eb0e05273cc1fd31ea4cbee42febc00602090815260408083206001600160a01b038616845290915290205460ff165b9392505050565b5f807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b7fa688f31953c2015baaf8c0a488ee1ee22eb0e05273cc1fd31ea4cbee42febc00610c968333610bda565b610cb5576040516368692cbb60e11b81523360048201526024016105a2565b5f838152602082815260408083206001600160a01b03861680855290835292819020805460ff191660011790555185815233917fe2e1decee6e05ee246cd7c7f1337d25cdfd41dcbdcf8c57b61630be56cc7366a910160405180910390a3505050565b5f807f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00610c5b565b610d486111fb565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319166001600160a01b0383169081178255610d8c610c37565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b5f8381527fa688f31953c2015baaf8c0a488ee1ee22eb0e05273cc1fd31ea4cbee42febc00602081815260408084206001600160a01b038616855290915282205460ff168015610e3457505f858152602082815260408083206001600160a01b038816845290915290205460ff165b8015610e7057506001600160a01b038084165f90815260028301602090815260408083208a8516845282528083209388168352929052205460ff165b9695505050505050565b80515f819003610e9d5760405163385e8ccb60e11b815260040160405180910390fd5b7fa688f31953c2015baaf8c0a488ee1ee22eb0e05273cc1fd31ea4cbee42febc005f5b82811015610f2f575f848281518110610edb57610edb611969565b60200260200101519050610eef8133610bda565b610f0e576040516368692cbb60e11b81523360048201526024016105a2565b5f90815260018381016020526040909120805460ff19168217905501610ec0565b50336001600160a01b03167fd913ac93a959116526793ef772233273d5249597d33cddfdc34f29920541fd0a84604051610f699190611a46565b60405180910390a2505050565b60605f610f8283611265565b60010190505f8167ffffffffffffffff811115610fa157610fa1611632565b6040519080825280601f01601f191660200182016040528015610fcb576020820181803683370190505b5090508181016020015b5f19017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8504945084610fd557509392505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110ac57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166110a07f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b15610b3d5760405163703e46dd60e11b815260040160405180910390fd5b610bd76111fb565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561112c575060408051601f3d908101601f1916820190925261112991810190611a7d565b60015b61115457604051634c9c8ce360e01b81526001600160a01b03831660048201526024016105a2565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc811461119757604051632a87526960e21b8152600481018290526024016105a2565b6106f68383611347565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b3d5760405163703e46dd60e11b815260040160405180910390fd5b6111f261139c565b610bd7816113ea565b33611204610c37565b6001600160a01b031614610b3d5760405163118cdaa760e01b81523360048201526024016105a2565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b03191681556107b68261141b565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106112ad577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef810000000083106112d9576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106112f757662386f26fc10000830492506010015b6305f5e100831061130f576305f5e100830492506008015b612710831061132357612710830492506004015b60648310611335576064830492506002015b600a8310611341576001015b92915050565b6113508261148b565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115611394576106f68282611501565b6107b6611573565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff16610b3d57604051631afcd79f60e31b815260040160405180910390fd5b6113f261139c565b6001600160a01b038116610bce57604051631e4fbdf760e01b81525f60048201526024016105a2565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b806001600160a01b03163b5f036114c057604051634c9c8ce360e01b81526001600160a01b03821660048201526024016105a2565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b03168460405161151d9190611a94565b5f60405180830381855af49150503d805f8114611555576040519150601f19603f3d011682016040523d82523d5f602084013e61155a565b606091505b509150915061156a858383611592565b95945050505050565b3415610b3d5760405163b398979f60e01b815260040160405180910390fd5b6060826115a7576115a2826115ee565b610c30565b81511580156115be57506001600160a01b0384163b155b156115e757604051639996b31560e01b81526001600160a01b03851660048201526024016105a2565b5092915050565b8051156115fe5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b80356001600160a01b038116811461162d575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561166f5761166f611632565b604052919050565b5f67ffffffffffffffff82111561169057611690611632565b5060051b60200190565b5f80604083850312156116ab575f80fd5b6116b483611617565b915060208084013567ffffffffffffffff8111156116d0575f80fd5b8401601f810186136116e0575f80fd5b80356116f36116ee82611677565b611646565b81815260059190911b82018301908381019088831115611711575f80fd5b928401925b828410156117365761172784611617565b82529284019290840190611716565b80955050505050509250929050565b5f5b8381101561175f578181015183820152602001611747565b50505f910152565b602081525f8251806020840152611785816040850160208701611745565b601f01601f19169190910160400192915050565b5f80604083850312156117aa575f80fd5b823591506117ba60208401611617565b90509250929050565b5f80604083850312156117d4575f80fd5b6117dd83611617565b915060208084013567ffffffffffffffff808211156117fa575f80fd5b818601915086601f83011261180d575f80fd5b81358181111561181f5761181f611632565b611831601f8201601f19168501611646565b91508082528784828501011115611846575f80fd5b80848401858401375f848284010152508093505050509250929050565b5f60208284031215611873575f80fd5b5035919050565b5f6020828403121561188a575f80fd5b610c3082611617565b5f805f80608085870312156118a6575f80fd5b6118af85611617565b9350602085013592506118c460408601611617565b91506118d260608601611617565b905092959194509250565b5f60208083850312156118ee575f80fd5b823567ffffffffffffffff811115611904575f80fd5b8301601f81018513611914575f80fd5b80356119226116ee82611677565b81815260059190911b82018301908381019087831115611940575f80fd5b928401925b8284101561195e57833582529284019290840190611945565b979650505050505050565b634e487b7160e01b5f52603260045260245ffd5b602080825282518282018190525f9190848201906040850190845b818110156119bd5783516001600160a01b031683529284019291840191600101611998565b50909695505050505050565b5f85516119da818460208a01611745565b61103b60f11b90830190815285516119f9816002840160208a01611745565b808201915050601760f91b8060028301528551611a1d816003850160208a01611745565b60039201918201528351611a38816004840160208801611745565b016004019695505050505050565b602080825282518282018190525f9190848201906040850190845b818110156119bd57835183529284019291840191600101611a61565b5f60208284031215611a8d575f80fd5b5051919050565b5f8251611aa5818460208701611745565b919091019291505056fea164736f6c6343000818000a",
  "deployedBytecode": "0x60806040526004361061016d575f3560e01c806374b79a5a116100c6578063b9496b621161007c578063f2fde38b11610057578063f2fde38b14610446578063f72164de14610465578063fadd224614610484575f80fd5b8063b9496b62146103c6578063c0d02943146103e5578063e30c397814610432575f80fd5b806382027b6d116100ac57806382027b6d1461034b5780638da5cb5b1461036a578063ad3cb1cc1461037e575f80fd5b806374b79a5a1461031857806379ba509714610337575f80fd5b80633e395cec11610126578063531efc9211610101578063531efc92146102d15780636c2eb350146102f0578063715018a614610304575f80fd5b80633e395cec1461027d5780634f1ef2861461029c57806352d1902d146102af575f80fd5b80631e2f86ba116101565780631e2f86ba146101bc578063268d6d311461022f57806335334c2314610269575f80fd5b8063088563e8146101715780630d8e6e2c14610192575b5f80fd5b34801561017c575f80fd5b5061019061018b36600461169a565b6104a3565b005b34801561019d575f80fd5b506101a6610670565b6040516101b39190611767565b60405180910390f35b3480156101c7575f80fd5b5061021f6101d6366004611799565b5f9182527fa688f31953c2015baaf8c0a488ee1ee22eb0e05273cc1fd31ea4cbee42febc00602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60405190151581526020016101b3565b34801561023a575f80fd5b5073cd3ab3bd6bcc0c0bf3e27912a92043e817b1cf695b6040516001600160a01b0390911681526020016101b3565b348015610274575f80fd5b506101906106d1565b348015610288575f80fd5b50610190610297366004611799565b6106fb565b6101906102aa3660046117c3565b61079b565b3480156102ba575f80fd5b506102c36107ba565b6040519081526020016101b3565b3480156102dc575f80fd5b506101906102eb36600461169a565b6107e8565b3480156102fb575f80fd5b50610190610a37565b34801561030f575f80fd5b50610190610b2c565b348015610323575f80fd5b5061021f610332366004611799565b610b3f565b348015610342575f80fd5b50610190610b92565b348015610356575f80fd5b5061021f610365366004611799565b610bda565b348015610375575f80fd5b50610251610c37565b348015610389575f80fd5b506101a66040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b3480156103d1575f80fd5b506101906103e0366004611799565b610c6b565b3480156103f0575f80fd5b5061021f6103ff366004611863565b5f9081527fa688f31953c2015baaf8c0a488ee1ee22eb0e05273cc1fd31ea4cbee42febc01602052604090205460ff1690565b34801561043d575f80fd5b50610251610d18565b348015610451575f80fd5b5061019061046036600461187a565b610d40565b348015610470575f80fd5b5061021f61047f366004611893565b610dc5565b34801561048f575f80fd5b5061019061049e3660046118dd565b610e7a565b80515f8190036104c6576040516317d7ad0760e21b815260040160405180910390fd5b7fa688f31953c2015baaf8c0a488ee1ee22eb0e05273cc1fd31ea4cbee42febc005f5b8281101561061e57335f90815260028301602090815260408083206001600160a01b03891684529091528120855190919086908490811061052c5761052c611969565b6020908102919091018101516001600160a01b031682528101919091526040015f205460ff16156105ab578484828151811061056a5761056a611969565b6020026020010151604051632210106160e01b81526004016105a29291906001600160a01b0392831681529116602082015260400190565b60405180910390fd5b335f90815260028301602090815260408083206001600160a01b03891684529091528120855182908790859081106105e5576105e5611969565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff19169115159190911790556001016104e9565b50836001600160a01b0316336001600160a01b03167f7c0a18a6132447b7c9f34ae509fec1dba0cb0ff0bdd1704b99779a1c744a138e85604051610662919061197d565b60405180910390a350505050565b6060604051806040016040528060038152602001621050d360ea1b8152506106975f610f76565b6106a16001610f76565b6106aa5f610f76565b6040516020016106bd94939291906119c9565b604051602081830303815290604052905090565b5f5c5f805d600190810190805b828110156106f657805c5f825d5f815d5081016106de565b505050565b3373cd3ab3bd6bcc0c0bf3e27912a92043e817b1cf691461073f576107208233610bda565b61073f576040516368692cbb60e11b81523360048201526024016105a2565b5f828260405160200161076e92919091825260601b6bffffffffffffffffffffffff1916602082015260340190565b6040516020818303038152906040528051906020012090506001815d60015f5c0181815d805f5d50505050565b6107a3611013565b6107ac826110ca565b6107b682826110d2565b5050565b5f6107c36111a1565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b80515f81900361080b576040516317d7ad0760e21b815260040160405180910390fd5b600a81111561082d576040516365ac366b60e11b815260040160405180910390fd5b7fa688f31953c2015baaf8c0a488ee1ee22eb0e05273cc1fd31ea4cbee42febc005f5b828110156109f357336001600160a01b031684828151811061087457610874611969565b60200260200101516001600160a01b0316036108cd5783818151811061089c5761089c611969565b6020026020010151604051630c24836b60e31b81526004016105a291906001600160a01b0391909116815260200190565b335f90815260028301602090815260408083206001600160a01b03891684529091528120855190919086908490811061090857610908611969565b6020908102919091018101516001600160a01b031682528101919091526040015f205460ff161561097e578484828151811061094657610946611969565b6020026020010151604051633e39e40f60e21b81526004016105a29291906001600160a01b0392831681529116602082015260400190565b335f90815260028301602090815260408083206001600160a01b038916845290915281208551600192908790859081106109ba576109ba611969565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101610850565b50836001600160a01b0316336001600160a01b03167f6ac533ce8df9b9d2a4842715e991ef317c4a8148d2dbc0a5109ce6979de353e585604051610662919061197d565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0080546002919068010000000000000000900460ff1680610a865750805467ffffffffffffffff808416911610155b15610aa45760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff191667ffffffffffffffff83161768010000000000000000178155610adb610ad6610c37565b6111ea565b805468ff00000000000000001916815560405167ffffffffffffffff831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15050565b610b346111fb565b610b3d5f61122d565b565b5f805f8484604051602001610b7092919091825260601b6bffffffffffffffffffffffff1916602082015260340190565b60408051808303601f1901815291905280516020909101205c95945050505050565b3380610b9c610d18565b6001600160a01b031614610bce5760405163118cdaa760e01b81526001600160a01b03821660048201526024016105a2565b610bd78161122d565b50565b5f610be58383610b3f565b80610c3057505f8381527fa688f31953c2015baaf8c0a488ee1ee22eb0e05273cc1fd31ea4cbee42febc00602090815260408083206001600160a01b038616845290915290205460ff165b9392505050565b5f807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b7fa688f31953c2015baaf8c0a488ee1ee22eb0e05273cc1fd31ea4cbee42febc00610c968333610bda565b610cb5576040516368692cbb60e11b81523360048201526024016105a2565b5f838152602082815260408083206001600160a01b03861680855290835292819020805460ff191660011790555185815233917fe2e1decee6e05ee246cd7c7f1337d25cdfd41dcbdcf8c57b61630be56cc7366a910160405180910390a3505050565b5f807f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00610c5b565b610d486111fb565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319166001600160a01b0383169081178255610d8c610c37565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b5f8381527fa688f31953c2015baaf8c0a488ee1ee22eb0e05273cc1fd31ea4cbee42febc00602081815260408084206001600160a01b038616855290915282205460ff168015610e3457505f858152602082815260408083206001600160a01b038816845290915290205460ff165b8015610e7057506001600160a01b038084165f90815260028301602090815260408083208a8516845282528083209388168352929052205460ff165b9695505050505050565b80515f819003610e9d5760405163385e8ccb60e11b815260040160405180910390fd5b7fa688f31953c2015baaf8c0a488ee1ee22eb0e05273cc1fd31ea4cbee42febc005f5b82811015610f2f575f848281518110610edb57610edb611969565b60200260200101519050610eef8133610bda565b610f0e576040516368692cbb60e11b81523360048201526024016105a2565b5f90815260018381016020526040909120805460ff19168217905501610ec0565b50336001600160a01b03167fd913ac93a959116526793ef772233273d5249597d33cddfdc34f29920541fd0a84604051610f699190611a46565b60405180910390a2505050565b60605f610f8283611265565b60010190505f8167ffffffffffffffff811115610fa157610fa1611632565b6040519080825280601f01601f191660200182016040528015610fcb576020820181803683370190505b5090508181016020015b5f19017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8504945084610fd557509392505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110ac57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166110a07f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b15610b3d5760405163703e46dd60e11b815260040160405180910390fd5b610bd76111fb565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561112c575060408051601f3d908101601f1916820190925261112991810190611a7d565b60015b61115457604051634c9c8ce360e01b81526001600160a01b03831660048201526024016105a2565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc811461119757604051632a87526960e21b8152600481018290526024016105a2565b6106f68383611347565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b3d5760405163703e46dd60e11b815260040160405180910390fd5b6111f261139c565b610bd7816113ea565b33611204610c37565b6001600160a01b031614610b3d5760405163118cdaa760e01b81523360048201526024016105a2565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b03191681556107b68261141b565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106112ad577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef810000000083106112d9576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106112f757662386f26fc10000830492506010015b6305f5e100831061130f576305f5e100830492506008015b612710831061132357612710830492506004015b60648310611335576064830492506002015b600a8310611341576001015b92915050565b6113508261148b565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115611394576106f68282611501565b6107b6611573565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff16610b3d57604051631afcd79f60e31b815260040160405180910390fd5b6113f261139c565b6001600160a01b038116610bce57604051631e4fbdf760e01b81525f60048201526024016105a2565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b806001600160a01b03163b5f036114c057604051634c9c8ce360e01b81526001600160a01b03821660048201526024016105a2565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b03168460405161151d9190611a94565b5f60405180830381855af49150503d805f8114611555576040519150601f19603f3d011682016040523d82523d5f602084013e61155a565b606091505b509150915061156a858383611592565b95945050505050565b3415610b3d5760405163b398979f60e01b815260040160405180910390fd5b6060826115a7576115a2826115ee565b610c30565b81511580156115be57506001600160a01b0384163b155b156115e757604051639996b31560e01b81526001600160a01b03851660048201526024016105a2565b5092915050565b8051156115fe5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b80356001600160a01b038116811461162d575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561166f5761166f611632565b604052919050565b5f67ffffffffffffffff82111561169057611690611632565b5060051b60200190565b5f80604083850312156116ab575f80fd5b6116b483611617565b915060208084013567ffffffffffffffff8111156116d0575f80fd5b8401601f810186136116e0575f80fd5b80356116f36116ee82611677565b611646565b81815260059190911b82018301908381019088831115611711575f80fd5b928401925b828410156117365761172784611617565b82529284019290840190611716565b80955050505050509250929050565b5f5b8381101561175f578181015183820152602001611747565b50505f910152565b602081525f8251806020840152611785816040850160208701611745565b601f01601f19169190910160400192915050565b5f80604083850312156117aa575f80fd5b823591506117ba60208401611617565b90509250929050565b5f80604083850312156117d4575f80fd5b6117dd83611617565b915060208084013567ffffffffffffffff808211156117fa575f80fd5b818601915086601f83011261180d575f80fd5b81358181111561181f5761181f611632565b611831601f8201601f19168501611646565b91508082528784828501011115611846575f80fd5b80848401858401375f848284010152508093505050509250929050565b5f60208284031215611873575f80fd5b5035919050565b5f6020828403121561188a575f80fd5b610c3082611617565b5f805f80608085870312156118a6575f80fd5b6118af85611617565b9350602085013592506118c460408601611617565b91506118d260608601611617565b905092959194509250565b5f60208083850312156118ee575f80fd5b823567ffffffffffffffff811115611904575f80fd5b8301601f81018513611914575f80fd5b80356119226116ee82611677565b81815260059190911b82018301908381019087831115611940575f80fd5b928401925b8284101561195e57833582529284019290840190611945565b979650505050505050565b634e487b7160e01b5f52603260045260245ffd5b602080825282518282018190525f9190848201906040850190845b818110156119bd5783516001600160a01b031683529284019291840191600101611998565b50909695505050505050565b5f85516119da818460208a01611745565b61103b60f11b90830190815285516119f9816002840160208a01611745565b808201915050601760f91b8060028301528551611a1d816003850160208a01611745565b60039201918201528351611a38816004840160208801611745565b016004019695505050505050565b602080825282518282018190525f9190848201906040850190845b818110156119bd57835183529284019291840191600101611a61565b5f60208284031215611a8d575f80fd5b5051919050565b5f8251611aa5818460208701611745565b919091019291505056fea164736f6c6343000818000a",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
