using System;
using System.CodeDom.Compiler;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Net;
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
using System.Runtime.Serialization;
using System.Security;
using System.Security.Permissions;
using System.Security.Policy;
using System.Speech.AudioFormat;
using System.Speech.Internal;
using System.Speech.Internal.GrammarBuilding;
using System.Speech.Internal.ObjectTokens;
using System.Speech.Internal.SapiInterop;
using System.Speech.Internal.SrgsCompiler;
using System.Speech.Internal.SrgsParser;
using System.Speech.Internal.Synthesis;
using System.Speech.Recognition;
using System.Speech.Recognition.SrgsGrammar;
using System.Speech.Synthesis;
using System.Speech.Synthesis.TtsEngine;
using System.Text;
using System.Threading;
using System.Xml;
using System.Xml.XPath;
using Microsoft.CSharp;
using Microsoft.VisualBasic;
using Microsoft.Win32;
[assembly: AssemblyCopyright("Copyright (c) Microsoft Corporation. All rights reserved.")]
[assembly: NeutralResourcesLanguage("en")]
[assembly: AssemblyCompany("Microsoft Corporation")]
[assembly: AssemblyProduct("Microsoft (R) Windows (R) Operating System")]
[assembly: ComVisible(false)]
[assembly: CLSCompliant(true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: AssemblyDelaySign(true)]
[assembly: AssemblyKeyFile("d:\\sp1qfe.public.x86fre\\internal\\strongnamekeys\\fake\\windows.snk")]
[assembly: AssemblyFileVersion("6.0.6001.17014")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: PermissionSet(SecurityAction.RequestOptional, Unrestricted = true)]
[assembly: SecurityPermission(SecurityAction.RequestOptional, Unrestricted = true)]
[assembly: RegistryPermission(SecurityAction.RequestOptional, Unrestricted = true)]
[assembly: EnvironmentPermission(SecurityAction.RequestOptional, Unrestricted = true)]
[assembly: FileIOPermission(SecurityAction.RequestOptional, Unrestricted = true)]
[assembly: AssemblyVersion("3.0.0.0")]
[module: UnverifiableCode]
namespace System.Speech.Internal
{
internal static class AudioFormatConverter
{
private enum StreamFormat
{
Default = -1,
NoAssignedFormat,
Text,
NonStandardFormat,
ExtendedAudioFormat,
PCM_8kHz8BitMono,
PCM_8kHz8BitStereo,
PCM_8kHz16BitMono,
PCM_8kHz16BitStereo,
PCM_11kHz8BitMono,
PCM_11kHz8BitStereo,
PCM_11kHz16BitMono,
PCM_11kHz16BitStereo,
PCM_12kHz8BitMono,
PCM_12kHz8BitStereo,
PCM_12kHz16BitMono,
PCM_12kHz16BitStereo,
PCM_16kHz8BitMono,
PCM_16kHz8BitStereo,
PCM_16kHz16BitMono,
PCM_16kHz16BitStereo,
PCM_22kHz8BitMono,
PCM_22kHz8BitStereo,
PCM_22kHz16BitMono,
PCM_22kHz16BitStereo,
PCM_24kHz8BitMono,
PCM_24kHz8BitStereo,
PCM_24kHz16BitMono,
PCM_24kHz16BitStereo,
PCM_32kHz8BitMono,
PCM_32kHz8BitStereo,
PCM_32kHz16BitMono,
PCM_32kHz16BitStereo,
PCM_44kHz8BitMono,
PCM_44kHz8BitStereo,
PCM_44kHz16BitMono,
PCM_44kHz16BitStereo,
PCM_48kHz8BitMono,
PCM_48kHz8BitStereo,
PCM_48kHz16BitMono,
PCM_48kHz16BitStereo,
TrueSpeech_8kHz1BitMono,
CCITT_ALaw_8kHzMono,
CCITT_ALaw_8kHzStereo,
CCITT_ALaw_11kHzMono,
CCITT_ALaw_11kHzStereo,
CCITT_ALaw_22kHzMono,
CCITT_ALaw_22kHzStereo,
CCITT_ALaw_44kHzMono,
CCITT_ALaw_44kHzStereo,
CCITT_uLaw_8kHzMono,
CCITT_uLaw_8kHzStereo,
CCITT_uLaw_11kHzMono,
CCITT_uLaw_11kHzStereo,
CCITT_uLaw_22kHzMono,
CCITT_uLaw_22kHzStereo,
CCITT_uLaw_44kHzMono,
CCITT_uLaw_44kHzStereo,
ADPCM_8kHzMono,
ADPCM_8kHzStereo,
ADPCM_11kHzMono,
ADPCM_11kHzStereo,
ADPCM_22kHzMono,
ADPCM_22kHzStereo,
ADPCM_44kHzMono,
ADPCM_44kHzStereo,
GSM610_8kHzMono,
GSM610_11kHzMono,
GSM610_22kHzMono,
GSM610_44kHzMono,
NUM_FORMATS
}
private enum WaveFormatId
{
Pcm = 1,
AdPcm = 2,
TrueSpeech = 34,
Alaw = 6,
Mulaw = 7,
Gsm610 = 49
}
[StructLayout(LayoutKind.Sequential)]
private class WaveFormatEx
{
public ushort wFormatTag;
public ushort nChannels;
public uint nSamplesPerSec;
public uint nAvgBytesPerSec;
public ushort nBlockAlign;
public ushort wBitsPerSample;
public ushort cbSize;
}
internal static SpeechAudioFormatInfo ToSpeechAudioFormatInfo(IntPtr waveFormatPtr)
{
WaveFormatEx waveFormatEx = (WaveFormatEx)Marshal.PtrToStructure(waveFormatPtr, typeof(WaveFormatEx));
byte[] array = new byte[waveFormatEx.cbSize];
IntPtr ptr = new IntPtr(waveFormatPtr.ToInt64() + Marshal.SizeOf((object)waveFormatEx));
for (int i = 0; i < waveFormatEx.cbSize; i++)
{
array[i] = Marshal.ReadByte(ptr, i);
}
return new SpeechAudioFormatInfo((EncodingFormat)waveFormatEx.wFormatTag, (int)waveFormatEx.nSamplesPerSec, (short)waveFormatEx.wBitsPerSample, (short)waveFormatEx.nChannels, (int)waveFormatEx.nAvgBytesPerSec, (short)waveFormatEx.nBlockAlign, array);
}
internal static SpeechAudioFormatInfo ToSpeechAudioFormatInfo(string formatString)
{
if (short.TryParse(formatString, NumberStyles.None, CultureInfo.InvariantCulture, out var result))
{
return ConvertFormat((StreamFormat)result);
}
return null;
}
private static SpeechAudioFormatInfo ConvertFormat(StreamFormat eFormat)
{
WaveFormatEx waveFormatEx = new WaveFormatEx();
byte[] array = null;
if (eFormat >= StreamFormat.PCM_8kHz8BitMono && eFormat <= StreamFormat.PCM_48kHz16BitStereo)
{
uint num = (uint)(eFormat - 4);
bool flag = (num & 1) != 0;
bool flag2 = (num & 2) != 0;
uint num2 = (num & 0x3C) >> 2;
uint[] array2 = new uint[9] { 8000u, 11025u, 12000u, 16000u, 22050u, 24000u, 32000u, 44100u, 48000u };
waveFormatEx.wFormatTag = 1;
waveFormatEx.nChannels = (waveFormatEx.nBlockAlign = (ushort)((!flag) ? 1u : 2u));
waveFormatEx.nSamplesPerSec = array2[num2];
waveFormatEx.wBitsPerSample = 8;
if (flag2)
{
waveFormatEx.wBitsPerSample *= 2;
waveFormatEx.nBlockAlign *= 2;
}
waveFormatEx.nAvgBytesPerSec = waveFormatEx.nSamplesPerSec * waveFormatEx.nBlockAlign;
}
else
{
switch (eFormat)
{
case StreamFormat.TrueSpeech_8kHz1BitMono:
waveFormatEx.wFormatTag = 34;
waveFormatEx.nChannels = 1;
waveFormatEx.nSamplesPerSec = 8000u;
waveFormatEx.nAvgBytesPerSec = 1067u;
waveFormatEx.nBlockAlign = 32;
waveFormatEx.wBitsPerSample = 1;
waveFormatEx.cbSize = 32;
array = new byte[32];
array[0] = 1;
array[2] = 240;
break;
case StreamFormat.CCITT_ALaw_8kHzMono:
case StreamFormat.CCITT_ALaw_8kHzStereo:
case StreamFormat.CCITT_ALaw_11kHzMono:
case StreamFormat.CCITT_ALaw_11kHzStereo:
case StreamFormat.CCITT_ALaw_22kHzMono:
case StreamFormat.CCITT_ALaw_22kHzStereo:
case StreamFormat.CCITT_ALaw_44kHzMono:
case StreamFormat.CCITT_ALaw_44kHzStereo:
{
uint num8 = (uint)(eFormat - 41);
uint num9 = num8 / 2;
uint[] array13 = new uint[4] { 8000u, 11025u, 22050u, 44100u };
bool flag5 = (num8 & 1) != 0;
waveFormatEx.wFormatTag = 6;
waveFormatEx.nChannels = (waveFormatEx.nBlockAlign = (ushort)((!flag5) ? 1u : 2u));
waveFormatEx.nSamplesPerSec = array13[num9];
waveFormatEx.wBitsPerSample = 8;
waveFormatEx.nAvgBytesPerSec = waveFormatEx.nSamplesPerSec * waveFormatEx.nBlockAlign;
break;
}
default:
if (eFormat >= StreamFormat.CCITT_uLaw_8kHzMono && eFormat <= StreamFormat.CCITT_uLaw_44kHzStereo)
{
uint num3 = (uint)(eFormat - 49);
uint num4 = num3 / 2;
uint[] array3 = new uint[4] { 8000u, 11025u, 22050u, 44100u };
bool flag3 = (num3 & 1) != 0;
waveFormatEx.wFormatTag = 7;
waveFormatEx.nChannels = (waveFormatEx.nBlockAlign = (ushort)((!flag3) ? 1u : 2u));
waveFormatEx.nSamplesPerSec = array3[num4];
waveFormatEx.wBitsPerSample = 8;
waveFormatEx.nAvgBytesPerSec = waveFormatEx.nSamplesPerSec * waveFormatEx.nBlockAlign;
}
else if (eFormat >= StreamFormat.ADPCM_8kHzMono && eFormat <= StreamFormat.ADPCM_44kHzStereo)
{
uint[] array4 = new uint[4] { 8000u, 11025u, 22050u, 44100u };
uint[] array5 = new uint[8] { 4096u, 8192u, 5644u, 11289u, 11155u, 22311u, 22179u, 44359u };
uint[] array6 = new uint[4] { 256u, 256u, 512u, 1024u };
byte[] array7 = new byte[32]
{
244, 1, 7, 0, 0, 1, 0, 0, 0, 2,
0, 255, 0, 0, 0, 0, 192, 0, 64, 0,
240, 0, 0, 0, 204, 1, 48, 255, 136, 1,
24, 255
};
byte[] array8 = new byte[32]
{
244, 3, 7, 0, 0, 1, 0, 0, 0, 2,
0, 255, 0, 0, 0, 0, 192, 0, 64, 0,
240, 0, 0, 0, 204, 1, 48, 255, 136, 1,
24, 255
};
byte[] array9 = new byte[32]
{
244, 7, 7, 0, 0, 1, 0, 0, 0, 2,
0, 255, 0, 0, 0, 0, 192, 0, 64, 0,
240, 0, 0, 0, 204, 1, 48, 255, 136, 1,
24, 255
};
byte[][] array10 = new byte[4][] { array7, array7, array8, array9 };
uint num5 = (uint)(eFormat - 57);
uint num6 = num5 / 2;
bool flag4 = (num5 & 1) != 0;
waveFormatEx.wFormatTag = 2;
waveFormatEx.nChannels = (ushort)((!flag4) ? 1u : 2u);
waveFormatEx.nSamplesPerSec = array4[num6];
waveFormatEx.nAvgBytesPerSec = array5[num5];
waveFormatEx.nBlockAlign = (ushort)(array6[num6] * waveFormatEx.nChannels);
waveFormatEx.wBitsPerSample = 4;
waveFormatEx.cbSize = 32;
array = (byte[])array10[num6].Clone();
}
else if (eFormat >= StreamFormat.GSM610_8kHzMono && eFormat <= StreamFormat.GSM610_44kHzMono)
{
uint[] array11 = new uint[4] { 8000u, 11025u, 22050u, 44100u };
uint[] array12 = new uint[4] { 1625u, 2239u, 4478u, 8957u };
uint num7 = (uint)(eFormat - 65);
waveFormatEx.wFormatTag = 49;
waveFormatEx.nChannels = 1;
waveFormatEx.nSamplesPerSec = array11[num7];
waveFormatEx.nAvgBytesPerSec = array12[num7];
waveFormatEx.nBlockAlign = 65;
waveFormatEx.wBitsPerSample = 0;
waveFormatEx.cbSize = 2;
array = new byte[2] { 64, 1 };
}
else
{
waveFormatEx = null;
switch (eFormat)
{
default:
throw new FormatException();
case StreamFormat.NoAssignedFormat:
case StreamFormat.Text:
break;
}
}
break;
}
}
if (waveFormatEx == null)
{
return null;
}
return new SpeechAudioFormatInfo((EncodingFormat)waveFormatEx.wFormatTag, (int)waveFormatEx.nSamplesPerSec, waveFormatEx.wBitsPerSample, waveFormatEx.nChannels, (int)waveFormatEx.nAvgBytesPerSec, waveFormatEx.nBlockAlign, array);
}
}
}
namespace System.Speech.AudioFormat
{
public enum EncodingFormat
{
Pcm = 1,
ALaw = 6,
ULaw = 7
}
[Serializable]
public class SpeechAudioFormatInfo
{
private int _averageBytesPerSecond;
private short _bitsPerSample;
private short _blockAlign;
private EncodingFormat _encodingFormat;
private short _channelCount;
private int _samplesPerSecond;
private byte[] _formatSpecificData;
[EditorBrowsable(EditorBrowsableState.Advanced)]
public int AverageBytesPerSecond => _averageBytesPerSecond;
[EditorBrowsable(EditorBrowsableState.Advanced)]
public int BitsPerSample => _bitsPerSample;
[EditorBrowsable(EditorBrowsableState.Advanced)]
public int BlockAlign => _blockAlign;
public EncodingFormat EncodingFormat => _encodingFormat;
public int ChannelCount => _channelCount;
public int SamplesPerSecond => _samplesPerSecond;
internal byte[] WaveFormat
{
get
{
WAVEFORMATEX wAVEFORMATEX = default(WAVEFORMATEX);
wAVEFORMATEX.wFormatTag = (short)EncodingFormat;
wAVEFORMATEX.nChannels = (short)ChannelCount;
wAVEFORMATEX.nSamplesPerSec = SamplesPerSecond;
wAVEFORMATEX.nAvgBytesPerSec = AverageBytesPerSecond;
wAVEFORMATEX.nBlockAlign = (short)BlockAlign;
wAVEFORMATEX.wBitsPerSample = (short)BitsPerSample;
wAVEFORMATEX.cbSize = (short)FormatSpecificData().Length;
byte[] array = wAVEFORMATEX.ToBytes();
if (wAVEFORMATEX.cbSize > 0)
{
byte[] array2 = new byte[array.Length + wAVEFORMATEX.cbSize];
Array.Copy(array, array2, array.Length);
Array.Copy(FormatSpecificData(), 0, array2, array.Length, wAVEFORMATEX.cbSize);
array = array2;
}
return array;
}
}
private SpeechAudioFormatInfo(EncodingFormat encodingFormat, int samplesPerSecond, short bitsPerSample, short channelCount, byte[] formatSpecificData)
{
if (encodingFormat == (EncodingFormat)0)
{
throw new ArgumentException(SR.Get(SRID.CannotUseCustomFormat), "encodingFormat");
}
if (samplesPerSecond <= 0)
{
throw new ArgumentOutOfRangeException("samplesPerSecond", SR.Get(SRID.MustBeGreaterThanZero));
}
if (bitsPerSample <= 0)
{
throw new ArgumentOutOfRangeException("bitsPerSample", SR.Get(SRID.MustBeGreaterThanZero));
}
if (channelCount <= 0)
{
throw new ArgumentOutOfRangeException("channelCount", SR.Get(SRID.MustBeGreaterThanZero));
}
_encodingFormat = encodingFormat;
_samplesPerSecond = samplesPerSecond;
_bitsPerSample = bitsPerSample;
_channelCount = channelCount;
if (formatSpecificData == null)
{
_formatSpecificData = new byte[0];
}
else
{
_formatSpecificData = (byte[])formatSpecificData.Clone();
}
switch (encodingFormat)
{
case EncodingFormat.ALaw:
case EncodingFormat.ULaw:
if (bitsPerSample != 8)
{
throw new ArgumentOutOfRangeException("bitsPerSample");
}
if (formatSpecificData != null && formatSpecificData.Length != 0)
{
throw new ArgumentOutOfRangeException("formatSpecificData");
}
break;
}
}
[EditorBrowsable(EditorBrowsableState.Advanced)]
public SpeechAudioFormatInfo(EncodingFormat encodingFormat, int samplesPerSecond, int bitsPerSample, int channelCount, int averageBytesPerSecond, int blockAlign, byte[] formatSpecificData)
: this(encodingFormat, samplesPerSecond, (short)bitsPerSample, (short)channelCount, formatSpecificData)
{
if (averageBytesPerSecond <= 0)
{
throw new ArgumentOutOfRangeException("averageBytesPerSecond", SR.Get(SRID.MustBeGreaterThanZero));
}
if (blockAlign <= 0)
{
throw new ArgumentOutOfRangeException("blockAlign", SR.Get(SRID.MustBeGreaterThanZero));
}
_averageBytesPerSecond = averageBytesPerSecond;
_blockAlign = (short)blockAlign;
}
public SpeechAudioFormatInfo(int samplesPerSecond, AudioBitsPerSample bitsPerSample, AudioChannel channel)
: this(EncodingFormat.Pcm, samplesPerSecond, (short)bitsPerSample, (short)channel, null)
{
_blockAlign = (short)(_channelCount * (_bitsPerSample / 8));
_averageBytesPerSecond = _samplesPerSecond * _blockAlign;
}
public byte[] FormatSpecificData()
{
return (byte[])_formatSpecificData.Clone();
}
public override bool Equals(object obj)
{
if (!(obj is SpeechAudioFormatInfo speechAudioFormatInfo))
{
return false;
}
if (!_averageBytesPerSecond.Equals(speechAudioFormatInfo._averageBytesPerSecond) || !_bitsPerSample.Equals(speechAudioFormatInfo._bitsPerSample) || !_blockAlign.Equals(speechAudioFormatInfo._blockAlign) || !_encodingFormat.Equals(speechAudioFormatInfo._encodingFormat) || !_channelCount.Equals(speechAudioFormatInfo._channelCount) || !_samplesPerSecond.Equals(speechAudioFormatInfo._samplesPerSecond))
{
return false;
}
if (_formatSpecificData.Length != speechAudioFormatInfo._formatSpecificData.Length)
{
return false;
}
for (int i = 0; i < _formatSpecificData.Length; i++)
{
if (_formatSpecificData[i] != speechAudioFormatInfo._formatSpecificData[i])
{
return false;
}
}
return true;
}
public override int GetHashCode()
{
return _averageBytesPerSecond.GetHashCode();
}
}
public enum AudioChannel
{
Mono = 1,
Stereo
}
public enum AudioBitsPerSample
{
Eight = 8,
Sixteen = 0x10
}
}
namespace System.Speech.Internal
{
internal interface IAsyncDispatch
{
void Post(object evt);
void Post(object[] evt);
void PostOperation(Delegate callback, params object[] parameters);
}
internal class AsyncSerializedWorker : IAsyncDispatch
{
private AsyncOperation _asyncOperation;
private SendOrPostCallback _workerPostCallback;
private Queue _queue;
private bool _hasPendingPost;
private bool _isAsyncMode;
private WaitCallback _workerCallback;
private WaitCallback _defaultCallback;
private bool _isEnabled;
internal bool Enabled
{
get
{
lock (_queue.SyncRoot)
{
return _isEnabled;
}
}
set
{
lock (_queue.SyncRoot)
{
_isEnabled = value;
}
}
}
internal WaitCallback DefaultCallback
{
get
{
lock (_queue.SyncRoot)
{
return _defaultCallback;
}
}
}
internal bool AsyncMode
{
get
{
lock (_queue.SyncRoot)
{
return _isAsyncMode;
}
}
set
{
bool flag = false;
lock (_queue.SyncRoot)
{
if (_isAsyncMode != value)
{
_isAsyncMode = value;
if (_queue.Count > 0)
{
flag = true;
}
}
}
if (flag)
{
OnWorkItemPending();
}
}
}
internal event WaitCallback WorkItemPending;
internal AsyncSerializedWorker(WaitCallback defaultCallback, AsyncOperation asyncOperation)
{
_asyncOperation = asyncOperation;
_workerPostCallback = WorkerProc;
Initialize(defaultCallback);
}
private void Initialize(WaitCallback defaultCallback)
{
_queue = new Queue();
_hasPendingPost = false;
_workerCallback = WorkerProc;
_defaultCallback = defaultCallback;
_isAsyncMode = true;
_isEnabled = true;
}
public void Post(object evt)
{
AddItem(new AsyncWorkItem(DefaultCallback, evt));
}
public void Post(object[] evt)
{
lock (_queue.SyncRoot)
{
if (Enabled)
{
for (int i = 0; i < evt.Length; i++)
{
AddItem(new AsyncWorkItem(DefaultCallback, evt[i]));
}
}
}
}
public void PostOperation(Delegate callback, params object[] parameters)
{
AddItem(new AsyncWorkItem(callback, parameters));
}
internal void Purge()
{
lock (_queue.SyncRoot)
{
_queue.Clear();
}
}
internal AsyncWorkItem NextWorkItem()
{
lock (_queue.SyncRoot)
{
if (_queue.Count == 0)
{
return null;
}
AsyncWorkItem result = (AsyncWorkItem)_queue.Dequeue();
if (_queue.Count == 0)
{
_hasPendingPost = false;
}
return result;
}
}
internal void ConsumeQueue()
{
AsyncWorkItem asyncWorkItem;
while ((asyncWorkItem = NextWorkItem()) != null)
{
asyncWorkItem.Invoke();
}
}
private void AddItem(AsyncWorkItem item)
{
bool flag = true;
lock (_queue.SyncRoot)
{
if (Enabled)
{
_queue.Enqueue(item);
if (!_hasPendingPost || !_isAsyncMode)
{
flag = false;
_hasPendingPost = true;
}
}
}
if (!flag)
{
OnWorkItemPending();
}
}
private void WorkerProc(object ignored)
{
while (true)
{
AsyncWorkItem asyncWorkItem;
lock (_queue.SyncRoot)
{
if (_queue.Count <= 0 || !_isAsyncMode)
{
if (_queue.Count == 0)
{
_hasPendingPost = false;
}
break;
}
asyncWorkItem = (AsyncWorkItem)_queue.Dequeue();
}
asyncWorkItem.Invoke();
}
}
private void OnWorkItemPending()
{
if (!_hasPendingPost)
{
return;
}
if (AsyncMode)
{
if (_asyncOperation == null)
{
ThreadPool.QueueUserWorkItem(_workerCallback, null);
}
else
{
_asyncOperation.Post(_workerPostCallback, null);
}
}
else if (this.WorkItemPending != null)
{
this.WorkItemPending(null);
}
}
}
internal class AsyncWorkItem
{
private Delegate _dynamicCallback;
private object[] _postData;
internal AsyncWorkItem(Delegate dynamicCallback, params object[] postData)
{
_dynamicCallback = dynamicCallback;
_postData = postData;
}
internal void Invoke()
{
if ((object)_dynamicCallback != null)
{
_dynamicCallback.DynamicInvoke(_postData);
}
}
}
internal static class Helpers
{
internal const int _sizeOfChar = 2;
internal static readonly char[] _achTrimChars = new char[4] { ' ', '\t', '\n', '\r' };
internal static void ThrowIfEmptyOrNull(string s, string paramName)
{
if (string.IsNullOrEmpty(s))
{
if (s == null)
{
throw new ArgumentNullException(paramName);
}
throw new ArgumentException(SR.Get(SRID.StringCanNotBeEmpty, paramName), paramName);
}
}
internal static void ThrowIfNull(object value, string paramName)
{
if (value == null)
{
throw new ArgumentNullException(paramName);
}
}
internal static bool CompareInvariantCulture(CultureInfo culture1, CultureInfo culture2)
{
if (culture1.Equals(culture2))
{
return true;
}
while (!culture1.IsNeutralCulture)
{
culture1 = culture1.Parent;
}
while (!culture2.IsNeutralCulture)
{
culture2 = culture2.Parent;
}
return culture1.Equals(culture2);
}
internal static void CopyStream(Stream inputStream, Stream outputStream, int bytesToCopy)
{
int num = ((bytesToCopy > 4096) ? 4096 : bytesToCopy);
byte[] buffer = new byte[num];
while (bytesToCopy > 0)
{
int num2 = inputStream.Read(buffer, 0, num);
if (num2 <= 0)
{
throw new EndOfStreamException(SR.Get(SRID.StreamEndedUnexpectedly));
}
outputStream.Write(buffer, 0, num2);
bytesToCopy -= num2;
}
}
internal static byte[] ReadStreamToByteArray(Stream inputStream, int bytesToCopy)
{
byte[] array = new byte[bytesToCopy];
BlockingRead(inputStream, array, 0, bytesToCopy);
return array;
}
internal static void BlockingRead(Stream stream, byte[] buffer, int offset, int count)
{
while (count > 0)
{
int num = stream.Read(buffer, offset, count);
if (num <= 0)
{
throw new EndOfStreamException();
}
count -= num;
offset += num;
}
}
internal static void CombineCulture(string language, string location, CultureInfo parentCulture, int layoutId)
{
//IL_0027: Unknown result type (might be due to invalid IL or missing references)
//IL_002d: Expected O, but got Unknown
CultureInfo cultureInfo = new CultureInfo(language);
RegionInfo regionInfo = new RegionInfo(location);
string text = cultureInfo.TwoLetterISOLanguageName + "-" + regionInfo.TwoLetterISORegionName;
CultureAndRegionInfoBuilder val = new CultureAndRegionInfoBuilder(text, (CultureAndRegionModifiers)0);
val.LoadDataFromRegionInfo(regionInfo);
val.LoadDataFromCultureInfo(cultureInfo);
val.IetfLanguageTag = text;
val.Parent = parentCulture;
val.ThreeLetterISOLanguageName = cultureInfo.ThreeLetterISOLanguageName;
val.TwoLetterISOLanguageName = cultureInfo.TwoLetterISOLanguageName;
val.ThreeLetterWindowsLanguageName = cultureInfo.ThreeLetterWindowsLanguageName;
val.RegionNativeName = regionInfo.NativeName;
string text2 = cultureInfo.EnglishName.Substring(0, cultureInfo.EnglishName.IndexOf("(", StringComparison.Ordinal) - 1);
string text3 = cultureInfo.NativeName.Substring(0, cultureInfo.NativeName.IndexOf("(", StringComparison.Ordinal) - 1);
val.CultureEnglishName = text2 + " (" + val.RegionEnglishName + ")";
val.CultureNativeName = text3 + " (" + val.RegionNativeName + ")";
val.CurrencyNativeName = regionInfo.CurrencyNativeName;
val.NumberFormat.PositiveInfinitySymbol = cultureInfo.NumberFormat.PositiveInfinitySymbol;
val.NumberFormat.NegativeInfinitySymbol = cultureInfo.NumberFormat.NegativeInfinitySymbol;
val.NumberFormat.NaNSymbol = cultureInfo.NumberFormat.NaNSymbol;
DateTimeFormatInfo gregorianDateTimeFormat = val.GregorianDateTimeFormat;
DateTimeFormatInfo dateTimeFormat = cultureInfo.DateTimeFormat;
dateTimeFormat.Calendar = new GregorianCalendar();
val.KeyboardLayoutId = layoutId;
gregorianDateTimeFormat.AbbreviatedDayNames = dateTimeFormat.AbbreviatedDayNames;
gregorianDateTimeFormat.AbbreviatedMonthGenitiveNames = dateTimeFormat.AbbreviatedMonthGenitiveNames;
gregorianDateTimeFormat.AbbreviatedMonthNames = dateTimeFormat.AbbreviatedMonthNames;
gregorianDateTimeFormat.DayNames = dateTimeFormat.DayNames;
gregorianDateTimeFormat.MonthGenitiveNames = dateTimeFormat.MonthGenitiveNames;
gregorianDateTimeFormat.MonthNames = dateTimeFormat.MonthNames;
gregorianDateTimeFormat.ShortestDayNames = dateTimeFormat.ShortestDayNames;
val.Register();
}
}
internal sealed class HGlobalSafeHandle : SafeHandle
{
private int _bufferSize;
public override bool IsInvalid => handle == IntPtr.Zero;
internal HGlobalSafeHandle()
: base(IntPtr.Zero, ownsHandle: true)
{
}
~HGlobalSafeHandle()
{
Dispose(disposing: false);
}
protected override void Dispose(bool disposing)
{
ReleaseHandle();
base.Dispose(disposing);
GC.SuppressFinalize(this);
}
internal IntPtr Buffer(int size)
{
if (size > _bufferSize)
{
if (_bufferSize == 0)
{
SetHandle(Marshal.AllocHGlobal(size));
}
else
{
SetHandle(Marshal.ReAllocHGlobal(handle, (IntPtr)size));
}
GC.AddMemoryPressure(size - _bufferSize);
_bufferSize = size;
}
return handle;
}
protected override bool ReleaseHandle()
{
if (handle != IntPtr.Zero)
{
if (_bufferSize > 0)
{
GC.RemoveMemoryPressure(_bufferSize);
_bufferSize = 0;
}
Marshal.FreeHGlobal(handle);
handle = IntPtr.Zero;
return true;
}
return false;
}
}
internal enum AlphabetType
{
Sapi,
Ipa,
Ups
}
internal class AlphabetConverter
{
internal class PhoneMapData
{
private class ConversionUnit
{
public string sapi;
public string ups;
public bool isDefault;
}
private Hashtable prefixSapiTable;
private Hashtable prefixUpsTable;
private ConversionUnit[] convertTable;
internal PhoneMapData(Stream input)
{
using BinaryReader binaryReader = new BinaryReader(input, Encoding.Unicode);
int num = binaryReader.ReadInt32();
convertTable = new ConversionUnit[num];
for (int i = 0; i < num; i++)
{
convertTable[i] = new ConversionUnit();
convertTable[i].sapi = ReadPhoneString(binaryReader);
convertTable[i].ups = ReadPhoneString(binaryReader);
convertTable[i].isDefault = ((binaryReader.ReadInt32() != 0) ? true : false);
}
prefixSapiTable = InitializePrefix(isSapi: true);
prefixUpsTable = InitializePrefix(isSapi: false);
}
internal bool IsPrefix(string prefix, bool isSapi)
{
if (isSapi)
{
return prefixSapiTable.ContainsKey(prefix);
}
return prefixUpsTable.ContainsKey(prefix);
}
internal string ConvertPhoneme(string phoneme, bool isSapi)
{
ConversionUnit conversionUnit = ((!isSapi) ? ((ConversionUnit)prefixUpsTable[phoneme]) : ((ConversionUnit)prefixSapiTable[phoneme]));
if (conversionUnit == null)
{
return null;
}
if (!isSapi)
{
return conversionUnit.sapi;
}
return conversionUnit.ups;
}
private Hashtable InitializePrefix(bool isSapi)
{
Hashtable hashtable = Hashtable.Synchronized(new Hashtable());
for (int i = 0; i < convertTable.Length; i++)
{
string text = ((!isSapi) ? convertTable[i].ups : convertTable[i].sapi);
for (int j = 0; j + 1 < text.Length; j++)
{
string key = text.Substring(0, j + 1);
if (!hashtable.ContainsKey(key))
{
hashtable[key] = null;
}
}
if (convertTable[i].isDefault || hashtable[text] == null)
{
hashtable[text] = convertTable[i];
}
}
return hashtable;
}
private static string ReadPhoneString(BinaryReader reader)
{
int num = reader.ReadInt16() / 2;
char[] value = reader.ReadChars(num);
return new string(value, 0, num - 1);
}
}
private int _currentLangId;
private PhoneMapData _phoneMap;
private static int[] _langIds = new int[7] { 2052, 1028, 1031, 1033, 1034, 1036, 1041 };
private static string[] _resourceNames = new string[7] { "upstable_chs.upsmap", "upstable_cht.upsmap", "upstable_deu.upsmap", "upstable_enu.upsmap", "upstable_esp.upsmap", "upstable_fra.upsmap", "upstable_jpn.upsmap" };
private static PhoneMapData[] _phoneMaps = new PhoneMapData[7];
private static object _staticLock = new object();
internal AlphabetConverter(int langId)
{
_currentLangId = -1;
SetLanguageId(langId);
}
internal char[] SapiToIpa(char[] phonemes)
{
return Convert(phonemes, isSapi: true);
}
internal char[] IpaToSapi(char[] phonemes)
{
return Convert(phonemes, isSapi: false);
}
internal bool IsPrefix(string phonemes, bool isSapi)
{
return _phoneMap.IsPrefix(phonemes, isSapi);
}
internal bool IsConvertibleUnit(string phonemes, bool isSapi)
{
return _phoneMap.ConvertPhoneme(phonemes, isSapi) != null;
}
internal int SetLanguageId(int langId)
{
if (langId < 0)
{
throw new ArgumentException(SR.Get(SRID.MustBeGreaterThanZero), "langId");
}
if (langId == _currentLangId)
{
return _currentLangId;
}
int currentLangId = _currentLangId;
int i;
for (i = 0; i < _langIds.Length && _langIds[i] != langId; i++)
{
}
if (i == _langIds.Length)
{
_currentLangId = langId;
_phoneMap = null;
}
else
{
lock (_staticLock)
{
if (_phoneMaps[i] == null)
{
_phoneMaps[i] = CreateMap(_resourceNames[i]);
}
_phoneMap = _phoneMaps[i];
_currentLangId = langId;
}
}
return currentLangId;
}
private char[] Convert(char[] phonemes, bool isSapi)
{
if (_phoneMap == null || phonemes.Length == 0)
{
return (char[])phonemes.Clone();
}
StringBuilder stringBuilder = new StringBuilder();
string text = new string(phonemes);
string text2 = null;
int i;
int num = (i = 0);
int num2 = -1;
for (; i < text.Length; i++)
{
string text3 = text.Substring(num, i - num + 1);
if (_phoneMap.IsPrefix(text3, isSapi))
{
string text4 = _phoneMap.ConvertPhoneme(text3, isSapi);
if (text4 != null)
{
text2 = text4;
num2 = i;
}
continue;
}
if (text2 == null)
{
break;
}
stringBuilder.Append(text2);
i = num2;
num = num2 + 1;
text2 = null;
}
if (text2 != null && num2 == phonemes.Length - 1)
{
stringBuilder.Append(text2);
return stringBuilder.ToString().ToCharArray();
}
return null;
}
private PhoneMapData CreateMap(string resourceName)
{
Assembly assembly = Assembly.GetAssembly(GetType());
Stream manifestResourceStream = assembly.GetManifestResourceStream(resourceName);
if (manifestResourceStream == null)
{
throw new FileLoadException(SR.Get(SRID.CannotLoadResourceFromManifest, resourceName, assembly.FullName));
}
return new PhoneMapData(new BufferedStream(manifestResourceStream));
}
}
internal sealed class PhonemeConverter
{
private class PhoneMap
{
internal int _lcid;
internal PhoneId[] _phoneIds;
internal PhoneMap()
{
}
}
private class PhoneId : IComparer<PhoneId>
{
internal string _phone;
internal char[] _cp;
internal PhoneId()
{
}
int IComparer<PhoneId>.Compare(PhoneId x, PhoneId y)
{
return x._phone.CompareTo(y._phone);
}
}
private class PhoneMapCompressed
{
internal int _lcid;
internal int _count;
internal byte[] _phones;
internal char[] _cps;
internal PhoneMapCompressed()
{
}
internal PhoneMapCompressed(int lcid, int count, byte[] phoneIds, char[] cps)
{
_lcid = lcid;
_count = count;
_phones = phoneIds;
_cps = cps;
}
}
private PhoneMap _phoneMap;
private static readonly PhoneMap[] _phoneMaps;
private static PhoneMapCompressed[] _phoneMapsCompressed;
private static char[] _updIds;
private static readonly PhonemeConverter _upsConverter;
internal static PhonemeConverter UpsConverter => _upsConverter;
static PhonemeConverter()
{
_phoneMapsCompressed = new PhoneMapCompressed[8]
{
new PhoneMapCompressed(0, 207, new byte[720]
{
46, 0, 95, 33, 0, 95, 38, 0, 95, 44,
0, 95, 46, 0, 95, 63, 0, 95, 94, 0,
95, 124, 0, 95, 124, 124, 0, 95, 83, 0,
43, 0, 65, 0, 65, 65, 0, 65, 68, 86,
0, 65, 69, 0, 65, 69, 88, 0, 65, 72,
0, 65, 73, 255, 255, 0, 65, 78, 255, 0,
65, 79, 0, 65, 79, 69, 0, 65, 79, 88,
255, 255, 0, 65, 80, 73, 0, 65, 83, 80,
0, 65, 84, 82, 0, 65, 85, 255, 255, 0,
65, 88, 0, 65, 88, 82, 0, 66, 0, 66,
66, 0, 66, 72, 0, 66, 73, 77, 0, 66,
86, 65, 0, 66, 86, 68, 0, 67, 0, 67,
67, 255, 255, 0, 67, 67, 50, 0, 67, 67,
75, 0, 67, 69, 78, 0, 67, 72, 255, 255,
0, 67, 72, 50, 0, 67, 74, 0, 67, 84,
0, 67, 86, 68, 0, 68, 0, 68, 69, 78,
0, 68, 72, 0, 68, 73, 77, 0, 68, 82,
0, 68, 88, 0, 68, 88, 82, 0, 68, 90,
255, 255, 0, 68, 90, 50, 0, 69, 0, 69,
72, 0, 69, 72, 88, 255, 255, 0, 69, 73,
255, 255, 0, 69, 74, 67, 0, 69, 78, 255,
0, 69, 82, 0, 69, 82, 82, 0, 69, 83,
72, 0, 69, 84, 0, 69, 85, 0, 69, 88,
0, 69, 90, 72, 0, 70, 0, 71, 0, 71,
50, 0, 71, 65, 0, 71, 72, 0, 71, 73,
77, 0, 71, 76, 0, 71, 84, 0, 72, 0,
72, 71, 0, 72, 72, 0, 72, 76, 71, 0,
72, 90, 0, 73, 0, 73, 72, 0, 73, 88,
0, 73, 89, 88, 255, 255, 0, 74, 0, 74,
67, 255, 255, 0, 74, 67, 50, 0, 74, 68,
0, 74, 72, 255, 255, 0, 74, 72, 50, 0,
74, 73, 77, 0, 74, 74, 255, 255, 0, 75,
0, 76, 0, 76, 65, 66, 0, 76, 65, 77,
0, 76, 65, 82, 0, 76, 67, 75, 0, 76,
67, 75, 50, 0, 76, 71, 0, 76, 72, 0,
76, 74, 0, 76, 76, 65, 0, 76, 78, 71,
0, 76, 79, 87, 0, 76, 82, 0, 76, 82,
68, 0, 76, 83, 72, 0, 76, 84, 0, 77,
0, 77, 67, 78, 0, 77, 70, 0, 77, 82,
68, 0, 78, 0, 78, 65, 82, 0, 78, 65,
83, 0, 78, 67, 75, 0, 78, 67, 75, 50,
0, 78, 67, 75, 51, 0, 78, 71, 0, 78,
74, 0, 78, 82, 0, 78, 83, 82, 0, 78,
83, 89, 0, 79, 0, 79, 69, 0, 79, 69,
78, 255, 0, 79, 73, 255, 255, 0, 79, 78,
255, 0, 79, 85, 0, 79, 87, 88, 255, 255,
0, 79, 88, 0, 80, 0, 80, 65, 76, 0,
80, 67, 75, 0, 80, 70, 255, 255, 0, 80,
72, 0, 80, 72, 82, 0, 81, 0, 81, 68,
0, 81, 72, 0, 81, 73, 77, 0, 81, 78,
0, 81, 79, 77, 0, 81, 81, 0, 81, 84,
0, 82, 0, 82, 65, 0, 82, 65, 73, 0,
82, 69, 84, 0, 82, 72, 0, 82, 72, 79,
0, 82, 72, 90, 0, 82, 82, 0, 82, 84,
69, 0, 82, 84, 82, 0, 83, 0, 83, 49,
0, 83, 50, 0, 83, 67, 0, 83, 72, 0,
83, 72, 67, 0, 83, 72, 88, 0, 83, 82,
0, 83, 89, 76, 0, 84, 0, 84, 45, 0,
84, 43, 0, 84, 61, 0, 84, 49, 0, 84,
50, 0, 84, 51, 0, 84, 52, 0, 84, 53,
0, 84, 67, 75, 0, 84, 67, 75, 50, 0,
84, 72, 0, 84, 82, 0, 84, 83, 255, 255,
0, 84, 83, 50, 0, 84, 83, 82, 255, 255,
0, 85, 0, 85, 72, 0, 85, 82, 0, 85,
85, 0, 85, 87, 88, 255, 255, 0, 85, 89,
88, 255, 255, 0, 86, 0, 86, 65, 0, 86,
67, 68, 0, 86, 69, 76, 0, 86, 76, 83,
0, 86, 80, 72, 0, 86, 83, 76, 0, 87,
0, 87, 72, 0, 87, 74, 0, 88, 0, 88,
83, 72, 0, 88, 83, 84, 0, 89, 0, 89,
72, 0, 89, 88, 0, 90, 0, 90, 67, 0,
90, 72, 0, 90, 72, 74, 0, 90, 82, 0
}, new char[249]
{
'.', '\u0001', '\u0002', '\u0003', '↘', '↗', '\u203f', '|', '‖', '\u0004',
'\u0361', 'a', 'ɑ', '\u031f', 'æ', 'ɐ', 'ʌ', 'a', '\u0361', 'i',
'a', '\u0303', 'ɔ', 'ɶ', 'ɔ', '\u0361', 'ə', '\u033a', 'ʰ', '\u0318',
'a', '\u0361', 'ʊ', 'ə', 'ɚ', 'b', 'ʙ', 'β', 'ɓ', 'ʱ',
'\u0324', 'ç', '\u0740', '\u0361', 'ɕ', 'ʨ', 'ǂ', '\u0308', 't', '\u0361',
'ʃ', 'ʧ', 'ʝ', 'c', '\u0330', 'd', '\u032a', 'ð', 'ɗ', 'ɖ',
'ɾ', 'ɽ', 'd', '\u0361', 'z', 'ʣ', 'e', 'ɛ', 'ɛ', '\u0361',
'ə', 'e', '\u0361', 'i', 'ʼ', 'e', '\u0303', 'ɜ', 'ɝ', 'ʜ',
'ʡ', 'ø', 'ɘ', 'ʢ', 'f', 'g', 'ɡ', 'ɰ', 'ɣ', 'ɠ',
'ʟ', 'ʔ', 'h', 'ʕ', 'ħ', 'ˑ', 'ɦ', 'i', 'ɪ', 'ɨ',
'i', '\u0361', 'ə', 'j', 'd', '\u0361', 'ʑ', 'ʥ', 'ɟ', 'd',
'\u0361', 'ʒ', 'ʤ', 'ʄ', 'j', '\u0361', 'j', 'k', 'l', 'ʷ',
'\u033b', 'ˡ', 'ǁ', 'ʖ', 'ɫ', 'ɮ', 'ʎ', '\u033c', 'ː', '\u031e',
'ɭ', '\u031c', 'ɬ', 'ɺ', 'm', '\u033d', 'ɱ', '\u0339', 'n', '\u031a',
'\u0303', '!', 'ǃ', 'ʗ', 'ŋ', 'ɲ', 'ɳ', 'ⁿ', '\u032f', 'o',
'œ', 'œ', '\u0303', 'ɔ', '\u0361', 'i', 'o', '\u0303', 'ɤ', 'o',
'\u0361', 'ə', 'ɵ', 'p', 'ʲ', 'ʘ', 'p', '\u0361', 'f', 'ɸ',
'ˤ', 'ɒ', 'ɢ', 'χ', 'ʛ', 'ɴ', 'ʠ', 'ʀ', 'q', 'ɻ',
'ɹ', '\u031d', '\u0331', 'ʁ', '\u02de', 'ʴ', 'r', '\u0320', '\u0319', 's',
'ˈ', 'ˌ', 'ɕ', 'ʃ', 'ʆ', 'ɧ', 'ʂ', '\u0329', 't', '↓',
'↑', '→', '\u030f', '\u0300', '\u0304', '\u0301', '\u030b', 'ǀ', 'ʇ', 'θ',
'ʈ', 't', '\u0361', 's', 'ʦ', 't', '\u0361', 'ʂ', 'u', 'ʊ',
'ɞ', 'ɯ', 'u', '\u0361', 'ə', 'y', '\u0361', 'ə', 'v', 'ʋ',
'\u032c', 'ˠ', '\u030a', '\u0334', '\u0325', 'w', 'ʍ', 'ɥ', 'x', '\u02d8',
'\u0306', 'y', 'ʏ', 'ʉ', 'z', 'ʑ', 'ʒ', 'ʓ', 'ʐ'
}),
new PhoneMapCompressed(1028, 52, new byte[260]
{
48, 48, 50, 49, 0, 48, 48, 50, 54, 0,
48, 48, 50, 65, 0, 48, 48, 50, 66, 0,
48, 48, 50, 67, 0, 48, 48, 50, 68, 0,
48, 48, 50, 69, 0, 48, 48, 51, 70, 0,
48, 48, 53, 70, 0, 48, 50, 67, 55, 0,
48, 50, 67, 57, 0, 48, 50, 67, 65, 0,
48, 50, 67, 66, 0, 48, 50, 68, 57, 0,
51, 48, 48, 48, 0, 51, 49, 48, 53, 0,
51, 49, 48, 54, 0, 51, 49, 48, 55, 0,
51, 49, 48, 56, 0, 51, 49, 48, 57, 0,
51, 49, 48, 65, 0, 51, 49, 48, 66, 0,
51, 49, 48, 67, 0, 51, 49, 48, 68, 0,
51, 49, 48, 69, 0, 51, 49, 48, 70, 0,
51, 49, 49, 48, 0, 51, 49, 49, 49, 0,
51, 49, 49, 50, 0, 51, 49, 49, 51, 0,
51, 49, 49, 52, 0, 51, 49, 49, 53, 0,
51, 49, 49, 54, 0, 51, 49, 49, 55, 0,
51, 49, 49, 56, 0, 51, 49, 49, 57, 0,
51, 49, 49, 65, 0, 51, 49, 49, 66, 0,
51, 49, 49, 67, 0, 51, 49, 49, 68, 0,
51, 49, 49, 69, 0, 51, 49, 49, 70, 0,
51, 49, 50, 48, 0, 51, 49, 50, 49, 0,
51, 49, 50, 50, 0, 51, 49, 50, 51, 0,
51, 49, 50, 52, 0, 51, 49, 50, 53, 0,
51, 49, 50, 54, 0, 51, 49, 50, 55, 0,
51, 49, 50, 56, 0, 51, 49, 50, 57, 0
}, new char[52]
{
'!', '&', '*', '+', ',', '-', '.', '?', '_', 'ˇ',
'ˉ', 'ˊ', 'ˋ', '\u02d9', '\u3000', 'ㄅ', 'ㄆ', 'ㄇ', 'ㄈ', 'ㄉ',
'ㄊ', 'ㄋ', 'ㄌ', 'ㄍ', 'ㄎ', 'ㄏ', 'ㄐ', 'ㄑ', 'ㄒ', 'ㄓ',
'ㄔ', 'ㄕ', 'ㄖ', 'ㄗ', 'ㄘ', 'ㄙ', 'ㄚ', 'ㄛ', 'ㄜ', 'ㄝ',
'ㄞ', 'ㄟ', 'ㄠ', 'ㄡ', 'ㄢ', 'ㄣ', 'ㄤ', 'ㄥ', 'ㄦ', 'ㄧ',
'ㄨ', 'ㄩ'
}),
new PhoneMapCompressed(1031, 53, new byte[129]
{
45, 0, 33, 0, 38, 0, 44, 0, 46, 0,
58, 0, 63, 0, 94, 0, 95, 0, 126, 0,
49, 0, 50, 0, 65, 0, 65, 87, 0, 65,
88, 0, 65, 89, 0, 66, 0, 67, 72, 0,
68, 0, 69, 72, 0, 69, 85, 0, 69, 89,
0, 70, 0, 71, 0, 72, 0, 73, 72, 0,
73, 89, 0, 74, 72, 0, 75, 0, 76, 0,
77, 0, 78, 0, 78, 71, 0, 79, 69, 0,
79, 72, 0, 79, 87, 0, 79, 89, 0, 80,
0, 80, 70, 0, 82, 0, 83, 0, 83, 72,
0, 84, 0, 84, 83, 0, 85, 69, 0, 85,
72, 0, 85, 87, 0, 85, 89, 0, 86, 0,
88, 0, 89, 0, 90, 0, 90, 72, 0
}, new char[53]
{
'\u0001', '\u0002', '\u0003', '\u0004', '\u0005', '\f', '\u0006', '\b', '\a', '\v',
'\t', '\n', '\r', '\u000e', '\u000f', '\u0010', '\u0011', '\u0013', '\u0012', '\u0014',
'\u0015', '\u0016', '\u0017', '\u0018', '\u0019', '\u001a', '\u001b', '\u001c', '\u001d', '\u001e',
'\u001f', ' ', '!', '"', '#', '$', '%', '&', '\'', '(',
')', '*', '+', ',', '-', '.', '/', '0', '1', '2',
'3', '4', '5'
}),
new PhoneMapCompressed(1033, 49, new byte[121]
{
45, 0, 33, 0, 38, 0, 44, 0, 46, 0,
63, 0, 95, 0, 49, 0, 50, 0, 65, 65,
0, 65, 69, 0, 65, 72, 0, 65, 79, 0,
65, 87, 0, 65, 88, 0, 65, 89, 0, 66,
0, 67, 72, 0, 68, 0, 68, 72, 0, 69,
72, 0, 69, 82, 0, 69, 89, 0, 70, 0,
71, 0, 72, 0, 73, 72, 0, 73, 89, 0,
74, 72, 0, 75, 0, 76, 0, 77, 0, 78,
0, 78, 71, 0, 79, 87, 0, 79, 89, 0,
80, 0, 82, 0, 83, 0, 83, 72, 0, 84,
0, 84, 72, 0, 85, 72, 0, 85, 87, 0,
86, 0, 87, 0, 89, 0, 90, 0, 90, 72,
0
}, new char[49]
{
'\u0001', '\u0002', '\u0003', '\u0004', '\u0005', '\u0006', '\a', '\b', '\t', '\n',
'\v', '\f', '\r', '\u000e', '\u000f', '\u0010', '\u0011', '\u0012', '\u0013', '\u0014',
'\u0015', '\u0016', '\u0017', '\u0018', '\u0019', '\u001a', '\u001b', '\u001c', '\u001d', '\u001e',
'\u001f', ' ', '!', '"', '#', '$', '%', '&', '\'', '(',
')', '*', '+', ',', '-', '.', '/', '0', '1'
}),
new PhoneMapCompressed(1034, 35, new byte[76]
{
45, 0, 33, 0, 38, 0, 44, 0, 46, 0,
63, 0, 95, 0, 49, 0, 50, 0, 65, 0,
66, 0, 67, 72, 0, 68, 0, 69, 0, 70,
0, 71, 0, 73, 0, 74, 0, 74, 74, 0,
75, 0, 76, 0, 76, 76, 0, 77, 0, 78,
0, 78, 74, 0, 79, 0, 80, 0, 82, 0,
82, 82, 0, 83, 0, 84, 0, 84, 72, 0,
85, 0, 87, 0, 88, 0
}, new char[35]
{
'\u0001', '\u0002', '\u0003', '\u0004', '\u0005', '\u0006', '\a', '\b', '\t', '\n',
'\u0012', '\u0015', '\u0010', '\v', '\u0017', '\u0014', '\f', '!', '\u0016', '\u0013',
'\u001d', '\u001e', '\u001a', '\u001b', '\u001c', '\r', '\u0011', '\u001f', ' ', '\u0018',
'\u000f', '#', '\u000e', '"', '\u0019'
}),
new PhoneMapCompressed(1036, 42, new byte[100]
{
45, 0, 33, 0, 38, 0, 44, 0, 46, 0,
63, 0, 95, 0, 126, 0, 49, 0, 65, 0,
65, 65, 0, 65, 88, 0, 66, 0, 68, 0,
69, 72, 0, 69, 85, 0, 69, 89, 0, 70,
0, 71, 0, 72, 89, 0, 73, 89, 0, 75,
0, 76, 0, 77, 0, 78, 0, 78, 71, 0,
78, 74, 0, 79, 69, 0, 79, 72, 0, 79,
87, 0, 80, 0, 82, 0, 83, 0, 83, 72,
0, 84, 0, 85, 87, 0, 85, 89, 0, 86,
0, 87, 0, 89, 0, 90, 0, 90, 72, 0
}, new char[42]
{
'\u0001', '\u0002', '\u0003', '\u0004', '\u0005', '\u0006', '\a', '\t', '\b', '\v',
'\n', '\r', '\u000e', '\u000f', '\u0010', '\u001e', '\u0011', '\u0012', '\u0013', '\u0014',
'\u0016', '\u0017', '\u0018', '\u0019', '\u001a', '\u001b', '\u001c', '\u001d', '\f', '\u001f',
' ', '!', '"', '#', '$', '%', '\u0015', '&', '\'', '(',
')', '*'
}),
new PhoneMapCompressed(1041, 102, new byte[510]
{
48, 48, 50, 49, 0, 48, 48, 50, 55, 0,
48, 48, 50, 66, 0, 48, 48, 50, 69, 0,
48, 48, 51, 70, 0, 48, 48, 53, 70, 0,
48, 48, 55, 67, 0, 51, 48, 57, 67, 0,
51, 48, 65, 49, 0, 51, 48, 65, 50, 0,
51, 48, 65, 51, 0, 51, 48, 65, 52, 0,
51, 48, 65, 53, 0, 51, 48, 65, 54, 0,
51, 48, 65, 55, 0, 51, 48, 65, 56, 0,
51, 48, 65, 57, 0, 51, 48, 65, 65, 0,
51, 48, 65, 66, 0, 51, 48, 65, 67, 0,
51, 48, 65, 68, 0, 51, 48, 65, 69, 0,
51, 48, 65, 70, 0, 51, 48, 66, 48, 0,
51, 48, 66, 49, 0, 51, 48, 66, 50, 0,
51, 48, 66, 51, 0, 51, 48, 66, 52, 0,
51, 48, 66, 53, 0, 51, 48, 66, 54, 0,
51, 48, 66, 55, 0, 51, 48, 66, 56, 0,
51, 48, 66, 57, 0, 51, 48, 66, 65, 0,
51, 48, 66, 66, 0, 51, 48, 66, 67, 0,
51, 48, 66, 68, 0, 51, 48, 66, 69, 0,
51, 48, 66, 70, 0, 51, 48, 67, 48, 0,
51, 48, 67, 49, 0, 51, 48, 67, 50, 0,
51, 48, 67, 51, 0, 51, 48, 67, 52, 0,
51, 48, 67, 53, 0, 51, 48, 67, 54, 0,
51, 48, 67, 55, 0, 51, 48, 67, 56, 0,
51, 48, 67, 57, 0, 51, 48, 67, 65, 0,
51, 48, 67, 66, 0, 51, 48, 67, 67, 0,
51, 48, 67, 68, 0, 51, 48, 67, 69, 0,
51, 48, 67, 70, 0, 51, 48, 68, 48, 0,
51, 48, 68, 49, 0, 51, 48, 68, 50, 0,
51, 48, 68, 51, 0, 51, 48, 68, 52, 0,
51, 48, 68, 53, 0, 51, 48, 68, 54, 0,
51, 48, 68, 55, 0, 51, 48, 68, 56, 0,
51, 48, 68, 57, 0, 51, 48, 68, 65, 0,
51, 48, 68, 66, 0, 51, 48, 68, 67, 0,
51, 48, 68, 68, 0, 51, 48, 68, 69, 0,
51, 48, 68, 70, 0, 51, 48, 69, 48, 0,
51, 48, 69, 49, 0, 51, 48, 69, 50, 0,
51, 48, 69, 51, 0, 51, 48, 69, 52, 0,
51, 48, 69, 53, 0, 51, 48, 69, 54, 0,
51, 48, 69, 55, 0, 51, 48, 69, 56, 0,
51, 48, 69, 57, 0, 51, 48, 69, 65, 0,
51, 48, 69, 66, 0, 51, 48, 69, 67, 0,
51, 48, 69, 68, 0, 51, 48, 69, 69, 0,
51, 48, 69, 70, 0, 51, 48, 70, 48, 0,
51, 48, 70, 49, 0, 51, 48, 70, 50, 0,
51, 48, 70, 51, 0, 51, 48, 70, 52, 0,
51, 48, 70, 53, 0, 51, 48, 70, 54, 0,
51, 48, 70, 55, 0, 51, 48, 70, 56, 0,
51, 48, 70, 57, 0, 51, 48, 70, 65, 0,
51, 48, 70, 66, 0, 51, 48, 70, 67, 0,
51, 48, 70, 68, 0, 51, 48, 70, 69, 0
}, new char[102]
{
'!', '\'', '+', '.', '?', '_', '|', '\u309c', 'ァ', 'ア',
'ィ', 'イ', 'ゥ', 'ウ', 'ェ', 'エ', 'ォ', 'オ', 'カ', 'ガ',
'キ', 'ギ', 'ク', 'グ', 'ケ', 'ゲ', 'コ', 'ゴ', 'サ', 'ザ',
'シ', 'ジ', 'ス', 'ズ', 'セ', 'ゼ', 'ソ', 'ゾ', 'タ', 'ダ',
'チ', 'ヂ', 'ッ', 'ツ', 'ヅ', 'テ', 'デ', 'ト', 'ド', 'ナ',
'ニ', 'ヌ', 'ネ', 'ノ', 'ハ', 'バ', 'パ', 'ヒ', 'ビ', 'ピ',
'フ', 'ブ', 'プ', 'ヘ', 'ベ', 'ペ', 'ホ', 'ボ', 'ポ', 'マ',
'ミ', 'ム', 'メ', 'モ', 'ャ', 'ヤ', 'ュ', 'ユ', 'ョ', 'ヨ',
'ラ', 'リ', 'ル', 'レ', 'ロ', 'ヮ', 'ワ', 'ヰ', 'ヱ', 'ヲ',
'ン', 'ヴ', 'ヵ', 'ヶ', 'ヷ', 'ヸ', 'ヹ', 'ヺ', '・', 'ー',
'ヽ', 'ヾ'
}),
new PhoneMapCompressed(2052, 422, new byte[1755]
{
45, 0, 33, 0, 38, 0, 42, 0, 44, 0,
46, 0, 63, 0, 95, 0, 43, 0, 49, 0,
50, 0, 51, 0, 52, 0, 53, 0, 65, 0,
65, 73, 0, 65, 78, 0, 65, 78, 71, 0,
65, 79, 0, 66, 65, 0, 66, 65, 73, 0,
66, 65, 78, 0, 66, 65, 78, 71, 0, 66,
65, 79, 0, 66, 69, 73, 0, 66, 69, 78,
0, 66, 69, 78, 71, 0, 66, 73, 0, 66,
73, 65, 78, 0, 66, 73, 65, 79, 0, 66,
73, 69, 0, 66, 73, 78, 0, 66, 73, 78,
71, 0, 66, 79, 0, 66, 85, 0, 67, 65,
0, 67, 65, 73, 0, 67, 65, 78, 0, 67,
65, 78, 71, 0, 67, 65, 79, 0, 67, 69,
0, 67, 69, 78, 0, 67, 69, 78, 71, 0,
67, 72, 65, 0, 67, 72, 65, 73, 0, 67,
72, 65, 78, 0, 67, 72, 65, 78, 71, 0,
67, 72, 65, 79, 0, 67, 72, 69, 0, 67,
72, 69, 78, 0, 67, 72, 69, 78, 71, 0,
67, 72, 73, 0, 67, 72, 79, 78, 71, 0,
67, 72, 79, 85, 0, 67, 72, 85, 0, 67,
72, 85, 65, 73, 0, 67, 72, 85, 65, 78,
0, 67, 72, 85, 65, 78, 71, 0, 67, 72,
85, 73, 0, 67, 72, 85, 78, 0, 67, 72,
85, 79, 0, 67, 73, 0, 67, 79, 78, 71,
0, 67, 79, 85, 0, 67, 85, 0, 67, 85,
65, 78, 0, 67, 85, 73, 0, 67, 85, 78,
0, 67, 85, 79, 0, 68, 65, 0, 68, 65,
73, 0, 68, 65, 78, 0, 68, 65, 78, 71,
0, 68, 65, 79, 0, 68, 69, 0, 68, 69,
73, 0, 68, 69, 78, 0, 68, 69, 78, 71,
0, 68, 73, 0, 68, 73, 65, 0, 68, 73,
65, 78, 0, 68, 73, 65, 79, 0, 68, 73,
69, 0, 68, 73, 78, 71, 0, 68, 73, 85,
0, 68, 79, 78, 71, 0, 68, 79, 85, 0,
68, 85, 0, 68, 85, 65, 78, 0, 68, 85,
73, 0, 68, 85, 78, 0, 68, 85, 79, 0,
69, 0, 69, 73, 0, 69, 78, 0, 69, 82,
0, 70, 65, 0, 70, 65, 78, 0, 70, 65,
78, 71, 0, 70, 69, 73, 0, 70, 69, 78,
0, 70, 69, 78, 71, 0, 70, 79, 0, 70,
79, 85, 0, 70, 85, 0, 71, 65, 0, 71,
65, 73, 0, 71, 65, 78, 0, 71, 65, 78,
71, 0, 71, 65, 79, 0, 71, 69, 0, 71,
69, 73, 0, 71, 69, 78, 0, 71, 69, 78,
71, 0, 71, 79, 78, 71, 0, 71, 79, 85,
0, 71, 85, 0, 71, 85, 65, 0, 71, 85,
65, 73, 0, 71, 85, 65, 78, 0, 71, 85,
65, 78, 71, 0, 71, 85, 73, 0, 71, 85,
78, 0, 71, 85, 79, 0, 72, 65, 0, 72,
65, 73, 0, 72, 65, 78, 0, 72, 65, 78,
71, 0, 72, 65, 79, 0, 72, 69, 0, 72,
69, 73, 0, 72, 69, 78, 0, 72, 69, 78,
71, 0, 72, 79, 78, 71, 0, 72, 79, 85,
0, 72, 85, 0, 72, 85, 65, 0, 72, 85,
65, 73, 0, 72, 85, 65, 78, 0, 72, 85,
65, 78, 71, 0, 72, 85, 73, 0, 72, 85,
78, 0, 72, 85, 79, 0, 74, 73, 0, 74,
73, 65, 0, 74, 73, 65, 78, 0, 74, 73,
65, 78, 71, 0, 74, 73, 65, 79, 0, 74,
73, 69, 0, 74, 73, 78, 0, 74, 73, 78,
71, 0, 74, 73, 79, 78, 71, 0, 74, 73,
85, 0, 74, 85, 0, 74, 85, 65, 78, 0,
74, 85, 69, 0, 74, 85, 78, 0, 75, 65,
0, 75, 65, 73, 0, 75, 65, 78, 0, 75,
65, 78, 71, 0, 75, 65, 79, 0, 75, 69,
0, 75, 69, 73, 0, 75, 69, 78, 0, 75,
69, 78, 71, 0, 75, 79, 78, 71, 0, 75,
79, 85, 0, 75, 85, 0, 75, 85, 65, 0,
75, 85, 65, 73, 0, 75, 85, 65, 78, 0,
75, 85, 65, 78, 71, 0, 75, 85, 73, 0,
75, 85, 78, 0, 75, 85, 79, 0, 76, 65,
0, 76, 65, 73, 0, 76, 65, 78, 0, 76,
65, 78, 71, 0, 76, 65, 79, 0, 76, 69,
0, 76, 69, 73, 0, 76, 69, 78, 71, 0,
76, 73, 0, 76, 73, 65, 0, 76, 73, 65,
78, 0, 76, 73, 65, 78, 71, 0, 76, 73,
65, 79, 0, 76, 73, 69, 0, 76, 73, 78,
0, 76, 73, 78, 71, 0, 76, 73, 85, 0,
76, 79, 0, 76, 79, 78, 71, 0, 76, 79,
85, 0, 76, 85, 0, 76, 85, 65, 78, 0,
76, 85, 69, 0, 76, 85, 78, 0, 76, 85,
79, 0, 76, 86, 0, 77, 65, 0, 77, 65,
73, 0, 77, 65, 78, 0, 77, 65, 78, 71,
0, 77, 65, 79, 0, 77, 69, 0, 77, 69,
73, 0, 77, 69, 78, 0, 77, 69, 78, 71,
0, 77, 73, 0, 77, 73, 65, 78, 0, 77,
73, 65, 79, 0, 77, 73, 69, 0, 77, 73,
78, 0, 77, 73, 78, 71, 0, 77, 73, 85,
0, 77, 79, 0, 77, 79, 85, 0, 77, 85,
0, 78, 65, 0, 78, 65, 73, 0, 78, 65,
78, 0, 78, 65, 78, 71, 0, 78, 65, 79,
0, 78, 69, 0, 78, 69, 73, 0, 78, 69,
78, 0, 78, 69, 78, 71, 0, 78, 73, 0,
78, 73, 65, 78, 0, 78, 73, 65, 78, 71,
0, 78, 73, 65, 79, 0, 78, 73, 69, 0,
78, 73, 78, 0, 78, 73, 78, 71, 0, 78,
73, 85, 0, 78, 79, 78, 71, 0, 78, 79,
85, 0, 78, 85, 0, 78, 85, 65, 78, 0,
78, 85, 69, 0, 78, 85, 79, 0, 78, 86,
0, 79, 0, 79, 85, 0, 80, 65, 0, 80,
65, 73, 0, 80, 65, 78, 0, 80, 65, 78,
71, 0, 80, 65, 79, 0, 80, 69, 73, 0,
80, 69, 78, 0, 80, 69, 78, 71, 0, 80,
73, 0, 80, 73, 65, 78, 0, 80, 73, 65,
79, 0, 80, 73, 69, 0, 80, 73, 78, 0,
80, 73, 78, 71, 0, 80, 79, 0, 80, 79,
85, 0, 80, 85, 0, 81, 73, 0, 81, 73,
65, 0, 81, 73, 65, 78, 0, 81, 73, 65,
78, 71, 0, 81, 73, 65, 79, 0, 81, 73,
69, 0, 81, 73, 78, 0, 81, 73, 78, 71,
0, 81, 73, 79, 78, 71, 0, 81, 73, 85,
0, 81, 85, 0, 81, 85, 65, 78, 0, 81,
85, 69, 0, 81, 85, 78, 0, 82, 65, 78,
0, 82, 65, 78, 71, 0, 82, 65, 79, 0,
82, 69, 0, 82, 69, 78, 0, 82, 69, 78,
71, 0, 82, 73, 0, 82, 79, 78, 71, 0,
82, 79, 85, 0, 82, 85, 0, 82, 85, 65,
78, 0, 82, 85, 73, 0, 82, 85, 78, 0,
82, 85, 79, 0, 83, 65, 0, 83, 65, 73,
0, 83, 65, 78, 0, 83, 65, 78, 71, 0,
83, 65, 79, 0, 83, 69, 0, 83, 69, 78,
0, 83, 69, 78, 71, 0, 83, 72, 65, 0,
83, 72, 65, 73, 0, 83, 72, 65, 78, 0,
83, 72, 65, 78, 71, 0, 83, 72, 65, 79,
0, 83, 72, 69, 0, 83, 72, 69, 73, 0,
83, 72, 69, 78, 0, 83, 72, 69, 78, 71,
0, 83, 72, 73, 0, 83, 72, 79, 85, 0,
83, 72, 85, 0, 83, 72, 85, 65, 0, 83,
72, 85, 65, 73, 0, 83, 72, 85, 65, 78,
0, 83, 72, 85, 65, 78, 71, 0, 83, 72,
85, 73, 0, 83, 72, 85, 78, 0, 83, 72,
85, 79, 0, 83, 73, 0, 83, 79, 78, 71,
0, 83, 79, 85, 0, 83, 85, 0, 83, 85,
65, 78, 0, 83, 85, 73, 0, 83, 85, 78,
0, 83, 85, 79, 0, 84, 65, 0, 84, 65,
73, 0, 84, 65, 78, 0, 84, 65, 78, 71,
0, 84, 65, 79, 0, 84, 69, 0, 84, 69,
73, 0, 84, 69, 78, 71, 0, 84, 73, 0,
84, 73, 65, 78, 0, 84, 73, 65, 79, 0,
84, 73, 69, 0, 84, 73, 78, 71, 0, 84,
79, 78, 71, 0, 84, 79, 85, 0, 84, 85,
0, 84, 85, 65, 78, 0, 84, 85, 73, 0,
84, 85, 78, 0, 84, 85, 79, 0, 87, 65,
0, 87, 65, 73, 0, 87, 65, 78, 0, 87,
65, 78, 71, 0, 87, 69, 73, 0, 87, 69,
78, 0, 87, 69, 78, 71, 0, 87, 79, 0,
87, 85, 0, 88, 73, 0, 88, 73, 65, 0,
88, 73, 65, 78, 0, 88, 73, 65, 78, 71,
0, 88, 73, 65, 79, 0, 88, 73, 69, 0,
88, 73, 78, 0, 88, 73, 78, 71, 0, 88,
73, 79, 78, 71, 0, 88, 73, 85, 0, 88,
85, 0, 88, 85, 65, 78, 0, 88, 85, 69,
0, 88, 85, 78, 0, 89, 65, 0, 89, 65,
78, 0, 89, 65, 78, 71, 0, 89, 65, 79,
0, 89, 69, 0, 89, 73, 0, 89, 73, 78,
0, 89, 73, 78, 71, 0, 89, 79, 0, 89,
79, 78, 71, 0, 89, 79, 85, 0, 89, 85,
0, 89, 85, 65, 78, 0, 89, 85, 69, 0,
89, 85, 78, 0, 90, 65, 0, 90, 65, 73,
0, 90, 65, 78, 0, 90, 65, 78, 71, 0,
90, 65, 79, 0, 90, 69, 0, 90, 69, 73,
0, 90, 69, 78, 0, 90, 69, 78, 71, 0,
90, 72, 65, 0, 90, 72, 65, 73, 0, 90,
72, 65, 78, 0, 90, 72, 65, 78, 71, 0,
90, 72, 65, 79, 0, 90, 72, 69, 0, 90,
72, 69, 73, 0, 90, 72, 69, 78, 0, 90,
72, 69, 78, 71, 0, 90, 72, 73, 0, 90,
72, 79, 78, 71, 0, 90, 72, 79, 85, 0,
90, 72, 85, 0, 90, 72, 85, 65, 0, 90,
72, 85, 65, 73, 0, 90, 72, 85, 65, 78,
0, 90, 72, 85, 65, 78, 71, 0, 90, 72,
85, 73, 0, 90, 72, 85, 78, 0, 90, 72,
85, 79, 0, 90, 73, 0, 90, 79, 78, 71,
0, 90, 79, 85, 0, 90, 85, 0, 90, 85,
65, 78, 0, 90, 85, 73, 0, 90, 85, 78,
0, 90, 85, 79, 0
}, new char[422]
{
'\u0001', '\u0002', '\u0003', '\t', '\u0004', '\u0005', '\u0006', '\a', '\b', '\n',
'\v', '\f', '\r', '\u000e', '\u000f', '\u0010', '\u0011', '\u0012', '\u0013', '\u0014',
'\u0015', '\u0016', '\u0017', '\u0018', '\u0019', '\u001a', '\u001b', '\u001c', '\u001d', '\u001e',
'\u001f', ' ', '!', '"', '#', '$', '%', '&', '\'', '(',
')', '*', '+', ',', '-', '.', '/', '0', '1', '2',
'3', '4', '5', '6', '7', '8', '9', ':', ';', '<',
'=', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F',
'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'[', '\\', ']', '^', '_', '`', 'a', 'b', 'c', 'd',
'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
'y', 'z', '{', '|', '}', '~', '\u007f', '\u0080', '\u0081', '\u0082',
'\u0083', '\u0084', '\u0085', '\u0086', '\u0087', '\u0088', '\u0089', '\u008a', '\u008b', '\u008c',
'\u008d', '\u008e', '\u008f', '\u0090', '\u0091', '\u0092', '\u0093', '\u0094', '\u0095', '\u0096',
'\u0097', '\u0098', '\u0099', '\u009a', '\u009b', '\u009c', '\u009d', '\u009e', '\u009f', '\u00a0',
'¡', '¢', '£', '¤', '¥', '¦', '§', '\u00a8', '©', 'ª',
'«', '¬', '\u00ad', '®', '\u00af', '°', '±', '²', '³', '\u00b4',
'µ', '¶', '·', '\u00b8', '¹', 'º', '»', '¼', '½', '¾',
'¿', 'À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È',
'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ð', 'Ñ', 'Ò',
'Ó', 'Ô', 'Õ', 'Ö', '×', 'Ø', 'Ù', 'Ú', 'Û', 'Ü',
'Ý', 'Þ', 'ß', 'à', 'á', 'â', 'ã', 'ä', 'å', 'æ',
'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ð',
'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', '÷', 'ø', 'ù', 'ú',
'û', 'ü', 'ý', 'þ', 'ÿ', 'Ā', 'ā', 'Ă', 'ă', 'Ą',
'ą', 'Ć', 'ć', 'Ĉ', 'ĉ', 'Ċ', 'ċ', 'Č', 'č', 'Ď',
'ď', 'Đ', 'đ', 'Ē', 'ē', 'Ĕ', 'ĕ', 'Ė', 'ė', 'Ę',
'ę', 'Ě', 'ě', 'Ĝ', 'ĝ', 'Ğ', 'ğ', 'Ġ', 'ġ', 'Ģ',
'ģ', 'Ĥ', 'ĥ', 'Ħ', 'ħ', 'Ĩ', 'ĩ', 'Ī', 'ī', 'Ĭ',
'ĭ', 'Į', 'į', 'İ', 'ı', 'IJ', 'ij', 'Ĵ', 'ĵ', 'Ķ',
'ķ', 'ĸ', 'Ĺ', 'ĺ', 'Ļ', 'ļ', 'Ľ', 'ľ', 'Ŀ', 'ŀ',
'Ł', 'ł', 'Ń', 'ń', 'Ņ', 'ņ', 'Ň', 'ň', 'ʼn', 'Ŋ',
'ŋ', 'Ō', 'ō', 'Ŏ', 'ŏ', 'Ő', 'ő', 'Œ', 'œ', 'Ŕ',
'ŕ', 'Ŗ', 'ŗ', 'Ř', 'ř', 'Ś', 'ś', 'Ŝ', 'ŝ', 'Ş',
'ş', 'Š', 'š', 'Ţ', 'ţ', 'Ť', 'ť', 'Ŧ', 'ŧ', 'Ũ',
'ũ', 'Ū', 'ū', 'Ŭ', 'ŭ', 'Ů', 'ů', 'Ű', 'ű', 'Ų',
'ų', 'Ŵ', 'ŵ', 'Ŷ', 'ŷ', 'Ÿ', 'Ź', 'ź', 'Ż', 'ż',
'Ž', 'ž', 'ſ', 'ƀ', 'Ɓ', 'Ƃ', 'ƃ', 'Ƅ', 'ƅ', 'Ɔ',
'Ƈ', 'ƈ', 'Ɖ', 'Ɗ', 'Ƌ', 'ƌ', 'ƍ', 'Ǝ', 'Ə', 'Ɛ',
'Ƒ', 'ƒ', 'Ɠ', 'Ɣ', 'ƕ', 'Ɩ', 'Ɨ', 'Ƙ', 'ƙ', 'ƚ',
'ƛ', 'Ɯ', 'Ɲ', 'ƞ', 'Ɵ', 'Ơ', 'ơ', 'Ƣ', 'ƣ', 'Ƥ',
'ƥ', 'Ʀ'
})
};
_updIds = new char[185]
{
'\u0001', '\u0002', '\u0003', '\u0004', '!', '.', 'a', 'b', 'c', 'd',
'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
'y', 'z', '|', 'æ', 'ç', 'ð', 'ø', 'ħ', 'ŋ', 'œ',
'ǀ', 'ǁ', 'ǂ', 'ǃ', 'ɐ', 'ɑ', 'ɒ', 'ɓ', 'ɔ', 'ɕ',
'ɖ', 'ɗ', 'ɘ', 'ə', 'ɚ', 'ɛ', 'ɜ', 'ɝ', 'ɞ', 'ɟ',
'ɠ', 'ɡ', 'ɢ', 'ɣ', 'ɤ', 'ɥ', 'ɦ', 'ɧ', 'ɨ', 'ɪ',
'ɫ', 'ɬ', 'ɭ', 'ɮ', 'ɯ', 'ɰ', 'ɱ', 'ɲ', 'ɳ', 'ɴ',
'ɵ', 'ɶ', 'ɸ', 'ɹ', 'ɺ', 'ɻ', 'ɽ', 'ɾ', 'ʀ', 'ʁ',
'ʂ', 'ʃ', 'ʄ', 'ʆ', 'ʇ', 'ʈ', 'ʉ', 'ʊ', 'ʋ', 'ʌ',
'ʍ', 'ʎ', 'ʏ', 'ʐ', 'ʑ', 'ʒ', 'ʓ', 'ʔ', 'ʕ', 'ʖ',
'ʗ', 'ʘ', 'ʙ', 'ʛ', 'ʜ', 'ʝ', 'ʟ', 'ʠ', 'ʡ', 'ʢ',
'ʣ', 'ʤ', 'ʥ', 'ʦ', 'ʧ', 'ʨ', 'ʰ', 'ʱ', 'ʲ', 'ʴ',
'ʷ', 'ʼ', 'ˈ', 'ˌ', 'ː', 'ˑ', '\u02d8', '\u02de', 'ˠ', 'ˡ',
'ˤ', '\u0300', '\u0301', '\u0303', '\u0304', '\u0306', '\u0308', '\u030a', '\u030b', '\u030f',
'\u0318', '\u0319', '\u031a', '\u031c', '\u031d', '\u031e', '\u031f', '\u0320', '\u0324', '\u0325',
'\u0329', '\u032a', '\u032c', '\u032f', '\u0330', '\u0331', '\u0334', '\u0339', '\u033a', '\u033b',
'\u033c', '\u033d', '\u0361', 'β', 'θ', 'χ', '\u0740', '‖', '\u203f', 'ⁿ',
'↑', '→', '↓', '↗', '↘'
};
_phoneMaps = DecompressPhoneMaps(_phoneMapsCompressed);
_upsConverter = new PhonemeConverter(_phoneMaps[0]);
}
private PhonemeConverter(PhoneMap phoneMap)
{
_phoneMap = phoneMap;
}
internal static string ConvertPronToId(string pronunciation, int lcid)
{
PhonemeConverter phonemeConverter = UpsConverter;
PhoneMap[] phoneMaps = _phoneMaps;
foreach (PhoneMap phoneMap in phoneMaps)
{
if (phoneMap._lcid == lcid)
{
phonemeConverter = new PhonemeConverter(phoneMap);
}
}
string text = phonemeConverter.ConvertPronToId(pronunciation);
if (string.IsNullOrEmpty(text))
{
throw new FormatException(SR.Get(SRID.EmptyPronunciationString));
}
return text;
}
internal string ConvertPronToId(string sPhone)
{
sPhone = sPhone.Trim(Helpers._achTrimChars);
if (string.IsNullOrEmpty(sPhone))
{
return string.Empty;
}
int i = 0;
int length = sPhone.Length;
StringBuilder stringBuilder = new StringBuilder(length);
PhoneId phoneId = new PhoneId();
while (i < length)
{
int num = sPhone.IndexOf(' ', i + 1);
if (num < 0)
{
num = length;
}
string text = sPhone.Substring(i, num - i);
string phone = text.ToUpperInvariant();
phoneId._phone = phone;
int num2 = Array.BinarySearch(_phoneMap._phoneIds, phoneId, phoneId);
if (num2 >= 0)
{
char[] cp = _phoneMap._phoneIds[num2]._cp;
foreach (char value in cp)
{
stringBuilder.Append(value);
}
for (i = num; i < length && sPhone[i] == ' '; i++)
{
}
continue;
}
throw new FormatException(SR.Get(SRID.InvalidPhoneme, text));
}
return stringBuilder.ToString();
}
internal static void ValidateUpsIds(string ids)
{
ValidateUpsIds(ids.ToCharArray());
}
internal static void ValidateUpsIds(char[] ids)
{
foreach (char c in ids)
{
if (Array.BinarySearch(_updIds, c) < 0)
{
throw new FormatException(SR.Get(SRID.InvalidPhoneme, c));
}
}
}
private static PhoneMap[] DecompressPhoneMaps(PhoneMapCompressed[] pmComps)
{
PhoneMap[] array = new PhoneMap[pmComps.Length];
for (int i = 0; i < pmComps.Length; i++)
{
PhoneMapCompressed phoneMapCompressed = pmComps[i];
PhoneMap phoneMap = (array[i] = new PhoneMap());
phoneMap._lcid = phoneMapCompressed._lcid;
phoneMap._phoneIds = new PhoneId[phoneMapCompressed._count];
int num = 0;
int num2 = 0;
for (int j = 0; j < phoneMap._phoneIds.Length; j++)
{
phoneMap._phoneIds[j] = new PhoneId();
int num3 = 0;
int k;
for (k = num; phoneMapCompressed._phones[k] != 0; k++)
{
if (phoneMapCompressed._phones[k] == byte.MaxValue)
{
num3++;
}
}
int num4 = k - num - num3;
char[] array2 = new char[num4];
for (int l = 0; l < num4; l++)
{
array2[l] = (char)phoneMapCompressed._phones[num++];
}
num += num3 + 1;
phoneMap._phoneIds[j]._phone = new string(array2);
phoneMap._phoneIds[j]._cp = new char[num3 + 1];
for (int m = 0; m < phoneMap._phoneIds[j]._cp.Length; m++)
{
phoneMap._phoneIds[j]._cp[m] = phoneMapCompressed._cps[num2++];
}
}
}
return array;
}
}
internal abstract class RedBackList : IEnumerable
{
private class MyEnumerator : IEnumerator
{
private TreeNode _node;
private TreeNode _root;
private bool _moved;
public object Current
{
get
{
if (_node == null)
{
throw new InvalidOperationException();
}
return _node.Key;
}
}
internal MyEnumerator(TreeNode node)
{
_root = node;
}
public bool MoveNext()
{
if (!_moved)
{
_node = ((_root != null) ? FindMinSubTree(_root) : null);
_moved = true;
}
else
{
_node = ((_node != null) ? FindSuccessor(_node) : null);
}
return _node != null;
}
public void Reset()
{
_moved = false;
_node = null;
}
}
private class TreeNode
{
private object _key;
private bool _isRed;
private TreeNode _leftChild;
private TreeNode _rightChild;
private TreeNode _parent;
internal TreeNode Left
{
get
{
return _leftChild;
}
set
{
_leftChild = value;
if (_leftChild != null)
{
_leftChild._parent = this;
}
}
}
internal TreeNode Right
{
get
{
return _rightChild;
}
set
{
_rightChild = value;
if (_rightChild != null)
{
_rightChild._parent = this;
}
}
}
internal TreeNode Parent
{
get
{
return _parent;
}
set
{
_parent = value;
}
}
internal bool IsRed
{
get
{
return _isRed;
}
set
{
_isRed = value;
}
}
internal object Key => _key;
internal TreeNode(object key)
{
_key = key;
}
internal void CopyNode(TreeNode from)
{
_key = from._key;
}
}
private enum NodeColor
{
BLACK,
RED
}
private TreeNode _root;
internal bool IsEmpty => _root == null;
internal bool CountIsOne
{
get
{
if (_root != null && _root.Left == null)
{
return _root.Right == null;
}
return false;
}
}
internal bool ContainsMoreThanOneItem
{
get
{
if (_root != null)
{
if (_root.Right == null)
{
return _root.Left != null;
}
return true;
}
return false;
}
}
internal object First
{
get
{
if (_root == null)
{
return null;
}
return FindMinSubTree(_root).Key;
}
}
internal RedBackList()
{
}
internal void Add(object key)
{
TreeNode treeNode = new TreeNode(key);
treeNode.IsRed = true;
InsertNode(_root, treeNode);
FixUpInsertion(treeNode);
_root = FindRoot(treeNode);
}
internal void Remove(object key)
{
TreeNode treeNode = FindItem(_root, key);
if (treeNode == null)
{
throw new KeyNotFoundException();
}
TreeNode treeNode2 = DeleteNode(treeNode);
FixUpRemoval(treeNode2);
if (treeNode2 == _root)
{
if (_root.Left != null)
{
_root = FindRoot(_root.Left);
}
else if (_root.Right != null)
{
_root = FindRoot(_root.Right);
}
else
{
_root = null;
}
}
else
{
_root = FindRoot(_root);
}
}
public IEnumerator GetEnumerator()
{
return new MyEnumerator(_root);
}
protected abstract int CompareTo(object object1, object object2);
private static TreeNode GetUncle(TreeNode node)
{
if (node.Parent == node.Parent.Parent.Left)
{
return node.Parent.Parent.Right;
}
return node.Parent.Parent.Left;
}
private static TreeNode GetSibling(TreeNode node, TreeNode parent)
{
if (node == parent.Left)
{
return parent.Right;
}
return parent.Left;
}
private static NodeColor GetColor(TreeNode node)
{
if (node != null)
{
if (!node.IsRed)
{
return NodeColor.BLACK;
}
return NodeColor.RED;
}
return NodeColor.BLACK;
}
private static void SetColor(TreeNode node, NodeColor color)
{
if (node != null)
{
node.IsRed = color == NodeColor.RED;
}
}
private static void TakeParent(TreeNode node, TreeNode newNode)
{
if (node.Parent == null)
{
if (newNode != null)
{
newNode.Parent = null;
}
return;
}
if (node.Parent.Left == node)
{
node.Parent.Left = newNode;
return;
}
if (node.Parent.Right == node)
{
node.Parent.Right = newNode;
return;
}
throw new InvalidOperationException();
}
private static TreeNode RotateLeft(TreeNode node)
{
TreeNode right = node.Right;
node.Right = right.Left;
TakeParent(node, right);
right.Left = node;
return right;
}
private static TreeNode RotateRight(TreeNode node)
{
TreeNode left = node.Left;
node.Left = left.Right;
TakeParent(node, left);
left.Right = node;
return left;
}
private static TreeNode FindMinSubTree(TreeNode node)
{
while (node.Left != null)
{
node = node.Left;
}
return node;
}
private static TreeNode FindSuccessor(TreeNode node)
{
if (node.Right == null)
{
while (node.Parent != null && node.Parent.Left != node)
{
node = node.Parent;
}
if (node.Parent != null)
{
return node.Parent;
}
return null;
}
return FindMinSubTree(node.Right);
}
private static TreeNode DeleteNode(TreeNode node)
{
if (node.Right == null)
{
TakeParent(node, node.Left);
return node;
}
if (node.Left == null)
{
TakeParent(node, node.Right);
return node;
}
TreeNode treeNode = FindSuccessor(node);
node.CopyNode(treeNode);
TakeParent(treeNode, treeNode.Right);
return treeNode;
}
private TreeNode InsertNode(TreeNode node, TreeNode newNode)
{
if (node == null)
{
return newNode;
}
int num = CompareTo(newNode.Key, node.Key);
if (num < 0)
{
node.Left = InsertNode(node.Left, newNode);
}
else
{
node.Right = InsertNode(node.Right, newNode);
}
return node;
}
private TreeNode FindItem(TreeNode node, object key)
{
if (node == null)
{
return null;
}
int num = CompareTo(key, node.Key);
if (num == 0)
{
return node;
}
if (num < 0)
{
return FindItem(node.Left, key);
}
return FindItem(node.Right, key);
}
private TreeNode FindRoot(TreeNode node)
{
while (node.Parent != null)
{
node = node.Parent;
}
return node;
}
private void FixUpInsertion(TreeNode node)
{
FixInsertCase1(node);
}
private void FixInsertCase1(TreeNode node)
{
if (node.Parent == null)
{
node.IsRed = false;
}
else
{
FixInsertCase2(node);
}
}
private void FixInsertCase2(TreeNode node)
{
if (GetColor(node.Parent) != 0)
{
TreeNode uncle = GetUncle(node);
if (GetColor(uncle) == NodeColor.RED)
{
SetColor(node.Parent, NodeColor.BLACK);
SetColor(uncle, NodeColor.BLACK);
SetColor(node.Parent.Parent, NodeColor.RED);
FixInsertCase1(node.Parent.Parent);
}
else
{
FixInsertCase3(node);
}
}
}
private void FixInsertCase3(TreeNode node)
{
if (node == node.Parent.Right && node.Parent == node.Parent.Parent.Left)
{
RotateLeft(node.Parent);
node = node.Left;
}
else if (node == node.Parent.Left && node.Parent == node.Parent.Parent.Right)
{
RotateRight(node.Parent);
node = node.Right;
}
FixInsertCase4(node);
}
private void FixInsertCase4(TreeNode node)
{
SetColor(node.Parent, NodeColor.BLACK);
SetColor(node.Parent.Parent, NodeColor.RED);
if (node == node.Parent.Left)
{
RotateRight(node.Parent.Parent);
}
else
{
RotateLeft(node.Parent.Parent);
}
}
private static void FixUpRemoval(TreeNode node)
{
TreeNode node2 = ((node.Left == null) ? node.Right : node.Left);
if (GetColor(node) == NodeColor.BLACK)
{
if (GetColor(node2) == NodeColor.RED)
{
SetColor(node2, NodeColor.BLACK);
}
else if (node.Parent != null)
{
FixRemovalCase2(GetSibling(node2, node.Parent));
}
}
}
private static void FixRemovalCase1(TreeNode node)
{
if (node.Parent != null)
{
FixRemovalCase2(GetSibling(node, node.Parent));
}
}
private static void FixRemovalCase2(TreeNode sibling)
{
if (GetColor(sibling) == NodeColor.RED)
{
TreeNode parent = sibling.Parent;
SetColor(parent, NodeColor.RED);
SetColor(sibling, NodeColor.BLACK);
if (sibling == parent.Right)
{
RotateLeft(sibling.Parent);
sibling = parent.Right;
}
else
{
RotateRight(sibling.Parent);
sibling = parent.Left;
}
}
FixRemovalCase3(sibling);
}
private static void FixRemovalCase3(TreeNode sibling)
{
if (GetColor(sibling.Parent) == NodeColor.BLACK && GetColor(sibling) == NodeColor.BLACK && GetColor(sibling.Left) == NodeColor.BLACK && GetColor(sibling.Right) == NodeColor.BLACK)
{
SetColor(sibling, NodeColor.RED);
FixRemovalCase1(sibling.Parent);
}
else
{
FixRemovalCase4(sibling);
}
}
private static void FixRemovalCase4(TreeNode sibling)
{
if (GetColor(sibling.Parent) == NodeColor.RED && GetColor(sibling) == NodeColor.BLACK && GetColor(sibling.Left) == NodeColor.BLACK && GetColor(sibling.Right) == NodeColor.BLACK)
{
SetColor(sibling, NodeColor.RED);
SetColor(sibling.Parent, NodeColor.BLACK);
}
else
{
FixRemovalCase5(sibling);
}
}
private static void FixRemovalCase5(TreeNode sibling)
{
if (sibling == sibling.Parent.Right && GetColor(sibling) == NodeColor.BLACK && GetColor(sibling.Left) == NodeColor.RED && GetColor(sibling.Right) == NodeColor.BLACK)
{
SetColor(sibling, NodeColor.RED);
SetColor(sibling.Left, NodeColor.BLACK);
RotateRight(sibling);
sibling = sibling.Parent;
}
else if (sibling == sibling.Parent.Left && GetColor(sibling) == NodeColor.BLACK && GetColor(sibling.Right) == NodeColor.RED && GetColor(sibling.Left) == NodeColor.BLACK)
{
SetColor(sibling, NodeColor.RED);
SetColor(sibling.Right, NodeColor.BLACK);
RotateLeft(sibling);
sibling = sibling.Parent;
}
FixRemovalCase6(sibling);
}
private static void FixRemovalCase6(TreeNode sibling)
{
SetColor(sibling, GetColor(sibling.Parent));
SetColor(sibling.Parent, NodeColor.BLACK);
if (sibling == sibling.Parent.Right)
{
SetColor(sibling.Right, NodeColor.BLACK);
RotateLeft(sibling.Parent);
}
else
{
SetColor(sibling.Left, NodeColor.BLACK);
RotateRight(sibling.Parent);
}
}
}
internal class ResourceLoader
{
internal Stream LoadFile(Uri uri, out string mimeType, out Uri baseUri, out string localPath)
{
localPath = null;
Stream stream = null;
if (!uri.IsAbsoluteUri || uri.IsFile)
{
string text = (uri.IsAbsoluteUri ? uri.LocalPath : uri.OriginalString);
try
{
stream = new FileStream(text, FileMode.Open, FileAccess.Read, FileShare.Read);
}
catch
{
if (Directory.Exists(text))
{
throw new InvalidOperationException(SR.Get(SRID.CannotReadFromDirectory, text));
}
throw;
}
baseUri = null;
}
else
{
try
{
stream = DownloadData(uri, out baseUri);
}
catch (WebException ex)
{
throw new IOException(ex.Message, ex);
}
}
mimeType = null;
return stream;
}
internal void UnloadFile(string localPath)
{
}
internal Stream LoadFile(Uri uri, out string localPath, out Uri redirectedUri)
{
string mimeType;
return LoadFile(uri, out mimeType, out redirectedUri, out localPath);
}
private static Stream DownloadData(Uri uri, out Uri redirectedUri)
{
WebRequest webRequest = WebRequest.Create(uri);
webRequest.Credentials = CredentialCache.DefaultCredentials;
using HttpWebResponse httpWebResponse = (HttpWebResponse)webRequest.GetResponse();
using (httpWebResponse.GetResponseStream())
{
redirectedUri = httpWebResponse.ResponseUri;
using WebClient webClient = new WebClient();
webClient.UseDefaultCredentials = true;
return new MemoryStream(webClient.DownloadData(redirectedUri));
}
}
}
internal static class SapiAttributeParser
{
internal static CultureInfo GetCultureInfoFromLanguageString(string valueString)
{
string[] array = valueString.Split(new char[1] { ';' });
string text = array[0].Trim();
if (!string.IsNullOrEmpty(text))
{
try
{
return new CultureInfo(int.Parse(text, NumberStyles.HexNumber, CultureInfo.InvariantCulture), useUserOverride: false);
}
catch (ArgumentException)
{
return null;
}
}
return null;
}
internal static List<SpeechAudioFormatInfo> GetAudioFormatsFromString(string valueString)
{
List<SpeechAudioFormatInfo> list = new List<SpeechAudioFormatInfo>();
string[] array = valueString.Split(new char[1] { ';' });
for (int i = 0; i < array.Length; i++)
{
string text = array[i].Trim();
if (!string.IsNullOrEmpty(text))
{
SpeechAudioFormatInfo speechAudioFormatInfo = AudioFormatConverter.ToSpeechAudioFormatInfo(text);
if (speechAudioFormatInfo != null)
{
list.Add(speechAudioFormatInfo);
}
}
}
return list;
}
}
internal class SeekableReadStream : Stream
{
private long _virtualPosition;
private List<byte> _buffer = new List<byte>();
private Stream _baseStream;
private bool _cacheDataForSeeking = true;
private bool _canSeek;
internal bool CacheDataForSeeking
{
set
{
_cacheDataForSeeking = value;
}
}
public override bool CanRead => true;
public override bool CanSeek
{
get
{
if (!_canSeek)
{
return _cacheDataForSeeking;
}
return true;
}
}
public override bool CanWrite => false;
public override long Length => _baseStream.Length;
public override long Position
{
get
{
if (_canSeek)
{
return _baseStream.Position;
}
return _virtualPosition;
}
set
{
if (_canSeek)
{
_baseStream.Position = value;
}
else
{
if (value == _virtualPosition)
{
return;
}
if (value < 0)
{
throw new ArgumentOutOfRangeException("value", SR.Get(SRID.MustBeGreaterThanZero));
}
if (!_cacheDataForSeeking)
{
throw new NotSupportedException(SR.Get(SRID.SeekNotSupported));
}
if (value < _buffer.Count)
{
_virtualPosition = value;
return;
}
long num = value - _buffer.Count;
if (num > int.MaxValue)
{
throw new NotSupportedException(SR.Get(SRID.SeekNotSupported));
}
byte[] array = new byte[num];
Helpers.BlockingRead(_baseStream, array, 0, (int)num);
_buffer.AddRange(array);
_virtualPosition = value;
}
}
}
internal SeekableReadStream(Stream baseStream)
{
_canSeek = baseStream.CanSeek;
_baseStream = baseStream;
}
public override int Read(byte[] buffer, int offset, int count)
{
if (_canSeek)
{
return _baseStream.Read(buffer, offset, count);
}
int num = 0;
if (_virtualPosition < _buffer.Count)
{
int num2 = (int)(_buffer.Count - _virtualPosition);
if (num2 > count)
{
num2 = count;
}
_buffer.CopyTo((int)_virtualPosition, buffer, offset, num2);
count -= num2;
_virtualPosition += num2;
offset += num2;
num += num2;
if (!_cacheDataForSeeking && _virtualPosition >= _buffer.Count)
{
_buffer.Clear();
}
}
if (count > 0)
{
int num3 = _baseStream.Read(buffer, offset, count);
num += num3;
_virtualPosition += num3;
if (_cacheDataForSeeking)
{
_buffer.Capacity += num3;
for (int i = 0; i < num3; i++)
{
_buffer.Add(buffer[offset + i]);
}
}
}
return num;
}
public override long Seek(long offset, SeekOrigin origin)
{
return Position = checked(origin switch
{
SeekOrigin.Begin => offset,
SeekOrigin.Current => Position + offset,
SeekOrigin.End => Length + offset,
_ => throw new ArgumentException(SR.Get(SRID.EnumInvalid, "SeekOrigin"), "origin"),
});
}
public override void SetLength(long value)
{
throw new NotSupportedException(SR.Get(SRID.SeekNotSupported));
}
public override void Write(byte[] buffer, int offset, int count)
{
throw new NotSupportedException(SR.Get(SRID.StreamMustBeWriteable));
}
public override void Flush()
{
_baseStream.Flush();
}
}
internal sealed class StreamMarshaler : IDisposable
{
private HGlobalSafeHandle _safeHMem = new HGlobalSafeHandle();
private Stream _stream;
internal Stream Stream => _stream;
internal uint Position
{
set
{
_stream.Position = value;
}
}
internal StreamMarshaler()
{
}
internal StreamMarshaler(Stream stream)
{
_stream = stream;
}
public void Dispose()
{
_safeHMem.Dispose();
}
internal void ReadArray<T>(T[] ao, int c)
{
Type typeFromHandle = typeof(T);
int num = Marshal.SizeOf(typeFromHandle);
int num2 = num * c;
byte[] source = Helpers.ReadStreamToByteArray(_stream, num2);
IntPtr intPtr = _safeHMem.Buffer(num2);
Marshal.Copy(source, 0, intPtr, num2);
for (int i = 0; i < c; i++)
{
ao[i] = (T)Marshal.PtrToStructure((IntPtr)((long)intPtr + i * num), typeFromHandle);
}
}
internal void WriteArray<T>(T[] ao, int c)
{
Type typeFromHandle = typeof(T);
int num = Marshal.SizeOf(typeFromHandle);
int num2 = num * c;
byte[] array = new byte[num2];
IntPtr intPtr = _safeHMem.Buffer(num2);
for (int i = 0; i < c; i++)
{
Marshal.StructureToPtr((object)ao[i], (IntPtr)((long)intPtr + i * num), fDeleteOld: false);
}
Marshal.Copy(intPtr, array, 0, num2);
_stream.Write(array, 0, num2);
}
internal void ReadArrayChar(char[] ach, int c)
{
int num = c * 2;
if (num > 0)
{
byte[] source = Helpers.ReadStreamToByteArray(_stream, num);
IntPtr intPtr = _safeHMem.Buffer(num);
Marshal.Copy(source, 0, intPtr, num);
Marshal.Copy(intPtr, ach, 0, c);
}
}
internal string ReadNullTerminatedString()
{
BinaryReader binaryReader = new BinaryReader(_stream, Encoding.Unicode);
StringBuilder stringBuilder = new StringBuilder();
while (true)
{
char c = binaryReader.ReadChar();
if (c == '\0')
{
break;
}
stringBuilder.Append(c);
}
return stringBuilder.ToString();
}
internal void WriteArrayChar(char[] ach, int c)
{
int num = c * 2;
if (num > 0)
{
byte[] array = new byte[num];
IntPtr intPtr = _safeHMem.Buffer(num);
Marshal.Copy(ach, 0, intPtr, c);
Marshal.Copy(intPtr, array, 0, num);
_stream.Write(array, 0, num);
}
}
internal void ReadStream(object o)
{
int num = Marshal.SizeOf(o.GetType());
byte[] source = Helpers.ReadStreamToByteArray(_stream, num);
IntPtr intPtr = _safeHMem.Buffer(num);
Marshal.Copy(source, 0, intPtr, num);
Marshal.PtrToStructure(intPtr, o);
}
internal void WriteStream(object o)
{
int num = Marshal.SizeOf(o.GetType());
byte[] array = new byte[num];
IntPtr intPtr = _safeHMem.Buffer(num);
Marshal.StructureToPtr(o, intPtr, fDeleteOld: false);
Marshal.Copy(intPtr, array, 0, num);
_stream.Write(array, 0, num);
}
}
internal class StringBlob
{
private const int _sizeOfChar = 2;
private Dictionary<string, int> _strings = new Dictionary<string, int>();
private List<string> _refStrings = new List<string>();
private List<int> _offsetStrings = new List<int>();
private int _cWords;
private int _totalStringSizes = 1;
internal string this[int index]
{
get
{
if (index < 1 || index > _cWords)
{
throw new InvalidOperationException();
}
return _refStrings[index - 1];
}
}
internal int Count => _cWords;
internal StringBlob()
{
}
internal StringBlob(char[] pszStringArray)
{
int num = pszStringArray.Length;
if (num <= 0)
{
return;
}
if (pszStringArray[0] != 0)
{
throw new FormatException(SR.Get(SRID.RecognizerInvalidBinaryGrammar));
}
int i = 1;
int num2 = num;
int num3 = 1;
for (; i < num2; i++)
{
if (pszStringArray[i] == '\0')
{
string text = new string(pszStringArray, num3, i - num3);
_refStrings.Add(text);
_offsetStrings.Add(_totalStringSizes);
_strings.Add(text, ++_cWords);
_totalStringSizes += text.Length + 1;
num3 = i + 1;
}
}
}
internal int Add(string psz, out int idWord)
{
int num = 0;
idWord = 0;
if (!string.IsNullOrEmpty(psz))
{
if (!_strings.TryGetValue(psz, out idWord))
{
idWord = ++_cWords;
num = _totalStringSizes;
_refStrings.Add(psz);
_offsetStrings.Add(num);
_strings.Add(psz, _cWords);
_totalStringSizes += psz.Length + 1;
}
else
{
num = OffsetFromId(idWord);
}
}
return num;
}
internal int Find(string psz)
{
if (string.IsNullOrEmpty(psz) || _cWords == 0)
{
return 0;
}
if (!_strings.TryGetValue(psz, out var value))
{
return -1;
}
return value;
}
internal string FromOffset(int offset)
{
int num = 1;
int num2 = 1;
if (offset == 1 && _cWords >= 1)
{
return this[num2];
}
foreach (string refString in _refStrings)
{
num2++;
num += refString.Length + 1;
if (offset == num)
{
return this[num2];
}
}
return null;
}
internal int StringSize()
{
if (_cWords <= 0)
{
return 0;
}
return _totalStringSizes;
}
internal int SerializeSize()
{
return ((StringSize() * 2 + 3) & -4) / 2;
}
internal char[] SerializeData()
{
int num = SerializeSize();
char[] array = new char[num];
int num2 = 1;
foreach (string refString in _refStrings)
{
for (int i = 0; i < refString.Length; i++)
{
array[num2++] = refString[i];
}
array[num2++] = '\0';
}
if (StringSize() % 2 == 1)
{
array[num2++] = '쳌';
}
return array;
}
internal int OffsetFromId(int index)
{
if (index > 0)
{
return _offsetStrings[index - 1];
}
return 0;
}
}
}
namespace System.Speech.Internal.SapiInterop
{
[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("14056581-E16C-11D2-BB90-00C04F8EE6C0")]
internal interface ISpDataKey
{
[PreserveSig]
int SetData([MarshalAs(UnmanagedType.LPWStr)] string valueName, uint cbData, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] byte[] data);
[PreserveSig]
int GetData([MarshalAs(UnmanagedType.LPWStr)] string valueName, ref uint pcbData, [Out][MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] byte[] data);
[PreserveSig]
int SetStringValue([MarshalAs(UnmanagedType.LPWStr)] string valueName, [MarshalAs(UnmanagedType.LPWStr)] string value);
[PreserveSig]
int GetStringValue([MarshalAs(UnmanagedType.LPWStr)] string valueName, [MarshalAs(UnmanagedType.LPWStr)] out string value);
[PreserveSig]
int SetDWORD([MarshalAs(UnmanagedType.LPWStr)] string valueName, uint dwValue);
[PreserveSig]
int GetDWORD([MarshalAs(UnmanagedType.LPWStr)] string valueName, ref uint pdwValue);
[PreserveSig]
int OpenKey([MarshalAs(UnmanagedType.LPWStr)] string subKeyName, out ISpDataKey ppSubKey);
[PreserveSig]
int CreateKey([MarshalAs(UnmanagedType.LPWStr)] string subKey, out ISpDataKey ppSubKey);
[PreserveSig]
int DeleteKey([MarshalAs(UnmanagedType.LPWStr)] string subKey);
[PreserveSig]
int DeleteValue([MarshalAs(UnmanagedType.LPWStr)] string valueName);
[PreserveSig]
int EnumKeys(uint index, [MarshalAs(UnmanagedType.LPWStr)] out string ppszSubKeyName);
[PreserveSig]
int EnumValues(uint index, [MarshalAs(UnmanagedType.LPWStr)] out string valueName);
}
}
namespace System.Speech.Internal.ObjectTokens
{
internal class RegistryDataKey : ISpDataKey, IEnumerable<RegistryDataKey>, IEnumerable, IDisposable
{
internal enum SAPIErrorCodes
{
STG_E_FILENOTFOUND = -2147287038,
SPERR_UNSUPPORTED_FORMAT = -2147201021,
SPERR_DEVICE_BUSY = -2147201018,
SPERR_DEVICE_NOT_SUPPORTED = -2147201017,
SPERR_DEVICE_NOT_ENABLED = -2147201016,
SPERR_NO_DRIVER = -2147201015,
SPERR_TOO_MANY_GRAMMARS = -2147200990,
SPERR_INVALID_IMPORT = -2147200988,
SPERR_AUDIO_BUFFER_OVERFLOW = -2147200977,
SPERR_NO_AUDIO_DATA = -2147200976,
SPERR_NO_MORE_ITEMS = -2147200967,
SPERR_NOT_FOUND = -2147200966,
SPERR_GENERIC_MMSYS_ERROR = -2147200964,
SPERR_NOT_TOPLEVEL_RULE = -2147200940,
SPERR_NOT_ACTIVE_SESSION = -2147200925,
SPERR_SML_GENERATION_FAIL = -2147200921,
SPERR_SHARED_ENGINE_DISABLED = -2147200906,
SPERR_RECOGNIZER_NOT_FOUND = -2147200905,
SPERR_AUDIO_NOT_FOUND = -2147200904,
S_OK = 0,
S_FALSE = 1,
E_INVALIDARG = -2147024809,
SP_NO_RULES_TO_ACTIVATE = 282747,
ERROR_MORE_DATA = 20714
}
internal string _sKeyId;
internal ISpDataKey _sapiRegKey;
internal bool _disposeSapiKey;
internal string Id => (string)_sKeyId.Clone();
internal string Name
{
get
{
int num = _sKeyId.LastIndexOf('\\');
return _sKeyId.Substring(num + 1);
}
}
protected RegistryDataKey(string fullPath, IntPtr regHandle)
{
ISpRegDataKey spRegDataKey = (ISpRegDataKey)new SpDataKey();
spRegDataKey.SetKey(regHandle, fReadOnly: false);
_sapiRegKey = spRegDataKey;
_sKeyId = fullPath;
_disposeSapiKey = true;
}
protected RegistryDataKey(string fullPath, RegistryKey managedRegKey)
: this(fullPath, HKEYfromRegKey(managedRegKey))
{
}
protected RegistryDataKey(string fullPath, RegistryDataKey copyKey)
{
_sKeyId = fullPath;
_sapiRegKey = copyKey._sapiRegKey;
_disposeSapiKey = copyKey._disposeSapiKey;
}
protected RegistryDataKey(string fullPath, ISpDataKey copyKey, bool shouldDispose)
{
_sKeyId = fullPath;
_sapiRegKey = copyKey;
_disposeSapiKey = shouldDispose;
}
protected RegistryDataKey(ISpObjectToken sapiToken)
: this(GetTokenIdFromToken(sapiToken), sapiToken, shouldDispose: false)
{
}
internal static RegistryDataKey Open(string registryPath, bool fCreateIfNotExist)
{
if (string.IsNullOrEmpty(registryPath))
{
return null;
}
registryPath = registryPath.Trim(new char[1] { '\\' });
string firstKeyAndParseRemainder = GetFirstKeyAndParseRemainder(ref registryPath);
IntPtr intPtr = RootHKEYFromRegPath(firstKeyAndParseRemainder);
if (IntPtr.Zero == intPtr)
{
return null;
}
RegistryDataKey registryDataKey = new RegistryDataKey(firstKeyAndParseRemainder, intPtr);
if (string.IsNullOrEmpty(registryPath))
{
return registryDataKey;
}
return OpenSubKey(registryDataKey, registryPath, fCreateIfNotExist);
}
internal static RegistryDataKey Create(string keyId, RegistryKey hkey)
{
return new RegistryDataKey(keyId, hkey);
}
private static RegistryDataKey OpenSubKey(RegistryDataKey baseKey, string registryPath, bool createIfNotExist)
{
if (string.IsNullOrEmpty(registryPath) || baseKey == null)
{
return null;
}
string firstKeyAndParseRemainder = GetFirstKeyAndParseRemainder(ref registryPath);
RegistryDataKey registryDataKey = (createIfNotExist ? baseKey.CreateKey(firstKeyAndParseRemainder) : baseKey.OpenKey(firstKeyAndParseRemainder));
if (string.IsNullOrEmpty(registryPath))
{
return registryDataKey;
}
return OpenSubKey(registryDataKey, registryPath, createIfNotExist);
}
private static string GetTokenIdFromToken(ISpObjectToken sapiToken)
{
IntPtr ppszCoMemTokenId = IntPtr.Zero;
try
{
sapiToken.GetId(out ppszCoMemTokenId);
return Marshal.PtrToStringUni(ppszCoMemTokenId);
}
finally
{
Marshal.FreeCoTaskMem(ppszCoMemTokenId);
}
}
public void Dispose()
{
Dispose(disposing: true);
GC.SuppressFinalize(this);
}
[PreserveSig]
public int SetData([MarshalAs(UnmanagedType.LPWStr)] string valueName, [MarshalAs(UnmanagedType.SysUInt)] uint cbData, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] byte[] data)
{
return _sapiRegKey.SetData(valueName, cbData, data);
}
[PreserveSig]
public int GetData([MarshalAs(UnmanagedType.LPWStr)] string valueName, [MarshalAs(UnmanagedType.SysUInt)] ref uint pcbData, [Out][MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] byte[] data)
{
return _sapiRegKey.GetData(valueName, ref pcbData, data);
}
[PreserveSig]
public int SetStringValue([MarshalAs(UnmanagedType.LPWStr)] string valueName, [MarshalAs(UnmanagedType.LPWStr)] string value)
{
return _sapiRegKey.SetStringValue(valueName, value);
}
[PreserveSig]
public int GetStringValue([MarshalAs(UnmanagedType.LPWStr)] string valueName, [MarshalAs(UnmanagedType.LPWStr)] out string value)
{
return _sapiRegKey.GetStringValue(valueName, out value);
}
[PreserveSig]
public int SetDWORD([MarshalAs(UnmanagedType.LPWStr)] string valueName, [MarshalAs(UnmanagedType.SysUInt)] uint value)
{
return _sapiRegKey.SetDWORD(valueName, value);
}
[PreserveSig]
public int GetDWORD([MarshalAs(UnmanagedType.LPWStr)] string valueName, ref uint pdwValue)
{
return _sapiRegKey.GetDWORD(valueName, ref pdwValue);
}
[PreserveSig]
public int OpenKey([MarshalAs(UnmanagedType.LPWStr)] string subKeyName, out ISpDataKey ppSubKey)
{
return _sapiRegKey.OpenKey(subKeyName, out ppSubKey);
}
[PreserveSig]
public int CreateKey([MarshalAs(UnmanagedType.LPWStr)] string subKeyName, out ISpDataKey ppSubKey)
{
return _sapiRegKey.CreateKey(subKeyName, out ppSubKey);
}
[PreserveSig]
public int DeleteKey([MarshalAs(UnmanagedType.LPWStr)] string subKeyName)
{
return _sapiRegKey.DeleteKey(subKeyName);
}
[PreserveSig]
public int DeleteValue([MarshalAs(UnmanagedType.LPWStr)] string valueName)
{
return _sapiRegKey.DeleteValue(valueName);
}
[PreserveSig]
public int EnumKeys(uint index, [MarshalAs(UnmanagedType.LPWStr)] out string ppszSubKeyName)
{
return _sapiRegKey.EnumKeys(index, out ppszSubKeyName);
}
[PreserveSig]
public int EnumValues(uint index, [MarshalAs(UnmanagedType.LPWStr)] out string valueName)
{
return _sapiRegKey.EnumValues(index, out valueName);
}
internal bool SetString(string valueName, string sValue)
{
return 0 == SetStringValue(valueName, sValue);
}
internal bool TryOpenKey(string keyName, out RegistryDataKey subKey)
{
if (string.IsNullOrEmpty(keyName))
{
subKey = null;
return false;
}
subKey = OpenKey(keyName);
return null != subKey;
}
internal bool TryGetString(string valueName, out string value)
{
if (valueName == null)
{
valueName = string.Empty;
}
return 0 == GetStringValue(valueName, out value);
}
internal bool HasValue(string valueName)
{
uint pdwValue = 0u;
byte[] data = new byte[0];
if (_sapiRegKey.GetStringValue(valueName, out var _) != 0 && _sapiRegKey.GetDWORD(valueName, ref pdwValue) != 0)
{
return 0 == _sapiRegKey.GetData(valueName, ref pdwValue, data);
}
return true;
}
internal bool TryGetDWORD(string valueName, ref uint value)
{
if (string.IsNullOrEmpty(valueName))
{
return false;
}
return 0 == _sapiRegKey.GetDWORD(valueName, ref value);
}
internal RegistryDataKey OpenKey(string keyName)
{
Helpers.ThrowIfEmptyOrNull(keyName, "keyName");
if (_sapiRegKey.OpenKey(keyName, out var ppSubKey) != 0)
{
return null;
}
return new RegistryDataKey(_sKeyId + "\\" + keyName, ppSubKey, shouldDispose: true);
}
internal RegistryDataKey CreateKey(string keyName)
{
Helpers.ThrowIfEmptyOrNull(keyName, "keyName");
if (_sapiRegKey.CreateKey(keyName, out var ppSubKey) != 0)
{
return null;
}
return new RegistryDataKey(_sKeyId + "\\" + keyName, ppSubKey, shouldDispose: true);
}
internal string[] GetValueNames()
{
List<string> list = new List<string>();
string valueName;
for (uint num = 0u; _sapiRegKey.EnumValues(num, out valueName) == 0; num++)
{
list.Add(valueName);
}
return list.ToArray();
}
IEnumerator<RegistryDataKey> IEnumerable<RegistryDataKey>.GetEnumerator()
{
string childKeyName = string.Empty;
for (uint i = 0u; _sapiRegKey.EnumKeys(i, out childKeyName) == 0; i++)
{
yield return CreateKey(childKeyName);
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return ((IEnumerable<RegistryDataKey>)this).GetEnumerator();
}
internal bool DeleteSubKeyTree(string childKeyName)
{
using (RegistryDataKey registryDataKey = OpenKey(childKeyName))
{
if (registryDataKey == null)
{
return true;
}
if (!registryDataKey.DeleteSubKeys())
{
return false;
}
}
return 0 == DeleteKey(childKeyName);
}
protected virtual void Dispose(bool disposing)
{
if (disposing && _sapiRegKey != null && _disposeSapiKey)
{
Marshal.ReleaseComObject(_sapiRegKey);
_sapiRegKey = null;
}
}
private static IntPtr HKEYfromRegKey(RegistryKey regKey)
{
Type typeFromHandle = typeof(RegistryKey);
BindingFlags bindingAttr = BindingFlags.Instance | BindingFlags.NonPublic;
FieldInfo field = typeFromHandle.GetField("hkey", bindingAttr);
SafeHandle safeHandle = (SafeHandle)field.GetValue(regKey);
return safeHandle.DangerousGetHandle();
}
private static IntPtr RootHKEYFromRegPath(string rootPath)
{
RegistryKey registryKey = RegKeyFromRootPath(rootPath);
if (registryKey == null)
{
return IntPtr.Zero;
}
return HKEYfromRegKey(registryKey);
}
private static string GetFirstKeyAndParseRemainder(ref string registryPath)
{
registryPath.Trim(new char[1] { '\\' });
int num = registryPath.IndexOf('\\');
string result;
if (num >= 0)
{
result = registryPath.Substring(0, num);
registryPath = registryPath.Substring(num + 1, registryPath.Length - num - 1);
}
else
{
result = registryPath;
registryPath = string.Empty;
}
return result;
}
private static RegistryKey RegKeyFromRootPath(string rootPath)
{
RegistryKey[] array = new RegistryKey[4]
{
Registry.ClassesRoot,
Registry.LocalMachine,
Registry.CurrentUser,
Registry.CurrentConfig
};
RegistryKey[] array2 = array;
foreach (RegistryKey registryKey in array2)
{
if (registryKey.Name.Equals(rootPath, StringComparison.InvariantCultureIgnoreCase))
{
return registryKey;
}
}
return null;
}
private bool DeleteSubKeys()
{
string ppszSubKeyName;
while (EnumKeys(0u, out ppszSubKeyName) == 0)
{
using (RegistryDataKey registryDataKey = OpenKey(ppszSubKeyName))
{
if (registryDataKey == null)
{
return false;
}
if (!registryDataKey.DeleteSubKeys())
{
return false;
}
}
if (DeleteKey(ppszSubKeyName) != 0)
{
return false;
}
}
return true;
}
}
}
namespace System.Speech.Internal.SapiInterop
{
[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("14056589-E16C-11D2-BB90-00C04F8EE6C0")]
internal interface ISpObjectToken : ISpDataKey
{
[PreserveSig]
new int SetData([MarshalAs(UnmanagedType.LPWStr)] string pszValueName, uint cbData, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] byte[] pData);
[PreserveSig]
new int GetData([MarshalAs(UnmanagedType.LPWStr)] string pszValueName, ref uint pcbData, [Out][MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] byte[] pData);
[PreserveSig]
new int SetStringValue([MarshalAs(UnmanagedType.LPWStr)] string pszValueName, [MarshalAs(UnmanagedType.LPWStr)] string pszValue);
[PreserveSig]
new int GetStringValue([MarshalAs(UnmanagedType.LPWStr)] string pszValueName, [MarshalAs(UnmanagedType.LPWStr)] out string ppszValue);
[PreserveSig]
new int SetDWORD([MarshalAs(UnmanagedType.LPWStr)] string pszValueName, uint dwValue);
[PreserveSig]
new int GetDWORD([MarshalAs(UnmanagedType.LPWStr)] string pszValueName, ref uint pdwValue);
[PreserveSig]
new int OpenKey([MarshalAs(UnmanagedType.LPWStr)] string pszSubKeyName, out ISpDataKey ppSubKey);
[PreserveSig]
new int CreateKey([MarshalAs(UnmanagedType.LPWStr)] string pszSubKey, out ISpDataKey ppSubKey);
[PreserveSig]
new int DeleteKey([MarshalAs(UnmanagedType.LPWStr)] string pszSubKey);
[PreserveSig]
new int DeleteValue([MarshalAs(UnmanagedType.LPWStr)] string pszValueName);
[PreserveSig]
new int EnumKeys(uint Index, [MarshalAs(UnmanagedType.LPWStr)] out string ppszSubKeyName);
[PreserveSig]
new int EnumValues(uint Index, [MarshalAs(UnmanagedType.LPWStr)] out string ppszValueName);
void SetId([MarshalAs(UnmanagedType.LPWStr)] string pszCategoryId, [MarshalAs(UnmanagedType.LPWStr)] string pszTokenId, [MarshalAs(UnmanagedType.Bool)] bool fCreateIfNotExist);
void GetId(out IntPtr ppszCoMemTokenId);
void Slot15();
void Slot16();
void Slot17();
void Slot18();
void Slot19();
void Slot20();
void Slot21();
void MatchesAttributes([MarshalAs(UnmanagedType.LPWStr)] string pszAttributes, [MarshalAs(UnmanagedType.Bool)] out bool pfMatches);
}
}
namespace System.Speech.Internal.ObjectTokens
{
internal class ObjectToken : RegistryDataKey, ISpObjectToken, ISpDataKey
{
[ComImport]
[Guid("5B559F40-E952-11D2-BB91-00C04F8EE6C0")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
private interface ISpObjectWithToken
{
[PreserveSig]
int SetObjectToken(ISpObjectToken pToken);
[PreserveSig]
int GetObjectToken(IntPtr ppToken);
}
private const string sGenerateFileNameSpecifier = "{0}";
private const string SPTOKENVALUE_CLSID = "CLSID";
private ISpObjectToken _sapiObjectToken;
private bool _disposeSapiObjectToken;
private VoiceCategory _category;
private RegistryDataKey _attributes;
internal RegistryDataKey Attributes
{
get
{
if (_attributes == null)
{
return _attributes = OpenKey("Attributes");
}
return _attributes;
}
}
internal ISpObjectToken SAPIToken => _sapiObjectToken;
internal string Age
{
get
{
if (Attributes == null || !Attributes.TryGetString("Age", out var value))
{
return string.Empty;
}
return value;
}
}
internal string Gender
{
get
{
if (Attributes == null || !Attributes.TryGetString("Gender", out var value))
{
return string.Empty;
}
return value;
}
}
internal VoiceCategory VoiceCategory
{
get
{
return _category;
}
set
{
_category = value;
}
}
internal CultureInfo Culture
{
get
{
CultureInfo result = null;
if (Attributes.TryGetString("Language", out var value))
{
result = SapiAttributeParser.GetCultureInfoFromLanguageString(value);
}
return result;
}
}
internal string Description
{
get
{
string value = string.Empty;
string valueName = string.Format(CultureInfo.InvariantCulture, "{0:x}", new object[1] { CultureInfo.CurrentUICulture.LCID });
if (!TryGetString(valueName, out value))
{
TryGetString(null, out value);
}
return value;
}
}
protected ObjectToken(ISpObjectToken sapiObjectToken, bool disposeSapiToken)
: base(sapiObjectToken)
{
if (sapiObjectToken == null)
{
throw new ArgumentNullException("sapiObjectToken");
}
_sapiObjectToken = sapiObjectToken;
_disposeSapiObjectToken = disposeSapiToken;
}
internal static ObjectToken FindBestMatch(string categoryId, string requiredAttributes, string optionalAttributes)
{
if (string.IsNullOrEmpty(categoryId))
{
throw new ArgumentNullException("categoryId");
}
using ObjectTokenCategory objectTokenCategory = ObjectTokenCategory.Create(categoryId);
if (objectTokenCategory != null)
{
StringBuilder stringBuilder = new StringBuilder(optionalAttributes);
if (!string.IsNullOrEmpty(optionalAttributes))
{
stringBuilder.Append(";");
}
stringBuilder.Append("VendorPreferred");
IList<ObjectToken> list = objectTokenCategory.FindMatchingTokens(requiredAttributes, stringBuilder.ToString());
return (list.Count > 0) ? list[0] : null;
}
return null;
}
internal static ObjectToken Open(ISpObjectToken sapiObjectToken)
{
return new ObjectToken(sapiObjectToken, disposeSapiToken: false);
}
internal static ObjectToken Open(string sCategoryId, string sTokenId, bool fCreateIfNotExist)
{
ISpObjectToken spObjectToken = (ISpObjectToken)new System.Speech.Internal.SapiInterop.SpObjectToken();
try
{
spObjectToken.SetId(sCategoryId, sTokenId, fCreateIfNotExist);
}
catch (Exception)
{
Marshal.ReleaseComObject(spObjectToken);
return null;
}
return new ObjectToken(spObjectToken, disposeSapiToken: true);
}
internal static ObjectToken Create(string sCategoryId, string sTokenId)
{
return Open(sCategoryId, sTokenId, fCreateIfNotExist: true);
}
protected override void Dispose(bool disposing)
{
try
{
if (disposing)
{
if (_disposeSapiObjectToken && _sapiObjectToken != null)
{
Marshal.ReleaseComObject(_sapiObjectToken);
_sapiObjectToken = null;
}
if (_attributes != null)
{
_attributes.Dispose();
_attributes = null;
}
}
}
finally
{
base.Dispose(disposing);
}
}
public override bool Equals(object obj)
{
if (obj is ObjectToken objectToken)
{
return string.Compare(base.Id, obje