Contract 0x6fed400da17f2678c450aa1d35e909653b3b482a

Txn Hash Method
Block
From
To
Value [Txn Fee]
0xe5aeb560c604164bd9199af83ee8a41fc47160106b39a260b526a9a922e58932Transfer From235438022021-11-30 4:59:3723 hrs 3 mins ago0xbdd83ed49995f985808142a310f90cb6e4efcb86 IN  0x6fed400da17f2678c450aa1d35e909653b3b482a0 FTM0.00938014343
0xea97874dc670f43af5bc772523fa3000c7d31e579dc37a41e4d07c147a6a6ee4Transfer From235368952021-11-30 3:21:111 day 41 mins ago0x2708ecfd5ff9243a3335b16b485a744e8a6c5b90 IN  0x6fed400da17f2678c450aa1d35e909653b3b482a0 FTM0.00933814729
0x018afe5f3ac0986c88c6f4f94c1dd26a3a2cf14c717ce700b668702334281795Transfer From235368812021-11-30 3:21:011 day 42 mins ago0x2708ecfd5ff9243a3335b16b485a744e8a6c5b90 IN  0x6fed400da17f2678c450aa1d35e909653b3b482a0 FTM0.009418837765
0x0adad1af7b1357e75d106c6894e5864e1d8de3d748063073c15e698e8853c6a2Set Approval For...234877522021-11-29 15:31:231 day 12 hrs ago0xdb7816f192dbbd9f5b709b9017f75ea3bb64cd3d IN  0x6fed400da17f2678c450aa1d35e909653b3b482a0 FTM0.008001942767
0xf0275fb2ed330d267983e1f60ecbf26cfabd6dc8d777d005381a1a46c866b1cfTransfer From233058882021-11-27 18:23:463 days 9 hrs ago0xdd04145fd97bf4dac72ccf131557c8e9bfe7aa4c IN  0x6fed400da17f2678c450aa1d35e909653b3b482a0 FTM0.015639051102
0x1ba6a18d37568b126dce22e05707d07f2b63ac92bcdbe7d8d967d5f4ad6ec1eeSet Approval For...232221342021-11-26 21:43:564 days 6 hrs ago0x13885e42086629cd1e8bd690411fddf923051af9 IN  0x6fed400da17f2678c450aa1d35e909653b3b482a0 FTM0.007484430293
0x2a779d792a990ae07a609b1e78cf850768d438d3439055b03272dc36b3549cefSet Approval For...231530512021-11-26 4:24:474 days 23 hrs ago0x13885e42086629cd1e8bd690411fddf923051af9 IN  0x6fed400da17f2678c450aa1d35e909653b3b482a0 FTM0.011162645371
0xfd578d8b72e086255da62d04b340626c115436f6fd7d7030c980cfd0904b034eSet Approval For...229351342021-11-23 21:56:597 days 6 hrs ago0x13885e42086629cd1e8bd690411fddf923051af9 IN  0x6fed400da17f2678c450aa1d35e909653b3b482a0 FTM0.0134839362
0xafb695a4894c710d34355d02c72c47ec7e9b2d2770ef75747ecce18cc5ad64f7Transfer From229342222021-11-23 21:43:467 days 6 hrs ago0xa5346e90cd9ae18b5cabd32f6201d4b92f4a55fc IN  0x6fed400da17f2678c450aa1d35e909653b3b482a0 FTM0.024887425021
0xc6fa75c0967e06c44515a37eed0a8380b67ba0d5a83f72fc946c02dd9ca86875Transfer From229336322021-11-23 21:35:517 days 6 hrs ago0xa5346e90cd9ae18b5cabd32f6201d4b92f4a55fc IN  0x6fed400da17f2678c450aa1d35e909653b3b482a0 FTM0.02237493476
0xfe4fb7ad7a8814b49bd83161d10c63600de5826257f04fe6589f3f5863225d3dTransfer From229335152021-11-23 21:34:077 days 6 hrs ago0xa5346e90cd9ae18b5cabd32f6201d4b92f4a55fc IN  0x6fed400da17f2678c450aa1d35e909653b3b482a0 FTM0.027629106133
0xbd73a25ce8b82810e1221d1f87dddad7931e9416c7398d2630740f30d7cc17edSafe Transfer Fr...227911452021-11-22 10:31:228 days 17 hrs ago0x5ae7c83e39d1bb56cad34a6aa96cb442dcce996d IN  0x6fed400da17f2678c450aa1d35e909653b3b482a0 FTM0.019346148818
0xd0f5a01ea4b76117e4f7c71f7dbaeba2b9c169e636a1632d966dfe02c8cdaf93Safe Transfer Fr...227911292021-11-22 10:31:098 days 17 hrs ago0x5ae7c83e39d1bb56cad34a6aa96cb442dcce996d IN  0x6fed400da17f2678c450aa1d35e909653b3b482a0 FTM0.019346148818
0x0bedd54870008d571f1595676917b9393d66d61482c258c7efb71408905f1cb9Safe Transfer Fr...227911092021-11-22 10:30:518 days 17 hrs ago0x5ae7c83e39d1bb56cad34a6aa96cb442dcce996d IN  0x6fed400da17f2678c450aa1d35e909653b3b482a0 FTM0.019346148818
0x13dd8771bf94cb90579dc01cc77c7fea59c11f8161f77f472fc14a3cd3148216Safe Transfer Fr...227910852021-11-22 10:30:318 days 17 hrs ago0x5ae7c83e39d1bb56cad34a6aa96cb442dcce996d IN  0x6fed400da17f2678c450aa1d35e909653b3b482a0 FTM0.019511428943
0xb4b0d8c12c3da87656c38f88e6d1c3eab216524a135f20fb3fcb8702ae0408fdSafe Transfer Fr...227371072021-11-21 21:12:119 days 6 hrs ago0x5ae7c83e39d1bb56cad34a6aa96cb442dcce996d IN  0x6fed400da17f2678c450aa1d35e909653b3b482a0 FTM0.027288819354
0x61f13263253cb3ecab028eb56a34874bbbca688a8644d0e4575ffd3fe8854f10Set Approval For...226764262021-11-21 6:23:039 days 21 hrs ago0x603267cffd1c90bfd0b5692ab5e71b4e90a4403e IN  0x6fed400da17f2678c450aa1d35e909653b3b482a0 FTM0.008183294513
0x03073a9951f45b41756512c6d4eb12721dcb7e35fd750ad2d1ac8d4d2ca5ff28Transfer From226718622021-11-21 5:12:269 days 22 hrs ago0x857e94c989e04c21bcb44deb523abca6e77a9b42 IN  0x6fed400da17f2678c450aa1d35e909653b3b482a0 FTM0.013208949416
0x0ee21902491e2562112488c2108e1a33ad29dc9f464a8b282cae929d3b28d551Transfer From226650362021-11-21 3:28:3910 days 34 mins ago0x2708ecfd5ff9243a3335b16b485a744e8a6c5b90 IN  0x6fed400da17f2678c450aa1d35e909653b3b482a0 FTM0.017747840948
0x58016c2997090bb15df4b6065f0427923a9c4ab9b912b10e91cf4370e6411b69Set Approval For...226363612021-11-20 20:19:3110 days 7 hrs ago0xcc3f3e0d5155c7436a5c8f7aa6b7bde5797813e9 IN  0x6fed400da17f2678c450aa1d35e909653b3b482a0 FTM0.014798022718
0xa7a2d2dbfcb4e8391879093365565c1eae79795f3b3139f5b7952d6579497cd6Set Approval For...226098682021-11-20 13:47:2110 days 14 hrs ago0x857e94c989e04c21bcb44deb523abca6e77a9b42 IN  0x6fed400da17f2678c450aa1d35e909653b3b482a0 FTM0.00983439166
0x254e012152322ff95c592b33ca8d0eaa5936319cab9f46ab187477c313d2289eSet Approval For...225322262021-11-19 18:12:2711 days 9 hrs ago0x2811d20d1764256b763d24ef4c977992c13c5a64 IN  0x6fed400da17f2678c450aa1d35e909653b3b482a0 FTM0.013097212824
0xead057e02d0a52c7e14e9fb51987f263b2008cc76c497d8e97da996086f99b96Set Approval For...224348842021-11-18 17:41:3912 days 10 hrs ago0x22fd7dba4d1ee80d2d7c2305b810559284defc60 IN  0x6fed400da17f2678c450aa1d35e909653b3b482a0 FTM0.065922605784
0x25fcd89d26b980847d38718fc16c544d738f9ab489ddbf497b6befa24c5b9f3cSet Approval For...223580382021-11-17 22:12:0113 days 5 hrs ago0xf7da339761e39047293840ba817969719a2f33c5 IN  0x6fed400da17f2678c450aa1d35e909653b3b482a0 FTM0.010388161228
0x208961406bcadfdf595bb896afd271dc79e3cf4370fc39a978a84b2d7ec04de8Transfer From222311242021-11-16 14:56:4314 days 13 hrs ago0x535398d7601b6bba4164a7bb325a7a27529f2ed5 IN  0x6fed400da17f2678c450aa1d35e909653b3b482a0 FTM0.022760523759
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xc00cc5abcc10c55ac2be4ad01c1771a333df2ef5fb896b35d8437b30f80251c0194484862021-10-18 21:44:5743 days 6 hrs ago 0x6fed400da17f2678c450aa1d35e909653b3b482a0xd855cb80863a680d7f2c2dec1823b00231d4b41b3,651 FTM
0xe6c5b9b9f9e9ffbf677025c7257bbd71e1f1eadf0fe74b5c014a18e75cbefb97194261492021-10-18 16:16:3543 days 11 hrs ago 0x03683bf76c47869784e83db26df1abb61665b92f 0x6fed400da17f2678c450aa1d35e909653b3b482a3.9782986111109484 FTM
0x188b89089706f6de145c87bb6068d7a3217b1e46f4db5ba50d07954a18110e8d188647312021-10-11 21:49:4950 days 6 hrs ago 0x60427add00dccd7c9b37438cd0459ec8fd14e687 0x6fed400da17f2678c450aa1d35e909653b3b482a5 FTM
0x4c191d7137436945b7971a02776433bf249160bd35479fa26422490be40365a4188647312021-10-11 21:49:4950 days 6 hrs ago 0x9f1ea0e9ca2ba0cd4ddc5742127ffceba60edf47 0x6fed400da17f2678c450aa1d35e909653b3b482a10 FTM
0x8e5df4573791c81b5c5a017b5d57edd1ba5780edf04f0f1d1a59612a01d95896188647252021-10-11 21:49:4350 days 6 hrs ago 0x1d5c7762b24d6926276dbfc272883a9fc0eca8f7 0x6fed400da17f2678c450aa1d35e909653b3b482a10 FTM
0x5c5c29040c21aa25fe0c07a7300a18d4ef483c113a0c161b5c157117262ff059188647102021-10-11 21:49:3150 days 6 hrs ago 0xa067dbb4fc3db0479f0d69dd6667415979c82ca0 0x6fed400da17f2678c450aa1d35e909653b3b482a5 FTM
0xc21dc125f407336950a670d0645c9facb46a25000ee36f590fdbe1d97bb696d9188647052021-10-11 21:49:2750 days 6 hrs ago 0x15ec0e04c943d6e021aa10a3ef06baa3828986e5 0x6fed400da17f2678c450aa1d35e909653b3b482a3 FTM
0xb4fcf0d12b6e4ff33bd90aa8f5480ca525418154d94ae9e773326bce14d1e966188646972021-10-11 21:49:2150 days 6 hrs ago 0x15ec0e04c943d6e021aa10a3ef06baa3828986e5 0x6fed400da17f2678c450aa1d35e909653b3b482a1 FTM
0x9988d6b3cdbdf03cafa9de7a0f2951bd77900fc75a8eec85e8b6eab9f41c14e5188646772021-10-11 21:49:0250 days 6 hrs ago 0x1d5c7762b24d6926276dbfc272883a9fc0eca8f7 0x6fed400da17f2678c450aa1d35e909653b3b482a50 FTM
0x39c01c0243ce9b0371fb6207860f14fc68bc683e6808b4b81f48dda902feedd8188646552021-10-11 21:48:4650 days 6 hrs ago 0x934c80e3a3e9136ee3558950385b66ac5e7d9bf7 0x6fed400da17f2678c450aa1d35e909653b3b482a1 FTM
0x97aea948910637c8c235f18112eebca5d05f908b876bfe3d4dcb42388c25b41d188646552021-10-11 21:48:4650 days 6 hrs ago 0x8c3e41afab62df84453442af2a9cb47317c47e42 0x6fed400da17f2678c450aa1d35e909653b3b482a14 FTM
0x442dd2593c52ed5a1a12afc4400ff5e5123ac7b5c1899b72fe6861c12c3db7f4188646542021-10-11 21:48:4450 days 6 hrs ago 0xa067dbb4fc3db0479f0d69dd6667415979c82ca0 0x6fed400da17f2678c450aa1d35e909653b3b482a10 FTM
0xc8308e59115a8c1f4297ab6e7681a310961b2831af90c90fcc537b462c7f2f84188646272021-10-11 21:48:2250 days 6 hrs ago 0x5dba80185e29d150ce2a45e5f59188c5ade282ee 0x6fed400da17f2678c450aa1d35e909653b3b482a40 FTM
0xc76abdb62ddde158ebc3889c3584366fb9d9b99de6f6af0dbdb5b295bbf69df7188646252021-10-11 21:48:2050 days 6 hrs ago 0x060ff1b413d89ba015a78429a42934fc0d7dc0e6 0x6fed400da17f2678c450aa1d35e909653b3b482a3 FTM
0x476d83c267dc8a656db47b262137267c15a616495a46eea029e79ca84696d8c9188646222021-10-11 21:48:1850 days 6 hrs ago 0xa067dbb4fc3db0479f0d69dd6667415979c82ca0 0x6fed400da17f2678c450aa1d35e909653b3b482a10 FTM
0xfe7cf3f898b5092ed3dc5a2fee1fc335ef33ab7fa02ad5863169765390a63afb188646102021-10-11 21:48:0750 days 6 hrs ago 0x934c80e3a3e9136ee3558950385b66ac5e7d9bf7 0x6fed400da17f2678c450aa1d35e909653b3b482a1 FTM
0x9b3268bcda0609331bcff0b28d3d50e49b69dd0f33e2d1e542225323e44405e4188646092021-10-11 21:48:0650 days 6 hrs ago 0x76f8681a708423655acc0c2b9420fae6cc5c8c66 0x6fed400da17f2678c450aa1d35e909653b3b482a1 FTM
0x64e0f75b5028dc71ae00a6cdf730c549efca4774ce96d05cc1835683fda7b32f188646012021-10-11 21:47:5450 days 6 hrs ago 0x934c80e3a3e9136ee3558950385b66ac5e7d9bf7 0x6fed400da17f2678c450aa1d35e909653b3b482a1 FTM
0x956e8ee7a4eecc4f6baac50c942f3d5769c16c3505695a9e53429d14b2c89930188645942021-10-11 21:47:4650 days 6 hrs ago 0x934c80e3a3e9136ee3558950385b66ac5e7d9bf7 0x6fed400da17f2678c450aa1d35e909653b3b482a1 FTM
0x4985fc823430b6573f76a6d3f9c390ce4789fd0c286e9bf46ba53561ad45cd89188645912021-10-11 21:47:4450 days 6 hrs ago 0x5dba80185e29d150ce2a45e5f59188c5ade282ee 0x6fed400da17f2678c450aa1d35e909653b3b482a1 FTM
0x9ee6e9c92630c1e6432ff9721c667fd5882a8d1e7fdcc73fc3eeacd13693e8cf188645892021-10-11 21:47:4250 days 6 hrs ago 0x934c80e3a3e9136ee3558950385b66ac5e7d9bf7 0x6fed400da17f2678c450aa1d35e909653b3b482a1 FTM
0xd7c97795789136d1e79da159014fa3f6a266c33550bc3de6e8cb1dd309dfbb36188645852021-10-11 21:47:3950 days 6 hrs ago 0x934c80e3a3e9136ee3558950385b66ac5e7d9bf7 0x6fed400da17f2678c450aa1d35e909653b3b482a1 FTM
0xf65fbb2790caa03d8bfbe0f37fc4def6766d3929041b54c9eb6f8f370c8f011d188645682021-10-11 21:47:2350 days 6 hrs ago 0x15ec0e04c943d6e021aa10a3ef06baa3828986e5 0x6fed400da17f2678c450aa1d35e909653b3b482a2 FTM
0xfe1c782bb9478ae8aeaf1c8fa6b1ac8def84459f9905af9c5abefcf0e5665f09188645652021-10-11 21:47:2050 days 6 hrs ago 0x40ebab09caf93415e2b15d645b8a3093f01ccba2 0x6fed400da17f2678c450aa1d35e909653b3b482a10 FTM
0x41941f691f5775fc6deadea64387753975d238663f1c965a479cadd1dfab5e45188645582021-10-11 21:47:1450 days 6 hrs ago 0x919eef36956776968b5c8f84973ae8895426f88a 0x6fed400da17f2678c450aa1d35e909653b3b482a1 FTM
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SummonerSkins

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at FtmScan.com on 2021-10-04
*/

//SPDX-License-Identifier: MIT
pragma solidity >=0.8.0 <0.9.0;


/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

interface myIERC721 {
    function ownerOf(uint256 tokenId) external view returns (address owner);
    function getApproved(uint256 tokenId) external view returns (address operator);
    function isApprovedForAll(address owner, address operator) external view returns (bool);
    
    // want to implement an ERC721 that can be used as skin only for the intended class ?
    // vvv expose those two functions vvv
    function isStrictOnSummonerClass() external returns (bool);
    function class(uint) external returns (uint);
}

