using System.Collections; 
 | 
using System.Collections.Generic; 
 | 
using UnityEngine; 
 | 
using System.Text.RegularExpressions; 
 | 
  
 | 
public struct Int2 
 | 
{ 
 | 
    public int x; 
 | 
    public int y; 
 | 
  
 | 
    public Int2(int _x, int _y) 
 | 
    { 
 | 
        this.x = _x; 
 | 
        this.y = _y; 
 | 
    } 
 | 
  
 | 
    public int this[int index] 
 | 
    { 
 | 
        get 
 | 
        { 
 | 
            return index == 0 ? this.x : index == 1 ? this.y : 0; 
 | 
        } 
 | 
        set 
 | 
        { 
 | 
            if (index == 0) 
 | 
            { 
 | 
                this.x = value; 
 | 
            } 
 | 
            else if (index == 1) 
 | 
            { 
 | 
                this.y = value; 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public static Int2 zero = new Int2(0, 0); 
 | 
  
 | 
    public static bool TryParse(string input, out Int2 _value) 
 | 
    { 
 | 
        if (string.IsNullOrEmpty(input)) 
 | 
        { 
 | 
            _value = Int2.zero; 
 | 
            return false; 
 | 
        } 
 | 
        else 
 | 
        { 
 | 
            var matches = Regex.Matches(input.Trim(), "[-]{0,1}\\d+"); 
 | 
            if (matches.Count == 2) 
 | 
            { 
 | 
                _value = new Int2(int.Parse(matches[0].Value), int.Parse(matches[1].Value)); 
 | 
                return true; 
 | 
            } 
 | 
            else 
 | 
            { 
 | 
                _value = Int2.zero; 
 | 
                return false; 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public override bool Equals(object other) 
 | 
    { 
 | 
        if (other == null) 
 | 
        { 
 | 
            return false; 
 | 
        } 
 | 
        if ((other.GetType().Equals(this.GetType())) == false) 
 | 
        { 
 | 
            return false; 
 | 
        } 
 | 
  
 | 
        var temp = (Int2)other; 
 | 
        return this.x.Equals(temp.x) && this.y.Equals(temp.y); 
 | 
    } 
 | 
  
 | 
    public override int GetHashCode() 
 | 
    { 
 | 
        return this.x.GetHashCode() + this.y.GetHashCode(); 
 | 
    } 
 | 
  
 | 
    public override string ToString() 
 | 
    { 
 | 
        return string.Format("({0},{1})", this.x, this.y); 
 | 
    } 
 | 
  
 | 
    public static bool operator ==(Int2 lhs, Int2 rhs) 
 | 
    { 
 | 
        return lhs.x == rhs.x && lhs.y == rhs.y; 
 | 
    } 
 | 
  
 | 
    public static bool operator !=(Int2 lhs, Int2 rhs) 
 | 
    { 
 | 
        return lhs.x != rhs.x || lhs.y != rhs.y; 
 | 
    } 
 | 
  
 | 
    public static Int2 operator +(Int2 lhs, Int2 rhs) 
 | 
    { 
 | 
        return new Int2(lhs.x + rhs.x, lhs.y + rhs.y); 
 | 
    } 
 | 
  
 | 
    public static Int2 operator -(Int2 lhs, Int2 rhs) 
 | 
    { 
 | 
        return new Int2(lhs.x - rhs.x, lhs.y - rhs.y); 
 | 
    } 
 | 
  
 | 
} 
 | 
  
 | 
public struct Int3 
 | 
{ 
 | 
    public int x; 
 | 
    public int y; 
 | 
    public int z; 
 | 
  
 | 
    public Int3(int _x, int _y) 
 | 
    { 
 | 
        this.x = _x; 
 | 
        this.y = _y; 
 | 
        this.z = 0; 
 | 
    } 
 | 
  
 | 
    public Int3(int _x, int _y, int _z) 
 | 
    { 
 | 
        this.x = _x; 
 | 
        this.y = _y; 
 | 
        this.z = _z; 
 | 
    } 
 | 
  
 | 
    public int this[int index] 
 | 
    { 
 | 
        get 
 | 
        { 
 | 
            return index == 0 ? this.x : index == 1 ? this.y : index == 2 ? this.z : 0; 
 | 
        } 
 | 
        set 
 | 
        { 
 | 
            if (index == 0) 
 | 
            { 
 | 
                this.x = value; 
 | 
            } 
 | 
            else if (index == 1) 
 | 
            { 
 | 
                this.y = value; 
 | 
            } 
 | 
            else if (index == 2) 
 | 
            { 
 | 
                this.z = value; 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public static Int3 zero = new Int3(0, 0, 0); 
 | 
  
 | 
    public static bool TryParse(string input, out Int3 _value) 
 | 
    { 
 | 
        if (string.IsNullOrEmpty(input)) 
 | 
        { 
 | 
            _value = Int3.zero; 
 | 
            return false; 
 | 
        } 
 | 
        else 
 | 
        { 
 | 
            var matches = Regex.Matches(input.Trim(), "[-]{0,1}\\d+"); 
 | 
            if (matches.Count == 2) 
 | 
            { 
 | 
                _value = new Int3(int.Parse(matches[0].Value), int.Parse(matches[1].Value), 0); 
 | 
                return true; 
 | 
            } 
 | 
            else if (matches.Count == 3) 
 | 
            { 
 | 
                _value = new Int3(int.Parse(matches[0].Value), int.Parse(matches[1].Value), int.Parse(matches[2].Value)); 
 | 
                return true; 
 | 
            } 
 | 
            else 
 | 
            { 
 | 
                _value = Int3.zero; 
 | 
                return false; 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public override bool Equals(object other) 
 | 
    { 
 | 
        if (other == null) 
 | 
        { 
 | 
            return false; 
 | 
        } 
 | 
        if ((other.GetType().Equals(this.GetType())) == false) 
 | 
        { 
 | 
            return false; 
 | 
        } 
 | 
  
 | 
        var temp = (Int3)other; 
 | 
        return this.x.Equals(temp.x) && this.y.Equals(temp.y) && this.z.Equals(temp.z); 
 | 
    } 
 | 
  
 | 
    public override int GetHashCode() 
 | 
    { 
 | 
        return this.x.GetHashCode() + this.y.GetHashCode() + this.z.GetHashCode(); 
 | 
    } 
 | 
  
 | 
    public override string ToString() 
 | 
    { 
 | 
        return string.Format("({0},{1},{2})", this.x, this.y, this.z); 
 | 
    } 
 | 
  
 | 
    public static bool operator ==(Int3 lhs, Int3 rhs) 
 | 
    { 
 | 
        return lhs.x == rhs.x && lhs.y == rhs.y && lhs.z == rhs.z; 
 | 
    } 
 | 
  
 | 
    public static bool operator !=(Int3 lhs, Int3 rhs) 
 | 
    { 
 | 
        return lhs.x != rhs.x || lhs.y != rhs.y || lhs.z != rhs.z; 
 | 
    } 
 | 
  
 | 
    public static Int3 operator +(Int3 lhs, Int3 rhs) 
 | 
    { 
 | 
        return new Int3(lhs.x + rhs.x, lhs.y + rhs.y, lhs.z + rhs.z); 
 | 
    } 
 | 
  
 | 
    public static Int3 operator -(Int3 lhs, Int3 rhs) 
 | 
    { 
 | 
        return new Int3(lhs.x - rhs.x, lhs.y - rhs.y, lhs.z - rhs.z); 
 | 
    } 
 | 
  
 | 
} 
 |