text:
<?xml version="1.0" encoding="utf-8"?>
<reflection>
  <assemblies>
    <assembly name="System.Activities">
      <assemblydata version="4.0.0.0" culture="" key="0024000004800000940000000602000000240000525341310004000001000100B5FC90E7027F67871E773A8FDE8938C81DD402BA65B9201D60593E96C492651E889CC13F1415EBB53FAC1131AE0BD333C5EE6021672D9718EA31A8AEBD0DA0072F25D87DBA6FC90FFD598ED4DA35E44C398C454307E8E33B8426143DAEC9F596836F97C8F74750E5975C64E2189F45DEF46B2A2B1247ADC3652BF5C308055DA9" hash="SHA1" />
      <attributes>
        <attribute>
          <type api="T:System.Runtime.CompilerServices.ExtensionAttribute" ref="true" />
        </attribute>
        <attribute>
          <type api="T:System.Runtime.InteropServices.GuidAttribute" ref="true" />
          <argument>
            <type api="T:System.String" ref="true" />
            <value>97bdccfe-43bf-4c17-991d-c797c2ef2243</value>
          </argument>
        </attribute>
        <attribute>
          <type api="T:System.Runtime.InteropServices.ComVisibleAttribute" ref="true" />
          <argument>
            <type api="T:System.Boolean" ref="false" />
            <value>False</value>
          </argument>
        </attribute>
        <attribute>
          <type api="T:System.CLSCompliantAttribute" ref="true" />
          <argument>
            <type api="T:System.Boolean" ref="false" />
            <value>True</value>
          </argument>
        </attribute>
        <attribute>
          <type api="T:System.Security.AllowPartiallyTrustedCallersAttribute" ref="true" />
        </attribute>
        <attribute>
          <type api="T:System.Reflection.AssemblyTitleAttribute" ref="true" />
          <argument>
            <type api="T:System.String" ref="true" />
            <value>System.Activities.dll</value>
          </argument>
        </attribute>
        <attribute>
          <type api="T:System.Reflection.AssemblyDescriptionAttribute" ref="true" />
          <argument>
            <type api="T:System.String" ref="true" />
            <value>System.Activities.dll</value>
          </argument>
        </attribute>
        <attribute>
          <type api="T:System.Reflection.AssemblyDefaultAliasAttribute" ref="true" />
          <argument>
            <type api="T:System.String" ref="true" />
            <value>System.Activities.dll</value>
          </argument>
        </attribute>
        <attribute>
          <type api="T:System.Reflection.AssemblyCompanyAttribute" ref="true" />
          <argument>
            <type api="T:System.String" ref="true" />
            <value>Microsoft Corporation</value>
          </argument>
        </attribute>
        <attribute>
          <type api="T:System.Reflection.AssemblyProductAttribute" ref="true" />
          <argument>
            <type api="T:System.String" ref="true" />
            <value>Microsoft® .NET Framework</value>
          </argument>
        </attribute>
        <attribute>
          <type api="T:System.Reflection.AssemblyCopyrightAttribute" ref="true" />
          <argument>
            <type api="T:System.String" ref="true" />
            <value>© Microsoft Corporation.  All rights reserved.</value>
          </argument>
        </attribute>
        <attribute>
          <type api="T:System.Reflection.AssemblyFileVersionAttribute" ref="true" />
          <argument>
            <type api="T:System.String" ref="true" />
            <value>4.6.1590.0</value>
          </argument>
        </attribute>
        <attribute>
          <type api="T:System.Reflection.AssemblyInformationalVersionAttribute" ref="true" />
          <argument>
            <type api="T:System.String" ref="true" />
            <value>4.6.1590.0</value>
          </argument>
        </attribute>
        <attribute>
          <type api="T:System.Resources.SatelliteContractVersionAttribute" ref="true" />
          <argument>
            <type api="T:System.String" ref="true" />
            <value>4.0.0.0</value>
          </argument>
        </attribute>
        <attribute>
          <type api="T:System.Resources.NeutralResourcesLanguageAttribute" ref="true" />
          <argument>
            <type api="T:System.String" ref="true" />
            <value>en-US</value>
          </argument>
        </attribute>
        <attribute>
          <type api="T:System.Reflection.AssemblyDelaySignAttribute" ref="true" />
          <argument>
            <type api="T:System.Boolean" ref="false" />
            <value>True</value>
          </argument>
        </attribute>
        <attribute>
          <type api="T:System.Reflection.AssemblyKeyFileAttribute" ref="true" />
          <argument>
            <type api="T:System.String" ref="true" />
            <value>f:\dd\tools\devdiv\35MSSharedLib1024.snk</value>
          </argument>
        </attribute>
        <attribute>
          <type api="T:System.Reflection.AssemblySignatureKeyAttribute" ref="true" />
          <argument>
            <type api="T:System.String" ref="true" />
            <value>002400000c80000014010000060200000024000052534131000800000100010085aad0bef0688d1b994a0d78e1fd29fc24ac34ed3d3ac3fb9b3d0c48386ba834aa880035060a8848b2d8adf58e670ed20914be3681a891c9c8c01eef2ab22872547c39be00af0e6c72485d7cfd1a51df8947d36ceba9989106b58abe79e6a3e71a01ed6bdc867012883e0b1a4d35b1b5eeed6df21e401bb0c22f2246ccb69979dc9e61eef262832ed0f2064853725a75485fa8a3efb7e027319c86dec03dc3b1bca2b5081bab52a627b9917450dfad534799e1c7af58683bdfa135f1518ff1ea60e90d7b993a6c87fd3dd93408e35d1296f9a7f9a97c5db56c0f3cc25ad11e9777f94d138b3cea53b9a8331c2e6dcb8d2ea94e18bf1163ff112a22dbd92d429a</value>
          </argument>
          <argument>
            <type api="T:System.String" ref="true" />
            <value>8913ef869646d14971df222c210018ab394cfe63f8eb9b4d894c0dda7368cfb69df15d049b347f8a8b9205cdcc3d6bd6690f0bd24b3da3179feb8c03f410703027c7844ff654997e38015dfc97222c15061af2a1d3fe91775b9dd4b8ede64d3d59816270a9520e393c8e60619b80d40fc1dc4f12b5aa0c2df20d02ea32960851</value>
          </argument>
        </attribute>
      </attributes>
    </assembly>
  </assemblies>
  <apis>
    <api id="N:Microsoft.VisualBasic.Activities.XamlIntegration">
      <topicdata group="api" />
      <apidata name="Microsoft.VisualBasic.Activities.XamlIntegration" group="namespace" />
      <elements>
        <element api="T:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter" />
        <element api="T:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsValueSerializer" />
      </elements>
      <file name="6fb17aeb-5835-0048-ac41-605d5c1bd666" />
    </api>
    <api id="T:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter">
      <topicdata group="api" />
      <apidata name="VisualBasicSettingsConverter" group="type" subgroup="class" />
      <typedata visibility="public" sealed="true" serializable="false" defaultConstructor="M:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.#ctor" />
      <family>
        <ancestors>
          <type api="T:System.ComponentModel.TypeConverter" ref="true" />
          <type api="T:System.Object" ref="true" />
        </ancestors>
      </family>
      <elements>
        <element api="M:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.#ctor" />
        <element api="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.CanConvertFrom">
          <element api="M:System.ComponentModel.TypeConverter.CanConvertFrom(System.Type)" />
          <element api="M:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext,System.Type)" />
        </element>
        <element api="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.CanConvertTo">
          <element api="M:System.ComponentModel.TypeConverter.CanConvertTo(System.Type)" />
          <element api="M:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext,System.Type)" />
        </element>
        <element api="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.ConvertFrom">
          <element api="M:System.ComponentModel.TypeConverter.ConvertFrom(System.Object)" />
          <element api="M:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object)" />
        </element>
        <element api="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.ConvertTo">
          <element api="M:System.ComponentModel.TypeConverter.ConvertTo(System.Object,System.Type)" />
          <element api="M:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type)" />
        </element>
        <element api="M:System.Object.Equals(System.Object)" />
        <element api="M:System.Object.GetHashCode" />
        <element api="M:System.Object.GetType" />
        <element api="M:System.Object.ToString" />
        <element api="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.ConvertFromInvariantString">
          <element api="M:System.ComponentModel.TypeConverter.ConvertFromInvariantString(System.String)" />
          <element api="M:System.ComponentModel.TypeConverter.ConvertFromInvariantString(System.ComponentModel.ITypeDescriptorContext,System.String)" />
        </element>
        <element api="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.ConvertFromString">
          <element api="M:System.ComponentModel.TypeConverter.ConvertFromString(System.String)" />
          <element api="M:System.ComponentModel.TypeConverter.ConvertFromString(System.ComponentModel.ITypeDescriptorContext,System.String)" />
          <element api="M:System.ComponentModel.TypeConverter.ConvertFromString(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.String)" />
        </element>
        <element api="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.ConvertToInvariantString">
          <element api="M:System.ComponentModel.TypeConverter.ConvertToInvariantString(System.Object)" />
          <element api="M:System.ComponentModel.TypeConverter.ConvertToInvariantString(System.ComponentModel.ITypeDescriptorContext,System.Object)" />
        </element>
        <element api="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.ConvertToString">
          <element api="M:System.ComponentModel.TypeConverter.ConvertToString(System.Object)" />
          <element api="M:System.ComponentModel.TypeConverter.ConvertToString(System.ComponentModel.ITypeDescriptorContext,System.Object)" />
          <element api="M:System.ComponentModel.TypeConverter.ConvertToString(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object)" />
        </element>
        <element api="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.CreateInstance">
          <element api="M:System.ComponentModel.TypeConverter.CreateInstance(System.Collections.IDictionary)" />
          <element api="M:System.ComponentModel.TypeConverter.CreateInstance(System.ComponentModel.ITypeDescriptorContext,System.Collections.IDictionary)" />
        </element>
        <element api="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.GetCreateInstanceSupported">
          <element api="M:System.ComponentModel.TypeConverter.GetCreateInstanceSupported" />
          <element api="M:System.ComponentModel.TypeConverter.GetCreateInstanceSupported(System.ComponentModel.ITypeDescriptorContext)" />
        </element>
        <element api="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.GetProperties">
          <element api="M:System.ComponentModel.TypeConverter.GetProperties(System.Object)" />
          <element api="M:System.ComponentModel.TypeConverter.GetProperties(System.ComponentModel.ITypeDescriptorContext,System.Object)" />
          <element api="M:System.ComponentModel.TypeConverter.GetProperties(System.ComponentModel.ITypeDescriptorContext,System.Object,System.Attribute[])" />
        </element>
        <element api="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.GetPropertiesSupported">
          <element api="M:System.ComponentModel.TypeConverter.GetPropertiesSupported" />
          <element api="M:System.ComponentModel.TypeConverter.GetPropertiesSupported(System.ComponentModel.ITypeDescriptorContext)" />
        </element>
        <element api="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.GetStandardValues">
          <element api="M:System.ComponentModel.TypeConverter.GetStandardValues" />
          <element api="M:System.ComponentModel.TypeConverter.GetStandardValues(System.ComponentModel.ITypeDescriptorContext)" />
        </element>
        <element api="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.GetStandardValuesExclusive">
          <element api="M:System.ComponentModel.TypeConverter.GetStandardValuesExclusive" />
          <element api="M:System.ComponentModel.TypeConverter.GetStandardValuesExclusive(System.ComponentModel.ITypeDescriptorContext)" />
        </element>
        <element api="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.GetStandardValuesSupported">
          <element api="M:System.ComponentModel.TypeConverter.GetStandardValuesSupported" />
          <element api="M:System.ComponentModel.TypeConverter.GetStandardValuesSupported(System.ComponentModel.ITypeDescriptorContext)" />
        </element>
        <element api="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.IsValid">
          <element api="M:System.ComponentModel.TypeConverter.IsValid(System.Object)" />
          <element api="M:System.ComponentModel.TypeConverter.IsValid(System.ComponentModel.ITypeDescriptorContext,System.Object)" />
        </element>
      </elements>
      <containers>
        <library assembly="System.Activities" module="System.Activities" kind="DynamicallyLinkedLibrary">
          <assemblydata version="4.6.1590.0" />
        </library>
        <namespace api="N:Microsoft.VisualBasic.Activities.XamlIntegration" />
      </containers>
      <file name="599c2c08-29a0-f6a1-6bc8-b8f4e8a12c19" />
    </api>
    <api id="Methods.T:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter">
      <topicdata name="VisualBasicSettingsConverter" group="list" subgroup="Methods" typeTopicId="T:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter" />
      <apidata name="VisualBasicSettingsConverter" group="type" subgroup="class" />
      <typedata visibility="public" sealed="true" serializable="false" defaultConstructor="M:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.#ctor" />
      <elements>
        <element api="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.CanConvertFrom">
          <element api="M:System.ComponentModel.TypeConverter.CanConvertFrom(System.Type)" />
          <element api="M:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext,System.Type)" />
        </element>
        <element api="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.CanConvertTo">
          <element api="M:System.ComponentModel.TypeConverter.CanConvertTo(System.Type)" />
          <element api="M:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext,System.Type)" />
        </element>
        <element api="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.ConvertFrom">
          <element api="M:System.ComponentModel.TypeConverter.ConvertFrom(System.Object)" />
          <element api="M:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object)" />
        </element>
        <element api="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.ConvertTo">
          <element api="M:System.ComponentModel.TypeConverter.ConvertTo(System.Object,System.Type)" />
          <element api="M:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type)" />
        </element>
        <element api="M:System.Object.Equals(System.Object)" />
        <element api="M:System.Object.GetHashCode" />
        <element api="M:System.Object.GetType" />
        <element api="M:System.Object.ToString" />
        <element api="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.ConvertFromInvariantString">
          <element api="M:System.ComponentModel.TypeConverter.ConvertFromInvariantString(System.String)" />
          <element api="M:System.ComponentModel.TypeConverter.ConvertFromInvariantString(System.ComponentModel.ITypeDescriptorContext,System.String)" />
        </element>
        <element api="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.ConvertFromString">
          <element api="M:System.ComponentModel.TypeConverter.ConvertFromString(System.String)" />
          <element api="M:System.ComponentModel.TypeConverter.ConvertFromString(System.ComponentModel.ITypeDescriptorContext,System.String)" />
          <element api="M:System.ComponentModel.TypeConverter.ConvertFromString(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.String)" />
        </element>
        <element api="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.ConvertToInvariantString">
          <element api="M:System.ComponentModel.TypeConverter.ConvertToInvariantString(System.Object)" />
          <element api="M:System.ComponentModel.TypeConverter.ConvertToInvariantString(System.ComponentModel.ITypeDescriptorContext,System.Object)" />
        </element>
        <element api="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.ConvertToString">
          <element api="M:System.ComponentModel.TypeConverter.ConvertToString(System.Object)" />
          <element api="M:System.ComponentModel.TypeConverter.ConvertToString(System.ComponentModel.ITypeDescriptorContext,System.Object)" />
          <element api="M:System.ComponentModel.TypeConverter.ConvertToString(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object)" />
        </element>
        <element api="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.CreateInstance">
          <element api="M:System.ComponentModel.TypeConverter.CreateInstance(System.Collections.IDictionary)" />
          <element api="M:System.ComponentModel.TypeConverter.CreateInstance(System.ComponentModel.ITypeDescriptorContext,System.Collections.IDictionary)" />
        </element>
        <element api="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.GetCreateInstanceSupported">
          <element api="M:System.ComponentModel.TypeConverter.GetCreateInstanceSupported" />
          <element api="M:System.ComponentModel.TypeConverter.GetCreateInstanceSupported(System.ComponentModel.ITypeDescriptorContext)" />
        </element>
        <element api="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.GetProperties">
          <element api="M:System.ComponentModel.TypeConverter.GetProperties(System.Object)" />
          <element api="M:System.ComponentModel.TypeConverter.GetProperties(System.ComponentModel.ITypeDescriptorContext,System.Object)" />
          <element api="M:System.ComponentModel.TypeConverter.GetProperties(System.ComponentModel.ITypeDescriptorContext,System.Object,System.Attribute[])" />
        </element>
        <element api="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.GetPropertiesSupported">
          <element api="M:System.ComponentModel.TypeConverter.GetPropertiesSupported" />
          <element api="M:System.ComponentModel.TypeConverter.GetPropertiesSupported(System.ComponentModel.ITypeDescriptorContext)" />
        </element>
        <element api="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.GetStandardValues">
          <element api="M:System.ComponentModel.TypeConverter.GetStandardValues" />
          <element api="M:System.ComponentModel.TypeConverter.GetStandardValues(System.ComponentModel.ITypeDescriptorContext)" />
        </element>
        <element api="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.GetStandardValuesExclusive">
          <element api="M:System.ComponentModel.TypeConverter.GetStandardValuesExclusive" />
          <element api="M:System.ComponentModel.TypeConverter.GetStandardValuesExclusive(System.ComponentModel.ITypeDescriptorContext)" />
        </element>
        <element api="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.GetStandardValuesSupported">
          <element api="M:System.ComponentModel.TypeConverter.GetStandardValuesSupported" />
          <element api="M:System.ComponentModel.TypeConverter.GetStandardValuesSupported(System.ComponentModel.ITypeDescriptorContext)" />
        </element>
        <element api="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.IsValid">
          <element api="M:System.ComponentModel.TypeConverter.IsValid(System.Object)" />
          <element api="M:System.ComponentModel.TypeConverter.IsValid(System.ComponentModel.ITypeDescriptorContext,System.Object)" />
        </element>
      </elements>
      <containers>
        <library assembly="System.Activities" module="System.Activities" kind="DynamicallyLinkedLibrary">
          <assemblydata version="4.6.1590.0" />
        </library>
        <namespace api="N:Microsoft.VisualBasic.Activities.XamlIntegration" />
        <type api="T:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter" />
      </containers>
      <file name="06d0901c-2b2b-9d07-6318-9c09427ac49e" />
    </api>
    <api id="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.CanConvertFrom">
      <topicdata name="CanConvertFrom" group="list" subgroup="overload" memberSubgroup="method" pseudo="true" allMembersTopicId="" />
      <apidata name="CanConvertFrom" group="member" subgroup="method" />
      <elements>
        <element api="M:System.ComponentModel.TypeConverter.CanConvertFrom(System.Type)" />
        <element api="M:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext,System.Type)" />
      </elements>
      <containers>
        <library assembly="System.Activities" module="System.Activities" kind="DynamicallyLinkedLibrary">
          <assemblydata version="4.6.1590.0" />
        </library>
        <namespace api="N:Microsoft.VisualBasic.Activities.XamlIntegration" />
        <type api="T:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter" ref="true" />
      </containers>
      <file name="7f014967-dcd7-bd1a-594d-6e60001a71b3" />
    </api>
    <api id="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.CanConvertTo">
      <topicdata name="CanConvertTo" group="list" subgroup="overload" memberSubgroup="method" pseudo="true" allMembersTopicId="" />
      <apidata name="CanConvertTo" group="member" subgroup="method" />
      <elements>
        <element api="M:System.ComponentModel.TypeConverter.CanConvertTo(System.Type)" />
        <element api="M:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext,System.Type)" />
      </elements>
      <containers>
        <library assembly="System.Activities" module="System.Activities" kind="DynamicallyLinkedLibrary">
          <assemblydata version="4.6.1590.0" />
        </library>
        <namespace api="N:Microsoft.VisualBasic.Activities.XamlIntegration" />
        <type api="T:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter" ref="true" />
      </containers>
      <file name="5e8a95c5-527c-1eaf-1599-8b2812e3a403" />
    </api>
    <api id="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.ConvertFrom">
      <topicdata name="ConvertFrom" group="list" subgroup="overload" memberSubgroup="method" pseudo="true" allMembersTopicId="" />
      <apidata name="ConvertFrom" group="member" subgroup="method" />
      <elements>
        <element api="M:System.ComponentModel.TypeConverter.ConvertFrom(System.Object)" />
        <element api="M:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object)" />
      </elements>
      <containers>
        <library assembly="System.Activities" module="System.Activities" kind="DynamicallyLinkedLibrary">
          <assemblydata version="4.6.1590.0" />
        </library>
        <namespace api="N:Microsoft.VisualBasic.Activities.XamlIntegration" />
        <type api="T:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter" ref="true" />
      </containers>
      <file name="c7cfb96b-72a0-88cf-0f30-f6907ec2b3c1" />
    </api>
    <api id="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.ConvertTo">
      <topicdata name="ConvertTo" group="list" subgroup="overload" memberSubgroup="method" pseudo="true" allMembersTopicId="" />
      <apidata name="ConvertTo" group="member" subgroup="method" />
      <elements>
        <element api="M:System.ComponentModel.TypeConverter.ConvertTo(System.Object,System.Type)" />
        <element api="M:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type)" />
      </elements>
      <containers>
        <library assembly="System.Activities" module="System.Activities" kind="DynamicallyLinkedLibrary">
          <assemblydata version="4.6.1590.0" />
        </library>
        <namespace api="N:Microsoft.VisualBasic.Activities.XamlIntegration" />
        <type api="T:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter" ref="true" />
      </containers>
      <file name="08986305-9419-9a36-48c1-34c61c6c14bd" />
    </api>
    <api id="M:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.#ctor">
      <topicdata group="api" />
      <apidata name=".ctor" group="member" subgroup="constructor" />
      <memberdata visibility="public" special="true" />
      <containers>
        <library assembly="System.Activities" module="System.Activities" kind="DynamicallyLinkedLibrary">
          <assemblydata version="4.6.1590.0" />
        </library>
        <namespace api="N:Microsoft.VisualBasic.Activities.XamlIntegration" />
        <type api="T:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter" ref="true" />
      </containers>
      <file name="f7b6944c-85d6-ecba-3f6e-c8f7ae9cb8e7" />
    </api>
    <api id="M:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext,System.Type)">
      <topicdata group="api" />
      <apidata name="CanConvertFrom" group="member" subgroup="method" />
      <memberdata visibility="public" overload="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.CanConvertFrom" />
      <proceduredata virtual="true" />
      <overrides>
        <member api="M:System.ComponentModel.TypeConverter.CanConvertFrom(System.ComponentModel.ITypeDescriptorContext,System.Type)">
          <type api="T:System.ComponentModel.TypeConverter" ref="true" />
        </member>
      </overrides>
      <parameters>
        <parameter name="context">
          <type api="T:System.ComponentModel.ITypeDescriptorContext" ref="true" />
        </parameter>
        <parameter name="sourceType">
          <type api="T:System.Type" ref="true" />
        </parameter>
      </parameters>
      <returns>
        <type api="T:System.Boolean" ref="false" />
      </returns>
      <containers>
        <library assembly="System.Activities" module="System.Activities" kind="DynamicallyLinkedLibrary">
          <assemblydata version="4.6.1590.0" />
        </library>
        <namespace api="N:Microsoft.VisualBasic.Activities.XamlIntegration" />
        <type api="T:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter" ref="true" />
      </containers>
      <file name="8414fd53-1133-7ba6-bbee-cffa417efb23" />
    </api>
    <api id="M:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext,System.Type)">
      <topicdata group="api" />
      <apidata name="CanConvertTo" group="member" subgroup="method" />
      <memberdata visibility="public" overload="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.CanConvertTo" />
      <proceduredata virtual="true" />
      <overrides>
        <member api="M:System.ComponentModel.TypeConverter.CanConvertTo(System.ComponentModel.ITypeDescriptorContext,System.Type)">
          <type api="T:System.ComponentModel.TypeConverter" ref="true" />
        </member>
      </overrides>
      <parameters>
        <parameter name="context">
          <type api="T:System.ComponentModel.ITypeDescriptorContext" ref="true" />
        </parameter>
        <parameter name="destinationType">
          <type api="T:System.Type" ref="true" />
        </parameter>
      </parameters>
      <returns>
        <type api="T:System.Boolean" ref="false" />
      </returns>
      <containers>
        <library assembly="System.Activities" module="System.Activities" kind="DynamicallyLinkedLibrary">
          <assemblydata version="4.6.1590.0" />
        </library>
        <namespace api="N:Microsoft.VisualBasic.Activities.XamlIntegration" />
        <type api="T:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter" ref="true" />
      </containers>
      <file name="1035b22b-ceb4-dfa4-842d-aaf72d70e9d5" />
    </api>
    <api id="M:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object)">
      <topicdata group="api" />
      <apidata name="ConvertFrom" group="member" subgroup="method" />
      <memberdata visibility="public" overload="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.ConvertFrom" />
      <proceduredata virtual="true" />
      <overrides>
        <member api="M:System.ComponentModel.TypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object)">
          <type api="T:System.ComponentModel.TypeConverter" ref="true" />
        </member>
      </overrides>
      <parameters>
        <parameter name="context">
          <type api="T:System.ComponentModel.ITypeDescriptorContext" ref="true" />
        </parameter>
        <parameter name="culture">
          <type api="T:System.Globalization.CultureInfo" ref="true" />
        </parameter>
        <parameter name="value">
          <type api="T:System.Object" ref="true" />
        </parameter>
      </parameters>
      <returns>
        <type api="T:System.Object" ref="true" />
      </returns>
      <containers>
        <library assembly="System.Activities" module="System.Activities" kind="DynamicallyLinkedLibrary">
          <assemblydata version="4.6.1590.0" />
        </library>
        <namespace api="N:Microsoft.VisualBasic.Activities.XamlIntegration" />
        <type api="T:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter" ref="true" />
      </containers>
      <file name="65c6b98d-0bc8-ef98-5431-e3f2a733076b" />
    </api>
    <api id="M:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type)">
      <topicdata group="api" />
      <apidata name="ConvertTo" group="member" subgroup="method" />
      <memberdata visibility="public" overload="Overload:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter.ConvertTo" />
      <proceduredata virtual="true" />
      <overrides>
        <member api="M:System.ComponentModel.TypeConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type)">
          <type api="T:System.ComponentModel.TypeConverter" ref="true" />
        </member>
      </overrides>
      <parameters>
        <parameter name="context">
          <type api="T:System.ComponentModel.ITypeDescriptorContext" ref="true" />
        </parameter>
        <parameter name="culture">
          <type api="T:System.Globalization.CultureInfo" ref="true" />
        </parameter>
        <parameter name="value">
          <type api="T:System.Object" ref="true" />
        </parameter>
        <parameter name="destinationType">
          <type api="T:System.Type" ref="true" />
        </parameter>
      </parameters>
      <returns>
        <type api="T:System.Object" ref="true" />
      </returns>
      <containers>
        <library assembly="System.Activities" module="System.Activities" kind="DynamicallyLinkedLibrary">
          <assemblydata version="4.6.1590.0" />
        </library>
        <namespace api="N:Microsoft.VisualBasic.Activities.XamlIntegration" />
        <type api="T:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsConverter" ref="true" />
      </containers>
      <file name="364672a2-0218-c01a-dbea-97185d8d823e" />
    </api>
    <api id="T:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsValueSerializer">
      <topicdata group="api" />
      <apidata name="VisualBasicSettingsValueSerializer" group="type" subgroup="class" />
      <typedata visibility="public" sealed="true" serializable="false" defaultConstructor="M:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsValueSerializer.#ctor" />
      <family>
        <ancestors>
          <type api="T:System.Windows.Markup.ValueSerializer" ref="true" />
          <type api="T:System.Object" ref="true" />
        </ancestors>
      </family>
      <elements>
        <element api="M:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsValueSerializer.#ctor" />
        <element api="M:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsValueSerializer.CanConvertToString(System.Object,System.Windows.Markup.IValueSerializerContext)" />
        <element api="M:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsValueSerializer.ConvertToString(System.Object,System.Windows.Markup.IValueSerializerContext)" />
        <element api="M:System.Object.Equals(System.Object)" />
        <element api="M:System.Object.GetHashCode" />
        <element api="M:System.Object.GetType" />
        <element api="M:System.Object.ToString" />
        <element api="M:System.Windows.Markup.ValueSerializer.CanConvertFromString(System.String,System.Windows.Markup.IValueSerializerContext)" />
        <element api="M:System.Windows.Markup.ValueSerializer.ConvertFromString(System.String,System.Windows.Markup.IValueSerializerContext)" />
        <element api="M:System.Windows.Markup.ValueSerializer.TypeReferences(System.Object,System.Windows.Markup.IValueSerializerContext)" />
      </elements>
      <containers>
        <library assembly="System.Activities" module="System.Activities" kind="DynamicallyLinkedLibrary">
          <assemblydata version="4.6.1590.0" />
        </library>
        <namespace api="N:Microsoft.VisualBasic.Activities.XamlIntegration" />
      </containers>
      <file name="156415c6-4894-ac0e-dd7a-dbcf7f15fb70" />
    </api>
    <api id="Methods.T:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsValueSerializer">
      <topicdata name="VisualBasicSettingsValueSerializer" group="list" subgroup="Methods" typeTopicId="T:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsValueSerializer" />
      <apidata name="VisualBasicSettingsValueSerializer" group="type" subgroup="class" />
      <typedata visibility="public" sealed="true" serializable="false" defaultConstructor="M:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsValueSerializer.#ctor" />
      <elements>
        <element api="M:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsValueSerializer.CanConvertToString(System.Object,System.Windows.Markup.IValueSerializerContext)" />
        <element api="M:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsValueSerializer.ConvertToString(System.Object,System.Windows.Markup.IValueSerializerContext)" />
        <element api="M:System.Object.Equals(System.Object)" />
        <element api="M:System.Object.GetHashCode" />
        <element api="M:System.Object.GetType" />
        <element api="M:System.Object.ToString" />
        <element api="M:System.Windows.Markup.ValueSerializer.CanConvertFromString(System.String,System.Windows.Markup.IValueSerializerContext)" />
        <element api="M:System.Windows.Markup.ValueSerializer.ConvertFromString(System.String,System.Windows.Markup.IValueSerializerContext)" />
        <element api="M:System.Windows.Markup.ValueSerializer.TypeReferences(System.Object,System.Windows.Markup.IValueSerializerContext)" />
      </elements>
      <containers>
        <library assembly="System.Activities" module="System.Activities" kind="DynamicallyLinkedLibrary">
          <assemblydata version="4.6.1590.0" />
        </library>
        <namespace api="N:Microsoft.VisualBasic.Activities.XamlIntegration" />
        <type api="T:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsValueSerializer" />
      </containers>
      <file name="5949df64-77e0-3a68-4205-b8959c849daf" />
    </api>
    <api id="M:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsValueSerializer.#ctor">
      <topicdata group="api" />
      <apidata name=".ctor" group="member" subgroup="constructor" />
      <memberdata visibility="public" special="true" />
      <containers>
        <library assembly="System.Activities" module="System.Activities" kind="DynamicallyLinkedLibrary">
          <assemblydata version="4.6.1590.0" />
        </library>
        <namespace api="N:Microsoft.VisualBasic.Activities.XamlIntegration" />
        <type api="T:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsValueSerializer" ref="true" />
      </containers>
      <file name="fb18c6dc-e96b-4a2c-af37-acc5aa561b07" />
    </api>
    <api id="M:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsValueSerializer.CanConvertToString(System.Object,System.Windows.Markup.IValueSerializerContext)">
      <topicdata group="api" />
      <apidata name="CanConvertToString" group="member" subgroup="method" />
      <memberdata visibility="public" />
      <proceduredata virtual="true" />
      <overrides>
        <member api="M:System.Windows.Markup.ValueSerializer.CanConvertToString(System.Object,System.Windows.Markup.IValueSerializerContext)">
          <type api="T:System.Windows.Markup.ValueSerializer" ref="true" />
        </member>
      </overrides>
      <parameters>
        <parameter name="value">
          <type api="T:System.Object" ref="true" />
        </parameter>
        <parameter name="context">
          <type api="T:System.Windows.Markup.IValueSerializerContext" ref="true" />
        </parameter>
      </parameters>
      <returns>
        <type api="T:System.Boolean" ref="false" />
      </returns>
      <containers>
        <library assembly="System.Activities" module="System.Activities" kind="DynamicallyLinkedLibrary">
          <assemblydata version="4.6.1590.0" />
        </library>
        <namespace api="N:Microsoft.VisualBasic.Activities.XamlIntegration" />
        <type api="T:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsValueSerializer" ref="true" />
      </containers>
      <file name="eb42f1f4-db3a-2ca9-db03-9233247be2a9" />
    </api>
    <api id="M:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsValueSerializer.ConvertToString(System.Object,System.Windows.Markup.IValueSerializerContext)">
      <topicdata group="api" />
      <apidata name="ConvertToString" group="member" subgroup="method" />
      <memberdata visibility="public" />
      <proceduredata virtual="true" />
      <overrides>
        <member api="M:System.Windows.Markup.ValueSerializer.ConvertToString(System.Object,System.Windows.Markup.IValueSerializerContext)">
          <type api="T:System.Windows.Markup.ValueSerializer" ref="true" />
        </member>
      </overrides>
      <parameters>
        <parameter name="value">
          <type api="T:System.Object" ref="true" />
        </parameter>
        <parameter name="context">
          <type api="T:System.Windows.Markup.IValueSerializerContext" ref="true" />
        </parameter>
      </parameters>
      <returns>
        <type api="T:System.String" ref="true" />
      </returns>
      <containers>
        <library assembly="System.Activities" module="System.Activities" kind="DynamicallyLinkedLibrary">
          <assemblydata version="4.6.1590.0" />
        </library>
        <namespace api="N:Microsoft.VisualBasic.Activities.XamlIntegration" />
        <type api="T:Microsoft.VisualBasic.Activities.XamlIntegration.VisualBasicSettingsValueSerializer" ref="true" />
      </containers>
      <file name="0abc7185-6cc3-a1b7-56f8-de330291d5c3" />
    </api>
  </apis>
