text:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using Pchp.Core.Dynamic;
using Pchp.Core.Reflection;
using Pchp.Core.Utilities;

namespace Pchp.Core
{
    ///
    /// Represents a PHP value.
    ///
    /// <remarks>
    /// Note, <c>default(PhpValue)</c> represents a <c>NULL</c> value, equivalent to <see cref="PhpValue.Null"/>.
    /// </remarks>
    [StructLayout(LayoutKind.Sequential)]
    public readonly partial struct PhpValue : IPhpConvertible, IEquatable<PhpValue> // <T>
    {
        #region Nested struct: ValueField

        ///
        /// Union for possible value types.
        ///
        [StructLayout(LayoutKind.Explicit)]
        [DebuggerNonUserCode]
        struct ValueField
        {
            [FieldOffset(0)]
            public bool @bool; // NOTE: must be first field, having bool as the last field confuses .NET debugger and converts the entire struct to `0` or `1` // https://github.com/peachpiecompiler/peachpie/issues/249 // if still causes issues, remove this field and use Long only

            [FieldOffset(0)]
            public long @long;

            [FieldOffset(0)]
            public double @double;
        }

        #endregion

        #region ObjectField

        ///
        /// Union for possible reference types.
        ///
        [StructLayout(LayoutKind.Explicit)]
        [DebuggerNonUserCode]
        struct ObjectField
        {
            [FieldOffset(0)]
            public object @object;

            [FieldOffset(0)]
            public string @string;

            [FieldOffset(0)]
            public PhpString.Blob blob;

            [FieldOffset(0)]
            public PhpArray array;

            [FieldOffset(0)]
            public PhpAlias alias;
        }

        #endregion

        #region Fields

        ///
        /// The value type.
        ///
        readonly PhpTypeCode _type;  // CONSIDER: encode future flags into the int value

        ///
        /// A value type container.
        ///
        readonly ValueField _value;

        ///
        /// A reference type container.
        ///
        readonly ObjectField _obj;

        #endregion

        #region Properties

        ///
        /// Gets value indicating whether the value is a <c>NULL</c> or undefined.
        ///
        public bool IsNull => TypeCode switch
        {
            PhpTypeCode.Null => true,
            PhpTypeCode.Alias => Alias.Value.TypeCode == PhpTypeCode.Null,
            _ => false,
        };

        ///
        /// Gets value indicating whether the value is considered to be empty.
        ///
        public bool IsEmpty => ToBoolean() == false;

        ///
        /// The structure was not initialized.
        ///
        [Obsolete]
        public bool IsDefault => TypeCode == 0; // NULL

        /// INTERNAL. Checks if the value has been marked as invalid.
        internal bool IsInvalid => TypeCode == InvalidTypeCode; // CONSIDER: (TypeCode >= PhpTypeCode.Count)

        /// INTERNAL. Type code of an invalid value.
        internal static PhpTypeCode InvalidTypeCode => ~(PhpTypeCode)0;

        ///
        /// Gets value indicating the value is <c>FALSE</c> or <c>&FALSE</c>.
        ///
        public bool IsFalse => IsBooleanImpl(out var b) && !b;

        ///
        /// Gets value indicating whether the value is an alias containing another value.
        ///
        public bool IsAlias => _type == PhpTypeCode.Alias;

        ///
        /// Gets value indicating the value represents an object.
        ///
        public bool IsObject => _type == PhpTypeCode.Object;

        ///
        /// Gets value indicating the value represents PHP array.
        ///
        public bool IsArray => _type == PhpTypeCode.PhpArray;

        ///
        /// Gets value indicating the value represents boolean.
        ///
        public bool IsBoolean => _type == PhpTypeCode.Boolean;

        ///
        /// Gets value indicating this variable after dereferencing is a scalar variable.
        ///
        public bool IsScalar
        {
            get
            {
                switch (TypeCode)
                {
                    case PhpTypeCode.Boolean:
                    case PhpTypeCode.Long:
                    case PhpTypeCode.Double:
                    case PhpTypeCode.String:
                    case PhpTypeCode.MutableString:
                    case PhpTypeCode.Null:
                        return true;

                    case PhpTypeCode.Alias:
                        return Alias.Value.IsScalar;

                    default:
                        return false;
                }
            }
        }

        ///
        /// Gets the long field of the value.
        /// Does not perform a conversion, expects the value is of type long.
        ///
        public long Long { get { Debug.Assert(TypeCode == PhpTypeCode.Long); return _value.@long; } }

        ///
        /// Gets the double field of the value.
        /// Does not perform a conversion, expects the value is of type double.
        ///
        public double Double { get { Debug.Assert(TypeCode == PhpTypeCode.Double); return _value.@double; } }

        ///
        /// Gets the boolean field of the value.
        /// Does not perform a conversion, expects the value is of type boolean.
        ///
        public bool Boolean { get { Debug.Assert(TypeCode == PhpTypeCode.Boolean); return _value.@bool; } }

        ///
        /// Gets the object field of the value as string.
        /// Does not perform a conversion, expects the value is of type (readonly UTF16) string.
        ///
        public string String { get { Debug.Assert(_obj.@object is string || _obj.@object == null); return _obj.@string; } }

        ///
        /// Gets underlaying <see cref="PhpString.Blob"/> object.
        ///
        internal PhpString.Blob MutableStringBlob
        {
            get
            {
                Debug.Assert(_obj.@object is PhpString.Blob);
                return _obj.blob;
            }
        }

        ///
        /// Gets the object field of the value as PHP writable string.
        /// Does not perform a conversion, expects the value is of type (writable UTF16 or single-byte) string.
        ///
        public PhpString MutableString { get { return new PhpString(MutableStringBlob); } }

        ///
        /// Gets underlaying reference object.
        ///
        public object Object { get { return _obj.@object; } }

        ///
        /// Gets underlaying array object.
        ///
        public PhpArray Array { get { Debug.Assert(_obj.@object is PhpArray); return _obj.array; } }

        ///
        /// Gets underlaying alias object.
        ///
        public PhpAlias Alias { get { Debug.Assert(_obj.@object is PhpAlias); return _obj.alias; } }

        #endregion

        #region IPhpConvertible

        ///
        /// Gets the underlaying value type.
        ///
        public readonly PhpTypeCode TypeCode => _type;

        ///
        /// Explicit conversion to <see cref="bool"/>.
        ///
        public bool ToBoolean() => TypeCode switch
        {
            PhpTypeCode.Null => false,
            PhpTypeCode.Boolean => Boolean,
            PhpTypeCode.Long => Long != 0,
            PhpTypeCode.Double => Double != .0,
            PhpTypeCode.PhpArray => Array.Count != 0,
            PhpTypeCode.String => Convert.ToBoolean(String),
            PhpTypeCode.MutableString => MutableStringBlob.ToBoolean(),
            PhpTypeCode.Object => Convert.ToBoolean(Object),
            PhpTypeCode.Alias => Alias.Value.ToBoolean(),
            _ => false,
        };

        ///
        /// Explicit conversion to <see cref="long"/>.
        ///
        public long ToLong() => TypeCode switch
        {
            PhpTypeCode.Null => 0,
            PhpTypeCode.Boolean => Boolean ? 1L : 0L,
            PhpTypeCode.Long => Long,
            PhpTypeCode.Double => (long)Double,
            PhpTypeCode.PhpArray => (long)Array.Count,
            PhpTypeCode.String => Convert.StringToLongInteger(String),
            PhpTypeCode.MutableString => MutableString.ToLong(),
            PhpTypeCode.Object => Convert.ToLong(Object),
            PhpTypeCode.Alias => Alias.Value.ToLong(),
            _ => throw InvalidTypeCodeException(),
        };

        ///
        /// Explicit conversion to <see cref="double"/>.
        ///
        public double ToDouble() => TypeCode switch
        {
            PhpTypeCode.Null => 0.0,
            PhpTypeCode.Boolean => Boolean ? 1.0 : 0.0,
            PhpTypeCode.Long => (double)Long,
            PhpTypeCode.Double => Double,
            PhpTypeCode.PhpArray => (double)Array.Count,
            PhpTypeCode.String => Convert.StringToDouble(String),
            PhpTypeCode.MutableString => MutableString.ToDouble(),
            PhpTypeCode.Object => Convert.ToDouble(Object),
            PhpTypeCode.Alias => Alias.Value.ToDouble(),
            _ => throw InvalidTypeCodeException(),
        };

        public decimal ToDecimal() => (decimal)ToDouble();    // TODO: more precision when converting from string

        public object ToClass()
        {
            switch (TypeCode)
            {
                case PhpTypeCode.Null:
                    return new stdClass();

                case PhpTypeCode.Boolean:
                case PhpTypeCode.Long:
                case PhpTypeCode.Double:
                case PhpTypeCode.String:
                case PhpTypeCode.MutableString:
                    return new stdClass(this);

                case PhpTypeCode.PhpArray:
                    return Array.ToObject();

                case PhpTypeCode.Object:
                    return (Object is IPhpConvertible conv) ? conv.ToClass() : Object;

                case PhpTypeCode.Alias:
                    return Alias.Value.ToClass();

                default:
                    throw InvalidTypeCodeException();
            }
        }

        public Convert.NumberInfo ToNumber(out PhpNumber number)
        {
            switch (TypeCode)
            {
                case PhpTypeCode.Null:
                    number = PhpNumber.Create(0L);
                    return Convert.NumberInfo.LongInteger;

                case PhpTypeCode.Boolean:
                    number = PhpNumber.Create(Boolean ? 1L : 0L);
                    return Convert.NumberInfo.IsNumber | Convert.NumberInfo.LongInteger;

                case PhpTypeCode.Long:
                    number = PhpNumber.Create(Long);
                    return Convert.NumberInfo.IsNumber | Convert.NumberInfo.LongInteger;

                case PhpTypeCode.Double:
                    number = PhpNumber.Create(Double);
                    return Convert.NumberInfo.IsNumber | Convert.NumberInfo.Double;

                case PhpTypeCode.String:
                    return Convert.ToNumber(String, out number);

                case PhpTypeCode.MutableString:
                    return MutableString.ToNumber(out number);

                case PhpTypeCode.PhpArray:
                    return ((IPhpConvertible)Array).ToNumber(out number);

                case PhpTypeCode.Object:
                    return Convert.ToNumber(Object, out number);

                case PhpTypeCode.Alias:
                    return Alias.Value.ToNumber(out number);

                default:
                    throw InvalidTypeCodeException();
            }
        }

        public string ToString(Context ctx) => TypeCode switch
        {
            PhpTypeCode.Null => string.Empty,
            PhpTypeCode.Boolean => Convert.ToString(Boolean),
            PhpTypeCode.Long => Long.ToString(),
            PhpTypeCode.Double => Convert.ToString(Double, ctx),
            PhpTypeCode.PhpArray => (string)Array,
            PhpTypeCode.String => String,
            PhpTypeCode.MutableString => MutableStringBlob.ToString(ctx.StringEncoding),
            PhpTypeCode.Object => Convert.ToString(Object, ctx),
            PhpTypeCode.Alias => Alias.Value.ToString(ctx),
            _ => throw InvalidTypeCodeException(),
        };

        public string ToStringOrThrow(Context ctx) => ToString(ctx);

        internal string ToStringUtf8() => TypeCode switch
        {
            PhpTypeCode.Null => string.Empty,
            PhpTypeCode.Boolean => Convert.ToString(Boolean),
            PhpTypeCode.Long => Long.ToString(),
            PhpTypeCode.Double => Convert.ToString(Double),
            PhpTypeCode.PhpArray => (string)Array,
            PhpTypeCode.String => String,
            PhpTypeCode.MutableString => MutableStringBlob.ToString(Encoding.UTF8),
            PhpTypeCode.Object => Object.ToString(),
            PhpTypeCode.Alias => Alias.Value.ToStringUtf8(),
            _ => throw InvalidTypeCodeException(),
        };

        #endregion

        #region Conversions

        public static implicit operator PhpValue(bool value) => Create(value);
        public static implicit operator PhpValue(int value) => Create(value);
        public static implicit operator PhpValue(uint value) => Create((long)value);
        public static implicit operator PhpValue(long value) => Create(value);
        public static implicit operator PhpValue(ulong value) => Create(value);
        public static implicit operator PhpValue(double value) => Create(value);
        public static implicit operator PhpValue(PhpNumber value) => Create(value);
        public static implicit operator PhpValue(IntStringKey value) => Create(value);
        public static implicit operator PhpValue(string value) => Create(value);
        public static implicit operator PhpValue(byte[] value) => Create(value);
        public static implicit operator PhpValue(PhpArray value) => Create(value);
        public static implicit operator PhpValue(Delegate value) => FromClass(value);

        public static implicit operator bool(PhpValue value) => value.ToBoolean();

        public static explicit operator long(PhpValue value) => value.ToLong();

        public static explicit operator ushort(PhpValue value) => checked((ushort)(long)value);

        public static explicit operator int(PhpValue value) => checked((int)(long)value);

        public static explicit operator uint(PhpValue value) => checked((uint)(long)value);

        public static explicit operator double(PhpValue value) => value.ToDouble();

        public static explicit operator PhpNumber(PhpValue value)
        {
            if ((value.ToNumber(out var result) & Convert.NumberInfo.Unconvertible) != 0)
            {
                // TODO: ErrCode
                throw new InvalidCastException();
            }

            return result;
        }

        public static explicit operator PhpArray(PhpValue value) => value.ToArray();

        public static explicit operator DateTime(PhpValue value) => value.ToDateTime();

        ///
        /// Implicit conversion to string,
        /// preserves <c>null</c>,
        /// throws if conversion is not possible.
        public string AsString(Context ctx) => TypeCode == PhpTypeCode.Null ? null : ToString(ctx);

        ///
        /// Conversion to <see cref="int"/>.
        ///
        public int ToInt() => checked((int)ToLong());

        ///
        /// Gets underlaying class instance or <c>null</c>.
        ///
        public object AsObject() => TypeCode switch
        {
            PhpTypeCode.Object => Object,
            PhpTypeCode.Alias => Alias.Value.AsObject(),
            _ => null,
        };

        ///
        /// Explicit cast to object.
        /// Non-object values are wrapped to <see cref="stdClass"/>.
        ///
        /// <remarks>Alias to <see cref="ToClass"/></remarks>
        public object ToObject() => ToClass();

        ///
        /// Converts value to <see cref="PhpArray"/>.
        ///
        /// Value is converted according to PHP semantic:
        /// - array is returned as it is.
        /// - null is converted to an empty array.
        /// - scalars are converted to a new array containing a single item.
        /// - object is converted to a new array containing the object's properties.
        ///
        /// This method cannot return a <c>null</c> reference.
        ///
        public PhpArray/*!*/ToArray() => TypeCode switch
        {
            PhpTypeCode.Null => PhpArray.NewEmpty(),
            PhpTypeCode.Boolean => PhpArray.New(this),
            PhpTypeCode.Long => PhpArray.New(this),
            PhpTypeCode.Double => PhpArray.New(this),
            PhpTypeCode.PhpArray => Array.AsWritable(),
            PhpTypeCode.String => PhpArray.New(this),
            PhpTypeCode.MutableString => MutableString.ToArray(),
            PhpTypeCode.Object => Convert.ClassToArray(Object),
            PhpTypeCode.Alias => Alias.Value.ToArray(),
            _ => throw InvalidTypeCodeException(),
        };

        ///
        /// Wraps the value into <see cref="PhpAlias"/>,
        /// if value already contains the aliased value, it is returned as it is.
        ///
        public PhpAlias/*!*/AsPhpAlias() => _obj.@object as PhpAlias ?? new PhpAlias(this);

        #endregion

        #region Operators

        public static bool operator ==(PhpValue left, PhpValue right) => left.Compare(right) == 0;

        public static bool operator !=(PhpValue left, PhpValue right) => left.Compare(right) != 0;

        public static bool operator <(PhpValue left, PhpValue right) => left.Compare(right) < 0;

        public static bool operator >(PhpValue left, PhpValue right) => left.Compare(right) > 0;

        public static bool operator ==(string left, PhpValue right) => Comparison.Ceq(left, right);

        public static bool operator !=(string left, PhpValue right) => !(left == right);

        public static bool operator ==(PhpValue left, string right) => right == left;

        public static bool operator !=(PhpValue left, string right) => right != left;

        public static PhpValue operator ~(PhpValue x) => Operators.BitNot(in x);

        public static PhpValue operator &(PhpValue left, PhpValue right) => Operators.BitAnd(in left, in right);

        public static PhpValue operator |(PhpValue left, PhpValue right) => Operators.BitOr(in left, in right);

        public static PhpValue operator ^(PhpValue left, PhpValue right) => Operators.BitXor(in left, in right);

        ///
        /// Division of <paramref name="left"/> and <paramref name="right"/> according to PHP semantics.
        ///
        /// <param name="left">Left operand.</param>
        /// <param name="right">Right operand.</param>
        /// <returns>Quotient of <paramref name="left"/> and <paramref name="right"/>.</returns>
        public static PhpNumber operator /(PhpValue left, PhpValue right) => Operators.Div(in left, in right);

        public static PhpNumber operator *(PhpValue left, PhpValue right) => PhpNumber.Multiply(left, right);

        public static PhpNumber operator /(long lx, PhpValue y)
        {
            PhpNumber ny;
            if ((y.ToNumber(out ny) & Convert.NumberInfo.IsPhpArray) != 0)
            {
                //PhpException.UnsupportedOperandTypes();
                //return PhpNumber.Create(0.0);
                throw new NotImplementedException();     // PhpException
            }

            return lx / ny;
        }

        public static double operator /(double dx, PhpValue y)
        {
            PhpNumber ny;
            if ((y.ToNumber(out ny) & Convert.NumberInfo.IsPhpArray) != 0)
            {
                //PhpException.UnsupportedOperandTypes();
                //return PhpNumber.Create(0.0);
                throw new NotImplementedException();     // PhpException
            }

            return dx / ny;
        }

        ///
        /// Accesses the value as an array and gets item at given index.
        /// Gets <c>void</c> value in case the key is not found.
        /// Raises PHP exception in case the value cannot be accessed as an array.
        ///
        public PhpValue this[IntStringKey key]
        {
            get { return GetArrayItem(Create(key), false); }
        }

        public override bool Equals(object obj) => Equals((obj is PhpValue) ? (PhpValue)obj : FromClr(obj));

        public override int GetHashCode() => _obj.@object != null ? _obj.@object.GetHashCode() : (int)_value.@long;

        public bool TryToIntStringKey(out IntStringKey key)
        {
            switch (TypeCode)
            {
                case PhpTypeCode.Null:
                    key = IntStringKey.EmptyStringKey;
                    return true;

                case PhpTypeCode.Boolean:
                    key = new IntStringKey(Boolean ? 1 : 0);
                    return true;

                case PhpTypeCode.Long:
                    key = new IntStringKey(Long);
                    return true;

                case PhpTypeCode.Double:
                    key = new IntStringKey((long)Double);
                    return true;

                case PhpTypeCode.String:
                    key = Convert.StringToArrayKey(String);
                    return true;

                case PhpTypeCode.MutableString:
                    key = Convert.StringToArrayKey(MutableStringBlob.ToString());
                    return true;

                case PhpTypeCode.PhpArray:
                case PhpTypeCode.Object:
                    key = default;
                    return false;

                case PhpTypeCode.Alias:
                    return Alias.Value.TryToIntStringKey(out key);

                default:
                    throw InvalidTypeCodeException();
            }
        }

        public IntStringKey ToIntStringKey()
        {
            if (TryToIntStringKey(out var iskey))
            {
                return iskey;
            }

            PhpException.IllegalOffsetType();
            return IntStringKey.EmptyStringKey;
        }

        ///
        /// Gets enumerator object used within foreach statement.
        ///
        public IPhpEnumerator GetForeachEnumerator(bool aliasedValues, RuntimeTypeHandle caller) => TypeCode switch
        {
            PhpTypeCode.PhpArray => Array.GetForeachEnumerator(aliasedValues),
            PhpTypeCode.Object => Operators.GetForeachEnumerator(Object, aliasedValues, caller),
            PhpTypeCode.Alias => Alias.Value.GetForeachEnumerator(aliasedValues, caller),
            _ => Operators.GetEmptyForeachEnumerator(),
        };

        ///
        /// Compares two value operands.
        ///
        /// <param name="right">The right operand.</param>
        /// <returns>Comparison result.
        /// Zero for equality,
        /// negative value for <c>this</c> < <paramref name="right"/>,
        /// position value for <c>this</c> > <paramref name="right"/>.</returns>
        public int Compare(PhpValue right) => TypeCode switch
        {
            PhpTypeCode.Null => Comparison.CompareNull(right),
            PhpTypeCode.Boolean => Comparison.Compare(Boolean, right),
            PhpTypeCode.Long => Comparison.Compare(Long, right),
            PhpTypeCode.Double => Comparison.Compare(Double, right),
            PhpTypeCode.PhpArray => Array.Compare(right),
            PhpTypeCode.String => Comparison.Compare(String, right),
            PhpTypeCode.MutableString => Comparison.Compare(MutableStringBlob.ToString(), right),
            PhpTypeCode.Object => Comparison.Compare(Object, right),
            PhpTypeCode.Alias => Alias.Value.Compare(right),
            _ => throw InvalidTypeCodeException(),
        };

        ///
        /// Performs strict comparison.
        ///
        /// <param name="right">The right operand.</param>
        /// <returns>The value determining operands are strictly equal.</returns>
        public bool StrictEquals(PhpValue right) => TypeCode switch
        {
            // TODO: compare TypeCode, then dereference eventually and then switch

            PhpTypeCode.Null => right.IsNull,
            PhpTypeCode.Boolean => right.IsBoolean(out var b) && b == Boolean,
            PhpTypeCode.Long => right.IsLong(out var l) && l == Long,
            PhpTypeCode.Double => right.IsDouble(out var d) && d == Double,
            PhpTypeCode.PhpArray => Array.StrictCompareEq(right.AsArray()),
            PhpTypeCode.String => right.IsString(out var s) && s == String,
            PhpTypeCode.MutableString => right.IsString(out var s) && s.Length == MutableStringBlob.Length && s == MutableStringBlob.ToString(),
            PhpTypeCode.Object => right.AsObject() == Object,
            PhpTypeCode.Alias => Alias.Value.StrictEquals(right),
            _ => throw InvalidTypeCodeException(),
        };

        ///
        /// Gets callable wrapper for the object dynamic invocation.
        ///
        public IPhpCallable AsCallable(RuntimeTypeHandle callerCtx = default, object callerObj = null) => TypeCode switch
        {
            PhpTypeCode.PhpArray => Convert.AsCallable(Array, callerCtx, callerObj),
            PhpTypeCode.String => PhpCallback.Create(String, callerCtx, callerObj),
            PhpTypeCode.MutableString => PhpCallback.Create(MutableStringBlob.ToString(), callerCtx, callerObj),
            PhpTypeCode.Object => Convert.ClassAsCallable(Object, callerCtx, callerObj),
            PhpTypeCode.Alias => Alias.Value.AsCallable(callerCtx, callerObj),
            _ => PhpCallback.CreateInvalid(),
        };

        ///
        /// Ensures the value is a class object.
        /// In case it isn't, creates stdClass according to PHP semantics.
        /// In case current value is empty, replaces current value with newly created stdClass.
        ///
        /// <returns>Non-null object.</returns>
        public static object EnsureObject(ref PhpValue value)
        {
            object result;

            switch (value.TypeCode)
            {
                case PhpTypeCode.Null:
                    // TODO: Err: Warning: Creating default object from empty value
                    value = FromClass(result = new stdClass());
                    break;

                case PhpTypeCode.Boolean:
                    result = new stdClass();   // empty class

                    // me is changed if me.Boolean == FALSE
                    if (value.Boolean == false) value = FromClass(result);
                    break;

                case PhpTypeCode.Long:
                case PhpTypeCode.Double:
                    // this is not changed
                    result = new stdClass(value);
                    break;

                case PhpTypeCode.PhpArray:
                    // me is not modified
                    result = value.Array.ToObject();
                    break;

                case PhpTypeCode.String:
                    result = new stdClass(value);

                    // me is changed if value is empty
                    if (value.String.Length == 0) value = FromClass(result);
                    break;

                case PhpTypeCode.MutableString:
                    result = new stdClass(value);

                    // me is changed if value is empty
                    if (value.MutableStringBlob.IsEmpty) value = FromClass(result);
                    break;

                case PhpTypeCode.Object:
                    result = value.Object;
                    break;

                case PhpTypeCode.Alias:
                    result = EnsureObject(ref value.Alias.Value);
                    break;

                default:
                    throw InvalidTypeCodeException();
            }

            //
            return result;
        }

        ///
        /// Ensures the value is a PHP array.
        /// In case it isn't, creates PhpArray according to PHP semantics.
        /// In case current value is empty, replaces current value with newly created array.
        ///
        /// <returns>PHP array instance. Canot be <c>null</c>.</returns>
        /// <remarks>Used for L-Values accessed as arrays ($lvalue[] = rvalue).</remarks>
        public static IPhpArray EnsureArray(ref PhpValue value)
        {
            PhpArray tmp;

            switch (value.TypeCode)
            {
                case PhpTypeCode.Null:
                    // TODO: Err: Warning: Creating default object from empty value
                    value = Create(tmp = new PhpArray());
                    return tmp;

                case PhpTypeCode.Boolean:
                    tmp = new PhpArray();   // empty class

                    // me is changed if me.Boolean == FALSE
                    if (value.Boolean == false) value = Create(tmp);
                    return tmp;

                case PhpTypeCode.Long:
                case PhpTypeCode.Double:
                    // this is not changed
                    return new PhpArray();

                case PhpTypeCode.PhpArray:
                    return value.Array;

                case PhpTypeCode.String:
                    // upgrade to mutable string
                    var str = new PhpString(value.String);
                    // ensure its internal blob
                    var arr = str.EnsureWritable();

                    // copy back new value
                    value = Create(str);
                    return arr;

                case PhpTypeCode.MutableString:
                    // ensure blob is lazily copied
                    if (value.MutableStringBlob.IsShared)
                    {
                        value = new PhpValue(value.MutableStringBlob.ReleaseOne());
                    }

                    //
                    return value.MutableStringBlob;

                case PhpTypeCode.Object:
                    return Operators.EnsureArray(value.Object);

                case PhpTypeCode.Alias:
                    return EnsureArray(ref value.Alias.Value);

                default:
                    throw InvalidTypeCodeException();
            }
        }

        ///
        /// Ensures the value as an alias.
        /// In case it isn't, the value is aliased.
        ///
        /// <returns>Non-null alias of the value.</returns>
        public static PhpAlias EnsureAlias(ref PhpValue value)
        {
            switch (value.TypeCode)
            {
                case PhpTypeCode.PhpArray:
                    // ensure array is lazily copied
                    value.Array.EnsureWritable();
                    break;

                case PhpTypeCode.MutableString:
                    // ensure blob is lazily copied
                    if (value.MutableStringBlob.IsShared)
                    {
                        value = new PhpValue(value.MutableStringBlob.ReleaseOne());
                    }
                    break;

                case PhpTypeCode.Alias:
                    return value.Alias.AddRef();
            }

            // create alias to the value:
            var alias = new PhpAlias(value, 1);
            value = Create(alias);
            return alias;
        }

        ///
        /// Dereferences in case of an alias.
        ///
        /// <returns>Not aliased value.</returns>
        public readonly PhpValue GetValue() => Object is PhpAlias alias ? alias.Value : this;

        ///
        /// Accesses the value as an array and gets item at given index.
        /// Gets <c>NULL</c> value in case the key is not found.
        ///
        public PhpValue GetArrayItem(PhpValue index, bool quiet = false) => Operators.GetItemValue(this, index, quiet);

        ///
        /// Creates a deep copy of PHP value.
        /// In case of scalars, the shallow copy is returned.
        /// In case of classes, the same reference is returned.
        /// In case of array or string, its copy is returned.
        /// In case of aliased value, the same alias is returned.
        ///
        public readonly PhpValue DeepCopy()
        {
            if (((1 << (int)_type) & ((1 << (int)PhpTypeCode.PhpArray) | (1 << (int)PhpTypeCode.MutableString) | (1 << (int)PhpTypeCode.Alias))) != 0)
            {
                return DeepCopyImpl();
            }
            else
            {
                // value is immutable (scalar, class):
                return this;
            }
        }

        readonly PhpValue DeepCopyImpl()
        {
            switch (_type)
            {
                case PhpTypeCode.PhpArray:
                    return Array.DeepCopy();
                case PhpTypeCode.MutableString:
                    return new PhpValue(MutableStringBlob.AddRef());
                case PhpTypeCode.Alias:
                    return Alias.DeepCopy();
            }

            return this;
        }

        ///
        /// Outputs current value to <see cref="Context"/>.
        /// Handles byte (8bit) strings and allows for chunked text to be streamed without costly concatenation.
        ///
        public void Output(Context ctx)
        {
            switch (TypeCode)
            {
                case PhpTypeCode.Boolean: ctx.Echo(Boolean); break;
                case PhpTypeCode.Long: ctx.Echo(Long); break;
                case PhpTypeCode.Double: ctx.Echo(Double); break;
                case PhpTypeCode.PhpArray: ctx.Echo((string)Array); break;
                case PhpTypeCode.String: ctx.Echo(String); break;
                case PhpTypeCode.MutableString: MutableStringBlob.Output(ctx); break;
                case PhpTypeCode.Object: ctx.Echo(Convert.ToString(Object, ctx)); break;
                case PhpTypeCode.Alias: Alias.Value.Output(ctx); break;
            }
        }

        ///
        /// Gets underlaying value or object as <see cref="System.Object"/>.
        ///
        public object ToClr()
        {
            switch (TypeCode)
            {
                case PhpTypeCode.Null: return null;
                case PhpTypeCode.Boolean: return Boolean;
                case PhpTypeCode.Long: return Long;
                case PhpTypeCode.Double: return Double;
                case PhpTypeCode.PhpArray:
                case PhpTypeCode.String:
                case PhpTypeCode.Object: return Object;
                case PhpTypeCode.MutableString: return MutableStringBlob.ToString();
                case PhpTypeCode.Alias: return Alias.Value.ToClr();
                default:
                    throw InvalidTypeCodeException();
            }
        }

        ///
        /// Implicitly converts this value to <paramref name="type"/>.
        ///
        /// <param name="type">Target type.</param>
        /// <returns>Converted value.</returns>
        /// <exception cref="InvalidCastException">The value cannot be converted to specified <paramref name="type"/>.</exception>
        public object ToClr(Type type)
        {
            if (type == typeof(PhpValue)) return this;

            if (type == typeof(long)) return (long)this;
            if (type == typeof(int)) return (int)(long)this;
            if (type == typeof(uint)) return (uint)(long)this;
            if (type == typeof(double)) return this.ToDouble();
            if (type == typeof(float)) return (float)this.ToDouble();
            if (type == typeof(bool)) return this.ToBoolean();
            if (type == typeof(PhpArray)) return this.ToArray();
            if (type == typeof(string)) return this.ToString();
            if (type == typeof(object)) return this.ToClass();

            if (this.Object != null && type.IsAssignableFrom(this.Object.GetType()))
            {
                return this.Object;
            }

            if (type == typeof(PhpAlias) && IsAlias)
            {
                return Alias;
            }

            //if (type.IsNullable_T(out var nullable_t))
            //{
            //    throw new NotImplementedException();
            //}

            //
            throw new InvalidCastException($"{TypeCode} -> {type.FullName}");
        }

        ///
        /// Calls corresponding <c>Accept</c> method on visitor.
        ///
        public void Accept(PhpVariableVisitor visitor)
        {
            switch (TypeCode)
            {
                case PhpTypeCode.Null: visitor.AcceptNull(); break;
                case PhpTypeCode.Boolean: visitor.Accept(Boolean); break;
                case PhpTypeCode.Long: visitor.Accept(Long); break;
                case PhpTypeCode.Double: visitor.Accept(Double); break;
                case PhpTypeCode.PhpArray: visitor.Accept(Array); break;
                case PhpTypeCode.String: visitor.Accept(String); break;
                case PhpTypeCode.MutableString: visitor.Accept(MutableString); break;
                case PhpTypeCode.Object: visitor.AcceptObject(Object); break;
                case PhpTypeCode.Alias: visitor.Accept(Alias); break;
                default: throw InvalidTypeCodeException();
            }
        }

        ///
        /// Gets value converted to string using default configuration options.
        ///
        public override string ToString()
        {
            Debug.WriteLine("Use ToString(Context) instead!");
            return ToStringUtf8();
        }

        ///
        /// Implements <c>foreach</c> over <see cref="PhpValue"/>.
        /// Gets the enumerator object allowing to iterate through PHP values, arrays and iterators.
        ///
        public IEnumerator<KeyValuePair<PhpValue, PhpValue>> GetEnumerator() => this.GetForeachEnumerator(false, default(RuntimeTypeHandle));

        #endregion

        #region Helpers

        ///
        /// Checks the value is of type <c>bool</c> or <c>&bool</c> and gets its value.
        ///
        internal bool IsBooleanImpl(out bool b)
        {
            if (IsBoolean)
            {
                b = _value.@bool;
                return true;
            }
            else if (IsAlias)
            {
                return _obj.alias.Value.IsBoolean(out b);
            }
            else
            {
                b = default;
                return false;
            }
        }

        ///
        /// Checks the value is of type <c>string</c> or <c>&string</c> and gets its value.
        /// Single-byte strings are decoded using <c>UTF-8</c>.
        ///
        internal bool IsStringImpl(out string str)
        {
            switch (TypeCode)
            {
                case PhpTypeCode.String:
                    str = _obj.@string;
                    return true;

                case PhpTypeCode.MutableString:
                    str = _obj.blob.ToString();
                    return true;

                case PhpTypeCode.Alias:
                    return _obj.alias.Value.IsStringImpl(out str);

                default:
                    str = default;
                    return false;
            }
        }

        ///
        /// Checks the value is <c>string</c> or <c>&string</c> constructed as <see cref="PhpString"/> (a mutable string).
        ///
        internal bool IsMutableStringImpl(out PhpString str)
        {
            switch (TypeCode)
            {
                case PhpTypeCode.MutableString:
                    str = MutableString;
                    return true;

                case PhpTypeCode.Alias:
                    return Alias.Value.IsMutableStringImpl(out str);

                default:
                    str = default;
                    return false;
            }
        }

        ///
        /// Checks the value is of type <c>string</c> (both unicode and single-byte) or an alias to a string.
        ///
        internal bool IsStringImpl()
        {
            return TypeCode switch
            {
                PhpTypeCode.String => true,
                PhpTypeCode.MutableString => true,
                PhpTypeCode.Alias => Alias.Value.IsStringImpl(),
                _ => false,
            };
        }

        [MethodImpl(MethodImplOptions.NoInlining)]
        static Exception InvalidTypeCodeException() => new InvalidOperationException();

        #endregion

        #region IEquatable<PhpValue>

        public bool Equals(PhpValue other) => this.Compare(other) == 0;

        #endregion

        #region Construction

        ///
        /// Singleton of PhpValue representing <c>void</c>.
        ///
        [Obsolete("Use PhpValue.Null instead.")]
        public static readonly PhpValue Void = default;

        ///
        /// Singleton of PhpValue representing <c>null</c>.
        ///
        public static readonly PhpValue Null = default;

        ///
        /// PhpValue representing <c>false</c>.
        ///
        public static readonly PhpValue False = new PhpValue(false);

        ///
        /// PhpValue representing <c>true</c>.
        ///
        public static readonly PhpValue True = new PhpValue(true);

        private PhpValue(long value) : this(PhpTypeCode.Long)
        {
            _value.@long = value;
        }

        private PhpValue(double value) : this(PhpTypeCode.Double)
        {
            _value.@double = value;
        }

        private PhpValue(bool value) : this(PhpTypeCode.Boolean)
        {
            _value.@bool = value;
        }

        private PhpValue(PhpTypeCode type, object obj) : this(ReferenceEquals(obj, null) ? PhpTypeCode.Null : type)
        {
            _obj.@object = obj;
        }

        internal PhpValue(PhpString.Blob blob) : this(PhpTypeCode.MutableString)
        {
            Debug.Assert(blob != null);
            _obj.blob = blob;
        }

        internal PhpValue(string value) : this(PhpTypeCode.String)
        {
            Debug.Assert(value != null);
            _obj.@string = value;
        }

        internal PhpValue(PhpArray array) : this(PhpTypeCode.PhpArray)
        {
            Debug.Assert(array != null);
            _obj.array = array;
        }

        private PhpValue(PhpTypeCode type)
        {
            _type = type;
            _value = default;
            _obj = default;
        }

        ///
        /// INTERNAL.
        /// Creates an invalid value with the type code of <c>-1</c>.
        ///
        internal static PhpValue CreateInvalid() => new PhpValue(InvalidTypeCode);

        public static PhpValue Create(PhpNumber number) => number.ToPhpValue();

        public static PhpValue Create(long value) => new PhpValue(value);

        public static PhpValue Create(double value) => new PhpValue(value);

        public static PhpValue Create(int value) => new PhpValue(value);

        public static PhpValue Create(bool value) => value ? True : False;

        public static PhpValue Create(string value) => new PhpValue(PhpTypeCode.String, value);

        public static PhpValue Create(PhpString value) => PhpString.AsPhpValue(value);

        internal static PhpValue Create(PhpString.Blob blob) => new PhpValue(blob);

        internal static PhpValue Create(byte[] bytes) => new PhpValue(new PhpString.Blob(bytes));

        public static PhpValue Create(PhpArray value) => new PhpValue(PhpTypeCode.PhpArray, value);

        public static PhpValue Create(IPhpArray value) => value is PhpArray arr ? Create(arr) : FromClass(value);

        public static PhpValue Create(PhpAlias value) => new PhpValue(PhpTypeCode.Alias, value);

        ///
        /// Creates <see cref="PhpValue"/> from <see cref="Nullable{T}"/>.
        /// In case <see cref="Nullable{T}.HasValue"/> is <c>false</c>, a <see cref="PhpValue.False"/> is returned.
        ///
        /// <typeparam name="T">Nullable type argument.</typeparam>
        /// <param name="value">Original value to convert from.</param>
        /// <returns><see cref="PhpValue"/> containing value of given nullable, or <c>FALSE</c> if nullable has no value.</returns>
        public static PhpValue Create<T>(T? value) where T : struct => value.HasValue ? FromClr(value.GetValueOrDefault()) : PhpValue.False;

        ///
        /// Creates value containing new <see cref="PhpAlias"/> pointing to <c>NULL</c> value.
        ///
        public static PhpValue CreateAlias() => CreateAlias(Null);

        ///
        /// Creates value containing new <see cref="PhpAlias"/>.
        ///
        public static PhpValue CreateAlias(PhpValue value) => Create(new PhpAlias(value));

        public static PhpValue Create(IntStringKey value) => value.IsInteger ? Create(value.Integer) : Create(value.String);

        ///
        /// Create <see cref="PhpValue"/> representation of <see cref="ulong"/>.
        /// The value will be converted either to <see cref="long"/> or juggles to <see cref="double"/> if it's larger than long.
        ///
        public static PhpValue Create(ulong value)
        {
            if (value <= long.MaxValue)
            {
                return Create((long)value);
            }
            else
            {
                return Create((double)value);
            }
        }

        public static PhpValue FromClass(object value)
        {
            Debug.Assert(!(value is int || value is long || value is bool || value is string || value is double || value is PhpAlias || value is PhpString || value is PhpArray));
            return new PhpValue(PhpTypeCode.Object, value);
        }

        ///
        /// Implicitly converts a CLR type to PHP type.
        ///
        public static PhpValue FromClr(object value)
        {
            // implicit conversion from CLR types to PHP types
            if (value != null)
            {
                if (value.GetType() == typeof(int)) return Create((int)value);
                if (value.GetType() == typeof(long)) return Create((long)value);
                if (value.GetType() == typeof(double)) return Create((double)value);
                if (value.GetType() == typeof(float)) return Create((double)(float)value);
                if (value.GetType() == typeof(bool)) return Create((bool)value);
                if (value.GetType() == typeof(string)) return Create((string)value);
                if (value.GetType() == typeof(PhpString)) return Create((PhpString)value);
                if (value.GetType() == typeof(PhpAlias)) return Create((PhpAlias)value);
                if (value.GetType() == typeof(PhpArray)) return Create((PhpArray)value);
                if (value.GetType() == typeof(PhpValue)) return (PhpValue)value;
                if (value.GetType() == typeof(PhpNumber)) return Create((PhpNumber)value);
                if (value.GetType() == typeof(uint)) return Create((long)(uint)value);
                if (value.GetType() == typeof(byte[])) return Create(new PhpString((byte[])value));
                if (value.GetType() == typeof(IntStringKey)) return Create((IntStringKey)value);

                // object
                return FromClass(value);
            }
            else
            {
                return Null;
            }
        }

        ///
        /// Implicitly converts a CLR type to PHP type.
        ///
        public static PhpValue FromClr(PhpValue value) => value;

        ///
        /// Converts an array of CLR values to PHP values.
        ///
        public static PhpValue[] FromClr(params object[] values)
        {
            if (values == null || values.Length == 0)
            {
                return Utilities.ArrayUtils.EmptyValues;
            }

            //
            var result = new PhpValue[values.Length];
            for (int i = 0; i < values.Length; i++)
            {
                result[i] = FromClr(values[i]);
            }

            //
            return result;
        }

        #endregion
    }
}