// gift to the community : open standard to use any ERC721 as summoner skin !
contract RaritySkinManager is Ownable {
    
    address constant rarity = 0xce761D788DF608BD21bdd59d6f4B54b2e27F25Bb;
    
    mapping(uint256 => Skin) public skinOf;
    mapping(bytes32 => uint256) public summonerOf;
    mapping(address => bool) private trustedImplementations;
    
    event SumonnerSkinAssigned (Skin skin, uint256 summoner);
    
    struct Skin {
        address implementation;
        uint256 tokenId;
    }
    
    modifier classChecked(address implementation, uint tokenId, uint summonerId) {
        try myIERC721(implementation).isStrictOnSummonerClass() returns(bool isStrict) {
            if(isStrict){
                require(myIERC721(rarity).class(summonerId) == myIERC721(implementation).class(tokenId), "Summoner and skin must be of the same class");
            }

            _;
        } catch Panic(uint) {
            _;
        }
    }
    
    function assignSkinToSummoner(address implementation, uint tokenId, uint summonerId) external 
    classChecked(implementation, tokenId, summonerId) {
        require(isApprovedOrOwner(implementation, msg.sender, tokenId), "You must be owner or approved for this token");
        require(isApprovedOrOwner(rarity, msg.sender, summonerId), "You must be owner or approved for this summoner");
        
        _assignSkinToSummoner(implementation, tokenId, summonerId);
    }

    // you can request the owner of this contract to add your NFT contract to the trusted list if you implement ownership checks on summoner and token
    function trustedAssignSkinToSummoner(uint tokenId, uint summonerId) external
    classChecked(msg.sender, tokenId, summonerId) {
        require(trustedImplementations[msg.sender], "Only trusted ERC721 implementations can access this way of assignation");
        
        _assignSkinToSummoner(msg.sender, tokenId, summonerId);
    }
    
    function _assignSkinToSummoner(address implementation, uint tokenId, uint summonerId) private {
        // reinitialize previous assignation
        skinOf[summonerOf[skinKey(Skin(implementation, tokenId))]] = Skin(address(0),0);
        
        summonerOf[skinKey(Skin(implementation, tokenId))] = summonerId;
        skinOf[summonerId] = Skin(implementation, tokenId);
        
        emit SumonnerSkinAssigned(Skin(implementation, tokenId), summonerId);
    }
    
    function skinKey(Skin memory skin) public pure returns(bytes32) {
        return keccak256(abi.encodePacked(skin.implementation, skin.tokenId));
    }
    
    function trustImplementation(address _impAddress) external onlyOwner {
        trustedImplementations[_impAddress] = true;
    }
    
    function isApprovedOrOwner(address nftAddress, address spender, uint256 tokenId) private view returns (bool) {
        myIERC721 implementation = myIERC721(nftAddress);
        address owner = implementation.ownerOf(tokenId);
        return (spender == owner || implementation.getApproved(tokenId) == spender || implementation.isApprovedForAll(owner, spender));
    }
}

/// @title Base64
/// @author Brecht Devos - <[email protected]>
/// @notice Provides a function for encoding some bytes in base64
library Base64 {
    string internal constant TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return '';
        
        // load the table into memory
        string memory table = TABLE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)
            
            // prepare the lookup table
            let tablePtr := add(table, 1)
            
            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))
            
            // result ptr, jump over length
            let resultPtr := add(result, 32)
            
            // run over the input, 3 bytes at a time
            for {} lt(dataPtr, endPtr) {}
            {
               dataPtr := add(dataPtr, 3)
               
               // read 3 bytes
               let input := mload(dataPtr)
               
               // write 4 characters
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F)))))
               resultPtr := add(resultPtr, 1)
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F)))))
               resultPtr := add(resultPtr, 1)
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr( 6, input), 0x3F)))))
               resultPtr := add(resultPtr, 1)
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(        input,  0x3F)))))
               resultPtr := add(resultPtr, 1)
            }
            
            // padding with '='
            switch mod(mload(data), 3)
            case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
            case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }
        }
        
        return result;
    }
}

interface Rarity {
    function ownerOf(uint256 tokenId) external view returns (address owner);
    function getApproved(uint256 tokenId) external view returns (address operator);
    function isApprovedForAll(address owner, address operator) external view returns (bool);
    function class(uint) external returns (uint);
}

contract SummonerSkins is ReentrancyGuard, Ownable, ERC721Enumerable {
    using Counters for Counters.Counter;
	
    Counters.Counter private _tokenIds;

	Rarity constant rarity = Rarity(0xce761D788DF608BD21bdd59d6f4B54b2e27F25Bb);
	SkinURIs public skinURIs;
	RaritySkinManager public raritySkinManager;
	
	// config
	uint constant maxSupply = 5000;
	uint constant startingPrice = 5 ether;
	uint constant auctionDuration = 4 days;
	bool constant public isStrictOnSummonerClass = true;
	uint minimumPrice = 1 ether;
	
	uint immutable startDate;

    mapping(uint256 => uint) skinDNA;
    mapping(uint => uint) public class;
    
    constructor() ERC721("Summoner Rare Skins", "RARE SKINS"){
		startDate = block.timestamp;
		skinURIs = new SkinURIs(maxSupply);
		raritySkinManager = new RaritySkinManager();
		raritySkinManager.trustImplementation(address(this));
		raritySkinManager.transferOwnership(msg.sender);
		skinURIs.transferOwnership(msg.sender);
	}
	
	// Minting logic
	
	function getPrice() public view returns(uint){ // Dutch Auction
	    return ( block.timestamp < startDate + auctionDuration ?
	            max((startingPrice / auctionDuration) * ((startDate + auctionDuration) - block.timestamp), minimumPrice)
	        :
	            minimumPrice);
	}
	
	function max(uint a, uint b) private pure returns(uint){
	    return a > b ? a : b;
	}
	
	modifier supplyAndPriceAreSufficient(uint quantity) {
	    require(_tokenIds.current() < maxSupply, "maximum skins reached");
		require(_tokenIds.current() + quantity <= maxSupply, "mint quantity exceeds max supply");
		require(msg.value >= getPrice() * quantity, "the FTM transfer amount is under the price");
	    
	    _;
	}
	
	function mint(uint quantity) external payable nonReentrant supplyAndPriceAreSufficient(quantity) { // mint random classes
	    uint randomClass = randomUint(_tokenIds.current()) % 11;
	    
	    for(uint i = 0; i < quantity; i++){
	        _mintOneSkin(((randomClass + i) % 11) + 1);
	    }
	}
	
	function mintAndAssign(uint256[] memory summonerIds) external payable nonReentrant supplyAndPriceAreSufficient(summonerIds.length) { // mint and assign
		for(uint i = 0; i < summonerIds.length; i++){
            require(_isApprovedOrOwnerInRarity(summonerIds[i]), "You must be owner or approved for this summoner");
		    
		    raritySkinManager.trustedAssignSkinToSummoner(_mintOneSkin(rarity.class(summonerIds[i])), summonerIds[i]);
		}
	}

	function _mintOneSkin(uint _class) private returns(uint skinId) {
        uint random = randomUint(_tokenIds.current());
        
        _tokenIds.increment();
        _safeMint(msg.sender, _tokenIds.current());
        skinDNA[_tokenIds.current()] = random;
        class[_tokenIds.current()] = _class;
        
        // no emit here : openzeppelin's ERC721 implementation already emits a 'mint' event
        
        return(_tokenIds.current());
    }
    
    // URI
	
	function tokenURI(uint256 _tokenId) public override view returns (string memory) {
	    require(_exists(_tokenId), "tokenURI: nonexistent token");
	    
	    return skinURIs.tokenURI(_tokenId, skinDNA[_tokenId]);
	}
	
	// admin actions
	
	function withdraw() public onlyOwner {
		(bool success, ) = msg.sender.call{value: address(this).balance}('');
		require(success, "Withdrawal failed");
	}
	
	function setMinimumPrice(uint _minimumPrice) public onlyOwner {
	    minimumPrice = _minimumPrice;
	}
	
	// utils
	
	function randomUint(uint id) private view returns(uint) {
	    return(uint(keccak256(abi.encodePacked(blockhash(block.number - 1), id))));
	}
	
	function _isApprovedOrOwnerInRarity(uint summonerId) private view returns(bool){
	    address owner = rarity.ownerOf(summonerId);
        return (msg.sender == owner || rarity.getApproved(summonerId) == msg.sender || rarity.isApprovedForAll(owner, msg.sender));
	}
}

