S Price: $0.734484 (+9.14%)

Contract

0x8a484f3743512d9A761fb6e484896c676CfAa943

Overview

S Balance

Sonic LogoSonic LogoSonic Logo0 S

S Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Add Master Contr...107855162025-02-28 15:30:4717 hrs ago1740756647IN
0x8a484f37...76CfAa943
0 S0.003012455.01
Add Master Contr...91571852025-02-21 15:09:327 days ago1740150572IN
0x8a484f37...76CfAa943
0 S0.0039701855.01
Add Master Contr...79921072025-02-15 12:44:2413 days ago1739623464IN
0x8a484f37...76CfAa943
0 S0.0421509155.01
Add Master Contr...78455632025-02-14 12:15:0914 days ago1739535309IN
0x8a484f37...76CfAa943
0 S0.003012455.01
Add Master Contr...72233772025-02-10 4:36:2219 days ago1739162182IN
0x8a484f37...76CfAa943
0 S0.0410438655
Add Master Contr...70995562025-02-09 4:05:5720 days ago1739073957IN
0x8a484f37...76CfAa943
0 S0.0611986655

Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FARPG_BattleV4

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at SonicScan.org on 2025-02-09
*/

// File: FINALdeployFA/LIB - Common Structs.sol


pragma solidity ^0.8.9;
        
        
library S { 

//Pet struct
   
    struct Unit {
        uint hp; //unit fainted when hp <= 0
        uint attack; //attack - defense = damage on hp
        uint defense; //attack - defense = damage on hp
        uint speed; //how frequent to take a move
        uint intelligence; //how frequent to use skill
        uint genestrength; //depends on how many duplicates
        uint range; //range skill, id
        uint special; //special skill, id
    }

    struct Status {
        //uint32 types; //determine element and some skills. 0=none, 1=fire, 2=water, 3=ice, 4=electic, 5=nature, 6=light, 7=dark //linked to skill right now
        uint id; //unit id
        uint family; //determine which class of gear it can be wore. record while evolve, since its only has max 2 family, example Dragon+phantom, and 30gene max, so can use *100
        //   family to gene is tricky, need to +1 to make sure 0 means nothing. Thus 1 is Dragon, althought for trainerGene, 0 is dragon 
        //   because player wont submit a transaction to set their trainer gene when start. 
        uint stage; //1 is rookie, 2 is mature, 3 is perfect

    }


    struct Time {
        uint bond; //how many time you took on this unit , use to evolve
        uint stamina; //how much you can train it per day. it should follow saturation graph
        uint hunger; //how much you feed it per day. it should follow saturation graph
    }


}
// File: @openzeppelin/[email protected]/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @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;
    }
}

// File: @openzeppelin/[email protected]/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @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() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: FINALdeployFA/LIB - BattleSystemV4LIB.sol


pragma solidity ^0.8.0;


library SK1 {

    function UnitSkills (S.Unit[6] memory _UnitGroup, uint[6] memory _UnitFocus, uint[6] memory _UnitReaction,
        uint _ithUnit, uint _tempTarget, uint[6] memory _TimeConsume, uint SkillNumber) 
        external pure returns 
        (S.Unit[6] memory UnitGroup, uint[6] memory UnitFocus, uint[6] memory UnitReaction, uint[6] memory TimeConsume){
            uint _damage;
            uint _reactionDamage;
            UnitGroup = _UnitGroup;
            UnitFocus = _UnitFocus;
            UnitReaction = _UnitReaction;
            TimeConsume = _TimeConsume;
            uint[3] memory targets_; //having a _ at the back indicates a combine usage of array
            if (_tempTarget >2) { // then it is player 2
                targets_[2] = 1; //1 is player2 as index start from 0, 3rd element [2] of this array store defending player. 
            }//actually no need to use targets_2 because we check _tempTarget at all skill. if >2 means Opponents/player 2
            //targets_[0] will use at attacking unit, and targets_[1] use as defending target unit later.
 //           //uint SkillNumber; 
            
            //-------------------------SKILL START-------------------------------------------------      
            //             _____ _  _______ _      _       _____ 
            //            / ____| |/ /_   _| |    | |     / ____|
            //           | (___ | ' /  | | | |    | |    | (___  
            //            \___ \|  <   | | | |    | |     \___ \ 
            //            ____) | . \ _| |_| |____| |____ ____) |
            //           |_____/|_|\_\_____|______|______|_____/ 
            //------------------------------------------------------------------------------------                                                   
                                        
            if (SkillNumber == 0) { //powerful normal attack
                _damage = ((UnitGroup[_ithUnit].attack+1) * 13) / 10; //130% //cannot less than 1, safemath not check
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
            //-----------------------------------------------------ADD SKILL START HERE-----------------------------------------------------
            } else if (SkillNumber == 2){ //skill number , SINGLE TARGET
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        4,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = (UnitGroup[_ithUnit].attack )  +  ((UnitGroup[_ithUnit].speed+1) * 2) ; //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 3){ //skill number , SINGLE TARGET
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        1,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].attack+1) * 2); //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 4){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget <= 2) {
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive

                        targets_[0] = _ithUnit;
                        //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                        (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        4,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = (UnitGroup[_ithUnit].attack )  +  ((UnitGroup[_ithUnit].speed+1) * 3) ; //********  _skill damage display seperately with element color.
                        _damage += _reactionDamage;
                        if (UnitGroup[targets_[1]].defense >= _damage) { //safemath
                            _damage = 1;
                        } else {
                            _damage = _damage - UnitGroup[targets_[1]].defense;
                        }
                        if (_damage > UnitGroup[targets_[1]].hp) { //safemath
                            UnitGroup[targets_[1]].hp =0;
                        } else {
                            UnitGroup[targets_[1]].hp -= _damage;
                        }
                    }
                }
            } else if (SkillNumber == 5){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget <= 2) {
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive

                        targets_[0] = _ithUnit;
                        //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                        (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        1,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].attack+1) * 15) / 10; //********  _skill damage display seperately with element color.
                        _damage += _reactionDamage;
                        if (UnitGroup[targets_[1]].defense >= _damage) { //safemath
                            _damage = 1;
                        } else {
                            _damage = _damage - UnitGroup[targets_[1]].defense;
                        }
                        if (_damage > UnitGroup[targets_[1]].hp) { //safemath
                            UnitGroup[targets_[1]].hp =0;
                        } else {
                            UnitGroup[targets_[1]].hp -= _damage;
                        }
                    }
                }
            } else if (SkillNumber == 6){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget > 2) { //reverse the condition to target allies
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive

                        targets_[0] = _ithUnit;
                        //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                        (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        6,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = (UnitGroup[_ithUnit].speed); //********  _skill damage display seperately with element color.
                        _damage += _reactionDamage;
                        UnitGroup[targets_[1]].hp += _damage; //Light reaction no damage, and this is gain HP +=
                    }
                }
            } else if (SkillNumber == 8){ //skill number , SINGLE TARGET
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].attack+1) * 2); //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 9){ //skill number , SINGLE TARGET
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].attack+1) * 2) ; //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 10){ //skill number , SINGLE TARGET
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        1,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].attack+1) * 3); //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 11){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget <= 2) {
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive

                        targets_[0] = _ithUnit;
                        //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                        (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[targets_[1]].hp+1)* 5) / 10; //********  _skill damage display seperately with element color.
                //cap damage for attack * 2.5
                if (_damage > (UnitGroup[targets_[0]].attack+1)*25/10) { //+1 safe math
                    _damage = (UnitGroup[targets_[0]].attack+1)*25/10;
                }
                        _damage += _reactionDamage;
                        if (UnitGroup[targets_[1]].defense >= _damage) { //safemath
                            _damage = 1;
                        } else {
                            _damage = _damage - UnitGroup[targets_[1]].defense;
                        }
                        if (_damage > UnitGroup[targets_[1]].hp) { //safemath
                            UnitGroup[targets_[1]].hp =0;
                        } else {
                            UnitGroup[targets_[1]].hp -= _damage;
                        }
                    }
                }
            } else if (SkillNumber == 12){ //skill number , SINGLE TARGET
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        3,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].defense+1) * 7); //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 14){ //skill number , SINGLE TARGET
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        3,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].attack+1) * 2) ; //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 15){ //skill number , SINGLE TARGET
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        2,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].attack+1) * 2); //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 16){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget <= 2) {
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive

                        targets_[0] = _ithUnit;
                        //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                        (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        3,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].defense+1) * 2); //********  _skill damage display seperately with element color.
                        _damage += _reactionDamage;
                        if (UnitGroup[targets_[1]].defense >= _damage) { //safemath
                            _damage = 1;
                        } else {
                            _damage = _damage - UnitGroup[targets_[1]].defense;
                        }
                        if (_damage > UnitGroup[targets_[1]].hp) { //safemath
                            UnitGroup[targets_[1]].hp =0;
                        } else {
                            UnitGroup[targets_[1]].hp -= _damage;
                        }
                    }
                }
            } else if (SkillNumber == 17){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget <= 2) {
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive

                        targets_[0] = _ithUnit;
                        //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                        (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        2,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].hp+1)*3) / 10; //********  _skill damage display seperately with element color.
                        _damage += _reactionDamage;
                        if (UnitGroup[targets_[1]].defense >= _damage) { //safemath
                            _damage = 1;
                        } else {
                            _damage = _damage - UnitGroup[targets_[1]].defense;
                        }
                        if (_damage > UnitGroup[targets_[1]].hp) { //safemath
                            UnitGroup[targets_[1]].hp =0;
                        } else {
                            UnitGroup[targets_[1]].hp -= _damage;
                        }
                    }
                }
            } else if (SkillNumber == 18){ //skill number , SINGLE TARGET
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].attack+1) * 35) / 10; //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 20){ //skill number , SINGLE TARGET
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        5,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].attack+1) * 2) ; //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 21){ //skill number , SINGLE TARGET
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        5,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 22){ //skill number , SINGLE TARGET
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        5,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].attack+1) * 35) / 10; //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 23){ //skill number , SINGLE TARGET
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        1,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = (UnitGroup[_ithUnit].attack )  +  ((UnitGroup[_ithUnit].intelligence+1) * 5) ; //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 24){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget <= 2) {
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive

                        targets_[0] = _ithUnit;
                        //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                        (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        5,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = (UnitGroup[targets_[1]].defense* 2) ; //********  _skill damage display seperately with element color.
                if (_damage > (UnitGroup[targets_[0]].attack+1)*2) {
                    _damage = (UnitGroup[targets_[0]].attack+1)*2;
                }
                        _damage += _reactionDamage;
                        if (UnitGroup[targets_[1]].defense >= _damage) { //safemath
                            _damage = 1;
                        } else {
                            _damage = _damage - UnitGroup[targets_[1]].defense;
                        }
                        if (_damage > UnitGroup[targets_[1]].hp) { //safemath
                            UnitGroup[targets_[1]].hp =0;
                        } else {
                            UnitGroup[targets_[1]].hp -= _damage;
                        }
                    }
                }
            } else if (SkillNumber == 25){ //skill number , SINGLE TARGET
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        3,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = (UnitGroup[_ithUnit].attack )  +  ((UnitGroup[_tempTarget].defense+1)* 5) ; //********  _skill damage display seperately with element color.
                if (_damage > (UnitGroup[targets_[0]].attack+1)*6) {
                    _damage = (UnitGroup[targets_[0]].attack+1)*6;
                }
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 26){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget <= 2) {
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive

                        targets_[0] = _ithUnit;
                        //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                        (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        5,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].intelligence+1) * 4) ; //********  _skill damage display seperately with element color.
                        _damage += _reactionDamage;
                        if (UnitGroup[targets_[1]].defense >= _damage) { //safemath
                            _damage = 1;
                        } else {
                            _damage = _damage - UnitGroup[targets_[1]].defense;
                        }
                        if (_damage > UnitGroup[targets_[1]].hp) { //safemath
                            UnitGroup[targets_[1]].hp =0;
                        } else {
                            UnitGroup[targets_[1]].hp -= _damage;
                        }
                    }
                }
            } else if (SkillNumber == 27){ //skill number , SINGLE TARGET
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        4,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = (UnitGroup[_ithUnit].attack )  +  (UnitGroup[_tempTarget].speed* 6) ; //********  _skill damage display seperately with element color.
                if (_damage > (UnitGroup[targets_[0]].attack+1)*6) {
                    _damage = (UnitGroup[targets_[0]].attack+1)*6;
                }
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 28){ //skill number , SINGLE TARGET
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        1,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                if(UnitGroup[_tempTarget].defense > 1000){
                    _damage = ((UnitGroup[_ithUnit].attack+1) * 4) ;
                } //********  _skill damage display seperately with element color.
                else{
                    _damage = ((UnitGroup[_ithUnit].attack+1) * 3) ;
                }
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 29){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget <= 2) {
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive

                        targets_[0] = _ithUnit;
                        //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                        (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        5,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = (UnitGroup[_ithUnit].attack )  +  ((UnitGroup[_ithUnit].intelligence+1) * 2) ; //********  _skill damage display seperately with element color.
                        _damage += _reactionDamage;
                        if (UnitGroup[targets_[1]].defense >= _damage) { //safemath
                            _damage = 1;
                        } else {
                            _damage = _damage - UnitGroup[targets_[1]].defense;
                        }
                        if (_damage > UnitGroup[targets_[1]].hp) { //safemath
                            UnitGroup[targets_[1]].hp =0;
                        } else {
                            UnitGroup[targets_[1]].hp -= _damage;
                        }
                    }
                }
            } else if (SkillNumber == 30){ //skill number , SINGLE TARGET
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        5,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                if(UnitGroup[_tempTarget].intelligence < UnitGroup[_ithUnit].intelligence){
                    _damage = ((UnitGroup[_ithUnit].intelligence+1) * 20) ;
                } //********  _skill damage display seperately with element color.
                else{
                    _damage = ((UnitGroup[_ithUnit].intelligence+1) * 10) ;
                } //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 31){ //skill number , SINGLE TARGET
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        2,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].hp+1)*5) / 10; //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 32){ //skill number , SINGLE TARGET
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = (UnitGroup[_ithUnit].attack*2 )  +  (UnitGroup[_tempTarget].attack*2) ; //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 33){ //skill number , SINGLE TARGET
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = (UnitGroup[_ithUnit].attack*3 )  +  (UnitGroup[_tempTarget].defense) ; //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 34){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>
                //Special: need to fix the HP first
                _damage = ((UnitGroup[_ithUnit].hp+1)*2) / 10; //********  _skill damage display seperately with element color.
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget > 2) { //reverse this for targeting allies
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive

                        targets_[0] = _ithUnit;
                        //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                        (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        6,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                        UnitGroup[targets_[1]].hp += _damage; //light reaction has no damage, and this is gain HP
                    }
                }
            } else if (SkillNumber == 35){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget <= 2) {
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive

                        targets_[0] = _ithUnit;
                        //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                        (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        2,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                if(UnitGroup[targets_[1]].hp < UnitGroup[_ithUnit].hp){
                    _damage = ((UnitGroup[_ithUnit].attack+1) * 2) ;
                } //********  _skill damage display seperately with element color.
                else{
                    _damage = ((UnitGroup[_ithUnit].attack+1) * 1) ;
                } //********  _skill damage display seperately with element color.
                        _damage += _reactionDamage;
                        if (UnitGroup[targets_[1]].defense >= _damage) { //safemath
                            _damage = 1;
                        } else {
                            _damage = _damage - UnitGroup[targets_[1]].defense;
                        }
                        if (_damage > UnitGroup[targets_[1]].hp) { //safemath
                            UnitGroup[targets_[1]].hp =0;
                        } else {
                            UnitGroup[targets_[1]].hp -= _damage;
                        }
                    }
                }
            } else if (SkillNumber == 36){ //skill number , SINGLE TARGET
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = (UnitGroup[_ithUnit].attack*3 )  +  (UnitFocus[_tempTarget]*5) ; //********  _skill damage display seperately with element color.
                if (_damage > (UnitGroup[targets_[0]].attack+1)*6) {
                    _damage = (UnitGroup[targets_[0]].attack+1)*6;
                }
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            
            } else if (SkillNumber == 38){ //skill number , SINGLE TARGET 
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        1,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 39){ //skill number 1 is Youpling, Consider AOE 
                //******** Special:  gain allies atk based on its atk*0.5, enemy applied fire.
                //fix damage number first as atk will gain per loop
                _damage = ((UnitGroup[_ithUnit].attack+1) * 5) / 10; //50% //********  _skill damage display seperately with element color.
                //gain allies damage first
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget > 2) { //reverse to target self first, no elemental reaction on self
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive
                        UnitGroup[targets_[1]].attack += _damage;
                    }
                }
                _damage = 0; //reset
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget <= 2) { //special: after gained attack, then damage enemy
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive

                        targets_[0] = _ithUnit;
                        //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                        (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        1,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                        //SKILL damage:
                        _damage = ((UnitGroup[_ithUnit].attack+1) * 2) / 10; //20% //********  _skill damage display seperately with element color.
                        _damage += _reactionDamage;
                        if (UnitGroup[targets_[1]].defense >= _damage) { //safemath
                            _damage = 1;
                        } else {
                            _damage = _damage - UnitGroup[targets_[1]].defense;
                        }
                        if (_damage > UnitGroup[targets_[1]].hp) { //safemath
                            UnitGroup[targets_[1]].hp =0;
                        } else {
                            UnitGroup[targets_[1]].hp -= _damage;
                        }
                    }
                }
            } else if (SkillNumber == 40){ //skill number , SINGLE TARGET 
                //special: gain self 5000HP, then damage HP*0.5
                UnitGroup[_ithUnit].hp += 5000;
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        6,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].hp+1) * 5) / 10; //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 42){ //skill number , SINGLE TARGET 
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        5,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 43){ //skill number , SINGLE TARGET 
            
                //special: atk*1 + oppo hp*0.5 (total cap self atk*6)
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        3,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = UnitGroup[_ithUnit].attack + ((UnitGroup[_tempTarget].hp+1)*5)/10; //********  _skill damage display seperately with element color.
                /*if (_damage > (UnitGroup[targets_[0]].attack+1)*6) {
                    _damage = (UnitGroup[targets_[0]].attack+1)*6;
                }*/
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 44){ //skill number 1 is Youpling, Consider AOE 
            //special: atk*1 stick Dark element even after reactions
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget <= 2) {
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive

                        targets_[0] = _ithUnit;
                        //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                        (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                        //SKILL damage:
                        _damage = ((UnitGroup[_ithUnit].attack+1) * 1); //100% //********  _skill damage display seperately with element color.
                        _damage += _reactionDamage;
                        if (UnitGroup[targets_[1]].defense >= _damage) { //safemath
                            _damage = 1;
                        } else {
                            _damage = _damage - UnitGroup[targets_[1]].defense;
                        }
                        if (_damage > UnitGroup[targets_[1]].hp) { //safemath
                            UnitGroup[targets_[1]].hp =0;
                        } else {
                            UnitGroup[targets_[1]].hp -= _damage;
                        }
                        UnitReaction[targets_[1]] = 7;//stick Dark
                    }
                }
            } else if (SkillNumber == 46){ //skill number , SINGLE TARGET 
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        3,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].attack+1) * 25) / 10; //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 47){ //skill number 
            //atk*2.8, if oppo def <1000, atk*4.5
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        3,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                if (UnitGroup[_tempTarget].defense < 1000) {
                    _damage = ((UnitGroup[_ithUnit].attack+1) * 28) / 10; //********  _skill damage display seperately with element color.
                } else {
                    _damage = ((UnitGroup[_ithUnit].attack+1) * 45) / 10; //********  _skill damage display seperately with element color.
                }
                
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 48){ //skill number 1 is Youpling, Consider AOE 
            //atk*1 to enemy, apply Light on allies
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget <= 2) {
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive

                        targets_[0] = _ithUnit;
                        //0=NoElement
                        //SKILL damage:
                        _damage = ((UnitGroup[_ithUnit].attack+1) * 10) / 10; //100% //********  _skill damage display seperately with element color.
                        //_damage += _reactionDamage; no reaction
                        if (UnitGroup[targets_[1]].defense >= _damage) { //safemath
                            _damage = 1;
                        } else {
                            _damage = _damage - UnitGroup[targets_[1]].defense;
                        }
                        if (_damage > UnitGroup[targets_[1]].hp) { //safemath
                            UnitGroup[targets_[1]].hp =0;
                        } else {
                            UnitGroup[targets_[1]].hp -= _damage;
                        }
                    }
                }
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget > 2) { //reverse to allies and gives Light element
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive

                        targets_[0] = _ithUnit;
                        //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                        (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        6,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                        //SKILL damage:
                        //no damage
                    }
                }
            } else if (SkillNumber == 50){ //skill number , SINGLE TARGET 
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].attack+1) * 20) / 10; //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 51){ //skill number 1 is Youpling, Consider AOE 
            //special: atk*1, if there is Dark on oppo, atk*2.5
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget <= 2) {
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive

                        targets_[0] = _ithUnit;
                        //SKILL damage first, need to by pass the element reaction and applying dark:
                        if (UnitReaction[targets_[1]] == 7) { //already has dark on them
                            _damage = ((UnitGroup[_ithUnit].attack+1) * 25) / 10; //250% //********  _skill damage display seperately with element color.
                        } else { //no dark element on them
                            _damage = ((UnitGroup[_ithUnit].attack+1) * 10) / 10; //100% //********  _skill damage display seperately with element color.
                        }
                        //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                        (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        5,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                        
                        _damage += _reactionDamage;
                        if (UnitGroup[targets_[1]].defense >= _damage) { //safemath
                            _damage = 1;
                        } else {
                            _damage = _damage - UnitGroup[targets_[1]].defense;
                        }
                        if (_damage > UnitGroup[targets_[1]].hp) { //safemath
                            UnitGroup[targets_[1]].hp =0;
                        } else {
                            UnitGroup[targets_[1]].hp -= _damage;
                        }
                    }
                }
            } else if (SkillNumber == 52){ //skill number , SINGLE TARGET 
            //Special: atk*2.5, if there is already dark on oppo, atk*3.5
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //SKILL damage first, need to by pass the element reaction and applying dark:
                if (UnitReaction[targets_[1]] == 7) { //already has dark on them
                    _damage = ((UnitGroup[_ithUnit].attack+1) * 35) / 10; //350% //********  _skill damage display seperately with element color.
                } else { //no dark element on them
                    _damage = ((UnitGroup[_ithUnit].attack+1) * 25) / 10; //250% //********  _skill damage display seperately with element color.
                }
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 54){ //skill number , SINGLE TARGET < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            }
        }


    function SkillReaction (S.Unit[6] memory _UnitGroup, uint[6] memory _UnitReaction, uint[6] memory _UnitFocus,
    uint[6] memory _TimeConsume, uint _AtkElement, uint[3] memory _targets_)
    private pure returns(S.Unit[6] memory UnitGroup,uint[6] memory UnitReaction,uint[6] memory UnitFocus,
    uint[6] memory TimeConsume, uint damage ) {
        UnitGroup = _UnitGroup;
        UnitReaction = _UnitReaction;
        UnitFocus = _UnitFocus;
        TimeConsume = _TimeConsume;        
        uint _ithUnit = _targets_[0];
        uint _tempTarget = _targets_[1];
        //uint _tempPlayer = _targets_[2];
        if (UnitReaction[_tempTarget] == 0 || UnitReaction[_tempTarget] == _AtkElement) { //means it has no reaction, place one for it.
            UnitReaction[_tempTarget] = _AtkElement;
        } else { //Unit has Element
            UnitReaction[_tempTarget] = (UnitReaction[_tempTarget]*10) + _AtkElement;
            //this is to encode for later use, imagine 12 and 21 also means Fire<->Water reaction
            if (UnitReaction[_tempTarget] == 12 ||UnitReaction[_tempTarget] == 21 ){ //Fire<->Water | Vaporize
                //Damage +0.3x HP_of_TriggerUnit
                damage = (UnitGroup[_ithUnit].hp+1) * 3 / 10;
                UnitReaction[_tempTarget] =0; //Conductive and Ignite need retain.
            } else if (UnitReaction[_tempTarget] == 13 ||UnitReaction[_tempTarget] == 31 ) { //Fire<->Ice | Melt
                //Damage +2x Defense_of_TriggerUnit
                damage = (UnitGroup[_ithUnit].defense+1) * 2;
                UnitReaction[_tempTarget] =0;
            } else if (UnitReaction[_tempTarget] == 14 ||UnitReaction[_tempTarget] == 41 ) { //Fire<->Electric | Flare
                //Damage +1x Attack_of_TriggerUnit
                damage = UnitGroup[_ithUnit].attack;
                UnitReaction[_tempTarget] =0;
            } else if (UnitReaction[_tempTarget] == 15 ||UnitReaction[_tempTarget] == 51 ) { //Fire<->Nature | Ignite
                //Damage +0.5x Attack_of_TriggerUnit, Retain Fire element
                damage = (UnitGroup[_ithUnit].attack+1) * 2 / 10;
                UnitReaction[_tempTarget] =1;
            } else if (UnitReaction[_tempTarget] == 16 ||UnitReaction[_tempTarget] == 61 ) { //Fire<->Light | Holy
                //Target current Attack +30% (stackable, round down)
                UnitGroup[_tempTarget].attack = ((UnitGroup[_tempTarget].attack+1) * 13) / 10;
                UnitReaction[_tempTarget] =0;
            } else if (UnitReaction[_tempTarget] == 17 ||UnitReaction[_tempTarget] == 71 ) { //Fire<->Dark | Exhaust
                //Target current Attack -30% (stackable, round down)
                UnitGroup[_tempTarget].attack = ((UnitGroup[_tempTarget].attack+1) * 7) / 10;
                UnitReaction[_tempTarget] =0;
            } else if (UnitReaction[_tempTarget] == 23 ||UnitReaction[_tempTarget] == 32 ) { //Water<->Ice | Frost
                //stop 1 turn, retain Ice Element
                TimeConsume[_tempTarget] += (100000/UnitGroup[_tempTarget].speed);
                UnitReaction[_tempTarget] =3;
            } else if (UnitReaction[_tempTarget] == 24 ||UnitReaction[_tempTarget] == 42 ) { //Water<->Electric | Conduct
                //Damage +1x Speed_of_TriggerUnit, Retain Electric element
                damage = UnitGroup[_ithUnit].speed;
                UnitReaction[_tempTarget] =4;
            } else if (UnitReaction[_tempTarget] == 25 ||UnitReaction[_tempTarget] == 52 ) { //Water<->Nature | Entangle
                //stop 1 turn, retain Nature Element
                TimeConsume[_tempTarget] += (100000/UnitGroup[_tempTarget].speed);
                UnitReaction[_tempTarget] =5;
            } else if (UnitReaction[_tempTarget] == 26 ||UnitReaction[_tempTarget] == 62 ) { //Water<->Light | Grow
                //Target current HP +25% (stackable, round down)
                UnitGroup[_tempTarget].hp = ((UnitGroup[_tempTarget].hp+1) * 125) / 100;
                UnitReaction[_tempTarget] =0;
            } else if (UnitReaction[_tempTarget] == 27 ||UnitReaction[_tempTarget] == 72 ) { //Water<->Dark | Dehydration
                //Target current HP -25% (stackable, round down) 
                if ( ((UnitGroup[_tempTarget].hp+1) * 25)/100 > 9999){
                    UnitGroup[_tempTarget].hp -= 9999;
                } else {
                    UnitGroup[_tempTarget].hp = ((UnitGroup[_tempTarget].hp+1) * 75) / 100;
                }
                UnitReaction[_tempTarget] =0;
            } else if (UnitReaction[_tempTarget] == 34 ||UnitReaction[_tempTarget] == 43 ) { //Ice<->Electric | Spark
                //Target current Defense -30% (stackable, round down) retain electric
                UnitGroup[_tempTarget].defense = ((UnitGroup[_tempTarget].defense+1) * 7) / 10;
                UnitReaction[_tempTarget] =4;
            } else if (UnitReaction[_tempTarget] == 35 ||UnitReaction[_tempTarget] == 53 ) { //Ice<->Nature | Chill
                //stop 1 turn, SkillStrategy reset to 0.
                TimeConsume[_tempTarget] += (100000/UnitGroup[_tempTarget].speed);
                UnitFocus[_tempTarget] = 0;
                UnitReaction[_tempTarget] = 0;
            } else if (UnitReaction[_tempTarget] == 36 ||UnitReaction[_tempTarget] == 63 ) { //Ice<->Light | Radiant
                //Target current Defense +30% (stackable, round down)
                UnitGroup[_tempTarget].defense = ((UnitGroup[_tempTarget].defense+1) * 13) / 10;
                UnitReaction[_tempTarget] =0;
            } else if (UnitReaction[_tempTarget] == 37 ||UnitReaction[_tempTarget] == 73 ) { //Ice<-> Dark | Dizzy
                //Target current Defense -50% (stackable, round down)
                UnitGroup[_tempTarget].defense = ((UnitGroup[_tempTarget].defense+1) * 5) / 10;
                UnitReaction[_tempTarget] =0;
            } else if (UnitReaction[_tempTarget] == 45 ||UnitReaction[_tempTarget] == 54 ) { //Electric<->Nature | Overgrowth
                //Damage +2x Intelligence_of_TriggerUnit
                damage = UnitGroup[_ithUnit].intelligence*2;
                UnitReaction[_tempTarget] =0;
            } else if (UnitReaction[_tempTarget] == 46 ||UnitReaction[_tempTarget] == 64 ) { //Electric<->Light | Reflect
                //Target current Speed +30% (stackable, round down)
                UnitGroup[_tempTarget].speed = ((UnitGroup[_tempTarget].speed+1) * 13) / 10;
                UnitReaction[_tempTarget] =0;
            } else if (UnitReaction[_tempTarget] == 47 ||UnitReaction[_tempTarget] == 74 ) { //Electric<->Dark | Pressure
                //Target current Speed -30% (stackable, round down)
                UnitGroup[_tempTarget].speed = ((UnitGroup[_tempTarget].speed+1) * 7) / 10;
                UnitReaction[_tempTarget] =0;
            } else if (UnitReaction[_tempTarget] == 56 ||UnitReaction[_tempTarget] == 65 ) { //Nature<->Light | Blossom
                //Target current Intelligence +30% (stackable, round down)
                UnitGroup[_tempTarget].intelligence = ((UnitGroup[_tempTarget].intelligence+1) * 13) / 10;
                UnitReaction[_tempTarget] =0;
            } else if (UnitReaction[_tempTarget] == 57 ||UnitReaction[_tempTarget] == 75 ) { //Nature<->Dark | Drain
                //Target current Intelligence -30% (stackable, round down)
                UnitGroup[_tempTarget].intelligence = ((UnitGroup[_tempTarget].intelligence+1) * 7) / 10;
                UnitReaction[_tempTarget] =0;
            } else if (UnitReaction[_tempTarget] == 67 ||UnitReaction[_tempTarget] == 76 ) { //Light<->Dark | Neutralize
                //Remove All Elements
                UnitReaction[_tempTarget] = 0;
            }
        }

    }


}
// File: FINALdeployFA/LIB - BattleSystemV4LIB2.sol