</reflection>


text:
import * as h from 'mithril/hyperscript'
import i18n from '../../i18n'
import redraw from '../../utils/redraw'
import settings from '../../settings'
import formWidgets from '../shared/form'
import { renderClaimDrawButton, renderEndedGameStatus } from '../shared/offlineRound/view'
import ground from '../shared/offlineRound/ground'
import popupWidget from '../shared/popup'
import router from '../../router'

import OtbRound from './OtbRound'

export interface OtbActionsCtrl {
  open: () => void
  close: (fromBB?: string) => void
  isOpen: () => boolean
  root: OtbRound
}

function renderAlways(ctrl: OtbRound) {
  return [
    h('div.action', formWidgets.renderCheckbox(
      i18n('Flip pieces and opponent info after move'), 'flipPieces', settings.otb.flipPieces,
        (v) => ground.changeOTBMode(ctrl.chessground, v)
    )),
    h('div.action', formWidgets.renderCheckbox(
      i18n('Use symmetric pieces'), 'useSymmetric', settings.otb.useSymmetric, redraw
    ))
  ]
}

export default {

  controller(root: OtbRound) {
    let isOpen = false

    function open() {
      router.backbutton.stack.push(close)
      isOpen = true
    }

    function close(fromBB?: string) {
      if (fromBB !== 'backbutton' && isOpen) router.backbutton.stack.pop()
      isOpen = false
    }

    return {
      open: open,
      close: close,
      isOpen: function() {
        return isOpen
      },
      root: root
    }
  },

  view: function(ctrl: OtbActionsCtrl) {
    if (ctrl.isOpen()) {
      return popupWidget(
        'offline_actions',
        undefined,
        function() {
          return [
            renderEndedGameStatus(ctrl.root)
          ].concat(
            renderClaimDrawButton(ctrl.root),
            renderAlways(ctrl.root)
          )
        },
        ctrl.isOpen(),
        ctrl.close
      )
    }

    return null
  }
}