redpajama_set_name: RedPajamaGithub


The E1-38 aluminum battery enclosure features removable covers with stainless steel screws. Your batteries and electronics are protected from the elements in the NEMA3R rated, mill-finished metal enclosure. The E1-38 has two rear ½" electrical knockouts and rear louver vents and three bottom ½" knockouts with an external mounting tab for 2″ pipe U-bolts. It is ideal for industrial and remote solar applications.
Please note: Power Ready Express (PRE) Control Panels do not fit in the UPS style enclosure.


We have been providing cutting edge software solutions to the leasing industry since 1988 with a seasoned team of business and technical consultants.
LeaseFlex differentiates itself on the market by leveraging the latest SOA-based web technologies for end-to-end management of the lease and asset lifecycle.
The robust infrastructure platform provides fast adaptability for tailor-made solutions for our customers as well as for changing requirements within the industry.
LeaseFlex has an infrastructure specifically developed to meet the compliance requirements of CoBIT) security audits in the finance sector.
LeaseFlex provides multi-product platform for financial leasing, operating leasing and equipment finance with consolidated reporting for risk and financial performance.
Specialized for the needs of Financial Leasing, Operating Leasing and Equipment Finance Companies with modules for Consumer Finance and Fleet Management, LeaseFlex increases operational efficiency with a centralized, flexible, and ready-to-use platform with best business practices.
Brochure will be sent to your e-mail.
Success Story will be sent to your e-mail.


