{
  "_format": "hh-sol-artifact-1",
  "contractName": "CanonicalTransactionChain",
  "sourceName": "contracts/L1/rollup/CanonicalTransactionChain.sol",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_libAddressManager",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_maxTransactionGasLimit",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_l2GasDiscountDivisor",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_enqueueGasCost",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_sender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_index",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bytes27",
          "name": "_globalMetadata",
          "type": "bytes27"
        }
      ],
      "name": "BatchElementDeleted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_sender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "_object",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "bytes27",
          "name": "_globalMetadata",
          "type": "bytes27"
        }
      ],
      "name": "BatchPushed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_sender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_index",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "_object",
          "type": "bytes32"
        }
      ],
      "name": "BatchSetted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_sender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bytes27",
          "name": "_globalMetadata",
          "type": "bytes27"
        }
      ],
      "name": "BatchesGlobalMetadataSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "l2GasDiscountDivisor",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "enqueueGasCost",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "enqueueL2GasPrepaid",
          "type": "uint256"
        }
      ],
      "name": "L2GasParamsUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_startingQueueIndex",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_numQueueElements",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_totalElements",
          "type": "uint256"
        }
      ],
      "name": "QueueBatchAppended",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_sender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_index",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bytes27",
          "name": "_globalMetadata",
          "type": "bytes27"
        }
      ],
      "name": "QueueElementDeleted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_sender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bytes27",
          "name": "_globalMetadata",
          "type": "bytes27"
        }
      ],
      "name": "QueueGlobalMetadataSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_sender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "components": [
            {
              "internalType": "bytes32",
              "name": "transactionHash",
              "type": "bytes32"
            },
            {
              "internalType": "uint40",
              "name": "timestamp",
              "type": "uint40"
            },
            {
              "internalType": "uint40",
              "name": "blockNumber",
              "type": "uint40"
            }
          ],
          "indexed": false,
          "internalType": "struct Lib_OVMCodec.QueueElement",
          "name": "_object",
          "type": "tuple"
        }
      ],
      "name": "QueuePushed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_sender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_index",
          "type": "uint256"
        },
        {
          "components": [
            {
              "internalType": "bytes32",
              "name": "transactionHash",
              "type": "bytes32"
            },
            {
              "internalType": "uint40",
              "name": "timestamp",
              "type": "uint40"
            },
            {
              "internalType": "uint40",
              "name": "blockNumber",
              "type": "uint40"
            }
          ],
          "indexed": false,
          "internalType": "struct Lib_OVMCodec.QueueElement",
          "name": "_object",
          "type": "tuple"
        }
      ],
      "name": "QueueSetted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_startingQueueIndex",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_numQueueElements",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_totalElements",
          "type": "uint256"
        }
      ],
      "name": "SequencerBatchAppended",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "_batchIndex",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "_batchRoot",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_batchSize",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_prevTotalElements",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "_extraData",
          "type": "bytes"
        }
      ],
      "name": "TransactionBatchAppended",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "_l1TxOrigin",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "_target",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_gasLimit",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "_data",
          "type": "bytes"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "_queueIndex",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_timestamp",
          "type": "uint256"
        }
      ],
      "name": "TransactionEnqueued",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "DEFAULT_CHAINID",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "MAX_ROLLUP_TX_SIZE",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "MIN_ROLLUP_TX_GAS",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "appendSequencerBatch",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "appendSequencerBatchByChainId",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "batches",
      "outputs": [
        {
          "internalType": "contract IChainStorageContainer",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_index",
          "type": "uint256"
        },
        {
          "internalType": "bytes27",
          "name": "_globalMetadata",
          "type": "bytes27"
        }
      ],
      "name": "deleteBatchElementsAfterInclusiveByChainId",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_target",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_gasLimit",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "_data",
          "type": "bytes"
        }
      ],
      "name": "enqueue",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_target",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_gasLimit",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "_data",
          "type": "bytes"
        }
      ],
      "name": "enqueueByChainId",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "enqueueGasCost",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "enqueueL2GasPrepaid",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_index",
          "type": "uint256"
        }
      ],
      "name": "getBatchByChainId",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        }
      ],
      "name": "getBatchGlobalMetadataByChainId",
      "outputs": [
        {
          "internalType": "bytes27",
          "name": "",
          "type": "bytes27"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getLastBlockNumber",
      "outputs": [
        {
          "internalType": "uint40",
          "name": "",
          "type": "uint40"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        }
      ],
      "name": "getLastBlockNumberByChainId",
      "outputs": [
        {
          "internalType": "uint40",
          "name": "",
          "type": "uint40"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getLastTimestamp",
      "outputs": [
        {
          "internalType": "uint40",
          "name": "",
          "type": "uint40"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        }
      ],
      "name": "getLastTimestampByChainId",
      "outputs": [
        {
          "internalType": "uint40",
          "name": "",
          "type": "uint40"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getNextQueueIndex",
      "outputs": [
        {
          "internalType": "uint40",
          "name": "",
          "type": "uint40"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        }
      ],
      "name": "getNextQueueIndexByChainId",
      "outputs": [
        {
          "internalType": "uint40",
          "name": "",
          "type": "uint40"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getNumPendingQueueElements",
      "outputs": [
        {
          "internalType": "uint40",
          "name": "",
          "type": "uint40"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        }
      ],
      "name": "getNumPendingQueueElementsByChainId",
      "outputs": [
        {
          "internalType": "uint40",
          "name": "",
          "type": "uint40"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_index",
          "type": "uint256"
        }
      ],
      "name": "getQueueElement",
      "outputs": [
        {
          "components": [
            {
              "internalType": "bytes32",
              "name": "transactionHash",
              "type": "bytes32"
            },
            {
              "internalType": "uint40",
              "name": "timestamp",
              "type": "uint40"
            },
            {
              "internalType": "uint40",
              "name": "blockNumber",
              "type": "uint40"
            }
          ],
          "internalType": "struct Lib_OVMCodec.QueueElement",
          "name": "_element",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_index",
          "type": "uint256"
        }
      ],
      "name": "getQueueElementByChainId",
      "outputs": [
        {
          "components": [
            {
              "internalType": "bytes32",
              "name": "transactionHash",
              "type": "bytes32"
            },
            {
              "internalType": "uint40",
              "name": "timestamp",
              "type": "uint40"
            },
            {
              "internalType": "uint40",
              "name": "blockNumber",
              "type": "uint40"
            }
          ],
          "internalType": "struct Lib_OVMCodec.QueueElement",
          "name": "_element",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getQueueLength",
      "outputs": [
        {
          "internalType": "uint40",
          "name": "",
          "type": "uint40"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        }
      ],
      "name": "getQueueLengthByChainId",
      "outputs": [
        {
          "internalType": "uint40",
          "name": "",
          "type": "uint40"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getTotalBatches",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "_totalBatches",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        }
      ],
      "name": "getTotalBatchesByChainId",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "_totalBatches",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getTotalElements",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "_totalElements",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        }
      ],
      "name": "getTotalElementsByChainId",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "_totalElements",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "l2GasDiscountDivisor",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        }
      ],
      "name": "lengthBatchByChainId",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "libAddressManager",
      "outputs": [
        {
          "internalType": "contract Lib_AddressManager",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "maxTransactionGasLimit",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "internalType": "bytes32",
          "name": "_object",
          "type": "bytes32"
        },
        {
          "internalType": "bytes27",
          "name": "_globalMetadata",
          "type": "bytes27"
        }
      ],
      "name": "pushBatchByChainId",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "components": [
            {
              "internalType": "bytes32",
              "name": "transactionHash",
              "type": "bytes32"
            },
            {
              "internalType": "uint40",
              "name": "timestamp",
              "type": "uint40"
            },
            {
              "internalType": "uint40",
              "name": "blockNumber",
              "type": "uint40"
            }
          ],
          "internalType": "struct Lib_OVMCodec.QueueElement",
          "name": "_object",
          "type": "tuple"
        }
      ],
      "name": "pushQueueByChainId",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "_name",
          "type": "string"
        }
      ],
      "name": "resolve",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_index",
          "type": "uint256"
        },
        {
          "internalType": "bytes32",
          "name": "_object",
          "type": "bytes32"
        }
      ],
      "name": "setBatchByChainId",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "internalType": "bytes27",
          "name": "_globalMetadata",
          "type": "bytes27"
        }
      ],
      "name": "setBatchGlobalMetadataByChainId",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_l2GasDiscountDivisor",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_enqueueGasCost",
          "type": "uint256"
        }
      ],
      "name": "setGasParams",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_index",
          "type": "uint256"
        },
        {
          "components": [
            {
              "internalType": "bytes32",
              "name": "transactionHash",
              "type": "bytes32"
            },
            {
              "internalType": "uint40",
              "name": "timestamp",
              "type": "uint40"
            },
            {
              "internalType": "uint40",
              "name": "blockNumber",
              "type": "uint40"
            }
          ],
          "internalType": "struct Lib_OVMCodec.QueueElement",
          "name": "_object",
          "type": "tuple"
        }
      ],
      "name": "setQueueByChainId",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "bytecode": "0x60806040523480156200001157600080fd5b506040516200360538038062003605833981016040819052620000349162000078565b600080546001600160a01b0319166001600160a01b0386161790556004839055600282905560018190556200006a8183620000c5565b60035550620000f392505050565b600080600080608085870312156200008f57600080fd5b84516001600160a01b0381168114620000a757600080fd5b60208601516040870151606090970151919890975090945092505050565b6000816000190483118215151615620000ee57634e487b7160e01b600052601160045260246000fd5b500290565b61350280620001036000396000f3fe608060405234801561001057600080fd5b50600436106102c85760003560e01c80637a209b931161017b578063b4be51ae116100d8578063db2977221161008c578063e654b1fb11610071578063e654b1fb146105ce578063edcc4a45146105d7578063f722b41a146105ea57600080fd5b8063db297722146105b3578063e561dddc146105c657600080fd5b8063ccf987c8116100bd578063ccf987c81461059a578063cfdf677e146105a3578063d0f89344146105ab57600080fd5b8063b4be51ae14610555578063b8f770051461056857600080fd5b80638d38c6c11161012f578063a14420ee11610114578063a14420ee14610527578063a16d359a1461053a578063a8cda37b1461054d57600080fd5b80638d38c6c11461050b5780639156f18a1461051457600080fd5b8063876ed5cb11610160578063876ed5cb146104ef5780638a52e622146104f85780638c7de742146103c957600080fd5b80637a209b93146104bd5780637aa63a86146104e757600080fd5b8063461a4478116102295780635bbbb7ed116101dd5780636fee07e0116101c25780636fee07e01461046757806378f4b2f21461047a5780637a167a8a1461048457600080fd5b80635bbbb7ed1461044b57806363d5dbd11461045457600080fd5b80634f5da7c61161020e5780634f5da7c61461041d578063511da531146104305780635ae6256d1461044357600080fd5b8063461a4478146103f75780634a0eddab1461040a57600080fd5b8063299ca478116102805780632de6a708116102655780632de6a708146103c957806337899770146103dc57806343be0a84146103e457600080fd5b8063299ca4781461035a5780632a7f18be1461038557600080fd5b806319625535116102b157806319625535146102fe5780632538f3a81461031157806325412c841461034757600080fd5b80630545ba77146102cd5780630b3dfa97146102e2575b600080fd5b6102e06102db366004612c84565b6105f2565b005b6102eb60035481565b6040519081526020015b60405180910390f35b6102e061030c366004612c84565b6107a5565b61033161031f366004612cbd565b60009081526006602052604090205490565b60405164ffffffffff90911681526020016102f5565b6102eb610355366004612cd6565b61094a565b60005461036d906001600160a01b031681565b6040516001600160a01b0390911681526020016102f5565b610398610393366004612cbd565b6109e6565b604080518251815260208084015164ffffffffff9081169183019190915292820151909216908201526060016102f5565b6102eb6103d7366004612cbd565b610a8f565b610331610b0d565b6103316103f2366004612cbd565b610b21565b61036d610405366004612d9d565b610b4c565b610331610418366004612cbd565b610bd7565b6102e061042b366004612dfe565b610bed565b6102e061043e366004612e69565b610d28565b610331611160565b6102eb61044081565b6102e0610462366004612ecc565b611174565b6102e0610475366004612ef8565b61130b565b6102eb620186a081565b61044060005260056020527f0dc7af05b69860904321737f972990978ada95ccab9945c9e4152a2706ab58865464ffffffffff16610331565b6104d06104cb366004612cbd565b61131e565b60405164ffffffffff1990911681526020016102f5565b6102eb611396565b6102eb61c35081565b6102eb610506366004612cbd565b6113b1565b6102eb60045481565b610331610522366004612cbd565b6113ce565b6102e0610535366004612f51565b6113e4565b610398610548366004612cd6565b611586565b6102e0611613565b6102e0610563366004612f81565b611bbd565b61044060005260066020527ff2fadc8f281df3b2e312450efbc7e5145e4214fc70e639a3a1b10148ef5697af54610331565b6102eb60025481565b61036d611ce5565b6102e0611d0d565b6103316105c1366004612cbd565b612243565b6102eb61225a565b6102eb60015481565b6102e06105e5366004612cd6565b6122c5565b6103316123f8565b6106306040518060400160405280601081526020017f4d564d5f53757065724d616e6167657200000000000000000000000000000000815250610b4c565b6001600160a01b0316336001600160a01b0316146106bd576040805162461bcd60e51b81526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b6106c5611ce5565b6040517fbc052576000000000000000000000000000000000000000000000000000000008152600481018590526024810184905264ffffffffff19831660448201526001600160a01b03919091169063bc05257690606401600060405180830381600087803b15801561073757600080fd5b505af115801561074b573d6000803e3d6000fd5b5050604080513381526020810187905290810185905264ffffffffff19841660608201527fe3b4c53eef322c0bb4aba4dae151a0cd9c381d45db311cbe6ffe8a47806bca9a925060800190505b60405180910390a1505050565b6107e36040518060400160405280601081526020017f4d564d5f53757065724d616e6167657200000000000000000000000000000000815250610b4c565b6001600160a01b0316336001600160a01b03161461086b576040805162461bcd60e51b81526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084016106b4565b610873611ce5565b6040517fe6e436c0000000000000000000000000000000000000000000000000000000008152600481018590526024810184905264ffffffffff19831660448201526001600160a01b03919091169063e6e436c090606401600060405180830381600087803b1580156108e557600080fd5b505af11580156108f9573d6000803e3d6000fd5b5050604080513381526020810187905290810185905264ffffffffff19841660608201527fdaa76f618a31042f0705fdcf560ac258420fd56e1202be8a1d3faa236d530e8992506080019050610798565b6000610954611ce5565b6040517f67d18b9b00000000000000000000000000000000000000000000000000000000815260048101859052602481018490526001600160a01b0391909116906367d18b9b90604401602060405180830381865afa1580156109bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109df9190612fae565b9392505050565b604080516060810182526000808252602082018190529181019190915261044060005260066020527ff2fadc8f281df3b2e312450efbc7e5145e4214fc70e639a3a1b10148ef5697af805483908110610a4157610a41612fc7565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401949094526501000000000090049092169181019190915292915050565b6000610a99611ce5565b6001600160a01b031663576f2588836040518263ffffffff1660e01b8152600401610ac691815260200190565b602060405180830381865afa158015610ae3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b079190612fae565b92915050565b600080610b1861245a565b50949350505050565b6000818152600560209081526040808320546006909252822054610b079164ffffffffff1690613025565b600080546040517fbf40fac10000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063bf40fac190610b969085906004016130a7565b602060405180830381865afa158015610bb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0791906130ba565b600080610be3836124f9565b9695505050505050565b610c2b6040518060400160405280601081526020017f4d564d5f53757065724d616e6167657200000000000000000000000000000000815250610b4c565b6001600160a01b0316336001600160a01b031614610cb3576040805162461bcd60e51b81526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084016106b4565b6000838152600660205260409020805482919084908110610cd657610cd6612fc7565b90600052602060002090600202018181610cf091906130ea565b9050507f5a3965b29b524ca11ad9115cbeff6477733f21383a7d5220aa3bd535ea116eb6338484846040516107989493929190613194565b610d4960405180606001604052806021815260200161348b60219139610b4c565b6001600160a01b0316336001600160a01b031614610dcf5760405162461bcd60e51b815260206004820152602b60248201527f6f6e6c79207468652063726f737320646f6d61696e206d657373656e6765722060448201527f63616e20656e717565756500000000000000000000000000000000000000000060648201526084016106b4565b61c35081511115610e485760405162461bcd60e51b815260206004820152603d60248201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016106b4565b600454821115610ec05760405162461bcd60e51b815260206004820152603d60248201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016106b4565b620186a0821015610f395760405162461bcd60e51b815260206004820152602960248201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f60448201527f20656e71756575652e000000000000000000000000000000000000000000000060648201526084016106b4565b60035482111561100757600060025460035484610f5691906131bf565b610f6091906131d6565b905060005a9050818111610fdc5760405162461bcd60e51b815260206004820152602b60248201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60448201527f6974696e67206275726e2e00000000000000000000000000000000000000000060648201526084016106b4565b60005b825a610feb90846131bf565b10156110035780610ffb81613211565b915050610fdf565b5050505b6000323303611017575033611030565b5033731111000000000000000000000000000000001111015b6000818585856040516020016110499493929190613249565b60408051601f19818403018152828252805160209182012060008a8152600680845284822060608701865283875264ffffffffff4281168887019081524382169789019788528254600181810185558487528887209a516002909202909a01908155905190890180549851831665010000000000027fffffffffffffffffffffffffffffffffffffffffffff000000000000000000009099169190921617969096179095558b8252909252915491935091611103916131bf565b905080866001600160a01b0316846001600160a01b03167f6afbb2eaf0241302d1ab6244dff35383c745f31ee1f878e9052d510baeb425068a89894260405161114f949392919061327b565b60405180910390a450505050505050565b60008061116b61245a565b95945050505050565b6111b26040518060400160405280601081526020017f4d564d5f53757065724d616e6167657200000000000000000000000000000000815250610b4c565b6001600160a01b0316336001600160a01b03161461123a576040805162461bcd60e51b81526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084016106b4565b611242611ce5565b6040517f4cd4d7690000000000000000000000000000000000000000000000000000000081526004810185905260248101849052604481018390526001600160a01b039190911690634cd4d76990606401600060405180830381600087803b1580156112ad57600080fd5b505af11580156112c1573d6000803e3d6000fd5b50506040805133815260208101879052908101859052606081018490527fd7503502091a493b0a762f4ddf6bb0854a3b7b9e3955f186226d2fabc94bf7a192506080019050610798565b611319610440848484610d28565b505050565b6000611328611ce5565b6001600160a01b03166324a49415836040518263ffffffff1660e01b815260040161135591815260200190565b602060405180830381865afa158015611372573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0791906132ab565b6000806113a161245a565b50505064ffffffffff1692915050565b6000806113bd836124f9565b50505064ffffffffff169392505050565b6000806113da836124f9565b5095945050505050565b6114226040518060400160405280601081526020017f4d564d5f53757065724d616e6167657200000000000000000000000000000000815250610b4c565b6001600160a01b0316336001600160a01b0316146114aa576040805162461bcd60e51b81526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084016106b4565b6114b2611ce5565b6040517f24d722440000000000000000000000000000000000000000000000000000000081526004810184905264ffffffffff19831660248201526001600160a01b0391909116906324d7224490604401600060405180830381600087803b15801561151d57600080fd5b505af1158015611531573d6000803e3d6000fd5b5050604080513381526020810186905264ffffffffff198516918101919091527fdbc6a2a2ec9c0d9fd8fe896da2050bcea6b51cbc50d6108ec57ba994144cc21a925060600190505b60405180910390a15050565b604080516060810182526000808252602082018190529181019190915260008381526006602052604090208054839081106115c3576115c3612fc7565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff8082169484019490945265010000000000900490921691810191909152905092915050565b60043560243560d81c60293560e890811c90602c35901c611633846113b1565b8364ffffffffff16146116ae5760405162461bcd60e51b815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016106b4565b6116de6116ba856125a6565b6040516020016116ca91906132c8565b604051602081830303815290604052610b4c565b6001600160a01b0316336001600160a01b0316146117645760405162461bcd60e51b815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016106b4565b60008162ffffff16116117df5760405162461bcd60e51b815260206004820152602860248201527f4d7573742070726f76696465206174206c65617374206f6e652062617463682060448201527f636f6e746578742e00000000000000000000000000000000000000000000000060648201526084016106b4565b60008262ffffff161161185a5760405162461bcd60e51b815260206004820152602160248201527f4d75737420617070656e64206174206c65617374206f6e6520656c656d656e7460448201527f2e0000000000000000000000000000000000000000000000000000000000000060648201526084016106b4565b600061186c62ffffff83166010613309565b61187790600f613346565b905064ffffffffff81163610156118f65760405162461bcd60e51b815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016106b4565b60008581526005602090815260408083205481516080810183528481529283018490529082018390526060820183905264ffffffffff16919060005b8562ffffff168163ffffffff16101561199257600061195860008363ffffffff166126fd565b805190935083915061196a908561335e565b935082602001518561197c9190613386565b945050808061198a906133a6565b915050611932565b5060008881526006602052604090205464ffffffffff84161115611a445760405162461bcd60e51b815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016106b4565b6000611a558362ffffff89166133c9565b63ffffffff1690506000808360200151600003611a7d57505060408201516060830151611af8565b60008b8152600660205260408120611a96600189613025565b64ffffffffff1681548110611aad57611aad612fc7565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401859052650100000000009091041691018190529093509150505b611b1d8b611b076001436131bf565b408b62ffffff168664ffffffffff16868661279a565b7f178ecbc4b986ebf7ea68a0a7ae593212f963053458fda23484ad60e95dde758d8b611b498589613025565b85611b538f6113b1565b604051611b81949392919093845264ffffffffff928316602085015291166040830152606082015260800190565b60405180910390a15050506000978852505060056020526040909520805464ffffffffff191664ffffffffff9096169590951790945550505050565b611bfb6040518060400160405280601081526020017f4d564d5f53757065724d616e6167657200000000000000000000000000000000815250610b4c565b6001600160a01b0316336001600160a01b031614611c83576040805162461bcd60e51b81526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084016106b4565b6000828152600660209081526040822080546001810182559083529120829160020201611cb082826130ea565b50507f56afa4f6505f4a309504be105b887cb40789cdeea8e108f671d00e2ae07f3dcd33838360405161157a939291906133e6565b6000611d086040518060600160405280602181526020016134ac60219139610b4c565b905090565b60043560d81c60093560e890811c90600c35901c611d29611396565b8364ffffffffff1614611da45760405162461bcd60e51b815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016106b4565b611de26040518060400160405280600d81526020017f4d564d5f53657175656e63657200000000000000000000000000000000000000815250610b4c565b6001600160a01b0316336001600160a01b031614611e685760405162461bcd60e51b815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016106b4565b6000611e7a62ffffff83166010613309565b611e8590600f613346565b905064ffffffffff8116361015611f045760405162461bcd60e51b815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016106b4565b6104406000908152600560209081527f0dc7af05b69860904321737f972990978ada95ccab9945c9e4152a2706ab5886546040805160808101825284815292830184905282018390526060820183905264ffffffffff169060005b8562ffffff168163ffffffff161015611fbd576000611f838263ffffffff1661299b565b8051909350839150611f95908661335e565b9450826020015184611fa79190613386565b9350508080611fb5906133a6565b915050611f5f565b5061044060005260066020527ff2fadc8f281df3b2e312450efbc7e5145e4214fc70e639a3a1b10148ef5697af5464ffffffffff8316111561208d5760405162461bcd60e51b815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016106b4565b600061209e8462ffffff89166133c9565b63ffffffff16905060008083602001516000036120c657505060408201516060830151612161565b610440600090815260066020527ff2fadc8f281df3b2e312450efbc7e5145e4214fc70e639a3a1b10148ef5697af6120ff600188613025565b64ffffffffff168154811061211657612116612fc7565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401859052650100000000009091041691018190529093509150505b61218561216f6001436131bf565b408a62ffffff168564ffffffffff168585612a22565b7f178ecbc4b986ebf7ea68a0a7ae593212f963053458fda23484ad60e95dde758d6104406121b38588613025565b856121bc611396565b6040516121ea949392919093845264ffffffffff928316602085015291166040830152606082015260800190565b60405180910390a15050610440600052505060056020527f0dc7af05b69860904321737f972990978ada95ccab9945c9e4152a2706ab5886805464ffffffffff191664ffffffffff929092169190911790555050505050565b60008061224f836124f9565b509095945050505050565b6000612264611ce5565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122a1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d089190612fae565b60008054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612316573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061233a91906130ba565b6001600160a01b0316336001600160a01b03161461239a5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c792063616c6c61626c6520627920746865204275726e2041646d696e2e60448201526064016106b4565b600181905560028290556123ae8183613309565b60038190556002546001546040805192835260208301919091528101919091527fc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e9060600161157a565b61044060009081527f0dc7af05b69860904321737f972990978ada95ccab9945c9e4152a2706ab58865460066020527ff2fadc8f281df3b2e312450efbc7e5145e4214fc70e639a3a1b10148ef5697af54611d089164ffffffffff1690613025565b600080600080600061246a611ce5565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124cb91906132ab565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b6000806000806000612509611ce5565b6001600160a01b03166324a49415876040518263ffffffff1660e01b815260040161253691815260200190565b602060405180830381865afa158015612553573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257791906132ab565b64ffffffffff602882901c811698605083901c82169850607883901c8216975060a09290921c16945092505050565b6060816000036125e957505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561261357806125fd81613211565b915061260c9050600a836131d6565b91506125ed565b60008167ffffffffffffffff81111561262e5761262e612cf8565b6040519080825280601f01601f191660200182016040528015612658576020820181803683370190505b509050815b8515610b185761266e6001826131bf565b9050600061267d600a886131d6565b61268890600a613309565b61269290886131bf565b61269d90603061340a565b905060008160f81b9050808484815181106126ba576126ba612fc7565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506126f4600a896131d6565b9750505061265d565b6127286040518060800160405280600081526020016000815260200160008152602001600081525090565b6000612735601084613309565b612740856020613346565b61274b90600f613346565b6127559190613346565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c6060820152949350505050565b60006127a4611ce5565b90506000806127b2896124f9565b50506040805160a08101918290527f576f25880000000000000000000000000000000000000000000000000000000090915260a481018c90529193509150600090806001600160a01b03861663576f258860c48301602060405180830381865afa158015612824573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128489190612fae565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517fc4c3b7c157dc7d495c3ed62df83a8b8d6bdf6724d0cc0150228eba4976c4e3318b83602001518460400151856060015186608001516040516128c795949392919061342f565b60405180910390a260006128da82612bfb565b905060006129028360400151866128f19190613386565b6128fb8b87613386565b8a8a612c41565b6040517fe6e436c0000000000000000000000000000000000000000000000000000000008152600481018e90526024810184905264ffffffffff19821660448201529091506001600160a01b0387169063e6e436c090606401600060405180830381600087803b15801561297557600080fd5b505af1158015612989573d6000803e3d6000fd5b50505050505050505050505050505050565b6129c66040518060800160405280600081526020016000815260200160008152602001600081525090565b60006129d3601084613309565b6129de90600f613346565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c60608201529392505050565b6000612a2c611ce5565b9050600080612a3961245a565b50509150915060006040518060a00160405280856001600160a01b0316631f7b6d326040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aae9190612fae565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517fc4c3b7c157dc7d495c3ed62df83a8b8d6bdf6724d0cc0150228eba4976c4e3316104408360200151846040015185606001518660800151604051612b2f95949392919061342f565b60405180910390a26000612b4282612bfb565b90506000612b6a836040015186612b599190613386565b612b638b87613386565b8a8a612c5f565b6040517f2015276c0000000000000000000000000000000000000000000000000000000081526004810184905264ffffffffff19821660248201529091506001600160a01b03871690632015276c90604401600060405180830381600087803b158015612bd657600080fd5b505af1158015612bea573d6000803e3d6000fd5b505050505050505050505050505050565b60008160200151826040015183606001518460800151604051602001612c249493929190613465565b604051602081830303815290604052805190602001209050919050565b602883811b8517605084901b17607883901b17901b5b949350505050565b600061116b85858585612c41565b64ffffffffff1981168114612c8157600080fd5b50565b600080600060608486031215612c9957600080fd5b83359250602084013591506040840135612cb281612c6d565b809150509250925092565b600060208284031215612ccf57600080fd5b5035919050565b60008060408385031215612ce957600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff80841115612d4257612d42612cf8565b604051601f8501601f19908116603f01168101908282118183101715612d6a57612d6a612cf8565b81604052809350858152868686011115612d8357600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612daf57600080fd5b813567ffffffffffffffff811115612dc657600080fd5b8201601f81018413612dd757600080fd5b612c5784823560208401612d27565b600060608284031215612df857600080fd5b50919050565b600080600060a08486031215612e1357600080fd5b8335925060208401359150612e2b8560408601612de6565b90509250925092565b6001600160a01b0381168114612c8157600080fd5b600082601f830112612e5a57600080fd5b6109df83833560208501612d27565b60008060008060808587031215612e7f57600080fd5b843593506020850135612e9181612e34565b925060408501359150606085013567ffffffffffffffff811115612eb457600080fd5b612ec087828801612e49565b91505092959194509250565b600080600060608486031215612ee157600080fd5b505081359360208301359350604090920135919050565b600080600060608486031215612f0d57600080fd5b8335612f1881612e34565b925060208401359150604084013567ffffffffffffffff811115612f3b57600080fd5b612f4786828701612e49565b9150509250925092565b60008060408385031215612f6457600080fd5b823591506020830135612f7681612c6d565b809150509250929050565b60008060808385031215612f9457600080fd5b82359150612fa58460208501612de6565b90509250929050565b600060208284031215612fc057600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600064ffffffffff8381169083168181101561304357613043612ff6565b039392505050565b60005b8381101561306657818101518382015260200161304e565b83811115613075576000848401525b50505050565b6000815180845261309381602086016020860161304b565b601f01601f19169290920160200192915050565b6020815260006109df602083018461307b565b6000602082840312156130cc57600080fd5b81516109df81612e34565b64ffffffffff81168114612c8157600080fd5b81358155600181016020830135613100816130d7565b81546040850135613110816130d7565b69ffffffffff00000000008160281b1664ffffffffff84167fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000841617178455505050505050565b803582526020810135613169816130d7565b64ffffffffff9081166020840152604082013590613186826130d7565b808216604085015250505050565b6001600160a01b0385168152602081018490526040810183905260c0810161116b6060830184613157565b6000828210156131d1576131d1612ff6565b500390565b60008261320c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361324257613242612ff6565b5060010190565b60006001600160a01b03808716835280861660208401525083604083015260806060830152610be3608083018461307b565b84815283602082015260806040820152600061329a608083018561307b565b905082606083015295945050505050565b6000602082840312156132bd57600080fd5b81516109df81612c6d565b600082516132da81846020870161304b565b7f5f4d564d5f53657175656e636572000000000000000000000000000000000000920191825250600e01919050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561334157613341612ff6565b500290565b6000821982111561335957613359612ff6565b500190565b600063ffffffff80831681851680830382111561337d5761337d612ff6565b01949350505050565b600064ffffffffff80831681851680830382111561337d5761337d612ff6565b600063ffffffff8083168181036133bf576133bf612ff6565b6001019392505050565b600063ffffffff8381169083168181101561304357613043612ff6565b6001600160a01b03841681526020810183905260a08101612c576040830184613157565b600060ff821660ff84168060ff0382111561342757613427612ff6565b019392505050565b85815284602082015283604082015282606082015260a06080820152600061345a60a083018461307b565b979650505050505050565b848152836020820152826040820152608060608201526000610be3608083018461307b56fe50726f78795f5f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572436861696e53746f72616765436f6e7461696e65722d4354432d62617463686573a26469706673582212208f7d071234f4c7fd4caa1b273ff626576ca5e1ed796f6a8a095a6900cdf9b39964736f6c634300080f0033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102c85760003560e01c80637a209b931161017b578063b4be51ae116100d8578063db2977221161008c578063e654b1fb11610071578063e654b1fb146105ce578063edcc4a45146105d7578063f722b41a146105ea57600080fd5b8063db297722146105b3578063e561dddc146105c657600080fd5b8063ccf987c8116100bd578063ccf987c81461059a578063cfdf677e146105a3578063d0f89344146105ab57600080fd5b8063b4be51ae14610555578063b8f770051461056857600080fd5b80638d38c6c11161012f578063a14420ee11610114578063a14420ee14610527578063a16d359a1461053a578063a8cda37b1461054d57600080fd5b80638d38c6c11461050b5780639156f18a1461051457600080fd5b8063876ed5cb11610160578063876ed5cb146104ef5780638a52e622146104f85780638c7de742146103c957600080fd5b80637a209b93146104bd5780637aa63a86146104e757600080fd5b8063461a4478116102295780635bbbb7ed116101dd5780636fee07e0116101c25780636fee07e01461046757806378f4b2f21461047a5780637a167a8a1461048457600080fd5b80635bbbb7ed1461044b57806363d5dbd11461045457600080fd5b80634f5da7c61161020e5780634f5da7c61461041d578063511da531146104305780635ae6256d1461044357600080fd5b8063461a4478146103f75780634a0eddab1461040a57600080fd5b8063299ca478116102805780632de6a708116102655780632de6a708146103c957806337899770146103dc57806343be0a84146103e457600080fd5b8063299ca4781461035a5780632a7f18be1461038557600080fd5b806319625535116102b157806319625535146102fe5780632538f3a81461031157806325412c841461034757600080fd5b80630545ba77146102cd5780630b3dfa97146102e2575b600080fd5b6102e06102db366004612c84565b6105f2565b005b6102eb60035481565b6040519081526020015b60405180910390f35b6102e061030c366004612c84565b6107a5565b61033161031f366004612cbd565b60009081526006602052604090205490565b60405164ffffffffff90911681526020016102f5565b6102eb610355366004612cd6565b61094a565b60005461036d906001600160a01b031681565b6040516001600160a01b0390911681526020016102f5565b610398610393366004612cbd565b6109e6565b604080518251815260208084015164ffffffffff9081169183019190915292820151909216908201526060016102f5565b6102eb6103d7366004612cbd565b610a8f565b610331610b0d565b6103316103f2366004612cbd565b610b21565b61036d610405366004612d9d565b610b4c565b610331610418366004612cbd565b610bd7565b6102e061042b366004612dfe565b610bed565b6102e061043e366004612e69565b610d28565b610331611160565b6102eb61044081565b6102e0610462366004612ecc565b611174565b6102e0610475366004612ef8565b61130b565b6102eb620186a081565b61044060005260056020527f0dc7af05b69860904321737f972990978ada95ccab9945c9e4152a2706ab58865464ffffffffff16610331565b6104d06104cb366004612cbd565b61131e565b60405164ffffffffff1990911681526020016102f5565b6102eb611396565b6102eb61c35081565b6102eb610506366004612cbd565b6113b1565b6102eb60045481565b610331610522366004612cbd565b6113ce565b6102e0610535366004612f51565b6113e4565b610398610548366004612cd6565b611586565b6102e0611613565b6102e0610563366004612f81565b611bbd565b61044060005260066020527ff2fadc8f281df3b2e312450efbc7e5145e4214fc70e639a3a1b10148ef5697af54610331565b6102eb60025481565b61036d611ce5565b6102e0611d0d565b6103316105c1366004612cbd565b612243565b6102eb61225a565b6102eb60015481565b6102e06105e5366004612cd6565b6122c5565b6103316123f8565b6106306040518060400160405280601081526020017f4d564d5f53757065724d616e6167657200000000000000000000000000000000815250610b4c565b6001600160a01b0316336001600160a01b0316146106bd576040805162461bcd60e51b81526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084015b60405180910390fd5b6106c5611ce5565b6040517fbc052576000000000000000000000000000000000000000000000000000000008152600481018590526024810184905264ffffffffff19831660448201526001600160a01b03919091169063bc05257690606401600060405180830381600087803b15801561073757600080fd5b505af115801561074b573d6000803e3d6000fd5b5050604080513381526020810187905290810185905264ffffffffff19841660608201527fe3b4c53eef322c0bb4aba4dae151a0cd9c381d45db311cbe6ffe8a47806bca9a925060800190505b60405180910390a1505050565b6107e36040518060400160405280601081526020017f4d564d5f53757065724d616e6167657200000000000000000000000000000000815250610b4c565b6001600160a01b0316336001600160a01b03161461086b576040805162461bcd60e51b81526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084016106b4565b610873611ce5565b6040517fe6e436c0000000000000000000000000000000000000000000000000000000008152600481018590526024810184905264ffffffffff19831660448201526001600160a01b03919091169063e6e436c090606401600060405180830381600087803b1580156108e557600080fd5b505af11580156108f9573d6000803e3d6000fd5b5050604080513381526020810187905290810185905264ffffffffff19841660608201527fdaa76f618a31042f0705fdcf560ac258420fd56e1202be8a1d3faa236d530e8992506080019050610798565b6000610954611ce5565b6040517f67d18b9b00000000000000000000000000000000000000000000000000000000815260048101859052602481018490526001600160a01b0391909116906367d18b9b90604401602060405180830381865afa1580156109bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109df9190612fae565b9392505050565b604080516060810182526000808252602082018190529181019190915261044060005260066020527ff2fadc8f281df3b2e312450efbc7e5145e4214fc70e639a3a1b10148ef5697af805483908110610a4157610a41612fc7565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401949094526501000000000090049092169181019190915292915050565b6000610a99611ce5565b6001600160a01b031663576f2588836040518263ffffffff1660e01b8152600401610ac691815260200190565b602060405180830381865afa158015610ae3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b079190612fae565b92915050565b600080610b1861245a565b50949350505050565b6000818152600560209081526040808320546006909252822054610b079164ffffffffff1690613025565b600080546040517fbf40fac10000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063bf40fac190610b969085906004016130a7565b602060405180830381865afa158015610bb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0791906130ba565b600080610be3836124f9565b9695505050505050565b610c2b6040518060400160405280601081526020017f4d564d5f53757065724d616e6167657200000000000000000000000000000000815250610b4c565b6001600160a01b0316336001600160a01b031614610cb3576040805162461bcd60e51b81526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084016106b4565b6000838152600660205260409020805482919084908110610cd657610cd6612fc7565b90600052602060002090600202018181610cf091906130ea565b9050507f5a3965b29b524ca11ad9115cbeff6477733f21383a7d5220aa3bd535ea116eb6338484846040516107989493929190613194565b610d4960405180606001604052806021815260200161348b60219139610b4c565b6001600160a01b0316336001600160a01b031614610dcf5760405162461bcd60e51b815260206004820152602b60248201527f6f6e6c79207468652063726f737320646f6d61696e206d657373656e6765722060448201527f63616e20656e717565756500000000000000000000000000000000000000000060648201526084016106b4565b61c35081511115610e485760405162461bcd60e51b815260206004820152603d60248201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016106b4565b600454821115610ec05760405162461bcd60e51b815260206004820152603d60248201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016106b4565b620186a0821015610f395760405162461bcd60e51b815260206004820152602960248201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f60448201527f20656e71756575652e000000000000000000000000000000000000000000000060648201526084016106b4565b60035482111561100757600060025460035484610f5691906131bf565b610f6091906131d6565b905060005a9050818111610fdc5760405162461bcd60e51b815260206004820152602b60248201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60448201527f6974696e67206275726e2e00000000000000000000000000000000000000000060648201526084016106b4565b60005b825a610feb90846131bf565b10156110035780610ffb81613211565b915050610fdf565b5050505b6000323303611017575033611030565b5033731111000000000000000000000000000000001111015b6000818585856040516020016110499493929190613249565b60408051601f19818403018152828252805160209182012060008a8152600680845284822060608701865283875264ffffffffff4281168887019081524382169789019788528254600181810185558487528887209a516002909202909a01908155905190890180549851831665010000000000027fffffffffffffffffffffffffffffffffffffffffffff000000000000000000009099169190921617969096179095558b8252909252915491935091611103916131bf565b905080866001600160a01b0316846001600160a01b03167f6afbb2eaf0241302d1ab6244dff35383c745f31ee1f878e9052d510baeb425068a89894260405161114f949392919061327b565b60405180910390a450505050505050565b60008061116b61245a565b95945050505050565b6111b26040518060400160405280601081526020017f4d564d5f53757065724d616e6167657200000000000000000000000000000000815250610b4c565b6001600160a01b0316336001600160a01b03161461123a576040805162461bcd60e51b81526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084016106b4565b611242611ce5565b6040517f4cd4d7690000000000000000000000000000000000000000000000000000000081526004810185905260248101849052604481018390526001600160a01b039190911690634cd4d76990606401600060405180830381600087803b1580156112ad57600080fd5b505af11580156112c1573d6000803e3d6000fd5b50506040805133815260208101879052908101859052606081018490527fd7503502091a493b0a762f4ddf6bb0854a3b7b9e3955f186226d2fabc94bf7a192506080019050610798565b611319610440848484610d28565b505050565b6000611328611ce5565b6001600160a01b03166324a49415836040518263ffffffff1660e01b815260040161135591815260200190565b602060405180830381865afa158015611372573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0791906132ab565b6000806113a161245a565b50505064ffffffffff1692915050565b6000806113bd836124f9565b50505064ffffffffff169392505050565b6000806113da836124f9565b5095945050505050565b6114226040518060400160405280601081526020017f4d564d5f53757065724d616e6167657200000000000000000000000000000000815250610b4c565b6001600160a01b0316336001600160a01b0316146114aa576040805162461bcd60e51b81526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084016106b4565b6114b2611ce5565b6040517f24d722440000000000000000000000000000000000000000000000000000000081526004810184905264ffffffffff19831660248201526001600160a01b0391909116906324d7224490604401600060405180830381600087803b15801561151d57600080fd5b505af1158015611531573d6000803e3d6000fd5b5050604080513381526020810186905264ffffffffff198516918101919091527fdbc6a2a2ec9c0d9fd8fe896da2050bcea6b51cbc50d6108ec57ba994144cc21a925060600190505b60405180910390a15050565b604080516060810182526000808252602082018190529181019190915260008381526006602052604090208054839081106115c3576115c3612fc7565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff8082169484019490945265010000000000900490921691810191909152905092915050565b60043560243560d81c60293560e890811c90602c35901c611633846113b1565b8364ffffffffff16146116ae5760405162461bcd60e51b815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016106b4565b6116de6116ba856125a6565b6040516020016116ca91906132c8565b604051602081830303815290604052610b4c565b6001600160a01b0316336001600160a01b0316146117645760405162461bcd60e51b815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016106b4565b60008162ffffff16116117df5760405162461bcd60e51b815260206004820152602860248201527f4d7573742070726f76696465206174206c65617374206f6e652062617463682060448201527f636f6e746578742e00000000000000000000000000000000000000000000000060648201526084016106b4565b60008262ffffff161161185a5760405162461bcd60e51b815260206004820152602160248201527f4d75737420617070656e64206174206c65617374206f6e6520656c656d656e7460448201527f2e0000000000000000000000000000000000000000000000000000000000000060648201526084016106b4565b600061186c62ffffff83166010613309565b61187790600f613346565b905064ffffffffff81163610156118f65760405162461bcd60e51b815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016106b4565b60008581526005602090815260408083205481516080810183528481529283018490529082018390526060820183905264ffffffffff16919060005b8562ffffff168163ffffffff16101561199257600061195860008363ffffffff166126fd565b805190935083915061196a908561335e565b935082602001518561197c9190613386565b945050808061198a906133a6565b915050611932565b5060008881526006602052604090205464ffffffffff84161115611a445760405162461bcd60e51b815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016106b4565b6000611a558362ffffff89166133c9565b63ffffffff1690506000808360200151600003611a7d57505060408201516060830151611af8565b60008b8152600660205260408120611a96600189613025565b64ffffffffff1681548110611aad57611aad612fc7565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401859052650100000000009091041691018190529093509150505b611b1d8b611b076001436131bf565b408b62ffffff168664ffffffffff16868661279a565b7f178ecbc4b986ebf7ea68a0a7ae593212f963053458fda23484ad60e95dde758d8b611b498589613025565b85611b538f6113b1565b604051611b81949392919093845264ffffffffff928316602085015291166040830152606082015260800190565b60405180910390a15050506000978852505060056020526040909520805464ffffffffff191664ffffffffff9096169590951790945550505050565b611bfb6040518060400160405280601081526020017f4d564d5f53757065724d616e6167657200000000000000000000000000000000815250610b4c565b6001600160a01b0316336001600160a01b031614611c83576040805162461bcd60e51b81526020600482015260248101919091527f436861696e53746f72616765436f6e7461696e65723a2046756e6374696f6e2060448201527f63616e206f6e6c792062652063616c6c656420627920746865206f776e65722e60648201526084016106b4565b6000828152600660209081526040822080546001810182559083529120829160020201611cb082826130ea565b50507f56afa4f6505f4a309504be105b887cb40789cdeea8e108f671d00e2ae07f3dcd33838360405161157a939291906133e6565b6000611d086040518060600160405280602181526020016134ac60219139610b4c565b905090565b60043560d81c60093560e890811c90600c35901c611d29611396565b8364ffffffffff1614611da45760405162461bcd60e51b815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016106b4565b611de26040518060400160405280600d81526020017f4d564d5f53657175656e63657200000000000000000000000000000000000000815250610b4c565b6001600160a01b0316336001600160a01b031614611e685760405162461bcd60e51b815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016106b4565b6000611e7a62ffffff83166010613309565b611e8590600f613346565b905064ffffffffff8116361015611f045760405162461bcd60e51b815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016106b4565b6104406000908152600560209081527f0dc7af05b69860904321737f972990978ada95ccab9945c9e4152a2706ab5886546040805160808101825284815292830184905282018390526060820183905264ffffffffff169060005b8562ffffff168163ffffffff161015611fbd576000611f838263ffffffff1661299b565b8051909350839150611f95908661335e565b9450826020015184611fa79190613386565b9350508080611fb5906133a6565b915050611f5f565b5061044060005260066020527ff2fadc8f281df3b2e312450efbc7e5145e4214fc70e639a3a1b10148ef5697af5464ffffffffff8316111561208d5760405162461bcd60e51b815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016106b4565b600061209e8462ffffff89166133c9565b63ffffffff16905060008083602001516000036120c657505060408201516060830151612161565b610440600090815260066020527ff2fadc8f281df3b2e312450efbc7e5145e4214fc70e639a3a1b10148ef5697af6120ff600188613025565b64ffffffffff168154811061211657612116612fc7565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401859052650100000000009091041691018190529093509150505b61218561216f6001436131bf565b408a62ffffff168564ffffffffff168585612a22565b7f178ecbc4b986ebf7ea68a0a7ae593212f963053458fda23484ad60e95dde758d6104406121b38588613025565b856121bc611396565b6040516121ea949392919093845264ffffffffff928316602085015291166040830152606082015260800190565b60405180910390a15050610440600052505060056020527f0dc7af05b69860904321737f972990978ada95ccab9945c9e4152a2706ab5886805464ffffffffff191664ffffffffff929092169190911790555050505050565b60008061224f836124f9565b509095945050505050565b6000612264611ce5565b6001600160a01b0316631f7b6d326040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122a1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d089190612fae565b60008054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612316573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061233a91906130ba565b6001600160a01b0316336001600160a01b03161461239a5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c792063616c6c61626c6520627920746865204275726e2041646d696e2e60448201526064016106b4565b600181905560028290556123ae8183613309565b60038190556002546001546040805192835260208301919091528101919091527fc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e9060600161157a565b61044060009081527f0dc7af05b69860904321737f972990978ada95ccab9945c9e4152a2706ab58865460066020527ff2fadc8f281df3b2e312450efbc7e5145e4214fc70e639a3a1b10148ef5697af54611d089164ffffffffff1690613025565b600080600080600061246a611ce5565b6001600160a01b031663ccf8f9696040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124cb91906132ab565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b6000806000806000612509611ce5565b6001600160a01b03166324a49415876040518263ffffffff1660e01b815260040161253691815260200190565b602060405180830381865afa158015612553573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257791906132ab565b64ffffffffff602882901c811698605083901c82169850607883901c8216975060a09290921c16945092505050565b6060816000036125e957505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561261357806125fd81613211565b915061260c9050600a836131d6565b91506125ed565b60008167ffffffffffffffff81111561262e5761262e612cf8565b6040519080825280601f01601f191660200182016040528015612658576020820181803683370190505b509050815b8515610b185761266e6001826131bf565b9050600061267d600a886131d6565b61268890600a613309565b61269290886131bf565b61269d90603061340a565b905060008160f81b9050808484815181106126ba576126ba612fc7565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506126f4600a896131d6565b9750505061265d565b6127286040518060800160405280600081526020016000815260200160008152602001600081525090565b6000612735601084613309565b612740856020613346565b61274b90600f613346565b6127559190613346565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c6060820152949350505050565b60006127a4611ce5565b90506000806127b2896124f9565b50506040805160a08101918290527f576f25880000000000000000000000000000000000000000000000000000000090915260a481018c90529193509150600090806001600160a01b03861663576f258860c48301602060405180830381865afa158015612824573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128489190612fae565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517fc4c3b7c157dc7d495c3ed62df83a8b8d6bdf6724d0cc0150228eba4976c4e3318b83602001518460400151856060015186608001516040516128c795949392919061342f565b60405180910390a260006128da82612bfb565b905060006129028360400151866128f19190613386565b6128fb8b87613386565b8a8a612c41565b6040517fe6e436c0000000000000000000000000000000000000000000000000000000008152600481018e90526024810184905264ffffffffff19821660448201529091506001600160a01b0387169063e6e436c090606401600060405180830381600087803b15801561297557600080fd5b505af1158015612989573d6000803e3d6000fd5b50505050505050505050505050505050565b6129c66040518060800160405280600081526020016000815260200160008152602001600081525090565b60006129d3601084613309565b6129de90600f613346565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c60608201529392505050565b6000612a2c611ce5565b9050600080612a3961245a565b50509150915060006040518060a00160405280856001600160a01b0316631f7b6d326040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aae9190612fae565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517fc4c3b7c157dc7d495c3ed62df83a8b8d6bdf6724d0cc0150228eba4976c4e3316104408360200151846040015185606001518660800151604051612b2f95949392919061342f565b60405180910390a26000612b4282612bfb565b90506000612b6a836040015186612b599190613386565b612b638b87613386565b8a8a612c5f565b6040517f2015276c0000000000000000000000000000000000000000000000000000000081526004810184905264ffffffffff19821660248201529091506001600160a01b03871690632015276c90604401600060405180830381600087803b158015612bd657600080fd5b505af1158015612bea573d6000803e3d6000fd5b505050505050505050505050505050565b60008160200151826040015183606001518460800151604051602001612c249493929190613465565b604051602081830303815290604052805190602001209050919050565b602883811b8517605084901b17607883901b17901b5b949350505050565b600061116b85858585612c41565b64ffffffffff1981168114612c8157600080fd5b50565b600080600060608486031215612c9957600080fd5b83359250602084013591506040840135612cb281612c6d565b809150509250925092565b600060208284031215612ccf57600080fd5b5035919050565b60008060408385031215612ce957600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff80841115612d4257612d42612cf8565b604051601f8501601f19908116603f01168101908282118183101715612d6a57612d6a612cf8565b81604052809350858152868686011115612d8357600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612daf57600080fd5b813567ffffffffffffffff811115612dc657600080fd5b8201601f81018413612dd757600080fd5b612c5784823560208401612d27565b600060608284031215612df857600080fd5b50919050565b600080600060a08486031215612e1357600080fd5b8335925060208401359150612e2b8560408601612de6565b90509250925092565b6001600160a01b0381168114612c8157600080fd5b600082601f830112612e5a57600080fd5b6109df83833560208501612d27565b60008060008060808587031215612e7f57600080fd5b843593506020850135612e9181612e34565b925060408501359150606085013567ffffffffffffffff811115612eb457600080fd5b612ec087828801612e49565b91505092959194509250565b600080600060608486031215612ee157600080fd5b505081359360208301359350604090920135919050565b600080600060608486031215612f0d57600080fd5b8335612f1881612e34565b925060208401359150604084013567ffffffffffffffff811115612f3b57600080fd5b612f4786828701612e49565b9150509250925092565b60008060408385031215612f6457600080fd5b823591506020830135612f7681612c6d565b809150509250929050565b60008060808385031215612f9457600080fd5b82359150612fa58460208501612de6565b90509250929050565b600060208284031215612fc057600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600064ffffffffff8381169083168181101561304357613043612ff6565b039392505050565b60005b8381101561306657818101518382015260200161304e565b83811115613075576000848401525b50505050565b6000815180845261309381602086016020860161304b565b601f01601f19169290920160200192915050565b6020815260006109df602083018461307b565b6000602082840312156130cc57600080fd5b81516109df81612e34565b64ffffffffff81168114612c8157600080fd5b81358155600181016020830135613100816130d7565b81546040850135613110816130d7565b69ffffffffff00000000008160281b1664ffffffffff84167fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000841617178455505050505050565b803582526020810135613169816130d7565b64ffffffffff9081166020840152604082013590613186826130d7565b808216604085015250505050565b6001600160a01b0385168152602081018490526040810183905260c0810161116b6060830184613157565b6000828210156131d1576131d1612ff6565b500390565b60008261320c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361324257613242612ff6565b5060010190565b60006001600160a01b03808716835280861660208401525083604083015260806060830152610be3608083018461307b565b84815283602082015260806040820152600061329a608083018561307b565b905082606083015295945050505050565b6000602082840312156132bd57600080fd5b81516109df81612c6d565b600082516132da81846020870161304b565b7f5f4d564d5f53657175656e636572000000000000000000000000000000000000920191825250600e01919050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561334157613341612ff6565b500290565b6000821982111561335957613359612ff6565b500190565b600063ffffffff80831681851680830382111561337d5761337d612ff6565b01949350505050565b600064ffffffffff80831681851680830382111561337d5761337d612ff6565b600063ffffffff8083168181036133bf576133bf612ff6565b6001019392505050565b600063ffffffff8381169083168181101561304357613043612ff6565b6001600160a01b03841681526020810183905260a08101612c576040830184613157565b600060ff821660ff84168060ff0382111561342757613427612ff6565b019392505050565b85815284602082015283604082015282606082015260a06080820152600061345a60a083018461307b565b979650505050505050565b848152836020820152826040820152608060608201526000610be3608083018461307b56fe50726f78795f5f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572436861696e53746f72616765436f6e7461696e65722d4354432d62617463686573a26469706673582212208f7d071234f4c7fd4caa1b273ff626576ca5e1ed796f6a8a095a6900cdf9b39964736f6c634300080f0033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