redpajama_set_name: RedPajamaGithub


text:
process-conduit: Conduit for processes
======================================

# About

This package provides [conduit](http://hackage.haskell.org/package/conduit)
for processes.
Also this provides quasi-quoters for process using it.

# Install

~~~ {.bash}
$ cabal update
$ cabal install process-conduit
~~~

# Document

Haddock documents are here:

<http://hackage.haskell.org/package/process-conduit>

# Quasi Quoters

process-conduit has three quasi-quoters, `cmd`, `scmd` and `ccmd`.

The result type of `cmd` is Lazy `ByteString`,
but execution will perform strictly.

The result type of `scmd` and `ccmd` are
`GSource m ByteString` and
`GConduit ByteString m ByteString` respectively.

If a command is failed, an exception is thrown.

Commands are executed in ***run-time***, not compile-time.

# Examples

* Create a Source and a Conduit of process

~~~ {.haskell}
import Data.Conduit
import qualified Data.Conduit.Binary as CB
import Data.Conduit.Process
import System.IO

main :: IO ()
main = runResourceT $ do
  sourceCmd "ls" $= conduitCmd "sort" $$ CB.sinkHandle stdout
~~~

* Invoke a process simply

~~~ {.haskell}
{-# LANGUAGE QuasiQuotes #-}
import System.Process.QQ

main = print =<< [cmd|ls|]
~~~

* Conduit Quasi-Quoters

~~~ {.haskell}
main :: IO ()
main = runResourceT $ do
  [scmd|ls|] $= [ccmd|sort|] $$ CB.sinkHandle stdout
~~~

* Unquoting (syntax is same as [shakespeare-text](http://hackage.haskell.org/package/shakespeare-text))

~~~ {.haskell}
main = do
  [url] <- getArgs
  print =<< [cmd|curl #{url}|]
~~~


text:
<?php

namespace Digitick\Foundation\Collection\Exception;

class NotImplementedException extends \RuntimeException
{

}


text:
// abc_editor.js
// window.ABCJS.Editor is the interface class for the area that contains the ABC text. It is responsible for
// holding the text of the tune and calling the parser and the rendering engines.
//
// EditArea is an example of using a textarea as the control that is shown to the user. As long as
// the same interface is used, window.ABCJS.Editor can use a different type of object.
//
// EditArea:
// - constructor(textareaid)
//		This contains the id of a textarea control that will be used.
// - addSelectionListener(listener)
//		A callback class that contains the entry point fireSelectionChanged()
// - addChangeListener(listener)
//		A callback class that contains the entry point fireChanged()
// - getSelection()
//		returns the object { start: , end: } with the current selection in characters
// - setSelection(start, end)
//		start and end are the character positions that should be selected.
// - getString()
//		returns the ABC text that is currently displayed.
// - setString(str)
//		sets the ABC text that is currently displayed, and resets the initialText variable
// - getElem()
//		returns the textarea element
// - string initialText
//		Contains the starting text. This can be compared against the current text to see if anything changed.
//

/*global document, window, clearTimeout, setTimeout */
/*global Raphael */

if (!window.ABCJS)
	window.ABCJS = {};

if (!window.ABCJS.edit)
	window.ABCJS.edit = {};

window.ABCJS.edit.EditArea = function(textareaid) {
  this.textarea = document.getElementById(textareaid);
  this.initialText = this.textarea.value;
  this.isDragging = false;
}

window.ABCJS.edit.EditArea.prototype.addSelectionListener = function(listener) {
  this.textarea.onmousemove = function(ev) {
	  if (this.isDragging)
	    listener.fireSelectionChanged();
  };
};

window.ABCJS.edit.EditArea.prototype.addChangeListener = function(listener) {
  this.changelistener = listener;
  this.textarea.onkeyup = function() {
    listener.fireChanged();
  };
  this.textarea.onmousedown = function() {
	this.isDragging = true;
    listener.fireSelectionChanged();
  };
  this.textarea.onmouseup = function() {
	this.isDragging = false;
    listener.fireChanged();
  };
  this.textarea.onchange = function() {
    listener.fireChanged();
  };
};

//TODO won't work under IE?
window.ABCJS.edit.EditArea.prototype.getSelection = function() {
  return {start: this.textarea.selectionStart, end: this.textarea.selectionEnd};
};

window.ABCJS.edit.EditArea.prototype.setSelection = function(start, end) {
	if(this.textarea.setSelectionRange)
	   this.textarea.setSelectionRange(start, end);
	else if(this.textarea.createTextRange) {
		// For IE8
	   var e = this.textarea.createTextRange();
	   e.collapse(true);
	   e.moveEnd('character', end);
	   e.moveStart('character', start);
	   e.select();
	}
  this.textarea.focus();
};

window.ABCJS.edit.EditArea.prototype.getString = function() {
  return this.textarea.value;
};

window.ABCJS.edit.EditArea.prototype.setString = function(str) {
  this.textarea.value = str;
  this.initialText = this.getString();
  if (this.changelistener) {
    this.changelistener.fireChanged();
  }
};

window.ABCJS.edit.EditArea.prototype.getElem = function() {
  return this.textarea;
};

//
// window.ABCJS.Editor:
//
// constructor(editarea, params)
//		if editarea is a string, then it is an HTML id of a textarea control.
//		Otherwise, it should be an instantiation of an object that expresses the EditArea interface.
//
//		params is a hash of:
//		canvas_id: or paper_id: HTML id to draw in. If not present, then the drawing happens just below the editor.
//		generate_midi: if present, then midi is generated.
//		midi_id: if present, the HTML id to place the midi control. Otherwise it is placed in the same div as the paper.
//		midi_download_id: if present, the HTML id to place the midi download link. Otherwise it is placed in the same div as the paper.
//		generate_warnings: if present, then parser warnings are displayed on the page.
//		warnings_id: if present, the HTML id to place the warnings. Otherwise they are placed in the same div as the paper.
//		onchange: if present, the callback function to call whenever there has been a change.
//		gui: if present, the paper can send changes back to the editor (presumably because the user changed something directly.)
//		parser_options: options to send to the parser engine.
//		midi_options: options to send to the midi engine.
//		render_options: options to send to the render engine.
//		indicate_changed: the dirty flag is set if this is true.
//
// - setReadOnly(bool)
//		adds or removes the class abc_textarea_readonly, and adds or removes the attribute readonly=yes
// - setDirtyStyle(bool)
//		adds or removes the class abc_textarea_dirty
// - renderTune(abc, parserparams, div)
//		Immediately renders the tune. (Useful for creating the SVG output behind the scenes, if div is hidden)
//		string abc: the ABC text
//		parserparams: params to send to the parser
//		div: the HTML id to render to.
// - modelChanged()
//		Called when the model has been changed to trigger re-rendering
// - parseABC()
//		Called internally by fireChanged()
//		returns true if there has been a change since last call.
// - updateSelection()
//		Called when the user has changed the selection. This calls the engraver_controller to show the selection.
// - fireSelectionChanged()
//		Called by the textarea object when the user has changed the selection.
// - paramChanged(engraverparams)
//		Called to signal that the engraver params have changed, so re-rendering should occur.
// - fireChanged()
//		Called by the textarea object when the user has changed something.
// - setNotDirty()
//		Called by the client app to reset the dirty flag
// - isDirty()
//		Returns true or false, whether the textarea contains the same text that it started with.
// - highlight(abcelem)
//		Called by the engraver_controller to highlight an area.
// - pause(bool)
//		Stops the automatic rendering when the user is typing.
//

window.ABCJS.Editor = function(editarea, params) {
	if (params.indicate_changed)
		this.indicate_changed = true;
  if (typeof editarea === "string") {
    this.editarea = new window.ABCJS.edit.EditArea(editarea);
  } else {
    this.editarea = editarea;
  }
  this.editarea.addSelectionListener(this);
  this.editarea.addChangeListener(this);

  if (params.canvas_id) {
    this.div = document.getElementById(params.canvas_id);
  } else if (params.paper_id) {
    this.div = document.getElementById(params.paper_id);
  } else {
    this.div = document.createElement("DIV");
    this.editarea.getElem().parentNode.insertBefore(this.div, this.editarea.getElem());
  }

	// If the user wants midi, then store the elements that it will be written to. The element could either be passed in as an id,
	// an element, or nothing. If nothing is passed in, then just put the midi on top of the generated music.
	if (params.generate_midi) {
		this.midiParams = params.midi_options || {};
		if (this.midiParams.generateDownload) {
			if (typeof params.midi_download_id === 'string')
				this.downloadMidi = document.getElementById(params.midi_download_id);
			else if (params.midi_download_id) // assume, if the var is not a string it is an element. If not, it will crash soon enough.
				this.downloadMidi = params.midi_download_id;
		}
		if (this.midiParams.generateInline !== false) { // The default for this is true, so undefined is also true.
			if (typeof params.midi_id === 'string')
				this.inlineMidi = document.getElementById(params.midi_id);
			else if (params.midi_id) // assume, if the var is not a string it is an element. If not, it will crash soon enough.
				this.inlineMidi = params.midi_id;
		}
	}

  if (params.generate_warnings || params.warnings_id) {
    if (params.warnings_id) {
      this.warningsdiv = document.getElementById(params.warnings_id);
    } else {
      this.warningsdiv = this.div;
    }
  }

  this.parserparams = params.parser_options || {};
  this.onchangeCallback = params.onchange;

  this.engraverparams = params.render_options || {};

  if (params.gui) {
    this.target = document.getElementById(editarea);
    this.engraverparams.editable = true;
  }
  this.oldt = "";
  this.bReentry = false;
  this.parseABC();
  this.modelChanged();

  this.addClassName = function(element, className) {
    var hasClassName = function(element, className) {
      var elementClassName = element.className;
      return (elementClassName.length > 0 && (elementClassName === className ||
        new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)));
    };

    if (!hasClassName(element, className))
      element.className += (element.className ? ' ' : '') + className;
    return element;
  };

  this.removeClassName = function(element, className) {
    element.className = window.ABCJS.parse.strip(element.className.replace(
      new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' '));
    return element;
  };

  this.setReadOnly = function(readOnly) {
	  var readonlyClass = 'abc_textarea_readonly';
	  var el = this.editarea.getElem();
    if (readOnly) {
      el.setAttribute('readonly', 'yes');
	  this.addClassName(el, readonlyClass);
	} else {
      el.removeAttribute('readonly');
	  this.removeClassName(el, readonlyClass);
    }
  };
};

window.ABCJS.Editor.prototype.renderTune = function(abc, params, div) {
  var tunebook = new ABCJS.TuneBook(abc);
  var abcParser = window.ABCJS.parse.Parse();
  abcParser.parse(tunebook.tunes[0].abc, params); //TODO handle multiple tunes
  var tune = abcParser.getTune();
  var paper = Raphael(div, 800, 400);
  var engraver_controller = new ABCJS.write.EngraverController(paper, this.engraverparams);
  engraver_controller.engraveABC(tune);
};

window.ABCJS.Editor.prototype.modelChanged = function() {
  if (this.tunes === undefined) {
    if (this.downloadMidi !== undefined)
		this.downloadMidi.innerHTML = "";
    if (this.inlineMidi !== undefined)
		this.inlineMidi.innerHTML = "";
    this.div.innerHTML = "";
	return;
  }

  if (this.bReentry)
    return; // TODO is this likely? maybe, if we rewrite abc immediately w/ abc2abc
  this.bReentry = true;
  this.timerId = null;
  this.div.innerHTML = "";
  var paper = Raphael(this.div, 800, 400);
  this.engraver_controller = new ABCJS.write.EngraverController(paper, this.engraverparams);
  this.engraver_controller.engraveABC(this.tunes);
	this.tunes[0].engraver = this.engraver_controller;	// TODO-PER: We actually want an output object for each tune, not the entire controller. When refactoring, don't save data in the controller.
	var downloadMidiHtml = "";
	var inlineMidiHtml = "";
	if (this.midiParams && !this.midiPause) {
		for (var i = 0; i < this.tunes.length; i++) {
			var midi = window.ABCJS.midi.create(this.tunes[i], this.midiParams);

			if (this.midiParams.generateInline && this.midiParams.generateDownload) {
				downloadMidiHtml += window.ABCJS.midi.generateMidiDownloadLink(this.tunes[i], this.midiParams, midi.download, i);
				inlineMidiHtml += window.ABCJS.midi.generateMidiControls(this.tunes[i], this.midiParams, midi.inline, i);
			} else if (this.midiParams.generateInline)
				inlineMidiHtml += window.ABCJS.midi.generateMidiControls(this.tunes[i], this.midiParams, midi, i);
			else
				downloadMidiHtml += window.ABCJS.midi.generateMidiDownloadLink(this.tunes[i], this.midiParams, midi, i);
		}
		if (this.midiParams.generateDownload) {
			if (this.downloadMidi)
				this.downloadMidi.innerHTML = downloadMidiHtml;
			else
				this.div.innerHTML += downloadMidiHtml;
		}
		var find = function(element, cls) {
			var els = element.getElementsByClassName(cls);
			if (els.length === 0)
				return null;
			return els[0];
		};
		if (this.midiParams.generateInline) {
			var inlineDiv;
			if (this.inlineMidi) {
				this.inlineMidi.innerHTML = inlineMidiHtml;
				inlineDiv = this.inlineMidi;
			} else {
				this.div.innerHTML += inlineMidiHtml;
				inlineDiv = this.div;
			}
			if (this.midiParams.animate || this.midiParams.listener) {
				for (i = 0; i < this.tunes.length; i++) {
					var parent = find(inlineDiv, "abcjs-midi-" + i);
					parent.abcjsTune = this.tunes[i];
					parent.abcjsListener = this.midiParams.listener;
					parent.abcjsAnimate = this.midiParams.animate;
				}
			}
		}
	}
  if (this.warningsdiv) {
    this.warningsdiv.innerHTML = (this.warnings) ? this.warnings.join("<br />") : "No errors";
  }
  if (this.target) {
    var textprinter = new window.ABCJS.transform.TextPrinter(this.target, true);
    textprinter.printABC(this.tunes[0]); //TODO handle multiple tunes
  }
  this.engraver_controller.addSelectListener(this);
  this.updateSelection();
  this.bReentry = false;
};

// Call this to reparse in response to the printing parameters changing
window.ABCJS.Editor.prototype.paramChanged = function(engraverparams) {
	this.engraverparams = engraverparams;
	this.oldt = "";
	this.fireChanged();
};

// return true if the model has changed
window.ABCJS.Editor.prototype.parseABC = function() {
  var t = this.editarea.getString();
  if (t===this.oldt) {
    this.updateSelection();
    return false;
  }

  this.oldt = t;
  if (t === "") {
	this.tunes = undefined;
	this.warnings = "";
	return true;
  }
  var tunebook = new ABCJS.TuneBook(t);

  this.tunes = [];
  this.startPos = [];
  this.warnings = [];
  for (var i=0; i<tunebook.tunes.length; i++) {
    var abcParser = new window.ABCJS.parse.Parse();
    abcParser.parse(tunebook.tunes[i].abc, this.parserparams);
    this.tunes[i] = abcParser.getTune();
	  this.startPos[i] = tunebook.tunes[i].startPos;
    var warnings = abcParser.getWarnings() || [];
    for (var j=0; j<warnings.length; j++) {
      this.warnings.push(warnings[j]);
    }
  }
  return true;
};

window.ABCJS.Editor.prototype.updateSelection = function() {
  var selection = this.editarea.getSelection();
  try {
    this.engraver_controller.rangeHighlight(selection.start, selection.end);
  } catch (e) {} // maybe printer isn't defined yet?
};

window.ABCJS.Editor.prototype.fireSelectionChanged = function() {
  this.updateSelection();
};

window.ABCJS.Editor.prototype.setDirtyStyle = function(isDirty) {
	if (this.indicate_changed === undefined)
		return;
  var addClassName = function(element, className) {
    var hasClassName = function(element, className) {
      var elementClassName = element.className;
      return (elementClassName.length > 0 && (elementClassName === className ||
        new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)));
    };

    if (!hasClassName(element, className))
      element.className += (element.className ? ' ' : '') + className;
    return element;
  };

  var removeClassName = function(element, className) {
    element.className = window.ABCJS.parse.strip(element.className.replace(
      new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' '));
    return element;
  };

	var readonlyClass = 'abc_textarea_dirty';
	var el = this.editarea.getElem();
	if (isDirty) {
		addClassName(el, readonlyClass);
	} else {
		removeClassName(el, readonlyClass);
    }
};

// call when abc text is changed and needs re-parsing
window.ABCJS.Editor.prototype.fireChanged = function() {
  if (this.bIsPaused)
    return;
  if (this.parseABC()) {
    var self = this;
    if (this.timerId)	// If the user is still typing, cancel the update
      clearTimeout(this.timerId);
    this.timerId = setTimeout(function () {
      self.modelChanged();
    }, 300);	// Is this a good comprimise between responsiveness and not redrawing too much?
	  var isDirty = this.isDirty();
	  if (this.wasDirty !== isDirty) {
		  this.wasDirty = isDirty;
		  this.setDirtyStyle(isDirty);
	  }
	  if (this.onchangeCallback)
		  this.onchangeCallback(this);
	  }
};

window.ABCJS.Editor.prototype.setNotDirty = function() {
	this.editarea.initialText = this.editarea.getString();
	this.wasDirty = false;
	this.setDirtyStyle(false);
};

window.ABCJS.Editor.prototype.isDirty = function() {
	if (this.indicate_changed === undefined)
		return false;
	return this.editarea.initialText !== this.editarea.getString();
};

window.ABCJS.Editor.prototype.highlight = function(abcelem, tuneNumber) {
	// TODO-PER: The marker appears to get off by one for each tune parsed. I'm not sure why, but adding the tuneNumber in corrects it for the time being.
	var offset = (tuneNumber !== undefined) ? this.startPos[tuneNumber] + tuneNumber : 0;

  this.editarea.setSelection(offset + abcelem.startChar, offset + abcelem.endChar);
};

window.ABCJS.Editor.prototype.pause = function(shouldPause) {
	this.bIsPaused = shouldPause;
	if (!shouldPause)
		this.fireChanged();
};

window.ABCJS.Editor.prototype.pauseMidi = function(shouldPause) {
	this.midiPause = shouldPause;
};


text:
title: 'High-performance javascript library for animations & interfaces | Famous.org'
author: azu
layout: post
itemUrl: 'http://famous.org/'
editJSONPath: 'https://github.com/jser/jser.info/edit/gh-pages/data/2015/05/index.json'
date: '2015-05-24T15:23:08+00:00'
tags:
  - JavaScript
  - animation
  - library
  - WebGL
---
アニメーションライブラリであるFamousがリニューアル公開された


text:
var canvas = new fabric.StaticCanvas('calendar'),
    now = moment(),
    start = now.clone().subtract(3, 'years'),
    end = now.clone().add(3, 'years'),
    current = start.clone(),
    gutterWidth = 45,
    diff;

// Loop through each version, marking their timelines
var y = -10;
for (var i = 0; i < window.versions.length; i++) {
    if (window.versions[i].releaseDate == null) {
        continue;
    }

    y = y + 40;

    // Active Support
    var releaseDate = window.versions[i].releaseDate.clone(),
        activeEnd;

    if (window.versions[i].isLTS) {
        activeEnd = releaseDate.clone().add(2, 'years');
    } else {
        activeEnd = releaseDate.clone().add(6, 'months');
    }

    canvas.add(new fabric.Rect({
        left: (releaseDate.diff(start, 'days') / 2) + gutterWidth,
        width: (activeEnd.diff(releaseDate, 'days') / 2),
        fill: '#27ae60',
        top: y,
        height: 20
    }));

    // Security support
    var securityStart = activeEnd.clone(),
        securityEnd;

    if (window.versions[i].isLTS) {
        securityEnd = securityStart.clone().add(1, 'years');
    } else {
        securityEnd = securityStart.clone().add(6, 'months');
    }

    canvas.add(new fabric.Rect({
        left: (securityStart.diff(start, 'days') / 2) + gutterWidth,
        width: (securityEnd.diff(securityStart, 'days') / 2),
        fill: '#e67e22',
        top: y,
        height: 20
    }));
}

// White rectangle background for gutter to hide bars clipping through
canvas.add(new fabric.Rect({
    left: -1,
    width: gutterWidth + 1,
    height: canvas.height,
    fill: 'white'
}));

// Mark each version
var y = -10;
for (var i = 0; i < window.versions.length; i++) {
    if (window.versions[i].releaseDate == null) {
        continue;
    }

    y = y + 40;

    canvas.add(new fabric.Text(window.versions[i].version, {
        fontFamily: 'Helvetica',
        fontSize: 20,
        textAlign: 'left',
        left: 0,
        top: y
    }));
}
canvas.add(new fabric.Line([
    gutterWidth,
    30,
    gutterWidth,
    y + 40
], {
    fill: 'black',
    stroke: 'black'
}));

// Timeline Markers
while(current < end) {
    current = current.add(1, 'year').startOf('year');
    diff = (current.diff(start, 'days') / 2) + gutterWidth;

    canvas.add(new fabric.Rect({
        left: diff,
        top: 25,
        fill: 'black',
        width: 1,
        height: canvas.height
    }));
    canvas.add(new fabric.Text(current.format('D MMM YYYY'), {
        fontFamily: 'Helvetica',
        fontSize: 20,
        textAlign: 'center',
        left: diff - 50,
        top: 0
    }));
}

// Mark Now
canvas.add(new fabric.Rect({
    left: (now.diff(start, 'days') / 2) + 90 - 1,
    top: 25,
    fill: '#c0392b',
    width: 2,
    height: canvas.height
}));


text:
using LibrarySystem.Framework.Contracts;
using LibrarySystem.Framework.Exceptions;

using Moq;
using NUnit.Framework;

namespace LibrarySystem.Framework.UnitTests.EngineTests
{
    [TestFixture]
    public class Start_Should
    {
        [Test]
        [Category("Framework.Engine.Start")]
        public void CallCommandReaderReadLineExactlyOnce_WhenTerminateCommandIsProvided()
        {
            // Arrange
            var commandReaderMock = new Mock<ICommandReader>();
            var responseWriterStub = new Mock<IResponseWriter>();
            var commandProccessorStub = new Mock<ICommandProcessor>();
            var loggerStub = new Mock<ILogger>();

            var engineUnderTest = new Engine(commandReaderMock.Object, responseWriterStub.Object, commandProccessorStub.Object, loggerStub.Object);

            string terminateCommand = "Exit";

            commandReaderMock.Setup(c => c.ReadLine()).Returns(terminateCommand);

            // Act
            engineUnderTest.Start();

            // Assert
            commandReaderMock.Verify(c => c.ReadLine(), Times.Once);
        }

        [Test]
        [Category("Framework.Engine.Start")]
        public void DoesNotCallCommandProcessorProcessCommand_WhenOnlyTerminateCommandIsProvided()
        {
            // Arrange
            var commandReaderStub = new Mock<ICommandReader>();
            var responseWriterStub = new Mock<IResponseWriter>();
            var commandProccessorMock = new Mock<ICommandProcessor>();
            var loggerStub = new Mock<ILogger>();

            var engineUnderTest = new Engine(commandReaderStub.Object, responseWriterStub.Object, commandProccessorMock.Object, loggerStub.Object);

            string terminateCommand = "Exit";

            commandReaderStub.Setup(c => c.ReadLine()).Returns(terminateCommand);

            // Act
            engineUnderTest.Start();

            // Assert
            commandProccessorMock.Verify(r => r.ProcessCommand(It.IsAny<string>()), Times.Never);
        }

        [Test]
        [Category("Framework.Engine.Start")]
        public void CallCommandReaderReadLineExactlyTwice_WhenTerminateCommandIsProvidedAfterASingleOtherCommand()
        {
            // Arrange
            var commandReaderMock = new Mock<ICommandReader>();
            var responseWriterStub = new Mock<IResponseWriter>();
            var commandProccessorStub = new Mock<ICommandProcessor>();
            var loggerStub = new Mock<ILogger>();

            var engineUnderTest = new Engine(commandReaderMock.Object, responseWriterStub.Object, commandProccessorStub.Object, loggerStub.Object);

            string singleOtherCommand = "SomeRandomCommand";
            string terminateCommand = "Exit";

            commandReaderMock.SetupSequence(c => c.ReadLine()).Returns(singleOtherCommand).Returns(terminateCommand);

            // Act
            engineUnderTest.Start();

            // Assert
            commandReaderMock.Verify(c => c.ReadLine(), Times.Exactly(2));
        }

        [Test]
        [Category("Framework.Engine.Start")]
        public void CallCommandProcessorProcessCommandExactlyOnceWithExpectedCommand_WhenTerminateCommandIsProvidedAfterTheExpectedCommand()
        {
            // Arrange
            var commandReaderStub = new Mock<ICommandReader>();
            var responseWriterStub = new Mock<IResponseWriter>();
            var commandProccessorMock = new Mock<ICommandProcessor>();
            var loggerStub = new Mock<ILogger>();

            var engineUnderTest = new Engine(commandReaderStub.Object, responseWriterStub.Object, commandProccessorMock.Object, loggerStub.Object);

            string expectedCommand = "SomeRandomCommand";
            string terminateCommand = "Exit";

            commandReaderStub.SetupSequence(c => c.ReadLine()).Returns(expectedCommand).Returns(terminateCommand);

            // Act
            engineUnderTest.Start();

            // Assert
            commandProccessorMock.Verify(c => c.ProcessCommand(expectedCommand), Times.Once);
        }

        [Test]
        [Category("Framework.Engine.Start")]
        public void CallResponseWriterWriteLineExactlyOnceWithTerminateMessage_WhenOnlyTerminateCommandIsProvided()
        {
            // Arrange
            var commandReaderStub = new Mock<ICommandReader>();
            var responseWriterMock = new Mock<IResponseWriter>();
            var commandProccessorStub = new Mock<ICommandProcessor>();
            var loggerStub = new Mock<ILogger>();

            var engineUnderTest = new Engine(commandReaderStub.Object, responseWriterMock.Object, commandProccessorStub.Object, loggerStub.Object);

            string terminateCommand = "Exit";

            commandReaderStub.Setup(c => c.ReadLine()).Returns(terminateCommand);

            string terminateMessage = "Program terminated.";

            // Act
            engineUnderTest.Start();

            // Assert
            responseWriterMock.Verify(r => r.WriteLine(terminateMessage), Times.Once);
        }

        [Test]
        [Category("Framework.Engine.Start")]
        public void CallResponseWriterWriteLineExactlyOnceWithTerminateMessage_WhenTerminateCommandIsProvidedAfterASingleOtherCommand()
        {
            // Arrange
            var commandReaderStub = new Mock<ICommandReader>();
            var responseWriterMock = new Mock<IResponseWriter>();
            var commandProccessorStub = new Mock<ICommandProcessor>();
            var loggerStub = new Mock<ILogger>();

            var engineUnderTest = new Engine(commandReaderStub.Object, responseWriterMock.Object, commandProccessorStub.Object, loggerStub.Object);

            string singleOtherCommand = "SomeRandomCommand";
            string terminateCommand = "Exit";

            commandReaderStub.SetupSequence(c => c.ReadLine()).Returns(singleOtherCommand).Returns(terminateCommand);

            string expectedResponse = "SomeRandomResponse";

            commandProccessorStub.Setup(c => c.ProcessCommand(It.IsAny<string>())).Returns(expectedResponse);

            string terminateMessage = "Program terminated.";

            // Act
            engineUnderTest.Start();

            // Assert
            responseWriterMock.Verify(r => r.WriteLine(terminateMessage), Times.Once);
        }

        [Test]
        [Category("Framework.Engine.Start")]
        public void CallResponseWriterWriteLineExactlyOnceWithExpectedResponse_WhenTerminateCommandIsProvidedAfterASingleOtherCommand()
        {
            // Arrange
            var commandReaderStub = new Mock<ICommandReader>();
            var responseWriterMock = new Mock<IResponseWriter>();
            var commandProccessorStub = new Mock<ICommandProcessor>();
            var loggerStub = new Mock<ILogger>();

            var engineUnderTest = new Engine(commandReaderStub.Object, responseWriterMock.Object, commandProccessorStub.Object, loggerStub.Object);

            string singleOtherCommand = "SomeRandomCommand";
            string terminateCommand = "Exit";

            commandReaderStub.SetupSequence(c => c.ReadLine()).Returns(singleOtherCommand).Returns(terminateCommand);

            string expectedResponse = "SomeRandomResponse";

            commandProccessorStub.Setup(c => c.ProcessCommand(It.IsAny<string>())).Returns(expectedResponse);

            // Act
            engineUnderTest.Start();

            // Assert
            responseWriterMock.Verify(r => r.WriteLine(It.Is<string>(s => s.Contains(expectedResponse))), Times.Once);
        }

        [Test]
        [Category("Framework.Engine.Start")]
        public void CallResponseWriterWriteLineExactlyOnceWithExactMessage_WhenInvalidCommandExceptionOccurred()
        {
            // Arrange
            var commandReaderStub = new Mock<ICommandReader>();
            var responseWriterMock = new Mock<IResponseWriter>();
            var commandProccessorStub = new Mock<ICommandProcessor>();
            var loggerStub = new Mock<ILogger>();

            var engineUnderTest = new Engine(commandReaderStub.Object, responseWriterMock.Object, commandProccessorStub.Object, loggerStub.Object);

            string singleOtherCommand = "SomeRandomCommand";
            string terminateCommand = "Exit";

            commandReaderStub.SetupSequence(c => c.ReadLine()).Returns(singleOtherCommand).Returns(terminateCommand);

            string exceptionMessage = "Invalid command! Please try again.";

            commandProccessorStub.Setup(c => c.ProcessCommand(It.IsAny<string>())).Throws(new InvalidCommandException(exceptionMessage));

            // Act
            engineUnderTest.Start();

            // Assert
            responseWriterMock.Verify(r => r.WriteLine(It.Is<string>(s => s.Contains(exceptionMessage))), Times.Once);
        }
    }
}


text:
/*************************************************************************/
/*  button.cpp                                                           */
/*************************************************************************/
/*                       This file is part of:                           */
/*                           GODOT ENGINE                                */
/*                      https://godotengine.org                          */
/*************************************************************************/
/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */
/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md).   */
/*                                                                       */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the       */
/* "Software"), to deal in the Software without restriction, including   */
/* without limitation the rights to use, copy, modify, merge, publish,   */
/* distribute, sublicense, and/or sell copies of the Software, and to    */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions:                                             */
/*                                                                       */
/* The above copyright notice and this permission notice shall be        */
/* included in all copies or substantial portions of the Software.       */
/*                                                                       */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
/*************************************************************************/

#include "button.h"

#include "core/string/translation.h"
#include "servers/rendering_server.h"

Size2 Button::get_minimum_size() const {
	Ref<Texture2D> _icon = icon;
	if (_icon.is_null() && has_theme_icon(SNAME("icon"))) {
		_icon = Control::get_theme_icon(SNAME("icon"));
	}

	return get_minimum_size_for_text_and_icon("", _icon);
}

void Button::_set_internal_margin(Side p_side, float p_value) {
	_internal_margin[p_side] = p_value;
}

void Button::_notification(int p_what) {
	switch (p_what) {
		case NOTIFICATION_LAYOUT_DIRECTION_CHANGED: {
			update();
		} break;

		case NOTIFICATION_TRANSLATION_CHANGED: {
			xl_text = atr(text);
			_shape();

			update_minimum_size();
			update();
		} break;

		case NOTIFICATION_THEME_CHANGED: {
			_shape();

			update_minimum_size();
			update();
		} break;

		case NOTIFICATION_DRAW: {
			RID ci = get_canvas_item();
			Size2 size = get_size();
			Color color;
			Color color_icon(1, 1, 1, 1);

			Ref<StyleBox> style = get_theme_stylebox(SNAME("normal"));
			bool rtl = is_layout_rtl();

			switch (get_draw_mode()) {
				case DRAW_NORMAL: {
					if (rtl && has_theme_stylebox(SNAME("normal_mirrored"))) {
						style = get_theme_stylebox(SNAME("normal_mirrored"));
					} else {
						style = get_theme_stylebox(SNAME("normal"));
					}

					if (!flat) {
						style->draw(ci, Rect2(Point2(0, 0), size));
					}

					// Focus colors only take precedence over normal state.
					if (has_focus()) {
						color = get_theme_color(SNAME("font_focus_color"));
						if (has_theme_color(SNAME("icon_focus_color"))) {
							color_icon = get_theme_color(SNAME("icon_focus_color"));
						}
					} else {
						color = get_theme_color(SNAME("font_color"));
						if (has_theme_color(SNAME("icon_normal_color"))) {
							color_icon = get_theme_color(SNAME("icon_normal_color"));
						}
					}
				} break;
				case DRAW_HOVER_PRESSED: {
					// Edge case for CheckButton and CheckBox.
					if (has_theme_stylebox("hover_pressed")) {
						if (rtl && has_theme_stylebox(SNAME("hover_pressed_mirrored"))) {
							style = get_theme_stylebox(SNAME("hover_pressed_mirrored"));
						} else {
							style = get_theme_stylebox(SNAME("hover_pressed"));
						}

						if (!flat) {
							style->draw(ci, Rect2(Point2(0, 0), size));
						}
						if (has_theme_color(SNAME("font_hover_pressed_color"))) {
							color = get_theme_color(SNAME("font_hover_pressed_color"));
						}
						if (has_theme_color(SNAME("icon_hover_pressed_color"))) {
							color_icon = get_theme_color(SNAME("icon_hover_pressed_color"));
						}

						break;
					}
					[[fallthrough]];
				}
				case DRAW_PRESSED: {
					if (rtl && has_theme_stylebox(SNAME("pressed_mirrored"))) {
						style = get_theme_stylebox(SNAME("pressed_mirrored"));
					} else {
						style = get_theme_stylebox(SNAME("pressed"));
					}

					if (!flat) {
						style->draw(ci, Rect2(Point2(0, 0), size));
					}
					if (has_theme_color(SNAME("font_pressed_color"))) {
						color = get_theme_color(SNAME("font_pressed_color"));
					} else {
						color = get_theme_color(SNAME("font_color"));
					}
					if (has_theme_color(SNAME("icon_pressed_color"))) {
						color_icon = get_theme_color(SNAME("icon_pressed_color"));
					}

				} break;
				case DRAW_HOVER: {
					if (rtl && has_theme_stylebox(SNAME("hover_mirrored"))) {
						style = get_theme_stylebox(SNAME("hover_mirrored"));
					} else {
						style = get_theme_stylebox(SNAME("hover"));
					}

					if (!flat) {
						style->draw(ci, Rect2(Point2(0, 0), size));
					}
					color = get_theme_color(SNAME("font_hover_color"));
					if (has_theme_color(SNAME("icon_hover_color"))) {
						color_icon = get_theme_color(SNAME("icon_hover_color"));
					}

				} break;
				case DRAW_DISABLED: {
					if (rtl && has_theme_stylebox(SNAME("disabled_mirrored"))) {
						style = get_theme_stylebox(SNAME("disabled_mirrored"));
					} else {
						style = get_theme_stylebox(SNAME("disabled"));
					}

					if (!flat) {
						style->draw(ci, Rect2(Point2(0, 0), size));
					}
					color = get_theme_color(SNAME("font_disabled_color"));
					if (has_theme_color(SNAME("icon_disabled_color"))) {
						color_icon = get_theme_color(SNAME("icon_disabled_color"));
					} else {
						color_icon.a = 0.4;
					}

				} break;
			}

			if (has_focus()) {
				Ref<StyleBox> style2 = get_theme_stylebox(SNAME("focus"));
				style2->draw(ci, Rect2(Point2(), size));
			}

			Ref<Texture2D> _icon;
			if (icon.is_null() && has_theme_icon(SNAME("icon"))) {
				_icon = Control::get_theme_icon(SNAME("icon"));
			} else {
				_icon = icon;
			}

			Rect2 icon_region = Rect2();
			HorizontalAlignment icon_align_rtl_checked = icon_alignment;
			HorizontalAlignment align_rtl_checked = alignment;
			// Swap icon and text alignment sides if right-to-left layout is set.
			if (rtl) {
				if (icon_alignment == HORIZONTAL_ALIGNMENT_RIGHT) {
					icon_align_rtl_checked = HORIZONTAL_ALIGNMENT_LEFT;
				} else if (icon_alignment == HORIZONTAL_ALIGNMENT_LEFT) {
					icon_align_rtl_checked = HORIZONTAL_ALIGNMENT_RIGHT;
				}
				if (alignment == HORIZONTAL_ALIGNMENT_RIGHT) {
					align_rtl_checked = HORIZONTAL_ALIGNMENT_LEFT;
				} else if (alignment == HORIZONTAL_ALIGNMENT_LEFT) {
					align_rtl_checked = HORIZONTAL_ALIGNMENT_RIGHT;
				}
			}
			if (!_icon.is_null()) {
				int valign = size.height - style->get_minimum_size().y;

				float icon_ofs_region = 0.0;
				Point2 style_offset;
				Size2 icon_size = _icon->get_size();
				if (icon_align_rtl_checked == HORIZONTAL_ALIGNMENT_LEFT) {
					style_offset.x = style->get_margin(SIDE_LEFT);
					if (_internal_margin[SIDE_LEFT] > 0) {
						icon_ofs_region = _internal_margin[SIDE_LEFT] + get_theme_constant(SNAME("h_separation"));
					}
				} else if (icon_align_rtl_checked == HORIZONTAL_ALIGNMENT_CENTER) {
					style_offset.x = 0.0;
				} else if (icon_align_rtl_checked == HORIZONTAL_ALIGNMENT_RIGHT) {
					style_offset.x = -style->get_margin(SIDE_RIGHT);
					if (_internal_margin[SIDE_RIGHT] > 0) {
						icon_ofs_region = -_internal_margin[SIDE_RIGHT] - get_theme_constant(SNAME("h_separation"));
					}
				}
				style_offset.y = style->get_margin(SIDE_TOP);

				if (expand_icon) {
					Size2 _size = get_size() - style->get_offset() * 2;
					int icon_text_separation = text.is_empty() ? 0 : get_theme_constant(SNAME("h_separation"));
					_size.width -= icon_text_separation + icon_ofs_region;
					if (!clip_text && icon_align_rtl_checked != HORIZONTAL_ALIGNMENT_CENTER) {
						_size.width -= text_buf->get_size().width;
					}
					float icon_width = _icon->get_width() * _size.height / _icon->get_height();
					float icon_height = _size.height;

					if (icon_width > _size.width) {
						icon_width = _size.width;
						icon_height = _icon->get_height() * icon_width / _icon->get_width();
					}

					icon_size = Size2(icon_width, icon_height);
				}

				if (icon_align_rtl_checked == HORIZONTAL_ALIGNMENT_LEFT) {
					icon_region = Rect2(style_offset + Point2(icon_ofs_region, Math::floor((valign - icon_size.y) * 0.5)), icon_size);
				} else if (icon_align_rtl_checked == HORIZONTAL_ALIGNMENT_CENTER) {
					icon_region = Rect2(style_offset + Point2(icon_ofs_region + Math::floor((size.x - icon_size.x) * 0.5), Math::floor((valign - icon_size.y) * 0.5)), icon_size);
				} else {
					icon_region = Rect2(style_offset + Point2(icon_ofs_region + size.x - icon_size.x, Math::floor((valign - icon_size.y) * 0.5)), icon_size);
				}

				if (icon_region.size.width > 0) {
					Rect2 icon_region_rounded = Rect2(icon_region.position.round(), icon_region.size.round());
					draw_texture_rect(_icon, icon_region_rounded, false, color_icon);
				}
			}

			Point2 icon_ofs = !_icon.is_null() ? Point2(icon_region.size.width + get_theme_constant(SNAME("h_separation")), 0) : Point2();
			if (align_rtl_checked == HORIZONTAL_ALIGNMENT_CENTER && icon_align_rtl_checked == HORIZONTAL_ALIGNMENT_CENTER) {
				icon_ofs.x = 0.0;
			}
			int text_clip = size.width - style->get_minimum_size().width - icon_ofs.width;
			text_buf->set_width((clip_text || overrun_behavior != TextServer::OVERRUN_NO_TRIMMING) ? text_clip : -1);

			int text_width = MAX(1, (clip_text || overrun_behavior != TextServer::OVERRUN_NO_TRIMMING) ? MIN(text_clip, text_buf->get_size().x) : text_buf->get_size().x);

			if (_internal_margin[SIDE_LEFT] > 0) {
				text_clip -= _internal_margin[SIDE_LEFT] + get_theme_constant(SNAME("h_separation"));
			}
			if (_internal_margin[SIDE_RIGHT] > 0) {
				text_clip -= _internal_margin[SIDE_RIGHT] + get_theme_constant(SNAME("h_separation"));
			}

			Point2 text_ofs = (size - style->get_minimum_size() - icon_ofs - text_buf->get_size() - Point2(_internal_margin[SIDE_RIGHT] - _internal_margin[SIDE_LEFT], 0)) / 2.0;

			text_buf->set_alignment(align_rtl_checked);
			text_buf->set_width(text_width);
			switch (align_rtl_checked) {
				case HORIZONTAL_ALIGNMENT_FILL:
				case HORIZONTAL_ALIGNMENT_LEFT: {
					if (icon_align_rtl_checked != HORIZONTAL_ALIGNMENT_LEFT) {
						icon_ofs.x = 0.0;
					}
					if (_internal_margin[SIDE_LEFT] > 0) {
						text_ofs.x = style->get_margin(SIDE_LEFT) + icon_ofs.x + _internal_margin[SIDE_LEFT] + get_theme_constant(SNAME("h_separation"));
					} else {
						text_ofs.x = style->get_margin(SIDE_LEFT) + icon_ofs.x;
					}
					text_ofs.y += style->get_offset().y;
				} break;
				case HORIZONTAL_ALIGNMENT_CENTER: {
					if (text_ofs.x < 0) {
						text_ofs.x = 0;
					}
					if (icon_align_rtl_checked == HORIZONTAL_ALIGNMENT_LEFT) {
						text_ofs += icon_ofs;
					}
					text_ofs += style->get_offset();
				} break;
				case HORIZONTAL_ALIGNMENT_RIGHT: {
					if (_internal_margin[SIDE_RIGHT] > 0) {
						text_ofs.x = size.x - style->get_margin(SIDE_RIGHT) - text_width - _internal_margin[SIDE_RIGHT] - get_theme_constant(SNAME("h_separation"));
					} else {
						text_ofs.x = size.x - style->get_margin(SIDE_RIGHT) - text_width;
					}
					text_ofs.y += style->get_offset().y;
					if (icon_align_rtl_checked == HORIZONTAL_ALIGNMENT_RIGHT) {
						text_ofs.x -= icon_ofs.x;
					}
				} break;
			}

			Color font_outline_color = get_theme_color(SNAME("font_outline_color"));
			int outline_size = get_theme_constant(SNAME("outline_size"));
			if (outline_size > 0 && font_outline_color.a > 0) {
				text_buf->draw_outline(ci, text_ofs, outline_size, font_outline_color);
			}
			text_buf->draw(ci, text_ofs, color);
		} break;
	}
}

Size2 Button::get_minimum_size_for_text_and_icon(const String &p_text, Ref<Texture2D> p_icon) const {
	Ref<TextParagraph> paragraph;
	if (p_text.is_empty()) {
		paragraph = text_buf;
	} else {
		paragraph.instantiate();
		const_cast<Button *>(this)->_shape(paragraph, p_text);
	}

	Size2 minsize = paragraph->get_size();
	if (clip_text || overrun_behavior != TextServer::OVERRUN_NO_TRIMMING) {
		minsize.width = 0;
	}

	if (!expand_icon && p_icon.is_valid()) {
		minsize.height = MAX(minsize.height, p_icon->get_height());

		if (icon_alignment != HORIZONTAL_ALIGNMENT_CENTER) {
			minsize.width += p_icon->get_width();
			if (!xl_text.is_empty() || !p_text.is_empty()) {
				minsize.width += MAX(0, get_theme_constant(SNAME("h_separation")));
			}
		} else {
			minsize.width = MAX(minsize.width, p_icon->get_width());
		}
	}

	if (!xl_text.is_empty() || !p_text.is_empty()) {
		Ref<Font> font = get_theme_font(SNAME("font"));
		float font_height = font->get_height(get_theme_font_size(SNAME("font_size")));
		minsize.height = MAX(font_height, minsize.height);
	}

	return get_theme_stylebox(SNAME("normal"))->get_minimum_size() + minsize;
}

void Button::_shape(Ref<TextParagraph> p_paragraph, String p_text) {
	if (p_paragraph.is_null()) {
		p_paragraph = text_buf;
	}

	if (p_text.is_empty()) {
		p_text = xl_text;
	}

	Ref<Font> font = get_theme_font(SNAME("font"));
	int font_size = get_theme_font_size(SNAME("font_size"));

	p_paragraph->clear();
	if (text_direction == Control::TEXT_DIRECTION_INHERITED) {
		p_paragraph->set_direction(is_layout_rtl() ? TextServer::DIRECTION_RTL : TextServer::DIRECTION_LTR);
	} else {
		p_paragraph->set_direction((TextServer::Direction)text_direction);
	}
	p_paragraph->add_string(p_text, font, font_size, language);
	p_paragraph->set_text_overrun_behavior(overrun_behavior);
}

void Button::set_text_overrun_behavior(TextServer::OverrunBehavior p_behavior) {
	if (overrun_behavior != p_behavior) {
		overrun_behavior = p_behavior;
		_shape();

		update();
		update_minimum_size();
	}
}

TextServer::OverrunBehavior Button::get_text_overrun_behavior() const {
	return overrun_behavior;
}

void Button::set_text(const String &p_text) {
	if (text != p_text) {
		text = p_text;
		xl_text = atr(text);
		_shape();

		update();
		update_minimum_size();
	}
}

String Button::get_text() const {
	return text;
}

void Button::set_text_direction(Control::TextDirection p_text_direction) {
	ERR_FAIL_COND((int)p_text_direction < -1 || (int)p_text_direction > 3);
	if (text_direction != p_text_direction) {
		text_direction = p_text_direction;
		_shape();
		update();
	}
}

Control::TextDirection Button::get_text_direction() const {
	return text_direction;
}

void Button::set_language(const String &p_language) {
	if (language != p_language) {
		language = p_language;
		_shape();
		update();
	}
}

String Button::get_language() const {
	return language;
}

void Button::set_icon(const Ref<Texture2D> &p_icon) {
	if (icon != p_icon) {
		icon = p_icon;
		update();
		update_minimum_size();
	}
}

Ref<Texture2D> Button::get_icon() const {
	return icon;
}

void Button::set_expand_icon(bool p_enabled) {
	if (expand_icon != p_enabled) {
		expand_icon = p_enabled;
		update();
		update_minimum_size();
	}
}

bool Button::is_expand_icon() const {
	return expand_icon;
}

void Button::set_flat(bool p_enabled) {
	if (flat != p_enabled) {
		flat = p_enabled;
		update();
	}
}

bool Button::is_flat() const {
	return flat;
}

void Button::set_clip_text(bool p_enabled) {
	if (clip_text != p_enabled) {
		clip_text = p_enabled;
		update();
		update_minimum_size();
	}
}

bool Button::get_clip_text() const {
	return clip_text;
}

void Button::set_text_alignment(HorizontalAlignment p_alignment) {
	if (alignment != p_alignment) {
		alignment = p_alignment;
		update();
	}
}

HorizontalAlignment Button::get_text_alignment() const {
	return alignment;
}

void Button::set_icon_alignment(HorizontalAlignment p_alignment) {
	icon_alignment = p_alignment;
	update_minimum_size();
	update();
}

HorizontalAlignment Button::get_icon_alignment() const {
	return icon_alignment;
}

void Button::_bind_methods() {
	ClassDB::bind_method(D_METHOD("set_text", "text"), &Button::set_text);
	ClassDB::bind_method(D_METHOD("get_text"), &Button::get_text);
	ClassDB::bind_method(D_METHOD("set_text_overrun_behavior", "overrun_behavior"), &Button::set_text_overrun_behavior);
	ClassDB::bind_method(D_METHOD("get_text_overrun_behavior"), &Button::get_text_overrun_behavior);
	ClassDB::bind_method(D_METHOD("set_text_direction", "direction"), &Button::set_text_direction);
	ClassDB::bind_method(D_METHOD("get_text_direction"), &Button::get_text_direction);
	ClassDB::bind_method(D_METHOD("set_language", "language"), &Button::set_language);
	ClassDB::bind_method(D_METHOD("get_language"), &Button::get_language);
	ClassDB::bind_method(D_METHOD("set_button_icon", "texture"), &Button::set_icon);
	ClassDB::bind_method(D_METHOD("get_button_icon"), &Button::get_icon);
	ClassDB::bind_method(D_METHOD("set_flat", "enabled"), &Button::set_flat);
	ClassDB::bind_method(D_METHOD("is_flat"), &Button::is_flat);
	ClassDB::bind_method(D_METHOD("set_clip_text", "enabled"), &Button::set_clip_text);
	ClassDB::bind_method(D_METHOD("get_clip_text"), &Button::get_clip_text);
	ClassDB::bind_method(D_METHOD("set_text_alignment", "alignment"), &Button::set_text_alignment);
	ClassDB::bind_method(D_METHOD("get_text_alignment"), &Button::get_text_alignment);
	ClassDB::bind_method(D_METHOD("set_icon_alignment", "icon_alignment"), &Button::set_icon_alignment);
	ClassDB::bind_method(D_METHOD("get_icon_alignment"), &Button::get_icon_alignment);
	ClassDB::bind_method(D_METHOD("set_expand_icon", "enabled"), &Button::set_expand_icon);
	ClassDB::bind_method(D_METHOD("is_expand_icon"), &Button::is_expand_icon);

	ADD_PROPERTY(PropertyInfo(Variant::STRING, "text", PROPERTY_HINT_MULTILINE_TEXT, "", PROPERTY_USAGE_DEFAULT_INTL), "set_text", "get_text");
	ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "icon", PROPERTY_HINT_RESOURCE_TYPE, "Texture2D"), "set_button_icon", "get_button_icon");
	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "flat"), "set_flat", "is_flat");
	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "clip_text"), "set_clip_text", "get_clip_text");
	ADD_PROPERTY(PropertyInfo(Variant::INT, "alignment", PROPERTY_HINT_ENUM, "Left,Center,Right"), "set_text_alignment", "get_text_alignment");
	ADD_PROPERTY(PropertyInfo(Variant::INT, "text_overrun_behavior", PROPERTY_HINT_ENUM, "Trim Nothing,Trim Characters,Trim Words,Ellipsis,Word Ellipsis"), "set_text_overrun_behavior", "get_text_overrun_behavior");
	ADD_PROPERTY(PropertyInfo(Variant::INT, "icon_alignment", PROPERTY_HINT_ENUM, "Left,Center,Right"), "set_icon_alignment", "get_icon_alignment");
	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "expand_icon"), "set_expand_icon", "is_expand_icon");

	ADD_GROUP("BiDi", "");
	ADD_PROPERTY(PropertyInfo(Variant::INT, "text_direction", PROPERTY_HINT_ENUM, "Auto,Left-to-Right,Right-to-Left,Inherited"), "set_text_direction", "get_text_direction");
	ADD_PROPERTY(PropertyInfo(Variant::STRING, "language", PROPERTY_HINT_LOCALE_ID, ""), "set_language", "get_language");
}

Button::Button(const String &p_text) {
	text_buf.instantiate();
	text_buf->set_break_flags(TextServer::BREAK_MANDATORY);
	set_mouse_filter(MOUSE_FILTER_STOP);

	set_text(p_text);
}

Button::~Button() {
}