I love burgers! When I was pregnant with my twins I ate a cheeseburger almost everyday. I was so sick and for some reason my stomach could handle eating a cheeseburger without any issues. Cheeseburgers are also one of the few meat meals that my oldest daughter will eat. Naturally we like to grill cheeseburgers often in my house in the summer.
While I will never get tired of eating cheeseburgers, it's fun to change it up sometimes. I got on a huge Greek food kick last summer. My Chicken Gyro recipe became one of my favorite meals and one of my most repined recipes. One day when I was at the store they had ground chicken on sale and I just knew I had to create a Greek Chicken Burger.
This burger will make anyone a fan of Greek food. It is amazing! My oldest who won't eat chicken ate it! Although I may have lied to her and told her that it was made with sausage.
Yea, I definitely lied to her, if she's ever in the kitchen with me when I pull out the meat I'm screwed since she can read now.
I serve the burgers with an assortment of toppings and I let my kids assemble their own burgers. They all love the tzatziki sauce that you just have to top your burger with. Trust me, this burger is not be the same without the sauce.
*If you buy ground chicken with less than 20 fat add in 1t to 1T of oil. You need fat in your burger so it doesn't dry out.
1. Make the sauce first. Peel the cucumber and cut into pieces. In a food processor combine the cucumber, olive oil, yogurt, garlic, 1/2 t dill weed, lemon juice and zest, and some salt and pepper. Blend it up and taste it, add more seasoning depending on your preference. Warning - the flavors come together as it chills so don't go overboard with the seasoning. I made my sauce about an hour before we ate and it was much better at dinner than when I tasted it while I was cooking. Place in a bowl, cover and refrigerate.
2. Combine all the burger ingredients in a large bowl. Form into patties. I made two large burgers and 3 smaller burgers for the kids. If you're feeding adults, this will make 4 large patties. Once your patties are formed sprinkle on a little extra salt and pepper on top.
I'm not sure where I was hiding the fifth burger during this picture.
3. Grill burgers over med-high heat flipping once when they are halfway cooked. Your cooking time will depend on the heat of your grill. I cooked mine for 4 minutes on each side. Check your burgers with a meat thermometer, once it reads 165 you can pull them off.
4. Assemble your burgers at the table and enjoy.
I know I am going to like this dish. I hope my family will too. I'll be making it this weekend.


