{
  "_format": "hh-sol-artifact-1",
  "contractName": "OFTImpl",
  "sourceName": "contracts/cross-chain/oft/OFTImpl.sol",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "_name",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "_symbol",
          "type": "string"
        },
        {
          "internalType": "address",
          "name": "_lzEndpoint",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_delegate",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_initialOwner",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "amountSD",
          "type": "uint256"
        }
      ],
      "name": "AmountSDOverflowed",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "allowance",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "needed",
          "type": "uint256"
        }
      ],
      "name": "ERC20InsufficientAllowance",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "balance",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "needed",
          "type": "uint256"
        }
      ],
      "name": "ERC20InsufficientBalance",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "approver",
          "type": "address"
        }
      ],
      "name": "ERC20InvalidApprover",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        }
      ],
      "name": "ERC20InvalidReceiver",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "ERC20InvalidSender",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        }
      ],
      "name": "ERC20InvalidSpender",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidDelegate",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidEndpointCall",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidLocalDecimals",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "options",
          "type": "bytes"
        }
      ],
      "name": "InvalidOptions",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "LzTokenUnavailable",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "eid",
          "type": "uint32"
        }
      ],
      "name": "NoPeer",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "msgValue",
          "type": "uint256"
        }
      ],
      "name": "NotEnoughNative",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "addr",
          "type": "address"
        }
      ],
      "name": "OnlyEndpoint",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "eid",
          "type": "uint32"
        },
        {
          "internalType": "bytes32",
          "name": "sender",
          "type": "bytes32"
        }
      ],
      "name": "OnlyPeer",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "OnlySelf",
      "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": "token",
          "type": "address"
        }
      ],
      "name": "SafeERC20FailedOperation",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "result",
          "type": "bytes"
        }
      ],
      "name": "SimulationResult",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "amountLD",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "minAmountLD",
          "type": "uint256"
        }
      ],
      "name": "SlippageExceeded",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "Approval",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint32",
              "name": "eid",
              "type": "uint32"
            },
            {
              "internalType": "uint16",
              "name": "msgType",
              "type": "uint16"
            },
            {
              "internalType": "bytes",
              "name": "options",
              "type": "bytes"
            }
          ],
          "indexed": false,
          "internalType": "struct EnforcedOptionParam[]",
          "name": "_enforcedOptions",
          "type": "tuple[]"
        }
      ],
      "name": "EnforcedOptionSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "inspector",
          "type": "address"
        }
      ],
      "name": "MsgInspectorSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "guid",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "srcEid",
          "type": "uint32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "toAddress",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amountReceivedLD",
          "type": "uint256"
        }
      ],
      "name": "OFTReceived",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "guid",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "dstEid",
          "type": "uint32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "fromAddress",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amountSentLD",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amountReceivedLD",
          "type": "uint256"
        }
      ],
      "name": "OFTSent",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "eid",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "peer",
          "type": "bytes32"
        }
      ],
      "name": "PeerSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "preCrimeAddress",
          "type": "address"
        }
      ],
      "name": "PreCrimeSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "Transfer",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "SEND",
      "outputs": [
        {
          "internalType": "uint16",
          "name": "",
          "type": "uint16"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "SEND_AND_CALL",
      "outputs": [
        {
          "internalType": "uint16",
          "name": "",
          "type": "uint16"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint32",
              "name": "srcEid",
              "type": "uint32"
            },
            {
              "internalType": "bytes32",
              "name": "sender",
              "type": "bytes32"
            },
            {
              "internalType": "uint64",
              "name": "nonce",
              "type": "uint64"
            }
          ],
          "internalType": "struct Origin",
          "name": "origin",
          "type": "tuple"
        }
      ],
      "name": "allowInitializePath",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        }
      ],
      "name": "allowance",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "approvalRequired",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "approve",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "balanceOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "_eid",
          "type": "uint32"
        },
        {
          "internalType": "uint16",
          "name": "_msgType",
          "type": "uint16"
        },
        {
          "internalType": "bytes",
          "name": "_extraOptions",
          "type": "bytes"
        }
      ],
      "name": "combineOptions",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "decimalConversionRate",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "decimals",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "endpoint",
      "outputs": [
        {
          "internalType": "contract ILayerZeroEndpointV2",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "eid",
          "type": "uint32"
        },
        {
          "internalType": "uint16",
          "name": "msgType",
          "type": "uint16"
        }
      ],
      "name": "enforcedOptions",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "enforcedOption",
          "type": "bytes"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint32",
              "name": "srcEid",
              "type": "uint32"
            },
            {
              "internalType": "bytes32",
              "name": "sender",
              "type": "bytes32"
            },
            {
              "internalType": "uint64",
              "name": "nonce",
              "type": "uint64"
            }
          ],
          "internalType": "struct Origin",
          "name": "",
          "type": "tuple"
        },
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        },
        {
          "internalType": "address",
          "name": "_sender",
          "type": "address"
        }
      ],
      "name": "isComposeMsgSender",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "_eid",
          "type": "uint32"
        },
        {
          "internalType": "bytes32",
          "name": "_peer",
          "type": "bytes32"
        }
      ],
      "name": "isPeer",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint32",
              "name": "srcEid",
              "type": "uint32"
            },
            {
              "internalType": "bytes32",
              "name": "sender",
              "type": "bytes32"
            },
            {
              "internalType": "uint64",
              "name": "nonce",
              "type": "uint64"
            }
          ],
          "internalType": "struct Origin",
          "name": "_origin",
          "type": "tuple"
        },
        {
          "internalType": "bytes32",
          "name": "_guid",
          "type": "bytes32"
        },
        {
          "internalType": "bytes",
          "name": "_message",
          "type": "bytes"
        },
        {
          "internalType": "address",
          "name": "_executor",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "_extraData",
          "type": "bytes"
        }
      ],
      "name": "lzReceive",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "components": [
                {
                  "internalType": "uint32",
                  "name": "srcEid",
                  "type": "uint32"
                },
                {
                  "internalType": "bytes32",
                  "name": "sender",
                  "type": "bytes32"
                },
                {
                  "internalType": "uint64",
                  "name": "nonce",
                  "type": "uint64"
                }
              ],
              "internalType": "struct Origin",
              "name": "origin",
              "type": "tuple"
            },
            {
              "internalType": "uint32",
              "name": "dstEid",
              "type": "uint32"
            },
            {
              "internalType": "address",
              "name": "receiver",
              "type": "address"
            },
            {
              "internalType": "bytes32",
              "name": "guid",
              "type": "bytes32"
            },
            {
              "internalType": "uint256",
              "name": "value",
              "type": "uint256"
            },
            {
              "internalType": "address",
              "name": "executor",
              "type": "address"
            },
            {
              "internalType": "bytes",
              "name": "message",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "extraData",
              "type": "bytes"
            }
          ],
          "internalType": "struct InboundPacket[]",
          "name": "_packets",
          "type": "tuple[]"
        }
      ],
      "name": "lzReceiveAndRevert",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint32",
              "name": "srcEid",
              "type": "uint32"
            },
            {
              "internalType": "bytes32",
              "name": "sender",
              "type": "bytes32"
            },
            {
              "internalType": "uint64",
              "name": "nonce",
              "type": "uint64"
            }
          ],
          "internalType": "struct Origin",
          "name": "_origin",
          "type": "tuple"
        },
        {
          "internalType": "bytes32",
          "name": "_guid",
          "type": "bytes32"
        },
        {
          "internalType": "bytes",
          "name": "_message",
          "type": "bytes"
        },
        {
          "internalType": "address",
          "name": "_executor",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "_extraData",
          "type": "bytes"
        }
      ],
      "name": "lzReceiveSimulate",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "msgInspector",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "name",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        },
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "name": "nextNonce",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "nonce",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "oApp",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "oAppVersion",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "senderVersion",
          "type": "uint64"
        },
        {
          "internalType": "uint64",
          "name": "receiverVersion",
          "type": "uint64"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "oftVersion",
      "outputs": [
        {
          "internalType": "bytes4",
          "name": "interfaceId",
          "type": "bytes4"
        },
        {
          "internalType": "uint64",
          "name": "version",
          "type": "uint64"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "eid",
          "type": "uint32"
        }
      ],
      "name": "peers",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "peer",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "preCrime",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint32",
              "name": "dstEid",
              "type": "uint32"
            },
            {
              "internalType": "bytes32",
              "name": "to",
              "type": "bytes32"
            },
            {
              "internalType": "uint256",
              "name": "amountLD",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "minAmountLD",
              "type": "uint256"
            },
            {
              "internalType": "bytes",
              "name": "extraOptions",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "composeMsg",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "oftCmd",
              "type": "bytes"
            }
          ],
          "internalType": "struct SendParam",
          "name": "_sendParam",
          "type": "tuple"
        }
      ],
      "name": "quoteOFT",
      "outputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "minAmountLD",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "maxAmountLD",
              "type": "uint256"
            }
          ],
          "internalType": "struct OFTLimit",
          "name": "oftLimit",
          "type": "tuple"
        },
        {
          "components": [
            {
              "internalType": "int256",
              "name": "feeAmountLD",
              "type": "int256"
            },
            {
              "internalType": "string",
              "name": "description",
              "type": "string"
            }
          ],
          "internalType": "struct OFTFeeDetail[]",
          "name": "oftFeeDetails",
          "type": "tuple[]"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "amountSentLD",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "amountReceivedLD",
              "type": "uint256"
            }
          ],
          "internalType": "struct OFTReceipt",
          "name": "oftReceipt",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint32",
              "name": "dstEid",
              "type": "uint32"
            },
            {
              "internalType": "bytes32",
              "name": "to",
              "type": "bytes32"
            },
            {
              "internalType": "uint256",
              "name": "amountLD",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "minAmountLD",
              "type": "uint256"
            },
            {
              "internalType": "bytes",
              "name": "extraOptions",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "composeMsg",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "oftCmd",
              "type": "bytes"
            }
          ],
          "internalType": "struct SendParam",
          "name": "_sendParam",
          "type": "tuple"
        },
        {
          "internalType": "bool",
          "name": "_payInLzToken",
          "type": "bool"
        }
      ],
      "name": "quoteSend",
      "outputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "nativeFee",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "lzTokenFee",
              "type": "uint256"
            }
          ],
          "internalType": "struct MessagingFee",
          "name": "msgFee",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint32",
              "name": "dstEid",
              "type": "uint32"
            },
            {
              "internalType": "bytes32",
              "name": "to",
              "type": "bytes32"
            },
            {
              "internalType": "uint256",
              "name": "amountLD",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "minAmountLD",
              "type": "uint256"
            },
            {
              "internalType": "bytes",
              "name": "extraOptions",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "composeMsg",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "oftCmd",
              "type": "bytes"
            }
          ],
          "internalType": "struct SendParam",
          "name": "_sendParam",
          "type": "tuple"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "nativeFee",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "lzTokenFee",
              "type": "uint256"
            }
          ],
          "internalType": "struct MessagingFee",
          "name": "_fee",
          "type": "tuple"
        },
        {
          "internalType": "address",
          "name": "_refundAddress",
          "type": "address"
        }
      ],
      "name": "send",
      "outputs": [
        {
          "components": [
            {
              "internalType": "bytes32",
              "name": "guid",
              "type": "bytes32"
            },
            {
              "internalType": "uint64",
              "name": "nonce",
              "type": "uint64"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "nativeFee",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "lzTokenFee",
                  "type": "uint256"
                }
              ],
              "internalType": "struct MessagingFee",
              "name": "fee",
              "type": "tuple"
            }
          ],
          "internalType": "struct MessagingReceipt",
          "name": "msgReceipt",
          "type": "tuple"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "amountSentLD",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "amountReceivedLD",
              "type": "uint256"
            }
          ],
          "internalType": "struct OFTReceipt",
          "name": "oftReceipt",
          "type": "tuple"
        }
      ],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_delegate",
          "type": "address"
        }
      ],
      "name": "setDelegate",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint32",
              "name": "eid",
              "type": "uint32"
            },
            {
              "internalType": "uint16",
              "name": "msgType",
              "type": "uint16"
            },
            {
              "internalType": "bytes",
              "name": "options",
              "type": "bytes"
            }
          ],
          "internalType": "struct EnforcedOptionParam[]",
          "name": "_enforcedOptions",
          "type": "tuple[]"
        }
      ],
      "name": "setEnforcedOptions",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_msgInspector",
          "type": "address"
        }
      ],
      "name": "setMsgInspector",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "_eid",
          "type": "uint32"
        },
        {
          "internalType": "bytes32",
          "name": "_peer",
          "type": "bytes32"
        }
      ],
      "name": "setPeer",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_preCrime",
          "type": "address"
        }
      ],
      "name": "setPreCrime",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "sharedDecimals",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "symbol",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "token",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalSupply",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "transfer",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "transferFrom",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "bytecode": "0x60c060405234801561000f575f5ffd5b506040516134e03803806134e083398101604081905261002e9161028d565b84848484838360128484818181818d6001600160a01b03811661006f575f604051631e4fbdf760e01b81526004016100669190610322565b60405180910390fd5b61007881610181565b506001600160a01b0380831660805281166100a657604051632d618d8160e21b815260040160405180910390fd5b6080516001600160a01b031663ca5eb5e1826040518263ffffffff1660e01b81526004016100d49190610322565b5f604051808303815f87803b1580156100eb575f5ffd5b505af11580156100fd573d5f5f3e3d5ffd5b50505050505050506101136101d060201b60201c565b60ff168360ff161015610139576040516301e9714b60e41b815260040160405180910390fd5b61014460068461034a565b61014f90600a61044c565b60a0525060089150610163905083826104e5565b50600961017082826104e5565b50505050505050505050505061059f565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600690565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126101f8575f5ffd5b81516001600160401b03811115610211576102116101d5565b604051601f8201601f19908116603f011681016001600160401b038111828210171561023f5761023f6101d5565b604052818152838201602001851015610256575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b80516001600160a01b0381168114610288575f5ffd5b919050565b5f5f5f5f5f60a086880312156102a1575f5ffd5b85516001600160401b038111156102b6575f5ffd5b6102c2888289016101e9565b602088015190965090506001600160401b038111156102df575f5ffd5b6102eb888289016101e9565b9450506102fa60408701610272565b925061030860608701610272565b915061031660808701610272565b90509295509295909350565b6001600160a01b0391909116815260200190565b634e487b7160e01b5f52601160045260245ffd5b60ff828116828216039081111561036357610363610336565b92915050565b6001815b60018411156103a45780850481111561038857610388610336565b600184161561039657908102905b60019390931c92800261036d565b935093915050565b5f826103ba57506001610363565b816103c657505f610363565b81600181146103dc57600281146103e657610402565b6001915050610363565b60ff8411156103f7576103f7610336565b50506001821b610363565b5060208310610133831016604e8410600b8410161715610425575081810a610363565b6104315f198484610369565b805f190482111561044457610444610336565b029392505050565b5f61045a60ff8416836103ac565b9392505050565b600181811c9082168061047557607f821691505b60208210810361049357634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156104e057805f5260205f20601f840160051c810160208510156104be5750805b601f840160051c820191505b818110156104dd575f81556001016104ca565b50505b505050565b81516001600160401b038111156104fe576104fe6101d5565b6105128161050c8454610461565b84610499565b6020601f821160018114610544575f831561052d5750848201515b5f19600385901b1c1916600184901b1784556104dd565b5f84815260208120601f198516915b828110156105735787850151825560209485019460019092019101610553565b508482101561059057868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b60805160a051612eda6106065f395f81816105650152818161192b0152818161199d0152611b8801525f81816104380152818161094301528181610f66015281816112020152818161152401528181611caa01528181611e110152611ec60152612eda5ff3fe6080604052600436106101e0575f3560e01c806306fdde03146101e4578063095ea7b31461020e5780630d35b4151461023d578063111ecdad1461026b57806313137d6514610297578063134d4f25146102ac578063156a0d0f146102d357806317442b70146102f957806318160ddd1461031a5780631f5e13341461033857806323b872dd1461034c578063313ce5671461036b5780633400288b1461038c5780633b6f743b146103ab57806352ae2879146103d75780635535d461146103e95780635a0dfe4d146104085780635e280f11146104275780636fc1b31e1461045a57806370a0823114610479578063715018a6146104ad5780637d25a05e146104c157806382413eac146104fa578063857749b0146105195780638da5cb5b1461052c57806395d89b4114610540578063963efcaa146105545780639f68b96414610587578063a9059cbb14610599578063b731ea0a146105b8578063b98bd070146105d7578063bb0b6a53146105f6578063bc70b35414610621578063bd815db014610640578063c7c7f5b314610653578063ca5eb5e114610674578063d045a0dc14610693578063d4243885146106a6578063dd62ed3e146106c5578063f2fde38b146106e4578063fc0c546a146103d7578063ff7bd03d14610703575b5f5ffd5b3480156101ef575f5ffd5b506101f8610722565b6040516102059190612004565b60405180910390f35b348015610219575f5ffd5b5061022d61022836600461202a565b6107b2565b6040519015158152602001610205565b348015610248575f5ffd5b5061025c61025736600461206a565b6107cb565b604051610205939291906120aa565b348015610276575f5ffd5b5060045461028a906001600160a01b031681565b604051610205919061213a565b6102aa6102a53660046121a2565b610941565b005b3480156102b7575f5ffd5b506102c0600281565b60405161ffff9091168152602001610205565b3480156102de575f5ffd5b506040805162b9270b60e21b81526001602082015201610205565b348015610304575f5ffd5b5060408051600181526002602082015201610205565b348015610325575f5ffd5b506007545b604051908152602001610205565b348015610343575f5ffd5b506102c0600181565b348015610357575f5ffd5b5061022d61036636600461223c565b6109f9565b348015610376575f5ffd5b5060125b60405160ff9091168152602001610205565b348015610397575f5ffd5b506102aa6103a6366004612292565b610a1e565b3480156103b6575f5ffd5b506103ca6103c53660046122b9565b610a34565b6040516102059190612307565b3480156103e2575f5ffd5b503061028a565b3480156103f4575f5ffd5b506101f8610403366004612326565b610a8d565b348015610413575f5ffd5b5061022d610422366004612292565b610b2f565b348015610432575f5ffd5b5061028a7f000000000000000000000000000000000000000000000000000000000000000081565b348015610465575f5ffd5b506102aa610474366004612357565b610b4a565b348015610484575f5ffd5b5061032a610493366004612357565b6001600160a01b03165f9081526005602052604090205490565b3480156104b8575f5ffd5b506102aa610ba8565b3480156104cc575f5ffd5b506104e26104db366004612292565b5f92915050565b6040516001600160401b039091168152602001610205565b348015610505575f5ffd5b5061022d610514366004612372565b610bbb565b348015610524575f5ffd5b50600661037a565b348015610537575f5ffd5b5061028a610bd0565b34801561054b575f5ffd5b506101f8610bde565b34801561055f575f5ffd5b5061032a7f000000000000000000000000000000000000000000000000000000000000000081565b348015610592575f5ffd5b505f61022d565b3480156105a4575f5ffd5b5061022d6105b336600461202a565b610bed565b3480156105c3575f5ffd5b5060025461028a906001600160a01b031681565b3480156105e2575f5ffd5b506102aa6105f1366004612414565b610bfa565b348015610601575f5ffd5b5061032a610610366004612452565b60016020525f908152604090205481565b34801561062c575f5ffd5b506101f861063b36600461246b565b610c14565b6102aa61064e366004612414565b610db5565b6106666106613660046124c7565b610f1f565b60405161020592919061252f565b34801561067f575f5ffd5b506102aa61068e366004612357565b610f47565b6102aa6106a13660046121a2565b610fcb565b3480156106b1575f5ffd5b506102aa6106c0366004612357565b610ffa565b3480156106d0575f5ffd5b5061032a6106df36600461256b565b61104d565b3480156106ef575f5ffd5b506102aa6106fe366004612357565b611077565b34801561070e575f5ffd5b5061022d61071d366004612597565b6110b4565b606060088054610731906125b1565b80601f016020809104026020016040519081016040528092919081815260200182805461075d906125b1565b80156107a85780601f1061077f576101008083540402835291602001916107a8565b820191905f5260205f20905b81548152906001019060200180831161078b57829003601f168201915b5050505050905090565b5f336107bf8185856110e8565b60019150505b92915050565b604080518082019091525f808252602082015260606107e8611f9b565b5f5f90505f306001600160a01b031663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610829573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084d91906125e3565b6001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610888573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ac91906125fe565b604080518082018252848152602080820184905282515f808252918101909352909750919250906108ff565b604080518082019091525f8152606060208201528152602001906001900390816108d85790505b5093505f80610923604089013560608a013561091e60208c018c612452565b6110fa565b60408051808201909152918252602082015296989597505050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461099557336040516391ac5e4f60e01b815260040161098c919061213a565b60405180910390fd5b602087018035906109af906109aa908a612452565b611135565b146109e1576109c16020880188612452565b876020013560405163309afaf360e21b815260040161098c929190612629565b6109f087878787878787611170565b50505050505050565b5f33610a068582856112c7565b610a11858585611318565b60019150505b9392505050565b610a26611375565b610a3082826113a7565b5050565b610a3c611f9b565b5f610a576040850135606086013561091e6020880188612452565b9150505f5f610a6686846113fc565b9092509050610a83610a7b6020880188612452565b83838861151a565b9695505050505050565b600360209081525f928352604080842090915290825290208054610ab0906125b1565b80601f0160208091040260200160405190810160405280929190818152602001828054610adc906125b1565b8015610b275780601f10610afe57610100808354040283529160200191610b27565b820191905f5260205f20905b815481529060010190602001808311610b0a57829003601f168201915b505050505081565b63ffffffff919091165f908152600160205260409020541490565b610b52611375565b600480546001600160a01b0319166001600160a01b0383161790556040517ff0be4f1e87349231d80c36b33f9e8639658eeaf474014dee15a3e6a4d441419790610b9d90839061213a565b60405180910390a150565b610bb0611375565b610bb95f6115ed565b565b6001600160a01b03811630145b949350505050565b5f546001600160a01b031690565b606060098054610731906125b1565b5f336107bf818585611318565b610c02611375565b610a30610c0f82846126df565b61163c565b63ffffffff84165f90815260036020908152604080832061ffff87168452909152812080546060929190610c47906125b1565b80601f0160208091040260200160405190810160405280929190818152602001828054610c73906125b1565b8015610cbe5780601f10610c9557610100808354040283529160200191610cbe565b820191905f5260205f20905b815481529060010190602001808311610ca157829003601f168201915b5050505050905080515f03610d0c5783838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250929450610bc89350505050565b5f839003610d1b579050610bc8565b60028310610d9857610d6184848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061173d92505050565b80610d6f8460028188612800565b604051602001610d819392919061283e565b604051602081830303815290604052915050610bc8565b8383604051639a6d49cd60e01b815260040161098c929190612884565b5f5b81811015610ea25736838383818110610dd257610dd2612897565b9050602002810190610de491906128ab565b9050610e00610df66020830183612452565b6020830135610b2f565b610e0a5750610e9a565b3063d045a0dc60c08301358360a0810135610e296101008301836128ca565b610e3a610100890160e08a01612357565b610e486101208a018a6128ca565b6040518963ffffffff1660e01b8152600401610e6a9796959493929190612920565b5f604051808303818588803b158015610e81575f5ffd5b505af1158015610e93573d5f5f3e3d5ffd5b5050505050505b600101610db7565b50336001600160a01b0316638e9e70996040518163ffffffff1660e01b81526004015f60405180830381865afa158015610ede573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610f0591908101906129a5565b604051638351eea760e01b815260040161098c9190612004565b610f27611fb3565b610f2f611f9b565b610f3a858585611769565b915091505b935093915050565b610f4f611375565b60405163ca5eb5e160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063ca5eb5e190610f9b90849060040161213a565b5f604051808303815f87803b158015610fb2575f5ffd5b505af1158015610fc4573d5f5f3e3d5ffd5b5050505050565b333014610feb5760405163029a949d60e31b815260040160405180910390fd5b6109f0878787878787876109e1565b611002611375565b600280546001600160a01b0319166001600160a01b0383161790556040517fd48d879cef83a1c0bdda516f27b13ddb1b3f8bbac1c9e1511bb2a659c242776090610b9d90839061213a565b6001600160a01b039182165f90815260066020908152604080832093909416825291909152205490565b61107f611375565b6001600160a01b0381166110a8575f604051631e4fbdf760e01b815260040161098c919061213a565b6110b1816115ed565b50565b5f6020820180359060019083906110cb9086612452565b63ffffffff16815260208101919091526040015f20541492915050565b6110f58383836001611856565b505050565b5f5f61110585611928565b915081905083811015610f3f576040516371c4efed60e01b8152600481018290526024810185905260440161098c565b63ffffffff81165f90815260016020526040812054806107c55760405163f6ff4fb760e01b815263ffffffff8416600482015260240161098c565b5f61118161117e878761195e565b90565b90505f6111ac8261119a6111958a8a611975565b611997565b6111a760208d018d612452565b6119cb565b9050602886111561126c575f6111e86111cb60608c0160408d01612a19565b6111d860208d018d612452565b846111e38c8c6119f2565b611a3c565b604051633e5ac80960e11b81529091506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637cb590129061123d9086908d905f908790600401612a34565b5f604051808303815f87803b158015611254575f5ffd5b505af1158015611266573d5f5f3e3d5ffd5b50505050505b6001600160a01b038216887fefed6d3500546b29533b128a29e3a94d70788727f0507505ac12eaf2e578fd9c6112a560208d018d612452565b846040516112b4929190612629565b60405180910390a3505050505050505050565b5f6112d2848461104d565b90505f19811015611312578181101561130457828183604051637dc7a0d960e11b815260040161098c93929190612a64565b61131284848484035f611856565b50505050565b6001600160a01b038316611341575f604051634b637e8f60e11b815260040161098c919061213a565b6001600160a01b03821661136a575f60405163ec442f0560e01b815260040161098c919061213a565b6110f5838383611a6e565b3361137e610bd0565b6001600160a01b031614610bb9573360405163118cdaa760e01b815260040161098c919061213a565b63ffffffff82165f9081526001602052604090819020829055517f238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b906113f09084908490612629565b60405180910390a15050565b6060805f611457856020013561141186611b81565b61141e60a08901896128ca565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250611bda92505050565b90935090505f8161146957600161146c565b60025b905061148c61147e6020880188612452565b8261063b60808a018a6128ca565b6004549093506001600160a01b031680156115105760405163043a78eb60e01b81526001600160a01b0382169063043a78eb906114cf9088908890600401612a85565b602060405180830381865afa1580156114ea573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061150e9190612aa9565b505b5050509250929050565b611522611f9b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ddc28c586040518060a001604052808863ffffffff16815260200161157189611135565b8152602001878152602001868152602001851515815250306040518363ffffffff1660e01b81526004016115a6929190612ac4565b6040805180830381865afa1580156115c0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115e49190612b6b565b95945050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f5b815181101561170d5761166d82828151811061165c5761165c612897565b60200260200101516040015161173d565b81818151811061167f5761167f612897565b60200260200101516040015160035f8484815181106116a0576116a0612897565b60200260200101515f015163ffffffff1663ffffffff1681526020019081526020015f205f8484815181106116d7576116d7612897565b60200260200101516020015161ffff1661ffff1681526020019081526020015f2090816117049190612bc9565b5060010161163e565b507fbe4864a8e820971c0247f5992e2da559595f7bf076a21cb5928d443d2a13b67481604051610b9d9190612c83565b600281015161ffff8116600314610a305781604051639a6d49cd60e01b815260040161098c9190612004565b611771611fb3565b611779611f9b565b5f8061179b33604089013560608a013561179660208c018c612452565b611c54565b915091505f5f6117ab89846113fc565b90925090506117d76117c060208b018b612452565b83836117d1368d90038d018d612d11565b8b611c79565b60408051808201909152858152602080820186905282519298509096503391907f85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a90611825908d018d612452565b6040805163ffffffff909216825260208201899052810187905260600160405180910390a350505050935093915050565b6001600160a01b03841661187f575f60405163e602df0560e01b815260040161098c919061213a565b6001600160a01b0383166118a8575f604051634a1406b160e11b815260040161098c919061213a565b6001600160a01b038085165f908152600660209081526040808320938716835292905220829055801561131257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161191a91815260200190565b60405180910390a350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000006119548184612d56565b6107c59190612d75565b5f61196c6020828486612800565b610a1791612d8c565b5f611984602860208486612800565b61198d91612da9565b60c01c9392505050565b5f6107c57f00000000000000000000000000000000000000000000000000000000000000006001600160401b038416612d75565b5f6001600160a01b0384166119e05761dead93505b6119ea8484611d7f565b509092915050565b6060611a018260288186612800565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250929695505050505050565b606084848484604051602001611a559493929190612de1565b6040516020818303038152906040529050949350505050565b6001600160a01b038316611a98578060075f828254611a8d9190612e1b565b90915550611af59050565b6001600160a01b0383165f9081526005602052604090205481811015611ad75783818360405163391434e360e21b815260040161098c93929190612a64565b6001600160a01b0384165f9081526005602052604090209082900390555b6001600160a01b038216611b1157600780548290039055611b2f565b6001600160a01b0382165f9081526005602052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611b7491815260200190565b60405180910390a3505050565b5f80611bad7f000000000000000000000000000000000000000000000000000000000000000084612d56565b90506001600160401b038111156107c55760405163e2ce941360e01b81526004810182905260240161098c565b8051606090151580611c23578484604051602001611c0f92919091825260c01b6001600160c01b031916602082015260280190565b604051602081830303815290604052611c4a565b84843385604051602001611c3a9493929190612e2e565b6040516020818303038152906040525b9150935093915050565b5f5f611c618585856110fa565b9092509050611c708683611db3565b94509492505050565b611c81611fb3565b5f611c8e845f0151611de7565b602085015190915015611ca857611ca88460200151611e0e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632637a450826040518060a001604052808b63ffffffff168152602001611cf88c611135565b81526020018a81526020018981526020015f8960200151111515815250866040518463ffffffff1660e01b8152600401611d33929190612ac4565b60806040518083038185885af1158015611d4f573d5f5f3e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190611d749190612e5a565b979650505050505050565b6001600160a01b038216611da8575f60405163ec442f0560e01b815260040161098c919061213a565b610a305f8383611a6e565b6001600160a01b038216611ddc575f604051634b637e8f60e11b815260040161098c919061213a565b610a30825f83611a6e565b5f813414611e0a576040516304fb820960e51b815234600482015260240161098c565b5090565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e4fe1d946040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e6b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e8f91906125e3565b90506001600160a01b038116611eb8576040516329b99a9560e11b815260040160405180910390fd5b6040805133602482018190527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0381811660448501526064808501889052855180860390910181526084909401909452602080840180516001600160e01b03166323b872dd60e01b1781528451610a309688169589936113129388935f9283929091839182885af180611f57576040513d5f823e3d81fd5b50505f513d91508115611f6e578060011415611f7b565b6001600160a01b0384163b155b156113125783604051635274afe760e01b815260040161098c919061213a565b60405180604001604052805f81526020015f81525090565b604080516060810182525f8082526020820152908101611fd1611f9b565b905290565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610a176020830184611fd6565b6001600160a01b03811681146110b1575f5ffd5b5f5f6040838503121561203b575f5ffd5b823561204681612016565b946020939093013593505050565b5f60e08284031215612064575f5ffd5b50919050565b5f6020828403121561207a575f5ffd5b81356001600160401b0381111561208f575f5ffd5b610bc884828501612054565b80518252602090810151910152565b5f60a082016120b9838761209b565b60a0604084015280855180835260c08501915060c08160051b8601019250602087015f5b828110156121255760bf19878603018452815180518652602081015190506040602087015261210f6040870182611fd6565b95505060209384019391909101906001016120dd565b5050505080915050610bc8606083018461209b565b6001600160a01b0391909116815260200190565b5f60608284031215612064575f5ffd5b5f5f83601f84011261216e575f5ffd5b5081356001600160401b03811115612184575f5ffd5b60208301915083602082850101111561219b575f5ffd5b9250929050565b5f5f5f5f5f5f5f60e0888a0312156121b8575f5ffd5b6121c2898961214e565b96506060880135955060808801356001600160401b038111156121e3575f5ffd5b6121ef8a828b0161215e565b90965094505060a088013561220381612016565b925060c08801356001600160401b0381111561221d575f5ffd5b6122298a828b0161215e565b989b979a50959850939692959293505050565b5f5f5f6060848603121561224e575f5ffd5b833561225981612016565b9250602084013561226981612016565b929592945050506040919091013590565b803563ffffffff8116811461228d575f5ffd5b919050565b5f5f604083850312156122a3575f5ffd5b6120468361227a565b80151581146110b1575f5ffd5b5f5f604083850312156122ca575f5ffd5b82356001600160401b038111156122df575f5ffd5b6122eb85828601612054565b92505060208301356122fc816122ac565b809150509250929050565b604081016107c5828461209b565b803561ffff8116811461228d575f5ffd5b5f5f60408385031215612337575f5ffd5b6123408361227a565b915061234e60208401612315565b90509250929050565b5f60208284031215612367575f5ffd5b8135610a1781612016565b5f5f5f5f60a08587031215612385575f5ffd5b61238f868661214e565b935060608501356001600160401b038111156123a9575f5ffd5b6123b58782880161215e565b90945092505060808501356123c981612016565b939692955090935050565b5f5f83601f8401126123e4575f5ffd5b5081356001600160401b038111156123fa575f5ffd5b6020830191508360208260051b850101111561219b575f5ffd5b5f5f60208385031215612425575f5ffd5b82356001600160401b0381111561243a575f5ffd5b612446858286016123d4565b90969095509350505050565b5f60208284031215612462575f5ffd5b610a178261227a565b5f5f5f5f6060858703121561247e575f5ffd5b6124878561227a565b935061249560208601612315565b925060408501356001600160401b038111156124af575f5ffd5b6124bb8782880161215e565b95989497509550505050565b5f5f5f83850360808112156124da575f5ffd5b84356001600160401b038111156124ef575f5ffd5b6124fb87828801612054565b9450506040601f198201121561250f575f5ffd5b50602084019150606084013561252481612016565b809150509250925092565b825181526020808401516001600160401b03169082015260408084015160c083019161255d9084018261209b565b50610a17608083018461209b565b5f5f6040838503121561257c575f5ffd5b823561258781612016565b915060208301356122fc81612016565b5f606082840312156125a7575f5ffd5b610a17838361214e565b600181811c908216806125c557607f821691505b60208210810361206457634e487b7160e01b5f52602260045260245ffd5b5f602082840312156125f3575f5ffd5b8151610a1781612016565b5f6020828403121561260e575f5ffd5b5051919050565b634e487b7160e01b5f52604160045260245ffd5b63ffffffff929092168252602082015260400190565b604051606081016001600160401b038111828210171561266157612661612615565b60405290565b604080519081016001600160401b038111828210171561266157612661612615565b604051601f8201601f191681016001600160401b03811182821017156126b1576126b1612615565b604052919050565b5f6001600160401b038211156126d1576126d1612615565b50601f01601f191660200190565b5f6001600160401b038311156126f7576126f7612615565b8260051b61270760208201612689565b8481529083019060208101903683111561271f575f5ffd5b845b838110156127f65780356001600160401b0381111561273e575f5ffd5b86016060368290031215612750575f5ffd5b61275861263f565b6127618261227a565b815261276f60208301612315565b602082015260408201356001600160401b0381111561278c575f5ffd5b919091019036601f83011261279f575f5ffd5b81356127b26127ad826126b9565b612689565b8181523660208386010111156127c6575f5ffd5b816020850160208301375f6020838301015280604084015250508085525050602083019250602081019050612721565b5095945050505050565b5f5f8585111561280e575f5ffd5b8386111561281a575f5ffd5b5050820193919092039150565b5f81518060208401855e5f93019283525090919050565b5f6128498286612827565b838582375f930192835250909392505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b602081525f610bc860208301848661285c565b634e487b7160e01b5f52603260045260245ffd5b5f823561013e198336030181126128c0575f5ffd5b9190910192915050565b5f5f8335601e198436030181126128df575f5ffd5b8301803591506001600160401b038211156128f8575f5ffd5b60200191503681900382131561219b575f5ffd5b6001600160401b03811681146110b1575f5ffd5b63ffffffff61292e8961227a565b168152602088810135908201525f604089013561294a8161290c565b6001600160401b031660408301526060820188905260e060808301819052612975908301878961285c565b6001600160a01b03861660a084015282810360c084015261299781858761285c565b9a9950505050505050505050565b5f602082840312156129b5575f5ffd5b81516001600160401b038111156129ca575f5ffd5b8201601f810184136129da575f5ffd5b80516129e86127ad826126b9565b8181528560208385010111156129fc575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b5f60208284031215612a29575f5ffd5b8135610a178161290c565b60018060a01b038516815283602082015261ffff83166040820152608060608201525f610a836080830184611fd6565b6001600160a01b039390931683526020830191909152604082015260600190565b604081525f612a976040830185611fd6565b82810360208401526115e48185611fd6565b5f60208284031215612ab9575f5ffd5b8151610a17816122ac565b6040815263ffffffff8351166040820152602083015160608201525f604084015160a06080840152612af960e0840182611fd6565b90506060850151603f198483030160a0850152612b168282611fd6565b60809690960151151560c08501525050506001600160a01b039190911660209091015290565b5f60408284031215612b4c575f5ffd5b612b54612667565b825181526020928301519281019290925250919050565b5f60408284031215612b7b575f5ffd5b610a178383612b3c565b601f8211156110f557805f5260205f20601f840160051c81016020851015612baa5750805b601f840160051c820191505b81811015610fc4575f8155600101612bb6565b81516001600160401b03811115612be257612be2612615565b612bf681612bf084546125b1565b84612b85565b6020601f821160018114612c28575f8315612c115750848201515b5f19600385901b1c1916600184901b178455610fc4565b5f84815260208120601f198516915b82811015612c575787850151825560209485019460019092019101612c37565b5084821015612c7457868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015612d0557603f19878603018452815163ffffffff815116865261ffff60208201511660208701526040810151905060606040870152612cef6060870182611fd6565b9550506020938401939190910190600101612ca9565b50929695505050505050565b5f6040828403128015612d22575f5ffd5b50612d2b612667565b823581526020928301359281019290925250919050565b634e487b7160e01b5f52601160045260245ffd5b5f82612d7057634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176107c5576107c5612d42565b803560208310156107c5575f19602084900360031b1b1692915050565b80356001600160c01b03198116906008841015612dda576001600160c01b0319600885900360031b81901b82161691505b5092915050565b60c085901b6001600160c01b031916815260e084901b6001600160e01b0319166008820152600c81018390525f610a83602c830184612827565b808201808211156107c5576107c5612d42565b84815260c084901b6001600160c01b0319166020820152602881018390525f610a836048830184612827565b5f6080828403128015612e6b575f5ffd5b50612e7461263f565b825181526020830151612e868161290c565b6020820152612e988460408501612b3c565b6040820152939250505056fea26469706673582212201c438a480c5ee90c68085c67af2b8693130b8481b58177ab71075404776b480364736f6c634300081c0033",
  "deployedBytecode": "0x6080604052600436106101e0575f3560e01c806306fdde03146101e4578063095ea7b31461020e5780630d35b4151461023d578063111ecdad1461026b57806313137d6514610297578063134d4f25146102ac578063156a0d0f146102d357806317442b70146102f957806318160ddd1461031a5780631f5e13341461033857806323b872dd1461034c578063313ce5671461036b5780633400288b1461038c5780633b6f743b146103ab57806352ae2879146103d75780635535d461146103e95780635a0dfe4d146104085780635e280f11146104275780636fc1b31e1461045a57806370a0823114610479578063715018a6146104ad5780637d25a05e146104c157806382413eac146104fa578063857749b0146105195780638da5cb5b1461052c57806395d89b4114610540578063963efcaa146105545780639f68b96414610587578063a9059cbb14610599578063b731ea0a146105b8578063b98bd070146105d7578063bb0b6a53146105f6578063bc70b35414610621578063bd815db014610640578063c7c7f5b314610653578063ca5eb5e114610674578063d045a0dc14610693578063d4243885146106a6578063dd62ed3e146106c5578063f2fde38b146106e4578063fc0c546a146103d7578063ff7bd03d14610703575b5f5ffd5b3480156101ef575f5ffd5b506101f8610722565b6040516102059190612004565b60405180910390f35b348015610219575f5ffd5b5061022d61022836600461202a565b6107b2565b6040519015158152602001610205565b348015610248575f5ffd5b5061025c61025736600461206a565b6107cb565b604051610205939291906120aa565b348015610276575f5ffd5b5060045461028a906001600160a01b031681565b604051610205919061213a565b6102aa6102a53660046121a2565b610941565b005b3480156102b7575f5ffd5b506102c0600281565b60405161ffff9091168152602001610205565b3480156102de575f5ffd5b506040805162b9270b60e21b81526001602082015201610205565b348015610304575f5ffd5b5060408051600181526002602082015201610205565b348015610325575f5ffd5b506007545b604051908152602001610205565b348015610343575f5ffd5b506102c0600181565b348015610357575f5ffd5b5061022d61036636600461223c565b6109f9565b348015610376575f5ffd5b5060125b60405160ff9091168152602001610205565b348015610397575f5ffd5b506102aa6103a6366004612292565b610a1e565b3480156103b6575f5ffd5b506103ca6103c53660046122b9565b610a34565b6040516102059190612307565b3480156103e2575f5ffd5b503061028a565b3480156103f4575f5ffd5b506101f8610403366004612326565b610a8d565b348015610413575f5ffd5b5061022d610422366004612292565b610b2f565b348015610432575f5ffd5b5061028a7f000000000000000000000000000000000000000000000000000000000000000081565b348015610465575f5ffd5b506102aa610474366004612357565b610b4a565b348015610484575f5ffd5b5061032a610493366004612357565b6001600160a01b03165f9081526005602052604090205490565b3480156104b8575f5ffd5b506102aa610ba8565b3480156104cc575f5ffd5b506104e26104db366004612292565b5f92915050565b6040516001600160401b039091168152602001610205565b348015610505575f5ffd5b5061022d610514366004612372565b610bbb565b348015610524575f5ffd5b50600661037a565b348015610537575f5ffd5b5061028a610bd0565b34801561054b575f5ffd5b506101f8610bde565b34801561055f575f5ffd5b5061032a7f000000000000000000000000000000000000000000000000000000000000000081565b348015610592575f5ffd5b505f61022d565b3480156105a4575f5ffd5b5061022d6105b336600461202a565b610bed565b3480156105c3575f5ffd5b5060025461028a906001600160a01b031681565b3480156105e2575f5ffd5b506102aa6105f1366004612414565b610bfa565b348015610601575f5ffd5b5061032a610610366004612452565b60016020525f908152604090205481565b34801561062c575f5ffd5b506101f861063b36600461246b565b610c14565b6102aa61064e366004612414565b610db5565b6106666106613660046124c7565b610f1f565b60405161020592919061252f565b34801561067f575f5ffd5b506102aa61068e366004612357565b610f47565b6102aa6106a13660046121a2565b610fcb565b3480156106b1575f5ffd5b506102aa6106c0366004612357565b610ffa565b3480156106d0575f5ffd5b5061032a6106df36600461256b565b61104d565b3480156106ef575f5ffd5b506102aa6106fe366004612357565b611077565b34801561070e575f5ffd5b5061022d61071d366004612597565b6110b4565b606060088054610731906125b1565b80601f016020809104026020016040519081016040528092919081815260200182805461075d906125b1565b80156107a85780601f1061077f576101008083540402835291602001916107a8565b820191905f5260205f20905b81548152906001019060200180831161078b57829003601f168201915b5050505050905090565b5f336107bf8185856110e8565b60019150505b92915050565b604080518082019091525f808252602082015260606107e8611f9b565b5f5f90505f306001600160a01b031663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610829573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084d91906125e3565b6001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610888573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ac91906125fe565b604080518082018252848152602080820184905282515f808252918101909352909750919250906108ff565b604080518082019091525f8152606060208201528152602001906001900390816108d85790505b5093505f80610923604089013560608a013561091e60208c018c612452565b6110fa565b60408051808201909152918252602082015296989597505050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461099557336040516391ac5e4f60e01b815260040161098c919061213a565b60405180910390fd5b602087018035906109af906109aa908a612452565b611135565b146109e1576109c16020880188612452565b876020013560405163309afaf360e21b815260040161098c929190612629565b6109f087878787878787611170565b50505050505050565b5f33610a068582856112c7565b610a11858585611318565b60019150505b9392505050565b610a26611375565b610a3082826113a7565b5050565b610a3c611f9b565b5f610a576040850135606086013561091e6020880188612452565b9150505f5f610a6686846113fc565b9092509050610a83610a7b6020880188612452565b83838861151a565b9695505050505050565b600360209081525f928352604080842090915290825290208054610ab0906125b1565b80601f0160208091040260200160405190810160405280929190818152602001828054610adc906125b1565b8015610b275780601f10610afe57610100808354040283529160200191610b27565b820191905f5260205f20905b815481529060010190602001808311610b0a57829003601f168201915b505050505081565b63ffffffff919091165f908152600160205260409020541490565b610b52611375565b600480546001600160a01b0319166001600160a01b0383161790556040517ff0be4f1e87349231d80c36b33f9e8639658eeaf474014dee15a3e6a4d441419790610b9d90839061213a565b60405180910390a150565b610bb0611375565b610bb95f6115ed565b565b6001600160a01b03811630145b949350505050565b5f546001600160a01b031690565b606060098054610731906125b1565b5f336107bf818585611318565b610c02611375565b610a30610c0f82846126df565b61163c565b63ffffffff84165f90815260036020908152604080832061ffff87168452909152812080546060929190610c47906125b1565b80601f0160208091040260200160405190810160405280929190818152602001828054610c73906125b1565b8015610cbe5780601f10610c9557610100808354040283529160200191610cbe565b820191905f5260205f20905b815481529060010190602001808311610ca157829003601f168201915b5050505050905080515f03610d0c5783838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250929450610bc89350505050565b5f839003610d1b579050610bc8565b60028310610d9857610d6184848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061173d92505050565b80610d6f8460028188612800565b604051602001610d819392919061283e565b604051602081830303815290604052915050610bc8565b8383604051639a6d49cd60e01b815260040161098c929190612884565b5f5b81811015610ea25736838383818110610dd257610dd2612897565b9050602002810190610de491906128ab565b9050610e00610df66020830183612452565b6020830135610b2f565b610e0a5750610e9a565b3063d045a0dc60c08301358360a0810135610e296101008301836128ca565b610e3a610100890160e08a01612357565b610e486101208a018a6128ca565b6040518963ffffffff1660e01b8152600401610e6a9796959493929190612920565b5f604051808303818588803b158015610e81575f5ffd5b505af1158015610e93573d5f5f3e3d5ffd5b5050505050505b600101610db7565b50336001600160a01b0316638e9e70996040518163ffffffff1660e01b81526004015f60405180830381865afa158015610ede573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610f0591908101906129a5565b604051638351eea760e01b815260040161098c9190612004565b610f27611fb3565b610f2f611f9b565b610f3a858585611769565b915091505b935093915050565b610f4f611375565b60405163ca5eb5e160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063ca5eb5e190610f9b90849060040161213a565b5f604051808303815f87803b158015610fb2575f5ffd5b505af1158015610fc4573d5f5f3e3d5ffd5b5050505050565b333014610feb5760405163029a949d60e31b815260040160405180910390fd5b6109f0878787878787876109e1565b611002611375565b600280546001600160a01b0319166001600160a01b0383161790556040517fd48d879cef83a1c0bdda516f27b13ddb1b3f8bbac1c9e1511bb2a659c242776090610b9d90839061213a565b6001600160a01b039182165f90815260066020908152604080832093909416825291909152205490565b61107f611375565b6001600160a01b0381166110a8575f604051631e4fbdf760e01b815260040161098c919061213a565b6110b1816115ed565b50565b5f6020820180359060019083906110cb9086612452565b63ffffffff16815260208101919091526040015f20541492915050565b6110f58383836001611856565b505050565b5f5f61110585611928565b915081905083811015610f3f576040516371c4efed60e01b8152600481018290526024810185905260440161098c565b63ffffffff81165f90815260016020526040812054806107c55760405163f6ff4fb760e01b815263ffffffff8416600482015260240161098c565b5f61118161117e878761195e565b90565b90505f6111ac8261119a6111958a8a611975565b611997565b6111a760208d018d612452565b6119cb565b9050602886111561126c575f6111e86111cb60608c0160408d01612a19565b6111d860208d018d612452565b846111e38c8c6119f2565b611a3c565b604051633e5ac80960e11b81529091506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637cb590129061123d9086908d905f908790600401612a34565b5f604051808303815f87803b158015611254575f5ffd5b505af1158015611266573d5f5f3e3d5ffd5b50505050505b6001600160a01b038216887fefed6d3500546b29533b128a29e3a94d70788727f0507505ac12eaf2e578fd9c6112a560208d018d612452565b846040516112b4929190612629565b60405180910390a3505050505050505050565b5f6112d2848461104d565b90505f19811015611312578181101561130457828183604051637dc7a0d960e11b815260040161098c93929190612a64565b61131284848484035f611856565b50505050565b6001600160a01b038316611341575f604051634b637e8f60e11b815260040161098c919061213a565b6001600160a01b03821661136a575f60405163ec442f0560e01b815260040161098c919061213a565b6110f5838383611a6e565b3361137e610bd0565b6001600160a01b031614610bb9573360405163118cdaa760e01b815260040161098c919061213a565b63ffffffff82165f9081526001602052604090819020829055517f238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b906113f09084908490612629565b60405180910390a15050565b6060805f611457856020013561141186611b81565b61141e60a08901896128ca565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250611bda92505050565b90935090505f8161146957600161146c565b60025b905061148c61147e6020880188612452565b8261063b60808a018a6128ca565b6004549093506001600160a01b031680156115105760405163043a78eb60e01b81526001600160a01b0382169063043a78eb906114cf9088908890600401612a85565b602060405180830381865afa1580156114ea573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061150e9190612aa9565b505b5050509250929050565b611522611f9b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ddc28c586040518060a001604052808863ffffffff16815260200161157189611135565b8152602001878152602001868152602001851515815250306040518363ffffffff1660e01b81526004016115a6929190612ac4565b6040805180830381865afa1580156115c0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115e49190612b6b565b95945050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f5b815181101561170d5761166d82828151811061165c5761165c612897565b60200260200101516040015161173d565b81818151811061167f5761167f612897565b60200260200101516040015160035f8484815181106116a0576116a0612897565b60200260200101515f015163ffffffff1663ffffffff1681526020019081526020015f205f8484815181106116d7576116d7612897565b60200260200101516020015161ffff1661ffff1681526020019081526020015f2090816117049190612bc9565b5060010161163e565b507fbe4864a8e820971c0247f5992e2da559595f7bf076a21cb5928d443d2a13b67481604051610b9d9190612c83565b600281015161ffff8116600314610a305781604051639a6d49cd60e01b815260040161098c9190612004565b611771611fb3565b611779611f9b565b5f8061179b33604089013560608a013561179660208c018c612452565b611c54565b915091505f5f6117ab89846113fc565b90925090506117d76117c060208b018b612452565b83836117d1368d90038d018d612d11565b8b611c79565b60408051808201909152858152602080820186905282519298509096503391907f85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a90611825908d018d612452565b6040805163ffffffff909216825260208201899052810187905260600160405180910390a350505050935093915050565b6001600160a01b03841661187f575f60405163e602df0560e01b815260040161098c919061213a565b6001600160a01b0383166118a8575f604051634a1406b160e11b815260040161098c919061213a565b6001600160a01b038085165f908152600660209081526040808320938716835292905220829055801561131257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161191a91815260200190565b60405180910390a350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000006119548184612d56565b6107c59190612d75565b5f61196c6020828486612800565b610a1791612d8c565b5f611984602860208486612800565b61198d91612da9565b60c01c9392505050565b5f6107c57f00000000000000000000000000000000000000000000000000000000000000006001600160401b038416612d75565b5f6001600160a01b0384166119e05761dead93505b6119ea8484611d7f565b509092915050565b6060611a018260288186612800565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250929695505050505050565b606084848484604051602001611a559493929190612de1565b6040516020818303038152906040529050949350505050565b6001600160a01b038316611a98578060075f828254611a8d9190612e1b565b90915550611af59050565b6001600160a01b0383165f9081526005602052604090205481811015611ad75783818360405163391434e360e21b815260040161098c93929190612a64565b6001600160a01b0384165f9081526005602052604090209082900390555b6001600160a01b038216611b1157600780548290039055611b2f565b6001600160a01b0382165f9081526005602052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611b7491815260200190565b60405180910390a3505050565b5f80611bad7f000000000000000000000000000000000000000000000000000000000000000084612d56565b90506001600160401b038111156107c55760405163e2ce941360e01b81526004810182905260240161098c565b8051606090151580611c23578484604051602001611c0f92919091825260c01b6001600160c01b031916602082015260280190565b604051602081830303815290604052611c4a565b84843385604051602001611c3a9493929190612e2e565b6040516020818303038152906040525b9150935093915050565b5f5f611c618585856110fa565b9092509050611c708683611db3565b94509492505050565b611c81611fb3565b5f611c8e845f0151611de7565b602085015190915015611ca857611ca88460200151611e0e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632637a450826040518060a001604052808b63ffffffff168152602001611cf88c611135565b81526020018a81526020018981526020015f8960200151111515815250866040518463ffffffff1660e01b8152600401611d33929190612ac4565b60806040518083038185885af1158015611d4f573d5f5f3e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190611d749190612e5a565b979650505050505050565b6001600160a01b038216611da8575f60405163ec442f0560e01b815260040161098c919061213a565b610a305f8383611a6e565b6001600160a01b038216611ddc575f604051634b637e8f60e11b815260040161098c919061213a565b610a30825f83611a6e565b5f813414611e0a576040516304fb820960e51b815234600482015260240161098c565b5090565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e4fe1d946040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e6b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e8f91906125e3565b90506001600160a01b038116611eb8576040516329b99a9560e11b815260040160405180910390fd5b6040805133602482018190527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0381811660448501526064808501889052855180860390910181526084909401909452602080840180516001600160e01b03166323b872dd60e01b1781528451610a309688169589936113129388935f9283929091839182885af180611f57576040513d5f823e3d81fd5b50505f513d91508115611f6e578060011415611f7b565b6001600160a01b0384163b155b156113125783604051635274afe760e01b815260040161098c919061213a565b60405180604001604052805f81526020015f81525090565b604080516060810182525f8082526020820152908101611fd1611f9b565b905290565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610a176020830184611fd6565b6001600160a01b03811681146110b1575f5ffd5b5f5f6040838503121561203b575f5ffd5b823561204681612016565b946020939093013593505050565b5f60e08284031215612064575f5ffd5b50919050565b5f6020828403121561207a575f5ffd5b81356001600160401b0381111561208f575f5ffd5b610bc884828501612054565b80518252602090810151910152565b5f60a082016120b9838761209b565b60a0604084015280855180835260c08501915060c08160051b8601019250602087015f5b828110156121255760bf19878603018452815180518652602081015190506040602087015261210f6040870182611fd6565b95505060209384019391909101906001016120dd565b5050505080915050610bc8606083018461209b565b6001600160a01b0391909116815260200190565b5f60608284031215612064575f5ffd5b5f5f83601f84011261216e575f5ffd5b5081356001600160401b03811115612184575f5ffd5b60208301915083602082850101111561219b575f5ffd5b9250929050565b5f5f5f5f5f5f5f60e0888a0312156121b8575f5ffd5b6121c2898961214e565b96506060880135955060808801356001600160401b038111156121e3575f5ffd5b6121ef8a828b0161215e565b90965094505060a088013561220381612016565b925060c08801356001600160401b0381111561221d575f5ffd5b6122298a828b0161215e565b989b979a50959850939692959293505050565b5f5f5f6060848603121561224e575f5ffd5b833561225981612016565b9250602084013561226981612016565b929592945050506040919091013590565b803563ffffffff8116811461228d575f5ffd5b919050565b5f5f604083850312156122a3575f5ffd5b6120468361227a565b80151581146110b1575f5ffd5b5f5f604083850312156122ca575f5ffd5b82356001600160401b038111156122df575f5ffd5b6122eb85828601612054565b92505060208301356122fc816122ac565b809150509250929050565b604081016107c5828461209b565b803561ffff8116811461228d575f5ffd5b5f5f60408385031215612337575f5ffd5b6123408361227a565b915061234e60208401612315565b90509250929050565b5f60208284031215612367575f5ffd5b8135610a1781612016565b5f5f5f5f60a08587031215612385575f5ffd5b61238f868661214e565b935060608501356001600160401b038111156123a9575f5ffd5b6123b58782880161215e565b90945092505060808501356123c981612016565b939692955090935050565b5f5f83601f8401126123e4575f5ffd5b5081356001600160401b038111156123fa575f5ffd5b6020830191508360208260051b850101111561219b575f5ffd5b5f5f60208385031215612425575f5ffd5b82356001600160401b0381111561243a575f5ffd5b612446858286016123d4565b90969095509350505050565b5f60208284031215612462575f5ffd5b610a178261227a565b5f5f5f5f6060858703121561247e575f5ffd5b6124878561227a565b935061249560208601612315565b925060408501356001600160401b038111156124af575f5ffd5b6124bb8782880161215e565b95989497509550505050565b5f5f5f83850360808112156124da575f5ffd5b84356001600160401b038111156124ef575f5ffd5b6124fb87828801612054565b9450506040601f198201121561250f575f5ffd5b50602084019150606084013561252481612016565b809150509250925092565b825181526020808401516001600160401b03169082015260408084015160c083019161255d9084018261209b565b50610a17608083018461209b565b5f5f6040838503121561257c575f5ffd5b823561258781612016565b915060208301356122fc81612016565b5f606082840312156125a7575f5ffd5b610a17838361214e565b600181811c908216806125c557607f821691505b60208210810361206457634e487b7160e01b5f52602260045260245ffd5b5f602082840312156125f3575f5ffd5b8151610a1781612016565b5f6020828403121561260e575f5ffd5b5051919050565b634e487b7160e01b5f52604160045260245ffd5b63ffffffff929092168252602082015260400190565b604051606081016001600160401b038111828210171561266157612661612615565b60405290565b604080519081016001600160401b038111828210171561266157612661612615565b604051601f8201601f191681016001600160401b03811182821017156126b1576126b1612615565b604052919050565b5f6001600160401b038211156126d1576126d1612615565b50601f01601f191660200190565b5f6001600160401b038311156126f7576126f7612615565b8260051b61270760208201612689565b8481529083019060208101903683111561271f575f5ffd5b845b838110156127f65780356001600160401b0381111561273e575f5ffd5b86016060368290031215612750575f5ffd5b61275861263f565b6127618261227a565b815261276f60208301612315565b602082015260408201356001600160401b0381111561278c575f5ffd5b919091019036601f83011261279f575f5ffd5b81356127b26127ad826126b9565b612689565b8181523660208386010111156127c6575f5ffd5b816020850160208301375f6020838301015280604084015250508085525050602083019250602081019050612721565b5095945050505050565b5f5f8585111561280e575f5ffd5b8386111561281a575f5ffd5b5050820193919092039150565b5f81518060208401855e5f93019283525090919050565b5f6128498286612827565b838582375f930192835250909392505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b602081525f610bc860208301848661285c565b634e487b7160e01b5f52603260045260245ffd5b5f823561013e198336030181126128c0575f5ffd5b9190910192915050565b5f5f8335601e198436030181126128df575f5ffd5b8301803591506001600160401b038211156128f8575f5ffd5b60200191503681900382131561219b575f5ffd5b6001600160401b03811681146110b1575f5ffd5b63ffffffff61292e8961227a565b168152602088810135908201525f604089013561294a8161290c565b6001600160401b031660408301526060820188905260e060808301819052612975908301878961285c565b6001600160a01b03861660a084015282810360c084015261299781858761285c565b9a9950505050505050505050565b5f602082840312156129b5575f5ffd5b81516001600160401b038111156129ca575f5ffd5b8201601f810184136129da575f5ffd5b80516129e86127ad826126b9565b8181528560208385010111156129fc575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b5f60208284031215612a29575f5ffd5b8135610a178161290c565b60018060a01b038516815283602082015261ffff83166040820152608060608201525f610a836080830184611fd6565b6001600160a01b039390931683526020830191909152604082015260600190565b604081525f612a976040830185611fd6565b82810360208401526115e48185611fd6565b5f60208284031215612ab9575f5ffd5b8151610a17816122ac565b6040815263ffffffff8351166040820152602083015160608201525f604084015160a06080840152612af960e0840182611fd6565b90506060850151603f198483030160a0850152612b168282611fd6565b60809690960151151560c08501525050506001600160a01b039190911660209091015290565b5f60408284031215612b4c575f5ffd5b612b54612667565b825181526020928301519281019290925250919050565b5f60408284031215612b7b575f5ffd5b610a178383612b3c565b601f8211156110f557805f5260205f20601f840160051c81016020851015612baa5750805b601f840160051c820191505b81811015610fc4575f8155600101612bb6565b81516001600160401b03811115612be257612be2612615565b612bf681612bf084546125b1565b84612b85565b6020601f821160018114612c28575f8315612c115750848201515b5f19600385901b1c1916600184901b178455610fc4565b5f84815260208120601f198516915b82811015612c575787850151825560209485019460019092019101612c37565b5084821015612c7457868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015612d0557603f19878603018452815163ffffffff815116865261ffff60208201511660208701526040810151905060606040870152612cef6060870182611fd6565b9550506020938401939190910190600101612ca9565b50929695505050505050565b5f6040828403128015612d22575f5ffd5b50612d2b612667565b823581526020928301359281019290925250919050565b634e487b7160e01b5f52601160045260245ffd5b5f82612d7057634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176107c5576107c5612d42565b803560208310156107c5575f19602084900360031b1b1692915050565b80356001600160c01b03198116906008841015612dda576001600160c01b0319600885900360031b81901b82161691505b5092915050565b60c085901b6001600160c01b031916815260e084901b6001600160e01b0319166008820152600c81018390525f610a83602c830184612827565b808201808211156107c5576107c5612d42565b84815260c084901b6001600160c01b0319166020820152602881018390525f610a836048830184612827565b5f6080828403128015612e6b575f5ffd5b50612e7461263f565b825181526020830151612e868161290c565b6020820152612e988460408501612b3c565b6040820152939250505056fea26469706673582212201c438a480c5ee90c68085c67af2b8693130b8481b58177ab71075404776b480364736f6c634300081c0033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