pragma solidity ^0.8.0;


library SK2 {

    function UnitSkills (S.Unit[6] memory _UnitGroup, uint[6] memory _UnitFocus, uint[6] memory _UnitReaction,
        uint _ithUnit, uint _tempTarget, uint[6] memory _TimeConsume, uint SkillNumber) 
        external pure returns 
        (S.Unit[6] memory UnitGroup, uint[6] memory UnitFocus, uint[6] memory UnitReaction, uint[6] memory TimeConsume){
            uint _damage;
            uint _reactionDamage;
            UnitGroup = _UnitGroup;
            UnitFocus = _UnitFocus;
            UnitReaction = _UnitReaction;
            TimeConsume = _TimeConsume;
            uint[3] memory targets_; //having a _ at the back indicates a combine usage of array
            if (_tempTarget >2) { // then it is player 2
                targets_[2] = 1; //1 is player2 as index start from 0, 3rd element [2] of this array store defending player. 
            }//actually no need to use targets_2 because we check _tempTarget at all skill. if >2 means Opponents/player 2
            //targets_[0] will use at attacking unit, and targets_[1] use as defending target unit later.
 //           //uint SkillNumber; 
            
            //-------------------------SKILL START-------------------------------------------------      
            //             _____ _  _______ _      _       _____ 
            //            / ____| |/ /_   _| |    | |     / ____|
            //           | (___ | ' /  | | | |    | |    | (___  
            //            \___ \|  <   | | | |    | |     \___ \ 
            //            ____) | . \ _| |_| |____| |____ ____) |
            //           |_____/|_|\_\_____|______|______|_____/ 
            //------------------------------------------------------------------------------------                                                   
                                        
            if (SkillNumber == 0) { //powerful normal attack
                _damage = ((UnitGroup[_ithUnit].attack+1) * 13) / 10; //130% //cannot less than 1, safemath not check
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
            //-----------------------------------------------------ADD SKILL START HERE-----------------------------------------------------
            } else if (SkillNumber == 55){ //skill number , SINGLE TARGET < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        4,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 56){ //skill number , SINGLE TARGET < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 57){ //skill number , SINGLE TARGET < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        4,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 58){ //skill number , SINGLE TARGET < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 60){ //skill number , SINGLE TARGET < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        1,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 61){ //skill number , SINGLE TARGET < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        3,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 62){ //skill number , SINGLE TARGET 
            //special: oppo target HP - 7500
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        4,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                //********  no damage first only reaction.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                _damage += 7500; //then add 7500 here
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 63){ //skill number , SINGLE TARGET < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        1,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 64){ //skill number , SINGLE TARGET < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        3,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 66){ //skill number , SINGLE TARGET < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        1,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 67){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget <= 2) {
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive

                        targets_[0] = _ithUnit;
                        //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                        (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        1,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                        //SKILL damage:
                        _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //220% //********  _skill damage display seperately with element color.
                        _damage += _reactionDamage;
                        if (UnitGroup[targets_[1]].defense >= _damage) { //safemath
                            _damage = 1;
                        } else {
                            _damage = _damage - UnitGroup[targets_[1]].defense;
                        }
                        if (_damage > UnitGroup[targets_[1]].hp) { //safemath
                            UnitGroup[targets_[1]].hp =0;
                        } else {
                            UnitGroup[targets_[1]].hp -= _damage;
                        }
                    }
                }
            } else if (SkillNumber == 68){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget <= 2) {
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive

                        targets_[0] = _ithUnit;
                        //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                        (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        1,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                        //SKILL damage:
                        _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //220% //********  _skill damage display seperately with element color.
                        _damage += _reactionDamage;
                        if (UnitGroup[targets_[1]].defense >= _damage) { //safemath
                            _damage = 1;
                        } else {
                            _damage = _damage - UnitGroup[targets_[1]].defense;
                        }
                        if (_damage > UnitGroup[targets_[1]].hp) { //safemath
                            UnitGroup[targets_[1]].hp =0;
                        } else {
                            UnitGroup[targets_[1]].hp -= _damage;
                        }
                    }
                }
            } else if (SkillNumber == 69){ //skill number , SINGLE TARGET 
            //atk*3. if have reaction damage, atk*5 instead
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        1,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                
                _damage += _reactionDamage;
                if (_damage > 1) { //if have reaction damage (only light and dark dont have)
                    _damage += ((UnitGroup[_ithUnit].attack+1) * 50) / 10; //********  _skill damage display seperately with element color.
                } else {
                    _damage += ((UnitGroup[_ithUnit].attack+1) * 30) / 10; //********  _skill damage display seperately with element color.
                }
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 70){ //skill number 1 is Youpling, Consider AOE 
            //special: atk*2.5, if have element onself, clear & atk*0.8 instead
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget <= 2) {
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive

                        targets_[0] = _ithUnit;
                        //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                        (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                        //SKILL damage:
                        if (UnitReaction[_ithUnit] > 0) { //if self have element
                            _damage = ((UnitGroup[_ithUnit].attack+1) * 8) / 10; //80% //********  _skill damage display seperately with element color.
                        } else { //if no element on self
                            _damage = ((UnitGroup[_ithUnit].attack+1) * 25) / 10; //250% //********  _skill damage display seperately with element color.
                        }
                        
                        _damage += _reactionDamage;
                        if (UnitGroup[targets_[1]].defense >= _damage) { //safemath
                            _damage = 1;
                        } else {
                            _damage = _damage - UnitGroup[targets_[1]].defense;
                        }
                        if (_damage > UnitGroup[targets_[1]].hp) { //safemath
                            UnitGroup[targets_[1]].hp =0;
                        } else {
                            UnitGroup[targets_[1]].hp -= _damage;
                        }
                    }
                }
                UnitReaction[_ithUnit] = 0; //clear eleemnt on self after attack
                
            } else if (SkillNumber == 71){ //skill number , SINGLE TARGET 
            //atk*2.5, then oppo def - 30%
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        2,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                UnitGroup[_tempTarget].defense = ((UnitGroup[_tempTarget].defense+1)*75) /100; //reduce 25%
                
            } else if (SkillNumber == 72){ //skill number 1 is Youpling, Consider AOE 
            //special : atk*1.8, all allies def + 20%
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget <= 2) {
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive

                        targets_[0] = _ithUnit;
                        //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                        (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        5,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                        //SKILL damage:
                        _damage = ((UnitGroup[_ithUnit].attack+1) * 18) / 10; //220% //********  _skill damage display seperately with element color.
                        _damage += _reactionDamage;
                        if (UnitGroup[targets_[1]].defense >= _damage) { //safemath
                            _damage = 1;
                        } else {
                            _damage = _damage - UnitGroup[targets_[1]].defense;
                        }
                        if (_damage > UnitGroup[targets_[1]].hp) { //safemath
                            UnitGroup[targets_[1]].hp =0;
                        } else {
                            UnitGroup[targets_[1]].hp -= _damage;
                        }
                    }
                }
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget > 2) { //reverse, target allies
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive

                        targets_[0] = _ithUnit;
                        //0=NoElement
                        UnitGroup[targets_[1]].defense = (UnitGroup[targets_[1]].defense*12) / 10; //+20%
                    }
                }
            } else if (SkillNumber == 73){ //skill number 1 is Youpling, Consider AOE 
            //atk*1.5, if self have eletric, atk*3
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget <= 2) {
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive

                        targets_[0] = _ithUnit;
                        //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                        (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        4,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                        //SKILL damage:
                        if (UnitReaction[_ithUnit] == 4) { //if somehow has electric element on self
                            _damage = ((UnitGroup[_ithUnit].attack+1) * 30) / 10; //300% //********  _skill damage display seperately with element color.
                        } else {
                            _damage = ((UnitGroup[_ithUnit].attack+1) * 15) / 10; //150% //********  _skill damage display seperately with element color.
                        }
                        
                        _damage += _reactionDamage;
                        if (UnitGroup[targets_[1]].defense >= _damage) { //safemath
                            _damage = 1;
                        } else {
                            _damage = _damage - UnitGroup[targets_[1]].defense;
                        }
                        if (_damage > UnitGroup[targets_[1]].hp) { //safemath
                            UnitGroup[targets_[1]].hp =0;
                        } else {
                            UnitGroup[targets_[1]].hp -= _damage;
                        }
                    }
                }
            } else if (SkillNumber == 74){ //skill number 1 is Youpling, Consider AOE 
            //atk*1, all oppo speed -10%
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget <= 2) {
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive

                        targets_[0] = _ithUnit;
                        //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                        (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                        //SKILL damage:
                        _damage = ((UnitGroup[_ithUnit].attack+1) * 10) / 10; //100% //********  _skill damage display seperately with element color.
                        _damage += _reactionDamage;
                        if (UnitGroup[targets_[1]].defense >= _damage) { //safemath
                            _damage = 1;
                        } else {
                            _damage = _damage - UnitGroup[targets_[1]].defense;
                        }
                        if (_damage > UnitGroup[targets_[1]].hp) { //safemath
                            UnitGroup[targets_[1]].hp =0;
                        } else {
                            UnitGroup[targets_[1]].hp -= _damage;
                        }
                        UnitGroup[targets_[1]].speed = ((UnitGroup[targets_[1]].speed+1)*9)/10; //speed -10%
                    }
                }
            } else if (SkillNumber == 75){ //skill number 
            //atk*2.5, if oppo has Ice element, atk*4
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //set damage first to not influence by element reaction
                if (UnitReaction[targets_[1]] == 3) { //oppo has ice
                    _damage = ((UnitGroup[_ithUnit].attack+1) * 40) / 10; //********  _skill damage display seperately with element color.
                } else {
                    _damage = ((UnitGroup[_ithUnit].attack+1) * 25) / 10; //********  _skill damage display seperately with element color.
                }
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        2,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 76){ //skill number , SINGLE TARGET
            //atk*2.5, if self hp <6000, def+50%
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        5,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].attack+1) * 25) / 10; //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                if (UnitGroup[targets_[0]].hp < 6000) {
                    UnitGroup[targets_[0]].defense = ((UnitGroup[targets_[0]].defense+1)*15)/10;//gain 50% defense if hp is low
                }
                
            } else if (SkillNumber == 77){ //skill number 1 is Youpling, Consider AOE 
            //atk*2.5, oppo get light
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget <= 2) {
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive

                        targets_[0] = _ithUnit;
                        //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                        (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        6,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                        //SKILL damage:
                        _damage = ((UnitGroup[_ithUnit].attack+1) * 25) / 10; //250% //********  _skill damage display seperately with element color.
                        _damage += _reactionDamage;
                        if (UnitGroup[targets_[1]].defense >= _damage) { //safemath
                            _damage = 1;
                        } else {
                            _damage = _damage - UnitGroup[targets_[1]].defense;
                        }
                        if (_damage > UnitGroup[targets_[1]].hp) { //safemath
                            UnitGroup[targets_[1]].hp =0;
                        } else {
                            UnitGroup[targets_[1]].hp -= _damage;
                        }
                    }
                }
            } else if (SkillNumber == 78){ //skill number 1 is Youpling, Consider AOE 
            //atk*1.5, if oppo has light, atk*2.4
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget <= 2) {
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive
                        //need to check element first before reaction
                        if (UnitReaction[targets_[1]] == 6) {
                            _damage = ((UnitGroup[_ithUnit].attack+1) * 24) / 10; //240% //********  _skill damage display seperately with element color.
                        } else {
                            _damage = ((UnitGroup[_ithUnit].attack+1) * 15) / 10; //150% //********  _skill damage display seperately with element color.
                        }
                        
                        targets_[0] = _ithUnit;
                        //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                        (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                        //SKILL damage:
                        
                        _damage += _reactionDamage;
                        if (UnitGroup[targets_[1]].defense >= _damage) { //safemath
                            _damage = 1;
                        } else {
                            _damage = _damage - UnitGroup[targets_[1]].defense;
                        }
                        if (_damage > UnitGroup[targets_[1]].hp) { //safemath
                            UnitGroup[targets_[1]].hp =0;
                        } else {
                            UnitGroup[targets_[1]].hp -= _damage;
                        }
                    }
                }
            } else if (SkillNumber == 79){ //skill number , SINGLE TARGET 
            //self hp * 0.4 + oppo hp*0.4 , (cap self atk*6)
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        2,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = (((UnitGroup[_ithUnit].hp+1) * 4) / 10) + (((UnitGroup[_tempTarget].hp+1) * 4) / 10); //******** 
                if (_damage > UnitGroup[_ithUnit].attack*6 ){
                    _damage =  UnitGroup[_ithUnit].attack*6;
                }
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 80){ //skill number , SINGLE TARGET
            //atk*2 , if self HP != either leader HP, atk*4
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        5,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                if (UnitGroup[_ithUnit].hp != UnitGroup[0].hp && UnitGroup[_ithUnit].hp != UnitGroup[3].hp ) {
                    _damage = ((UnitGroup[_ithUnit].attack+1) * 40) / 10; //********  _skill damage display seperately with element color.
                } else {
                    _damage = ((UnitGroup[_ithUnit].attack+1) * 20) / 10; //********  _skill damage display seperately with element color.
                }
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 81){ //skill number , SINGLE TARGET 
            //atk*2 + spd*5
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        1,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = (((UnitGroup[_ithUnit].attack+1) * 20) / 10) + ((UnitGroup[_ithUnit].speed+1) * 5); //********  _skill damage
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 82){ //skill number , SINGLE TARGET 
            //enemy def -20% first, atk*3
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                UnitGroup[_tempTarget].defense = (UnitGroup[_tempTarget].defense+1)*8/10; //target -20% defense first before reaction
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        3,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].attack+1) * 30) / 10; //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 83){ //skill number , SINGLE TARGET < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 84){ //skill number , SINGLE TARGET < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 85){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget <= 2) {
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive

                        targets_[0] = _ithUnit;
                        //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                        (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        4,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                        //SKILL damage:
                        _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //220% //********  _skill damage display seperately with element color.
                        _damage += _reactionDamage;
                        if (UnitGroup[targets_[1]].defense >= _damage) { //safemath
                            _damage = 1;
                        } else {
                            _damage = _damage - UnitGroup[targets_[1]].defense;
                        }
                        if (_damage > UnitGroup[targets_[1]].hp) { //safemath
                            UnitGroup[targets_[1]].hp =0;
                        } else {
                            UnitGroup[targets_[1]].hp -= _damage;
                        }
                    }
                }
            } else if (SkillNumber == 86){ //skill number , SINGLE TARGET < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        5,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 87){ //skill number , SINGLE TARGET < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        4,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 88){ //skill number , SINGLE TARGET < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 89){ //skill number , SINGLE TARGET < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT
                targets_[0] = _ithUnit; targets_[1] = _tempTarget;
                //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        6,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                //SKILL damage:
                _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //********  _skill damage display seperately with element color.
                _damage += _reactionDamage;
                if (UnitGroup[_tempTarget].defense >= _damage) { //safemath
                    _damage = 1;
                } else {
                    _damage = _damage - UnitGroup[_tempTarget].defense;
                }
                if (_damage > UnitGroup[_tempTarget].hp) { //safemath
                    UnitGroup[_tempTarget].hp =0;
                } else {
                    UnitGroup[_tempTarget].hp -= _damage;
                }
                
            } else if (SkillNumber == 90){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget <= 2) {
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive

                        targets_[0] = _ithUnit;
                        //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                        (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        1,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                        //SKILL damage:
                        _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //220% //********  _skill damage display seperately with element color.
                        _damage += _reactionDamage;
                        if (UnitGroup[targets_[1]].defense >= _damage) { //safemath
                            _damage = 1;
                        } else {
                            _damage = _damage - UnitGroup[targets_[1]].defense;
                        }
                        if (_damage > UnitGroup[targets_[1]].hp) { //safemath
                            UnitGroup[targets_[1]].hp =0;
                        } else {
                            UnitGroup[targets_[1]].hp -= _damage;
                        }
                    }
                }
            } else if (SkillNumber == 91){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget <= 2) {
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive

                        targets_[0] = _ithUnit;
                        //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                        (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                        //SKILL damage:
                        _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //220% //********  _skill damage display seperately with element color.
                        _damage += _reactionDamage;
                        if (UnitGroup[targets_[1]].defense >= _damage) { //safemath
                            _damage = 1;
                        } else {
                            _damage = _damage - UnitGroup[targets_[1]].defense;
                        }
                        if (_damage > UnitGroup[targets_[1]].hp) { //safemath
                            UnitGroup[targets_[1]].hp =0;
                        } else {
                            UnitGroup[targets_[1]].hp -= _damage;
                        }
                    }
                }
            } else if (SkillNumber == 92){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget <= 2) {
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive

                        targets_[0] = _ithUnit;
                        //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                        (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        5,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                        //SKILL damage:
                        _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //220% //********  _skill damage display seperately with element color.
                        _damage += _reactionDamage;
                        if (UnitGroup[targets_[1]].defense >= _damage) { //safemath
                            _damage = 1;
                        } else {
                            _damage = _damage - UnitGroup[targets_[1]].defense;
                        }
                        if (_damage > UnitGroup[targets_[1]].hp) { //safemath
                            UnitGroup[targets_[1]].hp =0;
                        } else {
                            UnitGroup[targets_[1]].hp -= _damage;
                        }
                    }
                }
            } else if (SkillNumber == 93){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget <= 2) {
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive

                        targets_[0] = _ithUnit;
                        //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                        (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        1,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                        //SKILL damage:
                        _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //220% //********  _skill damage display seperately with element color.
                        _damage += _reactionDamage;
                        if (UnitGroup[targets_[1]].defense >= _damage) { //safemath
                            _damage = 1;
                        } else {
                            _damage = _damage - UnitGroup[targets_[1]].defense;
                        }
                        if (_damage > UnitGroup[targets_[1]].hp) { //safemath
                            UnitGroup[targets_[1]].hp =0;
                        } else {
                            UnitGroup[targets_[1]].hp -= _damage;
                        }
                    }
                }
            } else if (SkillNumber == 94){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget <= 2) {
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive

                        targets_[0] = _ithUnit;
                        //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                        (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        4,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                        //SKILL damage:
                        _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //220% //********  _skill damage display seperately with element color.
                        _damage += _reactionDamage;
                        if (UnitGroup[targets_[1]].defense >= _damage) { //safemath
                            _damage = 1;
                        } else {
                            _damage = _damage - UnitGroup[targets_[1]].defense;
                        }
                        if (_damage > UnitGroup[targets_[1]].hp) { //safemath
                            UnitGroup[targets_[1]].hp =0;
                        } else {
                            UnitGroup[targets_[1]].hp -= _damage;
                        }
                    }
                }
            } else if (SkillNumber == 95){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget <= 2) {
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive

                        targets_[0] = _ithUnit;
                        //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                        (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        1,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                        //SKILL damage:
                        _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //220% //********  _skill damage display seperately with element color.
                        _damage += _reactionDamage;
                        if (UnitGroup[targets_[1]].defense >= _damage) { //safemath
                            _damage = 1;
                        } else {
                            _damage = _damage - UnitGroup[targets_[1]].defense;
                        }
                        if (_damage > UnitGroup[targets_[1]].hp) { //safemath
                            UnitGroup[targets_[1]].hp =0;
                        } else {
                            UnitGroup[targets_[1]].hp -= _damage;
                        }
                    }
                }
            } else if (SkillNumber == 96){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget <= 2) {
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive

                        targets_[0] = _ithUnit;
                        //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                        (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        5,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                        //SKILL damage:
                        _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //220% //********  _skill damage display seperately with element color.
                        _damage += _reactionDamage;
                        if (UnitGroup[targets_[1]].defense >= _damage) { //safemath
                            _damage = 1;
                        } else {
                            _damage = _damage - UnitGroup[targets_[1]].defense;
                        }
                        if (_damage > UnitGroup[targets_[1]].hp) { //safemath
                            UnitGroup[targets_[1]].hp =0;
                        } else {
                            UnitGroup[targets_[1]].hp -= _damage;
                        }
                    }
                }
            } else if (SkillNumber == 97){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget <= 2) {
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive

                        targets_[0] = _ithUnit;
                        //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                        (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        4,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                        //SKILL damage:
                        _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //220% //********  _skill damage display seperately with element color.
                        _damage += _reactionDamage;
                        if (UnitGroup[targets_[1]].defense >= _damage) { //safemath
                            _damage = 1;
                        } else {
                            _damage = _damage - UnitGroup[targets_[1]].defense;
                        }
                        if (_damage > UnitGroup[targets_[1]].hp) { //safemath
                            UnitGroup[targets_[1]].hp =0;
                        } else {
                            UnitGroup[targets_[1]].hp -= _damage;
                        }
                    }
                }
            } else if (SkillNumber == 98){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget <= 2) {
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive

                        targets_[0] = _ithUnit;
                        //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                        (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        2,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                        //SKILL damage:
                        _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //220% //********  _skill damage display seperately with element color.
                        _damage += _reactionDamage;
                        if (UnitGroup[targets_[1]].defense >= _damage) { //safemath
                            _damage = 1;
                        } else {
                            _damage = _damage - UnitGroup[targets_[1]].defense;
                        }
                        if (_damage > UnitGroup[targets_[1]].hp) { //safemath
                            UnitGroup[targets_[1]].hp =0;
                        } else {
                            UnitGroup[targets_[1]].hp -= _damage;
                        }
                    }
                }
            } else if (SkillNumber == 99){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT
                for (uint i = 0; i < 3; i++) {  
                    if (_tempTarget <= 2) {
                        targets_[1] = i; // Loop targets_[2] as 0, 1, 2
                    } else {
                        targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5
                    }  
                    if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive

                        targets_[0] = _ithUnit;
                        //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark
                        (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume,
        6,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color
                        //SKILL damage:
                        _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //220% //********  _skill damage display seperately with element color.
                        _damage += _reactionDamage;
                        if (UnitGroup[targets_[1]].defense >= _damage) { //safemath
                            _damage = 1;
                        } else {
                            _damage = _damage - UnitGroup[targets_[1]].defense;
                        }
                        if (_damage > UnitGroup[targets_[1]].hp) { //safemath
                            UnitGroup[targets_[1]].hp =0;
                        } else {
                            UnitGroup[targets_[1]].hp -= _damage;
                        }
                    }
                }
            }
            
        }


    function SkillReaction (S.Unit[6] memory _UnitGroup, uint[6] memory _UnitReaction, uint[6] memory _UnitFocus,
    uint[6] memory _TimeConsume, uint _AtkElement, uint[3] memory _targets_)
    private pure returns(S.Unit[6] memory UnitGroup,uint[6] memory UnitReaction,uint[6] memory UnitFocus,
    uint[6] memory TimeConsume, uint damage ) {
        UnitGroup = _UnitGroup;
        UnitReaction = _UnitReaction;
        UnitFocus = _UnitFocus;
        TimeConsume = _TimeConsume;        
        uint _ithUnit = _targets_[0];
        uint _tempTarget = _targets_[1];
        //uint _tempPlayer = _targets_[2];
        if (UnitReaction[_tempTarget] == 0 || UnitReaction[_tempTarget] == _AtkElement) { //means it has no reaction, place one for it.
            UnitReaction[_tempTarget] = _AtkElement;
        } else { //Unit has Element
            UnitReaction[_tempTarget] = (UnitReaction[_tempTarget]*10) + _AtkElement;
            //this is to encode for later use, imagine 12 and 21 also means Fire<->Water reaction
            if (UnitReaction[_tempTarget] == 12 ||UnitReaction[_tempTarget] == 21 ){ //Fire<->Water | Vaporize
                //Damage +0.3x HP_of_TriggerUnit
                damage = (UnitGroup[_ithUnit].hp+1) * 3 / 10;
                UnitReaction[_tempTarget] =0; //Conductive and Ignite need retain.
            } else if (UnitReaction[_tempTarget] == 13 ||UnitReaction[_tempTarget] == 31 ) { //Fire<->Ice | Melt
                //Damage +2x Defense_of_TriggerUnit
                damage = (UnitGroup[_ithUnit].defense+1) * 2;
                UnitReaction[_tempTarget] =0;
            } else if (UnitReaction[_tempTarget] == 14 ||UnitReaction[_tempTarget] == 41 ) { //Fire<->Electric | Flare
                //Damage +1x Attack_of_TriggerUnit
                damage = UnitGroup[_ithUnit].attack;
                UnitReaction[_tempTarget] =0;
            } else if (UnitReaction[_tempTarget] == 15 ||UnitReaction[_tempTarget] == 51 ) { //Fire<->Nature | Ignite
                //Damage +0.5x Attack_of_TriggerUnit, Retain Fire element
                damage = (UnitGroup[_ithUnit].attack+1) * 2 / 10;
                UnitReaction[_tempTarget] =1;
            } else if (UnitReaction[_tempTarget] == 16 ||UnitReaction[_tempTarget] == 61 ) { //Fire<->Light | Holy
                //Target current Attack +30% (stackable, round down)
                UnitGroup[_tempTarget].attack = ((UnitGroup[_tempTarget].attack+1) * 13) / 10;
                UnitReaction[_tempTarget] =0;
            } else if (UnitReaction[_tempTarget] == 17 ||UnitReaction[_tempTarget] == 71 ) { //Fire<->Dark | Exhaust
                //Target current Attack -30% (stackable, round down)
                UnitGroup[_tempTarget].attack = ((UnitGroup[_tempTarget].attack+1) * 7) / 10;
                UnitReaction[_tempTarget] =0;
            } else if (UnitReaction[_tempTarget] == 23 ||UnitReaction[_tempTarget] == 32 ) { //Water<->Ice | Frost
                //stop 1 turn, retain Ice Element
                TimeConsume[_tempTarget] += (100000/UnitGroup[_tempTarget].speed);
                UnitReaction[_tempTarget] =3;
            } else if (UnitReaction[_tempTarget] == 24 ||UnitReaction[_tempTarget] == 42 ) { //Water<->Electric | Conduct
                //Damage +1x Speed_of_TriggerUnit, Retain Electric element
                damage = UnitGroup[_ithUnit].speed;
                UnitReaction[_tempTarget] =4;
            } else if (UnitReaction[_tempTarget] == 25 ||UnitReaction[_tempTarget] == 52 ) { //Water<->Nature | Entangle
                //stop 1 turn, retain Nature Element
                TimeConsume[_tempTarget] += (100000/UnitGroup[_tempTarget].speed);
                UnitReaction[_tempTarget] =5;
            } else if (UnitReaction[_tempTarget] == 26 ||UnitReaction[_tempTarget] == 62 ) { //Water<->Light | Grow
                //Target current HP +25% (stackable, round down)
                UnitGroup[_tempTarget].hp = ((UnitGroup[_tempTarget].hp+1) * 125) / 100;
                UnitReaction[_tempTarget] =0;
            } else if (UnitReaction[_tempTarget] == 27 ||UnitReaction[_tempTarget] == 72 ) { //Water<->Dark | Dehydration
                //Target current HP -25% (stackable, round down) 
                if ( ((UnitGroup[_tempTarget].hp+1) * 25)/100 > 9999){
                    UnitGroup[_tempTarget].hp -= 9999;
                } else {
                    UnitGroup[_tempTarget].hp = ((UnitGroup[_tempTarget].hp+1) * 75) / 100;
                }
                UnitReaction[_tempTarget] =0;
            } else if (UnitReaction[_tempTarget] == 34 ||UnitReaction[_tempTarget] == 43 ) { //Ice<->Electric | Spark
                //Target current Defense -30% (stackable, round down) retain electric
                UnitGroup[_tempTarget].defense = ((UnitGroup[_tempTarget].defense+1) * 7) / 10;
                UnitReaction[_tempTarget] =4;
            } else if (UnitReaction[_tempTarget] == 35 ||UnitReaction[_tempTarget] == 53 ) { //Ice<->Nature | Chill
                //stop 1 turn, SkillStrategy reset to 0.
                TimeConsume[_tempTarget] += (100000/UnitGroup[_tempTarget].speed);
                UnitFocus[_tempTarget] = 0;
                UnitReaction[_tempTarget] = 0;
            } else if (UnitReaction[_tempTarget] == 36 ||UnitReaction[_tempTarget] == 63 ) { //Ice<->Light | Radiant
                //Target current Defense +30% (stackable, round down)
                UnitGroup[_tempTarget].defense = ((UnitGroup[_tempTarget].defense+1) * 13) / 10;
                UnitReaction[_tempTarget] =0;
            } else if (UnitReaction[_tempTarget] == 37 ||UnitReaction[_tempTarget] == 73 ) { //Ice<-> Dark | Dizzy
                //Target current Defense -50% (stackable, round down)
                UnitGroup[_tempTarget].defense = ((UnitGroup[_tempTarget].defense+1) * 5) / 10;
                UnitReaction[_tempTarget] =0;
            } else if (UnitReaction[_tempTarget] == 45 ||UnitReaction[_tempTarget] == 54 ) { //Electric<->Nature | Overgrowth
                //Damage +2x Intelligence_of_TriggerUnit
                damage = UnitGroup[_ithUnit].intelligence*2;
                UnitReaction[_tempTarget] =0;
            } else if (UnitReaction[_tempTarget] == 46 ||UnitReaction[_tempTarget] == 64 ) { //Electric<->Light | Reflect
                //Target current Speed +30% (stackable, round down)
                UnitGroup[_tempTarget].speed = ((UnitGroup[_tempTarget].speed+1) * 13) / 10;
                UnitReaction[_tempTarget] =0;
            } else if (UnitReaction[_tempTarget] == 47 ||UnitReaction[_tempTarget] == 74 ) { //Electric<->Dark | Pressure
                //Target current Speed -30% (stackable, round down)
                UnitGroup[_tempTarget].speed = ((UnitGroup[_tempTarget].speed+1) * 7) / 10;
                UnitReaction[_tempTarget] =0;
            } else if (UnitReaction[_tempTarget] == 56 ||UnitReaction[_tempTarget] == 65 ) { //Nature<->Light | Blossom
                //Target current Intelligence +30% (stackable, round down)
                UnitGroup[_tempTarget].intelligence = ((UnitGroup[_tempTarget].intelligence+1) * 13) / 10;
                UnitReaction[_tempTarget] =0;
            } else if (UnitReaction[_tempTarget] == 57 ||UnitReaction[_tempTarget] == 75 ) { //Nature<->Dark | Drain
                //Target current Intelligence -30% (stackable, round down)
                UnitGroup[_tempTarget].intelligence = ((UnitGroup[_tempTarget].intelligence+1) * 7) / 10;
                UnitReaction[_tempTarget] =0;
            } else if (UnitReaction[_tempTarget] == 67 ||UnitReaction[_tempTarget] == 76 ) { //Light<->Dark | Neutralize
                //Remove All Elements
                UnitReaction[_tempTarget] = 0;
            }
        }

    }


}
// File: FINALdeployFA/MAIN - BattleSystemV4.sol