We work with CPAs to help them integrate wealth management services.
What makes CPA Squared different? Watch this video to find out.
Is your firm ready for the changing business environment ahead?
CPA² is a turnkey program that integrates access to wealth management services into your CPA practice. Our proven model can help you strengthen your current client relationships as well as develop new ones. Integrating access to comprehensive wealth management services will empower you to exceed client expectations and position your firm to outpace the competition. For more information, please call us.


text:
Posts Tagged ' Chris Coleman '
For St. Patrick's breakfast, new PAC hosts Mayor Patrick Coleman and wife Betsy Hodges — no joke
10 March //
Tags : Betsy Hodges, Chris Coleman, st. Patrick's Day
Comments Off on For St. Patrick's breakfast, new PAC hosts Mayor Patrick Coleman and wife Betsy Hodges — no joke
Top of the morning to you! On St. Patrick's Day, St. Paul Mayor Chris Coleman's 10th Annual St. Patrick's Day Breakfast will feature a who's who of politicos, with one major exception. The mayor himself will be out of town.
Instead of Hizzoner, a new political action committee will kindly accept proceeds on behalf of… (wait for it) …. (drumroll)… (wait for it)… Mayor Patrick Coleman and his wife, Betsy Hodges.
Chris Coleman leaves for a whirlwind tour of Europe this week with a host of city hall staffers and assorted VIPs, such as St. Paul Area Chamber of Commerce President Matt Kramer and representatives of Xcel Energy.
So who will stand in for the mayor on March 17 at Summit Manor? The 7:30 a.m. breakfast is being hosted by David and Amber McLaughlin, with two very special stand-ins. Here's a selection from the email invite:
Please join us for Mayor Coleman's 10th Annual Saint Patrick's Day Breakfast.*
Starring: Patrick Coleman as Mayor Chris Coleman And Mayor Betsy Hodges as Connie Coleman *Mayor Coleman can not attend this year due to travel, but this Saint Paul tradition must carry on!
Patrick Coleman is a former librarian for the Minnesota Historical Society and president of Coleman Properties. His St. Paddy's Day "wife," who is not his wife at all, is Minneapolis Mayor Betsy Hodges, who was once mistaken for Chris Coleman's wife in a Star Tribune photo caption. In the right light, there's an uncanny resemblance.
The Cold War between St. Paul and Minneapolis has apparently melted, with outcomes that are just plain weird.
Mayoral breakfasts tend to raise funds for mayoral re-election campaigns, but this one has a different purpose, according to the invite: "Corporate contributions are not accepted — PAC proceeds to support DFL candidates running for state and local office."
The Scoop reached out to the Capitol Leadership PAC for comment Monday and is waiting to hear more details, but here's what's publicly available.
The Capitol Leadership PAC registered in September 2014, with a key ally of Gov. Mark Dayton — environmental attorney Charles Nauen — as chair. According to his online bio:
Mr. Nauen was co-lead counsel for Minnesota Governor Mark Dayton in the 2010 gubernatorial election recount and he represented the "Nauen 61" individual voters in an effort to have their absentee ballots counted in connection with the 2008 senatorial election recount.
Treasurer Rebecca Groen is the owner of Campaign Compliance Solutions, a campaign finance consulting firm, and former finance assistant and compliance director with "Klobuchar for Minnesota 2012." She was previously affiliated with the Southpaw Consulting Group.
Taste of Minnesota, Festa Italiana, Harriet Island weddings and 4th of July fireworks find new homes
30 June //
Tags : 4th of July, Chris Coleman, fireworks, Harriet Island, Minnesota Wild, Taste of Minnesota, Visit St. Paul
Comments Off on Taste of Minnesota, Festa Italiana, Harriet Island weddings and 4th of July fireworks find new homes
The Taste of Minnesota has moved from flooded Harriet Island to the Carver County Fairgrounds in Waconia. The Festa Italiana is on the move to Island Lake Park in Shoreview. And plenty of brides and grooms who had booked their nuptials at Harriet Island are scrambling for new venues, too.
The gosh darn flood waters haven't canceled St. Paul's summertime fun, but they have forced some major changes of locale. So what about the vaunted 4th of July Fireworks?
They'll proceed as planned… at the State Capitol Mall.
The site opens at 8 p.m. Friday and the explosions begin at 10 p.m. Wells Fargo, Visit St. Paul and the Minnesota Wild helped sponsor the festivities on pretty short notice, it seems from the city's news release, below:
Free July 4 fireworks display moved to the State Capitol Mall
SAINT PAUL – Mayor Chris Coleman today announced that Saint Paul's annual fireworks display will continue, despite the flood affecting Harriet Island and other low-lying areas of the City. Originally part of the event plan for "A Taste of Minnesota," the fireworks show will instead be held at the State Capitol Mall on July 4, at approximately 10:00 p.m.
"Fireworks have long been a part of our Independence Day celebration, and despite the flooding, I am excited that this important tradition will continue," said Mayor Coleman. "We want to thank Visit Saint Paul, the Minnesota Wild, and Wells Fargo for sponsoring this event on such short notice. I encourage families to pack a blanket, take light rail or bus to the Capitol Mall and enjoy an incredible display of fireworks."
The family friendly event is free and the Capitol Mall will open to the public beginning at 8:00 p.m. Pre-packaged food and beverages are allowed, but grills, alcohol, and personal fireworks are prohibited. Additionally, the fireworks will not be visible from the Mississippi River area and residents are reminded to use commonsense and abide by all park and road closures, which are clearly marked.
The event area will be closed to vehicle traffic from Rice Street to Cedar Street and from University Avenue to 12th Street West. While there are parking ramps around the area, visitors are encouraged to take public transit, including light rail and bus, to and from the show.
Follow the City of Saint Paul on Facebook and Twitter or go to our website later today, www.stpaul.gov, for more information.
In downtown St. Paul, motorcycle gang cops to do hard take-downs … of knowledge
6 September //
Tags : Chris Coleman, Crowne Plaza, motorcycle gangs, St. Paul Police
Comments Off on In downtown St. Paul, motorcycle gang cops to do hard take-downs … of knowledge
Hear that noise? It's the sound of undercover cops riding into downtown St. Paul on their hogs, bandanas flapping in the wind, all dark jean jackets and leather chaps, a skull and a crossbones somewhere on their person, tattoos that say "Mom"…
Well, sometimes the Scoop does get carried away. Whether members will ride in on motorcycles or fly into MSP and take the light rail to the bus, the Scoop isn't entirely sure, but the International Outlaw Motorcycle Gang Investigator's Conference is coming to St. Paul on Sunday.
The annual training conference for law enforcement officials who prosecute or investigate motorcycle gangs will be held through Sept. 13 at the Crowne Plaza Riverfront Hotel in downtown St. Paul. Mayor Chris Coleman is scheduled to give remarks Monday morning.
The conference is sponsored by the St. Paul Police Department, Midwest Cycle Intelligence Organization and Midwest Gang Investigator's Association. This is the 39th year of the conference, which launched the association in San Diego, Calif. in 1974. The association now has 600 members.
The conference opens with a training workshop on Sunday night and will host a banquet on Wednesday evening. So if you're single and looking to mingle with the boys on blue hogs, why not stop on by?
Kurt "Dirty Kurty" Dornfeld wants your vote for mayor of St. Paul, more seal-coating and fewer bike paths
Tags : bicycle paths, Chris Coleman, Election 2013, Kurt "Dirty Kurty" Dornfeld, Sharon Anderson, St. Paul Department of Public Works, Tim holden
Comments Off on Kurt "Dirty Kurty" Dornfeld wants your vote for mayor of St. Paul, more seal-coating and fewer bike paths
You might find the man who would be mayor of St. Paul seal-coating streets in Highland Park around this time. You'll definitely find him covered in black tack and grit, which he wears with pride.
By his own admission, Kurt "Dirty Kurty" Dornfeld's mayoral campaign started as a joke.
Dornfeld, a former radiator fixer, spring maker and street sweeper in private employ, has been working for the St. Paul Department of Public Works for the past 10 years. "I'm named 'Dirty Kurty' because of the job I do," said the street maintenance worker, during a quick break on Tuesday morning. "I get real dirty when I'm doing it. They call us painters. Filling potholes, skin patching, we put that black gooey stuff in there, tack."
Dornfeld — who included his nickname on his campaign filing with Ramsey County — said several Public Works co-workers jokingly urged him to run for mayor, and then the joking stopped. He decided to make his unhappiness with his employer and the administration of St. Paul Mayor Chris Coleman public, starting with bike paths and moving on to seal-coating.
Coleman, who will deliver his budget address on Wednesday at noon, has said bike paths are increasingly important transportation modes for a generation of young people who want to live in cities and live relatively car-free.
"There's a lot of people that are sick of paying for things that we really don't need," Dornfeld said. "There's bike paths all over the place. There's one down on Lower Afton — I don't know if St. Paul has anything to do with it — but I've never seen anyone use it. And then there's a street, Battle Creek Road, it's just terrible, horrible. I grew up in the Battle Creek area, and I've never seen it fixed."
"There's some people that disagree with a lot of things here in Public Works, and that's what I'm going to try to fix," he said. "Bike paths, making wrong decisions, like there used to be a seven year cycle for seal coating, and somebody made the decision to go to 10 years, and now we're paying for it. Now we've got so many holes, it's costing us more money than it ever should have cost us. We should have stayed on that seven year course."
About three years ago, a Channel 5 News crew filmed Dornfeld's peers apparently loafing around on the job during a busy pothole season, and a number of workers were lined up for discipline. In many instances, the union stepped in, and the discipline didn't take, though the Public Works Director in place at the time resigned the position.
"They had my name, I was never disciplined for it," said Dornfeld. "That was a bunch of baloney. That was just a power struggle. … All the stuff they had down on me wasn't actually punishable."
Beyond bike paths and seal coating, why else is Dornfeld running against Coleman? He's careful not to get too specific.
"I work for the city of St. Paul in street maintenance, and some of the things that he's said, and some of the things he's done, in all of Public Works, there are a lot of people who aren't happy," Dornfeld said. "I really can't say anything, because I have to work here if I don't win the post. … I see a lot of stuff going on, and I don't agree with it, and there's a lot of people who don't agree with it. I've lived here all my life."
Dornfeld has never held or run for public office before, though he is a Mason and former lodge master at Montgomery Lodge No. 258 on East Plato Boulevard. In addition to Coleman and Dornfeld, others on the ballot so far are University Avenue Realtor Tim Holden and perennial candidate Sharon Anderson.
Sharon Anderson, Chris Coleman file for mayor; Holden at the Turf Club; Devin Miller won't run for council
Tags : Chris Coleman, Chue Vue, Devin Miller, Election 2013, Jean O'Connell, John Brodrick, Sharon Anderson, Tim holden, Ward 1
Comments Off on Sharon Anderson, Chris Coleman file for mayor; Holden at the Turf Club; Devin Miller won't run for council
Election season has officially begun. St. Paul Mayor Chris Coleman — who won re-election in 2009 with 69 percent of the vote — filed to run for a third term in office on Tuesday morning, setting him in motion to be the first mayor to serve more than two terms since George Latimer, who held the mayor's seat from 1976 to 1990.
Coleman wasn't alone at 90 West Plato Boulevard, the Ramsey County government building, which is hosting elections filings from July 30 through August 13.
The mayor was joined by St. Paul School Board Chair Jean O'Connell, School Board member John Brodrick and School Board candidate Chue Vue. The three DFL-endorsed candidates will appear along with the mayor on the November 5 ballot. The mayor will be chosen by ranked-choice, and neither race involves a primary.
Ranked-choice ballots allow voters to choose more than one candidate in order of preference, so it's possible to vote for more than one candidate for mayor or city council.
Perennial candidate Sharon Anderson — who claims to live on the 1000 block of Summit Avenue — has also filed to run for mayor, though many have questioned over the years the veracity of that claim, as well as the comprehensibility of her many massive email missives. Ramsey County Property Records list a home sale for $735,000 in 2006, and two names on the tax statement, neither of which are Sharon Anderson. (Cue suspenseful music…)
On Monday, challenger Tim Holden held his own "Holden for Mayor" campaign event at the Turf Club at Snelling and University avenues, not far from the Love Doctor, an adult novelties shop that is also one of his most recognizable tenants. Holden has been a vocal critic of the Coleman administration, and even used a bullhorn to talk over the mayor during the recent demolition of the Gillette manufacturing plant. Yeah, he's sometimes been a bit direct.
Holden's four-hour Turf Club meet-and-greet was lightly attended, but several of those who came out said they had serious, heartfelt concerns about the future of St. Paul and its struggling parks and rec centers, small businesses that were impacted by light rail construction, the minority achievement gap in the St. Paul Public Schools, crime on the East Side, and the amount of money being funneled into the Lowertown ballpark, a future home of the St. Paul Saints. Holden says he'll file for office on Tuesday or Wednesday.
Among the Holden supporters at the Turf Club was the Rev. Devin Miller, who had pondered the idea of running for the Ward 1 seat on the St. Paul City Council, and even interviewed with the City Council for a shorter, five-month stint representing Ward 1, which spans Frogtown and Summit-University, as well as parts of bordering neighborhoods. Miller said on Monday that he's not running for office.
Speaking of the Ward 1 council race, the special DFL endorsing convention on Empire Drive ended Saturday (after five hours and six rounds of voting) without an endorsement. That leaves the door wide open to candidates in November. At 5:30 p.m. Wednesday, Ward 1 candidate Kazoua Kong-Thao will join school board candidate Chue Vue at Mai Village, 394 University Ave., for a fundraiser and campaign meet-and-greet hosted by Bao Vang.
Not all of the 7 candidates who sought DFL endorsement have confirmed they're running in November, but maybe sometimes means yes. On his Facebook page, Ward 1 candidate Matt Hill says it's "lawn sign time. Look for big announcements soon."
Others who are likely to file by Aug. 13 include Johnny Howard, Debbie Montgomery, Mark Voerding, Noel Nix, Dai Thao and Paul Holmgren.
Ramsey County to city of St. Paul procurement office: We need a divorce! (The Ortega – Coleman letters)
22 May //
Tags : Chris Coleman, procurement, Rafael Ortega
Comments Off on Ramsey County to city of St. Paul procurement office: We need a divorce! (The Ortega – Coleman letters)
Here's more on the dust-up between Ramsey County and the city of St. Paul over pens, pencils, cars, sand and all the other products that cities and counties buy in bulk.
The Ramsey County Board voted 6-0 (Mary Jo McGuire was absent) to divorce the county from a 1961 agreement with the city of St. Paul over joint purchasing. The decision, made Tuesday, May 21, is a real kick in the teeth to the city, which tried but failed to convince the county to stay the course.
The county will be gradually divesting from the city's Contract and Analysis Services office by 2014 and moving its procurement in-house, with three new buyers and an administrative worker hired by the end of the year.
County officials say a consultant found significant issues with the contract in 2009, and they've had a number of workshops to discuss those issues since. Annual procurement costs — which were recently in the $350,000 range — have ballooned up past $500,000 virtually overnight, the county says. There's also the question of staff turnover, and the fact that the city and county operate in differing software platforms.
The city says there's a good reason costs have increased — it's because the county has issued complicated procurement standards that require six hours of paperwork and processing for an item the city could purchase for itself in two hours.
The back-and-forth came to a head a few days ago, in letters between the mayor's office and the county board. Here they are…
Read St. Paul Mayor Chris Coleman's May 15 letter to Ramsey County and Ramsey County Board Chair Rafael Ortega's letter to Coleman.
So long, Porky's. Episcopal Homes breaks ground for Midway Village.
2 May //
Tags : Central Corridor, Chris Coleman, Episcopal Homes, George Latimer, light rail, Marvin Plakut, Midway Village, Porky's Drive-In, Russ Stark, senior housing
Comments Off on So long, Porky's. Episcopal Homes breaks ground for Midway Village.
"Light rail is doing exactly what we thought it could do," said St. Paul Mayor Chris Coleman, who joined former Mayor and potential resident George Latimer on Thursday, May 2 to break ground on the $45 million Midway Village senior housing complex being developed by Episcopal Homes of Minnesota.
The seven-story complex will be located on the corner of University Avenue West and East Lynnhurst Avenue, the site formerly occupied by Porky's Drive In. The project, the fifth facility on Episcopal Homes' headquarters campus, is expected to open in the fall of 2014.
"The reputation of Episcopal Homes is unparalleled," said Latimer at the event, describing himself as a future resident of the complex.
Funding for the building comes from a variety of private and public sources, including an $8 million grant from the federal Department of Housing and Urban Development, as well as city and state funds.
Coleman said Midway Village is one of the greatest examples of how the $957 million light rail project is seeding both public and private investment.
The YouTube video is here: Episcopal Homes breaks ground for Midway Village.
Others at the event included the Right Rev. Brian Prior, bishop of the Episcopal Church in Minnesota; Marvin Plakut, president and CEO of Episcopal Homes; and City Council Member Russ Stark.
The 173-unit, seven-story $45 million complex at University and Lynnhurst avenues will be the priciest project to open along the Central Corridor light-rail line since the renovation of the Union Depot.
The majority of the senior units will be market-rate, but some will be subsidized. Midway Village will consist of the Terrace, with 63 catered living apartments; Episcopal Church Home — The Gardens, with 60 skilled nursing beds; and Midway Pointe, with 50 affordable apartments for independent seniors.
An opening is planned to coincide with the first light-rail trains running in fall 2014.
Episcopal Homes has operated in St. Paul since 1894 and maintains seven buildings, including four at its central campus at 1930-1850 W. University Ave.
Coleman, Lantry, Stark present "Sustainable St. Paul" awards
17 April //
Tags : Chris Coleman, Kathy Lantry, Russ Stark, Sustainable St. Paul awards
Comments Off on Coleman, Lantry, Stark present "Sustainable St. Paul" awards
Men in law enforcement uniform joined school students, college students, a hardware store owner and soon-to-be-retired "Friends of the Parks and Trails of St. Paul and Ramsey County" Director Peggy Lynch at City Hall to get what they have coming to them: awards.
St. Paul Mayor Chris Coleman joined City Council President Kathy Lantry and other members of the city council in lauding Lynch, the Como Lake Neighbor Network, For Recycling on Grand (FROG), and Kendall's Ace Hardware store — among a sizable list of others — for their efforts to keep St. Paul green and environmentally sound.
More about the awards is online here.
Video from the actual ceremony is here.
The mayor presented the 2013 Sustainable St. Paul Awards on Wednesday, April 17 in front of a crowded house of spectators and recipients. The resolution, sponsored by Council Member Russ Stark, states that the mayor and council are "committed to making St. Paul the most livable city in America and a leader in sustainable urban living."
Award winners include:
· Peggy Lynch for Exceptional Environmental Stewardship
· Pier Foundry and Pattern Shop for Energy Efficiency or Conservation
· Ramsey County and District Energy Saint Paul Law Enforcement Center Solar Thermal Project for Renewable Energy
· Kendall's Hardware Store for Green Building Design- Commercial
· University of Saint Thomas Anderson Student Center for Green Building Design – Institutional
· Great River School for Environmental Education & Awareness
· For Recycling On Grand (FROG) for Waste Reduction for Recycling or Composting – Commercial
· Macalester Groveland Community Council's Organics Recycling Program for Waste Reduction, Recycling or Composting – Residential
· Clara Stahlmann Roeder for Youth Leadership
· Department of Public Works Hamline Midway Pervious Alley Project for Sustainable City Staff
· Jukka Kukkonen for Transportation Options
· Kinnell Tackett for Natural Resources Conservation
· Como Lake Neighbor Network for Water Quality or Conservation
· Health Systems Cooperative Laundry for Green Practices
Chris Coleman vs…. no one?
Tags : Chris Coleman, DFL, Election 2013, Greg Copeland, St. Paul Republican City Committee, St. Paul School Board, Tim holden
Comments Off on Chris Coleman vs…. no one?
Perhaps the gorgeous crooner Alicia Keys said it best when she sang, "No one, no one, no one…"
On Tuesday, April 16, DFL and Republican activists from across St. Paul took their separate corners at precinct caucuses and ward conventions, which were relatively short and to the point, from what the Scoop gleaned last night. The DFL introduced no challengers to St. Paul Mayor Chris Coleman. The GOP introduced no challengers to Coleman, and no candidates for school board.
Sing it, Alicia…
However, our spies at the GOP caucus tell the Scoop that University Avenue realtor Tim Holden got a round of applause. Holden, who did not address the crowd or make public remarks, has said he is running for the nonpartisan seat as an independent, though he has yet to file his campaign finance reports, which are due within 14 days of expending or receiving $100 in campaign funds.
Writes a dedicated Scoopster, via email:
There were a number of former School Board candidates present but they did not announce their intentions. Since we do not endorse candidates at our Ward Caucuses there is still time to find candidates to endorse. Here are some of them that were there: John Krenik, Richard Eaton, and Liz Paulson.
There was a Mayor Candidate who was checking out the SPRCC, Tim Holden. Here is Tim's contact info for more info about his candidacy HOLDENFORMAYOR.com … Holden did not address the audience but he got a rousing applause when he was introduced that he was going to run against Chris Coleman.
There will probably be more about the GOP caucus here and here but not likely here.
Meanwhile, there are at least six DFL-friendly candidates running for the three seats on the 7-member school board. Those candidates include the sitting board chair Jean O'Connell and fellow incumbent John Brodrick. Elona Street-Stewart is not running for re-election.
In addition to O'Connell (oconnellforstpaulkids.com) and Brodrick (brodrick4kids.com), they include Chue Vue (chueforschoolboard.com), David Martinez (martinezforstpaulkids.com), Luis Ortega (ortegaforschoolboard.org), and Sarah Lechowich (sarahlechowich.org). The DFL endorsements will be determined at the party's city convention on June 8 at the old Arlington High School, which is currently the Washington Technology Magnet School, 1495 Rice St.
More info on DFL stuff here.
Now, back to the GOP…
Here's the official statement, hot off the digital presses, from the GOP's city committee:
Statement by Greg Copeland, Chair, St. Paul Republican City Committee, on Tuesday's
2013 St. Paul City Caucus
While I can't report any candidate announcements today, Tim Holden, an independent candidate for Mayor attended the Republican Caucus as a guest. Holden shared his campaign flyer seeking support for his Mayoral Campaign with our St. Paul City Caucus goers as he met each of them. Holden told Republicans he came to meet them on a one to one to basis and listen to them.
We believe the three seats on the 2013 ballot for St. Paul School Board are all Open Seats, even though there has been only one incumbent who will not seek re-election.
Three people who have previously been endorsed by the St. Paul GOP as candidates for St. Paul School Board attended the Caucus, but they did not indicate Tuesday that they would be running in 2013. We will be seeking school board candidates who make the case reform St. Paul Schools to ensure that our children can graduate ready for a job, or with a ticket to vocational training or college.
State GOP Chair Keith Downey pledged his commitment to directly support St. Paul Republicans
in their 2013 city elections as he works to rebuild the Republican Party looking forward to the 2014 races for U. S. Senate, Governor, and the MN House.
Minnesota Senate Minority Leader Senator David Hann declared Republicans in St. Paul have an opportunity given the fact the DFL has held the Mayor's Office for the last 12 years and had every seat on the City Council for over two decades, as well as the majority of seats on the school board. Hann pointed out, "If St. Paul residents are unhappy with how the City is operating, or dissatisfied with St. Paul Schools; they are ready to vote for a change. We are the Change."
Chris Fields said his election State GOP Secretary sent a message that St. Paul and Minneapolis is no longer fly over country for the Great Opportunity Party. Urban Republicans will get our support for their work to challenge the status quo policies of the DFL that are failing poor people looking for a job and their children who will need a good education to seize opportunities for changing their lives and escaping the grip of poverty.
Deputy Chair Kelly Fenton, a former St. Paul resident, told the Caucus she would go door to door with party activists to make our case directly to Capitol City voters.
A Republican City Convention date will be announced by the St. Paul City Committee.

