{
  "_format": "hh-sol-artifact-1",
  "contractName": "PolicyPool",
  "sourceName": "contracts/PolicyPool.sol",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "contract IERC20Metadata",
          "name": "currency_",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        }
      ],
      "name": "AddressEmptyCode",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ComponentAlreadyInThePool",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "enum PolicyPool.ComponentKind",
          "name": "kind",
          "type": "uint8"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "ComponentInUseCannotRemove",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ComponentMustBeActiveOrDeprecated",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ComponentNotDeprecated",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ComponentNotFound",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ComponentNotFoundOrNotActive",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ComponentNotLinkedToThisPool",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "contract IPolicyPoolComponent",
          "name": "component",
          "type": "address"
        },
        {
          "internalType": "enum PolicyPool.ComponentKind",
          "name": "expectedKind",
          "type": "uint8"
        }
      ],
      "name": "ComponentNotTheRightKind",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "implementation",
          "type": "address"
        }
      ],
      "name": "ERC1967InvalidImplementation",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ERC1967NonPayable",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "ERC721IncorrectOwner",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "ERC721InsufficientApproval",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "approver",
          "type": "address"
        }
      ],
      "name": "ERC721InvalidApprover",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        }
      ],
      "name": "ERC721InvalidOperator",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "ERC721InvalidOwner",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        }
      ],
      "name": "ERC721InvalidReceiver",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "ERC721InvalidSender",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "ERC721NonexistentToken",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "EnforcedPause",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ExpectedPause",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint128",
          "name": "activeExposure",
          "type": "uint128"
        },
        {
          "internalType": "uint128",
          "name": "exposureLimit",
          "type": "uint128"
        }
      ],
      "name": "ExposureLimitExceeded",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "FailedCall",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidComponentStatus",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidInitialization",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes4",
          "name": "response",
          "type": "bytes4"
        }
      ],
      "name": "InvalidNotificationResponse",
      "type": "error"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "id",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "payout",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "jrScr",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "srScr",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "lossProb",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "purePremium",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "ensuroCommission",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "partnerCommission",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "jrCoc",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "srCoc",
              "type": "uint256"
            },
            {
              "internalType": "uint40",
              "name": "start",
              "type": "uint40"
            },
            {
              "internalType": "uint40",
              "name": "expiration",
              "type": "uint40"
            }
          ],
          "internalType": "struct Policy.PolicyData",
          "name": "policyToCancel",
          "type": "tuple"
        },
        {
          "internalType": "uint256",
          "name": "purePremiumRefund",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "jrCocRefund",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "srCocRefund",
          "type": "uint256"
        }
      ],
      "name": "InvalidPolicyCancellation",
      "type": "error"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "id",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "payout",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "jrScr",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "srScr",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "lossProb",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "purePremium",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "ensuroCommission",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "partnerCommission",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "jrCoc",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "srCoc",
              "type": "uint256"
            },
            {
              "internalType": "uint40",
              "name": "start",
              "type": "uint40"
            },
            {
              "internalType": "uint40",
              "name": "expiration",
              "type": "uint40"
            }
          ],
          "internalType": "struct Policy.PolicyData",
          "name": "oldPolicy",
          "type": "tuple"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "id",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "payout",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "jrScr",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "srScr",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "lossProb",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "purePremium",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "ensuroCommission",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "partnerCommission",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "jrCoc",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "srCoc",
              "type": "uint256"
            },
            {
              "internalType": "uint40",
              "name": "start",
              "type": "uint40"
            },
            {
              "internalType": "uint40",
              "name": "expiration",
              "type": "uint40"
            }
          ],
          "internalType": "struct Policy.PolicyData",
          "name": "newPolicy",
          "type": "tuple"
        }
      ],
      "name": "InvalidPolicyReplacement",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        }
      ],
      "name": "InvalidReceiver",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NoEmptyName",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NoEmptySymbol",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NoZeroCurrency",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NoZeroTreasury",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NotInitializing",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "OnlyRiskModuleAllowed",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "payout",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "policyPayout",
          "type": "uint256"
        }
      ],
      "name": "PayoutExceedsLimit",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "policyId",
          "type": "uint256"
        }
      ],
      "name": "PolicyAlreadyExists",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "policyId",
          "type": "uint256"
        }
      ],
      "name": "PolicyAlreadyExpired",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "policyId",
          "type": "uint256"
        },
        {
          "internalType": "uint40",
          "name": "expiration",
          "type": "uint40"
        },
        {
          "internalType": "uint256",
          "name": "now",
          "type": "uint256"
        }
      ],
      "name": "PolicyNotExpired",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "policyId",
          "type": "uint256"
        }
      ],
      "name": "PolicyNotFound",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "bits",
          "type": "uint8"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "SafeCastOverflowedUintDowncast",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "SafeERC20FailedOperation",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "UUPSUnauthorizedCallContext",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "slot",
          "type": "bytes32"
        }
      ],
      "name": "UUPSUnsupportedProxiableUUID",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "UpgradeCannotChangeCurrency",
      "type": "error"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "id",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "payout",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "jrScr",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "srScr",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "lossProb",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "purePremium",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "ensuroCommission",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "partnerCommission",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "jrCoc",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "srCoc",
              "type": "uint256"
            },
            {
              "internalType": "uint40",
              "name": "start",
              "type": "uint40"
            },
            {
              "internalType": "uint40",
              "name": "expiration",
              "type": "uint40"
            }
          ],
          "internalType": "struct Policy.PolicyData",
          "name": "policy",
          "type": "tuple"
        }
      ],
      "name": "ZeroHash",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "approved",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "Approval",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "approved",
          "type": "bool"
        }
      ],
      "name": "ApprovalForAll",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "string",
          "name": "oldBaseURI",
          "type": "string"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "newBaseURI",
          "type": "string"
        }
      ],
      "name": "BaseURIChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "contract IPolicyPoolComponent",
          "name": "component",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "enum PolicyPool.ComponentKind",
          "name": "kind",
          "type": "uint8"
        },
        {
          "indexed": false,
          "internalType": "enum PolicyPool.ComponentStatus",
          "name": "newStatus",
          "type": "uint8"
        }
      ],
      "name": "ComponentStatusChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "contract IEToken",
          "name": "eToken",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "Deposit",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "policyId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "contract IPolicyHolder",
          "name": "holder",
          "type": "address"
        }
      ],
      "name": "ExpirationNotificationFailed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "contract IRiskModule",
          "name": "riskModule",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint128",
          "name": "oldLimit",
          "type": "uint128"
        },
        {
          "indexed": false,
          "internalType": "uint128",
          "name": "newLimit",
          "type": "uint128"
        }
      ],
      "name": "ExposureLimitChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint64",
          "name": "version",
          "type": "uint64"
        }
      ],
      "name": "Initialized",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "contract IRiskModule",
          "name": "riskModule",
          "type": "address"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "id",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "payout",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "jrScr",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "srScr",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "lossProb",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "purePremium",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "ensuroCommission",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "partnerCommission",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "jrCoc",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "srCoc",
              "type": "uint256"
            },
            {
              "internalType": "uint40",
              "name": "start",
              "type": "uint40"
            },
            {
              "internalType": "uint40",
              "name": "expiration",
              "type": "uint40"
            }
          ],
          "indexed": false,
          "internalType": "struct Policy.PolicyData",
          "name": "policy",
          "type": "tuple"
        }
      ],
      "name": "NewPolicy",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "Paused",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "contract IRiskModule",
          "name": "riskModule",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "cancelledPolicyId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "purePremiumRefund",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "jrCocRefund",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "srCocRefund",
          "type": "uint256"
        }
      ],
      "name": "PolicyCancelled",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "contract IRiskModule",
          "name": "riskModule",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "oldPolicyId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "newPolicyId",
          "type": "uint256"
        }
      ],
      "name": "PolicyReplaced",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "contract IRiskModule",
          "name": "riskModule",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "policyId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "payout",
          "type": "uint256"
        }
      ],
      "name": "PolicyResolved",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "Transfer",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "oldTreasury",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "newTreasury",
          "type": "address"
        }
      ],
      "name": "TreasuryChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "Unpaused",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "implementation",
          "type": "address"
        }
      ],
      "name": "Upgraded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "contract IEToken",
          "name": "eToken",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "Withdraw",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "UPGRADE_INTERFACE_VERSION",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IPolicyPoolComponent",
          "name": "component",
          "type": "address"
        },
        {
          "internalType": "enum PolicyPool.ComponentKind",
          "name": "kind",
          "type": "uint8"
        }
      ],
      "name": "addComponent",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "approve",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "balanceOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "id",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "payout",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "jrScr",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "srScr",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "lossProb",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "purePremium",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "ensuroCommission",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "partnerCommission",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "jrCoc",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "srCoc",
              "type": "uint256"
            },
            {
              "internalType": "uint40",
              "name": "start",
              "type": "uint40"
            },
            {
              "internalType": "uint40",
              "name": "expiration",
              "type": "uint40"
            }
          ],
          "internalType": "struct Policy.PolicyData",
          "name": "policyToCancel",
          "type": "tuple"
        },
        {
          "internalType": "uint256",
          "name": "purePremiumRefund",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "jrCocRefund",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "srCocRefund",
          "type": "uint256"
        }
      ],
      "name": "cancelPolicy",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IPolicyPoolComponent",
          "name": "component",
          "type": "address"
        },
        {
          "internalType": "enum PolicyPool.ComponentStatus",
          "name": "newStatus",
          "type": "uint8"
        }
      ],
      "name": "changeComponentStatus",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "currency",
      "outputs": [
        {
          "internalType": "contract IERC20Metadata",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IEToken",
          "name": "eToken",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        }
      ],
      "name": "deposit",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IEToken",
          "name": "eToken",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "deadline",
          "type": "uint256"
        },
        {
          "internalType": "uint8",
          "name": "v",
          "type": "uint8"
        },
        {
          "internalType": "bytes32",
          "name": "r",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "s",
          "type": "bytes32"
        }
      ],
      "name": "depositWithPermit",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "id",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "payout",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "jrScr",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "srScr",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "lossProb",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "purePremium",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "ensuroCommission",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "partnerCommission",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "jrCoc",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "srCoc",
              "type": "uint256"
            },
            {
              "internalType": "uint40",
              "name": "start",
              "type": "uint40"
            },
            {
              "internalType": "uint40",
              "name": "expiration",
              "type": "uint40"
            }
          ],
          "internalType": "struct Policy.PolicyData",
          "name": "policy",
          "type": "tuple"
        }
      ],
      "name": "expirePolicy",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "getApproved",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IPolicyPoolComponent",
          "name": "component",
          "type": "address"
        }
      ],
      "name": "getComponentStatus",
      "outputs": [
        {
          "internalType": "enum PolicyPool.ComponentStatus",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IRiskModule",
          "name": "rm",
          "type": "address"
        }
      ],
      "name": "getExposure",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "active",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "limit",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "policyId",
          "type": "uint256"
        }
      ],
      "name": "getPolicyHash",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "name_",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "symbol_",
          "type": "string"
        },
        {
          "internalType": "address",
          "name": "treasury_",
          "type": "address"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "policyId",
          "type": "uint256"
        }
      ],
      "name": "isActive",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        }
      ],
      "name": "isApprovedForAll",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes[]",
          "name": "data",
          "type": "bytes[]"
        }
      ],
      "name": "multicall",
      "outputs": [
        {
          "internalType": "bytes[]",
          "name": "results",
          "type": "bytes[]"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "name",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "id",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "payout",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "jrScr",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "srScr",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "lossProb",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "purePremium",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "ensuroCommission",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "partnerCommission",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "jrCoc",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "srCoc",
              "type": "uint256"
            },
            {
              "internalType": "uint40",
              "name": "start",
              "type": "uint40"
            },
            {
              "internalType": "uint40",
              "name": "expiration",
              "type": "uint40"
            }
          ],
          "internalType": "struct Policy.PolicyData",
          "name": "policy",
          "type": "tuple"
        },
        {
          "internalType": "address",
          "name": "payer",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "policyHolder",
          "type": "address"
        },
        {
          "internalType": "uint96",
          "name": "internalId",
          "type": "uint96"
        }
      ],
      "name": "newPolicy",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "ownerOf",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "pause",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "paused",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "proxiableUUID",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IPolicyPoolComponent",
          "name": "component",
          "type": "address"
        }
      ],
      "name": "removeComponent",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "id",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "payout",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "jrScr",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "srScr",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "lossProb",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "purePremium",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "ensuroCommission",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "partnerCommission",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "jrCoc",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "srCoc",
              "type": "uint256"
            },
            {
              "internalType": "uint40",
              "name": "start",
              "type": "uint40"
            },
            {
              "internalType": "uint40",
              "name": "expiration",
              "type": "uint40"
            }
          ],
          "internalType": "struct Policy.PolicyData",
          "name": "oldPolicy",
          "type": "tuple"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "id",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "payout",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "jrScr",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "srScr",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "lossProb",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "purePremium",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "ensuroCommission",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "partnerCommission",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "jrCoc",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "srCoc",
              "type": "uint256"
            },
            {
              "internalType": "uint40",
              "name": "start",
              "type": "uint40"
            },
            {
              "internalType": "uint40",
              "name": "expiration",
              "type": "uint40"
            }
          ],
          "internalType": "struct Policy.PolicyData",
          "name": "newPolicy_",
          "type": "tuple"
        },
        {
          "internalType": "address",
          "name": "payer",
          "type": "address"
        },
        {
          "internalType": "uint96",
          "name": "internalId",
          "type": "uint96"
        }
      ],
      "name": "replacePolicy",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "id",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "payout",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "jrScr",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "srScr",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "lossProb",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "purePremium",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "ensuroCommission",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "partnerCommission",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "jrCoc",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "srCoc",
              "type": "uint256"
            },
            {
              "internalType": "uint40",
              "name": "start",
              "type": "uint40"
            },
            {
              "internalType": "uint40",
              "name": "expiration",
              "type": "uint40"
            }
          ],
          "internalType": "struct Policy.PolicyData",
          "name": "policy",
          "type": "tuple"
        },
        {
          "internalType": "uint256",
          "name": "payout",
          "type": "uint256"
        }
      ],
      "name": "resolvePolicy",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "safeTransferFrom",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "safeTransferFrom",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "approved",
          "type": "bool"
        }
      ],
      "name": "setApprovalForAll",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "nftBaseURI_",
          "type": "string"
        }
      ],
      "name": "setBaseURI",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IRiskModule",
          "name": "rm",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "newLimit",
          "type": "uint256"
        }
      ],
      "name": "setExposureLimit",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "treasury_",
          "type": "address"
        }
      ],
      "name": "setTreasury",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes4",
          "name": "interfaceId",
          "type": "bytes4"
        }
      ],
      "name": "supportsInterface",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "symbol",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "tokenURI",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "transferFrom",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "treasury",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "unpause",
      "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"
    },
    {
      "inputs": [
        {
          "internalType": "contract IEToken",
          "name": "eToken",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "withdraw",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "amountWithdrawn",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "bytecode": "0x60c060405230608052348015610013575f5ffd5b5060405161543938038061543983398101604081905261003291610124565b6001600160a01b0381166100595760405163559a03cd60e01b815260040160405180910390fd5b610061610072565b6001600160a01b031660a052610151565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100c25760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101215780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610134575f5ffd5b81516001600160a01b038116811461014a575f5ffd5b9392505050565b60805160a05161527a6101bf5f395f818161075001528181610bb801528181610c6701528181610cb001528181610cef01528181610e19015281816124d101528181612c0c01528181612e29015261377201525f8181612b6d01528181612b960152612d82015261527a5ff3fe60806040526004361061023e575f3560e01c80636f86c89711610134578063ad3cb1cc116100b3578063dfcd412e11610078578063dfcd412e14610723578063e5a6b10f14610742578063e985e9c514610774578063f0f4426014610793578063f45346dc146107b2578063f720bbbf146107d1575f5ffd5b8063ad3cb1cc14610677578063b88d4fde146106a7578063bd644c56146106c6578063c87b56dd146106e5578063de27010a14610704575f5ffd5b806395d89b41116100f957806395d89b411461059b5780639760905e146105af5780639e2d8922146105ce578063a22cb4651461062c578063ac9650d81461064b575f5ffd5b80636f86c897146104f157806370a0823114610510578063792da09e1461052f57806382afd23b1461055a5780638456cb5914610587575f5ffd5b80634f1ef286116101c057806361d027b31161018557806361d027b3146104595780636352211e14610475578063663d8337146104945780636b8734e7146104b35780636f520b73146104d2575f5ffd5b80634f1ef286146103d157806352d1902d146103e457806355f804b3146103f85780635c975abb146104175780635fcbf4451461043a575f5ffd5b80630d100acb116102065780630d100acb1461030e57806323b872dd1461033b57806333d6157a1461035a5780633f4ba83a1461039e57806342842e0e146103b2575f5ffd5b806301ffc9a71461024257806306fdde0314610276578063077f224a14610297578063081812fc146102b8578063095ea7b3146102ef575b5f5ffd5b34801561024d575f5ffd5b5061026161025c366004614285565b6107f0565b60405190151581526020015b60405180910390f35b348015610281575f5ffd5b5061028a61081b565b60405161026d91906142ce565b3480156102a2575f5ffd5b506102b66102b13660046143c0565b6108bc565b005b3480156102c3575f5ffd5b506102d76102d2366004614436565b610a08565b6040516001600160a01b03909116815260200161026d565b3480156102fa575f5ffd5b506102b661030936600461444d565b610a1c565b348015610319575f5ffd5b5061032d61032836600461454d565b610a2b565b60405190815260200161026d565b348015610346575f5ffd5b506102b66103553660046145a7565b610e90565b348015610365575f5ffd5b506103916103743660046145e5565b6001600160a01b03165f9081526001602052604090205460ff1690565b60405161026d9190614630565b3480156103a9575f5ffd5b506102b6610f19565b3480156103bd575f5ffd5b506102b66103cc3660046145a7565b610f23565b6102b66103df366004614643565b610f42565b3480156103ef575f5ffd5b5061032d610f5d565b348015610403575f5ffd5b506102b661041236600461468f565b610f78565b348015610422575f5ffd5b505f5160206152255f395f51905f525460ff16610261565b348015610445575f5ffd5b506102b6610454366004614707565b610fc1565b348015610464575f5ffd5b505f546001600160a01b03166102d7565b348015610480575f5ffd5b506102d761048f366004614436565b6110b4565b34801561049f575f5ffd5b5061032d6104ae36600461474f565b6110be565b3480156104be575f5ffd5b506102b66104cd366004614707565b6115c4565b3480156104dd575f5ffd5b506102b66104ec36600461479d565b611ab9565b3480156104fc575f5ffd5b506102b661050b3660046145e5565b611d06565b34801561051b575f5ffd5b5061032d61052a3660046145e5565b6121b4565b34801561053a575f5ffd5b5061032d610549366004614436565b5f9081526002602052604090205490565b348015610565575f5ffd5b50610261610574366004614436565b5f90815260026020526040902054151590565b348015610592575f5ffd5b506102b661220c565b3480156105a6575f5ffd5b5061028a612214565b3480156105ba575f5ffd5b506102b66105c936600461444d565b612252565b3480156105d9575f5ffd5b506106176105e83660046145e5565b6001600160a01b03165f908152600460205260409020546001600160801b0380821692600160801b9092041690565b6040805192835260208301919091520161026d565b348015610637575f5ffd5b506102b66106463660046147e5565b612331565b348015610656575f5ffd5b5061066a610665366004614811565b61233c565b60405161026d9190614870565b348015610682575f5ffd5b5061028a604051806040016040528060058152602001640352e302e360dc1b81525081565b3480156106b2575f5ffd5b506102b66106c13660046148d3565b612421565b3480156106d1575f5ffd5b506102b66106e036600461493a565b612439565b3480156106f0575f5ffd5b5061028a6106ff366004614436565b61245a565b34801561070f575f5ffd5b506102b661071e366004614965565b6124bf565b34801561072e575f5ffd5b5061032d61073d3660046149d6565b61257d565b34801561074d575f5ffd5b507f00000000000000000000000000000000000000000000000000000000000000006102d7565b34801561077f575f5ffd5b5061026161078e366004614a26565b6126b4565b34801561079e575f5ffd5b506102b66107ad3660046145e5565b612700565b3480156107bd575f5ffd5b506102b66107cc366004614a52565b61270c565b3480156107dc575f5ffd5b506102b66107eb366004614a86565b61271f565b5f6107fa826127a4565b8061081557506001600160e01b0319821663c476978760e01b145b92915050565b5f5160206151e55f395f51905f52805460609190819061083a90614aa1565b80601f016020809104026020016040519081016040528092919081815260200182805461086690614aa1565b80156108b15780601f10610888576101008083540402835291602001916108b1565b820191905f5260205f20905b81548152906001019060200180831161089457829003601f168201915b505050505091505090565b5f6108c56127f3565b805490915060ff600160401b82041615906001600160401b03165f811580156108eb5750825b90505f826001600160401b031660011480156109065750303b155b905081158015610914575080155b156109325760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561095c57845460ff60401b1916600160401b1785555b87515f0361097c57604051620beefb60e01b815260040160405180910390fd5b86515f0361099d576040516343b47bcb60e01b815260040160405180910390fd5b6109a7888861281b565b6109af61282d565b6109b886612835565b83156109fe57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f610a128261283d565b5061081582612874565b610a278282336128ad565b5050565b5f610a346128ba565b33610a408160026128ea565b5f816001600160a01b03166373a952e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a7d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa19190614ad3565b9050610aae8160036128ea565b610ab88285612925565b80885264ffffffffff42166101408901525f9081526002602052604090205487519015610b04576040516315e46fbb60e01b8152600401610afb91815260200190565b60405180910390fd5b50610b0e87612951565b87515f9081526002602090815260408083209390935589518351918201909352908152610b3c9187916129a3565b610b4c82600189602001516129ba565b60405163f79ac18360e01b81526001600160a01b0382169063f79ac18390610b78908a90600401614b85565b5f604051808303815f87803b158015610b8f575f5ffd5b505af1158015610ba1573d5f5f3e3d5ffd5b50505060a0880151610be291506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169088908490612ab1565b5f5f826001600160a01b0316635e4458596040518163ffffffff1660e01b81526004016040805180830381865afa158015610c1f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c439190614b94565b6101208b0151919350915015610c9157610120890151610c91906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016908a908490612ab1565b61010089015115610cda57610100890151610cda906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016908a908590612ab1565b5f5460c08a0151610d1d916001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116928c929190911690612ab1565b5f8960e00151118015610da15750836001600160a01b031663521eb2736040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d67573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d8b9190614ad3565b6001600160a01b0316886001600160a01b031614155b15610e4157610e4188856001600160a01b031663521eb2736040518163ffffffff1660e01b8152600401602060405180830381865afa158015610de6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e0a9190614ad3565b60e08c01516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190612ab1565b836001600160a01b03167f988ac1a1c4820f963124b6fa0394627ad4fa3de7583a76399b998c1d7e43af3f8a604051610e7a9190614b85565b60405180910390a2505095519695505050505050565b6001600160a01b038216610eb957604051633250574960e11b81525f6004820152602401610afb565b5f610ec5838333612ae7565b9050836001600160a01b0316816001600160a01b031614610f13576040516364283d7b60e01b81526001600160a01b0380861660048301526024820184905282166044820152606401610afb565b50505050565b610f21612b03565b565b610f3d83838360405180602001604052805f815250612421565b505050565b610f4a612b62565b610f5382612c06565b610a278282612cbb565b5f610f66612d77565b505f5160206152055f395f51905f5290565b7fc41b7cb64e5be01af4afc2641afc861432136270f4206b7773f229b658b9669960038383604051610fac93929190614be9565b60405180910390a16003610f3d828483614cc9565b6001600160a01b0382165f90815260016020526040812090815460ff166003811115610fef57610fef614600565b0361100d57604051637d91856360e01b815260040160405180910390fd5b5f82600381111561102057611020614600565b0361103e576040516332b409a160e01b815260040160405180910390fd5b80548290829060ff1916600183600381111561105c5761105c614600565b021790555080546040516001600160a01b038516917ffe4c6998a06520b63340a48710b374432cb395da90e4e5360e1ec7aeefebecef916110a791610100900460ff16908690614d82565b60405180910390a2505050565b5f6108158261283d565b5f6110c76128ba565b6110de6110d936879003870187614da8565b612dc0565b33853560601c811461110357604051634ace04f960e01b815260040160405180910390fd5b61110e8160026128ea565b5f816001600160a01b03166373a952e86040518163ffffffff1660e01b8152600401602060405180830381865afa15801561114b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061116f9190614ad3565b905061117c8160036128ea565b64ffffffffff421661119661018089016101608a01614dc3565b64ffffffffff161180156111bd57504264ffffffffff1686610160015164ffffffffff1610155b8735906111e057604051630422552f60e11b8152600401610afb91815260200190565b5085610140015164ffffffffff16876101400160208101906112029190614dc3565b64ffffffffff1614801561121e57508560a001518760a0013511155b801561123257508560c001518760c0013511155b8015611248575085610100015187610100013511155b801561125e575085610120015187610120013511155b801561127257508560e001518760e0013511155b87879091611295576040516301ff548560e61b8152600401610afb929190614e76565b50506112a18285612925565b8087525f90815260026020526040902054865190156112d6576040516315e46fbb60e01b8152600401610afb91815260200190565b506112e086612951565b86515f908152600260205260408120919091556112fd88356110b4565b905061131b81885f015160405180602001604052805f8152506129a3565b87602001358760200151111561134f5761134a8360018a602001358a602001516113459190614ea7565b6129ba565b611368565b611368835f89602001518b602001356113459190614ea7565b87355f908152600260205260408082209190915551636ae360b360e11b81526001600160a01b0383169063d5c6c166906113a8908b908b90600401614e76565b5f604051808303815f87803b1580156113bf575f5ffd5b505af11580156113d1573d5f5f3e3d5ffd5b505050506113e986838960a001518b60a00135612e09565b5f5f836001600160a01b0316635e4458596040518163ffffffff1660e01b81526004016040805180830381865afa158015611426573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061144a9190614b94565b9150915061146488828b61012001518d6101200135612e09565b61147a88838b61010001518d6101000135612e09565b5f5460c0808b015161149d928b926001600160a01b0390911691908e0135612e09565b5f856001600160a01b031663521eb2736040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114da573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114fe9190614ad3565b9050806001600160a01b0316896001600160a01b03161461152d5761152d89828c60e001518e60e00135612e09565b856001600160a01b03167f988ac1a1c4820f963124b6fa0394627ad4fa3de7583a76399b998c1d7e43af3f8b6040516115669190614b85565b60405180910390a289516040518c35906001600160a01b038916907f4ff4ac703cb703b7ea535d47e65e64b4cabf11b3e2eb41f152dab17971953add905f90a489516115b4908c3590612e58565b5050965198975050505050505050565b6001600160a01b0382165f90815260016020526040812090815460ff1660038111156115f2576115f2614600565b146116105760405163cf9a96f360e01b815260040160405180910390fd5b306001600160a01b0316836001600160a01b0316634d15eb036040518163ffffffff1660e01b8152600401602060405180830381865afa158015611656573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061167a9190614ad3565b6001600160a01b0316146116a157604051630fdee24360e11b815260040160405180910390fd5b5f8260038111156116b4576116b4614600565b148061174b575060018260038111156116cf576116cf614600565b14801561174b57506040516301ffc9a760e01b81526001600160a01b038416906301ffc9a79061170a90636d5136b160e11b90600401614eba565b602060405180830381865afa158015611725573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117499190614ecf565b155b806117e15750600382600381111561176557611765614600565b1480156117e157506040516301ffc9a760e01b81526001600160a01b038416906301ffc9a7906117a09063f7e4b01b60e01b90600401614eba565b602060405180830381865afa1580156117bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117df9190614ecf565b155b80611877575060028260038111156117fb576117fb614600565b14801561187757506040516301ffc9a760e01b81526001600160a01b038416906301ffc9a790611836906321b7e09b60e01b90600401614eba565b602060405180830381865afa158015611851573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118759190614ecf565b155b1561189957828260405163502c9a5f60e01b8152600401610afb929190614eea565b8054600160ff198216811783558391839161ffff19909116176101008360038111156118c7576118c7614600565b021790555060038260038111156118e0576118e0614600565b03611a7d575f8390505f816001600160a01b031663536ebbfc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611926573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061194a9190614ad3565b90506001600160a01b038116156119b2576040516338ea38a760e21b81526001600160a01b03838116600483015282169063e3a8e29c906024015f604051808303815f87803b15801561199b575f5ffd5b505af11580156119ad573d5f5f3e3d5ffd5b505050505b816001600160a01b0316637b83037b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119ee573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a129190614ad3565b90506001600160a01b03811615611a7a576040516338ea38a760e21b81526001600160a01b03838116600483015282169063e3a8e29c906024015f604051808303815f87803b158015611a63575f5ffd5b505af1158015611a75573d5f5f3e3d5ffd5b505050505b50505b826001600160a01b03167ffe4c6998a06520b63340a48710b374432cb395da90e4e5360e1ec7aeefebecef8360016040516110a7929190614d82565b611ac16128ba565b611ad36110d936869003860186614da8565b33843560601c8114611af857604051634ace04f960e01b815260040160405180910390fd5b611b03816002612f3f565b5f816001600160a01b03166373a952e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b40573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b649190614ad3565b9050611b71816003612f3f565b64ffffffffff4216611b8b61018088016101608901614dc3565b64ffffffffff1611865f013590611bb857604051630422552f60e11b8152600401610afb91815260200190565b508560a001358511158015611bd257508561010001358411155b8015611be357508561012001358311155b8686868690919293611c0c5760405163a02db78360e01b8152600401610afb9493929190614f03565b505050505f611c1d875f01356110b4565b9050611c2e835f89602001356129ba565b86355f90815260026020526040808220919091555163770fcd3560e11b81526001600160a01b0383169063ee1f9a6a90611c74908a908a908a908a908890600401614f30565b5f604051808303815f87803b158015611c8b575f5ffd5b505af1158015611c9d573d5f5f3e3d5ffd5b50506040805189815260208101899052908101879052893592506001600160a01b03861691507f825c3ee6eecaa4b0dc3573e9732b65613d705cadfc4ba69cc76cb7d9227e59719060600160405180910390a3611cfd8735878787612f9e565b50505050505050565b6001600160a01b0381165f9081526001602052604090206002815460ff166003811115611d3557611d35614600565b14611d5357604051635c92b23960e11b815260040160405180910390fd5b60018154610100900460ff166003811115611d7057611d70614600565b03611e6b57816001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611db1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dd59190614f6f565b15611e6657805f0160019054906101000a900460ff16826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e27573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e4b9190614f6f565b604051631d0ec0ab60e01b8152600401610afb929190614f86565b612144565b60028154610100900460ff166003811115611e8857611e88614600565b03611efa576001600160a01b0382165f908152600460205260409020546001600160801b031615611e665780546001600160a01b0383165f90815260046020819052604091829020549151631d0ec0ab60e01b8152610afb93610100900460ff16926001600160801b03169101614f9d565b5f829050806001600160a01b03166326ccbd226040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f3a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f5e9190614f6f565b15611fb057815f0160019054906101000a900460ff16816001600160a01b03166326ccbd226040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e27573d5f5f3e3d5ffd5b5f816001600160a01b031663536ebbfc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fed573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120119190614ad3565b90506001600160a01b03811615612079576040516376c7fc5560e01b81526001600160a01b0383811660048301528216906376c7fc55906024015f604051808303815f87803b158015612062575f5ffd5b505af1158015612074573d5f5f3e3d5ffd5b505050505b816001600160a01b0316637b83037b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120b5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120d99190614ad3565b90506001600160a01b03811615612141576040516376c7fc5560e01b81526001600160a01b0383811660048301528216906376c7fc55906024015f604051808303815f87803b15801561212a575f5ffd5b505af115801561213c573d5f5f3e3d5ffd5b505050505b50505b80546040516001600160a01b038416917ffe4c6998a06520b63340a48710b374432cb395da90e4e5360e1ec7aeefebecef9161218a91610100900460ff16905f90614d82565b60405180910390a2506001600160a01b03165f908152600160205260409020805461ffff19169055565b5f5f5160206151e55f395f51905f526001600160a01b0383166121ec576040516322718ad960e21b81525f6004820152602401610afb565b6001600160a01b039092165f908152600390920160205250604090205490565b610f2161309c565b7f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930180546060915f5160206151e55f395f51905f529161083a90614aa1565b6001600160a01b0382165f90815260046020526040812090612273836130e4565b82549091506001600160801b0390811690829081168211156122bb57604051630ce06d1360e31b81526001600160801b03928316600482015291166024820152604401610afb565b5050815460408051600160801b9092046001600160801b039081168352831660208301526001600160a01b038616917f7e1092696182a6d6922c9583db468951527f21f67f9f2f4911ed3f7bbf02b330910160405180910390a281546001600160801b03918216600160801b0291161790555050565b610a2733838361311b565b604080515f815260208101909152606090826001600160401b03811115612365576123656142e0565b60405190808252806020026020018201604052801561239857816020015b60608152602001906001900390816123835790505b5091505f5b83811015612419576123f4308686848181106123bb576123bb614fc2565b90506020028101906123cd9190614fd6565b856040516020016123e093929190615036565b6040516020818303038152906040526131ca565b83828151811061240657612406614fc2565b602090810291909101015260010161239d565b505092915050565b61242c848484610e90565b610f13338585858561326a565b6124416128ba565b610a2761245336849003840184614da8565b825f613389565b60606124658261283d565b505f61246f61360e565b90505f81511161248d5760405180602001604052805f8152506124b8565b806124978461369e565b6040516020016124a892919061504b565b6040516020818303038152906040525b9392505050565b6124c76128ba565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663d505accf336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604481018990526064810187905260ff8616608482015260a4810185905260c4810184905260e4015f604051808303815f87803b158015612560575f5ffd5b505af1925050508015612571575060015b50611cfd87878761372d565b5f6125866128ba565b826001600160a01b0381166125ba57604051639cfea58360e01b81526001600160a01b039091166004820152602401610afb565b506125c6856001612f3f565b6001600160a01b0385166323e103a885336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0390811660248301528086166044830152861660648201526084016020604051808303815f875af1158015612631573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126559190614f6f565b90506001600160a01b03831633604080516001600160a01b03868116825260208201869052928316928916917fe826ecb5c03d4897f8ab426ee94064e06179dff39cd9fdd0776904cd935c95d8910160405180910390a4949350505050565b6001600160a01b039182165f9081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793056020908152604080832093909416825291909152205460ff1690565b61270981613878565b50565b6127146128ba565b610f3d83838361372d565b6127276128ba565b4261273a61018083016101608401614dc3565b64ffffffffff16111561278a57803561275b61018083016101608401614dc3565b60405163312bfdd760e11b8152600481019290925264ffffffffff166024820152426044820152606401610afb565b61270961279c36839003830183614da8565b5f6001613389565b5f6001600160e01b031982166380ac58cd60e01b14806127d457506001600160e01b03198216635b5e139f60e01b145b8061081557506301ffc9a760e01b6001600160e01b0319831614610815565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610815565b612823613906565b610a27828261392b565b610f21613906565b612700613906565b5f5f6128488361395b565b90506001600160a01b03811661081557604051637e27328960e01b815260048101849052602401610afb565b5f9081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930460205260409020546001600160a01b031690565b610f3d8383836001613994565b5f5160206152255f395f51905f525460ff1615610f215760405163d93c066560e01b815260040160405180910390fd5b60016128f68383613aa7565b600381111561290757612907614600565b14610a2757604051630422f25f60e01b815260040160405180910390fd5b5f6124b86bffffffffffffffffffffffff83166bffffffffffffffffffffffff19606086901b1661505f565b5f816040516020016129639190614b85565b60408051601f1981840301815291905280516020909101209050818161299d57604051636ee9f64760e01b8152600401610afb9190614b85565b50919050565b6129ad8383613b18565b610f3d335f85858561326a565b6001600160a01b0383165f9081526004602052604090208215612a64576129e0826130e4565b815482905f906129fa9084906001600160801b0316615072565b82546101009290920a6001600160801b0381810219909316918316021790915582548082169250600160801b90041680821115612a5d57604051630ce06d1360e31b81526001600160801b03928316600482015291166024820152604401610afb565b5050610f13565b612a6d826130e4565b815482905f90612a879084906001600160801b0316615091565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555050505050565b612abf848484846001613b79565b610f1357604051635274afe760e01b81526001600160a01b0385166004820152602401610afb565b5f612af06128ba565b612afb848484613be6565b949350505050565b612b0b613ce8565b5f5160206152255f395f51905f52805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a150565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480612be857507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316612bdc5f5160206152055f395f51905f52546001600160a01b031690565b6001600160a01b031614155b15610f215760405163703e46dd60e11b815260040160405180910390fd5b5f8190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c70573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c949190614ad3565b6001600160a01b031614610a27576040516324a41b4360e11b815260040160405180910390fd5b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612d15575060408051601f3d908101601f19168201909252612d1291810190614f6f565b60015b612d3d57604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610afb565b5f5160206152055f395f51905f528114612d6d57604051632a87526960e21b815260048101829052602401610afb565b610f3d8383613d17565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f215760405163703e46dd60e11b815260040160405180910390fd5b805115801590612de6575080515f90815260026020526040902054612de482612951565b145b815190610a27576040516321df5fa560e11b8152600401610afb91815260200190565b5f612e148284614ea7565b90508015612e5157612e516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016868684612ab1565b5050505050565b5f612e62836110b4565b9050612e7581630162fc8560e11b613d6c565b612e7e57505050565b5f6001600160a01b038216635ee0c7dd336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260448101879052606481018690526084016020604051808303815f875af1158015612ee6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f0a91906150b0565b90506001600160e01b03198116635ee0c7dd60e01b14610f1357806040516381784a5160e01b8152600401610afb9190614eba565b5f612f4a8383613aa7565b90506001816003811115612f6057612f60614600565b14158015612f8057506002816003811115612f7d57612f7d614600565b14155b15610f3d5760405163d08ef1ff60e01b815260040160405180910390fd5b5f612fa8856110b4565b9050612fbb81630162fc8560e11b613d6c565b612fc55750610f13565b5f6001600160a01b0382166362eb345e336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260448101899052606481018890526084810187905260a4810186905260c4016020604051808303815f875af115801561303b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061305f91906150b0565b90506001600160e01b031981166331759a2f60e11b1461309457806040516381784a5160e01b8152600401610afb9190614eba565b505050505050565b6130a46128ba565b5f5160206152255f395f51905f52805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833612b44565b5f6001600160801b03821115613117576040516306dfcc6560e41b81526080600482015260248101839052604401610afb565b5090565b5f5160206151e55f395f51905f526001600160a01b03831661315b57604051630b61174360e31b81526001600160a01b0384166004820152602401610afb565b6001600160a01b038481165f818152600584016020908152604080832094881680845294825291829020805460ff191687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a350505050565b60605f6131d78484613d87565b90508080156131f857505f3d11806131f857505f846001600160a01b03163b115b1561320d57613205613d9a565b915050610815565b801561323757604051639996b31560e01b81526001600160a01b0385166004820152602401610afb565b3d1561324a57613245613db3565b613263565b60405163d6bda27560e01b815260040160405180910390fd5b5092915050565b6001600160a01b0383163b15612e5157604051630a85bd0160e11b81526001600160a01b0384169063150b7a02906132ac9088908890879087906004016150cb565b6020604051808303815f875af19250505080156132e6575060408051601f3d908101601f191682019092526132e3918101906150b0565b60015b61334d573d808015613313576040519150601f19603f3d011682016040523d82523d5f602084013e613318565b606091505b5080515f0361334557604051633250574960e11b81526001600160a01b0385166004820152602401610afb565b805160208201fd5b6001600160e01b03198116630a85bd0160e11b1461309457604051633250574960e11b81526001600160a01b0385166004820152602401610afb565b61339283612dc0565b825160601c811580156133ae57506001600160a01b0381163314155b156133cc57604051634ace04f960e01b815260040160405180910390fd5b8215806133e457504284610160015164ffffffffff16115b84519061340757604051630422552f60e11b8152600401610afb91815260200190565b50613413816002612f3f565b6020840151839080821115613444576040516317d3b4f960e01b815260048101929092526024820152604401610afb565b50505f5f841190505f826001600160a01b03166373a952e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015613489573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134ad9190614ad3565b90506134ba816003612f3f565b85515f908152600260205260408120558115613543575f6134dd875f01516110b4565b604051631dda289960e01b81529091506001600160a01b03831690631dda2899906135109084908b908b906004016150fd565b5f604051808303815f87803b158015613527575f5ffd5b505af1158015613539573d5f5f3e3d5ffd5b505050505061359d565b6040516376185ff160e01b81526001600160a01b038216906376185ff19061356f908990600401614b85565b5f604051808303815f87803b158015613586575f5ffd5b505af1158015613598573d5f5f3e3d5ffd5b505050505b6135ac835f88602001516129ba565b85516040518681526001600160a01b038516907f54f4a270ea08f88dc23b2520d6b063fecb24d956c4496f447926d736338f545e9060200160405180910390a384156136035785516135fe9086613dbe565b613094565b855161309490613ea5565b60606003805461361d90614aa1565b80601f016020809104026020016040519081016040528092919081815260200182805461364990614aa1565b80156136945780601f1061366b57610100808354040283529160200191613694565b820191905f5260205f20905b81548152906001019060200180831161367757829003601f168201915b5050505050905090565b60605f6136aa83613f93565b60010190505f816001600160401b038111156136c8576136c86142e0565b6040519080825280601f01601f1916602001820160405280156136f2576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846136fc57509392505050565b806001600160a01b03811661376157604051639cfea58360e01b81526001600160a01b039091166004820152602401610afb565b5061376d8360016128ea565b6137a27f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316338585612ab1565b6001600160a01b038316632e2d298483336040516001600160e01b031960e085901b16815260048101929092526001600160a01b039081166024830152841660448201526064015f604051808303815f87803b158015613800575f5ffd5b505af1158015613812573d5f5f3e3d5ffd5b50505050806001600160a01b03166138273390565b6001600160a01b0316846001600160a01b03167f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a968560405161386b91815260200190565b60405180910390a4505050565b6001600160a01b03811661389f576040516307a2ee8b60e11b815260040160405180910390fd5b5f54604080516001600160a01b03928316815291831660208301527f8c3aa5f43a388513435861bf27dfad7829cd248696fed367c62d441f62954496910160405180910390a15f80546001600160a01b0319166001600160a01b0392909216919091179055565b61390e61406a565b610f2157604051631afcd79f60e31b815260040160405180910390fd5b613933613906565b5f5160206151e55f395f51905f528061394c848261512a565b5060018101610f13838261512a565b5f9081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930260205260409020546001600160a01b031690565b5f5160206151e55f395f51905f5281806139b657506001600160a01b03831615155b15613a77575f6139c58561283d565b90506001600160a01b038416158015906139f15750836001600160a01b0316816001600160a01b031614155b8015613a045750613a0281856126b4565b155b15613a2d5760405163a9fbf51f60e01b81526001600160a01b0385166004820152602401610afb565b8215613a755784866001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b5f93845260040160205250506040902080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0382165f908152600160205260408120826003811115613ad057613ad0614600565b8154610100900460ff166003811115613aeb57613aeb614600565b14613b0d57838360405163502c9a5f60e01b8152600401610afb929190614eea565b5460ff169392505050565b6001600160a01b038216613b4157604051633250574960e11b81525f6004820152602401610afb565b5f613b4d83835f612ae7565b90506001600160a01b03811615610f3d576040516339e3563760e11b81525f6004820152602401610afb565b6040516323b872dd60e01b5f8181526001600160a01b038781166004528616602452604485905291602083606481808c5af1925060015f51148316613bd5578383151615613bc9573d5f823e3d81fd5b5f883b113d1516831692505b604052505f60605295945050505050565b5f5f5160206151e55f395f51905f5281613bff8561395b565b90506001600160a01b03841615613c1b57613c1b818587614083565b6001600160a01b03811615613c5757613c365f865f5f613994565b6001600160a01b0381165f908152600383016020526040902080545f190190555b6001600160a01b03861615613c87576001600160a01b0386165f9081526003830160205260409020805460010190555b5f85815260028301602052604080822080546001600160a01b0319166001600160a01b038a811691821790925591518893918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a495945050505050565b5f5160206152255f395f51905f525460ff16610f2157604051638dfc202b60e01b815260040160405180910390fd5b613d20826140e7565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115613d6457610f3d82826131ca565b610a2761414a565b5f613d7683614169565b80156124b857506124b883836141b4565b5f5f5f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b5f613dc8836110b4565b9050613ddb81630162fc8560e11b613d6c565b613de457505050565b5f6001600160a01b03821663d6281d3e336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260448101879052606481018690526084016020604051808303815f875af1158015613e4c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e7091906150b0565b90506001600160e01b03198116636b140e9f60e11b14610f1357806040516381784a5160e01b8152600401610afb9190614eba565b5f613eaf826110b4565b9050613ec281630162fc8560e11b613d6c565b613eca575050565b6001600160a01b03811663e8e617b7620249f0336040516001600160e01b031960e085901b1681526001600160a01b039091166004820152306024820152604481018690526064016020604051808303815f8887f193505050508015613f4d575060408051601f3d908101601f19168201909252613f4a918101906150b0565b60015b610f3d576040516001600160a01b038216815282907f6ce8016f81523f240956bca9a698e643d09e84e7d0e931470b1016baf1027bd09060200160405180910390a25050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310613fd15772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310613ffd576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061401b57662386f26fc10000830492506010015b6305f5e1008310614033576305f5e100830492506008015b612710831061404757612710830492506004015b60648310614059576064830492506002015b600a83106108155760010192915050565b5f6140736127f3565b54600160401b900460ff16919050565b61408e8383836141d8565b610f3d576001600160a01b0383166140bc57604051637e27328960e01b815260048101829052602401610afb565b60405163177e802f60e01b81526001600160a01b038316600482015260248101829052604401610afb565b806001600160a01b03163b5f0361411c57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610afb565b5f5160206152055f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b3415610f215760405163b398979f60e01b815260040160405180910390fd5b5f61417b826301ffc9a760e01b6141b4565b156141a8575f80614194846001600160e01b031961423c565b91509150818015612afb5750159392505050565b505f919050565b919050565b5f5f5f6141c1858561423c565b915091508180156141cf5750805b95945050505050565b5f6001600160a01b03831615801590612afb5750826001600160a01b0316846001600160a01b03161480614211575061421184846126b4565b80612afb5750826001600160a01b031661422a83612874565b6001600160a01b031614949350505050565b6301ffc9a760e01b5f818152600483905290819060208260248188617530fa92505f511515601f3d11169150509250929050565b6001600160e01b031981168114612709575f5ffd5b5f60208284031215614295575f5ffd5b81356124b881614270565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6124b860208301846142a0565b634e487b7160e01b5f52604160045260245ffd5b60405161018081016001600160401b0381118282101715614317576143176142e0565b60405290565b5f82601f83011261432c575f5ffd5b8135602083015f5f6001600160401b0384111561434b5761434b6142e0565b50604051601f19601f85018116603f011681018181106001600160401b0382111715614379576143796142e0565b604052838152905080828401871015614390575f5ffd5b838360208301375f602085830101528094505050505092915050565b6001600160a01b0381168114612709575f5ffd5b5f5f5f606084860312156143d2575f5ffd5b83356001600160401b038111156143e7575f5ffd5b6143f38682870161431d565b93505060208401356001600160401b0381111561440e575f5ffd5b61441a8682870161431d565b925050604084013561442b816143ac565b809150509250925092565b5f60208284031215614446575f5ffd5b5035919050565b5f5f6040838503121561445e575f5ffd5b8235614469816143ac565b946020939093013593505050565b803564ffffffffff811681146141af575f5ffd5b5f610180828403121561449c575f5ffd5b6144a46142f4565b823581526020808401359082015260408084013590820152606080840135908201526080808401359082015260a0808401359082015260c0808401359082015260e080840135908201526101008084013590820152610120808401359082015290506145136101408301614477565b6101408201526145266101608301614477565b61016082015292915050565b80356bffffffffffffffffffffffff811681146141af575f5ffd5b5f5f5f5f6101e08587031215614561575f5ffd5b61456b868661448b565b935061018085013561457c816143ac565b92506101a085013561458d816143ac565b915061459c6101c08601614532565b905092959194509250565b5f5f5f606084860312156145b9575f5ffd5b83356145c4816143ac565b925060208401356145d4816143ac565b929592945050506040919091013590565b5f602082840312156145f5575f5ffd5b81356124b8816143ac565b634e487b7160e01b5f52602160045260245ffd5b6004811061270957634e487b7160e01b5f52602160045260245ffd5b6020810161463d83614614565b91905290565b5f5f60408385031215614654575f5ffd5b823561465f816143ac565b915060208301356001600160401b03811115614679575f5ffd5b6146858582860161431d565b9150509250929050565b5f5f602083850312156146a0575f5ffd5b82356001600160401b038111156146b5575f5ffd5b8301601f810185136146c5575f5ffd5b80356001600160401b038111156146da575f5ffd5b8560208284010111156146eb575f5ffd5b6020919091019590945092505050565b60048110612709575f5ffd5b5f5f60408385031215614718575f5ffd5b8235614723816143ac565b91506020830135614733816146fb565b809150509250929050565b5f610180828403121561299d575f5ffd5b5f5f5f5f6103408587031215614763575f5ffd5b61476d868661473e565b935061477d86610180870161448b565b925061030085013561478e816143ac565b915061459c6103208601614532565b5f5f5f5f6101e085870312156147b1575f5ffd5b6147bb868661473e565b9661018086013596506101a0860135956101c00135945092505050565b8015158114612709575f5ffd5b5f5f604083850312156147f6575f5ffd5b8235614801816143ac565b91506020830135614733816147d8565b5f5f60208385031215614822575f5ffd5b82356001600160401b03811115614837575f5ffd5b8301601f81018513614847575f5ffd5b80356001600160401b0381111561485c575f5ffd5b8560208260051b84010111156146eb575f5ffd5b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b828110156148c757603f198786030184526148b28583516142a0565b94506020938401939190910190600101614896565b50929695505050505050565b5f5f5f5f608085870312156148e6575f5ffd5b84356148f1816143ac565b93506020850135614901816143ac565b92506040850135915060608501356001600160401b03811115614922575f5ffd5b61492e8782880161431d565b91505092959194509250565b5f5f6101a0838503121561494c575f5ffd5b614956848461473e565b94610180939093013593505050565b5f5f5f5f5f5f5f60e0888a03121561497b575f5ffd5b8735614986816143ac565b965060208801359550604088013561499d816143ac565b945060608801359350608088013560ff811681146149b9575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f5f5f608085870312156149e9575f5ffd5b84356149f4816143ac565b9350602085013592506040850135614a0b816143ac565b91506060850135614a1b816143ac565b939692955090935050565b5f5f60408385031215614a37575f5ffd5b8235614a42816143ac565b91506020830135614733816143ac565b5f5f5f60608486031215614a64575f5ffd5b8335614a6f816143ac565b925060208401359150604084013561442b816143ac565b5f6101808284031215614a97575f5ffd5b6124b8838361473e565b600181811c90821680614ab557607f821691505b60208210810361299d57634e487b7160e01b5f52602260045260245ffd5b5f60208284031215614ae3575f5ffd5b81516124b8816143ac565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e0830152610100810151610100830152610120810151610120830152610140810151614b6a61014084018264ffffffffff169052565b50610160810151610f3d61016084018264ffffffffff169052565b61018081016108158284614aee565b5f5f60408385031215614ba5575f5ffd5b8251614bb0816143ac565b6020840151909250614733816143ac565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b604081525f5f8554614bfa81614aa1565b806040860152600182165f8114614c185760018114614c3457614c65565b60ff1983166060870152606082151560051b8701019350614c65565b885f5260205f205f5b83811015614c5c57815488820160600152600190910190602001614c3d565b87016060019450505b5050508281036020840152614c7b818587614bc1565b9695505050505050565b601f821115610f3d57805f5260205f20601f840160051c81016020851015614caa5750805b601f840160051c820191505b81811015612e51575f8155600101614cb6565b6001600160401b03831115614ce057614ce06142e0565b614cf483614cee8354614aa1565b83614c85565b5f601f841160018114614d25575f8515614d0e5750838201355b5f19600387901b1c1916600186901b178355612e51565b5f83815260208120601f198716915b82811015614d545786850135825560209485019460019092019101614d34565b5086821015614d70575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60408101614d8f84614614565b838252614d9b83614614565b8260208301529392505050565b5f6101808284031215614db9575f5ffd5b6124b8838361448b565b5f60208284031215614dd3575f5ffd5b6124b882614477565b803582526020808201359083015260408082013590830152606080820135908301526080808201359083015260a0808201359083015260c0808201359083015260e0808201359083015261010080820135908301526101208082013590830152614e496101408201614477565b64ffffffffff16610140830152614e636101608201614477565b64ffffffffff8116610160840152505050565b6103008101614e858285614ddc565b6124b8610180830184614aee565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561081557610815614e93565b6001600160e01b031991909116815260200190565b5f60208284031215614edf575f5ffd5b81516124b8816147d8565b6001600160a01b038316815260408101614d9b83614614565b6101e08101614f128287614ddc565b84610180830152836101a0830152826101c083015295945050505050565b6102008101614f3f8288614ddc565b6101808201959095526101a08101939093526101c08301919091526001600160a01b03166101e090910152919050565b5f60208284031215614f7f575f5ffd5b5051919050565b60408101614f9384614614565b9281526020015290565b60408101614faa84614614565b9281526001600160801b039190911660209091015290565b634e487b7160e01b5f52603260045260245ffd5b5f5f8335601e19843603018112614feb575f5ffd5b8301803591506001600160401b03821115615004575f5ffd5b602001915036819003821315615018575f5ffd5b9250929050565b5f81518060208401855e5f93019283525090919050565b828482375f8382015f8152614c7b818561501f565b5f612afb615059838661501f565b8461501f565b8082018082111561081557610815614e93565b6001600160801b03818116838216019081111561081557610815614e93565b6001600160801b03828116828216039081111561081557610815614e93565b5f602082840312156150c0575f5ffd5b81516124b881614270565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f90614c7b908301846142a0565b6001600160a01b03841681526101c0810161511b6020830185614aee565b826101a0830152949350505050565b81516001600160401b03811115615143576151436142e0565b615157816151518454614aa1565b84614c85565b6020601f821160018114615189575f83156151725750848201515b5f19600385901b1c1916600184901b178455612e51565b5f84815260208120601f198516915b828110156151b85787850151825560209485019460019092019101615198565b50848210156151d557868401515f19600387901b60f8161c191681555b50505050600190811b0190555056fe80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab0079300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbccd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300a2646970667358221220f8fa27dd4fdec3476c4de2ae7b218ab3fe38ebf626046f7b0d6d77be94ae28b364736f6c634300081e0033",
  "deployedBytecode": "0x60806040526004361061023e575f3560e01c80636f86c89711610134578063ad3cb1cc116100b3578063dfcd412e11610078578063dfcd412e14610723578063e5a6b10f14610742578063e985e9c514610774578063f0f4426014610793578063f45346dc146107b2578063f720bbbf146107d1575f5ffd5b8063ad3cb1cc14610677578063b88d4fde146106a7578063bd644c56146106c6578063c87b56dd146106e5578063de27010a14610704575f5ffd5b806395d89b41116100f957806395d89b411461059b5780639760905e146105af5780639e2d8922146105ce578063a22cb4651461062c578063ac9650d81461064b575f5ffd5b80636f86c897146104f157806370a0823114610510578063792da09e1461052f57806382afd23b1461055a5780638456cb5914610587575f5ffd5b80634f1ef286116101c057806361d027b31161018557806361d027b3146104595780636352211e14610475578063663d8337146104945780636b8734e7146104b35780636f520b73146104d2575f5ffd5b80634f1ef286146103d157806352d1902d146103e457806355f804b3146103f85780635c975abb146104175780635fcbf4451461043a575f5ffd5b80630d100acb116102065780630d100acb1461030e57806323b872dd1461033b57806333d6157a1461035a5780633f4ba83a1461039e57806342842e0e146103b2575f5ffd5b806301ffc9a71461024257806306fdde0314610276578063077f224a14610297578063081812fc146102b8578063095ea7b3146102ef575b5f5ffd5b34801561024d575f5ffd5b5061026161025c366004614285565b6107f0565b60405190151581526020015b60405180910390f35b348015610281575f5ffd5b5061028a61081b565b60405161026d91906142ce565b3480156102a2575f5ffd5b506102b66102b13660046143c0565b6108bc565b005b3480156102c3575f5ffd5b506102d76102d2366004614436565b610a08565b6040516001600160a01b03909116815260200161026d565b3480156102fa575f5ffd5b506102b661030936600461444d565b610a1c565b348015610319575f5ffd5b5061032d61032836600461454d565b610a2b565b60405190815260200161026d565b348015610346575f5ffd5b506102b66103553660046145a7565b610e90565b348015610365575f5ffd5b506103916103743660046145e5565b6001600160a01b03165f9081526001602052604090205460ff1690565b60405161026d9190614630565b3480156103a9575f5ffd5b506102b6610f19565b3480156103bd575f5ffd5b506102b66103cc3660046145a7565b610f23565b6102b66103df366004614643565b610f42565b3480156103ef575f5ffd5b5061032d610f5d565b348015610403575f5ffd5b506102b661041236600461468f565b610f78565b348015610422575f5ffd5b505f5160206152255f395f51905f525460ff16610261565b348015610445575f5ffd5b506102b6610454366004614707565b610fc1565b348015610464575f5ffd5b505f546001600160a01b03166102d7565b348015610480575f5ffd5b506102d761048f366004614436565b6110b4565b34801561049f575f5ffd5b5061032d6104ae36600461474f565b6110be565b3480156104be575f5ffd5b506102b66104cd366004614707565b6115c4565b3480156104dd575f5ffd5b506102b66104ec36600461479d565b611ab9565b3480156104fc575f5ffd5b506102b661050b3660046145e5565b611d06565b34801561051b575f5ffd5b5061032d61052a3660046145e5565b6121b4565b34801561053a575f5ffd5b5061032d610549366004614436565b5f9081526002602052604090205490565b348015610565575f5ffd5b50610261610574366004614436565b5f90815260026020526040902054151590565b348015610592575f5ffd5b506102b661220c565b3480156105a6575f5ffd5b5061028a612214565b3480156105ba575f5ffd5b506102b66105c936600461444d565b612252565b3480156105d9575f5ffd5b506106176105e83660046145e5565b6001600160a01b03165f908152600460205260409020546001600160801b0380821692600160801b9092041690565b6040805192835260208301919091520161026d565b348015610637575f5ffd5b506102b66106463660046147e5565b612331565b348015610656575f5ffd5b5061066a610665366004614811565b61233c565b60405161026d9190614870565b348015610682575f5ffd5b5061028a604051806040016040528060058152602001640352e302e360dc1b81525081565b3480156106b2575f5ffd5b506102b66106c13660046148d3565b612421565b3480156106d1575f5ffd5b506102b66106e036600461493a565b612439565b3480156106f0575f5ffd5b5061028a6106ff366004614436565b61245a565b34801561070f575f5ffd5b506102b661071e366004614965565b6124bf565b34801561072e575f5ffd5b5061032d61073d3660046149d6565b61257d565b34801561074d575f5ffd5b507f00000000000000000000000000000000000000000000000000000000000000006102d7565b34801561077f575f5ffd5b5061026161078e366004614a26565b6126b4565b34801561079e575f5ffd5b506102b66107ad3660046145e5565b612700565b3480156107bd575f5ffd5b506102b66107cc366004614a52565b61270c565b3480156107dc575f5ffd5b506102b66107eb366004614a86565b61271f565b5f6107fa826127a4565b8061081557506001600160e01b0319821663c476978760e01b145b92915050565b5f5160206151e55f395f51905f52805460609190819061083a90614aa1565b80601f016020809104026020016040519081016040528092919081815260200182805461086690614aa1565b80156108b15780601f10610888576101008083540402835291602001916108b1565b820191905f5260205f20905b81548152906001019060200180831161089457829003601f168201915b505050505091505090565b5f6108c56127f3565b805490915060ff600160401b82041615906001600160401b03165f811580156108eb5750825b90505f826001600160401b031660011480156109065750303b155b905081158015610914575080155b156109325760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561095c57845460ff60401b1916600160401b1785555b87515f0361097c57604051620beefb60e01b815260040160405180910390fd5b86515f0361099d576040516343b47bcb60e01b815260040160405180910390fd5b6109a7888861281b565b6109af61282d565b6109b886612835565b83156109fe57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f610a128261283d565b5061081582612874565b610a278282336128ad565b5050565b5f610a346128ba565b33610a408160026128ea565b5f816001600160a01b03166373a952e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a7d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa19190614ad3565b9050610aae8160036128ea565b610ab88285612925565b80885264ffffffffff42166101408901525f9081526002602052604090205487519015610b04576040516315e46fbb60e01b8152600401610afb91815260200190565b60405180910390fd5b50610b0e87612951565b87515f9081526002602090815260408083209390935589518351918201909352908152610b3c9187916129a3565b610b4c82600189602001516129ba565b60405163f79ac18360e01b81526001600160a01b0382169063f79ac18390610b78908a90600401614b85565b5f604051808303815f87803b158015610b8f575f5ffd5b505af1158015610ba1573d5f5f3e3d5ffd5b50505060a0880151610be291506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169088908490612ab1565b5f5f826001600160a01b0316635e4458596040518163ffffffff1660e01b81526004016040805180830381865afa158015610c1f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c439190614b94565b6101208b0151919350915015610c9157610120890151610c91906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016908a908490612ab1565b61010089015115610cda57610100890151610cda906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016908a908590612ab1565b5f5460c08a0151610d1d916001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116928c929190911690612ab1565b5f8960e00151118015610da15750836001600160a01b031663521eb2736040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d67573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d8b9190614ad3565b6001600160a01b0316886001600160a01b031614155b15610e4157610e4188856001600160a01b031663521eb2736040518163ffffffff1660e01b8152600401602060405180830381865afa158015610de6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e0a9190614ad3565b60e08c01516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190612ab1565b836001600160a01b03167f988ac1a1c4820f963124b6fa0394627ad4fa3de7583a76399b998c1d7e43af3f8a604051610e7a9190614b85565b60405180910390a2505095519695505050505050565b6001600160a01b038216610eb957604051633250574960e11b81525f6004820152602401610afb565b5f610ec5838333612ae7565b9050836001600160a01b0316816001600160a01b031614610f13576040516364283d7b60e01b81526001600160a01b0380861660048301526024820184905282166044820152606401610afb565b50505050565b610f21612b03565b565b610f3d83838360405180602001604052805f815250612421565b505050565b610f4a612b62565b610f5382612c06565b610a278282612cbb565b5f610f66612d77565b505f5160206152055f395f51905f5290565b7fc41b7cb64e5be01af4afc2641afc861432136270f4206b7773f229b658b9669960038383604051610fac93929190614be9565b60405180910390a16003610f3d828483614cc9565b6001600160a01b0382165f90815260016020526040812090815460ff166003811115610fef57610fef614600565b0361100d57604051637d91856360e01b815260040160405180910390fd5b5f82600381111561102057611020614600565b0361103e576040516332b409a160e01b815260040160405180910390fd5b80548290829060ff1916600183600381111561105c5761105c614600565b021790555080546040516001600160a01b038516917ffe4c6998a06520b63340a48710b374432cb395da90e4e5360e1ec7aeefebecef916110a791610100900460ff16908690614d82565b60405180910390a2505050565b5f6108158261283d565b5f6110c76128ba565b6110de6110d936879003870187614da8565b612dc0565b33853560601c811461110357604051634ace04f960e01b815260040160405180910390fd5b61110e8160026128ea565b5f816001600160a01b03166373a952e86040518163ffffffff1660e01b8152600401602060405180830381865afa15801561114b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061116f9190614ad3565b905061117c8160036128ea565b64ffffffffff421661119661018089016101608a01614dc3565b64ffffffffff161180156111bd57504264ffffffffff1686610160015164ffffffffff1610155b8735906111e057604051630422552f60e11b8152600401610afb91815260200190565b5085610140015164ffffffffff16876101400160208101906112029190614dc3565b64ffffffffff1614801561121e57508560a001518760a0013511155b801561123257508560c001518760c0013511155b8015611248575085610100015187610100013511155b801561125e575085610120015187610120013511155b801561127257508560e001518760e0013511155b87879091611295576040516301ff548560e61b8152600401610afb929190614e76565b50506112a18285612925565b8087525f90815260026020526040902054865190156112d6576040516315e46fbb60e01b8152600401610afb91815260200190565b506112e086612951565b86515f908152600260205260408120919091556112fd88356110b4565b905061131b81885f015160405180602001604052805f8152506129a3565b87602001358760200151111561134f5761134a8360018a602001358a602001516113459190614ea7565b6129ba565b611368565b611368835f89602001518b602001356113459190614ea7565b87355f908152600260205260408082209190915551636ae360b360e11b81526001600160a01b0383169063d5c6c166906113a8908b908b90600401614e76565b5f604051808303815f87803b1580156113bf575f5ffd5b505af11580156113d1573d5f5f3e3d5ffd5b505050506113e986838960a001518b60a00135612e09565b5f5f836001600160a01b0316635e4458596040518163ffffffff1660e01b81526004016040805180830381865afa158015611426573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061144a9190614b94565b9150915061146488828b61012001518d6101200135612e09565b61147a88838b61010001518d6101000135612e09565b5f5460c0808b015161149d928b926001600160a01b0390911691908e0135612e09565b5f856001600160a01b031663521eb2736040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114da573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114fe9190614ad3565b9050806001600160a01b0316896001600160a01b03161461152d5761152d89828c60e001518e60e00135612e09565b856001600160a01b03167f988ac1a1c4820f963124b6fa0394627ad4fa3de7583a76399b998c1d7e43af3f8b6040516115669190614b85565b60405180910390a289516040518c35906001600160a01b038916907f4ff4ac703cb703b7ea535d47e65e64b4cabf11b3e2eb41f152dab17971953add905f90a489516115b4908c3590612e58565b5050965198975050505050505050565b6001600160a01b0382165f90815260016020526040812090815460ff1660038111156115f2576115f2614600565b146116105760405163cf9a96f360e01b815260040160405180910390fd5b306001600160a01b0316836001600160a01b0316634d15eb036040518163ffffffff1660e01b8152600401602060405180830381865afa158015611656573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061167a9190614ad3565b6001600160a01b0316146116a157604051630fdee24360e11b815260040160405180910390fd5b5f8260038111156116b4576116b4614600565b148061174b575060018260038111156116cf576116cf614600565b14801561174b57506040516301ffc9a760e01b81526001600160a01b038416906301ffc9a79061170a90636d5136b160e11b90600401614eba565b602060405180830381865afa158015611725573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117499190614ecf565b155b806117e15750600382600381111561176557611765614600565b1480156117e157506040516301ffc9a760e01b81526001600160a01b038416906301ffc9a7906117a09063f7e4b01b60e01b90600401614eba565b602060405180830381865afa1580156117bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117df9190614ecf565b155b80611877575060028260038111156117fb576117fb614600565b14801561187757506040516301ffc9a760e01b81526001600160a01b038416906301ffc9a790611836906321b7e09b60e01b90600401614eba565b602060405180830381865afa158015611851573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118759190614ecf565b155b1561189957828260405163502c9a5f60e01b8152600401610afb929190614eea565b8054600160ff198216811783558391839161ffff19909116176101008360038111156118c7576118c7614600565b021790555060038260038111156118e0576118e0614600565b03611a7d575f8390505f816001600160a01b031663536ebbfc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611926573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061194a9190614ad3565b90506001600160a01b038116156119b2576040516338ea38a760e21b81526001600160a01b03838116600483015282169063e3a8e29c906024015f604051808303815f87803b15801561199b575f5ffd5b505af11580156119ad573d5f5f3e3d5ffd5b505050505b816001600160a01b0316637b83037b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119ee573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a129190614ad3565b90506001600160a01b03811615611a7a576040516338ea38a760e21b81526001600160a01b03838116600483015282169063e3a8e29c906024015f604051808303815f87803b158015611a63575f5ffd5b505af1158015611a75573d5f5f3e3d5ffd5b505050505b50505b826001600160a01b03167ffe4c6998a06520b63340a48710b374432cb395da90e4e5360e1ec7aeefebecef8360016040516110a7929190614d82565b611ac16128ba565b611ad36110d936869003860186614da8565b33843560601c8114611af857604051634ace04f960e01b815260040160405180910390fd5b611b03816002612f3f565b5f816001600160a01b03166373a952e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b40573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b649190614ad3565b9050611b71816003612f3f565b64ffffffffff4216611b8b61018088016101608901614dc3565b64ffffffffff1611865f013590611bb857604051630422552f60e11b8152600401610afb91815260200190565b508560a001358511158015611bd257508561010001358411155b8015611be357508561012001358311155b8686868690919293611c0c5760405163a02db78360e01b8152600401610afb9493929190614f03565b505050505f611c1d875f01356110b4565b9050611c2e835f89602001356129ba565b86355f90815260026020526040808220919091555163770fcd3560e11b81526001600160a01b0383169063ee1f9a6a90611c74908a908a908a908a908890600401614f30565b5f604051808303815f87803b158015611c8b575f5ffd5b505af1158015611c9d573d5f5f3e3d5ffd5b50506040805189815260208101899052908101879052893592506001600160a01b03861691507f825c3ee6eecaa4b0dc3573e9732b65613d705cadfc4ba69cc76cb7d9227e59719060600160405180910390a3611cfd8735878787612f9e565b50505050505050565b6001600160a01b0381165f9081526001602052604090206002815460ff166003811115611d3557611d35614600565b14611d5357604051635c92b23960e11b815260040160405180910390fd5b60018154610100900460ff166003811115611d7057611d70614600565b03611e6b57816001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611db1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dd59190614f6f565b15611e6657805f0160019054906101000a900460ff16826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e27573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e4b9190614f6f565b604051631d0ec0ab60e01b8152600401610afb929190614f86565b612144565b60028154610100900460ff166003811115611e8857611e88614600565b03611efa576001600160a01b0382165f908152600460205260409020546001600160801b031615611e665780546001600160a01b0383165f90815260046020819052604091829020549151631d0ec0ab60e01b8152610afb93610100900460ff16926001600160801b03169101614f9d565b5f829050806001600160a01b03166326ccbd226040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f3a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f5e9190614f6f565b15611fb057815f0160019054906101000a900460ff16816001600160a01b03166326ccbd226040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e27573d5f5f3e3d5ffd5b5f816001600160a01b031663536ebbfc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fed573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120119190614ad3565b90506001600160a01b03811615612079576040516376c7fc5560e01b81526001600160a01b0383811660048301528216906376c7fc55906024015f604051808303815f87803b158015612062575f5ffd5b505af1158015612074573d5f5f3e3d5ffd5b505050505b816001600160a01b0316637b83037b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120b5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120d99190614ad3565b90506001600160a01b03811615612141576040516376c7fc5560e01b81526001600160a01b0383811660048301528216906376c7fc55906024015f604051808303815f87803b15801561212a575f5ffd5b505af115801561213c573d5f5f3e3d5ffd5b505050505b50505b80546040516001600160a01b038416917ffe4c6998a06520b63340a48710b374432cb395da90e4e5360e1ec7aeefebecef9161218a91610100900460ff16905f90614d82565b60405180910390a2506001600160a01b03165f908152600160205260409020805461ffff19169055565b5f5f5160206151e55f395f51905f526001600160a01b0383166121ec576040516322718ad960e21b81525f6004820152602401610afb565b6001600160a01b039092165f908152600390920160205250604090205490565b610f2161309c565b7f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930180546060915f5160206151e55f395f51905f529161083a90614aa1565b6001600160a01b0382165f90815260046020526040812090612273836130e4565b82549091506001600160801b0390811690829081168211156122bb57604051630ce06d1360e31b81526001600160801b03928316600482015291166024820152604401610afb565b5050815460408051600160801b9092046001600160801b039081168352831660208301526001600160a01b038616917f7e1092696182a6d6922c9583db468951527f21f67f9f2f4911ed3f7bbf02b330910160405180910390a281546001600160801b03918216600160801b0291161790555050565b610a2733838361311b565b604080515f815260208101909152606090826001600160401b03811115612365576123656142e0565b60405190808252806020026020018201604052801561239857816020015b60608152602001906001900390816123835790505b5091505f5b83811015612419576123f4308686848181106123bb576123bb614fc2565b90506020028101906123cd9190614fd6565b856040516020016123e093929190615036565b6040516020818303038152906040526131ca565b83828151811061240657612406614fc2565b602090810291909101015260010161239d565b505092915050565b61242c848484610e90565b610f13338585858561326a565b6124416128ba565b610a2761245336849003840184614da8565b825f613389565b60606124658261283d565b505f61246f61360e565b90505f81511161248d5760405180602001604052805f8152506124b8565b806124978461369e565b6040516020016124a892919061504b565b6040516020818303038152906040525b9392505050565b6124c76128ba565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663d505accf336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604481018990526064810187905260ff8616608482015260a4810185905260c4810184905260e4015f604051808303815f87803b158015612560575f5ffd5b505af1925050508015612571575060015b50611cfd87878761372d565b5f6125866128ba565b826001600160a01b0381166125ba57604051639cfea58360e01b81526001600160a01b039091166004820152602401610afb565b506125c6856001612f3f565b6001600160a01b0385166323e103a885336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0390811660248301528086166044830152861660648201526084016020604051808303815f875af1158015612631573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126559190614f6f565b90506001600160a01b03831633604080516001600160a01b03868116825260208201869052928316928916917fe826ecb5c03d4897f8ab426ee94064e06179dff39cd9fdd0776904cd935c95d8910160405180910390a4949350505050565b6001600160a01b039182165f9081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793056020908152604080832093909416825291909152205460ff1690565b61270981613878565b50565b6127146128ba565b610f3d83838361372d565b6127276128ba565b4261273a61018083016101608401614dc3565b64ffffffffff16111561278a57803561275b61018083016101608401614dc3565b60405163312bfdd760e11b8152600481019290925264ffffffffff166024820152426044820152606401610afb565b61270961279c36839003830183614da8565b5f6001613389565b5f6001600160e01b031982166380ac58cd60e01b14806127d457506001600160e01b03198216635b5e139f60e01b145b8061081557506301ffc9a760e01b6001600160e01b0319831614610815565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610815565b612823613906565b610a27828261392b565b610f21613906565b612700613906565b5f5f6128488361395b565b90506001600160a01b03811661081557604051637e27328960e01b815260048101849052602401610afb565b5f9081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930460205260409020546001600160a01b031690565b610f3d8383836001613994565b5f5160206152255f395f51905f525460ff1615610f215760405163d93c066560e01b815260040160405180910390fd5b60016128f68383613aa7565b600381111561290757612907614600565b14610a2757604051630422f25f60e01b815260040160405180910390fd5b5f6124b86bffffffffffffffffffffffff83166bffffffffffffffffffffffff19606086901b1661505f565b5f816040516020016129639190614b85565b60408051601f1981840301815291905280516020909101209050818161299d57604051636ee9f64760e01b8152600401610afb9190614b85565b50919050565b6129ad8383613b18565b610f3d335f85858561326a565b6001600160a01b0383165f9081526004602052604090208215612a64576129e0826130e4565b815482905f906129fa9084906001600160801b0316615072565b82546101009290920a6001600160801b0381810219909316918316021790915582548082169250600160801b90041680821115612a5d57604051630ce06d1360e31b81526001600160801b03928316600482015291166024820152604401610afb565b5050610f13565b612a6d826130e4565b815482905f90612a879084906001600160801b0316615091565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555050505050565b612abf848484846001613b79565b610f1357604051635274afe760e01b81526001600160a01b0385166004820152602401610afb565b5f612af06128ba565b612afb848484613be6565b949350505050565b612b0b613ce8565b5f5160206152255f395f51905f52805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a150565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480612be857507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316612bdc5f5160206152055f395f51905f52546001600160a01b031690565b6001600160a01b031614155b15610f215760405163703e46dd60e11b815260040160405180910390fd5b5f8190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c70573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c949190614ad3565b6001600160a01b031614610a27576040516324a41b4360e11b815260040160405180910390fd5b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612d15575060408051601f3d908101601f19168201909252612d1291810190614f6f565b60015b612d3d57604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610afb565b5f5160206152055f395f51905f528114612d6d57604051632a87526960e21b815260048101829052602401610afb565b610f3d8383613d17565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f215760405163703e46dd60e11b815260040160405180910390fd5b805115801590612de6575080515f90815260026020526040902054612de482612951565b145b815190610a27576040516321df5fa560e11b8152600401610afb91815260200190565b5f612e148284614ea7565b90508015612e5157612e516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016868684612ab1565b5050505050565b5f612e62836110b4565b9050612e7581630162fc8560e11b613d6c565b612e7e57505050565b5f6001600160a01b038216635ee0c7dd336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260448101879052606481018690526084016020604051808303815f875af1158015612ee6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f0a91906150b0565b90506001600160e01b03198116635ee0c7dd60e01b14610f1357806040516381784a5160e01b8152600401610afb9190614eba565b5f612f4a8383613aa7565b90506001816003811115612f6057612f60614600565b14158015612f8057506002816003811115612f7d57612f7d614600565b14155b15610f3d5760405163d08ef1ff60e01b815260040160405180910390fd5b5f612fa8856110b4565b9050612fbb81630162fc8560e11b613d6c565b612fc55750610f13565b5f6001600160a01b0382166362eb345e336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260448101899052606481018890526084810187905260a4810186905260c4016020604051808303815f875af115801561303b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061305f91906150b0565b90506001600160e01b031981166331759a2f60e11b1461309457806040516381784a5160e01b8152600401610afb9190614eba565b505050505050565b6130a46128ba565b5f5160206152255f395f51905f52805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833612b44565b5f6001600160801b03821115613117576040516306dfcc6560e41b81526080600482015260248101839052604401610afb565b5090565b5f5160206151e55f395f51905f526001600160a01b03831661315b57604051630b61174360e31b81526001600160a01b0384166004820152602401610afb565b6001600160a01b038481165f818152600584016020908152604080832094881680845294825291829020805460ff191687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a350505050565b60605f6131d78484613d87565b90508080156131f857505f3d11806131f857505f846001600160a01b03163b115b1561320d57613205613d9a565b915050610815565b801561323757604051639996b31560e01b81526001600160a01b0385166004820152602401610afb565b3d1561324a57613245613db3565b613263565b60405163d6bda27560e01b815260040160405180910390fd5b5092915050565b6001600160a01b0383163b15612e5157604051630a85bd0160e11b81526001600160a01b0384169063150b7a02906132ac9088908890879087906004016150cb565b6020604051808303815f875af19250505080156132e6575060408051601f3d908101601f191682019092526132e3918101906150b0565b60015b61334d573d808015613313576040519150601f19603f3d011682016040523d82523d5f602084013e613318565b606091505b5080515f0361334557604051633250574960e11b81526001600160a01b0385166004820152602401610afb565b805160208201fd5b6001600160e01b03198116630a85bd0160e11b1461309457604051633250574960e11b81526001600160a01b0385166004820152602401610afb565b61339283612dc0565b825160601c811580156133ae57506001600160a01b0381163314155b156133cc57604051634ace04f960e01b815260040160405180910390fd5b8215806133e457504284610160015164ffffffffff16115b84519061340757604051630422552f60e11b8152600401610afb91815260200190565b50613413816002612f3f565b6020840151839080821115613444576040516317d3b4f960e01b815260048101929092526024820152604401610afb565b50505f5f841190505f826001600160a01b03166373a952e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015613489573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134ad9190614ad3565b90506134ba816003612f3f565b85515f908152600260205260408120558115613543575f6134dd875f01516110b4565b604051631dda289960e01b81529091506001600160a01b03831690631dda2899906135109084908b908b906004016150fd565b5f604051808303815f87803b158015613527575f5ffd5b505af1158015613539573d5f5f3e3d5ffd5b505050505061359d565b6040516376185ff160e01b81526001600160a01b038216906376185ff19061356f908990600401614b85565b5f604051808303815f87803b158015613586575f5ffd5b505af1158015613598573d5f5f3e3d5ffd5b505050505b6135ac835f88602001516129ba565b85516040518681526001600160a01b038516907f54f4a270ea08f88dc23b2520d6b063fecb24d956c4496f447926d736338f545e9060200160405180910390a384156136035785516135fe9086613dbe565b613094565b855161309490613ea5565b60606003805461361d90614aa1565b80601f016020809104026020016040519081016040528092919081815260200182805461364990614aa1565b80156136945780601f1061366b57610100808354040283529160200191613694565b820191905f5260205f20905b81548152906001019060200180831161367757829003601f168201915b5050505050905090565b60605f6136aa83613f93565b60010190505f816001600160401b038111156136c8576136c86142e0565b6040519080825280601f01601f1916602001820160405280156136f2576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846136fc57509392505050565b806001600160a01b03811661376157604051639cfea58360e01b81526001600160a01b039091166004820152602401610afb565b5061376d8360016128ea565b6137a27f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316338585612ab1565b6001600160a01b038316632e2d298483336040516001600160e01b031960e085901b16815260048101929092526001600160a01b039081166024830152841660448201526064015f604051808303815f87803b158015613800575f5ffd5b505af1158015613812573d5f5f3e3d5ffd5b50505050806001600160a01b03166138273390565b6001600160a01b0316846001600160a01b03167f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a968560405161386b91815260200190565b60405180910390a4505050565b6001600160a01b03811661389f576040516307a2ee8b60e11b815260040160405180910390fd5b5f54604080516001600160a01b03928316815291831660208301527f8c3aa5f43a388513435861bf27dfad7829cd248696fed367c62d441f62954496910160405180910390a15f80546001600160a01b0319166001600160a01b0392909216919091179055565b61390e61406a565b610f2157604051631afcd79f60e31b815260040160405180910390fd5b613933613906565b5f5160206151e55f395f51905f528061394c848261512a565b5060018101610f13838261512a565b5f9081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930260205260409020546001600160a01b031690565b5f5160206151e55f395f51905f5281806139b657506001600160a01b03831615155b15613a77575f6139c58561283d565b90506001600160a01b038416158015906139f15750836001600160a01b0316816001600160a01b031614155b8015613a045750613a0281856126b4565b155b15613a2d5760405163a9fbf51f60e01b81526001600160a01b0385166004820152602401610afb565b8215613a755784866001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b5f93845260040160205250506040902080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0382165f908152600160205260408120826003811115613ad057613ad0614600565b8154610100900460ff166003811115613aeb57613aeb614600565b14613b0d57838360405163502c9a5f60e01b8152600401610afb929190614eea565b5460ff169392505050565b6001600160a01b038216613b4157604051633250574960e11b81525f6004820152602401610afb565b5f613b4d83835f612ae7565b90506001600160a01b03811615610f3d576040516339e3563760e11b81525f6004820152602401610afb565b6040516323b872dd60e01b5f8181526001600160a01b038781166004528616602452604485905291602083606481808c5af1925060015f51148316613bd5578383151615613bc9573d5f823e3d81fd5b5f883b113d1516831692505b604052505f60605295945050505050565b5f5f5160206151e55f395f51905f5281613bff8561395b565b90506001600160a01b03841615613c1b57613c1b818587614083565b6001600160a01b03811615613c5757613c365f865f5f613994565b6001600160a01b0381165f908152600383016020526040902080545f190190555b6001600160a01b03861615613c87576001600160a01b0386165f9081526003830160205260409020805460010190555b5f85815260028301602052604080822080546001600160a01b0319166001600160a01b038a811691821790925591518893918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a495945050505050565b5f5160206152255f395f51905f525460ff16610f2157604051638dfc202b60e01b815260040160405180910390fd5b613d20826140e7565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115613d6457610f3d82826131ca565b610a2761414a565b5f613d7683614169565b80156124b857506124b883836141b4565b5f5f5f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b5f613dc8836110b4565b9050613ddb81630162fc8560e11b613d6c565b613de457505050565b5f6001600160a01b03821663d6281d3e336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260448101879052606481018690526084016020604051808303815f875af1158015613e4c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e7091906150b0565b90506001600160e01b03198116636b140e9f60e11b14610f1357806040516381784a5160e01b8152600401610afb9190614eba565b5f613eaf826110b4565b9050613ec281630162fc8560e11b613d6c565b613eca575050565b6001600160a01b03811663e8e617b7620249f0336040516001600160e01b031960e085901b1681526001600160a01b039091166004820152306024820152604481018690526064016020604051808303815f8887f193505050508015613f4d575060408051601f3d908101601f19168201909252613f4a918101906150b0565b60015b610f3d576040516001600160a01b038216815282907f6ce8016f81523f240956bca9a698e643d09e84e7d0e931470b1016baf1027bd09060200160405180910390a25050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310613fd15772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310613ffd576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061401b57662386f26fc10000830492506010015b6305f5e1008310614033576305f5e100830492506008015b612710831061404757612710830492506004015b60648310614059576064830492506002015b600a83106108155760010192915050565b5f6140736127f3565b54600160401b900460ff16919050565b61408e8383836141d8565b610f3d576001600160a01b0383166140bc57604051637e27328960e01b815260048101829052602401610afb565b60405163177e802f60e01b81526001600160a01b038316600482015260248101829052604401610afb565b806001600160a01b03163b5f0361411c57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610afb565b5f5160206152055f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b3415610f215760405163b398979f60e01b815260040160405180910390fd5b5f61417b826301ffc9a760e01b6141b4565b156141a8575f80614194846001600160e01b031961423c565b91509150818015612afb5750159392505050565b505f919050565b919050565b5f5f5f6141c1858561423c565b915091508180156141cf5750805b95945050505050565b5f6001600160a01b03831615801590612afb5750826001600160a01b0316846001600160a01b03161480614211575061421184846126b4565b80612afb5750826001600160a01b031661422a83612874565b6001600160a01b031614949350505050565b6301ffc9a760e01b5f818152600483905290819060208260248188617530fa92505f511515601f3d11169150509250929050565b6001600160e01b031981168114612709575f5ffd5b5f60208284031215614295575f5ffd5b81356124b881614270565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6124b860208301846142a0565b634e487b7160e01b5f52604160045260245ffd5b60405161018081016001600160401b0381118282101715614317576143176142e0565b60405290565b5f82601f83011261432c575f5ffd5b8135602083015f5f6001600160401b0384111561434b5761434b6142e0565b50604051601f19601f85018116603f011681018181106001600160401b0382111715614379576143796142e0565b604052838152905080828401871015614390575f5ffd5b838360208301375f602085830101528094505050505092915050565b6001600160a01b0381168114612709575f5ffd5b5f5f5f606084860312156143d2575f5ffd5b83356001600160401b038111156143e7575f5ffd5b6143f38682870161431d565b93505060208401356001600160401b0381111561440e575f5ffd5b61441a8682870161431d565b925050604084013561442b816143ac565b809150509250925092565b5f60208284031215614446575f5ffd5b5035919050565b5f5f6040838503121561445e575f5ffd5b8235614469816143ac565b946020939093013593505050565b803564ffffffffff811681146141af575f5ffd5b5f610180828403121561449c575f5ffd5b6144a46142f4565b823581526020808401359082015260408084013590820152606080840135908201526080808401359082015260a0808401359082015260c0808401359082015260e080840135908201526101008084013590820152610120808401359082015290506145136101408301614477565b6101408201526145266101608301614477565b61016082015292915050565b80356bffffffffffffffffffffffff811681146141af575f5ffd5b5f5f5f5f6101e08587031215614561575f5ffd5b61456b868661448b565b935061018085013561457c816143ac565b92506101a085013561458d816143ac565b915061459c6101c08601614532565b905092959194509250565b5f5f5f606084860312156145b9575f5ffd5b83356145c4816143ac565b925060208401356145d4816143ac565b929592945050506040919091013590565b5f602082840312156145f5575f5ffd5b81356124b8816143ac565b634e487b7160e01b5f52602160045260245ffd5b6004811061270957634e487b7160e01b5f52602160045260245ffd5b6020810161463d83614614565b91905290565b5f5f60408385031215614654575f5ffd5b823561465f816143ac565b915060208301356001600160401b03811115614679575f5ffd5b6146858582860161431d565b9150509250929050565b5f5f602083850312156146a0575f5ffd5b82356001600160401b038111156146b5575f5ffd5b8301601f810185136146c5575f5ffd5b80356001600160401b038111156146da575f5ffd5b8560208284010111156146eb575f5ffd5b6020919091019590945092505050565b60048110612709575f5ffd5b5f5f60408385031215614718575f5ffd5b8235614723816143ac565b91506020830135614733816146fb565b809150509250929050565b5f610180828403121561299d575f5ffd5b5f5f5f5f6103408587031215614763575f5ffd5b61476d868661473e565b935061477d86610180870161448b565b925061030085013561478e816143ac565b915061459c6103208601614532565b5f5f5f5f6101e085870312156147b1575f5ffd5b6147bb868661473e565b9661018086013596506101a0860135956101c00135945092505050565b8015158114612709575f5ffd5b5f5f604083850312156147f6575f5ffd5b8235614801816143ac565b91506020830135614733816147d8565b5f5f60208385031215614822575f5ffd5b82356001600160401b03811115614837575f5ffd5b8301601f81018513614847575f5ffd5b80356001600160401b0381111561485c575f5ffd5b8560208260051b84010111156146eb575f5ffd5b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b828110156148c757603f198786030184526148b28583516142a0565b94506020938401939190910190600101614896565b50929695505050505050565b5f5f5f5f608085870312156148e6575f5ffd5b84356148f1816143ac565b93506020850135614901816143ac565b92506040850135915060608501356001600160401b03811115614922575f5ffd5b61492e8782880161431d565b91505092959194509250565b5f5f6101a0838503121561494c575f5ffd5b614956848461473e565b94610180939093013593505050565b5f5f5f5f5f5f5f60e0888a03121561497b575f5ffd5b8735614986816143ac565b965060208801359550604088013561499d816143ac565b945060608801359350608088013560ff811681146149b9575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f5f5f608085870312156149e9575f5ffd5b84356149f4816143ac565b9350602085013592506040850135614a0b816143ac565b91506060850135614a1b816143ac565b939692955090935050565b5f5f60408385031215614a37575f5ffd5b8235614a42816143ac565b91506020830135614733816143ac565b5f5f5f60608486031215614a64575f5ffd5b8335614a6f816143ac565b925060208401359150604084013561442b816143ac565b5f6101808284031215614a97575f5ffd5b6124b8838361473e565b600181811c90821680614ab557607f821691505b60208210810361299d57634e487b7160e01b5f52602260045260245ffd5b5f60208284031215614ae3575f5ffd5b81516124b8816143ac565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e0830152610100810151610100830152610120810151610120830152610140810151614b6a61014084018264ffffffffff169052565b50610160810151610f3d61016084018264ffffffffff169052565b61018081016108158284614aee565b5f5f60408385031215614ba5575f5ffd5b8251614bb0816143ac565b6020840151909250614733816143ac565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b604081525f5f8554614bfa81614aa1565b806040860152600182165f8114614c185760018114614c3457614c65565b60ff1983166060870152606082151560051b8701019350614c65565b885f5260205f205f5b83811015614c5c57815488820160600152600190910190602001614c3d565b87016060019450505b5050508281036020840152614c7b818587614bc1565b9695505050505050565b601f821115610f3d57805f5260205f20601f840160051c81016020851015614caa5750805b601f840160051c820191505b81811015612e51575f8155600101614cb6565b6001600160401b03831115614ce057614ce06142e0565b614cf483614cee8354614aa1565b83614c85565b5f601f841160018114614d25575f8515614d0e5750838201355b5f19600387901b1c1916600186901b178355612e51565b5f83815260208120601f198716915b82811015614d545786850135825560209485019460019092019101614d34565b5086821015614d70575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60408101614d8f84614614565b838252614d9b83614614565b8260208301529392505050565b5f6101808284031215614db9575f5ffd5b6124b8838361448b565b5f60208284031215614dd3575f5ffd5b6124b882614477565b803582526020808201359083015260408082013590830152606080820135908301526080808201359083015260a0808201359083015260c0808201359083015260e0808201359083015261010080820135908301526101208082013590830152614e496101408201614477565b64ffffffffff16610140830152614e636101608201614477565b64ffffffffff8116610160840152505050565b6103008101614e858285614ddc565b6124b8610180830184614aee565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561081557610815614e93565b6001600160e01b031991909116815260200190565b5f60208284031215614edf575f5ffd5b81516124b8816147d8565b6001600160a01b038316815260408101614d9b83614614565b6101e08101614f128287614ddc565b84610180830152836101a0830152826101c083015295945050505050565b6102008101614f3f8288614ddc565b6101808201959095526101a08101939093526101c08301919091526001600160a01b03166101e090910152919050565b5f60208284031215614f7f575f5ffd5b5051919050565b60408101614f9384614614565b9281526020015290565b60408101614faa84614614565b9281526001600160801b039190911660209091015290565b634e487b7160e01b5f52603260045260245ffd5b5f5f8335601e19843603018112614feb575f5ffd5b8301803591506001600160401b03821115615004575f5ffd5b602001915036819003821315615018575f5ffd5b9250929050565b5f81518060208401855e5f93019283525090919050565b828482375f8382015f8152614c7b818561501f565b5f612afb615059838661501f565b8461501f565b8082018082111561081557610815614e93565b6001600160801b03818116838216019081111561081557610815614e93565b6001600160801b03828116828216039081111561081557610815614e93565b5f602082840312156150c0575f5ffd5b81516124b881614270565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f90614c7b908301846142a0565b6001600160a01b03841681526101c0810161511b6020830185614aee565b826101a0830152949350505050565b81516001600160401b03811115615143576151436142e0565b615157816151518454614aa1565b84614c85565b6020601f821160018114615189575f83156151725750848201515b5f19600385901b1c1916600184901b178455612e51565b5f84815260208120601f198516915b828110156151b85787850151825560209485019460019092019101615198565b50848210156151d557868401515f19600387901b60f8161c191681555b50505050600190811b0190555056fe80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab0079300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbccd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300a2646970667358221220f8fa27dd4fdec3476c4de2ae7b218ab3fe38ebf626046f7b0d6d77be94ae28b364736f6c634300081e0033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