// credits to Luchadores NFTs for most of the code https://etherscan.io/address/0x8b4616926705Fb61E9C4eeAc07cd946a5D4b0760#code
// svg logic had to be put in a separate contract to fit in contract size limit.
// This has no impact on gas because the only exposed function is only meant for call
contract SkinURIs is Ownable {
    using Strings for uint256;

	// 0 : accessories
	// 1 : weapons
	// 2 : heads
	// 3 : shoes
	// 4 : torsos
	// 5 : base colors
	// 6 : alt colors
	// 7 : skin colors
	// 8 : alt parts
	// 9 : color parts
	// 10: shadow parts
	// 11: base parts
	mapping(uint => mapping(uint => string)) art;

	string[][5] traitName;
	uint256 immutable maxSupply;
	SummonerSkins immutable skins;

	string constant altPartForBardClericAndDruid = '<path d="M14 20h-1-1-1-1-1v1 1 1h1 1v-1h1 1 1 1v-1-1h-1z"/>';
	string constant shadowPartForSorcererAndWizard = '<path d="M14 19v1 1 1h1v-1-1-1-1-1h-1v1 1zm-4-2h1v1h-1z"/><path d="M9 18h1v1H9zm0-3h1v1H9zm5-3h1v1h-1zm-7-1h1v1H7z"/><path d="M8 10h1v1H8zm3 3v-1h-1-1v1 1h1v-1h1z"/><path d="M13 14v1 1 1h1v-1-1-1-1h-1v1zm-2 0h-1v1h1v1 1h1v-1-1-1-1h-1v1zm4 0h1v1h-1zm0-3h1v1h-1zm-8 7h1v1H7z"/><path d="M7 16v-1-1-1-1H6v1 1 1 1 1 1h1v-1-1zm1 4v1h1v-1-1H8v1z"/><path d="M7 22v1 1h1 1v-1H8v-1-1H7v1z"/>';

    constructor(uint256 _maxSupply) {
		maxSupply = _maxSupply;
		skins = SummonerSkins(msg.sender);

		traitName[0] = ["Bracelet","Earring","Necklace","Ring","Gloves"];
		traitName[1] = ["Bow","Dagger","Fireball","Halberd","Hatchet","Katana","Knives","Spear","Sword","Wand"];
		traitName[2] = ["Eye Patch","Hat","Headband","Horned","Knight","White Eyes"];
		traitName[3] = ["Big Shoes","Sandals","Shoes","Winged Shoes"];
		traitName[4] = ["Armor","Backpack","Beard","Cape","Satchel","Scabbard","Scarf"];
    }
    
	function tokenURI(uint256 _tokenId, uint256 _dna) external view returns (string memory) {
		return string(abi.encodePacked('data:application/json;base64,',Base64.encode(bytes(metadata(_tokenId,_dna)))));
	}

	function initializeArt(uint startIndex, string[][] calldata data) public onlyOwner {
		for(uint i = 0; i < data.length; i++){
			for(uint j = 0; j < data[i].length; j++){
				art[startIndex + i][j] = data[i][j];
			}
		}
	}
	
	// private funcs
	
	function metadata(uint256 _tokenId, uint256 _dna) private view returns (string memory) {
		uint8[8] memory dna = splitNumber(_dna);

		string memory attributes;

		string[5] memory traitType = ["Accessory","Weapon","Head","Shoes","Torso"];

		for (uint256 i = 0; i < 5; i++) {
			if (bytes(art[i][dna[i]]).length > 0){
				attributes = string(abi.encodePacked(
					attributes, bytes(attributes).length == 0 ? '{' : ', {',
					'"trait_type": "', traitType[i],'",',
					'"value": "', traitName[i][dna[i]], '"',
				'}'));
			}
		}

		return string(abi.encodePacked(
			'{',
				'"name": "Rare Skin #', _tokenId.toString(), '",', 
				'"description": "Rare Skins are randomly generated and have 100% on-chain art and metadata - Only ',maxSupply.toString(),' will ever exist!",',
				'"image": "data:image/svg+xml;base64,', Base64.encode(imageData(_tokenId, _dna)), '",',
				'"attributes": [', attributes, ']',
			'}'
		));
	}
	
	function imageData(uint256 _tokenId, uint256 _dna) private view returns (bytes memory) {
		uint8[8] memory dna = splitNumber(_dna);
		uint class = skins.class(_tokenId) - 1;

		string memory skinOfRanger = class == 7 || class == 1 ? string(abi.encodePacked('<path d="M15.99 11v-1h1V9h-1V5h-1V4h-1V3h-4v1h-1v1h-1v5h1v1h1v2h-1-1-1v1 1 1h1v2h2v1h-1v5h1 5 1v-1h-1v-5h1v-1h1v-2h-1v-1-1h-1v-2h1z" fill="#',art[7][dna[7]],'"/>')) : '';

		return abi.encodePacked(
			"<svg id='Rare Skin #", _tokenId.toString(), "' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'>",
				'<path fill="#',art[7][dna[7]],'" d="M16 11v-1h1V9h-1V5h-1V4h-1V3h-4v1H9v1H8v5h1v1h1v4H8v3h2v1H9v5h1 5 1v-1h-1v-5h1v-1h1v-2h-2v-4h1z"/>', // skin
				skinOfRanger,
				'<path d="M12 7h1v1h-1zm3 0h1v1h-1z" fill="#fff"/>', // base eyes
				'<g fill="#',art[6][dna[6]],'">', // alt color
					art[8][class], // alt part
				'</g>',
				'<g fill="#',art[5][dna[5]],'">', // base color
					art[9][class], // color part
				"</g>",
				"<g opacity='.23'>",
					art[10][class], // shadow part
				"</g>",
				art[11][class], // base part
				accessoriesSvg(dna),
			"</svg>"
		);
	}

	function accessoriesSvg(uint8[8] memory dna) private view returns (string memory) {
		return(string(abi.encodePacked(
				art[4][dna[4]], // torso
				art[2][dna[2]], // head
				art[0][dna[0]], // accessory
				art[3][dna[3]], // shoes
				art[1][dna[1]]))); // weapon
	}
	
	// utils
	
	function splitNumber(uint256 _number) internal pure returns (uint8[8] memory) {
		uint8[8] memory numbers;
		
		numbers[0] = uint8(_number % 10); // accessory 1/2
		_number /= 10;
		numbers[1] = uint8(_number % 14); // weapon 5/7
		_number /= 14;
		numbers[2] = uint8(_number % 12); // head 1/2
		_number /= 12;
		numbers[3] = uint8(_number % 8); // shoes 1/2
		_number /= 8;
		numbers[4] = uint8(_number % 16); // torsos 7/16
		_number /= 16;

		for (uint256 i = 5; i < numbers.length; i++) {
			numbers[i] = uint8(_number % 10);
			_number /= 10;
		}

		return numbers;
	}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"class","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"isStrictOnSummonerClass","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"summonerIds","type":"uint256[]"}],"name":"mintAndAssign","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"raritySkinManager","outputs":[{"internalType":"contract RaritySkinManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","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":"uint256","name":"_minimumPrice","type":"uint256"}],"name":"setMinimumPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"skinURIs","outputs":[{"internalType":"contract SkinURIs","name":"","type":"address"}],"stateMutability":"view","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a0604052670de0b6b3a7640000600f553480156200001d57600080fd5b506040518060400160405280601381526020017f53756d6d6f6e6572205261726520536b696e73000000000000000000000000008152506040518060400160405280600a81526020017f5241524520534b494e53000000000000000000000000000000000000000000008152506001600081905550620000b2620000a66200038e60201b60201c565b6200039660201b60201c565b8160029080519060200190620000ca9291906200045c565b508060039080519060200190620000e39291906200045c565b5050504260808181525050611388604051620000ff90620004ed565b6200010b919062000543565b604051809103906000f08015801562000128573d6000803e3d6000fd5b50600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040516200017790620004fb565b604051809103906000f08015801562000194573d6000803e3d6000fd5b50600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f8588f16306040518263ffffffff1660e01b8152600401620002329190620005a5565b600060405180830381600087803b1580156200024d57600080fd5b505af115801562000262573d6000803e3d6000fd5b50505050600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f2fde38b336040518263ffffffff1660e01b8152600401620002c39190620005a5565b600060405180830381600087803b158015620002de57600080fd5b505af1158015620002f3573d6000803e3d6000fd5b50505050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f2fde38b336040518263ffffffff1660e01b8152600401620003549190620005a5565b600060405180830381600087803b1580156200036f57600080fd5b505af115801562000384573d6000803e3d6000fd5b5050505062000627565b600033905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200046a90620005f1565b90600052602060002090601f0160209004810192826200048e5760008555620004da565b82601f10620004a957805160ff1916838001178555620004da565b82800160010185558215620004da579182015b82811115620004d9578251825591602001919060010190620004bc565b5b509050620004e9919062000509565b5090565b6135318062004cf883390190565b611bb0806200822983390190565b5b80821115620005245760008160009055506001016200050a565b5090565b6000819050919050565b6200053d8162000528565b82525050565b60006020820190506200055a600083018462000532565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200058d8262000560565b9050919050565b6200059f8162000580565b82525050565b6000602082019050620005bc600083018462000594565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200060a57607f821691505b60208210811415620006215762000620620005c2565b5b50919050565b6080516146ae6200064a60003960008181610fd5015261101601526146ae6000f3fe6080604052600436106101b75760003560e01c80636352211e116100ec578063a22cb4651161008a578063c87b56dd11610064578063c87b56dd146105ff578063e985e9c51461063c578063f2fde38b14610679578063f41327ca146106a2576101b7565b8063a22cb46514610582578063b88d4fde146105ab578063b8dbacf9146105d4576101b7565b80638da5cb5b116100c65780638da5cb5b146104e557806395d89b411461051057806398d5fdca1461053b578063a0712d6814610566576101b7565b80636352211e1461045457806370a0823114610491578063715018a6146104ce576101b7565b806325cea976116101595780633ccfd60b116101335780633ccfd60b146103ac57806342842e0e146103c35780634f33a4ea146103ec5780634f6ccce714610417576101b7565b806325cea976146103095780632f745c59146103325780633613a9f41461036f576101b7565b8063095ea7b311610195578063095ea7b3146102615780630e83a5a71461028a57806318160ddd146102b557806323b872dd146102e0576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612cb1565b6106be565b6040516101f09190612cf9565b60405180910390f35b34801561020557600080fd5b5061020e610738565b60405161021b9190612dad565b60405180910390f35b34801561023057600080fd5b5061024b60048036038101906102469190612e05565b6107ca565b6040516102589190612e73565b60405180910390f35b34801561026d57600080fd5b5061028860048036038101906102839190612eba565b61084f565b005b34801561029657600080fd5b5061029f610967565b6040516102ac9190612f59565b60405180910390f35b3480156102c157600080fd5b506102ca61098d565b6040516102d79190612f83565b60405180910390f35b3480156102ec57600080fd5b5061030760048036038101906103029190612f9e565b61099a565b005b34801561031557600080fd5b50610330600480360381019061032b9190612e05565b6109fa565b005b34801561033e57600080fd5b5061035960048036038101906103549190612eba565b610a80565b6040516103669190612f83565b60405180910390f35b34801561037b57600080fd5b5061039660048036038101906103919190612e05565b610b25565b6040516103a39190612f83565b60405180910390f35b3480156103b857600080fd5b506103c1610b3d565b005b3480156103cf57600080fd5b506103ea60048036038101906103e59190612f9e565b610c68565b005b3480156103f857600080fd5b50610401610c88565b60405161040e9190613012565b60405180910390f35b34801561042357600080fd5b5061043e60048036038101906104399190612e05565b610cae565b60405161044b9190612f83565b60405180910390f35b34801561046057600080fd5b5061047b60048036038101906104769190612e05565b610d1f565b6040516104889190612e73565b60405180910390f35b34801561049d57600080fd5b506104b860048036038101906104b3919061302d565b610dd1565b6040516104c59190612f83565b60405180910390f35b3480156104da57600080fd5b506104e3610e89565b005b3480156104f157600080fd5b506104fa610f11565b6040516105079190612e73565b60405180910390f35b34801561051c57600080fd5b50610525610f3b565b6040516105329190612dad565b60405180910390f35b34801561054757600080fd5b50610550610fcd565b60405161055d9190612f83565b60405180910390f35b610580600480360381019061057b9190612e05565b611078565b005b34801561058e57600080fd5b506105a960048036038101906105a49190613086565b61123d565b005b3480156105b757600080fd5b506105d260048036038101906105cd91906131fb565b6113be565b005b3480156105e057600080fd5b506105e9611420565b6040516105f69190612cf9565b60405180910390f35b34801561060b57600080fd5b5061062660048036038101906106219190612e05565b611425565b6040516106339190612dad565b60405180910390f35b34801561064857600080fd5b50610663600480360381019061065e919061327e565b61153b565b6040516106709190612cf9565b60405180910390f35b34801561068557600080fd5b506106a0600480360381019061069b919061302d565b6115cf565b005b6106bc60048036038101906106b79190613386565b6116c7565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610731575061073082611a08565b5b9050919050565b606060028054610747906133fe565b80601f0160208091040260200160405190810160405280929190818152602001828054610773906133fe565b80156107c05780601f10610795576101008083540402835291602001916107c0565b820191906000526020600020905b8154815290600101906020018083116107a357829003601f168201915b5050505050905090565b60006107d582611aea565b610814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080b906134a2565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061085a82610d1f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c290613534565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108ea611b56565b73ffffffffffffffffffffffffffffffffffffffff161480610919575061091881610913611b56565b61153b565b5b610958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094f906135c6565b60405180910390fd5b6109628383611b5e565b505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600a80549050905090565b6109ab6109a5611b56565b82611c17565b6109ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e190613658565b60405180910390fd5b6109f5838383611cf5565b505050565b610a02611b56565b73ffffffffffffffffffffffffffffffffffffffff16610a20610f11565b73ffffffffffffffffffffffffffffffffffffffff1614610a76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6d906136c4565b60405180910390fd5b80600f8190555050565b6000610a8b83610dd1565b8210610acc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac390613756565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60116020528060005260406000206000915090505481565b610b45611b56565b73ffffffffffffffffffffffffffffffffffffffff16610b63610f11565b73ffffffffffffffffffffffffffffffffffffffff1614610bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb0906136c4565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610bdf906137a7565b60006040518083038185875af1925050503d8060008114610c1c576040519150601f19603f3d011682016040523d82523d6000602084013e610c21565b606091505b5050905080610c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5c90613808565b60405180910390fd5b50565b610c83838383604051806020016040528060008152506113be565b505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610cb861098d565b8210610cf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf09061389a565b60405180910390fd5b600a8281548110610d0d57610d0c6138ba565b5b90600052602060002001549050919050565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbf9061395b565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e39906139ed565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e91611b56565b73ffffffffffffffffffffffffffffffffffffffff16610eaf610f11565b73ffffffffffffffffffffffffffffffffffffffff1614610f05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efc906136c4565b60405180910390fd5b610f0f6000611f51565b565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610f4a906133fe565b80601f0160208091040260200160405190810160405280929190818152602001828054610f76906133fe565b8015610fc35780601f10610f9857610100808354040283529160200191610fc3565b820191906000526020600020905b815481529060010190602001808311610fa657829003601f168201915b5050505050905090565b6000620546007f0000000000000000000000000000000000000000000000000000000000000000610ffe9190613a3c565b421061100c57600f54611073565b61107242620546007f000000000000000000000000000000000000000000000000000000000000000061103f9190613a3c565b6110499190613a92565b62054600674563918244f400006110609190613af5565b61106a9190613b26565b600f54612017565b5b905090565b600260005414156110be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b590613bcc565b60405180910390fd5b6002600081905550806113886110d4600c612030565b10611114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110b90613c38565b60405180910390fd5b61138881611122600c612030565b61112c9190613a3c565b111561116d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116490613ca4565b60405180910390fd5b80611176610fcd565b6111809190613b26565b3410156111c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b990613d36565b60405180910390fd5b6000600b6111d86111d3600c612030565b61203e565b6111e29190613d56565b905060005b8381101561122f5761121b6001600b83856112029190613a3c565b61120c9190613d56565b6112169190613a3c565b612080565b50808061122790613d87565b9150506111e7565b505050600160008190555050565b611245611b56565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112aa90613e1c565b60405180910390fd5b80600760006112c0611b56565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661136d611b56565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113b29190612cf9565b60405180910390a35050565b6113cf6113c9611b56565b83611c17565b61140e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140590613658565b60405180910390fd5b61141a84848484612108565b50505050565b600181565b606061143082611aea565b61146f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146690613e88565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166392cb829d8360106000868152602001908152602001600020546040518363ffffffff1660e01b81526004016114df929190613ea8565b60006040518083038186803b1580156114f757600080fd5b505afa15801561150b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906115349190613f72565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115d7611b56565b73ffffffffffffffffffffffffffffffffffffffff166115f5610f11565b73ffffffffffffffffffffffffffffffffffffffff161461164b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611642906136c4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b29061402d565b60405180910390fd5b6116c481611f51565b50565b6002600054141561170d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170490613bcc565b60405180910390fd5b60026000819055508051611388611724600c612030565b10611764576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175b90613c38565b60405180910390fd5b61138881611772600c612030565b61177c9190613a3c565b11156117bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b490613ca4565b60405180910390fd5b806117c6610fcd565b6117d09190613b26565b341015611812576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180990613d36565b60405180910390fd5b60005b82518110156119fb57611841838281518110611834576118336138ba565b5b6020026020010151612164565b611880576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611877906140bf565b60405180910390fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1662a7c6ee61197e73ce761d788df608bd21bdd59d6f4b54b2e27f25bb73ffffffffffffffffffffffffffffffffffffffff16633613a9f4878681518110611903576119026138ba565b5b60200260200101516040518263ffffffff1660e01b81526004016119279190612f83565b602060405180830381600087803b15801561194157600080fd5b505af1158015611955573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197991906140f4565b612080565b858481518110611991576119906138ba565b5b60200260200101516040518363ffffffff1660e01b81526004016119b6929190613ea8565b600060405180830381600087803b1580156119d057600080fd5b505af11580156119e4573d6000803e3d6000fd5b5050505080806119f390613d87565b915050611815565b5050600160008190555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ad357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611ae35750611ae2826123b5565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611bd183610d1f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c2282611aea565b611c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5890614193565b60405180910390fd5b6000611c6c83610d1f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611cdb57508373ffffffffffffffffffffffffffffffffffffffff16611cc3846107ca565b73ffffffffffffffffffffffffffffffffffffffff16145b80611cec5750611ceb818561153b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d1582610d1f565b73ffffffffffffffffffffffffffffffffffffffff1614611d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6290614225565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd2906142b7565b60405180910390fd5b611de683838361241f565b611df1600082611b5e565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e419190613a92565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e989190613a3c565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183116120265781612028565b825b905092915050565b600081600001549050919050565b600060014361204d9190613a92565b4082604051602001612060929190614323565b6040516020818303038152906040528051906020012060001c9050919050565b600080612095612090600c612030565b61203e565b90506120a1600c612533565b6120b4336120af600c612030565b612549565b80601060006120c3600c612030565b81526020019081526020016000208190555082601160006120e4600c612030565b815260200190815260200160002081905550612100600c612030565b915050919050565b612113848484611cf5565b61211f84848484612567565b61215e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612155906143c1565b60405180910390fd5b50505050565b60008073ce761d788df608bd21bdd59d6f4b54b2e27f25bb73ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b81526004016121b49190612f83565b60206040518083038186803b1580156121cc57600080fd5b505afa1580156121e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061220491906143f6565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061230757503373ffffffffffffffffffffffffffffffffffffffff1673ce761d788df608bd21bdd59d6f4b54b2e27f25bb73ffffffffffffffffffffffffffffffffffffffff1663081812fc856040518263ffffffff1660e01b815260040161229f9190612f83565b60206040518083038186803b1580156122b757600080fd5b505afa1580156122cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ef91906143f6565b73ffffffffffffffffffffffffffffffffffffffff16145b806123ad575073ce761d788df608bd21bdd59d6f4b54b2e27f25bb73ffffffffffffffffffffffffffffffffffffffff1663e985e9c582336040518363ffffffff1660e01b815260040161235c929190614423565b60206040518083038186803b15801561237457600080fd5b505afa158015612388573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ac9190614461565b5b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61242a8383836126fe565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561246d5761246881612703565b6124ac565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146124ab576124aa838261274c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124ef576124ea816128b9565b61252e565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461252d5761252c828261298a565b5b5b505050565b6001816000016000828254019250508190555050565b612563828260405180602001604052806000815250612a09565b5050565b60006125888473ffffffffffffffffffffffffffffffffffffffff16612a64565b156126f1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125b1611b56565b8786866040518563ffffffff1660e01b81526004016125d394939291906144e3565b602060405180830381600087803b1580156125ed57600080fd5b505af192505050801561261e57506040513d601f19601f8201168201806040525081019061261b9190614544565b60015b6126a1573d806000811461264e576040519150601f19603f3d011682016040523d82523d6000602084013e612653565b606091505b50600081511415612699576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612690906143c1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506126f6565b600190505b949350505050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161275984610dd1565b6127639190613a92565b9050600060096000848152602001908152602001600020549050818114612848576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a805490506128cd9190613a92565b90506000600b60008481526020019081526020016000205490506000600a83815481106128fd576128fc6138ba565b5b9060005260206000200154905080600a838154811061291f5761291e6138ba565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a80548061296e5761296d614571565b5b6001900381819060005260206000200160009055905550505050565b600061299583610dd1565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b612a138383612a77565b612a206000848484612567565b612a5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a56906143c1565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ae7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ade906145ec565b60405180910390fd5b612af081611aea565b15612b30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2790614658565b60405180910390fd5b612b3c6000838361241f565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b8c9190613a3c565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c8e81612c59565b8114612c9957600080fd5b50565b600081359050612cab81612c85565b92915050565b600060208284031215612cc757612cc6612c4f565b5b6000612cd584828501612c9c565b91505092915050565b60008115159050919050565b612cf381612cde565b82525050565b6000602082019050612d0e6000830184612cea565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612d4e578082015181840152602081019050612d33565b83811115612d5d576000848401525b50505050565b6000601f19601f8301169050919050565b6000612d7f82612d14565b612d898185612d1f565b9350612d99818560208601612d30565b612da281612d63565b840191505092915050565b60006020820190508181036000830152612dc78184612d74565b905092915050565b6000819050919050565b612de281612dcf565b8114612ded57600080fd5b50565b600081359050612dff81612dd9565b92915050565b600060208284031215612e1b57612e1a612c4f565b5b6000612e2984828501612df0565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612e5d82612e32565b9050919050565b612e6d81612e52565b82525050565b6000602082019050612e886000830184612e64565b92915050565b612e9781612e52565b8114612ea257600080fd5b50565b600081359050612eb481612e8e565b92915050565b60008060408385031215612ed157612ed0612c4f565b5b6000612edf85828601612ea5565b9250506020612ef085828601612df0565b9150509250929050565b6000819050919050565b6000612f1f612f1a612f1584612e32565b612efa565b612e32565b9050919050565b6000612f3182612f04565b9050919050565b6000612f4382612f26565b9050919050565b612f5381612f38565b82525050565b6000602082019050612f6e6000830184612f4a565b92915050565b612f7d81612dcf565b82525050565b6000602082019050612f986000830184612f74565b92915050565b600080600060608486031215612fb757612fb6612c4f565b5b6000612fc586828701612ea5565b9350506020612fd686828701612ea5565b9250506040612fe786828701612df0565b9150509250925092565b6000612ffc82612f26565b9050919050565b61300c81612ff1565b82525050565b60006020820190506130276000830184613003565b92915050565b60006020828403121561304357613042612c4f565b5b600061305184828501612ea5565b91505092915050565b61306381612cde565b811461306e57600080fd5b50565b6000813590506130808161305a565b92915050565b6000806040838503121561309d5761309c612c4f565b5b60006130ab85828601612ea5565b92505060206130bc85828601613071565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61310882612d63565b810181811067ffffffffffffffff82111715613127576131266130d0565b5b80604052505050565b600061313a612c45565b905061314682826130ff565b919050565b600067ffffffffffffffff821115613166576131656130d0565b5b61316f82612d63565b9050602081019050919050565b82818337600083830152505050565b600061319e6131998461314b565b613130565b9050828152602081018484840111156131ba576131b96130cb565b5b6131c584828561317c565b509392505050565b600082601f8301126131e2576131e16130c6565b5b81356131f284826020860161318b565b91505092915050565b6000806000806080858703121561321557613214612c4f565b5b600061322387828801612ea5565b945050602061323487828801612ea5565b935050604061324587828801612df0565b925050606085013567ffffffffffffffff81111561326657613265612c54565b5b613272878288016131cd565b91505092959194509250565b6000806040838503121561329557613294612c4f565b5b60006132a385828601612ea5565b92505060206132b485828601612ea5565b9150509250929050565b600067ffffffffffffffff8211156132d9576132d86130d0565b5b602082029050602081019050919050565b600080fd5b60006133026132fd846132be565b613130565b90508083825260208201905060208402830185811115613325576133246132ea565b5b835b8181101561334e578061333a8882612df0565b845260208401935050602081019050613327565b5050509392505050565b600082601f83011261336d5761336c6130c6565b5b813561337d8482602086016132ef565b91505092915050565b60006020828403121561339c5761339b612c4f565b5b600082013567ffffffffffffffff8111156133ba576133b9612c54565b5b6133c684828501613358565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061341657607f821691505b6020821081141561342a576134296133cf565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061348c602c83612d1f565b915061349782613430565b604082019050919050565b600060208201905081810360008301526134bb8161347f565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061351e602183612d1f565b9150613529826134c2565b604082019050919050565b6000602082019050818103600083015261354d81613511565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006135b0603883612d1f565b91506135bb82613554565b604082019050919050565b600060208201905081810360008301526135df816135a3565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613642603183612d1f565b915061364d826135e6565b604082019050919050565b6000602082019050818103600083015261367181613635565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006136ae602083612d1f565b91506136b982613678565b602082019050919050565b600060208201905081810360008301526136dd816136a1565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613740602b83612d1f565b915061374b826136e4565b604082019050919050565b6000602082019050818103600083015261376f81613733565b9050919050565b600081905092915050565b50565b6000613791600083613776565b915061379c82613781565b600082019050919050565b60006137b282613784565b9150819050919050565b7f5769746864726177616c206661696c6564000000000000000000000000000000600082015250565b60006137f2601183612d1f565b91506137fd826137bc565b602082019050919050565b60006020820190508181036000830152613821816137e5565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613884602c83612d1f565b915061388f82613828565b604082019050919050565b600060208201905081810360008301526138b381613877565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613945602983612d1f565b9150613950826138e9565b604082019050919050565b6000602082019050818103600083015261397481613938565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006139d7602a83612d1f565b91506139e28261397b565b604082019050919050565b60006020820190508181036000830152613a06816139ca565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a4782612dcf565b9150613a5283612dcf565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a8757613a86613a0d565b5b828201905092915050565b6000613a9d82612dcf565b9150613aa883612dcf565b925082821015613abb57613aba613a0d565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613b0082612dcf565b9150613b0b83612dcf565b925082613b1b57613b1a613ac6565b5b828204905092915050565b6000613b3182612dcf565b9150613b3c83612dcf565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b7557613b74613a0d565b5b828202905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613bb6601f83612d1f565b9150613bc182613b80565b602082019050919050565b60006020820190508181036000830152613be581613ba9565b9050919050565b7f6d6178696d756d20736b696e7320726561636865640000000000000000000000600082015250565b6000613c22601583612d1f565b9150613c2d82613bec565b602082019050919050565b60006020820190508181036000830152613c5181613c15565b9050919050565b7f6d696e74207175616e746974792065786365656473206d617820737570706c79600082015250565b6000613c8e602083612d1f565b9150613c9982613c58565b602082019050919050565b60006020820190508181036000830152613cbd81613c81565b9050919050565b7f7468652046544d207472616e7366657220616d6f756e7420697320756e64657260008201527f2074686520707269636500000000000000000000000000000000000000000000602082015250565b6000613d20602a83612d1f565b9150613d2b82613cc4565b604082019050919050565b60006020820190508181036000830152613d4f81613d13565b9050919050565b6000613d6182612dcf565b9150613d6c83612dcf565b925082613d7c57613d7b613ac6565b5b828206905092915050565b6000613d9282612dcf565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613dc557613dc4613a0d565b5b600182019050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613e06601983612d1f565b9150613e1182613dd0565b602082019050919050565b60006020820190508181036000830152613e3581613df9565b9050919050565b7f746f6b656e5552493a206e6f6e6578697374656e7420746f6b656e0000000000600082015250565b6000613e72601b83612d1f565b9150613e7d82613e3c565b602082019050919050565b60006020820190508181036000830152613ea181613e65565b9050919050565b6000604082019050613ebd6000830185612f74565b613eca6020830184612f74565b9392505050565b600067ffffffffffffffff821115613eec57613eeb6130d0565b5b613ef582612d63565b9050602081019050919050565b6000613f15613f1084613ed1565b613130565b905082815260208101848484011115613f3157613f306130cb565b5b613f3c848285612d30565b509392505050565b600082601f830112613f5957613f586130c6565b5b8151613f69848260208601613f02565b91505092915050565b600060208284031215613f8857613f87612c4f565b5b600082015167ffffffffffffffff811115613fa657613fa5612c54565b5b613fb284828501613f44565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614017602683612d1f565b915061402282613fbb565b604082019050919050565b600060208201905081810360008301526140468161400a565b9050919050565b7f596f75206d757374206265206f776e6572206f7220617070726f76656420666f60008201527f7220746869732073756d6d6f6e65720000000000000000000000000000000000602082015250565b60006140a9602f83612d1f565b91506140b48261404d565b604082019050919050565b600060208201905081810360008301526140d88161409c565b9050919050565b6000815190506140ee81612dd9565b92915050565b60006020828403121561410a57614109612c4f565b5b6000614118848285016140df565b91505092915050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061417d602c83612d1f565b915061418882614121565b604082019050919050565b600060208201905081810360008301526141ac81614170565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b600061420f602983612d1f565b915061421a826141b3565b604082019050919050565b6000602082019050818103600083015261423e81614202565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006142a1602483612d1f565b91506142ac82614245565b604082019050919050565b600060208201905081810360008301526142d081614294565b9050919050565b6000819050919050565b6000819050919050565b6142fc6142f7826142d7565b6142e1565b82525050565b6000819050919050565b61431d61431882612dcf565b614302565b82525050565b600061432f82856142eb565b60208201915061433f828461430c565b6020820191508190509392505050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006143ab603283612d1f565b91506143b68261434f565b604082019050919050565b600060208201905081810360008301526143da8161439e565b9050919050565b6000815190506143f081612e8e565b92915050565b60006020828403121561440c5761440b612c4f565b5b600061441a848285016143e1565b91505092915050565b60006040820190506144386000830185612e64565b6144456020830184612e64565b9392505050565b60008151905061445b8161305a565b92915050565b60006020828403121561447757614476612c4f565b5b60006144858482850161444c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60006144b58261448e565b6144bf8185614499565b93506144cf818560208601612d30565b6144d881612d63565b840191505092915050565b60006080820190506144f86000830187612e64565b6145056020830186612e64565b6145126040830185612f74565b818103606083015261452481846144aa565b905095945050505050565b60008151905061453e81612c85565b92915050565b60006020828403121561455a57614559612c4f565b5b60006145688482850161452f565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006145d6602083612d1f565b91506145e1826145a0565b602082019050919050565b60006020820190508181036000830152614605816145c9565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614642601c83612d1f565b915061464d8261460c565b602082019050919050565b6000602082019050818103600083015261467181614635565b905091905056fea264697066735822122068f3e9326e3fe9512c13a56079ef80e89c4830f27f172f946aba245994647a4064736f6c6343000809003360c06040523480156200001157600080fd5b506040516200353138038062003531833981810160405281019062000037919062000d26565b620000576200004b620008f960201b60201c565b6200090160201b60201c565b80608081815250503373ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250506040518060a001604052806040518060400160405280600881526020017f42726163656c657400000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f45617272696e670000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f4e65636b6c61636500000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f52696e670000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f476c6f76657300000000000000000000000000000000000000000000000000008152508152506002600060058110620001db57620001da62000d58565b5b01906005620001ec929190620009c5565b506040518061014001604052806040518060400160405280600381526020017f426f77000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f446167676572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f4669726562616c6c00000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f48616c626572640000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f486174636865740000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4b6174616e61000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4b6e69766573000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f537065617200000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f53776f726400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f57616e640000000000000000000000000000000000000000000000000000000081525081525060026001600581106200045d576200045c62000d58565b5b0190600a6200046e92919062000a2c565b506040518060c001604052806040518060400160405280600981526020017f457965205061746368000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f486174000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f4865616462616e6400000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f486f726e6564000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4b6e69676874000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f576869746520457965730000000000000000000000000000000000000000000081525081525060028060058110620005f157620005f062000d58565b5b019060066200060292919062000a93565b5060405180608001604052806040518060400160405280600981526020017f4269672053686f6573000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f53616e64616c730000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f53686f657300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f57696e6765642053686f65730000000000000000000000000000000000000000815250815250600260036005811062000710576200070f62000d58565b5b019060046200072192919062000afa565b506040518060e001604052806040518060400160405280600581526020017f41726d6f7200000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f4261636b7061636b00000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f426561726400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f436170650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f5361746368656c0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f536361626261726400000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f53636172660000000000000000000000000000000000000000000000000000008152508152506002600460058110620008e057620008df62000d58565b5b01906007620008f192919062000b61565b505062000dec565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805482825590600052602060002090810192821562000a19579160200282015b8281111562000a1857825182908051906020019062000a0792919062000bc8565b5091602001919060010190620009e6565b5b50905062000a28919062000c59565b5090565b82805482825590600052602060002090810192821562000a80579160200282015b8281111562000a7f57825182908051906020019062000a6e92919062000bc8565b509160200191906001019062000a4d565b5b50905062000a8f919062000c59565b5090565b82805482825590600052602060002090810192821562000ae7579160200282015b8281111562000ae657825182908051906020019062000ad592919062000bc8565b509160200191906001019062000ab4565b5b50905062000af6919062000c59565b5090565b82805482825590600052602060002090810192821562000b4e579160200282015b8281111562000b4d57825182908051906020019062000b3c92919062000bc8565b509160200191906001019062000b1b565b5b50905062000b5d919062000c59565b5090565b82805482825590600052602060002090810192821562000bb5579160200282015b8281111562000bb457825182908051906020019062000ba392919062000bc8565b509160200191906001019062000b82565b5b50905062000bc4919062000c59565b5090565b82805462000bd69062000db6565b90600052602060002090601f01602090048101928262000bfa576000855562000c46565b82601f1062000c1557805160ff191683800117855562000c46565b8280016001018555821562000c46579182015b8281111562000c4557825182559160200191906001019062000c28565b5b50905062000c55919062000c81565b5090565b5b8082111562000c7d576000818162000c73919062000ca0565b5060010162000c5a565b5090565b5b8082111562000c9c57600081600090555060010162000c82565b5090565b50805462000cae9062000db6565b6000825580601f1062000cc2575062000ce3565b601f01602090049060005260206000209081019062000ce2919062000c81565b5b50565b600080fd5b6000819050919050565b62000d008162000ceb565b811462000d0c57600080fd5b50565b60008151905062000d208162000cf5565b92915050565b60006020828403121562000d3f5762000d3e62000ce6565b5b600062000d4f8482850162000d0f565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000dcf57607f821691505b6020821081141562000de65762000de562000d87565b5b50919050565b60805160a05161271f62000e126000396000610cf4015260006107d3015261271f6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063715018a61461005c5780638da5cb5b1461006657806392cb829d1461008457806393e6f872146100b4578063f2fde38b146100d0575b600080fd5b6100646100ec565b005b61006e610174565b60405161007b919061123f565b60405180910390f35b61009e6004803603810190610099919061129a565b61019d565b6040516100ab9190611373565b60405180910390f35b6100ce60048036038101906100c991906113fa565b6101d8565b005b6100ea60048036038101906100e59190611486565b610345565b005b6100f461043d565b73ffffffffffffffffffffffffffffffffffffffff16610112610174565b73ffffffffffffffffffffffffffffffffffffffff1614610168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015f906114ff565b60405180910390fd5b6101726000610445565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606101b16101ac8484610509565b610837565b6040516020016101c191906115a7565b604051602081830303815290604052905092915050565b6101e061043d565b73ffffffffffffffffffffffffffffffffffffffff166101fe610174565b73ffffffffffffffffffffffffffffffffffffffff1614610254576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024b906114ff565b60405180910390fd5b60005b8282905081101561033f5760005b838383818110610278576102776115c9565b5b905060200281019061028a9190611607565b905081101561032b578383838181106102a6576102a56115c9565b5b90506020028101906102b89190611607565b828181106102c9576102c86115c9565b5b90506020028101906102db919061166a565b6001600085896102eb91906116fc565b815260200190815260200160002060008481526020019081526020016000209190610317929190611138565b50808061032390611752565b915050610265565b50808061033790611752565b915050610257565b50505050565b61034d61043d565b73ffffffffffffffffffffffffffffffffffffffff1661036b610174565b73ffffffffffffffffffffffffffffffffffffffff16146103c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103b8906114ff565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610431576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104289061180d565b60405180910390fd5b61043a81610445565b50565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60606000610516836109bc565b9050606060006040518060a001604052806040518060400160405280600981526020017f4163636573736f7279000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f576561706f6e000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f486561640000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f53686f657300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f546f72736f000000000000000000000000000000000000000000000000000000815250815250905060005b60058110156107c4576000600160008381526020019081526020016000206000868460088110610684576106836115c9565b5b602002015160ff16815260200190815260200160002080546106a59061185c565b905011156107b1578260008451146106f2576040518060400160405280600381526020017f2c207b0000000000000000000000000000000000000000000000000000000000815250610729565b6040518060400160405280600181526020017f7b000000000000000000000000000000000000000000000000000000000000008152505b83836005811061073c5761073b6115c9565b5b602002015160028460058110610755576107546115c9565b5b01878560088110610769576107686115c9565b5b602002015160ff1681548110610782576107816115c9565b5b9060005260206000200160405160200161079f9493929190611a9e565b60405160208183030381529060405292505b80806107bc90611752565b915050610651565b506107ce86610b7e565b6107f77f0000000000000000000000000000000000000000000000000000000000000000610b7e565b6108096108048989610cdf565b610837565b8460405160200161081d9493929190611dbf565b604051602081830303815290604052935050505092915050565b606060008251141561085a576040518060200160405280600081525090506109b7565b60006040518060600160405280604081526020016126aa604091399050600060036002855161088991906116fc565b6108939190611e9a565b600461089f9190611ecb565b905060006020826108b091906116fc565b67ffffffffffffffff8111156108c9576108c8611f25565b5b6040519080825280601f01601f1916602001820160405280156108fb5781602001600182028036833780820191505090505b509050818152600183018586518101602084015b81831015610976576003830192508251603f8160121c1685015160f81b8252600182019150603f81600c1c1685015160f81b8252600182019150603f8160061c1685015160f81b8252600182019150603f811685015160f81b82526001820191505061090f565b60038951066001811461099057600281146109a0576109ab565b613d3d60f01b60028303526109ab565b603d60f81b60018303525b50505050508093505050505b919050565b6109c46111be565b6109cc6111be565b600a836109d99190611f54565b816000600881106109ed576109ec6115c9565b5b602002019060ff16908160ff1681525050600a83610a0b9190611e9a565b9250600e83610a1a9190611f54565b81600160088110610a2e57610a2d6115c9565b5b602002019060ff16908160ff1681525050600e83610a4c9190611e9a565b9250600c83610a5b9190611f54565b81600260088110610a6f57610a6e6115c9565b5b602002019060ff16908160ff1681525050600c83610a8d9190611e9a565b9250600883610a9c9190611f54565b81600360088110610ab057610aaf6115c9565b5b602002019060ff16908160ff1681525050600883610ace9190611e9a565b9250601083610add9190611f54565b81600460088110610af157610af06115c9565b5b602002019060ff16908160ff1681525050601083610b0f9190611e9a565b92506000600590505b6008811015610b7457600a84610b2e9190611f54565b828260088110610b4157610b406115c9565b5b602002019060ff16908160ff1681525050600a84610b5f9190611e9a565b93508080610b6c90611752565b915050610b18565b5080915050919050565b60606000821415610bc6576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050610cda565b600082905060005b60008214610bf8578080610be190611752565b915050600a82610bf19190611e9a565b9150610bce565b60008167ffffffffffffffff811115610c1457610c13611f25565b5b6040519080825280601f01601f191660200182016040528015610c465781602001600182028036833780820191505090505b5090505b60008514610cd357600182610c5f9190611f85565b9150600a85610c6e9190611f54565b6030610c7a91906116fc565b60f81b818381518110610c9057610c8f6115c9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85610ccc9190611e9a565b9450610c4a565b8093505050505b919050565b60606000610cec836109bc565b9050600060017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633613a9f4876040518263ffffffff1660e01b8152600401610d4b9190611fc8565b60206040518083038186803b158015610d6357600080fd5b505afa158015610d77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9b9190611ff8565b610da59190611f85565b905060006007821480610db85750600182145b610dd15760405180602001604052806000815250610e31565b6001600060078152602001908152602001600020600084600760088110610dfb57610dfa6115c9565b5b602002015160ff168152602001908152602001600020604051602001610e219190612155565b6040516020818303038152906040525b9050610e3c86610b7e565b6001600060078152602001908152602001600020600085600760088110610e6657610e656115c9565b5b602002015160ff168152602001908152602001600020826001600060068152602001908152602001600020600087600660088110610ea757610ea66115c9565b5b602002015160ff168152602001908152602001600020600160006008815260200190815260200160002060008781526020019081526020016000206001600060058152602001908152602001600020600089600560088110610f0c57610f0b6115c9565b5b602002015160ff1681526020019081526020016000206001600060098152602001908152602001600020600089815260200190815260200160002060016000600a815260200190815260200160002060008a815260200190815260200160002060016000600b815260200190815260200160002060008b8152602001908152602001600020610f9a8c610fcd565b604051602001610fb39a99989796959493929190612538565b604051602081830303815290604052935050505092915050565b60606001600060048152602001908152602001600020600083600460088110610ff957610ff86115c9565b5b602002015160ff1681526020019081526020016000206001600060028152602001908152602001600020600084600260088110611039576110386115c9565b5b602002015160ff16815260200190815260200160002060016000808152602001908152602001600020600085600060088110611078576110776115c9565b5b602002015160ff16815260200190815260200160002060016000600381526020019081526020016000206000866003600881106110b8576110b76115c9565b5b602002015160ff16815260200190815260200160002060016000600181526020019081526020016000206000876001600881106110f8576110f76115c9565b5b602002015160ff16815260200190815260200160002060405160200161112295949392919061265e565b6040516020818303038152906040529050919050565b8280546111449061185c565b90600052602060002090601f01602090048101928261116657600085556111ad565b82601f1061117f57803560ff19168380011785556111ad565b828001600101855582156111ad579182015b828111156111ac578235825591602001919060010190611191565b5b5090506111ba91906111e1565b5090565b604051806101000160405280600890602082028036833780820191505090505090565b5b808211156111fa5760008160009055506001016111e2565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611229826111fe565b9050919050565b6112398161121e565b82525050565b60006020820190506112546000830184611230565b92915050565b600080fd5b600080fd5b6000819050919050565b61127781611264565b811461128257600080fd5b50565b6000813590506112948161126e565b92915050565b600080604083850312156112b1576112b061125a565b5b60006112bf85828601611285565b92505060206112d085828601611285565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b838110156113145780820151818401526020810190506112f9565b83811115611323576000848401525b50505050565b6000601f19601f8301169050919050565b6000611345826112da565b61134f81856112e5565b935061135f8185602086016112f6565b61136881611329565b840191505092915050565b6000602082019050818103600083015261138d818461133a565b905092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126113ba576113b9611395565b5b8235905067ffffffffffffffff8111156113d7576113d661139a565b5b6020830191508360208202830111156113f3576113f261139f565b5b9250929050565b6000806000604084860312156114135761141261125a565b5b600061142186828701611285565b935050602084013567ffffffffffffffff8111156114425761144161125f565b5b61144e868287016113a4565b92509250509250925092565b6114638161121e565b811461146e57600080fd5b50565b6000813590506114808161145a565b92915050565b60006020828403121561149c5761149b61125a565b5b60006114aa84828501611471565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006114e96020836112e5565b91506114f4826114b3565b602082019050919050565b60006020820190508181036000830152611518816114dc565b9050919050565b600081905092915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b6000611560601d8361151f565b915061156b8261152a565b601d82019050919050565b6000611581826112da565b61158b818561151f565b935061159b8185602086016112f6565b80840191505092915050565b60006115b282611553565b91506115be8284611576565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112611624576116236115f8565b5b80840192508235915067ffffffffffffffff821115611646576116456115fd565b5b60208301925060208202360383131561166257611661611602565b5b509250929050565b60008083356001602003843603038112611687576116866115f8565b5b80840192508235915067ffffffffffffffff8211156116a9576116a86115fd565b5b6020830192506001820236038313156116c5576116c4611602565b5b509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061170782611264565b915061171283611264565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611747576117466116cd565b5b828201905092915050565b600061175d82611264565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156117905761178f6116cd565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006117f76026836112e5565b91506118028261179b565b604082019050919050565b60006020820190508181036000830152611826816117ea565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061187457607f821691505b602082108114156118885761188761182d565b5b50919050565b7f2274726169745f74797065223a20220000000000000000000000000000000000600082015250565b60006118c4600f8361151f565b91506118cf8261188e565b600f82019050919050565b7f222c000000000000000000000000000000000000000000000000000000000000600082015250565b600061191060028361151f565b915061191b826118da565b600282019050919050565b7f2276616c7565223a202200000000000000000000000000000000000000000000600082015250565b600061195c600a8361151f565b915061196782611926565b600a82019050919050565b60008190508160005260206000209050919050565b600081546119948161185c565b61199e818661151f565b945060018216600081146119b957600181146119ca576119fd565b60ff198316865281860193506119fd565b6119d385611972565b60005b838110156119f5578154818901526001820191506020810190506119d6565b838801955050505b50505092915050565b7f2200000000000000000000000000000000000000000000000000000000000000600082015250565b6000611a3c60018361151f565b9150611a4782611a06565b600182019050919050565b7f7d00000000000000000000000000000000000000000000000000000000000000600082015250565b6000611a8860018361151f565b9150611a9382611a52565b600182019050919050565b6000611aaa8287611576565b9150611ab68286611576565b9150611ac1826118b7565b9150611acd8285611576565b9150611ad882611903565b9150611ae38261194f565b9150611aef8284611987565b9150611afa82611a2f565b9150611b0582611a7b565b915081905095945050505050565b7f7b00000000000000000000000000000000000000000000000000000000000000600082015250565b6000611b4960018361151f565b9150611b5482611b13565b600182019050919050565b7f226e616d65223a20225261726520536b696e2023000000000000000000000000600082015250565b6000611b9560148361151f565b9150611ba082611b5f565b601482019050919050565b7f226465736372697074696f6e223a20225261726520536b696e7320617265207260008201527f616e646f6d6c792067656e65726174656420616e64206861766520313030252060208201527f6f6e2d636861696e2061727420616e64206d65746164617461202d204f6e6c7960408201527f2000000000000000000000000000000000000000000000000000000000000000606082015250565b6000611c5360618361151f565b9150611c5e82611bab565b606182019050919050565b7f2077696c6c206576657220657869737421222c00000000000000000000000000600082015250565b6000611c9f60138361151f565b9150611caa82611c69565b601382019050919050565b7f22696d616765223a2022646174613a696d6167652f7376672b786d6c3b62617360008201527f6536342c00000000000000000000000000000000000000000000000000000000602082015250565b6000611d1160248361151f565b9150611d1c82611cb5565b602482019050919050565b7f2261747472696275746573223a205b0000000000000000000000000000000000600082015250565b6000611d5d600f8361151f565b9150611d6882611d27565b600f82019050919050565b7f5d00000000000000000000000000000000000000000000000000000000000000600082015250565b6000611da960018361151f565b9150611db482611d73565b600182019050919050565b6000611dca82611b3c565b9150611dd582611b88565b9150611de18287611576565b9150611dec82611903565b9150611df782611c46565b9150611e038286611576565b9150611e0e82611c92565b9150611e1982611d04565b9150611e258285611576565b9150611e3082611903565b9150611e3b82611d50565b9150611e478284611576565b9150611e5282611d9c565b9150611e5d82611a7b565b915081905095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000611ea582611264565b9150611eb083611264565b925082611ec057611ebf611e6b565b5b828204905092915050565b6000611ed682611264565b9150611ee183611264565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611f1a57611f196116cd565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000611f5f82611264565b9150611f6a83611264565b925082611f7a57611f79611e6b565b5b828206905092915050565b6000611f9082611264565b9150611f9b83611264565b925082821015611fae57611fad6116cd565b5b828203905092915050565b611fc281611264565b82525050565b6000602082019050611fdd6000830184611fb9565b92915050565b600081519050611ff28161126e565b92915050565b60006020828403121561200e5761200d61125a565b5b600061201c84828501611fe3565b91505092915050565b7f3c7061746820643d224d31352e3939203131762d3168315639682d315635682d60008201527f315634682d315633682d347631682d317631682d31763568317631683176326860208201527f2d312d312d317631203120316831763268327631682d3176356831203520317660408201527f2d31682d31762d356831762d316831762d32682d31762d312d31682d31762d3260608201527f68317a222066696c6c3d22230000000000000000000000000000000000000000608082015250565b60006120f3608c8361151f565b91506120fe82612025565b608c82019050919050565b7f222f3e0000000000000000000000000000000000000000000000000000000000600082015250565b600061213f60038361151f565b915061214a82612109565b600382019050919050565b6000612160826120e6565b915061216c8284611987565b915061217782612132565b915081905092915050565b7f3c7376672069643d275261726520536b696e2023000000000000000000000000600082015250565b60006121b860148361151f565b91506121c382612182565b601482019050919050565b7f2720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f60008201527f737667272076696577426f783d27302030203234203234273e00000000000000602082015250565b600061222a60398361151f565b9150612235826121ce565b603982019050919050565b7f3c706174682066696c6c3d222300000000000000000000000000000000000000600082015250565b6000612276600d8361151f565b915061228182612240565b600d82019050919050565b7f2220643d224d3136203131762d3168315639682d315635682d315634682d315660008201527f33682d347631483976314838763568317631683176344838763368327631483960208201527f7635683120352031762d31682d31762d356831762d316831762d32682d32762d60408201527f3468317a222f3e00000000000000000000000000000000000000000000000000606082015250565b600061233460678361151f565b915061233f8261228c565b606782019050919050565b7f3c7061746820643d224d3132203768317631682d317a6d33203068317631682d60008201527f317a222066696c6c3d2223666666222f3e000000000000000000000000000000602082015250565b60006123a660318361151f565b91506123b18261234a565b603182019050919050565b7f3c672066696c6c3d222300000000000000000000000000000000000000000000600082015250565b60006123f2600a8361151f565b91506123fd826123bc565b600a82019050919050565b7f223e000000000000000000000000000000000000000000000000000000000000600082015250565b600061243e60028361151f565b915061244982612408565b600282019050919050565b7f3c2f673e00000000000000000000000000000000000000000000000000000000600082015250565b600061248a60048361151f565b915061249582612454565b600482019050919050565b7f3c67206f7061636974793d272e3233273e000000000000000000000000000000600082015250565b60006124d660118361151f565b91506124e1826124a0565b601182019050919050565b7f3c2f7376673e0000000000000000000000000000000000000000000000000000600082015250565b600061252260068361151f565b915061252d826124ec565b600682019050919050565b6000612543826121ab565b915061254f828d611576565b915061255a8261221d565b915061256582612269565b9150612571828c611987565b915061257c82612327565b9150612588828b611576565b915061259382612399565b915061259e826123e5565b91506125aa828a611987565b91506125b582612431565b91506125c18289611987565b91506125cc8261247d565b91506125d7826123e5565b91506125e38288611987565b91506125ee82612431565b91506125fa8287611987565b91506126058261247d565b9150612610826124c9565b915061261c8286611987565b91506126278261247d565b91506126338285611987565b915061263f8284611576565b915061264a82612515565b91508190509b9a5050505050505050505050565b600061266a8288611987565b91506126768287611987565b91506126828286611987565b915061268e8285611987565b915061269a8284611987565b9150819050969550505050505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220c89c1a2589214c15cfccfeb334bf9b0de05be798d754309137059f8d087ac76464736f6c63430008090033608060405234801561001057600080fd5b5061002d61002261003260201b60201c565b61003a60201b60201c565b6100fe565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611aa38061010d6000396000f3fe608060405234801561001057600080fd5b50600436106100925760003560e01c80638da5cb5b116100665780638da5cb5b1461011e578063b03b256e1461013c578063c55b02f414610158578063f2fde38b14610188578063f8588f16146101a457610092565b8062a7c6ee146100975780632abb5c03146100b35780635d98f434146100e4578063715018a614610114575b600080fd5b6100b160048036038101906100ac9190611120565b6101c0565b005b6100cd60048036038101906100c89190611160565b610523565b6040516100db9291906111dd565b60405180910390f35b6100fe60048036038101906100f99190611313565b610567565b60405161010b9190611359565b60405180910390f35b61011c6105a1565b005b610126610629565b6040516101339190611374565b60405180910390f35b6101566004803603810190610151919061138f565b610652565b005b610172600480360381019061016d919061140e565b6109ee565b60405161017f919061143b565b60405180910390f35b6101a2600480360381019061019d9190611456565b610a06565b005b6101be60048036038101906101b99190611456565b610afe565b005b3382828273ffffffffffffffffffffffffffffffffffffffff1663b8dbacf96040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561020b57600080fd5b505af192505050801561023c57506040513d601f19601f8201168201806040525081019061023991906114bb565b60015b610312576102486114f5565b634e487b7114156103035761025b611517565b906102665750610303565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166102f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102e9906115e1565b60405180910390fd5b6102fd338787610bd5565b5061030d565b3d6000803e3d6000fd5b61051c565b8015610483578373ffffffffffffffffffffffffffffffffffffffff16633613a9f4846040518263ffffffff1660e01b8152600401610351919061143b565b602060405180830381600087803b15801561036b57600080fd5b505af115801561037f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a39190611616565b73ce761d788df608bd21bdd59d6f4b54b2e27f25bb73ffffffffffffffffffffffffffffffffffffffff16633613a9f4846040518263ffffffff1660e01b81526004016103f0919061143b565b602060405180830381600087803b15801561040a57600080fd5b505af115801561041e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104429190611616565b14610482576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610479906116b5565b60405180910390fd5b5b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661050f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610506906115e1565b60405180910390fd5b61051a338787610bd5565b505b5050505050565b60016020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b60008160000151826020015160405160200161058492919061173e565b604051602081830303815290604052805190602001209050919050565b6105a9610df2565b73ffffffffffffffffffffffffffffffffffffffff166105c7610629565b73ffffffffffffffffffffffffffffffffffffffff161461061d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610614906117b6565b60405180910390fd5b6106276000610dfa565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8282828273ffffffffffffffffffffffffffffffffffffffff1663b8dbacf96040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561069d57600080fd5b505af19250505080156106ce57506040513d601f19601f820116820180604052508101906106cb91906114bb565b60015b6107c0576106da6114f5565b634e487b7114156107b1576106ed611517565b906106f857506107b1565b610703873388610ebe565b610742576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073990611848565b60405180910390fd5b61076173ce761d788df608bd21bdd59d6f4b54b2e27f25bb3387610ebe565b6107a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610797906118da565b60405180910390fd5b6107ab878787610bd5565b506107bb565b3d6000803e3d6000fd5b6109e6565b8015610931578373ffffffffffffffffffffffffffffffffffffffff16633613a9f4846040518263ffffffff1660e01b81526004016107ff919061143b565b602060405180830381600087803b15801561081957600080fd5b505af115801561082d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108519190611616565b73ce761d788df608bd21bdd59d6f4b54b2e27f25bb73ffffffffffffffffffffffffffffffffffffffff16633613a9f4846040518263ffffffff1660e01b815260040161089e919061143b565b602060405180830381600087803b1580156108b857600080fd5b505af11580156108cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f09190611616565b14610930576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610927906116b5565b60405180910390fd5b5b61093c873388610ebe565b61097b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097290611848565b60405180910390fd5b61099a73ce761d788df608bd21bdd59d6f4b54b2e27f25bb3387610ebe565b6109d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d0906118da565b60405180910390fd5b6109e4878787610bd5565b505b505050505050565b60026020528060005260406000206000915090505481565b610a0e610df2565b73ffffffffffffffffffffffffffffffffffffffff16610a2c610629565b73ffffffffffffffffffffffffffffffffffffffff1614610a82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a79906117b6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610af2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae99061196c565b60405180910390fd5b610afb81610dfa565b50565b610b06610df2565b73ffffffffffffffffffffffffffffffffffffffff16610b24610629565b73ffffffffffffffffffffffffffffffffffffffff1614610b7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b71906117b6565b60405180910390fd5b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152506001600060026000610c3d60405180604001604052808a73ffffffffffffffffffffffffffffffffffffffff16815260200189815250610567565b815260200190815260200160002054815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101559050508060026000610ce660405180604001604052808873ffffffffffffffffffffffffffffffffffffffff16815260200187815250610567565b81526020019081526020016000208190555060405180604001604052808473ffffffffffffffffffffffffffffffffffffffff168152602001838152506001600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101559050507f91dd75ea262c69e401a2c0fef76c62376c182a4fb4dc1e1c0f320420fccdbc0260405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020018481525082604051610de59291906119d9565b60405180910390a1505050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008084905060008173ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b8152600401610eff919061143b565b60206040518083038186803b158015610f1757600080fd5b505afa158015610f2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4f9190611a17565b90508073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061103e57508473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1663081812fc866040518263ffffffff1660e01b8152600401610fd6919061143b565b60206040518083038186803b158015610fee57600080fd5b505afa158015611002573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110269190611a17565b73ffffffffffffffffffffffffffffffffffffffff16145b806110d057508173ffffffffffffffffffffffffffffffffffffffff1663e985e9c582876040518363ffffffff1660e01b815260040161107f929190611a44565b60206040518083038186803b15801561109757600080fd5b505afa1580156110ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110cf91906114bb565b5b925050509392505050565b6000604051905090565b600080fd5b6000819050919050565b6110fd816110ea565b811461110857600080fd5b50565b60008135905061111a816110f4565b92915050565b60008060408385031215611137576111366110e5565b5b60006111458582860161110b565b92505060206111568582860161110b565b9150509250929050565b600060208284031215611176576111756110e5565b5b60006111848482850161110b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006111b88261118d565b9050919050565b6111c8816111ad565b82525050565b6111d7816110ea565b82525050565b60006040820190506111f260008301856111bf565b6111ff60208301846111ce565b9392505050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6112548261120b565b810181811067ffffffffffffffff821117156112735761127261121c565b5b80604052505050565b60006112866110db565b9050611292828261124b565b919050565b6112a0816111ad565b81146112ab57600080fd5b50565b6000813590506112bd81611297565b92915050565b6000604082840312156112d9576112d8611206565b5b6112e3604061127c565b905060006112f3848285016112ae565b60008301525060206113078482850161110b565b60208301525092915050565b600060408284031215611329576113286110e5565b5b6000611337848285016112c3565b91505092915050565b6000819050919050565b61135381611340565b82525050565b600060208201905061136e600083018461134a565b92915050565b600060208201905061138960008301846111bf565b92915050565b6000806000606084860312156113a8576113a76110e5565b5b60006113b6868287016112ae565b93505060206113c78682870161110b565b92505060406113d88682870161110b565b9150509250925092565b6113eb81611340565b81146113f657600080fd5b50565b600081359050611408816113e2565b92915050565b600060208284031215611424576114236110e5565b5b6000611432848285016113f9565b91505092915050565b600060208201905061145060008301846111ce565b92915050565b60006020828403121561146c5761146b6110e5565b5b600061147a848285016112ae565b91505092915050565b60008115159050919050565b61149881611483565b81146114a357600080fd5b50565b6000815190506114b58161148f565b92915050565b6000602082840312156114d1576114d06110e5565b5b60006114df848285016114a6565b91505092915050565b60008160e01c9050919050565b600060033d11156115145760046000803e6115116000516114e8565b90505b90565b60008060233d1115611534576020600460003e6001915060005190505b9091565b600082825260208201905092915050565b7f4f6e6c7920747275737465642045524337323120696d706c656d656e7461746960008201527f6f6e732063616e20616363657373207468697320776179206f6620617373696760208201527f6e6174696f6e0000000000000000000000000000000000000000000000000000604082015250565b60006115cb604683611538565b91506115d682611549565b606082019050919050565b600060208201905081810360008301526115fa816115be565b9050919050565b600081519050611610816110f4565b92915050565b60006020828403121561162c5761162b6110e5565b5b600061163a84828501611601565b91505092915050565b7f53756d6d6f6e657220616e6420736b696e206d757374206265206f662074686560008201527f2073616d6520636c617373000000000000000000000000000000000000000000602082015250565b600061169f602b83611538565b91506116aa82611643565b604082019050919050565b600060208201905081810360008301526116ce81611692565b9050919050565b60008160601b9050919050565b60006116ed826116d5565b9050919050565b60006116ff826116e2565b9050919050565b611717611712826111ad565b6116f4565b82525050565b6000819050919050565b611738611733826110ea565b61171d565b82525050565b600061174a8285611706565b60148201915061175a8284611727565b6020820191508190509392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006117a0602083611538565b91506117ab8261176a565b602082019050919050565b600060208201905081810360008301526117cf81611793565b9050919050565b7f596f75206d757374206265206f776e6572206f7220617070726f76656420666f60008201527f72207468697320746f6b656e0000000000000000000000000000000000000000602082015250565b6000611832602c83611538565b915061183d826117d6565b604082019050919050565b6000602082019050818103600083015261186181611825565b9050919050565b7f596f75206d757374206265206f776e6572206f7220617070726f76656420666f60008201527f7220746869732073756d6d6f6e65720000000000000000000000000000000000602082015250565b60006118c4602f83611538565b91506118cf82611868565b604082019050919050565b600060208201905081810360008301526118f3816118b7565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000611956602683611538565b9150611961826118fa565b604082019050919050565b6000602082019050818103600083015261198581611949565b9050919050565b611995816111ad565b82525050565b6119a4816110ea565b82525050565b6040820160008201516119c0600085018261198c565b5060208201516119d3602085018261199b565b50505050565b60006060820190506119ee60008301856119aa565b6119fb60408301846111ce565b9392505050565b600081519050611a1181611297565b92915050565b600060208284031215611a2d57611a2c6110e5565b5b6000611a3b84828501611a02565b91505092915050565b6000604082019050611a5960008301856111bf565b611a6660208301846111bf565b939250505056fea26469706673582212208167655155e32828009643f8fbd9fdd6677ae23b5de7f87302ec51c2c9f8351b64736f6c63430008090033