redpajama_set_name: RedPajamaCommonCrawl


Advanced Cooling Technologies (ACT) presents its range of thermal management solutions that are key to making medical devices smaller, faster, and more reliable. Its display can be found at Booth 1887 at the MD&M West Show.
ACT has the skills and resources to perform feasibility studies and product analyses, as well as design, prototype or manufacture custom parts to solve thermal issues. Applications include surgical devices, imaging systems, thermal control, diagnostic devices, and heat exchangers. To browse a library of technical webinars, click here.
ACT serves customers in Aerospace, Electronics, HVAC and Energy Recovery, LED Thermal Management, and Temperature Calibration and Control. Products include heat pipes, heat exchangers, and cold plates. R&D and technical-services programs range from developing thermal protection materials for space reentry vehicles to investigating nanoscale heat transfer in next generation electronic devices. The company also designs high-temperature heat-recovery systems for industrial processes.


text:
Michelle Chiu
An honest review of "Tigertail" from a daughter of Asian immigrants
How Alan Yang's Netflix film landed its spot as my favorite film of 2020
It's rare to come across films that perfectly depict parts of your life in ways you never thought would be seen in mainstream media. Thankfully, I can now count on Alan Yang's storytelling in Tigertail to educate others on the journey my family, and so many others, faced in carving out better lives for the generations that follow.
It is one of the few films, if not the first, that serves as a strong reminder and proud acknowledgement of my origins: a showcase of the sacrifices and hardships my parents and grandparents formerly endured to provide foundations for my life today. As I concluded the 91-minute piece with endless streams of tears and a heavy heart, I knew I needed to share its impact on me with a broader audience and explain why a story like this is necessary for others to experience.
Screen grab from Tigertail (2020)
Inspired by the story of Yang's own father, Tigertail tells the personal story of a man named Pin-Jiu who leaves Taiwan to carve a life for himself in America. The film starts off by depicting scenes from his early childhood in the grassy countryside, and then proceeds to shift between scenes in 1950's Taiwan and present-day America. While most of the protagonist's early life involves his mother and a former lover, most of his existence in America revolves around a wife from an arranged marriage and a daughter from that relationship.
The movie gains momentum on various themes revolving young love, regret, father-daughter relationships, and immigration, but the most powerful motif surfaced to me was the notion that our parents and grandparents lived lives before us we know little to nothing about. It also paints a clear picture of the stark gap I feel in the separation between my own heritage and growing up as an American, experiencing parts of my Asian culture from customs my family taught me or stories my family shared in words or pictures.
The depictions of 1950's Taiwan in the film bring me back to stories that my father told me of his childhood; at a very early age, my dad was in charge of herding cattle and tending farmland in a family of seven in mainland China. He'd always boast about the methods he'd use to tame livestock and spoke deeply on the hard conditions he and my grandparents had to live through coming from impoverished backgrounds.
My father's most memorable lectures centered on requirements of finishing my leftovers on dinner plates — reminding me of the work that goes into growing each grain of rice and food on our tables. It'd consequently lead to a speech on how lucky my brother and I are to be born in America, living in circumstances where we can pursue our education and lead comfortable lifestyles.
The small cultural details in the movie, such as the restaurant settings and decorations on the home walls, really added to the accuracy and authenticity of the film. It brought me back to the Sunday morning dim-sum environments with my larger family in traditional restaurants and paralleled the symbols of good luck and fortune we hang in our homes.
A piece of trivia I learned from IMDB I found interesting was that all of the flashback scenes were shot on 16mm film while all the present day scenes were shot on digital. This detail added to the dreamy essence of the character's past as well as the metaphoric symbolism behind it. Most of what I can envision from my parents' and grandparents' past are all "grainy images" they've carried with them for decades.
In the last part of the film, Pin-Jiu travels back to Taiwan with his daughter to share parts of his past with her first-hand. They return to the rice fields and to his old town: time capsules that reflect parts of his history his daughter has not seen before.
When I was in high school, I too embarked on a trip with my family to revisit my father's old village in China. Seeing the way that my dad interacted with the people that still lived nearby, listening to the depictions my grandparents told of what the now-empty buildings used to hold, and experiencing what an alternate life was like in a seemingly-distant country changed the way I understood about my family's past. I'm sure many other Asian Americans can relate to this experience. I'm glad that Yang was able to tackle that narrative, and concluded the film with such a powerful image — panning the shot out of the window of the protagonist's old home to frame Pin-Jiu with his daughter.
In all,
While I do believe the film could've built more momentum from some of the underlying themes it presented, it's hard to neglect how Yang's storytelling touched a soft place in my heart with the striking similarities I can mirror from Tigertail in my own life. I mean, Yang uncannily nailed down my father's love for tea and even managed to name the character the daughter breaks up with in the movie after my ex-boyfriend. The details are there.
In film, we often place ourselves in the role of characters on-screen in some way, shape, or form. I'm glad I was able to finally see people on screen who looked like me and embodied parts of my own culture and story. Huge thanks to Alan Yang on directing this film and choosing to place more Asian Americans on-screen; your efforts do not go unnoticed.
Please take a moment to watch Tigertail if you want to better empathize with individuals of first-generation Asian families. It is a story that is even more necessary to share in the times we live in, and surely taught me to cherish my relationship with my parents and grandparents to a greater extent. Just remember to keep a box of tissues within reach.
Thanks for reading! Follow my newsletter to receive links to provoking reads I've found helpful for my design career and keep up-to-date on my newest blog posts. If you'd like to reach out, follow me on Twitter to continue the conversation. You can also check out my photography journey on Instagram or learn more about me from my website.
Product designer at MongoDB (135K+ views). Prev. Apple, Microsoft, BuzzFeed, DoorDash, Frog Design, & Wish. Follow my newsletter: michelle-chiu.com/newsletter.
More from Michelle Chiu
Midsommar is a Revenge Story
Melanie Moyer
With 'BlacKkKlansman,' Spike Lee Showed Why 'Gone With The Wind' Is So Dangerous
Travis Bean
How to Break the Biopic Formula
One Room With A View in One Room With A View
The Warring Worlds of The Hate U Give
Joshua Adams
La Vie est a "Who?"
Michael Bass
Ready Player One: Hate the Player, Hate the Game.
Sean Boulger in idiots_delight
Snyder Cut's Trailer Reveal: Are We Celebrating Too Early?
The Film Addict
The Godfather Part 2.5
M.G. Siegler