pragma solidity ^0.8.18;
//_______________________________________________________________
//    ___ __   __     _   ___      _   ___    _ __  
//   | _ )\ \ / /  _ | | / _ \  _ | | / _ \  (_)\ \ 
//   | _ \ \ V /  | || || (_) || || || (_) |  _  | |
//   |___/  |_|    \__/  \___/  \__/  \___/  ( ) | |
//                                           |/ /_/ 
//_______________________________________________________________
//V4 added weather system.







contract FARPG_BattleV4 is Ownable {

    bool public confirmed;
    uint constant NormalAttackEffort = 500;
    uint forceGas;
    
    event BattleResultV2(uint BattleRhythm, uint bit, bool Won, uint randret);//this is facing LView only. Facing Unity need emit S.Unit[6]

    constructor() {
        
    }
 
    //_______________________________________________________________    
//      _    ___   __  __  ___  _  _ 
//     /_\  |   \ |  \/  ||_ _|| \| |
//    / _ \ | |) || |\/| | | | | .` |
//   /_/ \_\|___/ |_|  |_||___||_|\_|
//_______________________________________________________________                                    

   
////////////////////////////////////////////////Advanced Master Contract////////////////////////////////////////////////////////////////////    
    address[50] public masterContracts; //these are the contract able to control the variables.
    mapping(address => uint) public masterIndex;

   
    modifier onlyMasterContract() { //---this modifier is to make sure mastercontract able to control the data   
        require(masterContracts[masterIndex[msg.sender]] == msg.sender, "Only allowed for master contracts");
        _;
    }

    function addMasterContract(address _address, uint _index) public onlyOwner {
        require(_index >0 && _index < 50, "Index out of bounds"); // Ensure index is within array bounds
        require(_address != address(0), "Invalid address"); // Ensure valid address

        // Check if the index already has an address
        address existingAddress = masterContracts[_index];
        if (existingAddress != address(0)) {
            // Reset the index of the existing address to 0
            masterIndex[existingAddress] = 0;
        }

        // Assign the new address to the array and update the mapping
        masterContracts[_index] = _address;
        masterIndex[_address] = _index; // Update the mapping with the new address's index
    }

   function addMasterContractBatch(address[] memory _addresses, uint[] memory _indices) public onlyOwner {
        require(_addresses.length == _indices.length, "Mismatched input lengths"); // Ensure arrays are the same length
        
        for (uint i = 0; i < _addresses.length; i++) {
            addMasterContract(_addresses[i], _indices[i]); // Reuse the existing function
        }
    }

    function removeMasterContract(uint _index) public onlyOwner {
        require(_index < 50, "Index out of bounds"); // Ensure index is within array bounds
        address contractToRemove = masterContracts[_index];
        require(contractToRemove != address(0), "No contract at this index"); // Ensure there is a contract to remove

        // reset the address from the array and mapping
        masterContracts[_index] = address(0);
        masterIndex[contractToRemove] = 0;
    }
    function getAllMasterContracts() public view returns (address[] memory, uint[] memory) {
        address[] memory contracts = new address[](50);
        uint[] memory indices = new uint[](50);

        for (uint i = 0; i < 50; i++) {
            contracts[i] = masterContracts[i];
            if (masterContracts[i] != address(0)) {
                indices[i] = masterIndex[masterContracts[i]];
            } else {
                indices[i] = 0;
            }
        }

        return (contracts, indices);
    }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//_______________________________________________________________    
//    ___  _____  _    ___  _____ 
//   / __||_   _|/_\  | _ \|_   _|
//   \__ \  | | / _ \ |   /  | |  
//   |___/  |_|/_/ \_\|_|_\  |_|  
//_______________________________________________________________     

    function BattleV4_3v3 (S.Unit[6] memory _UnitGroup) public onlyMasterContract returns (uint BattleRhythm, uint bit, bool Won, uint randret){
        
        
        S.Unit[6] memory UnitGroup = _UnitGroup;
        uint rand = (uint(keccak256(abi.encodePacked(block.timestamp, block.prevrandao)))&65535)+5082;
        randret = rand;
        //rand += rand>>5; //rand%10<x
        uint[6] memory TimeConsume; //[0]=Player1, [1]=Player2 | The more the TimeConsume, move first. Attack/Skill will gain more opponent Readiness
        uint UnitLeft; // use 10 to indicate ended.
        uint[6] memory UnitFocus; //if reach 1000, it will use skill and -1000. Gain by INT and start with 500.
        uint[6] memory UnitReaction; 
        uint[6] memory genericUint; //genericUint due to stack too deep. [0]=_damage, [1]=AttackingUnitSlot, [2]=LowestTimeConsume
        //uint playerOffset; (genericUint[3] is playerOffset
        //uint _dice; (genericUint [4] is _dice (to solve stack too deep)
        //uint[5] is SkillNumber
        uint temptarget;  
        forceGas = 1;
  
        //...Condition for Unit left Alive...
        if (UnitGroup[0].hp > 0) {UnitLeft++;} //else {revert("Need to have a leader.");}
        if (UnitGroup[1].hp > 0) {UnitLeft++;}
        if (UnitGroup[2].hp > 0) {UnitLeft++;} 
        require(UnitLeft > 0, "Team1 need to have at least 1 unit");
        UnitLeft = 0;
        if (UnitGroup[3].hp > 0) {UnitLeft++;} //else {revert("Need to have a leader.");}
        if (UnitGroup[4].hp > 0) {UnitLeft++;} 
        if (UnitGroup[5].hp > 0) {UnitLeft++;} 
        require(UnitLeft > 0, "Team2 need to have at least 1 unit"); 
        //UNIT GENE NEED TO ADD FOCUS HERE
        // UnitFocus loop here
        //...Start Battle...
        UnitFocus[0]=UnitGroup[0].genestrength*50;
        UnitFocus[1]=UnitGroup[1].genestrength*50;
        UnitFocus[2]=UnitGroup[2].genestrength*50;
        UnitFocus[3]=UnitGroup[3].genestrength*50;
        UnitFocus[4]=UnitGroup[4].genestrength*50;
        UnitFocus[5]=UnitGroup[5].genestrength*50;
        if (UnitGroup[0].speed ==0) { TimeConsume[0]=100000;} else {TimeConsume[0]=100000/UnitGroup[0].speed;}
        if (UnitGroup[1].speed ==0) { TimeConsume[1]=100000;} else {TimeConsume[1]=100000/UnitGroup[1].speed;}
        if (UnitGroup[2].speed ==0) { TimeConsume[2]=100000;} else {TimeConsume[2]=100000/UnitGroup[2].speed;}
        if (UnitGroup[3].speed ==0) { TimeConsume[3]=100000;} else {TimeConsume[3]=100000/UnitGroup[3].speed;}
        if (UnitGroup[4].speed ==0) { TimeConsume[4]=100000;} else {TimeConsume[4]=100000/UnitGroup[4].speed;}
        if (UnitGroup[5].speed ==0) { TimeConsume[5]=100000;} else {TimeConsume[5]=100000/UnitGroup[5].speed;}
        //                      _            _ _  
        //      __ _____ _ _ __(_)___ _ _   | | | 
        //      \ V / -_) '_(_-< / _ \ ' \  |_  _|
        //       \_/\___|_| /__/_\___/_||_|   |_| 
        //                                   
        while (bit <=209 && UnitLeft != 10 ) { //End at 210 bit, 7 bit x 30 action, Unitleft = 10 is a magic number indicator for stop
            //temp
            //...
            //--------------------VERSION 4 INDEPENDENT READINESS:----------------------
            genericUint[2]=100000; //LowestTimeConsume now
            genericUint[1]=0; //AttackingUnitIndex
            //Find index who consume the least time, consumed lowest time one attack first
            for (uint i = 0; i < 6; i++) {
                if (TimeConsume[i] < genericUint[2] && UnitGroup[i].hp>0) {
                    genericUint[2] = TimeConsume[i];
                    genericUint[1] = i;
                }
            }
            //--------------------------------------------------------------------------
            if (genericUint[1]<3 ) { // Whoever ready first, move (genericUint[1] = 0,1,2 means player 1 unit)
                genericUint[3] = 0; //Player1
            } else {
                genericUint[3] = 3; //Player2
            }
            // Start to loop each unit within the team
       //   for (uint i = 0+genericUint[3]; i < 3+genericUint[3]; i++) {
            if (UnitGroup[genericUint[1]].hp > 0) { //attacking unit is alive
                UnitLeft =1; //means attacking player still has unit alive
                bit+=7; //assume surely take an action
                BattleRhythm = BattleRhythm<<3;
                BattleRhythm += genericUint[1];//attacking unit slot
                //attack
                UnitFocus[genericUint[1]] += UnitGroup[genericUint[1]].intelligence;
                if (UnitFocus[genericUint[1]] >= 1000) {
                    UnitFocus[genericUint[1]] -= 1000;
                    //------------------------------ Use Skill here----------------------------------------------
                    BattleRhythm = BattleRhythm<<1;
                    BattleRhythm++; //1= useskill
                    rand += rand>>5;
                    genericUint[4] = rand%10;
                    if (genericUint[4] < 2) {//20%
                        //===========================attack order 2,1,0|5,4,3=========================
                                                temptarget= (5 + genericUint[3])%6;
                                                if (UnitGroup[temptarget].hp == 0) {temptarget= (4 + genericUint[3])%6;}
                                                if (UnitGroup[temptarget].hp == 0) {temptarget= (3 + genericUint[3])%6;}
                                                if (UnitGroup[temptarget].hp == 0) {UnitLeft =0;bit-=7;BattleRhythm>>=3;} //all dead
                    } else if (genericUint[4] <4) { //20%
                        //===========================attack order 1,2,0|4,5,3===========================
                                                temptarget= (4 + genericUint[3])%6;
                                                if (UnitGroup[temptarget].hp == 0) {temptarget= (5 + genericUint[3])%6;}
                                                if (UnitGroup[temptarget].hp == 0) {temptarget= (3 + genericUint[3])%6;}
                                                if (UnitGroup[temptarget].hp == 0) {UnitLeft =0;bit-=7;BattleRhythm>>=3;} //all dead
                    } else if (genericUint[4] <7) { //30%
                        //===========================attack order 0,1,2|3,4,5===========================
                                                temptarget= (3 + genericUint[3])%6;
                                                if (UnitGroup[temptarget].hp == 0) {temptarget= (4 + genericUint[3])%6;}
                                                if (UnitGroup[temptarget].hp == 0) {temptarget= (5 + genericUint[3])%6;}
                                                if (UnitGroup[temptarget].hp == 0) {UnitLeft =0;bit-=7;BattleRhythm>>=3;} //all dead
                    } else { //30%
                        //===========================attack order 0,2,1|3,5,4===========================
                                                temptarget= (3 + genericUint[3])%6;
                                                if (UnitGroup[temptarget].hp == 0) {temptarget= (5 + genericUint[3])%6;}
                                                if (UnitGroup[temptarget].hp == 0) {temptarget= (4 + genericUint[3])%6;}
                                                if (UnitGroup[temptarget].hp == 0) {UnitLeft =0;bit-=7;BattleRhythm>>=3;} //all dead
                    }
                    //should check target unit dead here? so that dont have to repeat
                    //genericUint[5] is Skill Number
                    //100000 offset to toggle used last turn
                    if (UnitLeft>0) {
                        if (UnitGroup[genericUint[1]].special > 0 && UnitGroup[genericUint[1]].special < 100000) { //has a special skill and never used
                            genericUint[5] = UnitGroup[genericUint[1]].special; //use special skill
                            UnitGroup[genericUint[1]].special += 100000; //offset it so that dont use next turn. If has special, sure has ranged.
                        } else if (UnitGroup[genericUint[1]].range > 0 && UnitGroup[genericUint[1]].range < 100000){ //has a ranged skill, and never used
                            genericUint[5] = UnitGroup[genericUint[1]].range; //use range skill
                            if (UnitGroup[genericUint[1]].special > 100000){ //means has Special Skill and used previously, Not Mature stage
                                UnitGroup[genericUint[1]].special -= 100000; //remove 100000 so that next turn will use Special
                            }
                        } else { //this unit doesn't have special or ranged, then use powerful normal attack.
                            genericUint[5] = 0;
                        }
                        if (genericUint[5] <= 54) { //skill library too large, so divided into 2 library
                            (UnitGroup,UnitFocus,UnitReaction, TimeConsume) = SK1.UnitSkills (UnitGroup, UnitFocus,  UnitReaction, genericUint[1], temptarget, TimeConsume, genericUint[5]);
                        } else {
                            (UnitGroup,UnitFocus,UnitReaction, TimeConsume) = SK2.UnitSkills (UnitGroup, UnitFocus,  UnitReaction, genericUint[1], temptarget, TimeConsume, genericUint[5]);
                        }
                    }
                    //no. now we wont know whether it is aoe. temptargetwill still return if it is AOE
                    BattleRhythm = BattleRhythm<<3;
                    BattleRhythm+=temptarget; 
                } else {
                    //----    ------------------------Normal Attack here------------------------------------------------
                    BattleRhythm = BattleRhythm<<1;
                    //BattleRhythm++; //0= normal attack
                    //(UnitGroup,TimeConsume,rand) = normalAttack(i, UnitGroup,TimeConsume,rand);
                    //..try reduce gas....
                    rand += rand>>5;
                    genericUint[4] = rand%10;
                    if (genericUint[4] < 2) {//20%
                        //===========================attack order 2,1,0|5,4,3=========================
                                                temptarget= (5 + genericUint[3])%6;
                                                if (UnitGroup[temptarget].hp == 0) {temptarget= (4 + genericUint[3])%6;}
                                                if (UnitGroup[temptarget].hp == 0) {temptarget= (3 + genericUint[3])%6;}
                                                if (UnitGroup[temptarget].hp == 0) {UnitLeft =0;bit-=7;BattleRhythm>>=3;} //all dead
                    } else if (genericUint[4] <4) { //20%
                        //===========================attack order 1,2,0|4,5,3===========================
                                                temptarget= (4 + genericUint[3])%6;
                                                if (UnitGroup[temptarget].hp == 0) {temptarget= (5 + genericUint[3])%6;}
                                                if (UnitGroup[temptarget].hp == 0) {temptarget= (3 + genericUint[3])%6;}
                                                if (UnitGroup[temptarget].hp == 0) {UnitLeft =0;bit-=7;BattleRhythm>>=3;} //all dead
                    } else if (genericUint[4] <7) { //30%
                        //===========================attack order 0,1,2|3,4,5===========================
                                                temptarget= (3 + genericUint[3])%6;
                                                if (UnitGroup[temptarget].hp == 0) {temptarget= (4 + genericUint[3])%6;}
                                                if (UnitGroup[temptarget].hp == 0) {temptarget= (5 + genericUint[3])%6;}
                                                if (UnitGroup[temptarget].hp == 0) {UnitLeft =0;bit-=7;BattleRhythm>>=3;} //all dead
                    } else { //30%
                        //===========================attack order 0,2,1|3,5,4===========================
                                                temptarget= (3 + genericUint[3])%6;
                                                if (UnitGroup[temptarget].hp == 0) {temptarget= (5 + genericUint[3])%6;}
                                                if (UnitGroup[temptarget].hp == 0) {temptarget= (4 + genericUint[3])%6;}
                                                if (UnitGroup[temptarget].hp == 0) {UnitLeft =0;bit-=7;BattleRhythm>>=3;} //all dead
                    }
                    // Normal Attack start after choosing target
                    if(UnitLeft >0) { //there is still UnitLeft for battle at this moment, either attacking or defending unit.
                        BattleRhythm = BattleRhythm<<3;
                        BattleRhythm+=temptarget; //
                        if (UnitGroup[temptarget].defense >= UnitGroup[genericUint[1]].attack) { //safemath
                            genericUint[0] = 1;
                        } else {
                            genericUint[0] = UnitGroup[genericUint[1]].attack - UnitGroup[temptarget].defense;
                        }
                        if (genericUint[0] > UnitGroup[temptarget].hp) { //safemath
                            UnitGroup[temptarget].hp =0;
                        } else {
                            UnitGroup[temptarget].hp -= genericUint[0];
                        }
                    } 
                }
            }
                
        //  }
            //finished attack, so added time consume
            if (UnitGroup[genericUint[1]].speed ==0) { 
                TimeConsume[genericUint[1]]=100000;
            } else {
                TimeConsume[genericUint[1]]+=100000/UnitGroup[genericUint[1]].speed;
            }
            // After a player's turn, conclude to proceed.   
            if (UnitLeft == 0) { //of no unit left for attacked player, set to 10 to end
                //end battle. 
                UnitLeft = 10;  // =10 then condition check on While loop will stop.
            } else {
                UnitLeft = 0;//reset for Player2 to move next iteration
                //since player 1[0] has moved due to higher speed, then increase player2[1] TimeConsume[1] to take turns
            } 
        } //end while (after many turns)
        if ((UnitGroup[0].hp + UnitGroup[1].hp + UnitGroup[2].hp) > (UnitGroup[3].hp+UnitGroup[4].hp+UnitGroup[5].hp)) {
            Won = true;
        } //if player 1 more total hp than team 2, then consider win. 
        
    }//function end





}//contract end

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"BattleRhythm","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bit","type":"uint256"},{"indexed":false,"internalType":"bool","name":"Won","type":"bool"},{"indexed":false,"internalType":"uint256","name":"randret","type":"uint256"}],"name":"BattleResultV2","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"},{"inputs":[{"components":[{"internalType":"uint256","name":"hp","type":"uint256"},{"internalType":"uint256","name":"attack","type":"uint256"},{"internalType":"uint256","name":"defense","type":"uint256"},{"internalType":"uint256","name":"speed","type":"uint256"},{"internalType":"uint256","name":"intelligence","type":"uint256"},{"internalType":"uint256","name":"genestrength","type":"uint256"},{"internalType":"uint256","name":"range","type":"uint256"},{"internalType":"uint256","name":"special","type":"uint256"}],"internalType":"struct S.Unit[6]","name":"_UnitGroup","type":"tuple[6]"}],"name":"BattleV4_3v3","outputs":[{"internalType":"uint256","name":"BattleRhythm","type":"uint256"},{"internalType":"uint256","name":"bit","type":"uint256"},{"internalType":"bool","name":"Won","type":"bool"},{"internalType":"uint256","name":"randret","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"addMasterContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256[]","name":"_indices","type":"uint256[]"}],"name":"addMasterContractBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"confirmed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllMasterContracts","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"masterContracts","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"masterIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"removeMasterContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052348015600e575f5ffd5b50601633601a565b6069565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611ed3806100765f395ff3fe608060405234801561000f575f5ffd5b50600436106100a6575f3560e01c80638da5cb5b1161006e5780638da5cb5b1461011f5780639d392e5b14610143578063a968991b1461017c578063b98b62441461019f578063cf7470fa146101b5578063f2fde38b146101c8575f5ffd5b80631e7a07a7146100aa57806354040610146100dc5780635d51b14c146100f1578063715018a6146101045780637a2a43c51461010c575b5f5ffd5b6100c96100b8366004611843565b60346020525f908152604090205481565b6040519081526020015b60405180910390f35b6100ef6100ea366004611863565b6101db565b005b6100ef6100ff36600461187a565b6102dd565b6100ef610402565b6100ef61011a36600461199e565b610415565b5f546001600160a01b03165b6040516001600160a01b0390911681526020016100d3565b610156610151366004611a61565b6104c2565b6040805194855260208501939093529015159183019190915260608201526080016100d3565b5f5461018f90600160a01b900460ff1681565b60405190151581526020016100d3565b6101a7611578565b6040516100d3929190611b24565b61012b6101c3366004611863565b6116ca565b6100ef6101d6366004611843565b6116e9565b6101e3611762565b6032811061022e5760405162461bcd60e51b8152602060048201526013602482015272496e646578206f7574206f6620626f756e647360681b60448201526064015b60405180910390fd5b5f6002826032811061024257610242611bad565b01546001600160a01b031690508061029c5760405162461bcd60e51b815260206004820152601960248201527f4e6f20636f6e7472616374206174207468697320696e646578000000000000006044820152606401610225565b5f600283603281106102b0576102b0611bad565b0180546001600160a01b0319166001600160a01b03928316179055165f9081526034602052604081205550565b6102e5611762565b5f811180156102f45750603281105b6103365760405162461bcd60e51b8152602060048201526013602482015272496e646578206f7574206f6620626f756e647360681b6044820152606401610225565b6001600160a01b03821661037e5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610225565b5f6002826032811061039257610392611bad565b01546001600160a01b0316905080156103be576001600160a01b0381165f908152603460205260408120555b82600283603281106103d2576103d2611bad565b0180546001600160a01b0319166001600160a01b03928316179055929092165f9081526034602052604090205550565b61040a611762565b6104135f6117bb565b565b61041d611762565b805182511461046e5760405162461bcd60e51b815260206004820152601860248201527f4d69736d61746368656420696e707574206c656e6774687300000000000000006044820152606401610225565b5f5b82518110156104bd576104b583828151811061048e5761048e611bad565b60200260200101518383815181106104a8576104a8611bad565b60200260200101516102dd565b600101610470565b505050565b335f818152603460205260408120549091829182918291600290603281106104ec576104ec611bad565b01546001600160a01b03161461054e5760405162461bcd60e51b815260206004820152602160248201527f4f6e6c7920616c6c6f77656420666f72206d617374657220636f6e74726163746044820152607360f81b6064820152608401610225565b60408051426020820152449181019190915285905f9060600160408051601f19818403018152919052805160209091012061058f9061ffff166113da611bd5565b905080925061059c61180a565b5f6105a561180a565b6105ad61180a565b6105b561180a565b600180558651515f90156105d157846105cd81611bee565b9550505b602088015151156105ea57846105e681611bee565b9550505b6040880151511561060357846105ff81611bee565b9550505b5f851161065d5760405162461bcd60e51b815260206004820152602260248201527f5465616d31206e65656420746f2068617665206174206c65617374203120756e6044820152611a5d60f21b6064820152608401610225565b6060880151515f955015610679578461067581611bee565b9550505b60808801515115610692578461068e81611bee565b9550505b60a088015151156106ab57846106a781611bee565b9550505b5f85116107055760405162461bcd60e51b815260206004820152602260248201527f5465616d32206e65656420746f2068617665206174206c65617374203120756e6044820152611a5d60f21b6064820152608401610225565b875160a00151610716906032611c06565b8452602088015160a0015161072c906032611c06565b6020850152604088015160a00151610745906032611c06565b6040850152606088015160a0015161075e906032611c06565b6060850152608088015160a00151610777906032611c06565b608085015260a080890151015161078f906032611c06565b60a08501528751606001515f036107ab57620186a086526107c1565b8751606001516107be90620186a0611c31565b86525b6020880151606001515f036107de57620186a060208701526107fa565b6020880151606001516107f490620186a0611c31565b60208701525b6040880151606001515f0361081757620186a06040870152610833565b60408801516060015161082d90620186a0611c31565b60408701525b60608089015101515f0361084f57620186a0606087015261086a565b606080890151015161086490620186a0611c31565b60608701525b6080880151606001515f0361088757620186a060808701526108a3565b60808801516060015161089d90620186a0611c31565b60808701525b60a0880151606001515f036108c057620186a060a08701526108dc565b60a0880151606001516108d690620186a0611c31565b60a08701525b60d18b111580156108ee575084600a14155b1561151557620186a060408301525f602083018190525b600681101561098357604083015187826006811061092557610925611bad565b602002015110801561094d57505f89826006811061094557610945611bad565b602002015151115b1561097b5786816006811061096457610964611bad565b602002015183600260200201528083600160200201525b600101610905565b5060208201516003111561099c575f60608301526109a4565b600360608301525b5f888360016020020151600681106109be576109be611bad565b602002015151111561145757600194506109d960078c611bd5565b602083015160039d909d1b9c909b506109f2908d611bd5565b9b5087826001602002015160068110610a0d57610a0d611bad565b60200201516080015184836001602002015160068110610a2f57610a2f611bad565b60200201818151610a409190611bd5565b9052506103e884836001602002015160068110610a5f57610a5f611bad565b602002015110611071576103e884836001602002015160068110610a8557610a85611bad565b60200201818151610a969190611c44565b90525060019b909b1b9a8b610aaa81611bee565b9c50610abc9050600588901c88611bd5565b9650610ac9600a88611c57565b6080830181905260021115610bae576060820151600690610aeb906005611bd5565b610af59190611c57565b9050878160068110610b0957610b09611bad565b6020020151515f03610b35576060820151600690610b28906004611bd5565b610b329190611c57565b90505b878160068110610b4757610b47611bad565b6020020151515f03610b73576060820151600690610b66906003611bd5565b610b709190611c57565b90505b878160068110610b8557610b85611bad565b6020020151515f03610ba9575f9450610b9f60078c611c44565b9a5060038c901c9b505b610d77565b608082015160041115610c0b576060820151600690610bce906004611bd5565b610bd89190611c57565b9050878160068110610bec57610bec611bad565b6020020151515f03610b35576060820151600690610b28906005611bd5565b608082015160071115610ca6576060820151600690610c2b906003611bd5565b610c359190611c57565b9050878160068110610c4957610c49611bad565b6020020151515f03610c75576060820151600690610c68906004611bd5565b610c729190611c57565b90505b878160068110610c8757610c87611bad565b6020020151515f03610b73576060820151600690610b66906005611bd5565b6060820151600690610cb9906003611bd5565b610cc39190611c57565b9050878160068110610cd757610cd7611bad565b6020020151515f03610d03576060820151600690610cf6906005611bd5565b610d009190611c57565b90505b878160068110610d1557610d15611bad565b6020020151515f03610d41576060820151600690610d34906004611bd5565b610d3e9190611c57565b90505b878160068110610d5357610d53611bad565b6020020151515f03610d77575f9450610d6d60078c611c44565b9a5060038c901c9b505b8415611059575f88836001602002015160068110610d9757610d97611bad565b602002015160e00151118015610dd05750620186a088836001602002015160068110610dc557610dc5611bad565b602002015160e00151105b15610e37576020820151889060068110610dec57610dec611bad565b602002015160e001518260056020020152620186a088836001602002015160068110610e1a57610e1a611bad565b602002015160e001818151610e2f9190611bd5565b905250610f21565b5f88836001602002015160068110610e5157610e51611bad565b602002015160c00151118015610e8a5750620186a088836001602002015160068110610e7f57610e7f611bad565b602002015160c00151105b15610f1a576020820151889060068110610ea657610ea6611bad565b602002015160c001518260056020020152620186a088836001602002015160068110610ed457610ed4611bad565b602002015160e001511115610f1557620186a088836001602002015160068110610f0057610f00611bad565b602002015160e001818151610e2f9190611c44565b610f21565b5f60a08301525b60a0820151603610610fc557602082015160a083015160405163040eb9d160e01b81527374a4603e890192fdcc979315eb636185e71390d09263040eb9d192610f76928d928a928a9289918f91600401611c92565b61084060405180830381865af4158015610f92573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fb69190611da6565b929a5091975094509250611059565b602082015160a083015160405163040eb9d160e01b8152734069e8aad36845d4e78188a4c36d840f8ab0b4969263040eb9d19261100e928d928a928a9289918f91600401611c92565b61084060405180830381865af415801561102a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061104e9190611da6565b929a50919750945092505b60039b909b1b9a61106a818d611bd5565b9b50611457565b60019b909b1b9a611086600588901c88611bd5565b9650611093600a88611c57565b60808301819052600211156111785760608201516006906110b5906005611bd5565b6110bf9190611c57565b90508781600681106110d3576110d3611bad565b6020020151515f036110ff5760608201516006906110f2906004611bd5565b6110fc9190611c57565b90505b87816006811061111157611111611bad565b6020020151515f0361113d576060820151600690611130906003611bd5565b61113a9190611c57565b90505b87816006811061114f5761114f611bad565b6020020151515f03611173575f945061116960078c611c44565b9a5060038c901c9b505b611341565b6080820151600411156111d5576060820151600690611198906004611bd5565b6111a29190611c57565b90508781600681106111b6576111b6611bad565b6020020151515f036110ff5760608201516006906110f2906005611bd5565b6080820151600711156112705760608201516006906111f5906003611bd5565b6111ff9190611c57565b905087816006811061121357611213611bad565b6020020151515f0361123f576060820151600690611232906004611bd5565b61123c9190611c57565b90505b87816006811061125157611251611bad565b6020020151515f0361113d576060820151600690611130906005611bd5565b6060820151600690611283906003611bd5565b61128d9190611c57565b90508781600681106112a1576112a1611bad565b6020020151515f036112cd5760608201516006906112c0906005611bd5565b6112ca9190611c57565b90505b8781600681106112df576112df611bad565b6020020151515f0361130b5760608201516006906112fe906004611bd5565b6113089190611c57565b90505b87816006811061131d5761131d611bad565b6020020151515f03611341575f945061133760078c611c44565b9a5060038c901c9b505b84156114575760039b909b1b9a611358818d611bd5565b9b508782600160200201516006811061137357611373611bad565b60200201516020015188826006811061138e5761138e611bad565b602002015160400151106113a557600182526113ef565b8781600681106113b7576113b7611bad565b602002015160400151888360016020020151600681106113d9576113d9611bad565b6020020151602001516113ec9190611c44565b82525b87816006811061140157611401611bad565b6020020151518251111561142d575f88826006811061142257611422611bad565b602002015152611457565b815188826006811061144157611441611bad565b60200201518051611453908390611c44565b9052505b602082015188906006811061146e5761146e611bad565b6020020151606001515f036114a457620186a08683600160200201516006811061149a5761149a611bad565b60200201526114fd565b60208201518890600681106114bb576114bb611bad565b6020020151606001516114d190620186a0611c31565b60208301518790600681106114e8576114e8611bad565b602002018181516114f99190611bd5565b9052505b845f0361150d57600a94506108dc565b5f94506108dc565b60a08801515160808901515160608a0151516115319190611bd5565b61153b9190611bd5565b60408901515160208a0151518a51516115549190611bd5565b61155e9190611bd5565b111561156957600199505b50505050505050509193509193565b604080516032808252610660820190925260609182915f916020820161064080368337505060408051603280825261066082019092529293505f92915060208201610640803683370190505090505f5b60328110156116c057600281603281106115e4576115e4611bad565b015483516001600160a01b039091169084908390811061160657611606611bad565b6001600160a01b03909216602092830291909101909101525f6002826032811061163257611632611bad565b01546001600160a01b0316146116985760345f6002836032811061165857611658611bad565b01546001600160a01b0316815260208101919091526040015f2054825183908390811061168757611687611bad565b6020026020010181815250506116b8565b5f8282815181106116ab576116ab611bad565b6020026020010181815250505b6001016115c8565b5090939092509050565b600281603281106116d9575f80fd5b01546001600160a01b0316905081565b6116f1611762565b6001600160a01b0381166117565760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610225565b61175f816117bb565b50565b5f546001600160a01b031633146104135760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610225565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040518060c001604052806006906020820280368337509192915050565b80356001600160a01b038116811461183e575f5ffd5b919050565b5f60208284031215611853575f5ffd5b61185c82611828565b9392505050565b5f60208284031215611873575f5ffd5b5035919050565b5f5f6040838503121561188b575f5ffd5b61189483611828565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b604051610100810167ffffffffffffffff811182821017156118da576118da6118a2565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611909576119096118a2565b604052919050565b5f67ffffffffffffffff82111561192a5761192a6118a2565b5060051b60200190565b5f82601f830112611943575f5ffd5b813561195661195182611911565b6118e0565b8082825260208201915060208360051b860101925085831115611977575f5ffd5b602085015b8381101561199457803583526020928301920161197c565b5095945050505050565b5f5f604083850312156119af575f5ffd5b823567ffffffffffffffff8111156119c5575f5ffd5b8301601f810185136119d5575f5ffd5b80356119e361195182611911565b8082825260208201915060208360051b850101925087831115611a04575f5ffd5b6020840193505b82841015611a2d57611a1c84611828565b825260209384019390910190611a0b565b9450505050602083013567ffffffffffffffff811115611a4b575f5ffd5b611a5785828601611934565b9150509250929050565b5f6106008284031215611a72575f5ffd5b82601f830112611a80575f5ffd5b60c0611a8b816118e0565b80610600850186811115611a9d575f5ffd5b855b81811015611b18576101008189031215611ab7575f5ffd5b611abf6118b6565b813581526020808301358183015260408084013590830152606080840135908301526080808401359083015260a08084013590830152868301358783015260e08084013590830152908552939093019261010001611a9f565b50909695505050505050565b604080825283519082018190525f9060208501906060840190835b81811015611b665783516001600160a01b0316835260209384019390920191600101611b3f565b5050838103602080860191909152855180835291810192508501905f5b81811015611ba1578251845260209384019390920191600101611b83565b50919695505050505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115611be857611be8611bc1565b92915050565b5f60018201611bff57611bff611bc1565b5060010190565b8082028115828204841417611be857611be8611bc1565b634e487b7160e01b5f52601260045260245ffd5b5f82611c3f57611c3f611c1d565b500490565b81810381811115611be857611be8611bc1565b5f82611c6557611c65611c1d565b500690565b805f5b6006811015611c8c578151845260209384019390910190600101611c6d565b50505050565b6108a0810181895f5b6006811015611d09578151805184526020810151602085015260408101516040850152606081015160608501526080810151608085015260a081015160a085015260c081015160c085015260e081015160e08501525061010083019250602082019150600181019050611c9b565b505050611d1a610600830189611c6a565b611d286106c0830188611c6a565b85610780830152846107a0830152611d446107c0830185611c6a565b8261088083015298975050505050505050565b5f82601f830112611d66575f5ffd5b611d7060c06118e0565b8060c0840185811115611d81575f5ffd5b845b81811015611d9b578051845260209384019301611d83565b509095945050505050565b5f5f5f5f6108408587031215611dba575f5ffd5b85601f860112611dc8575f5ffd5b60c0611dd3816118e0565b80610600880189811115611de5575f5ffd5b885b81811015611e6057610100818c031215611dff575f5ffd5b611e076118b6565b815181526020808301518183015260408084015190830152606080840151908301526080808401519083015260a08084015190830152868301518783015260e08084015190830152908552939093019261010001611de7565b50819750611e6e8a82611d57565b965050505050611e82866106c08701611d57565b9150611e92866107808701611d57565b90509295919450925056fea2646970667358221220524433e6869604e128b81d41b8fd95f345817686849ae30a63656da06efcfe1464736f6c634300081c0033

Deployed Bytecode

0x608060405234801561000f575f5ffd5b50600436106100a6575f3560e01c80638da5cb5b1161006e5780638da5cb5b1461011f5780639d392e5b14610143578063a968991b1461017c578063b98b62441461019f578063cf7470fa146101b5578063f2fde38b146101c8575f5ffd5b80631e7a07a7146100aa57806354040610146100dc5780635d51b14c146100f1578063715018a6146101045780637a2a43c51461010c575b5f5ffd5b6100c96100b8366004611843565b60346020525f908152604090205481565b6040519081526020015b60405180910390f35b6100ef6100ea366004611863565b6101db565b005b6100ef6100ff36600461187a565b6102dd565b6100ef610402565b6100ef61011a36600461199e565b610415565b5f546001600160a01b03165b6040516001600160a01b0390911681526020016100d3565b610156610151366004611a61565b6104c2565b6040805194855260208501939093529015159183019190915260608201526080016100d3565b5f5461018f90600160a01b900460ff1681565b60405190151581526020016100d3565b6101a7611578565b6040516100d3929190611b24565b61012b6101c3366004611863565b6116ca565b6100ef6101d6366004611843565b6116e9565b6101e3611762565b6032811061022e5760405162461bcd60e51b8152602060048201526013602482015272496e646578206f7574206f6620626f756e647360681b60448201526064015b60405180910390fd5b5f6002826032811061024257610242611bad565b01546001600160a01b031690508061029c5760405162461bcd60e51b815260206004820152601960248201527f4e6f20636f6e7472616374206174207468697320696e646578000000000000006044820152606401610225565b5f600283603281106102b0576102b0611bad565b0180546001600160a01b0319166001600160a01b03928316179055165f9081526034602052604081205550565b6102e5611762565b5f811180156102f45750603281105b6103365760405162461bcd60e51b8152602060048201526013602482015272496e646578206f7574206f6620626f756e647360681b6044820152606401610225565b6001600160a01b03821661037e5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610225565b5f6002826032811061039257610392611bad565b01546001600160a01b0316905080156103be576001600160a01b0381165f908152603460205260408120555b82600283603281106103d2576103d2611bad565b0180546001600160a01b0319166001600160a01b03928316179055929092165f9081526034602052604090205550565b61040a611762565b6104135f6117bb565b565b61041d611762565b805182511461046e5760405162461bcd60e51b815260206004820152601860248201527f4d69736d61746368656420696e707574206c656e6774687300000000000000006044820152606401610225565b5f5b82518110156104bd576104b583828151811061048e5761048e611bad565b60200260200101518383815181106104a8576104a8611bad565b60200260200101516102dd565b600101610470565b505050565b335f818152603460205260408120549091829182918291600290603281106104ec576104ec611bad565b01546001600160a01b03161461054e5760405162461bcd60e51b815260206004820152602160248201527f4f6e6c7920616c6c6f77656420666f72206d617374657220636f6e74726163746044820152607360f81b6064820152608401610225565b60408051426020820152449181019190915285905f9060600160408051601f19818403018152919052805160209091012061058f9061ffff166113da611bd5565b905080925061059c61180a565b5f6105a561180a565b6105ad61180a565b6105b561180a565b600180558651515f90156105d157846105cd81611bee565b9550505b602088015151156105ea57846105e681611bee565b9550505b6040880151511561060357846105ff81611bee565b9550505b5f851161065d5760405162461bcd60e51b815260206004820152602260248201527f5465616d31206e65656420746f2068617665206174206c65617374203120756e6044820152611a5d60f21b6064820152608401610225565b6060880151515f955015610679578461067581611bee565b9550505b60808801515115610692578461068e81611bee565b9550505b60a088015151156106ab57846106a781611bee565b9550505b5f85116107055760405162461bcd60e51b815260206004820152602260248201527f5465616d32206e65656420746f2068617665206174206c65617374203120756e6044820152611a5d60f21b6064820152608401610225565b875160a00151610716906032611c06565b8452602088015160a0015161072c906032611c06565b6020850152604088015160a00151610745906032611c06565b6040850152606088015160a0015161075e906032611c06565b6060850152608088015160a00151610777906032611c06565b608085015260a080890151015161078f906032611c06565b60a08501528751606001515f036107ab57620186a086526107c1565b8751606001516107be90620186a0611c31565b86525b6020880151606001515f036107de57620186a060208701526107fa565b6020880151606001516107f490620186a0611c31565b60208701525b6040880151606001515f0361081757620186a06040870152610833565b60408801516060015161082d90620186a0611c31565b60408701525b60608089015101515f0361084f57620186a0606087015261086a565b606080890151015161086490620186a0611c31565b60608701525b6080880151606001515f0361088757620186a060808701526108a3565b60808801516060015161089d90620186a0611c31565b60808701525b60a0880151606001515f036108c057620186a060a08701526108dc565b60a0880151606001516108d690620186a0611c31565b60a08701525b60d18b111580156108ee575084600a14155b1561151557620186a060408301525f602083018190525b600681101561098357604083015187826006811061092557610925611bad565b602002015110801561094d57505f89826006811061094557610945611bad565b602002015151115b1561097b5786816006811061096457610964611bad565b602002015183600260200201528083600160200201525b600101610905565b5060208201516003111561099c575f60608301526109a4565b600360608301525b5f888360016020020151600681106109be576109be611bad565b602002015151111561145757600194506109d960078c611bd5565b602083015160039d909d1b9c909b506109f2908d611bd5565b9b5087826001602002015160068110610a0d57610a0d611bad565b60200201516080015184836001602002015160068110610a2f57610a2f611bad565b60200201818151610a409190611bd5565b9052506103e884836001602002015160068110610a5f57610a5f611bad565b602002015110611071576103e884836001602002015160068110610a8557610a85611bad565b60200201818151610a969190611c44565b90525060019b909b1b9a8b610aaa81611bee565b9c50610abc9050600588901c88611bd5565b9650610ac9600a88611c57565b6080830181905260021115610bae576060820151600690610aeb906005611bd5565b610af59190611c57565b9050878160068110610b0957610b09611bad565b6020020151515f03610b35576060820151600690610b28906004611bd5565b610b329190611c57565b90505b878160068110610b4757610b47611bad565b6020020151515f03610b73576060820151600690610b66906003611bd5565b610b709190611c57565b90505b878160068110610b8557610b85611bad565b6020020151515f03610ba9575f9450610b9f60078c611c44565b9a5060038c901c9b505b610d77565b608082015160041115610c0b576060820151600690610bce906004611bd5565b610bd89190611c57565b9050878160068110610bec57610bec611bad565b6020020151515f03610b35576060820151600690610b28906005611bd5565b608082015160071115610ca6576060820151600690610c2b906003611bd5565b610c359190611c57565b9050878160068110610c4957610c49611bad565b6020020151515f03610c75576060820151600690610c68906004611bd5565b610c729190611c57565b90505b878160068110610c8757610c87611bad565b6020020151515f03610b73576060820151600690610b66906005611bd5565b6060820151600690610cb9906003611bd5565b610cc39190611c57565b9050878160068110610cd757610cd7611bad565b6020020151515f03610d03576060820151600690610cf6906005611bd5565b610d009190611c57565b90505b878160068110610d1557610d15611bad565b6020020151515f03610d41576060820151600690610d34906004611bd5565b610d3e9190611c57565b90505b878160068110610d5357610d53611bad565b6020020151515f03610d77575f9450610d6d60078c611c44565b9a5060038c901c9b505b8415611059575f88836001602002015160068110610d9757610d97611bad565b602002015160e00151118015610dd05750620186a088836001602002015160068110610dc557610dc5611bad565b602002015160e00151105b15610e37576020820151889060068110610dec57610dec611bad565b602002015160e001518260056020020152620186a088836001602002015160068110610e1a57610e1a611bad565b602002015160e001818151610e2f9190611bd5565b905250610f21565b5f88836001602002015160068110610e5157610e51611bad565b602002015160c00151118015610e8a5750620186a088836001602002015160068110610e7f57610e7f611bad565b602002015160c00151105b15610f1a576020820151889060068110610ea657610ea6611bad565b602002015160c001518260056020020152620186a088836001602002015160068110610ed457610ed4611bad565b602002015160e001511115610f1557620186a088836001602002015160068110610f0057610f00611bad565b602002015160e001818151610e2f9190611c44565b610f21565b5f60a08301525b60a0820151603610610fc557602082015160a083015160405163040eb9d160e01b81527374a4603e890192fdcc979315eb636185e71390d09263040eb9d192610f76928d928a928a9289918f91600401611c92565b61084060405180830381865af4158015610f92573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fb69190611da6565b929a5091975094509250611059565b602082015160a083015160405163040eb9d160e01b8152734069e8aad36845d4e78188a4c36d840f8ab0b4969263040eb9d19261100e928d928a928a9289918f91600401611c92565b61084060405180830381865af415801561102a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061104e9190611da6565b929a50919750945092505b60039b909b1b9a61106a818d611bd5565b9b50611457565b60019b909b1b9a611086600588901c88611bd5565b9650611093600a88611c57565b60808301819052600211156111785760608201516006906110b5906005611bd5565b6110bf9190611c57565b90508781600681106110d3576110d3611bad565b6020020151515f036110ff5760608201516006906110f2906004611bd5565b6110fc9190611c57565b90505b87816006811061111157611111611bad565b6020020151515f0361113d576060820151600690611130906003611bd5565b61113a9190611c57565b90505b87816006811061114f5761114f611bad565b6020020151515f03611173575f945061116960078c611c44565b9a5060038c901c9b505b611341565b6080820151600411156111d5576060820151600690611198906004611bd5565b6111a29190611c57565b90508781600681106111b6576111b6611bad565b6020020151515f036110ff5760608201516006906110f2906005611bd5565b6080820151600711156112705760608201516006906111f5906003611bd5565b6111ff9190611c57565b905087816006811061121357611213611bad565b6020020151515f0361123f576060820151600690611232906004611bd5565b61123c9190611c57565b90505b87816006811061125157611251611bad565b6020020151515f0361113d576060820151600690611130906005611bd5565b6060820151600690611283906003611bd5565b61128d9190611c57565b90508781600681106112a1576112a1611bad565b6020020151515f036112cd5760608201516006906112c0906005611bd5565b6112ca9190611c57565b90505b8781600681106112df576112df611bad565b6020020151515f0361130b5760608201516006906112fe906004611bd5565b6113089190611c57565b90505b87816006811061131d5761131d611bad565b6020020151515f03611341575f945061133760078c611c44565b9a5060038c901c9b505b84156114575760039b909b1b9a611358818d611bd5565b9b508782600160200201516006811061137357611373611bad565b60200201516020015188826006811061138e5761138e611bad565b602002015160400151106113a557600182526113ef565b8781600681106113b7576113b7611bad565b602002015160400151888360016020020151600681106113d9576113d9611bad565b6020020151602001516113ec9190611c44565b82525b87816006811061140157611401611bad565b6020020151518251111561142d575f88826006811061142257611422611bad565b602002015152611457565b815188826006811061144157611441611bad565b60200201518051611453908390611c44565b9052505b602082015188906006811061146e5761146e611bad565b6020020151606001515f036114a457620186a08683600160200201516006811061149a5761149a611bad565b60200201526114fd565b60208201518890600681106114bb576114bb611bad565b6020020151606001516114d190620186a0611c31565b60208301518790600681106114e8576114e8611bad565b602002018181516114f99190611bd5565b9052505b845f0361150d57600a94506108dc565b5f94506108dc565b60a08801515160808901515160608a0151516115319190611bd5565b61153b9190611bd5565b60408901515160208a0151518a51516115549190611bd5565b61155e9190611bd5565b111561156957600199505b50505050505050509193509193565b604080516032808252610660820190925260609182915f916020820161064080368337505060408051603280825261066082019092529293505f92915060208201610640803683370190505090505f5b60328110156116c057600281603281106115e4576115e4611bad565b015483516001600160a01b039091169084908390811061160657611606611bad565b6001600160a01b03909216602092830291909101909101525f6002826032811061163257611632611bad565b01546001600160a01b0316146116985760345f6002836032811061165857611658611bad565b01546001600160a01b0316815260208101919091526040015f2054825183908390811061168757611687611bad565b6020026020010181815250506116b8565b5f8282815181106116ab576116ab611bad565b6020026020010181815250505b6001016115c8565b5090939092509050565b600281603281106116d9575f80fd5b01546001600160a01b0316905081565b6116f1611762565b6001600160a01b0381166117565760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610225565b61175f816117bb565b50565b5f546001600160a01b031633146104135760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610225565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040518060c001604052806006906020820280368337509192915050565b80356001600160a01b038116811461183e575f5ffd5b919050565b5f60208284031215611853575f5ffd5b61185c82611828565b9392505050565b5f60208284031215611873575f5ffd5b5035919050565b5f5f6040838503121561188b575f5ffd5b61189483611828565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b604051610100810167ffffffffffffffff811182821017156118da576118da6118a2565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611909576119096118a2565b604052919050565b5f67ffffffffffffffff82111561192a5761192a6118a2565b5060051b60200190565b5f82601f830112611943575f5ffd5b813561195661195182611911565b6118e0565b8082825260208201915060208360051b860101925085831115611977575f5ffd5b602085015b8381101561199457803583526020928301920161197c565b5095945050505050565b5f5f604083850312156119af575f5ffd5b823567ffffffffffffffff8111156119c5575f5ffd5b8301601f810185136119d5575f5ffd5b80356119e361195182611911565b8082825260208201915060208360051b850101925087831115611a04575f5ffd5b6020840193505b82841015611a2d57611a1c84611828565b825260209384019390910190611a0b565b9450505050602083013567ffffffffffffffff811115611a4b575f5ffd5b611a5785828601611934565b9150509250929050565b5f6106008284031215611a72575f5ffd5b82601f830112611a80575f5ffd5b60c0611a8b816118e0565b80610600850186811115611a9d575f5ffd5b855b81811015611b18576101008189031215611ab7575f5ffd5b611abf6118b6565b813581526020808301358183015260408084013590830152606080840135908301526080808401359083015260a08084013590830152868301358783015260e08084013590830152908552939093019261010001611a9f565b50909695505050505050565b604080825283519082018190525f9060208501906060840190835b81811015611b665783516001600160a01b0316835260209384019390920191600101611b3f565b5050838103602080860191909152855180835291810192508501905f5b81811015611ba1578251845260209384019390920191600101611b83565b50919695505050505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115611be857611be8611bc1565b92915050565b5f60018201611bff57611bff611bc1565b5060010190565b8082028115828204841417611be857611be8611bc1565b634e487b7160e01b5f52601260045260245ffd5b5f82611c3f57611c3f611c1d565b500490565b81810381811115611be857611be8611bc1565b5f82611c6557611c65611c1d565b500690565b805f5b6006811015611c8c578151845260209384019390910190600101611c6d565b50505050565b6108a0810181895f5b6006811015611d09578151805184526020810151602085015260408101516040850152606081015160608501526080810151608085015260a081015160a085015260c081015160c085015260e081015160e08501525061010083019250602082019150600181019050611c9b565b505050611d1a610600830189611c6a565b611d286106c0830188611c6a565b85610780830152846107a0830152611d446107c0830185611c6a565b8261088083015298975050505050505050565b5f82601f830112611d66575f5ffd5b611d7060c06118e0565b8060c0840185811115611d81575f5ffd5b845b81811015611d9b578051845260209384019301611d83565b509095945050505050565b5f5f5f5f6108408587031215611dba575f5ffd5b85601f860112611dc8575f5ffd5b60c0611dd3816118e0565b80610600880189811115611de5575f5ffd5b885b81811015611e6057610100818c031215611dff575f5ffd5b611e076118b6565b815181526020808301518183015260408084015190830152606080840151908301526080808401519083015260a08084015190830152868301518783015260e08084015190830152908552939093019261010001611de7565b50819750611e6e8a82611d57565b965050505050611e82866106c08701611d57565b9150611e92866107808701611d57565b90509295919450925056fea2646970667358221220524433e6869604e128b81d41b8fd95f345817686849ae30a63656da06efcfe1464736f6c634300081c0033

Deployed Bytecode Sourcemap

160971:18656:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;161882:43;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;529:25:1;;;517:2;502:18;161882:43:0;;;;;;;;163365:491;;;;;;:::i;:::-;;:::i;:::-;;162186:765;;;;;;:::i;:::-;;:::i;4343:103::-;;;:::i;162958:399::-;;;;;;:::i;:::-;;:::i;3695:87::-;3741:7;3768:6;-1:-1:-1;;;;;3768:6:0;3695:87;;;-1:-1:-1;;;;;4004:32:1;;;3986:51;;3974:2;3959:18;3695:87:0;3840:203:1;164807:14793:0;;;;;;:::i;:::-;;:::i;:::-;;;;6049:25:1;;;6105:2;6090:18;;6083:34;;;;6160:14;;6153:22;6133:18;;;6126:50;;;;6207:2;6192:18;;6185:34;6036:3;6021:19;164807:14793:0;5824:401:1;161015:21:0;;;;;-1:-1:-1;;;161015:21:0;;;;;;;;;6395:14:1;;6388:22;6370:41;;6358:2;6343:18;161015:21:0;6230:187:1;163862:529:0;;;:::i;:::-;;;;;;;;:::i;161785:34::-;;;;;;:::i;:::-;;:::i;4601:201::-;;;;;;:::i;:::-;;:::i;163365:491::-;3581:13;:11;:13::i;:::-;163453:2:::1;163444:6;:11;163436:43;;;::::0;-1:-1:-1;;;163436:43:0;;7800:2:1;163436:43:0::1;::::0;::::1;7782:21:1::0;7839:2;7819:18;;;7812:30;-1:-1:-1;;;7858:18:1;;;7851:49;7917:18;;163436:43:0::1;;;;;;;;;163529:24;163556:15;163572:6;163556:23;;;;;;;:::i;:::-;;::::0;-1:-1:-1;;;;;163556:23:0::1;::::0;-1:-1:-1;163556:23:0;163590:68:::1;;;::::0;-1:-1:-1;;;163590:68:0;;8280:2:1;163590:68:0::1;::::0;::::1;8262:21:1::0;8319:2;8299:18;;;8292:30;8358:27;8338:18;;;8331:55;8403:18;;163590:68:0::1;8078:349:1::0;163590:68:0::1;163802:1;163768:15;163784:6;163768:23;;;;;;;:::i;:::-;;:36:::0;;-1:-1:-1;;;;;;163768:36:0::1;-1:-1:-1::0;;;;;163768:36:0;;::::1;;::::0;;163815:29:::1;-1:-1:-1::0;163815:29:0;;;:11:::1;:29;::::0;;;;:33;-1:-1:-1;163365:491:0:o;162186:765::-;3581:13;:11;:13::i;:::-;162288:1:::1;162280:6;:9;:24;;;;;162302:2;162293:6;:11;162280:24;162272:56;;;::::0;-1:-1:-1;;;162272:56:0;;7800:2:1;162272:56:0::1;::::0;::::1;7782:21:1::0;7839:2;7819:18;;;7812:30;-1:-1:-1;;;7858:18:1;;;7851:49;7917:18;;162272:56:0::1;7598:343:1::0;162272:56:0::1;-1:-1:-1::0;;;;;162386:22:0;::::1;162378:50;;;::::0;-1:-1:-1;;;162378:50:0;;8634:2:1;162378:50:0::1;::::0;::::1;8616:21:1::0;8673:2;8653:18;;;8646:30;-1:-1:-1;;;8692:18:1;;;8685:45;8747:18;;162378:50:0::1;8432:339:1::0;162378:50:0::1;162519:23;162545:15;162561:6;162545:23;;;;;;;:::i;:::-;;::::0;-1:-1:-1;;;;;162545:23:0::1;::::0;-1:-1:-1;162583:29:0;;162579:155:::1;;-1:-1:-1::0;;;;;162690:28:0;::::1;162721:1;162690:28:::0;;;:11:::1;:28;::::0;;;;:32;162579:155:::1;162843:8;162817:15;162833:6;162817:23;;;;;;;:::i;:::-;;:34:::0;;-1:-1:-1;;;;;;162817:34:0::1;-1:-1:-1::0;;;;;162817:34:0;;::::1;;::::0;;162862:21;;;::::1;-1:-1:-1::0;162862:21:0;;;:11:::1;:21;::::0;;;;:30;-1:-1:-1;162186:765:0:o;4343:103::-;3581:13;:11;:13::i;:::-;4408:30:::1;4435:1;4408:18;:30::i;:::-;4343:103::o:0;162958:399::-;3581:13;:11;:13::i;:::-;163100:8:::1;:15;163079:10;:17;:36;163071:73;;;::::0;-1:-1:-1;;;163071:73:0;;8978:2:1;163071:73:0::1;::::0;::::1;8960:21:1::0;9017:2;8997:18;;;8990:30;9056:26;9036:18;;;9029:54;9100:18;;163071:73:0::1;8776:348:1::0;163071:73:0::1;163207:6;163202:148;163223:10;:17;163219:1;:21;163202:148;;;163262:45;163280:10;163291:1;163280:13;;;;;;;;:::i;:::-;;;;;;;163295:8;163304:1;163295:11;;;;;;;;:::i;:::-;;;;;;;163262:17;:45::i;:::-;163242:3;;163202:148;;;;162958:399:::0;;:::o;164807:14793::-;162110:10;164894:17;162082:23;;;:11;:23;;;;;;164894:17;;;;;;;;162066:15;;:40;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;162066:40:0;:54;162058:100;;;;-1:-1:-1;;;162058:100:0;;9331:2:1;162058:100:0;;;9313:21:1;9370:2;9350:18;;;9343:30;9409:34;9389:18;;;9382:62;-1:-1:-1;;;9460:18:1;;;9453:31;9501:19;;162058:100:0;9129:397:1;162058:100:0;165055:51:::1;::::0;;165072:15:::1;165055:51;::::0;::::1;9688:19:1::0;165089:16:0::1;9723:12:1::0;;;9716:28;;;;165006:10:0;;164977:26:::1;::::0;9760:12:1;;165055:51:0::1;::::0;;-1:-1:-1;;165055:51:0;;::::1;::::0;;;;;;165045:62;;165055:51:::1;165045:62:::0;;::::1;::::0;165039:81:::1;::::0;165109:5:::1;165040:74;165116:4;165039:81;:::i;:::-;165027:93;;165141:4;165131:14;;165196:26;;:::i;:::-;165347:13;165400:24;;:::i;:::-;165513:27;;:::i;:::-;165552:26;;:::i;:::-;165894:1;165883:12:::0;;165961;;:15;165855::::1;::::0;165961:19;165957:38:::1;;165983:10:::0;::::1;::::0;::::1;:::i;:::-;;;;165957:38;166052:12;::::0;::::1;::::0;:15;:19;166048:38:::1;;166074:10:::0;::::1;::::0;::::1;:::i;:::-;;;;166048:38;166100:12:::0;;::::1;::::0;:15;:19;166096:38:::1;;166122:10:::0;::::1;::::0;::::1;:::i;:::-;;;;166096:38;166164:1;166153:8;:12;166145:59;;;::::0;-1:-1:-1;;;166145:59:0;;10387:2:1;166145:59:0::1;::::0;::::1;10369:21:1::0;10426:2;10406:18;;;10399:30;10465:34;10445:18;;;10438:62;-1:-1:-1;;;10516:18:1;;;10509:32;10558:19;;166145:59:0::1;10185:398:1::0;166145:59:0::1;166242:12:::0;;::::1;::::0;:15;166226:1:::1;::::0;-1:-1:-1;166242:19:0;166238:38:::1;;166264:10:::0;::::1;::::0;::::1;:::i;:::-;;;;166238:38;166333:12:::0;;::::1;::::0;:15;:19;166329:38:::1;;166355:10:::0;::::1;::::0;::::1;:::i;:::-;;;;166329:38;166382:12:::0;;::::1;::::0;:15;:19;166378:38:::1;;166404:10:::0;::::1;::::0;::::1;:::i;:::-;;;;166378:38;166446:1;166435:8;:12;166427:59;;;::::0;-1:-1:-1;;;166427:59:0;;10790:2:1;166427:59:0::1;::::0;::::1;10772:21:1::0;10829:2;10809:18;;;10802:30;10868:34;10848:18;;;10841:62;-1:-1:-1;;;10919:18:1;;;10912:32;10961:19;;166427:59:0::1;10588:398:1::0;166427:59:0::1;166617:12:::0;;:25:::1;;::::0;:28:::1;::::0;166643:2:::1;166617:28;:::i;:::-;166604:41:::0;;:12:::1;166669::::0;::::1;::::0;:25:::1;;::::0;:28:::1;::::0;166695:2:::1;166669:28;:::i;:::-;166656:12;::::0;::::1;:41:::0;166721:12;;::::1;::::0;:25:::1;;::::0;:28:::1;::::0;166747:2:::1;166721:28;:::i;:::-;166708:12:::0;;::::1;:41:::0;166773:12;;::::1;::::0;:25:::1;;::::0;:28:::1;::::0;166799:2:::1;166773:28;:::i;:::-;166760:12:::0;;::::1;:41:::0;166825:12;;::::1;::::0;:25:::1;;::::0;:28:::1;::::0;166851:2:::1;166825:28;:::i;:::-;166812:12:::0;;::::1;:41:::0;166877:12;;;::::1;::::0;:25:::1;::::0;:28:::1;::::0;166903:2:::1;166877:28;:::i;:::-;166864:12:::0;;::::1;:41:::0;166920:12;;:18:::1;;::::0;166930:1:::1;166920:22:::0;166916:102:::1;;166961:6;166946:21:::0;;166916:102:::1;;;166998:12:::0;;:18:::1;;::::0;166991:25:::1;::::0;:6:::1;:25;:::i;:::-;166976:40:::0;;166916:102:::1;167032:12;::::0;::::1;::::0;:18:::1;;::::0;167053:1:::1;167032:22:::0;167028:102:::1;;167073:6;167058:14;::::0;::::1;:21:::0;167028:102:::1;;;167110:12;::::0;::::1;::::0;:18:::1;;::::0;167103:25:::1;::::0;:6:::1;:25;:::i;:::-;167088:14;::::0;::::1;:40:::0;167028:102:::1;167144:12:::0;;::::1;::::0;:18:::1;;::::0;167165:1:::1;167144:22:::0;167140:102:::1;;167185:6;167170:14:::0;;::::1;:21:::0;167140:102:::1;;;167222:12:::0;;::::1;::::0;:18:::1;;::::0;167215:25:::1;::::0;:6:::1;:25;:::i;:::-;167200:14:::0;;::::1;:40:::0;167140:102:::1;167256:12:::0;;;::::1;::::0;:18:::1;::::0;167277:1:::1;167256:22:::0;167252:102:::1;;167297:6;167282:14:::0;;::::1;:21:::0;167252:102:::1;;;167334:12:::0;;;::::1;::::0;:18:::1;::::0;167327:25:::1;::::0;:6:::1;:25;:::i;:::-;167312:14:::0;;::::1;:40:::0;167252:102:::1;167368:12:::0;;::::1;::::0;:18:::1;;::::0;167389:1:::1;167368:22:::0;167364:102:::1;;167409:6;167394:14:::0;;::::1;:21:::0;167364:102:::1;;;167446:12:::0;;::::1;::::0;:18:::1;;::::0;167439:25:::1;::::0;:6:::1;:25;:::i;:::-;167424:14:::0;;::::1;:40:::0;167364:102:::1;167480:12:::0;;::::1;::::0;:18:::1;;::::0;167501:1:::1;167480:22:::0;167476:102:::1;;167521:6;167506:14:::0;;::::1;:21:::0;167476:102:::1;;;167558:12:::0;;::::1;::::0;:18:::1;;::::0;167551:25:::1;::::0;:6:::1;:25;:::i;:::-;167536:14:::0;;::::1;:40:::0;167476:102:::1;167856:3;167850;:9;;:27;;;;;167863:8;167875:2;167863:14;;167850:27;167843:11490;;;168127:6;168112:14:::0;;::::1;:21:::0;168187:1:::1;168112:14;168172::::0;::::1;:16:::0;;;168316:236:::1;168337:1;168333;:5;168316:236;;;168385:14:::0;;::::1;::::0;168368:11;168380:1;168368:14:::1;::::0;::::1;;;;;:::i;:::-;;;;;:31;:52;;;;;168419:1;168403:9;168413:1;168403:12;;;;;;;:::i;:::-;;;;::::0;:15;:17:::1;168368:52;168364:173;;;168462:11;168474:1;168462:14;;;;;;;:::i;:::-;;;;::::0;168445:11;168457:1:::1;168445:14;;;:31:::0;168516:1;168499:11;168511:1:::1;168499:14;;;:18:::0;168364:173:::1;168340:3;;168316:236;;;-1:-1:-1::0;168660:14:0::1;::::0;::::1;::::0;168675:1:::1;-1:-1:-1::0;168656:229:0::1;;;168789:1;168772:14:::0;;::::1;:18:::0;168656:229:::1;;;168858:1;168841:14:::0;;::::1;:18:::0;168656:229:::1;169064:1;169033:9:::0;169043:11;169055:1:::1;169043:14;;;;169033:25;;;;;;;:::i;:::-;;;;::::0;:28;:32:::1;169029:9469;;;169122:1;::::0;-1:-1:-1;169188:6:0::1;169193:1;169188:6:::0;::::1;:::i;:::-;169309:14;::::0;::::1;::::0;169273:1:::1;169259:15:::0;;;::::1;::::0;;;-1:-1:-1;169293:30:0::1;::::0;169259:15;169293:30:::1;:::i;:::-;::::0;-1:-1:-1;169418:9:0;169428:11;169440:1:::1;169428:14;;;;169418:25;;;;;;;:::i;:::-;;;;::::0;:38:::1;;::::0;169389:9;169399:11;169411:1:::1;169399:14;;;;169389:25;;;;;;;:::i;:::-;;;;:67;;;;;;;:::i;:::-;::::0;;-1:-1:-1;169508:4:0::1;169479:9:::0;169489:11;169501:1:::1;169489:14;;;;169479:25;;;;;;;:::i;:::-;;;;;:33;169475:9008;;169566:4;169537:9:::0;169547:11;169559:1:::1;169547:14;;;;169537:25;;;;;;;:::i;:::-;;;;:33;;;;;;;:::i;:::-;::::0;;-1:-1:-1;169737:1:0::1;169723:15:::0;;;::::1;::::0;;169761:14:::1;169723:15:::0;169761:14:::1;:::i;:::-;::::0;-1:-1:-1;169812:15:0::1;::::0;-1:-1:-1;169826:1:0::1;169820:7:::0;;::::1;:4:::0;169812:15:::1;:::i;:::-;::::0;-1:-1:-1;169867:7:0::1;169872:2;169812:15:::0;169867:7:::1;:::i;:::-;169850:14:::0;;::::1;:24:::0;;;169918:1:::1;-1:-1:-1::0;169897:2481:0::1;;;170098:14:::0;;::::1;::::0;170114:1:::1;::::0;170094:18:::1;::::0;:1:::1;:18;:::i;:::-;170093:22;;;;:::i;:::-;170081:34;;170170:9;170180:10;170170:21;;;;;;;:::i;:::-;;;;::::0;:24;::::1;:29:::0;170166:72:::1;;170219:14:::0;;::::1;::::0;170235:1:::1;::::0;170215:18:::1;::::0;:1:::1;:18;:::i;:::-;170214:22;;;;:::i;:::-;170202:34;;170166:72;170292:9;170302:10;170292:21;;;;;;;:::i;:::-;;;;::::0;:24;::::1;:29:::0;170288:72:::1;;170341:14:::0;;::::1;::::0;170357:1:::1;::::0;170337:18:::1;::::0;170353:1:::1;170337:18;:::i;:::-;170336:22;;;;:::i;:::-;170324:34;;170288:72;170414:9;170424:10;170414:21;;;;;;;:::i;:::-;;;;::::0;:24;::::1;:29:::0;170410:73:::1;;170456:1;::::0;-1:-1:-1;170458:6:0::1;170463:1;170458:6:::0;::::1;:::i;:::-;;;170480:1;170465:16;;;;;170410:73;169897:2481;;;170527:14:::0;;::::1;::::0;170543:1:::1;-1:-1:-1::0;170523:1855:0::1;;;170726:14:::0;;::::1;::::0;170742:1:::1;::::0;170722:18:::1;::::0;:1:::1;:18;:::i;:::-;170721:22;;;;:::i;:::-;170709:34;;170798:9;170808:10;170798:21;;;;;;;:::i;:::-;;;;::::0;:24;::::1;:29:::0;170794:72:::1;;170847:14:::0;;::::1;::::0;170863:1:::1;::::0;170843:18:::1;::::0;:1:::1;:18;:::i;170523:1855::-;171155:14:::0;;::::1;::::0;171171:1:::1;-1:-1:-1::0;171151:1227:0::1;;;171354:14:::0;;::::1;::::0;171370:1:::1;::::0;171350:18:::1;::::0;171366:1:::1;171350:18;:::i;:::-;171349:22;;;;:::i;:::-;171337:34;;171426:9;171436:10;171426:21;;;;;;;:::i;:::-;;;;::::0;:24;::::1;:29:::0;171422:72:::1;;171475:14:::0;;::::1;::::0;171491:1:::1;::::0;171471:18:::1;::::0;:1:::1;:18;:::i;:::-;171470:22;;;;:::i;:::-;171458:34;;171422:72;171548:9;171558:10;171548:21;;;;;;;:::i;:::-;;;;::::0;:24;::::1;:29:::0;171544:72:::1;;171597:14:::0;;::::1;::::0;171613:1:::1;::::0;171593:18:::1;::::0;:1:::1;:18;:::i;171151:1227::-;171959:14:::0;;::::1;::::0;171975:1:::1;::::0;171955:18:::1;::::0;171971:1:::1;171955:18;:::i;:::-;171954:22;;;;:::i;:::-;171942:34;;172031:9;172041:10;172031:21;;;;;;;:::i;:::-;;;;::::0;:24;::::1;:29:::0;172027:72:::1;;172080:14:::0;;::::1;::::0;172096:1:::1;::::0;172076:18:::1;::::0;:1:::1;:18;:::i;:::-;172075:22;;;;:::i;:::-;172063:34;;172027:72;172153:9;172163:10;172153:21;;;;;;;:::i;:::-;;;;::::0;:24;::::1;:29:::0;172149:72:::1;;172202:14:::0;;::::1;::::0;172218:1:::1;::::0;172198:18:::1;::::0;:1:::1;:18;:::i;:::-;172197:22;;;;:::i;:::-;172185:34;;172149:72;172275:9;172285:10;172275:21;;;;;;;:::i;:::-;;;;::::0;:24;::::1;:29:::0;172271:73:::1;;172317:1;::::0;-1:-1:-1;172319:6:0::1;172324:1;172319:6:::0;::::1;:::i;:::-;;;172341:1;172326:16;;;;;172271:73;172607:10:::0;;172603:1729:::1;;172686:1;172650:9:::0;172660:11;172672:1:::1;172660:14;;;;172650:25;;;;;;;:::i;:::-;;;;;:33;;;:37;:83;;;;-1:-1:-1::0;172727:6:0::1;172691:9:::0;172701:11;172713:1:::1;172701:14;;;;172691:25;;;;;;;:::i;:::-;;;;;:33;;;:42;172650:83;172646:1116;;;172830:14;::::0;::::1;::::0;172820:9;;:25:::1;::::0;::::1;;;;;:::i;:::-;;;;::::0;:33:::1;;::::0;172803:11;172815:1:::1;172803:14;;;:50:::0;172941:6:::1;172904:9:::0;172914:11;172926:1:::1;172914:14;;;;172904:25;;;;;;;:::i;:::-;;;;;:33;;:43;;;;;;;:::i;:::-;::::0;;-1:-1:-1;172646:1116:0::1;;;173092:1;173058:9:::0;173068:11;173080:1:::1;173068:14;;;;173058:25;;;;;;;:::i;:::-;;;;;:31;;;:35;:79;;;;-1:-1:-1::0;173131:6:0::1;173097:9:::0;173107:11;173119:1:::1;173107:14;;;;173097:25;;;;;;;:::i;:::-;;;;;:31;;;:40;173058:79;173054:708;;;173233:14;::::0;::::1;::::0;173223:9;;:25:::1;::::0;::::1;;;;;:::i;:::-;;;;::::0;:31:::1;;::::0;173206:11;173218:1:::1;173206:14;;;:48:::0;173343:6:::1;173307:9:::0;173317:11;173329:1:::1;173317:14;;;;173307:25;;;;;;;:::i;:::-;;;;;:33;;;:42;173303:272;;;173486:6;173449:9:::0;173459:11;173471:1:::1;173459:14;;;;173449:25;;;;;;;:::i;:::-;;;;;:33;;:43;;;;;;;:::i;173303:272::-;173054:708;;;173733:1;173716:14:::0;;::::1;:18:::0;173054:708:::1;173792:14:::0;;::::1;::::0;173810:2:::1;-1:-1:-1::0;173788:521:0::1;;174001:14;::::0;::::1;::::0;174042;;::::1;::::0;173948:109:::1;::::0;-1:-1:-1;;;173948:109:0;;:3:::1;::::0;:14:::1;::::0;:109:::1;::::0;173964:9;;173975;;173987:12;;174017:10;;174029:11;;173948:109:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;173898:159:::0;;-1:-1:-1;173898:159:0;;-1:-1:-1;173898:159:0;-1:-1:-1;173898:159:0;-1:-1:-1;173788:521:0::1;;;174225:14;::::0;::::1;::::0;174266;;::::1;::::0;174172:109:::1;::::0;-1:-1:-1;;;174172:109:0;;:3:::1;::::0;:14:::1;::::0;:109:::1;::::0;174188:9;;174199;;174211:12;;174241:10;;174253:11;;174172:109:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;174122:159:::0;;-1:-1:-1;174122:159:0;;-1:-1:-1;174122:159:0;-1:-1:-1;174122:159:0;-1:-1:-1;173788:521:0::1;174487:1;174473:15:::0;;;::::1;::::0;174511:24:::1;174525:10:::0;174473:15;174511:24:::1;:::i;:::-;;;169475:9008;;;174736:1;174722:15:::0;;;::::1;::::0;174961::::1;174975:1;174969:7:::0;;::::1;:4:::0;174961:15:::1;:::i;:::-;::::0;-1:-1:-1;175016:7:0::1;175021:2;174961:15:::0;175016:7:::1;:::i;:::-;174999:14:::0;;::::1;:24:::0;;;175067:1:::1;-1:-1:-1::0;175046:2481:0::1;;;175247:14:::0;;::::1;::::0;175263:1:::1;::::0;175243:18:::1;::::0;:1:::1;:18;:::i;:::-;175242:22;;;;:::i;:::-;175230:34;;175319:9;175329:10;175319:21;;;;;;;:::i;:::-;;;;::::0;:24;::::1;:29:::0;175315:72:::1;;175368:14:::0;;::::1;::::0;175384:1:::1;::::0;175364:18:::1;::::0;:1:::1;:18;:::i;:::-;175363:22;;;;:::i;:::-;175351:34;;175315:72;175441:9;175451:10;175441:21;;;;;;;:::i;:::-;;;;::::0;:24;::::1;:29:::0;175437:72:::1;;175490:14:::0;;::::1;::::0;175506:1:::1;::::0;175486:18:::1;::::0;175502:1:::1;175486:18;:::i;:::-;175485:22;;;;:::i;:::-;175473:34;;175437:72;175563:9;175573:10;175563:21;;;;;;;:::i;:::-;;;;::::0;:24;::::1;:29:::0;175559:73:::1;;175605:1;::::0;-1:-1:-1;175607:6:0::1;175612:1;175607:6:::0;::::1;:::i;:::-;;;175629:1;175614:16;;;;;175559:73;175046:2481;;;175676:14:::0;;::::1;::::0;175692:1:::1;-1:-1:-1::0;175672:1855:0::1;;;175875:14:::0;;::::1;::::0;175891:1:::1;::::0;175871:18:::1;::::0;:1:::1;:18;:::i;:::-;175870:22;;;;:::i;:::-;175858:34;;175947:9;175957:10;175947:21;;;;;;;:::i;:::-;;;;::::0;:24;::::1;:29:::0;175943:72:::1;;175996:14:::0;;::::1;::::0;176012:1:::1;::::0;175992:18:::1;::::0;:1:::1;:18;:::i;175672:1855::-;176304:14:::0;;::::1;::::0;176320:1:::1;-1:-1:-1::0;176300:1227:0::1;;;176503:14:::0;;::::1;::::0;176519:1:::1;::::0;176499:18:::1;::::0;176515:1:::1;176499:18;:::i;:::-;176498:22;;;;:::i;:::-;176486:34;;176575:9;176585:10;176575:21;;;;;;;:::i;:::-;;;;::::0;:24;::::1;:29:::0;176571:72:::1;;176624:14:::0;;::::1;::::0;176640:1:::1;::::0;176620:18:::1;::::0;:1:::1;:18;:::i;:::-;176619:22;;;;:::i;:::-;176607:34;;176571:72;176697:9;176707:10;176697:21;;;;;;;:::i;:::-;;;;::::0;:24;::::1;:29:::0;176693:72:::1;;176746:14:::0;;::::1;::::0;176762:1:::1;::::0;176742:18:::1;::::0;:1:::1;:18;:::i;176300:1227::-;177108:14:::0;;::::1;::::0;177124:1:::1;::::0;177104:18:::1;::::0;177120:1:::1;177104:18;:::i;:::-;177103:22;;;;:::i;:::-;177091:34;;177180:9;177190:10;177180:21;;;;;;;:::i;:::-;;;;::::0;:24;::::1;:29:::0;177176:72:::1;;177229:14:::0;;::::1;::::0;177245:1:::1;::::0;177225:18:::1;::::0;:1:::1;:18;:::i;:::-;177224:22;;;;:::i;:::-;177212:34;;177176:72;177302:9;177312:10;177302:21;;;;;;;:::i;:::-;;;;::::0;:24;::::1;:29:::0;177298:72:::1;;177351:14:::0;;::::1;::::0;177367:1:::1;::::0;177347:18:::1;::::0;:1:::1;:18;:::i;:::-;177346:22;;;;:::i;:::-;177334:34;;177298:72;177424:9;177434:10;177424:21;;;;;;;:::i;:::-;;;;::::0;:24;::::1;:29:::0;177420:73:::1;;177466:1;::::0;-1:-1:-1;177468:6:0::1;177473:1;177468:6:::0;::::1;:::i;:::-;;;177490:1;177475:16;;;;;177420:73;177618:11:::0;;177615:848:::1;;177776:1;177762:15:::0;;;::::1;::::0;177804:24:::1;177818:10:::0;177762:15;177804:24:::1;:::i;:::-;::::0;-1:-1:-1;177895:9:0;177905:11;177917:1:::1;177905:14;;;;177895:25;;;;;;;:::i;:::-;;;;;:32;;;177862:9;177872:10;177862:21;;;;;;;:::i;:::-;;;;;:29;;;:65;177858:305;;177988:1;177971:18:::0;;177858:305:::1;;;178106:9;178116:10;178106:21;;;;;;;:::i;:::-;;;;::::0;:29:::1;;::::0;178071:9;178081:11;178093:1:::1;178081:14;;;;178071:25;;;;;;;:::i;:::-;;;;;:32;;;:64;;;;:::i;:::-;178054:81:::0;;177858:305:::1;178210:9;178220:10;178210:21;;;;;;;:::i;:::-;;;;::::0;:24;178193:14;;:41:::1;178189:251;;;178304:1;178278:9;178288:10;178278:21;;;;;;;:::i;:::-;;;;::::0;:27;178189:251:::1;;;178398:14:::0;;178370:9;178380:10;178370:21:::1;::::0;::::1;;;;;:::i;:::-;;;;::::0;:42;;::::1;::::0;;;::::1;:::i;:::-;::::0;;-1:-1:-1;178189:251:0::1;178613:14;::::0;::::1;::::0;178603:9;;:25:::1;::::0;::::1;;;;;:::i;:::-;;;;;:31;;;178637:1;178603:35:::0;178599:219:::1;;178688:6;178660:11:::0;178672;178684:1:::1;178672:14;;;;178660:27;;;;;;;:::i;:::-;;;;:34:::0;178599:219:::1;;;178781:14;::::0;::::1;::::0;178771:9;;:25:::1;::::0;::::1;;;;;:::i;:::-;;;;::::0;:31:::1;;::::0;178764:38:::1;::::0;:6:::1;:38;:::i;:::-;178747:14;::::0;::::1;::::0;178735:11;;:27:::1;::::0;::::1;;;;;:::i;:::-;;;;:67;;;;;;;:::i;:::-;::::0;;-1:-1:-1;178599:219:0::1;178899:8;178911:1;178899:13:::0;178895:426:::1;;179032:2;179021:13;;167843:11490;;178895:426;179140:1;179129:12;;167843:11490;;;179467:12:::0;;::::1;::::0;:15;179451:12;;::::1;::::0;:15;179435:12;;::::1;::::0;:15;:31:::1;::::0;179451:15;179435:31:::1;:::i;:::-;:47;;;;:::i;:::-;179415:12:::0;;::::1;::::0;:15;:12:::1;179397::::0;::::1;::::0;:15;179379:12;;:15;:33:::1;::::0;179397:15;179379:33:::1;:::i;:::-;:51;;;;:::i;:::-;179378:105;179374:148;;;179506:4;179500:10;;179374:148;164946:14654;;;;;;;;164807:14793:::0;;;;;:::o;163862:529::-;163989:17;;;164003:2;163989:17;;;;;;;;;163916:16;;;;163960:26;;163989:17;;;;;;;;-1:-1:-1;;164041:14:0;;;164052:2;164041:14;;;;;;;;;163960:46;;-1:-1:-1;164017:21:0;;164041:14;-1:-1:-1;164041:14:0;;;;;;;;;;-1:-1:-1;;164017:38:0;-1:-1:-1;164073:6:0;164068:276;164089:2;164085:1;:6;164068:276;;;164128:15;164144:1;164128:18;;;;;;;:::i;:::-;;;164113:12;;-1:-1:-1;;;;;164128:18:0;;;;164113:9;;164123:1;;164113:12;;;;;;:::i;:::-;-1:-1:-1;;;;;164113:33:0;;;:12;;;;;;;;;;;:33;164195:1;164165:15;164181:1;164165:18;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;164165:18:0;:32;164161:172;;164231:11;:31;164243:15;164259:1;164243:18;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;164243:18:0;164231:31;;;;;;;;;;;164243:18;164231:31;;164218:10;;:7;;164226:1;;164218:10;;;;;;:::i;:::-;;;;;;:44;;;;;164161:172;;;164316:1;164303:7;164311:1;164303:10;;;;;;;;:::i;:::-;;;;;;:14;;;;;164161:172;164093:3;;164068:276;;;-1:-1:-1;164364:9:0;;164375:7;;-1:-1:-1;163862:529:0;-1:-1:-1;163862:529:0:o;161785:34::-;;;;;;;;;;;;;;-1:-1:-1;;;;;161785:34:0;;-1:-1:-1;161785:34:0;:::o;4601:201::-;3581:13;:11;:13::i;:::-;-1:-1:-1;;;;;4690:22:0;::::1;4682:73;;;::::0;-1:-1:-1;;;4682:73:0;;16490:2:1;4682:73:0::1;::::0;::::1;16472:21:1::0;16529:2;16509:18;;;16502:30;16568:34;16548:18;;;16541:62;-1:-1:-1;;;16619:18:1;;;16612:36;16665:19;;4682:73:0::1;16288:402:1::0;4682:73:0::1;4766:28;4785:8;4766:18;:28::i;:::-;4601:201:::0;:::o;3860:132::-;3741:7;3768:6;-1:-1:-1;;;;;3768:6:0;2320:10;3924:23;3916:68;;;;-1:-1:-1;;;3916:68:0;;16897:2:1;3916:68:0;;;16879:21:1;;;16916:18;;;16909:30;16975:34;16955:18;;;16948:62;17027:18;;3916:68:0;16695:356:1;4962:191:0;5036:16;5055:6;;-1:-1:-1;;;;;5072:17:0;;;-1:-1:-1;;;;;;5072:17:0;;;;;;5105:40;;5055:6;;;;;;;5105:40;;5036:16;5105:40;5025:128;4962:191;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;:::-;333:39;192:186;-1:-1:-1;;;192:186:1:o;565:226::-;624:6;677:2;665:9;656:7;652:23;648:32;645:52;;;693:1;690;683:12;645:52;-1:-1:-1;738:23:1;;565:226;-1:-1:-1;565:226:1:o;796:300::-;864:6;872;925:2;913:9;904:7;900:23;896:32;893:52;;;941:1;938;931:12;893:52;964:29;983:9;964:29;:::i;:::-;954:39;1062:2;1047:18;;;;1034:32;;-1:-1:-1;;;796:300:1:o;1101:127::-;1162:10;1157:3;1153:20;1150:1;1143:31;1193:4;1190:1;1183:15;1217:4;1214:1;1207:15;1233:255;1305:2;1299:9;1347:6;1335:19;;1384:18;1369:34;;1405:22;;;1366:62;1363:88;;;1431:18;;:::i;:::-;1467:2;1460:22;1233:255;:::o;1493:275::-;1564:2;1558:9;1629:2;1610:13;;-1:-1:-1;;1606:27:1;1594:40;;1664:18;1649:34;;1685:22;;;1646:62;1643:88;;;1711:18;;:::i;:::-;1747:2;1740:22;1493:275;;-1:-1:-1;1493:275:1:o;1773:183::-;1833:4;1866:18;1858:6;1855:30;1852:56;;;1888:18;;:::i;:::-;-1:-1:-1;1933:1:1;1929:14;1945:4;1925:25;;1773:183::o;1961:723::-;2015:5;2068:3;2061:4;2053:6;2049:17;2045:27;2035:55;;2086:1;2083;2076:12;2035:55;2126:6;2113:20;2153:64;2169:47;2209:6;2169:47;:::i;:::-;2153:64;:::i;:::-;2241:3;2265:6;2260:3;2253:19;2297:4;2292:3;2288:14;2281:21;;2358:4;2348:6;2345:1;2341:14;2333:6;2329:27;2325:38;2311:52;;2386:3;2378:6;2375:15;2372:35;;;2403:1;2400;2393:12;2372:35;2439:4;2431:6;2427:17;2453:200;2469:6;2464:3;2461:15;2453:200;;;2561:17;;2591:18;;2638:4;2629:14;;;;2486;2453:200;;;-1:-1:-1;2671:7:1;1961:723;-1:-1:-1;;;;;1961:723:1:o;2689:1146::-;2807:6;2815;2868:2;2856:9;2847:7;2843:23;2839:32;2836:52;;;2884:1;2881;2874:12;2836:52;2924:9;2911:23;2957:18;2949:6;2946:30;2943:50;;;2989:1;2986;2979:12;2943:50;3012:22;;3065:4;3057:13;;3053:27;-1:-1:-1;3043:55:1;;3094:1;3091;3084:12;3043:55;3134:2;3121:16;3157:64;3173:47;3213:6;3173:47;:::i;3157:64::-;3243:3;3267:6;3262:3;3255:19;3299:4;3294:3;3290:14;3283:21;;3356:4;3346:6;3343:1;3339:14;3335:2;3331:23;3327:34;3313:48;;3384:7;3376:6;3373:19;3370:39;;;3405:1;3402;3395:12;3370:39;3437:4;3433:2;3429:13;3418:24;;3451:152;3467:6;3462:3;3459:15;3451:152;;;3535:23;3554:3;3535:23;:::i;:::-;3523:36;;3588:4;3484:14;;;;3579;;;;3451:152;;;3622:5;-1:-1:-1;;;;3680:4:1;3665:20;;3652:34;3711:18;3698:32;;3695:52;;;3743:1;3740;3733:12;3695:52;3766:63;3821:7;3810:8;3799:9;3795:24;3766:63;:::i;:::-;3756:73;;;2689:1146;;;;;:::o;4048:1771::-;4150:6;4203:4;4191:9;4182:7;4178:23;4174:34;4171:54;;;4221:1;4218;4211:12;4171:54;4270:7;4263:4;4252:9;4248:20;4244:34;4234:62;;4292:1;4289;4282:12;4234:62;4371:3;4394:20;4371:3;4394:20;:::i;:::-;4436:3;4477:4;4466:9;4462:20;4505:7;4497:6;4494:19;4491:39;;;4526:1;4523;4516:12;4491:39;4550:9;4568:1221;4584:6;4579:3;4576:15;4568:1221;;;4668:6;4662:3;4653:7;4649:17;4645:30;4642:50;;;4688:1;4685;4678:12;4642:50;4718:22;;:::i;:::-;4793:17;;4823:22;;4920:2;4911:12;;;4898:26;4944:14;;;4937:31;5043:2;5034:12;;;5021:26;5067:14;;;5060:31;5166:2;5157:12;;;5144:26;5190:14;;;5183:31;5289:3;5280:13;;;5267:27;5314:15;;;5307:32;5414:3;5405:13;;;5392:27;5439:15;;;5432:32;5530:14;;;5517:28;5565:16;;;5558:33;5666:3;5657:13;;;5644:27;5691:15;;;5684:32;5729:18;;;5767:12;;;;;4610:6;4601:16;4568:1221;;;-1:-1:-1;5808:5:1;;4048:1771;-1:-1:-1;;;;;;4048:1771:1:o;6422:1171::-;6690:2;6702:21;;;6772:13;;6675:18;;;6794:22;;;6642:4;;6885;6873:17;;;6847:2;6832:18;;;6642:4;6918:199;6932:6;6929:1;6926:13;6918:199;;;6997:13;;-1:-1:-1;;;;;6993:39:1;6981:52;;7062:4;7090:17;;;;7053:14;;;;7029:1;6947:9;6918:199;;;-1:-1:-1;;7155:19:1;;;7148:4;7133:20;;;7126:49;;;;7225:13;;7247:21;;;7286:14;;;;-1:-1:-1;7325:17:1;;;7362:1;7372:193;7388:8;7383:3;7380:17;7372:193;;;7457:15;;7443:30;;7506:4;7495:16;;;;7536:19;;;;7416:1;7407:11;7372:193;;;-1:-1:-1;7582:5:1;;6422:1171;-1:-1:-1;;;;;;6422:1171:1:o;7946:127::-;8007:10;8002:3;7998:20;7995:1;7988:31;8038:4;8035:1;8028:15;8062:4;8059:1;8052:15;9783:127;9844:10;9839:3;9835:20;9832:1;9825:31;9875:4;9872:1;9865:15;9899:4;9896:1;9889:15;9915:125;9980:9;;;10001:10;;;9998:36;;;10014:18;;:::i;:::-;9915:125;;;;:::o;10045:135::-;10084:3;10105:17;;;10102:43;;10125:18;;:::i;:::-;-1:-1:-1;10172:1:1;10161:13;;10045:135::o;10991:168::-;11064:9;;;11095;;11112:15;;;11106:22;;11092:37;11082:71;;11133:18;;:::i;11164:127::-;11225:10;11220:3;11216:20;11213:1;11206:31;11256:4;11253:1;11246:15;11280:4;11277:1;11270:15;11296:120;11336:1;11362;11352:35;;11367:18;;:::i;:::-;-1:-1:-1;11401:9:1;;11296:120::o;11421:128::-;11488:9;;;11509:11;;;11506:37;;;11523:18;;:::i;11554:112::-;11586:1;11612;11602:35;;11617:18;;:::i;:::-;-1:-1:-1;11651:9:1;;11554:112::o;11671:303::-;11764:5;11787:1;11797:171;11811:4;11808:1;11805:11;11797:171;;;11870:13;;11858:26;;11913:4;11904:14;;;;11941:17;;;;11831:1;11824:9;11797:171;;;11801:3;;11671:303;;:::o;11979:1584::-;12513:4;12498:20;;12502:9;12595:6;12471:4;12629:604;12643:4;12640:1;12637:11;12629:604;;;12706:6;12700:13;12744:2;12738:9;12733:3;12726:22;12798:4;12794:2;12790:13;12784:20;12777:4;12772:3;12768:14;12761:44;12855:4;12851:2;12847:13;12841:20;12834:4;12829:3;12825:14;12818:44;12912:4;12908:2;12904:13;12898:20;12891:4;12886:3;12882:14;12875:44;12969:4;12965:2;12961:13;12955:20;12948:4;12943:3;12939:14;12932:44;13026:4;13022:2;13018:13;13012:20;13005:4;13000:3;12996:14;12989:44;13083:4;13079:2;13075:13;13069:20;13062:4;13057:3;13053:14;13046:44;13140:4;13136:2;13132:13;13126:20;13119:4;13114:3;13110:14;13103:44;;13176:6;13171:3;13167:16;13160:23;;13218:4;13210:6;13206:17;13196:27;;12663:1;12660;12656:9;12651:14;;12629:604;;;12633:3;;;13242:54;13290:4;13279:9;13275:20;13267:6;13242:54;:::i;:::-;13305;13353:4;13342:9;13338:20;13330:6;13305:54;:::i;:::-;13397:6;13390:4;13379:9;13375:20;13368:36;13442:6;13435:4;13424:9;13420:20;13413:36;13458:54;13506:4;13495:9;13491:20;13483:6;13458:54;:::i;:::-;13550:6;13543:4;13532:9;13528:20;13521:36;11979:1584;;;;;;;;;;:::o;13568:623::-;13629:5;13682:3;13675:4;13667:6;13663:17;13659:27;13649:55;;13700:1;13697;13690:12;13649:55;13802:20;13779:3;13802:20;:::i;:::-;13846:3;13884;13876:6;13872:16;13911:3;13903:6;13900:15;13897:35;;;13928:1;13925;13918:12;13897:35;13952:6;13967:193;13983:6;13978:3;13975:15;13967:193;;;14075:10;;14098:18;;14145:4;14136:14;;;;14000;13967:193;;;-1:-1:-1;14178:7:1;;13568:623;-1:-1:-1;;;;;13568:623:1:o;14196:2087::-;14405:6;14413;14421;14429;14482:4;14470:9;14461:7;14457:23;14453:34;14450:54;;;14500:1;14497;14490:12;14450:54;14549:7;14542:4;14531:9;14527:20;14523:34;14513:62;;14571:1;14568;14561:12;14513:62;14650:3;14673:20;14650:3;14673:20;:::i;:::-;14715:3;14756:4;14745:9;14741:20;14784:7;14776:6;14773:19;14770:39;;;14805:1;14802;14795:12;14770:39;14829:9;14847:1165;14863:6;14858:3;14855:15;14847:1165;;;14947:6;14941:3;14932:7;14928:17;14924:30;14921:50;;;14967:1;14964;14957:12;14921:50;14997:22;;:::i;:::-;15072:10;;15095:22;;15185:2;15176:12;;;15170:19;15209:14;;;15202:31;15301:2;15292:12;;;15286:19;15325:14;;;15318:31;15417:2;15408:12;;;15402:19;15441:14;;;15434:31;15533:3;15524:13;;;15518:20;15558:15;;;15551:32;15651:3;15642:13;;;15636:20;15676:15;;;15669:32;15760:14;;;15754:21;15795:16;;;15788:33;15889:3;15880:13;;;15874:20;15914:15;;;15907:32;15952:18;;;15990:12;;;;;14889:6;14880:16;14847:1165;;;14851:3;16031:5;16021:15;;16055:52;16099:7;16091:6;16055:52;:::i;:::-;16045:62;;;;;;16126:66;16184:7;16177:4;16166:9;16162:20;16126:66;:::i;:::-;16116:76;;16211:66;16269:7;16262:4;16251:9;16247:20;16211:66;:::i;:::-;16201:76;;14196:2087;;;;;;;:::o

Swarm Source

ipfs://524433e6869604e128b81d41b8fd95f345817686849ae30a63656da06efcfe14

Block Transaction Gas Used Reward
view all blocks produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.