Deployed ByteCode Sourcemap

52189:3946:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39704:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26836:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28395:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27918:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52457:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40344:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29285:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55593:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40012:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52796:34;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55430:157;;;;;;;;;;;;;:::i;:::-;;29695:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52429:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40534:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26530:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26260:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6304:94;;;;;;;;;;;;;:::i;:::-;;5653:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27005:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53204:290;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53933:299;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28688:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29951:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52635:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55183:219;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29054:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6553:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54238:448;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39704:224;39806:4;39845:35;39830:50;;;:11;:50;;;;:90;;;;39884:36;39908:11;39884:23;:36::i;:::-;39830:90;39823:97;;39704:224;;;:::o;26836:100::-;26890:13;26923:5;26916:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26836:100;:::o;28395:221::-;28471:7;28499:16;28507:7;28499;:16::i;:::-;28491:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28584:15;:24;28600:7;28584:24;;;;;;;;;;;;;;;;;;;;;28577:31;;28395:221;;;:::o;27918:411::-;27999:13;28015:23;28030:7;28015:14;:23::i;:::-;27999:39;;28063:5;28057:11;;:2;:11;;;;28049:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;28157:5;28141:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28166:37;28183:5;28190:12;:10;:12::i;:::-;28166:16;:37::i;:::-;28141:62;28119:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;28300:21;28309:2;28313:7;28300:8;:21::i;:::-;27988:341;27918:411;;:::o;52457:42::-;;;;;;;;;;;;;:::o;40344:113::-;40405:7;40432:10;:17;;;;40425:24;;40344:113;:::o;29285:339::-;29480:41;29499:12;:10;:12::i;:::-;29513:7;29480:18;:41::i;:::-;29472:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29588:28;29598:4;29604:2;29608:7;29588:9;:28::i;:::-;29285:339;;;:::o;55593:103::-;5884:12;:10;:12::i;:::-;5873:23;;:7;:5;:7::i;:::-;:23;;;5865:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55678:13:::1;55663:12;:28;;;;55593:103:::0;:::o;40012:256::-;40109:7;40145:23;40162:5;40145:16;:23::i;:::-;40137:5;:31;40129:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;40234:12;:19;40247:5;40234:19;;;;;;;;;;;;;;;:26;40254:5;40234:26;;;;;;;;;;;;40227:33;;40012:256;;;;:::o;52796:34::-;;;;;;;;;;;;;;;;;:::o;55430:157::-;5884:12;:10;:12::i;:::-;5873:23;;:7;:5;:7::i;:::-;:23;;;5865:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55473:12:::1;55491:10;:15;;55514:21;55491:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55472:68;;;55553:7;55545:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;55467:120;55430:157::o:0;29695:185::-;29833:39;29850:4;29856:2;29860:7;29833:39;;;;;;;;;;;;:16;:39::i;:::-;29695:185;;;:::o;52429:24::-;;;;;;;;;;;;;:::o;40534:233::-;40609:7;40645:30;:28;:30::i;:::-;40637:5;:38;40629:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;40742:10;40753:5;40742:17;;;;;;;;:::i;:::-;;;;;;;;;;40735:24;;40534:233;;;:::o;26530:239::-;26602:7;26622:13;26638:7;:16;26646:7;26638:16;;;;;;;;;;;;;;;;;;;;;26622:32;;26690:1;26673:19;;:5;:19;;;;26665:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26756:5;26749:12;;;26530:239;;;:::o;26260:208::-;26332:7;26377:1;26360:19;;:5;:19;;;;26352:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;26444:9;:16;26454:5;26444:16;;;;;;;;;;;;;;;;26437:23;;26260:208;;;:::o;6304:94::-;5884:12;:10;:12::i;:::-;5873:23;;:7;:5;:7::i;:::-;:23;;;5865:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6369:21:::1;6387:1;6369:9;:21::i;:::-;6304:94::o:0;5653:87::-;5699:7;5726:6;;;;;;;;;;;5719:13;;5653:87;:::o;27005:104::-;27061:13;27094:7;27087:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27005:104;:::o;53204:290::-;53244:4;52625:6;53301:9;:27;;;;:::i;:::-;53283:15;:45;:205;;53476:12;;53283:205;;;53345:104;53418:15;52625:6;53387:9;:27;;;;:::i;:::-;53386:47;;;;:::i;:::-;52625:6;52582:7;53350:31;;;;:::i;:::-;53349:85;;;;:::i;:::-;53436:12;;53345:3;:104::i;:::-;53283:205;53274:215;;53204:290;:::o;53933:299::-;3044:1;3640:7;;:19;;3632:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;3044:1;3773:7;:18;;;;54020:8:::1;52544:4;53662:19;:9;:17;:19::i;:::-;:31;53654:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;52544:4;53754:8;53732:19;:9;:17;:19::i;:::-;:30;;;;:::i;:::-;:43;;53724:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;53851:8;53838:10;:8;:10::i;:::-;:21;;;;:::i;:::-;53825:9;:34;;53817:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;54061:16:::2;54114:2;54080:31;54091:19;:9;:17;:19::i;:::-;54080:10;:31::i;:::-;:36;;;;:::i;:::-;54061:55;;54135:6;54131:97;54151:8;54147:1;:12;54131:97;;;54177:42;54217:1;54211:2;54206:1;54192:11;:15;;;;:::i;:::-;54191:22;;;;:::i;:::-;54190:28;;;;:::i;:::-;54177:12;:42::i;:::-;;54161:3;;;;;:::i;:::-;;;;54131:97;;;;54030:202;3804:1:::1;3000::::0;3952:7;:22;;;;53933:299;:::o;28688:295::-;28803:12;:10;:12::i;:::-;28791:24;;:8;:24;;;;28783:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;28903:8;28858:18;:32;28877:12;:10;:12::i;:::-;28858:32;;;;;;;;;;;;;;;:42;28891:8;28858:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;28956:8;28927:48;;28942:12;:10;:12::i;:::-;28927:48;;;28966:8;28927:48;;;;;;:::i;:::-;;;;;;;;28688:295;;:::o;29951:328::-;30126:41;30145:12;:10;:12::i;:::-;30159:7;30126:18;:41::i;:::-;30118:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30232:39;30246:4;30252:2;30256:7;30265:5;30232:13;:39::i;:::-;29951:328;;;;:::o;52635:51::-;52682:4;52635:51;:::o;55183:219::-;55249:13;55280:17;55288:8;55280:7;:17::i;:::-;55272:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;55351:8;;;;;;;;;;;:17;;;55369:8;55379:7;:17;55387:8;55379:17;;;;;;;;;;;;55351:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55344:53;;55183:219;;;:::o;29054:164::-;29151:4;29175:18;:25;29194:5;29175:25;;;;;;;;;;;;;;;:35;29201:8;29175:35;;;;;;;;;;;;;;;;;;;;;;;;;29168:42;;29054:164;;;;:::o;6553:192::-;5884:12;:10;:12::i;:::-;5873:23;;:7;:5;:7::i;:::-;:23;;;5865:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6662:1:::1;6642:22;;:8;:22;;;;6634:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6718:19;6728:8;6718:9;:19::i;:::-;6553:192:::0;:::o;54238:448::-;3044:1;3640:7;;:19;;3632:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;3044:1;3773:7;:18;;;;54349:11:::1;:18;52544:4;53662:19;:9;:17;:19::i;:::-;:31;53654:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;52544:4;53754:8;53732:19;:9;:17;:19::i;:::-;:30;;;;:::i;:::-;:43;;53724:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;53851:8;53838:10;:8;:10::i;:::-;:21;;;;:::i;:::-;53825:9;:34;;53817:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;54397:6:::2;54393:289;54413:11;:18;54409:1;:22;54393:289;;;54460:42;54487:11;54499:1;54487:14;;;;;;;;:::i;:::-;;;;;;;;54460:26;:42::i;:::-;54452:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;54571:17;;;;;;;;;;;:45;;;54617:42;52382;54630:12;;;54643:11;54655:1;54643:14;;;;;;;;:::i;:::-;;;;;;;;54630:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54617:12;:42::i;:::-;54661:11;54673:1;54661:14;;;;;;;;:::i;:::-;;;;;;;;54571:105;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;54433:3;;;;;:::i;:::-;;;;54393:289;;;;3804:1:::1;3000::::0;3952:7;:22;;;;54238:448;:::o;25891:305::-;25993:4;26045:25;26030:40;;;:11;:40;;;;:105;;;;26102:33;26087:48;;;:11;:48;;;;26030:105;:158;;;;26152:36;26176:11;26152:23;:36::i;:::-;26030:158;26010:178;;25891:305;;;:::o;31789:127::-;31854:4;31906:1;31878:30;;:7;:16;31886:7;31878:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31871:37;;31789:127;;;:::o;4529:98::-;4582:7;4609:10;4602:17;;4529:98;:::o;35771:174::-;35873:2;35846:15;:24;35862:7;35846:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35929:7;35925:2;35891:46;;35900:23;35915:7;35900:14;:23::i;:::-;35891:46;;;;;;;;;;;;35771:174;;:::o;32083:348::-;32176:4;32201:16;32209:7;32201;:16::i;:::-;32193:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32277:13;32293:23;32308:7;32293:14;:23::i;:::-;32277:39;;32346:5;32335:16;;:7;:16;;;:51;;;;32379:7;32355:31;;:20;32367:7;32355:11;:20::i;:::-;:31;;;32335:51;:87;;;;32390:32;32407:5;32414:7;32390:16;:32::i;:::-;32335:87;32327:96;;;32083:348;;;;:::o;35075:578::-;35234:4;35207:31;;:23;35222:7;35207:14;:23::i;:::-;:31;;;35199:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;35317:1;35303:16;;:2;:16;;;;35295:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;35373:39;35394:4;35400:2;35404:7;35373:20;:39::i;:::-;35477:29;35494:1;35498:7;35477:8;:29::i;:::-;35538:1;35519:9;:15;35529:4;35519:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35567:1;35550:9;:13;35560:2;35550:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35598:2;35579:7;:16;35587:7;35579:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35637:7;35633:2;35618:27;;35627:4;35618:27;;;;;;;;;;;;35075:578;;;:::o;6753:173::-;6809:16;6828:6;;;;;;;;;;;6809:25;;6854:8;6845:6;;:17;;;;;;;;;;;;;;;;;;6909:8;6878:40;;6899:8;6878:40;;;;;;;;;;;;6798:128;6753:173;:::o;53500:88::-;53550:4;53574:1;53570;:5;:13;;53582:1;53570:13;;;53578:1;53570:13;53563:20;;53500:88;;;;:::o;800:114::-;865:7;892;:14;;;885:21;;800:114;;;:::o;55716:143::-;55766:4;55844:1;55829:12;:16;;;;:::i;:::-;55819:27;55848:2;55802:49;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55792:60;;;;;;55787:66;;55780:74;;55716:143;;;:::o;54691:468::-;54742:11;54766;54780:31;54791:19;:9;:17;:19::i;:::-;54780:10;:31::i;:::-;54766:45;;54832:21;:9;:19;:21::i;:::-;54864:42;54874:10;54886:19;:9;:17;:19::i;:::-;54864:9;:42::i;:::-;54948:6;54917:7;:28;54925:19;:9;:17;:19::i;:::-;54917:28;;;;;;;;;;;:37;;;;54994:6;54965:5;:26;54971:19;:9;:17;:19::i;:::-;54965:26;;;;;;;;;;;:35;;;;55131:19;:9;:17;:19::i;:::-;55124:27;;;54691:468;;;:::o;31161:315::-;31318:28;31328:4;31334:2;31338:7;31318:9;:28::i;:::-;31365:48;31388:4;31394:2;31398:7;31407:5;31365:22;:48::i;:::-;31357:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;31161:315;;;;:::o;55865:267::-;55939:4;55952:13;52382:42;55968:14;;;55983:10;55968:26;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55952:42;;56027:5;56013:19;;:10;:19;;;:67;;;;56070:10;56036:44;;52382:42;56036:18;;;56055:10;56036:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;;;56013:67;:113;;;;52382:42;56084:23;;;56108:5;56115:10;56084:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56013:113;56005:122;;;55865:267;;;:::o;24500:157::-;24585:4;24624:25;24609:40;;;:11;:40;;;;24602:47;;24500:157;;;:::o;41380:589::-;41524:45;41551:4;41557:2;41561:7;41524:26;:45::i;:::-;41602:1;41586:18;;:4;:18;;;41582:187;;;41621:40;41653:7;41621:31;:40::i;:::-;41582:187;;;41691:2;41683:10;;:4;:10;;;41679:90;;41710:47;41743:4;41749:7;41710:32;:47::i;:::-;41679:90;41582:187;41797:1;41783:16;;:2;:16;;;41779:183;;;41816:45;41853:7;41816:36;:45::i;:::-;41779:183;;;41889:4;41883:10;;:2;:10;;;41879:83;;41910:40;41938:2;41942:7;41910:27;:40::i;:::-;41879:83;41779:183;41380:589;;;:::o;922:127::-;1029:1;1011:7;:14;;;:19;;;;;;;;;;;922:127;:::o;32773:110::-;32849:26;32859:2;32863:7;32849:26;;;;;;;;;;;;:9;:26::i;:::-;32773:110;;:::o;36510:799::-;36665:4;36686:15;:2;:13;;;:15::i;:::-;36682:620;;;36738:2;36722:36;;;36759:12;:10;:12::i;:::-;36773:4;36779:7;36788:5;36722:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36718:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36981:1;36964:6;:13;:18;36960:272;;;37007:60;;;;;;;;;;:::i;:::-;;;;;;;;36960:272;37182:6;37176:13;37167:6;37163:2;37159:15;37152:38;36718:529;36855:41;;;36845:51;;;:6;:51;;;;36838:58;;;;;36682:620;37286:4;37279:11;;36510:799;;;;;;;:::o;37881:126::-;;;;:::o;42692:164::-;42796:10;:17;;;;42769:15;:24;42785:7;42769:24;;;;;;;;;;;:44;;;;42824:10;42840:7;42824:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42692:164;:::o;43483:988::-;43749:22;43799:1;43774:22;43791:4;43774:16;:22::i;:::-;:26;;;;:::i;:::-;43749:51;;43811:18;43832:17;:26;43850:7;43832:26;;;;;;;;;;;;43811:47;;43979:14;43965:10;:28;43961:328;;44010:19;44032:12;:18;44045:4;44032:18;;;;;;;;;;;;;;;:34;44051:14;44032:34;;;;;;;;;;;;44010:56;;44116:11;44083:12;:18;44096:4;44083:18;;;;;;;;;;;;;;;:30;44102:10;44083:30;;;;;;;;;;;:44;;;;44233:10;44200:17;:30;44218:11;44200:30;;;;;;;;;;;:43;;;;43995:294;43961:328;44385:17;:26;44403:7;44385:26;;;;;;;;;;;44378:33;;;44429:12;:18;44442:4;44429:18;;;;;;;;;;;;;;;:34;44448:14;44429:34;;;;;;;;;;;44422:41;;;43564:907;;43483:988;;:::o;44766:1079::-;45019:22;45064:1;45044:10;:17;;;;:21;;;;:::i;:::-;45019:46;;45076:18;45097:15;:24;45113:7;45097:24;;;;;;;;;;;;45076:45;;45448:19;45470:10;45481:14;45470:26;;;;;;;;:::i;:::-;;;;;;;;;;45448:48;;45534:11;45509:10;45520;45509:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;45645:10;45614:15;:28;45630:11;45614:28;;;;;;;;;;;:41;;;;45786:15;:24;45802:7;45786:24;;;;;;;;;;;45779:31;;;45821:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;44837:1008;;;44766:1079;:::o;42270:221::-;42355:14;42372:20;42389:2;42372:16;:20::i;:::-;42355:37;;42430:7;42403:12;:16;42416:2;42403:16;;;;;;;;;;;;;;;:24;42420:6;42403:24;;;;;;;;;;;:34;;;;42477:6;42448:17;:26;42466:7;42448:26;;;;;;;;;;;:35;;;;42344:147;42270:221;;:::o;33110:321::-;33240:18;33246:2;33250:7;33240:5;:18::i;:::-;33291:54;33322:1;33326:2;33330:7;33339:5;33291:22;:54::i;:::-;33269:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;33110:321;;;:::o;14553:387::-;14613:4;14821:12;14888:7;14876:20;14868:28;;14931:1;14924:4;:8;14917:15;;;14553:387;;;:::o;33767:382::-;33861:1;33847:16;;:2;:16;;;;33839:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33920:16;33928:7;33920;:16::i;:::-;33919:17;33911:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33982:45;34011:1;34015:2;34019:7;33982:20;:45::i;:::-;34057:1;34040:9;:13;34050:2;34040:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34088:2;34069:7;:16;34077:7;34069:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34133:7;34129:2;34108:33;;34125:1;34108:33;;;;;;;;;;;;33767:382;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:60::-;4966:3;4987:5;4980:12;;4938:60;;;:::o;5004:142::-;5054:9;5087:53;5105:34;5114:24;5132:5;5114:24;:::i;:::-;5105:34;:::i;:::-;5087:53;:::i;:::-;5074:66;;5004:142;;;:::o;5152:126::-;5202:9;5235:37;5266:5;5235:37;:::i;:::-;5222:50;;5152:126;;;:::o;5284:152::-;5360:9;5393:37;5424:5;5393:37;:::i;:::-;5380:50;;5284:152;;;:::o;5442:183::-;5555:63;5612:5;5555:63;:::i;:::-;5550:3;5543:76;5442:183;;:::o;5631:274::-;5750:4;5788:2;5777:9;5773:18;5765:26;;5801:97;5895:1;5884:9;5880:17;5871:6;5801:97;:::i;:::-;5631:274;;;;:::o;5911:118::-;5998:24;6016:5;5998:24;:::i;:::-;5993:3;5986:37;5911:118;;:::o;6035:222::-;6128:4;6166:2;6155:9;6151:18;6143:26;;6179:71;6247:1;6236:9;6232:17;6223:6;6179:71;:::i;:::-;6035:222;;;;:::o;6263:619::-;6340:6;6348;6356;6405:2;6393:9;6384:7;6380:23;6376:32;6373:119;;;6411:79;;:::i;:::-;6373:119;6531:1;6556:53;6601:7;6592:6;6581:9;6577:22;6556:53;:::i;:::-;6546:63;;6502:117;6658:2;6684:53;6729:7;6720:6;6709:9;6705:22;6684:53;:::i;:::-;6674:63;;6629:118;6786:2;6812:53;6857:7;6848:6;6837:9;6833:22;6812:53;:::i;:::-;6802:63;;6757:118;6263:619;;;;;:::o;6888:143::-;6955:9;6988:37;7019:5;6988:37;:::i;:::-;6975:50;;6888:143;;;:::o;7037:165::-;7141:54;7189:5;7141:54;:::i;:::-;7136:3;7129:67;7037:165;;:::o;7208:256::-;7318:4;7356:2;7345:9;7341:18;7333:26;;7369:88;7454:1;7443:9;7439:17;7430:6;7369:88;:::i;:::-;7208:256;;;;:::o;7470:329::-;7529:6;7578:2;7566:9;7557:7;7553:23;7549:32;7546:119;;;7584:79;;:::i;:::-;7546:119;7704:1;7729:53;7774:7;7765:6;7754:9;7750:22;7729:53;:::i;:::-;7719:63;;7675:117;7470:329;;;;:::o;7805:116::-;7875:21;7890:5;7875:21;:::i;:::-;7868:5;7865:32;7855:60;;7911:1;7908;7901:12;7855:60;7805:116;:::o;7927:133::-;7970:5;8008:6;7995:20;7986:29;;8024:30;8048:5;8024:30;:::i;:::-;7927:133;;;;:::o;8066:468::-;8131:6;8139;8188:2;8176:9;8167:7;8163:23;8159:32;8156:119;;;8194:79;;:::i;:::-;8156:119;8314:1;8339:53;8384:7;8375:6;8364:9;8360:22;8339:53;:::i;:::-;8329:63;;8285:117;8441:2;8467:50;8509:7;8500:6;8489:9;8485:22;8467:50;:::i;:::-;8457:60;;8412:115;8066:468;;;;;:::o;8540:117::-;8649:1;8646;8639:12;8663:117;8772:1;8769;8762:12;8786:180;8834:77;8831:1;8824:88;8931:4;8928:1;8921:15;8955:4;8952:1;8945:15;8972:281;9055:27;9077:4;9055:27;:::i;:::-;9047:6;9043:40;9185:6;9173:10;9170:22;9149:18;9137:10;9134:34;9131:62;9128:88;;;9196:18;;:::i;:::-;9128:88;9236:10;9232:2;9225:22;9015:238;8972:281;;:::o;9259:129::-;9293:6;9320:20;;:::i;:::-;9310:30;;9349:33;9377:4;9369:6;9349:33;:::i;:::-;9259:129;;;:::o;9394:307::-;9455:4;9545:18;9537:6;9534:30;9531:56;;;9567:18;;:::i;:::-;9531:56;9605:29;9627:6;9605:29;:::i;:::-;9597:37;;9689:4;9683;9679:15;9671:23;;9394:307;;;:::o;9707:154::-;9791:6;9786:3;9781;9768:30;9853:1;9844:6;9839:3;9835:16;9828:27;9707:154;;;:::o;9867:410::-;9944:5;9969:65;9985:48;10026:6;9985:48;:::i;:::-;9969:65;:::i;:::-;9960:74;;10057:6;10050:5;10043:21;10095:4;10088:5;10084:16;10133:3;10124:6;10119:3;10115:16;10112:25;10109:112;;;10140:79;;:::i;:::-;10109:112;10230:41;10264:6;10259:3;10254;10230:41;:::i;:::-;9950:327;9867:410;;;;;:::o;10296:338::-;10351:5;10400:3;10393:4;10385:6;10381:17;10377:27;10367:122;;10408:79;;:::i;:::-;10367:122;10525:6;10512:20;10550:78;10624:3;10616:6;10609:4;10601:6;10597:17;10550:78;:::i;:::-;10541:87;;10357:277;10296:338;;;;:::o;10640:943::-;10735:6;10743;10751;10759;10808:3;10796:9;10787:7;10783:23;10779:33;10776:120;;;10815:79;;:::i;:::-;10776:120;10935:1;10960:53;11005:7;10996:6;10985:9;10981:22;10960:53;:::i;:::-;10950:63;;10906:117;11062:2;11088:53;11133:7;11124:6;11113:9;11109:22;11088:53;:::i;:::-;11078:63;;11033:118;11190:2;11216:53;11261:7;11252:6;11241:9;11237:22;11216:53;:::i;:::-;11206:63;;11161:118;11346:2;11335:9;11331:18;11318:32;11377:18;11369:6;11366:30;11363:117;;;11399:79;;:::i;:::-;11363:117;11504:62;11558:7;11549:6;11538:9;11534:22;11504:62;:::i;:::-;11494:72;;11289:287;10640:943;;;;;;;:::o;11589:474::-;11657:6;11665;11714:2;11702:9;11693:7;11689:23;11685:32;11682:119;;;11720:79;;:::i;:::-;11682:119;11840:1;11865:53;11910:7;11901:6;11890:9;11886:22;11865:53;:::i;:::-;11855:63;;11811:117;11967:2;11993:53;12038:7;12029:6;12018:9;12014:22;11993:53;:::i;:::-;11983:63;;11938:118;11589:474;;;;;:::o;12069:311::-;12146:4;12236:18;12228:6;12225:30;12222:56;;;12258:18;;:::i;:::-;12222:56;12308:4;12300:6;12296:17;12288:25;;12368:4;12362;12358:15;12350:23;;12069:311;;;:::o;12386:117::-;12495:1;12492;12485:12;12526:710;12622:5;12647:81;12663:64;12720:6;12663:64;:::i;:::-;12647:81;:::i;:::-;12638:90;;12748:5;12777:6;12770:5;12763:21;12811:4;12804:5;12800:16;12793:23;;12864:4;12856:6;12852:17;12844:6;12840:30;12893:3;12885:6;12882:15;12879:122;;;12912:79;;:::i;:::-;12879:122;13027:6;13010:220;13044:6;13039:3;13036:15;13010:220;;;13119:3;13148:37;13181:3;13169:10;13148:37;:::i;:::-;13143:3;13136:50;13215:4;13210:3;13206:14;13199:21;;13086:144;13070:4;13065:3;13061:14;13054:21;;13010:220;;;13014:21;12628:608;;12526:710;;;;;:::o;13259:370::-;13330:5;13379:3;13372:4;13364:6;13360:17;13356:27;13346:122;;13387:79;;:::i;:::-;13346:122;13504:6;13491:20;13529:94;13619:3;13611:6;13604:4;13596:6;13592:17;13529:94;:::i;:::-;13520:103;;13336:293;13259:370;;;;:::o;13635:539::-;13719:6;13768:2;13756:9;13747:7;13743:23;13739:32;13736:119;;;13774:79;;:::i;:::-;13736:119;13922:1;13911:9;13907:17;13894:31;13952:18;13944:6;13941:30;13938:117;;;13974:79;;:::i;:::-;13938:117;14079:78;14149:7;14140:6;14129:9;14125:22;14079:78;:::i;:::-;14069:88;;13865:302;13635:539;;;;:::o;14180:180::-;14228:77;14225:1;14218:88;14325:4;14322:1;14315:15;14349:4;14346:1;14339:15;14366:320;14410:6;14447:1;14441:4;14437:12;14427:22;;14494:1;14488:4;14484:12;14515:18;14505:81;;14571:4;14563:6;14559:17;14549:27;;14505:81;14633:2;14625:6;14622:14;14602:18;14599:38;14596:84;;;14652:18;;:::i;:::-;14596:84;14417:269;14366:320;;;:::o;14692:231::-;14832:34;14828:1;14820:6;14816:14;14809:58;14901:14;14896:2;14888:6;14884:15;14877:39;14692:231;:::o;14929:366::-;15071:3;15092:67;15156:2;15151:3;15092:67;:::i;:::-;15085:74;;15168:93;15257:3;15168:93;:::i;:::-;15286:2;15281:3;15277:12;15270:19;;14929:366;;;:::o;15301:419::-;15467:4;15505:2;15494:9;15490:18;15482:26;;15554:9;15548:4;15544:20;15540:1;15529:9;15525:17;15518:47;15582:131;15708:4;15582:131;:::i;:::-;15574:139;;15301:419;;;:::o;15726:220::-;15866:34;15862:1;15854:6;15850:14;15843:58;15935:3;15930:2;15922:6;15918:15;15911:28;15726:220;:::o;15952:366::-;16094:3;16115:67;16179:2;16174:3;16115:67;:::i;:::-;16108:74;;16191:93;16280:3;16191:93;:::i;:::-;16309:2;16304:3;16300:12;16293:19;;15952:366;;;:::o;16324:419::-;16490:4;16528:2;16517:9;16513:18;16505:26;;16577:9;16571:4;16567:20;16563:1;16552:9;16548:17;16541:47;16605:131;16731:4;16605:131;:::i;:::-;16597:139;;16324:419;;;:::o;16749:243::-;16889:34;16885:1;16877:6;16873:14;16866:58;16958:26;16953:2;16945:6;16941:15;16934:51;16749:243;:::o;16998:366::-;17140:3;17161:67;17225:2;17220:3;17161:67;:::i;:::-;17154:74;;17237:93;17326:3;17237:93;:::i;:::-;17355:2;17350:3;17346:12;17339:19;;16998:366;;;:::o;17370:419::-;17536:4;17574:2;17563:9;17559:18;17551:26;;17623:9;17617:4;17613:20;17609:1;17598:9;17594:17;17587:47;17651:131;17777:4;17651:131;:::i;:::-;17643:139;;17370:419;;;:::o;17795:236::-;17935:34;17931:1;17923:6;17919:14;17912:58;18004:19;17999:2;17991:6;17987:15;17980:44;17795:236;:::o;18037:366::-;18179:3;18200:67;18264:2;18259:3;18200:67;:::i;:::-;18193:74;;18276:93;18365:3;18276:93;:::i;:::-;18394:2;18389:3;18385:12;18378:19;;18037:366;;;:::o;18409:419::-;18575:4;18613:2;18602:9;18598:18;18590:26;;18662:9;18656:4;18652:20;18648:1;18637:9;18633:17;18626:47;18690:131;18816:4;18690:131;:::i;:::-;18682:139;;18409:419;;;:::o;18834:182::-;18974:34;18970:1;18962:6;18958:14;18951:58;18834:182;:::o;19022:366::-;19164:3;19185:67;19249:2;19244:3;19185:67;:::i;:::-;19178:74;;19261:93;19350:3;19261:93;:::i;:::-;19379:2;19374:3;19370:12;19363:19;;19022:366;;;:::o;19394:419::-;19560:4;19598:2;19587:9;19583:18;19575:26;;19647:9;19641:4;19637:20;19633:1;19622:9;19618:17;19611:47;19675:131;19801:4;19675:131;:::i;:::-;19667:139;;19394:419;;;:::o;19819:230::-;19959:34;19955:1;19947:6;19943:14;19936:58;20028:13;20023:2;20015:6;20011:15;20004:38;19819:230;:::o;20055:366::-;20197:3;20218:67;20282:2;20277:3;20218:67;:::i;:::-;20211:74;;20294:93;20383:3;20294:93;:::i;:::-;20412:2;20407:3;20403:12;20396:19;;20055:366;;;:::o;20427:419::-;20593:4;20631:2;20620:9;20616:18;20608:26;;20680:9;20674:4;20670:20;20666:1;20655:9;20651:17;20644:47;20708:131;20834:4;20708:131;:::i;:::-;20700:139;;20427:419;;;:::o;20852:147::-;20953:11;20990:3;20975:18;;20852:147;;;;:::o;21005:114::-;;:::o;21125:398::-;21284:3;21305:83;21386:1;21381:3;21305:83;:::i;:::-;21298:90;;21397:93;21486:3;21397:93;:::i;:::-;21515:1;21510:3;21506:11;21499:18;;21125:398;;;:::o;21529:379::-;21713:3;21735:147;21878:3;21735:147;:::i;:::-;21728:154;;21899:3;21892:10;;21529:379;;;:::o;21914:167::-;22054:19;22050:1;22042:6;22038:14;22031:43;21914:167;:::o;22087:366::-;22229:3;22250:67;22314:2;22309:3;22250:67;:::i;:::-;22243:74;;22326:93;22415:3;22326:93;:::i;:::-;22444:2;22439:3;22435:12;22428:19;;22087:366;;;:::o;22459:419::-;22625:4;22663:2;22652:9;22648:18;22640:26;;22712:9;22706:4;22702:20;22698:1;22687:9;22683:17;22676:47;22740:131;22866:4;22740:131;:::i;:::-;22732:139;;22459:419;;;:::o;22884:231::-;23024:34;23020:1;23012:6;23008:14;23001:58;23093:14;23088:2;23080:6;23076:15;23069:39;22884:231;:::o;23121:366::-;23263:3;23284:67;23348:2;23343:3;23284:67;:::i;:::-;23277:74;;23360:93;23449:3;23360:93;:::i;:::-;23478:2;23473:3;23469:12;23462:19;;23121:366;;;:::o;23493:419::-;23659:4;23697:2;23686:9;23682:18;23674:26;;23746:9;23740:4;23736:20;23732:1;23721:9;23717:17;23710:47;23774:131;23900:4;23774:131;:::i;:::-;23766:139;;23493:419;;;:::o;23918:180::-;23966:77;23963:1;23956:88;24063:4;24060:1;24053:15;24087:4;24084:1;24077:15;24104:228;24244:34;24240:1;24232:6;24228:14;24221:58;24313:11;24308:2;24300:6;24296:15;24289:36;24104:228;:::o;24338:366::-;24480:3;24501:67;24565:2;24560:3;24501:67;:::i;:::-;24494:74;;24577:93;24666:3;24577:93;:::i;:::-;24695:2;24690:3;24686:12;24679:19;;24338:366;;;:::o;24710:419::-;24876:4;24914:2;24903:9;24899:18;24891:26;;24963:9;24957:4;24953:20;24949:1;24938:9;24934:17;24927:47;24991:131;25117:4;24991:131;:::i;:::-;24983:139;;24710:419;;;:::o;25135:229::-;25275:34;25271:1;25263:6;25259:14;25252:58;25344:12;25339:2;25331:6;25327:15;25320:37;25135:229;:::o;25370:366::-;25512:3;25533:67;25597:2;25592:3;25533:67;:::i;:::-;25526:74;;25609:93;25698:3;25609:93;:::i;:::-;25727:2;25722:3;25718:12;25711:19;;25370:366;;;:::o;25742:419::-;25908:4;25946:2;25935:9;25931:18;25923:26;;25995:9;25989:4;25985:20;25981:1;25970:9;25966:17;25959:47;26023:131;26149:4;26023:131;:::i;:::-;26015:139;;25742:419;;;:::o;26167:180::-;26215:77;26212:1;26205:88;26312:4;26309:1;26302:15;26336:4;26333:1;26326:15;26353:305;26393:3;26412:20;26430:1;26412:20;:::i;:::-;26407:25;;26446:20;26464:1;26446:20;:::i;:::-;26441:25;;26600:1;26532:66;26528:74;26525:1;26522:81;26519:107;;;26606:18;;:::i;:::-;26519:107;26650:1;26647;26643:9;26636:16;;26353:305;;;;:::o;26664:191::-;26704:4;26724:20;26742:1;26724:20;:::i;:::-;26719:25;;26758:20;26776:1;26758:20;:::i;:::-;26753:25;;26797:1;26794;26791:8;26788:34;;;26802:18;;:::i;:::-;26788:34;26847:1;26844;26840:9;26832:17;;26664:191;;;;:::o;26861:180::-;26909:77;26906:1;26899:88;27006:4;27003:1;26996:15;27030:4;27027:1;27020:15;27047:185;27087:1;27104:20;27122:1;27104:20;:::i;:::-;27099:25;;27138:20;27156:1;27138:20;:::i;:::-;27133:25;;27177:1;27167:35;;27182:18;;:::i;:::-;27167:35;27224:1;27221;27217:9;27212:14;;27047:185;;;;:::o;27238:348::-;27278:7;27301:20;27319:1;27301:20;:::i;:::-;27296:25;;27335:20;27353:1;27335:20;:::i;:::-;27330:25;;27523:1;27455:66;27451:74;27448:1;27445:81;27440:1;27433:9;27426:17;27422:105;27419:131;;;27530:18;;:::i;:::-;27419:131;27578:1;27575;27571:9;27560:20;;27238:348;;;;:::o;27592:181::-;27732:33;27728:1;27720:6;27716:14;27709:57;27592:181;:::o;27779:366::-;27921:3;27942:67;28006:2;28001:3;27942:67;:::i;:::-;27935:74;;28018:93;28107:3;28018:93;:::i;:::-;28136:2;28131:3;28127:12;28120:19;;27779:366;;;:::o;28151:419::-;28317:4;28355:2;28344:9;28340:18;28332:26;;28404:9;28398:4;28394:20;28390:1;28379:9;28375:17;28368:47;28432:131;28558:4;28432:131;:::i;:::-;28424:139;;28151:419;;;:::o;28576:171::-;28716:23;28712:1;28704:6;28700:14;28693:47;28576:171;:::o;28753:366::-;28895:3;28916:67;28980:2;28975:3;28916:67;:::i;:::-;28909:74;;28992:93;29081:3;28992:93;:::i;:::-;29110:2;29105:3;29101:12;29094:19;;28753:366;;;:::o;29125:419::-;29291:4;29329:2;29318:9;29314:18;29306:26;;29378:9;29372:4;29368:20;29364:1;29353:9;29349:17;29342:47;29406:131;29532:4;29406:131;:::i;:::-;29398:139;;29125:419;;;:::o;29550:182::-;29690:34;29686:1;29678:6;29674:14;29667:58;29550:182;:::o;29738:366::-;29880:3;29901:67;29965:2;29960:3;29901:67;:::i;:::-;29894:74;;29977:93;30066:3;29977:93;:::i;:::-;30095:2;30090:3;30086:12;30079:19;;29738:366;;;:::o;30110:419::-;30276:4;30314:2;30303:9;30299:18;30291:26;;30363:9;30357:4;30353:20;30349:1;30338:9;30334:17;30327:47;30391:131;30517:4;30391:131;:::i;:::-;30383:139;;30110:419;;;:::o;30535:229::-;30675:34;30671:1;30663:6;30659:14;30652:58;30744:12;30739:2;30731:6;30727:15;30720:37;30535:229;:::o;30770:366::-;30912:3;30933:67;30997:2;30992:3;30933:67;:::i;:::-;30926:74;;31009:93;31098:3;31009:93;:::i;:::-;31127:2;31122:3;31118:12;31111:19;;30770:366;;;:::o;31142:419::-;31308:4;31346:2;31335:9;31331:18;31323:26;;31395:9;31389:4;31385:20;31381:1;31370:9;31366:17;31359:47;31423:131;31549:4;31423:131;:::i;:::-;31415:139;;31142:419;;;:::o;31567:176::-;31599:1;31616:20;31634:1;31616:20;:::i;:::-;31611:25;;31650:20;31668:1;31650:20;:::i;:::-;31645:25;;31689:1;31679:35;;31694:18;;:::i;:::-;31679:35;31735:1;31732;31728:9;31723:14;;31567:176;;;;:::o;31749:233::-;31788:3;31811:24;31829:5;31811:24;:::i;:::-;31802:33;;31857:66;31850:5;31847:77;31844:103;;;31927:18;;:::i;:::-;31844:103;31974:1;31967:5;31963:13;31956:20;;31749:233;;;:::o;31988:175::-;32128:27;32124:1;32116:6;32112:14;32105:51;31988:175;:::o;32169:366::-;32311:3;32332:67;32396:2;32391:3;32332:67;:::i;:::-;32325:74;;32408:93;32497:3;32408:93;:::i;:::-;32526:2;32521:3;32517:12;32510:19;;32169:366;;;:::o;32541:419::-;32707:4;32745:2;32734:9;32730:18;32722:26;;32794:9;32788:4;32784:20;32780:1;32769:9;32765:17;32758:47;32822:131;32948:4;32822:131;:::i;:::-;32814:139;;32541:419;;;:::o;32966:177::-;33106:29;33102:1;33094:6;33090:14;33083:53;32966:177;:::o;33149:366::-;33291:3;33312:67;33376:2;33371:3;33312:67;:::i;:::-;33305:74;;33388:93;33477:3;33388:93;:::i;:::-;33506:2;33501:3;33497:12;33490:19;;33149:366;;;:::o;33521:419::-;33687:4;33725:2;33714:9;33710:18;33702:26;;33774:9;33768:4;33764:20;33760:1;33749:9;33745:17;33738:47;33802:131;33928:4;33802:131;:::i;:::-;33794:139;;33521:419;;;:::o;33946:332::-;34067:4;34105:2;34094:9;34090:18;34082:26;;34118:71;34186:1;34175:9;34171:17;34162:6;34118:71;:::i;:::-;34199:72;34267:2;34256:9;34252:18;34243:6;34199:72;:::i;:::-;33946:332;;;;;:::o;34284:308::-;34346:4;34436:18;34428:6;34425:30;34422:56;;;34458:18;;:::i;:::-;34422:56;34496:29;34518:6;34496:29;:::i;:::-;34488:37;;34580:4;34574;34570:15;34562:23;;34284:308;;;:::o;34598:421::-;34687:5;34712:66;34728:49;34770:6;34728:49;:::i;:::-;34712:66;:::i;:::-;34703:75;;34801:6;34794:5;34787:21;34839:4;34832:5;34828:16;34877:3;34868:6;34863:3;34859:16;34856:25;34853:112;;;34884:79;;:::i;:::-;34853:112;34974:39;35006:6;35001:3;34996;34974:39;:::i;:::-;34693:326;34598:421;;;;;:::o;35039:355::-;35106:5;35155:3;35148:4;35140:6;35136:17;35132:27;35122:122;;35163:79;;:::i;:::-;35122:122;35273:6;35267:13;35298:90;35384:3;35376:6;35369:4;35361:6;35357:17;35298:90;:::i;:::-;35289:99;;35112:282;35039:355;;;;:::o;35400:524::-;35480:6;35529:2;35517:9;35508:7;35504:23;35500:32;35497:119;;;35535:79;;:::i;:::-;35497:119;35676:1;35665:9;35661:17;35655:24;35706:18;35698:6;35695:30;35692:117;;;35728:79;;:::i;:::-;35692:117;35833:74;35899:7;35890:6;35879:9;35875:22;35833:74;:::i;:::-;35823:84;;35626:291;35400:524;;;;:::o;35930:225::-;36070:34;36066:1;36058:6;36054:14;36047:58;36139:8;36134:2;36126:6;36122:15;36115:33;35930:225;:::o;36161:366::-;36303:3;36324:67;36388:2;36383:3;36324:67;:::i;:::-;36317:74;;36400:93;36489:3;36400:93;:::i;:::-;36518:2;36513:3;36509:12;36502:19;;36161:366;;;:::o;36533:419::-;36699:4;36737:2;36726:9;36722:18;36714:26;;36786:9;36780:4;36776:20;36772:1;36761:9;36757:17;36750:47;36814:131;36940:4;36814:131;:::i;:::-;36806:139;;36533:419;;;:::o;36958:234::-;37098:34;37094:1;37086:6;37082:14;37075:58;37167:17;37162:2;37154:6;37150:15;37143:42;36958:234;:::o;37198:366::-;37340:3;37361:67;37425:2;37420:3;37361:67;:::i;:::-;37354:74;;37437:93;37526:3;37437:93;:::i;:::-;37555:2;37550:3;37546:12;37539:19;;37198:366;;;:::o;37570:419::-;37736:4;37774:2;37763:9;37759:18;37751:26;;37823:9;37817:4;37813:20;37809:1;37798:9;37794:17;37787:47;37851:131;37977:4;37851:131;:::i;:::-;37843:139;;37570:419;;;:::o;37995:143::-;38052:5;38083:6;38077:13;38068:22;;38099:33;38126:5;38099:33;:::i;:::-;37995:143;;;;:::o;38144:351::-;38214:6;38263:2;38251:9;38242:7;38238:23;38234:32;38231:119;;;38269:79;;:::i;:::-;38231:119;38389:1;38414:64;38470:7;38461:6;38450:9;38446:22;38414:64;:::i;:::-;38404:74;;38360:128;38144:351;;;;:::o;38501:231::-;38641:34;38637:1;38629:6;38625:14;38618:58;38710:14;38705:2;38697:6;38693:15;38686:39;38501:231;:::o;38738:366::-;38880:3;38901:67;38965:2;38960:3;38901:67;:::i;:::-;38894:74;;38977:93;39066:3;38977:93;:::i;:::-;39095:2;39090:3;39086:12;39079:19;;38738:366;;;:::o;39110:419::-;39276:4;39314:2;39303:9;39299:18;39291:26;;39363:9;39357:4;39353:20;39349:1;39338:9;39334:17;39327:47;39391:131;39517:4;39391:131;:::i;:::-;39383:139;;39110:419;;;:::o;39535:228::-;39675:34;39671:1;39663:6;39659:14;39652:58;39744:11;39739:2;39731:6;39727:15;39720:36;39535:228;:::o;39769:366::-;39911:3;39932:67;39996:2;39991:3;39932:67;:::i;:::-;39925:74;;40008:93;40097:3;40008:93;:::i;:::-;40126:2;40121:3;40117:12;40110:19;;39769:366;;;:::o;40141:419::-;40307:4;40345:2;40334:9;40330:18;40322:26;;40394:9;40388:4;40384:20;40380:1;40369:9;40365:17;40358:47;40422:131;40548:4;40422:131;:::i;:::-;40414:139;;40141:419;;;:::o;40566:223::-;40706:34;40702:1;40694:6;40690:14;40683:58;40775:6;40770:2;40762:6;40758:15;40751:31;40566:223;:::o;40795:366::-;40937:3;40958:67;41022:2;41017:3;40958:67;:::i;:::-;40951:74;;41034:93;41123:3;41034:93;:::i;:::-;41152:2;41147:3;41143:12;41136:19;;40795:366;;;:::o;41167:419::-;41333:4;41371:2;41360:9;41356:18;41348:26;;41420:9;41414:4;41410:20;41406:1;41395:9;41391:17;41384:47;41448:131;41574:4;41448:131;:::i;:::-;41440:139;;41167:419;;;:::o;41592:77::-;41629:7;41658:5;41647:16;;41592:77;;;:::o;41675:79::-;41714:7;41743:5;41732:16;;41675:79;;;:::o;41760:157::-;41865:45;41885:24;41903:5;41885:24;:::i;:::-;41865:45;:::i;:::-;41860:3;41853:58;41760:157;;:::o;41923:79::-;41962:7;41991:5;41980:16;;41923:79;;;:::o;42008:157::-;42113:45;42133:24;42151:5;42133:24;:::i;:::-;42113:45;:::i;:::-;42108:3;42101:58;42008:157;;:::o;42171:397::-;42311:3;42326:75;42397:3;42388:6;42326:75;:::i;:::-;42426:2;42421:3;42417:12;42410:19;;42439:75;42510:3;42501:6;42439:75;:::i;:::-;42539:2;42534:3;42530:12;42523:19;;42559:3;42552:10;;42171:397;;;;;:::o;42574:237::-;42714:34;42710:1;42702:6;42698:14;42691:58;42783:20;42778:2;42770:6;42766:15;42759:45;42574:237;:::o;42817:366::-;42959:3;42980:67;43044:2;43039:3;42980:67;:::i;:::-;42973:74;;43056:93;43145:3;43056:93;:::i;:::-;43174:2;43169:3;43165:12;43158:19;;42817:366;;;:::o;43189:419::-;43355:4;43393:2;43382:9;43378:18;43370:26;;43442:9;43436:4;43432:20;43428:1;43417:9;43413:17;43406:47;43470:131;43596:4;43470:131;:::i;:::-;43462:139;;43189:419;;;:::o;43614:143::-;43671:5;43702:6;43696:13;43687:22;;43718:33;43745:5;43718:33;:::i;:::-;43614:143;;;;:::o;43763:351::-;43833:6;43882:2;43870:9;43861:7;43857:23;43853:32;43850:119;;;43888:79;;:::i;:::-;43850:119;44008:1;44033:64;44089:7;44080:6;44069:9;44065:22;44033:64;:::i;:::-;44023:74;;43979:128;43763:351;;;;:::o;44120:332::-;44241:4;44279:2;44268:9;44264:18;44256:26;;44292:71;44360:1;44349:9;44345:17;44336:6;44292:71;:::i;:::-;44373:72;44441:2;44430:9;44426:18;44417:6;44373:72;:::i;:::-;44120:332;;;;;:::o;44458:137::-;44512:5;44543:6;44537:13;44528:22;;44559:30;44583:5;44559:30;:::i;:::-;44458:137;;;;:::o;44601:345::-;44668:6;44717:2;44705:9;44696:7;44692:23;44688:32;44685:119;;;44723:79;;:::i;:::-;44685:119;44843:1;44868:61;44921:7;44912:6;44901:9;44897:22;44868:61;:::i;:::-;44858:71;;44814:125;44601:345;;;;:::o;44952:98::-;45003:6;45037:5;45031:12;45021:22;;44952:98;;;:::o;45056:168::-;45139:11;45173:6;45168:3;45161:19;45213:4;45208:3;45204:14;45189:29;;45056:168;;;;:::o;45230:360::-;45316:3;45344:38;45376:5;45344:38;:::i;:::-;45398:70;45461:6;45456:3;45398:70;:::i;:::-;45391:77;;45477:52;45522:6;45517:3;45510:4;45503:5;45499:16;45477:52;:::i;:::-;45554:29;45576:6;45554:29;:::i;:::-;45549:3;45545:39;45538:46;;45320:270;45230:360;;;;:::o;45596:640::-;45791:4;45829:3;45818:9;45814:19;45806:27;;45843:71;45911:1;45900:9;45896:17;45887:6;45843:71;:::i;:::-;45924:72;45992:2;45981:9;45977:18;45968:6;45924:72;:::i;:::-;46006;46074:2;46063:9;46059:18;46050:6;46006:72;:::i;:::-;46125:9;46119:4;46115:20;46110:2;46099:9;46095:18;46088:48;46153:76;46224:4;46215:6;46153:76;:::i;:::-;46145:84;;45596:640;;;;;;;:::o;46242:141::-;46298:5;46329:6;46323:13;46314:22;;46345:32;46371:5;46345:32;:::i;:::-;46242:141;;;;:::o;46389:349::-;46458:6;46507:2;46495:9;46486:7;46482:23;46478:32;46475:119;;;46513:79;;:::i;:::-;46475:119;46633:1;46658:63;46713:7;46704:6;46693:9;46689:22;46658:63;:::i;:::-;46648:73;;46604:127;46389:349;;;;:::o;46744:180::-;46792:77;46789:1;46782:88;46889:4;46886:1;46879:15;46913:4;46910:1;46903:15;46930:182;47070:34;47066:1;47058:6;47054:14;47047:58;46930:182;:::o;47118:366::-;47260:3;47281:67;47345:2;47340:3;47281:67;:::i;:::-;47274:74;;47357:93;47446:3;47357:93;:::i;:::-;47475:2;47470:3;47466:12;47459:19;;47118:366;;;:::o;47490:419::-;47656:4;47694:2;47683:9;47679:18;47671:26;;47743:9;47737:4;47733:20;47729:1;47718:9;47714:17;47707:47;47771:131;47897:4;47771:131;:::i;:::-;47763:139;;47490:419;;;:::o;47915:178::-;48055:30;48051:1;48043:6;48039:14;48032:54;47915:178;:::o;48099:366::-;48241:3;48262:67;48326:2;48321:3;48262:67;:::i;:::-;48255:74;;48338:93;48427:3;48338:93;:::i;:::-;48456:2;48451:3;48447:12;48440:19;;48099:366;;;:::o;48471:419::-;48637:4;48675:2;48664:9;48660:18;48652:26;;48724:9;48718:4;48714:20;48710:1;48699:9;48695:17;48688:47;48752:131;48878:4;48752:131;:::i;:::-;48744:139;;48471:419;;;:::o

Swarm Source

ipfs://8167655155e32828009643f8fbd9fdd6677ae23b5de7f87302ec51c2c9f8351b
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Validator ID :
0 FTM

Amount Staked
0

Amount Delegated
0

Staking Total
0

Staking Start Epoch
0

Staking Start Time
0

Proof of Importance
0

Origination Score
0

Validation Score
0

Active
0

Online
0

Downtime
0 s
Address Amount claimed Rewards Created On Epoch Created On
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.