text:
Small Business Buzz, Musings and Muchness: Sean Parker Wants More of This and Less of That
Tech entrepreneur, and former Napster co-founder, Sean Parker insists that there are too many VC's and not enough entrepreneurs. "There's too much capital chasing after too few good...
By Staff Contributors
The Curator:
Tech entrepreneur, and former Napster co-founder, Sean Parker insists that there are too many VC's and not enough entrepreneurs. "There's too much capital chasing after too few good and interesting businesses." (Memeburn)
Amazon causes outrage with small business owners over new app. "Amazon began a promotion that encouraged customers to check out prices at local retailers and use a specially designed "Price Check" smartphone app to report what they found back to Amazon." (New York Times)
Research indicates California as bad for small business. "The Small Business & Entrepreneurship Council ranked the Golden State near the bottom, at No. 46, for its public policy climate for small business and entrepreneurship." See where your state ranked. (Sacramento Business Journal)
Startup failure is good for economy since founders never give up. "Economically speaking, the important thing is that they almost always try again." (Washington Post)
Never take a vacation? Forbes explains how to do it successfully if you are an entrepreneur. "Paranoid that everything will go down in flames just as soon as their phone is turned off, many entrepreneurs maintain a state of hyper-vigilance for a very, very long time." (Forbes)
Did you enjoy this article? If so, subscribe to YFS Magazine and never miss an update. Don't forget to make our friendship official and join Young, Fabulous & Self-Employed entrepreneurs on Facebook.
Photo Credit: nrkbeta
© YFS Magazine. All Rights Reserved. Copying prohibited. All material is protected by U.S. and international copyright laws. Unauthorized reproduction or distribution of this material is prohibited. Sharing of this material under Attribution-NonCommercial-NoDerivatives 4.0 International terms, listed here, is permitted.
the curator
We eat, sleep and breathe entrepreneurship. We're behind YFS Magazine's fresh content -- one of the largest independent small business news sites. Young, Fabulous & Self-Employed has quickly become the definitive digital resource for startup, small business news and entrepreneurial culture. Join us on Twitter @yfsmagazine and Facebook.


text:
Pirates Extend Josh Harrison
By Jeff Todd | April 8, 2015 at 11:03am CDT
The Pirates have announced a four-year extension for infielder/outfielder Josh Harrison. Pittsburgh will guarantee the super-utility man $27.3MM over the next four seasons and will also hold two club options that could bring the deal's total value to $50.3MM.
Harrison, who is represented by MSM Sports, will take home a $1MM signing bonus. After earning his previously agreed-upon $2.8MM salary this year, he will earn $5MM (2016), $7.5MM (2017), and $10MM (2018). The options are worth $10.5MM ($1MM buyout) and $11MM ($500K buyout). The options can each increase by up to $1MM depending upon escalators based upon MVP voting, accounting for the rest of the achievable value.
Harrison, 27, broke out last year for the Bucs after several years shuttling between the big leagues and upper minors. Despite previously carrying a sub-.700 OPS, Harrison slashed .315/.347/.490 in 550 plate appearances in 2014, adding 13 home runs and 18 stolen bases.
Playing excellent defense at multiple infield and outfield positions not only helped enhance Harrison's overall productivity, but makes him a highly versatile piece moving forward. In the aggregate, Harrison posted 5.3 rWAR and 5.0 fWAR last year.
That elite contribution came at an opportune time, as it landed Harrison a $2.8MM contract in his first year of arbitration eligibility. In exchange for promising away the rest of his arbitration years and three seasons of free agent eligibility (two via options), Harrison now pockets an additional $24.5MM in guaranteed money.
MLBTR's Steve Adams took a look at Harrison as an extension candidate back in September. After a detailed breakdown of his surprising emergence, Steve explained the difficulties that the two sides might encounter in valuing a new contract. A new factor was introduced when the Bucs landed Korean infielder Jung-ho Kang.
But with Harrison showing no signs of slowing down over a solid spring, team and player were able to bridge any differences and find common ground. In the end, Pittsburgh will commit slightly more than the Indians did last year for Michael Brantley but will pick up an additional season of control in the second option. The club will now enjoy the wide flexibility that Harrison offers in planning their next several offseasons, while hoping that his contract pays off as much as Brantley's has.
Detractors will note that Harrison benefited from a .355 BABIP last year. But he has traditionally carried a high mark in the minors and still would have had plenty of value on offense — to say nothing of the other elements of the game — had that number been lower. If Harrison can remain even a slightly above-average hitter, he ought to justify his contract and then some.
All links to Twitter: Jon Heyman of CBSSports.com first reported the total value of the deal. Ken Rosenthal of FOX Sports reported details while Rob Biertempfel of the Pittsburgh Tribune-Review also reported financial details and Bill Brink of the Pittsburgh Post-Gazette added the deal's escalator clause.
Photo courtesy of USA Today Sports Images.
Share 17 Retweet 78 Send via email0
Newsstand Transactions Josh Harrison
Offseason In Review: Arizona Diamondbacks
Cubs To Sign James Russell


Elk Bull 10/01/2013: The Elk began walking away from us but parallel to the road. I was able to get ahead of him and using a 300mm lens keep a safe distance as well. This was the last shot of this prime specimen. I felt like he was becoming annoyed with my presence so decided to call it a day and give him his space.
Nikon D7100, 28-300mmlens @170mm. Aperture f/5.6, Shutter Speed 1/250 seconds, ISO 2500, and +0.33EV. Single shot, hand held using vibration reduction. Taken early in the morning on a very cloudy day.


You hired your wedding vendors because you loved their past work and because you connected with them on a personal level, but if you want them to bring their all to your ceremony and reception, there are a few things you should know. First and foremost, the secret to getting your big-day pros to do their best work for your wedding is to treat this relationship the way you'd treat any other relationship of value: with respect and integrity. Trust, communication, and honesty are essential elements of any great partnership, and this includes the one you're building with your wedding vendors.
If you want the professionals you've hired to have the opportunity to do their best work ever, remember these three points.
There's no greater way to empower your wedding team than by trusting them to do their job and to do it well. Wedding planner Elizabeth Lewis of The Nouveau Romantics suggests, "Find people you implicitly trust, and let them do their thing. When the clients trust the professionals, it allows us to over-deliver, and make you beyond happy. We want to delight, surprise, and wow you."
As you've likely learned in your relationship with your soon-to-be spouse, good communication fuels positive interactions and outcomes. It's inevitable that you'll face some hiccups and surprises while planning your wedding, some of which may be the result of miscommunication or a lack of organization within your wedding vendor's systems. It's important to talk through these issues as they arise so you don't allow small mistakes to ruin your working relationship.
It's important to be realistic about what you're willing to take on from the start. Task management is something a wedding planner can be helpful with, but it's important that you're clear from the start how much you can manage outside of your own job and personal life. For instance, planning a wedding on a private estate that requires you to bring in tents, a catering kitchen, restrooms, generators, and more is a huge task to tackle without someone who knows the ropes. On the other hand, if you know you're short on free time to plan a wedding, opting to host your wedding at a venue that includes everything will be much less consuming.


NEW YORK, March 25, 2019 (GLOBE NEWSWIRE) -- Varonis Systems, Inc. (NASDAQ:VRNS), a pioneer in data security and analytics, will kick off Connect! 2019, its annual series of customer events. The series of one-day events begins in April and runs through June, taking place in 23 cities across North America and Europe.
Varonis customers can learn more and receive an invitation to attend a Connect! 2019 event by sending an email to events@varonis.com.
Now in its eighth year, Varonis Connect! events provide a mix of educational sessions, insights to help customers harness the full benefit from their Varonis products, and networking opportunities for security and risk professionals and leaders to share best practices and success stories. Varonis engineering and product teams will be on hand to provide attendees with personalized consultations.
-- Check out our upcoming events. -- Sign up for a free Data Risk Assessment or request a live demo. -- For more information on Varonis' solution portfolio, please visit www.varonis.com. -- Visit our blog and join the conversation on Facebook, Twitter, LinkedIn, Podcastand YouTube.
About Varonis Varonis is a pioneer in data security and analytics, fighting a different battle than conventional cybersecurity companies. Varonis focuses on protecting enterprise data on premises and in the cloud: sensitive files and emails; confidential customer, patient and employee data; financial records; strategic and product plans; and other intellectual property. The Varonis Data Security Platform detects insider threats and cyberattacks by analyzing data, account activity, perimeter telemetry and user behavior; prevents and limits disaster by discovering, classifying and locking down sensitive, regulated and stale data; and efficiently sustains a secure state with automation. With a focus on data security, Varonis serves a variety of use cases including data protection, threat detection and response and compliance. Varonis started operations in 2005 and, as of December 31, 2018, had approximately 6,600 customers worldwide — comprised of industry leaders in many sectors including technology, consumer, retail, financial services, healthcare, manufacturing, energy, media, and education.


If you are Deaf, Hard of Hearing, an ASL User, ASL Interpreter, ASL Student or if you are the owner of a deaf dog, join us on Saturday, March 23rd from 9am to 12pm.
The Whole Person will be here sharing resources for the Deaf and Hard of Hearing as well as information on where you can go to find adoptable deaf dogs. Those new to ASL will have the opportunity to find out where they can learn this valuable skill and how it can open up a new world of relationships and understanding.
Entry is free for all humans. For those bringing a dog, day passes for non-Bar K Members are $10 for the first dog and $5 for each additional dog in a household.