diff --git a/src/tools/ilasm/src/ILAssembler/CompilationResult.cs b/src/tools/ilasm/src/ILAssembler/CompilationResult.cs
new file mode 100644
index 00000000000000..1642e295db6d71
--- /dev/null
+++ b/src/tools/ilasm/src/ILAssembler/CompilationResult.cs
@@ -0,0 +1,34 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Reflection.Metadata;
+using System.Reflection.PortableExecutable;
+
+namespace ILAssembler;
+
+/// Represents a compiled portable executable image.
+public sealed class CompilationResult
+{
+ private readonly PEBuilder _peBuilder;
+ private readonly Blob _mvidFixup;
+
+ internal CompilationResult(PEBuilder peBuilder, Blob mvidFixup)
+ {
+ _peBuilder = peBuilder;
+ _mvidFixup = mvidFixup;
+ }
+
+ /// Serializes the compiled image into the specified builder.
+ /// The builder to receive the serialized image.
+ /// The content identifier of the serialized image.
+ public BlobContentId Serialize(BlobBuilder builder)
+ {
+ BlobContentId contentId = _peBuilder.Serialize(builder);
+ if (!_mvidFixup.IsDefault)
+ {
+ new BlobWriter(_mvidFixup).WriteGuid(contentId.Guid);
+ }
+
+ return contentId;
+ }
+}
diff --git a/src/tools/ilasm/src/ILAssembler/Diagnostic.cs b/src/tools/ilasm/src/ILAssembler/Diagnostic.cs
index df69247b9f9b68..b7d4a9bb54d343 100644
--- a/src/tools/ilasm/src/ILAssembler/Diagnostic.cs
+++ b/src/tools/ilasm/src/ILAssembler/Diagnostic.cs
@@ -52,7 +52,6 @@ public static class DiagnosticIds
public const string DuplicateMethod = "ILA0030";
public const string MissingExportedTypeImplementation = "ILA0031";
public const string KeyFileError = "ILA0032";
- public const string TooManyGenericParameters = "ILA0033";
}
internal static class DiagnosticMessageTemplates
@@ -88,5 +87,4 @@ internal static class DiagnosticMessageTemplates
public const string ParameterIndexOutOfRange = "Parameter index {0} is out of range";
public const string DuplicateMethod = "Duplicate method definition";
public const string MissingExportedTypeImplementation = "Undefined implementation in ExportedType '{0}' -- ExportedType not emitted";
- public const string TooManyGenericParameters = "Generic parameter count {0} exceeds the maximum of {1}";
}
diff --git a/src/tools/ilasm/src/ILAssembler/DocumentCompiler.cs b/src/tools/ilasm/src/ILAssembler/DocumentCompiler.cs
index 83ce5f2068f0ae..f499c616e418e2 100644
--- a/src/tools/ilasm/src/ILAssembler/DocumentCompiler.cs
+++ b/src/tools/ilasm/src/ILAssembler/DocumentCompiler.cs
@@ -7,18 +7,17 @@
using System.Linq;
using System.Reflection;
using System.Reflection.Metadata.Ecma335;
-using System.Reflection.PortableExecutable;
using Antlr4.Runtime;
namespace ILAssembler;
public sealed class DocumentCompiler
{
- public (ImmutableArray, PEBuilder?) Compile(SourceText document, Func includedDocumentLoader, Func resourceLocator, Options options)
+ public (ImmutableArray, CompilationResult?) Compile(SourceText document, Func includedDocumentLoader, Func resourceLocator, Options options)
{
return Compile([document], includedDocumentLoader, resourceLocator, options);
}
- public (ImmutableArray, PEBuilder?) Compile(ImmutableArray documents, Func includedDocumentLoader, Func resourceLocator, Options options)
+ public (ImmutableArray, CompilationResult?) Compile(ImmutableArray documents, Func includedDocumentLoader, Func resourceLocator, Options options)
{
Dictionary loadedDocuments = new();
ImmutableArray.Builder diagnostics = ImmutableArray.CreateBuilder();
diff --git a/src/tools/ilasm/src/ILAssembler/EntityRegistry.cs b/src/tools/ilasm/src/ILAssembler/EntityRegistry.cs
index 6c78be229f35b8..54d0fa5f2ba1c7 100644
--- a/src/tools/ilasm/src/ILAssembler/EntityRegistry.cs
+++ b/src/tools/ilasm/src/ILAssembler/EntityRegistry.cs
@@ -94,7 +94,7 @@ public IReadOnlyList GetSeenEntities(TableIndex table)
return Array.Empty();
}
- public void WriteContentTo(MetadataBuilder builder, BlobBuilder ilStream, IReadOnlyDictionary mappedFieldDataNames)
+ public Blob WriteContentTo(MetadataBuilder builder, BlobBuilder ilStream, IReadOnlyDictionary mappedFieldDataNames, bool deterministic)
{
// Set the assembly handle early since DeclarativeSecurityAttribute needs it
// The assembly definition handle is always row 1 (there's only ever one assembly per module)
@@ -192,7 +192,7 @@ public void WriteContentTo(MetadataBuilder builder, BlobBuilder ilStream, IReadO
foreach (GenericParameterEntity genericParam in allGenericParams)
{
- // GenericParam index is stored as a 2-byte value; skip params beyond the limit
+ // COMPAT: Native ilasm ignores generic parameters whose indices exceed the 2-byte metadata limit.
if (genericParam.Index > ushort.MaxValue)
continue;
@@ -210,6 +210,12 @@ public void WriteContentTo(MetadataBuilder builder, BlobBuilder ilStream, IReadO
foreach (GenericParameterConstraintEntity constraint in allGenericConstraints)
{
+ // COMPAT: Native ilasm ignores constraints on generic parameters whose indices exceed the 2-byte metadata limit.
+ if (constraint.Owner!.Index > ushort.MaxValue)
+ {
+ continue;
+ }
+
RecordEntityInTable(TableIndex.GenericParamConstraint, constraint);
}
@@ -229,7 +235,20 @@ public void WriteContentTo(MetadataBuilder builder, BlobBuilder ilStream, IReadO
// Now that we've recorded all of the entities that wouldn't have had handles before,
// we can start writing out the content of the entities.
- builder.AddModule(0, Module.Name is null ? default : builder.GetOrAddString(Module.Name), builder.GetOrAddGuid(Guid.NewGuid()), default, default);
+ Blob mvidFixup = default;
+ GuidHandle mvid;
+ if (deterministic)
+ {
+ ReservedBlob reservedMvid = builder.ReserveGuid();
+ mvid = reservedMvid.Handle;
+ mvidFixup = reservedMvid.Content;
+ }
+ else
+ {
+ mvid = builder.GetOrAddGuid(Guid.NewGuid());
+ }
+
+ builder.AddModule(0, Module.Name is null ? default : builder.GetOrAddString(Module.Name), mvid, default, default);
// Emit every recorded TypeRef row. All TypeRefs are recorded in ResolveTypeReferences
// (in PseudoHandle order), even when they resolved to a local TypeDef, matching native
@@ -308,7 +327,9 @@ public void WriteContentTo(MetadataBuilder builder, BlobBuilder ilStream, IReadO
}
builder.AddFieldDefinition(
fieldAttributes,
- builder.GetOrAddString(fieldDef.Name),
+ builder.GetOrAddString((fieldAttributes & FieldAttributes.FieldAccessMask) == FieldAttributes.PrivateScope
+ ? NameHelpers.GetPrivateScopeMetadataName(fieldDef.Name, isMethod: false)
+ : fieldDef.Name),
fieldDef.Signature!.Count == 0 ? default : builder.GetOrAddBlob(RewriteSignatureBlob(fieldDef.Signature, signatureRewriter)));
if (fieldDef.Offset is not null)
@@ -365,13 +386,24 @@ public void WriteContentTo(MetadataBuilder builder, BlobBuilder ilStream, IReadO
StandaloneSignatureHandle localsSigHandle = methodDef.LocalsSignature is not null
? (StandaloneSignatureHandle)methodDef.LocalsSignature.Handle
: default;
+ bool forceFatHeader = (methodDef.MaxStack < 8 || methodDef.BodyAttributes.HasFlag(MethodBodyAttributes.InitLocals))
+ && methodDef.MethodBody.CodeBuilder.Count < 64
+ && localsSigHandle.IsNil
+ && methodDef.ExceptionRegions.Count == 0;
try
{
+ MethodBodyAttributes encodingAttributes = methodDef.BodyAttributes;
+ if (forceFatHeader)
+ {
+ encodingAttributes |= MethodBodyAttributes.InitLocals;
+ }
+
bodyOffset = bodyStreamEncoder.AddMethodBody(
methodDef.MethodBody,
methodDef.MaxStack,
localsSigHandle,
- methodDef.BodyAttributes);
+ encodingAttributes,
+ methodDef.HasDynamicStackAllocation || forceFatHeader);
}
catch (InvalidOperationException)
{
@@ -384,7 +416,8 @@ public void WriteContentTo(MetadataBuilder builder, BlobBuilder ilStream, IReadO
exceptionRegionCount: 0,
hasSmallExceptionRegions: true,
localsSigHandle,
- methodDef.BodyAttributes);
+ forceFatHeader ? methodDef.BodyAttributes | MethodBodyAttributes.InitLocals : methodDef.BodyAttributes,
+ hasDynamicStackAllocation: methodDef.HasDynamicStackAllocation || forceFatHeader);
bodyOffset = fallbackBody.Offset;
var writer1 = new BlobWriter(fallbackBody.Instructions);
methodDef.MethodBody.CodeBuilder.WriteContentTo(ref writer1);
@@ -400,7 +433,8 @@ public void WriteContentTo(MetadataBuilder builder, BlobBuilder ilStream, IReadO
exceptionRegionCount: 0,
hasSmallExceptionRegions: true,
localsSigHandle,
- methodDef.BodyAttributes);
+ forceFatHeader ? methodDef.BodyAttributes | MethodBodyAttributes.InitLocals : methodDef.BodyAttributes,
+ hasDynamicStackAllocation: methodDef.HasDynamicStackAllocation || forceFatHeader);
bodyOffset = fallbackBody.Offset;
var writer2 = new BlobWriter(fallbackBody.Instructions);
methodDef.MethodBody.CodeBuilder.WriteContentTo(ref writer2);
@@ -415,7 +449,9 @@ public void WriteContentTo(MetadataBuilder builder, BlobBuilder ilStream, IReadO
builder.AddMethodDefinition(
methodAttributes,
methodDef.ImplementationAttributes,
- builder.GetOrAddString(methodDef.Name),
+ builder.GetOrAddString((methodAttributes & MethodAttributes.MemberAccessMask) == MethodAttributes.PrivateScope
+ ? NameHelpers.GetPrivateScopeMetadataName(methodDef.Name, isMethod: true)
+ : methodDef.Name),
builder.GetOrAddBlob(RewriteSignatureBlob(methodDef.MethodSignature!, signatureRewriter)),
bodyOffset,
GetParameterHandleForList(methodDef.Parameters, GetSeenEntities(TableIndex.MethodDef), method => ((MethodDefinitionEntity)method).Parameters, i));
@@ -467,7 +503,7 @@ public void WriteContentTo(MetadataBuilder builder, BlobBuilder ilStream, IReadO
foreach (MethodImplementationEntity impl in GetSeenEntities(TableIndex.MethodImpl))
{
builder.AddMethodImplementation(
- (TypeDefinitionHandle)impl.MethodBody.ContainingType.Handle,
+ (TypeDefinitionHandle)impl.Type.Handle,
impl.MethodBody.Handle,
impl.MethodDeclaration.Handle);
}
@@ -479,9 +515,20 @@ public void WriteContentTo(MetadataBuilder builder, BlobBuilder ilStream, IReadO
{
continue;
}
+
+ string name = memberRef.Name;
+ if (memberRef.Parent.Handle.Kind == HandleKind.MethodDefinition)
+ {
+ var method = (MethodDefinitionEntity)GetSeenEntities(TableIndex.MethodDef)[MetadataTokens.GetRowNumber(memberRef.Parent.Handle) - 1];
+ if ((method.MethodAttributes & MethodAttributes.MemberAccessMask) == MethodAttributes.PrivateScope)
+ {
+ name = NameHelpers.GetPrivateScopeMetadataName(name, isMethod: true);
+ }
+ }
+
builder.AddMemberReference(
memberRef.Parent.Handle,
- builder.GetOrAddString(memberRef.Name),
+ builder.GetOrAddString(name),
builder.GetOrAddBlob(RewriteSignatureBlob(memberRef.Signature, signatureRewriter)));
}
@@ -495,6 +542,12 @@ public void WriteContentTo(MetadataBuilder builder, BlobBuilder ilStream, IReadO
foreach (CustomAttributeEntity customAttr in GetSeenEntities(TableIndex.CustomAttribute))
{
+ if (customAttr.Owner is GenericParameterEntity { Index: > ushort.MaxValue }
+ or GenericParameterConstraintEntity { Owner.Index: > ushort.MaxValue })
+ {
+ continue;
+ }
+
EntityHandle parent = customAttr.Owner switch
{
AssemblyEntity => EntityHandle.AssemblyDefinition,
@@ -625,7 +678,7 @@ public void WriteContentTo(MetadataBuilder builder, BlobBuilder ilStream, IReadO
foreach (GenericParameterEntity genericParam in GetSeenEntities(TableIndex.GenericParam))
{
- // GenericParam index is stored as a 2-byte value; skip params beyond the limit
+ // COMPAT: Native ilasm ignores generic parameters whose indices exceed the 2-byte metadata limit.
if (genericParam.Index > ushort.MaxValue)
continue;
builder.AddGenericParameter(
@@ -642,6 +695,8 @@ public void WriteContentTo(MetadataBuilder builder, BlobBuilder ilStream, IReadO
constraint.BaseType.Handle);
}
+ return mvidFixup;
+
static FieldDefinitionHandle GetFieldHandleForList(IReadOnlyList list, IReadOnlyList listOwner, Func> getList, int ownerIndex)
=> (FieldDefinitionHandle)GetHandleForList(list, listOwner, getList, ownerIndex, TableIndex.Field);
@@ -762,7 +817,7 @@ public AssemblyReferenceEntity GetCoreLibAssemblyReference()
private static bool IsCoreLibAssemblyName(string name)
{
- return name is "mscorlib" or "System.Runtime" or "System.Private.CoreLib" or "netstandard";
+ return name is "mscorlib" or "System.Runtime" or "System.Private.CoreLib";
}
public interface IHasHandle
@@ -875,7 +930,17 @@ public TypeReferenceEntity GetOrCreateTypeReference(EntityBase resolutionContext
// COMPAT: When the resolution scope is a corelib assembly ref (mscorlib, System.Runtime, etc.),
// redirect to the preferred corelib assembly ref to match native ilasm behavior.
// Native ilasm always uses the preferred corelib for well-known types.
- if (resolutionContext is AssemblyReferenceEntity asmRefScope && IsCoreLibAssemblyName(asmRefScope.Name))
+ bool isWellKnownCoreLibType = false;
+ if (name.ContainingTypeName is null)
+ {
+ var (typeNamespace, typeName) = NameHelpers.SplitDottedNameToNamespaceAndName(name.DottedName);
+ isWellKnownCoreLibType = typeNamespace == "System"
+ && typeName is "String" or "Object" or "ValueType" or "Enum";
+ }
+
+ if (isWellKnownCoreLibType
+ && resolutionContext is AssemblyReferenceEntity asmRefScope
+ && IsCoreLibAssemblyName(asmRefScope.Name))
{
var preferredCoreLib = GetCoreLibAssemblyReference();
if (preferredCoreLib != asmRefScope)
@@ -1356,17 +1421,20 @@ private static BlobBuilder RewriteMethodSignatureBlob(byte[] bytes, SignatureRew
var sig = decoder.DecodeMethodSignature(ref reader);
var newBlob = new BlobBuilder();
- var encoder = new BlobEncoder(newBlob);
- encoder.MethodSignature(sig.Header.CallingConvention, sig.GenericParameterCount, sig.Header.Attributes.HasFlag(SignatureAttributes.Instance))
- .Parameters(sig.ParameterTypes.Length, out var retBuilder, out var paramsBuilder);
- sig.ReturnType.WriteBlobTo(retBuilder.Builder);
+ newBlob.WriteByte(bytes[0]);
+ if (sig.Header.IsGeneric)
+ {
+ newBlob.WriteCompressedInteger(sig.GenericParameterCount);
+ }
+ newBlob.WriteCompressedInteger(sig.ParameterTypes.Length);
+ sig.ReturnType.WriteBlobTo(newBlob);
for (int i = 0; i < sig.ParameterTypes.Length; i++)
{
if (sig.RequiredParameterCount != sig.ParameterTypes.Length && i == sig.RequiredParameterCount)
{
- paramsBuilder.StartVarArgs();
+ newBlob.WriteByte((byte)SignatureTypeCode.Sentinel);
}
- sig.ParameterTypes[i].WriteBlobTo(paramsBuilder.AddParameter().Builder);
+ sig.ParameterTypes[i].WriteBlobTo(newBlob);
}
return newBlob;
}
@@ -1518,7 +1586,7 @@ private bool TryResolveFieldReference(MemberReferenceEntity memberRef)
private void UpdateMemberRefForVarargSignatures(MemberReferenceEntity memberRef, byte[] signature)
{
var decoder = new SignatureDecoder(new SignatureRewriter(), null!, default);
- BlobEncoder methodDefSig = new(new BlobBuilder());
+ BlobBuilder methodDefSig = new();
bool hasVarargParameters = false;
// TODO-SRM: Propose a public API to construct a blob reader over a byte array or ReadOnlyMemory
// to avoid the unsafe block.
@@ -1536,12 +1604,16 @@ private void UpdateMemberRefForVarargSignatures(MemberReferenceEntity memberRef,
{
hasVarargParameters = true;
- methodDefSig.MethodSignature(methodSignature.Header.CallingConvention, methodSignature.GenericParameterCount, methodSignature.Header.Attributes.HasFlag(SignatureAttributes.Instance))
- .Parameters(methodSignature.RequiredParameterCount, out var retTypeBuilder, out var parametersEncoder);
- methodSignature.ReturnType.WriteBlobTo(retTypeBuilder.Builder);
+ methodDefSig.WriteByte(signature[0]);
+ if (methodSignature.Header.IsGeneric)
+ {
+ methodDefSig.WriteCompressedInteger(methodSignature.GenericParameterCount);
+ }
+ methodDefSig.WriteCompressedInteger(methodSignature.RequiredParameterCount);
+ methodSignature.ReturnType.WriteBlobTo(methodDefSig);
for (int i = 0; i < methodSignature.RequiredParameterCount; i++)
{
- methodSignature.ParameterTypes[i].WriteBlobTo(parametersEncoder.AddParameter().Builder);
+ methodSignature.ParameterTypes[i].WriteBlobTo(methodDefSig);
}
}
}
@@ -1558,12 +1630,11 @@ private void UpdateMemberRefForVarargSignatures(MemberReferenceEntity memberRef,
// If the method has vararg parameters, then this needs to be a MemberRef whose parent is a reference to the method with the signature without any vararg parameters.
if (hasVarargParameters)
{
- var methodRef = new MemberReferenceEntity(memberRef.Parent, memberRef.Name, methodDefSig.Builder);
- ResolveAndRecordMemberReference(methodRef);
- // Only reparent the call-site MemberRef if the base method resolved to a MethodDef.
- // MemberRef is not a valid MemberRefParent in the coded index, so we can only
- // reparent when the inner ref resolved to MethodDef.
- if (methodRef.Handle.Kind == HandleKind.MethodDefinition)
+ var methodRef = new MemberReferenceEntity(memberRef.Parent, memberRef.Name, methodDefSig);
+ // Native ilasm only creates a MethodDef-parented MemberRef when the fixed
+ // signature resolves to a local method. Recording an unresolved helper
+ // MemberRef would create an unused row and shift every subsequent token.
+ if (TryResolveMethodReference(methodRef))
{
memberRef.SetMemberRefParent(methodRef);
}
@@ -1601,7 +1672,12 @@ public CustomAttributeEntity CreateCustomAttribute(EntityBase constructor, BlobB
public static MethodImplementationEntity CreateUnrecordedMethodImplementation(MethodDefinitionEntity methodBody, MemberReferenceEntity methodDeclaration)
{
- return new MethodImplementationEntity(methodBody, methodDeclaration);
+ return new MethodImplementationEntity(methodBody.ContainingType, methodBody, methodDeclaration);
+ }
+
+ public static MethodImplementationEntity CreateUnrecordedMethodImplementation(TypeDefinitionEntity type, MemberReferenceEntity methodBody, MemberReferenceEntity methodDeclaration)
+ {
+ return new MethodImplementationEntity(type, methodBody, methodDeclaration);
}
public FileEntity GetOrCreateFile(string name, bool hasMetadata, BlobBuilder? hash)
@@ -1898,6 +1974,8 @@ public sealed class MethodDefinitionEntity(TypeDefinitionEntity containingType,
public MethodBodyAttributes BodyAttributes { get; set; }
+ public bool HasDynamicStackAllocation { get; set; }
+
///
/// Deferred exception regions. Registered during parsing but added to
/// during emission
@@ -1906,7 +1984,7 @@ public sealed class MethodDefinitionEntity(TypeDefinitionEntity containingType,
///
public List ExceptionRegions { get; } = new();
- public int MaxStack { get; set; }
+ public int MaxStack { get; set; } = 8;
public (ModuleReferenceEntity ModuleName, string? EntryPointName, MethodImportAttributes Attributes)? MethodImportInformation { get; set; }
public MethodImplAttributes ImplementationAttributes { get; set; }
@@ -2006,9 +2084,10 @@ public sealed class CustomAttributeEntity(EntityBase constructor, BlobBuilder va
public BlobBuilder Value { get; } = value;
}
- public sealed class MethodImplementationEntity(MethodDefinitionEntity methodBody, MemberReferenceEntity methodDeclaration) : EntityBase
+ public sealed class MethodImplementationEntity(TypeDefinitionEntity type, EntityBase methodBody, MemberReferenceEntity methodDeclaration) : EntityBase
{
- public MethodDefinitionEntity MethodBody { get; } = methodBody;
+ public TypeDefinitionEntity Type { get; } = type;
+ public EntityBase MethodBody { get; } = methodBody;
public MemberReferenceEntity MethodDeclaration { get; } = methodDeclaration;
}
diff --git a/src/tools/ilasm/src/ILAssembler/GrammarVisitor.cs b/src/tools/ilasm/src/ILAssembler/GrammarVisitor.cs
index 205c699390704c..1a53affa176a5e 100644
--- a/src/tools/ilasm/src/ILAssembler/GrammarVisitor.cs
+++ b/src/tools/ilasm/src/ILAssembler/GrammarVisitor.cs
@@ -134,7 +134,7 @@ private void ReportError(string id, string message, Antlr4.Runtime.ParserRuleCon
private void ReportWarning(string id, string message, Antlr4.Runtime.ParserRuleContext context)
=> ReportDiagnostic(DiagnosticSeverity.Warning, id, message, context);
- public (ImmutableArray Diagnostics, PEBuilder? Image) BuildImage()
+ public (ImmutableArray Diagnostics, CompilationResult? Image) BuildImage()
{
// Default module name to output filename if no .module directive was provided
if (_entityRegistry.Module.Name is null && _options.OutputFileName is not null)
@@ -162,9 +162,9 @@ private void ReportWarning(string id, string message, Antlr4.Runtime.ParserRuleC
// Check for vtable fixups and exports - collect export info
var exports = ImmutableArray.CreateBuilder();
- foreach (var entity in _entityRegistry.GetSeenEntities(TableIndex.MethodDef))
+ foreach (EntityRegistry.MethodDefinitionEntity method in GetParsedMethods())
{
- if (entity is EntityRegistry.MethodDefinitionEntity method && method.ExportOrdinal >= 0)
+ if (method.ExportOrdinal >= 0)
{
exports.Add(new VTableExportPEBuilder.ExportInfo(
method.ExportOrdinal,
@@ -176,7 +176,7 @@ private void ReportWarning(string id, string message, Antlr4.Runtime.ParserRuleC
}
BlobBuilder ilStream = new();
- _entityRegistry.WriteContentTo(_metadataBuilder, ilStream, _mappedFieldDataNames);
+ Blob mvidFixup = _entityRegistry.WriteContentTo(_metadataBuilder, ilStream, _mappedFieldDataNames, _options.Deterministic);
MetadataRootBuilder rootBuilder = new(_metadataBuilder, _options.MetadataVersion);
// Compute metadata size from the MetadataSizes
@@ -207,6 +207,20 @@ private void ReportWarning(string id, string message, Antlr4.Runtime.ParserRuleC
dllCharacteristics &= ~DllCharacteristics.DynamicBase;
}
+ Characteristics imageCharacteristics = Characteristics.ExecutableImage;
+ if (_options.Dll)
+ {
+ imageCharacteristics |= Characteristics.Dll;
+ }
+ if (machine is Machine.I386 or Machine.Arm)
+ {
+ imageCharacteristics |= Characteristics.Bit32Machine;
+ }
+ else if (machine is Machine.Amd64 or Machine.Arm64)
+ {
+ imageCharacteristics |= Characteristics.LargeAddressAware;
+ }
+
// Compute stack reserve: command-line option overrides directive, which overrides default
ulong sizeOfStackReserve = (ulong)(_options.StackReserve ?? (_stackReserve != 0 ? _stackReserve : 0x00100000));
@@ -218,6 +232,7 @@ private void ReportWarning(string id, string message, Antlr4.Runtime.ParserRuleC
majorSubsystemVersion: majorSubsystemVersion,
minorSubsystemVersion: minorSubsystemVersion,
dllCharacteristics: dllCharacteristics,
+ imageCharacteristics: imageCharacteristics,
sizeOfStackReserve: sizeOfStackReserve);
MethodDefinitionHandle entryPoint = default;
@@ -257,7 +272,7 @@ private void ReportWarning(string id, string message, Antlr4.Runtime.ParserRuleC
metadataSize: metadataSize,
debugDataSize: debugDataSize);
- return (_diagnostics.ToImmutable(), peBuilder);
+ return (_diagnostics.ToImmutable(), new CompilationResult(peBuilder, mvidFixup));
}
// Apply CorFlags from options or directive
@@ -269,15 +284,7 @@ private void ReportWarning(string id, string message, Antlr4.Runtime.ParserRuleC
// Deterministic ID provider for reproducible builds
Func, BlobContentId>? deterministicIdProvider = _options.Deterministic
- ? content =>
- {
- using var hash = IncrementalHash.CreateHash(System.Security.Cryptography.HashAlgorithmName.SHA256);
- foreach (var blob in content)
- {
- hash.AppendData(blob.GetBytes());
- }
- return BlobContentId.FromHash(hash.GetHashAndReset());
- }
+ ? GetDeterministicContentId
: null;
ManagedPEBuilder standardBuilder = new(
@@ -291,7 +298,18 @@ private void ReportWarning(string id, string message, Antlr4.Runtime.ParserRuleC
debugDirectoryBuilder: debugDirectoryBuilder,
deterministicIdProvider: deterministicIdProvider);
- return (_diagnostics.ToImmutable(), standardBuilder);
+ return (_diagnostics.ToImmutable(), new CompilationResult(standardBuilder, mvidFixup));
+ }
+
+ private static BlobContentId GetDeterministicContentId(IEnumerable content)
+ {
+ using IncrementalHash hash = IncrementalHash.CreateHash(HashAlgorithmName.SHA256);
+ foreach (Blob blob in content)
+ {
+ hash.AppendData(blob.GetBytes());
+ }
+
+ return BlobContentId.FromHash(hash.GetHashAndReset());
}
private ImmutableArray BuildVTableFixupInfos()
@@ -313,10 +331,9 @@ private void ReportWarning(string id, string message, Antlr4.Runtime.ParserRuleC
}
// Find methods that reference this vtable entry
- foreach (var entity in _entityRegistry.GetSeenEntities(TableIndex.MethodDef))
+ foreach (EntityRegistry.MethodDefinitionEntity method in GetParsedMethods())
{
- if (entity is EntityRegistry.MethodDefinitionEntity method &&
- method.VTableEntry == entryIndex + 1 && // 1-based
+ if (method.VTableEntry == entryIndex + 1 && // 1-based
method.VTableSlot > 0 &&
method.VTableSlot <= vtf.SlotCount)
{
@@ -334,6 +351,17 @@ private void ReportWarning(string id, string message, Antlr4.Runtime.ParserRuleC
return builder.ToImmutable();
}
+ private IEnumerable GetParsedMethods()
+ {
+ foreach (EntityRegistry.TypeDefinitionEntity type in _entityRegistry.GetSeenEntities(TableIndex.TypeDef))
+ {
+ foreach (EntityRegistry.MethodDefinitionEntity method in type.Methods)
+ {
+ yield return method;
+ }
+ }
+ }
+
private DebugDirectoryBuilder? BuildDebugDirectory(MethodDefinitionHandle entryPoint, out int debugDataSize)
{
debugDataSize = 0;
@@ -368,7 +396,7 @@ private void ReportWarning(string id, string message, Antlr4.Runtime.ParserRuleC
_pdbBuilder,
typeSystemRowCounts,
entryPoint,
- idProvider: content => new BlobContentId(Guid.NewGuid(), 0x04030201));
+ idProvider: _options.Deterministic ? GetDeterministicContentId : null);
var pdbBlob = new BlobBuilder();
var pdbContentId = pdbBuilder.Serialize(pdbBlob);
@@ -453,8 +481,8 @@ private static BlobBuilder EncodeSequencePoints(List tree.Accept(this);
@@ -585,11 +612,18 @@ public GrammarResult VisitAsmOrRefDecl(CILParser.AsmOrRefDeclContext context)
}
string decl = context.GetChild(0).GetText();
- if (decl == ".publicKey")
+ if (decl is ".publickey" or ".publicKey")
{
BlobBuilder blob = new();
blob.WriteBytes(VisitBytes(context.bytes()).Value);
- _currentAssemblyOrRef!.PublicKeyOrToken = blob;
+ // COMPAT: Native ilasm gives a public key token precedence regardless of declaration order.
+ if (_currentAssemblyOrRef is not EntityRegistry.AssemblyReferenceEntity assemblyReference
+ || assemblyReference.PublicKeyOrToken is null
+ || assemblyReference.Flags.HasFlag(AssemblyFlags.PublicKey))
+ {
+ _currentAssemblyOrRef!.PublicKeyOrToken = blob;
+ _currentAssemblyOrRef.Flags |= AssemblyFlags.PublicKey;
+ }
}
else if (decl == ".ver")
{
@@ -763,6 +797,7 @@ public GrammarResult VisitAssemblyRefDecl(CILParser.AssemblyRefDeclContext conte
var blob = new BlobBuilder();
blob.WriteBytes(VisitBytes(context.bytes()).Value);
_currentAssemblyOrRef!.PublicKeyOrToken = blob;
+ _currentAssemblyOrRef.Flags &= ~AssemblyFlags.PublicKey;
}
return GrammarResult.SentinelValue.Result;
}
@@ -862,7 +897,9 @@ public GrammarResult.Literal VisitCallConv(CILParser.CallConvContext conte
}
else if (context.EXPLICIT() is not null)
{
- return new((byte)(VisitCallConv(context.callConv()).Value | (byte)SignatureAttributes.ExplicitThis));
+ return new((byte)(
+ VisitCallConv(context.callConv()).Value |
+ (byte)(SignatureAttributes.ExplicitThis | SignatureAttributes.Instance)));
}
return new(0);
}
@@ -1072,14 +1109,27 @@ public CurrentMethodContext(EntityRegistry.MethodDefinitionEntity definition)
}
private CurrentMethodContext? _currentMethod;
+ private EntityRegistry.EntityBase? _pendingClassCustomAttributeOwner;
public GrammarResult VisitClassDecl(CILParser.ClassDeclContext context)
{
+ bool isStandaloneCustomAttribute =
+ context.customAttrDecl().Length == 1 &&
+ context.PARAM() is null;
+ bool isTrailingCustomAttribute =
+ isStandaloneCustomAttribute &&
+ context.customAttrDecl()[0].dottedName() is null;
+ if (!isTrailingCustomAttribute)
+ {
+ _pendingClassCustomAttributeOwner = null;
+ }
+
if (context.classHead() is CILParser.ClassHeadContext classHead)
{
_currentTypeDefinition.Push(VisitClassHead(classHead).Value);
VisitClassDecls(context.classDecls());
_currentTypeDefinition.Pop();
+ _pendingClassCustomAttributeOwner = null;
}
else if (context.methodHead() is CILParser.MethodHeadContext methodHead)
{
@@ -1106,10 +1156,112 @@ public GrammarResult VisitClassDecl(CILParser.ClassDeclContext context)
var declarativeSecurity = VisitSecDecl(secDecl).Value;
declarativeSecurity?.Parent = _currentTypeDefinition.PeekOrDefault();
}
+ else if (context.TYPE() is not null &&
+ context.typeSpec().Length == 1 &&
+ context.customDescr() is { } interfaceAttribute)
+ {
+ var currentType = _currentTypeDefinition.PeekOrDefault();
+ if (currentType is not null)
+ {
+ EntityRegistry.TypeEntity interfaceType = VisitTypeSpec(context.typeSpec()[0]).Value;
+ EntityRegistry.InterfaceImplementationEntity? implementation =
+ currentType.InterfaceImplementations.FirstOrDefault(
+ candidate => candidate.InterfaceType == interfaceType);
+ if (implementation is null)
+ {
+ implementation =
+ EntityRegistry.CreateUnrecordedInterfaceImplementation(currentType, interfaceType);
+ currentType.InterfaceImplementations.Add(implementation);
+ }
+
+ VisitCustomDescr(interfaceAttribute).Value.Owner = implementation;
+ }
+ }
else if (context.fieldDecl() is {} fieldDecl)
{
_ = VisitFieldDecl(fieldDecl);
}
+ else if (context.dataDecl() is { } dataDecl)
+ {
+ _ = VisitDataDecl(dataDecl);
+ }
+ else if (context.extSourceSpec() is { } extSourceSpec)
+ {
+ _ = VisitExtSourceSpec(extSourceSpec);
+ }
+ else if (context.languageDecl() is { } languageDecl)
+ {
+ _ = VisitLanguageDecl(languageDecl);
+ }
+ else if (context.OVERRIDE() is not null)
+ {
+ var currentType = _currentTypeDefinition.PeekOrDefault();
+ if (currentType is not null)
+ {
+ var typeSpecs = context.typeSpec();
+ var methodNames = context.methodName();
+ var callConventions = context.callConv();
+ var returnTypes = context.type();
+ var signatureArguments = context.sigArgs();
+ var genericArities = context.genArity();
+
+ int bodySignatureIndex = context.METHOD().Length == 0 ? 0 : 1;
+ BlobBuilder declarationSignature = BuildMethodReferenceSignature(
+ callConventions[0],
+ returnTypes[0],
+ signatureArguments[0],
+ genericArities.Length > 0 ? VisitGenArity(genericArities[0]).Value : 0);
+ BlobBuilder bodySignature = context.METHOD().Length == 0
+ ? declarationSignature
+ : BuildMethodReferenceSignature(
+ callConventions[bodySignatureIndex],
+ returnTypes[bodySignatureIndex],
+ signatureArguments[bodySignatureIndex],
+ genericArities.Length > bodySignatureIndex
+ ? VisitGenArity(genericArities[bodySignatureIndex]).Value
+ : 0);
+
+ EntityRegistry.TypeEntity bodyOwner = VisitTypeSpec(typeSpecs[1]).Value;
+ string bodyName = VisitMethodName(methodNames[1]).Value;
+ EntityRegistry.MemberReferenceEntity declaration =
+ _entityRegistry.CreateLazilyRecordedMemberReference(
+ VisitTypeSpec(typeSpecs[0]).Value,
+ VisitMethodName(methodNames[0]).Value,
+ declarationSignature);
+
+ if (ReferenceEquals(bodyOwner, currentType))
+ {
+ EntityRegistry.MethodDefinitionEntity[] bodyMethods = currentType.Methods
+ .Where(method =>
+ method.Name == bodyName &&
+ method.MethodSignature is not null &&
+ method.MethodSignature.ContentEquals(bodySignature))
+ .Take(2)
+ .ToArray();
+ if (bodyMethods.Length != 1)
+ {
+ ReportError(
+ DiagnosticIds.InvalidMetadataToken,
+ $"Override body method '{bodyName}' could not be resolved uniquely",
+ context);
+ return GrammarResult.SentinelValue.Result;
+ }
+
+ currentType.MethodImplementations.Add(
+ EntityRegistry.CreateUnrecordedMethodImplementation(bodyMethods[0], declaration));
+ }
+ else
+ {
+ EntityRegistry.MemberReferenceEntity body =
+ _entityRegistry.CreateLazilyRecordedMemberReference(
+ bodyOwner,
+ bodyName,
+ bodySignature);
+ currentType.MethodImplementations.Add(
+ EntityRegistry.CreateUnrecordedMethodImplementation(currentType, body, declaration));
+ }
+ }
+ }
else if (context.int32() is {} int32)
{
// .pack or .size
@@ -1176,12 +1328,55 @@ public GrammarResult VisitClassDecl(CILParser.ClassDeclContext context)
}
}
}
- else if (context.customAttrDecl().Length == 1 && context.PARAM() is null)
+ else if (context.OVERRIDE() is not null)
+ {
+ var currentType = _currentTypeDefinition.PeekOrDefault();
+ if (currentType is null)
+ {
+ throw new UnreachableException();
+ }
+
+ CILParser.CallConvContext[] callConvs = context.callConv();
+ CILParser.TypeContext[] returnTypes = context.type();
+ CILParser.TypeSpecContext[] owners = context.typeSpec();
+ CILParser.MethodNameContext[] methodNames = context.methodName();
+ CILParser.GenArityContext[] genericArities = context.genArity();
+ CILParser.SigArgsContext[] parameterLists = context.sigArgs();
+
+ EntityRegistry.MemberReferenceEntity declaration;
+ EntityRegistry.MemberReferenceEntity body;
+ if (callConvs.Length == 2)
+ {
+ declaration = CreateExplicitMethodReference(
+ callConvs[0], returnTypes[0], owners[0], methodNames[0], genericArities[0], parameterLists[0]);
+ body = CreateExplicitMethodReference(
+ callConvs[1], returnTypes[1], owners[1], methodNames[1], genericArities[1], parameterLists[1]);
+ }
+ else
+ {
+ EntityRegistry.TypeEntity declarationOwner = VisitTypeSpec(owners[0]).Value;
+ string declarationName = VisitMethodName(methodNames[0]).Value;
+ EntityRegistry.TypeEntity bodyOwner = VisitTypeSpec(owners[1]).Value;
+ string bodyName = VisitMethodName(methodNames[1]).Value;
+ BlobBuilder bodySignature = CreateExplicitMethodSignature(
+ callConvs[0], returnTypes[0], genericArity: null, parameterLists[0]);
+ BlobBuilder declarationSignature = new();
+ bodySignature.WriteContentTo(declarationSignature);
+ declaration = _entityRegistry.CreateLazilyRecordedMemberReference(
+ declarationOwner, declarationName, declarationSignature);
+ body = _entityRegistry.CreateLazilyRecordedMemberReference(
+ bodyOwner, bodyName, bodySignature);
+ }
+
+ currentType.MethodImplementations.Add(EntityRegistry.CreateUnrecordedMethodImplementation(currentType, body, declaration));
+ }
+ else if (isStandaloneCustomAttribute)
{
- // Custom attribute directly on the type
if (VisitCustomAttrDecl(context.customAttrDecl()[0]).Value is { } customAttr)
{
- customAttr.Owner = _currentTypeDefinition.PeekOrDefault();
+ customAttr.Owner =
+ _pendingClassCustomAttributeOwner ??
+ _currentTypeDefinition.PeekOrDefault();
}
}
else if (context.PARAM() is not null)
@@ -1198,6 +1393,13 @@ public GrammarResult VisitClassDecl(CILParser.ClassDeclContext context)
{
param = currentType.GenericParameters[index];
}
+ else
+ {
+ ReportError(
+ DiagnosticIds.GenericParameterIndexOutOfRange,
+ string.Format(DiagnosticMessageTemplates.GenericParameterIndexOutOfRange, index),
+ context);
+ }
}
else if (context.dottedName() is { } dn)
{
@@ -1218,6 +1420,7 @@ public GrammarResult VisitClassDecl(CILParser.ClassDeclContext context)
var customAttrDecl = VisitCustomAttrDecl(attr).Value;
customAttrDecl?.Owner = param;
}
+ _pendingClassCustomAttributeOwner = param;
}
}
else if (currentType is not null && context.CONSTRAINT() is not null)
@@ -1230,6 +1433,13 @@ public GrammarResult VisitClassDecl(CILParser.ClassDeclContext context)
{
param = currentType.GenericParameters[index];
}
+ else
+ {
+ ReportError(
+ DiagnosticIds.GenericParameterIndexOutOfRange,
+ string.Format(DiagnosticMessageTemplates.GenericParameterIndexOutOfRange, index),
+ context);
+ }
}
else if (context.dottedName() is { } dn)
{
@@ -1246,22 +1456,83 @@ public GrammarResult VisitClassDecl(CILParser.ClassDeclContext context)
if (param is not null)
{
var baseType = VisitTypeSpec(context.typeSpec()[0]).Value;
- var constraint = new EntityRegistry.GenericParameterConstraintEntity(baseType);
- constraint.Owner = param;
- param.Constraints.Add(constraint);
- currentType.GenericParameterConstraints.Add(constraint);
+ EntityRegistry.GenericParameterConstraintEntity? constraint =
+ param.Constraints.FirstOrDefault(entity => entity.BaseType == baseType);
+ if (constraint is null)
+ {
+ constraint = EntityRegistry.CreateGenericConstraint(baseType);
+ constraint.Owner = param;
+ param.Constraints.Add(constraint);
+ currentType.GenericParameterConstraints.Add(constraint);
+ }
foreach (var attr in customAttrDeclarations ?? Array.Empty())
{
var customAttrDecl = VisitCustomAttrDecl(attr).Value;
customAttrDecl?.Owner = constraint;
}
+ _pendingClassCustomAttributeOwner = constraint;
}
}
}
return GrammarResult.SentinelValue.Result;
}
- public GrammarResult VisitClassDecls(CILParser.ClassDeclsContext context) => VisitChildren(context);
+
+ private BlobBuilder BuildMethodReferenceSignature(
+ CILParser.CallConvContext callConvention,
+ CILParser.TypeContext returnType,
+ CILParser.SigArgsContext signatureArguments,
+ int genericArity)
+ {
+ var signature = new BlobBuilder();
+ byte header = VisitCallConv(callConvention).Value;
+ if (genericArity > 0)
+ {
+ header |= (byte)SignatureAttributes.Generic;
+ }
+
+ signature.WriteByte(header);
+ if (genericArity > 0)
+ {
+ signature.WriteCompressedInteger(genericArity);
+ }
+
+ ImmutableArray arguments = VisitSigArgs(signatureArguments).Value;
+ signature.WriteCompressedInteger(arguments.Count(argument => !argument.IsSentinel));
+ VisitType(returnType).Value.WriteContentTo(signature);
+ foreach (SignatureArg argument in arguments)
+ {
+ argument.SignatureBlob.WriteContentTo(signature);
+ }
+
+ return signature;
+ }
+
+ public GrammarResult VisitClassDecls(CILParser.ClassDeclsContext context)
+ {
+ CILParser.ClassDeclContext[] declarations = context.classDecl();
+ foreach (CILParser.ClassDeclContext declaration in declarations)
+ {
+ if (declaration.OVERRIDE() is null)
+ {
+ VisitClassDecl(declaration);
+ }
+ else
+ {
+ _pendingClassCustomAttributeOwner = null;
+ }
+ }
+
+ foreach (CILParser.ClassDeclContext declaration in declarations)
+ {
+ if (declaration.OVERRIDE() is not null)
+ {
+ VisitClassDecl(declaration);
+ }
+ }
+
+ return GrammarResult.SentinelValue.Result;
+ }
GrammarResult ICILVisitor.VisitClassHead(CILParser.ClassHeadContext context) => VisitClassHead(context);
@@ -1346,12 +1617,6 @@ public GrammarResult VisitClassDecl(CILParser.ClassDeclContext context)
// Two-pass generic parameter processing:
// Pass 1: Register all parameter names (without resolving constraints)
var typarContexts = context.typarsClause()?.typars()?.typar() ?? Array.Empty();
- if (typarContexts.Length > ushort.MaxValue)
- {
- ReportError(DiagnosticIds.TooManyGenericParameters,
- string.Format(DiagnosticMessageTemplates.TooManyGenericParameters, typarContexts.Length, ushort.MaxValue),
- context.typarsClause());
- }
for (int i = 0; i < typarContexts.Length; i++)
{
var attributes = VisitTyparAttribs(typarContexts[i].typarAttribs()).Value;
@@ -1435,12 +1700,6 @@ public GrammarResult VisitClassDecl(CILParser.ClassDeclContext context)
{
// Two-pass generic parameter processing for forward-referenced types
var typarContexts = context.typarsClause()?.typars()?.typar() ?? Array.Empty();
- if (typarContexts.Length > ushort.MaxValue)
- {
- ReportError(DiagnosticIds.TooManyGenericParameters,
- string.Format(DiagnosticMessageTemplates.TooManyGenericParameters, typarContexts.Length, ushort.MaxValue),
- context.typarsClause());
- }
for (int i = 0; i < typarContexts.Length; i++)
{
var attributes = VisitTyparAttribs(typarContexts[i].typarAttribs()).Value;
@@ -1635,11 +1894,10 @@ EntityRegistry.TypeEntity ResolveTypeDef()
GrammarResult ICILVisitor.VisitClassSeq(CILParser.ClassSeqContext context) => VisitClassSeq(context);
public GrammarResult.FormattedBlob VisitClassSeq(CILParser.ClassSeqContext context)
{
- // We're going to add all of the elements in the sequence as prefix blobs to this blob.
BlobBuilder objSeqBlob = new(0);
foreach (var item in context.classSeqElement())
{
- objSeqBlob.LinkPrefix(VisitClassSeqElement(item).Value);
+ objSeqBlob.LinkSuffix(VisitClassSeqElement(item).Value);
}
return new(objSeqBlob);
}
@@ -1662,7 +1920,10 @@ public GrammarResult.FormattedBlob VisitClassSeqElement(CILParser.ClassSeqElemen
return new(blob);
}
- blob.WriteSerializedString(context.SQSTRING()?.Symbol.Text);
+ blob.WriteSerializedString(
+ context.SQSTRING() is { } stringNode
+ ? StringHelpers.ParseQuotedString(stringNode.Symbol.Text)
+ : null);
return new(blob);
}
public GrammarResult VisitCompControl(CILParser.CompControlContext context)
@@ -1813,7 +2074,9 @@ public GrammarResult.FormattedBlob VisitCustomBlobNVPairs(CILParser.CustomBlobNV
}
else
{
- throw new UnreachableException();
+ value = new();
+ value.WriteUInt16(CustomAttributeBlobFormatVersion);
+ value.WriteUInt16(0);
}
return new(_entityRegistry.CreateCustomAttribute(ctor, value));
@@ -1842,7 +2105,9 @@ public GrammarResult.FormattedBlob VisitCustomBlobNVPairs(CILParser.CustomBlobNV
}
else
{
- throw new UnreachableException();
+ value = new();
+ value.WriteUInt16(CustomAttributeBlobFormatVersion);
+ value.WriteUInt16(0);
}
var attr = _entityRegistry.CreateCustomAttribute(ctor, value);
@@ -1976,6 +2241,14 @@ public GrammarResult VisitDdItemList(CILParser.DdItemListContext context)
public GrammarResult VisitDecl(CILParser.DeclContext context)
{
+ bool isTrailingCustomAttribute =
+ context.customAttrDecl() is { } customAttribute &&
+ customAttribute.dottedName() is null;
+ if (context.fieldDecl() is null && !isTrailingCustomAttribute)
+ {
+ _pendingClassCustomAttributeOwner = null;
+ }
+
if (context.nameSpaceHead() is CILParser.NameSpaceHeadContext ns)
{
string namespaceName = VisitNameSpaceHead(ns).Value;
@@ -1983,6 +2256,7 @@ public GrammarResult VisitDecl(CILParser.DeclContext context)
_currentNamespace.Push(string.IsNullOrEmpty(outer) ? namespaceName : $"{outer}.{namespaceName}");
VisitDecls(context.decls());
_currentNamespace.Pop();
+ _pendingClassCustomAttributeOwner = null;
return GrammarResult.SentinelValue.Result;
}
if (context.classHead() is CILParser.ClassHeadContext classHead)
@@ -1990,6 +2264,7 @@ public GrammarResult VisitDecl(CILParser.DeclContext context)
_currentTypeDefinition.Push(VisitClassHead(classHead).Value);
VisitClassDecls(context.classDecls());
_currentTypeDefinition.Pop();
+ _pendingClassCustomAttributeOwner = null;
return GrammarResult.SentinelValue.Result;
}
if (context.methodHead() is CILParser.MethodHeadContext methodHead)
@@ -2152,10 +2427,9 @@ public GrammarResult VisitDecl(CILParser.DeclContext context)
}
if (context.customAttrDecl() is { } topLevelCustomAttr)
{
- // Top-level custom attribute — owned by the module (matching native ilasm behavior)
if (VisitCustomAttrDecl(topLevelCustomAttr).Value is { } customAttr)
{
- customAttr.Owner = _entityRegistry.Module;
+ customAttr.Owner = (EntityRegistry.EntityBase?)_pendingClassCustomAttributeOwner ?? _entityRegistry.Module;
}
}
if (context.secDecl() is { } topSecDecl)
@@ -2197,6 +2471,26 @@ GrammarResult ICILVisitor.VisitDottedName(CILParser.DottedNameCon
public static GrammarResult.String VisitDottedName(CILParser.DottedNameContext context)
{
+ CILParser.DottedNamePartContext[] parts = context.dottedNamePart();
+ if (parts.Length > 0)
+ {
+ StringBuilder builder = new();
+ for (int i = 0; i < parts.Length; i++)
+ {
+ if (i > 0)
+ {
+ builder.Append('.');
+ }
+
+ CILParser.DottedNamePartContext part = parts[i];
+ builder.Append(part.SQSTRING() is { } quotedPart
+ ? StringHelpers.ParseQuotedString(quotedPart.GetText())
+ : part.GetText());
+ }
+
+ return new(builder.ToString());
+ }
+
string text = context.GetText();
if (context.SQSTRING() is not null && text.Length >= 2 && text[0] == '\'')
{
@@ -2686,13 +2980,36 @@ public GrammarResult VisitExtSourceSpec(CILParser.ExtSourceSpecContext context)
// 0xFEEFEE indicates a hidden sequence point
if (startLine == 0xFEEFEE)
{
- _currentMethod.Definition.DebugInfo.SequencePoints.Add(
- EntityRegistry.SequencePoint.Hidden(ilOffset));
+ AddSequencePoint(EntityRegistry.SequencePoint.Hidden(ilOffset));
}
else
{
- _currentMethod.Definition.DebugInfo.SequencePoints.Add(
- new EntityRegistry.SequencePoint(ilOffset, startLine, startColumn, endLine, endColumn));
+ if (endLine == startLine && endColumn == startColumn)
+ {
+ endColumn++;
+ }
+
+ AddSequencePoint(
+ new EntityRegistry.SequencePoint(
+ ilOffset,
+ startLine,
+ startColumn,
+ endLine,
+ endColumn));
+ }
+
+ void AddSequencePoint(EntityRegistry.SequencePoint sequencePoint)
+ {
+ List sequencePoints =
+ _currentMethod.Definition.DebugInfo.SequencePoints;
+ if (sequencePoints.Count > 0 && sequencePoints[^1].ILOffset == ilOffset)
+ {
+ sequencePoints[^1] = sequencePoint;
+ }
+ else
+ {
+ sequencePoints.Add(sequencePoint);
+ }
}
}
@@ -2702,9 +3019,9 @@ public GrammarResult VisitExtSourceSpec(CILParser.ExtSourceSpecContext context)
GrammarResult ICILVisitor.VisitF32seq(CILParser.F32seqContext context) => VisitF32seq(context);
public GrammarResult.FormattedBlob VisitF32seq(CILParser.F32seqContext context)
{
- var builder = ImmutableArray.CreateBuilder();
+ var builder = ImmutableArray.CreateBuilder(context.ChildCount);
- foreach (var item in context.children)
+ foreach (var item in context.children ?? [])
{
builder.Add((float)(item switch
{
@@ -2718,9 +3035,9 @@ public GrammarResult.FormattedBlob VisitF32seq(CILParser.F32seqContext context)
GrammarResult ICILVisitor.VisitF64seq(CILParser.F64seqContext context) => VisitF64seq(context);
public GrammarResult.FormattedBlob VisitF64seq(CILParser.F64seqContext context)
{
- var builder = ImmutableArray.CreateBuilder();
+ var builder = ImmutableArray.CreateBuilder(context.ChildCount);
- foreach (var item in context.children)
+ foreach (var item in context.children ?? [])
{
builder.Add((double)(item switch
{
@@ -2775,7 +3092,7 @@ public GrammarResult VisitFieldDecl(CILParser.FieldDeclContext context)
var fieldType = VisitType(context.type()).Value;
var marshalBlobs = context.marshalBlob();
var marshalBlob = marshalBlobs.Length > 0 ? VisitMarshalBlob(marshalBlobs[marshalBlobs.Length - 1]).Value : null;
- var name = VisitDottedName(context.dottedName()).Value;
+ string name = VisitDottedName(context.dottedName()).Value;
var rvaOffset = VisitAtOpt(context.atOpt()).Value;
var fieldOffset = VisitRepeatOpt(context.repeatOpt()).Value;
var constantValue = VisitInitOpt(context.initOpt()).Value;
@@ -2785,6 +3102,7 @@ public GrammarResult VisitFieldDecl(CILParser.FieldDeclContext context)
fieldType.WriteContentTo(signature.Builder);
var field = EntityRegistry.CreateUnrecordedFieldDefinition(fieldAttrs, _currentTypeDefinition.PeekOrDefault() ?? _entityRegistry.ModuleType, name, signature.Builder);
+ _pendingClassCustomAttributeOwner = field;
if (field is not null)
{
@@ -2926,13 +3244,13 @@ public GrammarResult VisitFieldDecl(CILParser.FieldDeclContext context)
}
var fieldTypeSig = VisitType(type).Value;
- EntityRegistry.TypeEntity definingType = _currentTypeDefinition.PeekOrDefault() ?? _entityRegistry.ModuleType;
+ EntityRegistry.TypeEntity definingType = _entityRegistry.ModuleType;
if (context.typeSpec() is CILParser.TypeSpecContext typeSpec)
{
definingType = VisitTypeSpec(typeSpec).Value;
}
- var name = VisitDottedName(context.dottedName()).Value;
+ string name = VisitDottedName(context.dottedName()).Value;
var fieldSig = new BlobBuilder(fieldTypeSig.Count + 1);
fieldSig.WriteByte((byte)SignatureKind.Field);
@@ -2989,7 +3307,18 @@ public GrammarResult.FormattedBlob VisitFieldSerInit(CILParser.FieldSerInitConte
{
if (context.float64() is CILParser.Float64Context float64)
{
- builder.WriteSingle((float)VisitFloat64(float64).Value);
+ string text = float64.GetText();
+ if (!text.Contains('.') &&
+ text.IndexOf('e') < 0 &&
+ text.IndexOf('E') < 0 &&
+ ParseIntegerValue(text.AsSpan(), out long rawValue))
+ {
+ builder.WriteSingle(BitConverter.Int32BitsToSingle((int)rawValue));
+ }
+ else
+ {
+ builder.WriteSingle((float)VisitFloat64(float64).Value);
+ }
}
if (context.int32() is CILParser.Int32Context int32)
{
@@ -2998,11 +3327,22 @@ public GrammarResult.FormattedBlob VisitFieldSerInit(CILParser.FieldSerInitConte
}
break;
}
- case CILParser.FLOAT64:
+ case CILParser.FLOAT64_:
{
if (context.float64() is CILParser.Float64Context float64)
{
- builder.WriteDouble(VisitFloat64(float64).Value);
+ string text = float64.GetText();
+ if (!text.Contains('.') &&
+ text.IndexOf('e') < 0 &&
+ text.IndexOf('E') < 0 &&
+ ParseIntegerValue(text.AsSpan(), out long rawValue))
+ {
+ builder.WriteDouble(BitConverter.Int64BitsToDouble(rawValue));
+ }
+ else
+ {
+ builder.WriteDouble(VisitFloat64(float64).Value);
+ }
}
if (context.int64() is CILParser.Int64Context int64)
{
@@ -3027,8 +3367,8 @@ public GrammarResult.Literal VisitFileAttr(CILParser.FileAttrContext conte
var hashBlob = hash is not null ? new BlobBuilder() : null;
hashBlob?.WriteBytes(hash!.Value);
- bool hasMetadata = context.fileAttr().Aggregate(true, (acc, attr) => acc || VisitFileAttr(attr).Value);
- bool isEntrypoint = context.fileEntry().Aggregate(true, (acc, attr) => acc || VisitFileEntry(attr).Value);
+ bool hasMetadata = context.fileAttr().Aggregate(true, (acc, attr) => acc && VisitFileAttr(attr).Value);
+ bool isEntrypoint = context.fileEntry().Aggregate(false, (acc, attr) => acc || VisitFileEntry(attr).Value);
var entity = _entityRegistry.GetOrCreateFile(dottedName, hasMetadata, hashBlob);
if (isEntrypoint)
{
@@ -3081,11 +3421,21 @@ public GrammarResult.Literal VisitFloat64(CILParser.Float64Context conte
}
else if (context.int32() is CILParser.Int32Context int32)
{
- int intValue = VisitInt32(int32).Value;
+ IToken node = int32.INT32().Symbol;
+ if (!ParseIntegerValue(node.Text.AsSpan(), out long intValue))
+ {
+ _diagnostics.Add(new Diagnostic(
+ DiagnosticIds.LiteralOutOfRange,
+ DiagnosticSeverity.Error,
+ string.Format(DiagnosticMessageTemplates.LiteralOutOfRange, node.Text),
+ Location.From(node, _documents)));
+ intValue = 0;
+ }
+
if (context.FLOAT32() is not null)
{
// FLOAT32 '(' int32 ')' — hex bits reinterpreted as float32
- return new(BitConverter.Int32BitsToSingle(intValue));
+ return new(BitConverter.Int32BitsToSingle((int)intValue));
}
// int32 or int32 '.' — plain integer or trailing-dot float
return new((double)intValue);
@@ -3291,6 +3641,10 @@ public GrammarResult VisitInstr(CILParser.InstrContext context)
{
var instrContext = context.GetRuleContext(0);
ILOpCode opcode = ((GrammarResult.Literal)instrContext.Accept(this)).Value;
+ if (opcode == ILOpCode.Localloc)
+ {
+ _currentMethod!.Definition.HasDynamicStackAllocation = true;
+ }
switch (instrContext.RuleIndex)
{
case CILParser.RULE_instr_brtarget:
@@ -3404,7 +3758,7 @@ public GrammarResult VisitInstr(CILParser.InstrContext context)
else if (argument is CILParser.Int64Context int64)
{
long intValue = VisitInt64(int64).Value;
- value = BitConverter.Int64BitsToDouble(intValue);
+ value = intValue;
}
else if (argument is CILParser.BytesContext bytesContext)
{
@@ -3439,11 +3793,12 @@ public GrammarResult VisitInstr(CILParser.InstrContext context)
break;
case CILParser.RULE_instr_sig:
{
+ Debug.Assert(opcode == ILOpCode.Calli);
BlobBuilder signature = new();
byte callConv = VisitCallConv(context.callConv()).Value;
signature.WriteByte(callConv);
var args = VisitSigArgs(context.sigArgs()).Value;
- signature.WriteCompressedInteger(args.Length);
+ signature.WriteCompressedInteger(args.Count(arg => !arg.IsSentinel));
// Write return type
VisitType(context.type()).Value.WriteContentTo(signature);
// Write arg signatures
@@ -3451,6 +3806,7 @@ public GrammarResult VisitInstr(CILParser.InstrContext context)
{
arg.SignatureBlob.WriteContentTo(signature);
}
+ _currentMethod!.Definition.MethodBody.OpCode(opcode);
_currentMethod!.Definition.MethodBody.Token(_entityRegistry.GetOrCreateStandaloneSignature(signature).Handle);
}
break;
@@ -3550,12 +3906,22 @@ public GrammarResult VisitInstr(CILParser.InstrContext context)
}
break;
case CILParser.RULE_instr_tok:
- var tok = VisitOwnerType(context.ownerType()).Value;
_currentMethod!.Definition.MethodBody.OpCode(opcode);
+ if (context.int32() is { } tokenValue)
+ {
+ _currentMethod.Definition.MethodBody.CodeBuilder.WriteInt32(VisitInt32(tokenValue).Value);
+ break;
+ }
+
+ var tok = VisitOwnerType(context.ownerType()).Value;
if (tok is EntityRegistry.TypeReferenceEntity tokTypeRef)
{
tokTypeRef.RecordBlobToWriteResolvedToken(_currentMethod.Definition.MethodBody.CodeBuilder.ReserveBytes(4));
}
+ else if (tok is EntityRegistry.MemberReferenceEntity tokMemberRef)
+ {
+ tokMemberRef.RecordBlobToWriteResolvedHandle(_currentMethod.Definition.MethodBody.CodeBuilder.ReserveBytes(4));
+ }
else
{
_currentMethod.Definition.MethodBody.Token(tok.Handle);
@@ -3664,6 +4030,12 @@ public GrammarResult VisitInstr(CILParser.InstrContext context)
private static ILOpCode ParseOpCodeFromToken(IToken token)
{
string text = token.Text.TrimEnd('.');
+ if (text == "unused")
+ {
+ // Native ilasm's keyword index uses the last matching opcode.def entry, CEE_UNUSED70.
+ return ILOpCode.Unused;
+ }
+
string normalized = text.Replace('.', '_');
// Handle instruction aliases that don't directly map to ILOpCode enum names
@@ -4339,12 +4711,6 @@ public GrammarResult VisitMethodDecls(CILParser.MethodDeclsContext context)
// Pass 1: Register all parameter names (without resolving constraints)
_currentMethod = new(methodDefinition);
var typarContexts = context.typarsClause()?.typars()?.typar() ?? Array.Empty();
- if (typarContexts.Length > ushort.MaxValue)
- {
- ReportError(DiagnosticIds.TooManyGenericParameters,
- string.Format(DiagnosticMessageTemplates.TooManyGenericParameters, typarContexts.Length, ushort.MaxValue),
- context.typarsClause());
- }
for (int i = 0; i < typarContexts.Length; i++)
{
var attributes = VisitTyparAttribs(typarContexts[i].typarAttribs()).Value;
@@ -4388,7 +4754,7 @@ public GrammarResult VisitMethodDecls(CILParser.MethodDeclsContext context)
pInvokeInfo);
continue;
}
- pInvokeInformation = (_entityRegistry.GetOrCreateModuleReference(moduleName, _ => { }), entryPoint, attributes);
+ pInvokeInformation = (_entityRegistry.GetOrCreateModuleReference(moduleName, _ => { }), entryPoint ?? name, attributes);
}
methodDefinition.MethodImportInformation = pInvokeInformation;
@@ -4503,7 +4869,7 @@ public GrammarResult.String VisitMethodName(CILParser.MethodNameContext context)
return new(_entityRegistry.CreateLazilyRecordedMemberReference(_entityRegistry.ModuleType, "", methodRefSignature));
}
byte callConv = VisitCallConv(callConvCtx).Value;
- EntityRegistry.TypeEntity owner = _currentTypeDefinition.PeekOrDefault() ?? _entityRegistry.ModuleType;
+ EntityRegistry.TypeEntity owner = _entityRegistry.ModuleType;
if (context.typeSpec() is CILParser.TypeSpecContext typeSpec)
{
owner = VisitTypeSpec(typeSpec).Value;
@@ -4561,6 +4927,54 @@ public GrammarResult.String VisitMethodName(CILParser.MethodNameContext context)
return new(memberRef);
}
+
+ private EntityRegistry.MemberReferenceEntity CreateExplicitMethodReference(
+ CILParser.CallConvContext callConv,
+ CILParser.TypeContext returnType,
+ CILParser.TypeSpecContext owner,
+ CILParser.MethodNameContext methodName,
+ CILParser.GenArityContext? genericArity,
+ CILParser.SigArgsContext parameterList)
+ {
+ EntityRegistry.TypeEntity ownerType = VisitTypeSpec(owner).Value;
+ string name = VisitMethodName(methodName).Value;
+ return _entityRegistry.CreateLazilyRecordedMemberReference(
+ ownerType,
+ name,
+ CreateExplicitMethodSignature(callConv, returnType, genericArity, parameterList));
+ }
+
+ private BlobBuilder CreateExplicitMethodSignature(
+ CILParser.CallConvContext callConv,
+ CILParser.TypeContext returnType,
+ CILParser.GenArityContext? genericArity,
+ CILParser.SigArgsContext parameterList)
+ {
+ BlobBuilder signature = new();
+ byte signatureHeader = VisitCallConv(callConv).Value;
+ int arity = genericArity is null ? 0 : VisitGenArity(genericArity).Value;
+ if (arity != 0)
+ {
+ signatureHeader |= (byte)SignatureAttributes.Generic;
+ }
+
+ signature.WriteByte(signatureHeader);
+ if (arity != 0)
+ {
+ signature.WriteCompressedInteger(arity);
+ }
+
+ ImmutableArray parameters = VisitSigArgs(parameterList).Value;
+ signature.WriteCompressedInteger(parameters.Count(parameter => !parameter.IsSentinel));
+ VisitType(returnType).Value.WriteContentTo(signature);
+ foreach (SignatureArg parameter in parameters)
+ {
+ parameter.SignatureBlob.WriteContentTo(signature);
+ }
+
+ return signature;
+ }
+
public GrammarResult VisitModuleHead(CILParser.ModuleHeadContext context)
{
if (context.ChildCount > 2)
@@ -4569,7 +4983,10 @@ public GrammarResult VisitModuleHead(CILParser.ModuleHeadContext context)
return GrammarResult.SentinelValue.Result;
}
- _entityRegistry.Module.Name = VisitDottedName(context.dottedName()).Value;
+ if (context.dottedName() is { } moduleName)
+ {
+ _entityRegistry.Module.Name = VisitDottedName(moduleName).Value;
+ }
return GrammarResult.SentinelValue.Result;
}
@@ -4594,12 +5011,18 @@ public GrammarResult.Literal> VisitNameValPair
GrammarResult ICILVisitor.VisitNativeType(CILParser.NativeTypeContext context) => VisitNativeType(context);
public GrammarResult.FormattedBlob VisitNativeType(CILParser.NativeTypeContext context)
{
- if (context.nativeTypeArrayPointerInfo() is not CILParser.NativeTypeArrayPointerInfoContext[] arrayPointerInfo)
+ if (context.nativeTypeElement() is not CILParser.NativeTypeElementContext element)
+ {
+ return new(new BlobBuilder());
+ }
+
+ CILParser.NativeTypeArrayPointerInfoContext[] arrayPointerInfo = context.nativeTypeArrayPointerInfo();
+ if (arrayPointerInfo.Length == 0)
{
- return VisitNativeTypeElement(context.nativeTypeElement());
+ return VisitNativeTypeElement(element);
}
var prefix = new BlobBuilder(arrayPointerInfo.Length);
- var elementType = VisitNativeTypeElement(context.nativeTypeElement()).Value;
+ var elementType = VisitNativeTypeElement(element).Value;
var suffix = new BlobBuilder();
for (int i = arrayPointerInfo.Length - 1; i >= 0; i--)
@@ -4629,20 +5052,20 @@ public GrammarResult.FormattedBlob VisitNativeType(CILParser.NativeTypeContext c
{
if (arrayPointerInfo[i] is CILParser.PointerArrayTypeSizeContext size)
{
+ suffix.WriteCompressedInteger(0);
suffix.WriteCompressedInteger(VisitInt32(size.int32()).Value);
+ suffix.WriteCompressedInteger(0);
}
else if (arrayPointerInfo[i] is CILParser.PointerArrayTypeSizeParamIndexContext sizeParamIndex)
{
var ints = sizeParamIndex.int32();
suffix.WriteCompressedInteger(VisitInt32(ints[1]).Value);
- suffix.WriteCompressedInteger(VisitInt32(ints[2]).Value);
+ suffix.WriteCompressedInteger(VisitInt32(ints[0]).Value);
suffix.WriteCompressedInteger(1); // Write that the paramIndex parameter was specified
}
else if (arrayPointerInfo[i] is CILParser.PointerArrayTypeParamIndexContext paramIndex)
{
- suffix.WriteCompressedInteger(0);
suffix.WriteCompressedInteger(VisitInt32(paramIndex.int32()).Value);
- suffix.WriteCompressedInteger(0); // Write that the paramIndex parameter was not specified
}
}
@@ -4654,7 +5077,7 @@ public GrammarResult.FormattedBlob VisitNativeType(CILParser.NativeTypeContext c
GrammarResult ICILVisitor.VisitNativeTypeElement(CILParser.NativeTypeElementContext context) => VisitNativeTypeElement(context);
public GrammarResult.FormattedBlob VisitNativeTypeElement(CILParser.NativeTypeElementContext context)
{
- var blob = new BlobBuilder(5);
+ var blob = new BlobBuilder();
if (context.dottedName() is CILParser.DottedNameContext typedef)
{
// Native type typedefs are not yet fully supported
@@ -4666,6 +5089,21 @@ public GrammarResult.FormattedBlob VisitNativeTypeElement(CILParser.NativeTypeEl
if (context.marshalType is null)
{
+ if (context.marshalBool is not null)
+ {
+ blob.WriteByte((byte)UnmanagedType.VariantBool);
+ }
+ else if (context.unsignedMarshalType is not null)
+ {
+ blob.WriteByte(context.unsignedMarshalType.Type switch
+ {
+ CILParser.INT8 => (byte)UnmanagedType.U1,
+ CILParser.INT16 => (byte)UnmanagedType.U2,
+ CILParser.INT32_ => (byte)UnmanagedType.U4,
+ CILParser.INT64_ => (byte)UnmanagedType.U8,
+ _ => throw new UnreachableException(),
+ });
+ }
return new(blob);
}
@@ -4702,7 +5140,7 @@ public GrammarResult.FormattedBlob VisitNativeTypeElement(CILParser.NativeTypeEl
case CILParser.ARRAY:
blob.WriteByte((byte)UnmanagedType.ByValArray);
blob.WriteCompressedInteger(VisitInt32(context.int32()).Value);
- blob.LinkSuffix(VisitNativeType(context.nativeType()).Value);
+ VisitNativeType(context.nativeType()).Value.WriteContentTo(blob);
break;
case CILParser.VARIANT:
ReportWarning(DiagnosticIds.DeprecatedNativeType,
@@ -4731,15 +5169,7 @@ public GrammarResult.FormattedBlob VisitNativeTypeElement(CILParser.NativeTypeEl
blob.WriteByte(NATIVE_TYPE_VOID);
break;
case CILParser.BOOL:
- // Distinguish 'variant bool' (VariantBool) from plain 'bool' (Bool)
- if (context.marshalBool is not null)
- {
- blob.WriteByte((byte)UnmanagedType.VariantBool);
- }
- else
- {
- blob.WriteByte((byte)UnmanagedType.Bool);
- }
+ blob.WriteByte((byte)UnmanagedType.Bool);
break;
case CILParser.INT8:
blob.WriteByte((byte)UnmanagedType.I1);
@@ -4905,11 +5335,21 @@ public GrammarResult.FormattedBlob VisitNativeTypeElement(CILParser.NativeTypeEl
GrammarResult ICILVisitor.VisitObjSeq(CILParser.ObjSeqContext context) => VisitObjSeq(context);
public GrammarResult.FormattedBlob VisitObjSeq(CILParser.ObjSeqContext context)
{
- // We're going to add all of the elements in the sequence as prefix blobs to this blob.
- BlobBuilder objSeqBlob = new(0);
+ BlobBuilder objSeqBlob = new();
foreach (var item in context.serInit())
{
- objSeqBlob.LinkPrefix(VisitSerInit(item).Value);
+ // Each element in object[] is encoded as FieldOrPropType + value,
+ // where FieldOrPropType is the concrete type (bool, int32, string, etc.),
+ // NOT TaggedObject (0x51). The object(...) wrapper is used to explicitly
+ // box a value but does not change the element's concrete type in the encoding.
+ // Unwrap any object(...) wrappers to get the actual typed inner element.
+ CILParser.SerInitContext actualItem = item;
+ while (actualItem.serInit() is { } inner)
+ {
+ actualItem = inner;
+ }
+ WriteCustomAttributeFieldOrPropType(objSeqBlob, actualItem);
+ objSeqBlob.LinkSuffix(VisitSerInit(actualItem).Value);
}
return new(objSeqBlob);
}
@@ -5291,7 +5731,7 @@ public GrammarResult.FormattedBlob VisitSerializTypeElement(CILParser.SerializTy
blob.WriteByte((byte)SerializationTypeCode.Enum);
if (context.SQSTRING() is ITerminalNode sqString)
{
- blob.WriteSerializedString(sqString.GetText());
+ blob.WriteSerializedString(StringHelpers.ParseQuotedString(sqString.GetText()));
}
else
{
@@ -5308,46 +5748,79 @@ public GrammarResult.FormattedBlob VisitSerInit(CILParser.SerInitContext context
{
if (context.fieldSerInit() is CILParser.FieldSerInitContext fieldSerInit)
{
- return VisitFieldSerInit(fieldSerInit);
+ if (fieldSerInit.bytes() is not null)
+ {
+ ReportError(
+ DiagnosticIds.InvalidMetadataToken,
+ "bytearray is not a valid structured custom attribute value",
+ context);
+ var invalidValue = new BlobBuilder();
+ invalidValue.WriteSerializedString(null);
+ return new(invalidValue);
+ }
+
+ ImmutableArray encodedValue = VisitFieldSerInit(fieldSerInit).Value.ToImmutableArray();
+ var value = new BlobBuilder(Math.Max(0, encodedValue.Length - 1));
+ if (encodedValue.Length > 1)
+ {
+ value.WriteBytes(encodedValue.AsSpan().Slice(1).ToArray());
+ }
+ return new(value);
}
if (context.serInit() is CILParser.SerInitContext serInit)
{
Debug.Assert(context.OBJECT() is not null);
- BlobBuilder taggedObjectBlob = new(1);
- taggedObjectBlob.WriteByte((byte)SerializationTypeCode.TaggedObject);
+ BlobBuilder taggedObjectBlob = new();
+ WriteCustomAttributeFieldOrPropType(taggedObjectBlob, serInit);
taggedObjectBlob.LinkSuffix(VisitSerInit(serInit).Value);
return new(taggedObjectBlob);
}
if (context.int32() is not CILParser.Int32Context arrLength)
{
- // The only cases where there is no int32 node is when the value is a string or type.
BlobBuilder blob = new();
- blob.WriteByte((byte)GetTypeCodeForToken(((ITerminalNode)context.GetChild(0)).Symbol.Type));
if (context.className() is CILParser.ClassNameContext className)
{
blob.WriteSerializedString(VisitClassName(className).Value is EntityRegistry.IHasReflectionNotation reflection ? reflection.ReflectionNotation : string.Empty);
}
else
{
- blob.WriteSerializedString(context.SQSTRING()?.Symbol.Text);
+ blob.WriteSerializedString(
+ context.SQSTRING() is { } stringNode
+ ? StringHelpers.ParseQuotedString(stringNode.Symbol.Text)
+ : null);
}
return new(blob);
}
- int tokenType = ((ITerminalNode)context.GetChild(0)).Symbol.Type;
-
- // 1 byte for ELEMENT_TYPE_SZARRAY, 1 byte for the array element type, 4 bytes for the length.
- BlobBuilder arrayHeader = new(6);
- arrayHeader.WriteByte((byte)SerializationTypeCode.SZArray);
- arrayHeader.WriteByte((byte)GetTypeCodeForToken(tokenType));
+ BlobBuilder arrayHeader = new(sizeof(int));
arrayHeader.WriteInt32(VisitInt32(arrLength).Value);
var sequenceResult = (GrammarResult.FormattedBlob)Visit(context.GetRuleContext(1));
arrayHeader.LinkSuffix(sequenceResult.Value);
return new(arrayHeader);
}
+ private static void WriteCustomAttributeFieldOrPropType(
+ BlobBuilder builder,
+ CILParser.SerInitContext context)
+ {
+ int tokenType = context.fieldSerInit() is { } fieldSerInit
+ ? ((ITerminalNode)fieldSerInit.GetChild(0)).Symbol.Type
+ : ((ITerminalNode)context.GetChild(0)).Symbol.Type;
+ if (context.fieldSerInit()?.bytes() is not null)
+ {
+ builder.WriteByte((byte)SerializationTypeCode.String);
+ return;
+ }
+ if (context.int32() is not null)
+ {
+ builder.WriteByte((byte)SerializationTypeCode.SZArray);
+ }
+
+ builder.WriteByte((byte)GetTypeCodeForToken(tokenType));
+ }
+
private static SerializationTypeCode GetTypeCodeForToken(int tokenType)
{
return tokenType switch
@@ -5495,18 +5968,18 @@ public static GrammarResult.Literal VisitSlashedName(CILParser.Slashed
public static GrammarResult.FormattedBlob VisitSqstringSeq(CILParser.SqstringSeqContext context)
{
var strings = ImmutableArray.CreateBuilder(context.ChildCount);
- foreach (var child in context.children)
+ foreach (var child in context.children ?? [])
{
string? str = null;
if (child is ITerminalNode { Symbol: { Type: CILParser.SQSTRING, Text: string stringValue } })
{
- str = stringValue;
+ str = StringHelpers.ParseQuotedString(stringValue);
}
strings.Add(str);
}
- return new(strings.ToImmutable().SerializeSequence());
+ return new(strings.MoveToImmutable().SerializeSequence());
}
GrammarResult ICILVisitor.VisitStackreserve(CILParser.StackreserveContext context) => VisitStackreserve(context);
@@ -5914,7 +6387,12 @@ public GrammarResult VisitTypelist(CILParser.TypelistContext context)
GrammarResult ICILVisitor.VisitVariantType(CILParser.VariantTypeContext context) => VisitVariantType(context);
public GrammarResult.Literal VisitVariantType(CILParser.VariantTypeContext context)
{
- VarEnum variant = VisitVariantTypeElement(context.variantTypeElement()).Value;
+ if (context.variantTypeElement() is not CILParser.VariantTypeElementContext element)
+ {
+ return new(VarEnum.VT_EMPTY);
+ }
+
+ VarEnum variant = VisitVariantTypeElement(element).Value;
// The 0th child is the variant element type.
for (int i = 1; i < context.ChildCount; i++)
{
diff --git a/src/tools/ilasm/src/ILAssembler/MetadataExtensions.cs b/src/tools/ilasm/src/ILAssembler/MetadataExtensions.cs
index 7f030940cdabd4..d378a94be9c215 100644
--- a/src/tools/ilasm/src/ILAssembler/MetadataExtensions.cs
+++ b/src/tools/ilasm/src/ILAssembler/MetadataExtensions.cs
@@ -3,6 +3,7 @@
using System;
using System.Reflection;
+using System.Reflection.Metadata;
namespace ILAssembler;
@@ -29,4 +30,9 @@ internal static class MetadataExtensions
public static AssemblyFlags NoPlatform => (AssemblyFlags)0x70;
public static AssemblyFlags ArchitectureMask => (AssemblyFlags)0xF0;
}
+
+ extension(ILOpCode)
+ {
+ public static ILOpCode Unused => (ILOpCode)0xFE22;
+ }
}
diff --git a/src/tools/ilasm/src/ILAssembler/NameHelpers.cs b/src/tools/ilasm/src/ILAssembler/NameHelpers.cs
index ab235b16891848..8ad20f079d1ec7 100644
--- a/src/tools/ilasm/src/ILAssembler/NameHelpers.cs
+++ b/src/tools/ilasm/src/ILAssembler/NameHelpers.cs
@@ -10,6 +10,40 @@ namespace ILAssembler
{
internal static class NameHelpers
{
+ public static string GetPrivateScopeMetadataName(string name, bool isMethod)
+ {
+ const int TokenLength = 8;
+ const string PrivateScopeMarker = "$PST";
+ int markerIndex = name.Length - PrivateScopeMarker.Length - TokenLength;
+ if (markerIndex < 0)
+ {
+ return name;
+ }
+
+ ReadOnlySpan token = name.AsSpan(markerIndex + PrivateScopeMarker.Length);
+ if (!name.AsSpan(markerIndex, PrivateScopeMarker.Length).SequenceEqual(PrivateScopeMarker)
+ || !token.StartsWith(isMethod ? "06" : "04")
+ || !IsHexToken(token))
+ {
+ return name;
+ }
+
+ return name.Substring(0, markerIndex);
+
+ static bool IsHexToken(ReadOnlySpan token)
+ {
+ foreach (char c in token)
+ {
+ if (!char.IsAsciiHexDigit(c))
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
+ }
+
public static (string Namespace, string Name) SplitDottedNameToNamespaceAndName(string dottedName)
{
int lastDotIndex = dottedName.LastIndexOf('.');
diff --git a/src/tools/ilasm/src/ILAssembler/Options.cs b/src/tools/ilasm/src/ILAssembler/Options.cs
index 01a34bdeae5f66..28c94eb638979a 100644
--- a/src/tools/ilasm/src/ILAssembler/Options.cs
+++ b/src/tools/ilasm/src/ILAssembler/Options.cs
@@ -65,6 +65,11 @@ public sealed class Options
///
public Machine? Machine { get; set; }
+ ///
+ /// Produce a DLL image instead of an executable.
+ ///
+ public bool Dll { get; set; }
+
///
/// Create an AppContainer exe or dll.
///
diff --git a/src/tools/ilasm/src/ILAssembler/VTableExportPEBuilder.cs b/src/tools/ilasm/src/ILAssembler/VTableExportPEBuilder.cs
index b59c2c7f44eb37..3139e5aadb0e9a 100644
--- a/src/tools/ilasm/src/ILAssembler/VTableExportPEBuilder.cs
+++ b/src/tools/ilasm/src/ILAssembler/VTableExportPEBuilder.cs
@@ -190,16 +190,15 @@ protected override BlobBuilder SerializeSection(string name, SectionLocation loc
///
private void PatchCorHeaderVTableFixups(BlobBuilder textSection, int _)
{
- // The COR header is at offset SizeOfImportAddressTable in the text section
- // VTableFixups directory is at offset 52 within the COR header (after CodeManagerTable at 44)
+ // The COR header is at offset SizeOfImportAddressTable in the text section.
bool is32Bit = Header.Machine == Machine.I386 || Header.Machine == 0;
- int sizeOfImportAddressTable = (is32Bit || Header.Machine == 0) ? 8 : 0;
+ int sizeOfImportAddressTable = is32Bit ? 8 : 0;
// COR header offset in text section
int corHeaderOffset = sizeOfImportAddressTable;
- // VTableFixups directory entry is at offset 52 within COR header
- const int vtableFixupsOffset = 52;
+ // VTableFixups follows the 8-byte CodeManagerTable directory at offset 40.
+ const int vtableFixupsOffset = 48;
int patchOffset = corHeaderOffset + vtableFixupsOffset;
// Find the blob containing this offset and patch it
@@ -371,8 +370,18 @@ private BlobBuilder SerializeSDataSection(SectionLocation location)
_sdataRva = location.RelativeVirtualAddress;
- // Calculate sizes for VTableFixups directory
- int vtfDirSize = _vtableFixups.Length * 8; // 8 bytes per IMAGE_COR_VTABLEFIXUP entry
+ var vtableEntryBuilder =
+ ImmutableArray.CreateBuilder(_vtableFixups.Length);
+ foreach (VTableFixupInfo info in _vtableFixups)
+ {
+ vtableEntryBuilder.Add(new VTableFixupSupport.VTableFixupEntry(
+ info.SlotCount,
+ info.Flags,
+ info.DataLabel));
+ }
+ ImmutableArray vtableEntries =
+ vtableEntryBuilder.MoveToImmutable();
+ int vtfDirSize = VTableFixupSupport.CalculateVTableFixupsDirectorySize(vtableEntries);
// Calculate slot data size and build slot offset map
var slotOffsets = new Dictionary<(int EntryIndex, int SlotIndex), int>();
@@ -391,13 +400,27 @@ private BlobBuilder SerializeSDataSection(SectionLocation location)
slotDataOffset += vtf.SlotCount * slotSize;
}
- int slotDataEndOffset = slotDataOffset;
+ int slotDataEndOffset =
+ vtfDirSize +
+ VTableFixupSupport.CalculateVTableSlotDataSize(vtableEntries);
// Calculate export-related sizes
int exportStubsOffset = slotDataEndOffset;
int numExports = _exports.Length;
int exportStubSize = GetExportStubSize();
int exportStubsTotalSize = numExports * exportStubSize;
+ int baseOrdinal = int.MaxValue;
+ int maxOrdinal = 0;
+ foreach (ExportInfo export in _exports)
+ {
+ baseOrdinal = Math.Min(baseOrdinal, export.Ordinal);
+ maxOrdinal = Math.Max(maxOrdinal, export.Ordinal);
+ }
+ if (baseOrdinal == int.MaxValue)
+ {
+ baseOrdinal = 1;
+ }
+ int numFunctions = numExports > 0 ? maxOrdinal - baseOrdinal + 1 : 0;
// Export directory comes after export stubs
int exportDirOffset = Align(exportStubsOffset + exportStubsTotalSize, 4);
@@ -410,7 +433,7 @@ private BlobBuilder SerializeSDataSection(SectionLocation location)
// - Export names (null-terminated strings)
// - DLL name (null-terminated string)
int exportAddrTableOffset = exportDirOffset + 40;
- int exportNamePtrTableOffset = exportAddrTableOffset + numExports * 4;
+ int exportNamePtrTableOffset = exportAddrTableOffset + numFunctions * 4;
int exportOrdinalTableOffset = exportNamePtrTableOffset + numExports * 4;
// Calculate name table size
@@ -428,38 +451,26 @@ private BlobBuilder SerializeSDataSection(SectionLocation location)
// Store total size for COR header patching (only vtfixup directory, not stubs/exports)
_sdataSize = vtfDirSize;
- // Write VTableFixups directory (array of IMAGE_COR_VTABLEFIXUP structures)
+ var slotDataRvas = new int[_vtableFixups.Length];
int currentSlotDataOffset = vtfDirSize;
- foreach (var vtf in _vtableFixups)
+ for (int i = 0; i < _vtableFixups.Length; i++)
{
- int slotDataRva = location.RelativeVirtualAddress + currentSlotDataOffset;
- builder.WriteInt32(slotDataRva); // RVA to slot data
- builder.WriteUInt16((ushort)vtf.SlotCount); // Count
- builder.WriteUInt16(vtf.Flags); // Type/Flags
-
+ VTableFixupInfo vtf = _vtableFixups[i];
+ slotDataRvas[i] = location.RelativeVirtualAddress + currentSlotDataOffset;
bool is64Bit = (vtf.Flags & VTableFixupSupport.COR_VTABLE_64BIT) != 0;
int slotSize = is64Bit ? 8 : 4;
currentSlotDataOffset += vtf.SlotCount * slotSize;
}
- // Write slot data (method tokens that get patched by the runtime)
- foreach (var vtf in _vtableFixups)
- {
- bool is64Bit = (vtf.Flags & VTableFixupSupport.COR_VTABLE_64BIT) != 0;
-
- for (int i = 0; i < vtf.SlotCount; i++)
+ VTableFixupSupport.WriteVTableFixupsDirectory(builder, vtableEntries, slotDataRvas);
+ VTableFixupSupport.WriteVTableSlotData(
+ builder,
+ vtableEntries,
+ (entryIndex, slotIndex) =>
{
- int token = i < vtf.MethodTokens.Length ? vtf.MethodTokens[i] : 0;
- if (is64Bit)
- {
- builder.WriteInt64(token);
- }
- else
- {
- builder.WriteInt32(token);
- }
- }
- }
+ ImmutableArray tokens = _vtableFixups[entryIndex - 1].MethodTokens;
+ return slotIndex <= tokens.Length ? tokens[slotIndex - 1] : 0;
+ });
// Write export stubs if we have exports
if (numExports > 0)
@@ -491,46 +502,33 @@ private BlobBuilder SerializeSDataSection(SectionLocation location)
_exportDirectoryRva = location.RelativeVirtualAddress + builder.Count;
// Write IMAGE_EXPORT_DIRECTORY
- int baseOrdinal = int.MaxValue;
- int maxOrdinal = 0;
- foreach (var export in _exports)
- {
- if (export.Ordinal < baseOrdinal) baseOrdinal = export.Ordinal;
- if (export.Ordinal > maxOrdinal) maxOrdinal = export.Ordinal;
- }
- if (baseOrdinal == int.MaxValue) baseOrdinal = 1;
- int numFunctions = maxOrdinal - baseOrdinal + 1;
-
int exportDirStart = builder.Count;
builder.WriteUInt32(0); // Characteristics
builder.WriteUInt32(0); // TimeDateStamp (filled later or 0)
builder.WriteUInt16(0); // MajorVersion
builder.WriteUInt16(0); // MinorVersion
- builder.WriteInt32(location.RelativeVirtualAddress + exportDirStart + 40 +
- numExports * 4 + numExports * 4 + numExports * 2 + nameTableSize); // Name RVA (DLL name)
+ builder.WriteInt32(location.RelativeVirtualAddress + dllNameOffset); // Name RVA (DLL name)
builder.WriteInt32(baseOrdinal); // Base
- builder.WriteInt32(numExports); // NumberOfFunctions
+ builder.WriteInt32(numFunctions); // NumberOfFunctions
builder.WriteInt32(numExports); // NumberOfNames
builder.WriteInt32(location.RelativeVirtualAddress + exportDirStart + 40); // AddressOfFunctions
- builder.WriteInt32(location.RelativeVirtualAddress + exportDirStart + 40 + numExports * 4); // AddressOfNames
- builder.WriteInt32(location.RelativeVirtualAddress + exportDirStart + 40 + numExports * 4 * 2); // AddressOfNameOrdinals
+ builder.WriteInt32(location.RelativeVirtualAddress + exportDirStart + 40 + numFunctions * 4); // AddressOfNames
+ builder.WriteInt32(location.RelativeVirtualAddress + exportDirStart + 40 + numFunctions * 4 + numExports * 4); // AddressOfNameOrdinals
// Sort exports by name for binary search
var sortedExports = _exports.AsSpan().ToArray();
Array.Sort(sortedExports, (a, b) => string.CompareOrdinal(a.Name, b.Name));
- // Write Export Address Table (RVAs to stubs)
var exportsArray = _exports.AsSpan().ToArray();
- foreach (var export in sortedExports)
+ for (int ordinal = baseOrdinal; ordinal <= maxOrdinal; ordinal++)
{
- int stubIndex = Array.FindIndex(exportsArray, e => e.Ordinal == export.Ordinal);
- builder.WriteInt32(exportStubRvas[stubIndex]);
+ int stubIndex = Array.FindIndex(exportsArray, export => export.Ordinal == ordinal);
+ builder.WriteInt32(stubIndex >= 0 ? exportStubRvas[stubIndex] : 0);
}
// Write Export Name Pointer Table (RVAs to names)
- int nameOffset = location.RelativeVirtualAddress + exportDirStart + 40 +
- numExports * 4 + numExports * 4 + numExports * 2;
+ int nameOffset = location.RelativeVirtualAddress + exportNamesOffset;
foreach (var export in sortedExports)
{
builder.WriteInt32(nameOffset);
diff --git a/src/tools/ilasm/src/ILAssembler/gen/CIL.g4 b/src/tools/ilasm/src/ILAssembler/gen/CIL.g4
index d39f873852fe95..c36609d01cf657 100644
--- a/src/tools/ilasm/src/ILAssembler/gen/CIL.g4
+++ b/src/tools/ilasm/src/ILAssembler/gen/CIL.g4
@@ -41,7 +41,7 @@ VOID: 'void';
ENUM: 'enum';
CUSTOM: 'custom';
FIXED: 'fixed';
-SYSSTRING: 'systring';
+SYSSTRING: 'sysstring';
ARRAY: 'array';
VARIANT: 'variant';
CURRENCY: 'currency';
@@ -123,6 +123,7 @@ MRESOURCE: '.mresource';
// For example, "ldc.r8" must be recognized as INSTR_R token, not as DOTTEDNAME
INSTR_NONE:
'nop'
+ | 'unused'
| 'break'
| 'ldarg.0'
| 'ldarg.1'
@@ -409,7 +410,7 @@ id:
| INSTANCE
| SQSTRING;
dottedName: DOTTEDNAME | ((dottedNamePart '.')* dottedNamePart) | SQSTRING;
-dottedNamePart: ID | VALUE | INSTANCE;
+dottedNamePart: ID | VALUE | INSTANCE | SQSTRING | DOTTEDNAME | 'volatile';
compQstring: (QSTRING PLUS)* QSTRING;
@@ -696,6 +697,7 @@ instr:
| instr_string 'bytearray' '(' bytes ')'
| instr_sig callConv type sigArgs
| instr_tok ownerType /* ownerType ::= memberRef | typeSpec */
+ | instr_tok int32
| instr_switch '(' labels ')'
| instr_switch '()';
@@ -788,6 +790,10 @@ nativeTypeElement:
| marshalType=SAFEARRAY variantType ',' compQstring
| marshalType=INT
| marshalType=UINT
+ | 'unsigned' unsignedMarshalType=INT8
+ | 'unsigned' unsignedMarshalType=INT16
+ | 'unsigned' unsignedMarshalType=INT32_
+ | 'unsigned' unsignedMarshalType=INT64_
| 'nested' marshalType=STRUCT
| marshalType=BYVALSTR
| ANSI marshalType=BSTR
@@ -916,6 +922,7 @@ secDecl:
| PERMISSION secAction typeSpec '=' '{' customBlobDescr '}'
| PERMISSION secAction typeSpec
| PERMISSIONSET secAction '=' 'bytearray'? '(' bytes ')'
+ | PERMISSIONSET secAction 'bytearray' '(' bytes ')'
| PERMISSIONSET secAction compQstring
| PERMISSIONSET secAction '=' '{' secAttrSetBlob '}';
@@ -1380,7 +1387,7 @@ customAttrDecl:
/* Assembly References */
asmOrRefDecl:
- '.publicKey' '=' '(' bytes ')'
+ ('.publickey' | '.publicKey') '=' '(' bytes ')'
| '.ver' intOrWildcard ':' intOrWildcard ':' intOrWildcard ':' intOrWildcard
| '.locale' compQstring
| '.locale' '=' '(' bytes ')'
@@ -1438,4 +1445,3 @@ manifestResDecl:
| '.assembly' 'extern' dottedName
| customAttrDecl
| compControl;
-
diff --git a/src/tools/ilasm/src/ILAssembler/gen/CIL.interp b/src/tools/ilasm/src/ILAssembler/gen/CIL.interp
index a7f26338731609..efb796a93425a6 100644
--- a/src/tools/ilasm/src/ILAssembler/gen/CIL.interp
+++ b/src/tools/ilasm/src/ILAssembler/gen/CIL.interp
@@ -15,6 +15,7 @@ null
'aggressiveoptimization'
'async'
'extended'
+'volatile'
'{'
'}'
'.subsystem'
@@ -88,11 +89,11 @@ null
'>'
'/'
'algorithm'
+'unsigned'
'iidparam'
'pinned'
'modreq'
'modopt'
-'unsigned'
'true'
'false'
'request'
@@ -126,7 +127,6 @@ null
'privatescope'
'literal'
'notserialized'
-'volatile'
'.event'
'.addon'
'.removeon'
@@ -166,6 +166,7 @@ null
'handler'
'.data'
'tls'
+'.publickey'
'.publicKey'
'.ver'
'.locale'
@@ -203,7 +204,7 @@ null
'enum'
'custom'
'fixed'
-'systring'
+'sysstring'
'array'
'variant'
'currency'
@@ -478,6 +479,7 @@ null
null
null
null
+null
INT32
INT64
FLOAT64
@@ -801,4 +803,4 @@ manifestResDecl
atn:
-[4, 1, 304, 2890, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 377, 8, 1, 10, 1, 12, 1, 380, 9, 1, 1, 1, 1, 1, 3, 1, 384, 8, 1, 1, 2, 1, 2, 1, 3, 1, 3, 5, 3, 390, 8, 3, 10, 3, 12, 3, 393, 9, 3, 1, 3, 1, 3, 1, 4, 5, 4, 398, 8, 4, 10, 4, 12, 4, 401, 9, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 453, 8, 5, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 494, 8, 13, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 5, 15, 501, 8, 15, 10, 15, 12, 15, 504, 9, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 527, 8, 18, 1, 19, 1, 19, 3, 19, 531, 8, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 549, 8, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 576, 8, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 599, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 635, 8, 23, 1, 24, 1, 24, 1, 25, 1, 25, 3, 25, 641, 8, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 5, 27, 648, 8, 27, 10, 27, 12, 27, 651, 9, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 5, 28, 660, 8, 28, 10, 28, 12, 28, 663, 9, 28, 1, 29, 1, 29, 1, 30, 1, 30, 3, 30, 669, 8, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 680, 8, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 688, 8, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 5, 34, 709, 8, 34, 10, 34, 12, 34, 712, 9, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 5, 37, 725, 8, 37, 10, 37, 12, 37, 728, 9, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 772, 8, 38, 1, 39, 1, 39, 1, 39, 3, 39, 777, 8, 39, 1, 40, 1, 40, 1, 40, 3, 40, 782, 8, 40, 1, 41, 5, 41, 785, 8, 41, 10, 41, 12, 41, 788, 9, 41, 1, 42, 1, 42, 1, 42, 5, 42, 793, 8, 42, 10, 42, 12, 42, 796, 9, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 905, 8, 44, 1, 45, 1, 45, 5, 45, 909, 8, 45, 10, 45, 12, 45, 912, 9, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 5, 45, 925, 8, 45, 10, 45, 12, 45, 928, 9, 45, 1, 45, 1, 45, 1, 45, 3, 45, 933, 8, 45, 1, 46, 1, 46, 1, 47, 1, 47, 3, 47, 939, 8, 47, 1, 48, 1, 48, 1, 49, 5, 49, 944, 8, 49, 10, 49, 12, 49, 947, 9, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 53, 1, 53, 1, 54, 1, 54, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, 1, 57, 1, 58, 1, 58, 1, 59, 1, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1054, 8, 63, 1, 64, 1, 64, 1, 64, 3, 64, 1059, 8, 64, 1, 64, 1, 64, 5, 64, 1063, 8, 64, 10, 64, 12, 64, 1066, 9, 64, 1, 64, 1, 64, 3, 64, 1070, 8, 64, 3, 64, 1072, 8, 64, 1, 65, 1, 65, 1, 65, 1, 65, 5, 65, 1078, 8, 65, 10, 65, 12, 65, 1081, 9, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 5, 66, 1090, 8, 66, 10, 66, 12, 66, 1093, 9, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 5, 67, 1102, 8, 67, 10, 67, 12, 67, 1105, 9, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1111, 8, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 3, 68, 1118, 8, 68, 3, 68, 1120, 8, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 1147, 8, 69, 1, 70, 1, 70, 1, 70, 5, 70, 1152, 8, 70, 10, 70, 12, 70, 1155, 9, 70, 1, 70, 1, 70, 1, 71, 5, 71, 1160, 8, 71, 10, 71, 12, 71, 1163, 9, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1170, 8, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 3, 73, 1183, 8, 73, 1, 74, 1, 74, 1, 74, 5, 74, 1188, 8, 74, 10, 74, 12, 74, 1191, 9, 74, 3, 74, 1193, 8, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 3, 75, 1212, 8, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 3, 76, 1298, 8, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 3, 77, 1307, 8, 77, 1, 78, 1, 78, 1, 78, 5, 78, 1312, 8, 78, 10, 78, 12, 78, 1315, 9, 78, 3, 78, 1317, 8, 78, 1, 79, 1, 79, 1, 80, 1, 80, 5, 80, 1323, 8, 80, 10, 80, 12, 80, 1326, 9, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 3, 81, 1346, 8, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 3, 82, 1378, 8, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 3, 83, 1401, 8, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 3, 84, 1413, 8, 84, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 3, 86, 1422, 8, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 3, 87, 1447, 8, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 3, 87, 1464, 8, 87, 1, 88, 1, 88, 1, 88, 1, 88, 5, 88, 1470, 8, 88, 10, 88, 12, 88, 1473, 9, 88, 1, 88, 3, 88, 1476, 8, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 3, 89, 1491, 8, 89, 1, 90, 1, 90, 1, 90, 5, 90, 1496, 8, 90, 10, 90, 12, 90, 1499, 9, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 3, 93, 1543, 8, 93, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 3, 95, 1553, 8, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 3, 95, 1569, 8, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 3, 95, 1581, 8, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 3, 96, 1593, 8, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 3, 97, 1607, 8, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 3, 99, 1619, 8, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 3, 100, 1630, 8, 100, 1, 101, 1, 101, 1, 101, 5, 101, 1635, 8, 101, 10, 101, 12, 101, 1638, 9, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 3, 102, 1647, 8, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 3, 103, 1660, 8, 103, 1, 104, 5, 104, 1663, 8, 104, 10, 104, 12, 104, 1666, 9, 104, 1, 105, 1, 105, 3, 105, 1670, 8, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 5, 106, 1677, 8, 106, 10, 106, 12, 106, 1680, 9, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 3, 108, 1690, 8, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 5, 110, 1771, 8, 110, 10, 110, 12, 110, 1774, 9, 110, 1, 110, 1, 110, 1, 110, 1, 110, 5, 110, 1780, 8, 110, 10, 110, 12, 110, 1783, 9, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 5, 110, 1793, 8, 110, 10, 110, 12, 110, 1796, 9, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 5, 110, 1804, 8, 110, 10, 110, 12, 110, 1807, 9, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 3, 110, 1814, 8, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 5, 111, 1824, 8, 111, 10, 111, 12, 111, 1827, 9, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 3, 112, 1853, 8, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 3, 113, 1860, 8, 113, 1, 114, 1, 114, 1, 114, 3, 114, 1865, 8, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 3, 115, 1872, 8, 115, 1, 116, 1, 116, 5, 116, 1876, 8, 116, 10, 116, 12, 116, 1879, 9, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 5, 116, 1886, 8, 116, 10, 116, 12, 116, 1889, 9, 116, 1, 116, 3, 116, 1892, 8, 116, 1, 117, 1, 117, 1, 118, 5, 118, 1897, 8, 118, 10, 118, 12, 118, 1900, 9, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 3, 119, 1914, 8, 119, 1, 120, 1, 120, 5, 120, 1918, 8, 120, 10, 120, 12, 120, 1921, 9, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 122, 5, 122, 1932, 8, 122, 10, 122, 12, 122, 1935, 9, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 3, 123, 1947, 8, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 3, 124, 1955, 8, 124, 1, 125, 1, 125, 1, 125, 4, 125, 1960, 8, 125, 11, 125, 12, 125, 1961, 1, 125, 1, 125, 3, 125, 1966, 8, 125, 1, 126, 5, 126, 1969, 8, 126, 10, 126, 12, 126, 1972, 9, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 3, 127, 1987, 8, 127, 1, 128, 1, 128, 1, 128, 5, 128, 1992, 8, 128, 10, 128, 12, 128, 1995, 9, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 5, 128, 2005, 8, 128, 10, 128, 12, 128, 2008, 9, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 3, 129, 2033, 8, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 3, 130, 2040, 8, 130, 3, 130, 2042, 8, 130, 1, 130, 5, 130, 2045, 8, 130, 10, 130, 12, 130, 2048, 9, 130, 1, 130, 1, 130, 1, 130, 3, 130, 2053, 8, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 3, 131, 2082, 8, 131, 1, 132, 1, 132, 1, 132, 3, 132, 2087, 8, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 3, 133, 2110, 8, 133, 1, 134, 5, 134, 2113, 8, 134, 10, 134, 12, 134, 2116, 9, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 5, 135, 2177, 8, 135, 10, 135, 12, 135, 2180, 9, 135, 1, 135, 1, 135, 1, 135, 1, 135, 5, 135, 2186, 8, 135, 10, 135, 12, 135, 2189, 9, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 5, 135, 2199, 8, 135, 10, 135, 12, 135, 2202, 9, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 5, 135, 2210, 8, 135, 10, 135, 12, 135, 2213, 9, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 5, 135, 2221, 8, 135, 10, 135, 12, 135, 2224, 9, 135, 3, 135, 2226, 8, 135, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 3, 137, 2233, 8, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 140, 4, 140, 2243, 8, 140, 11, 140, 12, 140, 2244, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 3, 141, 2259, 8, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 3, 142, 2273, 8, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 3, 143, 2281, 8, 143, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 3, 147, 2301, 8, 147, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 3, 149, 2313, 8, 149, 1, 150, 1, 150, 1, 150, 3, 150, 2318, 8, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 4, 151, 2325, 8, 151, 11, 151, 12, 151, 2326, 3, 151, 2329, 8, 151, 1, 152, 1, 152, 1, 152, 5, 152, 2334, 8, 152, 10, 152, 12, 152, 2337, 9, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 3, 153, 2346, 8, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 3, 154, 2414, 8, 154, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 3, 155, 2491, 8, 155, 1, 156, 5, 156, 2494, 8, 156, 10, 156, 12, 156, 2497, 9, 156, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 3, 158, 2504, 8, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 3, 159, 2654, 8, 159, 1, 160, 1, 160, 5, 160, 2658, 8, 160, 10, 160, 12, 160, 2661, 9, 160, 1, 161, 1, 161, 5, 161, 2665, 8, 161, 10, 161, 12, 161, 2668, 9, 161, 1, 162, 5, 162, 2671, 8, 162, 10, 162, 12, 162, 2674, 9, 162, 1, 163, 5, 163, 2677, 8, 163, 10, 163, 12, 163, 2680, 9, 163, 1, 164, 5, 164, 2683, 8, 164, 10, 164, 12, 164, 2686, 9, 164, 1, 165, 5, 165, 2689, 8, 165, 10, 165, 12, 165, 2692, 9, 165, 1, 166, 5, 166, 2695, 8, 166, 10, 166, 12, 166, 2698, 9, 166, 1, 167, 5, 167, 2701, 8, 167, 10, 167, 12, 167, 2704, 9, 167, 1, 168, 5, 168, 2707, 8, 168, 10, 168, 12, 168, 2710, 9, 168, 1, 169, 1, 169, 1, 169, 1, 169, 3, 169, 2716, 8, 169, 1, 170, 5, 170, 2719, 8, 170, 10, 170, 12, 170, 2722, 9, 170, 1, 171, 1, 171, 1, 171, 3, 171, 2727, 8, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 3, 172, 2754, 8, 172, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 3, 173, 2768, 8, 173, 1, 174, 5, 174, 2771, 8, 174, 10, 174, 12, 174, 2774, 9, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 3, 175, 2790, 8, 175, 1, 176, 1, 176, 1, 176, 5, 176, 2795, 8, 176, 10, 176, 12, 176, 2798, 9, 176, 1, 176, 1, 176, 1, 177, 1, 177, 5, 177, 2804, 8, 177, 10, 177, 12, 177, 2807, 9, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 3, 178, 2826, 8, 178, 1, 179, 5, 179, 2829, 8, 179, 10, 179, 12, 179, 2832, 9, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 3, 180, 2847, 8, 180, 1, 181, 1, 181, 5, 181, 2851, 8, 181, 10, 181, 12, 181, 2854, 9, 181, 1, 181, 1, 181, 1, 181, 5, 181, 2859, 8, 181, 10, 181, 12, 181, 2862, 9, 181, 1, 181, 1, 181, 1, 181, 1, 181, 3, 181, 2868, 8, 181, 1, 182, 1, 182, 1, 183, 5, 183, 2873, 8, 183, 10, 183, 12, 183, 2876, 9, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 3, 184, 2888, 8, 184, 1, 184, 0, 1, 68, 185, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 276, 278, 280, 282, 284, 286, 288, 290, 292, 294, 296, 298, 300, 302, 304, 306, 308, 310, 312, 314, 316, 318, 320, 322, 324, 326, 328, 330, 332, 334, 336, 338, 340, 342, 344, 346, 348, 350, 352, 354, 356, 358, 360, 362, 364, 366, 368, 0, 15, 6, 0, 1, 15, 198, 198, 242, 242, 246, 246, 263, 263, 288, 288, 3, 0, 198, 198, 242, 242, 288, 288, 1, 0, 262, 263, 1, 0, 172, 173, 1, 0, 36, 37, 1, 0, 72, 73, 3, 0, 2, 2, 60, 60, 76, 82, 2, 0, 228, 228, 259, 260, 9, 0, 177, 177, 182, 194, 200, 200, 206, 207, 209, 214, 217, 218, 221, 221, 229, 241, 261, 261, 1, 0, 94, 95, 1, 0, 96, 110, 1, 0, 67, 68, 2, 0, 172, 172, 288, 289, 2, 0, 178, 178, 263, 263, 1, 0, 50, 51, 3301, 0, 370, 1, 0, 0, 0, 2, 383, 1, 0, 0, 0, 4, 385, 1, 0, 0, 0, 6, 391, 1, 0, 0, 0, 8, 399, 1, 0, 0, 0, 10, 452, 1, 0, 0, 0, 12, 454, 1, 0, 0, 0, 14, 457, 1, 0, 0, 0, 16, 460, 1, 0, 0, 0, 18, 464, 1, 0, 0, 0, 20, 467, 1, 0, 0, 0, 22, 470, 1, 0, 0, 0, 24, 477, 1, 0, 0, 0, 26, 493, 1, 0, 0, 0, 28, 495, 1, 0, 0, 0, 30, 497, 1, 0, 0, 0, 32, 507, 1, 0, 0, 0, 34, 509, 1, 0, 0, 0, 36, 526, 1, 0, 0, 0, 38, 530, 1, 0, 0, 0, 40, 548, 1, 0, 0, 0, 42, 575, 1, 0, 0, 0, 44, 598, 1, 0, 0, 0, 46, 634, 1, 0, 0, 0, 48, 636, 1, 0, 0, 0, 50, 640, 1, 0, 0, 0, 52, 642, 1, 0, 0, 0, 54, 649, 1, 0, 0, 0, 56, 661, 1, 0, 0, 0, 58, 664, 1, 0, 0, 0, 60, 666, 1, 0, 0, 0, 62, 679, 1, 0, 0, 0, 64, 687, 1, 0, 0, 0, 66, 689, 1, 0, 0, 0, 68, 697, 1, 0, 0, 0, 70, 713, 1, 0, 0, 0, 72, 719, 1, 0, 0, 0, 74, 722, 1, 0, 0, 0, 76, 771, 1, 0, 0, 0, 78, 776, 1, 0, 0, 0, 80, 781, 1, 0, 0, 0, 82, 786, 1, 0, 0, 0, 84, 794, 1, 0, 0, 0, 86, 799, 1, 0, 0, 0, 88, 904, 1, 0, 0, 0, 90, 932, 1, 0, 0, 0, 92, 934, 1, 0, 0, 0, 94, 938, 1, 0, 0, 0, 96, 940, 1, 0, 0, 0, 98, 945, 1, 0, 0, 0, 100, 948, 1, 0, 0, 0, 102, 950, 1, 0, 0, 0, 104, 952, 1, 0, 0, 0, 106, 954, 1, 0, 0, 0, 108, 956, 1, 0, 0, 0, 110, 958, 1, 0, 0, 0, 112, 960, 1, 0, 0, 0, 114, 962, 1, 0, 0, 0, 116, 964, 1, 0, 0, 0, 118, 966, 1, 0, 0, 0, 120, 968, 1, 0, 0, 0, 122, 970, 1, 0, 0, 0, 124, 972, 1, 0, 0, 0, 126, 1053, 1, 0, 0, 0, 128, 1071, 1, 0, 0, 0, 130, 1073, 1, 0, 0, 0, 132, 1085, 1, 0, 0, 0, 134, 1110, 1, 0, 0, 0, 136, 1119, 1, 0, 0, 0, 138, 1146, 1, 0, 0, 0, 140, 1153, 1, 0, 0, 0, 142, 1161, 1, 0, 0, 0, 144, 1169, 1, 0, 0, 0, 146, 1182, 1, 0, 0, 0, 148, 1192, 1, 0, 0, 0, 150, 1211, 1, 0, 0, 0, 152, 1297, 1, 0, 0, 0, 154, 1306, 1, 0, 0, 0, 156, 1316, 1, 0, 0, 0, 158, 1318, 1, 0, 0, 0, 160, 1320, 1, 0, 0, 0, 162, 1345, 1, 0, 0, 0, 164, 1377, 1, 0, 0, 0, 166, 1400, 1, 0, 0, 0, 168, 1412, 1, 0, 0, 0, 170, 1414, 1, 0, 0, 0, 172, 1417, 1, 0, 0, 0, 174, 1463, 1, 0, 0, 0, 176, 1475, 1, 0, 0, 0, 178, 1490, 1, 0, 0, 0, 180, 1497, 1, 0, 0, 0, 182, 1502, 1, 0, 0, 0, 184, 1506, 1, 0, 0, 0, 186, 1542, 1, 0, 0, 0, 188, 1544, 1, 0, 0, 0, 190, 1580, 1, 0, 0, 0, 192, 1592, 1, 0, 0, 0, 194, 1606, 1, 0, 0, 0, 196, 1608, 1, 0, 0, 0, 198, 1618, 1, 0, 0, 0, 200, 1629, 1, 0, 0, 0, 202, 1636, 1, 0, 0, 0, 204, 1646, 1, 0, 0, 0, 206, 1659, 1, 0, 0, 0, 208, 1664, 1, 0, 0, 0, 210, 1667, 1, 0, 0, 0, 212, 1678, 1, 0, 0, 0, 214, 1683, 1, 0, 0, 0, 216, 1689, 1, 0, 0, 0, 218, 1691, 1, 0, 0, 0, 220, 1813, 1, 0, 0, 0, 222, 1815, 1, 0, 0, 0, 224, 1852, 1, 0, 0, 0, 226, 1859, 1, 0, 0, 0, 228, 1864, 1, 0, 0, 0, 230, 1871, 1, 0, 0, 0, 232, 1891, 1, 0, 0, 0, 234, 1893, 1, 0, 0, 0, 236, 1898, 1, 0, 0, 0, 238, 1913, 1, 0, 0, 0, 240, 1915, 1, 0, 0, 0, 242, 1928, 1, 0, 0, 0, 244, 1933, 1, 0, 0, 0, 246, 1946, 1, 0, 0, 0, 248, 1954, 1, 0, 0, 0, 250, 1965, 1, 0, 0, 0, 252, 1970, 1, 0, 0, 0, 254, 1986, 1, 0, 0, 0, 256, 1988, 1, 0, 0, 0, 258, 2032, 1, 0, 0, 0, 260, 2052, 1, 0, 0, 0, 262, 2081, 1, 0, 0, 0, 264, 2086, 1, 0, 0, 0, 266, 2109, 1, 0, 0, 0, 268, 2114, 1, 0, 0, 0, 270, 2225, 1, 0, 0, 0, 272, 2227, 1, 0, 0, 0, 274, 2232, 1, 0, 0, 0, 276, 2234, 1, 0, 0, 0, 278, 2238, 1, 0, 0, 0, 280, 2242, 1, 0, 0, 0, 282, 2258, 1, 0, 0, 0, 284, 2272, 1, 0, 0, 0, 286, 2280, 1, 0, 0, 0, 288, 2282, 1, 0, 0, 0, 290, 2285, 1, 0, 0, 0, 292, 2287, 1, 0, 0, 0, 294, 2300, 1, 0, 0, 0, 296, 2302, 1, 0, 0, 0, 298, 2312, 1, 0, 0, 0, 300, 2317, 1, 0, 0, 0, 302, 2328, 1, 0, 0, 0, 304, 2335, 1, 0, 0, 0, 306, 2345, 1, 0, 0, 0, 308, 2413, 1, 0, 0, 0, 310, 2490, 1, 0, 0, 0, 312, 2495, 1, 0, 0, 0, 314, 2498, 1, 0, 0, 0, 316, 2503, 1, 0, 0, 0, 318, 2653, 1, 0, 0, 0, 320, 2659, 1, 0, 0, 0, 322, 2666, 1, 0, 0, 0, 324, 2672, 1, 0, 0, 0, 326, 2678, 1, 0, 0, 0, 328, 2684, 1, 0, 0, 0, 330, 2690, 1, 0, 0, 0, 332, 2696, 1, 0, 0, 0, 334, 2702, 1, 0, 0, 0, 336, 2708, 1, 0, 0, 0, 338, 2715, 1, 0, 0, 0, 340, 2720, 1, 0, 0, 0, 342, 2726, 1, 0, 0, 0, 344, 2753, 1, 0, 0, 0, 346, 2767, 1, 0, 0, 0, 348, 2772, 1, 0, 0, 0, 350, 2789, 1, 0, 0, 0, 352, 2791, 1, 0, 0, 0, 354, 2801, 1, 0, 0, 0, 356, 2825, 1, 0, 0, 0, 358, 2830, 1, 0, 0, 0, 360, 2846, 1, 0, 0, 0, 362, 2867, 1, 0, 0, 0, 364, 2869, 1, 0, 0, 0, 366, 2874, 1, 0, 0, 0, 368, 2887, 1, 0, 0, 0, 370, 371, 7, 0, 0, 0, 371, 1, 1, 0, 0, 0, 372, 384, 5, 287, 0, 0, 373, 374, 3, 4, 2, 0, 374, 375, 5, 264, 0, 0, 375, 377, 1, 0, 0, 0, 376, 373, 1, 0, 0, 0, 377, 380, 1, 0, 0, 0, 378, 376, 1, 0, 0, 0, 378, 379, 1, 0, 0, 0, 379, 381, 1, 0, 0, 0, 380, 378, 1, 0, 0, 0, 381, 384, 3, 4, 2, 0, 382, 384, 5, 263, 0, 0, 383, 372, 1, 0, 0, 0, 383, 378, 1, 0, 0, 0, 383, 382, 1, 0, 0, 0, 384, 3, 1, 0, 0, 0, 385, 386, 7, 1, 0, 0, 386, 5, 1, 0, 0, 0, 387, 388, 5, 262, 0, 0, 388, 390, 5, 265, 0, 0, 389, 387, 1, 0, 0, 0, 390, 393, 1, 0, 0, 0, 391, 389, 1, 0, 0, 0, 391, 392, 1, 0, 0, 0, 392, 394, 1, 0, 0, 0, 393, 391, 1, 0, 0, 0, 394, 395, 5, 262, 0, 0, 395, 7, 1, 0, 0, 0, 396, 398, 3, 10, 5, 0, 397, 396, 1, 0, 0, 0, 398, 401, 1, 0, 0, 0, 399, 397, 1, 0, 0, 0, 399, 400, 1, 0, 0, 0, 400, 9, 1, 0, 0, 0, 401, 399, 1, 0, 0, 0, 402, 403, 3, 74, 37, 0, 403, 404, 5, 16, 0, 0, 404, 405, 3, 82, 41, 0, 405, 406, 5, 17, 0, 0, 406, 453, 1, 0, 0, 0, 407, 408, 3, 72, 36, 0, 408, 409, 5, 16, 0, 0, 409, 410, 3, 8, 4, 0, 410, 411, 5, 17, 0, 0, 411, 453, 1, 0, 0, 0, 412, 413, 3, 256, 128, 0, 413, 414, 5, 16, 0, 0, 414, 415, 3, 268, 134, 0, 415, 416, 5, 17, 0, 0, 416, 453, 1, 0, 0, 0, 417, 453, 3, 222, 111, 0, 418, 453, 3, 296, 148, 0, 419, 453, 3, 70, 35, 0, 420, 453, 3, 66, 33, 0, 421, 453, 3, 88, 44, 0, 422, 453, 3, 90, 45, 0, 423, 453, 3, 22, 11, 0, 424, 425, 3, 346, 173, 0, 425, 426, 5, 16, 0, 0, 426, 427, 3, 348, 174, 0, 427, 428, 5, 17, 0, 0, 428, 453, 1, 0, 0, 0, 429, 430, 3, 352, 176, 0, 430, 431, 5, 16, 0, 0, 431, 432, 3, 358, 179, 0, 432, 433, 5, 17, 0, 0, 433, 453, 1, 0, 0, 0, 434, 435, 3, 362, 181, 0, 435, 436, 5, 16, 0, 0, 436, 437, 3, 366, 183, 0, 437, 438, 5, 17, 0, 0, 438, 453, 1, 0, 0, 0, 439, 453, 3, 64, 32, 0, 440, 453, 3, 174, 87, 0, 441, 453, 3, 342, 171, 0, 442, 453, 3, 12, 6, 0, 443, 453, 3, 14, 7, 0, 444, 453, 3, 16, 8, 0, 445, 453, 3, 18, 9, 0, 446, 453, 3, 20, 10, 0, 447, 453, 3, 26, 13, 0, 448, 453, 3, 42, 21, 0, 449, 453, 3, 40, 20, 0, 450, 453, 3, 30, 15, 0, 451, 453, 3, 24, 12, 0, 452, 402, 1, 0, 0, 0, 452, 407, 1, 0, 0, 0, 452, 412, 1, 0, 0, 0, 452, 417, 1, 0, 0, 0, 452, 418, 1, 0, 0, 0, 452, 419, 1, 0, 0, 0, 452, 420, 1, 0, 0, 0, 452, 421, 1, 0, 0, 0, 452, 422, 1, 0, 0, 0, 452, 423, 1, 0, 0, 0, 452, 424, 1, 0, 0, 0, 452, 429, 1, 0, 0, 0, 452, 434, 1, 0, 0, 0, 452, 439, 1, 0, 0, 0, 452, 440, 1, 0, 0, 0, 452, 441, 1, 0, 0, 0, 452, 442, 1, 0, 0, 0, 452, 443, 1, 0, 0, 0, 452, 444, 1, 0, 0, 0, 452, 445, 1, 0, 0, 0, 452, 446, 1, 0, 0, 0, 452, 447, 1, 0, 0, 0, 452, 448, 1, 0, 0, 0, 452, 449, 1, 0, 0, 0, 452, 450, 1, 0, 0, 0, 452, 451, 1, 0, 0, 0, 453, 11, 1, 0, 0, 0, 454, 455, 5, 18, 0, 0, 455, 456, 3, 32, 16, 0, 456, 13, 1, 0, 0, 0, 457, 458, 5, 19, 0, 0, 458, 459, 3, 32, 16, 0, 459, 15, 1, 0, 0, 0, 460, 461, 5, 20, 0, 0, 461, 462, 5, 21, 0, 0, 462, 463, 3, 32, 16, 0, 463, 17, 1, 0, 0, 0, 464, 465, 5, 22, 0, 0, 465, 466, 3, 34, 17, 0, 466, 19, 1, 0, 0, 0, 467, 468, 5, 23, 0, 0, 468, 469, 3, 34, 17, 0, 469, 21, 1, 0, 0, 0, 470, 471, 5, 24, 0, 0, 471, 472, 3, 98, 49, 0, 472, 473, 3, 2, 1, 0, 473, 474, 5, 16, 0, 0, 474, 475, 3, 142, 71, 0, 475, 476, 5, 17, 0, 0, 476, 23, 1, 0, 0, 0, 477, 478, 5, 25, 0, 0, 478, 25, 1, 0, 0, 0, 479, 480, 5, 26, 0, 0, 480, 494, 3, 28, 14, 0, 481, 482, 5, 26, 0, 0, 482, 483, 3, 28, 14, 0, 483, 484, 5, 27, 0, 0, 484, 485, 3, 28, 14, 0, 485, 494, 1, 0, 0, 0, 486, 487, 5, 26, 0, 0, 487, 488, 3, 28, 14, 0, 488, 489, 5, 27, 0, 0, 489, 490, 3, 28, 14, 0, 490, 491, 5, 27, 0, 0, 491, 492, 3, 28, 14, 0, 492, 494, 1, 0, 0, 0, 493, 479, 1, 0, 0, 0, 493, 481, 1, 0, 0, 0, 493, 486, 1, 0, 0, 0, 494, 27, 1, 0, 0, 0, 495, 496, 7, 2, 0, 0, 496, 29, 1, 0, 0, 0, 497, 498, 5, 28, 0, 0, 498, 502, 5, 16, 0, 0, 499, 501, 3, 138, 69, 0, 500, 499, 1, 0, 0, 0, 501, 504, 1, 0, 0, 0, 502, 500, 1, 0, 0, 0, 502, 503, 1, 0, 0, 0, 503, 505, 1, 0, 0, 0, 504, 502, 1, 0, 0, 0, 505, 506, 5, 17, 0, 0, 506, 31, 1, 0, 0, 0, 507, 508, 5, 172, 0, 0, 508, 33, 1, 0, 0, 0, 509, 510, 7, 3, 0, 0, 510, 35, 1, 0, 0, 0, 511, 527, 5, 174, 0, 0, 512, 513, 3, 32, 16, 0, 513, 514, 5, 264, 0, 0, 514, 527, 1, 0, 0, 0, 515, 527, 3, 32, 16, 0, 516, 517, 5, 187, 0, 0, 517, 518, 5, 29, 0, 0, 518, 519, 3, 32, 16, 0, 519, 520, 5, 30, 0, 0, 520, 527, 1, 0, 0, 0, 521, 522, 5, 188, 0, 0, 522, 523, 5, 29, 0, 0, 523, 524, 3, 34, 17, 0, 524, 525, 5, 30, 0, 0, 525, 527, 1, 0, 0, 0, 526, 511, 1, 0, 0, 0, 526, 512, 1, 0, 0, 0, 526, 515, 1, 0, 0, 0, 526, 516, 1, 0, 0, 0, 526, 521, 1, 0, 0, 0, 527, 37, 1, 0, 0, 0, 528, 531, 3, 32, 16, 0, 529, 531, 5, 261, 0, 0, 530, 528, 1, 0, 0, 0, 530, 529, 1, 0, 0, 0, 531, 39, 1, 0, 0, 0, 532, 533, 5, 266, 0, 0, 533, 549, 5, 288, 0, 0, 534, 535, 5, 266, 0, 0, 535, 536, 5, 288, 0, 0, 536, 549, 5, 262, 0, 0, 537, 538, 5, 267, 0, 0, 538, 549, 5, 288, 0, 0, 539, 540, 5, 268, 0, 0, 540, 549, 5, 288, 0, 0, 541, 542, 5, 269, 0, 0, 542, 549, 5, 288, 0, 0, 543, 549, 5, 270, 0, 0, 544, 549, 5, 271, 0, 0, 545, 546, 5, 272, 0, 0, 546, 549, 5, 262, 0, 0, 547, 549, 5, 31, 0, 0, 548, 532, 1, 0, 0, 0, 548, 534, 1, 0, 0, 0, 548, 537, 1, 0, 0, 0, 548, 539, 1, 0, 0, 0, 548, 541, 1, 0, 0, 0, 548, 543, 1, 0, 0, 0, 548, 544, 1, 0, 0, 0, 548, 545, 1, 0, 0, 0, 548, 547, 1, 0, 0, 0, 549, 41, 1, 0, 0, 0, 550, 551, 5, 32, 0, 0, 551, 552, 3, 160, 80, 0, 552, 553, 5, 33, 0, 0, 553, 554, 3, 2, 1, 0, 554, 576, 1, 0, 0, 0, 555, 556, 5, 32, 0, 0, 556, 557, 3, 138, 69, 0, 557, 558, 5, 33, 0, 0, 558, 559, 3, 2, 1, 0, 559, 576, 1, 0, 0, 0, 560, 561, 5, 32, 0, 0, 561, 562, 3, 198, 99, 0, 562, 563, 5, 33, 0, 0, 563, 564, 3, 2, 1, 0, 564, 576, 1, 0, 0, 0, 565, 566, 5, 32, 0, 0, 566, 567, 3, 44, 22, 0, 567, 568, 5, 33, 0, 0, 568, 569, 3, 2, 1, 0, 569, 576, 1, 0, 0, 0, 570, 571, 5, 32, 0, 0, 571, 572, 3, 46, 23, 0, 572, 573, 5, 33, 0, 0, 573, 574, 3, 2, 1, 0, 574, 576, 1, 0, 0, 0, 575, 550, 1, 0, 0, 0, 575, 555, 1, 0, 0, 0, 575, 560, 1, 0, 0, 0, 575, 565, 1, 0, 0, 0, 575, 570, 1, 0, 0, 0, 576, 43, 1, 0, 0, 0, 577, 578, 5, 34, 0, 0, 578, 599, 3, 48, 24, 0, 579, 580, 5, 34, 0, 0, 580, 581, 3, 48, 24, 0, 581, 582, 5, 35, 0, 0, 582, 583, 3, 6, 3, 0, 583, 599, 1, 0, 0, 0, 584, 585, 5, 34, 0, 0, 585, 586, 3, 48, 24, 0, 586, 587, 5, 35, 0, 0, 587, 588, 5, 16, 0, 0, 588, 589, 3, 52, 26, 0, 589, 590, 5, 17, 0, 0, 590, 599, 1, 0, 0, 0, 591, 592, 5, 34, 0, 0, 592, 593, 3, 48, 24, 0, 593, 594, 5, 35, 0, 0, 594, 595, 5, 29, 0, 0, 595, 596, 3, 312, 156, 0, 596, 597, 5, 30, 0, 0, 597, 599, 1, 0, 0, 0, 598, 577, 1, 0, 0, 0, 598, 579, 1, 0, 0, 0, 598, 584, 1, 0, 0, 0, 598, 591, 1, 0, 0, 0, 599, 45, 1, 0, 0, 0, 600, 601, 5, 34, 0, 0, 601, 602, 5, 29, 0, 0, 602, 603, 3, 50, 25, 0, 603, 604, 5, 30, 0, 0, 604, 605, 3, 48, 24, 0, 605, 635, 1, 0, 0, 0, 606, 607, 5, 34, 0, 0, 607, 608, 5, 29, 0, 0, 608, 609, 3, 50, 25, 0, 609, 610, 5, 30, 0, 0, 610, 611, 3, 48, 24, 0, 611, 612, 5, 35, 0, 0, 612, 613, 3, 6, 3, 0, 613, 635, 1, 0, 0, 0, 614, 615, 5, 34, 0, 0, 615, 616, 5, 29, 0, 0, 616, 617, 3, 50, 25, 0, 617, 618, 5, 30, 0, 0, 618, 619, 3, 48, 24, 0, 619, 620, 5, 35, 0, 0, 620, 621, 5, 16, 0, 0, 621, 622, 3, 52, 26, 0, 622, 623, 5, 17, 0, 0, 623, 635, 1, 0, 0, 0, 624, 625, 5, 34, 0, 0, 625, 626, 5, 29, 0, 0, 626, 627, 3, 50, 25, 0, 627, 628, 5, 30, 0, 0, 628, 629, 3, 48, 24, 0, 629, 630, 5, 35, 0, 0, 630, 631, 5, 29, 0, 0, 631, 632, 3, 312, 156, 0, 632, 633, 5, 30, 0, 0, 633, 635, 1, 0, 0, 0, 634, 600, 1, 0, 0, 0, 634, 606, 1, 0, 0, 0, 634, 614, 1, 0, 0, 0, 634, 624, 1, 0, 0, 0, 635, 47, 1, 0, 0, 0, 636, 637, 3, 190, 95, 0, 637, 49, 1, 0, 0, 0, 638, 641, 3, 146, 73, 0, 639, 641, 3, 198, 99, 0, 640, 638, 1, 0, 0, 0, 640, 639, 1, 0, 0, 0, 641, 51, 1, 0, 0, 0, 642, 643, 3, 54, 27, 0, 643, 644, 3, 56, 28, 0, 644, 53, 1, 0, 0, 0, 645, 648, 3, 318, 159, 0, 646, 648, 3, 40, 20, 0, 647, 645, 1, 0, 0, 0, 647, 646, 1, 0, 0, 0, 648, 651, 1, 0, 0, 0, 649, 647, 1, 0, 0, 0, 649, 650, 1, 0, 0, 0, 650, 55, 1, 0, 0, 0, 651, 649, 1, 0, 0, 0, 652, 653, 3, 58, 29, 0, 653, 654, 3, 60, 30, 0, 654, 655, 3, 2, 1, 0, 655, 656, 5, 35, 0, 0, 656, 657, 3, 318, 159, 0, 657, 660, 1, 0, 0, 0, 658, 660, 3, 40, 20, 0, 659, 652, 1, 0, 0, 0, 659, 658, 1, 0, 0, 0, 660, 663, 1, 0, 0, 0, 661, 659, 1, 0, 0, 0, 661, 662, 1, 0, 0, 0, 662, 57, 1, 0, 0, 0, 663, 661, 1, 0, 0, 0, 664, 665, 7, 4, 0, 0, 665, 59, 1, 0, 0, 0, 666, 668, 3, 62, 31, 0, 667, 669, 5, 260, 0, 0, 668, 667, 1, 0, 0, 0, 668, 669, 1, 0, 0, 0, 669, 61, 1, 0, 0, 0, 670, 680, 3, 166, 83, 0, 671, 680, 3, 2, 1, 0, 672, 680, 5, 195, 0, 0, 673, 680, 5, 196, 0, 0, 674, 675, 5, 201, 0, 0, 675, 676, 5, 38, 0, 0, 676, 680, 5, 263, 0, 0, 677, 678, 5, 201, 0, 0, 678, 680, 3, 138, 69, 0, 679, 670, 1, 0, 0, 0, 679, 671, 1, 0, 0, 0, 679, 672, 1, 0, 0, 0, 679, 673, 1, 0, 0, 0, 679, 674, 1, 0, 0, 0, 679, 677, 1, 0, 0, 0, 680, 63, 1, 0, 0, 0, 681, 682, 5, 197, 0, 0, 682, 683, 5, 39, 0, 0, 683, 688, 3, 2, 1, 0, 684, 685, 5, 197, 0, 0, 685, 688, 3, 2, 1, 0, 686, 688, 5, 197, 0, 0, 687, 681, 1, 0, 0, 0, 687, 684, 1, 0, 0, 0, 687, 686, 1, 0, 0, 0, 688, 65, 1, 0, 0, 0, 689, 690, 5, 40, 0, 0, 690, 691, 5, 41, 0, 0, 691, 692, 3, 32, 16, 0, 692, 693, 5, 42, 0, 0, 693, 694, 3, 68, 34, 0, 694, 695, 5, 43, 0, 0, 695, 696, 3, 0, 0, 0, 696, 67, 1, 0, 0, 0, 697, 710, 6, 34, -1, 0, 698, 699, 10, 5, 0, 0, 699, 709, 5, 185, 0, 0, 700, 701, 10, 4, 0, 0, 701, 709, 5, 186, 0, 0, 702, 703, 10, 3, 0, 0, 703, 709, 5, 44, 0, 0, 704, 705, 10, 2, 0, 0, 705, 709, 5, 45, 0, 0, 706, 707, 10, 1, 0, 0, 707, 709, 5, 46, 0, 0, 708, 698, 1, 0, 0, 0, 708, 700, 1, 0, 0, 0, 708, 702, 1, 0, 0, 0, 708, 704, 1, 0, 0, 0, 708, 706, 1, 0, 0, 0, 709, 712, 1, 0, 0, 0, 710, 708, 1, 0, 0, 0, 710, 711, 1, 0, 0, 0, 711, 69, 1, 0, 0, 0, 712, 710, 1, 0, 0, 0, 713, 714, 5, 47, 0, 0, 714, 715, 5, 35, 0, 0, 715, 716, 5, 29, 0, 0, 716, 717, 3, 312, 156, 0, 717, 718, 5, 30, 0, 0, 718, 71, 1, 0, 0, 0, 719, 720, 5, 48, 0, 0, 720, 721, 3, 2, 1, 0, 721, 73, 1, 0, 0, 0, 722, 726, 5, 49, 0, 0, 723, 725, 3, 76, 38, 0, 724, 723, 1, 0, 0, 0, 725, 728, 1, 0, 0, 0, 726, 724, 1, 0, 0, 0, 726, 727, 1, 0, 0, 0, 727, 729, 1, 0, 0, 0, 728, 726, 1, 0, 0, 0, 729, 730, 3, 2, 1, 0, 730, 731, 3, 204, 102, 0, 731, 732, 3, 78, 39, 0, 732, 733, 3, 80, 40, 0, 733, 75, 1, 0, 0, 0, 734, 772, 5, 50, 0, 0, 735, 772, 5, 51, 0, 0, 736, 772, 5, 198, 0, 0, 737, 772, 5, 201, 0, 0, 738, 772, 5, 220, 0, 0, 739, 772, 5, 52, 0, 0, 740, 772, 5, 53, 0, 0, 741, 772, 5, 54, 0, 0, 742, 772, 5, 55, 0, 0, 743, 772, 5, 243, 0, 0, 744, 772, 5, 15, 0, 0, 745, 772, 5, 223, 0, 0, 746, 772, 5, 56, 0, 0, 747, 772, 5, 57, 0, 0, 748, 772, 5, 58, 0, 0, 749, 772, 5, 59, 0, 0, 750, 772, 5, 60, 0, 0, 751, 752, 5, 61, 0, 0, 752, 772, 5, 50, 0, 0, 753, 754, 5, 61, 0, 0, 754, 772, 5, 51, 0, 0, 755, 756, 5, 61, 0, 0, 756, 772, 5, 62, 0, 0, 757, 758, 5, 61, 0, 0, 758, 772, 5, 63, 0, 0, 759, 760, 5, 61, 0, 0, 760, 772, 5, 64, 0, 0, 761, 762, 5, 61, 0, 0, 762, 772, 5, 65, 0, 0, 763, 772, 5, 66, 0, 0, 764, 772, 5, 67, 0, 0, 765, 772, 5, 68, 0, 0, 766, 767, 5, 69, 0, 0, 767, 768, 5, 29, 0, 0, 768, 769, 3, 32, 16, 0, 769, 770, 5, 30, 0, 0, 770, 772, 1, 0, 0, 0, 771, 734, 1, 0, 0, 0, 771, 735, 1, 0, 0, 0, 771, 736, 1, 0, 0, 0, 771, 737, 1, 0, 0, 0, 771, 738, 1, 0, 0, 0, 771, 739, 1, 0, 0, 0, 771, 740, 1, 0, 0, 0, 771, 741, 1, 0, 0, 0, 771, 742, 1, 0, 0, 0, 771, 743, 1, 0, 0, 0, 771, 744, 1, 0, 0, 0, 771, 745, 1, 0, 0, 0, 771, 746, 1, 0, 0, 0, 771, 747, 1, 0, 0, 0, 771, 748, 1, 0, 0, 0, 771, 749, 1, 0, 0, 0, 771, 750, 1, 0, 0, 0, 771, 751, 1, 0, 0, 0, 771, 753, 1, 0, 0, 0, 771, 755, 1, 0, 0, 0, 771, 757, 1, 0, 0, 0, 771, 759, 1, 0, 0, 0, 771, 761, 1, 0, 0, 0, 771, 763, 1, 0, 0, 0, 771, 764, 1, 0, 0, 0, 771, 765, 1, 0, 0, 0, 771, 766, 1, 0, 0, 0, 772, 77, 1, 0, 0, 0, 773, 777, 1, 0, 0, 0, 774, 775, 5, 70, 0, 0, 775, 777, 3, 146, 73, 0, 776, 773, 1, 0, 0, 0, 776, 774, 1, 0, 0, 0, 777, 79, 1, 0, 0, 0, 778, 782, 1, 0, 0, 0, 779, 780, 5, 71, 0, 0, 780, 782, 3, 84, 42, 0, 781, 778, 1, 0, 0, 0, 781, 779, 1, 0, 0, 0, 782, 81, 1, 0, 0, 0, 783, 785, 3, 220, 110, 0, 784, 783, 1, 0, 0, 0, 785, 788, 1, 0, 0, 0, 786, 784, 1, 0, 0, 0, 786, 787, 1, 0, 0, 0, 787, 83, 1, 0, 0, 0, 788, 786, 1, 0, 0, 0, 789, 790, 3, 146, 73, 0, 790, 791, 5, 27, 0, 0, 791, 793, 1, 0, 0, 0, 792, 789, 1, 0, 0, 0, 793, 796, 1, 0, 0, 0, 794, 792, 1, 0, 0, 0, 794, 795, 1, 0, 0, 0, 795, 797, 1, 0, 0, 0, 796, 794, 1, 0, 0, 0, 797, 798, 3, 146, 73, 0, 798, 85, 1, 0, 0, 0, 799, 800, 7, 5, 0, 0, 800, 87, 1, 0, 0, 0, 801, 802, 3, 86, 43, 0, 802, 803, 3, 32, 16, 0, 803, 804, 5, 263, 0, 0, 804, 905, 1, 0, 0, 0, 805, 806, 3, 86, 43, 0, 806, 807, 3, 32, 16, 0, 807, 905, 1, 0, 0, 0, 808, 809, 3, 86, 43, 0, 809, 810, 3, 32, 16, 0, 810, 811, 5, 74, 0, 0, 811, 812, 3, 32, 16, 0, 812, 813, 5, 263, 0, 0, 813, 905, 1, 0, 0, 0, 814, 815, 3, 86, 43, 0, 815, 816, 3, 32, 16, 0, 816, 817, 5, 74, 0, 0, 817, 818, 3, 32, 16, 0, 818, 905, 1, 0, 0, 0, 819, 820, 3, 86, 43, 0, 820, 821, 3, 32, 16, 0, 821, 822, 5, 74, 0, 0, 822, 823, 3, 32, 16, 0, 823, 824, 5, 27, 0, 0, 824, 825, 3, 32, 16, 0, 825, 826, 5, 263, 0, 0, 826, 905, 1, 0, 0, 0, 827, 828, 3, 86, 43, 0, 828, 829, 3, 32, 16, 0, 829, 830, 5, 74, 0, 0, 830, 831, 3, 32, 16, 0, 831, 832, 5, 27, 0, 0, 832, 833, 3, 32, 16, 0, 833, 905, 1, 0, 0, 0, 834, 835, 3, 86, 43, 0, 835, 836, 3, 32, 16, 0, 836, 837, 5, 27, 0, 0, 837, 838, 3, 32, 16, 0, 838, 839, 5, 74, 0, 0, 839, 840, 3, 32, 16, 0, 840, 841, 5, 263, 0, 0, 841, 905, 1, 0, 0, 0, 842, 843, 3, 86, 43, 0, 843, 844, 3, 32, 16, 0, 844, 845, 5, 27, 0, 0, 845, 846, 3, 32, 16, 0, 846, 847, 5, 74, 0, 0, 847, 848, 3, 32, 16, 0, 848, 905, 1, 0, 0, 0, 849, 850, 3, 86, 43, 0, 850, 851, 3, 32, 16, 0, 851, 852, 5, 27, 0, 0, 852, 853, 3, 32, 16, 0, 853, 854, 5, 74, 0, 0, 854, 855, 3, 32, 16, 0, 855, 856, 5, 27, 0, 0, 856, 857, 3, 32, 16, 0, 857, 858, 5, 263, 0, 0, 858, 905, 1, 0, 0, 0, 859, 860, 3, 86, 43, 0, 860, 861, 3, 32, 16, 0, 861, 862, 5, 27, 0, 0, 862, 863, 3, 32, 16, 0, 863, 864, 5, 74, 0, 0, 864, 865, 3, 32, 16, 0, 865, 866, 5, 27, 0, 0, 866, 867, 3, 32, 16, 0, 867, 905, 1, 0, 0, 0, 868, 869, 3, 86, 43, 0, 869, 870, 3, 32, 16, 0, 870, 871, 5, 262, 0, 0, 871, 905, 1, 0, 0, 0, 872, 873, 3, 86, 43, 0, 873, 874, 3, 32, 16, 0, 874, 875, 5, 74, 0, 0, 875, 876, 3, 32, 16, 0, 876, 877, 5, 262, 0, 0, 877, 905, 1, 0, 0, 0, 878, 879, 3, 86, 43, 0, 879, 880, 3, 32, 16, 0, 880, 881, 5, 74, 0, 0, 881, 882, 3, 32, 16, 0, 882, 883, 5, 27, 0, 0, 883, 884, 3, 32, 16, 0, 884, 885, 5, 262, 0, 0, 885, 905, 1, 0, 0, 0, 886, 887, 3, 86, 43, 0, 887, 888, 3, 32, 16, 0, 888, 889, 5, 27, 0, 0, 889, 890, 3, 32, 16, 0, 890, 891, 5, 74, 0, 0, 891, 892, 3, 32, 16, 0, 892, 893, 5, 262, 0, 0, 893, 905, 1, 0, 0, 0, 894, 895, 3, 86, 43, 0, 895, 896, 3, 32, 16, 0, 896, 897, 5, 27, 0, 0, 897, 898, 3, 32, 16, 0, 898, 899, 5, 74, 0, 0, 899, 900, 3, 32, 16, 0, 900, 901, 5, 27, 0, 0, 901, 902, 3, 32, 16, 0, 902, 903, 5, 262, 0, 0, 903, 905, 1, 0, 0, 0, 904, 801, 1, 0, 0, 0, 904, 805, 1, 0, 0, 0, 904, 808, 1, 0, 0, 0, 904, 814, 1, 0, 0, 0, 904, 819, 1, 0, 0, 0, 904, 827, 1, 0, 0, 0, 904, 834, 1, 0, 0, 0, 904, 842, 1, 0, 0, 0, 904, 849, 1, 0, 0, 0, 904, 859, 1, 0, 0, 0, 904, 868, 1, 0, 0, 0, 904, 872, 1, 0, 0, 0, 904, 878, 1, 0, 0, 0, 904, 886, 1, 0, 0, 0, 904, 894, 1, 0, 0, 0, 905, 89, 1, 0, 0, 0, 906, 910, 5, 20, 0, 0, 907, 909, 3, 92, 46, 0, 908, 907, 1, 0, 0, 0, 909, 912, 1, 0, 0, 0, 910, 908, 1, 0, 0, 0, 910, 911, 1, 0, 0, 0, 911, 913, 1, 0, 0, 0, 912, 910, 1, 0, 0, 0, 913, 914, 3, 2, 1, 0, 914, 915, 3, 94, 47, 0, 915, 916, 5, 179, 0, 0, 916, 917, 5, 35, 0, 0, 917, 918, 5, 29, 0, 0, 918, 919, 3, 312, 156, 0, 919, 920, 5, 30, 0, 0, 920, 921, 3, 94, 47, 0, 921, 933, 1, 0, 0, 0, 922, 926, 5, 20, 0, 0, 923, 925, 3, 92, 46, 0, 924, 923, 1, 0, 0, 0, 925, 928, 1, 0, 0, 0, 926, 924, 1, 0, 0, 0, 926, 927, 1, 0, 0, 0, 927, 929, 1, 0, 0, 0, 928, 926, 1, 0, 0, 0, 929, 930, 3, 2, 1, 0, 930, 931, 3, 94, 47, 0, 931, 933, 1, 0, 0, 0, 932, 906, 1, 0, 0, 0, 932, 922, 1, 0, 0, 0, 933, 91, 1, 0, 0, 0, 934, 935, 5, 75, 0, 0, 935, 93, 1, 0, 0, 0, 936, 939, 1, 0, 0, 0, 937, 939, 5, 297, 0, 0, 938, 936, 1, 0, 0, 0, 938, 937, 1, 0, 0, 0, 939, 95, 1, 0, 0, 0, 940, 941, 7, 6, 0, 0, 941, 97, 1, 0, 0, 0, 942, 944, 3, 96, 48, 0, 943, 942, 1, 0, 0, 0, 944, 947, 1, 0, 0, 0, 945, 943, 1, 0, 0, 0, 945, 946, 1, 0, 0, 0, 946, 99, 1, 0, 0, 0, 947, 945, 1, 0, 0, 0, 948, 949, 5, 274, 0, 0, 949, 101, 1, 0, 0, 0, 950, 951, 5, 275, 0, 0, 951, 103, 1, 0, 0, 0, 952, 953, 5, 276, 0, 0, 953, 105, 1, 0, 0, 0, 954, 955, 5, 277, 0, 0, 955, 107, 1, 0, 0, 0, 956, 957, 5, 278, 0, 0, 957, 109, 1, 0, 0, 0, 958, 959, 5, 281, 0, 0, 959, 111, 1, 0, 0, 0, 960, 961, 5, 279, 0, 0, 961, 113, 1, 0, 0, 0, 962, 963, 5, 285, 0, 0, 963, 115, 1, 0, 0, 0, 964, 965, 5, 283, 0, 0, 965, 117, 1, 0, 0, 0, 966, 967, 5, 284, 0, 0, 967, 119, 1, 0, 0, 0, 968, 969, 5, 280, 0, 0, 969, 121, 1, 0, 0, 0, 970, 971, 5, 286, 0, 0, 971, 123, 1, 0, 0, 0, 972, 973, 5, 282, 0, 0, 973, 125, 1, 0, 0, 0, 974, 1054, 3, 100, 50, 0, 975, 976, 3, 102, 51, 0, 976, 977, 3, 32, 16, 0, 977, 1054, 1, 0, 0, 0, 978, 979, 3, 102, 51, 0, 979, 980, 3, 0, 0, 0, 980, 1054, 1, 0, 0, 0, 981, 982, 3, 104, 52, 0, 982, 983, 3, 32, 16, 0, 983, 1054, 1, 0, 0, 0, 984, 985, 3, 106, 53, 0, 985, 986, 3, 34, 17, 0, 986, 1054, 1, 0, 0, 0, 987, 988, 3, 108, 54, 0, 988, 989, 3, 36, 18, 0, 989, 1054, 1, 0, 0, 0, 990, 991, 3, 108, 54, 0, 991, 992, 3, 34, 17, 0, 992, 1054, 1, 0, 0, 0, 993, 994, 3, 108, 54, 0, 994, 995, 5, 29, 0, 0, 995, 996, 3, 312, 156, 0, 996, 997, 5, 30, 0, 0, 997, 1054, 1, 0, 0, 0, 998, 999, 3, 108, 54, 0, 999, 1000, 5, 83, 0, 0, 1000, 1001, 5, 29, 0, 0, 1001, 1002, 3, 312, 156, 0, 1002, 1003, 5, 30, 0, 0, 1003, 1054, 1, 0, 0, 0, 1004, 1005, 3, 110, 55, 0, 1005, 1006, 3, 32, 16, 0, 1006, 1054, 1, 0, 0, 0, 1007, 1008, 3, 110, 55, 0, 1008, 1009, 3, 0, 0, 0, 1009, 1054, 1, 0, 0, 0, 1010, 1011, 3, 112, 56, 0, 1011, 1012, 3, 190, 95, 0, 1012, 1054, 1, 0, 0, 0, 1013, 1014, 3, 114, 57, 0, 1014, 1015, 3, 200, 100, 0, 1015, 1054, 1, 0, 0, 0, 1016, 1017, 3, 114, 57, 0, 1017, 1018, 3, 196, 98, 0, 1018, 1054, 1, 0, 0, 0, 1019, 1020, 3, 116, 58, 0, 1020, 1021, 3, 146, 73, 0, 1021, 1054, 1, 0, 0, 0, 1022, 1023, 3, 118, 59, 0, 1023, 1024, 3, 6, 3, 0, 1024, 1054, 1, 0, 0, 0, 1025, 1026, 3, 118, 59, 0, 1026, 1027, 5, 223, 0, 0, 1027, 1028, 5, 29, 0, 0, 1028, 1029, 3, 6, 3, 0, 1029, 1030, 5, 30, 0, 0, 1030, 1054, 1, 0, 0, 0, 1031, 1032, 3, 118, 59, 0, 1032, 1033, 5, 83, 0, 0, 1033, 1034, 5, 29, 0, 0, 1034, 1035, 3, 312, 156, 0, 1035, 1036, 5, 30, 0, 0, 1036, 1054, 1, 0, 0, 0, 1037, 1038, 3, 120, 60, 0, 1038, 1039, 3, 192, 96, 0, 1039, 1040, 3, 160, 80, 0, 1040, 1041, 3, 134, 67, 0, 1041, 1054, 1, 0, 0, 0, 1042, 1043, 3, 122, 61, 0, 1043, 1044, 3, 50, 25, 0, 1044, 1054, 1, 0, 0, 0, 1045, 1046, 3, 124, 62, 0, 1046, 1047, 5, 29, 0, 0, 1047, 1048, 3, 128, 64, 0, 1048, 1049, 5, 30, 0, 0, 1049, 1054, 1, 0, 0, 0, 1050, 1051, 3, 124, 62, 0, 1051, 1052, 5, 84, 0, 0, 1052, 1054, 1, 0, 0, 0, 1053, 974, 1, 0, 0, 0, 1053, 975, 1, 0, 0, 0, 1053, 978, 1, 0, 0, 0, 1053, 981, 1, 0, 0, 0, 1053, 984, 1, 0, 0, 0, 1053, 987, 1, 0, 0, 0, 1053, 990, 1, 0, 0, 0, 1053, 993, 1, 0, 0, 0, 1053, 998, 1, 0, 0, 0, 1053, 1004, 1, 0, 0, 0, 1053, 1007, 1, 0, 0, 0, 1053, 1010, 1, 0, 0, 0, 1053, 1013, 1, 0, 0, 0, 1053, 1016, 1, 0, 0, 0, 1053, 1019, 1, 0, 0, 0, 1053, 1022, 1, 0, 0, 0, 1053, 1025, 1, 0, 0, 0, 1053, 1031, 1, 0, 0, 0, 1053, 1037, 1, 0, 0, 0, 1053, 1042, 1, 0, 0, 0, 1053, 1045, 1, 0, 0, 0, 1053, 1050, 1, 0, 0, 0, 1054, 127, 1, 0, 0, 0, 1055, 1072, 1, 0, 0, 0, 1056, 1059, 3, 0, 0, 0, 1057, 1059, 3, 32, 16, 0, 1058, 1056, 1, 0, 0, 0, 1058, 1057, 1, 0, 0, 0, 1059, 1060, 1, 0, 0, 0, 1060, 1061, 5, 27, 0, 0, 1061, 1063, 1, 0, 0, 0, 1062, 1058, 1, 0, 0, 0, 1063, 1066, 1, 0, 0, 0, 1064, 1062, 1, 0, 0, 0, 1064, 1065, 1, 0, 0, 0, 1065, 1069, 1, 0, 0, 0, 1066, 1064, 1, 0, 0, 0, 1067, 1070, 3, 0, 0, 0, 1068, 1070, 3, 32, 16, 0, 1069, 1067, 1, 0, 0, 0, 1069, 1068, 1, 0, 0, 0, 1070, 1072, 1, 0, 0, 0, 1071, 1055, 1, 0, 0, 0, 1071, 1064, 1, 0, 0, 0, 1072, 129, 1, 0, 0, 0, 1073, 1079, 5, 85, 0, 0, 1074, 1075, 3, 160, 80, 0, 1075, 1076, 5, 27, 0, 0, 1076, 1078, 1, 0, 0, 0, 1077, 1074, 1, 0, 0, 0, 1078, 1081, 1, 0, 0, 0, 1079, 1077, 1, 0, 0, 0, 1079, 1080, 1, 0, 0, 0, 1080, 1082, 1, 0, 0, 0, 1081, 1079, 1, 0, 0, 0, 1082, 1083, 3, 160, 80, 0, 1083, 1084, 5, 86, 0, 0, 1084, 131, 1, 0, 0, 0, 1085, 1091, 5, 41, 0, 0, 1086, 1087, 3, 168, 84, 0, 1087, 1088, 5, 27, 0, 0, 1088, 1090, 1, 0, 0, 0, 1089, 1086, 1, 0, 0, 0, 1090, 1093, 1, 0, 0, 0, 1091, 1089, 1, 0, 0, 0, 1091, 1092, 1, 0, 0, 0, 1092, 1094, 1, 0, 0, 0, 1093, 1091, 1, 0, 0, 0, 1094, 1095, 3, 168, 84, 0, 1095, 1096, 5, 42, 0, 0, 1096, 133, 1, 0, 0, 0, 1097, 1103, 5, 29, 0, 0, 1098, 1099, 3, 136, 68, 0, 1099, 1100, 5, 27, 0, 0, 1100, 1102, 1, 0, 0, 0, 1101, 1098, 1, 0, 0, 0, 1102, 1105, 1, 0, 0, 0, 1103, 1101, 1, 0, 0, 0, 1103, 1104, 1, 0, 0, 0, 1104, 1106, 1, 0, 0, 0, 1105, 1103, 1, 0, 0, 0, 1106, 1107, 3, 136, 68, 0, 1107, 1108, 5, 30, 0, 0, 1108, 1111, 1, 0, 0, 0, 1109, 1111, 5, 84, 0, 0, 1110, 1097, 1, 0, 0, 0, 1110, 1109, 1, 0, 0, 0, 1111, 135, 1, 0, 0, 0, 1112, 1120, 5, 176, 0, 0, 1113, 1114, 3, 252, 126, 0, 1114, 1115, 3, 160, 80, 0, 1115, 1117, 3, 248, 124, 0, 1116, 1118, 3, 0, 0, 0, 1117, 1116, 1, 0, 0, 0, 1117, 1118, 1, 0, 0, 0, 1118, 1120, 1, 0, 0, 0, 1119, 1112, 1, 0, 0, 0, 1119, 1113, 1, 0, 0, 0, 1120, 137, 1, 0, 0, 0, 1121, 1122, 5, 41, 0, 0, 1122, 1123, 3, 2, 1, 0, 1123, 1124, 5, 42, 0, 0, 1124, 1125, 3, 140, 70, 0, 1125, 1147, 1, 0, 0, 0, 1126, 1127, 5, 41, 0, 0, 1127, 1128, 3, 196, 98, 0, 1128, 1129, 5, 42, 0, 0, 1129, 1130, 3, 140, 70, 0, 1130, 1147, 1, 0, 0, 0, 1131, 1132, 5, 41, 0, 0, 1132, 1133, 5, 261, 0, 0, 1133, 1134, 5, 42, 0, 0, 1134, 1147, 3, 140, 70, 0, 1135, 1136, 5, 41, 0, 0, 1136, 1137, 5, 197, 0, 0, 1137, 1138, 3, 2, 1, 0, 1138, 1139, 5, 42, 0, 0, 1139, 1140, 3, 140, 70, 0, 1140, 1147, 1, 0, 0, 0, 1141, 1147, 3, 140, 70, 0, 1142, 1147, 3, 196, 98, 0, 1143, 1147, 5, 256, 0, 0, 1144, 1147, 5, 257, 0, 0, 1145, 1147, 5, 258, 0, 0, 1146, 1121, 1, 0, 0, 0, 1146, 1126, 1, 0, 0, 0, 1146, 1131, 1, 0, 0, 0, 1146, 1135, 1, 0, 0, 0, 1146, 1141, 1, 0, 0, 0, 1146, 1142, 1, 0, 0, 0, 1146, 1143, 1, 0, 0, 0, 1146, 1144, 1, 0, 0, 0, 1146, 1145, 1, 0, 0, 0, 1147, 139, 1, 0, 0, 0, 1148, 1149, 3, 2, 1, 0, 1149, 1150, 5, 87, 0, 0, 1150, 1152, 1, 0, 0, 0, 1151, 1148, 1, 0, 0, 0, 1152, 1155, 1, 0, 0, 0, 1153, 1151, 1, 0, 0, 0, 1153, 1154, 1, 0, 0, 0, 1154, 1156, 1, 0, 0, 0, 1155, 1153, 1, 0, 0, 0, 1156, 1157, 3, 2, 1, 0, 1157, 141, 1, 0, 0, 0, 1158, 1160, 3, 144, 72, 0, 1159, 1158, 1, 0, 0, 0, 1160, 1163, 1, 0, 0, 0, 1161, 1159, 1, 0, 0, 0, 1161, 1162, 1, 0, 0, 0, 1162, 143, 1, 0, 0, 0, 1163, 1161, 1, 0, 0, 0, 1164, 1165, 5, 179, 0, 0, 1165, 1166, 5, 88, 0, 0, 1166, 1170, 3, 32, 16, 0, 1167, 1170, 3, 174, 87, 0, 1168, 1170, 3, 344, 172, 0, 1169, 1164, 1, 0, 0, 0, 1169, 1167, 1, 0, 0, 0, 1169, 1168, 1, 0, 0, 0, 1170, 145, 1, 0, 0, 0, 1171, 1183, 3, 138, 69, 0, 1172, 1173, 5, 41, 0, 0, 1173, 1174, 3, 2, 1, 0, 1174, 1175, 5, 42, 0, 0, 1175, 1183, 1, 0, 0, 0, 1176, 1177, 5, 41, 0, 0, 1177, 1178, 5, 197, 0, 0, 1178, 1179, 3, 2, 1, 0, 1179, 1180, 5, 42, 0, 0, 1180, 1183, 1, 0, 0, 0, 1181, 1183, 3, 160, 80, 0, 1182, 1171, 1, 0, 0, 0, 1182, 1172, 1, 0, 0, 0, 1182, 1176, 1, 0, 0, 0, 1182, 1181, 1, 0, 0, 0, 1183, 147, 1, 0, 0, 0, 1184, 1193, 1, 0, 0, 0, 1185, 1189, 3, 152, 76, 0, 1186, 1188, 3, 150, 75, 0, 1187, 1186, 1, 0, 0, 0, 1188, 1191, 1, 0, 0, 0, 1189, 1187, 1, 0, 0, 0, 1189, 1190, 1, 0, 0, 0, 1190, 1193, 1, 0, 0, 0, 1191, 1189, 1, 0, 0, 0, 1192, 1184, 1, 0, 0, 0, 1192, 1185, 1, 0, 0, 0, 1193, 149, 1, 0, 0, 0, 1194, 1212, 5, 261, 0, 0, 1195, 1212, 5, 260, 0, 0, 1196, 1197, 5, 41, 0, 0, 1197, 1198, 3, 32, 16, 0, 1198, 1199, 5, 42, 0, 0, 1199, 1212, 1, 0, 0, 0, 1200, 1201, 5, 41, 0, 0, 1201, 1202, 3, 32, 16, 0, 1202, 1203, 5, 265, 0, 0, 1203, 1204, 3, 32, 16, 0, 1204, 1205, 5, 42, 0, 0, 1205, 1212, 1, 0, 0, 0, 1206, 1207, 5, 41, 0, 0, 1207, 1208, 5, 265, 0, 0, 1208, 1209, 3, 32, 16, 0, 1209, 1210, 5, 42, 0, 0, 1210, 1212, 1, 0, 0, 0, 1211, 1194, 1, 0, 0, 0, 1211, 1195, 1, 0, 0, 0, 1211, 1196, 1, 0, 0, 0, 1211, 1200, 1, 0, 0, 0, 1211, 1206, 1, 0, 0, 0, 1212, 151, 1, 0, 0, 0, 1213, 1298, 1, 0, 0, 0, 1214, 1215, 5, 202, 0, 0, 1215, 1216, 5, 29, 0, 0, 1216, 1217, 3, 6, 3, 0, 1217, 1218, 5, 27, 0, 0, 1218, 1219, 3, 6, 3, 0, 1219, 1220, 5, 27, 0, 0, 1220, 1221, 3, 6, 3, 0, 1221, 1222, 5, 27, 0, 0, 1222, 1223, 3, 6, 3, 0, 1223, 1224, 5, 30, 0, 0, 1224, 1298, 1, 0, 0, 0, 1225, 1226, 5, 202, 0, 0, 1226, 1227, 5, 29, 0, 0, 1227, 1228, 3, 6, 3, 0, 1228, 1229, 5, 27, 0, 0, 1229, 1230, 3, 6, 3, 0, 1230, 1231, 5, 30, 0, 0, 1231, 1298, 1, 0, 0, 0, 1232, 1233, 5, 203, 0, 0, 1233, 1234, 5, 204, 0, 0, 1234, 1235, 5, 41, 0, 0, 1235, 1236, 3, 32, 16, 0, 1236, 1237, 5, 42, 0, 0, 1237, 1298, 1, 0, 0, 0, 1238, 1239, 5, 203, 0, 0, 1239, 1240, 5, 205, 0, 0, 1240, 1241, 5, 41, 0, 0, 1241, 1242, 3, 32, 16, 0, 1242, 1243, 5, 42, 0, 0, 1243, 1244, 3, 148, 74, 0, 1244, 1298, 1, 0, 0, 0, 1245, 1298, 5, 206, 0, 0, 1246, 1298, 5, 207, 0, 0, 1247, 1298, 5, 208, 0, 0, 1248, 1298, 5, 200, 0, 0, 1249, 1298, 5, 182, 0, 0, 1250, 1298, 5, 183, 0, 0, 1251, 1298, 5, 184, 0, 0, 1252, 1298, 5, 185, 0, 0, 1253, 1298, 5, 186, 0, 0, 1254, 1298, 5, 187, 0, 0, 1255, 1298, 5, 188, 0, 0, 1256, 1298, 5, 209, 0, 0, 1257, 1298, 5, 189, 0, 0, 1258, 1298, 5, 190, 0, 0, 1259, 1298, 5, 191, 0, 0, 1260, 1298, 5, 192, 0, 0, 1261, 1298, 5, 210, 0, 0, 1262, 1298, 5, 211, 0, 0, 1263, 1298, 5, 212, 0, 0, 1264, 1298, 5, 213, 0, 0, 1265, 1298, 5, 214, 0, 0, 1266, 1298, 5, 215, 0, 0, 1267, 1298, 5, 216, 0, 0, 1268, 1269, 5, 217, 0, 0, 1269, 1298, 3, 154, 77, 0, 1270, 1271, 5, 218, 0, 0, 1271, 1298, 3, 154, 77, 0, 1272, 1298, 5, 219, 0, 0, 1273, 1274, 5, 220, 0, 0, 1274, 1298, 3, 154, 77, 0, 1275, 1276, 5, 221, 0, 0, 1276, 1298, 3, 156, 78, 0, 1277, 1278, 5, 221, 0, 0, 1278, 1279, 3, 156, 78, 0, 1279, 1280, 5, 27, 0, 0, 1280, 1281, 3, 6, 3, 0, 1281, 1298, 1, 0, 0, 0, 1282, 1298, 5, 193, 0, 0, 1283, 1298, 5, 194, 0, 0, 1284, 1285, 5, 61, 0, 0, 1285, 1298, 5, 219, 0, 0, 1286, 1298, 5, 222, 0, 0, 1287, 1288, 5, 223, 0, 0, 1288, 1298, 5, 212, 0, 0, 1289, 1298, 5, 224, 0, 0, 1290, 1291, 5, 206, 0, 0, 1291, 1298, 5, 182, 0, 0, 1292, 1298, 5, 225, 0, 0, 1293, 1298, 5, 227, 0, 0, 1294, 1295, 5, 33, 0, 0, 1295, 1298, 5, 226, 0, 0, 1296, 1298, 3, 2, 1, 0, 1297, 1213, 1, 0, 0, 0, 1297, 1214, 1, 0, 0, 0, 1297, 1225, 1, 0, 0, 0, 1297, 1232, 1, 0, 0, 0, 1297, 1238, 1, 0, 0, 0, 1297, 1245, 1, 0, 0, 0, 1297, 1246, 1, 0, 0, 0, 1297, 1247, 1, 0, 0, 0, 1297, 1248, 1, 0, 0, 0, 1297, 1249, 1, 0, 0, 0, 1297, 1250, 1, 0, 0, 0, 1297, 1251, 1, 0, 0, 0, 1297, 1252, 1, 0, 0, 0, 1297, 1253, 1, 0, 0, 0, 1297, 1254, 1, 0, 0, 0, 1297, 1255, 1, 0, 0, 0, 1297, 1256, 1, 0, 0, 0, 1297, 1257, 1, 0, 0, 0, 1297, 1258, 1, 0, 0, 0, 1297, 1259, 1, 0, 0, 0, 1297, 1260, 1, 0, 0, 0, 1297, 1261, 1, 0, 0, 0, 1297, 1262, 1, 0, 0, 0, 1297, 1263, 1, 0, 0, 0, 1297, 1264, 1, 0, 0, 0, 1297, 1265, 1, 0, 0, 0, 1297, 1266, 1, 0, 0, 0, 1297, 1267, 1, 0, 0, 0, 1297, 1268, 1, 0, 0, 0, 1297, 1270, 1, 0, 0, 0, 1297, 1272, 1, 0, 0, 0, 1297, 1273, 1, 0, 0, 0, 1297, 1275, 1, 0, 0, 0, 1297, 1277, 1, 0, 0, 0, 1297, 1282, 1, 0, 0, 0, 1297, 1283, 1, 0, 0, 0, 1297, 1284, 1, 0, 0, 0, 1297, 1286, 1, 0, 0, 0, 1297, 1287, 1, 0, 0, 0, 1297, 1289, 1, 0, 0, 0, 1297, 1290, 1, 0, 0, 0, 1297, 1292, 1, 0, 0, 0, 1297, 1293, 1, 0, 0, 0, 1297, 1294, 1, 0, 0, 0, 1297, 1296, 1, 0, 0, 0, 1298, 153, 1, 0, 0, 0, 1299, 1307, 1, 0, 0, 0, 1300, 1301, 5, 29, 0, 0, 1301, 1302, 5, 89, 0, 0, 1302, 1303, 5, 35, 0, 0, 1303, 1304, 3, 32, 16, 0, 1304, 1305, 5, 30, 0, 0, 1305, 1307, 1, 0, 0, 0, 1306, 1299, 1, 0, 0, 0, 1306, 1300, 1, 0, 0, 0, 1307, 155, 1, 0, 0, 0, 1308, 1317, 1, 0, 0, 0, 1309, 1313, 3, 158, 79, 0, 1310, 1312, 7, 7, 0, 0, 1311, 1310, 1, 0, 0, 0, 1312, 1315, 1, 0, 0, 0, 1313, 1311, 1, 0, 0, 0, 1313, 1314, 1, 0, 0, 0, 1314, 1317, 1, 0, 0, 0, 1315, 1313, 1, 0, 0, 0, 1316, 1308, 1, 0, 0, 0, 1316, 1309, 1, 0, 0, 0, 1317, 157, 1, 0, 0, 0, 1318, 1319, 7, 8, 0, 0, 1319, 159, 1, 0, 0, 0, 1320, 1324, 3, 164, 82, 0, 1321, 1323, 3, 162, 81, 0, 1322, 1321, 1, 0, 0, 0, 1323, 1326, 1, 0, 0, 0, 1324, 1322, 1, 0, 0, 0, 1324, 1325, 1, 0, 0, 0, 1325, 161, 1, 0, 0, 0, 1326, 1324, 1, 0, 0, 0, 1327, 1346, 5, 260, 0, 0, 1328, 1329, 5, 41, 0, 0, 1329, 1346, 5, 42, 0, 0, 1330, 1346, 3, 132, 66, 0, 1331, 1346, 5, 259, 0, 0, 1332, 1346, 5, 261, 0, 0, 1333, 1346, 5, 90, 0, 0, 1334, 1335, 5, 91, 0, 0, 1335, 1336, 5, 29, 0, 0, 1336, 1337, 3, 146, 73, 0, 1337, 1338, 5, 30, 0, 0, 1338, 1346, 1, 0, 0, 0, 1339, 1340, 5, 92, 0, 0, 1340, 1341, 5, 29, 0, 0, 1341, 1342, 3, 146, 73, 0, 1342, 1343, 5, 30, 0, 0, 1343, 1346, 1, 0, 0, 0, 1344, 1346, 3, 130, 65, 0, 1345, 1327, 1, 0, 0, 0, 1345, 1328, 1, 0, 0, 0, 1345, 1330, 1, 0, 0, 0, 1345, 1331, 1, 0, 0, 0, 1345, 1332, 1, 0, 0, 0, 1345, 1333, 1, 0, 0, 0, 1345, 1334, 1, 0, 0, 0, 1345, 1339, 1, 0, 0, 0, 1345, 1344, 1, 0, 0, 0, 1346, 163, 1, 0, 0, 0, 1347, 1348, 5, 38, 0, 0, 1348, 1378, 3, 138, 69, 0, 1349, 1378, 5, 196, 0, 0, 1350, 1351, 5, 198, 0, 0, 1351, 1352, 5, 38, 0, 0, 1352, 1378, 3, 138, 69, 0, 1353, 1354, 5, 199, 0, 0, 1354, 1378, 3, 138, 69, 0, 1355, 1356, 5, 225, 0, 0, 1356, 1357, 3, 192, 96, 0, 1357, 1358, 3, 160, 80, 0, 1358, 1359, 5, 261, 0, 0, 1359, 1360, 3, 134, 67, 0, 1360, 1378, 1, 0, 0, 0, 1361, 1362, 5, 252, 0, 0, 1362, 1378, 3, 32, 16, 0, 1363, 1364, 5, 251, 0, 0, 1364, 1378, 3, 32, 16, 0, 1365, 1366, 5, 252, 0, 0, 1366, 1378, 3, 2, 1, 0, 1367, 1368, 5, 251, 0, 0, 1368, 1378, 3, 2, 1, 0, 1369, 1378, 5, 253, 0, 0, 1370, 1378, 5, 200, 0, 0, 1371, 1378, 3, 170, 85, 0, 1372, 1378, 3, 172, 86, 0, 1373, 1378, 3, 166, 83, 0, 1374, 1378, 3, 2, 1, 0, 1375, 1376, 5, 176, 0, 0, 1376, 1378, 3, 160, 80, 0, 1377, 1347, 1, 0, 0, 0, 1377, 1349, 1, 0, 0, 0, 1377, 1350, 1, 0, 0, 0, 1377, 1353, 1, 0, 0, 0, 1377, 1355, 1, 0, 0, 0, 1377, 1361, 1, 0, 0, 0, 1377, 1363, 1, 0, 0, 0, 1377, 1365, 1, 0, 0, 0, 1377, 1367, 1, 0, 0, 0, 1377, 1369, 1, 0, 0, 0, 1377, 1370, 1, 0, 0, 0, 1377, 1371, 1, 0, 0, 0, 1377, 1372, 1, 0, 0, 0, 1377, 1373, 1, 0, 0, 0, 1377, 1374, 1, 0, 0, 0, 1377, 1375, 1, 0, 0, 0, 1378, 165, 1, 0, 0, 0, 1379, 1401, 5, 180, 0, 0, 1380, 1401, 5, 181, 0, 0, 1381, 1401, 5, 182, 0, 0, 1382, 1401, 5, 183, 0, 0, 1383, 1401, 5, 184, 0, 0, 1384, 1401, 5, 185, 0, 0, 1385, 1401, 5, 186, 0, 0, 1386, 1401, 5, 187, 0, 0, 1387, 1401, 5, 188, 0, 0, 1388, 1401, 5, 189, 0, 0, 1389, 1401, 5, 190, 0, 0, 1390, 1401, 5, 191, 0, 0, 1391, 1401, 5, 192, 0, 0, 1392, 1393, 5, 93, 0, 0, 1393, 1401, 5, 183, 0, 0, 1394, 1395, 5, 93, 0, 0, 1395, 1401, 5, 184, 0, 0, 1396, 1397, 5, 93, 0, 0, 1397, 1401, 5, 185, 0, 0, 1398, 1399, 5, 93, 0, 0, 1399, 1401, 5, 186, 0, 0, 1400, 1379, 1, 0, 0, 0, 1400, 1380, 1, 0, 0, 0, 1400, 1381, 1, 0, 0, 0, 1400, 1382, 1, 0, 0, 0, 1400, 1383, 1, 0, 0, 0, 1400, 1384, 1, 0, 0, 0, 1400, 1385, 1, 0, 0, 0, 1400, 1386, 1, 0, 0, 0, 1400, 1387, 1, 0, 0, 0, 1400, 1388, 1, 0, 0, 0, 1400, 1389, 1, 0, 0, 0, 1400, 1390, 1, 0, 0, 0, 1400, 1391, 1, 0, 0, 0, 1400, 1392, 1, 0, 0, 0, 1400, 1394, 1, 0, 0, 0, 1400, 1396, 1, 0, 0, 0, 1400, 1398, 1, 0, 0, 0, 1401, 167, 1, 0, 0, 0, 1402, 1413, 1, 0, 0, 0, 1403, 1413, 5, 176, 0, 0, 1404, 1413, 3, 32, 16, 0, 1405, 1406, 3, 32, 16, 0, 1406, 1407, 5, 176, 0, 0, 1407, 1408, 3, 32, 16, 0, 1408, 1413, 1, 0, 0, 0, 1409, 1410, 3, 32, 16, 0, 1410, 1411, 5, 176, 0, 0, 1411, 1413, 1, 0, 0, 0, 1412, 1402, 1, 0, 0, 0, 1412, 1403, 1, 0, 0, 0, 1412, 1404, 1, 0, 0, 0, 1412, 1405, 1, 0, 0, 0, 1412, 1409, 1, 0, 0, 0, 1413, 169, 1, 0, 0, 0, 1414, 1415, 5, 1, 0, 0, 1415, 1416, 5, 193, 0, 0, 1416, 171, 1, 0, 0, 0, 1417, 1421, 5, 1, 0, 0, 1418, 1419, 5, 93, 0, 0, 1419, 1422, 5, 193, 0, 0, 1420, 1422, 5, 194, 0, 0, 1421, 1418, 1, 0, 0, 0, 1421, 1420, 1, 0, 0, 0, 1422, 173, 1, 0, 0, 0, 1423, 1424, 5, 293, 0, 0, 1424, 1425, 3, 188, 94, 0, 1425, 1426, 3, 146, 73, 0, 1426, 1427, 5, 29, 0, 0, 1427, 1428, 3, 180, 90, 0, 1428, 1429, 5, 30, 0, 0, 1429, 1464, 1, 0, 0, 0, 1430, 1431, 5, 293, 0, 0, 1431, 1432, 3, 188, 94, 0, 1432, 1433, 3, 146, 73, 0, 1433, 1434, 5, 35, 0, 0, 1434, 1435, 5, 16, 0, 0, 1435, 1436, 3, 52, 26, 0, 1436, 1437, 5, 17, 0, 0, 1437, 1464, 1, 0, 0, 0, 1438, 1439, 5, 293, 0, 0, 1439, 1440, 3, 188, 94, 0, 1440, 1441, 3, 146, 73, 0, 1441, 1464, 1, 0, 0, 0, 1442, 1443, 5, 294, 0, 0, 1443, 1444, 3, 188, 94, 0, 1444, 1446, 5, 35, 0, 0, 1445, 1447, 5, 83, 0, 0, 1446, 1445, 1, 0, 0, 0, 1446, 1447, 1, 0, 0, 0, 1447, 1448, 1, 0, 0, 0, 1448, 1449, 5, 29, 0, 0, 1449, 1450, 3, 312, 156, 0, 1450, 1451, 5, 30, 0, 0, 1451, 1464, 1, 0, 0, 0, 1452, 1453, 5, 294, 0, 0, 1453, 1454, 3, 188, 94, 0, 1454, 1455, 3, 6, 3, 0, 1455, 1464, 1, 0, 0, 0, 1456, 1457, 5, 294, 0, 0, 1457, 1458, 3, 188, 94, 0, 1458, 1459, 5, 35, 0, 0, 1459, 1460, 5, 16, 0, 0, 1460, 1461, 3, 176, 88, 0, 1461, 1462, 5, 17, 0, 0, 1462, 1464, 1, 0, 0, 0, 1463, 1423, 1, 0, 0, 0, 1463, 1430, 1, 0, 0, 0, 1463, 1438, 1, 0, 0, 0, 1463, 1442, 1, 0, 0, 0, 1463, 1452, 1, 0, 0, 0, 1463, 1456, 1, 0, 0, 0, 1464, 175, 1, 0, 0, 0, 1465, 1476, 1, 0, 0, 0, 1466, 1467, 3, 178, 89, 0, 1467, 1468, 5, 27, 0, 0, 1468, 1470, 1, 0, 0, 0, 1469, 1466, 1, 0, 0, 0, 1470, 1473, 1, 0, 0, 0, 1471, 1469, 1, 0, 0, 0, 1471, 1472, 1, 0, 0, 0, 1472, 1474, 1, 0, 0, 0, 1473, 1471, 1, 0, 0, 0, 1474, 1476, 3, 178, 89, 0, 1475, 1465, 1, 0, 0, 0, 1475, 1471, 1, 0, 0, 0, 1476, 177, 1, 0, 0, 0, 1477, 1478, 5, 38, 0, 0, 1478, 1479, 5, 263, 0, 0, 1479, 1480, 5, 35, 0, 0, 1480, 1481, 5, 16, 0, 0, 1481, 1482, 3, 56, 28, 0, 1482, 1483, 5, 17, 0, 0, 1483, 1491, 1, 0, 0, 0, 1484, 1485, 3, 146, 73, 0, 1485, 1486, 5, 35, 0, 0, 1486, 1487, 5, 16, 0, 0, 1487, 1488, 3, 56, 28, 0, 1488, 1489, 5, 17, 0, 0, 1489, 1491, 1, 0, 0, 0, 1490, 1477, 1, 0, 0, 0, 1490, 1484, 1, 0, 0, 0, 1491, 179, 1, 0, 0, 0, 1492, 1493, 3, 182, 91, 0, 1493, 1494, 5, 27, 0, 0, 1494, 1496, 1, 0, 0, 0, 1495, 1492, 1, 0, 0, 0, 1496, 1499, 1, 0, 0, 0, 1497, 1495, 1, 0, 0, 0, 1497, 1498, 1, 0, 0, 0, 1498, 1500, 1, 0, 0, 0, 1499, 1497, 1, 0, 0, 0, 1500, 1501, 3, 182, 91, 0, 1501, 181, 1, 0, 0, 0, 1502, 1503, 3, 6, 3, 0, 1503, 1504, 5, 35, 0, 0, 1504, 1505, 3, 186, 93, 0, 1505, 183, 1, 0, 0, 0, 1506, 1507, 7, 9, 0, 0, 1507, 185, 1, 0, 0, 0, 1508, 1543, 3, 184, 92, 0, 1509, 1543, 3, 32, 16, 0, 1510, 1511, 5, 185, 0, 0, 1511, 1512, 5, 29, 0, 0, 1512, 1513, 3, 32, 16, 0, 1513, 1514, 5, 30, 0, 0, 1514, 1543, 1, 0, 0, 0, 1515, 1543, 3, 6, 3, 0, 1516, 1517, 3, 138, 69, 0, 1517, 1518, 5, 29, 0, 0, 1518, 1519, 5, 183, 0, 0, 1519, 1520, 5, 74, 0, 0, 1520, 1521, 3, 32, 16, 0, 1521, 1522, 5, 30, 0, 0, 1522, 1543, 1, 0, 0, 0, 1523, 1524, 3, 138, 69, 0, 1524, 1525, 5, 29, 0, 0, 1525, 1526, 5, 184, 0, 0, 1526, 1527, 5, 74, 0, 0, 1527, 1528, 3, 32, 16, 0, 1528, 1529, 5, 30, 0, 0, 1529, 1543, 1, 0, 0, 0, 1530, 1531, 3, 138, 69, 0, 1531, 1532, 5, 29, 0, 0, 1532, 1533, 5, 185, 0, 0, 1533, 1534, 5, 74, 0, 0, 1534, 1535, 3, 32, 16, 0, 1535, 1536, 5, 30, 0, 0, 1536, 1543, 1, 0, 0, 0, 1537, 1538, 3, 138, 69, 0, 1538, 1539, 5, 29, 0, 0, 1539, 1540, 3, 32, 16, 0, 1540, 1541, 5, 30, 0, 0, 1541, 1543, 1, 0, 0, 0, 1542, 1508, 1, 0, 0, 0, 1542, 1509, 1, 0, 0, 0, 1542, 1510, 1, 0, 0, 0, 1542, 1515, 1, 0, 0, 0, 1542, 1516, 1, 0, 0, 0, 1542, 1523, 1, 0, 0, 0, 1542, 1530, 1, 0, 0, 0, 1542, 1537, 1, 0, 0, 0, 1543, 187, 1, 0, 0, 0, 1544, 1545, 7, 10, 0, 0, 1545, 189, 1, 0, 0, 0, 1546, 1547, 3, 192, 96, 0, 1547, 1548, 3, 160, 80, 0, 1548, 1549, 3, 146, 73, 0, 1549, 1550, 5, 175, 0, 0, 1550, 1552, 3, 264, 132, 0, 1551, 1553, 3, 130, 65, 0, 1552, 1551, 1, 0, 0, 0, 1552, 1553, 1, 0, 0, 0, 1553, 1554, 1, 0, 0, 0, 1554, 1555, 3, 134, 67, 0, 1555, 1581, 1, 0, 0, 0, 1556, 1557, 3, 192, 96, 0, 1557, 1558, 3, 160, 80, 0, 1558, 1559, 3, 146, 73, 0, 1559, 1560, 5, 175, 0, 0, 1560, 1561, 3, 264, 132, 0, 1561, 1562, 3, 218, 109, 0, 1562, 1563, 3, 134, 67, 0, 1563, 1581, 1, 0, 0, 0, 1564, 1565, 3, 192, 96, 0, 1565, 1566, 3, 160, 80, 0, 1566, 1568, 3, 264, 132, 0, 1567, 1569, 3, 130, 65, 0, 1568, 1567, 1, 0, 0, 0, 1568, 1569, 1, 0, 0, 0, 1569, 1570, 1, 0, 0, 0, 1570, 1571, 3, 134, 67, 0, 1571, 1581, 1, 0, 0, 0, 1572, 1573, 3, 192, 96, 0, 1573, 1574, 3, 160, 80, 0, 1574, 1575, 3, 264, 132, 0, 1575, 1576, 3, 218, 109, 0, 1576, 1577, 3, 134, 67, 0, 1577, 1581, 1, 0, 0, 0, 1578, 1581, 3, 196, 98, 0, 1579, 1581, 3, 2, 1, 0, 1580, 1546, 1, 0, 0, 0, 1580, 1556, 1, 0, 0, 0, 1580, 1564, 1, 0, 0, 0, 1580, 1572, 1, 0, 0, 0, 1580, 1578, 1, 0, 0, 0, 1580, 1579, 1, 0, 0, 0, 1581, 191, 1, 0, 0, 0, 1582, 1583, 5, 242, 0, 0, 1583, 1593, 3, 192, 96, 0, 1584, 1585, 5, 243, 0, 0, 1585, 1593, 3, 192, 96, 0, 1586, 1593, 3, 194, 97, 0, 1587, 1588, 5, 111, 0, 0, 1588, 1589, 5, 29, 0, 0, 1589, 1590, 3, 32, 16, 0, 1590, 1591, 5, 30, 0, 0, 1591, 1593, 1, 0, 0, 0, 1592, 1582, 1, 0, 0, 0, 1592, 1584, 1, 0, 0, 0, 1592, 1586, 1, 0, 0, 0, 1592, 1587, 1, 0, 0, 0, 1593, 193, 1, 0, 0, 0, 1594, 1607, 1, 0, 0, 0, 1595, 1607, 5, 244, 0, 0, 1596, 1607, 5, 245, 0, 0, 1597, 1598, 5, 246, 0, 0, 1598, 1607, 5, 247, 0, 0, 1599, 1600, 5, 246, 0, 0, 1600, 1607, 5, 248, 0, 0, 1601, 1602, 5, 246, 0, 0, 1602, 1607, 5, 249, 0, 0, 1603, 1604, 5, 246, 0, 0, 1604, 1607, 5, 250, 0, 0, 1605, 1607, 5, 246, 0, 0, 1606, 1594, 1, 0, 0, 0, 1606, 1595, 1, 0, 0, 0, 1606, 1596, 1, 0, 0, 0, 1606, 1597, 1, 0, 0, 0, 1606, 1599, 1, 0, 0, 0, 1606, 1601, 1, 0, 0, 0, 1606, 1603, 1, 0, 0, 0, 1606, 1605, 1, 0, 0, 0, 1607, 195, 1, 0, 0, 0, 1608, 1609, 5, 112, 0, 0, 1609, 1610, 5, 29, 0, 0, 1610, 1611, 3, 32, 16, 0, 1611, 1612, 5, 30, 0, 0, 1612, 197, 1, 0, 0, 0, 1613, 1614, 5, 225, 0, 0, 1614, 1619, 3, 190, 95, 0, 1615, 1616, 5, 36, 0, 0, 1616, 1619, 3, 200, 100, 0, 1617, 1619, 3, 196, 98, 0, 1618, 1613, 1, 0, 0, 0, 1618, 1615, 1, 0, 0, 0, 1618, 1617, 1, 0, 0, 0, 1619, 199, 1, 0, 0, 0, 1620, 1621, 3, 160, 80, 0, 1621, 1622, 3, 146, 73, 0, 1622, 1623, 5, 175, 0, 0, 1623, 1624, 3, 2, 1, 0, 1624, 1630, 1, 0, 0, 0, 1625, 1626, 3, 160, 80, 0, 1626, 1627, 3, 2, 1, 0, 1627, 1630, 1, 0, 0, 0, 1628, 1630, 3, 2, 1, 0, 1629, 1620, 1, 0, 0, 0, 1629, 1625, 1, 0, 0, 0, 1629, 1628, 1, 0, 0, 0, 1630, 201, 1, 0, 0, 0, 1631, 1632, 3, 146, 73, 0, 1632, 1633, 5, 27, 0, 0, 1633, 1635, 1, 0, 0, 0, 1634, 1631, 1, 0, 0, 0, 1635, 1638, 1, 0, 0, 0, 1636, 1634, 1, 0, 0, 0, 1636, 1637, 1, 0, 0, 0, 1637, 1639, 1, 0, 0, 0, 1638, 1636, 1, 0, 0, 0, 1639, 1640, 3, 146, 73, 0, 1640, 203, 1, 0, 0, 0, 1641, 1647, 1, 0, 0, 0, 1642, 1643, 5, 85, 0, 0, 1643, 1644, 3, 212, 106, 0, 1644, 1645, 5, 86, 0, 0, 1645, 1647, 1, 0, 0, 0, 1646, 1641, 1, 0, 0, 0, 1646, 1642, 1, 0, 0, 0, 1647, 205, 1, 0, 0, 0, 1648, 1660, 5, 265, 0, 0, 1649, 1660, 5, 113, 0, 0, 1650, 1660, 5, 38, 0, 0, 1651, 1660, 5, 199, 0, 0, 1652, 1660, 5, 114, 0, 0, 1653, 1660, 5, 115, 0, 0, 1654, 1655, 5, 69, 0, 0, 1655, 1656, 5, 29, 0, 0, 1656, 1657, 3, 32, 16, 0, 1657, 1658, 5, 30, 0, 0, 1658, 1660, 1, 0, 0, 0, 1659, 1648, 1, 0, 0, 0, 1659, 1649, 1, 0, 0, 0, 1659, 1650, 1, 0, 0, 0, 1659, 1651, 1, 0, 0, 0, 1659, 1652, 1, 0, 0, 0, 1659, 1653, 1, 0, 0, 0, 1659, 1654, 1, 0, 0, 0, 1660, 207, 1, 0, 0, 0, 1661, 1663, 3, 206, 103, 0, 1662, 1661, 1, 0, 0, 0, 1663, 1666, 1, 0, 0, 0, 1664, 1662, 1, 0, 0, 0, 1664, 1665, 1, 0, 0, 0, 1665, 209, 1, 0, 0, 0, 1666, 1664, 1, 0, 0, 0, 1667, 1669, 3, 208, 104, 0, 1668, 1670, 3, 214, 107, 0, 1669, 1668, 1, 0, 0, 0, 1669, 1670, 1, 0, 0, 0, 1670, 1671, 1, 0, 0, 0, 1671, 1672, 3, 2, 1, 0, 1672, 211, 1, 0, 0, 0, 1673, 1674, 3, 210, 105, 0, 1674, 1675, 5, 27, 0, 0, 1675, 1677, 1, 0, 0, 0, 1676, 1673, 1, 0, 0, 0, 1677, 1680, 1, 0, 0, 0, 1678, 1676, 1, 0, 0, 0, 1678, 1679, 1, 0, 0, 0, 1679, 1681, 1, 0, 0, 0, 1680, 1678, 1, 0, 0, 0, 1681, 1682, 3, 210, 105, 0, 1682, 213, 1, 0, 0, 0, 1683, 1684, 5, 29, 0, 0, 1684, 1685, 3, 202, 101, 0, 1685, 1686, 5, 30, 0, 0, 1686, 215, 1, 0, 0, 0, 1687, 1690, 1, 0, 0, 0, 1688, 1690, 3, 218, 109, 0, 1689, 1687, 1, 0, 0, 0, 1689, 1688, 1, 0, 0, 0, 1690, 217, 1, 0, 0, 0, 1691, 1692, 5, 85, 0, 0, 1692, 1693, 5, 41, 0, 0, 1693, 1694, 3, 32, 16, 0, 1694, 1695, 5, 42, 0, 0, 1695, 1696, 5, 86, 0, 0, 1696, 219, 1, 0, 0, 0, 1697, 1698, 3, 256, 128, 0, 1698, 1699, 5, 16, 0, 0, 1699, 1700, 3, 268, 134, 0, 1700, 1701, 5, 17, 0, 0, 1701, 1814, 1, 0, 0, 0, 1702, 1703, 3, 74, 37, 0, 1703, 1704, 5, 16, 0, 0, 1704, 1705, 3, 82, 41, 0, 1705, 1706, 5, 17, 0, 0, 1706, 1814, 1, 0, 0, 0, 1707, 1708, 3, 232, 116, 0, 1708, 1709, 5, 16, 0, 0, 1709, 1710, 3, 236, 118, 0, 1710, 1711, 5, 17, 0, 0, 1711, 1814, 1, 0, 0, 0, 1712, 1713, 3, 240, 120, 0, 1713, 1714, 5, 16, 0, 0, 1714, 1715, 3, 244, 122, 0, 1715, 1716, 5, 17, 0, 0, 1716, 1814, 1, 0, 0, 0, 1717, 1814, 3, 222, 111, 0, 1718, 1814, 3, 296, 148, 0, 1719, 1814, 3, 174, 87, 0, 1720, 1814, 3, 88, 44, 0, 1721, 1814, 3, 342, 171, 0, 1722, 1723, 5, 116, 0, 0, 1723, 1814, 3, 32, 16, 0, 1724, 1725, 5, 117, 0, 0, 1725, 1814, 3, 32, 16, 0, 1726, 1727, 3, 354, 177, 0, 1727, 1728, 5, 16, 0, 0, 1728, 1729, 3, 358, 179, 0, 1729, 1730, 5, 17, 0, 0, 1730, 1814, 1, 0, 0, 0, 1731, 1732, 5, 301, 0, 0, 1732, 1733, 3, 146, 73, 0, 1733, 1734, 5, 175, 0, 0, 1734, 1735, 3, 264, 132, 0, 1735, 1736, 5, 118, 0, 0, 1736, 1737, 3, 192, 96, 0, 1737, 1738, 3, 160, 80, 0, 1738, 1739, 3, 146, 73, 0, 1739, 1740, 5, 175, 0, 0, 1740, 1741, 3, 264, 132, 0, 1741, 1742, 3, 134, 67, 0, 1742, 1814, 1, 0, 0, 0, 1743, 1744, 5, 301, 0, 0, 1744, 1745, 5, 225, 0, 0, 1745, 1746, 3, 192, 96, 0, 1746, 1747, 3, 160, 80, 0, 1747, 1748, 3, 146, 73, 0, 1748, 1749, 5, 175, 0, 0, 1749, 1750, 3, 264, 132, 0, 1750, 1751, 3, 216, 108, 0, 1751, 1752, 3, 134, 67, 0, 1752, 1753, 5, 118, 0, 0, 1753, 1754, 5, 225, 0, 0, 1754, 1755, 3, 192, 96, 0, 1755, 1756, 3, 160, 80, 0, 1756, 1757, 3, 146, 73, 0, 1757, 1758, 5, 175, 0, 0, 1758, 1759, 3, 264, 132, 0, 1759, 1760, 3, 216, 108, 0, 1760, 1761, 3, 134, 67, 0, 1761, 1814, 1, 0, 0, 0, 1762, 1814, 3, 26, 13, 0, 1763, 1814, 3, 40, 20, 0, 1764, 1765, 5, 254, 0, 0, 1765, 1766, 5, 195, 0, 0, 1766, 1767, 5, 41, 0, 0, 1767, 1768, 3, 32, 16, 0, 1768, 1772, 5, 42, 0, 0, 1769, 1771, 3, 342, 171, 0, 1770, 1769, 1, 0, 0, 0, 1771, 1774, 1, 0, 0, 0, 1772, 1770, 1, 0, 0, 0, 1772, 1773, 1, 0, 0, 0, 1773, 1814, 1, 0, 0, 0, 1774, 1772, 1, 0, 0, 0, 1775, 1776, 5, 254, 0, 0, 1776, 1777, 5, 195, 0, 0, 1777, 1781, 3, 2, 1, 0, 1778, 1780, 3, 342, 171, 0, 1779, 1778, 1, 0, 0, 0, 1780, 1783, 1, 0, 0, 0, 1781, 1779, 1, 0, 0, 0, 1781, 1782, 1, 0, 0, 0, 1782, 1814, 1, 0, 0, 0, 1783, 1781, 1, 0, 0, 0, 1784, 1785, 5, 254, 0, 0, 1785, 1786, 5, 255, 0, 0, 1786, 1787, 5, 41, 0, 0, 1787, 1788, 3, 32, 16, 0, 1788, 1789, 5, 42, 0, 0, 1789, 1790, 5, 27, 0, 0, 1790, 1794, 3, 146, 73, 0, 1791, 1793, 3, 342, 171, 0, 1792, 1791, 1, 0, 0, 0, 1793, 1796, 1, 0, 0, 0, 1794, 1792, 1, 0, 0, 0, 1794, 1795, 1, 0, 0, 0, 1795, 1814, 1, 0, 0, 0, 1796, 1794, 1, 0, 0, 0, 1797, 1798, 5, 254, 0, 0, 1798, 1799, 5, 255, 0, 0, 1799, 1800, 3, 2, 1, 0, 1800, 1801, 5, 27, 0, 0, 1801, 1805, 3, 146, 73, 0, 1802, 1804, 3, 342, 171, 0, 1803, 1802, 1, 0, 0, 0, 1804, 1807, 1, 0, 0, 0, 1805, 1803, 1, 0, 0, 0, 1805, 1806, 1, 0, 0, 0, 1806, 1814, 1, 0, 0, 0, 1807, 1805, 1, 0, 0, 0, 1808, 1809, 5, 119, 0, 0, 1809, 1810, 5, 195, 0, 0, 1810, 1811, 3, 146, 73, 0, 1811, 1812, 3, 44, 22, 0, 1812, 1814, 1, 0, 0, 0, 1813, 1697, 1, 0, 0, 0, 1813, 1702, 1, 0, 0, 0, 1813, 1707, 1, 0, 0, 0, 1813, 1712, 1, 0, 0, 0, 1813, 1717, 1, 0, 0, 0, 1813, 1718, 1, 0, 0, 0, 1813, 1719, 1, 0, 0, 0, 1813, 1720, 1, 0, 0, 0, 1813, 1721, 1, 0, 0, 0, 1813, 1722, 1, 0, 0, 0, 1813, 1724, 1, 0, 0, 0, 1813, 1726, 1, 0, 0, 0, 1813, 1731, 1, 0, 0, 0, 1813, 1743, 1, 0, 0, 0, 1813, 1762, 1, 0, 0, 0, 1813, 1763, 1, 0, 0, 0, 1813, 1764, 1, 0, 0, 0, 1813, 1775, 1, 0, 0, 0, 1813, 1784, 1, 0, 0, 0, 1813, 1797, 1, 0, 0, 0, 1813, 1808, 1, 0, 0, 0, 1814, 221, 1, 0, 0, 0, 1815, 1816, 5, 120, 0, 0, 1816, 1825, 3, 230, 115, 0, 1817, 1824, 3, 224, 112, 0, 1818, 1819, 5, 121, 0, 0, 1819, 1820, 5, 29, 0, 0, 1820, 1821, 3, 250, 125, 0, 1821, 1822, 5, 30, 0, 0, 1822, 1824, 1, 0, 0, 0, 1823, 1817, 1, 0, 0, 0, 1823, 1818, 1, 0, 0, 0, 1824, 1827, 1, 0, 0, 0, 1825, 1823, 1, 0, 0, 0, 1825, 1826, 1, 0, 0, 0, 1826, 1828, 1, 0, 0, 0, 1827, 1825, 1, 0, 0, 0, 1828, 1829, 3, 160, 80, 0, 1829, 1830, 3, 2, 1, 0, 1830, 1831, 3, 226, 113, 0, 1831, 1832, 3, 228, 114, 0, 1832, 223, 1, 0, 0, 0, 1833, 1853, 5, 122, 0, 0, 1834, 1853, 5, 50, 0, 0, 1835, 1853, 5, 51, 0, 0, 1836, 1853, 5, 62, 0, 0, 1837, 1853, 5, 123, 0, 0, 1838, 1853, 5, 68, 0, 0, 1839, 1853, 5, 67, 0, 0, 1840, 1853, 5, 63, 0, 0, 1841, 1853, 5, 64, 0, 0, 1842, 1853, 5, 65, 0, 0, 1843, 1853, 5, 124, 0, 0, 1844, 1853, 5, 125, 0, 0, 1845, 1853, 5, 126, 0, 0, 1846, 1853, 5, 127, 0, 0, 1847, 1848, 5, 69, 0, 0, 1848, 1849, 5, 29, 0, 0, 1849, 1850, 3, 32, 16, 0, 1850, 1851, 5, 30, 0, 0, 1851, 1853, 1, 0, 0, 0, 1852, 1833, 1, 0, 0, 0, 1852, 1834, 1, 0, 0, 0, 1852, 1835, 1, 0, 0, 0, 1852, 1836, 1, 0, 0, 0, 1852, 1837, 1, 0, 0, 0, 1852, 1838, 1, 0, 0, 0, 1852, 1839, 1, 0, 0, 0, 1852, 1840, 1, 0, 0, 0, 1852, 1841, 1, 0, 0, 0, 1852, 1842, 1, 0, 0, 0, 1852, 1843, 1, 0, 0, 0, 1852, 1844, 1, 0, 0, 0, 1852, 1845, 1, 0, 0, 0, 1852, 1846, 1, 0, 0, 0, 1852, 1847, 1, 0, 0, 0, 1853, 225, 1, 0, 0, 0, 1854, 1860, 1, 0, 0, 0, 1855, 1856, 5, 43, 0, 0, 1856, 1860, 3, 0, 0, 0, 1857, 1858, 5, 43, 0, 0, 1858, 1860, 3, 32, 16, 0, 1859, 1854, 1, 0, 0, 0, 1859, 1855, 1, 0, 0, 0, 1859, 1857, 1, 0, 0, 0, 1860, 227, 1, 0, 0, 0, 1861, 1865, 1, 0, 0, 0, 1862, 1863, 5, 35, 0, 0, 1863, 1865, 3, 316, 158, 0, 1864, 1861, 1, 0, 0, 0, 1864, 1862, 1, 0, 0, 0, 1865, 229, 1, 0, 0, 0, 1866, 1872, 1, 0, 0, 0, 1867, 1868, 5, 41, 0, 0, 1868, 1869, 3, 32, 16, 0, 1869, 1870, 5, 42, 0, 0, 1870, 1872, 1, 0, 0, 0, 1871, 1866, 1, 0, 0, 0, 1871, 1867, 1, 0, 0, 0, 1872, 231, 1, 0, 0, 0, 1873, 1877, 5, 128, 0, 0, 1874, 1876, 3, 234, 117, 0, 1875, 1874, 1, 0, 0, 0, 1876, 1879, 1, 0, 0, 0, 1877, 1875, 1, 0, 0, 0, 1877, 1878, 1, 0, 0, 0, 1878, 1880, 1, 0, 0, 0, 1879, 1877, 1, 0, 0, 0, 1880, 1881, 3, 146, 73, 0, 1881, 1882, 3, 2, 1, 0, 1882, 1892, 1, 0, 0, 0, 1883, 1887, 5, 128, 0, 0, 1884, 1886, 3, 234, 117, 0, 1885, 1884, 1, 0, 0, 0, 1886, 1889, 1, 0, 0, 0, 1887, 1885, 1, 0, 0, 0, 1887, 1888, 1, 0, 0, 0, 1888, 1890, 1, 0, 0, 0, 1889, 1887, 1, 0, 0, 0, 1890, 1892, 3, 2, 1, 0, 1891, 1873, 1, 0, 0, 0, 1891, 1883, 1, 0, 0, 0, 1892, 233, 1, 0, 0, 0, 1893, 1894, 7, 11, 0, 0, 1894, 235, 1, 0, 0, 0, 1895, 1897, 3, 238, 119, 0, 1896, 1895, 1, 0, 0, 0, 1897, 1900, 1, 0, 0, 0, 1898, 1896, 1, 0, 0, 0, 1898, 1899, 1, 0, 0, 0, 1899, 237, 1, 0, 0, 0, 1900, 1898, 1, 0, 0, 0, 1901, 1902, 5, 129, 0, 0, 1902, 1914, 3, 190, 95, 0, 1903, 1904, 5, 130, 0, 0, 1904, 1914, 3, 190, 95, 0, 1905, 1906, 5, 131, 0, 0, 1906, 1914, 3, 190, 95, 0, 1907, 1908, 5, 132, 0, 0, 1908, 1914, 3, 190, 95, 0, 1909, 1914, 3, 88, 44, 0, 1910, 1914, 3, 342, 171, 0, 1911, 1914, 3, 26, 13, 0, 1912, 1914, 3, 40, 20, 0, 1913, 1901, 1, 0, 0, 0, 1913, 1903, 1, 0, 0, 0, 1913, 1905, 1, 0, 0, 0, 1913, 1907, 1, 0, 0, 0, 1913, 1909, 1, 0, 0, 0, 1913, 1910, 1, 0, 0, 0, 1913, 1911, 1, 0, 0, 0, 1913, 1912, 1, 0, 0, 0, 1914, 239, 1, 0, 0, 0, 1915, 1919, 5, 133, 0, 0, 1916, 1918, 3, 242, 121, 0, 1917, 1916, 1, 0, 0, 0, 1918, 1921, 1, 0, 0, 0, 1919, 1917, 1, 0, 0, 0, 1919, 1920, 1, 0, 0, 0, 1920, 1922, 1, 0, 0, 0, 1921, 1919, 1, 0, 0, 0, 1922, 1923, 3, 192, 96, 0, 1923, 1924, 3, 160, 80, 0, 1924, 1925, 3, 2, 1, 0, 1925, 1926, 3, 134, 67, 0, 1926, 1927, 3, 228, 114, 0, 1927, 241, 1, 0, 0, 0, 1928, 1929, 7, 11, 0, 0, 1929, 243, 1, 0, 0, 0, 1930, 1932, 3, 246, 123, 0, 1931, 1930, 1, 0, 0, 0, 1932, 1935, 1, 0, 0, 0, 1933, 1931, 1, 0, 0, 0, 1933, 1934, 1, 0, 0, 0, 1934, 245, 1, 0, 0, 0, 1935, 1933, 1, 0, 0, 0, 1936, 1937, 5, 134, 0, 0, 1937, 1947, 3, 190, 95, 0, 1938, 1939, 5, 135, 0, 0, 1939, 1947, 3, 190, 95, 0, 1940, 1941, 5, 132, 0, 0, 1941, 1947, 3, 190, 95, 0, 1942, 1947, 3, 342, 171, 0, 1943, 1947, 3, 88, 44, 0, 1944, 1947, 3, 26, 13, 0, 1945, 1947, 3, 40, 20, 0, 1946, 1936, 1, 0, 0, 0, 1946, 1938, 1, 0, 0, 0, 1946, 1940, 1, 0, 0, 0, 1946, 1942, 1, 0, 0, 0, 1946, 1943, 1, 0, 0, 0, 1946, 1944, 1, 0, 0, 0, 1946, 1945, 1, 0, 0, 0, 1947, 247, 1, 0, 0, 0, 1948, 1955, 1, 0, 0, 0, 1949, 1950, 5, 121, 0, 0, 1950, 1951, 5, 29, 0, 0, 1951, 1952, 3, 250, 125, 0, 1952, 1953, 5, 30, 0, 0, 1953, 1955, 1, 0, 0, 0, 1954, 1948, 1, 0, 0, 0, 1954, 1949, 1, 0, 0, 0, 1955, 249, 1, 0, 0, 0, 1956, 1966, 3, 148, 74, 0, 1957, 1959, 5, 16, 0, 0, 1958, 1960, 3, 314, 157, 0, 1959, 1958, 1, 0, 0, 0, 1960, 1961, 1, 0, 0, 0, 1961, 1959, 1, 0, 0, 0, 1961, 1962, 1, 0, 0, 0, 1962, 1963, 1, 0, 0, 0, 1963, 1964, 5, 17, 0, 0, 1964, 1966, 1, 0, 0, 0, 1965, 1956, 1, 0, 0, 0, 1965, 1957, 1, 0, 0, 0, 1966, 251, 1, 0, 0, 0, 1967, 1969, 3, 254, 127, 0, 1968, 1967, 1, 0, 0, 0, 1969, 1972, 1, 0, 0, 0, 1970, 1968, 1, 0, 0, 0, 1970, 1971, 1, 0, 0, 0, 1971, 253, 1, 0, 0, 0, 1972, 1970, 1, 0, 0, 0, 1973, 1974, 5, 41, 0, 0, 1974, 1975, 5, 136, 0, 0, 1975, 1987, 5, 42, 0, 0, 1976, 1977, 5, 41, 0, 0, 1977, 1978, 5, 137, 0, 0, 1978, 1987, 5, 42, 0, 0, 1979, 1980, 5, 41, 0, 0, 1980, 1981, 5, 138, 0, 0, 1981, 1987, 5, 42, 0, 0, 1982, 1983, 5, 41, 0, 0, 1983, 1984, 3, 32, 16, 0, 1984, 1985, 5, 42, 0, 0, 1985, 1987, 1, 0, 0, 0, 1986, 1973, 1, 0, 0, 0, 1986, 1976, 1, 0, 0, 0, 1986, 1979, 1, 0, 0, 0, 1986, 1982, 1, 0, 0, 0, 1987, 255, 1, 0, 0, 0, 1988, 1993, 5, 139, 0, 0, 1989, 1992, 3, 258, 129, 0, 1990, 1992, 3, 260, 130, 0, 1991, 1989, 1, 0, 0, 0, 1991, 1990, 1, 0, 0, 0, 1992, 1995, 1, 0, 0, 0, 1993, 1991, 1, 0, 0, 0, 1993, 1994, 1, 0, 0, 0, 1994, 1996, 1, 0, 0, 0, 1995, 1993, 1, 0, 0, 0, 1996, 1997, 3, 192, 96, 0, 1997, 1998, 3, 252, 126, 0, 1998, 1999, 3, 160, 80, 0, 1999, 2000, 3, 248, 124, 0, 2000, 2001, 3, 264, 132, 0, 2001, 2002, 3, 204, 102, 0, 2002, 2006, 3, 134, 67, 0, 2003, 2005, 3, 266, 133, 0, 2004, 2003, 1, 0, 0, 0, 2005, 2008, 1, 0, 0, 0, 2006, 2004, 1, 0, 0, 0, 2006, 2007, 1, 0, 0, 0, 2007, 257, 1, 0, 0, 0, 2008, 2006, 1, 0, 0, 0, 2009, 2033, 5, 122, 0, 0, 2010, 2033, 5, 50, 0, 0, 2011, 2033, 5, 51, 0, 0, 2012, 2033, 5, 62, 0, 0, 2013, 2033, 5, 140, 0, 0, 2014, 2033, 5, 67, 0, 0, 2015, 2033, 5, 141, 0, 0, 2016, 2033, 5, 142, 0, 0, 2017, 2033, 5, 53, 0, 0, 2018, 2033, 5, 63, 0, 0, 2019, 2033, 5, 64, 0, 0, 2020, 2033, 5, 65, 0, 0, 2021, 2033, 5, 124, 0, 0, 2022, 2033, 5, 143, 0, 0, 2023, 2033, 5, 144, 0, 0, 2024, 2033, 5, 68, 0, 0, 2025, 2033, 5, 145, 0, 0, 2026, 2033, 5, 146, 0, 0, 2027, 2028, 5, 69, 0, 0, 2028, 2029, 5, 29, 0, 0, 2029, 2030, 3, 32, 16, 0, 2030, 2031, 5, 30, 0, 0, 2031, 2033, 1, 0, 0, 0, 2032, 2009, 1, 0, 0, 0, 2032, 2010, 1, 0, 0, 0, 2032, 2011, 1, 0, 0, 0, 2032, 2012, 1, 0, 0, 0, 2032, 2013, 1, 0, 0, 0, 2032, 2014, 1, 0, 0, 0, 2032, 2015, 1, 0, 0, 0, 2032, 2016, 1, 0, 0, 0, 2032, 2017, 1, 0, 0, 0, 2032, 2018, 1, 0, 0, 0, 2032, 2019, 1, 0, 0, 0, 2032, 2020, 1, 0, 0, 0, 2032, 2021, 1, 0, 0, 0, 2032, 2022, 1, 0, 0, 0, 2032, 2023, 1, 0, 0, 0, 2032, 2024, 1, 0, 0, 0, 2032, 2025, 1, 0, 0, 0, 2032, 2026, 1, 0, 0, 0, 2032, 2027, 1, 0, 0, 0, 2033, 259, 1, 0, 0, 0, 2034, 2035, 5, 147, 0, 0, 2035, 2041, 5, 29, 0, 0, 2036, 2039, 3, 6, 3, 0, 2037, 2038, 5, 33, 0, 0, 2038, 2040, 3, 6, 3, 0, 2039, 2037, 1, 0, 0, 0, 2039, 2040, 1, 0, 0, 0, 2040, 2042, 1, 0, 0, 0, 2041, 2036, 1, 0, 0, 0, 2041, 2042, 1, 0, 0, 0, 2042, 2046, 1, 0, 0, 0, 2043, 2045, 3, 262, 131, 0, 2044, 2043, 1, 0, 0, 0, 2045, 2048, 1, 0, 0, 0, 2046, 2044, 1, 0, 0, 0, 2046, 2047, 1, 0, 0, 0, 2047, 2049, 1, 0, 0, 0, 2048, 2046, 1, 0, 0, 0, 2049, 2053, 5, 30, 0, 0, 2050, 2051, 5, 147, 0, 0, 2051, 2053, 5, 84, 0, 0, 2052, 2034, 1, 0, 0, 0, 2052, 2050, 1, 0, 0, 0, 2053, 261, 1, 0, 0, 0, 2054, 2082, 5, 148, 0, 0, 2055, 2082, 5, 223, 0, 0, 2056, 2082, 5, 56, 0, 0, 2057, 2082, 5, 57, 0, 0, 2058, 2082, 5, 149, 0, 0, 2059, 2082, 5, 150, 0, 0, 2060, 2082, 5, 247, 0, 0, 2061, 2082, 5, 248, 0, 0, 2062, 2082, 5, 249, 0, 0, 2063, 2082, 5, 250, 0, 0, 2064, 2065, 5, 151, 0, 0, 2065, 2066, 5, 74, 0, 0, 2066, 2082, 5, 152, 0, 0, 2067, 2068, 5, 151, 0, 0, 2068, 2069, 5, 74, 0, 0, 2069, 2082, 5, 153, 0, 0, 2070, 2071, 5, 154, 0, 0, 2071, 2072, 5, 74, 0, 0, 2072, 2082, 5, 152, 0, 0, 2073, 2074, 5, 154, 0, 0, 2074, 2075, 5, 74, 0, 0, 2075, 2082, 5, 153, 0, 0, 2076, 2077, 5, 69, 0, 0, 2077, 2078, 5, 29, 0, 0, 2078, 2079, 3, 32, 16, 0, 2079, 2080, 5, 30, 0, 0, 2080, 2082, 1, 0, 0, 0, 2081, 2054, 1, 0, 0, 0, 2081, 2055, 1, 0, 0, 0, 2081, 2056, 1, 0, 0, 0, 2081, 2057, 1, 0, 0, 0, 2081, 2058, 1, 0, 0, 0, 2081, 2059, 1, 0, 0, 0, 2081, 2060, 1, 0, 0, 0, 2081, 2061, 1, 0, 0, 0, 2081, 2062, 1, 0, 0, 0, 2081, 2063, 1, 0, 0, 0, 2081, 2064, 1, 0, 0, 0, 2081, 2067, 1, 0, 0, 0, 2081, 2070, 1, 0, 0, 0, 2081, 2073, 1, 0, 0, 0, 2081, 2076, 1, 0, 0, 0, 2082, 263, 1, 0, 0, 0, 2083, 2087, 5, 115, 0, 0, 2084, 2087, 5, 155, 0, 0, 2085, 2087, 3, 2, 1, 0, 2086, 2083, 1, 0, 0, 0, 2086, 2084, 1, 0, 0, 0, 2086, 2085, 1, 0, 0, 0, 2087, 265, 1, 0, 0, 0, 2088, 2110, 5, 1, 0, 0, 2089, 2110, 5, 2, 0, 0, 2090, 2110, 5, 156, 0, 0, 2091, 2110, 5, 3, 0, 0, 2092, 2110, 5, 4, 0, 0, 2093, 2110, 5, 246, 0, 0, 2094, 2110, 5, 5, 0, 0, 2095, 2110, 5, 6, 0, 0, 2096, 2110, 5, 7, 0, 0, 2097, 2110, 5, 8, 0, 0, 2098, 2110, 5, 9, 0, 0, 2099, 2110, 5, 10, 0, 0, 2100, 2110, 5, 11, 0, 0, 2101, 2110, 5, 12, 0, 0, 2102, 2110, 5, 13, 0, 0, 2103, 2110, 5, 14, 0, 0, 2104, 2105, 5, 69, 0, 0, 2105, 2106, 5, 29, 0, 0, 2106, 2107, 3, 32, 16, 0, 2107, 2108, 5, 30, 0, 0, 2108, 2110, 1, 0, 0, 0, 2109, 2088, 1, 0, 0, 0, 2109, 2089, 1, 0, 0, 0, 2109, 2090, 1, 0, 0, 0, 2109, 2091, 1, 0, 0, 0, 2109, 2092, 1, 0, 0, 0, 2109, 2093, 1, 0, 0, 0, 2109, 2094, 1, 0, 0, 0, 2109, 2095, 1, 0, 0, 0, 2109, 2096, 1, 0, 0, 0, 2109, 2097, 1, 0, 0, 0, 2109, 2098, 1, 0, 0, 0, 2109, 2099, 1, 0, 0, 0, 2109, 2100, 1, 0, 0, 0, 2109, 2101, 1, 0, 0, 0, 2109, 2102, 1, 0, 0, 0, 2109, 2103, 1, 0, 0, 0, 2109, 2104, 1, 0, 0, 0, 2110, 267, 1, 0, 0, 0, 2111, 2113, 3, 270, 135, 0, 2112, 2111, 1, 0, 0, 0, 2113, 2116, 1, 0, 0, 0, 2114, 2112, 1, 0, 0, 0, 2114, 2115, 1, 0, 0, 0, 2115, 269, 1, 0, 0, 0, 2116, 2114, 1, 0, 0, 0, 2117, 2226, 3, 126, 63, 0, 2118, 2119, 5, 295, 0, 0, 2119, 2226, 3, 32, 16, 0, 2120, 2226, 3, 278, 139, 0, 2121, 2122, 5, 296, 0, 0, 2122, 2226, 3, 32, 16, 0, 2123, 2124, 5, 299, 0, 0, 2124, 2226, 3, 134, 67, 0, 2125, 2126, 5, 299, 0, 0, 2126, 2127, 5, 157, 0, 0, 2127, 2226, 3, 134, 67, 0, 2128, 2226, 5, 297, 0, 0, 2129, 2226, 5, 298, 0, 0, 2130, 2226, 3, 296, 148, 0, 2131, 2226, 3, 272, 136, 0, 2132, 2226, 3, 174, 87, 0, 2133, 2226, 3, 88, 44, 0, 2134, 2226, 3, 26, 13, 0, 2135, 2226, 3, 274, 137, 0, 2136, 2226, 3, 40, 20, 0, 2137, 2138, 5, 300, 0, 0, 2138, 2139, 5, 41, 0, 0, 2139, 2140, 3, 32, 16, 0, 2140, 2141, 5, 42, 0, 0, 2141, 2226, 1, 0, 0, 0, 2142, 2143, 5, 300, 0, 0, 2143, 2144, 5, 41, 0, 0, 2144, 2145, 3, 32, 16, 0, 2145, 2146, 5, 42, 0, 0, 2146, 2147, 5, 33, 0, 0, 2147, 2148, 3, 0, 0, 0, 2148, 2226, 1, 0, 0, 0, 2149, 2150, 5, 302, 0, 0, 2150, 2151, 3, 32, 16, 0, 2151, 2152, 5, 74, 0, 0, 2152, 2153, 3, 32, 16, 0, 2153, 2226, 1, 0, 0, 0, 2154, 2155, 5, 301, 0, 0, 2155, 2156, 3, 146, 73, 0, 2156, 2157, 5, 175, 0, 0, 2157, 2158, 3, 264, 132, 0, 2158, 2226, 1, 0, 0, 0, 2159, 2160, 5, 301, 0, 0, 2160, 2161, 5, 225, 0, 0, 2161, 2162, 3, 192, 96, 0, 2162, 2163, 3, 160, 80, 0, 2163, 2164, 3, 146, 73, 0, 2164, 2165, 5, 175, 0, 0, 2165, 2166, 3, 264, 132, 0, 2166, 2167, 3, 216, 108, 0, 2167, 2168, 3, 134, 67, 0, 2168, 2226, 1, 0, 0, 0, 2169, 2226, 3, 276, 138, 0, 2170, 2171, 5, 254, 0, 0, 2171, 2172, 5, 195, 0, 0, 2172, 2173, 5, 41, 0, 0, 2173, 2174, 3, 32, 16, 0, 2174, 2178, 5, 42, 0, 0, 2175, 2177, 3, 342, 171, 0, 2176, 2175, 1, 0, 0, 0, 2177, 2180, 1, 0, 0, 0, 2178, 2176, 1, 0, 0, 0, 2178, 2179, 1, 0, 0, 0, 2179, 2226, 1, 0, 0, 0, 2180, 2178, 1, 0, 0, 0, 2181, 2182, 5, 254, 0, 0, 2182, 2183, 5, 195, 0, 0, 2183, 2187, 3, 2, 1, 0, 2184, 2186, 3, 342, 171, 0, 2185, 2184, 1, 0, 0, 0, 2186, 2189, 1, 0, 0, 0, 2187, 2185, 1, 0, 0, 0, 2187, 2188, 1, 0, 0, 0, 2188, 2226, 1, 0, 0, 0, 2189, 2187, 1, 0, 0, 0, 2190, 2191, 5, 254, 0, 0, 2191, 2192, 5, 255, 0, 0, 2192, 2193, 5, 41, 0, 0, 2193, 2194, 3, 32, 16, 0, 2194, 2195, 5, 42, 0, 0, 2195, 2196, 5, 27, 0, 0, 2196, 2200, 3, 146, 73, 0, 2197, 2199, 3, 342, 171, 0, 2198, 2197, 1, 0, 0, 0, 2199, 2202, 1, 0, 0, 0, 2200, 2198, 1, 0, 0, 0, 2200, 2201, 1, 0, 0, 0, 2201, 2226, 1, 0, 0, 0, 2202, 2200, 1, 0, 0, 0, 2203, 2204, 5, 254, 0, 0, 2204, 2205, 5, 255, 0, 0, 2205, 2206, 3, 2, 1, 0, 2206, 2207, 5, 27, 0, 0, 2207, 2211, 3, 146, 73, 0, 2208, 2210, 3, 342, 171, 0, 2209, 2208, 1, 0, 0, 0, 2210, 2213, 1, 0, 0, 0, 2211, 2209, 1, 0, 0, 0, 2211, 2212, 1, 0, 0, 0, 2212, 2226, 1, 0, 0, 0, 2213, 2211, 1, 0, 0, 0, 2214, 2215, 5, 254, 0, 0, 2215, 2216, 5, 41, 0, 0, 2216, 2217, 3, 32, 16, 0, 2217, 2218, 5, 42, 0, 0, 2218, 2222, 3, 228, 114, 0, 2219, 2221, 3, 342, 171, 0, 2220, 2219, 1, 0, 0, 0, 2221, 2224, 1, 0, 0, 0, 2222, 2220, 1, 0, 0, 0, 2222, 2223, 1, 0, 0, 0, 2223, 2226, 1, 0, 0, 0, 2224, 2222, 1, 0, 0, 0, 2225, 2117, 1, 0, 0, 0, 2225, 2118, 1, 0, 0, 0, 2225, 2120, 1, 0, 0, 0, 2225, 2121, 1, 0, 0, 0, 2225, 2123, 1, 0, 0, 0, 2225, 2125, 1, 0, 0, 0, 2225, 2128, 1, 0, 0, 0, 2225, 2129, 1, 0, 0, 0, 2225, 2130, 1, 0, 0, 0, 2225, 2131, 1, 0, 0, 0, 2225, 2132, 1, 0, 0, 0, 2225, 2133, 1, 0, 0, 0, 2225, 2134, 1, 0, 0, 0, 2225, 2135, 1, 0, 0, 0, 2225, 2136, 1, 0, 0, 0, 2225, 2137, 1, 0, 0, 0, 2225, 2142, 1, 0, 0, 0, 2225, 2149, 1, 0, 0, 0, 2225, 2154, 1, 0, 0, 0, 2225, 2159, 1, 0, 0, 0, 2225, 2169, 1, 0, 0, 0, 2225, 2170, 1, 0, 0, 0, 2225, 2181, 1, 0, 0, 0, 2225, 2190, 1, 0, 0, 0, 2225, 2203, 1, 0, 0, 0, 2225, 2214, 1, 0, 0, 0, 2226, 271, 1, 0, 0, 0, 2227, 2228, 3, 0, 0, 0, 2228, 2229, 5, 74, 0, 0, 2229, 273, 1, 0, 0, 0, 2230, 2233, 3, 44, 22, 0, 2231, 2233, 3, 46, 23, 0, 2232, 2230, 1, 0, 0, 0, 2232, 2231, 1, 0, 0, 0, 2233, 275, 1, 0, 0, 0, 2234, 2235, 5, 16, 0, 0, 2235, 2236, 3, 268, 134, 0, 2236, 2237, 5, 17, 0, 0, 2237, 277, 1, 0, 0, 0, 2238, 2239, 3, 282, 141, 0, 2239, 2240, 3, 280, 140, 0, 2240, 279, 1, 0, 0, 0, 2241, 2243, 3, 284, 142, 0, 2242, 2241, 1, 0, 0, 0, 2243, 2244, 1, 0, 0, 0, 2244, 2242, 1, 0, 0, 0, 2244, 2245, 1, 0, 0, 0, 2245, 281, 1, 0, 0, 0, 2246, 2247, 5, 158, 0, 0, 2247, 2259, 3, 276, 138, 0, 2248, 2249, 5, 158, 0, 0, 2249, 2250, 3, 0, 0, 0, 2250, 2251, 5, 159, 0, 0, 2251, 2252, 3, 0, 0, 0, 2252, 2259, 1, 0, 0, 0, 2253, 2254, 5, 158, 0, 0, 2254, 2255, 3, 32, 16, 0, 2255, 2256, 5, 159, 0, 0, 2256, 2257, 3, 32, 16, 0, 2257, 2259, 1, 0, 0, 0, 2258, 2246, 1, 0, 0, 0, 2258, 2248, 1, 0, 0, 0, 2258, 2253, 1, 0, 0, 0, 2259, 283, 1, 0, 0, 0, 2260, 2261, 3, 288, 144, 0, 2261, 2262, 3, 294, 147, 0, 2262, 2273, 1, 0, 0, 0, 2263, 2264, 3, 286, 143, 0, 2264, 2265, 3, 294, 147, 0, 2265, 2273, 1, 0, 0, 0, 2266, 2267, 3, 290, 145, 0, 2267, 2268, 3, 294, 147, 0, 2268, 2273, 1, 0, 0, 0, 2269, 2270, 3, 292, 146, 0, 2270, 2271, 3, 294, 147, 0, 2271, 2273, 1, 0, 0, 0, 2272, 2260, 1, 0, 0, 0, 2272, 2263, 1, 0, 0, 0, 2272, 2266, 1, 0, 0, 0, 2272, 2269, 1, 0, 0, 0, 2273, 285, 1, 0, 0, 0, 2274, 2275, 5, 160, 0, 0, 2275, 2281, 3, 276, 138, 0, 2276, 2277, 5, 160, 0, 0, 2277, 2281, 3, 0, 0, 0, 2278, 2279, 5, 160, 0, 0, 2279, 2281, 3, 32, 16, 0, 2280, 2274, 1, 0, 0, 0, 2280, 2276, 1, 0, 0, 0, 2280, 2278, 1, 0, 0, 0, 2281, 287, 1, 0, 0, 0, 2282, 2283, 5, 161, 0, 0, 2283, 2284, 3, 146, 73, 0, 2284, 289, 1, 0, 0, 0, 2285, 2286, 5, 162, 0, 0, 2286, 291, 1, 0, 0, 0, 2287, 2288, 5, 163, 0, 0, 2288, 293, 1, 0, 0, 0, 2289, 2301, 3, 276, 138, 0, 2290, 2291, 5, 164, 0, 0, 2291, 2292, 3, 0, 0, 0, 2292, 2293, 5, 159, 0, 0, 2293, 2294, 3, 0, 0, 0, 2294, 2301, 1, 0, 0, 0, 2295, 2296, 5, 164, 0, 0, 2296, 2297, 3, 32, 16, 0, 2297, 2298, 5, 159, 0, 0, 2298, 2299, 3, 32, 16, 0, 2299, 2301, 1, 0, 0, 0, 2300, 2289, 1, 0, 0, 0, 2300, 2290, 1, 0, 0, 0, 2300, 2295, 1, 0, 0, 0, 2301, 295, 1, 0, 0, 0, 2302, 2303, 3, 298, 149, 0, 2303, 2304, 3, 302, 151, 0, 2304, 297, 1, 0, 0, 0, 2305, 2306, 5, 165, 0, 0, 2306, 2307, 3, 300, 150, 0, 2307, 2308, 3, 0, 0, 0, 2308, 2309, 5, 35, 0, 0, 2309, 2313, 1, 0, 0, 0, 2310, 2311, 5, 165, 0, 0, 2311, 2313, 3, 300, 150, 0, 2312, 2305, 1, 0, 0, 0, 2312, 2310, 1, 0, 0, 0, 2313, 299, 1, 0, 0, 0, 2314, 2318, 1, 0, 0, 0, 2315, 2318, 5, 166, 0, 0, 2316, 2318, 5, 2, 0, 0, 2317, 2314, 1, 0, 0, 0, 2317, 2315, 1, 0, 0, 0, 2317, 2316, 1, 0, 0, 0, 2318, 301, 1, 0, 0, 0, 2319, 2320, 5, 16, 0, 0, 2320, 2321, 3, 304, 152, 0, 2321, 2322, 5, 17, 0, 0, 2322, 2329, 1, 0, 0, 0, 2323, 2325, 3, 308, 154, 0, 2324, 2323, 1, 0, 0, 0, 2325, 2326, 1, 0, 0, 0, 2326, 2324, 1, 0, 0, 0, 2326, 2327, 1, 0, 0, 0, 2327, 2329, 1, 0, 0, 0, 2328, 2319, 1, 0, 0, 0, 2328, 2324, 1, 0, 0, 0, 2329, 303, 1, 0, 0, 0, 2330, 2331, 3, 308, 154, 0, 2331, 2332, 5, 27, 0, 0, 2332, 2334, 1, 0, 0, 0, 2333, 2330, 1, 0, 0, 0, 2334, 2337, 1, 0, 0, 0, 2335, 2333, 1, 0, 0, 0, 2335, 2336, 1, 0, 0, 0, 2336, 2338, 1, 0, 0, 0, 2337, 2335, 1, 0, 0, 0, 2338, 2339, 3, 308, 154, 0, 2339, 305, 1, 0, 0, 0, 2340, 2346, 1, 0, 0, 0, 2341, 2342, 5, 41, 0, 0, 2342, 2343, 3, 32, 16, 0, 2343, 2344, 5, 42, 0, 0, 2344, 2346, 1, 0, 0, 0, 2345, 2340, 1, 0, 0, 0, 2345, 2341, 1, 0, 0, 0, 2346, 307, 1, 0, 0, 0, 2347, 2348, 5, 180, 0, 0, 2348, 2349, 5, 261, 0, 0, 2349, 2350, 5, 29, 0, 0, 2350, 2351, 3, 6, 3, 0, 2351, 2352, 5, 30, 0, 0, 2352, 2414, 1, 0, 0, 0, 2353, 2354, 5, 259, 0, 0, 2354, 2355, 5, 29, 0, 0, 2355, 2356, 3, 0, 0, 0, 2356, 2357, 5, 30, 0, 0, 2357, 2414, 1, 0, 0, 0, 2358, 2359, 5, 259, 0, 0, 2359, 2414, 3, 0, 0, 0, 2360, 2361, 5, 83, 0, 0, 2361, 2362, 5, 29, 0, 0, 2362, 2363, 3, 312, 156, 0, 2363, 2364, 5, 30, 0, 0, 2364, 2414, 1, 0, 0, 0, 2365, 2366, 5, 187, 0, 0, 2366, 2367, 5, 29, 0, 0, 2367, 2368, 3, 36, 18, 0, 2368, 2369, 5, 30, 0, 0, 2369, 2370, 3, 306, 153, 0, 2370, 2414, 1, 0, 0, 0, 2371, 2372, 5, 188, 0, 0, 2372, 2373, 5, 29, 0, 0, 2373, 2374, 3, 36, 18, 0, 2374, 2375, 5, 30, 0, 0, 2375, 2376, 3, 306, 153, 0, 2376, 2414, 1, 0, 0, 0, 2377, 2378, 5, 186, 0, 0, 2378, 2379, 5, 29, 0, 0, 2379, 2380, 3, 34, 17, 0, 2380, 2381, 5, 30, 0, 0, 2381, 2382, 3, 306, 153, 0, 2382, 2414, 1, 0, 0, 0, 2383, 2384, 5, 185, 0, 0, 2384, 2385, 5, 29, 0, 0, 2385, 2386, 3, 32, 16, 0, 2386, 2387, 5, 30, 0, 0, 2387, 2388, 3, 306, 153, 0, 2388, 2414, 1, 0, 0, 0, 2389, 2390, 5, 184, 0, 0, 2390, 2391, 5, 29, 0, 0, 2391, 2392, 3, 32, 16, 0, 2392, 2393, 5, 30, 0, 0, 2393, 2394, 3, 306, 153, 0, 2394, 2414, 1, 0, 0, 0, 2395, 2396, 5, 183, 0, 0, 2396, 2397, 5, 29, 0, 0, 2397, 2398, 3, 32, 16, 0, 2398, 2399, 5, 30, 0, 0, 2399, 2400, 3, 306, 153, 0, 2400, 2414, 1, 0, 0, 0, 2401, 2402, 5, 187, 0, 0, 2402, 2414, 3, 306, 153, 0, 2403, 2404, 5, 188, 0, 0, 2404, 2414, 3, 306, 153, 0, 2405, 2406, 5, 186, 0, 0, 2406, 2414, 3, 306, 153, 0, 2407, 2408, 5, 185, 0, 0, 2408, 2414, 3, 306, 153, 0, 2409, 2410, 5, 184, 0, 0, 2410, 2414, 3, 306, 153, 0, 2411, 2412, 5, 183, 0, 0, 2412, 2414, 3, 306, 153, 0, 2413, 2347, 1, 0, 0, 0, 2413, 2353, 1, 0, 0, 0, 2413, 2358, 1, 0, 0, 0, 2413, 2360, 1, 0, 0, 0, 2413, 2365, 1, 0, 0, 0, 2413, 2371, 1, 0, 0, 0, 2413, 2377, 1, 0, 0, 0, 2413, 2383, 1, 0, 0, 0, 2413, 2389, 1, 0, 0, 0, 2413, 2395, 1, 0, 0, 0, 2413, 2401, 1, 0, 0, 0, 2413, 2403, 1, 0, 0, 0, 2413, 2405, 1, 0, 0, 0, 2413, 2407, 1, 0, 0, 0, 2413, 2409, 1, 0, 0, 0, 2413, 2411, 1, 0, 0, 0, 2414, 309, 1, 0, 0, 0, 2415, 2416, 5, 187, 0, 0, 2416, 2417, 5, 29, 0, 0, 2417, 2418, 3, 36, 18, 0, 2418, 2419, 5, 30, 0, 0, 2419, 2491, 1, 0, 0, 0, 2420, 2421, 5, 188, 0, 0, 2421, 2422, 5, 29, 0, 0, 2422, 2423, 3, 36, 18, 0, 2423, 2424, 5, 30, 0, 0, 2424, 2491, 1, 0, 0, 0, 2425, 2426, 5, 187, 0, 0, 2426, 2427, 5, 29, 0, 0, 2427, 2428, 3, 32, 16, 0, 2428, 2429, 5, 30, 0, 0, 2429, 2491, 1, 0, 0, 0, 2430, 2431, 5, 188, 0, 0, 2431, 2432, 5, 29, 0, 0, 2432, 2433, 3, 34, 17, 0, 2433, 2434, 5, 30, 0, 0, 2434, 2491, 1, 0, 0, 0, 2435, 2436, 5, 186, 0, 0, 2436, 2437, 5, 29, 0, 0, 2437, 2438, 3, 34, 17, 0, 2438, 2439, 5, 30, 0, 0, 2439, 2491, 1, 0, 0, 0, 2440, 2441, 5, 185, 0, 0, 2441, 2442, 5, 29, 0, 0, 2442, 2443, 3, 32, 16, 0, 2443, 2444, 5, 30, 0, 0, 2444, 2491, 1, 0, 0, 0, 2445, 2446, 5, 184, 0, 0, 2446, 2447, 5, 29, 0, 0, 2447, 2448, 3, 32, 16, 0, 2448, 2449, 5, 30, 0, 0, 2449, 2491, 1, 0, 0, 0, 2450, 2451, 5, 183, 0, 0, 2451, 2452, 5, 29, 0, 0, 2452, 2453, 3, 32, 16, 0, 2453, 2454, 5, 30, 0, 0, 2454, 2491, 1, 0, 0, 0, 2455, 2456, 5, 192, 0, 0, 2456, 2457, 5, 29, 0, 0, 2457, 2458, 3, 34, 17, 0, 2458, 2459, 5, 30, 0, 0, 2459, 2491, 1, 0, 0, 0, 2460, 2461, 5, 191, 0, 0, 2461, 2462, 5, 29, 0, 0, 2462, 2463, 3, 32, 16, 0, 2463, 2464, 5, 30, 0, 0, 2464, 2491, 1, 0, 0, 0, 2465, 2466, 5, 190, 0, 0, 2466, 2467, 5, 29, 0, 0, 2467, 2468, 3, 32, 16, 0, 2468, 2469, 5, 30, 0, 0, 2469, 2491, 1, 0, 0, 0, 2470, 2471, 5, 189, 0, 0, 2471, 2472, 5, 29, 0, 0, 2472, 2473, 3, 32, 16, 0, 2473, 2474, 5, 30, 0, 0, 2474, 2491, 1, 0, 0, 0, 2475, 2476, 5, 180, 0, 0, 2476, 2477, 5, 29, 0, 0, 2477, 2478, 3, 32, 16, 0, 2478, 2479, 5, 30, 0, 0, 2479, 2491, 1, 0, 0, 0, 2480, 2481, 5, 182, 0, 0, 2481, 2482, 5, 29, 0, 0, 2482, 2483, 3, 184, 92, 0, 2483, 2484, 5, 30, 0, 0, 2484, 2491, 1, 0, 0, 0, 2485, 2486, 5, 83, 0, 0, 2486, 2487, 5, 29, 0, 0, 2487, 2488, 3, 312, 156, 0, 2488, 2489, 5, 30, 0, 0, 2489, 2491, 1, 0, 0, 0, 2490, 2415, 1, 0, 0, 0, 2490, 2420, 1, 0, 0, 0, 2490, 2425, 1, 0, 0, 0, 2490, 2430, 1, 0, 0, 0, 2490, 2435, 1, 0, 0, 0, 2490, 2440, 1, 0, 0, 0, 2490, 2445, 1, 0, 0, 0, 2490, 2450, 1, 0, 0, 0, 2490, 2455, 1, 0, 0, 0, 2490, 2460, 1, 0, 0, 0, 2490, 2465, 1, 0, 0, 0, 2490, 2470, 1, 0, 0, 0, 2490, 2475, 1, 0, 0, 0, 2490, 2480, 1, 0, 0, 0, 2490, 2485, 1, 0, 0, 0, 2491, 311, 1, 0, 0, 0, 2492, 2494, 3, 314, 157, 0, 2493, 2492, 1, 0, 0, 0, 2494, 2497, 1, 0, 0, 0, 2495, 2493, 1, 0, 0, 0, 2495, 2496, 1, 0, 0, 0, 2496, 313, 1, 0, 0, 0, 2497, 2495, 1, 0, 0, 0, 2498, 2499, 7, 12, 0, 0, 2499, 315, 1, 0, 0, 0, 2500, 2504, 3, 310, 155, 0, 2501, 2504, 3, 6, 3, 0, 2502, 2504, 5, 178, 0, 0, 2503, 2500, 1, 0, 0, 0, 2503, 2501, 1, 0, 0, 0, 2503, 2502, 1, 0, 0, 0, 2504, 317, 1, 0, 0, 0, 2505, 2654, 3, 310, 155, 0, 2506, 2507, 5, 181, 0, 0, 2507, 2508, 5, 29, 0, 0, 2508, 2509, 5, 178, 0, 0, 2509, 2654, 5, 30, 0, 0, 2510, 2511, 5, 181, 0, 0, 2511, 2512, 5, 29, 0, 0, 2512, 2513, 5, 263, 0, 0, 2513, 2654, 5, 30, 0, 0, 2514, 2515, 5, 195, 0, 0, 2515, 2516, 5, 29, 0, 0, 2516, 2517, 5, 38, 0, 0, 2517, 2518, 5, 263, 0, 0, 2518, 2654, 5, 30, 0, 0, 2519, 2520, 5, 195, 0, 0, 2520, 2521, 5, 29, 0, 0, 2521, 2522, 3, 138, 69, 0, 2522, 2523, 5, 30, 0, 0, 2523, 2654, 1, 0, 0, 0, 2524, 2525, 5, 195, 0, 0, 2525, 2526, 5, 29, 0, 0, 2526, 2527, 5, 178, 0, 0, 2527, 2654, 5, 30, 0, 0, 2528, 2529, 5, 196, 0, 0, 2529, 2530, 5, 29, 0, 0, 2530, 2531, 3, 318, 159, 0, 2531, 2532, 5, 30, 0, 0, 2532, 2654, 1, 0, 0, 0, 2533, 2534, 5, 187, 0, 0, 2534, 2535, 5, 41, 0, 0, 2535, 2536, 3, 32, 16, 0, 2536, 2537, 5, 42, 0, 0, 2537, 2538, 5, 29, 0, 0, 2538, 2539, 3, 320, 160, 0, 2539, 2540, 5, 30, 0, 0, 2540, 2654, 1, 0, 0, 0, 2541, 2542, 5, 188, 0, 0, 2542, 2543, 5, 41, 0, 0, 2543, 2544, 3, 32, 16, 0, 2544, 2545, 5, 42, 0, 0, 2545, 2546, 5, 29, 0, 0, 2546, 2547, 3, 322, 161, 0, 2547, 2548, 5, 30, 0, 0, 2548, 2654, 1, 0, 0, 0, 2549, 2550, 5, 186, 0, 0, 2550, 2551, 5, 41, 0, 0, 2551, 2552, 3, 32, 16, 0, 2552, 2553, 5, 42, 0, 0, 2553, 2554, 5, 29, 0, 0, 2554, 2555, 3, 324, 162, 0, 2555, 2556, 5, 30, 0, 0, 2556, 2654, 1, 0, 0, 0, 2557, 2558, 5, 185, 0, 0, 2558, 2559, 5, 41, 0, 0, 2559, 2560, 3, 32, 16, 0, 2560, 2561, 5, 42, 0, 0, 2561, 2562, 5, 29, 0, 0, 2562, 2563, 3, 326, 163, 0, 2563, 2564, 5, 30, 0, 0, 2564, 2654, 1, 0, 0, 0, 2565, 2566, 5, 184, 0, 0, 2566, 2567, 5, 41, 0, 0, 2567, 2568, 3, 32, 16, 0, 2568, 2569, 5, 42, 0, 0, 2569, 2570, 5, 29, 0, 0, 2570, 2571, 3, 328, 164, 0, 2571, 2572, 5, 30, 0, 0, 2572, 2654, 1, 0, 0, 0, 2573, 2574, 5, 183, 0, 0, 2574, 2575, 5, 41, 0, 0, 2575, 2576, 3, 32, 16, 0, 2576, 2577, 5, 42, 0, 0, 2577, 2578, 5, 29, 0, 0, 2578, 2579, 3, 330, 165, 0, 2579, 2580, 5, 30, 0, 0, 2580, 2654, 1, 0, 0, 0, 2581, 2582, 5, 192, 0, 0, 2582, 2583, 5, 41, 0, 0, 2583, 2584, 3, 32, 16, 0, 2584, 2585, 5, 42, 0, 0, 2585, 2586, 5, 29, 0, 0, 2586, 2587, 3, 324, 162, 0, 2587, 2588, 5, 30, 0, 0, 2588, 2654, 1, 0, 0, 0, 2589, 2590, 5, 191, 0, 0, 2590, 2591, 5, 41, 0, 0, 2591, 2592, 3, 32, 16, 0, 2592, 2593, 5, 42, 0, 0, 2593, 2594, 5, 29, 0, 0, 2594, 2595, 3, 326, 163, 0, 2595, 2596, 5, 30, 0, 0, 2596, 2654, 1, 0, 0, 0, 2597, 2598, 5, 190, 0, 0, 2598, 2599, 5, 41, 0, 0, 2599, 2600, 3, 32, 16, 0, 2600, 2601, 5, 42, 0, 0, 2601, 2602, 5, 29, 0, 0, 2602, 2603, 3, 328, 164, 0, 2603, 2604, 5, 30, 0, 0, 2604, 2654, 1, 0, 0, 0, 2605, 2606, 5, 189, 0, 0, 2606, 2607, 5, 41, 0, 0, 2607, 2608, 3, 32, 16, 0, 2608, 2609, 5, 42, 0, 0, 2609, 2610, 5, 29, 0, 0, 2610, 2611, 3, 330, 165, 0, 2611, 2612, 5, 30, 0, 0, 2612, 2654, 1, 0, 0, 0, 2613, 2614, 5, 180, 0, 0, 2614, 2615, 5, 41, 0, 0, 2615, 2616, 3, 32, 16, 0, 2616, 2617, 5, 42, 0, 0, 2617, 2618, 5, 29, 0, 0, 2618, 2619, 3, 328, 164, 0, 2619, 2620, 5, 30, 0, 0, 2620, 2654, 1, 0, 0, 0, 2621, 2622, 5, 182, 0, 0, 2622, 2623, 5, 41, 0, 0, 2623, 2624, 3, 32, 16, 0, 2624, 2625, 5, 42, 0, 0, 2625, 2626, 5, 29, 0, 0, 2626, 2627, 3, 332, 166, 0, 2627, 2628, 5, 30, 0, 0, 2628, 2654, 1, 0, 0, 0, 2629, 2630, 5, 181, 0, 0, 2630, 2631, 5, 41, 0, 0, 2631, 2632, 3, 32, 16, 0, 2632, 2633, 5, 42, 0, 0, 2633, 2634, 5, 29, 0, 0, 2634, 2635, 3, 334, 167, 0, 2635, 2636, 5, 30, 0, 0, 2636, 2654, 1, 0, 0, 0, 2637, 2638, 5, 195, 0, 0, 2638, 2639, 5, 41, 0, 0, 2639, 2640, 3, 32, 16, 0, 2640, 2641, 5, 42, 0, 0, 2641, 2642, 5, 29, 0, 0, 2642, 2643, 3, 336, 168, 0, 2643, 2644, 5, 30, 0, 0, 2644, 2654, 1, 0, 0, 0, 2645, 2646, 5, 196, 0, 0, 2646, 2647, 5, 41, 0, 0, 2647, 2648, 3, 32, 16, 0, 2648, 2649, 5, 42, 0, 0, 2649, 2650, 5, 29, 0, 0, 2650, 2651, 3, 340, 170, 0, 2651, 2652, 5, 30, 0, 0, 2652, 2654, 1, 0, 0, 0, 2653, 2505, 1, 0, 0, 0, 2653, 2506, 1, 0, 0, 0, 2653, 2510, 1, 0, 0, 0, 2653, 2514, 1, 0, 0, 0, 2653, 2519, 1, 0, 0, 0, 2653, 2524, 1, 0, 0, 0, 2653, 2528, 1, 0, 0, 0, 2653, 2533, 1, 0, 0, 0, 2653, 2541, 1, 0, 0, 0, 2653, 2549, 1, 0, 0, 0, 2653, 2557, 1, 0, 0, 0, 2653, 2565, 1, 0, 0, 0, 2653, 2573, 1, 0, 0, 0, 2653, 2581, 1, 0, 0, 0, 2653, 2589, 1, 0, 0, 0, 2653, 2597, 1, 0, 0, 0, 2653, 2605, 1, 0, 0, 0, 2653, 2613, 1, 0, 0, 0, 2653, 2621, 1, 0, 0, 0, 2653, 2629, 1, 0, 0, 0, 2653, 2637, 1, 0, 0, 0, 2653, 2645, 1, 0, 0, 0, 2654, 319, 1, 0, 0, 0, 2655, 2658, 3, 36, 18, 0, 2656, 2658, 3, 32, 16, 0, 2657, 2655, 1, 0, 0, 0, 2657, 2656, 1, 0, 0, 0, 2658, 2661, 1, 0, 0, 0, 2659, 2657, 1, 0, 0, 0, 2659, 2660, 1, 0, 0, 0, 2660, 321, 1, 0, 0, 0, 2661, 2659, 1, 0, 0, 0, 2662, 2665, 3, 36, 18, 0, 2663, 2665, 3, 34, 17, 0, 2664, 2662, 1, 0, 0, 0, 2664, 2663, 1, 0, 0, 0, 2665, 2668, 1, 0, 0, 0, 2666, 2664, 1, 0, 0, 0, 2666, 2667, 1, 0, 0, 0, 2667, 323, 1, 0, 0, 0, 2668, 2666, 1, 0, 0, 0, 2669, 2671, 3, 34, 17, 0, 2670, 2669, 1, 0, 0, 0, 2671, 2674, 1, 0, 0, 0, 2672, 2670, 1, 0, 0, 0, 2672, 2673, 1, 0, 0, 0, 2673, 325, 1, 0, 0, 0, 2674, 2672, 1, 0, 0, 0, 2675, 2677, 3, 32, 16, 0, 2676, 2675, 1, 0, 0, 0, 2677, 2680, 1, 0, 0, 0, 2678, 2676, 1, 0, 0, 0, 2678, 2679, 1, 0, 0, 0, 2679, 327, 1, 0, 0, 0, 2680, 2678, 1, 0, 0, 0, 2681, 2683, 3, 32, 16, 0, 2682, 2681, 1, 0, 0, 0, 2683, 2686, 1, 0, 0, 0, 2684, 2682, 1, 0, 0, 0, 2684, 2685, 1, 0, 0, 0, 2685, 329, 1, 0, 0, 0, 2686, 2684, 1, 0, 0, 0, 2687, 2689, 3, 32, 16, 0, 2688, 2687, 1, 0, 0, 0, 2689, 2692, 1, 0, 0, 0, 2690, 2688, 1, 0, 0, 0, 2690, 2691, 1, 0, 0, 0, 2691, 331, 1, 0, 0, 0, 2692, 2690, 1, 0, 0, 0, 2693, 2695, 3, 184, 92, 0, 2694, 2693, 1, 0, 0, 0, 2695, 2698, 1, 0, 0, 0, 2696, 2694, 1, 0, 0, 0, 2696, 2697, 1, 0, 0, 0, 2697, 333, 1, 0, 0, 0, 2698, 2696, 1, 0, 0, 0, 2699, 2701, 7, 13, 0, 0, 2700, 2699, 1, 0, 0, 0, 2701, 2704, 1, 0, 0, 0, 2702, 2700, 1, 0, 0, 0, 2702, 2703, 1, 0, 0, 0, 2703, 335, 1, 0, 0, 0, 2704, 2702, 1, 0, 0, 0, 2705, 2707, 3, 338, 169, 0, 2706, 2705, 1, 0, 0, 0, 2707, 2710, 1, 0, 0, 0, 2708, 2706, 1, 0, 0, 0, 2708, 2709, 1, 0, 0, 0, 2709, 337, 1, 0, 0, 0, 2710, 2708, 1, 0, 0, 0, 2711, 2716, 5, 178, 0, 0, 2712, 2713, 5, 38, 0, 0, 2713, 2716, 5, 263, 0, 0, 2714, 2716, 3, 138, 69, 0, 2715, 2711, 1, 0, 0, 0, 2715, 2712, 1, 0, 0, 0, 2715, 2714, 1, 0, 0, 0, 2716, 339, 1, 0, 0, 0, 2717, 2719, 3, 318, 159, 0, 2718, 2717, 1, 0, 0, 0, 2719, 2722, 1, 0, 0, 0, 2720, 2718, 1, 0, 0, 0, 2720, 2721, 1, 0, 0, 0, 2721, 341, 1, 0, 0, 0, 2722, 2720, 1, 0, 0, 0, 2723, 2727, 3, 44, 22, 0, 2724, 2727, 3, 46, 23, 0, 2725, 2727, 3, 2, 1, 0, 2726, 2723, 1, 0, 0, 0, 2726, 2724, 1, 0, 0, 0, 2726, 2725, 1, 0, 0, 0, 2727, 343, 1, 0, 0, 0, 2728, 2729, 5, 167, 0, 0, 2729, 2730, 5, 35, 0, 0, 2730, 2731, 5, 29, 0, 0, 2731, 2732, 3, 312, 156, 0, 2732, 2733, 5, 30, 0, 0, 2733, 2754, 1, 0, 0, 0, 2734, 2735, 5, 168, 0, 0, 2735, 2736, 3, 38, 19, 0, 2736, 2737, 5, 74, 0, 0, 2737, 2738, 3, 38, 19, 0, 2738, 2739, 5, 74, 0, 0, 2739, 2740, 3, 38, 19, 0, 2740, 2741, 5, 74, 0, 0, 2741, 2742, 3, 38, 19, 0, 2742, 2754, 1, 0, 0, 0, 2743, 2744, 5, 169, 0, 0, 2744, 2754, 3, 6, 3, 0, 2745, 2746, 5, 169, 0, 0, 2746, 2747, 5, 35, 0, 0, 2747, 2748, 5, 29, 0, 0, 2748, 2749, 3, 312, 156, 0, 2749, 2750, 5, 30, 0, 0, 2750, 2754, 1, 0, 0, 0, 2751, 2754, 3, 342, 171, 0, 2752, 2754, 3, 40, 20, 0, 2753, 2728, 1, 0, 0, 0, 2753, 2734, 1, 0, 0, 0, 2753, 2743, 1, 0, 0, 0, 2753, 2745, 1, 0, 0, 0, 2753, 2751, 1, 0, 0, 0, 2753, 2752, 1, 0, 0, 0, 2754, 345, 1, 0, 0, 0, 2755, 2756, 5, 24, 0, 0, 2756, 2757, 5, 39, 0, 0, 2757, 2758, 3, 98, 49, 0, 2758, 2759, 3, 2, 1, 0, 2759, 2768, 1, 0, 0, 0, 2760, 2761, 5, 24, 0, 0, 2761, 2762, 5, 39, 0, 0, 2762, 2763, 3, 98, 49, 0, 2763, 2764, 3, 2, 1, 0, 2764, 2765, 5, 33, 0, 0, 2765, 2766, 3, 2, 1, 0, 2766, 2768, 1, 0, 0, 0, 2767, 2755, 1, 0, 0, 0, 2767, 2760, 1, 0, 0, 0, 2768, 347, 1, 0, 0, 0, 2769, 2771, 3, 350, 175, 0, 2770, 2769, 1, 0, 0, 0, 2771, 2774, 1, 0, 0, 0, 2772, 2770, 1, 0, 0, 0, 2772, 2773, 1, 0, 0, 0, 2773, 349, 1, 0, 0, 0, 2774, 2772, 1, 0, 0, 0, 2775, 2776, 5, 179, 0, 0, 2776, 2777, 5, 35, 0, 0, 2777, 2778, 5, 29, 0, 0, 2778, 2779, 3, 312, 156, 0, 2779, 2780, 5, 30, 0, 0, 2780, 2790, 1, 0, 0, 0, 2781, 2790, 3, 344, 172, 0, 2782, 2783, 5, 170, 0, 0, 2783, 2784, 5, 35, 0, 0, 2784, 2785, 5, 29, 0, 0, 2785, 2786, 3, 312, 156, 0, 2786, 2787, 5, 30, 0, 0, 2787, 2790, 1, 0, 0, 0, 2788, 2790, 5, 54, 0, 0, 2789, 2775, 1, 0, 0, 0, 2789, 2781, 1, 0, 0, 0, 2789, 2782, 1, 0, 0, 0, 2789, 2788, 1, 0, 0, 0, 2790, 351, 1, 0, 0, 0, 2791, 2792, 5, 49, 0, 0, 2792, 2796, 5, 39, 0, 0, 2793, 2795, 3, 356, 178, 0, 2794, 2793, 1, 0, 0, 0, 2795, 2798, 1, 0, 0, 0, 2796, 2794, 1, 0, 0, 0, 2796, 2797, 1, 0, 0, 0, 2797, 2799, 1, 0, 0, 0, 2798, 2796, 1, 0, 0, 0, 2799, 2800, 3, 2, 1, 0, 2800, 353, 1, 0, 0, 0, 2801, 2805, 5, 300, 0, 0, 2802, 2804, 3, 356, 178, 0, 2803, 2802, 1, 0, 0, 0, 2804, 2807, 1, 0, 0, 0, 2805, 2803, 1, 0, 0, 0, 2805, 2806, 1, 0, 0, 0, 2806, 2808, 1, 0, 0, 0, 2807, 2805, 1, 0, 0, 0, 2808, 2809, 3, 2, 1, 0, 2809, 355, 1, 0, 0, 0, 2810, 2826, 5, 51, 0, 0, 2811, 2826, 5, 50, 0, 0, 2812, 2826, 5, 171, 0, 0, 2813, 2814, 5, 61, 0, 0, 2814, 2826, 5, 50, 0, 0, 2815, 2816, 5, 61, 0, 0, 2816, 2826, 5, 51, 0, 0, 2817, 2818, 5, 61, 0, 0, 2818, 2826, 5, 62, 0, 0, 2819, 2820, 5, 61, 0, 0, 2820, 2826, 5, 63, 0, 0, 2821, 2822, 5, 61, 0, 0, 2822, 2826, 5, 64, 0, 0, 2823, 2824, 5, 61, 0, 0, 2824, 2826, 5, 65, 0, 0, 2825, 2810, 1, 0, 0, 0, 2825, 2811, 1, 0, 0, 0, 2825, 2812, 1, 0, 0, 0, 2825, 2813, 1, 0, 0, 0, 2825, 2815, 1, 0, 0, 0, 2825, 2817, 1, 0, 0, 0, 2825, 2819, 1, 0, 0, 0, 2825, 2821, 1, 0, 0, 0, 2825, 2823, 1, 0, 0, 0, 2826, 357, 1, 0, 0, 0, 2827, 2829, 3, 360, 180, 0, 2828, 2827, 1, 0, 0, 0, 2829, 2832, 1, 0, 0, 0, 2830, 2828, 1, 0, 0, 0, 2830, 2831, 1, 0, 0, 0, 2831, 359, 1, 0, 0, 0, 2832, 2830, 1, 0, 0, 0, 2833, 2834, 5, 20, 0, 0, 2834, 2847, 3, 2, 1, 0, 2835, 2836, 5, 49, 0, 0, 2836, 2837, 5, 39, 0, 0, 2837, 2847, 3, 140, 70, 0, 2838, 2839, 5, 24, 0, 0, 2839, 2840, 5, 39, 0, 0, 2840, 2847, 3, 2, 1, 0, 2841, 2847, 3, 196, 98, 0, 2842, 2843, 5, 49, 0, 0, 2843, 2847, 3, 32, 16, 0, 2844, 2847, 3, 342, 171, 0, 2845, 2847, 3, 40, 20, 0, 2846, 2833, 1, 0, 0, 0, 2846, 2835, 1, 0, 0, 0, 2846, 2838, 1, 0, 0, 0, 2846, 2841, 1, 0, 0, 0, 2846, 2842, 1, 0, 0, 0, 2846, 2844, 1, 0, 0, 0, 2846, 2845, 1, 0, 0, 0, 2847, 361, 1, 0, 0, 0, 2848, 2852, 5, 273, 0, 0, 2849, 2851, 3, 364, 182, 0, 2850, 2849, 1, 0, 0, 0, 2851, 2854, 1, 0, 0, 0, 2852, 2850, 1, 0, 0, 0, 2852, 2853, 1, 0, 0, 0, 2853, 2855, 1, 0, 0, 0, 2854, 2852, 1, 0, 0, 0, 2855, 2868, 3, 2, 1, 0, 2856, 2860, 5, 273, 0, 0, 2857, 2859, 3, 364, 182, 0, 2858, 2857, 1, 0, 0, 0, 2859, 2862, 1, 0, 0, 0, 2860, 2858, 1, 0, 0, 0, 2860, 2861, 1, 0, 0, 0, 2861, 2863, 1, 0, 0, 0, 2862, 2860, 1, 0, 0, 0, 2863, 2864, 3, 2, 1, 0, 2864, 2865, 5, 33, 0, 0, 2865, 2866, 3, 2, 1, 0, 2866, 2868, 1, 0, 0, 0, 2867, 2848, 1, 0, 0, 0, 2867, 2856, 1, 0, 0, 0, 2868, 363, 1, 0, 0, 0, 2869, 2870, 7, 14, 0, 0, 2870, 365, 1, 0, 0, 0, 2871, 2873, 3, 368, 184, 0, 2872, 2871, 1, 0, 0, 0, 2873, 2876, 1, 0, 0, 0, 2874, 2872, 1, 0, 0, 0, 2874, 2875, 1, 0, 0, 0, 2875, 367, 1, 0, 0, 0, 2876, 2874, 1, 0, 0, 0, 2877, 2878, 5, 20, 0, 0, 2878, 2879, 3, 2, 1, 0, 2879, 2880, 5, 43, 0, 0, 2880, 2881, 3, 32, 16, 0, 2881, 2888, 1, 0, 0, 0, 2882, 2883, 5, 24, 0, 0, 2883, 2884, 5, 39, 0, 0, 2884, 2888, 3, 2, 1, 0, 2885, 2888, 3, 342, 171, 0, 2886, 2888, 3, 40, 20, 0, 2887, 2877, 1, 0, 0, 0, 2887, 2882, 1, 0, 0, 0, 2887, 2885, 1, 0, 0, 0, 2887, 2886, 1, 0, 0, 0, 2888, 369, 1, 0, 0, 0, 172, 378, 383, 391, 399, 452, 493, 502, 526, 530, 548, 575, 598, 634, 640, 647, 649, 659, 661, 668, 679, 687, 708, 710, 726, 771, 776, 781, 786, 794, 904, 910, 926, 932, 938, 945, 1053, 1058, 1064, 1069, 1071, 1079, 1091, 1103, 1110, 1117, 1119, 1146, 1153, 1161, 1169, 1182, 1189, 1192, 1211, 1297, 1306, 1313, 1316, 1324, 1345, 1377, 1400, 1412, 1421, 1446, 1463, 1471, 1475, 1490, 1497, 1542, 1552, 1568, 1580, 1592, 1606, 1618, 1629, 1636, 1646, 1659, 1664, 1669, 1678, 1689, 1772, 1781, 1794, 1805, 1813, 1823, 1825, 1852, 1859, 1864, 1871, 1877, 1887, 1891, 1898, 1913, 1919, 1933, 1946, 1954, 1961, 1965, 1970, 1986, 1991, 1993, 2006, 2032, 2039, 2041, 2046, 2052, 2081, 2086, 2109, 2114, 2178, 2187, 2200, 2211, 2222, 2225, 2232, 2244, 2258, 2272, 2280, 2300, 2312, 2317, 2326, 2328, 2335, 2345, 2413, 2490, 2495, 2503, 2653, 2657, 2659, 2664, 2666, 2672, 2678, 2684, 2690, 2696, 2702, 2708, 2715, 2720, 2726, 2753, 2767, 2772, 2789, 2796, 2805, 2825, 2830, 2846, 2852, 2860, 2867, 2874, 2887]
\ No newline at end of file
+[4, 1, 305, 2908, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 377, 8, 1, 10, 1, 12, 1, 380, 9, 1, 1, 1, 1, 1, 3, 1, 384, 8, 1, 1, 2, 1, 2, 1, 3, 1, 3, 5, 3, 390, 8, 3, 10, 3, 12, 3, 393, 9, 3, 1, 3, 1, 3, 1, 4, 5, 4, 398, 8, 4, 10, 4, 12, 4, 401, 9, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 453, 8, 5, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 494, 8, 13, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 5, 15, 501, 8, 15, 10, 15, 12, 15, 504, 9, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 527, 8, 18, 1, 19, 1, 19, 3, 19, 531, 8, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 549, 8, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 576, 8, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 599, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 635, 8, 23, 1, 24, 1, 24, 1, 25, 1, 25, 3, 25, 641, 8, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 5, 27, 648, 8, 27, 10, 27, 12, 27, 651, 9, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 5, 28, 660, 8, 28, 10, 28, 12, 28, 663, 9, 28, 1, 29, 1, 29, 1, 30, 1, 30, 3, 30, 669, 8, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 680, 8, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 688, 8, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 5, 34, 709, 8, 34, 10, 34, 12, 34, 712, 9, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 5, 37, 725, 8, 37, 10, 37, 12, 37, 728, 9, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 772, 8, 38, 1, 39, 1, 39, 1, 39, 3, 39, 777, 8, 39, 1, 40, 1, 40, 1, 40, 3, 40, 782, 8, 40, 1, 41, 5, 41, 785, 8, 41, 10, 41, 12, 41, 788, 9, 41, 1, 42, 1, 42, 1, 42, 5, 42, 793, 8, 42, 10, 42, 12, 42, 796, 9, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 905, 8, 44, 1, 45, 1, 45, 5, 45, 909, 8, 45, 10, 45, 12, 45, 912, 9, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 5, 45, 925, 8, 45, 10, 45, 12, 45, 928, 9, 45, 1, 45, 1, 45, 1, 45, 3, 45, 933, 8, 45, 1, 46, 1, 46, 1, 47, 1, 47, 3, 47, 939, 8, 47, 1, 48, 1, 48, 1, 49, 5, 49, 944, 8, 49, 10, 49, 12, 49, 947, 9, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 53, 1, 53, 1, 54, 1, 54, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, 1, 57, 1, 58, 1, 58, 1, 59, 1, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1057, 8, 63, 1, 64, 1, 64, 1, 64, 3, 64, 1062, 8, 64, 1, 64, 1, 64, 5, 64, 1066, 8, 64, 10, 64, 12, 64, 1069, 9, 64, 1, 64, 1, 64, 3, 64, 1073, 8, 64, 3, 64, 1075, 8, 64, 1, 65, 1, 65, 1, 65, 1, 65, 5, 65, 1081, 8, 65, 10, 65, 12, 65, 1084, 9, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 5, 66, 1093, 8, 66, 10, 66, 12, 66, 1096, 9, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 5, 67, 1105, 8, 67, 10, 67, 12, 67, 1108, 9, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1114, 8, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 3, 68, 1121, 8, 68, 3, 68, 1123, 8, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 1150, 8, 69, 1, 70, 1, 70, 1, 70, 5, 70, 1155, 8, 70, 10, 70, 12, 70, 1158, 9, 70, 1, 70, 1, 70, 1, 71, 5, 71, 1163, 8, 71, 10, 71, 12, 71, 1166, 9, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1173, 8, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 3, 73, 1186, 8, 73, 1, 74, 1, 74, 1, 74, 5, 74, 1191, 8, 74, 10, 74, 12, 74, 1194, 9, 74, 3, 74, 1196, 8, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 3, 75, 1215, 8, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 3, 76, 1309, 8, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 3, 77, 1318, 8, 77, 1, 78, 1, 78, 1, 78, 5, 78, 1323, 8, 78, 10, 78, 12, 78, 1326, 9, 78, 3, 78, 1328, 8, 78, 1, 79, 1, 79, 1, 80, 1, 80, 5, 80, 1334, 8, 80, 10, 80, 12, 80, 1337, 9, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 3, 81, 1357, 8, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 3, 82, 1389, 8, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 3, 83, 1412, 8, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 3, 84, 1424, 8, 84, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 3, 86, 1433, 8, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 3, 87, 1458, 8, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 3, 87, 1482, 8, 87, 1, 88, 1, 88, 1, 88, 1, 88, 5, 88, 1488, 8, 88, 10, 88, 12, 88, 1491, 9, 88, 1, 88, 3, 88, 1494, 8, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 3, 89, 1509, 8, 89, 1, 90, 1, 90, 1, 90, 5, 90, 1514, 8, 90, 10, 90, 12, 90, 1517, 9, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 3, 93, 1561, 8, 93, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 3, 95, 1571, 8, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 3, 95, 1587, 8, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 3, 95, 1599, 8, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 3, 96, 1611, 8, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 3, 97, 1625, 8, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 3, 99, 1637, 8, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 3, 100, 1648, 8, 100, 1, 101, 1, 101, 1, 101, 5, 101, 1653, 8, 101, 10, 101, 12, 101, 1656, 9, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 3, 102, 1665, 8, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 3, 103, 1678, 8, 103, 1, 104, 5, 104, 1681, 8, 104, 10, 104, 12, 104, 1684, 9, 104, 1, 105, 1, 105, 3, 105, 1688, 8, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 5, 106, 1695, 8, 106, 10, 106, 12, 106, 1698, 9, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 3, 108, 1708, 8, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 5, 110, 1789, 8, 110, 10, 110, 12, 110, 1792, 9, 110, 1, 110, 1, 110, 1, 110, 1, 110, 5, 110, 1798, 8, 110, 10, 110, 12, 110, 1801, 9, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 5, 110, 1811, 8, 110, 10, 110, 12, 110, 1814, 9, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 5, 110, 1822, 8, 110, 10, 110, 12, 110, 1825, 9, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 3, 110, 1832, 8, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 5, 111, 1842, 8, 111, 10, 111, 12, 111, 1845, 9, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 3, 112, 1871, 8, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 3, 113, 1878, 8, 113, 1, 114, 1, 114, 1, 114, 3, 114, 1883, 8, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 3, 115, 1890, 8, 115, 1, 116, 1, 116, 5, 116, 1894, 8, 116, 10, 116, 12, 116, 1897, 9, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 5, 116, 1904, 8, 116, 10, 116, 12, 116, 1907, 9, 116, 1, 116, 3, 116, 1910, 8, 116, 1, 117, 1, 117, 1, 118, 5, 118, 1915, 8, 118, 10, 118, 12, 118, 1918, 9, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 3, 119, 1932, 8, 119, 1, 120, 1, 120, 5, 120, 1936, 8, 120, 10, 120, 12, 120, 1939, 9, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 122, 5, 122, 1950, 8, 122, 10, 122, 12, 122, 1953, 9, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 3, 123, 1965, 8, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 3, 124, 1973, 8, 124, 1, 125, 1, 125, 1, 125, 4, 125, 1978, 8, 125, 11, 125, 12, 125, 1979, 1, 125, 1, 125, 3, 125, 1984, 8, 125, 1, 126, 5, 126, 1987, 8, 126, 10, 126, 12, 126, 1990, 9, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 3, 127, 2005, 8, 127, 1, 128, 1, 128, 1, 128, 5, 128, 2010, 8, 128, 10, 128, 12, 128, 2013, 9, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 5, 128, 2023, 8, 128, 10, 128, 12, 128, 2026, 9, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 3, 129, 2051, 8, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 3, 130, 2058, 8, 130, 3, 130, 2060, 8, 130, 1, 130, 5, 130, 2063, 8, 130, 10, 130, 12, 130, 2066, 9, 130, 1, 130, 1, 130, 1, 130, 3, 130, 2071, 8, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 3, 131, 2100, 8, 131, 1, 132, 1, 132, 1, 132, 3, 132, 2105, 8, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 3, 133, 2128, 8, 133, 1, 134, 5, 134, 2131, 8, 134, 10, 134, 12, 134, 2134, 9, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 5, 135, 2195, 8, 135, 10, 135, 12, 135, 2198, 9, 135, 1, 135, 1, 135, 1, 135, 1, 135, 5, 135, 2204, 8, 135, 10, 135, 12, 135, 2207, 9, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 5, 135, 2217, 8, 135, 10, 135, 12, 135, 2220, 9, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 5, 135, 2228, 8, 135, 10, 135, 12, 135, 2231, 9, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 5, 135, 2239, 8, 135, 10, 135, 12, 135, 2242, 9, 135, 3, 135, 2244, 8, 135, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 3, 137, 2251, 8, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 140, 4, 140, 2261, 8, 140, 11, 140, 12, 140, 2262, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 3, 141, 2277, 8, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 3, 142, 2291, 8, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 3, 143, 2299, 8, 143, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 3, 147, 2319, 8, 147, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 3, 149, 2331, 8, 149, 1, 150, 1, 150, 1, 150, 3, 150, 2336, 8, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 4, 151, 2343, 8, 151, 11, 151, 12, 151, 2344, 3, 151, 2347, 8, 151, 1, 152, 1, 152, 1, 152, 5, 152, 2352, 8, 152, 10, 152, 12, 152, 2355, 9, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 3, 153, 2364, 8, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 3, 154, 2432, 8, 154, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 3, 155, 2509, 8, 155, 1, 156, 5, 156, 2512, 8, 156, 10, 156, 12, 156, 2515, 9, 156, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 3, 158, 2522, 8, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 3, 159, 2672, 8, 159, 1, 160, 1, 160, 5, 160, 2676, 8, 160, 10, 160, 12, 160, 2679, 9, 160, 1, 161, 1, 161, 5, 161, 2683, 8, 161, 10, 161, 12, 161, 2686, 9, 161, 1, 162, 5, 162, 2689, 8, 162, 10, 162, 12, 162, 2692, 9, 162, 1, 163, 5, 163, 2695, 8, 163, 10, 163, 12, 163, 2698, 9, 163, 1, 164, 5, 164, 2701, 8, 164, 10, 164, 12, 164, 2704, 9, 164, 1, 165, 5, 165, 2707, 8, 165, 10, 165, 12, 165, 2710, 9, 165, 1, 166, 5, 166, 2713, 8, 166, 10, 166, 12, 166, 2716, 9, 166, 1, 167, 5, 167, 2719, 8, 167, 10, 167, 12, 167, 2722, 9, 167, 1, 168, 5, 168, 2725, 8, 168, 10, 168, 12, 168, 2728, 9, 168, 1, 169, 1, 169, 1, 169, 1, 169, 3, 169, 2734, 8, 169, 1, 170, 5, 170, 2737, 8, 170, 10, 170, 12, 170, 2740, 9, 170, 1, 171, 1, 171, 1, 171, 3, 171, 2745, 8, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 3, 172, 2772, 8, 172, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 3, 173, 2786, 8, 173, 1, 174, 5, 174, 2789, 8, 174, 10, 174, 12, 174, 2792, 9, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 3, 175, 2808, 8, 175, 1, 176, 1, 176, 1, 176, 5, 176, 2813, 8, 176, 10, 176, 12, 176, 2816, 9, 176, 1, 176, 1, 176, 1, 177, 1, 177, 5, 177, 2822, 8, 177, 10, 177, 12, 177, 2825, 9, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 3, 178, 2844, 8, 178, 1, 179, 5, 179, 2847, 8, 179, 10, 179, 12, 179, 2850, 9, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 3, 180, 2865, 8, 180, 1, 181, 1, 181, 5, 181, 2869, 8, 181, 10, 181, 12, 181, 2872, 9, 181, 1, 181, 1, 181, 1, 181, 5, 181, 2877, 8, 181, 10, 181, 12, 181, 2880, 9, 181, 1, 181, 1, 181, 1, 181, 1, 181, 3, 181, 2886, 8, 181, 1, 182, 1, 182, 1, 183, 5, 183, 2891, 8, 183, 10, 183, 12, 183, 2894, 9, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 3, 184, 2906, 8, 184, 1, 184, 0, 1, 68, 185, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 276, 278, 280, 282, 284, 286, 288, 290, 292, 294, 296, 298, 300, 302, 304, 306, 308, 310, 312, 314, 316, 318, 320, 322, 324, 326, 328, 330, 332, 334, 336, 338, 340, 342, 344, 346, 348, 350, 352, 354, 356, 358, 360, 362, 364, 366, 368, 0, 16, 6, 0, 1, 15, 199, 199, 243, 243, 247, 247, 264, 264, 289, 289, 5, 0, 16, 16, 199, 199, 243, 243, 264, 264, 288, 289, 1, 0, 263, 264, 1, 0, 173, 174, 1, 0, 37, 38, 1, 0, 73, 74, 3, 0, 2, 2, 61, 61, 77, 83, 2, 0, 229, 229, 260, 261, 9, 0, 178, 178, 183, 195, 201, 201, 207, 208, 210, 215, 218, 219, 222, 222, 230, 242, 262, 262, 1, 0, 95, 96, 1, 0, 97, 111, 1, 0, 68, 69, 2, 0, 173, 173, 289, 290, 2, 0, 179, 179, 264, 264, 1, 0, 167, 168, 1, 0, 51, 52, 3325, 0, 370, 1, 0, 0, 0, 2, 383, 1, 0, 0, 0, 4, 385, 1, 0, 0, 0, 6, 391, 1, 0, 0, 0, 8, 399, 1, 0, 0, 0, 10, 452, 1, 0, 0, 0, 12, 454, 1, 0, 0, 0, 14, 457, 1, 0, 0, 0, 16, 460, 1, 0, 0, 0, 18, 464, 1, 0, 0, 0, 20, 467, 1, 0, 0, 0, 22, 470, 1, 0, 0, 0, 24, 477, 1, 0, 0, 0, 26, 493, 1, 0, 0, 0, 28, 495, 1, 0, 0, 0, 30, 497, 1, 0, 0, 0, 32, 507, 1, 0, 0, 0, 34, 509, 1, 0, 0, 0, 36, 526, 1, 0, 0, 0, 38, 530, 1, 0, 0, 0, 40, 548, 1, 0, 0, 0, 42, 575, 1, 0, 0, 0, 44, 598, 1, 0, 0, 0, 46, 634, 1, 0, 0, 0, 48, 636, 1, 0, 0, 0, 50, 640, 1, 0, 0, 0, 52, 642, 1, 0, 0, 0, 54, 649, 1, 0, 0, 0, 56, 661, 1, 0, 0, 0, 58, 664, 1, 0, 0, 0, 60, 666, 1, 0, 0, 0, 62, 679, 1, 0, 0, 0, 64, 687, 1, 0, 0, 0, 66, 689, 1, 0, 0, 0, 68, 697, 1, 0, 0, 0, 70, 713, 1, 0, 0, 0, 72, 719, 1, 0, 0, 0, 74, 722, 1, 0, 0, 0, 76, 771, 1, 0, 0, 0, 78, 776, 1, 0, 0, 0, 80, 781, 1, 0, 0, 0, 82, 786, 1, 0, 0, 0, 84, 794, 1, 0, 0, 0, 86, 799, 1, 0, 0, 0, 88, 904, 1, 0, 0, 0, 90, 932, 1, 0, 0, 0, 92, 934, 1, 0, 0, 0, 94, 938, 1, 0, 0, 0, 96, 940, 1, 0, 0, 0, 98, 945, 1, 0, 0, 0, 100, 948, 1, 0, 0, 0, 102, 950, 1, 0, 0, 0, 104, 952, 1, 0, 0, 0, 106, 954, 1, 0, 0, 0, 108, 956, 1, 0, 0, 0, 110, 958, 1, 0, 0, 0, 112, 960, 1, 0, 0, 0, 114, 962, 1, 0, 0, 0, 116, 964, 1, 0, 0, 0, 118, 966, 1, 0, 0, 0, 120, 968, 1, 0, 0, 0, 122, 970, 1, 0, 0, 0, 124, 972, 1, 0, 0, 0, 126, 1056, 1, 0, 0, 0, 128, 1074, 1, 0, 0, 0, 130, 1076, 1, 0, 0, 0, 132, 1088, 1, 0, 0, 0, 134, 1113, 1, 0, 0, 0, 136, 1122, 1, 0, 0, 0, 138, 1149, 1, 0, 0, 0, 140, 1156, 1, 0, 0, 0, 142, 1164, 1, 0, 0, 0, 144, 1172, 1, 0, 0, 0, 146, 1185, 1, 0, 0, 0, 148, 1195, 1, 0, 0, 0, 150, 1214, 1, 0, 0, 0, 152, 1308, 1, 0, 0, 0, 154, 1317, 1, 0, 0, 0, 156, 1327, 1, 0, 0, 0, 158, 1329, 1, 0, 0, 0, 160, 1331, 1, 0, 0, 0, 162, 1356, 1, 0, 0, 0, 164, 1388, 1, 0, 0, 0, 166, 1411, 1, 0, 0, 0, 168, 1423, 1, 0, 0, 0, 170, 1425, 1, 0, 0, 0, 172, 1428, 1, 0, 0, 0, 174, 1481, 1, 0, 0, 0, 176, 1493, 1, 0, 0, 0, 178, 1508, 1, 0, 0, 0, 180, 1515, 1, 0, 0, 0, 182, 1520, 1, 0, 0, 0, 184, 1524, 1, 0, 0, 0, 186, 1560, 1, 0, 0, 0, 188, 1562, 1, 0, 0, 0, 190, 1598, 1, 0, 0, 0, 192, 1610, 1, 0, 0, 0, 194, 1624, 1, 0, 0, 0, 196, 1626, 1, 0, 0, 0, 198, 1636, 1, 0, 0, 0, 200, 1647, 1, 0, 0, 0, 202, 1654, 1, 0, 0, 0, 204, 1664, 1, 0, 0, 0, 206, 1677, 1, 0, 0, 0, 208, 1682, 1, 0, 0, 0, 210, 1685, 1, 0, 0, 0, 212, 1696, 1, 0, 0, 0, 214, 1701, 1, 0, 0, 0, 216, 1707, 1, 0, 0, 0, 218, 1709, 1, 0, 0, 0, 220, 1831, 1, 0, 0, 0, 222, 1833, 1, 0, 0, 0, 224, 1870, 1, 0, 0, 0, 226, 1877, 1, 0, 0, 0, 228, 1882, 1, 0, 0, 0, 230, 1889, 1, 0, 0, 0, 232, 1909, 1, 0, 0, 0, 234, 1911, 1, 0, 0, 0, 236, 1916, 1, 0, 0, 0, 238, 1931, 1, 0, 0, 0, 240, 1933, 1, 0, 0, 0, 242, 1946, 1, 0, 0, 0, 244, 1951, 1, 0, 0, 0, 246, 1964, 1, 0, 0, 0, 248, 1972, 1, 0, 0, 0, 250, 1983, 1, 0, 0, 0, 252, 1988, 1, 0, 0, 0, 254, 2004, 1, 0, 0, 0, 256, 2006, 1, 0, 0, 0, 258, 2050, 1, 0, 0, 0, 260, 2070, 1, 0, 0, 0, 262, 2099, 1, 0, 0, 0, 264, 2104, 1, 0, 0, 0, 266, 2127, 1, 0, 0, 0, 268, 2132, 1, 0, 0, 0, 270, 2243, 1, 0, 0, 0, 272, 2245, 1, 0, 0, 0, 274, 2250, 1, 0, 0, 0, 276, 2252, 1, 0, 0, 0, 278, 2256, 1, 0, 0, 0, 280, 2260, 1, 0, 0, 0, 282, 2276, 1, 0, 0, 0, 284, 2290, 1, 0, 0, 0, 286, 2298, 1, 0, 0, 0, 288, 2300, 1, 0, 0, 0, 290, 2303, 1, 0, 0, 0, 292, 2305, 1, 0, 0, 0, 294, 2318, 1, 0, 0, 0, 296, 2320, 1, 0, 0, 0, 298, 2330, 1, 0, 0, 0, 300, 2335, 1, 0, 0, 0, 302, 2346, 1, 0, 0, 0, 304, 2353, 1, 0, 0, 0, 306, 2363, 1, 0, 0, 0, 308, 2431, 1, 0, 0, 0, 310, 2508, 1, 0, 0, 0, 312, 2513, 1, 0, 0, 0, 314, 2516, 1, 0, 0, 0, 316, 2521, 1, 0, 0, 0, 318, 2671, 1, 0, 0, 0, 320, 2677, 1, 0, 0, 0, 322, 2684, 1, 0, 0, 0, 324, 2690, 1, 0, 0, 0, 326, 2696, 1, 0, 0, 0, 328, 2702, 1, 0, 0, 0, 330, 2708, 1, 0, 0, 0, 332, 2714, 1, 0, 0, 0, 334, 2720, 1, 0, 0, 0, 336, 2726, 1, 0, 0, 0, 338, 2733, 1, 0, 0, 0, 340, 2738, 1, 0, 0, 0, 342, 2744, 1, 0, 0, 0, 344, 2771, 1, 0, 0, 0, 346, 2785, 1, 0, 0, 0, 348, 2790, 1, 0, 0, 0, 350, 2807, 1, 0, 0, 0, 352, 2809, 1, 0, 0, 0, 354, 2819, 1, 0, 0, 0, 356, 2843, 1, 0, 0, 0, 358, 2848, 1, 0, 0, 0, 360, 2864, 1, 0, 0, 0, 362, 2885, 1, 0, 0, 0, 364, 2887, 1, 0, 0, 0, 366, 2892, 1, 0, 0, 0, 368, 2905, 1, 0, 0, 0, 370, 371, 7, 0, 0, 0, 371, 1, 1, 0, 0, 0, 372, 384, 5, 288, 0, 0, 373, 374, 3, 4, 2, 0, 374, 375, 5, 265, 0, 0, 375, 377, 1, 0, 0, 0, 376, 373, 1, 0, 0, 0, 377, 380, 1, 0, 0, 0, 378, 376, 1, 0, 0, 0, 378, 379, 1, 0, 0, 0, 379, 381, 1, 0, 0, 0, 380, 378, 1, 0, 0, 0, 381, 384, 3, 4, 2, 0, 382, 384, 5, 264, 0, 0, 383, 372, 1, 0, 0, 0, 383, 378, 1, 0, 0, 0, 383, 382, 1, 0, 0, 0, 384, 3, 1, 0, 0, 0, 385, 386, 7, 1, 0, 0, 386, 5, 1, 0, 0, 0, 387, 388, 5, 263, 0, 0, 388, 390, 5, 266, 0, 0, 389, 387, 1, 0, 0, 0, 390, 393, 1, 0, 0, 0, 391, 389, 1, 0, 0, 0, 391, 392, 1, 0, 0, 0, 392, 394, 1, 0, 0, 0, 393, 391, 1, 0, 0, 0, 394, 395, 5, 263, 0, 0, 395, 7, 1, 0, 0, 0, 396, 398, 3, 10, 5, 0, 397, 396, 1, 0, 0, 0, 398, 401, 1, 0, 0, 0, 399, 397, 1, 0, 0, 0, 399, 400, 1, 0, 0, 0, 400, 9, 1, 0, 0, 0, 401, 399, 1, 0, 0, 0, 402, 403, 3, 74, 37, 0, 403, 404, 5, 17, 0, 0, 404, 405, 3, 82, 41, 0, 405, 406, 5, 18, 0, 0, 406, 453, 1, 0, 0, 0, 407, 408, 3, 72, 36, 0, 408, 409, 5, 17, 0, 0, 409, 410, 3, 8, 4, 0, 410, 411, 5, 18, 0, 0, 411, 453, 1, 0, 0, 0, 412, 413, 3, 256, 128, 0, 413, 414, 5, 17, 0, 0, 414, 415, 3, 268, 134, 0, 415, 416, 5, 18, 0, 0, 416, 453, 1, 0, 0, 0, 417, 453, 3, 222, 111, 0, 418, 453, 3, 296, 148, 0, 419, 453, 3, 70, 35, 0, 420, 453, 3, 66, 33, 0, 421, 453, 3, 88, 44, 0, 422, 453, 3, 90, 45, 0, 423, 453, 3, 22, 11, 0, 424, 425, 3, 346, 173, 0, 425, 426, 5, 17, 0, 0, 426, 427, 3, 348, 174, 0, 427, 428, 5, 18, 0, 0, 428, 453, 1, 0, 0, 0, 429, 430, 3, 352, 176, 0, 430, 431, 5, 17, 0, 0, 431, 432, 3, 358, 179, 0, 432, 433, 5, 18, 0, 0, 433, 453, 1, 0, 0, 0, 434, 435, 3, 362, 181, 0, 435, 436, 5, 17, 0, 0, 436, 437, 3, 366, 183, 0, 437, 438, 5, 18, 0, 0, 438, 453, 1, 0, 0, 0, 439, 453, 3, 64, 32, 0, 440, 453, 3, 174, 87, 0, 441, 453, 3, 342, 171, 0, 442, 453, 3, 12, 6, 0, 443, 453, 3, 14, 7, 0, 444, 453, 3, 16, 8, 0, 445, 453, 3, 18, 9, 0, 446, 453, 3, 20, 10, 0, 447, 453, 3, 26, 13, 0, 448, 453, 3, 42, 21, 0, 449, 453, 3, 40, 20, 0, 450, 453, 3, 30, 15, 0, 451, 453, 3, 24, 12, 0, 452, 402, 1, 0, 0, 0, 452, 407, 1, 0, 0, 0, 452, 412, 1, 0, 0, 0, 452, 417, 1, 0, 0, 0, 452, 418, 1, 0, 0, 0, 452, 419, 1, 0, 0, 0, 452, 420, 1, 0, 0, 0, 452, 421, 1, 0, 0, 0, 452, 422, 1, 0, 0, 0, 452, 423, 1, 0, 0, 0, 452, 424, 1, 0, 0, 0, 452, 429, 1, 0, 0, 0, 452, 434, 1, 0, 0, 0, 452, 439, 1, 0, 0, 0, 452, 440, 1, 0, 0, 0, 452, 441, 1, 0, 0, 0, 452, 442, 1, 0, 0, 0, 452, 443, 1, 0, 0, 0, 452, 444, 1, 0, 0, 0, 452, 445, 1, 0, 0, 0, 452, 446, 1, 0, 0, 0, 452, 447, 1, 0, 0, 0, 452, 448, 1, 0, 0, 0, 452, 449, 1, 0, 0, 0, 452, 450, 1, 0, 0, 0, 452, 451, 1, 0, 0, 0, 453, 11, 1, 0, 0, 0, 454, 455, 5, 19, 0, 0, 455, 456, 3, 32, 16, 0, 456, 13, 1, 0, 0, 0, 457, 458, 5, 20, 0, 0, 458, 459, 3, 32, 16, 0, 459, 15, 1, 0, 0, 0, 460, 461, 5, 21, 0, 0, 461, 462, 5, 22, 0, 0, 462, 463, 3, 32, 16, 0, 463, 17, 1, 0, 0, 0, 464, 465, 5, 23, 0, 0, 465, 466, 3, 34, 17, 0, 466, 19, 1, 0, 0, 0, 467, 468, 5, 24, 0, 0, 468, 469, 3, 34, 17, 0, 469, 21, 1, 0, 0, 0, 470, 471, 5, 25, 0, 0, 471, 472, 3, 98, 49, 0, 472, 473, 3, 2, 1, 0, 473, 474, 5, 17, 0, 0, 474, 475, 3, 142, 71, 0, 475, 476, 5, 18, 0, 0, 476, 23, 1, 0, 0, 0, 477, 478, 5, 26, 0, 0, 478, 25, 1, 0, 0, 0, 479, 480, 5, 27, 0, 0, 480, 494, 3, 28, 14, 0, 481, 482, 5, 27, 0, 0, 482, 483, 3, 28, 14, 0, 483, 484, 5, 28, 0, 0, 484, 485, 3, 28, 14, 0, 485, 494, 1, 0, 0, 0, 486, 487, 5, 27, 0, 0, 487, 488, 3, 28, 14, 0, 488, 489, 5, 28, 0, 0, 489, 490, 3, 28, 14, 0, 490, 491, 5, 28, 0, 0, 491, 492, 3, 28, 14, 0, 492, 494, 1, 0, 0, 0, 493, 479, 1, 0, 0, 0, 493, 481, 1, 0, 0, 0, 493, 486, 1, 0, 0, 0, 494, 27, 1, 0, 0, 0, 495, 496, 7, 2, 0, 0, 496, 29, 1, 0, 0, 0, 497, 498, 5, 29, 0, 0, 498, 502, 5, 17, 0, 0, 499, 501, 3, 138, 69, 0, 500, 499, 1, 0, 0, 0, 501, 504, 1, 0, 0, 0, 502, 500, 1, 0, 0, 0, 502, 503, 1, 0, 0, 0, 503, 505, 1, 0, 0, 0, 504, 502, 1, 0, 0, 0, 505, 506, 5, 18, 0, 0, 506, 31, 1, 0, 0, 0, 507, 508, 5, 173, 0, 0, 508, 33, 1, 0, 0, 0, 509, 510, 7, 3, 0, 0, 510, 35, 1, 0, 0, 0, 511, 527, 5, 175, 0, 0, 512, 513, 3, 32, 16, 0, 513, 514, 5, 265, 0, 0, 514, 527, 1, 0, 0, 0, 515, 527, 3, 32, 16, 0, 516, 517, 5, 188, 0, 0, 517, 518, 5, 30, 0, 0, 518, 519, 3, 32, 16, 0, 519, 520, 5, 31, 0, 0, 520, 527, 1, 0, 0, 0, 521, 522, 5, 189, 0, 0, 522, 523, 5, 30, 0, 0, 523, 524, 3, 34, 17, 0, 524, 525, 5, 31, 0, 0, 525, 527, 1, 0, 0, 0, 526, 511, 1, 0, 0, 0, 526, 512, 1, 0, 0, 0, 526, 515, 1, 0, 0, 0, 526, 516, 1, 0, 0, 0, 526, 521, 1, 0, 0, 0, 527, 37, 1, 0, 0, 0, 528, 531, 3, 32, 16, 0, 529, 531, 5, 262, 0, 0, 530, 528, 1, 0, 0, 0, 530, 529, 1, 0, 0, 0, 531, 39, 1, 0, 0, 0, 532, 533, 5, 267, 0, 0, 533, 549, 5, 289, 0, 0, 534, 535, 5, 267, 0, 0, 535, 536, 5, 289, 0, 0, 536, 549, 5, 263, 0, 0, 537, 538, 5, 268, 0, 0, 538, 549, 5, 289, 0, 0, 539, 540, 5, 269, 0, 0, 540, 549, 5, 289, 0, 0, 541, 542, 5, 270, 0, 0, 542, 549, 5, 289, 0, 0, 543, 549, 5, 271, 0, 0, 544, 549, 5, 272, 0, 0, 545, 546, 5, 273, 0, 0, 546, 549, 5, 263, 0, 0, 547, 549, 5, 32, 0, 0, 548, 532, 1, 0, 0, 0, 548, 534, 1, 0, 0, 0, 548, 537, 1, 0, 0, 0, 548, 539, 1, 0, 0, 0, 548, 541, 1, 0, 0, 0, 548, 543, 1, 0, 0, 0, 548, 544, 1, 0, 0, 0, 548, 545, 1, 0, 0, 0, 548, 547, 1, 0, 0, 0, 549, 41, 1, 0, 0, 0, 550, 551, 5, 33, 0, 0, 551, 552, 3, 160, 80, 0, 552, 553, 5, 34, 0, 0, 553, 554, 3, 2, 1, 0, 554, 576, 1, 0, 0, 0, 555, 556, 5, 33, 0, 0, 556, 557, 3, 138, 69, 0, 557, 558, 5, 34, 0, 0, 558, 559, 3, 2, 1, 0, 559, 576, 1, 0, 0, 0, 560, 561, 5, 33, 0, 0, 561, 562, 3, 198, 99, 0, 562, 563, 5, 34, 0, 0, 563, 564, 3, 2, 1, 0, 564, 576, 1, 0, 0, 0, 565, 566, 5, 33, 0, 0, 566, 567, 3, 44, 22, 0, 567, 568, 5, 34, 0, 0, 568, 569, 3, 2, 1, 0, 569, 576, 1, 0, 0, 0, 570, 571, 5, 33, 0, 0, 571, 572, 3, 46, 23, 0, 572, 573, 5, 34, 0, 0, 573, 574, 3, 2, 1, 0, 574, 576, 1, 0, 0, 0, 575, 550, 1, 0, 0, 0, 575, 555, 1, 0, 0, 0, 575, 560, 1, 0, 0, 0, 575, 565, 1, 0, 0, 0, 575, 570, 1, 0, 0, 0, 576, 43, 1, 0, 0, 0, 577, 578, 5, 35, 0, 0, 578, 599, 3, 48, 24, 0, 579, 580, 5, 35, 0, 0, 580, 581, 3, 48, 24, 0, 581, 582, 5, 36, 0, 0, 582, 583, 3, 6, 3, 0, 583, 599, 1, 0, 0, 0, 584, 585, 5, 35, 0, 0, 585, 586, 3, 48, 24, 0, 586, 587, 5, 36, 0, 0, 587, 588, 5, 17, 0, 0, 588, 589, 3, 52, 26, 0, 589, 590, 5, 18, 0, 0, 590, 599, 1, 0, 0, 0, 591, 592, 5, 35, 0, 0, 592, 593, 3, 48, 24, 0, 593, 594, 5, 36, 0, 0, 594, 595, 5, 30, 0, 0, 595, 596, 3, 312, 156, 0, 596, 597, 5, 31, 0, 0, 597, 599, 1, 0, 0, 0, 598, 577, 1, 0, 0, 0, 598, 579, 1, 0, 0, 0, 598, 584, 1, 0, 0, 0, 598, 591, 1, 0, 0, 0, 599, 45, 1, 0, 0, 0, 600, 601, 5, 35, 0, 0, 601, 602, 5, 30, 0, 0, 602, 603, 3, 50, 25, 0, 603, 604, 5, 31, 0, 0, 604, 605, 3, 48, 24, 0, 605, 635, 1, 0, 0, 0, 606, 607, 5, 35, 0, 0, 607, 608, 5, 30, 0, 0, 608, 609, 3, 50, 25, 0, 609, 610, 5, 31, 0, 0, 610, 611, 3, 48, 24, 0, 611, 612, 5, 36, 0, 0, 612, 613, 3, 6, 3, 0, 613, 635, 1, 0, 0, 0, 614, 615, 5, 35, 0, 0, 615, 616, 5, 30, 0, 0, 616, 617, 3, 50, 25, 0, 617, 618, 5, 31, 0, 0, 618, 619, 3, 48, 24, 0, 619, 620, 5, 36, 0, 0, 620, 621, 5, 17, 0, 0, 621, 622, 3, 52, 26, 0, 622, 623, 5, 18, 0, 0, 623, 635, 1, 0, 0, 0, 624, 625, 5, 35, 0, 0, 625, 626, 5, 30, 0, 0, 626, 627, 3, 50, 25, 0, 627, 628, 5, 31, 0, 0, 628, 629, 3, 48, 24, 0, 629, 630, 5, 36, 0, 0, 630, 631, 5, 30, 0, 0, 631, 632, 3, 312, 156, 0, 632, 633, 5, 31, 0, 0, 633, 635, 1, 0, 0, 0, 634, 600, 1, 0, 0, 0, 634, 606, 1, 0, 0, 0, 634, 614, 1, 0, 0, 0, 634, 624, 1, 0, 0, 0, 635, 47, 1, 0, 0, 0, 636, 637, 3, 190, 95, 0, 637, 49, 1, 0, 0, 0, 638, 641, 3, 146, 73, 0, 639, 641, 3, 198, 99, 0, 640, 638, 1, 0, 0, 0, 640, 639, 1, 0, 0, 0, 641, 51, 1, 0, 0, 0, 642, 643, 3, 54, 27, 0, 643, 644, 3, 56, 28, 0, 644, 53, 1, 0, 0, 0, 645, 648, 3, 318, 159, 0, 646, 648, 3, 40, 20, 0, 647, 645, 1, 0, 0, 0, 647, 646, 1, 0, 0, 0, 648, 651, 1, 0, 0, 0, 649, 647, 1, 0, 0, 0, 649, 650, 1, 0, 0, 0, 650, 55, 1, 0, 0, 0, 651, 649, 1, 0, 0, 0, 652, 653, 3, 58, 29, 0, 653, 654, 3, 60, 30, 0, 654, 655, 3, 2, 1, 0, 655, 656, 5, 36, 0, 0, 656, 657, 3, 318, 159, 0, 657, 660, 1, 0, 0, 0, 658, 660, 3, 40, 20, 0, 659, 652, 1, 0, 0, 0, 659, 658, 1, 0, 0, 0, 660, 663, 1, 0, 0, 0, 661, 659, 1, 0, 0, 0, 661, 662, 1, 0, 0, 0, 662, 57, 1, 0, 0, 0, 663, 661, 1, 0, 0, 0, 664, 665, 7, 4, 0, 0, 665, 59, 1, 0, 0, 0, 666, 668, 3, 62, 31, 0, 667, 669, 5, 261, 0, 0, 668, 667, 1, 0, 0, 0, 668, 669, 1, 0, 0, 0, 669, 61, 1, 0, 0, 0, 670, 680, 3, 166, 83, 0, 671, 680, 3, 2, 1, 0, 672, 680, 5, 196, 0, 0, 673, 680, 5, 197, 0, 0, 674, 675, 5, 202, 0, 0, 675, 676, 5, 39, 0, 0, 676, 680, 5, 264, 0, 0, 677, 678, 5, 202, 0, 0, 678, 680, 3, 138, 69, 0, 679, 670, 1, 0, 0, 0, 679, 671, 1, 0, 0, 0, 679, 672, 1, 0, 0, 0, 679, 673, 1, 0, 0, 0, 679, 674, 1, 0, 0, 0, 679, 677, 1, 0, 0, 0, 680, 63, 1, 0, 0, 0, 681, 682, 5, 198, 0, 0, 682, 683, 5, 40, 0, 0, 683, 688, 3, 2, 1, 0, 684, 685, 5, 198, 0, 0, 685, 688, 3, 2, 1, 0, 686, 688, 5, 198, 0, 0, 687, 681, 1, 0, 0, 0, 687, 684, 1, 0, 0, 0, 687, 686, 1, 0, 0, 0, 688, 65, 1, 0, 0, 0, 689, 690, 5, 41, 0, 0, 690, 691, 5, 42, 0, 0, 691, 692, 3, 32, 16, 0, 692, 693, 5, 43, 0, 0, 693, 694, 3, 68, 34, 0, 694, 695, 5, 44, 0, 0, 695, 696, 3, 0, 0, 0, 696, 67, 1, 0, 0, 0, 697, 710, 6, 34, -1, 0, 698, 699, 10, 5, 0, 0, 699, 709, 5, 186, 0, 0, 700, 701, 10, 4, 0, 0, 701, 709, 5, 187, 0, 0, 702, 703, 10, 3, 0, 0, 703, 709, 5, 45, 0, 0, 704, 705, 10, 2, 0, 0, 705, 709, 5, 46, 0, 0, 706, 707, 10, 1, 0, 0, 707, 709, 5, 47, 0, 0, 708, 698, 1, 0, 0, 0, 708, 700, 1, 0, 0, 0, 708, 702, 1, 0, 0, 0, 708, 704, 1, 0, 0, 0, 708, 706, 1, 0, 0, 0, 709, 712, 1, 0, 0, 0, 710, 708, 1, 0, 0, 0, 710, 711, 1, 0, 0, 0, 711, 69, 1, 0, 0, 0, 712, 710, 1, 0, 0, 0, 713, 714, 5, 48, 0, 0, 714, 715, 5, 36, 0, 0, 715, 716, 5, 30, 0, 0, 716, 717, 3, 312, 156, 0, 717, 718, 5, 31, 0, 0, 718, 71, 1, 0, 0, 0, 719, 720, 5, 49, 0, 0, 720, 721, 3, 2, 1, 0, 721, 73, 1, 0, 0, 0, 722, 726, 5, 50, 0, 0, 723, 725, 3, 76, 38, 0, 724, 723, 1, 0, 0, 0, 725, 728, 1, 0, 0, 0, 726, 724, 1, 0, 0, 0, 726, 727, 1, 0, 0, 0, 727, 729, 1, 0, 0, 0, 728, 726, 1, 0, 0, 0, 729, 730, 3, 2, 1, 0, 730, 731, 3, 204, 102, 0, 731, 732, 3, 78, 39, 0, 732, 733, 3, 80, 40, 0, 733, 75, 1, 0, 0, 0, 734, 772, 5, 51, 0, 0, 735, 772, 5, 52, 0, 0, 736, 772, 5, 199, 0, 0, 737, 772, 5, 202, 0, 0, 738, 772, 5, 221, 0, 0, 739, 772, 5, 53, 0, 0, 740, 772, 5, 54, 0, 0, 741, 772, 5, 55, 0, 0, 742, 772, 5, 56, 0, 0, 743, 772, 5, 244, 0, 0, 744, 772, 5, 15, 0, 0, 745, 772, 5, 224, 0, 0, 746, 772, 5, 57, 0, 0, 747, 772, 5, 58, 0, 0, 748, 772, 5, 59, 0, 0, 749, 772, 5, 60, 0, 0, 750, 772, 5, 61, 0, 0, 751, 752, 5, 62, 0, 0, 752, 772, 5, 51, 0, 0, 753, 754, 5, 62, 0, 0, 754, 772, 5, 52, 0, 0, 755, 756, 5, 62, 0, 0, 756, 772, 5, 63, 0, 0, 757, 758, 5, 62, 0, 0, 758, 772, 5, 64, 0, 0, 759, 760, 5, 62, 0, 0, 760, 772, 5, 65, 0, 0, 761, 762, 5, 62, 0, 0, 762, 772, 5, 66, 0, 0, 763, 772, 5, 67, 0, 0, 764, 772, 5, 68, 0, 0, 765, 772, 5, 69, 0, 0, 766, 767, 5, 70, 0, 0, 767, 768, 5, 30, 0, 0, 768, 769, 3, 32, 16, 0, 769, 770, 5, 31, 0, 0, 770, 772, 1, 0, 0, 0, 771, 734, 1, 0, 0, 0, 771, 735, 1, 0, 0, 0, 771, 736, 1, 0, 0, 0, 771, 737, 1, 0, 0, 0, 771, 738, 1, 0, 0, 0, 771, 739, 1, 0, 0, 0, 771, 740, 1, 0, 0, 0, 771, 741, 1, 0, 0, 0, 771, 742, 1, 0, 0, 0, 771, 743, 1, 0, 0, 0, 771, 744, 1, 0, 0, 0, 771, 745, 1, 0, 0, 0, 771, 746, 1, 0, 0, 0, 771, 747, 1, 0, 0, 0, 771, 748, 1, 0, 0, 0, 771, 749, 1, 0, 0, 0, 771, 750, 1, 0, 0, 0, 771, 751, 1, 0, 0, 0, 771, 753, 1, 0, 0, 0, 771, 755, 1, 0, 0, 0, 771, 757, 1, 0, 0, 0, 771, 759, 1, 0, 0, 0, 771, 761, 1, 0, 0, 0, 771, 763, 1, 0, 0, 0, 771, 764, 1, 0, 0, 0, 771, 765, 1, 0, 0, 0, 771, 766, 1, 0, 0, 0, 772, 77, 1, 0, 0, 0, 773, 777, 1, 0, 0, 0, 774, 775, 5, 71, 0, 0, 775, 777, 3, 146, 73, 0, 776, 773, 1, 0, 0, 0, 776, 774, 1, 0, 0, 0, 777, 79, 1, 0, 0, 0, 778, 782, 1, 0, 0, 0, 779, 780, 5, 72, 0, 0, 780, 782, 3, 84, 42, 0, 781, 778, 1, 0, 0, 0, 781, 779, 1, 0, 0, 0, 782, 81, 1, 0, 0, 0, 783, 785, 3, 220, 110, 0, 784, 783, 1, 0, 0, 0, 785, 788, 1, 0, 0, 0, 786, 784, 1, 0, 0, 0, 786, 787, 1, 0, 0, 0, 787, 83, 1, 0, 0, 0, 788, 786, 1, 0, 0, 0, 789, 790, 3, 146, 73, 0, 790, 791, 5, 28, 0, 0, 791, 793, 1, 0, 0, 0, 792, 789, 1, 0, 0, 0, 793, 796, 1, 0, 0, 0, 794, 792, 1, 0, 0, 0, 794, 795, 1, 0, 0, 0, 795, 797, 1, 0, 0, 0, 796, 794, 1, 0, 0, 0, 797, 798, 3, 146, 73, 0, 798, 85, 1, 0, 0, 0, 799, 800, 7, 5, 0, 0, 800, 87, 1, 0, 0, 0, 801, 802, 3, 86, 43, 0, 802, 803, 3, 32, 16, 0, 803, 804, 5, 264, 0, 0, 804, 905, 1, 0, 0, 0, 805, 806, 3, 86, 43, 0, 806, 807, 3, 32, 16, 0, 807, 905, 1, 0, 0, 0, 808, 809, 3, 86, 43, 0, 809, 810, 3, 32, 16, 0, 810, 811, 5, 75, 0, 0, 811, 812, 3, 32, 16, 0, 812, 813, 5, 264, 0, 0, 813, 905, 1, 0, 0, 0, 814, 815, 3, 86, 43, 0, 815, 816, 3, 32, 16, 0, 816, 817, 5, 75, 0, 0, 817, 818, 3, 32, 16, 0, 818, 905, 1, 0, 0, 0, 819, 820, 3, 86, 43, 0, 820, 821, 3, 32, 16, 0, 821, 822, 5, 75, 0, 0, 822, 823, 3, 32, 16, 0, 823, 824, 5, 28, 0, 0, 824, 825, 3, 32, 16, 0, 825, 826, 5, 264, 0, 0, 826, 905, 1, 0, 0, 0, 827, 828, 3, 86, 43, 0, 828, 829, 3, 32, 16, 0, 829, 830, 5, 75, 0, 0, 830, 831, 3, 32, 16, 0, 831, 832, 5, 28, 0, 0, 832, 833, 3, 32, 16, 0, 833, 905, 1, 0, 0, 0, 834, 835, 3, 86, 43, 0, 835, 836, 3, 32, 16, 0, 836, 837, 5, 28, 0, 0, 837, 838, 3, 32, 16, 0, 838, 839, 5, 75, 0, 0, 839, 840, 3, 32, 16, 0, 840, 841, 5, 264, 0, 0, 841, 905, 1, 0, 0, 0, 842, 843, 3, 86, 43, 0, 843, 844, 3, 32, 16, 0, 844, 845, 5, 28, 0, 0, 845, 846, 3, 32, 16, 0, 846, 847, 5, 75, 0, 0, 847, 848, 3, 32, 16, 0, 848, 905, 1, 0, 0, 0, 849, 850, 3, 86, 43, 0, 850, 851, 3, 32, 16, 0, 851, 852, 5, 28, 0, 0, 852, 853, 3, 32, 16, 0, 853, 854, 5, 75, 0, 0, 854, 855, 3, 32, 16, 0, 855, 856, 5, 28, 0, 0, 856, 857, 3, 32, 16, 0, 857, 858, 5, 264, 0, 0, 858, 905, 1, 0, 0, 0, 859, 860, 3, 86, 43, 0, 860, 861, 3, 32, 16, 0, 861, 862, 5, 28, 0, 0, 862, 863, 3, 32, 16, 0, 863, 864, 5, 75, 0, 0, 864, 865, 3, 32, 16, 0, 865, 866, 5, 28, 0, 0, 866, 867, 3, 32, 16, 0, 867, 905, 1, 0, 0, 0, 868, 869, 3, 86, 43, 0, 869, 870, 3, 32, 16, 0, 870, 871, 5, 263, 0, 0, 871, 905, 1, 0, 0, 0, 872, 873, 3, 86, 43, 0, 873, 874, 3, 32, 16, 0, 874, 875, 5, 75, 0, 0, 875, 876, 3, 32, 16, 0, 876, 877, 5, 263, 0, 0, 877, 905, 1, 0, 0, 0, 878, 879, 3, 86, 43, 0, 879, 880, 3, 32, 16, 0, 880, 881, 5, 75, 0, 0, 881, 882, 3, 32, 16, 0, 882, 883, 5, 28, 0, 0, 883, 884, 3, 32, 16, 0, 884, 885, 5, 263, 0, 0, 885, 905, 1, 0, 0, 0, 886, 887, 3, 86, 43, 0, 887, 888, 3, 32, 16, 0, 888, 889, 5, 28, 0, 0, 889, 890, 3, 32, 16, 0, 890, 891, 5, 75, 0, 0, 891, 892, 3, 32, 16, 0, 892, 893, 5, 263, 0, 0, 893, 905, 1, 0, 0, 0, 894, 895, 3, 86, 43, 0, 895, 896, 3, 32, 16, 0, 896, 897, 5, 28, 0, 0, 897, 898, 3, 32, 16, 0, 898, 899, 5, 75, 0, 0, 899, 900, 3, 32, 16, 0, 900, 901, 5, 28, 0, 0, 901, 902, 3, 32, 16, 0, 902, 903, 5, 263, 0, 0, 903, 905, 1, 0, 0, 0, 904, 801, 1, 0, 0, 0, 904, 805, 1, 0, 0, 0, 904, 808, 1, 0, 0, 0, 904, 814, 1, 0, 0, 0, 904, 819, 1, 0, 0, 0, 904, 827, 1, 0, 0, 0, 904, 834, 1, 0, 0, 0, 904, 842, 1, 0, 0, 0, 904, 849, 1, 0, 0, 0, 904, 859, 1, 0, 0, 0, 904, 868, 1, 0, 0, 0, 904, 872, 1, 0, 0, 0, 904, 878, 1, 0, 0, 0, 904, 886, 1, 0, 0, 0, 904, 894, 1, 0, 0, 0, 905, 89, 1, 0, 0, 0, 906, 910, 5, 21, 0, 0, 907, 909, 3, 92, 46, 0, 908, 907, 1, 0, 0, 0, 909, 912, 1, 0, 0, 0, 910, 908, 1, 0, 0, 0, 910, 911, 1, 0, 0, 0, 911, 913, 1, 0, 0, 0, 912, 910, 1, 0, 0, 0, 913, 914, 3, 2, 1, 0, 914, 915, 3, 94, 47, 0, 915, 916, 5, 180, 0, 0, 916, 917, 5, 36, 0, 0, 917, 918, 5, 30, 0, 0, 918, 919, 3, 312, 156, 0, 919, 920, 5, 31, 0, 0, 920, 921, 3, 94, 47, 0, 921, 933, 1, 0, 0, 0, 922, 926, 5, 21, 0, 0, 923, 925, 3, 92, 46, 0, 924, 923, 1, 0, 0, 0, 925, 928, 1, 0, 0, 0, 926, 924, 1, 0, 0, 0, 926, 927, 1, 0, 0, 0, 927, 929, 1, 0, 0, 0, 928, 926, 1, 0, 0, 0, 929, 930, 3, 2, 1, 0, 930, 931, 3, 94, 47, 0, 931, 933, 1, 0, 0, 0, 932, 906, 1, 0, 0, 0, 932, 922, 1, 0, 0, 0, 933, 91, 1, 0, 0, 0, 934, 935, 5, 76, 0, 0, 935, 93, 1, 0, 0, 0, 936, 939, 1, 0, 0, 0, 937, 939, 5, 298, 0, 0, 938, 936, 1, 0, 0, 0, 938, 937, 1, 0, 0, 0, 939, 95, 1, 0, 0, 0, 940, 941, 7, 6, 0, 0, 941, 97, 1, 0, 0, 0, 942, 944, 3, 96, 48, 0, 943, 942, 1, 0, 0, 0, 944, 947, 1, 0, 0, 0, 945, 943, 1, 0, 0, 0, 945, 946, 1, 0, 0, 0, 946, 99, 1, 0, 0, 0, 947, 945, 1, 0, 0, 0, 948, 949, 5, 275, 0, 0, 949, 101, 1, 0, 0, 0, 950, 951, 5, 276, 0, 0, 951, 103, 1, 0, 0, 0, 952, 953, 5, 277, 0, 0, 953, 105, 1, 0, 0, 0, 954, 955, 5, 278, 0, 0, 955, 107, 1, 0, 0, 0, 956, 957, 5, 279, 0, 0, 957, 109, 1, 0, 0, 0, 958, 959, 5, 282, 0, 0, 959, 111, 1, 0, 0, 0, 960, 961, 5, 280, 0, 0, 961, 113, 1, 0, 0, 0, 962, 963, 5, 286, 0, 0, 963, 115, 1, 0, 0, 0, 964, 965, 5, 284, 0, 0, 965, 117, 1, 0, 0, 0, 966, 967, 5, 285, 0, 0, 967, 119, 1, 0, 0, 0, 968, 969, 5, 281, 0, 0, 969, 121, 1, 0, 0, 0, 970, 971, 5, 287, 0, 0, 971, 123, 1, 0, 0, 0, 972, 973, 5, 283, 0, 0, 973, 125, 1, 0, 0, 0, 974, 1057, 3, 100, 50, 0, 975, 976, 3, 102, 51, 0, 976, 977, 3, 32, 16, 0, 977, 1057, 1, 0, 0, 0, 978, 979, 3, 102, 51, 0, 979, 980, 3, 0, 0, 0, 980, 1057, 1, 0, 0, 0, 981, 982, 3, 104, 52, 0, 982, 983, 3, 32, 16, 0, 983, 1057, 1, 0, 0, 0, 984, 985, 3, 106, 53, 0, 985, 986, 3, 34, 17, 0, 986, 1057, 1, 0, 0, 0, 987, 988, 3, 108, 54, 0, 988, 989, 3, 36, 18, 0, 989, 1057, 1, 0, 0, 0, 990, 991, 3, 108, 54, 0, 991, 992, 3, 34, 17, 0, 992, 1057, 1, 0, 0, 0, 993, 994, 3, 108, 54, 0, 994, 995, 5, 30, 0, 0, 995, 996, 3, 312, 156, 0, 996, 997, 5, 31, 0, 0, 997, 1057, 1, 0, 0, 0, 998, 999, 3, 108, 54, 0, 999, 1000, 5, 84, 0, 0, 1000, 1001, 5, 30, 0, 0, 1001, 1002, 3, 312, 156, 0, 1002, 1003, 5, 31, 0, 0, 1003, 1057, 1, 0, 0, 0, 1004, 1005, 3, 110, 55, 0, 1005, 1006, 3, 32, 16, 0, 1006, 1057, 1, 0, 0, 0, 1007, 1008, 3, 110, 55, 0, 1008, 1009, 3, 0, 0, 0, 1009, 1057, 1, 0, 0, 0, 1010, 1011, 3, 112, 56, 0, 1011, 1012, 3, 190, 95, 0, 1012, 1057, 1, 0, 0, 0, 1013, 1014, 3, 114, 57, 0, 1014, 1015, 3, 200, 100, 0, 1015, 1057, 1, 0, 0, 0, 1016, 1017, 3, 114, 57, 0, 1017, 1018, 3, 196, 98, 0, 1018, 1057, 1, 0, 0, 0, 1019, 1020, 3, 116, 58, 0, 1020, 1021, 3, 146, 73, 0, 1021, 1057, 1, 0, 0, 0, 1022, 1023, 3, 118, 59, 0, 1023, 1024, 3, 6, 3, 0, 1024, 1057, 1, 0, 0, 0, 1025, 1026, 3, 118, 59, 0, 1026, 1027, 5, 224, 0, 0, 1027, 1028, 5, 30, 0, 0, 1028, 1029, 3, 6, 3, 0, 1029, 1030, 5, 31, 0, 0, 1030, 1057, 1, 0, 0, 0, 1031, 1032, 3, 118, 59, 0, 1032, 1033, 5, 84, 0, 0, 1033, 1034, 5, 30, 0, 0, 1034, 1035, 3, 312, 156, 0, 1035, 1036, 5, 31, 0, 0, 1036, 1057, 1, 0, 0, 0, 1037, 1038, 3, 120, 60, 0, 1038, 1039, 3, 192, 96, 0, 1039, 1040, 3, 160, 80, 0, 1040, 1041, 3, 134, 67, 0, 1041, 1057, 1, 0, 0, 0, 1042, 1043, 3, 122, 61, 0, 1043, 1044, 3, 50, 25, 0, 1044, 1057, 1, 0, 0, 0, 1045, 1046, 3, 122, 61, 0, 1046, 1047, 3, 32, 16, 0, 1047, 1057, 1, 0, 0, 0, 1048, 1049, 3, 124, 62, 0, 1049, 1050, 5, 30, 0, 0, 1050, 1051, 3, 128, 64, 0, 1051, 1052, 5, 31, 0, 0, 1052, 1057, 1, 0, 0, 0, 1053, 1054, 3, 124, 62, 0, 1054, 1055, 5, 85, 0, 0, 1055, 1057, 1, 0, 0, 0, 1056, 974, 1, 0, 0, 0, 1056, 975, 1, 0, 0, 0, 1056, 978, 1, 0, 0, 0, 1056, 981, 1, 0, 0, 0, 1056, 984, 1, 0, 0, 0, 1056, 987, 1, 0, 0, 0, 1056, 990, 1, 0, 0, 0, 1056, 993, 1, 0, 0, 0, 1056, 998, 1, 0, 0, 0, 1056, 1004, 1, 0, 0, 0, 1056, 1007, 1, 0, 0, 0, 1056, 1010, 1, 0, 0, 0, 1056, 1013, 1, 0, 0, 0, 1056, 1016, 1, 0, 0, 0, 1056, 1019, 1, 0, 0, 0, 1056, 1022, 1, 0, 0, 0, 1056, 1025, 1, 0, 0, 0, 1056, 1031, 1, 0, 0, 0, 1056, 1037, 1, 0, 0, 0, 1056, 1042, 1, 0, 0, 0, 1056, 1045, 1, 0, 0, 0, 1056, 1048, 1, 0, 0, 0, 1056, 1053, 1, 0, 0, 0, 1057, 127, 1, 0, 0, 0, 1058, 1075, 1, 0, 0, 0, 1059, 1062, 3, 0, 0, 0, 1060, 1062, 3, 32, 16, 0, 1061, 1059, 1, 0, 0, 0, 1061, 1060, 1, 0, 0, 0, 1062, 1063, 1, 0, 0, 0, 1063, 1064, 5, 28, 0, 0, 1064, 1066, 1, 0, 0, 0, 1065, 1061, 1, 0, 0, 0, 1066, 1069, 1, 0, 0, 0, 1067, 1065, 1, 0, 0, 0, 1067, 1068, 1, 0, 0, 0, 1068, 1072, 1, 0, 0, 0, 1069, 1067, 1, 0, 0, 0, 1070, 1073, 3, 0, 0, 0, 1071, 1073, 3, 32, 16, 0, 1072, 1070, 1, 0, 0, 0, 1072, 1071, 1, 0, 0, 0, 1073, 1075, 1, 0, 0, 0, 1074, 1058, 1, 0, 0, 0, 1074, 1067, 1, 0, 0, 0, 1075, 129, 1, 0, 0, 0, 1076, 1082, 5, 86, 0, 0, 1077, 1078, 3, 160, 80, 0, 1078, 1079, 5, 28, 0, 0, 1079, 1081, 1, 0, 0, 0, 1080, 1077, 1, 0, 0, 0, 1081, 1084, 1, 0, 0, 0, 1082, 1080, 1, 0, 0, 0, 1082, 1083, 1, 0, 0, 0, 1083, 1085, 1, 0, 0, 0, 1084, 1082, 1, 0, 0, 0, 1085, 1086, 3, 160, 80, 0, 1086, 1087, 5, 87, 0, 0, 1087, 131, 1, 0, 0, 0, 1088, 1094, 5, 42, 0, 0, 1089, 1090, 3, 168, 84, 0, 1090, 1091, 5, 28, 0, 0, 1091, 1093, 1, 0, 0, 0, 1092, 1089, 1, 0, 0, 0, 1093, 1096, 1, 0, 0, 0, 1094, 1092, 1, 0, 0, 0, 1094, 1095, 1, 0, 0, 0, 1095, 1097, 1, 0, 0, 0, 1096, 1094, 1, 0, 0, 0, 1097, 1098, 3, 168, 84, 0, 1098, 1099, 5, 43, 0, 0, 1099, 133, 1, 0, 0, 0, 1100, 1106, 5, 30, 0, 0, 1101, 1102, 3, 136, 68, 0, 1102, 1103, 5, 28, 0, 0, 1103, 1105, 1, 0, 0, 0, 1104, 1101, 1, 0, 0, 0, 1105, 1108, 1, 0, 0, 0, 1106, 1104, 1, 0, 0, 0, 1106, 1107, 1, 0, 0, 0, 1107, 1109, 1, 0, 0, 0, 1108, 1106, 1, 0, 0, 0, 1109, 1110, 3, 136, 68, 0, 1110, 1111, 5, 31, 0, 0, 1111, 1114, 1, 0, 0, 0, 1112, 1114, 5, 85, 0, 0, 1113, 1100, 1, 0, 0, 0, 1113, 1112, 1, 0, 0, 0, 1114, 135, 1, 0, 0, 0, 1115, 1123, 5, 177, 0, 0, 1116, 1117, 3, 252, 126, 0, 1117, 1118, 3, 160, 80, 0, 1118, 1120, 3, 248, 124, 0, 1119, 1121, 3, 0, 0, 0, 1120, 1119, 1, 0, 0, 0, 1120, 1121, 1, 0, 0, 0, 1121, 1123, 1, 0, 0, 0, 1122, 1115, 1, 0, 0, 0, 1122, 1116, 1, 0, 0, 0, 1123, 137, 1, 0, 0, 0, 1124, 1125, 5, 42, 0, 0, 1125, 1126, 3, 2, 1, 0, 1126, 1127, 5, 43, 0, 0, 1127, 1128, 3, 140, 70, 0, 1128, 1150, 1, 0, 0, 0, 1129, 1130, 5, 42, 0, 0, 1130, 1131, 3, 196, 98, 0, 1131, 1132, 5, 43, 0, 0, 1132, 1133, 3, 140, 70, 0, 1133, 1150, 1, 0, 0, 0, 1134, 1135, 5, 42, 0, 0, 1135, 1136, 5, 262, 0, 0, 1136, 1137, 5, 43, 0, 0, 1137, 1150, 3, 140, 70, 0, 1138, 1139, 5, 42, 0, 0, 1139, 1140, 5, 198, 0, 0, 1140, 1141, 3, 2, 1, 0, 1141, 1142, 5, 43, 0, 0, 1142, 1143, 3, 140, 70, 0, 1143, 1150, 1, 0, 0, 0, 1144, 1150, 3, 140, 70, 0, 1145, 1150, 3, 196, 98, 0, 1146, 1150, 5, 257, 0, 0, 1147, 1150, 5, 258, 0, 0, 1148, 1150, 5, 259, 0, 0, 1149, 1124, 1, 0, 0, 0, 1149, 1129, 1, 0, 0, 0, 1149, 1134, 1, 0, 0, 0, 1149, 1138, 1, 0, 0, 0, 1149, 1144, 1, 0, 0, 0, 1149, 1145, 1, 0, 0, 0, 1149, 1146, 1, 0, 0, 0, 1149, 1147, 1, 0, 0, 0, 1149, 1148, 1, 0, 0, 0, 1150, 139, 1, 0, 0, 0, 1151, 1152, 3, 2, 1, 0, 1152, 1153, 5, 88, 0, 0, 1153, 1155, 1, 0, 0, 0, 1154, 1151, 1, 0, 0, 0, 1155, 1158, 1, 0, 0, 0, 1156, 1154, 1, 0, 0, 0, 1156, 1157, 1, 0, 0, 0, 1157, 1159, 1, 0, 0, 0, 1158, 1156, 1, 0, 0, 0, 1159, 1160, 3, 2, 1, 0, 1160, 141, 1, 0, 0, 0, 1161, 1163, 3, 144, 72, 0, 1162, 1161, 1, 0, 0, 0, 1163, 1166, 1, 0, 0, 0, 1164, 1162, 1, 0, 0, 0, 1164, 1165, 1, 0, 0, 0, 1165, 143, 1, 0, 0, 0, 1166, 1164, 1, 0, 0, 0, 1167, 1168, 5, 180, 0, 0, 1168, 1169, 5, 89, 0, 0, 1169, 1173, 3, 32, 16, 0, 1170, 1173, 3, 174, 87, 0, 1171, 1173, 3, 344, 172, 0, 1172, 1167, 1, 0, 0, 0, 1172, 1170, 1, 0, 0, 0, 1172, 1171, 1, 0, 0, 0, 1173, 145, 1, 0, 0, 0, 1174, 1186, 3, 138, 69, 0, 1175, 1176, 5, 42, 0, 0, 1176, 1177, 3, 2, 1, 0, 1177, 1178, 5, 43, 0, 0, 1178, 1186, 1, 0, 0, 0, 1179, 1180, 5, 42, 0, 0, 1180, 1181, 5, 198, 0, 0, 1181, 1182, 3, 2, 1, 0, 1182, 1183, 5, 43, 0, 0, 1183, 1186, 1, 0, 0, 0, 1184, 1186, 3, 160, 80, 0, 1185, 1174, 1, 0, 0, 0, 1185, 1175, 1, 0, 0, 0, 1185, 1179, 1, 0, 0, 0, 1185, 1184, 1, 0, 0, 0, 1186, 147, 1, 0, 0, 0, 1187, 1196, 1, 0, 0, 0, 1188, 1192, 3, 152, 76, 0, 1189, 1191, 3, 150, 75, 0, 1190, 1189, 1, 0, 0, 0, 1191, 1194, 1, 0, 0, 0, 1192, 1190, 1, 0, 0, 0, 1192, 1193, 1, 0, 0, 0, 1193, 1196, 1, 0, 0, 0, 1194, 1192, 1, 0, 0, 0, 1195, 1187, 1, 0, 0, 0, 1195, 1188, 1, 0, 0, 0, 1196, 149, 1, 0, 0, 0, 1197, 1215, 5, 262, 0, 0, 1198, 1215, 5, 261, 0, 0, 1199, 1200, 5, 42, 0, 0, 1200, 1201, 3, 32, 16, 0, 1201, 1202, 5, 43, 0, 0, 1202, 1215, 1, 0, 0, 0, 1203, 1204, 5, 42, 0, 0, 1204, 1205, 3, 32, 16, 0, 1205, 1206, 5, 266, 0, 0, 1206, 1207, 3, 32, 16, 0, 1207, 1208, 5, 43, 0, 0, 1208, 1215, 1, 0, 0, 0, 1209, 1210, 5, 42, 0, 0, 1210, 1211, 5, 266, 0, 0, 1211, 1212, 3, 32, 16, 0, 1212, 1213, 5, 43, 0, 0, 1213, 1215, 1, 0, 0, 0, 1214, 1197, 1, 0, 0, 0, 1214, 1198, 1, 0, 0, 0, 1214, 1199, 1, 0, 0, 0, 1214, 1203, 1, 0, 0, 0, 1214, 1209, 1, 0, 0, 0, 1215, 151, 1, 0, 0, 0, 1216, 1309, 1, 0, 0, 0, 1217, 1218, 5, 203, 0, 0, 1218, 1219, 5, 30, 0, 0, 1219, 1220, 3, 6, 3, 0, 1220, 1221, 5, 28, 0, 0, 1221, 1222, 3, 6, 3, 0, 1222, 1223, 5, 28, 0, 0, 1223, 1224, 3, 6, 3, 0, 1224, 1225, 5, 28, 0, 0, 1225, 1226, 3, 6, 3, 0, 1226, 1227, 5, 31, 0, 0, 1227, 1309, 1, 0, 0, 0, 1228, 1229, 5, 203, 0, 0, 1229, 1230, 5, 30, 0, 0, 1230, 1231, 3, 6, 3, 0, 1231, 1232, 5, 28, 0, 0, 1232, 1233, 3, 6, 3, 0, 1233, 1234, 5, 31, 0, 0, 1234, 1309, 1, 0, 0, 0, 1235, 1236, 5, 204, 0, 0, 1236, 1237, 5, 205, 0, 0, 1237, 1238, 5, 42, 0, 0, 1238, 1239, 3, 32, 16, 0, 1239, 1240, 5, 43, 0, 0, 1240, 1309, 1, 0, 0, 0, 1241, 1242, 5, 204, 0, 0, 1242, 1243, 5, 206, 0, 0, 1243, 1244, 5, 42, 0, 0, 1244, 1245, 3, 32, 16, 0, 1245, 1246, 5, 43, 0, 0, 1246, 1247, 3, 148, 74, 0, 1247, 1309, 1, 0, 0, 0, 1248, 1309, 5, 207, 0, 0, 1249, 1309, 5, 208, 0, 0, 1250, 1309, 5, 209, 0, 0, 1251, 1309, 5, 201, 0, 0, 1252, 1309, 5, 183, 0, 0, 1253, 1309, 5, 184, 0, 0, 1254, 1309, 5, 185, 0, 0, 1255, 1309, 5, 186, 0, 0, 1256, 1309, 5, 187, 0, 0, 1257, 1309, 5, 188, 0, 0, 1258, 1309, 5, 189, 0, 0, 1259, 1309, 5, 210, 0, 0, 1260, 1309, 5, 190, 0, 0, 1261, 1309, 5, 191, 0, 0, 1262, 1309, 5, 192, 0, 0, 1263, 1309, 5, 193, 0, 0, 1264, 1309, 5, 211, 0, 0, 1265, 1309, 5, 212, 0, 0, 1266, 1309, 5, 213, 0, 0, 1267, 1309, 5, 214, 0, 0, 1268, 1309, 5, 215, 0, 0, 1269, 1309, 5, 216, 0, 0, 1270, 1309, 5, 217, 0, 0, 1271, 1272, 5, 218, 0, 0, 1272, 1309, 3, 154, 77, 0, 1273, 1274, 5, 219, 0, 0, 1274, 1309, 3, 154, 77, 0, 1275, 1309, 5, 220, 0, 0, 1276, 1277, 5, 221, 0, 0, 1277, 1309, 3, 154, 77, 0, 1278, 1279, 5, 222, 0, 0, 1279, 1309, 3, 156, 78, 0, 1280, 1281, 5, 222, 0, 0, 1281, 1282, 3, 156, 78, 0, 1282, 1283, 5, 28, 0, 0, 1283, 1284, 3, 6, 3, 0, 1284, 1309, 1, 0, 0, 0, 1285, 1309, 5, 194, 0, 0, 1286, 1309, 5, 195, 0, 0, 1287, 1288, 5, 90, 0, 0, 1288, 1309, 5, 184, 0, 0, 1289, 1290, 5, 90, 0, 0, 1290, 1309, 5, 185, 0, 0, 1291, 1292, 5, 90, 0, 0, 1292, 1309, 5, 186, 0, 0, 1293, 1294, 5, 90, 0, 0, 1294, 1309, 5, 187, 0, 0, 1295, 1296, 5, 62, 0, 0, 1296, 1309, 5, 220, 0, 0, 1297, 1309, 5, 223, 0, 0, 1298, 1299, 5, 224, 0, 0, 1299, 1309, 5, 213, 0, 0, 1300, 1309, 5, 225, 0, 0, 1301, 1302, 5, 207, 0, 0, 1302, 1309, 5, 183, 0, 0, 1303, 1309, 5, 226, 0, 0, 1304, 1309, 5, 228, 0, 0, 1305, 1306, 5, 34, 0, 0, 1306, 1309, 5, 227, 0, 0, 1307, 1309, 3, 2, 1, 0, 1308, 1216, 1, 0, 0, 0, 1308, 1217, 1, 0, 0, 0, 1308, 1228, 1, 0, 0, 0, 1308, 1235, 1, 0, 0, 0, 1308, 1241, 1, 0, 0, 0, 1308, 1248, 1, 0, 0, 0, 1308, 1249, 1, 0, 0, 0, 1308, 1250, 1, 0, 0, 0, 1308, 1251, 1, 0, 0, 0, 1308, 1252, 1, 0, 0, 0, 1308, 1253, 1, 0, 0, 0, 1308, 1254, 1, 0, 0, 0, 1308, 1255, 1, 0, 0, 0, 1308, 1256, 1, 0, 0, 0, 1308, 1257, 1, 0, 0, 0, 1308, 1258, 1, 0, 0, 0, 1308, 1259, 1, 0, 0, 0, 1308, 1260, 1, 0, 0, 0, 1308, 1261, 1, 0, 0, 0, 1308, 1262, 1, 0, 0, 0, 1308, 1263, 1, 0, 0, 0, 1308, 1264, 1, 0, 0, 0, 1308, 1265, 1, 0, 0, 0, 1308, 1266, 1, 0, 0, 0, 1308, 1267, 1, 0, 0, 0, 1308, 1268, 1, 0, 0, 0, 1308, 1269, 1, 0, 0, 0, 1308, 1270, 1, 0, 0, 0, 1308, 1271, 1, 0, 0, 0, 1308, 1273, 1, 0, 0, 0, 1308, 1275, 1, 0, 0, 0, 1308, 1276, 1, 0, 0, 0, 1308, 1278, 1, 0, 0, 0, 1308, 1280, 1, 0, 0, 0, 1308, 1285, 1, 0, 0, 0, 1308, 1286, 1, 0, 0, 0, 1308, 1287, 1, 0, 0, 0, 1308, 1289, 1, 0, 0, 0, 1308, 1291, 1, 0, 0, 0, 1308, 1293, 1, 0, 0, 0, 1308, 1295, 1, 0, 0, 0, 1308, 1297, 1, 0, 0, 0, 1308, 1298, 1, 0, 0, 0, 1308, 1300, 1, 0, 0, 0, 1308, 1301, 1, 0, 0, 0, 1308, 1303, 1, 0, 0, 0, 1308, 1304, 1, 0, 0, 0, 1308, 1305, 1, 0, 0, 0, 1308, 1307, 1, 0, 0, 0, 1309, 153, 1, 0, 0, 0, 1310, 1318, 1, 0, 0, 0, 1311, 1312, 5, 30, 0, 0, 1312, 1313, 5, 91, 0, 0, 1313, 1314, 5, 36, 0, 0, 1314, 1315, 3, 32, 16, 0, 1315, 1316, 5, 31, 0, 0, 1316, 1318, 1, 0, 0, 0, 1317, 1310, 1, 0, 0, 0, 1317, 1311, 1, 0, 0, 0, 1318, 155, 1, 0, 0, 0, 1319, 1328, 1, 0, 0, 0, 1320, 1324, 3, 158, 79, 0, 1321, 1323, 7, 7, 0, 0, 1322, 1321, 1, 0, 0, 0, 1323, 1326, 1, 0, 0, 0, 1324, 1322, 1, 0, 0, 0, 1324, 1325, 1, 0, 0, 0, 1325, 1328, 1, 0, 0, 0, 1326, 1324, 1, 0, 0, 0, 1327, 1319, 1, 0, 0, 0, 1327, 1320, 1, 0, 0, 0, 1328, 157, 1, 0, 0, 0, 1329, 1330, 7, 8, 0, 0, 1330, 159, 1, 0, 0, 0, 1331, 1335, 3, 164, 82, 0, 1332, 1334, 3, 162, 81, 0, 1333, 1332, 1, 0, 0, 0, 1334, 1337, 1, 0, 0, 0, 1335, 1333, 1, 0, 0, 0, 1335, 1336, 1, 0, 0, 0, 1336, 161, 1, 0, 0, 0, 1337, 1335, 1, 0, 0, 0, 1338, 1357, 5, 261, 0, 0, 1339, 1340, 5, 42, 0, 0, 1340, 1357, 5, 43, 0, 0, 1341, 1357, 3, 132, 66, 0, 1342, 1357, 5, 260, 0, 0, 1343, 1357, 5, 262, 0, 0, 1344, 1357, 5, 92, 0, 0, 1345, 1346, 5, 93, 0, 0, 1346, 1347, 5, 30, 0, 0, 1347, 1348, 3, 146, 73, 0, 1348, 1349, 5, 31, 0, 0, 1349, 1357, 1, 0, 0, 0, 1350, 1351, 5, 94, 0, 0, 1351, 1352, 5, 30, 0, 0, 1352, 1353, 3, 146, 73, 0, 1353, 1354, 5, 31, 0, 0, 1354, 1357, 1, 0, 0, 0, 1355, 1357, 3, 130, 65, 0, 1356, 1338, 1, 0, 0, 0, 1356, 1339, 1, 0, 0, 0, 1356, 1341, 1, 0, 0, 0, 1356, 1342, 1, 0, 0, 0, 1356, 1343, 1, 0, 0, 0, 1356, 1344, 1, 0, 0, 0, 1356, 1345, 1, 0, 0, 0, 1356, 1350, 1, 0, 0, 0, 1356, 1355, 1, 0, 0, 0, 1357, 163, 1, 0, 0, 0, 1358, 1359, 5, 39, 0, 0, 1359, 1389, 3, 138, 69, 0, 1360, 1389, 5, 197, 0, 0, 1361, 1362, 5, 199, 0, 0, 1362, 1363, 5, 39, 0, 0, 1363, 1389, 3, 138, 69, 0, 1364, 1365, 5, 200, 0, 0, 1365, 1389, 3, 138, 69, 0, 1366, 1367, 5, 226, 0, 0, 1367, 1368, 3, 192, 96, 0, 1368, 1369, 3, 160, 80, 0, 1369, 1370, 5, 262, 0, 0, 1370, 1371, 3, 134, 67, 0, 1371, 1389, 1, 0, 0, 0, 1372, 1373, 5, 253, 0, 0, 1373, 1389, 3, 32, 16, 0, 1374, 1375, 5, 252, 0, 0, 1375, 1389, 3, 32, 16, 0, 1376, 1377, 5, 253, 0, 0, 1377, 1389, 3, 2, 1, 0, 1378, 1379, 5, 252, 0, 0, 1379, 1389, 3, 2, 1, 0, 1380, 1389, 5, 254, 0, 0, 1381, 1389, 5, 201, 0, 0, 1382, 1389, 3, 170, 85, 0, 1383, 1389, 3, 172, 86, 0, 1384, 1389, 3, 166, 83, 0, 1385, 1389, 3, 2, 1, 0, 1386, 1387, 5, 177, 0, 0, 1387, 1389, 3, 160, 80, 0, 1388, 1358, 1, 0, 0, 0, 1388, 1360, 1, 0, 0, 0, 1388, 1361, 1, 0, 0, 0, 1388, 1364, 1, 0, 0, 0, 1388, 1366, 1, 0, 0, 0, 1388, 1372, 1, 0, 0, 0, 1388, 1374, 1, 0, 0, 0, 1388, 1376, 1, 0, 0, 0, 1388, 1378, 1, 0, 0, 0, 1388, 1380, 1, 0, 0, 0, 1388, 1381, 1, 0, 0, 0, 1388, 1382, 1, 0, 0, 0, 1388, 1383, 1, 0, 0, 0, 1388, 1384, 1, 0, 0, 0, 1388, 1385, 1, 0, 0, 0, 1388, 1386, 1, 0, 0, 0, 1389, 165, 1, 0, 0, 0, 1390, 1412, 5, 181, 0, 0, 1391, 1412, 5, 182, 0, 0, 1392, 1412, 5, 183, 0, 0, 1393, 1412, 5, 184, 0, 0, 1394, 1412, 5, 185, 0, 0, 1395, 1412, 5, 186, 0, 0, 1396, 1412, 5, 187, 0, 0, 1397, 1412, 5, 188, 0, 0, 1398, 1412, 5, 189, 0, 0, 1399, 1412, 5, 190, 0, 0, 1400, 1412, 5, 191, 0, 0, 1401, 1412, 5, 192, 0, 0, 1402, 1412, 5, 193, 0, 0, 1403, 1404, 5, 90, 0, 0, 1404, 1412, 5, 184, 0, 0, 1405, 1406, 5, 90, 0, 0, 1406, 1412, 5, 185, 0, 0, 1407, 1408, 5, 90, 0, 0, 1408, 1412, 5, 186, 0, 0, 1409, 1410, 5, 90, 0, 0, 1410, 1412, 5, 187, 0, 0, 1411, 1390, 1, 0, 0, 0, 1411, 1391, 1, 0, 0, 0, 1411, 1392, 1, 0, 0, 0, 1411, 1393, 1, 0, 0, 0, 1411, 1394, 1, 0, 0, 0, 1411, 1395, 1, 0, 0, 0, 1411, 1396, 1, 0, 0, 0, 1411, 1397, 1, 0, 0, 0, 1411, 1398, 1, 0, 0, 0, 1411, 1399, 1, 0, 0, 0, 1411, 1400, 1, 0, 0, 0, 1411, 1401, 1, 0, 0, 0, 1411, 1402, 1, 0, 0, 0, 1411, 1403, 1, 0, 0, 0, 1411, 1405, 1, 0, 0, 0, 1411, 1407, 1, 0, 0, 0, 1411, 1409, 1, 0, 0, 0, 1412, 167, 1, 0, 0, 0, 1413, 1424, 1, 0, 0, 0, 1414, 1424, 5, 177, 0, 0, 1415, 1424, 3, 32, 16, 0, 1416, 1417, 3, 32, 16, 0, 1417, 1418, 5, 177, 0, 0, 1418, 1419, 3, 32, 16, 0, 1419, 1424, 1, 0, 0, 0, 1420, 1421, 3, 32, 16, 0, 1421, 1422, 5, 177, 0, 0, 1422, 1424, 1, 0, 0, 0, 1423, 1413, 1, 0, 0, 0, 1423, 1414, 1, 0, 0, 0, 1423, 1415, 1, 0, 0, 0, 1423, 1416, 1, 0, 0, 0, 1423, 1420, 1, 0, 0, 0, 1424, 169, 1, 0, 0, 0, 1425, 1426, 5, 1, 0, 0, 1426, 1427, 5, 194, 0, 0, 1427, 171, 1, 0, 0, 0, 1428, 1432, 5, 1, 0, 0, 1429, 1430, 5, 90, 0, 0, 1430, 1433, 5, 194, 0, 0, 1431, 1433, 5, 195, 0, 0, 1432, 1429, 1, 0, 0, 0, 1432, 1431, 1, 0, 0, 0, 1433, 173, 1, 0, 0, 0, 1434, 1435, 5, 294, 0, 0, 1435, 1436, 3, 188, 94, 0, 1436, 1437, 3, 146, 73, 0, 1437, 1438, 5, 30, 0, 0, 1438, 1439, 3, 180, 90, 0, 1439, 1440, 5, 31, 0, 0, 1440, 1482, 1, 0, 0, 0, 1441, 1442, 5, 294, 0, 0, 1442, 1443, 3, 188, 94, 0, 1443, 1444, 3, 146, 73, 0, 1444, 1445, 5, 36, 0, 0, 1445, 1446, 5, 17, 0, 0, 1446, 1447, 3, 52, 26, 0, 1447, 1448, 5, 18, 0, 0, 1448, 1482, 1, 0, 0, 0, 1449, 1450, 5, 294, 0, 0, 1450, 1451, 3, 188, 94, 0, 1451, 1452, 3, 146, 73, 0, 1452, 1482, 1, 0, 0, 0, 1453, 1454, 5, 295, 0, 0, 1454, 1455, 3, 188, 94, 0, 1455, 1457, 5, 36, 0, 0, 1456, 1458, 5, 84, 0, 0, 1457, 1456, 1, 0, 0, 0, 1457, 1458, 1, 0, 0, 0, 1458, 1459, 1, 0, 0, 0, 1459, 1460, 5, 30, 0, 0, 1460, 1461, 3, 312, 156, 0, 1461, 1462, 5, 31, 0, 0, 1462, 1482, 1, 0, 0, 0, 1463, 1464, 5, 295, 0, 0, 1464, 1465, 3, 188, 94, 0, 1465, 1466, 5, 84, 0, 0, 1466, 1467, 5, 30, 0, 0, 1467, 1468, 3, 312, 156, 0, 1468, 1469, 5, 31, 0, 0, 1469, 1482, 1, 0, 0, 0, 1470, 1471, 5, 295, 0, 0, 1471, 1472, 3, 188, 94, 0, 1472, 1473, 3, 6, 3, 0, 1473, 1482, 1, 0, 0, 0, 1474, 1475, 5, 295, 0, 0, 1475, 1476, 3, 188, 94, 0, 1476, 1477, 5, 36, 0, 0, 1477, 1478, 5, 17, 0, 0, 1478, 1479, 3, 176, 88, 0, 1479, 1480, 5, 18, 0, 0, 1480, 1482, 1, 0, 0, 0, 1481, 1434, 1, 0, 0, 0, 1481, 1441, 1, 0, 0, 0, 1481, 1449, 1, 0, 0, 0, 1481, 1453, 1, 0, 0, 0, 1481, 1463, 1, 0, 0, 0, 1481, 1470, 1, 0, 0, 0, 1481, 1474, 1, 0, 0, 0, 1482, 175, 1, 0, 0, 0, 1483, 1494, 1, 0, 0, 0, 1484, 1485, 3, 178, 89, 0, 1485, 1486, 5, 28, 0, 0, 1486, 1488, 1, 0, 0, 0, 1487, 1484, 1, 0, 0, 0, 1488, 1491, 1, 0, 0, 0, 1489, 1487, 1, 0, 0, 0, 1489, 1490, 1, 0, 0, 0, 1490, 1492, 1, 0, 0, 0, 1491, 1489, 1, 0, 0, 0, 1492, 1494, 3, 178, 89, 0, 1493, 1483, 1, 0, 0, 0, 1493, 1489, 1, 0, 0, 0, 1494, 177, 1, 0, 0, 0, 1495, 1496, 5, 39, 0, 0, 1496, 1497, 5, 264, 0, 0, 1497, 1498, 5, 36, 0, 0, 1498, 1499, 5, 17, 0, 0, 1499, 1500, 3, 56, 28, 0, 1500, 1501, 5, 18, 0, 0, 1501, 1509, 1, 0, 0, 0, 1502, 1503, 3, 146, 73, 0, 1503, 1504, 5, 36, 0, 0, 1504, 1505, 5, 17, 0, 0, 1505, 1506, 3, 56, 28, 0, 1506, 1507, 5, 18, 0, 0, 1507, 1509, 1, 0, 0, 0, 1508, 1495, 1, 0, 0, 0, 1508, 1502, 1, 0, 0, 0, 1509, 179, 1, 0, 0, 0, 1510, 1511, 3, 182, 91, 0, 1511, 1512, 5, 28, 0, 0, 1512, 1514, 1, 0, 0, 0, 1513, 1510, 1, 0, 0, 0, 1514, 1517, 1, 0, 0, 0, 1515, 1513, 1, 0, 0, 0, 1515, 1516, 1, 0, 0, 0, 1516, 1518, 1, 0, 0, 0, 1517, 1515, 1, 0, 0, 0, 1518, 1519, 3, 182, 91, 0, 1519, 181, 1, 0, 0, 0, 1520, 1521, 3, 6, 3, 0, 1521, 1522, 5, 36, 0, 0, 1522, 1523, 3, 186, 93, 0, 1523, 183, 1, 0, 0, 0, 1524, 1525, 7, 9, 0, 0, 1525, 185, 1, 0, 0, 0, 1526, 1561, 3, 184, 92, 0, 1527, 1561, 3, 32, 16, 0, 1528, 1529, 5, 186, 0, 0, 1529, 1530, 5, 30, 0, 0, 1530, 1531, 3, 32, 16, 0, 1531, 1532, 5, 31, 0, 0, 1532, 1561, 1, 0, 0, 0, 1533, 1561, 3, 6, 3, 0, 1534, 1535, 3, 138, 69, 0, 1535, 1536, 5, 30, 0, 0, 1536, 1537, 5, 184, 0, 0, 1537, 1538, 5, 75, 0, 0, 1538, 1539, 3, 32, 16, 0, 1539, 1540, 5, 31, 0, 0, 1540, 1561, 1, 0, 0, 0, 1541, 1542, 3, 138, 69, 0, 1542, 1543, 5, 30, 0, 0, 1543, 1544, 5, 185, 0, 0, 1544, 1545, 5, 75, 0, 0, 1545, 1546, 3, 32, 16, 0, 1546, 1547, 5, 31, 0, 0, 1547, 1561, 1, 0, 0, 0, 1548, 1549, 3, 138, 69, 0, 1549, 1550, 5, 30, 0, 0, 1550, 1551, 5, 186, 0, 0, 1551, 1552, 5, 75, 0, 0, 1552, 1553, 3, 32, 16, 0, 1553, 1554, 5, 31, 0, 0, 1554, 1561, 1, 0, 0, 0, 1555, 1556, 3, 138, 69, 0, 1556, 1557, 5, 30, 0, 0, 1557, 1558, 3, 32, 16, 0, 1558, 1559, 5, 31, 0, 0, 1559, 1561, 1, 0, 0, 0, 1560, 1526, 1, 0, 0, 0, 1560, 1527, 1, 0, 0, 0, 1560, 1528, 1, 0, 0, 0, 1560, 1533, 1, 0, 0, 0, 1560, 1534, 1, 0, 0, 0, 1560, 1541, 1, 0, 0, 0, 1560, 1548, 1, 0, 0, 0, 1560, 1555, 1, 0, 0, 0, 1561, 187, 1, 0, 0, 0, 1562, 1563, 7, 10, 0, 0, 1563, 189, 1, 0, 0, 0, 1564, 1565, 3, 192, 96, 0, 1565, 1566, 3, 160, 80, 0, 1566, 1567, 3, 146, 73, 0, 1567, 1568, 5, 176, 0, 0, 1568, 1570, 3, 264, 132, 0, 1569, 1571, 3, 130, 65, 0, 1570, 1569, 1, 0, 0, 0, 1570, 1571, 1, 0, 0, 0, 1571, 1572, 1, 0, 0, 0, 1572, 1573, 3, 134, 67, 0, 1573, 1599, 1, 0, 0, 0, 1574, 1575, 3, 192, 96, 0, 1575, 1576, 3, 160, 80, 0, 1576, 1577, 3, 146, 73, 0, 1577, 1578, 5, 176, 0, 0, 1578, 1579, 3, 264, 132, 0, 1579, 1580, 3, 218, 109, 0, 1580, 1581, 3, 134, 67, 0, 1581, 1599, 1, 0, 0, 0, 1582, 1583, 3, 192, 96, 0, 1583, 1584, 3, 160, 80, 0, 1584, 1586, 3, 264, 132, 0, 1585, 1587, 3, 130, 65, 0, 1586, 1585, 1, 0, 0, 0, 1586, 1587, 1, 0, 0, 0, 1587, 1588, 1, 0, 0, 0, 1588, 1589, 3, 134, 67, 0, 1589, 1599, 1, 0, 0, 0, 1590, 1591, 3, 192, 96, 0, 1591, 1592, 3, 160, 80, 0, 1592, 1593, 3, 264, 132, 0, 1593, 1594, 3, 218, 109, 0, 1594, 1595, 3, 134, 67, 0, 1595, 1599, 1, 0, 0, 0, 1596, 1599, 3, 196, 98, 0, 1597, 1599, 3, 2, 1, 0, 1598, 1564, 1, 0, 0, 0, 1598, 1574, 1, 0, 0, 0, 1598, 1582, 1, 0, 0, 0, 1598, 1590, 1, 0, 0, 0, 1598, 1596, 1, 0, 0, 0, 1598, 1597, 1, 0, 0, 0, 1599, 191, 1, 0, 0, 0, 1600, 1601, 5, 243, 0, 0, 1601, 1611, 3, 192, 96, 0, 1602, 1603, 5, 244, 0, 0, 1603, 1611, 3, 192, 96, 0, 1604, 1611, 3, 194, 97, 0, 1605, 1606, 5, 112, 0, 0, 1606, 1607, 5, 30, 0, 0, 1607, 1608, 3, 32, 16, 0, 1608, 1609, 5, 31, 0, 0, 1609, 1611, 1, 0, 0, 0, 1610, 1600, 1, 0, 0, 0, 1610, 1602, 1, 0, 0, 0, 1610, 1604, 1, 0, 0, 0, 1610, 1605, 1, 0, 0, 0, 1611, 193, 1, 0, 0, 0, 1612, 1625, 1, 0, 0, 0, 1613, 1625, 5, 245, 0, 0, 1614, 1625, 5, 246, 0, 0, 1615, 1616, 5, 247, 0, 0, 1616, 1625, 5, 248, 0, 0, 1617, 1618, 5, 247, 0, 0, 1618, 1625, 5, 249, 0, 0, 1619, 1620, 5, 247, 0, 0, 1620, 1625, 5, 250, 0, 0, 1621, 1622, 5, 247, 0, 0, 1622, 1625, 5, 251, 0, 0, 1623, 1625, 5, 247, 0, 0, 1624, 1612, 1, 0, 0, 0, 1624, 1613, 1, 0, 0, 0, 1624, 1614, 1, 0, 0, 0, 1624, 1615, 1, 0, 0, 0, 1624, 1617, 1, 0, 0, 0, 1624, 1619, 1, 0, 0, 0, 1624, 1621, 1, 0, 0, 0, 1624, 1623, 1, 0, 0, 0, 1625, 195, 1, 0, 0, 0, 1626, 1627, 5, 113, 0, 0, 1627, 1628, 5, 30, 0, 0, 1628, 1629, 3, 32, 16, 0, 1629, 1630, 5, 31, 0, 0, 1630, 197, 1, 0, 0, 0, 1631, 1632, 5, 226, 0, 0, 1632, 1637, 3, 190, 95, 0, 1633, 1634, 5, 37, 0, 0, 1634, 1637, 3, 200, 100, 0, 1635, 1637, 3, 196, 98, 0, 1636, 1631, 1, 0, 0, 0, 1636, 1633, 1, 0, 0, 0, 1636, 1635, 1, 0, 0, 0, 1637, 199, 1, 0, 0, 0, 1638, 1639, 3, 160, 80, 0, 1639, 1640, 3, 146, 73, 0, 1640, 1641, 5, 176, 0, 0, 1641, 1642, 3, 2, 1, 0, 1642, 1648, 1, 0, 0, 0, 1643, 1644, 3, 160, 80, 0, 1644, 1645, 3, 2, 1, 0, 1645, 1648, 1, 0, 0, 0, 1646, 1648, 3, 2, 1, 0, 1647, 1638, 1, 0, 0, 0, 1647, 1643, 1, 0, 0, 0, 1647, 1646, 1, 0, 0, 0, 1648, 201, 1, 0, 0, 0, 1649, 1650, 3, 146, 73, 0, 1650, 1651, 5, 28, 0, 0, 1651, 1653, 1, 0, 0, 0, 1652, 1649, 1, 0, 0, 0, 1653, 1656, 1, 0, 0, 0, 1654, 1652, 1, 0, 0, 0, 1654, 1655, 1, 0, 0, 0, 1655, 1657, 1, 0, 0, 0, 1656, 1654, 1, 0, 0, 0, 1657, 1658, 3, 146, 73, 0, 1658, 203, 1, 0, 0, 0, 1659, 1665, 1, 0, 0, 0, 1660, 1661, 5, 86, 0, 0, 1661, 1662, 3, 212, 106, 0, 1662, 1663, 5, 87, 0, 0, 1663, 1665, 1, 0, 0, 0, 1664, 1659, 1, 0, 0, 0, 1664, 1660, 1, 0, 0, 0, 1665, 205, 1, 0, 0, 0, 1666, 1678, 5, 266, 0, 0, 1667, 1678, 5, 114, 0, 0, 1668, 1678, 5, 39, 0, 0, 1669, 1678, 5, 200, 0, 0, 1670, 1678, 5, 115, 0, 0, 1671, 1678, 5, 116, 0, 0, 1672, 1673, 5, 70, 0, 0, 1673, 1674, 5, 30, 0, 0, 1674, 1675, 3, 32, 16, 0, 1675, 1676, 5, 31, 0, 0, 1676, 1678, 1, 0, 0, 0, 1677, 1666, 1, 0, 0, 0, 1677, 1667, 1, 0, 0, 0, 1677, 1668, 1, 0, 0, 0, 1677, 1669, 1, 0, 0, 0, 1677, 1670, 1, 0, 0, 0, 1677, 1671, 1, 0, 0, 0, 1677, 1672, 1, 0, 0, 0, 1678, 207, 1, 0, 0, 0, 1679, 1681, 3, 206, 103, 0, 1680, 1679, 1, 0, 0, 0, 1681, 1684, 1, 0, 0, 0, 1682, 1680, 1, 0, 0, 0, 1682, 1683, 1, 0, 0, 0, 1683, 209, 1, 0, 0, 0, 1684, 1682, 1, 0, 0, 0, 1685, 1687, 3, 208, 104, 0, 1686, 1688, 3, 214, 107, 0, 1687, 1686, 1, 0, 0, 0, 1687, 1688, 1, 0, 0, 0, 1688, 1689, 1, 0, 0, 0, 1689, 1690, 3, 2, 1, 0, 1690, 211, 1, 0, 0, 0, 1691, 1692, 3, 210, 105, 0, 1692, 1693, 5, 28, 0, 0, 1693, 1695, 1, 0, 0, 0, 1694, 1691, 1, 0, 0, 0, 1695, 1698, 1, 0, 0, 0, 1696, 1694, 1, 0, 0, 0, 1696, 1697, 1, 0, 0, 0, 1697, 1699, 1, 0, 0, 0, 1698, 1696, 1, 0, 0, 0, 1699, 1700, 3, 210, 105, 0, 1700, 213, 1, 0, 0, 0, 1701, 1702, 5, 30, 0, 0, 1702, 1703, 3, 202, 101, 0, 1703, 1704, 5, 31, 0, 0, 1704, 215, 1, 0, 0, 0, 1705, 1708, 1, 0, 0, 0, 1706, 1708, 3, 218, 109, 0, 1707, 1705, 1, 0, 0, 0, 1707, 1706, 1, 0, 0, 0, 1708, 217, 1, 0, 0, 0, 1709, 1710, 5, 86, 0, 0, 1710, 1711, 5, 42, 0, 0, 1711, 1712, 3, 32, 16, 0, 1712, 1713, 5, 43, 0, 0, 1713, 1714, 5, 87, 0, 0, 1714, 219, 1, 0, 0, 0, 1715, 1716, 3, 256, 128, 0, 1716, 1717, 5, 17, 0, 0, 1717, 1718, 3, 268, 134, 0, 1718, 1719, 5, 18, 0, 0, 1719, 1832, 1, 0, 0, 0, 1720, 1721, 3, 74, 37, 0, 1721, 1722, 5, 17, 0, 0, 1722, 1723, 3, 82, 41, 0, 1723, 1724, 5, 18, 0, 0, 1724, 1832, 1, 0, 0, 0, 1725, 1726, 3, 232, 116, 0, 1726, 1727, 5, 17, 0, 0, 1727, 1728, 3, 236, 118, 0, 1728, 1729, 5, 18, 0, 0, 1729, 1832, 1, 0, 0, 0, 1730, 1731, 3, 240, 120, 0, 1731, 1732, 5, 17, 0, 0, 1732, 1733, 3, 244, 122, 0, 1733, 1734, 5, 18, 0, 0, 1734, 1832, 1, 0, 0, 0, 1735, 1832, 3, 222, 111, 0, 1736, 1832, 3, 296, 148, 0, 1737, 1832, 3, 174, 87, 0, 1738, 1832, 3, 88, 44, 0, 1739, 1832, 3, 342, 171, 0, 1740, 1741, 5, 117, 0, 0, 1741, 1832, 3, 32, 16, 0, 1742, 1743, 5, 118, 0, 0, 1743, 1832, 3, 32, 16, 0, 1744, 1745, 3, 354, 177, 0, 1745, 1746, 5, 17, 0, 0, 1746, 1747, 3, 358, 179, 0, 1747, 1748, 5, 18, 0, 0, 1748, 1832, 1, 0, 0, 0, 1749, 1750, 5, 302, 0, 0, 1750, 1751, 3, 146, 73, 0, 1751, 1752, 5, 176, 0, 0, 1752, 1753, 3, 264, 132, 0, 1753, 1754, 5, 119, 0, 0, 1754, 1755, 3, 192, 96, 0, 1755, 1756, 3, 160, 80, 0, 1756, 1757, 3, 146, 73, 0, 1757, 1758, 5, 176, 0, 0, 1758, 1759, 3, 264, 132, 0, 1759, 1760, 3, 134, 67, 0, 1760, 1832, 1, 0, 0, 0, 1761, 1762, 5, 302, 0, 0, 1762, 1763, 5, 226, 0, 0, 1763, 1764, 3, 192, 96, 0, 1764, 1765, 3, 160, 80, 0, 1765, 1766, 3, 146, 73, 0, 1766, 1767, 5, 176, 0, 0, 1767, 1768, 3, 264, 132, 0, 1768, 1769, 3, 216, 108, 0, 1769, 1770, 3, 134, 67, 0, 1770, 1771, 5, 119, 0, 0, 1771, 1772, 5, 226, 0, 0, 1772, 1773, 3, 192, 96, 0, 1773, 1774, 3, 160, 80, 0, 1774, 1775, 3, 146, 73, 0, 1775, 1776, 5, 176, 0, 0, 1776, 1777, 3, 264, 132, 0, 1777, 1778, 3, 216, 108, 0, 1778, 1779, 3, 134, 67, 0, 1779, 1832, 1, 0, 0, 0, 1780, 1832, 3, 26, 13, 0, 1781, 1832, 3, 40, 20, 0, 1782, 1783, 5, 255, 0, 0, 1783, 1784, 5, 196, 0, 0, 1784, 1785, 5, 42, 0, 0, 1785, 1786, 3, 32, 16, 0, 1786, 1790, 5, 43, 0, 0, 1787, 1789, 3, 342, 171, 0, 1788, 1787, 1, 0, 0, 0, 1789, 1792, 1, 0, 0, 0, 1790, 1788, 1, 0, 0, 0, 1790, 1791, 1, 0, 0, 0, 1791, 1832, 1, 0, 0, 0, 1792, 1790, 1, 0, 0, 0, 1793, 1794, 5, 255, 0, 0, 1794, 1795, 5, 196, 0, 0, 1795, 1799, 3, 2, 1, 0, 1796, 1798, 3, 342, 171, 0, 1797, 1796, 1, 0, 0, 0, 1798, 1801, 1, 0, 0, 0, 1799, 1797, 1, 0, 0, 0, 1799, 1800, 1, 0, 0, 0, 1800, 1832, 1, 0, 0, 0, 1801, 1799, 1, 0, 0, 0, 1802, 1803, 5, 255, 0, 0, 1803, 1804, 5, 256, 0, 0, 1804, 1805, 5, 42, 0, 0, 1805, 1806, 3, 32, 16, 0, 1806, 1807, 5, 43, 0, 0, 1807, 1808, 5, 28, 0, 0, 1808, 1812, 3, 146, 73, 0, 1809, 1811, 3, 342, 171, 0, 1810, 1809, 1, 0, 0, 0, 1811, 1814, 1, 0, 0, 0, 1812, 1810, 1, 0, 0, 0, 1812, 1813, 1, 0, 0, 0, 1813, 1832, 1, 0, 0, 0, 1814, 1812, 1, 0, 0, 0, 1815, 1816, 5, 255, 0, 0, 1816, 1817, 5, 256, 0, 0, 1817, 1818, 3, 2, 1, 0, 1818, 1819, 5, 28, 0, 0, 1819, 1823, 3, 146, 73, 0, 1820, 1822, 3, 342, 171, 0, 1821, 1820, 1, 0, 0, 0, 1822, 1825, 1, 0, 0, 0, 1823, 1821, 1, 0, 0, 0, 1823, 1824, 1, 0, 0, 0, 1824, 1832, 1, 0, 0, 0, 1825, 1823, 1, 0, 0, 0, 1826, 1827, 5, 120, 0, 0, 1827, 1828, 5, 196, 0, 0, 1828, 1829, 3, 146, 73, 0, 1829, 1830, 3, 44, 22, 0, 1830, 1832, 1, 0, 0, 0, 1831, 1715, 1, 0, 0, 0, 1831, 1720, 1, 0, 0, 0, 1831, 1725, 1, 0, 0, 0, 1831, 1730, 1, 0, 0, 0, 1831, 1735, 1, 0, 0, 0, 1831, 1736, 1, 0, 0, 0, 1831, 1737, 1, 0, 0, 0, 1831, 1738, 1, 0, 0, 0, 1831, 1739, 1, 0, 0, 0, 1831, 1740, 1, 0, 0, 0, 1831, 1742, 1, 0, 0, 0, 1831, 1744, 1, 0, 0, 0, 1831, 1749, 1, 0, 0, 0, 1831, 1761, 1, 0, 0, 0, 1831, 1780, 1, 0, 0, 0, 1831, 1781, 1, 0, 0, 0, 1831, 1782, 1, 0, 0, 0, 1831, 1793, 1, 0, 0, 0, 1831, 1802, 1, 0, 0, 0, 1831, 1815, 1, 0, 0, 0, 1831, 1826, 1, 0, 0, 0, 1832, 221, 1, 0, 0, 0, 1833, 1834, 5, 121, 0, 0, 1834, 1843, 3, 230, 115, 0, 1835, 1842, 3, 224, 112, 0, 1836, 1837, 5, 122, 0, 0, 1837, 1838, 5, 30, 0, 0, 1838, 1839, 3, 250, 125, 0, 1839, 1840, 5, 31, 0, 0, 1840, 1842, 1, 0, 0, 0, 1841, 1835, 1, 0, 0, 0, 1841, 1836, 1, 0, 0, 0, 1842, 1845, 1, 0, 0, 0, 1843, 1841, 1, 0, 0, 0, 1843, 1844, 1, 0, 0, 0, 1844, 1846, 1, 0, 0, 0, 1845, 1843, 1, 0, 0, 0, 1846, 1847, 3, 160, 80, 0, 1847, 1848, 3, 2, 1, 0, 1848, 1849, 3, 226, 113, 0, 1849, 1850, 3, 228, 114, 0, 1850, 223, 1, 0, 0, 0, 1851, 1871, 5, 123, 0, 0, 1852, 1871, 5, 51, 0, 0, 1853, 1871, 5, 52, 0, 0, 1854, 1871, 5, 63, 0, 0, 1855, 1871, 5, 124, 0, 0, 1856, 1871, 5, 69, 0, 0, 1857, 1871, 5, 68, 0, 0, 1858, 1871, 5, 64, 0, 0, 1859, 1871, 5, 65, 0, 0, 1860, 1871, 5, 66, 0, 0, 1861, 1871, 5, 125, 0, 0, 1862, 1871, 5, 126, 0, 0, 1863, 1871, 5, 127, 0, 0, 1864, 1871, 5, 16, 0, 0, 1865, 1866, 5, 70, 0, 0, 1866, 1867, 5, 30, 0, 0, 1867, 1868, 3, 32, 16, 0, 1868, 1869, 5, 31, 0, 0, 1869, 1871, 1, 0, 0, 0, 1870, 1851, 1, 0, 0, 0, 1870, 1852, 1, 0, 0, 0, 1870, 1853, 1, 0, 0, 0, 1870, 1854, 1, 0, 0, 0, 1870, 1855, 1, 0, 0, 0, 1870, 1856, 1, 0, 0, 0, 1870, 1857, 1, 0, 0, 0, 1870, 1858, 1, 0, 0, 0, 1870, 1859, 1, 0, 0, 0, 1870, 1860, 1, 0, 0, 0, 1870, 1861, 1, 0, 0, 0, 1870, 1862, 1, 0, 0, 0, 1870, 1863, 1, 0, 0, 0, 1870, 1864, 1, 0, 0, 0, 1870, 1865, 1, 0, 0, 0, 1871, 225, 1, 0, 0, 0, 1872, 1878, 1, 0, 0, 0, 1873, 1874, 5, 44, 0, 0, 1874, 1878, 3, 0, 0, 0, 1875, 1876, 5, 44, 0, 0, 1876, 1878, 3, 32, 16, 0, 1877, 1872, 1, 0, 0, 0, 1877, 1873, 1, 0, 0, 0, 1877, 1875, 1, 0, 0, 0, 1878, 227, 1, 0, 0, 0, 1879, 1883, 1, 0, 0, 0, 1880, 1881, 5, 36, 0, 0, 1881, 1883, 3, 316, 158, 0, 1882, 1879, 1, 0, 0, 0, 1882, 1880, 1, 0, 0, 0, 1883, 229, 1, 0, 0, 0, 1884, 1890, 1, 0, 0, 0, 1885, 1886, 5, 42, 0, 0, 1886, 1887, 3, 32, 16, 0, 1887, 1888, 5, 43, 0, 0, 1888, 1890, 1, 0, 0, 0, 1889, 1884, 1, 0, 0, 0, 1889, 1885, 1, 0, 0, 0, 1890, 231, 1, 0, 0, 0, 1891, 1895, 5, 128, 0, 0, 1892, 1894, 3, 234, 117, 0, 1893, 1892, 1, 0, 0, 0, 1894, 1897, 1, 0, 0, 0, 1895, 1893, 1, 0, 0, 0, 1895, 1896, 1, 0, 0, 0, 1896, 1898, 1, 0, 0, 0, 1897, 1895, 1, 0, 0, 0, 1898, 1899, 3, 146, 73, 0, 1899, 1900, 3, 2, 1, 0, 1900, 1910, 1, 0, 0, 0, 1901, 1905, 5, 128, 0, 0, 1902, 1904, 3, 234, 117, 0, 1903, 1902, 1, 0, 0, 0, 1904, 1907, 1, 0, 0, 0, 1905, 1903, 1, 0, 0, 0, 1905, 1906, 1, 0, 0, 0, 1906, 1908, 1, 0, 0, 0, 1907, 1905, 1, 0, 0, 0, 1908, 1910, 3, 2, 1, 0, 1909, 1891, 1, 0, 0, 0, 1909, 1901, 1, 0, 0, 0, 1910, 233, 1, 0, 0, 0, 1911, 1912, 7, 11, 0, 0, 1912, 235, 1, 0, 0, 0, 1913, 1915, 3, 238, 119, 0, 1914, 1913, 1, 0, 0, 0, 1915, 1918, 1, 0, 0, 0, 1916, 1914, 1, 0, 0, 0, 1916, 1917, 1, 0, 0, 0, 1917, 237, 1, 0, 0, 0, 1918, 1916, 1, 0, 0, 0, 1919, 1920, 5, 129, 0, 0, 1920, 1932, 3, 190, 95, 0, 1921, 1922, 5, 130, 0, 0, 1922, 1932, 3, 190, 95, 0, 1923, 1924, 5, 131, 0, 0, 1924, 1932, 3, 190, 95, 0, 1925, 1926, 5, 132, 0, 0, 1926, 1932, 3, 190, 95, 0, 1927, 1932, 3, 88, 44, 0, 1928, 1932, 3, 342, 171, 0, 1929, 1932, 3, 26, 13, 0, 1930, 1932, 3, 40, 20, 0, 1931, 1919, 1, 0, 0, 0, 1931, 1921, 1, 0, 0, 0, 1931, 1923, 1, 0, 0, 0, 1931, 1925, 1, 0, 0, 0, 1931, 1927, 1, 0, 0, 0, 1931, 1928, 1, 0, 0, 0, 1931, 1929, 1, 0, 0, 0, 1931, 1930, 1, 0, 0, 0, 1932, 239, 1, 0, 0, 0, 1933, 1937, 5, 133, 0, 0, 1934, 1936, 3, 242, 121, 0, 1935, 1934, 1, 0, 0, 0, 1936, 1939, 1, 0, 0, 0, 1937, 1935, 1, 0, 0, 0, 1937, 1938, 1, 0, 0, 0, 1938, 1940, 1, 0, 0, 0, 1939, 1937, 1, 0, 0, 0, 1940, 1941, 3, 192, 96, 0, 1941, 1942, 3, 160, 80, 0, 1942, 1943, 3, 2, 1, 0, 1943, 1944, 3, 134, 67, 0, 1944, 1945, 3, 228, 114, 0, 1945, 241, 1, 0, 0, 0, 1946, 1947, 7, 11, 0, 0, 1947, 243, 1, 0, 0, 0, 1948, 1950, 3, 246, 123, 0, 1949, 1948, 1, 0, 0, 0, 1950, 1953, 1, 0, 0, 0, 1951, 1949, 1, 0, 0, 0, 1951, 1952, 1, 0, 0, 0, 1952, 245, 1, 0, 0, 0, 1953, 1951, 1, 0, 0, 0, 1954, 1955, 5, 134, 0, 0, 1955, 1965, 3, 190, 95, 0, 1956, 1957, 5, 135, 0, 0, 1957, 1965, 3, 190, 95, 0, 1958, 1959, 5, 132, 0, 0, 1959, 1965, 3, 190, 95, 0, 1960, 1965, 3, 342, 171, 0, 1961, 1965, 3, 88, 44, 0, 1962, 1965, 3, 26, 13, 0, 1963, 1965, 3, 40, 20, 0, 1964, 1954, 1, 0, 0, 0, 1964, 1956, 1, 0, 0, 0, 1964, 1958, 1, 0, 0, 0, 1964, 1960, 1, 0, 0, 0, 1964, 1961, 1, 0, 0, 0, 1964, 1962, 1, 0, 0, 0, 1964, 1963, 1, 0, 0, 0, 1965, 247, 1, 0, 0, 0, 1966, 1973, 1, 0, 0, 0, 1967, 1968, 5, 122, 0, 0, 1968, 1969, 5, 30, 0, 0, 1969, 1970, 3, 250, 125, 0, 1970, 1971, 5, 31, 0, 0, 1971, 1973, 1, 0, 0, 0, 1972, 1966, 1, 0, 0, 0, 1972, 1967, 1, 0, 0, 0, 1973, 249, 1, 0, 0, 0, 1974, 1984, 3, 148, 74, 0, 1975, 1977, 5, 17, 0, 0, 1976, 1978, 3, 314, 157, 0, 1977, 1976, 1, 0, 0, 0, 1978, 1979, 1, 0, 0, 0, 1979, 1977, 1, 0, 0, 0, 1979, 1980, 1, 0, 0, 0, 1980, 1981, 1, 0, 0, 0, 1981, 1982, 5, 18, 0, 0, 1982, 1984, 1, 0, 0, 0, 1983, 1974, 1, 0, 0, 0, 1983, 1975, 1, 0, 0, 0, 1984, 251, 1, 0, 0, 0, 1985, 1987, 3, 254, 127, 0, 1986, 1985, 1, 0, 0, 0, 1987, 1990, 1, 0, 0, 0, 1988, 1986, 1, 0, 0, 0, 1988, 1989, 1, 0, 0, 0, 1989, 253, 1, 0, 0, 0, 1990, 1988, 1, 0, 0, 0, 1991, 1992, 5, 42, 0, 0, 1992, 1993, 5, 136, 0, 0, 1993, 2005, 5, 43, 0, 0, 1994, 1995, 5, 42, 0, 0, 1995, 1996, 5, 137, 0, 0, 1996, 2005, 5, 43, 0, 0, 1997, 1998, 5, 42, 0, 0, 1998, 1999, 5, 138, 0, 0, 1999, 2005, 5, 43, 0, 0, 2000, 2001, 5, 42, 0, 0, 2001, 2002, 3, 32, 16, 0, 2002, 2003, 5, 43, 0, 0, 2003, 2005, 1, 0, 0, 0, 2004, 1991, 1, 0, 0, 0, 2004, 1994, 1, 0, 0, 0, 2004, 1997, 1, 0, 0, 0, 2004, 2000, 1, 0, 0, 0, 2005, 255, 1, 0, 0, 0, 2006, 2011, 5, 139, 0, 0, 2007, 2010, 3, 258, 129, 0, 2008, 2010, 3, 260, 130, 0, 2009, 2007, 1, 0, 0, 0, 2009, 2008, 1, 0, 0, 0, 2010, 2013, 1, 0, 0, 0, 2011, 2009, 1, 0, 0, 0, 2011, 2012, 1, 0, 0, 0, 2012, 2014, 1, 0, 0, 0, 2013, 2011, 1, 0, 0, 0, 2014, 2015, 3, 192, 96, 0, 2015, 2016, 3, 252, 126, 0, 2016, 2017, 3, 160, 80, 0, 2017, 2018, 3, 248, 124, 0, 2018, 2019, 3, 264, 132, 0, 2019, 2020, 3, 204, 102, 0, 2020, 2024, 3, 134, 67, 0, 2021, 2023, 3, 266, 133, 0, 2022, 2021, 1, 0, 0, 0, 2023, 2026, 1, 0, 0, 0, 2024, 2022, 1, 0, 0, 0, 2024, 2025, 1, 0, 0, 0, 2025, 257, 1, 0, 0, 0, 2026, 2024, 1, 0, 0, 0, 2027, 2051, 5, 123, 0, 0, 2028, 2051, 5, 51, 0, 0, 2029, 2051, 5, 52, 0, 0, 2030, 2051, 5, 63, 0, 0, 2031, 2051, 5, 140, 0, 0, 2032, 2051, 5, 68, 0, 0, 2033, 2051, 5, 141, 0, 0, 2034, 2051, 5, 142, 0, 0, 2035, 2051, 5, 54, 0, 0, 2036, 2051, 5, 64, 0, 0, 2037, 2051, 5, 65, 0, 0, 2038, 2051, 5, 66, 0, 0, 2039, 2051, 5, 125, 0, 0, 2040, 2051, 5, 143, 0, 0, 2041, 2051, 5, 144, 0, 0, 2042, 2051, 5, 69, 0, 0, 2043, 2051, 5, 145, 0, 0, 2044, 2051, 5, 146, 0, 0, 2045, 2046, 5, 70, 0, 0, 2046, 2047, 5, 30, 0, 0, 2047, 2048, 3, 32, 16, 0, 2048, 2049, 5, 31, 0, 0, 2049, 2051, 1, 0, 0, 0, 2050, 2027, 1, 0, 0, 0, 2050, 2028, 1, 0, 0, 0, 2050, 2029, 1, 0, 0, 0, 2050, 2030, 1, 0, 0, 0, 2050, 2031, 1, 0, 0, 0, 2050, 2032, 1, 0, 0, 0, 2050, 2033, 1, 0, 0, 0, 2050, 2034, 1, 0, 0, 0, 2050, 2035, 1, 0, 0, 0, 2050, 2036, 1, 0, 0, 0, 2050, 2037, 1, 0, 0, 0, 2050, 2038, 1, 0, 0, 0, 2050, 2039, 1, 0, 0, 0, 2050, 2040, 1, 0, 0, 0, 2050, 2041, 1, 0, 0, 0, 2050, 2042, 1, 0, 0, 0, 2050, 2043, 1, 0, 0, 0, 2050, 2044, 1, 0, 0, 0, 2050, 2045, 1, 0, 0, 0, 2051, 259, 1, 0, 0, 0, 2052, 2053, 5, 147, 0, 0, 2053, 2059, 5, 30, 0, 0, 2054, 2057, 3, 6, 3, 0, 2055, 2056, 5, 34, 0, 0, 2056, 2058, 3, 6, 3, 0, 2057, 2055, 1, 0, 0, 0, 2057, 2058, 1, 0, 0, 0, 2058, 2060, 1, 0, 0, 0, 2059, 2054, 1, 0, 0, 0, 2059, 2060, 1, 0, 0, 0, 2060, 2064, 1, 0, 0, 0, 2061, 2063, 3, 262, 131, 0, 2062, 2061, 1, 0, 0, 0, 2063, 2066, 1, 0, 0, 0, 2064, 2062, 1, 0, 0, 0, 2064, 2065, 1, 0, 0, 0, 2065, 2067, 1, 0, 0, 0, 2066, 2064, 1, 0, 0, 0, 2067, 2071, 5, 31, 0, 0, 2068, 2069, 5, 147, 0, 0, 2069, 2071, 5, 85, 0, 0, 2070, 2052, 1, 0, 0, 0, 2070, 2068, 1, 0, 0, 0, 2071, 261, 1, 0, 0, 0, 2072, 2100, 5, 148, 0, 0, 2073, 2100, 5, 224, 0, 0, 2074, 2100, 5, 57, 0, 0, 2075, 2100, 5, 58, 0, 0, 2076, 2100, 5, 149, 0, 0, 2077, 2100, 5, 150, 0, 0, 2078, 2100, 5, 248, 0, 0, 2079, 2100, 5, 249, 0, 0, 2080, 2100, 5, 250, 0, 0, 2081, 2100, 5, 251, 0, 0, 2082, 2083, 5, 151, 0, 0, 2083, 2084, 5, 75, 0, 0, 2084, 2100, 5, 152, 0, 0, 2085, 2086, 5, 151, 0, 0, 2086, 2087, 5, 75, 0, 0, 2087, 2100, 5, 153, 0, 0, 2088, 2089, 5, 154, 0, 0, 2089, 2090, 5, 75, 0, 0, 2090, 2100, 5, 152, 0, 0, 2091, 2092, 5, 154, 0, 0, 2092, 2093, 5, 75, 0, 0, 2093, 2100, 5, 153, 0, 0, 2094, 2095, 5, 70, 0, 0, 2095, 2096, 5, 30, 0, 0, 2096, 2097, 3, 32, 16, 0, 2097, 2098, 5, 31, 0, 0, 2098, 2100, 1, 0, 0, 0, 2099, 2072, 1, 0, 0, 0, 2099, 2073, 1, 0, 0, 0, 2099, 2074, 1, 0, 0, 0, 2099, 2075, 1, 0, 0, 0, 2099, 2076, 1, 0, 0, 0, 2099, 2077, 1, 0, 0, 0, 2099, 2078, 1, 0, 0, 0, 2099, 2079, 1, 0, 0, 0, 2099, 2080, 1, 0, 0, 0, 2099, 2081, 1, 0, 0, 0, 2099, 2082, 1, 0, 0, 0, 2099, 2085, 1, 0, 0, 0, 2099, 2088, 1, 0, 0, 0, 2099, 2091, 1, 0, 0, 0, 2099, 2094, 1, 0, 0, 0, 2100, 263, 1, 0, 0, 0, 2101, 2105, 5, 116, 0, 0, 2102, 2105, 5, 155, 0, 0, 2103, 2105, 3, 2, 1, 0, 2104, 2101, 1, 0, 0, 0, 2104, 2102, 1, 0, 0, 0, 2104, 2103, 1, 0, 0, 0, 2105, 265, 1, 0, 0, 0, 2106, 2128, 5, 1, 0, 0, 2107, 2128, 5, 2, 0, 0, 2108, 2128, 5, 156, 0, 0, 2109, 2128, 5, 3, 0, 0, 2110, 2128, 5, 4, 0, 0, 2111, 2128, 5, 247, 0, 0, 2112, 2128, 5, 5, 0, 0, 2113, 2128, 5, 6, 0, 0, 2114, 2128, 5, 7, 0, 0, 2115, 2128, 5, 8, 0, 0, 2116, 2128, 5, 9, 0, 0, 2117, 2128, 5, 10, 0, 0, 2118, 2128, 5, 11, 0, 0, 2119, 2128, 5, 12, 0, 0, 2120, 2128, 5, 13, 0, 0, 2121, 2128, 5, 14, 0, 0, 2122, 2123, 5, 70, 0, 0, 2123, 2124, 5, 30, 0, 0, 2124, 2125, 3, 32, 16, 0, 2125, 2126, 5, 31, 0, 0, 2126, 2128, 1, 0, 0, 0, 2127, 2106, 1, 0, 0, 0, 2127, 2107, 1, 0, 0, 0, 2127, 2108, 1, 0, 0, 0, 2127, 2109, 1, 0, 0, 0, 2127, 2110, 1, 0, 0, 0, 2127, 2111, 1, 0, 0, 0, 2127, 2112, 1, 0, 0, 0, 2127, 2113, 1, 0, 0, 0, 2127, 2114, 1, 0, 0, 0, 2127, 2115, 1, 0, 0, 0, 2127, 2116, 1, 0, 0, 0, 2127, 2117, 1, 0, 0, 0, 2127, 2118, 1, 0, 0, 0, 2127, 2119, 1, 0, 0, 0, 2127, 2120, 1, 0, 0, 0, 2127, 2121, 1, 0, 0, 0, 2127, 2122, 1, 0, 0, 0, 2128, 267, 1, 0, 0, 0, 2129, 2131, 3, 270, 135, 0, 2130, 2129, 1, 0, 0, 0, 2131, 2134, 1, 0, 0, 0, 2132, 2130, 1, 0, 0, 0, 2132, 2133, 1, 0, 0, 0, 2133, 269, 1, 0, 0, 0, 2134, 2132, 1, 0, 0, 0, 2135, 2244, 3, 126, 63, 0, 2136, 2137, 5, 296, 0, 0, 2137, 2244, 3, 32, 16, 0, 2138, 2244, 3, 278, 139, 0, 2139, 2140, 5, 297, 0, 0, 2140, 2244, 3, 32, 16, 0, 2141, 2142, 5, 300, 0, 0, 2142, 2244, 3, 134, 67, 0, 2143, 2144, 5, 300, 0, 0, 2144, 2145, 5, 157, 0, 0, 2145, 2244, 3, 134, 67, 0, 2146, 2244, 5, 298, 0, 0, 2147, 2244, 5, 299, 0, 0, 2148, 2244, 3, 296, 148, 0, 2149, 2244, 3, 272, 136, 0, 2150, 2244, 3, 174, 87, 0, 2151, 2244, 3, 88, 44, 0, 2152, 2244, 3, 26, 13, 0, 2153, 2244, 3, 274, 137, 0, 2154, 2244, 3, 40, 20, 0, 2155, 2156, 5, 301, 0, 0, 2156, 2157, 5, 42, 0, 0, 2157, 2158, 3, 32, 16, 0, 2158, 2159, 5, 43, 0, 0, 2159, 2244, 1, 0, 0, 0, 2160, 2161, 5, 301, 0, 0, 2161, 2162, 5, 42, 0, 0, 2162, 2163, 3, 32, 16, 0, 2163, 2164, 5, 43, 0, 0, 2164, 2165, 5, 34, 0, 0, 2165, 2166, 3, 0, 0, 0, 2166, 2244, 1, 0, 0, 0, 2167, 2168, 5, 303, 0, 0, 2168, 2169, 3, 32, 16, 0, 2169, 2170, 5, 75, 0, 0, 2170, 2171, 3, 32, 16, 0, 2171, 2244, 1, 0, 0, 0, 2172, 2173, 5, 302, 0, 0, 2173, 2174, 3, 146, 73, 0, 2174, 2175, 5, 176, 0, 0, 2175, 2176, 3, 264, 132, 0, 2176, 2244, 1, 0, 0, 0, 2177, 2178, 5, 302, 0, 0, 2178, 2179, 5, 226, 0, 0, 2179, 2180, 3, 192, 96, 0, 2180, 2181, 3, 160, 80, 0, 2181, 2182, 3, 146, 73, 0, 2182, 2183, 5, 176, 0, 0, 2183, 2184, 3, 264, 132, 0, 2184, 2185, 3, 216, 108, 0, 2185, 2186, 3, 134, 67, 0, 2186, 2244, 1, 0, 0, 0, 2187, 2244, 3, 276, 138, 0, 2188, 2189, 5, 255, 0, 0, 2189, 2190, 5, 196, 0, 0, 2190, 2191, 5, 42, 0, 0, 2191, 2192, 3, 32, 16, 0, 2192, 2196, 5, 43, 0, 0, 2193, 2195, 3, 342, 171, 0, 2194, 2193, 1, 0, 0, 0, 2195, 2198, 1, 0, 0, 0, 2196, 2194, 1, 0, 0, 0, 2196, 2197, 1, 0, 0, 0, 2197, 2244, 1, 0, 0, 0, 2198, 2196, 1, 0, 0, 0, 2199, 2200, 5, 255, 0, 0, 2200, 2201, 5, 196, 0, 0, 2201, 2205, 3, 2, 1, 0, 2202, 2204, 3, 342, 171, 0, 2203, 2202, 1, 0, 0, 0, 2204, 2207, 1, 0, 0, 0, 2205, 2203, 1, 0, 0, 0, 2205, 2206, 1, 0, 0, 0, 2206, 2244, 1, 0, 0, 0, 2207, 2205, 1, 0, 0, 0, 2208, 2209, 5, 255, 0, 0, 2209, 2210, 5, 256, 0, 0, 2210, 2211, 5, 42, 0, 0, 2211, 2212, 3, 32, 16, 0, 2212, 2213, 5, 43, 0, 0, 2213, 2214, 5, 28, 0, 0, 2214, 2218, 3, 146, 73, 0, 2215, 2217, 3, 342, 171, 0, 2216, 2215, 1, 0, 0, 0, 2217, 2220, 1, 0, 0, 0, 2218, 2216, 1, 0, 0, 0, 2218, 2219, 1, 0, 0, 0, 2219, 2244, 1, 0, 0, 0, 2220, 2218, 1, 0, 0, 0, 2221, 2222, 5, 255, 0, 0, 2222, 2223, 5, 256, 0, 0, 2223, 2224, 3, 2, 1, 0, 2224, 2225, 5, 28, 0, 0, 2225, 2229, 3, 146, 73, 0, 2226, 2228, 3, 342, 171, 0, 2227, 2226, 1, 0, 0, 0, 2228, 2231, 1, 0, 0, 0, 2229, 2227, 1, 0, 0, 0, 2229, 2230, 1, 0, 0, 0, 2230, 2244, 1, 0, 0, 0, 2231, 2229, 1, 0, 0, 0, 2232, 2233, 5, 255, 0, 0, 2233, 2234, 5, 42, 0, 0, 2234, 2235, 3, 32, 16, 0, 2235, 2236, 5, 43, 0, 0, 2236, 2240, 3, 228, 114, 0, 2237, 2239, 3, 342, 171, 0, 2238, 2237, 1, 0, 0, 0, 2239, 2242, 1, 0, 0, 0, 2240, 2238, 1, 0, 0, 0, 2240, 2241, 1, 0, 0, 0, 2241, 2244, 1, 0, 0, 0, 2242, 2240, 1, 0, 0, 0, 2243, 2135, 1, 0, 0, 0, 2243, 2136, 1, 0, 0, 0, 2243, 2138, 1, 0, 0, 0, 2243, 2139, 1, 0, 0, 0, 2243, 2141, 1, 0, 0, 0, 2243, 2143, 1, 0, 0, 0, 2243, 2146, 1, 0, 0, 0, 2243, 2147, 1, 0, 0, 0, 2243, 2148, 1, 0, 0, 0, 2243, 2149, 1, 0, 0, 0, 2243, 2150, 1, 0, 0, 0, 2243, 2151, 1, 0, 0, 0, 2243, 2152, 1, 0, 0, 0, 2243, 2153, 1, 0, 0, 0, 2243, 2154, 1, 0, 0, 0, 2243, 2155, 1, 0, 0, 0, 2243, 2160, 1, 0, 0, 0, 2243, 2167, 1, 0, 0, 0, 2243, 2172, 1, 0, 0, 0, 2243, 2177, 1, 0, 0, 0, 2243, 2187, 1, 0, 0, 0, 2243, 2188, 1, 0, 0, 0, 2243, 2199, 1, 0, 0, 0, 2243, 2208, 1, 0, 0, 0, 2243, 2221, 1, 0, 0, 0, 2243, 2232, 1, 0, 0, 0, 2244, 271, 1, 0, 0, 0, 2245, 2246, 3, 0, 0, 0, 2246, 2247, 5, 75, 0, 0, 2247, 273, 1, 0, 0, 0, 2248, 2251, 3, 44, 22, 0, 2249, 2251, 3, 46, 23, 0, 2250, 2248, 1, 0, 0, 0, 2250, 2249, 1, 0, 0, 0, 2251, 275, 1, 0, 0, 0, 2252, 2253, 5, 17, 0, 0, 2253, 2254, 3, 268, 134, 0, 2254, 2255, 5, 18, 0, 0, 2255, 277, 1, 0, 0, 0, 2256, 2257, 3, 282, 141, 0, 2257, 2258, 3, 280, 140, 0, 2258, 279, 1, 0, 0, 0, 2259, 2261, 3, 284, 142, 0, 2260, 2259, 1, 0, 0, 0, 2261, 2262, 1, 0, 0, 0, 2262, 2260, 1, 0, 0, 0, 2262, 2263, 1, 0, 0, 0, 2263, 281, 1, 0, 0, 0, 2264, 2265, 5, 158, 0, 0, 2265, 2277, 3, 276, 138, 0, 2266, 2267, 5, 158, 0, 0, 2267, 2268, 3, 0, 0, 0, 2268, 2269, 5, 159, 0, 0, 2269, 2270, 3, 0, 0, 0, 2270, 2277, 1, 0, 0, 0, 2271, 2272, 5, 158, 0, 0, 2272, 2273, 3, 32, 16, 0, 2273, 2274, 5, 159, 0, 0, 2274, 2275, 3, 32, 16, 0, 2275, 2277, 1, 0, 0, 0, 2276, 2264, 1, 0, 0, 0, 2276, 2266, 1, 0, 0, 0, 2276, 2271, 1, 0, 0, 0, 2277, 283, 1, 0, 0, 0, 2278, 2279, 3, 288, 144, 0, 2279, 2280, 3, 294, 147, 0, 2280, 2291, 1, 0, 0, 0, 2281, 2282, 3, 286, 143, 0, 2282, 2283, 3, 294, 147, 0, 2283, 2291, 1, 0, 0, 0, 2284, 2285, 3, 290, 145, 0, 2285, 2286, 3, 294, 147, 0, 2286, 2291, 1, 0, 0, 0, 2287, 2288, 3, 292, 146, 0, 2288, 2289, 3, 294, 147, 0, 2289, 2291, 1, 0, 0, 0, 2290, 2278, 1, 0, 0, 0, 2290, 2281, 1, 0, 0, 0, 2290, 2284, 1, 0, 0, 0, 2290, 2287, 1, 0, 0, 0, 2291, 285, 1, 0, 0, 0, 2292, 2293, 5, 160, 0, 0, 2293, 2299, 3, 276, 138, 0, 2294, 2295, 5, 160, 0, 0, 2295, 2299, 3, 0, 0, 0, 2296, 2297, 5, 160, 0, 0, 2297, 2299, 3, 32, 16, 0, 2298, 2292, 1, 0, 0, 0, 2298, 2294, 1, 0, 0, 0, 2298, 2296, 1, 0, 0, 0, 2299, 287, 1, 0, 0, 0, 2300, 2301, 5, 161, 0, 0, 2301, 2302, 3, 146, 73, 0, 2302, 289, 1, 0, 0, 0, 2303, 2304, 5, 162, 0, 0, 2304, 291, 1, 0, 0, 0, 2305, 2306, 5, 163, 0, 0, 2306, 293, 1, 0, 0, 0, 2307, 2319, 3, 276, 138, 0, 2308, 2309, 5, 164, 0, 0, 2309, 2310, 3, 0, 0, 0, 2310, 2311, 5, 159, 0, 0, 2311, 2312, 3, 0, 0, 0, 2312, 2319, 1, 0, 0, 0, 2313, 2314, 5, 164, 0, 0, 2314, 2315, 3, 32, 16, 0, 2315, 2316, 5, 159, 0, 0, 2316, 2317, 3, 32, 16, 0, 2317, 2319, 1, 0, 0, 0, 2318, 2307, 1, 0, 0, 0, 2318, 2308, 1, 0, 0, 0, 2318, 2313, 1, 0, 0, 0, 2319, 295, 1, 0, 0, 0, 2320, 2321, 3, 298, 149, 0, 2321, 2322, 3, 302, 151, 0, 2322, 297, 1, 0, 0, 0, 2323, 2324, 5, 165, 0, 0, 2324, 2325, 3, 300, 150, 0, 2325, 2326, 3, 0, 0, 0, 2326, 2327, 5, 36, 0, 0, 2327, 2331, 1, 0, 0, 0, 2328, 2329, 5, 165, 0, 0, 2329, 2331, 3, 300, 150, 0, 2330, 2323, 1, 0, 0, 0, 2330, 2328, 1, 0, 0, 0, 2331, 299, 1, 0, 0, 0, 2332, 2336, 1, 0, 0, 0, 2333, 2336, 5, 166, 0, 0, 2334, 2336, 5, 2, 0, 0, 2335, 2332, 1, 0, 0, 0, 2335, 2333, 1, 0, 0, 0, 2335, 2334, 1, 0, 0, 0, 2336, 301, 1, 0, 0, 0, 2337, 2338, 5, 17, 0, 0, 2338, 2339, 3, 304, 152, 0, 2339, 2340, 5, 18, 0, 0, 2340, 2347, 1, 0, 0, 0, 2341, 2343, 3, 308, 154, 0, 2342, 2341, 1, 0, 0, 0, 2343, 2344, 1, 0, 0, 0, 2344, 2342, 1, 0, 0, 0, 2344, 2345, 1, 0, 0, 0, 2345, 2347, 1, 0, 0, 0, 2346, 2337, 1, 0, 0, 0, 2346, 2342, 1, 0, 0, 0, 2347, 303, 1, 0, 0, 0, 2348, 2349, 3, 308, 154, 0, 2349, 2350, 5, 28, 0, 0, 2350, 2352, 1, 0, 0, 0, 2351, 2348, 1, 0, 0, 0, 2352, 2355, 1, 0, 0, 0, 2353, 2351, 1, 0, 0, 0, 2353, 2354, 1, 0, 0, 0, 2354, 2356, 1, 0, 0, 0, 2355, 2353, 1, 0, 0, 0, 2356, 2357, 3, 308, 154, 0, 2357, 305, 1, 0, 0, 0, 2358, 2364, 1, 0, 0, 0, 2359, 2360, 5, 42, 0, 0, 2360, 2361, 3, 32, 16, 0, 2361, 2362, 5, 43, 0, 0, 2362, 2364, 1, 0, 0, 0, 2363, 2358, 1, 0, 0, 0, 2363, 2359, 1, 0, 0, 0, 2364, 307, 1, 0, 0, 0, 2365, 2366, 5, 181, 0, 0, 2366, 2367, 5, 262, 0, 0, 2367, 2368, 5, 30, 0, 0, 2368, 2369, 3, 6, 3, 0, 2369, 2370, 5, 31, 0, 0, 2370, 2432, 1, 0, 0, 0, 2371, 2372, 5, 260, 0, 0, 2372, 2373, 5, 30, 0, 0, 2373, 2374, 3, 0, 0, 0, 2374, 2375, 5, 31, 0, 0, 2375, 2432, 1, 0, 0, 0, 2376, 2377, 5, 260, 0, 0, 2377, 2432, 3, 0, 0, 0, 2378, 2379, 5, 84, 0, 0, 2379, 2380, 5, 30, 0, 0, 2380, 2381, 3, 312, 156, 0, 2381, 2382, 5, 31, 0, 0, 2382, 2432, 1, 0, 0, 0, 2383, 2384, 5, 188, 0, 0, 2384, 2385, 5, 30, 0, 0, 2385, 2386, 3, 36, 18, 0, 2386, 2387, 5, 31, 0, 0, 2387, 2388, 3, 306, 153, 0, 2388, 2432, 1, 0, 0, 0, 2389, 2390, 5, 189, 0, 0, 2390, 2391, 5, 30, 0, 0, 2391, 2392, 3, 36, 18, 0, 2392, 2393, 5, 31, 0, 0, 2393, 2394, 3, 306, 153, 0, 2394, 2432, 1, 0, 0, 0, 2395, 2396, 5, 187, 0, 0, 2396, 2397, 5, 30, 0, 0, 2397, 2398, 3, 34, 17, 0, 2398, 2399, 5, 31, 0, 0, 2399, 2400, 3, 306, 153, 0, 2400, 2432, 1, 0, 0, 0, 2401, 2402, 5, 186, 0, 0, 2402, 2403, 5, 30, 0, 0, 2403, 2404, 3, 32, 16, 0, 2404, 2405, 5, 31, 0, 0, 2405, 2406, 3, 306, 153, 0, 2406, 2432, 1, 0, 0, 0, 2407, 2408, 5, 185, 0, 0, 2408, 2409, 5, 30, 0, 0, 2409, 2410, 3, 32, 16, 0, 2410, 2411, 5, 31, 0, 0, 2411, 2412, 3, 306, 153, 0, 2412, 2432, 1, 0, 0, 0, 2413, 2414, 5, 184, 0, 0, 2414, 2415, 5, 30, 0, 0, 2415, 2416, 3, 32, 16, 0, 2416, 2417, 5, 31, 0, 0, 2417, 2418, 3, 306, 153, 0, 2418, 2432, 1, 0, 0, 0, 2419, 2420, 5, 188, 0, 0, 2420, 2432, 3, 306, 153, 0, 2421, 2422, 5, 189, 0, 0, 2422, 2432, 3, 306, 153, 0, 2423, 2424, 5, 187, 0, 0, 2424, 2432, 3, 306, 153, 0, 2425, 2426, 5, 186, 0, 0, 2426, 2432, 3, 306, 153, 0, 2427, 2428, 5, 185, 0, 0, 2428, 2432, 3, 306, 153, 0, 2429, 2430, 5, 184, 0, 0, 2430, 2432, 3, 306, 153, 0, 2431, 2365, 1, 0, 0, 0, 2431, 2371, 1, 0, 0, 0, 2431, 2376, 1, 0, 0, 0, 2431, 2378, 1, 0, 0, 0, 2431, 2383, 1, 0, 0, 0, 2431, 2389, 1, 0, 0, 0, 2431, 2395, 1, 0, 0, 0, 2431, 2401, 1, 0, 0, 0, 2431, 2407, 1, 0, 0, 0, 2431, 2413, 1, 0, 0, 0, 2431, 2419, 1, 0, 0, 0, 2431, 2421, 1, 0, 0, 0, 2431, 2423, 1, 0, 0, 0, 2431, 2425, 1, 0, 0, 0, 2431, 2427, 1, 0, 0, 0, 2431, 2429, 1, 0, 0, 0, 2432, 309, 1, 0, 0, 0, 2433, 2434, 5, 188, 0, 0, 2434, 2435, 5, 30, 0, 0, 2435, 2436, 3, 36, 18, 0, 2436, 2437, 5, 31, 0, 0, 2437, 2509, 1, 0, 0, 0, 2438, 2439, 5, 189, 0, 0, 2439, 2440, 5, 30, 0, 0, 2440, 2441, 3, 36, 18, 0, 2441, 2442, 5, 31, 0, 0, 2442, 2509, 1, 0, 0, 0, 2443, 2444, 5, 188, 0, 0, 2444, 2445, 5, 30, 0, 0, 2445, 2446, 3, 32, 16, 0, 2446, 2447, 5, 31, 0, 0, 2447, 2509, 1, 0, 0, 0, 2448, 2449, 5, 189, 0, 0, 2449, 2450, 5, 30, 0, 0, 2450, 2451, 3, 34, 17, 0, 2451, 2452, 5, 31, 0, 0, 2452, 2509, 1, 0, 0, 0, 2453, 2454, 5, 187, 0, 0, 2454, 2455, 5, 30, 0, 0, 2455, 2456, 3, 34, 17, 0, 2456, 2457, 5, 31, 0, 0, 2457, 2509, 1, 0, 0, 0, 2458, 2459, 5, 186, 0, 0, 2459, 2460, 5, 30, 0, 0, 2460, 2461, 3, 32, 16, 0, 2461, 2462, 5, 31, 0, 0, 2462, 2509, 1, 0, 0, 0, 2463, 2464, 5, 185, 0, 0, 2464, 2465, 5, 30, 0, 0, 2465, 2466, 3, 32, 16, 0, 2466, 2467, 5, 31, 0, 0, 2467, 2509, 1, 0, 0, 0, 2468, 2469, 5, 184, 0, 0, 2469, 2470, 5, 30, 0, 0, 2470, 2471, 3, 32, 16, 0, 2471, 2472, 5, 31, 0, 0, 2472, 2509, 1, 0, 0, 0, 2473, 2474, 5, 193, 0, 0, 2474, 2475, 5, 30, 0, 0, 2475, 2476, 3, 34, 17, 0, 2476, 2477, 5, 31, 0, 0, 2477, 2509, 1, 0, 0, 0, 2478, 2479, 5, 192, 0, 0, 2479, 2480, 5, 30, 0, 0, 2480, 2481, 3, 32, 16, 0, 2481, 2482, 5, 31, 0, 0, 2482, 2509, 1, 0, 0, 0, 2483, 2484, 5, 191, 0, 0, 2484, 2485, 5, 30, 0, 0, 2485, 2486, 3, 32, 16, 0, 2486, 2487, 5, 31, 0, 0, 2487, 2509, 1, 0, 0, 0, 2488, 2489, 5, 190, 0, 0, 2489, 2490, 5, 30, 0, 0, 2490, 2491, 3, 32, 16, 0, 2491, 2492, 5, 31, 0, 0, 2492, 2509, 1, 0, 0, 0, 2493, 2494, 5, 181, 0, 0, 2494, 2495, 5, 30, 0, 0, 2495, 2496, 3, 32, 16, 0, 2496, 2497, 5, 31, 0, 0, 2497, 2509, 1, 0, 0, 0, 2498, 2499, 5, 183, 0, 0, 2499, 2500, 5, 30, 0, 0, 2500, 2501, 3, 184, 92, 0, 2501, 2502, 5, 31, 0, 0, 2502, 2509, 1, 0, 0, 0, 2503, 2504, 5, 84, 0, 0, 2504, 2505, 5, 30, 0, 0, 2505, 2506, 3, 312, 156, 0, 2506, 2507, 5, 31, 0, 0, 2507, 2509, 1, 0, 0, 0, 2508, 2433, 1, 0, 0, 0, 2508, 2438, 1, 0, 0, 0, 2508, 2443, 1, 0, 0, 0, 2508, 2448, 1, 0, 0, 0, 2508, 2453, 1, 0, 0, 0, 2508, 2458, 1, 0, 0, 0, 2508, 2463, 1, 0, 0, 0, 2508, 2468, 1, 0, 0, 0, 2508, 2473, 1, 0, 0, 0, 2508, 2478, 1, 0, 0, 0, 2508, 2483, 1, 0, 0, 0, 2508, 2488, 1, 0, 0, 0, 2508, 2493, 1, 0, 0, 0, 2508, 2498, 1, 0, 0, 0, 2508, 2503, 1, 0, 0, 0, 2509, 311, 1, 0, 0, 0, 2510, 2512, 3, 314, 157, 0, 2511, 2510, 1, 0, 0, 0, 2512, 2515, 1, 0, 0, 0, 2513, 2511, 1, 0, 0, 0, 2513, 2514, 1, 0, 0, 0, 2514, 313, 1, 0, 0, 0, 2515, 2513, 1, 0, 0, 0, 2516, 2517, 7, 12, 0, 0, 2517, 315, 1, 0, 0, 0, 2518, 2522, 3, 310, 155, 0, 2519, 2522, 3, 6, 3, 0, 2520, 2522, 5, 179, 0, 0, 2521, 2518, 1, 0, 0, 0, 2521, 2519, 1, 0, 0, 0, 2521, 2520, 1, 0, 0, 0, 2522, 317, 1, 0, 0, 0, 2523, 2672, 3, 310, 155, 0, 2524, 2525, 5, 182, 0, 0, 2525, 2526, 5, 30, 0, 0, 2526, 2527, 5, 179, 0, 0, 2527, 2672, 5, 31, 0, 0, 2528, 2529, 5, 182, 0, 0, 2529, 2530, 5, 30, 0, 0, 2530, 2531, 5, 264, 0, 0, 2531, 2672, 5, 31, 0, 0, 2532, 2533, 5, 196, 0, 0, 2533, 2534, 5, 30, 0, 0, 2534, 2535, 5, 39, 0, 0, 2535, 2536, 5, 264, 0, 0, 2536, 2672, 5, 31, 0, 0, 2537, 2538, 5, 196, 0, 0, 2538, 2539, 5, 30, 0, 0, 2539, 2540, 3, 138, 69, 0, 2540, 2541, 5, 31, 0, 0, 2541, 2672, 1, 0, 0, 0, 2542, 2543, 5, 196, 0, 0, 2543, 2544, 5, 30, 0, 0, 2544, 2545, 5, 179, 0, 0, 2545, 2672, 5, 31, 0, 0, 2546, 2547, 5, 197, 0, 0, 2547, 2548, 5, 30, 0, 0, 2548, 2549, 3, 318, 159, 0, 2549, 2550, 5, 31, 0, 0, 2550, 2672, 1, 0, 0, 0, 2551, 2552, 5, 188, 0, 0, 2552, 2553, 5, 42, 0, 0, 2553, 2554, 3, 32, 16, 0, 2554, 2555, 5, 43, 0, 0, 2555, 2556, 5, 30, 0, 0, 2556, 2557, 3, 320, 160, 0, 2557, 2558, 5, 31, 0, 0, 2558, 2672, 1, 0, 0, 0, 2559, 2560, 5, 189, 0, 0, 2560, 2561, 5, 42, 0, 0, 2561, 2562, 3, 32, 16, 0, 2562, 2563, 5, 43, 0, 0, 2563, 2564, 5, 30, 0, 0, 2564, 2565, 3, 322, 161, 0, 2565, 2566, 5, 31, 0, 0, 2566, 2672, 1, 0, 0, 0, 2567, 2568, 5, 187, 0, 0, 2568, 2569, 5, 42, 0, 0, 2569, 2570, 3, 32, 16, 0, 2570, 2571, 5, 43, 0, 0, 2571, 2572, 5, 30, 0, 0, 2572, 2573, 3, 324, 162, 0, 2573, 2574, 5, 31, 0, 0, 2574, 2672, 1, 0, 0, 0, 2575, 2576, 5, 186, 0, 0, 2576, 2577, 5, 42, 0, 0, 2577, 2578, 3, 32, 16, 0, 2578, 2579, 5, 43, 0, 0, 2579, 2580, 5, 30, 0, 0, 2580, 2581, 3, 326, 163, 0, 2581, 2582, 5, 31, 0, 0, 2582, 2672, 1, 0, 0, 0, 2583, 2584, 5, 185, 0, 0, 2584, 2585, 5, 42, 0, 0, 2585, 2586, 3, 32, 16, 0, 2586, 2587, 5, 43, 0, 0, 2587, 2588, 5, 30, 0, 0, 2588, 2589, 3, 328, 164, 0, 2589, 2590, 5, 31, 0, 0, 2590, 2672, 1, 0, 0, 0, 2591, 2592, 5, 184, 0, 0, 2592, 2593, 5, 42, 0, 0, 2593, 2594, 3, 32, 16, 0, 2594, 2595, 5, 43, 0, 0, 2595, 2596, 5, 30, 0, 0, 2596, 2597, 3, 330, 165, 0, 2597, 2598, 5, 31, 0, 0, 2598, 2672, 1, 0, 0, 0, 2599, 2600, 5, 193, 0, 0, 2600, 2601, 5, 42, 0, 0, 2601, 2602, 3, 32, 16, 0, 2602, 2603, 5, 43, 0, 0, 2603, 2604, 5, 30, 0, 0, 2604, 2605, 3, 324, 162, 0, 2605, 2606, 5, 31, 0, 0, 2606, 2672, 1, 0, 0, 0, 2607, 2608, 5, 192, 0, 0, 2608, 2609, 5, 42, 0, 0, 2609, 2610, 3, 32, 16, 0, 2610, 2611, 5, 43, 0, 0, 2611, 2612, 5, 30, 0, 0, 2612, 2613, 3, 326, 163, 0, 2613, 2614, 5, 31, 0, 0, 2614, 2672, 1, 0, 0, 0, 2615, 2616, 5, 191, 0, 0, 2616, 2617, 5, 42, 0, 0, 2617, 2618, 3, 32, 16, 0, 2618, 2619, 5, 43, 0, 0, 2619, 2620, 5, 30, 0, 0, 2620, 2621, 3, 328, 164, 0, 2621, 2622, 5, 31, 0, 0, 2622, 2672, 1, 0, 0, 0, 2623, 2624, 5, 190, 0, 0, 2624, 2625, 5, 42, 0, 0, 2625, 2626, 3, 32, 16, 0, 2626, 2627, 5, 43, 0, 0, 2627, 2628, 5, 30, 0, 0, 2628, 2629, 3, 330, 165, 0, 2629, 2630, 5, 31, 0, 0, 2630, 2672, 1, 0, 0, 0, 2631, 2632, 5, 181, 0, 0, 2632, 2633, 5, 42, 0, 0, 2633, 2634, 3, 32, 16, 0, 2634, 2635, 5, 43, 0, 0, 2635, 2636, 5, 30, 0, 0, 2636, 2637, 3, 328, 164, 0, 2637, 2638, 5, 31, 0, 0, 2638, 2672, 1, 0, 0, 0, 2639, 2640, 5, 183, 0, 0, 2640, 2641, 5, 42, 0, 0, 2641, 2642, 3, 32, 16, 0, 2642, 2643, 5, 43, 0, 0, 2643, 2644, 5, 30, 0, 0, 2644, 2645, 3, 332, 166, 0, 2645, 2646, 5, 31, 0, 0, 2646, 2672, 1, 0, 0, 0, 2647, 2648, 5, 182, 0, 0, 2648, 2649, 5, 42, 0, 0, 2649, 2650, 3, 32, 16, 0, 2650, 2651, 5, 43, 0, 0, 2651, 2652, 5, 30, 0, 0, 2652, 2653, 3, 334, 167, 0, 2653, 2654, 5, 31, 0, 0, 2654, 2672, 1, 0, 0, 0, 2655, 2656, 5, 196, 0, 0, 2656, 2657, 5, 42, 0, 0, 2657, 2658, 3, 32, 16, 0, 2658, 2659, 5, 43, 0, 0, 2659, 2660, 5, 30, 0, 0, 2660, 2661, 3, 336, 168, 0, 2661, 2662, 5, 31, 0, 0, 2662, 2672, 1, 0, 0, 0, 2663, 2664, 5, 197, 0, 0, 2664, 2665, 5, 42, 0, 0, 2665, 2666, 3, 32, 16, 0, 2666, 2667, 5, 43, 0, 0, 2667, 2668, 5, 30, 0, 0, 2668, 2669, 3, 340, 170, 0, 2669, 2670, 5, 31, 0, 0, 2670, 2672, 1, 0, 0, 0, 2671, 2523, 1, 0, 0, 0, 2671, 2524, 1, 0, 0, 0, 2671, 2528, 1, 0, 0, 0, 2671, 2532, 1, 0, 0, 0, 2671, 2537, 1, 0, 0, 0, 2671, 2542, 1, 0, 0, 0, 2671, 2546, 1, 0, 0, 0, 2671, 2551, 1, 0, 0, 0, 2671, 2559, 1, 0, 0, 0, 2671, 2567, 1, 0, 0, 0, 2671, 2575, 1, 0, 0, 0, 2671, 2583, 1, 0, 0, 0, 2671, 2591, 1, 0, 0, 0, 2671, 2599, 1, 0, 0, 0, 2671, 2607, 1, 0, 0, 0, 2671, 2615, 1, 0, 0, 0, 2671, 2623, 1, 0, 0, 0, 2671, 2631, 1, 0, 0, 0, 2671, 2639, 1, 0, 0, 0, 2671, 2647, 1, 0, 0, 0, 2671, 2655, 1, 0, 0, 0, 2671, 2663, 1, 0, 0, 0, 2672, 319, 1, 0, 0, 0, 2673, 2676, 3, 36, 18, 0, 2674, 2676, 3, 32, 16, 0, 2675, 2673, 1, 0, 0, 0, 2675, 2674, 1, 0, 0, 0, 2676, 2679, 1, 0, 0, 0, 2677, 2675, 1, 0, 0, 0, 2677, 2678, 1, 0, 0, 0, 2678, 321, 1, 0, 0, 0, 2679, 2677, 1, 0, 0, 0, 2680, 2683, 3, 36, 18, 0, 2681, 2683, 3, 34, 17, 0, 2682, 2680, 1, 0, 0, 0, 2682, 2681, 1, 0, 0, 0, 2683, 2686, 1, 0, 0, 0, 2684, 2682, 1, 0, 0, 0, 2684, 2685, 1, 0, 0, 0, 2685, 323, 1, 0, 0, 0, 2686, 2684, 1, 0, 0, 0, 2687, 2689, 3, 34, 17, 0, 2688, 2687, 1, 0, 0, 0, 2689, 2692, 1, 0, 0, 0, 2690, 2688, 1, 0, 0, 0, 2690, 2691, 1, 0, 0, 0, 2691, 325, 1, 0, 0, 0, 2692, 2690, 1, 0, 0, 0, 2693, 2695, 3, 32, 16, 0, 2694, 2693, 1, 0, 0, 0, 2695, 2698, 1, 0, 0, 0, 2696, 2694, 1, 0, 0, 0, 2696, 2697, 1, 0, 0, 0, 2697, 327, 1, 0, 0, 0, 2698, 2696, 1, 0, 0, 0, 2699, 2701, 3, 32, 16, 0, 2700, 2699, 1, 0, 0, 0, 2701, 2704, 1, 0, 0, 0, 2702, 2700, 1, 0, 0, 0, 2702, 2703, 1, 0, 0, 0, 2703, 329, 1, 0, 0, 0, 2704, 2702, 1, 0, 0, 0, 2705, 2707, 3, 32, 16, 0, 2706, 2705, 1, 0, 0, 0, 2707, 2710, 1, 0, 0, 0, 2708, 2706, 1, 0, 0, 0, 2708, 2709, 1, 0, 0, 0, 2709, 331, 1, 0, 0, 0, 2710, 2708, 1, 0, 0, 0, 2711, 2713, 3, 184, 92, 0, 2712, 2711, 1, 0, 0, 0, 2713, 2716, 1, 0, 0, 0, 2714, 2712, 1, 0, 0, 0, 2714, 2715, 1, 0, 0, 0, 2715, 333, 1, 0, 0, 0, 2716, 2714, 1, 0, 0, 0, 2717, 2719, 7, 13, 0, 0, 2718, 2717, 1, 0, 0, 0, 2719, 2722, 1, 0, 0, 0, 2720, 2718, 1, 0, 0, 0, 2720, 2721, 1, 0, 0, 0, 2721, 335, 1, 0, 0, 0, 2722, 2720, 1, 0, 0, 0, 2723, 2725, 3, 338, 169, 0, 2724, 2723, 1, 0, 0, 0, 2725, 2728, 1, 0, 0, 0, 2726, 2724, 1, 0, 0, 0, 2726, 2727, 1, 0, 0, 0, 2727, 337, 1, 0, 0, 0, 2728, 2726, 1, 0, 0, 0, 2729, 2734, 5, 179, 0, 0, 2730, 2731, 5, 39, 0, 0, 2731, 2734, 5, 264, 0, 0, 2732, 2734, 3, 138, 69, 0, 2733, 2729, 1, 0, 0, 0, 2733, 2730, 1, 0, 0, 0, 2733, 2732, 1, 0, 0, 0, 2734, 339, 1, 0, 0, 0, 2735, 2737, 3, 318, 159, 0, 2736, 2735, 1, 0, 0, 0, 2737, 2740, 1, 0, 0, 0, 2738, 2736, 1, 0, 0, 0, 2738, 2739, 1, 0, 0, 0, 2739, 341, 1, 0, 0, 0, 2740, 2738, 1, 0, 0, 0, 2741, 2745, 3, 44, 22, 0, 2742, 2745, 3, 46, 23, 0, 2743, 2745, 3, 2, 1, 0, 2744, 2741, 1, 0, 0, 0, 2744, 2742, 1, 0, 0, 0, 2744, 2743, 1, 0, 0, 0, 2745, 343, 1, 0, 0, 0, 2746, 2747, 7, 14, 0, 0, 2747, 2748, 5, 36, 0, 0, 2748, 2749, 5, 30, 0, 0, 2749, 2750, 3, 312, 156, 0, 2750, 2751, 5, 31, 0, 0, 2751, 2772, 1, 0, 0, 0, 2752, 2753, 5, 169, 0, 0, 2753, 2754, 3, 38, 19, 0, 2754, 2755, 5, 75, 0, 0, 2755, 2756, 3, 38, 19, 0, 2756, 2757, 5, 75, 0, 0, 2757, 2758, 3, 38, 19, 0, 2758, 2759, 5, 75, 0, 0, 2759, 2760, 3, 38, 19, 0, 2760, 2772, 1, 0, 0, 0, 2761, 2762, 5, 170, 0, 0, 2762, 2772, 3, 6, 3, 0, 2763, 2764, 5, 170, 0, 0, 2764, 2765, 5, 36, 0, 0, 2765, 2766, 5, 30, 0, 0, 2766, 2767, 3, 312, 156, 0, 2767, 2768, 5, 31, 0, 0, 2768, 2772, 1, 0, 0, 0, 2769, 2772, 3, 342, 171, 0, 2770, 2772, 3, 40, 20, 0, 2771, 2746, 1, 0, 0, 0, 2771, 2752, 1, 0, 0, 0, 2771, 2761, 1, 0, 0, 0, 2771, 2763, 1, 0, 0, 0, 2771, 2769, 1, 0, 0, 0, 2771, 2770, 1, 0, 0, 0, 2772, 345, 1, 0, 0, 0, 2773, 2774, 5, 25, 0, 0, 2774, 2775, 5, 40, 0, 0, 2775, 2776, 3, 98, 49, 0, 2776, 2777, 3, 2, 1, 0, 2777, 2786, 1, 0, 0, 0, 2778, 2779, 5, 25, 0, 0, 2779, 2780, 5, 40, 0, 0, 2780, 2781, 3, 98, 49, 0, 2781, 2782, 3, 2, 1, 0, 2782, 2783, 5, 34, 0, 0, 2783, 2784, 3, 2, 1, 0, 2784, 2786, 1, 0, 0, 0, 2785, 2773, 1, 0, 0, 0, 2785, 2778, 1, 0, 0, 0, 2786, 347, 1, 0, 0, 0, 2787, 2789, 3, 350, 175, 0, 2788, 2787, 1, 0, 0, 0, 2789, 2792, 1, 0, 0, 0, 2790, 2788, 1, 0, 0, 0, 2790, 2791, 1, 0, 0, 0, 2791, 349, 1, 0, 0, 0, 2792, 2790, 1, 0, 0, 0, 2793, 2794, 5, 180, 0, 0, 2794, 2795, 5, 36, 0, 0, 2795, 2796, 5, 30, 0, 0, 2796, 2797, 3, 312, 156, 0, 2797, 2798, 5, 31, 0, 0, 2798, 2808, 1, 0, 0, 0, 2799, 2808, 3, 344, 172, 0, 2800, 2801, 5, 171, 0, 0, 2801, 2802, 5, 36, 0, 0, 2802, 2803, 5, 30, 0, 0, 2803, 2804, 3, 312, 156, 0, 2804, 2805, 5, 31, 0, 0, 2805, 2808, 1, 0, 0, 0, 2806, 2808, 5, 55, 0, 0, 2807, 2793, 1, 0, 0, 0, 2807, 2799, 1, 0, 0, 0, 2807, 2800, 1, 0, 0, 0, 2807, 2806, 1, 0, 0, 0, 2808, 351, 1, 0, 0, 0, 2809, 2810, 5, 50, 0, 0, 2810, 2814, 5, 40, 0, 0, 2811, 2813, 3, 356, 178, 0, 2812, 2811, 1, 0, 0, 0, 2813, 2816, 1, 0, 0, 0, 2814, 2812, 1, 0, 0, 0, 2814, 2815, 1, 0, 0, 0, 2815, 2817, 1, 0, 0, 0, 2816, 2814, 1, 0, 0, 0, 2817, 2818, 3, 2, 1, 0, 2818, 353, 1, 0, 0, 0, 2819, 2823, 5, 301, 0, 0, 2820, 2822, 3, 356, 178, 0, 2821, 2820, 1, 0, 0, 0, 2822, 2825, 1, 0, 0, 0, 2823, 2821, 1, 0, 0, 0, 2823, 2824, 1, 0, 0, 0, 2824, 2826, 1, 0, 0, 0, 2825, 2823, 1, 0, 0, 0, 2826, 2827, 3, 2, 1, 0, 2827, 355, 1, 0, 0, 0, 2828, 2844, 5, 52, 0, 0, 2829, 2844, 5, 51, 0, 0, 2830, 2844, 5, 172, 0, 0, 2831, 2832, 5, 62, 0, 0, 2832, 2844, 5, 51, 0, 0, 2833, 2834, 5, 62, 0, 0, 2834, 2844, 5, 52, 0, 0, 2835, 2836, 5, 62, 0, 0, 2836, 2844, 5, 63, 0, 0, 2837, 2838, 5, 62, 0, 0, 2838, 2844, 5, 64, 0, 0, 2839, 2840, 5, 62, 0, 0, 2840, 2844, 5, 65, 0, 0, 2841, 2842, 5, 62, 0, 0, 2842, 2844, 5, 66, 0, 0, 2843, 2828, 1, 0, 0, 0, 2843, 2829, 1, 0, 0, 0, 2843, 2830, 1, 0, 0, 0, 2843, 2831, 1, 0, 0, 0, 2843, 2833, 1, 0, 0, 0, 2843, 2835, 1, 0, 0, 0, 2843, 2837, 1, 0, 0, 0, 2843, 2839, 1, 0, 0, 0, 2843, 2841, 1, 0, 0, 0, 2844, 357, 1, 0, 0, 0, 2845, 2847, 3, 360, 180, 0, 2846, 2845, 1, 0, 0, 0, 2847, 2850, 1, 0, 0, 0, 2848, 2846, 1, 0, 0, 0, 2848, 2849, 1, 0, 0, 0, 2849, 359, 1, 0, 0, 0, 2850, 2848, 1, 0, 0, 0, 2851, 2852, 5, 21, 0, 0, 2852, 2865, 3, 2, 1, 0, 2853, 2854, 5, 50, 0, 0, 2854, 2855, 5, 40, 0, 0, 2855, 2865, 3, 140, 70, 0, 2856, 2857, 5, 25, 0, 0, 2857, 2858, 5, 40, 0, 0, 2858, 2865, 3, 2, 1, 0, 2859, 2865, 3, 196, 98, 0, 2860, 2861, 5, 50, 0, 0, 2861, 2865, 3, 32, 16, 0, 2862, 2865, 3, 342, 171, 0, 2863, 2865, 3, 40, 20, 0, 2864, 2851, 1, 0, 0, 0, 2864, 2853, 1, 0, 0, 0, 2864, 2856, 1, 0, 0, 0, 2864, 2859, 1, 0, 0, 0, 2864, 2860, 1, 0, 0, 0, 2864, 2862, 1, 0, 0, 0, 2864, 2863, 1, 0, 0, 0, 2865, 361, 1, 0, 0, 0, 2866, 2870, 5, 274, 0, 0, 2867, 2869, 3, 364, 182, 0, 2868, 2867, 1, 0, 0, 0, 2869, 2872, 1, 0, 0, 0, 2870, 2868, 1, 0, 0, 0, 2870, 2871, 1, 0, 0, 0, 2871, 2873, 1, 0, 0, 0, 2872, 2870, 1, 0, 0, 0, 2873, 2886, 3, 2, 1, 0, 2874, 2878, 5, 274, 0, 0, 2875, 2877, 3, 364, 182, 0, 2876, 2875, 1, 0, 0, 0, 2877, 2880, 1, 0, 0, 0, 2878, 2876, 1, 0, 0, 0, 2878, 2879, 1, 0, 0, 0, 2879, 2881, 1, 0, 0, 0, 2880, 2878, 1, 0, 0, 0, 2881, 2882, 3, 2, 1, 0, 2882, 2883, 5, 34, 0, 0, 2883, 2884, 3, 2, 1, 0, 2884, 2886, 1, 0, 0, 0, 2885, 2866, 1, 0, 0, 0, 2885, 2874, 1, 0, 0, 0, 2886, 363, 1, 0, 0, 0, 2887, 2888, 7, 15, 0, 0, 2888, 365, 1, 0, 0, 0, 2889, 2891, 3, 368, 184, 0, 2890, 2889, 1, 0, 0, 0, 2891, 2894, 1, 0, 0, 0, 2892, 2890, 1, 0, 0, 0, 2892, 2893, 1, 0, 0, 0, 2893, 367, 1, 0, 0, 0, 2894, 2892, 1, 0, 0, 0, 2895, 2896, 5, 21, 0, 0, 2896, 2897, 3, 2, 1, 0, 2897, 2898, 5, 44, 0, 0, 2898, 2899, 3, 32, 16, 0, 2899, 2906, 1, 0, 0, 0, 2900, 2901, 5, 25, 0, 0, 2901, 2902, 5, 40, 0, 0, 2902, 2906, 3, 2, 1, 0, 2903, 2906, 3, 342, 171, 0, 2904, 2906, 3, 40, 20, 0, 2905, 2895, 1, 0, 0, 0, 2905, 2900, 1, 0, 0, 0, 2905, 2903, 1, 0, 0, 0, 2905, 2904, 1, 0, 0, 0, 2906, 369, 1, 0, 0, 0, 172, 378, 383, 391, 399, 452, 493, 502, 526, 530, 548, 575, 598, 634, 640, 647, 649, 659, 661, 668, 679, 687, 708, 710, 726, 771, 776, 781, 786, 794, 904, 910, 926, 932, 938, 945, 1056, 1061, 1067, 1072, 1074, 1082, 1094, 1106, 1113, 1120, 1122, 1149, 1156, 1164, 1172, 1185, 1192, 1195, 1214, 1308, 1317, 1324, 1327, 1335, 1356, 1388, 1411, 1423, 1432, 1457, 1481, 1489, 1493, 1508, 1515, 1560, 1570, 1586, 1598, 1610, 1624, 1636, 1647, 1654, 1664, 1677, 1682, 1687, 1696, 1707, 1790, 1799, 1812, 1823, 1831, 1841, 1843, 1870, 1877, 1882, 1889, 1895, 1905, 1909, 1916, 1931, 1937, 1951, 1964, 1972, 1979, 1983, 1988, 2004, 2009, 2011, 2024, 2050, 2057, 2059, 2064, 2070, 2099, 2104, 2127, 2132, 2196, 2205, 2218, 2229, 2240, 2243, 2250, 2262, 2276, 2290, 2298, 2318, 2330, 2335, 2344, 2346, 2353, 2363, 2431, 2508, 2513, 2521, 2671, 2675, 2677, 2682, 2684, 2690, 2696, 2702, 2708, 2714, 2720, 2726, 2733, 2738, 2744, 2771, 2785, 2790, 2807, 2814, 2823, 2843, 2848, 2864, 2870, 2878, 2885, 2892, 2905]
\ No newline at end of file
diff --git a/src/tools/ilasm/src/ILAssembler/gen/CIL.tokens b/src/tools/ilasm/src/ILAssembler/gen/CIL.tokens
index 2d2c2b7de5f63f..fa7cb6ffc6ee9d 100644
--- a/src/tools/ilasm/src/ILAssembler/gen/CIL.tokens
+++ b/src/tools/ilasm/src/ILAssembler/gen/CIL.tokens
@@ -169,139 +169,140 @@ T__167=168
T__168=169
T__169=170
T__170=171
-INT32=172
-INT64=173
-FLOAT64=174
-DCOLON=175
-ELLIPSIS=176
-NULL=177
-NULLREF=178
-HASH=179
-CHAR=180
-STRING=181
-BOOL=182
-INT8=183
-INT16=184
-INT32_=185
-INT64_=186
-FLOAT32=187
-FLOAT64_=188
-UINT8=189
-UINT16=190
-UINT32=191
-UINT64=192
-INT=193
-UINT=194
-TYPE=195
-OBJECT=196
-MODULE=197
-VALUE=198
-VALUETYPE=199
-VOID=200
-ENUM=201
-CUSTOM=202
-FIXED=203
-SYSSTRING=204
-ARRAY=205
-VARIANT=206
-CURRENCY=207
-SYSCHAR=208
-ERROR=209
-DECIMAL=210
-DATE=211
-BSTR=212
-LPSTR=213
-LPWSTR=214
-LPTSTR=215
-OBJECTREF=216
-IUNKNOWN=217
-IDISPATCH=218
-STRUCT=219
-INTERFACE=220
-SAFEARRAY=221
-BYVALSTR=222
-ANSI=223
-TBSTR=224
-METHOD=225
-ANY=226
-LPSTRUCT=227
-VECTOR=228
-HRESULT=229
-CARRAY=230
-USERDEFINED=231
-RECORD=232
-FILETIME=233
-BLOB=234
-STREAM=235
-STORAGE=236
-STREAMED_OBJECT=237
-STORED_OBJECT=238
-BLOB_OBJECT=239
-CF=240
-CLSID=241
-INSTANCE=242
-EXPLICIT=243
-DEFAULT=244
-VARARG=245
-UNMANAGED=246
-CDECL=247
-STDCALL=248
-THISCALL=249
-FASTCALL=250
-TYPE_PARAMETER=251
-METHOD_TYPE_PARAMETER=252
-TYPEDREF=253
-PARAM=254
-CONSTRAINT=255
-THIS=256
-BASE=257
-NESTER=258
-REF=259
-ARRAY_TYPE_NO_BOUNDS=260
-PTR=261
-QSTRING=262
-SQSTRING=263
-DOT=264
-PLUS=265
-PP_DEFINE=266
-PP_UNDEF=267
-PP_IFDEF=268
-PP_IFNDEF=269
-PP_ELSE=270
-PP_ENDIF=271
-PP_INCLUDE=272
-MRESOURCE=273
-INSTR_NONE=274
-INSTR_VAR=275
-INSTR_I=276
-INSTR_I8=277
-INSTR_R=278
-INSTR_METHOD=279
-INSTR_SIG=280
-INSTR_BRTARGET=281
-INSTR_SWITCH=282
-INSTR_TYPE=283
-INSTR_STRING=284
-INSTR_FIELD=285
-INSTR_TOK=286
-DOTTEDNAME=287
-ID=288
-HEXBYTE=289
-WS=290
-SINGLE_LINE_COMMENT=291
-COMMENT=292
-PERMISSION=293
-PERMISSIONSET=294
-EMITBYTE=295
-MAXSTACK=296
-ENTRYPOINT=297
-ZEROINIT=298
-LOCALS=299
-EXPORT=300
-OVERRIDE=301
-VTENTRY=302
-IncludedFileEof=303
-SyntheticIncludedFileEof=304
+T__171=172
+INT32=173
+INT64=174
+FLOAT64=175
+DCOLON=176
+ELLIPSIS=177
+NULL=178
+NULLREF=179
+HASH=180
+CHAR=181
+STRING=182
+BOOL=183
+INT8=184
+INT16=185
+INT32_=186
+INT64_=187
+FLOAT32=188
+FLOAT64_=189
+UINT8=190
+UINT16=191
+UINT32=192
+UINT64=193
+INT=194
+UINT=195
+TYPE=196
+OBJECT=197
+MODULE=198
+VALUE=199
+VALUETYPE=200
+VOID=201
+ENUM=202
+CUSTOM=203
+FIXED=204
+SYSSTRING=205
+ARRAY=206
+VARIANT=207
+CURRENCY=208
+SYSCHAR=209
+ERROR=210
+DECIMAL=211
+DATE=212
+BSTR=213
+LPSTR=214
+LPWSTR=215
+LPTSTR=216
+OBJECTREF=217
+IUNKNOWN=218
+IDISPATCH=219
+STRUCT=220
+INTERFACE=221
+SAFEARRAY=222
+BYVALSTR=223
+ANSI=224
+TBSTR=225
+METHOD=226
+ANY=227
+LPSTRUCT=228
+VECTOR=229
+HRESULT=230
+CARRAY=231
+USERDEFINED=232
+RECORD=233
+FILETIME=234
+BLOB=235
+STREAM=236
+STORAGE=237
+STREAMED_OBJECT=238
+STORED_OBJECT=239
+BLOB_OBJECT=240
+CF=241
+CLSID=242
+INSTANCE=243
+EXPLICIT=244
+DEFAULT=245
+VARARG=246
+UNMANAGED=247
+CDECL=248
+STDCALL=249
+THISCALL=250
+FASTCALL=251
+TYPE_PARAMETER=252
+METHOD_TYPE_PARAMETER=253
+TYPEDREF=254
+PARAM=255
+CONSTRAINT=256
+THIS=257
+BASE=258
+NESTER=259
+REF=260
+ARRAY_TYPE_NO_BOUNDS=261
+PTR=262
+QSTRING=263
+SQSTRING=264
+DOT=265
+PLUS=266
+PP_DEFINE=267
+PP_UNDEF=268
+PP_IFDEF=269
+PP_IFNDEF=270
+PP_ELSE=271
+PP_ENDIF=272
+PP_INCLUDE=273
+MRESOURCE=274
+INSTR_NONE=275
+INSTR_VAR=276
+INSTR_I=277
+INSTR_I8=278
+INSTR_R=279
+INSTR_METHOD=280
+INSTR_SIG=281
+INSTR_BRTARGET=282
+INSTR_SWITCH=283
+INSTR_TYPE=284
+INSTR_STRING=285
+INSTR_FIELD=286
+INSTR_TOK=287
+DOTTEDNAME=288
+ID=289
+HEXBYTE=290
+WS=291
+SINGLE_LINE_COMMENT=292
+COMMENT=293
+PERMISSION=294
+PERMISSIONSET=295
+EMITBYTE=296
+MAXSTACK=297
+ENTRYPOINT=298
+ZEROINIT=299
+LOCALS=300
+EXPORT=301
+OVERRIDE=302
+VTENTRY=303
+IncludedFileEof=304
+SyntheticIncludedFileEof=305
'native'=1
'cil'=2
'optil'=3
@@ -317,118 +318,118 @@ SyntheticIncludedFileEof=304
'aggressiveoptimization'=13
'async'=14
'extended'=15
-'{'=16
-'}'=17
-'.subsystem'=18
-'.corflags'=19
-'.file'=20
-'alignment'=21
-'.imagebase'=22
-'.stackreserve'=23
-'.assembly'=24
-'.mscorlib'=25
-'.language'=26
-','=27
-'.typelist'=28
-'('=29
-')'=30
-';'=31
-'.typedef'=32
-'as'=33
-'.custom'=34
-'='=35
-'field'=36
-'property'=37
-'class'=38
-'extern'=39
-'.vtfixup'=40
-'['=41
-']'=42
-'at'=43
-'fromunmanaged'=44
-'callmostderived'=45
-'retainappdomain'=46
-'.vtable'=47
-'.namespace'=48
-'.class'=49
-'public'=50
-'private'=51
-'sealed'=52
-'abstract'=53
-'auto'=54
-'sequential'=55
-'unicode'=56
-'autochar'=57
-'import'=58
-'serializable'=59
-'windowsruntime'=60
-'nested'=61
-'family'=62
-'assembly'=63
-'famandassem'=64
-'famorassem'=65
-'beforefieldinit'=66
-'specialname'=67
-'rtspecialname'=68
-'flags'=69
-'extends'=70
-'implements'=71
-'.line'=72
-'#line'=73
-':'=74
-'nometadata'=75
-'retargetable'=76
-'noplatform'=77
-'legacy library'=78
-'x86'=79
-'amd64'=80
-'arm'=81
-'arm64'=82
-'bytearray'=83
-'()'=84
-'<'=85
-'>'=86
-'/'=87
-'algorithm'=88
-'iidparam'=89
-'pinned'=90
-'modreq'=91
-'modopt'=92
-'unsigned'=93
-'true'=94
-'false'=95
-'request'=96
-'demand'=97
-'assert'=98
-'deny'=99
-'permitonly'=100
-'linkcheck'=101
-'inheritcheck'=102
-'reqmin'=103
-'reqopt'=104
-'reqrefuse'=105
-'prejitgrant'=106
-'prejitdeny'=107
-'noncasdemand'=108
-'noncaslinkdemand'=109
-'noncasinheritance'=110
-'callconv'=111
-'mdtoken'=112
-'-'=113
-'byreflike'=114
-'.ctor'=115
-'.size'=116
-'.pack'=117
-'with'=118
-'.interfaceimpl'=119
-'.field'=120
-'marshal'=121
-'static'=122
-'initonly'=123
-'privatescope'=124
-'literal'=125
-'notserialized'=126
-'volatile'=127
+'volatile'=16
+'{'=17
+'}'=18
+'.subsystem'=19
+'.corflags'=20
+'.file'=21
+'alignment'=22
+'.imagebase'=23
+'.stackreserve'=24
+'.assembly'=25
+'.mscorlib'=26
+'.language'=27
+','=28
+'.typelist'=29
+'('=30
+')'=31
+';'=32
+'.typedef'=33
+'as'=34
+'.custom'=35
+'='=36
+'field'=37
+'property'=38
+'class'=39
+'extern'=40
+'.vtfixup'=41
+'['=42
+']'=43
+'at'=44
+'fromunmanaged'=45
+'callmostderived'=46
+'retainappdomain'=47
+'.vtable'=48
+'.namespace'=49
+'.class'=50
+'public'=51
+'private'=52
+'sealed'=53
+'abstract'=54
+'auto'=55
+'sequential'=56
+'unicode'=57
+'autochar'=58
+'import'=59
+'serializable'=60
+'windowsruntime'=61
+'nested'=62
+'family'=63
+'assembly'=64
+'famandassem'=65
+'famorassem'=66
+'beforefieldinit'=67
+'specialname'=68
+'rtspecialname'=69
+'flags'=70
+'extends'=71
+'implements'=72
+'.line'=73
+'#line'=74
+':'=75
+'nometadata'=76
+'retargetable'=77
+'noplatform'=78
+'legacy library'=79
+'x86'=80
+'amd64'=81
+'arm'=82
+'arm64'=83
+'bytearray'=84
+'()'=85
+'<'=86
+'>'=87
+'/'=88
+'algorithm'=89
+'unsigned'=90
+'iidparam'=91
+'pinned'=92
+'modreq'=93
+'modopt'=94
+'true'=95
+'false'=96
+'request'=97
+'demand'=98
+'assert'=99
+'deny'=100
+'permitonly'=101
+'linkcheck'=102
+'inheritcheck'=103
+'reqmin'=104
+'reqopt'=105
+'reqrefuse'=106
+'prejitgrant'=107
+'prejitdeny'=108
+'noncasdemand'=109
+'noncaslinkdemand'=110
+'noncasinheritance'=111
+'callconv'=112
+'mdtoken'=113
+'-'=114
+'byreflike'=115
+'.ctor'=116
+'.size'=117
+'.pack'=118
+'with'=119
+'.interfaceimpl'=120
+'.field'=121
+'marshal'=122
+'static'=123
+'initonly'=124
+'privatescope'=125
+'literal'=126
+'notserialized'=127
'.event'=128
'.addon'=129
'.removeon'=130
@@ -468,116 +469,117 @@ SyntheticIncludedFileEof=304
'handler'=164
'.data'=165
'tls'=166
-'.publicKey'=167
-'.ver'=168
-'.locale'=169
-'.publickeytoken'=170
-'forwarder'=171
-'::'=175
-'...'=176
-'null'=177
-'nullref'=178
-'.hash'=179
-'string'=181
-'bool'=182
-'int8'=183
-'int16'=184
-'int32'=185
-'int64'=186
-'float32'=187
-'float64'=188
-'uint8'=189
-'uint16'=190
-'uint32'=191
-'uint64'=192
-'int'=193
-'uint'=194
-'type'=195
-'object'=196
-'.module'=197
-'value'=198
-'valuetype'=199
-'void'=200
-'enum'=201
-'custom'=202
-'fixed'=203
-'systring'=204
-'array'=205
-'variant'=206
-'currency'=207
-'syschar'=208
-'error'=209
-'decimal'=210
-'date'=211
-'bstr'=212
-'lpstr'=213
-'lpwstr'=214
-'lptstr'=215
-'objectref'=216
-'iunknown'=217
-'idispatch'=218
-'struct'=219
-'interface'=220
-'safearray'=221
-'byvalstr'=222
-'ansi'=223
-'tbstr'=224
-'method'=225
-'any'=226
-'lpstruct'=227
-'vector'=228
-'hresult'=229
-'carray'=230
-'userdefined'=231
-'record'=232
-'filetime'=233
-'blob'=234
-'stream'=235
-'storage'=236
-'streamed_object'=237
-'stored_object'=238
-'blob_object'=239
-'cf'=240
-'clsid'=241
-'instance'=242
-'explicit'=243
-'default'=244
-'vararg'=245
-'unmanaged'=246
-'cdecl'=247
-'stdcall'=248
-'thiscall'=249
-'fastcall'=250
-'!'=251
-'.param'=254
-'constraint'=255
-'.this'=256
-'.base'=257
-'.nester'=258
-'&'=259
-'*'=261
-'.'=264
-'+'=265
-'#define'=266
-'#undef'=267
-'#ifdef'=268
-'#ifndef'=269
-'#else'=270
-'#endif'=271
-'#include'=272
-'.mresource'=273
-'ldc.i8'=277
-'calli'=280
-'switch'=282
-'ldstr'=284
-'ldtoken'=286
-'.permission'=293
-'.permissionset'=294
-'.emitbyte'=295
-'.maxstack'=296
-'.entrypoint'=297
-'.zeroinit'=298
-'.locals'=299
-'.export'=300
-'.override'=301
-'.vtentry'=302
+'.publickey'=167
+'.publicKey'=168
+'.ver'=169
+'.locale'=170
+'.publickeytoken'=171
+'forwarder'=172
+'::'=176
+'...'=177
+'null'=178
+'nullref'=179
+'.hash'=180
+'string'=182
+'bool'=183
+'int8'=184
+'int16'=185
+'int32'=186
+'int64'=187
+'float32'=188
+'float64'=189
+'uint8'=190
+'uint16'=191
+'uint32'=192
+'uint64'=193
+'int'=194
+'uint'=195
+'type'=196
+'object'=197
+'.module'=198
+'value'=199
+'valuetype'=200
+'void'=201
+'enum'=202
+'custom'=203
+'fixed'=204
+'sysstring'=205
+'array'=206
+'variant'=207
+'currency'=208
+'syschar'=209
+'error'=210
+'decimal'=211
+'date'=212
+'bstr'=213
+'lpstr'=214
+'lpwstr'=215
+'lptstr'=216
+'objectref'=217
+'iunknown'=218
+'idispatch'=219
+'struct'=220
+'interface'=221
+'safearray'=222
+'byvalstr'=223
+'ansi'=224
+'tbstr'=225
+'method'=226
+'any'=227
+'lpstruct'=228
+'vector'=229
+'hresult'=230
+'carray'=231
+'userdefined'=232
+'record'=233
+'filetime'=234
+'blob'=235
+'stream'=236
+'storage'=237
+'streamed_object'=238
+'stored_object'=239
+'blob_object'=240
+'cf'=241
+'clsid'=242
+'instance'=243
+'explicit'=244
+'default'=245
+'vararg'=246
+'unmanaged'=247
+'cdecl'=248
+'stdcall'=249
+'thiscall'=250
+'fastcall'=251
+'!'=252
+'.param'=255
+'constraint'=256
+'.this'=257
+'.base'=258
+'.nester'=259
+'&'=260
+'*'=262
+'.'=265
+'+'=266
+'#define'=267
+'#undef'=268
+'#ifdef'=269
+'#ifndef'=270
+'#else'=271
+'#endif'=272
+'#include'=273
+'.mresource'=274
+'ldc.i8'=278
+'calli'=281
+'switch'=283
+'ldstr'=285
+'ldtoken'=287
+'.permission'=294
+'.permissionset'=295
+'.emitbyte'=296
+'.maxstack'=297
+'.entrypoint'=298
+'.zeroinit'=299
+'.locals'=300
+'.export'=301
+'.override'=302
+'.vtentry'=303
diff --git a/src/tools/ilasm/src/ILAssembler/gen/CILLexer.cs b/src/tools/ilasm/src/ILAssembler/gen/CILLexer.cs
index e95b0b0a47d582..4724e645b32061 100644
--- a/src/tools/ilasm/src/ILAssembler/gen/CILLexer.cs
+++ b/src/tools/ilasm/src/ILAssembler/gen/CILLexer.cs
@@ -59,30 +59,30 @@ public const int
T__149=150, T__150=151, T__151=152, T__152=153, T__153=154, T__154=155,
T__155=156, T__156=157, T__157=158, T__158=159, T__159=160, T__160=161,
T__161=162, T__162=163, T__163=164, T__164=165, T__165=166, T__166=167,
- T__167=168, T__168=169, T__169=170, T__170=171, INT32=172, INT64=173,
- FLOAT64=174, DCOLON=175, ELLIPSIS=176, NULL=177, NULLREF=178, HASH=179,
- CHAR=180, STRING=181, BOOL=182, INT8=183, INT16=184, INT32_=185, INT64_=186,
- FLOAT32=187, FLOAT64_=188, UINT8=189, UINT16=190, UINT32=191, UINT64=192,
- INT=193, UINT=194, TYPE=195, OBJECT=196, MODULE=197, VALUE=198, VALUETYPE=199,
- VOID=200, ENUM=201, CUSTOM=202, FIXED=203, SYSSTRING=204, ARRAY=205, VARIANT=206,
- CURRENCY=207, SYSCHAR=208, ERROR=209, DECIMAL=210, DATE=211, BSTR=212,
- LPSTR=213, LPWSTR=214, LPTSTR=215, OBJECTREF=216, IUNKNOWN=217, IDISPATCH=218,
- STRUCT=219, INTERFACE=220, SAFEARRAY=221, BYVALSTR=222, ANSI=223, TBSTR=224,
- METHOD=225, ANY=226, LPSTRUCT=227, VECTOR=228, HRESULT=229, CARRAY=230,
- USERDEFINED=231, RECORD=232, FILETIME=233, BLOB=234, STREAM=235, STORAGE=236,
- STREAMED_OBJECT=237, STORED_OBJECT=238, BLOB_OBJECT=239, CF=240, CLSID=241,
- INSTANCE=242, EXPLICIT=243, DEFAULT=244, VARARG=245, UNMANAGED=246, CDECL=247,
- STDCALL=248, THISCALL=249, FASTCALL=250, TYPE_PARAMETER=251, METHOD_TYPE_PARAMETER=252,
- TYPEDREF=253, PARAM=254, CONSTRAINT=255, THIS=256, BASE=257, NESTER=258,
- REF=259, ARRAY_TYPE_NO_BOUNDS=260, PTR=261, QSTRING=262, SQSTRING=263,
- DOT=264, PLUS=265, PP_DEFINE=266, PP_UNDEF=267, PP_IFDEF=268, PP_IFNDEF=269,
- PP_ELSE=270, PP_ENDIF=271, PP_INCLUDE=272, MRESOURCE=273, INSTR_NONE=274,
- INSTR_VAR=275, INSTR_I=276, INSTR_I8=277, INSTR_R=278, INSTR_METHOD=279,
- INSTR_SIG=280, INSTR_BRTARGET=281, INSTR_SWITCH=282, INSTR_TYPE=283, INSTR_STRING=284,
- INSTR_FIELD=285, INSTR_TOK=286, DOTTEDNAME=287, ID=288, HEXBYTE=289, WS=290,
- SINGLE_LINE_COMMENT=291, COMMENT=292, PERMISSION=293, PERMISSIONSET=294,
- EMITBYTE=295, MAXSTACK=296, ENTRYPOINT=297, ZEROINIT=298, LOCALS=299,
- EXPORT=300, OVERRIDE=301, VTENTRY=302;
+ T__167=168, T__168=169, T__169=170, T__170=171, T__171=172, INT32=173,
+ INT64=174, FLOAT64=175, DCOLON=176, ELLIPSIS=177, NULL=178, NULLREF=179,
+ HASH=180, CHAR=181, STRING=182, BOOL=183, INT8=184, INT16=185, INT32_=186,
+ INT64_=187, FLOAT32=188, FLOAT64_=189, UINT8=190, UINT16=191, UINT32=192,
+ UINT64=193, INT=194, UINT=195, TYPE=196, OBJECT=197, MODULE=198, VALUE=199,
+ VALUETYPE=200, VOID=201, ENUM=202, CUSTOM=203, FIXED=204, SYSSTRING=205,
+ ARRAY=206, VARIANT=207, CURRENCY=208, SYSCHAR=209, ERROR=210, DECIMAL=211,
+ DATE=212, BSTR=213, LPSTR=214, LPWSTR=215, LPTSTR=216, OBJECTREF=217,
+ IUNKNOWN=218, IDISPATCH=219, STRUCT=220, INTERFACE=221, SAFEARRAY=222,
+ BYVALSTR=223, ANSI=224, TBSTR=225, METHOD=226, ANY=227, LPSTRUCT=228,
+ VECTOR=229, HRESULT=230, CARRAY=231, USERDEFINED=232, RECORD=233, FILETIME=234,
+ BLOB=235, STREAM=236, STORAGE=237, STREAMED_OBJECT=238, STORED_OBJECT=239,
+ BLOB_OBJECT=240, CF=241, CLSID=242, INSTANCE=243, EXPLICIT=244, DEFAULT=245,
+ VARARG=246, UNMANAGED=247, CDECL=248, STDCALL=249, THISCALL=250, FASTCALL=251,
+ TYPE_PARAMETER=252, METHOD_TYPE_PARAMETER=253, TYPEDREF=254, PARAM=255,
+ CONSTRAINT=256, THIS=257, BASE=258, NESTER=259, REF=260, ARRAY_TYPE_NO_BOUNDS=261,
+ PTR=262, QSTRING=263, SQSTRING=264, DOT=265, PLUS=266, PP_DEFINE=267,
+ PP_UNDEF=268, PP_IFDEF=269, PP_IFNDEF=270, PP_ELSE=271, PP_ENDIF=272,
+ PP_INCLUDE=273, MRESOURCE=274, INSTR_NONE=275, INSTR_VAR=276, INSTR_I=277,
+ INSTR_I8=278, INSTR_R=279, INSTR_METHOD=280, INSTR_SIG=281, INSTR_BRTARGET=282,
+ INSTR_SWITCH=283, INSTR_TYPE=284, INSTR_STRING=285, INSTR_FIELD=286, INSTR_TOK=287,
+ DOTTEDNAME=288, ID=289, HEXBYTE=290, WS=291, SINGLE_LINE_COMMENT=292,
+ COMMENT=293, PERMISSION=294, PERMISSIONSET=295, EMITBYTE=296, MAXSTACK=297,
+ ENTRYPOINT=298, ZEROINIT=299, LOCALS=300, EXPORT=301, OVERRIDE=302, VTENTRY=303;
public static string[] channelNames = {
"DEFAULT_TOKEN_CHANNEL", "HIDDEN"
};
@@ -114,27 +114,27 @@ public const int
"T__147", "T__148", "T__149", "T__150", "T__151", "T__152", "T__153",
"T__154", "T__155", "T__156", "T__157", "T__158", "T__159", "T__160",
"T__161", "T__162", "T__163", "T__164", "T__165", "T__166", "T__167",
- "T__168", "T__169", "T__170", "INT32", "INT64", "FLOAT64", "DCOLON", "ELLIPSIS",
- "NULL", "NULLREF", "HASH", "CHAR", "STRING", "BOOL", "INT8", "INT16",
- "INT32_", "INT64_", "FLOAT32", "FLOAT64_", "UNSIGNED", "UINT8", "UINT16",
- "UINT32", "UINT64", "INT", "UINT", "TYPE", "OBJECT", "MODULE", "VALUE",
- "VALUETYPE", "VOID", "ENUM", "CUSTOM", "FIXED", "SYSSTRING", "ARRAY",
- "VARIANT", "CURRENCY", "SYSCHAR", "ERROR", "DECIMAL", "DATE", "BSTR",
- "LPSTR", "LPWSTR", "LPTSTR", "OBJECTREF", "IUNKNOWN", "IDISPATCH", "STRUCT",
- "INTERFACE", "SAFEARRAY", "BYVALSTR", "ANSI", "TBSTR", "METHOD", "ANY",
- "LPSTRUCT", "VECTOR", "HRESULT", "CARRAY", "USERDEFINED", "RECORD", "FILETIME",
- "BLOB", "STREAM", "STORAGE", "STREAMED_OBJECT", "STORED_OBJECT", "BLOB_OBJECT",
- "CF", "CLSID", "INSTANCE", "EXPLICIT", "DEFAULT", "VARARG", "UNMANAGED",
- "CDECL", "STDCALL", "THISCALL", "FASTCALL", "TYPE_PARAMETER", "METHOD_TYPE_PARAMETER",
- "TYPEDREF", "PARAM", "CONSTRAINT", "THIS", "BASE", "NESTER", "REF", "ARRAY_TYPE_NO_BOUNDS",
- "PTR", "ESC_SEQ", "QSTRING", "SQSTRING", "DOT", "PLUS", "PP_DEFINE", "PP_UNDEF",
- "PP_IFDEF", "PP_IFNDEF", "PP_ELSE", "PP_ENDIF", "PP_INCLUDE", "MRESOURCE",
- "INSTR_NONE", "INSTR_VAR", "INSTR_I", "INSTR_I8", "INSTR_R", "INSTR_METHOD",
- "INSTR_SIG", "INSTR_BRTARGET", "INSTR_SWITCH", "INSTR_TYPE", "INSTR_STRING",
- "INSTR_FIELD", "INSTR_TOK", "IDSTART", "IDCONT", "DOTTEDNAME", "ID", "HEXBYTE",
- "WS", "SINGLE_LINE_COMMENT", "COMMENT", "PERMISSION", "PERMISSIONSET",
- "EMITBYTE", "MAXSTACK", "ENTRYPOINT", "ZEROINIT", "LOCALS", "EXPORT",
- "OVERRIDE", "VTENTRY"
+ "T__168", "T__169", "T__170", "T__171", "INT32", "INT64", "FLOAT64", "DCOLON",
+ "ELLIPSIS", "NULL", "NULLREF", "HASH", "CHAR", "STRING", "BOOL", "INT8",
+ "INT16", "INT32_", "INT64_", "FLOAT32", "FLOAT64_", "UNSIGNED", "UINT8",
+ "UINT16", "UINT32", "UINT64", "INT", "UINT", "TYPE", "OBJECT", "MODULE",
+ "VALUE", "VALUETYPE", "VOID", "ENUM", "CUSTOM", "FIXED", "SYSSTRING",
+ "ARRAY", "VARIANT", "CURRENCY", "SYSCHAR", "ERROR", "DECIMAL", "DATE",
+ "BSTR", "LPSTR", "LPWSTR", "LPTSTR", "OBJECTREF", "IUNKNOWN", "IDISPATCH",
+ "STRUCT", "INTERFACE", "SAFEARRAY", "BYVALSTR", "ANSI", "TBSTR", "METHOD",
+ "ANY", "LPSTRUCT", "VECTOR", "HRESULT", "CARRAY", "USERDEFINED", "RECORD",
+ "FILETIME", "BLOB", "STREAM", "STORAGE", "STREAMED_OBJECT", "STORED_OBJECT",
+ "BLOB_OBJECT", "CF", "CLSID", "INSTANCE", "EXPLICIT", "DEFAULT", "VARARG",
+ "UNMANAGED", "CDECL", "STDCALL", "THISCALL", "FASTCALL", "TYPE_PARAMETER",
+ "METHOD_TYPE_PARAMETER", "TYPEDREF", "PARAM", "CONSTRAINT", "THIS", "BASE",
+ "NESTER", "REF", "ARRAY_TYPE_NO_BOUNDS", "PTR", "ESC_SEQ", "QSTRING",
+ "SQSTRING", "DOT", "PLUS", "PP_DEFINE", "PP_UNDEF", "PP_IFDEF", "PP_IFNDEF",
+ "PP_ELSE", "PP_ENDIF", "PP_INCLUDE", "MRESOURCE", "INSTR_NONE", "INSTR_VAR",
+ "INSTR_I", "INSTR_I8", "INSTR_R", "INSTR_METHOD", "INSTR_SIG", "INSTR_BRTARGET",
+ "INSTR_SWITCH", "INSTR_TYPE", "INSTR_STRING", "INSTR_FIELD", "INSTR_TOK",
+ "IDSTART", "IDCONT", "DOTTEDNAME", "ID", "HEXBYTE", "WS", "SINGLE_LINE_COMMENT",
+ "COMMENT", "PERMISSION", "PERMISSIONSET", "EMITBYTE", "MAXSTACK", "ENTRYPOINT",
+ "ZEROINIT", "LOCALS", "EXPORT", "OVERRIDE", "VTENTRY"
};
@@ -151,53 +151,53 @@ public CILLexer(ICharStream input, TextWriter output, TextWriter errorOutput)
null, "'native'", "'cil'", "'optil'", "'managed'", "'forwardref'", "'preservesig'",
"'runtime'", "'internalcall'", "'synchronized'", "'noinlining'", "'aggressiveinlining'",
"'nooptimization'", "'aggressiveoptimization'", "'async'", "'extended'",
- "'{'", "'}'", "'.subsystem'", "'.corflags'", "'.file'", "'alignment'",
- "'.imagebase'", "'.stackreserve'", "'.assembly'", "'.mscorlib'", "'.language'",
- "','", "'.typelist'", "'('", "')'", "';'", "'.typedef'", "'as'", "'.custom'",
- "'='", "'field'", "'property'", "'class'", "'extern'", "'.vtfixup'", "'['",
- "']'", "'at'", "'fromunmanaged'", "'callmostderived'", "'retainappdomain'",
- "'.vtable'", "'.namespace'", "'.class'", "'public'", "'private'", "'sealed'",
- "'abstract'", "'auto'", "'sequential'", "'unicode'", "'autochar'", "'import'",
- "'serializable'", "'windowsruntime'", "'nested'", "'family'", "'assembly'",
- "'famandassem'", "'famorassem'", "'beforefieldinit'", "'specialname'",
- "'rtspecialname'", "'flags'", "'extends'", "'implements'", "'.line'",
- "'#line'", "':'", "'nometadata'", "'retargetable'", "'noplatform'", "'legacy library'",
- "'x86'", "'amd64'", "'arm'", "'arm64'", "'bytearray'", "'()'", "'<'",
- "'>'", "'/'", "'algorithm'", "'iidparam'", "'pinned'", "'modreq'", "'modopt'",
- "'unsigned'", "'true'", "'false'", "'request'", "'demand'", "'assert'",
- "'deny'", "'permitonly'", "'linkcheck'", "'inheritcheck'", "'reqmin'",
- "'reqopt'", "'reqrefuse'", "'prejitgrant'", "'prejitdeny'", "'noncasdemand'",
- "'noncaslinkdemand'", "'noncasinheritance'", "'callconv'", "'mdtoken'",
- "'-'", "'byreflike'", "'.ctor'", "'.size'", "'.pack'", "'with'", "'.interfaceimpl'",
- "'.field'", "'marshal'", "'static'", "'initonly'", "'privatescope'", "'literal'",
- "'notserialized'", "'volatile'", "'.event'", "'.addon'", "'.removeon'",
- "'.fire'", "'.other'", "'.property'", "'.set'", "'.get'", "'in'", "'out'",
- "'opt'", "'.method'", "'final'", "'virtual'", "'strict'", "'hidebysig'",
- "'newslot'", "'unmanagedexp'", "'reqsecobj'", "'pinvokeimpl'", "'nomangle'",
- "'lasterr'", "'winapi'", "'bestfit'", "'on'", "'off'", "'charmaperror'",
+ "'volatile'", "'{'", "'}'", "'.subsystem'", "'.corflags'", "'.file'",
+ "'alignment'", "'.imagebase'", "'.stackreserve'", "'.assembly'", "'.mscorlib'",
+ "'.language'", "','", "'.typelist'", "'('", "')'", "';'", "'.typedef'",
+ "'as'", "'.custom'", "'='", "'field'", "'property'", "'class'", "'extern'",
+ "'.vtfixup'", "'['", "']'", "'at'", "'fromunmanaged'", "'callmostderived'",
+ "'retainappdomain'", "'.vtable'", "'.namespace'", "'.class'", "'public'",
+ "'private'", "'sealed'", "'abstract'", "'auto'", "'sequential'", "'unicode'",
+ "'autochar'", "'import'", "'serializable'", "'windowsruntime'", "'nested'",
+ "'family'", "'assembly'", "'famandassem'", "'famorassem'", "'beforefieldinit'",
+ "'specialname'", "'rtspecialname'", "'flags'", "'extends'", "'implements'",
+ "'.line'", "'#line'", "':'", "'nometadata'", "'retargetable'", "'noplatform'",
+ "'legacy library'", "'x86'", "'amd64'", "'arm'", "'arm64'", "'bytearray'",
+ "'()'", "'<'", "'>'", "'/'", "'algorithm'", "'unsigned'", "'iidparam'",
+ "'pinned'", "'modreq'", "'modopt'", "'true'", "'false'", "'request'",
+ "'demand'", "'assert'", "'deny'", "'permitonly'", "'linkcheck'", "'inheritcheck'",
+ "'reqmin'", "'reqopt'", "'reqrefuse'", "'prejitgrant'", "'prejitdeny'",
+ "'noncasdemand'", "'noncaslinkdemand'", "'noncasinheritance'", "'callconv'",
+ "'mdtoken'", "'-'", "'byreflike'", "'.ctor'", "'.size'", "'.pack'", "'with'",
+ "'.interfaceimpl'", "'.field'", "'marshal'", "'static'", "'initonly'",
+ "'privatescope'", "'literal'", "'notserialized'", "'.event'", "'.addon'",
+ "'.removeon'", "'.fire'", "'.other'", "'.property'", "'.set'", "'.get'",
+ "'in'", "'out'", "'opt'", "'.method'", "'final'", "'virtual'", "'strict'",
+ "'hidebysig'", "'newslot'", "'unmanagedexp'", "'reqsecobj'", "'pinvokeimpl'",
+ "'nomangle'", "'lasterr'", "'winapi'", "'bestfit'", "'on'", "'off'", "'charmaperror'",
"'.cctor'", "'il'", "'init'", "'.try'", "'to'", "'filter'", "'catch'",
- "'finally'", "'fault'", "'handler'", "'.data'", "'tls'", "'.publicKey'",
- "'.ver'", "'.locale'", "'.publickeytoken'", "'forwarder'", null, null,
- null, "'::'", "'...'", "'null'", "'nullref'", "'.hash'", null, "'string'",
- "'bool'", "'int8'", "'int16'", "'int32'", "'int64'", "'float32'", "'float64'",
- "'uint8'", "'uint16'", "'uint32'", "'uint64'", "'int'", "'uint'", "'type'",
- "'object'", "'.module'", "'value'", "'valuetype'", "'void'", "'enum'",
- "'custom'", "'fixed'", "'systring'", "'array'", "'variant'", "'currency'",
- "'syschar'", "'error'", "'decimal'", "'date'", "'bstr'", "'lpstr'", "'lpwstr'",
- "'lptstr'", "'objectref'", "'iunknown'", "'idispatch'", "'struct'", "'interface'",
- "'safearray'", "'byvalstr'", "'ansi'", "'tbstr'", "'method'", "'any'",
- "'lpstruct'", "'vector'", "'hresult'", "'carray'", "'userdefined'", "'record'",
- "'filetime'", "'blob'", "'stream'", "'storage'", "'streamed_object'",
- "'stored_object'", "'blob_object'", "'cf'", "'clsid'", "'instance'", "'explicit'",
- "'default'", "'vararg'", "'unmanaged'", "'cdecl'", "'stdcall'", "'thiscall'",
- "'fastcall'", "'!'", null, null, "'.param'", "'constraint'", "'.this'",
- "'.base'", "'.nester'", "'&'", null, "'*'", null, null, "'.'", "'+'",
- "'#define'", "'#undef'", "'#ifdef'", "'#ifndef'", "'#else'", "'#endif'",
- "'#include'", "'.mresource'", null, null, null, "'ldc.i8'", null, null,
- "'calli'", null, "'switch'", null, "'ldstr'", null, "'ldtoken'", null,
- null, null, null, null, null, "'.permission'", "'.permissionset'", "'.emitbyte'",
- "'.maxstack'", "'.entrypoint'", "'.zeroinit'", "'.locals'", "'.export'",
- "'.override'", "'.vtentry'"
+ "'finally'", "'fault'", "'handler'", "'.data'", "'tls'", "'.publickey'",
+ "'.publicKey'", "'.ver'", "'.locale'", "'.publickeytoken'", "'forwarder'",
+ null, null, null, "'::'", "'...'", "'null'", "'nullref'", "'.hash'", null,
+ "'string'", "'bool'", "'int8'", "'int16'", "'int32'", "'int64'", "'float32'",
+ "'float64'", "'uint8'", "'uint16'", "'uint32'", "'uint64'", "'int'", "'uint'",
+ "'type'", "'object'", "'.module'", "'value'", "'valuetype'", "'void'",
+ "'enum'", "'custom'", "'fixed'", "'sysstring'", "'array'", "'variant'",
+ "'currency'", "'syschar'", "'error'", "'decimal'", "'date'", "'bstr'",
+ "'lpstr'", "'lpwstr'", "'lptstr'", "'objectref'", "'iunknown'", "'idispatch'",
+ "'struct'", "'interface'", "'safearray'", "'byvalstr'", "'ansi'", "'tbstr'",
+ "'method'", "'any'", "'lpstruct'", "'vector'", "'hresult'", "'carray'",
+ "'userdefined'", "'record'", "'filetime'", "'blob'", "'stream'", "'storage'",
+ "'streamed_object'", "'stored_object'", "'blob_object'", "'cf'", "'clsid'",
+ "'instance'", "'explicit'", "'default'", "'vararg'", "'unmanaged'", "'cdecl'",
+ "'stdcall'", "'thiscall'", "'fastcall'", "'!'", null, null, "'.param'",
+ "'constraint'", "'.this'", "'.base'", "'.nester'", "'&'", null, "'*'",
+ null, null, "'.'", "'+'", "'#define'", "'#undef'", "'#ifdef'", "'#ifndef'",
+ "'#else'", "'#endif'", "'#include'", "'.mresource'", null, null, null,
+ "'ldc.i8'", null, null, "'calli'", null, "'switch'", null, "'ldstr'",
+ null, "'ldtoken'", null, null, null, null, null, null, "'.permission'",
+ "'.permissionset'", "'.emitbyte'", "'.maxstack'", "'.entrypoint'", "'.zeroinit'",
+ "'.locals'", "'.export'", "'.override'", "'.vtentry'"
};
private static readonly string[] _SymbolicNames = {
null, null, null, null, null, null, null, null, null, null, null, null,
@@ -214,7 +214,7 @@ public CILLexer(ICharStream input, TextWriter output, TextWriter errorOutput)
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, "INT32", "INT64", "FLOAT64", "DCOLON", "ELLIPSIS",
+ null, null, null, null, null, "INT32", "INT64", "FLOAT64", "DCOLON", "ELLIPSIS",
"NULL", "NULLREF", "HASH", "CHAR", "STRING", "BOOL", "INT8", "INT16",
"INT32_", "INT64_", "FLOAT32", "FLOAT64_", "UINT8", "UINT16", "UINT32",
"UINT64", "INT", "UINT", "TYPE", "OBJECT", "MODULE", "VALUE", "VALUETYPE",
@@ -263,7 +263,7 @@ static CILLexer() {
}
}
private static int[] _serializedATN = {
- 4,0,302,4695,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,
+ 4,0,303,4715,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,
7,6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,2,
14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7,19,2,20,7,20,2,
21,7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2,26,7,26,2,27,7,27,2,
@@ -311,1678 +311,1685 @@ static CILLexer() {
7,284,2,285,7,285,2,286,7,286,2,287,7,287,2,288,7,288,2,289,7,289,2,290,
7,290,2,291,7,291,2,292,7,292,2,293,7,293,2,294,7,294,2,295,7,295,2,296,
7,296,2,297,7,297,2,298,7,298,2,299,7,299,2,300,7,300,2,301,7,301,2,302,
- 7,302,2,303,7,303,2,304,7,304,2,305,7,305,1,0,1,0,1,0,1,0,1,0,1,0,1,0,
- 1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,
- 3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5,1,5,
- 1,5,1,5,1,5,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,
- 7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,
- 1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,10,1,
- 10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,
- 10,1,10,1,10,1,10,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,
- 11,1,11,1,11,1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,
- 12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,
- 13,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,
- 14,1,15,1,15,1,16,1,16,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,
- 17,1,17,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,19,1,19,1,
- 19,1,19,1,19,1,19,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,
- 21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,22,1,22,1,22,1,
- 22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,23,1,23,1,23,1,
- 23,1,23,1,23,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,
- 24,1,24,1,24,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,26,1,
- 26,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,28,1,28,1,29,1,
- 29,1,30,1,30,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,32,1,32,1,
- 32,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,34,1,34,1,35,1,35,1,35,1,
- 35,1,35,1,35,1,36,1,36,1,36,1,36,1,36,1,36,1,36,1,36,1,36,1,37,1,37,1,
- 37,1,37,1,37,1,37,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,39,1,39,1,39,1,
- 39,1,39,1,39,1,39,1,39,1,39,1,40,1,40,1,41,1,41,1,42,1,42,1,42,1,43,1,
- 43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,44,1,
- 44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,
- 44,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,
- 45,1,45,1,45,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,47,1,47,1,47,1,
- 47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,48,1,48,1,48,1,48,1,48,1,48,1,
- 48,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,50,1,50,1,50,1,50,1,50,1,50,1,
- 50,1,50,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,52,1,52,1,52,1,52,1,52,1,
- 52,1,52,1,52,1,52,1,53,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,54,1,
- 54,1,54,1,54,1,54,1,54,1,54,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,
- 56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,57,1,57,1,57,1,57,1,57,1,
- 57,1,57,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,
- 58,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,
- 59,1,59,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,61,1,61,1,61,1,61,1,61,1,
- 61,1,61,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,63,1,63,1,63,1,
- 63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,64,1,64,1,64,1,64,1,64,1,
- 64,1,64,1,64,1,64,1,64,1,64,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,
- 65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,66,1,66,1,66,1,66,1,66,1,66,1,
- 66,1,66,1,66,1,66,1,66,1,66,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,
- 67,1,67,1,67,1,67,1,67,1,67,1,68,1,68,1,68,1,68,1,68,1,68,1,69,1,69,1,
- 69,1,69,1,69,1,69,1,69,1,69,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,
- 70,1,70,1,70,1,71,1,71,1,71,1,71,1,71,1,71,1,72,1,72,1,72,1,72,1,72,1,
- 72,1,73,1,73,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,
- 75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,76,1,
- 76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,77,1,77,1,77,1,77,1,
- 77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,78,1,78,1,78,1,
- 78,1,79,1,79,1,79,1,79,1,79,1,79,1,80,1,80,1,80,1,80,1,81,1,81,1,81,1,
- 81,1,81,1,81,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,83,1,
- 83,1,83,1,84,1,84,1,85,1,85,1,86,1,86,1,87,1,87,1,87,1,87,1,87,1,87,1,
- 87,1,87,1,87,1,87,1,88,1,88,1,88,1,88,1,88,1,88,1,88,1,88,1,88,1,89,1,
- 89,1,89,1,89,1,89,1,89,1,89,1,90,1,90,1,90,1,90,1,90,1,90,1,90,1,91,1,
- 91,1,91,1,91,1,91,1,91,1,91,1,92,1,92,1,92,1,92,1,92,1,92,1,92,1,92,1,
- 92,1,93,1,93,1,93,1,93,1,93,1,94,1,94,1,94,1,94,1,94,1,94,1,95,1,95,1,
- 95,1,95,1,95,1,95,1,95,1,95,1,96,1,96,1,96,1,96,1,96,1,96,1,96,1,97,1,
- 97,1,97,1,97,1,97,1,97,1,97,1,98,1,98,1,98,1,98,1,98,1,99,1,99,1,99,1,
- 99,1,99,1,99,1,99,1,99,1,99,1,99,1,99,1,100,1,100,1,100,1,100,1,100,1,
- 100,1,100,1,100,1,100,1,100,1,101,1,101,1,101,1,101,1,101,1,101,1,101,
- 1,101,1,101,1,101,1,101,1,101,1,101,1,102,1,102,1,102,1,102,1,102,1,102,
- 1,102,1,103,1,103,1,103,1,103,1,103,1,103,1,103,1,104,1,104,1,104,1,104,
- 1,104,1,104,1,104,1,104,1,104,1,104,1,105,1,105,1,105,1,105,1,105,1,105,
- 1,105,1,105,1,105,1,105,1,105,1,105,1,106,1,106,1,106,1,106,1,106,1,106,
+ 7,302,2,303,7,303,2,304,7,304,2,305,7,305,2,306,7,306,1,0,1,0,1,0,1,0,
+ 1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,
+ 3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,5,1,5,1,5,
+ 1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,
+ 7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,
+ 1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,
+ 9,1,9,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,
+ 1,10,1,10,1,10,1,10,1,10,1,10,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,
+ 1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,12,1,12,
+ 1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,
+ 1,12,1,12,1,13,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,14,
+ 1,14,1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,16,1,16,
+ 1,17,1,17,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,19,
+ 1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1,20,1,20,
+ 1,20,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,22,1,22,1,22,
+ 1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,23,1,23,1,23,1,23,1,23,1,23,
+ 1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,24,1,24,1,24,
+ 1,24,1,24,1,24,1,24,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,
+ 1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,27,1,27,1,28,1,28,
+ 1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,29,1,29,1,30,1,30,1,31,1,31,
+ 1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,33,1,33,1,33,1,34,1,34,
+ 1,34,1,34,1,34,1,34,1,34,1,34,1,35,1,35,1,36,1,36,1,36,1,36,1,36,1,36,
+ 1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,38,1,38,1,38,1,38,1,38,
+ 1,38,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,40,1,40,1,40,
+ 1,40,1,40,1,40,1,41,1,41,1,42,1,42,1,43,1,43,1,43,1,44,1,44,1,44,1,44,
+ 1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,45,1,45,1,45,1,45,
+ 1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,46,1,46,
+ 1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,
+ 1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,48,1,48,1,48,1,48,1,48,1,48,
+ 1,48,1,48,1,48,1,48,1,48,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,50,1,50,
+ 1,50,1,50,1,50,1,50,1,50,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,52,
+ 1,52,1,52,1,52,1,52,1,52,1,52,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,
+ 1,53,1,54,1,54,1,54,1,54,1,54,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,
+ 1,55,1,55,1,55,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,57,1,57,1,57,
+ 1,57,1,57,1,57,1,57,1,57,1,57,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,59,
+ 1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,60,1,60,
+ 1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,61,
+ 1,61,1,61,1,61,1,61,1,61,1,61,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,63,
+ 1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,64,1,64,1,64,1,64,1,64,1,64,
+ 1,64,1,64,1,64,1,64,1,64,1,64,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,
+ 1,65,1,65,1,65,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,
+ 1,66,1,66,1,66,1,66,1,66,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,
+ 1,67,1,67,1,67,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,
+ 1,68,1,68,1,68,1,69,1,69,1,69,1,69,1,69,1,69,1,70,1,70,1,70,1,70,1,70,
+ 1,70,1,70,1,70,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,
+ 1,72,1,72,1,72,1,72,1,72,1,72,1,73,1,73,1,73,1,73,1,73,1,73,1,74,1,74,
+ 1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,76,1,76,1,76,
+ 1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,77,1,77,1,77,1,77,
+ 1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,78,1,78,1,78,1,78,1,78,1,78,1,78,
+ 1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,79,1,79,1,79,1,79,1,80,1,80,
+ 1,80,1,80,1,80,1,80,1,81,1,81,1,81,1,81,1,82,1,82,1,82,1,82,1,82,1,82,
+ 1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,84,1,84,1,84,1,85,
+ 1,85,1,86,1,86,1,87,1,87,1,88,1,88,1,88,1,88,1,88,1,88,1,88,1,88,1,88,
+ 1,88,1,89,1,89,1,89,1,89,1,89,1,89,1,89,1,89,1,89,1,90,1,90,1,90,1,90,
+ 1,90,1,90,1,90,1,90,1,90,1,91,1,91,1,91,1,91,1,91,1,91,1,91,1,92,1,92,
+ 1,92,1,92,1,92,1,92,1,92,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,94,1,94,
+ 1,94,1,94,1,94,1,95,1,95,1,95,1,95,1,95,1,95,1,96,1,96,1,96,1,96,1,96,
+ 1,96,1,96,1,96,1,97,1,97,1,97,1,97,1,97,1,97,1,97,1,98,1,98,1,98,1,98,
+ 1,98,1,98,1,98,1,99,1,99,1,99,1,99,1,99,1,100,1,100,1,100,1,100,1,100,
+ 1,100,1,100,1,100,1,100,1,100,1,100,1,101,1,101,1,101,1,101,1,101,1,101,
+ 1,101,1,101,1,101,1,101,1,102,1,102,1,102,1,102,1,102,1,102,1,102,1,102,
+ 1,102,1,102,1,102,1,102,1,102,1,103,1,103,1,103,1,103,1,103,1,103,1,103,
+ 1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,105,1,105,1,105,1,105,1,105,
+ 1,105,1,105,1,105,1,105,1,105,1,106,1,106,1,106,1,106,1,106,1,106,1,106,
1,106,1,106,1,106,1,106,1,106,1,107,1,107,1,107,1,107,1,107,1,107,1,107,
- 1,107,1,107,1,107,1,107,1,107,1,107,1,108,1,108,1,108,1,108,1,108,1,108,
- 1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,109,
- 1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,
- 1,109,1,109,1,109,1,109,1,109,1,110,1,110,1,110,1,110,1,110,1,110,1,110,
- 1,110,1,110,1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,112,1,112,
- 1,113,1,113,1,113,1,113,1,113,1,113,1,113,1,113,1,113,1,113,1,114,1,114,
- 1,114,1,114,1,114,1,114,1,115,1,115,1,115,1,115,1,115,1,115,1,116,1,116,
- 1,116,1,116,1,116,1,116,1,117,1,117,1,117,1,117,1,117,1,118,1,118,1,118,
- 1,118,1,118,1,118,1,118,1,118,1,118,1,118,1,118,1,118,1,118,1,118,1,118,
- 1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,120,1,120,1,120,1,120,1,120,
- 1,120,1,120,1,120,1,121,1,121,1,121,1,121,1,121,1,121,1,121,1,122,1,122,
- 1,122,1,122,1,122,1,122,1,122,1,122,1,122,1,123,1,123,1,123,1,123,1,123,
- 1,123,1,123,1,123,1,123,1,123,1,123,1,123,1,123,1,124,1,124,1,124,1,124,
- 1,124,1,124,1,124,1,124,1,125,1,125,1,125,1,125,1,125,1,125,1,125,1,125,
- 1,125,1,125,1,125,1,125,1,125,1,125,1,126,1,126,1,126,1,126,1,126,1,126,
- 1,126,1,126,1,126,1,127,1,127,1,127,1,127,1,127,1,127,1,127,1,128,1,128,
- 1,128,1,128,1,128,1,128,1,128,1,129,1,129,1,129,1,129,1,129,1,129,1,129,
- 1,129,1,129,1,129,1,130,1,130,1,130,1,130,1,130,1,130,1,131,1,131,1,131,
- 1,131,1,131,1,131,1,131,1,132,1,132,1,132,1,132,1,132,1,132,1,132,1,132,
- 1,132,1,132,1,133,1,133,1,133,1,133,1,133,1,134,1,134,1,134,1,134,1,134,
- 1,135,1,135,1,135,1,136,1,136,1,136,1,136,1,137,1,137,1,137,1,137,1,138,
- 1,138,1,138,1,138,1,138,1,138,1,138,1,138,1,139,1,139,1,139,1,139,1,139,
- 1,139,1,140,1,140,1,140,1,140,1,140,1,140,1,140,1,140,1,141,1,141,1,141,
- 1,141,1,141,1,141,1,141,1,142,1,142,1,142,1,142,1,142,1,142,1,142,1,142,
- 1,142,1,142,1,143,1,143,1,143,1,143,1,143,1,143,1,143,1,143,1,144,1,144,
- 1,144,1,144,1,144,1,144,1,144,1,144,1,144,1,144,1,144,1,144,1,144,1,145,
- 1,145,1,145,1,145,1,145,1,145,1,145,1,145,1,145,1,145,1,146,1,146,1,146,
- 1,146,1,146,1,146,1,146,1,146,1,146,1,146,1,146,1,146,1,147,1,147,1,147,
- 1,147,1,147,1,147,1,147,1,147,1,147,1,148,1,148,1,148,1,148,1,148,1,148,
- 1,148,1,148,1,149,1,149,1,149,1,149,1,149,1,149,1,149,1,150,1,150,1,150,
- 1,150,1,150,1,150,1,150,1,150,1,151,1,151,1,151,1,152,1,152,1,152,1,152,
- 1,153,1,153,1,153,1,153,1,153,1,153,1,153,1,153,1,153,1,153,1,153,1,153,
- 1,153,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,155,1,155,1,155,1,156,
- 1,156,1,156,1,156,1,156,1,157,1,157,1,157,1,157,1,157,1,158,1,158,1,158,
- 1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,160,1,160,1,160,1,160,1,160,
- 1,160,1,161,1,161,1,161,1,161,1,161,1,161,1,161,1,161,1,162,1,162,1,162,
- 1,162,1,162,1,162,1,163,1,163,1,163,1,163,1,163,1,163,1,163,1,163,1,164,
- 1,164,1,164,1,164,1,164,1,164,1,165,1,165,1,165,1,165,1,166,1,166,1,166,
- 1,166,1,166,1,166,1,166,1,166,1,166,1,166,1,166,1,167,1,167,1,167,1,167,
- 1,167,1,168,1,168,1,168,1,168,1,168,1,168,1,168,1,168,1,169,1,169,1,169,
- 1,169,1,169,1,169,1,169,1,169,1,169,1,169,1,169,1,169,1,169,1,169,1,169,
- 1,169,1,170,1,170,1,170,1,170,1,170,1,170,1,170,1,170,1,170,1,170,1,171,
- 3,171,2025,8,171,1,171,1,171,1,171,1,171,4,171,2031,8,171,11,171,12,171,
- 2032,1,171,4,171,2036,8,171,11,171,12,171,2037,3,171,2040,8,171,1,172,
- 3,172,2043,8,172,1,172,1,172,1,172,1,172,4,172,2049,8,172,11,172,12,172,
- 2050,1,172,4,172,2054,8,172,11,172,12,172,2055,3,172,2058,8,172,1,173,
- 3,173,2061,8,173,1,173,4,173,2064,8,173,11,173,12,173,2065,1,173,1,173,
- 4,173,2070,8,173,11,173,12,173,2071,1,173,1,173,3,173,2076,8,173,1,173,
- 4,173,2079,8,173,11,173,12,173,2080,3,173,2083,8,173,1,173,1,173,3,173,
- 2087,8,173,1,173,4,173,2090,8,173,11,173,12,173,2091,3,173,2094,8,173,
- 1,173,1,173,4,173,2098,8,173,11,173,12,173,2099,1,173,1,173,3,173,2104,
- 8,173,1,173,4,173,2107,8,173,11,173,12,173,2108,3,173,2111,8,173,3,173,
- 2113,8,173,1,174,1,174,1,174,1,175,1,175,1,175,1,175,1,176,1,176,1,176,
- 1,176,1,176,1,177,1,177,1,177,1,177,1,177,1,177,1,177,1,177,1,178,1,178,
- 1,178,1,178,1,178,1,178,1,179,1,179,1,179,1,179,1,179,1,179,1,179,1,179,
- 1,179,3,179,2150,8,179,1,180,1,180,1,180,1,180,1,180,1,180,1,180,1,181,
- 1,181,1,181,1,181,1,181,1,182,1,182,1,182,1,182,1,182,1,183,1,183,1,183,
- 1,183,1,183,1,183,1,184,1,184,1,184,1,184,1,184,1,184,1,185,1,185,1,185,
- 1,185,1,185,1,185,1,186,1,186,1,186,1,186,1,186,1,186,1,186,1,186,1,187,
- 1,187,1,187,1,187,1,187,1,187,1,187,1,187,1,188,1,188,1,188,1,188,1,188,
- 1,188,1,188,1,188,1,188,1,189,1,189,1,189,1,189,1,189,1,189,1,190,1,190,
- 1,190,1,190,1,190,1,190,1,190,1,191,1,191,1,191,1,191,1,191,1,191,1,191,
- 1,192,1,192,1,192,1,192,1,192,1,192,1,192,1,193,1,193,1,193,1,193,1,194,
- 1,194,1,194,1,194,1,194,1,195,1,195,1,195,1,195,1,195,1,196,1,196,1,196,
- 1,196,1,196,1,196,1,196,1,197,1,197,1,197,1,197,1,197,1,197,1,197,1,197,
- 1,198,1,198,1,198,1,198,1,198,1,198,1,199,1,199,1,199,1,199,1,199,1,199,
- 1,199,1,199,1,199,1,199,1,200,1,200,1,200,1,200,1,200,1,201,1,201,1,201,
- 1,201,1,201,1,202,1,202,1,202,1,202,1,202,1,202,1,202,1,203,1,203,1,203,
- 1,203,1,203,1,203,1,204,1,204,1,204,1,204,1,204,1,204,1,204,1,204,1,204,
- 1,205,1,205,1,205,1,205,1,205,1,205,1,206,1,206,1,206,1,206,1,206,1,206,
- 1,206,1,206,1,207,1,207,1,207,1,207,1,207,1,207,1,207,1,207,1,207,1,208,
- 1,208,1,208,1,208,1,208,1,208,1,208,1,208,1,209,1,209,1,209,1,209,1,209,
- 1,209,1,210,1,210,1,210,1,210,1,210,1,210,1,210,1,210,1,211,1,211,1,211,
- 1,211,1,211,1,212,1,212,1,212,1,212,1,212,1,213,1,213,1,213,1,213,1,213,
- 1,213,1,214,1,214,1,214,1,214,1,214,1,214,1,214,1,215,1,215,1,215,1,215,
- 1,215,1,215,1,215,1,216,1,216,1,216,1,216,1,216,1,216,1,216,1,216,1,216,
- 1,216,1,217,1,217,1,217,1,217,1,217,1,217,1,217,1,217,1,217,1,218,1,218,
- 1,218,1,218,1,218,1,218,1,218,1,218,1,218,1,218,1,219,1,219,1,219,1,219,
- 1,219,1,219,1,219,1,220,1,220,1,220,1,220,1,220,1,220,1,220,1,220,1,220,
- 1,220,1,221,1,221,1,221,1,221,1,221,1,221,1,221,1,221,1,221,1,221,1,222,
- 1,222,1,222,1,222,1,222,1,222,1,222,1,222,1,222,1,223,1,223,1,223,1,223,
- 1,223,1,224,1,224,1,224,1,224,1,224,1,224,1,225,1,225,1,225,1,225,1,225,
- 1,225,1,225,1,226,1,226,1,226,1,226,1,227,1,227,1,227,1,227,1,227,1,227,
- 1,227,1,227,1,227,1,228,1,228,1,228,1,228,1,228,1,228,1,228,1,229,1,229,
- 1,229,1,229,1,229,1,229,1,229,1,229,1,230,1,230,1,230,1,230,1,230,1,230,
- 1,230,1,231,1,231,1,231,1,231,1,231,1,231,1,231,1,231,1,231,1,231,1,231,
- 1,231,1,232,1,232,1,232,1,232,1,232,1,232,1,232,1,233,1,233,1,233,1,233,
- 1,233,1,233,1,233,1,233,1,233,1,234,1,234,1,234,1,234,1,234,1,235,1,235,
- 1,235,1,235,1,235,1,235,1,235,1,236,1,236,1,236,1,236,1,236,1,236,1,236,
- 1,236,1,237,1,237,1,237,1,237,1,237,1,237,1,237,1,237,1,237,1,237,1,237,
- 1,237,1,237,1,237,1,237,1,237,1,238,1,238,1,238,1,238,1,238,1,238,1,238,
+ 1,107,1,107,1,107,1,107,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,
+ 1,108,1,108,1,108,1,108,1,108,1,109,1,109,1,109,1,109,1,109,1,109,1,109,
+ 1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,110,1,110,
+ 1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,
+ 1,110,1,110,1,110,1,110,1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,111,
+ 1,111,1,112,1,112,1,112,1,112,1,112,1,112,1,112,1,112,1,113,1,113,1,114,
+ 1,114,1,114,1,114,1,114,1,114,1,114,1,114,1,114,1,114,1,115,1,115,1,115,
+ 1,115,1,115,1,115,1,116,1,116,1,116,1,116,1,116,1,116,1,117,1,117,1,117,
+ 1,117,1,117,1,117,1,118,1,118,1,118,1,118,1,118,1,119,1,119,1,119,1,119,
+ 1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,120,
+ 1,120,1,120,1,120,1,120,1,120,1,120,1,121,1,121,1,121,1,121,1,121,1,121,
+ 1,121,1,121,1,122,1,122,1,122,1,122,1,122,1,122,1,122,1,123,1,123,1,123,
+ 1,123,1,123,1,123,1,123,1,123,1,123,1,124,1,124,1,124,1,124,1,124,1,124,
+ 1,124,1,124,1,124,1,124,1,124,1,124,1,124,1,125,1,125,1,125,1,125,1,125,
+ 1,125,1,125,1,125,1,126,1,126,1,126,1,126,1,126,1,126,1,126,1,126,1,126,
+ 1,126,1,126,1,126,1,126,1,126,1,127,1,127,1,127,1,127,1,127,1,127,1,127,
+ 1,128,1,128,1,128,1,128,1,128,1,128,1,128,1,129,1,129,1,129,1,129,1,129,
+ 1,129,1,129,1,129,1,129,1,129,1,130,1,130,1,130,1,130,1,130,1,130,1,131,
+ 1,131,1,131,1,131,1,131,1,131,1,131,1,132,1,132,1,132,1,132,1,132,1,132,
+ 1,132,1,132,1,132,1,132,1,133,1,133,1,133,1,133,1,133,1,134,1,134,1,134,
+ 1,134,1,134,1,135,1,135,1,135,1,136,1,136,1,136,1,136,1,137,1,137,1,137,
+ 1,137,1,138,1,138,1,138,1,138,1,138,1,138,1,138,1,138,1,139,1,139,1,139,
+ 1,139,1,139,1,139,1,140,1,140,1,140,1,140,1,140,1,140,1,140,1,140,1,141,
+ 1,141,1,141,1,141,1,141,1,141,1,141,1,142,1,142,1,142,1,142,1,142,1,142,
+ 1,142,1,142,1,142,1,142,1,143,1,143,1,143,1,143,1,143,1,143,1,143,1,143,
+ 1,144,1,144,1,144,1,144,1,144,1,144,1,144,1,144,1,144,1,144,1,144,1,144,
+ 1,144,1,145,1,145,1,145,1,145,1,145,1,145,1,145,1,145,1,145,1,145,1,146,
+ 1,146,1,146,1,146,1,146,1,146,1,146,1,146,1,146,1,146,1,146,1,146,1,147,
+ 1,147,1,147,1,147,1,147,1,147,1,147,1,147,1,147,1,148,1,148,1,148,1,148,
+ 1,148,1,148,1,148,1,148,1,149,1,149,1,149,1,149,1,149,1,149,1,149,1,150,
+ 1,150,1,150,1,150,1,150,1,150,1,150,1,150,1,151,1,151,1,151,1,152,1,152,
+ 1,152,1,152,1,153,1,153,1,153,1,153,1,153,1,153,1,153,1,153,1,153,1,153,
+ 1,153,1,153,1,153,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,155,1,155,
+ 1,155,1,156,1,156,1,156,1,156,1,156,1,157,1,157,1,157,1,157,1,157,1,158,
+ 1,158,1,158,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,160,1,160,1,160,
+ 1,160,1,160,1,160,1,161,1,161,1,161,1,161,1,161,1,161,1,161,1,161,1,162,
+ 1,162,1,162,1,162,1,162,1,162,1,163,1,163,1,163,1,163,1,163,1,163,1,163,
+ 1,163,1,164,1,164,1,164,1,164,1,164,1,164,1,165,1,165,1,165,1,165,1,166,
+ 1,166,1,166,1,166,1,166,1,166,1,166,1,166,1,166,1,166,1,166,1,167,1,167,
+ 1,167,1,167,1,167,1,167,1,167,1,167,1,167,1,167,1,167,1,168,1,168,1,168,
+ 1,168,1,168,1,169,1,169,1,169,1,169,1,169,1,169,1,169,1,169,1,170,1,170,
+ 1,170,1,170,1,170,1,170,1,170,1,170,1,170,1,170,1,170,1,170,1,170,1,170,
+ 1,170,1,170,1,171,1,171,1,171,1,171,1,171,1,171,1,171,1,171,1,171,1,171,
+ 1,172,3,172,2038,8,172,1,172,1,172,1,172,1,172,4,172,2044,8,172,11,172,
+ 12,172,2045,1,172,4,172,2049,8,172,11,172,12,172,2050,3,172,2053,8,172,
+ 1,173,3,173,2056,8,173,1,173,1,173,1,173,1,173,4,173,2062,8,173,11,173,
+ 12,173,2063,1,173,4,173,2067,8,173,11,173,12,173,2068,3,173,2071,8,173,
+ 1,174,3,174,2074,8,174,1,174,4,174,2077,8,174,11,174,12,174,2078,1,174,
+ 1,174,4,174,2083,8,174,11,174,12,174,2084,1,174,1,174,3,174,2089,8,174,
+ 1,174,4,174,2092,8,174,11,174,12,174,2093,3,174,2096,8,174,1,174,1,174,
+ 3,174,2100,8,174,1,174,4,174,2103,8,174,11,174,12,174,2104,3,174,2107,
+ 8,174,1,174,1,174,4,174,2111,8,174,11,174,12,174,2112,1,174,1,174,3,174,
+ 2117,8,174,1,174,4,174,2120,8,174,11,174,12,174,2121,3,174,2124,8,174,
+ 3,174,2126,8,174,1,175,1,175,1,175,1,176,1,176,1,176,1,176,1,177,1,177,
+ 1,177,1,177,1,177,1,178,1,178,1,178,1,178,1,178,1,178,1,178,1,178,1,179,
+ 1,179,1,179,1,179,1,179,1,179,1,180,1,180,1,180,1,180,1,180,1,180,1,180,
+ 1,180,1,180,3,180,2163,8,180,1,181,1,181,1,181,1,181,1,181,1,181,1,181,
+ 1,182,1,182,1,182,1,182,1,182,1,183,1,183,1,183,1,183,1,183,1,184,1,184,
+ 1,184,1,184,1,184,1,184,1,185,1,185,1,185,1,185,1,185,1,185,1,186,1,186,
+ 1,186,1,186,1,186,1,186,1,187,1,187,1,187,1,187,1,187,1,187,1,187,1,187,
+ 1,188,1,188,1,188,1,188,1,188,1,188,1,188,1,188,1,189,1,189,1,189,1,189,
+ 1,189,1,189,1,189,1,189,1,189,1,190,1,190,1,190,1,190,1,190,1,190,1,191,
+ 1,191,1,191,1,191,1,191,1,191,1,191,1,192,1,192,1,192,1,192,1,192,1,192,
+ 1,192,1,193,1,193,1,193,1,193,1,193,1,193,1,193,1,194,1,194,1,194,1,194,
+ 1,195,1,195,1,195,1,195,1,195,1,196,1,196,1,196,1,196,1,196,1,197,1,197,
+ 1,197,1,197,1,197,1,197,1,197,1,198,1,198,1,198,1,198,1,198,1,198,1,198,
+ 1,198,1,199,1,199,1,199,1,199,1,199,1,199,1,200,1,200,1,200,1,200,1,200,
+ 1,200,1,200,1,200,1,200,1,200,1,201,1,201,1,201,1,201,1,201,1,202,1,202,
+ 1,202,1,202,1,202,1,203,1,203,1,203,1,203,1,203,1,203,1,203,1,204,1,204,
+ 1,204,1,204,1,204,1,204,1,205,1,205,1,205,1,205,1,205,1,205,1,205,1,205,
+ 1,205,1,205,1,206,1,206,1,206,1,206,1,206,1,206,1,207,1,207,1,207,1,207,
+ 1,207,1,207,1,207,1,207,1,208,1,208,1,208,1,208,1,208,1,208,1,208,1,208,
+ 1,208,1,209,1,209,1,209,1,209,1,209,1,209,1,209,1,209,1,210,1,210,1,210,
+ 1,210,1,210,1,210,1,211,1,211,1,211,1,211,1,211,1,211,1,211,1,211,1,212,
+ 1,212,1,212,1,212,1,212,1,213,1,213,1,213,1,213,1,213,1,214,1,214,1,214,
+ 1,214,1,214,1,214,1,215,1,215,1,215,1,215,1,215,1,215,1,215,1,216,1,216,
+ 1,216,1,216,1,216,1,216,1,216,1,217,1,217,1,217,1,217,1,217,1,217,1,217,
+ 1,217,1,217,1,217,1,218,1,218,1,218,1,218,1,218,1,218,1,218,1,218,1,218,
+ 1,219,1,219,1,219,1,219,1,219,1,219,1,219,1,219,1,219,1,219,1,220,1,220,
+ 1,220,1,220,1,220,1,220,1,220,1,221,1,221,1,221,1,221,1,221,1,221,1,221,
+ 1,221,1,221,1,221,1,222,1,222,1,222,1,222,1,222,1,222,1,222,1,222,1,222,
+ 1,222,1,223,1,223,1,223,1,223,1,223,1,223,1,223,1,223,1,223,1,224,1,224,
+ 1,224,1,224,1,224,1,225,1,225,1,225,1,225,1,225,1,225,1,226,1,226,1,226,
+ 1,226,1,226,1,226,1,226,1,227,1,227,1,227,1,227,1,228,1,228,1,228,1,228,
+ 1,228,1,228,1,228,1,228,1,228,1,229,1,229,1,229,1,229,1,229,1,229,1,229,
+ 1,230,1,230,1,230,1,230,1,230,1,230,1,230,1,230,1,231,1,231,1,231,1,231,
+ 1,231,1,231,1,231,1,232,1,232,1,232,1,232,1,232,1,232,1,232,1,232,1,232,
+ 1,232,1,232,1,232,1,233,1,233,1,233,1,233,1,233,1,233,1,233,1,234,1,234,
+ 1,234,1,234,1,234,1,234,1,234,1,234,1,234,1,235,1,235,1,235,1,235,1,235,
+ 1,236,1,236,1,236,1,236,1,236,1,236,1,236,1,237,1,237,1,237,1,237,1,237,
+ 1,237,1,237,1,237,1,238,1,238,1,238,1,238,1,238,1,238,1,238,1,238,1,238,
1,238,1,238,1,238,1,238,1,238,1,238,1,238,1,239,1,239,1,239,1,239,1,239,
- 1,239,1,239,1,239,1,239,1,239,1,239,1,239,1,240,1,240,1,240,1,241,1,241,
- 1,241,1,241,1,241,1,241,1,242,1,242,1,242,1,242,1,242,1,242,1,242,1,242,
- 1,242,1,243,1,243,1,243,1,243,1,243,1,243,1,243,1,243,1,243,1,244,1,244,
- 1,244,1,244,1,244,1,244,1,244,1,244,1,245,1,245,1,245,1,245,1,245,1,245,
- 1,245,1,246,1,246,1,246,1,246,1,246,1,246,1,246,1,246,1,246,1,246,1,247,
- 1,247,1,247,1,247,1,247,1,247,1,248,1,248,1,248,1,248,1,248,1,248,1,248,
- 1,248,1,249,1,249,1,249,1,249,1,249,1,249,1,249,1,249,1,249,1,250,1,250,
- 1,250,1,250,1,250,1,250,1,250,1,250,1,250,1,251,1,251,1,252,1,252,1,252,
- 1,253,1,253,1,253,1,253,1,253,1,253,1,253,1,253,1,253,1,253,1,253,1,253,
- 1,253,1,253,3,253,2702,8,253,1,254,1,254,1,254,1,254,1,254,1,254,1,254,
- 1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,256,
- 1,256,1,256,1,256,1,256,1,256,1,257,1,257,1,257,1,257,1,257,1,257,1,258,
- 1,258,1,258,1,258,1,258,1,258,1,258,1,258,1,259,1,259,1,260,1,260,1,260,
- 1,261,1,261,1,262,1,262,1,262,1,262,3,262,2753,8,262,1,262,3,262,2756,
- 8,262,1,262,3,262,2759,8,262,1,262,3,262,2762,8,262,1,263,1,263,1,263,
- 5,263,2767,8,263,10,263,12,263,2770,9,263,1,263,1,263,1,264,1,264,1,264,
- 5,264,2777,8,264,10,264,12,264,2780,9,264,1,264,1,264,1,265,1,265,1,266,
- 1,266,1,267,1,267,1,267,1,267,1,267,1,267,1,267,1,267,1,268,1,268,1,268,
- 1,268,1,268,1,268,1,268,1,269,1,269,1,269,1,269,1,269,1,269,1,269,1,270,
- 1,270,1,270,1,270,1,270,1,270,1,270,1,270,1,271,1,271,1,271,1,271,1,271,
- 1,271,1,272,1,272,1,272,1,272,1,272,1,272,1,272,1,273,1,273,1,273,1,273,
- 1,273,1,273,1,273,1,273,1,273,1,274,1,274,1,274,1,274,1,274,1,274,1,274,
- 1,274,1,274,1,274,1,274,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,3,275,4033,
- 8,275,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
- 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
- 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
- 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
- 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
- 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
- 1,276,1,276,1,276,1,276,1,276,3,276,4111,8,276,1,277,1,277,1,277,1,277,
+ 1,239,1,239,1,239,1,239,1,239,1,239,1,239,1,239,1,239,1,240,1,240,1,240,
+ 1,240,1,240,1,240,1,240,1,240,1,240,1,240,1,240,1,240,1,241,1,241,1,241,
+ 1,242,1,242,1,242,1,242,1,242,1,242,1,243,1,243,1,243,1,243,1,243,1,243,
+ 1,243,1,243,1,243,1,244,1,244,1,244,1,244,1,244,1,244,1,244,1,244,1,244,
+ 1,245,1,245,1,245,1,245,1,245,1,245,1,245,1,245,1,246,1,246,1,246,1,246,
+ 1,246,1,246,1,246,1,247,1,247,1,247,1,247,1,247,1,247,1,247,1,247,1,247,
+ 1,247,1,248,1,248,1,248,1,248,1,248,1,248,1,249,1,249,1,249,1,249,1,249,
+ 1,249,1,249,1,249,1,250,1,250,1,250,1,250,1,250,1,250,1,250,1,250,1,250,
+ 1,251,1,251,1,251,1,251,1,251,1,251,1,251,1,251,1,251,1,252,1,252,1,253,
+ 1,253,1,253,1,254,1,254,1,254,1,254,1,254,1,254,1,254,1,254,1,254,1,254,
+ 1,254,1,254,1,254,1,254,3,254,2716,8,254,1,255,1,255,1,255,1,255,1,255,
+ 1,255,1,255,1,256,1,256,1,256,1,256,1,256,1,256,1,256,1,256,1,256,1,256,
+ 1,256,1,257,1,257,1,257,1,257,1,257,1,257,1,258,1,258,1,258,1,258,1,258,
+ 1,258,1,259,1,259,1,259,1,259,1,259,1,259,1,259,1,259,1,260,1,260,1,261,
+ 1,261,1,261,1,262,1,262,1,263,1,263,1,263,1,263,3,263,2767,8,263,1,263,
+ 3,263,2770,8,263,1,263,3,263,2773,8,263,1,263,3,263,2776,8,263,1,264,1,
+ 264,1,264,5,264,2781,8,264,10,264,12,264,2784,9,264,1,264,1,264,1,265,
+ 1,265,1,265,5,265,2791,8,265,10,265,12,265,2794,9,265,1,265,1,265,1,266,
+ 1,266,1,267,1,267,1,268,1,268,1,268,1,268,1,268,1,268,1,268,1,268,1,269,
+ 1,269,1,269,1,269,1,269,1,269,1,269,1,270,1,270,1,270,1,270,1,270,1,270,
+ 1,270,1,271,1,271,1,271,1,271,1,271,1,271,1,271,1,271,1,272,1,272,1,272,
+ 1,272,1,272,1,272,1,273,1,273,1,273,1,273,1,273,1,273,1,273,1,274,1,274,
+ 1,274,1,274,1,274,1,274,1,274,1,274,1,274,1,275,1,275,1,275,1,275,1,275,
+ 1,275,1,275,1,275,1,275,1,275,1,275,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,3,276,4053,8,276,1,277,1,277,1,277,
+ 1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,
+ 1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,
+ 1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,
+ 1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,
+ 1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,
1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,
- 1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,3,277,
- 4140,8,277,1,278,1,278,1,278,1,278,1,278,1,278,1,278,1,279,1,279,1,279,
- 1,279,1,279,1,279,1,279,1,279,1,279,1,279,1,279,1,279,3,279,4161,8,279,
- 1,280,1,280,1,280,1,280,1,280,1,280,1,280,1,280,1,280,1,280,1,280,1,280,
- 1,280,1,280,1,280,1,280,1,280,1,280,1,280,1,280,1,280,1,280,1,280,1,280,
- 1,280,1,280,1,280,1,280,1,280,1,280,1,280,1,280,1,280,1,280,1,280,3,280,
- 4198,8,280,1,281,1,281,1,281,1,281,1,281,1,281,1,282,1,282,1,282,1,282,
- 1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,
- 1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,
- 1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,
- 1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,
- 1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,
- 1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,
- 1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,
- 1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,
- 1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,
- 1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,
- 1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,
- 1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,
- 1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,3,282,4364,
- 8,282,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,284,1,284,1,284,1,284,
- 1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,
- 1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,
- 1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,
- 1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,
- 1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,
- 1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,
- 1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,
- 1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,
- 1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,
- 1,284,1,284,3,284,4487,8,284,1,285,1,285,1,285,1,285,1,285,1,285,1,286,
- 1,286,1,286,1,286,1,286,1,286,1,286,1,286,1,286,1,286,1,286,1,286,1,286,
- 1,286,1,286,1,286,1,286,1,286,1,286,1,286,1,286,1,286,1,286,1,286,1,286,
- 1,286,1,286,1,286,1,286,1,286,1,286,1,286,1,286,1,286,1,286,3,286,4530,
- 8,286,1,287,1,287,1,287,1,287,1,287,1,287,1,287,1,287,1,288,1,288,1,289,
- 1,289,1,290,1,290,1,290,4,290,4547,8,290,11,290,12,290,4548,1,290,1,290,
- 1,291,1,291,5,291,4555,8,291,10,291,12,291,4558,9,291,1,292,1,292,1,292,
- 1,293,1,293,1,293,1,293,1,294,1,294,1,294,1,294,5,294,4571,8,294,10,294,
- 12,294,4574,9,294,1,294,1,294,1,295,1,295,1,295,1,295,5,295,4582,8,295,
- 10,295,12,295,4585,9,295,1,295,1,295,1,295,1,295,1,295,1,296,1,296,1,296,
- 1,296,1,296,1,296,1,296,1,296,1,296,1,296,1,296,1,296,1,297,1,297,1,297,
- 1,297,1,297,1,297,1,297,1,297,1,297,1,297,1,297,1,297,1,297,1,297,1,297,
- 1,298,1,298,1,298,1,298,1,298,1,298,1,298,1,298,1,298,1,298,1,299,1,299,
- 1,299,1,299,1,299,1,299,1,299,1,299,1,299,1,299,1,300,1,300,1,300,1,300,
- 1,300,1,300,1,300,1,300,1,300,1,300,1,300,1,300,1,301,1,301,1,301,1,301,
- 1,301,1,301,1,301,1,301,1,301,1,301,1,302,1,302,1,302,1,302,1,302,1,302,
+ 1,277,3,277,4131,8,277,1,278,1,278,1,278,1,278,1,278,1,278,1,278,1,278,
+ 1,278,1,278,1,278,1,278,1,278,1,278,1,278,1,278,1,278,1,278,1,278,1,278,
+ 1,278,1,278,1,278,1,278,1,278,1,278,1,278,3,278,4160,8,278,1,279,1,279,
+ 1,279,1,279,1,279,1,279,1,279,1,280,1,280,1,280,1,280,1,280,1,280,1,280,
+ 1,280,1,280,1,280,1,280,1,280,3,280,4181,8,280,1,281,1,281,1,281,1,281,
+ 1,281,1,281,1,281,1,281,1,281,1,281,1,281,1,281,1,281,1,281,1,281,1,281,
+ 1,281,1,281,1,281,1,281,1,281,1,281,1,281,1,281,1,281,1,281,1,281,1,281,
+ 1,281,1,281,1,281,1,281,1,281,1,281,1,281,3,281,4218,8,281,1,282,1,282,
+ 1,282,1,282,1,282,1,282,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,
+ 1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,
+ 1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,
+ 1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,
+ 1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,
+ 1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,
+ 1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,
+ 1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,
+ 1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,
+ 1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,
+ 1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,
+ 1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,
+ 1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,
+ 1,283,1,283,1,283,1,283,1,283,1,283,3,283,4384,8,283,1,284,1,284,1,284,
+ 1,284,1,284,1,284,1,284,1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,
+ 1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,
+ 1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,
+ 1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,
+ 1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,
+ 1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,
+ 1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,
+ 1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,
+ 1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,
+ 1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,1,285,3,285,4507,
+ 8,285,1,286,1,286,1,286,1,286,1,286,1,286,1,287,1,287,1,287,1,287,1,287,
+ 1,287,1,287,1,287,1,287,1,287,1,287,1,287,1,287,1,287,1,287,1,287,1,287,
+ 1,287,1,287,1,287,1,287,1,287,1,287,1,287,1,287,1,287,1,287,1,287,1,287,
+ 1,287,1,287,1,287,1,287,1,287,1,287,3,287,4550,8,287,1,288,1,288,1,288,
+ 1,288,1,288,1,288,1,288,1,288,1,289,1,289,1,290,1,290,1,291,1,291,1,291,
+ 4,291,4567,8,291,11,291,12,291,4568,1,291,1,291,1,292,1,292,5,292,4575,
+ 8,292,10,292,12,292,4578,9,292,1,293,1,293,1,293,1,294,1,294,1,294,1,294,
+ 1,295,1,295,1,295,1,295,5,295,4591,8,295,10,295,12,295,4594,9,295,1,295,
+ 1,295,1,296,1,296,1,296,1,296,5,296,4602,8,296,10,296,12,296,4605,9,296,
+ 1,296,1,296,1,296,1,296,1,296,1,297,1,297,1,297,1,297,1,297,1,297,1,297,
+ 1,297,1,297,1,297,1,297,1,297,1,298,1,298,1,298,1,298,1,298,1,298,1,298,
+ 1,298,1,298,1,298,1,298,1,298,1,298,1,298,1,298,1,299,1,299,1,299,1,299,
+ 1,299,1,299,1,299,1,299,1,299,1,299,1,300,1,300,1,300,1,300,1,300,1,300,
+ 1,300,1,300,1,300,1,300,1,301,1,301,1,301,1,301,1,301,1,301,1,301,1,301,
+ 1,301,1,301,1,301,1,301,1,302,1,302,1,302,1,302,1,302,1,302,1,302,1,302,
1,302,1,302,1,303,1,303,1,303,1,303,1,303,1,303,1,303,1,303,1,304,1,304,
- 1,304,1,304,1,304,1,304,1,304,1,304,1,304,1,304,1,305,1,305,1,305,1,305,
- 1,305,1,305,1,305,1,305,1,305,1,4583,0,306,1,1,3,2,5,3,7,4,9,5,11,6,13,
- 7,15,8,17,9,19,10,21,11,23,12,25,13,27,14,29,15,31,16,33,17,35,18,37,19,
- 39,20,41,21,43,22,45,23,47,24,49,25,51,26,53,27,55,28,57,29,59,30,61,31,
- 63,32,65,33,67,34,69,35,71,36,73,37,75,38,77,39,79,40,81,41,83,42,85,43,
- 87,44,89,45,91,46,93,47,95,48,97,49,99,50,101,51,103,52,105,53,107,54,
- 109,55,111,56,113,57,115,58,117,59,119,60,121,61,123,62,125,63,127,64,
- 129,65,131,66,133,67,135,68,137,69,139,70,141,71,143,72,145,73,147,74,
- 149,75,151,76,153,77,155,78,157,79,159,80,161,81,163,82,165,83,167,84,
- 169,85,171,86,173,87,175,88,177,89,179,90,181,91,183,92,185,93,187,94,
- 189,95,191,96,193,97,195,98,197,99,199,100,201,101,203,102,205,103,207,
- 104,209,105,211,106,213,107,215,108,217,109,219,110,221,111,223,112,225,
- 113,227,114,229,115,231,116,233,117,235,118,237,119,239,120,241,121,243,
- 122,245,123,247,124,249,125,251,126,253,127,255,128,257,129,259,130,261,
- 131,263,132,265,133,267,134,269,135,271,136,273,137,275,138,277,139,279,
- 140,281,141,283,142,285,143,287,144,289,145,291,146,293,147,295,148,297,
- 149,299,150,301,151,303,152,305,153,307,154,309,155,311,156,313,157,315,
- 158,317,159,319,160,321,161,323,162,325,163,327,164,329,165,331,166,333,
- 167,335,168,337,169,339,170,341,171,343,172,345,173,347,174,349,175,351,
- 176,353,177,355,178,357,179,359,180,361,181,363,182,365,183,367,184,369,
- 185,371,186,373,187,375,188,377,0,379,189,381,190,383,191,385,192,387,
- 193,389,194,391,195,393,196,395,197,397,198,399,199,401,200,403,201,405,
- 202,407,203,409,204,411,205,413,206,415,207,417,208,419,209,421,210,423,
- 211,425,212,427,213,429,214,431,215,433,216,435,217,437,218,439,219,441,
- 220,443,221,445,222,447,223,449,224,451,225,453,226,455,227,457,228,459,
- 229,461,230,463,231,465,232,467,233,469,234,471,235,473,236,475,237,477,
- 238,479,239,481,240,483,241,485,242,487,243,489,244,491,245,493,246,495,
- 247,497,248,499,249,501,250,503,251,505,252,507,253,509,254,511,255,513,
- 256,515,257,517,258,519,259,521,260,523,261,525,0,527,262,529,263,531,
- 264,533,265,535,266,537,267,539,268,541,269,543,270,545,271,547,272,549,
- 273,551,274,553,275,555,276,557,277,559,278,561,279,563,280,565,281,567,
- 282,569,283,571,284,573,285,575,286,577,0,579,0,581,287,583,288,585,289,
- 587,290,589,291,591,292,593,293,595,294,597,295,599,296,601,297,603,298,
- 605,299,607,300,609,301,611,302,1,0,12,3,0,48,57,65,70,97,102,1,0,48,57,
- 2,0,69,69,101,101,2,0,43,43,45,45,11,0,34,34,39,39,47,48,63,63,92,92,97,
- 98,102,102,110,110,114,114,116,116,118,118,1,0,48,55,4,0,10,10,13,13,34,
- 34,92,92,4,0,10,10,13,13,39,39,92,92,4,0,35,36,63,90,95,95,97,122,4,0,
- 35,36,48,57,63,90,95,122,3,0,9,10,13,13,32,32,2,0,10,10,13,13,4947,0,1,
- 1,0,0,0,0,3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,0,0,0,9,1,0,0,0,0,11,1,0,0,0,0,
- 13,1,0,0,0,0,15,1,0,0,0,0,17,1,0,0,0,0,19,1,0,0,0,0,21,1,0,0,0,0,23,1,
- 0,0,0,0,25,1,0,0,0,0,27,1,0,0,0,0,29,1,0,0,0,0,31,1,0,0,0,0,33,1,0,0,0,
- 0,35,1,0,0,0,0,37,1,0,0,0,0,39,1,0,0,0,0,41,1,0,0,0,0,43,1,0,0,0,0,45,
- 1,0,0,0,0,47,1,0,0,0,0,49,1,0,0,0,0,51,1,0,0,0,0,53,1,0,0,0,0,55,1,0,0,
- 0,0,57,1,0,0,0,0,59,1,0,0,0,0,61,1,0,0,0,0,63,1,0,0,0,0,65,1,0,0,0,0,67,
- 1,0,0,0,0,69,1,0,0,0,0,71,1,0,0,0,0,73,1,0,0,0,0,75,1,0,0,0,0,77,1,0,0,
- 0,0,79,1,0,0,0,0,81,1,0,0,0,0,83,1,0,0,0,0,85,1,0,0,0,0,87,1,0,0,0,0,89,
- 1,0,0,0,0,91,1,0,0,0,0,93,1,0,0,0,0,95,1,0,0,0,0,97,1,0,0,0,0,99,1,0,0,
- 0,0,101,1,0,0,0,0,103,1,0,0,0,0,105,1,0,0,0,0,107,1,0,0,0,0,109,1,0,0,
- 0,0,111,1,0,0,0,0,113,1,0,0,0,0,115,1,0,0,0,0,117,1,0,0,0,0,119,1,0,0,
- 0,0,121,1,0,0,0,0,123,1,0,0,0,0,125,1,0,0,0,0,127,1,0,0,0,0,129,1,0,0,
- 0,0,131,1,0,0,0,0,133,1,0,0,0,0,135,1,0,0,0,0,137,1,0,0,0,0,139,1,0,0,
- 0,0,141,1,0,0,0,0,143,1,0,0,0,0,145,1,0,0,0,0,147,1,0,0,0,0,149,1,0,0,
- 0,0,151,1,0,0,0,0,153,1,0,0,0,0,155,1,0,0,0,0,157,1,0,0,0,0,159,1,0,0,
- 0,0,161,1,0,0,0,0,163,1,0,0,0,0,165,1,0,0,0,0,167,1,0,0,0,0,169,1,0,0,
- 0,0,171,1,0,0,0,0,173,1,0,0,0,0,175,1,0,0,0,0,177,1,0,0,0,0,179,1,0,0,
- 0,0,181,1,0,0,0,0,183,1,0,0,0,0,185,1,0,0,0,0,187,1,0,0,0,0,189,1,0,0,
- 0,0,191,1,0,0,0,0,193,1,0,0,0,0,195,1,0,0,0,0,197,1,0,0,0,0,199,1,0,0,
- 0,0,201,1,0,0,0,0,203,1,0,0,0,0,205,1,0,0,0,0,207,1,0,0,0,0,209,1,0,0,
- 0,0,211,1,0,0,0,0,213,1,0,0,0,0,215,1,0,0,0,0,217,1,0,0,0,0,219,1,0,0,
- 0,0,221,1,0,0,0,0,223,1,0,0,0,0,225,1,0,0,0,0,227,1,0,0,0,0,229,1,0,0,
- 0,0,231,1,0,0,0,0,233,1,0,0,0,0,235,1,0,0,0,0,237,1,0,0,0,0,239,1,0,0,
- 0,0,241,1,0,0,0,0,243,1,0,0,0,0,245,1,0,0,0,0,247,1,0,0,0,0,249,1,0,0,
- 0,0,251,1,0,0,0,0,253,1,0,0,0,0,255,1,0,0,0,0,257,1,0,0,0,0,259,1,0,0,
- 0,0,261,1,0,0,0,0,263,1,0,0,0,0,265,1,0,0,0,0,267,1,0,0,0,0,269,1,0,0,
- 0,0,271,1,0,0,0,0,273,1,0,0,0,0,275,1,0,0,0,0,277,1,0,0,0,0,279,1,0,0,
- 0,0,281,1,0,0,0,0,283,1,0,0,0,0,285,1,0,0,0,0,287,1,0,0,0,0,289,1,0,0,
- 0,0,291,1,0,0,0,0,293,1,0,0,0,0,295,1,0,0,0,0,297,1,0,0,0,0,299,1,0,0,
- 0,0,301,1,0,0,0,0,303,1,0,0,0,0,305,1,0,0,0,0,307,1,0,0,0,0,309,1,0,0,
- 0,0,311,1,0,0,0,0,313,1,0,0,0,0,315,1,0,0,0,0,317,1,0,0,0,0,319,1,0,0,
- 0,0,321,1,0,0,0,0,323,1,0,0,0,0,325,1,0,0,0,0,327,1,0,0,0,0,329,1,0,0,
- 0,0,331,1,0,0,0,0,333,1,0,0,0,0,335,1,0,0,0,0,337,1,0,0,0,0,339,1,0,0,
- 0,0,341,1,0,0,0,0,343,1,0,0,0,0,345,1,0,0,0,0,347,1,0,0,0,0,349,1,0,0,
- 0,0,351,1,0,0,0,0,353,1,0,0,0,0,355,1,0,0,0,0,357,1,0,0,0,0,359,1,0,0,
- 0,0,361,1,0,0,0,0,363,1,0,0,0,0,365,1,0,0,0,0,367,1,0,0,0,0,369,1,0,0,
- 0,0,371,1,0,0,0,0,373,1,0,0,0,0,375,1,0,0,0,0,379,1,0,0,0,0,381,1,0,0,
- 0,0,383,1,0,0,0,0,385,1,0,0,0,0,387,1,0,0,0,0,389,1,0,0,0,0,391,1,0,0,
- 0,0,393,1,0,0,0,0,395,1,0,0,0,0,397,1,0,0,0,0,399,1,0,0,0,0,401,1,0,0,
- 0,0,403,1,0,0,0,0,405,1,0,0,0,0,407,1,0,0,0,0,409,1,0,0,0,0,411,1,0,0,
- 0,0,413,1,0,0,0,0,415,1,0,0,0,0,417,1,0,0,0,0,419,1,0,0,0,0,421,1,0,0,
- 0,0,423,1,0,0,0,0,425,1,0,0,0,0,427,1,0,0,0,0,429,1,0,0,0,0,431,1,0,0,
- 0,0,433,1,0,0,0,0,435,1,0,0,0,0,437,1,0,0,0,0,439,1,0,0,0,0,441,1,0,0,
- 0,0,443,1,0,0,0,0,445,1,0,0,0,0,447,1,0,0,0,0,449,1,0,0,0,0,451,1,0,0,
- 0,0,453,1,0,0,0,0,455,1,0,0,0,0,457,1,0,0,0,0,459,1,0,0,0,0,461,1,0,0,
- 0,0,463,1,0,0,0,0,465,1,0,0,0,0,467,1,0,0,0,0,469,1,0,0,0,0,471,1,0,0,
- 0,0,473,1,0,0,0,0,475,1,0,0,0,0,477,1,0,0,0,0,479,1,0,0,0,0,481,1,0,0,
- 0,0,483,1,0,0,0,0,485,1,0,0,0,0,487,1,0,0,0,0,489,1,0,0,0,0,491,1,0,0,
- 0,0,493,1,0,0,0,0,495,1,0,0,0,0,497,1,0,0,0,0,499,1,0,0,0,0,501,1,0,0,
- 0,0,503,1,0,0,0,0,505,1,0,0,0,0,507,1,0,0,0,0,509,1,0,0,0,0,511,1,0,0,
- 0,0,513,1,0,0,0,0,515,1,0,0,0,0,517,1,0,0,0,0,519,1,0,0,0,0,521,1,0,0,
- 0,0,523,1,0,0,0,0,527,1,0,0,0,0,529,1,0,0,0,0,531,1,0,0,0,0,533,1,0,0,
- 0,0,535,1,0,0,0,0,537,1,0,0,0,0,539,1,0,0,0,0,541,1,0,0,0,0,543,1,0,0,
- 0,0,545,1,0,0,0,0,547,1,0,0,0,0,549,1,0,0,0,0,551,1,0,0,0,0,553,1,0,0,
- 0,0,555,1,0,0,0,0,557,1,0,0,0,0,559,1,0,0,0,0,561,1,0,0,0,0,563,1,0,0,
- 0,0,565,1,0,0,0,0,567,1,0,0,0,0,569,1,0,0,0,0,571,1,0,0,0,0,573,1,0,0,
- 0,0,575,1,0,0,0,0,581,1,0,0,0,0,583,1,0,0,0,0,585,1,0,0,0,0,587,1,0,0,
- 0,0,589,1,0,0,0,0,591,1,0,0,0,0,593,1,0,0,0,0,595,1,0,0,0,0,597,1,0,0,
- 0,0,599,1,0,0,0,0,601,1,0,0,0,0,603,1,0,0,0,0,605,1,0,0,0,0,607,1,0,0,
- 0,0,609,1,0,0,0,0,611,1,0,0,0,1,613,1,0,0,0,3,620,1,0,0,0,5,624,1,0,0,
- 0,7,630,1,0,0,0,9,638,1,0,0,0,11,649,1,0,0,0,13,661,1,0,0,0,15,669,1,0,
- 0,0,17,682,1,0,0,0,19,695,1,0,0,0,21,706,1,0,0,0,23,725,1,0,0,0,25,740,
- 1,0,0,0,27,763,1,0,0,0,29,769,1,0,0,0,31,778,1,0,0,0,33,780,1,0,0,0,35,
- 782,1,0,0,0,37,793,1,0,0,0,39,803,1,0,0,0,41,809,1,0,0,0,43,819,1,0,0,
- 0,45,830,1,0,0,0,47,844,1,0,0,0,49,854,1,0,0,0,51,864,1,0,0,0,53,874,1,
- 0,0,0,55,876,1,0,0,0,57,886,1,0,0,0,59,888,1,0,0,0,61,890,1,0,0,0,63,892,
- 1,0,0,0,65,901,1,0,0,0,67,904,1,0,0,0,69,912,1,0,0,0,71,914,1,0,0,0,73,
- 920,1,0,0,0,75,929,1,0,0,0,77,935,1,0,0,0,79,942,1,0,0,0,81,951,1,0,0,
- 0,83,953,1,0,0,0,85,955,1,0,0,0,87,958,1,0,0,0,89,972,1,0,0,0,91,988,1,
- 0,0,0,93,1004,1,0,0,0,95,1012,1,0,0,0,97,1023,1,0,0,0,99,1030,1,0,0,0,
- 101,1037,1,0,0,0,103,1045,1,0,0,0,105,1052,1,0,0,0,107,1061,1,0,0,0,109,
- 1066,1,0,0,0,111,1077,1,0,0,0,113,1085,1,0,0,0,115,1094,1,0,0,0,117,1101,
- 1,0,0,0,119,1114,1,0,0,0,121,1129,1,0,0,0,123,1136,1,0,0,0,125,1143,1,
- 0,0,0,127,1152,1,0,0,0,129,1164,1,0,0,0,131,1175,1,0,0,0,133,1191,1,0,
- 0,0,135,1203,1,0,0,0,137,1217,1,0,0,0,139,1223,1,0,0,0,141,1231,1,0,0,
- 0,143,1242,1,0,0,0,145,1248,1,0,0,0,147,1254,1,0,0,0,149,1256,1,0,0,0,
- 151,1267,1,0,0,0,153,1280,1,0,0,0,155,1291,1,0,0,0,157,1306,1,0,0,0,159,
- 1310,1,0,0,0,161,1316,1,0,0,0,163,1320,1,0,0,0,165,1326,1,0,0,0,167,1336,
- 1,0,0,0,169,1339,1,0,0,0,171,1341,1,0,0,0,173,1343,1,0,0,0,175,1345,1,
- 0,0,0,177,1355,1,0,0,0,179,1364,1,0,0,0,181,1371,1,0,0,0,183,1378,1,0,
- 0,0,185,1385,1,0,0,0,187,1394,1,0,0,0,189,1399,1,0,0,0,191,1405,1,0,0,
- 0,193,1413,1,0,0,0,195,1420,1,0,0,0,197,1427,1,0,0,0,199,1432,1,0,0,0,
- 201,1443,1,0,0,0,203,1453,1,0,0,0,205,1466,1,0,0,0,207,1473,1,0,0,0,209,
- 1480,1,0,0,0,211,1490,1,0,0,0,213,1502,1,0,0,0,215,1513,1,0,0,0,217,1526,
- 1,0,0,0,219,1543,1,0,0,0,221,1561,1,0,0,0,223,1570,1,0,0,0,225,1578,1,
- 0,0,0,227,1580,1,0,0,0,229,1590,1,0,0,0,231,1596,1,0,0,0,233,1602,1,0,
- 0,0,235,1608,1,0,0,0,237,1613,1,0,0,0,239,1628,1,0,0,0,241,1635,1,0,0,
- 0,243,1643,1,0,0,0,245,1650,1,0,0,0,247,1659,1,0,0,0,249,1672,1,0,0,0,
- 251,1680,1,0,0,0,253,1694,1,0,0,0,255,1703,1,0,0,0,257,1710,1,0,0,0,259,
- 1717,1,0,0,0,261,1727,1,0,0,0,263,1733,1,0,0,0,265,1740,1,0,0,0,267,1750,
- 1,0,0,0,269,1755,1,0,0,0,271,1760,1,0,0,0,273,1763,1,0,0,0,275,1767,1,
- 0,0,0,277,1771,1,0,0,0,279,1779,1,0,0,0,281,1785,1,0,0,0,283,1793,1,0,
- 0,0,285,1800,1,0,0,0,287,1810,1,0,0,0,289,1818,1,0,0,0,291,1831,1,0,0,
- 0,293,1841,1,0,0,0,295,1853,1,0,0,0,297,1862,1,0,0,0,299,1870,1,0,0,0,
- 301,1877,1,0,0,0,303,1885,1,0,0,0,305,1888,1,0,0,0,307,1892,1,0,0,0,309,
- 1905,1,0,0,0,311,1912,1,0,0,0,313,1915,1,0,0,0,315,1920,1,0,0,0,317,1925,
- 1,0,0,0,319,1928,1,0,0,0,321,1935,1,0,0,0,323,1941,1,0,0,0,325,1949,1,
- 0,0,0,327,1955,1,0,0,0,329,1963,1,0,0,0,331,1969,1,0,0,0,333,1973,1,0,
- 0,0,335,1984,1,0,0,0,337,1989,1,0,0,0,339,1997,1,0,0,0,341,2013,1,0,0,
- 0,343,2024,1,0,0,0,345,2042,1,0,0,0,347,2060,1,0,0,0,349,2114,1,0,0,0,
- 351,2117,1,0,0,0,353,2121,1,0,0,0,355,2126,1,0,0,0,357,2134,1,0,0,0,359,
- 2149,1,0,0,0,361,2151,1,0,0,0,363,2158,1,0,0,0,365,2163,1,0,0,0,367,2168,
- 1,0,0,0,369,2174,1,0,0,0,371,2180,1,0,0,0,373,2186,1,0,0,0,375,2194,1,
- 0,0,0,377,2202,1,0,0,0,379,2211,1,0,0,0,381,2217,1,0,0,0,383,2224,1,0,
- 0,0,385,2231,1,0,0,0,387,2238,1,0,0,0,389,2242,1,0,0,0,391,2247,1,0,0,
- 0,393,2252,1,0,0,0,395,2259,1,0,0,0,397,2267,1,0,0,0,399,2273,1,0,0,0,
- 401,2283,1,0,0,0,403,2288,1,0,0,0,405,2293,1,0,0,0,407,2300,1,0,0,0,409,
- 2306,1,0,0,0,411,2315,1,0,0,0,413,2321,1,0,0,0,415,2329,1,0,0,0,417,2338,
- 1,0,0,0,419,2346,1,0,0,0,421,2352,1,0,0,0,423,2360,1,0,0,0,425,2365,1,
- 0,0,0,427,2370,1,0,0,0,429,2376,1,0,0,0,431,2383,1,0,0,0,433,2390,1,0,
- 0,0,435,2400,1,0,0,0,437,2409,1,0,0,0,439,2419,1,0,0,0,441,2426,1,0,0,
- 0,443,2436,1,0,0,0,445,2446,1,0,0,0,447,2455,1,0,0,0,449,2460,1,0,0,0,
- 451,2466,1,0,0,0,453,2473,1,0,0,0,455,2477,1,0,0,0,457,2486,1,0,0,0,459,
- 2493,1,0,0,0,461,2501,1,0,0,0,463,2508,1,0,0,0,465,2520,1,0,0,0,467,2527,
- 1,0,0,0,469,2536,1,0,0,0,471,2541,1,0,0,0,473,2548,1,0,0,0,475,2556,1,
- 0,0,0,477,2572,1,0,0,0,479,2586,1,0,0,0,481,2598,1,0,0,0,483,2601,1,0,
- 0,0,485,2607,1,0,0,0,487,2616,1,0,0,0,489,2625,1,0,0,0,491,2633,1,0,0,
- 0,493,2640,1,0,0,0,495,2650,1,0,0,0,497,2656,1,0,0,0,499,2664,1,0,0,0,
- 501,2673,1,0,0,0,503,2682,1,0,0,0,505,2684,1,0,0,0,507,2701,1,0,0,0,509,
- 2703,1,0,0,0,511,2710,1,0,0,0,513,2721,1,0,0,0,515,2727,1,0,0,0,517,2733,
- 1,0,0,0,519,2741,1,0,0,0,521,2743,1,0,0,0,523,2746,1,0,0,0,525,2748,1,
- 0,0,0,527,2763,1,0,0,0,529,2773,1,0,0,0,531,2783,1,0,0,0,533,2785,1,0,
- 0,0,535,2787,1,0,0,0,537,2795,1,0,0,0,539,2802,1,0,0,0,541,2809,1,0,0,
- 0,543,2817,1,0,0,0,545,2823,1,0,0,0,547,2830,1,0,0,0,549,2839,1,0,0,0,
- 551,4032,1,0,0,0,553,4110,1,0,0,0,555,4139,1,0,0,0,557,4141,1,0,0,0,559,
- 4160,1,0,0,0,561,4197,1,0,0,0,563,4199,1,0,0,0,565,4363,1,0,0,0,567,4365,
- 1,0,0,0,569,4486,1,0,0,0,571,4488,1,0,0,0,573,4529,1,0,0,0,575,4531,1,
- 0,0,0,577,4539,1,0,0,0,579,4541,1,0,0,0,581,4546,1,0,0,0,583,4552,1,0,
- 0,0,585,4559,1,0,0,0,587,4562,1,0,0,0,589,4566,1,0,0,0,591,4577,1,0,0,
- 0,593,4591,1,0,0,0,595,4603,1,0,0,0,597,4618,1,0,0,0,599,4628,1,0,0,0,
- 601,4638,1,0,0,0,603,4650,1,0,0,0,605,4660,1,0,0,0,607,4668,1,0,0,0,609,
- 4676,1,0,0,0,611,4686,1,0,0,0,613,614,5,110,0,0,614,615,5,97,0,0,615,616,
- 5,116,0,0,616,617,5,105,0,0,617,618,5,118,0,0,618,619,5,101,0,0,619,2,
- 1,0,0,0,620,621,5,99,0,0,621,622,5,105,0,0,622,623,5,108,0,0,623,4,1,0,
- 0,0,624,625,5,111,0,0,625,626,5,112,0,0,626,627,5,116,0,0,627,628,5,105,
- 0,0,628,629,5,108,0,0,629,6,1,0,0,0,630,631,5,109,0,0,631,632,5,97,0,0,
- 632,633,5,110,0,0,633,634,5,97,0,0,634,635,5,103,0,0,635,636,5,101,0,0,
- 636,637,5,100,0,0,637,8,1,0,0,0,638,639,5,102,0,0,639,640,5,111,0,0,640,
- 641,5,114,0,0,641,642,5,119,0,0,642,643,5,97,0,0,643,644,5,114,0,0,644,
- 645,5,100,0,0,645,646,5,114,0,0,646,647,5,101,0,0,647,648,5,102,0,0,648,
- 10,1,0,0,0,649,650,5,112,0,0,650,651,5,114,0,0,651,652,5,101,0,0,652,653,
- 5,115,0,0,653,654,5,101,0,0,654,655,5,114,0,0,655,656,5,118,0,0,656,657,
- 5,101,0,0,657,658,5,115,0,0,658,659,5,105,0,0,659,660,5,103,0,0,660,12,
- 1,0,0,0,661,662,5,114,0,0,662,663,5,117,0,0,663,664,5,110,0,0,664,665,
- 5,116,0,0,665,666,5,105,0,0,666,667,5,109,0,0,667,668,5,101,0,0,668,14,
- 1,0,0,0,669,670,5,105,0,0,670,671,5,110,0,0,671,672,5,116,0,0,672,673,
- 5,101,0,0,673,674,5,114,0,0,674,675,5,110,0,0,675,676,5,97,0,0,676,677,
- 5,108,0,0,677,678,5,99,0,0,678,679,5,97,0,0,679,680,5,108,0,0,680,681,
- 5,108,0,0,681,16,1,0,0,0,682,683,5,115,0,0,683,684,5,121,0,0,684,685,5,
- 110,0,0,685,686,5,99,0,0,686,687,5,104,0,0,687,688,5,114,0,0,688,689,5,
- 111,0,0,689,690,5,110,0,0,690,691,5,105,0,0,691,692,5,122,0,0,692,693,
- 5,101,0,0,693,694,5,100,0,0,694,18,1,0,0,0,695,696,5,110,0,0,696,697,5,
- 111,0,0,697,698,5,105,0,0,698,699,5,110,0,0,699,700,5,108,0,0,700,701,
- 5,105,0,0,701,702,5,110,0,0,702,703,5,105,0,0,703,704,5,110,0,0,704,705,
- 5,103,0,0,705,20,1,0,0,0,706,707,5,97,0,0,707,708,5,103,0,0,708,709,5,
- 103,0,0,709,710,5,114,0,0,710,711,5,101,0,0,711,712,5,115,0,0,712,713,
- 5,115,0,0,713,714,5,105,0,0,714,715,5,118,0,0,715,716,5,101,0,0,716,717,
- 5,105,0,0,717,718,5,110,0,0,718,719,5,108,0,0,719,720,5,105,0,0,720,721,
- 5,110,0,0,721,722,5,105,0,0,722,723,5,110,0,0,723,724,5,103,0,0,724,22,
- 1,0,0,0,725,726,5,110,0,0,726,727,5,111,0,0,727,728,5,111,0,0,728,729,
- 5,112,0,0,729,730,5,116,0,0,730,731,5,105,0,0,731,732,5,109,0,0,732,733,
- 5,105,0,0,733,734,5,122,0,0,734,735,5,97,0,0,735,736,5,116,0,0,736,737,
- 5,105,0,0,737,738,5,111,0,0,738,739,5,110,0,0,739,24,1,0,0,0,740,741,5,
- 97,0,0,741,742,5,103,0,0,742,743,5,103,0,0,743,744,5,114,0,0,744,745,5,
- 101,0,0,745,746,5,115,0,0,746,747,5,115,0,0,747,748,5,105,0,0,748,749,
- 5,118,0,0,749,750,5,101,0,0,750,751,5,111,0,0,751,752,5,112,0,0,752,753,
- 5,116,0,0,753,754,5,105,0,0,754,755,5,109,0,0,755,756,5,105,0,0,756,757,
- 5,122,0,0,757,758,5,97,0,0,758,759,5,116,0,0,759,760,5,105,0,0,760,761,
- 5,111,0,0,761,762,5,110,0,0,762,26,1,0,0,0,763,764,5,97,0,0,764,765,5,
- 115,0,0,765,766,5,121,0,0,766,767,5,110,0,0,767,768,5,99,0,0,768,28,1,
- 0,0,0,769,770,5,101,0,0,770,771,5,120,0,0,771,772,5,116,0,0,772,773,5,
- 101,0,0,773,774,5,110,0,0,774,775,5,100,0,0,775,776,5,101,0,0,776,777,
- 5,100,0,0,777,30,1,0,0,0,778,779,5,123,0,0,779,32,1,0,0,0,780,781,5,125,
- 0,0,781,34,1,0,0,0,782,783,5,46,0,0,783,784,5,115,0,0,784,785,5,117,0,
- 0,785,786,5,98,0,0,786,787,5,115,0,0,787,788,5,121,0,0,788,789,5,115,0,
- 0,789,790,5,116,0,0,790,791,5,101,0,0,791,792,5,109,0,0,792,36,1,0,0,0,
- 793,794,5,46,0,0,794,795,5,99,0,0,795,796,5,111,0,0,796,797,5,114,0,0,
- 797,798,5,102,0,0,798,799,5,108,0,0,799,800,5,97,0,0,800,801,5,103,0,0,
- 801,802,5,115,0,0,802,38,1,0,0,0,803,804,5,46,0,0,804,805,5,102,0,0,805,
- 806,5,105,0,0,806,807,5,108,0,0,807,808,5,101,0,0,808,40,1,0,0,0,809,810,
- 5,97,0,0,810,811,5,108,0,0,811,812,5,105,0,0,812,813,5,103,0,0,813,814,
- 5,110,0,0,814,815,5,109,0,0,815,816,5,101,0,0,816,817,5,110,0,0,817,818,
- 5,116,0,0,818,42,1,0,0,0,819,820,5,46,0,0,820,821,5,105,0,0,821,822,5,
- 109,0,0,822,823,5,97,0,0,823,824,5,103,0,0,824,825,5,101,0,0,825,826,5,
- 98,0,0,826,827,5,97,0,0,827,828,5,115,0,0,828,829,5,101,0,0,829,44,1,0,
- 0,0,830,831,5,46,0,0,831,832,5,115,0,0,832,833,5,116,0,0,833,834,5,97,
- 0,0,834,835,5,99,0,0,835,836,5,107,0,0,836,837,5,114,0,0,837,838,5,101,
- 0,0,838,839,5,115,0,0,839,840,5,101,0,0,840,841,5,114,0,0,841,842,5,118,
- 0,0,842,843,5,101,0,0,843,46,1,0,0,0,844,845,5,46,0,0,845,846,5,97,0,0,
- 846,847,5,115,0,0,847,848,5,115,0,0,848,849,5,101,0,0,849,850,5,109,0,
- 0,850,851,5,98,0,0,851,852,5,108,0,0,852,853,5,121,0,0,853,48,1,0,0,0,
- 854,855,5,46,0,0,855,856,5,109,0,0,856,857,5,115,0,0,857,858,5,99,0,0,
- 858,859,5,111,0,0,859,860,5,114,0,0,860,861,5,108,0,0,861,862,5,105,0,
- 0,862,863,5,98,0,0,863,50,1,0,0,0,864,865,5,46,0,0,865,866,5,108,0,0,866,
- 867,5,97,0,0,867,868,5,110,0,0,868,869,5,103,0,0,869,870,5,117,0,0,870,
- 871,5,97,0,0,871,872,5,103,0,0,872,873,5,101,0,0,873,52,1,0,0,0,874,875,
- 5,44,0,0,875,54,1,0,0,0,876,877,5,46,0,0,877,878,5,116,0,0,878,879,5,121,
- 0,0,879,880,5,112,0,0,880,881,5,101,0,0,881,882,5,108,0,0,882,883,5,105,
- 0,0,883,884,5,115,0,0,884,885,5,116,0,0,885,56,1,0,0,0,886,887,5,40,0,
- 0,887,58,1,0,0,0,888,889,5,41,0,0,889,60,1,0,0,0,890,891,5,59,0,0,891,
- 62,1,0,0,0,892,893,5,46,0,0,893,894,5,116,0,0,894,895,5,121,0,0,895,896,
- 5,112,0,0,896,897,5,101,0,0,897,898,5,100,0,0,898,899,5,101,0,0,899,900,
- 5,102,0,0,900,64,1,0,0,0,901,902,5,97,0,0,902,903,5,115,0,0,903,66,1,0,
- 0,0,904,905,5,46,0,0,905,906,5,99,0,0,906,907,5,117,0,0,907,908,5,115,
- 0,0,908,909,5,116,0,0,909,910,5,111,0,0,910,911,5,109,0,0,911,68,1,0,0,
- 0,912,913,5,61,0,0,913,70,1,0,0,0,914,915,5,102,0,0,915,916,5,105,0,0,
- 916,917,5,101,0,0,917,918,5,108,0,0,918,919,5,100,0,0,919,72,1,0,0,0,920,
- 921,5,112,0,0,921,922,5,114,0,0,922,923,5,111,0,0,923,924,5,112,0,0,924,
- 925,5,101,0,0,925,926,5,114,0,0,926,927,5,116,0,0,927,928,5,121,0,0,928,
- 74,1,0,0,0,929,930,5,99,0,0,930,931,5,108,0,0,931,932,5,97,0,0,932,933,
- 5,115,0,0,933,934,5,115,0,0,934,76,1,0,0,0,935,936,5,101,0,0,936,937,5,
- 120,0,0,937,938,5,116,0,0,938,939,5,101,0,0,939,940,5,114,0,0,940,941,
- 5,110,0,0,941,78,1,0,0,0,942,943,5,46,0,0,943,944,5,118,0,0,944,945,5,
- 116,0,0,945,946,5,102,0,0,946,947,5,105,0,0,947,948,5,120,0,0,948,949,
- 5,117,0,0,949,950,5,112,0,0,950,80,1,0,0,0,951,952,5,91,0,0,952,82,1,0,
- 0,0,953,954,5,93,0,0,954,84,1,0,0,0,955,956,5,97,0,0,956,957,5,116,0,0,
- 957,86,1,0,0,0,958,959,5,102,0,0,959,960,5,114,0,0,960,961,5,111,0,0,961,
- 962,5,109,0,0,962,963,5,117,0,0,963,964,5,110,0,0,964,965,5,109,0,0,965,
- 966,5,97,0,0,966,967,5,110,0,0,967,968,5,97,0,0,968,969,5,103,0,0,969,
- 970,5,101,0,0,970,971,5,100,0,0,971,88,1,0,0,0,972,973,5,99,0,0,973,974,
- 5,97,0,0,974,975,5,108,0,0,975,976,5,108,0,0,976,977,5,109,0,0,977,978,
- 5,111,0,0,978,979,5,115,0,0,979,980,5,116,0,0,980,981,5,100,0,0,981,982,
- 5,101,0,0,982,983,5,114,0,0,983,984,5,105,0,0,984,985,5,118,0,0,985,986,
- 5,101,0,0,986,987,5,100,0,0,987,90,1,0,0,0,988,989,5,114,0,0,989,990,5,
- 101,0,0,990,991,5,116,0,0,991,992,5,97,0,0,992,993,5,105,0,0,993,994,5,
- 110,0,0,994,995,5,97,0,0,995,996,5,112,0,0,996,997,5,112,0,0,997,998,5,
- 100,0,0,998,999,5,111,0,0,999,1000,5,109,0,0,1000,1001,5,97,0,0,1001,1002,
- 5,105,0,0,1002,1003,5,110,0,0,1003,92,1,0,0,0,1004,1005,5,46,0,0,1005,
- 1006,5,118,0,0,1006,1007,5,116,0,0,1007,1008,5,97,0,0,1008,1009,5,98,0,
- 0,1009,1010,5,108,0,0,1010,1011,5,101,0,0,1011,94,1,0,0,0,1012,1013,5,
- 46,0,0,1013,1014,5,110,0,0,1014,1015,5,97,0,0,1015,1016,5,109,0,0,1016,
- 1017,5,101,0,0,1017,1018,5,115,0,0,1018,1019,5,112,0,0,1019,1020,5,97,
- 0,0,1020,1021,5,99,0,0,1021,1022,5,101,0,0,1022,96,1,0,0,0,1023,1024,5,
- 46,0,0,1024,1025,5,99,0,0,1025,1026,5,108,0,0,1026,1027,5,97,0,0,1027,
- 1028,5,115,0,0,1028,1029,5,115,0,0,1029,98,1,0,0,0,1030,1031,5,112,0,0,
- 1031,1032,5,117,0,0,1032,1033,5,98,0,0,1033,1034,5,108,0,0,1034,1035,5,
- 105,0,0,1035,1036,5,99,0,0,1036,100,1,0,0,0,1037,1038,5,112,0,0,1038,1039,
- 5,114,0,0,1039,1040,5,105,0,0,1040,1041,5,118,0,0,1041,1042,5,97,0,0,1042,
- 1043,5,116,0,0,1043,1044,5,101,0,0,1044,102,1,0,0,0,1045,1046,5,115,0,
- 0,1046,1047,5,101,0,0,1047,1048,5,97,0,0,1048,1049,5,108,0,0,1049,1050,
- 5,101,0,0,1050,1051,5,100,0,0,1051,104,1,0,0,0,1052,1053,5,97,0,0,1053,
- 1054,5,98,0,0,1054,1055,5,115,0,0,1055,1056,5,116,0,0,1056,1057,5,114,
- 0,0,1057,1058,5,97,0,0,1058,1059,5,99,0,0,1059,1060,5,116,0,0,1060,106,
- 1,0,0,0,1061,1062,5,97,0,0,1062,1063,5,117,0,0,1063,1064,5,116,0,0,1064,
- 1065,5,111,0,0,1065,108,1,0,0,0,1066,1067,5,115,0,0,1067,1068,5,101,0,
- 0,1068,1069,5,113,0,0,1069,1070,5,117,0,0,1070,1071,5,101,0,0,1071,1072,
- 5,110,0,0,1072,1073,5,116,0,0,1073,1074,5,105,0,0,1074,1075,5,97,0,0,1075,
- 1076,5,108,0,0,1076,110,1,0,0,0,1077,1078,5,117,0,0,1078,1079,5,110,0,
- 0,1079,1080,5,105,0,0,1080,1081,5,99,0,0,1081,1082,5,111,0,0,1082,1083,
- 5,100,0,0,1083,1084,5,101,0,0,1084,112,1,0,0,0,1085,1086,5,97,0,0,1086,
- 1087,5,117,0,0,1087,1088,5,116,0,0,1088,1089,5,111,0,0,1089,1090,5,99,
- 0,0,1090,1091,5,104,0,0,1091,1092,5,97,0,0,1092,1093,5,114,0,0,1093,114,
- 1,0,0,0,1094,1095,5,105,0,0,1095,1096,5,109,0,0,1096,1097,5,112,0,0,1097,
- 1098,5,111,0,0,1098,1099,5,114,0,0,1099,1100,5,116,0,0,1100,116,1,0,0,
- 0,1101,1102,5,115,0,0,1102,1103,5,101,0,0,1103,1104,5,114,0,0,1104,1105,
- 5,105,0,0,1105,1106,5,97,0,0,1106,1107,5,108,0,0,1107,1108,5,105,0,0,1108,
- 1109,5,122,0,0,1109,1110,5,97,0,0,1110,1111,5,98,0,0,1111,1112,5,108,0,
- 0,1112,1113,5,101,0,0,1113,118,1,0,0,0,1114,1115,5,119,0,0,1115,1116,5,
- 105,0,0,1116,1117,5,110,0,0,1117,1118,5,100,0,0,1118,1119,5,111,0,0,1119,
- 1120,5,119,0,0,1120,1121,5,115,0,0,1121,1122,5,114,0,0,1122,1123,5,117,
- 0,0,1123,1124,5,110,0,0,1124,1125,5,116,0,0,1125,1126,5,105,0,0,1126,1127,
- 5,109,0,0,1127,1128,5,101,0,0,1128,120,1,0,0,0,1129,1130,5,110,0,0,1130,
- 1131,5,101,0,0,1131,1132,5,115,0,0,1132,1133,5,116,0,0,1133,1134,5,101,
- 0,0,1134,1135,5,100,0,0,1135,122,1,0,0,0,1136,1137,5,102,0,0,1137,1138,
- 5,97,0,0,1138,1139,5,109,0,0,1139,1140,5,105,0,0,1140,1141,5,108,0,0,1141,
- 1142,5,121,0,0,1142,124,1,0,0,0,1143,1144,5,97,0,0,1144,1145,5,115,0,0,
- 1145,1146,5,115,0,0,1146,1147,5,101,0,0,1147,1148,5,109,0,0,1148,1149,
- 5,98,0,0,1149,1150,5,108,0,0,1150,1151,5,121,0,0,1151,126,1,0,0,0,1152,
- 1153,5,102,0,0,1153,1154,5,97,0,0,1154,1155,5,109,0,0,1155,1156,5,97,0,
- 0,1156,1157,5,110,0,0,1157,1158,5,100,0,0,1158,1159,5,97,0,0,1159,1160,
- 5,115,0,0,1160,1161,5,115,0,0,1161,1162,5,101,0,0,1162,1163,5,109,0,0,
- 1163,128,1,0,0,0,1164,1165,5,102,0,0,1165,1166,5,97,0,0,1166,1167,5,109,
- 0,0,1167,1168,5,111,0,0,1168,1169,5,114,0,0,1169,1170,5,97,0,0,1170,1171,
- 5,115,0,0,1171,1172,5,115,0,0,1172,1173,5,101,0,0,1173,1174,5,109,0,0,
- 1174,130,1,0,0,0,1175,1176,5,98,0,0,1176,1177,5,101,0,0,1177,1178,5,102,
- 0,0,1178,1179,5,111,0,0,1179,1180,5,114,0,0,1180,1181,5,101,0,0,1181,1182,
- 5,102,0,0,1182,1183,5,105,0,0,1183,1184,5,101,0,0,1184,1185,5,108,0,0,
- 1185,1186,5,100,0,0,1186,1187,5,105,0,0,1187,1188,5,110,0,0,1188,1189,
- 5,105,0,0,1189,1190,5,116,0,0,1190,132,1,0,0,0,1191,1192,5,115,0,0,1192,
- 1193,5,112,0,0,1193,1194,5,101,0,0,1194,1195,5,99,0,0,1195,1196,5,105,
- 0,0,1196,1197,5,97,0,0,1197,1198,5,108,0,0,1198,1199,5,110,0,0,1199,1200,
- 5,97,0,0,1200,1201,5,109,0,0,1201,1202,5,101,0,0,1202,134,1,0,0,0,1203,
- 1204,5,114,0,0,1204,1205,5,116,0,0,1205,1206,5,115,0,0,1206,1207,5,112,
- 0,0,1207,1208,5,101,0,0,1208,1209,5,99,0,0,1209,1210,5,105,0,0,1210,1211,
- 5,97,0,0,1211,1212,5,108,0,0,1212,1213,5,110,0,0,1213,1214,5,97,0,0,1214,
- 1215,5,109,0,0,1215,1216,5,101,0,0,1216,136,1,0,0,0,1217,1218,5,102,0,
- 0,1218,1219,5,108,0,0,1219,1220,5,97,0,0,1220,1221,5,103,0,0,1221,1222,
- 5,115,0,0,1222,138,1,0,0,0,1223,1224,5,101,0,0,1224,1225,5,120,0,0,1225,
- 1226,5,116,0,0,1226,1227,5,101,0,0,1227,1228,5,110,0,0,1228,1229,5,100,
- 0,0,1229,1230,5,115,0,0,1230,140,1,0,0,0,1231,1232,5,105,0,0,1232,1233,
- 5,109,0,0,1233,1234,5,112,0,0,1234,1235,5,108,0,0,1235,1236,5,101,0,0,
- 1236,1237,5,109,0,0,1237,1238,5,101,0,0,1238,1239,5,110,0,0,1239,1240,
- 5,116,0,0,1240,1241,5,115,0,0,1241,142,1,0,0,0,1242,1243,5,46,0,0,1243,
- 1244,5,108,0,0,1244,1245,5,105,0,0,1245,1246,5,110,0,0,1246,1247,5,101,
- 0,0,1247,144,1,0,0,0,1248,1249,5,35,0,0,1249,1250,5,108,0,0,1250,1251,
- 5,105,0,0,1251,1252,5,110,0,0,1252,1253,5,101,0,0,1253,146,1,0,0,0,1254,
- 1255,5,58,0,0,1255,148,1,0,0,0,1256,1257,5,110,0,0,1257,1258,5,111,0,0,
- 1258,1259,5,109,0,0,1259,1260,5,101,0,0,1260,1261,5,116,0,0,1261,1262,
- 5,97,0,0,1262,1263,5,100,0,0,1263,1264,5,97,0,0,1264,1265,5,116,0,0,1265,
- 1266,5,97,0,0,1266,150,1,0,0,0,1267,1268,5,114,0,0,1268,1269,5,101,0,0,
- 1269,1270,5,116,0,0,1270,1271,5,97,0,0,1271,1272,5,114,0,0,1272,1273,5,
- 103,0,0,1273,1274,5,101,0,0,1274,1275,5,116,0,0,1275,1276,5,97,0,0,1276,
- 1277,5,98,0,0,1277,1278,5,108,0,0,1278,1279,5,101,0,0,1279,152,1,0,0,0,
- 1280,1281,5,110,0,0,1281,1282,5,111,0,0,1282,1283,5,112,0,0,1283,1284,
- 5,108,0,0,1284,1285,5,97,0,0,1285,1286,5,116,0,0,1286,1287,5,102,0,0,1287,
- 1288,5,111,0,0,1288,1289,5,114,0,0,1289,1290,5,109,0,0,1290,154,1,0,0,
- 0,1291,1292,5,108,0,0,1292,1293,5,101,0,0,1293,1294,5,103,0,0,1294,1295,
- 5,97,0,0,1295,1296,5,99,0,0,1296,1297,5,121,0,0,1297,1298,5,32,0,0,1298,
- 1299,5,108,0,0,1299,1300,5,105,0,0,1300,1301,5,98,0,0,1301,1302,5,114,
- 0,0,1302,1303,5,97,0,0,1303,1304,5,114,0,0,1304,1305,5,121,0,0,1305,156,
- 1,0,0,0,1306,1307,5,120,0,0,1307,1308,5,56,0,0,1308,1309,5,54,0,0,1309,
- 158,1,0,0,0,1310,1311,5,97,0,0,1311,1312,5,109,0,0,1312,1313,5,100,0,0,
- 1313,1314,5,54,0,0,1314,1315,5,52,0,0,1315,160,1,0,0,0,1316,1317,5,97,
- 0,0,1317,1318,5,114,0,0,1318,1319,5,109,0,0,1319,162,1,0,0,0,1320,1321,
- 5,97,0,0,1321,1322,5,114,0,0,1322,1323,5,109,0,0,1323,1324,5,54,0,0,1324,
- 1325,5,52,0,0,1325,164,1,0,0,0,1326,1327,5,98,0,0,1327,1328,5,121,0,0,
- 1328,1329,5,116,0,0,1329,1330,5,101,0,0,1330,1331,5,97,0,0,1331,1332,5,
- 114,0,0,1332,1333,5,114,0,0,1333,1334,5,97,0,0,1334,1335,5,121,0,0,1335,
- 166,1,0,0,0,1336,1337,5,40,0,0,1337,1338,5,41,0,0,1338,168,1,0,0,0,1339,
- 1340,5,60,0,0,1340,170,1,0,0,0,1341,1342,5,62,0,0,1342,172,1,0,0,0,1343,
- 1344,5,47,0,0,1344,174,1,0,0,0,1345,1346,5,97,0,0,1346,1347,5,108,0,0,
- 1347,1348,5,103,0,0,1348,1349,5,111,0,0,1349,1350,5,114,0,0,1350,1351,
- 5,105,0,0,1351,1352,5,116,0,0,1352,1353,5,104,0,0,1353,1354,5,109,0,0,
- 1354,176,1,0,0,0,1355,1356,5,105,0,0,1356,1357,5,105,0,0,1357,1358,5,100,
- 0,0,1358,1359,5,112,0,0,1359,1360,5,97,0,0,1360,1361,5,114,0,0,1361,1362,
- 5,97,0,0,1362,1363,5,109,0,0,1363,178,1,0,0,0,1364,1365,5,112,0,0,1365,
- 1366,5,105,0,0,1366,1367,5,110,0,0,1367,1368,5,110,0,0,1368,1369,5,101,
- 0,0,1369,1370,5,100,0,0,1370,180,1,0,0,0,1371,1372,5,109,0,0,1372,1373,
- 5,111,0,0,1373,1374,5,100,0,0,1374,1375,5,114,0,0,1375,1376,5,101,0,0,
- 1376,1377,5,113,0,0,1377,182,1,0,0,0,1378,1379,5,109,0,0,1379,1380,5,111,
- 0,0,1380,1381,5,100,0,0,1381,1382,5,111,0,0,1382,1383,5,112,0,0,1383,1384,
- 5,116,0,0,1384,184,1,0,0,0,1385,1386,5,117,0,0,1386,1387,5,110,0,0,1387,
- 1388,5,115,0,0,1388,1389,5,105,0,0,1389,1390,5,103,0,0,1390,1391,5,110,
- 0,0,1391,1392,5,101,0,0,1392,1393,5,100,0,0,1393,186,1,0,0,0,1394,1395,
- 5,116,0,0,1395,1396,5,114,0,0,1396,1397,5,117,0,0,1397,1398,5,101,0,0,
- 1398,188,1,0,0,0,1399,1400,5,102,0,0,1400,1401,5,97,0,0,1401,1402,5,108,
- 0,0,1402,1403,5,115,0,0,1403,1404,5,101,0,0,1404,190,1,0,0,0,1405,1406,
- 5,114,0,0,1406,1407,5,101,0,0,1407,1408,5,113,0,0,1408,1409,5,117,0,0,
- 1409,1410,5,101,0,0,1410,1411,5,115,0,0,1411,1412,5,116,0,0,1412,192,1,
- 0,0,0,1413,1414,5,100,0,0,1414,1415,5,101,0,0,1415,1416,5,109,0,0,1416,
- 1417,5,97,0,0,1417,1418,5,110,0,0,1418,1419,5,100,0,0,1419,194,1,0,0,0,
- 1420,1421,5,97,0,0,1421,1422,5,115,0,0,1422,1423,5,115,0,0,1423,1424,5,
- 101,0,0,1424,1425,5,114,0,0,1425,1426,5,116,0,0,1426,196,1,0,0,0,1427,
- 1428,5,100,0,0,1428,1429,5,101,0,0,1429,1430,5,110,0,0,1430,1431,5,121,
- 0,0,1431,198,1,0,0,0,1432,1433,5,112,0,0,1433,1434,5,101,0,0,1434,1435,
- 5,114,0,0,1435,1436,5,109,0,0,1436,1437,5,105,0,0,1437,1438,5,116,0,0,
- 1438,1439,5,111,0,0,1439,1440,5,110,0,0,1440,1441,5,108,0,0,1441,1442,
- 5,121,0,0,1442,200,1,0,0,0,1443,1444,5,108,0,0,1444,1445,5,105,0,0,1445,
- 1446,5,110,0,0,1446,1447,5,107,0,0,1447,1448,5,99,0,0,1448,1449,5,104,
- 0,0,1449,1450,5,101,0,0,1450,1451,5,99,0,0,1451,1452,5,107,0,0,1452,202,
- 1,0,0,0,1453,1454,5,105,0,0,1454,1455,5,110,0,0,1455,1456,5,104,0,0,1456,
- 1457,5,101,0,0,1457,1458,5,114,0,0,1458,1459,5,105,0,0,1459,1460,5,116,
- 0,0,1460,1461,5,99,0,0,1461,1462,5,104,0,0,1462,1463,5,101,0,0,1463,1464,
- 5,99,0,0,1464,1465,5,107,0,0,1465,204,1,0,0,0,1466,1467,5,114,0,0,1467,
- 1468,5,101,0,0,1468,1469,5,113,0,0,1469,1470,5,109,0,0,1470,1471,5,105,
- 0,0,1471,1472,5,110,0,0,1472,206,1,0,0,0,1473,1474,5,114,0,0,1474,1475,
- 5,101,0,0,1475,1476,5,113,0,0,1476,1477,5,111,0,0,1477,1478,5,112,0,0,
- 1478,1479,5,116,0,0,1479,208,1,0,0,0,1480,1481,5,114,0,0,1481,1482,5,101,
- 0,0,1482,1483,5,113,0,0,1483,1484,5,114,0,0,1484,1485,5,101,0,0,1485,1486,
- 5,102,0,0,1486,1487,5,117,0,0,1487,1488,5,115,0,0,1488,1489,5,101,0,0,
- 1489,210,1,0,0,0,1490,1491,5,112,0,0,1491,1492,5,114,0,0,1492,1493,5,101,
- 0,0,1493,1494,5,106,0,0,1494,1495,5,105,0,0,1495,1496,5,116,0,0,1496,1497,
- 5,103,0,0,1497,1498,5,114,0,0,1498,1499,5,97,0,0,1499,1500,5,110,0,0,1500,
- 1501,5,116,0,0,1501,212,1,0,0,0,1502,1503,5,112,0,0,1503,1504,5,114,0,
- 0,1504,1505,5,101,0,0,1505,1506,5,106,0,0,1506,1507,5,105,0,0,1507,1508,
- 5,116,0,0,1508,1509,5,100,0,0,1509,1510,5,101,0,0,1510,1511,5,110,0,0,
- 1511,1512,5,121,0,0,1512,214,1,0,0,0,1513,1514,5,110,0,0,1514,1515,5,111,
- 0,0,1515,1516,5,110,0,0,1516,1517,5,99,0,0,1517,1518,5,97,0,0,1518,1519,
- 5,115,0,0,1519,1520,5,100,0,0,1520,1521,5,101,0,0,1521,1522,5,109,0,0,
- 1522,1523,5,97,0,0,1523,1524,5,110,0,0,1524,1525,5,100,0,0,1525,216,1,
- 0,0,0,1526,1527,5,110,0,0,1527,1528,5,111,0,0,1528,1529,5,110,0,0,1529,
- 1530,5,99,0,0,1530,1531,5,97,0,0,1531,1532,5,115,0,0,1532,1533,5,108,0,
- 0,1533,1534,5,105,0,0,1534,1535,5,110,0,0,1535,1536,5,107,0,0,1536,1537,
- 5,100,0,0,1537,1538,5,101,0,0,1538,1539,5,109,0,0,1539,1540,5,97,0,0,1540,
- 1541,5,110,0,0,1541,1542,5,100,0,0,1542,218,1,0,0,0,1543,1544,5,110,0,
- 0,1544,1545,5,111,0,0,1545,1546,5,110,0,0,1546,1547,5,99,0,0,1547,1548,
- 5,97,0,0,1548,1549,5,115,0,0,1549,1550,5,105,0,0,1550,1551,5,110,0,0,1551,
- 1552,5,104,0,0,1552,1553,5,101,0,0,1553,1554,5,114,0,0,1554,1555,5,105,
- 0,0,1555,1556,5,116,0,0,1556,1557,5,97,0,0,1557,1558,5,110,0,0,1558,1559,
- 5,99,0,0,1559,1560,5,101,0,0,1560,220,1,0,0,0,1561,1562,5,99,0,0,1562,
- 1563,5,97,0,0,1563,1564,5,108,0,0,1564,1565,5,108,0,0,1565,1566,5,99,0,
- 0,1566,1567,5,111,0,0,1567,1568,5,110,0,0,1568,1569,5,118,0,0,1569,222,
- 1,0,0,0,1570,1571,5,109,0,0,1571,1572,5,100,0,0,1572,1573,5,116,0,0,1573,
- 1574,5,111,0,0,1574,1575,5,107,0,0,1575,1576,5,101,0,0,1576,1577,5,110,
- 0,0,1577,224,1,0,0,0,1578,1579,5,45,0,0,1579,226,1,0,0,0,1580,1581,5,98,
- 0,0,1581,1582,5,121,0,0,1582,1583,5,114,0,0,1583,1584,5,101,0,0,1584,1585,
- 5,102,0,0,1585,1586,5,108,0,0,1586,1587,5,105,0,0,1587,1588,5,107,0,0,
- 1588,1589,5,101,0,0,1589,228,1,0,0,0,1590,1591,5,46,0,0,1591,1592,5,99,
- 0,0,1592,1593,5,116,0,0,1593,1594,5,111,0,0,1594,1595,5,114,0,0,1595,230,
- 1,0,0,0,1596,1597,5,46,0,0,1597,1598,5,115,0,0,1598,1599,5,105,0,0,1599,
- 1600,5,122,0,0,1600,1601,5,101,0,0,1601,232,1,0,0,0,1602,1603,5,46,0,0,
- 1603,1604,5,112,0,0,1604,1605,5,97,0,0,1605,1606,5,99,0,0,1606,1607,5,
- 107,0,0,1607,234,1,0,0,0,1608,1609,5,119,0,0,1609,1610,5,105,0,0,1610,
- 1611,5,116,0,0,1611,1612,5,104,0,0,1612,236,1,0,0,0,1613,1614,5,46,0,0,
- 1614,1615,5,105,0,0,1615,1616,5,110,0,0,1616,1617,5,116,0,0,1617,1618,
- 5,101,0,0,1618,1619,5,114,0,0,1619,1620,5,102,0,0,1620,1621,5,97,0,0,1621,
- 1622,5,99,0,0,1622,1623,5,101,0,0,1623,1624,5,105,0,0,1624,1625,5,109,
- 0,0,1625,1626,5,112,0,0,1626,1627,5,108,0,0,1627,238,1,0,0,0,1628,1629,
- 5,46,0,0,1629,1630,5,102,0,0,1630,1631,5,105,0,0,1631,1632,5,101,0,0,1632,
- 1633,5,108,0,0,1633,1634,5,100,0,0,1634,240,1,0,0,0,1635,1636,5,109,0,
- 0,1636,1637,5,97,0,0,1637,1638,5,114,0,0,1638,1639,5,115,0,0,1639,1640,
- 5,104,0,0,1640,1641,5,97,0,0,1641,1642,5,108,0,0,1642,242,1,0,0,0,1643,
- 1644,5,115,0,0,1644,1645,5,116,0,0,1645,1646,5,97,0,0,1646,1647,5,116,
- 0,0,1647,1648,5,105,0,0,1648,1649,5,99,0,0,1649,244,1,0,0,0,1650,1651,
- 5,105,0,0,1651,1652,5,110,0,0,1652,1653,5,105,0,0,1653,1654,5,116,0,0,
- 1654,1655,5,111,0,0,1655,1656,5,110,0,0,1656,1657,5,108,0,0,1657,1658,
- 5,121,0,0,1658,246,1,0,0,0,1659,1660,5,112,0,0,1660,1661,5,114,0,0,1661,
- 1662,5,105,0,0,1662,1663,5,118,0,0,1663,1664,5,97,0,0,1664,1665,5,116,
- 0,0,1665,1666,5,101,0,0,1666,1667,5,115,0,0,1667,1668,5,99,0,0,1668,1669,
- 5,111,0,0,1669,1670,5,112,0,0,1670,1671,5,101,0,0,1671,248,1,0,0,0,1672,
- 1673,5,108,0,0,1673,1674,5,105,0,0,1674,1675,5,116,0,0,1675,1676,5,101,
- 0,0,1676,1677,5,114,0,0,1677,1678,5,97,0,0,1678,1679,5,108,0,0,1679,250,
- 1,0,0,0,1680,1681,5,110,0,0,1681,1682,5,111,0,0,1682,1683,5,116,0,0,1683,
- 1684,5,115,0,0,1684,1685,5,101,0,0,1685,1686,5,114,0,0,1686,1687,5,105,
- 0,0,1687,1688,5,97,0,0,1688,1689,5,108,0,0,1689,1690,5,105,0,0,1690,1691,
- 5,122,0,0,1691,1692,5,101,0,0,1692,1693,5,100,0,0,1693,252,1,0,0,0,1694,
- 1695,5,118,0,0,1695,1696,5,111,0,0,1696,1697,5,108,0,0,1697,1698,5,97,
- 0,0,1698,1699,5,116,0,0,1699,1700,5,105,0,0,1700,1701,5,108,0,0,1701,1702,
- 5,101,0,0,1702,254,1,0,0,0,1703,1704,5,46,0,0,1704,1705,5,101,0,0,1705,
- 1706,5,118,0,0,1706,1707,5,101,0,0,1707,1708,5,110,0,0,1708,1709,5,116,
- 0,0,1709,256,1,0,0,0,1710,1711,5,46,0,0,1711,1712,5,97,0,0,1712,1713,5,
- 100,0,0,1713,1714,5,100,0,0,1714,1715,5,111,0,0,1715,1716,5,110,0,0,1716,
- 258,1,0,0,0,1717,1718,5,46,0,0,1718,1719,5,114,0,0,1719,1720,5,101,0,0,
- 1720,1721,5,109,0,0,1721,1722,5,111,0,0,1722,1723,5,118,0,0,1723,1724,
- 5,101,0,0,1724,1725,5,111,0,0,1725,1726,5,110,0,0,1726,260,1,0,0,0,1727,
- 1728,5,46,0,0,1728,1729,5,102,0,0,1729,1730,5,105,0,0,1730,1731,5,114,
- 0,0,1731,1732,5,101,0,0,1732,262,1,0,0,0,1733,1734,5,46,0,0,1734,1735,
- 5,111,0,0,1735,1736,5,116,0,0,1736,1737,5,104,0,0,1737,1738,5,101,0,0,
- 1738,1739,5,114,0,0,1739,264,1,0,0,0,1740,1741,5,46,0,0,1741,1742,5,112,
- 0,0,1742,1743,5,114,0,0,1743,1744,5,111,0,0,1744,1745,5,112,0,0,1745,1746,
- 5,101,0,0,1746,1747,5,114,0,0,1747,1748,5,116,0,0,1748,1749,5,121,0,0,
- 1749,266,1,0,0,0,1750,1751,5,46,0,0,1751,1752,5,115,0,0,1752,1753,5,101,
- 0,0,1753,1754,5,116,0,0,1754,268,1,0,0,0,1755,1756,5,46,0,0,1756,1757,
- 5,103,0,0,1757,1758,5,101,0,0,1758,1759,5,116,0,0,1759,270,1,0,0,0,1760,
- 1761,5,105,0,0,1761,1762,5,110,0,0,1762,272,1,0,0,0,1763,1764,5,111,0,
- 0,1764,1765,5,117,0,0,1765,1766,5,116,0,0,1766,274,1,0,0,0,1767,1768,5,
- 111,0,0,1768,1769,5,112,0,0,1769,1770,5,116,0,0,1770,276,1,0,0,0,1771,
- 1772,5,46,0,0,1772,1773,5,109,0,0,1773,1774,5,101,0,0,1774,1775,5,116,
- 0,0,1775,1776,5,104,0,0,1776,1777,5,111,0,0,1777,1778,5,100,0,0,1778,278,
- 1,0,0,0,1779,1780,5,102,0,0,1780,1781,5,105,0,0,1781,1782,5,110,0,0,1782,
- 1783,5,97,0,0,1783,1784,5,108,0,0,1784,280,1,0,0,0,1785,1786,5,118,0,0,
- 1786,1787,5,105,0,0,1787,1788,5,114,0,0,1788,1789,5,116,0,0,1789,1790,
- 5,117,0,0,1790,1791,5,97,0,0,1791,1792,5,108,0,0,1792,282,1,0,0,0,1793,
- 1794,5,115,0,0,1794,1795,5,116,0,0,1795,1796,5,114,0,0,1796,1797,5,105,
- 0,0,1797,1798,5,99,0,0,1798,1799,5,116,0,0,1799,284,1,0,0,0,1800,1801,
- 5,104,0,0,1801,1802,5,105,0,0,1802,1803,5,100,0,0,1803,1804,5,101,0,0,
- 1804,1805,5,98,0,0,1805,1806,5,121,0,0,1806,1807,5,115,0,0,1807,1808,5,
- 105,0,0,1808,1809,5,103,0,0,1809,286,1,0,0,0,1810,1811,5,110,0,0,1811,
- 1812,5,101,0,0,1812,1813,5,119,0,0,1813,1814,5,115,0,0,1814,1815,5,108,
- 0,0,1815,1816,5,111,0,0,1816,1817,5,116,0,0,1817,288,1,0,0,0,1818,1819,
- 5,117,0,0,1819,1820,5,110,0,0,1820,1821,5,109,0,0,1821,1822,5,97,0,0,1822,
- 1823,5,110,0,0,1823,1824,5,97,0,0,1824,1825,5,103,0,0,1825,1826,5,101,
- 0,0,1826,1827,5,100,0,0,1827,1828,5,101,0,0,1828,1829,5,120,0,0,1829,1830,
- 5,112,0,0,1830,290,1,0,0,0,1831,1832,5,114,0,0,1832,1833,5,101,0,0,1833,
- 1834,5,113,0,0,1834,1835,5,115,0,0,1835,1836,5,101,0,0,1836,1837,5,99,
- 0,0,1837,1838,5,111,0,0,1838,1839,5,98,0,0,1839,1840,5,106,0,0,1840,292,
- 1,0,0,0,1841,1842,5,112,0,0,1842,1843,5,105,0,0,1843,1844,5,110,0,0,1844,
- 1845,5,118,0,0,1845,1846,5,111,0,0,1846,1847,5,107,0,0,1847,1848,5,101,
- 0,0,1848,1849,5,105,0,0,1849,1850,5,109,0,0,1850,1851,5,112,0,0,1851,1852,
- 5,108,0,0,1852,294,1,0,0,0,1853,1854,5,110,0,0,1854,1855,5,111,0,0,1855,
- 1856,5,109,0,0,1856,1857,5,97,0,0,1857,1858,5,110,0,0,1858,1859,5,103,
- 0,0,1859,1860,5,108,0,0,1860,1861,5,101,0,0,1861,296,1,0,0,0,1862,1863,
- 5,108,0,0,1863,1864,5,97,0,0,1864,1865,5,115,0,0,1865,1866,5,116,0,0,1866,
- 1867,5,101,0,0,1867,1868,5,114,0,0,1868,1869,5,114,0,0,1869,298,1,0,0,
- 0,1870,1871,5,119,0,0,1871,1872,5,105,0,0,1872,1873,5,110,0,0,1873,1874,
- 5,97,0,0,1874,1875,5,112,0,0,1875,1876,5,105,0,0,1876,300,1,0,0,0,1877,
- 1878,5,98,0,0,1878,1879,5,101,0,0,1879,1880,5,115,0,0,1880,1881,5,116,
- 0,0,1881,1882,5,102,0,0,1882,1883,5,105,0,0,1883,1884,5,116,0,0,1884,302,
- 1,0,0,0,1885,1886,5,111,0,0,1886,1887,5,110,0,0,1887,304,1,0,0,0,1888,
- 1889,5,111,0,0,1889,1890,5,102,0,0,1890,1891,5,102,0,0,1891,306,1,0,0,
- 0,1892,1893,5,99,0,0,1893,1894,5,104,0,0,1894,1895,5,97,0,0,1895,1896,
- 5,114,0,0,1896,1897,5,109,0,0,1897,1898,5,97,0,0,1898,1899,5,112,0,0,1899,
- 1900,5,101,0,0,1900,1901,5,114,0,0,1901,1902,5,114,0,0,1902,1903,5,111,
- 0,0,1903,1904,5,114,0,0,1904,308,1,0,0,0,1905,1906,5,46,0,0,1906,1907,
- 5,99,0,0,1907,1908,5,99,0,0,1908,1909,5,116,0,0,1909,1910,5,111,0,0,1910,
- 1911,5,114,0,0,1911,310,1,0,0,0,1912,1913,5,105,0,0,1913,1914,5,108,0,
- 0,1914,312,1,0,0,0,1915,1916,5,105,0,0,1916,1917,5,110,0,0,1917,1918,5,
- 105,0,0,1918,1919,5,116,0,0,1919,314,1,0,0,0,1920,1921,5,46,0,0,1921,1922,
- 5,116,0,0,1922,1923,5,114,0,0,1923,1924,5,121,0,0,1924,316,1,0,0,0,1925,
- 1926,5,116,0,0,1926,1927,5,111,0,0,1927,318,1,0,0,0,1928,1929,5,102,0,
- 0,1929,1930,5,105,0,0,1930,1931,5,108,0,0,1931,1932,5,116,0,0,1932,1933,
- 5,101,0,0,1933,1934,5,114,0,0,1934,320,1,0,0,0,1935,1936,5,99,0,0,1936,
- 1937,5,97,0,0,1937,1938,5,116,0,0,1938,1939,5,99,0,0,1939,1940,5,104,0,
- 0,1940,322,1,0,0,0,1941,1942,5,102,0,0,1942,1943,5,105,0,0,1943,1944,5,
- 110,0,0,1944,1945,5,97,0,0,1945,1946,5,108,0,0,1946,1947,5,108,0,0,1947,
- 1948,5,121,0,0,1948,324,1,0,0,0,1949,1950,5,102,0,0,1950,1951,5,97,0,0,
- 1951,1952,5,117,0,0,1952,1953,5,108,0,0,1953,1954,5,116,0,0,1954,326,1,
- 0,0,0,1955,1956,5,104,0,0,1956,1957,5,97,0,0,1957,1958,5,110,0,0,1958,
- 1959,5,100,0,0,1959,1960,5,108,0,0,1960,1961,5,101,0,0,1961,1962,5,114,
- 0,0,1962,328,1,0,0,0,1963,1964,5,46,0,0,1964,1965,5,100,0,0,1965,1966,
- 5,97,0,0,1966,1967,5,116,0,0,1967,1968,5,97,0,0,1968,330,1,0,0,0,1969,
- 1970,5,116,0,0,1970,1971,5,108,0,0,1971,1972,5,115,0,0,1972,332,1,0,0,
- 0,1973,1974,5,46,0,0,1974,1975,5,112,0,0,1975,1976,5,117,0,0,1976,1977,
- 5,98,0,0,1977,1978,5,108,0,0,1978,1979,5,105,0,0,1979,1980,5,99,0,0,1980,
- 1981,5,75,0,0,1981,1982,5,101,0,0,1982,1983,5,121,0,0,1983,334,1,0,0,0,
- 1984,1985,5,46,0,0,1985,1986,5,118,0,0,1986,1987,5,101,0,0,1987,1988,5,
- 114,0,0,1988,336,1,0,0,0,1989,1990,5,46,0,0,1990,1991,5,108,0,0,1991,1992,
- 5,111,0,0,1992,1993,5,99,0,0,1993,1994,5,97,0,0,1994,1995,5,108,0,0,1995,
- 1996,5,101,0,0,1996,338,1,0,0,0,1997,1998,5,46,0,0,1998,1999,5,112,0,0,
- 1999,2000,5,117,0,0,2000,2001,5,98,0,0,2001,2002,5,108,0,0,2002,2003,5,
- 105,0,0,2003,2004,5,99,0,0,2004,2005,5,107,0,0,2005,2006,5,101,0,0,2006,
- 2007,5,121,0,0,2007,2008,5,116,0,0,2008,2009,5,111,0,0,2009,2010,5,107,
- 0,0,2010,2011,5,101,0,0,2011,2012,5,110,0,0,2012,340,1,0,0,0,2013,2014,
- 5,102,0,0,2014,2015,5,111,0,0,2015,2016,5,114,0,0,2016,2017,5,119,0,0,
- 2017,2018,5,97,0,0,2018,2019,5,114,0,0,2019,2020,5,100,0,0,2020,2021,5,
- 101,0,0,2021,2022,5,114,0,0,2022,342,1,0,0,0,2023,2025,5,45,0,0,2024,2023,
- 1,0,0,0,2024,2025,1,0,0,0,2025,2039,1,0,0,0,2026,2027,5,48,0,0,2027,2028,
- 5,120,0,0,2028,2030,1,0,0,0,2029,2031,7,0,0,0,2030,2029,1,0,0,0,2031,2032,
- 1,0,0,0,2032,2030,1,0,0,0,2032,2033,1,0,0,0,2033,2040,1,0,0,0,2034,2036,
- 7,1,0,0,2035,2034,1,0,0,0,2036,2037,1,0,0,0,2037,2035,1,0,0,0,2037,2038,
- 1,0,0,0,2038,2040,1,0,0,0,2039,2026,1,0,0,0,2039,2035,1,0,0,0,2040,344,
- 1,0,0,0,2041,2043,5,45,0,0,2042,2041,1,0,0,0,2042,2043,1,0,0,0,2043,2057,
- 1,0,0,0,2044,2045,5,48,0,0,2045,2046,5,120,0,0,2046,2048,1,0,0,0,2047,
- 2049,7,0,0,0,2048,2047,1,0,0,0,2049,2050,1,0,0,0,2050,2048,1,0,0,0,2050,
- 2051,1,0,0,0,2051,2058,1,0,0,0,2052,2054,7,1,0,0,2053,2052,1,0,0,0,2054,
- 2055,1,0,0,0,2055,2053,1,0,0,0,2055,2056,1,0,0,0,2056,2058,1,0,0,0,2057,
- 2044,1,0,0,0,2057,2053,1,0,0,0,2058,346,1,0,0,0,2059,2061,5,45,0,0,2060,
- 2059,1,0,0,0,2060,2061,1,0,0,0,2061,2112,1,0,0,0,2062,2064,7,1,0,0,2063,
- 2062,1,0,0,0,2064,2065,1,0,0,0,2065,2063,1,0,0,0,2065,2066,1,0,0,0,2066,
- 2093,1,0,0,0,2067,2069,5,46,0,0,2068,2070,7,1,0,0,2069,2068,1,0,0,0,2070,
- 2071,1,0,0,0,2071,2069,1,0,0,0,2071,2072,1,0,0,0,2072,2082,1,0,0,0,2073,
- 2075,7,2,0,0,2074,2076,7,3,0,0,2075,2074,1,0,0,0,2075,2076,1,0,0,0,2076,
- 2078,1,0,0,0,2077,2079,7,1,0,0,2078,2077,1,0,0,0,2079,2080,1,0,0,0,2080,
- 2078,1,0,0,0,2080,2081,1,0,0,0,2081,2083,1,0,0,0,2082,2073,1,0,0,0,2082,
- 2083,1,0,0,0,2083,2094,1,0,0,0,2084,2086,7,2,0,0,2085,2087,7,3,0,0,2086,
- 2085,1,0,0,0,2086,2087,1,0,0,0,2087,2089,1,0,0,0,2088,2090,7,1,0,0,2089,
- 2088,1,0,0,0,2090,2091,1,0,0,0,2091,2089,1,0,0,0,2091,2092,1,0,0,0,2092,
- 2094,1,0,0,0,2093,2067,1,0,0,0,2093,2084,1,0,0,0,2094,2113,1,0,0,0,2095,
- 2097,5,46,0,0,2096,2098,7,1,0,0,2097,2096,1,0,0,0,2098,2099,1,0,0,0,2099,
- 2097,1,0,0,0,2099,2100,1,0,0,0,2100,2110,1,0,0,0,2101,2103,7,2,0,0,2102,
- 2104,7,3,0,0,2103,2102,1,0,0,0,2103,2104,1,0,0,0,2104,2106,1,0,0,0,2105,
- 2107,7,1,0,0,2106,2105,1,0,0,0,2107,2108,1,0,0,0,2108,2106,1,0,0,0,2108,
- 2109,1,0,0,0,2109,2111,1,0,0,0,2110,2101,1,0,0,0,2110,2111,1,0,0,0,2111,
- 2113,1,0,0,0,2112,2063,1,0,0,0,2112,2095,1,0,0,0,2113,348,1,0,0,0,2114,
- 2115,5,58,0,0,2115,2116,5,58,0,0,2116,350,1,0,0,0,2117,2118,5,46,0,0,2118,
- 2119,5,46,0,0,2119,2120,5,46,0,0,2120,352,1,0,0,0,2121,2122,5,110,0,0,
- 2122,2123,5,117,0,0,2123,2124,5,108,0,0,2124,2125,5,108,0,0,2125,354,1,
- 0,0,0,2126,2127,5,110,0,0,2127,2128,5,117,0,0,2128,2129,5,108,0,0,2129,
- 2130,5,108,0,0,2130,2131,5,114,0,0,2131,2132,5,101,0,0,2132,2133,5,102,
- 0,0,2133,356,1,0,0,0,2134,2135,5,46,0,0,2135,2136,5,104,0,0,2136,2137,
- 5,97,0,0,2137,2138,5,115,0,0,2138,2139,5,104,0,0,2139,358,1,0,0,0,2140,
- 2141,5,99,0,0,2141,2142,5,104,0,0,2142,2143,5,97,0,0,2143,2150,5,114,0,
- 0,2144,2145,5,119,0,0,2145,2146,5,99,0,0,2146,2147,5,104,0,0,2147,2148,
- 5,97,0,0,2148,2150,5,114,0,0,2149,2140,1,0,0,0,2149,2144,1,0,0,0,2150,
- 360,1,0,0,0,2151,2152,5,115,0,0,2152,2153,5,116,0,0,2153,2154,5,114,0,
- 0,2154,2155,5,105,0,0,2155,2156,5,110,0,0,2156,2157,5,103,0,0,2157,362,
- 1,0,0,0,2158,2159,5,98,0,0,2159,2160,5,111,0,0,2160,2161,5,111,0,0,2161,
- 2162,5,108,0,0,2162,364,1,0,0,0,2163,2164,5,105,0,0,2164,2165,5,110,0,
- 0,2165,2166,5,116,0,0,2166,2167,5,56,0,0,2167,366,1,0,0,0,2168,2169,5,
- 105,0,0,2169,2170,5,110,0,0,2170,2171,5,116,0,0,2171,2172,5,49,0,0,2172,
- 2173,5,54,0,0,2173,368,1,0,0,0,2174,2175,5,105,0,0,2175,2176,5,110,0,0,
- 2176,2177,5,116,0,0,2177,2178,5,51,0,0,2178,2179,5,50,0,0,2179,370,1,0,
- 0,0,2180,2181,5,105,0,0,2181,2182,5,110,0,0,2182,2183,5,116,0,0,2183,2184,
- 5,54,0,0,2184,2185,5,52,0,0,2185,372,1,0,0,0,2186,2187,5,102,0,0,2187,
- 2188,5,108,0,0,2188,2189,5,111,0,0,2189,2190,5,97,0,0,2190,2191,5,116,
- 0,0,2191,2192,5,51,0,0,2192,2193,5,50,0,0,2193,374,1,0,0,0,2194,2195,5,
- 102,0,0,2195,2196,5,108,0,0,2196,2197,5,111,0,0,2197,2198,5,97,0,0,2198,
- 2199,5,116,0,0,2199,2200,5,54,0,0,2200,2201,5,52,0,0,2201,376,1,0,0,0,
- 2202,2203,5,117,0,0,2203,2204,5,110,0,0,2204,2205,5,115,0,0,2205,2206,
- 5,105,0,0,2206,2207,5,103,0,0,2207,2208,5,110,0,0,2208,2209,5,101,0,0,
- 2209,2210,5,100,0,0,2210,378,1,0,0,0,2211,2212,5,117,0,0,2212,2213,5,105,
- 0,0,2213,2214,5,110,0,0,2214,2215,5,116,0,0,2215,2216,5,56,0,0,2216,380,
- 1,0,0,0,2217,2218,5,117,0,0,2218,2219,5,105,0,0,2219,2220,5,110,0,0,2220,
- 2221,5,116,0,0,2221,2222,5,49,0,0,2222,2223,5,54,0,0,2223,382,1,0,0,0,
- 2224,2225,5,117,0,0,2225,2226,5,105,0,0,2226,2227,5,110,0,0,2227,2228,
- 5,116,0,0,2228,2229,5,51,0,0,2229,2230,5,50,0,0,2230,384,1,0,0,0,2231,
- 2232,5,117,0,0,2232,2233,5,105,0,0,2233,2234,5,110,0,0,2234,2235,5,116,
- 0,0,2235,2236,5,54,0,0,2236,2237,5,52,0,0,2237,386,1,0,0,0,2238,2239,5,
- 105,0,0,2239,2240,5,110,0,0,2240,2241,5,116,0,0,2241,388,1,0,0,0,2242,
- 2243,5,117,0,0,2243,2244,5,105,0,0,2244,2245,5,110,0,0,2245,2246,5,116,
- 0,0,2246,390,1,0,0,0,2247,2248,5,116,0,0,2248,2249,5,121,0,0,2249,2250,
- 5,112,0,0,2250,2251,5,101,0,0,2251,392,1,0,0,0,2252,2253,5,111,0,0,2253,
- 2254,5,98,0,0,2254,2255,5,106,0,0,2255,2256,5,101,0,0,2256,2257,5,99,0,
- 0,2257,2258,5,116,0,0,2258,394,1,0,0,0,2259,2260,5,46,0,0,2260,2261,5,
- 109,0,0,2261,2262,5,111,0,0,2262,2263,5,100,0,0,2263,2264,5,117,0,0,2264,
- 2265,5,108,0,0,2265,2266,5,101,0,0,2266,396,1,0,0,0,2267,2268,5,118,0,
- 0,2268,2269,5,97,0,0,2269,2270,5,108,0,0,2270,2271,5,117,0,0,2271,2272,
- 5,101,0,0,2272,398,1,0,0,0,2273,2274,5,118,0,0,2274,2275,5,97,0,0,2275,
- 2276,5,108,0,0,2276,2277,5,117,0,0,2277,2278,5,101,0,0,2278,2279,5,116,
- 0,0,2279,2280,5,121,0,0,2280,2281,5,112,0,0,2281,2282,5,101,0,0,2282,400,
- 1,0,0,0,2283,2284,5,118,0,0,2284,2285,5,111,0,0,2285,2286,5,105,0,0,2286,
- 2287,5,100,0,0,2287,402,1,0,0,0,2288,2289,5,101,0,0,2289,2290,5,110,0,
- 0,2290,2291,5,117,0,0,2291,2292,5,109,0,0,2292,404,1,0,0,0,2293,2294,5,
- 99,0,0,2294,2295,5,117,0,0,2295,2296,5,115,0,0,2296,2297,5,116,0,0,2297,
- 2298,5,111,0,0,2298,2299,5,109,0,0,2299,406,1,0,0,0,2300,2301,5,102,0,
- 0,2301,2302,5,105,0,0,2302,2303,5,120,0,0,2303,2304,5,101,0,0,2304,2305,
- 5,100,0,0,2305,408,1,0,0,0,2306,2307,5,115,0,0,2307,2308,5,121,0,0,2308,
- 2309,5,115,0,0,2309,2310,5,116,0,0,2310,2311,5,114,0,0,2311,2312,5,105,
- 0,0,2312,2313,5,110,0,0,2313,2314,5,103,0,0,2314,410,1,0,0,0,2315,2316,
- 5,97,0,0,2316,2317,5,114,0,0,2317,2318,5,114,0,0,2318,2319,5,97,0,0,2319,
- 2320,5,121,0,0,2320,412,1,0,0,0,2321,2322,5,118,0,0,2322,2323,5,97,0,0,
- 2323,2324,5,114,0,0,2324,2325,5,105,0,0,2325,2326,5,97,0,0,2326,2327,5,
- 110,0,0,2327,2328,5,116,0,0,2328,414,1,0,0,0,2329,2330,5,99,0,0,2330,2331,
- 5,117,0,0,2331,2332,5,114,0,0,2332,2333,5,114,0,0,2333,2334,5,101,0,0,
- 2334,2335,5,110,0,0,2335,2336,5,99,0,0,2336,2337,5,121,0,0,2337,416,1,
- 0,0,0,2338,2339,5,115,0,0,2339,2340,5,121,0,0,2340,2341,5,115,0,0,2341,
- 2342,5,99,0,0,2342,2343,5,104,0,0,2343,2344,5,97,0,0,2344,2345,5,114,0,
- 0,2345,418,1,0,0,0,2346,2347,5,101,0,0,2347,2348,5,114,0,0,2348,2349,5,
- 114,0,0,2349,2350,5,111,0,0,2350,2351,5,114,0,0,2351,420,1,0,0,0,2352,
- 2353,5,100,0,0,2353,2354,5,101,0,0,2354,2355,5,99,0,0,2355,2356,5,105,
- 0,0,2356,2357,5,109,0,0,2357,2358,5,97,0,0,2358,2359,5,108,0,0,2359,422,
- 1,0,0,0,2360,2361,5,100,0,0,2361,2362,5,97,0,0,2362,2363,5,116,0,0,2363,
- 2364,5,101,0,0,2364,424,1,0,0,0,2365,2366,5,98,0,0,2366,2367,5,115,0,0,
- 2367,2368,5,116,0,0,2368,2369,5,114,0,0,2369,426,1,0,0,0,2370,2371,5,108,
- 0,0,2371,2372,5,112,0,0,2372,2373,5,115,0,0,2373,2374,5,116,0,0,2374,2375,
- 5,114,0,0,2375,428,1,0,0,0,2376,2377,5,108,0,0,2377,2378,5,112,0,0,2378,
- 2379,5,119,0,0,2379,2380,5,115,0,0,2380,2381,5,116,0,0,2381,2382,5,114,
- 0,0,2382,430,1,0,0,0,2383,2384,5,108,0,0,2384,2385,5,112,0,0,2385,2386,
- 5,116,0,0,2386,2387,5,115,0,0,2387,2388,5,116,0,0,2388,2389,5,114,0,0,
- 2389,432,1,0,0,0,2390,2391,5,111,0,0,2391,2392,5,98,0,0,2392,2393,5,106,
- 0,0,2393,2394,5,101,0,0,2394,2395,5,99,0,0,2395,2396,5,116,0,0,2396,2397,
- 5,114,0,0,2397,2398,5,101,0,0,2398,2399,5,102,0,0,2399,434,1,0,0,0,2400,
- 2401,5,105,0,0,2401,2402,5,117,0,0,2402,2403,5,110,0,0,2403,2404,5,107,
- 0,0,2404,2405,5,110,0,0,2405,2406,5,111,0,0,2406,2407,5,119,0,0,2407,2408,
- 5,110,0,0,2408,436,1,0,0,0,2409,2410,5,105,0,0,2410,2411,5,100,0,0,2411,
- 2412,5,105,0,0,2412,2413,5,115,0,0,2413,2414,5,112,0,0,2414,2415,5,97,
- 0,0,2415,2416,5,116,0,0,2416,2417,5,99,0,0,2417,2418,5,104,0,0,2418,438,
- 1,0,0,0,2419,2420,5,115,0,0,2420,2421,5,116,0,0,2421,2422,5,114,0,0,2422,
- 2423,5,117,0,0,2423,2424,5,99,0,0,2424,2425,5,116,0,0,2425,440,1,0,0,0,
- 2426,2427,5,105,0,0,2427,2428,5,110,0,0,2428,2429,5,116,0,0,2429,2430,
- 5,101,0,0,2430,2431,5,114,0,0,2431,2432,5,102,0,0,2432,2433,5,97,0,0,2433,
- 2434,5,99,0,0,2434,2435,5,101,0,0,2435,442,1,0,0,0,2436,2437,5,115,0,0,
- 2437,2438,5,97,0,0,2438,2439,5,102,0,0,2439,2440,5,101,0,0,2440,2441,5,
- 97,0,0,2441,2442,5,114,0,0,2442,2443,5,114,0,0,2443,2444,5,97,0,0,2444,
- 2445,5,121,0,0,2445,444,1,0,0,0,2446,2447,5,98,0,0,2447,2448,5,121,0,0,
- 2448,2449,5,118,0,0,2449,2450,5,97,0,0,2450,2451,5,108,0,0,2451,2452,5,
- 115,0,0,2452,2453,5,116,0,0,2453,2454,5,114,0,0,2454,446,1,0,0,0,2455,
- 2456,5,97,0,0,2456,2457,5,110,0,0,2457,2458,5,115,0,0,2458,2459,5,105,
- 0,0,2459,448,1,0,0,0,2460,2461,5,116,0,0,2461,2462,5,98,0,0,2462,2463,
- 5,115,0,0,2463,2464,5,116,0,0,2464,2465,5,114,0,0,2465,450,1,0,0,0,2466,
- 2467,5,109,0,0,2467,2468,5,101,0,0,2468,2469,5,116,0,0,2469,2470,5,104,
- 0,0,2470,2471,5,111,0,0,2471,2472,5,100,0,0,2472,452,1,0,0,0,2473,2474,
- 5,97,0,0,2474,2475,5,110,0,0,2475,2476,5,121,0,0,2476,454,1,0,0,0,2477,
- 2478,5,108,0,0,2478,2479,5,112,0,0,2479,2480,5,115,0,0,2480,2481,5,116,
- 0,0,2481,2482,5,114,0,0,2482,2483,5,117,0,0,2483,2484,5,99,0,0,2484,2485,
- 5,116,0,0,2485,456,1,0,0,0,2486,2487,5,118,0,0,2487,2488,5,101,0,0,2488,
- 2489,5,99,0,0,2489,2490,5,116,0,0,2490,2491,5,111,0,0,2491,2492,5,114,
- 0,0,2492,458,1,0,0,0,2493,2494,5,104,0,0,2494,2495,5,114,0,0,2495,2496,
- 5,101,0,0,2496,2497,5,115,0,0,2497,2498,5,117,0,0,2498,2499,5,108,0,0,
- 2499,2500,5,116,0,0,2500,460,1,0,0,0,2501,2502,5,99,0,0,2502,2503,5,97,
- 0,0,2503,2504,5,114,0,0,2504,2505,5,114,0,0,2505,2506,5,97,0,0,2506,2507,
- 5,121,0,0,2507,462,1,0,0,0,2508,2509,5,117,0,0,2509,2510,5,115,0,0,2510,
- 2511,5,101,0,0,2511,2512,5,114,0,0,2512,2513,5,100,0,0,2513,2514,5,101,
- 0,0,2514,2515,5,102,0,0,2515,2516,5,105,0,0,2516,2517,5,110,0,0,2517,2518,
- 5,101,0,0,2518,2519,5,100,0,0,2519,464,1,0,0,0,2520,2521,5,114,0,0,2521,
- 2522,5,101,0,0,2522,2523,5,99,0,0,2523,2524,5,111,0,0,2524,2525,5,114,
- 0,0,2525,2526,5,100,0,0,2526,466,1,0,0,0,2527,2528,5,102,0,0,2528,2529,
- 5,105,0,0,2529,2530,5,108,0,0,2530,2531,5,101,0,0,2531,2532,5,116,0,0,
- 2532,2533,5,105,0,0,2533,2534,5,109,0,0,2534,2535,5,101,0,0,2535,468,1,
- 0,0,0,2536,2537,5,98,0,0,2537,2538,5,108,0,0,2538,2539,5,111,0,0,2539,
- 2540,5,98,0,0,2540,470,1,0,0,0,2541,2542,5,115,0,0,2542,2543,5,116,0,0,
- 2543,2544,5,114,0,0,2544,2545,5,101,0,0,2545,2546,5,97,0,0,2546,2547,5,
- 109,0,0,2547,472,1,0,0,0,2548,2549,5,115,0,0,2549,2550,5,116,0,0,2550,
- 2551,5,111,0,0,2551,2552,5,114,0,0,2552,2553,5,97,0,0,2553,2554,5,103,
- 0,0,2554,2555,5,101,0,0,2555,474,1,0,0,0,2556,2557,5,115,0,0,2557,2558,
- 5,116,0,0,2558,2559,5,114,0,0,2559,2560,5,101,0,0,2560,2561,5,97,0,0,2561,
- 2562,5,109,0,0,2562,2563,5,101,0,0,2563,2564,5,100,0,0,2564,2565,5,95,
- 0,0,2565,2566,5,111,0,0,2566,2567,5,98,0,0,2567,2568,5,106,0,0,2568,2569,
- 5,101,0,0,2569,2570,5,99,0,0,2570,2571,5,116,0,0,2571,476,1,0,0,0,2572,
- 2573,5,115,0,0,2573,2574,5,116,0,0,2574,2575,5,111,0,0,2575,2576,5,114,
- 0,0,2576,2577,5,101,0,0,2577,2578,5,100,0,0,2578,2579,5,95,0,0,2579,2580,
- 5,111,0,0,2580,2581,5,98,0,0,2581,2582,5,106,0,0,2582,2583,5,101,0,0,2583,
- 2584,5,99,0,0,2584,2585,5,116,0,0,2585,478,1,0,0,0,2586,2587,5,98,0,0,
- 2587,2588,5,108,0,0,2588,2589,5,111,0,0,2589,2590,5,98,0,0,2590,2591,5,
- 95,0,0,2591,2592,5,111,0,0,2592,2593,5,98,0,0,2593,2594,5,106,0,0,2594,
- 2595,5,101,0,0,2595,2596,5,99,0,0,2596,2597,5,116,0,0,2597,480,1,0,0,0,
- 2598,2599,5,99,0,0,2599,2600,5,102,0,0,2600,482,1,0,0,0,2601,2602,5,99,
- 0,0,2602,2603,5,108,0,0,2603,2604,5,115,0,0,2604,2605,5,105,0,0,2605,2606,
- 5,100,0,0,2606,484,1,0,0,0,2607,2608,5,105,0,0,2608,2609,5,110,0,0,2609,
- 2610,5,115,0,0,2610,2611,5,116,0,0,2611,2612,5,97,0,0,2612,2613,5,110,
- 0,0,2613,2614,5,99,0,0,2614,2615,5,101,0,0,2615,486,1,0,0,0,2616,2617,
- 5,101,0,0,2617,2618,5,120,0,0,2618,2619,5,112,0,0,2619,2620,5,108,0,0,
- 2620,2621,5,105,0,0,2621,2622,5,99,0,0,2622,2623,5,105,0,0,2623,2624,5,
- 116,0,0,2624,488,1,0,0,0,2625,2626,5,100,0,0,2626,2627,5,101,0,0,2627,
- 2628,5,102,0,0,2628,2629,5,97,0,0,2629,2630,5,117,0,0,2630,2631,5,108,
- 0,0,2631,2632,5,116,0,0,2632,490,1,0,0,0,2633,2634,5,118,0,0,2634,2635,
- 5,97,0,0,2635,2636,5,114,0,0,2636,2637,5,97,0,0,2637,2638,5,114,0,0,2638,
- 2639,5,103,0,0,2639,492,1,0,0,0,2640,2641,5,117,0,0,2641,2642,5,110,0,
- 0,2642,2643,5,109,0,0,2643,2644,5,97,0,0,2644,2645,5,110,0,0,2645,2646,
- 5,97,0,0,2646,2647,5,103,0,0,2647,2648,5,101,0,0,2648,2649,5,100,0,0,2649,
- 494,1,0,0,0,2650,2651,5,99,0,0,2651,2652,5,100,0,0,2652,2653,5,101,0,0,
- 2653,2654,5,99,0,0,2654,2655,5,108,0,0,2655,496,1,0,0,0,2656,2657,5,115,
- 0,0,2657,2658,5,116,0,0,2658,2659,5,100,0,0,2659,2660,5,99,0,0,2660,2661,
- 5,97,0,0,2661,2662,5,108,0,0,2662,2663,5,108,0,0,2663,498,1,0,0,0,2664,
- 2665,5,116,0,0,2665,2666,5,104,0,0,2666,2667,5,105,0,0,2667,2668,5,115,
- 0,0,2668,2669,5,99,0,0,2669,2670,5,97,0,0,2670,2671,5,108,0,0,2671,2672,
- 5,108,0,0,2672,500,1,0,0,0,2673,2674,5,102,0,0,2674,2675,5,97,0,0,2675,
- 2676,5,115,0,0,2676,2677,5,116,0,0,2677,2678,5,99,0,0,2678,2679,5,97,0,
- 0,2679,2680,5,108,0,0,2680,2681,5,108,0,0,2681,502,1,0,0,0,2682,2683,5,
- 33,0,0,2683,504,1,0,0,0,2684,2685,5,33,0,0,2685,2686,5,33,0,0,2686,506,
- 1,0,0,0,2687,2688,5,116,0,0,2688,2689,5,121,0,0,2689,2690,5,112,0,0,2690,
- 2691,5,101,0,0,2691,2692,5,100,0,0,2692,2693,5,114,0,0,2693,2694,5,101,
- 0,0,2694,2702,5,102,0,0,2695,2696,5,114,0,0,2696,2697,5,101,0,0,2697,2698,
- 5,102,0,0,2698,2699,5,97,0,0,2699,2700,5,110,0,0,2700,2702,5,121,0,0,2701,
- 2687,1,0,0,0,2701,2695,1,0,0,0,2702,508,1,0,0,0,2703,2704,5,46,0,0,2704,
- 2705,5,112,0,0,2705,2706,5,97,0,0,2706,2707,5,114,0,0,2707,2708,5,97,0,
- 0,2708,2709,5,109,0,0,2709,510,1,0,0,0,2710,2711,5,99,0,0,2711,2712,5,
- 111,0,0,2712,2713,5,110,0,0,2713,2714,5,115,0,0,2714,2715,5,116,0,0,2715,
- 2716,5,114,0,0,2716,2717,5,97,0,0,2717,2718,5,105,0,0,2718,2719,5,110,
- 0,0,2719,2720,5,116,0,0,2720,512,1,0,0,0,2721,2722,5,46,0,0,2722,2723,
- 5,116,0,0,2723,2724,5,104,0,0,2724,2725,5,105,0,0,2725,2726,5,115,0,0,
- 2726,514,1,0,0,0,2727,2728,5,46,0,0,2728,2729,5,98,0,0,2729,2730,5,97,
- 0,0,2730,2731,5,115,0,0,2731,2732,5,101,0,0,2732,516,1,0,0,0,2733,2734,
- 5,46,0,0,2734,2735,5,110,0,0,2735,2736,5,101,0,0,2736,2737,5,115,0,0,2737,
- 2738,5,116,0,0,2738,2739,5,101,0,0,2739,2740,5,114,0,0,2740,518,1,0,0,
- 0,2741,2742,5,38,0,0,2742,520,1,0,0,0,2743,2744,5,91,0,0,2744,2745,5,93,
- 0,0,2745,522,1,0,0,0,2746,2747,5,42,0,0,2747,524,1,0,0,0,2748,2761,5,92,
- 0,0,2749,2762,7,4,0,0,2750,2752,7,5,0,0,2751,2753,7,5,0,0,2752,2751,1,
- 0,0,0,2752,2753,1,0,0,0,2753,2755,1,0,0,0,2754,2756,7,5,0,0,2755,2754,
- 1,0,0,0,2755,2756,1,0,0,0,2756,2762,1,0,0,0,2757,2759,5,13,0,0,2758,2757,
- 1,0,0,0,2758,2759,1,0,0,0,2759,2760,1,0,0,0,2760,2762,5,10,0,0,2761,2749,
- 1,0,0,0,2761,2750,1,0,0,0,2761,2758,1,0,0,0,2762,526,1,0,0,0,2763,2768,
- 5,34,0,0,2764,2767,8,6,0,0,2765,2767,3,525,262,0,2766,2764,1,0,0,0,2766,
- 2765,1,0,0,0,2767,2770,1,0,0,0,2768,2766,1,0,0,0,2768,2769,1,0,0,0,2769,
- 2771,1,0,0,0,2770,2768,1,0,0,0,2771,2772,5,34,0,0,2772,528,1,0,0,0,2773,
- 2778,5,39,0,0,2774,2777,8,7,0,0,2775,2777,3,525,262,0,2776,2774,1,0,0,
- 0,2776,2775,1,0,0,0,2777,2780,1,0,0,0,2778,2776,1,0,0,0,2778,2779,1,0,
- 0,0,2779,2781,1,0,0,0,2780,2778,1,0,0,0,2781,2782,5,39,0,0,2782,530,1,
- 0,0,0,2783,2784,5,46,0,0,2784,532,1,0,0,0,2785,2786,5,43,0,0,2786,534,
- 1,0,0,0,2787,2788,5,35,0,0,2788,2789,5,100,0,0,2789,2790,5,101,0,0,2790,
- 2791,5,102,0,0,2791,2792,5,105,0,0,2792,2793,5,110,0,0,2793,2794,5,101,
- 0,0,2794,536,1,0,0,0,2795,2796,5,35,0,0,2796,2797,5,117,0,0,2797,2798,
- 5,110,0,0,2798,2799,5,100,0,0,2799,2800,5,101,0,0,2800,2801,5,102,0,0,
- 2801,538,1,0,0,0,2802,2803,5,35,0,0,2803,2804,5,105,0,0,2804,2805,5,102,
- 0,0,2805,2806,5,100,0,0,2806,2807,5,101,0,0,2807,2808,5,102,0,0,2808,540,
- 1,0,0,0,2809,2810,5,35,0,0,2810,2811,5,105,0,0,2811,2812,5,102,0,0,2812,
- 2813,5,110,0,0,2813,2814,5,100,0,0,2814,2815,5,101,0,0,2815,2816,5,102,
- 0,0,2816,542,1,0,0,0,2817,2818,5,35,0,0,2818,2819,5,101,0,0,2819,2820,
- 5,108,0,0,2820,2821,5,115,0,0,2821,2822,5,101,0,0,2822,544,1,0,0,0,2823,
- 2824,5,35,0,0,2824,2825,5,101,0,0,2825,2826,5,110,0,0,2826,2827,5,100,
- 0,0,2827,2828,5,105,0,0,2828,2829,5,102,0,0,2829,546,1,0,0,0,2830,2831,
- 5,35,0,0,2831,2832,5,105,0,0,2832,2833,5,110,0,0,2833,2834,5,99,0,0,2834,
- 2835,5,108,0,0,2835,2836,5,117,0,0,2836,2837,5,100,0,0,2837,2838,5,101,
- 0,0,2838,548,1,0,0,0,2839,2840,5,46,0,0,2840,2841,5,109,0,0,2841,2842,
- 5,114,0,0,2842,2843,5,101,0,0,2843,2844,5,115,0,0,2844,2845,5,111,0,0,
- 2845,2846,5,117,0,0,2846,2847,5,114,0,0,2847,2848,5,99,0,0,2848,2849,5,
- 101,0,0,2849,550,1,0,0,0,2850,2851,5,110,0,0,2851,2852,5,111,0,0,2852,
- 4033,5,112,0,0,2853,2854,5,98,0,0,2854,2855,5,114,0,0,2855,2856,5,101,
- 0,0,2856,2857,5,97,0,0,2857,4033,5,107,0,0,2858,2859,5,108,0,0,2859,2860,
- 5,100,0,0,2860,2861,5,97,0,0,2861,2862,5,114,0,0,2862,2863,5,103,0,0,2863,
- 2864,5,46,0,0,2864,4033,5,48,0,0,2865,2866,5,108,0,0,2866,2867,5,100,0,
- 0,2867,2868,5,97,0,0,2868,2869,5,114,0,0,2869,2870,5,103,0,0,2870,2871,
- 5,46,0,0,2871,4033,5,49,0,0,2872,2873,5,108,0,0,2873,2874,5,100,0,0,2874,
- 2875,5,97,0,0,2875,2876,5,114,0,0,2876,2877,5,103,0,0,2877,2878,5,46,0,
- 0,2878,4033,5,50,0,0,2879,2880,5,108,0,0,2880,2881,5,100,0,0,2881,2882,
- 5,97,0,0,2882,2883,5,114,0,0,2883,2884,5,103,0,0,2884,2885,5,46,0,0,2885,
- 4033,5,51,0,0,2886,2887,5,108,0,0,2887,2888,5,100,0,0,2888,2889,5,108,
- 0,0,2889,2890,5,111,0,0,2890,2891,5,99,0,0,2891,2892,5,46,0,0,2892,4033,
- 5,48,0,0,2893,2894,5,108,0,0,2894,2895,5,100,0,0,2895,2896,5,108,0,0,2896,
- 2897,5,111,0,0,2897,2898,5,99,0,0,2898,2899,5,46,0,0,2899,4033,5,49,0,
- 0,2900,2901,5,108,0,0,2901,2902,5,100,0,0,2902,2903,5,108,0,0,2903,2904,
- 5,111,0,0,2904,2905,5,99,0,0,2905,2906,5,46,0,0,2906,4033,5,50,0,0,2907,
- 2908,5,108,0,0,2908,2909,5,100,0,0,2909,2910,5,108,0,0,2910,2911,5,111,
- 0,0,2911,2912,5,99,0,0,2912,2913,5,46,0,0,2913,4033,5,51,0,0,2914,2915,
- 5,115,0,0,2915,2916,5,116,0,0,2916,2917,5,108,0,0,2917,2918,5,111,0,0,
- 2918,2919,5,99,0,0,2919,2920,5,46,0,0,2920,4033,5,48,0,0,2921,2922,5,115,
- 0,0,2922,2923,5,116,0,0,2923,2924,5,108,0,0,2924,2925,5,111,0,0,2925,2926,
- 5,99,0,0,2926,2927,5,46,0,0,2927,4033,5,49,0,0,2928,2929,5,115,0,0,2929,
- 2930,5,116,0,0,2930,2931,5,108,0,0,2931,2932,5,111,0,0,2932,2933,5,99,
- 0,0,2933,2934,5,46,0,0,2934,4033,5,50,0,0,2935,2936,5,115,0,0,2936,2937,
- 5,116,0,0,2937,2938,5,108,0,0,2938,2939,5,111,0,0,2939,2940,5,99,0,0,2940,
- 2941,5,46,0,0,2941,4033,5,51,0,0,2942,2943,5,108,0,0,2943,2944,5,100,0,
- 0,2944,2945,5,110,0,0,2945,2946,5,117,0,0,2946,2947,5,108,0,0,2947,4033,
- 5,108,0,0,2948,2949,5,108,0,0,2949,2950,5,100,0,0,2950,2951,5,99,0,0,2951,
- 2952,5,46,0,0,2952,2953,5,105,0,0,2953,2954,5,52,0,0,2954,2955,5,46,0,
- 0,2955,2956,5,109,0,0,2956,4033,5,49,0,0,2957,2958,5,108,0,0,2958,2959,
- 5,100,0,0,2959,2960,5,99,0,0,2960,2961,5,46,0,0,2961,2962,5,105,0,0,2962,
- 2963,5,52,0,0,2963,2964,5,46,0,0,2964,2965,5,77,0,0,2965,4033,5,49,0,0,
- 2966,2967,5,108,0,0,2967,2968,5,100,0,0,2968,2969,5,99,0,0,2969,2970,5,
- 46,0,0,2970,2971,5,105,0,0,2971,2972,5,52,0,0,2972,2973,5,46,0,0,2973,
- 4033,5,48,0,0,2974,2975,5,108,0,0,2975,2976,5,100,0,0,2976,2977,5,99,0,
- 0,2977,2978,5,46,0,0,2978,2979,5,105,0,0,2979,2980,5,52,0,0,2980,2981,
- 5,46,0,0,2981,4033,5,49,0,0,2982,2983,5,108,0,0,2983,2984,5,100,0,0,2984,
- 2985,5,99,0,0,2985,2986,5,46,0,0,2986,2987,5,105,0,0,2987,2988,5,52,0,
- 0,2988,2989,5,46,0,0,2989,4033,5,50,0,0,2990,2991,5,108,0,0,2991,2992,
- 5,100,0,0,2992,2993,5,99,0,0,2993,2994,5,46,0,0,2994,2995,5,105,0,0,2995,
- 2996,5,52,0,0,2996,2997,5,46,0,0,2997,4033,5,51,0,0,2998,2999,5,108,0,
- 0,2999,3000,5,100,0,0,3000,3001,5,99,0,0,3001,3002,5,46,0,0,3002,3003,
- 5,105,0,0,3003,3004,5,52,0,0,3004,3005,5,46,0,0,3005,4033,5,52,0,0,3006,
- 3007,5,108,0,0,3007,3008,5,100,0,0,3008,3009,5,99,0,0,3009,3010,5,46,0,
- 0,3010,3011,5,105,0,0,3011,3012,5,52,0,0,3012,3013,5,46,0,0,3013,4033,
- 5,53,0,0,3014,3015,5,108,0,0,3015,3016,5,100,0,0,3016,3017,5,99,0,0,3017,
- 3018,5,46,0,0,3018,3019,5,105,0,0,3019,3020,5,52,0,0,3020,3021,5,46,0,
- 0,3021,4033,5,54,0,0,3022,3023,5,108,0,0,3023,3024,5,100,0,0,3024,3025,
- 5,99,0,0,3025,3026,5,46,0,0,3026,3027,5,105,0,0,3027,3028,5,52,0,0,3028,
- 3029,5,46,0,0,3029,4033,5,55,0,0,3030,3031,5,108,0,0,3031,3032,5,100,0,
- 0,3032,3033,5,99,0,0,3033,3034,5,46,0,0,3034,3035,5,105,0,0,3035,3036,
- 5,52,0,0,3036,3037,5,46,0,0,3037,4033,5,56,0,0,3038,3039,5,100,0,0,3039,
- 3040,5,117,0,0,3040,4033,5,112,0,0,3041,3042,5,112,0,0,3042,3043,5,111,
- 0,0,3043,4033,5,112,0,0,3044,3045,5,114,0,0,3045,3046,5,101,0,0,3046,4033,
- 5,116,0,0,3047,3048,5,108,0,0,3048,3049,5,100,0,0,3049,3050,5,105,0,0,
- 3050,3051,5,110,0,0,3051,3052,5,100,0,0,3052,3053,5,46,0,0,3053,3054,5,
- 105,0,0,3054,4033,5,49,0,0,3055,3056,5,108,0,0,3056,3057,5,100,0,0,3057,
- 3058,5,105,0,0,3058,3059,5,110,0,0,3059,3060,5,100,0,0,3060,3061,5,46,
- 0,0,3061,3062,5,117,0,0,3062,4033,5,49,0,0,3063,3064,5,108,0,0,3064,3065,
- 5,100,0,0,3065,3066,5,105,0,0,3066,3067,5,110,0,0,3067,3068,5,100,0,0,
- 3068,3069,5,46,0,0,3069,3070,5,105,0,0,3070,4033,5,50,0,0,3071,3072,5,
- 108,0,0,3072,3073,5,100,0,0,3073,3074,5,105,0,0,3074,3075,5,110,0,0,3075,
- 3076,5,100,0,0,3076,3077,5,46,0,0,3077,3078,5,117,0,0,3078,4033,5,50,0,
- 0,3079,3080,5,108,0,0,3080,3081,5,100,0,0,3081,3082,5,105,0,0,3082,3083,
- 5,110,0,0,3083,3084,5,100,0,0,3084,3085,5,46,0,0,3085,3086,5,105,0,0,3086,
- 4033,5,52,0,0,3087,3088,5,108,0,0,3088,3089,5,100,0,0,3089,3090,5,105,
- 0,0,3090,3091,5,110,0,0,3091,3092,5,100,0,0,3092,3093,5,46,0,0,3093,3094,
- 5,117,0,0,3094,4033,5,52,0,0,3095,3096,5,108,0,0,3096,3097,5,100,0,0,3097,
- 3098,5,105,0,0,3098,3099,5,110,0,0,3099,3100,5,100,0,0,3100,3101,5,46,
- 0,0,3101,3102,5,105,0,0,3102,4033,5,56,0,0,3103,3104,5,108,0,0,3104,3105,
- 5,100,0,0,3105,3106,5,105,0,0,3106,3107,5,110,0,0,3107,3108,5,100,0,0,
- 3108,3109,5,46,0,0,3109,3110,5,117,0,0,3110,4033,5,56,0,0,3111,3112,5,
- 108,0,0,3112,3113,5,100,0,0,3113,3114,5,105,0,0,3114,3115,5,110,0,0,3115,
- 3116,5,100,0,0,3116,3117,5,46,0,0,3117,4033,5,105,0,0,3118,3119,5,108,
- 0,0,3119,3120,5,100,0,0,3120,3121,5,105,0,0,3121,3122,5,110,0,0,3122,3123,
- 5,100,0,0,3123,3124,5,46,0,0,3124,3125,5,114,0,0,3125,4033,5,52,0,0,3126,
- 3127,5,108,0,0,3127,3128,5,100,0,0,3128,3129,5,105,0,0,3129,3130,5,110,
- 0,0,3130,3131,5,100,0,0,3131,3132,5,46,0,0,3132,3133,5,114,0,0,3133,4033,
- 5,56,0,0,3134,3135,5,108,0,0,3135,3136,5,100,0,0,3136,3137,5,105,0,0,3137,
- 3138,5,110,0,0,3138,3139,5,100,0,0,3139,3140,5,46,0,0,3140,3141,5,114,
- 0,0,3141,3142,5,101,0,0,3142,4033,5,102,0,0,3143,3144,5,115,0,0,3144,3145,
- 5,116,0,0,3145,3146,5,105,0,0,3146,3147,5,110,0,0,3147,3148,5,100,0,0,
- 3148,3149,5,46,0,0,3149,3150,5,114,0,0,3150,3151,5,101,0,0,3151,4033,5,
- 102,0,0,3152,3153,5,115,0,0,3153,3154,5,116,0,0,3154,3155,5,105,0,0,3155,
- 3156,5,110,0,0,3156,3157,5,100,0,0,3157,3158,5,46,0,0,3158,3159,5,105,
- 0,0,3159,4033,5,49,0,0,3160,3161,5,115,0,0,3161,3162,5,116,0,0,3162,3163,
- 5,105,0,0,3163,3164,5,110,0,0,3164,3165,5,100,0,0,3165,3166,5,46,0,0,3166,
- 3167,5,105,0,0,3167,4033,5,50,0,0,3168,3169,5,115,0,0,3169,3170,5,116,
- 0,0,3170,3171,5,105,0,0,3171,3172,5,110,0,0,3172,3173,5,100,0,0,3173,3174,
- 5,46,0,0,3174,3175,5,105,0,0,3175,4033,5,52,0,0,3176,3177,5,115,0,0,3177,
- 3178,5,116,0,0,3178,3179,5,105,0,0,3179,3180,5,110,0,0,3180,3181,5,100,
- 0,0,3181,3182,5,46,0,0,3182,3183,5,105,0,0,3183,4033,5,56,0,0,3184,3185,
- 5,115,0,0,3185,3186,5,116,0,0,3186,3187,5,105,0,0,3187,3188,5,110,0,0,
- 3188,3189,5,100,0,0,3189,3190,5,46,0,0,3190,3191,5,114,0,0,3191,4033,5,
- 52,0,0,3192,3193,5,115,0,0,3193,3194,5,116,0,0,3194,3195,5,105,0,0,3195,
- 3196,5,110,0,0,3196,3197,5,100,0,0,3197,3198,5,46,0,0,3198,3199,5,114,
- 0,0,3199,4033,5,56,0,0,3200,3201,5,97,0,0,3201,3202,5,100,0,0,3202,4033,
- 5,100,0,0,3203,3204,5,115,0,0,3204,3205,5,117,0,0,3205,4033,5,98,0,0,3206,
- 3207,5,109,0,0,3207,3208,5,117,0,0,3208,4033,5,108,0,0,3209,3210,5,100,
- 0,0,3210,3211,5,105,0,0,3211,4033,5,118,0,0,3212,3213,5,100,0,0,3213,3214,
- 5,105,0,0,3214,3215,5,118,0,0,3215,3216,5,46,0,0,3216,3217,5,117,0,0,3217,
- 4033,5,110,0,0,3218,3219,5,114,0,0,3219,3220,5,101,0,0,3220,4033,5,109,
- 0,0,3221,3222,5,114,0,0,3222,3223,5,101,0,0,3223,3224,5,109,0,0,3224,3225,
- 5,46,0,0,3225,3226,5,117,0,0,3226,4033,5,110,0,0,3227,3228,5,97,0,0,3228,
- 3229,5,110,0,0,3229,4033,5,100,0,0,3230,3231,5,111,0,0,3231,4033,5,114,
- 0,0,3232,3233,5,120,0,0,3233,3234,5,111,0,0,3234,4033,5,114,0,0,3235,3236,
- 5,115,0,0,3236,3237,5,104,0,0,3237,4033,5,108,0,0,3238,3239,5,115,0,0,
- 3239,3240,5,104,0,0,3240,4033,5,114,0,0,3241,3242,5,115,0,0,3242,3243,
- 5,104,0,0,3243,3244,5,114,0,0,3244,3245,5,46,0,0,3245,3246,5,117,0,0,3246,
- 4033,5,110,0,0,3247,3248,5,110,0,0,3248,3249,5,101,0,0,3249,4033,5,103,
- 0,0,3250,3251,5,110,0,0,3251,3252,5,111,0,0,3252,4033,5,116,0,0,3253,3254,
- 5,99,0,0,3254,3255,5,111,0,0,3255,3256,5,110,0,0,3256,3257,5,118,0,0,3257,
- 3258,5,46,0,0,3258,3259,5,105,0,0,3259,4033,5,49,0,0,3260,3261,5,99,0,
- 0,3261,3262,5,111,0,0,3262,3263,5,110,0,0,3263,3264,5,118,0,0,3264,3265,
- 5,46,0,0,3265,3266,5,105,0,0,3266,4033,5,50,0,0,3267,3268,5,99,0,0,3268,
- 3269,5,111,0,0,3269,3270,5,110,0,0,3270,3271,5,118,0,0,3271,3272,5,46,
- 0,0,3272,3273,5,105,0,0,3273,4033,5,52,0,0,3274,3275,5,99,0,0,3275,3276,
- 5,111,0,0,3276,3277,5,110,0,0,3277,3278,5,118,0,0,3278,3279,5,46,0,0,3279,
- 3280,5,105,0,0,3280,4033,5,56,0,0,3281,3282,5,99,0,0,3282,3283,5,111,0,
- 0,3283,3284,5,110,0,0,3284,3285,5,118,0,0,3285,3286,5,46,0,0,3286,3287,
- 5,114,0,0,3287,4033,5,52,0,0,3288,3289,5,99,0,0,3289,3290,5,111,0,0,3290,
- 3291,5,110,0,0,3291,3292,5,118,0,0,3292,3293,5,46,0,0,3293,3294,5,114,
- 0,0,3294,4033,5,56,0,0,3295,3296,5,99,0,0,3296,3297,5,111,0,0,3297,3298,
- 5,110,0,0,3298,3299,5,118,0,0,3299,3300,5,46,0,0,3300,3301,5,117,0,0,3301,
- 4033,5,52,0,0,3302,3303,5,99,0,0,3303,3304,5,111,0,0,3304,3305,5,110,0,
- 0,3305,3306,5,118,0,0,3306,3307,5,46,0,0,3307,3308,5,117,0,0,3308,4033,
- 5,56,0,0,3309,3310,5,99,0,0,3310,3311,5,111,0,0,3311,3312,5,110,0,0,3312,
- 3313,5,118,0,0,3313,3314,5,46,0,0,3314,3315,5,114,0,0,3315,3316,5,46,0,
- 0,3316,3317,5,117,0,0,3317,4033,5,110,0,0,3318,3319,5,116,0,0,3319,3320,
- 5,104,0,0,3320,3321,5,114,0,0,3321,3322,5,111,0,0,3322,4033,5,119,0,0,
- 3323,3324,5,99,0,0,3324,3325,5,111,0,0,3325,3326,5,110,0,0,3326,3327,5,
- 118,0,0,3327,3328,5,46,0,0,3328,3329,5,111,0,0,3329,3330,5,118,0,0,3330,
- 3331,5,102,0,0,3331,3332,5,46,0,0,3332,3333,5,105,0,0,3333,3334,5,49,0,
- 0,3334,3335,5,46,0,0,3335,3336,5,117,0,0,3336,4033,5,110,0,0,3337,3338,
- 5,99,0,0,3338,3339,5,111,0,0,3339,3340,5,110,0,0,3340,3341,5,118,0,0,3341,
- 3342,5,46,0,0,3342,3343,5,111,0,0,3343,3344,5,118,0,0,3344,3345,5,102,
- 0,0,3345,3346,5,46,0,0,3346,3347,5,105,0,0,3347,3348,5,50,0,0,3348,3349,
- 5,46,0,0,3349,3350,5,117,0,0,3350,4033,5,110,0,0,3351,3352,5,99,0,0,3352,
- 3353,5,111,0,0,3353,3354,5,110,0,0,3354,3355,5,118,0,0,3355,3356,5,46,
- 0,0,3356,3357,5,111,0,0,3357,3358,5,118,0,0,3358,3359,5,102,0,0,3359,3360,
- 5,46,0,0,3360,3361,5,105,0,0,3361,3362,5,52,0,0,3362,3363,5,46,0,0,3363,
- 3364,5,117,0,0,3364,4033,5,110,0,0,3365,3366,5,99,0,0,3366,3367,5,111,
- 0,0,3367,3368,5,110,0,0,3368,3369,5,118,0,0,3369,3370,5,46,0,0,3370,3371,
- 5,111,0,0,3371,3372,5,118,0,0,3372,3373,5,102,0,0,3373,3374,5,46,0,0,3374,
- 3375,5,105,0,0,3375,3376,5,56,0,0,3376,3377,5,46,0,0,3377,3378,5,117,0,
- 0,3378,4033,5,110,0,0,3379,3380,5,99,0,0,3380,3381,5,111,0,0,3381,3382,
- 5,110,0,0,3382,3383,5,118,0,0,3383,3384,5,46,0,0,3384,3385,5,111,0,0,3385,
- 3386,5,118,0,0,3386,3387,5,102,0,0,3387,3388,5,46,0,0,3388,3389,5,117,
- 0,0,3389,3390,5,49,0,0,3390,3391,5,46,0,0,3391,3392,5,117,0,0,3392,4033,
- 5,110,0,0,3393,3394,5,99,0,0,3394,3395,5,111,0,0,3395,3396,5,110,0,0,3396,
- 3397,5,118,0,0,3397,3398,5,46,0,0,3398,3399,5,111,0,0,3399,3400,5,118,
- 0,0,3400,3401,5,102,0,0,3401,3402,5,46,0,0,3402,3403,5,117,0,0,3403,3404,
- 5,50,0,0,3404,3405,5,46,0,0,3405,3406,5,117,0,0,3406,4033,5,110,0,0,3407,
- 3408,5,99,0,0,3408,3409,5,111,0,0,3409,3410,5,110,0,0,3410,3411,5,118,
- 0,0,3411,3412,5,46,0,0,3412,3413,5,111,0,0,3413,3414,5,118,0,0,3414,3415,
- 5,102,0,0,3415,3416,5,46,0,0,3416,3417,5,117,0,0,3417,3418,5,52,0,0,3418,
- 3419,5,46,0,0,3419,3420,5,117,0,0,3420,4033,5,110,0,0,3421,3422,5,99,0,
- 0,3422,3423,5,111,0,0,3423,3424,5,110,0,0,3424,3425,5,118,0,0,3425,3426,
- 5,46,0,0,3426,3427,5,111,0,0,3427,3428,5,118,0,0,3428,3429,5,102,0,0,3429,
- 3430,5,46,0,0,3430,3431,5,117,0,0,3431,3432,5,56,0,0,3432,3433,5,46,0,
- 0,3433,3434,5,117,0,0,3434,4033,5,110,0,0,3435,3436,5,99,0,0,3436,3437,
- 5,111,0,0,3437,3438,5,110,0,0,3438,3439,5,118,0,0,3439,3440,5,46,0,0,3440,
- 3441,5,111,0,0,3441,3442,5,118,0,0,3442,3443,5,102,0,0,3443,3444,5,46,
- 0,0,3444,3445,5,105,0,0,3445,3446,5,46,0,0,3446,3447,5,117,0,0,3447,4033,
- 5,110,0,0,3448,3449,5,99,0,0,3449,3450,5,111,0,0,3450,3451,5,110,0,0,3451,
- 3452,5,118,0,0,3452,3453,5,46,0,0,3453,3454,5,111,0,0,3454,3455,5,118,
- 0,0,3455,3456,5,102,0,0,3456,3457,5,46,0,0,3457,3458,5,117,0,0,3458,3459,
- 5,46,0,0,3459,3460,5,117,0,0,3460,4033,5,110,0,0,3461,3462,5,108,0,0,3462,
- 3463,5,100,0,0,3463,3464,5,108,0,0,3464,3465,5,101,0,0,3465,4033,5,110,
- 0,0,3466,3467,5,108,0,0,3467,3468,5,100,0,0,3468,3469,5,101,0,0,3469,3470,
- 5,108,0,0,3470,3471,5,101,0,0,3471,3472,5,109,0,0,3472,3473,5,46,0,0,3473,
- 3474,5,105,0,0,3474,4033,5,49,0,0,3475,3476,5,108,0,0,3476,3477,5,100,
- 0,0,3477,3478,5,101,0,0,3478,3479,5,108,0,0,3479,3480,5,101,0,0,3480,3481,
- 5,109,0,0,3481,3482,5,46,0,0,3482,3483,5,117,0,0,3483,4033,5,49,0,0,3484,
- 3485,5,108,0,0,3485,3486,5,100,0,0,3486,3487,5,101,0,0,3487,3488,5,108,
- 0,0,3488,3489,5,101,0,0,3489,3490,5,109,0,0,3490,3491,5,46,0,0,3491,3492,
- 5,105,0,0,3492,4033,5,50,0,0,3493,3494,5,108,0,0,3494,3495,5,100,0,0,3495,
- 3496,5,101,0,0,3496,3497,5,108,0,0,3497,3498,5,101,0,0,3498,3499,5,109,
- 0,0,3499,3500,5,46,0,0,3500,3501,5,117,0,0,3501,4033,5,50,0,0,3502,3503,
- 5,108,0,0,3503,3504,5,100,0,0,3504,3505,5,101,0,0,3505,3506,5,108,0,0,
- 3506,3507,5,101,0,0,3507,3508,5,109,0,0,3508,3509,5,46,0,0,3509,3510,5,
- 105,0,0,3510,4033,5,52,0,0,3511,3512,5,108,0,0,3512,3513,5,100,0,0,3513,
- 3514,5,101,0,0,3514,3515,5,108,0,0,3515,3516,5,101,0,0,3516,3517,5,109,
- 0,0,3517,3518,5,46,0,0,3518,3519,5,117,0,0,3519,4033,5,52,0,0,3520,3521,
- 5,108,0,0,3521,3522,5,100,0,0,3522,3523,5,101,0,0,3523,3524,5,108,0,0,
- 3524,3525,5,101,0,0,3525,3526,5,109,0,0,3526,3527,5,46,0,0,3527,3528,5,
- 105,0,0,3528,4033,5,56,0,0,3529,3530,5,108,0,0,3530,3531,5,100,0,0,3531,
- 3532,5,101,0,0,3532,3533,5,108,0,0,3533,3534,5,101,0,0,3534,3535,5,109,
- 0,0,3535,3536,5,46,0,0,3536,3537,5,117,0,0,3537,4033,5,56,0,0,3538,3539,
- 5,108,0,0,3539,3540,5,100,0,0,3540,3541,5,101,0,0,3541,3542,5,108,0,0,
- 3542,3543,5,101,0,0,3543,3544,5,109,0,0,3544,3545,5,46,0,0,3545,4033,5,
- 105,0,0,3546,3547,5,108,0,0,3547,3548,5,100,0,0,3548,3549,5,101,0,0,3549,
- 3550,5,108,0,0,3550,3551,5,101,0,0,3551,3552,5,109,0,0,3552,3553,5,46,
- 0,0,3553,3554,5,114,0,0,3554,4033,5,52,0,0,3555,3556,5,108,0,0,3556,3557,
- 5,100,0,0,3557,3558,5,101,0,0,3558,3559,5,108,0,0,3559,3560,5,101,0,0,
- 3560,3561,5,109,0,0,3561,3562,5,46,0,0,3562,3563,5,114,0,0,3563,4033,5,
- 56,0,0,3564,3565,5,108,0,0,3565,3566,5,100,0,0,3566,3567,5,101,0,0,3567,
- 3568,5,108,0,0,3568,3569,5,101,0,0,3569,3570,5,109,0,0,3570,3571,5,46,
- 0,0,3571,3572,5,114,0,0,3572,3573,5,101,0,0,3573,4033,5,102,0,0,3574,3575,
- 5,115,0,0,3575,3576,5,116,0,0,3576,3577,5,101,0,0,3577,3578,5,108,0,0,
- 3578,3579,5,101,0,0,3579,3580,5,109,0,0,3580,3581,5,46,0,0,3581,4033,5,
- 105,0,0,3582,3583,5,115,0,0,3583,3584,5,116,0,0,3584,3585,5,101,0,0,3585,
- 3586,5,108,0,0,3586,3587,5,101,0,0,3587,3588,5,109,0,0,3588,3589,5,46,
- 0,0,3589,3590,5,105,0,0,3590,4033,5,49,0,0,3591,3592,5,115,0,0,3592,3593,
- 5,116,0,0,3593,3594,5,101,0,0,3594,3595,5,108,0,0,3595,3596,5,101,0,0,
- 3596,3597,5,109,0,0,3597,3598,5,46,0,0,3598,3599,5,105,0,0,3599,4033,5,
- 50,0,0,3600,3601,5,115,0,0,3601,3602,5,116,0,0,3602,3603,5,101,0,0,3603,
- 3604,5,108,0,0,3604,3605,5,101,0,0,3605,3606,5,109,0,0,3606,3607,5,46,
- 0,0,3607,3608,5,105,0,0,3608,4033,5,52,0,0,3609,3610,5,115,0,0,3610,3611,
- 5,116,0,0,3611,3612,5,101,0,0,3612,3613,5,108,0,0,3613,3614,5,101,0,0,
- 3614,3615,5,109,0,0,3615,3616,5,46,0,0,3616,3617,5,105,0,0,3617,4033,5,
- 56,0,0,3618,3619,5,115,0,0,3619,3620,5,116,0,0,3620,3621,5,101,0,0,3621,
- 3622,5,108,0,0,3622,3623,5,101,0,0,3623,3624,5,109,0,0,3624,3625,5,46,
- 0,0,3625,3626,5,114,0,0,3626,4033,5,52,0,0,3627,3628,5,115,0,0,3628,3629,
- 5,116,0,0,3629,3630,5,101,0,0,3630,3631,5,108,0,0,3631,3632,5,101,0,0,
- 3632,3633,5,109,0,0,3633,3634,5,46,0,0,3634,3635,5,114,0,0,3635,4033,5,
- 56,0,0,3636,3637,5,115,0,0,3637,3638,5,116,0,0,3638,3639,5,101,0,0,3639,
- 3640,5,108,0,0,3640,3641,5,101,0,0,3641,3642,5,109,0,0,3642,3643,5,46,
- 0,0,3643,3644,5,114,0,0,3644,3645,5,101,0,0,3645,4033,5,102,0,0,3646,3647,
- 5,99,0,0,3647,3648,5,111,0,0,3648,3649,5,110,0,0,3649,3650,5,118,0,0,3650,
- 3651,5,46,0,0,3651,3652,5,111,0,0,3652,3653,5,118,0,0,3653,3654,5,102,
- 0,0,3654,3655,5,46,0,0,3655,3656,5,105,0,0,3656,4033,5,49,0,0,3657,3658,
- 5,99,0,0,3658,3659,5,111,0,0,3659,3660,5,110,0,0,3660,3661,5,118,0,0,3661,
- 3662,5,46,0,0,3662,3663,5,111,0,0,3663,3664,5,118,0,0,3664,3665,5,102,
- 0,0,3665,3666,5,46,0,0,3666,3667,5,117,0,0,3667,4033,5,49,0,0,3668,3669,
- 5,99,0,0,3669,3670,5,111,0,0,3670,3671,5,110,0,0,3671,3672,5,118,0,0,3672,
- 3673,5,46,0,0,3673,3674,5,111,0,0,3674,3675,5,118,0,0,3675,3676,5,102,
- 0,0,3676,3677,5,46,0,0,3677,3678,5,105,0,0,3678,4033,5,50,0,0,3679,3680,
- 5,99,0,0,3680,3681,5,111,0,0,3681,3682,5,110,0,0,3682,3683,5,118,0,0,3683,
- 3684,5,46,0,0,3684,3685,5,111,0,0,3685,3686,5,118,0,0,3686,3687,5,102,
- 0,0,3687,3688,5,46,0,0,3688,3689,5,117,0,0,3689,4033,5,50,0,0,3690,3691,
- 5,99,0,0,3691,3692,5,111,0,0,3692,3693,5,110,0,0,3693,3694,5,118,0,0,3694,
- 3695,5,46,0,0,3695,3696,5,111,0,0,3696,3697,5,118,0,0,3697,3698,5,102,
- 0,0,3698,3699,5,46,0,0,3699,3700,5,105,0,0,3700,4033,5,52,0,0,3701,3702,
- 5,99,0,0,3702,3703,5,111,0,0,3703,3704,5,110,0,0,3704,3705,5,118,0,0,3705,
- 3706,5,46,0,0,3706,3707,5,111,0,0,3707,3708,5,118,0,0,3708,3709,5,102,
- 0,0,3709,3710,5,46,0,0,3710,3711,5,117,0,0,3711,4033,5,52,0,0,3712,3713,
- 5,99,0,0,3713,3714,5,111,0,0,3714,3715,5,110,0,0,3715,3716,5,118,0,0,3716,
- 3717,5,46,0,0,3717,3718,5,111,0,0,3718,3719,5,118,0,0,3719,3720,5,102,
- 0,0,3720,3721,5,46,0,0,3721,3722,5,105,0,0,3722,4033,5,56,0,0,3723,3724,
- 5,99,0,0,3724,3725,5,111,0,0,3725,3726,5,110,0,0,3726,3727,5,118,0,0,3727,
- 3728,5,46,0,0,3728,3729,5,111,0,0,3729,3730,5,118,0,0,3730,3731,5,102,
- 0,0,3731,3732,5,46,0,0,3732,3733,5,117,0,0,3733,4033,5,56,0,0,3734,3735,
- 5,99,0,0,3735,3736,5,107,0,0,3736,3737,5,102,0,0,3737,3738,5,105,0,0,3738,
- 3739,5,110,0,0,3739,3740,5,105,0,0,3740,3741,5,116,0,0,3741,4033,5,101,
- 0,0,3742,3743,5,99,0,0,3743,3744,5,111,0,0,3744,3745,5,110,0,0,3745,3746,
- 5,118,0,0,3746,3747,5,46,0,0,3747,3748,5,117,0,0,3748,4033,5,50,0,0,3749,
- 3750,5,99,0,0,3750,3751,5,111,0,0,3751,3752,5,110,0,0,3752,3753,5,118,
- 0,0,3753,3754,5,46,0,0,3754,3755,5,117,0,0,3755,4033,5,49,0,0,3756,3757,
- 5,99,0,0,3757,3758,5,111,0,0,3758,3759,5,110,0,0,3759,3760,5,118,0,0,3760,
- 3761,5,46,0,0,3761,4033,5,105,0,0,3762,3763,5,99,0,0,3763,3764,5,111,0,
- 0,3764,3765,5,110,0,0,3765,3766,5,118,0,0,3766,3767,5,46,0,0,3767,3768,
- 5,111,0,0,3768,3769,5,118,0,0,3769,3770,5,102,0,0,3770,3771,5,46,0,0,3771,
- 4033,5,105,0,0,3772,3773,5,99,0,0,3773,3774,5,111,0,0,3774,3775,5,110,
- 0,0,3775,3776,5,118,0,0,3776,3777,5,46,0,0,3777,3778,5,111,0,0,3778,3779,
- 5,118,0,0,3779,3780,5,102,0,0,3780,3781,5,46,0,0,3781,4033,5,117,0,0,3782,
- 3783,5,97,0,0,3783,3784,5,100,0,0,3784,3785,5,100,0,0,3785,3786,5,46,0,
- 0,3786,3787,5,111,0,0,3787,3788,5,118,0,0,3788,4033,5,102,0,0,3789,3790,
- 5,97,0,0,3790,3791,5,100,0,0,3791,3792,5,100,0,0,3792,3793,5,46,0,0,3793,
- 3794,5,111,0,0,3794,3795,5,118,0,0,3795,3796,5,102,0,0,3796,3797,5,46,
- 0,0,3797,3798,5,117,0,0,3798,4033,5,110,0,0,3799,3800,5,109,0,0,3800,3801,
- 5,117,0,0,3801,3802,5,108,0,0,3802,3803,5,46,0,0,3803,3804,5,111,0,0,3804,
- 3805,5,118,0,0,3805,4033,5,102,0,0,3806,3807,5,109,0,0,3807,3808,5,117,
- 0,0,3808,3809,5,108,0,0,3809,3810,5,46,0,0,3810,3811,5,111,0,0,3811,3812,
- 5,118,0,0,3812,3813,5,102,0,0,3813,3814,5,46,0,0,3814,3815,5,117,0,0,3815,
- 4033,5,110,0,0,3816,3817,5,115,0,0,3817,3818,5,117,0,0,3818,3819,5,98,
- 0,0,3819,3820,5,46,0,0,3820,3821,5,111,0,0,3821,3822,5,118,0,0,3822,4033,
- 5,102,0,0,3823,3824,5,115,0,0,3824,3825,5,117,0,0,3825,3826,5,98,0,0,3826,
- 3827,5,46,0,0,3827,3828,5,111,0,0,3828,3829,5,118,0,0,3829,3830,5,102,
- 0,0,3830,3831,5,46,0,0,3831,3832,5,117,0,0,3832,4033,5,110,0,0,3833,3834,
- 5,101,0,0,3834,3835,5,110,0,0,3835,3836,5,100,0,0,3836,3837,5,102,0,0,
- 3837,3838,5,105,0,0,3838,3839,5,110,0,0,3839,3840,5,97,0,0,3840,3841,5,
- 108,0,0,3841,3842,5,108,0,0,3842,4033,5,121,0,0,3843,3844,5,101,0,0,3844,
- 3845,5,110,0,0,3845,3846,5,100,0,0,3846,3847,5,102,0,0,3847,3848,5,97,
- 0,0,3848,3849,5,117,0,0,3849,3850,5,108,0,0,3850,4033,5,116,0,0,3851,3852,
- 5,115,0,0,3852,3853,5,116,0,0,3853,3854,5,105,0,0,3854,3855,5,110,0,0,
- 3855,3856,5,100,0,0,3856,3857,5,46,0,0,3857,4033,5,105,0,0,3858,3859,5,
- 99,0,0,3859,3860,5,111,0,0,3860,3861,5,110,0,0,3861,3862,5,118,0,0,3862,
- 3863,5,46,0,0,3863,4033,5,117,0,0,3864,3865,5,112,0,0,3865,3866,5,114,
- 0,0,3866,3867,5,101,0,0,3867,3868,5,102,0,0,3868,3869,5,105,0,0,3869,3870,
- 5,120,0,0,3870,4033,5,55,0,0,3871,3872,5,112,0,0,3872,3873,5,114,0,0,3873,
- 3874,5,101,0,0,3874,3875,5,102,0,0,3875,3876,5,105,0,0,3876,3877,5,120,
- 0,0,3877,4033,5,54,0,0,3878,3879,5,112,0,0,3879,3880,5,114,0,0,3880,3881,
- 5,101,0,0,3881,3882,5,102,0,0,3882,3883,5,105,0,0,3883,3884,5,120,0,0,
- 3884,4033,5,53,0,0,3885,3886,5,112,0,0,3886,3887,5,114,0,0,3887,3888,5,
- 101,0,0,3888,3889,5,102,0,0,3889,3890,5,105,0,0,3890,3891,5,120,0,0,3891,
- 4033,5,52,0,0,3892,3893,5,112,0,0,3893,3894,5,114,0,0,3894,3895,5,101,
- 0,0,3895,3896,5,102,0,0,3896,3897,5,105,0,0,3897,3898,5,120,0,0,3898,4033,
- 5,51,0,0,3899,3900,5,112,0,0,3900,3901,5,114,0,0,3901,3902,5,101,0,0,3902,
- 3903,5,102,0,0,3903,3904,5,105,0,0,3904,3905,5,120,0,0,3905,4033,5,50,
- 0,0,3906,3907,5,112,0,0,3907,3908,5,114,0,0,3908,3909,5,101,0,0,3909,3910,
- 5,102,0,0,3910,3911,5,105,0,0,3911,3912,5,120,0,0,3912,4033,5,49,0,0,3913,
- 3914,5,112,0,0,3914,3915,5,114,0,0,3915,3916,5,101,0,0,3916,3917,5,102,
- 0,0,3917,3918,5,105,0,0,3918,3919,5,120,0,0,3919,3920,5,114,0,0,3920,3921,
- 5,101,0,0,3921,4033,5,102,0,0,3922,3923,5,97,0,0,3923,3924,5,114,0,0,3924,
- 3925,5,103,0,0,3925,3926,5,108,0,0,3926,3927,5,105,0,0,3927,3928,5,115,
- 0,0,3928,4033,5,116,0,0,3929,3930,5,99,0,0,3930,3931,5,101,0,0,3931,4033,
- 5,113,0,0,3932,3933,5,99,0,0,3933,3934,5,103,0,0,3934,4033,5,116,0,0,3935,
- 3936,5,99,0,0,3936,3937,5,103,0,0,3937,3938,5,116,0,0,3938,3939,5,46,0,
- 0,3939,3940,5,117,0,0,3940,4033,5,110,0,0,3941,3942,5,99,0,0,3942,3943,
- 5,108,0,0,3943,4033,5,116,0,0,3944,3945,5,99,0,0,3945,3946,5,108,0,0,3946,
- 3947,5,116,0,0,3947,3948,5,46,0,0,3948,3949,5,117,0,0,3949,4033,5,110,
- 0,0,3950,3951,5,108,0,0,3951,3952,5,111,0,0,3952,3953,5,99,0,0,3953,3954,
- 5,97,0,0,3954,3955,5,108,0,0,3955,3956,5,108,0,0,3956,3957,5,111,0,0,3957,
- 4033,5,99,0,0,3958,3959,5,101,0,0,3959,3960,5,110,0,0,3960,3961,5,100,
- 0,0,3961,3962,5,102,0,0,3962,3963,5,105,0,0,3963,3964,5,108,0,0,3964,3965,
- 5,116,0,0,3965,3966,5,101,0,0,3966,4033,5,114,0,0,3967,3968,5,118,0,0,
- 3968,3969,5,111,0,0,3969,3970,5,108,0,0,3970,3971,5,97,0,0,3971,3972,5,
- 116,0,0,3972,3973,5,105,0,0,3973,3974,5,108,0,0,3974,3975,5,101,0,0,3975,
- 4033,5,46,0,0,3976,3977,5,116,0,0,3977,3978,5,97,0,0,3978,3979,5,105,0,
- 0,3979,3980,5,108,0,0,3980,4033,5,46,0,0,3981,3982,5,99,0,0,3982,3983,
- 5,112,0,0,3983,3984,5,98,0,0,3984,3985,5,108,0,0,3985,4033,5,107,0,0,3986,
- 3987,5,105,0,0,3987,3988,5,110,0,0,3988,3989,5,105,0,0,3989,3990,5,116,
- 0,0,3990,3991,5,98,0,0,3991,3992,5,108,0,0,3992,4033,5,107,0,0,3993,3994,
- 5,114,0,0,3994,3995,5,101,0,0,3995,3996,5,116,0,0,3996,3997,5,104,0,0,
- 3997,3998,5,114,0,0,3998,3999,5,111,0,0,3999,4033,5,119,0,0,4000,4001,
- 5,114,0,0,4001,4002,5,101,0,0,4002,4003,5,102,0,0,4003,4004,5,97,0,0,4004,
- 4005,5,110,0,0,4005,4006,5,121,0,0,4006,4007,5,116,0,0,4007,4008,5,121,
- 0,0,4008,4009,5,112,0,0,4009,4033,5,101,0,0,4010,4011,5,114,0,0,4011,4012,
- 5,101,0,0,4012,4013,5,97,0,0,4013,4014,5,100,0,0,4014,4015,5,111,0,0,4015,
- 4016,5,110,0,0,4016,4017,5,108,0,0,4017,4018,5,121,0,0,4018,4033,5,46,
- 0,0,4019,4020,5,105,0,0,4020,4021,5,108,0,0,4021,4022,5,108,0,0,4022,4023,
- 5,101,0,0,4023,4024,5,103,0,0,4024,4025,5,97,0,0,4025,4033,5,108,0,0,4026,
- 4027,5,101,0,0,4027,4028,5,110,0,0,4028,4029,5,100,0,0,4029,4030,5,109,
- 0,0,4030,4031,5,97,0,0,4031,4033,5,99,0,0,4032,2850,1,0,0,0,4032,2853,
- 1,0,0,0,4032,2858,1,0,0,0,4032,2865,1,0,0,0,4032,2872,1,0,0,0,4032,2879,
- 1,0,0,0,4032,2886,1,0,0,0,4032,2893,1,0,0,0,4032,2900,1,0,0,0,4032,2907,
- 1,0,0,0,4032,2914,1,0,0,0,4032,2921,1,0,0,0,4032,2928,1,0,0,0,4032,2935,
- 1,0,0,0,4032,2942,1,0,0,0,4032,2948,1,0,0,0,4032,2957,1,0,0,0,4032,2966,
- 1,0,0,0,4032,2974,1,0,0,0,4032,2982,1,0,0,0,4032,2990,1,0,0,0,4032,2998,
- 1,0,0,0,4032,3006,1,0,0,0,4032,3014,1,0,0,0,4032,3022,1,0,0,0,4032,3030,
- 1,0,0,0,4032,3038,1,0,0,0,4032,3041,1,0,0,0,4032,3044,1,0,0,0,4032,3047,
- 1,0,0,0,4032,3055,1,0,0,0,4032,3063,1,0,0,0,4032,3071,1,0,0,0,4032,3079,
- 1,0,0,0,4032,3087,1,0,0,0,4032,3095,1,0,0,0,4032,3103,1,0,0,0,4032,3111,
- 1,0,0,0,4032,3118,1,0,0,0,4032,3126,1,0,0,0,4032,3134,1,0,0,0,4032,3143,
- 1,0,0,0,4032,3152,1,0,0,0,4032,3160,1,0,0,0,4032,3168,1,0,0,0,4032,3176,
- 1,0,0,0,4032,3184,1,0,0,0,4032,3192,1,0,0,0,4032,3200,1,0,0,0,4032,3203,
- 1,0,0,0,4032,3206,1,0,0,0,4032,3209,1,0,0,0,4032,3212,1,0,0,0,4032,3218,
- 1,0,0,0,4032,3221,1,0,0,0,4032,3227,1,0,0,0,4032,3230,1,0,0,0,4032,3232,
- 1,0,0,0,4032,3235,1,0,0,0,4032,3238,1,0,0,0,4032,3241,1,0,0,0,4032,3247,
- 1,0,0,0,4032,3250,1,0,0,0,4032,3253,1,0,0,0,4032,3260,1,0,0,0,4032,3267,
- 1,0,0,0,4032,3274,1,0,0,0,4032,3281,1,0,0,0,4032,3288,1,0,0,0,4032,3295,
- 1,0,0,0,4032,3302,1,0,0,0,4032,3309,1,0,0,0,4032,3318,1,0,0,0,4032,3323,
- 1,0,0,0,4032,3337,1,0,0,0,4032,3351,1,0,0,0,4032,3365,1,0,0,0,4032,3379,
- 1,0,0,0,4032,3393,1,0,0,0,4032,3407,1,0,0,0,4032,3421,1,0,0,0,4032,3435,
- 1,0,0,0,4032,3448,1,0,0,0,4032,3461,1,0,0,0,4032,3466,1,0,0,0,4032,3475,
- 1,0,0,0,4032,3484,1,0,0,0,4032,3493,1,0,0,0,4032,3502,1,0,0,0,4032,3511,
- 1,0,0,0,4032,3520,1,0,0,0,4032,3529,1,0,0,0,4032,3538,1,0,0,0,4032,3546,
- 1,0,0,0,4032,3555,1,0,0,0,4032,3564,1,0,0,0,4032,3574,1,0,0,0,4032,3582,
- 1,0,0,0,4032,3591,1,0,0,0,4032,3600,1,0,0,0,4032,3609,1,0,0,0,4032,3618,
- 1,0,0,0,4032,3627,1,0,0,0,4032,3636,1,0,0,0,4032,3646,1,0,0,0,4032,3657,
- 1,0,0,0,4032,3668,1,0,0,0,4032,3679,1,0,0,0,4032,3690,1,0,0,0,4032,3701,
- 1,0,0,0,4032,3712,1,0,0,0,4032,3723,1,0,0,0,4032,3734,1,0,0,0,4032,3742,
- 1,0,0,0,4032,3749,1,0,0,0,4032,3756,1,0,0,0,4032,3762,1,0,0,0,4032,3772,
- 1,0,0,0,4032,3782,1,0,0,0,4032,3789,1,0,0,0,4032,3799,1,0,0,0,4032,3806,
- 1,0,0,0,4032,3816,1,0,0,0,4032,3823,1,0,0,0,4032,3833,1,0,0,0,4032,3843,
- 1,0,0,0,4032,3851,1,0,0,0,4032,3858,1,0,0,0,4032,3864,1,0,0,0,4032,3871,
- 1,0,0,0,4032,3878,1,0,0,0,4032,3885,1,0,0,0,4032,3892,1,0,0,0,4032,3899,
- 1,0,0,0,4032,3906,1,0,0,0,4032,3913,1,0,0,0,4032,3922,1,0,0,0,4032,3929,
- 1,0,0,0,4032,3932,1,0,0,0,4032,3935,1,0,0,0,4032,3941,1,0,0,0,4032,3944,
- 1,0,0,0,4032,3950,1,0,0,0,4032,3958,1,0,0,0,4032,3967,1,0,0,0,4032,3976,
- 1,0,0,0,4032,3981,1,0,0,0,4032,3986,1,0,0,0,4032,3993,1,0,0,0,4032,4000,
- 1,0,0,0,4032,4010,1,0,0,0,4032,4019,1,0,0,0,4032,4026,1,0,0,0,4033,552,
- 1,0,0,0,4034,4035,5,108,0,0,4035,4036,5,100,0,0,4036,4037,5,97,0,0,4037,
- 4038,5,114,0,0,4038,4039,5,103,0,0,4039,4040,5,46,0,0,4040,4111,5,115,
- 0,0,4041,4042,5,108,0,0,4042,4043,5,100,0,0,4043,4044,5,97,0,0,4044,4045,
- 5,114,0,0,4045,4046,5,103,0,0,4046,4047,5,97,0,0,4047,4048,5,46,0,0,4048,
- 4111,5,115,0,0,4049,4050,5,115,0,0,4050,4051,5,116,0,0,4051,4052,5,97,
- 0,0,4052,4053,5,114,0,0,4053,4054,5,103,0,0,4054,4055,5,46,0,0,4055,4111,
- 5,115,0,0,4056,4057,5,108,0,0,4057,4058,5,100,0,0,4058,4059,5,108,0,0,
- 4059,4060,5,111,0,0,4060,4061,5,99,0,0,4061,4062,5,46,0,0,4062,4111,5,
- 115,0,0,4063,4064,5,108,0,0,4064,4065,5,100,0,0,4065,4066,5,108,0,0,4066,
- 4067,5,111,0,0,4067,4068,5,99,0,0,4068,4069,5,97,0,0,4069,4070,5,46,0,
- 0,4070,4111,5,115,0,0,4071,4072,5,115,0,0,4072,4073,5,116,0,0,4073,4074,
- 5,108,0,0,4074,4075,5,111,0,0,4075,4076,5,99,0,0,4076,4077,5,46,0,0,4077,
- 4111,5,115,0,0,4078,4079,5,108,0,0,4079,4080,5,100,0,0,4080,4081,5,97,
- 0,0,4081,4082,5,114,0,0,4082,4111,5,103,0,0,4083,4084,5,108,0,0,4084,4085,
- 5,100,0,0,4085,4086,5,97,0,0,4086,4087,5,114,0,0,4087,4088,5,103,0,0,4088,
- 4111,5,97,0,0,4089,4090,5,115,0,0,4090,4091,5,116,0,0,4091,4092,5,97,0,
- 0,4092,4093,5,114,0,0,4093,4111,5,103,0,0,4094,4095,5,108,0,0,4095,4096,
- 5,100,0,0,4096,4097,5,108,0,0,4097,4098,5,111,0,0,4098,4111,5,99,0,0,4099,
- 4100,5,108,0,0,4100,4101,5,100,0,0,4101,4102,5,108,0,0,4102,4103,5,111,
- 0,0,4103,4104,5,99,0,0,4104,4111,5,97,0,0,4105,4106,5,115,0,0,4106,4107,
- 5,116,0,0,4107,4108,5,108,0,0,4108,4109,5,111,0,0,4109,4111,5,99,0,0,4110,
- 4034,1,0,0,0,4110,4041,1,0,0,0,4110,4049,1,0,0,0,4110,4056,1,0,0,0,4110,
- 4063,1,0,0,0,4110,4071,1,0,0,0,4110,4078,1,0,0,0,4110,4083,1,0,0,0,4110,
- 4089,1,0,0,0,4110,4094,1,0,0,0,4110,4099,1,0,0,0,4110,4105,1,0,0,0,4111,
- 554,1,0,0,0,4112,4113,5,108,0,0,4113,4114,5,100,0,0,4114,4115,5,99,0,0,
- 4115,4116,5,46,0,0,4116,4117,5,105,0,0,4117,4118,5,52,0,0,4118,4119,5,
- 46,0,0,4119,4140,5,115,0,0,4120,4121,5,108,0,0,4121,4122,5,100,0,0,4122,
- 4123,5,99,0,0,4123,4124,5,46,0,0,4124,4125,5,105,0,0,4125,4140,5,52,0,
- 0,4126,4127,5,117,0,0,4127,4128,5,110,0,0,4128,4129,5,97,0,0,4129,4130,
- 5,108,0,0,4130,4131,5,105,0,0,4131,4132,5,103,0,0,4132,4133,5,110,0,0,
- 4133,4134,5,101,0,0,4134,4135,5,100,0,0,4135,4140,5,46,0,0,4136,4137,5,
- 110,0,0,4137,4138,5,111,0,0,4138,4140,5,46,0,0,4139,4112,1,0,0,0,4139,
- 4120,1,0,0,0,4139,4126,1,0,0,0,4139,4136,1,0,0,0,4140,556,1,0,0,0,4141,
- 4142,5,108,0,0,4142,4143,5,100,0,0,4143,4144,5,99,0,0,4144,4145,5,46,0,
- 0,4145,4146,5,105,0,0,4146,4147,5,56,0,0,4147,558,1,0,0,0,4148,4149,5,
- 108,0,0,4149,4150,5,100,0,0,4150,4151,5,99,0,0,4151,4152,5,46,0,0,4152,
- 4153,5,114,0,0,4153,4161,5,52,0,0,4154,4155,5,108,0,0,4155,4156,5,100,
- 0,0,4156,4157,5,99,0,0,4157,4158,5,46,0,0,4158,4159,5,114,0,0,4159,4161,
- 5,56,0,0,4160,4148,1,0,0,0,4160,4154,1,0,0,0,4161,560,1,0,0,0,4162,4163,
- 5,106,0,0,4163,4164,5,109,0,0,4164,4198,5,112,0,0,4165,4166,5,99,0,0,4166,
- 4167,5,97,0,0,4167,4168,5,108,0,0,4168,4198,5,108,0,0,4169,4170,5,99,0,
- 0,4170,4171,5,97,0,0,4171,4172,5,108,0,0,4172,4173,5,108,0,0,4173,4174,
- 5,118,0,0,4174,4175,5,105,0,0,4175,4176,5,114,0,0,4176,4198,5,116,0,0,
- 4177,4178,5,110,0,0,4178,4179,5,101,0,0,4179,4180,5,119,0,0,4180,4181,
- 5,111,0,0,4181,4182,5,98,0,0,4182,4198,5,106,0,0,4183,4184,5,108,0,0,4184,
- 4185,5,100,0,0,4185,4186,5,102,0,0,4186,4187,5,116,0,0,4187,4198,5,110,
- 0,0,4188,4189,5,108,0,0,4189,4190,5,100,0,0,4190,4191,5,118,0,0,4191,4192,
- 5,105,0,0,4192,4193,5,114,0,0,4193,4194,5,116,0,0,4194,4195,5,102,0,0,
- 4195,4196,5,116,0,0,4196,4198,5,110,0,0,4197,4162,1,0,0,0,4197,4165,1,
- 0,0,0,4197,4169,1,0,0,0,4197,4177,1,0,0,0,4197,4183,1,0,0,0,4197,4188,
- 1,0,0,0,4198,562,1,0,0,0,4199,4200,5,99,0,0,4200,4201,5,97,0,0,4201,4202,
- 5,108,0,0,4202,4203,5,108,0,0,4203,4204,5,105,0,0,4204,564,1,0,0,0,4205,
- 4206,5,98,0,0,4206,4207,5,114,0,0,4207,4208,5,46,0,0,4208,4364,5,115,0,
- 0,4209,4210,5,98,0,0,4210,4211,5,114,0,0,4211,4212,5,102,0,0,4212,4213,
- 5,97,0,0,4213,4214,5,108,0,0,4214,4215,5,115,0,0,4215,4216,5,101,0,0,4216,
- 4217,5,46,0,0,4217,4364,5,115,0,0,4218,4219,5,98,0,0,4219,4220,5,114,0,
- 0,4220,4221,5,116,0,0,4221,4222,5,114,0,0,4222,4223,5,117,0,0,4223,4224,
- 5,101,0,0,4224,4225,5,46,0,0,4225,4364,5,115,0,0,4226,4227,5,98,0,0,4227,
- 4228,5,101,0,0,4228,4229,5,113,0,0,4229,4230,5,46,0,0,4230,4364,5,115,
- 0,0,4231,4232,5,98,0,0,4232,4233,5,103,0,0,4233,4234,5,101,0,0,4234,4235,
- 5,46,0,0,4235,4364,5,115,0,0,4236,4237,5,98,0,0,4237,4238,5,103,0,0,4238,
- 4239,5,116,0,0,4239,4240,5,46,0,0,4240,4364,5,115,0,0,4241,4242,5,98,0,
- 0,4242,4243,5,108,0,0,4243,4244,5,101,0,0,4244,4245,5,46,0,0,4245,4364,
- 5,115,0,0,4246,4247,5,98,0,0,4247,4248,5,108,0,0,4248,4249,5,116,0,0,4249,
- 4250,5,46,0,0,4250,4364,5,115,0,0,4251,4252,5,98,0,0,4252,4253,5,110,0,
- 0,4253,4254,5,101,0,0,4254,4255,5,46,0,0,4255,4256,5,117,0,0,4256,4257,
- 5,110,0,0,4257,4258,5,46,0,0,4258,4364,5,115,0,0,4259,4260,5,98,0,0,4260,
- 4261,5,103,0,0,4261,4262,5,101,0,0,4262,4263,5,46,0,0,4263,4264,5,117,
- 0,0,4264,4265,5,110,0,0,4265,4266,5,46,0,0,4266,4364,5,115,0,0,4267,4268,
- 5,98,0,0,4268,4269,5,103,0,0,4269,4270,5,116,0,0,4270,4271,5,46,0,0,4271,
- 4272,5,117,0,0,4272,4273,5,110,0,0,4273,4274,5,46,0,0,4274,4364,5,115,
- 0,0,4275,4276,5,98,0,0,4276,4277,5,108,0,0,4277,4278,5,101,0,0,4278,4279,
- 5,46,0,0,4279,4280,5,117,0,0,4280,4281,5,110,0,0,4281,4282,5,46,0,0,4282,
- 4364,5,115,0,0,4283,4284,5,98,0,0,4284,4285,5,108,0,0,4285,4286,5,116,
- 0,0,4286,4287,5,46,0,0,4287,4288,5,117,0,0,4288,4289,5,110,0,0,4289,4290,
- 5,46,0,0,4290,4364,5,115,0,0,4291,4292,5,98,0,0,4292,4364,5,114,0,0,4293,
- 4294,5,98,0,0,4294,4295,5,114,0,0,4295,4296,5,102,0,0,4296,4297,5,97,0,
- 0,4297,4298,5,108,0,0,4298,4299,5,115,0,0,4299,4364,5,101,0,0,4300,4301,
- 5,98,0,0,4301,4302,5,114,0,0,4302,4303,5,116,0,0,4303,4304,5,114,0,0,4304,
- 4305,5,117,0,0,4305,4364,5,101,0,0,4306,4307,5,98,0,0,4307,4308,5,101,
- 0,0,4308,4364,5,113,0,0,4309,4310,5,98,0,0,4310,4311,5,103,0,0,4311,4364,
- 5,101,0,0,4312,4313,5,98,0,0,4313,4314,5,103,0,0,4314,4364,5,116,0,0,4315,
- 4316,5,98,0,0,4316,4317,5,108,0,0,4317,4364,5,101,0,0,4318,4319,5,98,0,
- 0,4319,4320,5,108,0,0,4320,4364,5,116,0,0,4321,4322,5,98,0,0,4322,4323,
- 5,110,0,0,4323,4324,5,101,0,0,4324,4325,5,46,0,0,4325,4326,5,117,0,0,4326,
- 4364,5,110,0,0,4327,4328,5,98,0,0,4328,4329,5,103,0,0,4329,4330,5,101,
- 0,0,4330,4331,5,46,0,0,4331,4332,5,117,0,0,4332,4364,5,110,0,0,4333,4334,
- 5,98,0,0,4334,4335,5,103,0,0,4335,4336,5,116,0,0,4336,4337,5,46,0,0,4337,
- 4338,5,117,0,0,4338,4364,5,110,0,0,4339,4340,5,98,0,0,4340,4341,5,108,
- 0,0,4341,4342,5,101,0,0,4342,4343,5,46,0,0,4343,4344,5,117,0,0,4344,4364,
- 5,110,0,0,4345,4346,5,98,0,0,4346,4347,5,108,0,0,4347,4348,5,116,0,0,4348,
- 4349,5,46,0,0,4349,4350,5,117,0,0,4350,4364,5,110,0,0,4351,4352,5,108,
- 0,0,4352,4353,5,101,0,0,4353,4354,5,97,0,0,4354,4355,5,118,0,0,4355,4364,
- 5,101,0,0,4356,4357,5,108,0,0,4357,4358,5,101,0,0,4358,4359,5,97,0,0,4359,
- 4360,5,118,0,0,4360,4361,5,101,0,0,4361,4362,5,46,0,0,4362,4364,5,115,
- 0,0,4363,4205,1,0,0,0,4363,4209,1,0,0,0,4363,4218,1,0,0,0,4363,4226,1,
- 0,0,0,4363,4231,1,0,0,0,4363,4236,1,0,0,0,4363,4241,1,0,0,0,4363,4246,
- 1,0,0,0,4363,4251,1,0,0,0,4363,4259,1,0,0,0,4363,4267,1,0,0,0,4363,4275,
- 1,0,0,0,4363,4283,1,0,0,0,4363,4291,1,0,0,0,4363,4293,1,0,0,0,4363,4300,
- 1,0,0,0,4363,4306,1,0,0,0,4363,4309,1,0,0,0,4363,4312,1,0,0,0,4363,4315,
- 1,0,0,0,4363,4318,1,0,0,0,4363,4321,1,0,0,0,4363,4327,1,0,0,0,4363,4333,
- 1,0,0,0,4363,4339,1,0,0,0,4363,4345,1,0,0,0,4363,4351,1,0,0,0,4363,4356,
- 1,0,0,0,4364,566,1,0,0,0,4365,4366,5,115,0,0,4366,4367,5,119,0,0,4367,
- 4368,5,105,0,0,4368,4369,5,116,0,0,4369,4370,5,99,0,0,4370,4371,5,104,
- 0,0,4371,568,1,0,0,0,4372,4373,5,99,0,0,4373,4374,5,112,0,0,4374,4375,
- 5,111,0,0,4375,4376,5,98,0,0,4376,4487,5,106,0,0,4377,4378,5,108,0,0,4378,
- 4379,5,100,0,0,4379,4380,5,111,0,0,4380,4381,5,98,0,0,4381,4487,5,106,
- 0,0,4382,4383,5,99,0,0,4383,4384,5,97,0,0,4384,4385,5,115,0,0,4385,4386,
- 5,116,0,0,4386,4387,5,99,0,0,4387,4388,5,108,0,0,4388,4389,5,97,0,0,4389,
- 4390,5,115,0,0,4390,4487,5,115,0,0,4391,4392,5,105,0,0,4392,4393,5,115,
- 0,0,4393,4394,5,105,0,0,4394,4395,5,110,0,0,4395,4396,5,115,0,0,4396,4487,
- 5,116,0,0,4397,4398,5,117,0,0,4398,4399,5,110,0,0,4399,4400,5,98,0,0,4400,
- 4401,5,111,0,0,4401,4487,5,120,0,0,4402,4403,5,115,0,0,4403,4404,5,116,
- 0,0,4404,4405,5,111,0,0,4405,4406,5,98,0,0,4406,4487,5,106,0,0,4407,4408,
- 5,98,0,0,4408,4409,5,111,0,0,4409,4487,5,120,0,0,4410,4411,5,110,0,0,4411,
- 4412,5,101,0,0,4412,4413,5,119,0,0,4413,4414,5,97,0,0,4414,4415,5,114,
- 0,0,4415,4487,5,114,0,0,4416,4417,5,108,0,0,4417,4418,5,100,0,0,4418,4419,
- 5,101,0,0,4419,4420,5,108,0,0,4420,4421,5,101,0,0,4421,4422,5,109,0,0,
- 4422,4487,5,97,0,0,4423,4424,5,108,0,0,4424,4425,5,100,0,0,4425,4426,5,
- 101,0,0,4426,4427,5,108,0,0,4427,4428,5,101,0,0,4428,4487,5,109,0,0,4429,
- 4430,5,115,0,0,4430,4431,5,116,0,0,4431,4432,5,101,0,0,4432,4433,5,108,
- 0,0,4433,4434,5,101,0,0,4434,4487,5,109,0,0,4435,4436,5,117,0,0,4436,4437,
- 5,110,0,0,4437,4438,5,98,0,0,4438,4439,5,111,0,0,4439,4440,5,120,0,0,4440,
- 4441,5,46,0,0,4441,4442,5,97,0,0,4442,4443,5,110,0,0,4443,4487,5,121,0,
- 0,4444,4445,5,114,0,0,4445,4446,5,101,0,0,4446,4447,5,102,0,0,4447,4448,
- 5,97,0,0,4448,4449,5,110,0,0,4449,4450,5,121,0,0,4450,4451,5,118,0,0,4451,
- 4452,5,97,0,0,4452,4487,5,108,0,0,4453,4454,5,109,0,0,4454,4455,5,107,
- 0,0,4455,4456,5,114,0,0,4456,4457,5,101,0,0,4457,4458,5,102,0,0,4458,4459,
- 5,97,0,0,4459,4460,5,110,0,0,4460,4487,5,121,0,0,4461,4462,5,105,0,0,4462,
- 4463,5,110,0,0,4463,4464,5,105,0,0,4464,4465,5,116,0,0,4465,4466,5,111,
- 0,0,4466,4467,5,98,0,0,4467,4487,5,106,0,0,4468,4469,5,99,0,0,4469,4470,
- 5,111,0,0,4470,4471,5,110,0,0,4471,4472,5,115,0,0,4472,4473,5,116,0,0,
- 4473,4474,5,114,0,0,4474,4475,5,97,0,0,4475,4476,5,105,0,0,4476,4477,5,
- 110,0,0,4477,4478,5,101,0,0,4478,4479,5,100,0,0,4479,4487,5,46,0,0,4480,
- 4481,5,115,0,0,4481,4482,5,105,0,0,4482,4483,5,122,0,0,4483,4484,5,101,
- 0,0,4484,4485,5,111,0,0,4485,4487,5,102,0,0,4486,4372,1,0,0,0,4486,4377,
- 1,0,0,0,4486,4382,1,0,0,0,4486,4391,1,0,0,0,4486,4397,1,0,0,0,4486,4402,
- 1,0,0,0,4486,4407,1,0,0,0,4486,4410,1,0,0,0,4486,4416,1,0,0,0,4486,4423,
- 1,0,0,0,4486,4429,1,0,0,0,4486,4435,1,0,0,0,4486,4444,1,0,0,0,4486,4453,
- 1,0,0,0,4486,4461,1,0,0,0,4486,4468,1,0,0,0,4486,4480,1,0,0,0,4487,570,
- 1,0,0,0,4488,4489,5,108,0,0,4489,4490,5,100,0,0,4490,4491,5,115,0,0,4491,
- 4492,5,116,0,0,4492,4493,5,114,0,0,4493,572,1,0,0,0,4494,4495,5,108,0,
- 0,4495,4496,5,100,0,0,4496,4497,5,102,0,0,4497,4498,5,108,0,0,4498,4530,
- 5,100,0,0,4499,4500,5,108,0,0,4500,4501,5,100,0,0,4501,4502,5,102,0,0,
- 4502,4503,5,108,0,0,4503,4504,5,100,0,0,4504,4530,5,97,0,0,4505,4506,5,
- 115,0,0,4506,4507,5,116,0,0,4507,4508,5,102,0,0,4508,4509,5,108,0,0,4509,
- 4530,5,100,0,0,4510,4511,5,108,0,0,4511,4512,5,100,0,0,4512,4513,5,115,
- 0,0,4513,4514,5,102,0,0,4514,4515,5,108,0,0,4515,4530,5,100,0,0,4516,4517,
- 5,108,0,0,4517,4518,5,100,0,0,4518,4519,5,115,0,0,4519,4520,5,102,0,0,
- 4520,4521,5,108,0,0,4521,4522,5,100,0,0,4522,4530,5,97,0,0,4523,4524,5,
- 115,0,0,4524,4525,5,116,0,0,4525,4526,5,115,0,0,4526,4527,5,102,0,0,4527,
- 4528,5,108,0,0,4528,4530,5,100,0,0,4529,4494,1,0,0,0,4529,4499,1,0,0,0,
- 4529,4505,1,0,0,0,4529,4510,1,0,0,0,4529,4516,1,0,0,0,4529,4523,1,0,0,
- 0,4530,574,1,0,0,0,4531,4532,5,108,0,0,4532,4533,5,100,0,0,4533,4534,5,
- 116,0,0,4534,4535,5,111,0,0,4535,4536,5,107,0,0,4536,4537,5,101,0,0,4537,
- 4538,5,110,0,0,4538,576,1,0,0,0,4539,4540,7,8,0,0,4540,578,1,0,0,0,4541,
- 4542,7,9,0,0,4542,580,1,0,0,0,4543,4544,3,583,291,0,4544,4545,3,531,265,
- 0,4545,4547,1,0,0,0,4546,4543,1,0,0,0,4547,4548,1,0,0,0,4548,4546,1,0,
- 0,0,4548,4549,1,0,0,0,4549,4550,1,0,0,0,4550,4551,3,583,291,0,4551,582,
- 1,0,0,0,4552,4556,3,577,288,0,4553,4555,3,579,289,0,4554,4553,1,0,0,0,
- 4555,4558,1,0,0,0,4556,4554,1,0,0,0,4556,4557,1,0,0,0,4557,584,1,0,0,0,
- 4558,4556,1,0,0,0,4559,4560,7,0,0,0,4560,4561,7,0,0,0,4561,586,1,0,0,0,
- 4562,4563,7,10,0,0,4563,4564,1,0,0,0,4564,4565,6,293,0,0,4565,588,1,0,
- 0,0,4566,4567,5,47,0,0,4567,4568,5,47,0,0,4568,4572,1,0,0,0,4569,4571,
- 8,11,0,0,4570,4569,1,0,0,0,4571,4574,1,0,0,0,4572,4570,1,0,0,0,4572,4573,
- 1,0,0,0,4573,4575,1,0,0,0,4574,4572,1,0,0,0,4575,4576,6,294,0,0,4576,590,
- 1,0,0,0,4577,4578,5,47,0,0,4578,4579,5,42,0,0,4579,4583,1,0,0,0,4580,4582,
- 9,0,0,0,4581,4580,1,0,0,0,4582,4585,1,0,0,0,4583,4584,1,0,0,0,4583,4581,
- 1,0,0,0,4584,4586,1,0,0,0,4585,4583,1,0,0,0,4586,4587,5,42,0,0,4587,4588,
- 5,47,0,0,4588,4589,1,0,0,0,4589,4590,6,295,0,0,4590,592,1,0,0,0,4591,4592,
- 5,46,0,0,4592,4593,5,112,0,0,4593,4594,5,101,0,0,4594,4595,5,114,0,0,4595,
- 4596,5,109,0,0,4596,4597,5,105,0,0,4597,4598,5,115,0,0,4598,4599,5,115,
- 0,0,4599,4600,5,105,0,0,4600,4601,5,111,0,0,4601,4602,5,110,0,0,4602,594,
- 1,0,0,0,4603,4604,5,46,0,0,4604,4605,5,112,0,0,4605,4606,5,101,0,0,4606,
- 4607,5,114,0,0,4607,4608,5,109,0,0,4608,4609,5,105,0,0,4609,4610,5,115,
- 0,0,4610,4611,5,115,0,0,4611,4612,5,105,0,0,4612,4613,5,111,0,0,4613,4614,
- 5,110,0,0,4614,4615,5,115,0,0,4615,4616,5,101,0,0,4616,4617,5,116,0,0,
- 4617,596,1,0,0,0,4618,4619,5,46,0,0,4619,4620,5,101,0,0,4620,4621,5,109,
- 0,0,4621,4622,5,105,0,0,4622,4623,5,116,0,0,4623,4624,5,98,0,0,4624,4625,
- 5,121,0,0,4625,4626,5,116,0,0,4626,4627,5,101,0,0,4627,598,1,0,0,0,4628,
- 4629,5,46,0,0,4629,4630,5,109,0,0,4630,4631,5,97,0,0,4631,4632,5,120,0,
- 0,4632,4633,5,115,0,0,4633,4634,5,116,0,0,4634,4635,5,97,0,0,4635,4636,
- 5,99,0,0,4636,4637,5,107,0,0,4637,600,1,0,0,0,4638,4639,5,46,0,0,4639,
- 4640,5,101,0,0,4640,4641,5,110,0,0,4641,4642,5,116,0,0,4642,4643,5,114,
- 0,0,4643,4644,5,121,0,0,4644,4645,5,112,0,0,4645,4646,5,111,0,0,4646,4647,
- 5,105,0,0,4647,4648,5,110,0,0,4648,4649,5,116,0,0,4649,602,1,0,0,0,4650,
- 4651,5,46,0,0,4651,4652,5,122,0,0,4652,4653,5,101,0,0,4653,4654,5,114,
- 0,0,4654,4655,5,111,0,0,4655,4656,5,105,0,0,4656,4657,5,110,0,0,4657,4658,
- 5,105,0,0,4658,4659,5,116,0,0,4659,604,1,0,0,0,4660,4661,5,46,0,0,4661,
- 4662,5,108,0,0,4662,4663,5,111,0,0,4663,4664,5,99,0,0,4664,4665,5,97,0,
- 0,4665,4666,5,108,0,0,4666,4667,5,115,0,0,4667,606,1,0,0,0,4668,4669,5,
- 46,0,0,4669,4670,5,101,0,0,4670,4671,5,120,0,0,4671,4672,5,112,0,0,4672,
- 4673,5,111,0,0,4673,4674,5,114,0,0,4674,4675,5,116,0,0,4675,608,1,0,0,
- 0,4676,4677,5,46,0,0,4677,4678,5,111,0,0,4678,4679,5,118,0,0,4679,4680,
- 5,101,0,0,4680,4681,5,114,0,0,4681,4682,5,114,0,0,4682,4683,5,105,0,0,
- 4683,4684,5,100,0,0,4684,4685,5,101,0,0,4685,610,1,0,0,0,4686,4687,5,46,
- 0,0,4687,4688,5,118,0,0,4688,4689,5,116,0,0,4689,4690,5,101,0,0,4690,4691,
- 5,110,0,0,4691,4692,5,116,0,0,4692,4693,5,114,0,0,4693,4694,5,121,0,0,
- 4694,612,1,0,0,0,45,0,2024,2032,2037,2039,2042,2050,2055,2057,2060,2065,
- 2071,2075,2080,2082,2086,2091,2093,2099,2103,2108,2110,2112,2149,2701,
- 2752,2755,2758,2761,2766,2768,2776,2778,4032,4110,4139,4160,4197,4363,
- 4486,4529,4548,4556,4572,4583,1,6,0,0
+ 1,304,1,304,1,304,1,304,1,304,1,304,1,305,1,305,1,305,1,305,1,305,1,305,
+ 1,305,1,305,1,305,1,305,1,306,1,306,1,306,1,306,1,306,1,306,1,306,1,306,
+ 1,306,1,4603,0,307,1,1,3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,
+ 23,12,25,13,27,14,29,15,31,16,33,17,35,18,37,19,39,20,41,21,43,22,45,23,
+ 47,24,49,25,51,26,53,27,55,28,57,29,59,30,61,31,63,32,65,33,67,34,69,35,
+ 71,36,73,37,75,38,77,39,79,40,81,41,83,42,85,43,87,44,89,45,91,46,93,47,
+ 95,48,97,49,99,50,101,51,103,52,105,53,107,54,109,55,111,56,113,57,115,
+ 58,117,59,119,60,121,61,123,62,125,63,127,64,129,65,131,66,133,67,135,
+ 68,137,69,139,70,141,71,143,72,145,73,147,74,149,75,151,76,153,77,155,
+ 78,157,79,159,80,161,81,163,82,165,83,167,84,169,85,171,86,173,87,175,
+ 88,177,89,179,90,181,91,183,92,185,93,187,94,189,95,191,96,193,97,195,
+ 98,197,99,199,100,201,101,203,102,205,103,207,104,209,105,211,106,213,
+ 107,215,108,217,109,219,110,221,111,223,112,225,113,227,114,229,115,231,
+ 116,233,117,235,118,237,119,239,120,241,121,243,122,245,123,247,124,249,
+ 125,251,126,253,127,255,128,257,129,259,130,261,131,263,132,265,133,267,
+ 134,269,135,271,136,273,137,275,138,277,139,279,140,281,141,283,142,285,
+ 143,287,144,289,145,291,146,293,147,295,148,297,149,299,150,301,151,303,
+ 152,305,153,307,154,309,155,311,156,313,157,315,158,317,159,319,160,321,
+ 161,323,162,325,163,327,164,329,165,331,166,333,167,335,168,337,169,339,
+ 170,341,171,343,172,345,173,347,174,349,175,351,176,353,177,355,178,357,
+ 179,359,180,361,181,363,182,365,183,367,184,369,185,371,186,373,187,375,
+ 188,377,189,379,0,381,190,383,191,385,192,387,193,389,194,391,195,393,
+ 196,395,197,397,198,399,199,401,200,403,201,405,202,407,203,409,204,411,
+ 205,413,206,415,207,417,208,419,209,421,210,423,211,425,212,427,213,429,
+ 214,431,215,433,216,435,217,437,218,439,219,441,220,443,221,445,222,447,
+ 223,449,224,451,225,453,226,455,227,457,228,459,229,461,230,463,231,465,
+ 232,467,233,469,234,471,235,473,236,475,237,477,238,479,239,481,240,483,
+ 241,485,242,487,243,489,244,491,245,493,246,495,247,497,248,499,249,501,
+ 250,503,251,505,252,507,253,509,254,511,255,513,256,515,257,517,258,519,
+ 259,521,260,523,261,525,262,527,0,529,263,531,264,533,265,535,266,537,
+ 267,539,268,541,269,543,270,545,271,547,272,549,273,551,274,553,275,555,
+ 276,557,277,559,278,561,279,563,280,565,281,567,282,569,283,571,284,573,
+ 285,575,286,577,287,579,0,581,0,583,288,585,289,587,290,589,291,591,292,
+ 593,293,595,294,597,295,599,296,601,297,603,298,605,299,607,300,609,301,
+ 611,302,613,303,1,0,12,3,0,48,57,65,70,97,102,1,0,48,57,2,0,69,69,101,
+ 101,2,0,43,43,45,45,11,0,34,34,39,39,47,48,63,63,92,92,97,98,102,102,110,
+ 110,114,114,116,116,118,118,1,0,48,55,4,0,10,10,13,13,34,34,92,92,4,0,
+ 10,10,13,13,39,39,92,92,4,0,35,36,63,90,95,95,97,122,4,0,35,36,48,57,63,
+ 90,95,122,3,0,9,10,13,13,32,32,2,0,10,10,13,13,4968,0,1,1,0,0,0,0,3,1,
+ 0,0,0,0,5,1,0,0,0,0,7,1,0,0,0,0,9,1,0,0,0,0,11,1,0,0,0,0,13,1,0,0,0,0,
+ 15,1,0,0,0,0,17,1,0,0,0,0,19,1,0,0,0,0,21,1,0,0,0,0,23,1,0,0,0,0,25,1,
+ 0,0,0,0,27,1,0,0,0,0,29,1,0,0,0,0,31,1,0,0,0,0,33,1,0,0,0,0,35,1,0,0,0,
+ 0,37,1,0,0,0,0,39,1,0,0,0,0,41,1,0,0,0,0,43,1,0,0,0,0,45,1,0,0,0,0,47,
+ 1,0,0,0,0,49,1,0,0,0,0,51,1,0,0,0,0,53,1,0,0,0,0,55,1,0,0,0,0,57,1,0,0,
+ 0,0,59,1,0,0,0,0,61,1,0,0,0,0,63,1,0,0,0,0,65,1,0,0,0,0,67,1,0,0,0,0,69,
+ 1,0,0,0,0,71,1,0,0,0,0,73,1,0,0,0,0,75,1,0,0,0,0,77,1,0,0,0,0,79,1,0,0,
+ 0,0,81,1,0,0,0,0,83,1,0,0,0,0,85,1,0,0,0,0,87,1,0,0,0,0,89,1,0,0,0,0,91,
+ 1,0,0,0,0,93,1,0,0,0,0,95,1,0,0,0,0,97,1,0,0,0,0,99,1,0,0,0,0,101,1,0,
+ 0,0,0,103,1,0,0,0,0,105,1,0,0,0,0,107,1,0,0,0,0,109,1,0,0,0,0,111,1,0,
+ 0,0,0,113,1,0,0,0,0,115,1,0,0,0,0,117,1,0,0,0,0,119,1,0,0,0,0,121,1,0,
+ 0,0,0,123,1,0,0,0,0,125,1,0,0,0,0,127,1,0,0,0,0,129,1,0,0,0,0,131,1,0,
+ 0,0,0,133,1,0,0,0,0,135,1,0,0,0,0,137,1,0,0,0,0,139,1,0,0,0,0,141,1,0,
+ 0,0,0,143,1,0,0,0,0,145,1,0,0,0,0,147,1,0,0,0,0,149,1,0,0,0,0,151,1,0,
+ 0,0,0,153,1,0,0,0,0,155,1,0,0,0,0,157,1,0,0,0,0,159,1,0,0,0,0,161,1,0,
+ 0,0,0,163,1,0,0,0,0,165,1,0,0,0,0,167,1,0,0,0,0,169,1,0,0,0,0,171,1,0,
+ 0,0,0,173,1,0,0,0,0,175,1,0,0,0,0,177,1,0,0,0,0,179,1,0,0,0,0,181,1,0,
+ 0,0,0,183,1,0,0,0,0,185,1,0,0,0,0,187,1,0,0,0,0,189,1,0,0,0,0,191,1,0,
+ 0,0,0,193,1,0,0,0,0,195,1,0,0,0,0,197,1,0,0,0,0,199,1,0,0,0,0,201,1,0,
+ 0,0,0,203,1,0,0,0,0,205,1,0,0,0,0,207,1,0,0,0,0,209,1,0,0,0,0,211,1,0,
+ 0,0,0,213,1,0,0,0,0,215,1,0,0,0,0,217,1,0,0,0,0,219,1,0,0,0,0,221,1,0,
+ 0,0,0,223,1,0,0,0,0,225,1,0,0,0,0,227,1,0,0,0,0,229,1,0,0,0,0,231,1,0,
+ 0,0,0,233,1,0,0,0,0,235,1,0,0,0,0,237,1,0,0,0,0,239,1,0,0,0,0,241,1,0,
+ 0,0,0,243,1,0,0,0,0,245,1,0,0,0,0,247,1,0,0,0,0,249,1,0,0,0,0,251,1,0,
+ 0,0,0,253,1,0,0,0,0,255,1,0,0,0,0,257,1,0,0,0,0,259,1,0,0,0,0,261,1,0,
+ 0,0,0,263,1,0,0,0,0,265,1,0,0,0,0,267,1,0,0,0,0,269,1,0,0,0,0,271,1,0,
+ 0,0,0,273,1,0,0,0,0,275,1,0,0,0,0,277,1,0,0,0,0,279,1,0,0,0,0,281,1,0,
+ 0,0,0,283,1,0,0,0,0,285,1,0,0,0,0,287,1,0,0,0,0,289,1,0,0,0,0,291,1,0,
+ 0,0,0,293,1,0,0,0,0,295,1,0,0,0,0,297,1,0,0,0,0,299,1,0,0,0,0,301,1,0,
+ 0,0,0,303,1,0,0,0,0,305,1,0,0,0,0,307,1,0,0,0,0,309,1,0,0,0,0,311,1,0,
+ 0,0,0,313,1,0,0,0,0,315,1,0,0,0,0,317,1,0,0,0,0,319,1,0,0,0,0,321,1,0,
+ 0,0,0,323,1,0,0,0,0,325,1,0,0,0,0,327,1,0,0,0,0,329,1,0,0,0,0,331,1,0,
+ 0,0,0,333,1,0,0,0,0,335,1,0,0,0,0,337,1,0,0,0,0,339,1,0,0,0,0,341,1,0,
+ 0,0,0,343,1,0,0,0,0,345,1,0,0,0,0,347,1,0,0,0,0,349,1,0,0,0,0,351,1,0,
+ 0,0,0,353,1,0,0,0,0,355,1,0,0,0,0,357,1,0,0,0,0,359,1,0,0,0,0,361,1,0,
+ 0,0,0,363,1,0,0,0,0,365,1,0,0,0,0,367,1,0,0,0,0,369,1,0,0,0,0,371,1,0,
+ 0,0,0,373,1,0,0,0,0,375,1,0,0,0,0,377,1,0,0,0,0,381,1,0,0,0,0,383,1,0,
+ 0,0,0,385,1,0,0,0,0,387,1,0,0,0,0,389,1,0,0,0,0,391,1,0,0,0,0,393,1,0,
+ 0,0,0,395,1,0,0,0,0,397,1,0,0,0,0,399,1,0,0,0,0,401,1,0,0,0,0,403,1,0,
+ 0,0,0,405,1,0,0,0,0,407,1,0,0,0,0,409,1,0,0,0,0,411,1,0,0,0,0,413,1,0,
+ 0,0,0,415,1,0,0,0,0,417,1,0,0,0,0,419,1,0,0,0,0,421,1,0,0,0,0,423,1,0,
+ 0,0,0,425,1,0,0,0,0,427,1,0,0,0,0,429,1,0,0,0,0,431,1,0,0,0,0,433,1,0,
+ 0,0,0,435,1,0,0,0,0,437,1,0,0,0,0,439,1,0,0,0,0,441,1,0,0,0,0,443,1,0,
+ 0,0,0,445,1,0,0,0,0,447,1,0,0,0,0,449,1,0,0,0,0,451,1,0,0,0,0,453,1,0,
+ 0,0,0,455,1,0,0,0,0,457,1,0,0,0,0,459,1,0,0,0,0,461,1,0,0,0,0,463,1,0,
+ 0,0,0,465,1,0,0,0,0,467,1,0,0,0,0,469,1,0,0,0,0,471,1,0,0,0,0,473,1,0,
+ 0,0,0,475,1,0,0,0,0,477,1,0,0,0,0,479,1,0,0,0,0,481,1,0,0,0,0,483,1,0,
+ 0,0,0,485,1,0,0,0,0,487,1,0,0,0,0,489,1,0,0,0,0,491,1,0,0,0,0,493,1,0,
+ 0,0,0,495,1,0,0,0,0,497,1,0,0,0,0,499,1,0,0,0,0,501,1,0,0,0,0,503,1,0,
+ 0,0,0,505,1,0,0,0,0,507,1,0,0,0,0,509,1,0,0,0,0,511,1,0,0,0,0,513,1,0,
+ 0,0,0,515,1,0,0,0,0,517,1,0,0,0,0,519,1,0,0,0,0,521,1,0,0,0,0,523,1,0,
+ 0,0,0,525,1,0,0,0,0,529,1,0,0,0,0,531,1,0,0,0,0,533,1,0,0,0,0,535,1,0,
+ 0,0,0,537,1,0,0,0,0,539,1,0,0,0,0,541,1,0,0,0,0,543,1,0,0,0,0,545,1,0,
+ 0,0,0,547,1,0,0,0,0,549,1,0,0,0,0,551,1,0,0,0,0,553,1,0,0,0,0,555,1,0,
+ 0,0,0,557,1,0,0,0,0,559,1,0,0,0,0,561,1,0,0,0,0,563,1,0,0,0,0,565,1,0,
+ 0,0,0,567,1,0,0,0,0,569,1,0,0,0,0,571,1,0,0,0,0,573,1,0,0,0,0,575,1,0,
+ 0,0,0,577,1,0,0,0,0,583,1,0,0,0,0,585,1,0,0,0,0,587,1,0,0,0,0,589,1,0,
+ 0,0,0,591,1,0,0,0,0,593,1,0,0,0,0,595,1,0,0,0,0,597,1,0,0,0,0,599,1,0,
+ 0,0,0,601,1,0,0,0,0,603,1,0,0,0,0,605,1,0,0,0,0,607,1,0,0,0,0,609,1,0,
+ 0,0,0,611,1,0,0,0,0,613,1,0,0,0,1,615,1,0,0,0,3,622,1,0,0,0,5,626,1,0,
+ 0,0,7,632,1,0,0,0,9,640,1,0,0,0,11,651,1,0,0,0,13,663,1,0,0,0,15,671,1,
+ 0,0,0,17,684,1,0,0,0,19,697,1,0,0,0,21,708,1,0,0,0,23,727,1,0,0,0,25,742,
+ 1,0,0,0,27,765,1,0,0,0,29,771,1,0,0,0,31,780,1,0,0,0,33,789,1,0,0,0,35,
+ 791,1,0,0,0,37,793,1,0,0,0,39,804,1,0,0,0,41,814,1,0,0,0,43,820,1,0,0,
+ 0,45,830,1,0,0,0,47,841,1,0,0,0,49,855,1,0,0,0,51,865,1,0,0,0,53,875,1,
+ 0,0,0,55,885,1,0,0,0,57,887,1,0,0,0,59,897,1,0,0,0,61,899,1,0,0,0,63,901,
+ 1,0,0,0,65,903,1,0,0,0,67,912,1,0,0,0,69,915,1,0,0,0,71,923,1,0,0,0,73,
+ 925,1,0,0,0,75,931,1,0,0,0,77,940,1,0,0,0,79,946,1,0,0,0,81,953,1,0,0,
+ 0,83,962,1,0,0,0,85,964,1,0,0,0,87,966,1,0,0,0,89,969,1,0,0,0,91,983,1,
+ 0,0,0,93,999,1,0,0,0,95,1015,1,0,0,0,97,1023,1,0,0,0,99,1034,1,0,0,0,101,
+ 1041,1,0,0,0,103,1048,1,0,0,0,105,1056,1,0,0,0,107,1063,1,0,0,0,109,1072,
+ 1,0,0,0,111,1077,1,0,0,0,113,1088,1,0,0,0,115,1096,1,0,0,0,117,1105,1,
+ 0,0,0,119,1112,1,0,0,0,121,1125,1,0,0,0,123,1140,1,0,0,0,125,1147,1,0,
+ 0,0,127,1154,1,0,0,0,129,1163,1,0,0,0,131,1175,1,0,0,0,133,1186,1,0,0,
+ 0,135,1202,1,0,0,0,137,1214,1,0,0,0,139,1228,1,0,0,0,141,1234,1,0,0,0,
+ 143,1242,1,0,0,0,145,1253,1,0,0,0,147,1259,1,0,0,0,149,1265,1,0,0,0,151,
+ 1267,1,0,0,0,153,1278,1,0,0,0,155,1291,1,0,0,0,157,1302,1,0,0,0,159,1317,
+ 1,0,0,0,161,1321,1,0,0,0,163,1327,1,0,0,0,165,1331,1,0,0,0,167,1337,1,
+ 0,0,0,169,1347,1,0,0,0,171,1350,1,0,0,0,173,1352,1,0,0,0,175,1354,1,0,
+ 0,0,177,1356,1,0,0,0,179,1366,1,0,0,0,181,1375,1,0,0,0,183,1384,1,0,0,
+ 0,185,1391,1,0,0,0,187,1398,1,0,0,0,189,1405,1,0,0,0,191,1410,1,0,0,0,
+ 193,1416,1,0,0,0,195,1424,1,0,0,0,197,1431,1,0,0,0,199,1438,1,0,0,0,201,
+ 1443,1,0,0,0,203,1454,1,0,0,0,205,1464,1,0,0,0,207,1477,1,0,0,0,209,1484,
+ 1,0,0,0,211,1491,1,0,0,0,213,1501,1,0,0,0,215,1513,1,0,0,0,217,1524,1,
+ 0,0,0,219,1537,1,0,0,0,221,1554,1,0,0,0,223,1572,1,0,0,0,225,1581,1,0,
+ 0,0,227,1589,1,0,0,0,229,1591,1,0,0,0,231,1601,1,0,0,0,233,1607,1,0,0,
+ 0,235,1613,1,0,0,0,237,1619,1,0,0,0,239,1624,1,0,0,0,241,1639,1,0,0,0,
+ 243,1646,1,0,0,0,245,1654,1,0,0,0,247,1661,1,0,0,0,249,1670,1,0,0,0,251,
+ 1683,1,0,0,0,253,1691,1,0,0,0,255,1705,1,0,0,0,257,1712,1,0,0,0,259,1719,
+ 1,0,0,0,261,1729,1,0,0,0,263,1735,1,0,0,0,265,1742,1,0,0,0,267,1752,1,
+ 0,0,0,269,1757,1,0,0,0,271,1762,1,0,0,0,273,1765,1,0,0,0,275,1769,1,0,
+ 0,0,277,1773,1,0,0,0,279,1781,1,0,0,0,281,1787,1,0,0,0,283,1795,1,0,0,
+ 0,285,1802,1,0,0,0,287,1812,1,0,0,0,289,1820,1,0,0,0,291,1833,1,0,0,0,
+ 293,1843,1,0,0,0,295,1855,1,0,0,0,297,1864,1,0,0,0,299,1872,1,0,0,0,301,
+ 1879,1,0,0,0,303,1887,1,0,0,0,305,1890,1,0,0,0,307,1894,1,0,0,0,309,1907,
+ 1,0,0,0,311,1914,1,0,0,0,313,1917,1,0,0,0,315,1922,1,0,0,0,317,1927,1,
+ 0,0,0,319,1930,1,0,0,0,321,1937,1,0,0,0,323,1943,1,0,0,0,325,1951,1,0,
+ 0,0,327,1957,1,0,0,0,329,1965,1,0,0,0,331,1971,1,0,0,0,333,1975,1,0,0,
+ 0,335,1986,1,0,0,0,337,1997,1,0,0,0,339,2002,1,0,0,0,341,2010,1,0,0,0,
+ 343,2026,1,0,0,0,345,2037,1,0,0,0,347,2055,1,0,0,0,349,2073,1,0,0,0,351,
+ 2127,1,0,0,0,353,2130,1,0,0,0,355,2134,1,0,0,0,357,2139,1,0,0,0,359,2147,
+ 1,0,0,0,361,2162,1,0,0,0,363,2164,1,0,0,0,365,2171,1,0,0,0,367,2176,1,
+ 0,0,0,369,2181,1,0,0,0,371,2187,1,0,0,0,373,2193,1,0,0,0,375,2199,1,0,
+ 0,0,377,2207,1,0,0,0,379,2215,1,0,0,0,381,2224,1,0,0,0,383,2230,1,0,0,
+ 0,385,2237,1,0,0,0,387,2244,1,0,0,0,389,2251,1,0,0,0,391,2255,1,0,0,0,
+ 393,2260,1,0,0,0,395,2265,1,0,0,0,397,2272,1,0,0,0,399,2280,1,0,0,0,401,
+ 2286,1,0,0,0,403,2296,1,0,0,0,405,2301,1,0,0,0,407,2306,1,0,0,0,409,2313,
+ 1,0,0,0,411,2319,1,0,0,0,413,2329,1,0,0,0,415,2335,1,0,0,0,417,2343,1,
+ 0,0,0,419,2352,1,0,0,0,421,2360,1,0,0,0,423,2366,1,0,0,0,425,2374,1,0,
+ 0,0,427,2379,1,0,0,0,429,2384,1,0,0,0,431,2390,1,0,0,0,433,2397,1,0,0,
+ 0,435,2404,1,0,0,0,437,2414,1,0,0,0,439,2423,1,0,0,0,441,2433,1,0,0,0,
+ 443,2440,1,0,0,0,445,2450,1,0,0,0,447,2460,1,0,0,0,449,2469,1,0,0,0,451,
+ 2474,1,0,0,0,453,2480,1,0,0,0,455,2487,1,0,0,0,457,2491,1,0,0,0,459,2500,
+ 1,0,0,0,461,2507,1,0,0,0,463,2515,1,0,0,0,465,2522,1,0,0,0,467,2534,1,
+ 0,0,0,469,2541,1,0,0,0,471,2550,1,0,0,0,473,2555,1,0,0,0,475,2562,1,0,
+ 0,0,477,2570,1,0,0,0,479,2586,1,0,0,0,481,2600,1,0,0,0,483,2612,1,0,0,
+ 0,485,2615,1,0,0,0,487,2621,1,0,0,0,489,2630,1,0,0,0,491,2639,1,0,0,0,
+ 493,2647,1,0,0,0,495,2654,1,0,0,0,497,2664,1,0,0,0,499,2670,1,0,0,0,501,
+ 2678,1,0,0,0,503,2687,1,0,0,0,505,2696,1,0,0,0,507,2698,1,0,0,0,509,2715,
+ 1,0,0,0,511,2717,1,0,0,0,513,2724,1,0,0,0,515,2735,1,0,0,0,517,2741,1,
+ 0,0,0,519,2747,1,0,0,0,521,2755,1,0,0,0,523,2757,1,0,0,0,525,2760,1,0,
+ 0,0,527,2762,1,0,0,0,529,2777,1,0,0,0,531,2787,1,0,0,0,533,2797,1,0,0,
+ 0,535,2799,1,0,0,0,537,2801,1,0,0,0,539,2809,1,0,0,0,541,2816,1,0,0,0,
+ 543,2823,1,0,0,0,545,2831,1,0,0,0,547,2837,1,0,0,0,549,2844,1,0,0,0,551,
+ 2853,1,0,0,0,553,4052,1,0,0,0,555,4130,1,0,0,0,557,4159,1,0,0,0,559,4161,
+ 1,0,0,0,561,4180,1,0,0,0,563,4217,1,0,0,0,565,4219,1,0,0,0,567,4383,1,
+ 0,0,0,569,4385,1,0,0,0,571,4506,1,0,0,0,573,4508,1,0,0,0,575,4549,1,0,
+ 0,0,577,4551,1,0,0,0,579,4559,1,0,0,0,581,4561,1,0,0,0,583,4566,1,0,0,
+ 0,585,4572,1,0,0,0,587,4579,1,0,0,0,589,4582,1,0,0,0,591,4586,1,0,0,0,
+ 593,4597,1,0,0,0,595,4611,1,0,0,0,597,4623,1,0,0,0,599,4638,1,0,0,0,601,
+ 4648,1,0,0,0,603,4658,1,0,0,0,605,4670,1,0,0,0,607,4680,1,0,0,0,609,4688,
+ 1,0,0,0,611,4696,1,0,0,0,613,4706,1,0,0,0,615,616,5,110,0,0,616,617,5,
+ 97,0,0,617,618,5,116,0,0,618,619,5,105,0,0,619,620,5,118,0,0,620,621,5,
+ 101,0,0,621,2,1,0,0,0,622,623,5,99,0,0,623,624,5,105,0,0,624,625,5,108,
+ 0,0,625,4,1,0,0,0,626,627,5,111,0,0,627,628,5,112,0,0,628,629,5,116,0,
+ 0,629,630,5,105,0,0,630,631,5,108,0,0,631,6,1,0,0,0,632,633,5,109,0,0,
+ 633,634,5,97,0,0,634,635,5,110,0,0,635,636,5,97,0,0,636,637,5,103,0,0,
+ 637,638,5,101,0,0,638,639,5,100,0,0,639,8,1,0,0,0,640,641,5,102,0,0,641,
+ 642,5,111,0,0,642,643,5,114,0,0,643,644,5,119,0,0,644,645,5,97,0,0,645,
+ 646,5,114,0,0,646,647,5,100,0,0,647,648,5,114,0,0,648,649,5,101,0,0,649,
+ 650,5,102,0,0,650,10,1,0,0,0,651,652,5,112,0,0,652,653,5,114,0,0,653,654,
+ 5,101,0,0,654,655,5,115,0,0,655,656,5,101,0,0,656,657,5,114,0,0,657,658,
+ 5,118,0,0,658,659,5,101,0,0,659,660,5,115,0,0,660,661,5,105,0,0,661,662,
+ 5,103,0,0,662,12,1,0,0,0,663,664,5,114,0,0,664,665,5,117,0,0,665,666,5,
+ 110,0,0,666,667,5,116,0,0,667,668,5,105,0,0,668,669,5,109,0,0,669,670,
+ 5,101,0,0,670,14,1,0,0,0,671,672,5,105,0,0,672,673,5,110,0,0,673,674,5,
+ 116,0,0,674,675,5,101,0,0,675,676,5,114,0,0,676,677,5,110,0,0,677,678,
+ 5,97,0,0,678,679,5,108,0,0,679,680,5,99,0,0,680,681,5,97,0,0,681,682,5,
+ 108,0,0,682,683,5,108,0,0,683,16,1,0,0,0,684,685,5,115,0,0,685,686,5,121,
+ 0,0,686,687,5,110,0,0,687,688,5,99,0,0,688,689,5,104,0,0,689,690,5,114,
+ 0,0,690,691,5,111,0,0,691,692,5,110,0,0,692,693,5,105,0,0,693,694,5,122,
+ 0,0,694,695,5,101,0,0,695,696,5,100,0,0,696,18,1,0,0,0,697,698,5,110,0,
+ 0,698,699,5,111,0,0,699,700,5,105,0,0,700,701,5,110,0,0,701,702,5,108,
+ 0,0,702,703,5,105,0,0,703,704,5,110,0,0,704,705,5,105,0,0,705,706,5,110,
+ 0,0,706,707,5,103,0,0,707,20,1,0,0,0,708,709,5,97,0,0,709,710,5,103,0,
+ 0,710,711,5,103,0,0,711,712,5,114,0,0,712,713,5,101,0,0,713,714,5,115,
+ 0,0,714,715,5,115,0,0,715,716,5,105,0,0,716,717,5,118,0,0,717,718,5,101,
+ 0,0,718,719,5,105,0,0,719,720,5,110,0,0,720,721,5,108,0,0,721,722,5,105,
+ 0,0,722,723,5,110,0,0,723,724,5,105,0,0,724,725,5,110,0,0,725,726,5,103,
+ 0,0,726,22,1,0,0,0,727,728,5,110,0,0,728,729,5,111,0,0,729,730,5,111,0,
+ 0,730,731,5,112,0,0,731,732,5,116,0,0,732,733,5,105,0,0,733,734,5,109,
+ 0,0,734,735,5,105,0,0,735,736,5,122,0,0,736,737,5,97,0,0,737,738,5,116,
+ 0,0,738,739,5,105,0,0,739,740,5,111,0,0,740,741,5,110,0,0,741,24,1,0,0,
+ 0,742,743,5,97,0,0,743,744,5,103,0,0,744,745,5,103,0,0,745,746,5,114,0,
+ 0,746,747,5,101,0,0,747,748,5,115,0,0,748,749,5,115,0,0,749,750,5,105,
+ 0,0,750,751,5,118,0,0,751,752,5,101,0,0,752,753,5,111,0,0,753,754,5,112,
+ 0,0,754,755,5,116,0,0,755,756,5,105,0,0,756,757,5,109,0,0,757,758,5,105,
+ 0,0,758,759,5,122,0,0,759,760,5,97,0,0,760,761,5,116,0,0,761,762,5,105,
+ 0,0,762,763,5,111,0,0,763,764,5,110,0,0,764,26,1,0,0,0,765,766,5,97,0,
+ 0,766,767,5,115,0,0,767,768,5,121,0,0,768,769,5,110,0,0,769,770,5,99,0,
+ 0,770,28,1,0,0,0,771,772,5,101,0,0,772,773,5,120,0,0,773,774,5,116,0,0,
+ 774,775,5,101,0,0,775,776,5,110,0,0,776,777,5,100,0,0,777,778,5,101,0,
+ 0,778,779,5,100,0,0,779,30,1,0,0,0,780,781,5,118,0,0,781,782,5,111,0,0,
+ 782,783,5,108,0,0,783,784,5,97,0,0,784,785,5,116,0,0,785,786,5,105,0,0,
+ 786,787,5,108,0,0,787,788,5,101,0,0,788,32,1,0,0,0,789,790,5,123,0,0,790,
+ 34,1,0,0,0,791,792,5,125,0,0,792,36,1,0,0,0,793,794,5,46,0,0,794,795,5,
+ 115,0,0,795,796,5,117,0,0,796,797,5,98,0,0,797,798,5,115,0,0,798,799,5,
+ 121,0,0,799,800,5,115,0,0,800,801,5,116,0,0,801,802,5,101,0,0,802,803,
+ 5,109,0,0,803,38,1,0,0,0,804,805,5,46,0,0,805,806,5,99,0,0,806,807,5,111,
+ 0,0,807,808,5,114,0,0,808,809,5,102,0,0,809,810,5,108,0,0,810,811,5,97,
+ 0,0,811,812,5,103,0,0,812,813,5,115,0,0,813,40,1,0,0,0,814,815,5,46,0,
+ 0,815,816,5,102,0,0,816,817,5,105,0,0,817,818,5,108,0,0,818,819,5,101,
+ 0,0,819,42,1,0,0,0,820,821,5,97,0,0,821,822,5,108,0,0,822,823,5,105,0,
+ 0,823,824,5,103,0,0,824,825,5,110,0,0,825,826,5,109,0,0,826,827,5,101,
+ 0,0,827,828,5,110,0,0,828,829,5,116,0,0,829,44,1,0,0,0,830,831,5,46,0,
+ 0,831,832,5,105,0,0,832,833,5,109,0,0,833,834,5,97,0,0,834,835,5,103,0,
+ 0,835,836,5,101,0,0,836,837,5,98,0,0,837,838,5,97,0,0,838,839,5,115,0,
+ 0,839,840,5,101,0,0,840,46,1,0,0,0,841,842,5,46,0,0,842,843,5,115,0,0,
+ 843,844,5,116,0,0,844,845,5,97,0,0,845,846,5,99,0,0,846,847,5,107,0,0,
+ 847,848,5,114,0,0,848,849,5,101,0,0,849,850,5,115,0,0,850,851,5,101,0,
+ 0,851,852,5,114,0,0,852,853,5,118,0,0,853,854,5,101,0,0,854,48,1,0,0,0,
+ 855,856,5,46,0,0,856,857,5,97,0,0,857,858,5,115,0,0,858,859,5,115,0,0,
+ 859,860,5,101,0,0,860,861,5,109,0,0,861,862,5,98,0,0,862,863,5,108,0,0,
+ 863,864,5,121,0,0,864,50,1,0,0,0,865,866,5,46,0,0,866,867,5,109,0,0,867,
+ 868,5,115,0,0,868,869,5,99,0,0,869,870,5,111,0,0,870,871,5,114,0,0,871,
+ 872,5,108,0,0,872,873,5,105,0,0,873,874,5,98,0,0,874,52,1,0,0,0,875,876,
+ 5,46,0,0,876,877,5,108,0,0,877,878,5,97,0,0,878,879,5,110,0,0,879,880,
+ 5,103,0,0,880,881,5,117,0,0,881,882,5,97,0,0,882,883,5,103,0,0,883,884,
+ 5,101,0,0,884,54,1,0,0,0,885,886,5,44,0,0,886,56,1,0,0,0,887,888,5,46,
+ 0,0,888,889,5,116,0,0,889,890,5,121,0,0,890,891,5,112,0,0,891,892,5,101,
+ 0,0,892,893,5,108,0,0,893,894,5,105,0,0,894,895,5,115,0,0,895,896,5,116,
+ 0,0,896,58,1,0,0,0,897,898,5,40,0,0,898,60,1,0,0,0,899,900,5,41,0,0,900,
+ 62,1,0,0,0,901,902,5,59,0,0,902,64,1,0,0,0,903,904,5,46,0,0,904,905,5,
+ 116,0,0,905,906,5,121,0,0,906,907,5,112,0,0,907,908,5,101,0,0,908,909,
+ 5,100,0,0,909,910,5,101,0,0,910,911,5,102,0,0,911,66,1,0,0,0,912,913,5,
+ 97,0,0,913,914,5,115,0,0,914,68,1,0,0,0,915,916,5,46,0,0,916,917,5,99,
+ 0,0,917,918,5,117,0,0,918,919,5,115,0,0,919,920,5,116,0,0,920,921,5,111,
+ 0,0,921,922,5,109,0,0,922,70,1,0,0,0,923,924,5,61,0,0,924,72,1,0,0,0,925,
+ 926,5,102,0,0,926,927,5,105,0,0,927,928,5,101,0,0,928,929,5,108,0,0,929,
+ 930,5,100,0,0,930,74,1,0,0,0,931,932,5,112,0,0,932,933,5,114,0,0,933,934,
+ 5,111,0,0,934,935,5,112,0,0,935,936,5,101,0,0,936,937,5,114,0,0,937,938,
+ 5,116,0,0,938,939,5,121,0,0,939,76,1,0,0,0,940,941,5,99,0,0,941,942,5,
+ 108,0,0,942,943,5,97,0,0,943,944,5,115,0,0,944,945,5,115,0,0,945,78,1,
+ 0,0,0,946,947,5,101,0,0,947,948,5,120,0,0,948,949,5,116,0,0,949,950,5,
+ 101,0,0,950,951,5,114,0,0,951,952,5,110,0,0,952,80,1,0,0,0,953,954,5,46,
+ 0,0,954,955,5,118,0,0,955,956,5,116,0,0,956,957,5,102,0,0,957,958,5,105,
+ 0,0,958,959,5,120,0,0,959,960,5,117,0,0,960,961,5,112,0,0,961,82,1,0,0,
+ 0,962,963,5,91,0,0,963,84,1,0,0,0,964,965,5,93,0,0,965,86,1,0,0,0,966,
+ 967,5,97,0,0,967,968,5,116,0,0,968,88,1,0,0,0,969,970,5,102,0,0,970,971,
+ 5,114,0,0,971,972,5,111,0,0,972,973,5,109,0,0,973,974,5,117,0,0,974,975,
+ 5,110,0,0,975,976,5,109,0,0,976,977,5,97,0,0,977,978,5,110,0,0,978,979,
+ 5,97,0,0,979,980,5,103,0,0,980,981,5,101,0,0,981,982,5,100,0,0,982,90,
+ 1,0,0,0,983,984,5,99,0,0,984,985,5,97,0,0,985,986,5,108,0,0,986,987,5,
+ 108,0,0,987,988,5,109,0,0,988,989,5,111,0,0,989,990,5,115,0,0,990,991,
+ 5,116,0,0,991,992,5,100,0,0,992,993,5,101,0,0,993,994,5,114,0,0,994,995,
+ 5,105,0,0,995,996,5,118,0,0,996,997,5,101,0,0,997,998,5,100,0,0,998,92,
+ 1,0,0,0,999,1000,5,114,0,0,1000,1001,5,101,0,0,1001,1002,5,116,0,0,1002,
+ 1003,5,97,0,0,1003,1004,5,105,0,0,1004,1005,5,110,0,0,1005,1006,5,97,0,
+ 0,1006,1007,5,112,0,0,1007,1008,5,112,0,0,1008,1009,5,100,0,0,1009,1010,
+ 5,111,0,0,1010,1011,5,109,0,0,1011,1012,5,97,0,0,1012,1013,5,105,0,0,1013,
+ 1014,5,110,0,0,1014,94,1,0,0,0,1015,1016,5,46,0,0,1016,1017,5,118,0,0,
+ 1017,1018,5,116,0,0,1018,1019,5,97,0,0,1019,1020,5,98,0,0,1020,1021,5,
+ 108,0,0,1021,1022,5,101,0,0,1022,96,1,0,0,0,1023,1024,5,46,0,0,1024,1025,
+ 5,110,0,0,1025,1026,5,97,0,0,1026,1027,5,109,0,0,1027,1028,5,101,0,0,1028,
+ 1029,5,115,0,0,1029,1030,5,112,0,0,1030,1031,5,97,0,0,1031,1032,5,99,0,
+ 0,1032,1033,5,101,0,0,1033,98,1,0,0,0,1034,1035,5,46,0,0,1035,1036,5,99,
+ 0,0,1036,1037,5,108,0,0,1037,1038,5,97,0,0,1038,1039,5,115,0,0,1039,1040,
+ 5,115,0,0,1040,100,1,0,0,0,1041,1042,5,112,0,0,1042,1043,5,117,0,0,1043,
+ 1044,5,98,0,0,1044,1045,5,108,0,0,1045,1046,5,105,0,0,1046,1047,5,99,0,
+ 0,1047,102,1,0,0,0,1048,1049,5,112,0,0,1049,1050,5,114,0,0,1050,1051,5,
+ 105,0,0,1051,1052,5,118,0,0,1052,1053,5,97,0,0,1053,1054,5,116,0,0,1054,
+ 1055,5,101,0,0,1055,104,1,0,0,0,1056,1057,5,115,0,0,1057,1058,5,101,0,
+ 0,1058,1059,5,97,0,0,1059,1060,5,108,0,0,1060,1061,5,101,0,0,1061,1062,
+ 5,100,0,0,1062,106,1,0,0,0,1063,1064,5,97,0,0,1064,1065,5,98,0,0,1065,
+ 1066,5,115,0,0,1066,1067,5,116,0,0,1067,1068,5,114,0,0,1068,1069,5,97,
+ 0,0,1069,1070,5,99,0,0,1070,1071,5,116,0,0,1071,108,1,0,0,0,1072,1073,
+ 5,97,0,0,1073,1074,5,117,0,0,1074,1075,5,116,0,0,1075,1076,5,111,0,0,1076,
+ 110,1,0,0,0,1077,1078,5,115,0,0,1078,1079,5,101,0,0,1079,1080,5,113,0,
+ 0,1080,1081,5,117,0,0,1081,1082,5,101,0,0,1082,1083,5,110,0,0,1083,1084,
+ 5,116,0,0,1084,1085,5,105,0,0,1085,1086,5,97,0,0,1086,1087,5,108,0,0,1087,
+ 112,1,0,0,0,1088,1089,5,117,0,0,1089,1090,5,110,0,0,1090,1091,5,105,0,
+ 0,1091,1092,5,99,0,0,1092,1093,5,111,0,0,1093,1094,5,100,0,0,1094,1095,
+ 5,101,0,0,1095,114,1,0,0,0,1096,1097,5,97,0,0,1097,1098,5,117,0,0,1098,
+ 1099,5,116,0,0,1099,1100,5,111,0,0,1100,1101,5,99,0,0,1101,1102,5,104,
+ 0,0,1102,1103,5,97,0,0,1103,1104,5,114,0,0,1104,116,1,0,0,0,1105,1106,
+ 5,105,0,0,1106,1107,5,109,0,0,1107,1108,5,112,0,0,1108,1109,5,111,0,0,
+ 1109,1110,5,114,0,0,1110,1111,5,116,0,0,1111,118,1,0,0,0,1112,1113,5,115,
+ 0,0,1113,1114,5,101,0,0,1114,1115,5,114,0,0,1115,1116,5,105,0,0,1116,1117,
+ 5,97,0,0,1117,1118,5,108,0,0,1118,1119,5,105,0,0,1119,1120,5,122,0,0,1120,
+ 1121,5,97,0,0,1121,1122,5,98,0,0,1122,1123,5,108,0,0,1123,1124,5,101,0,
+ 0,1124,120,1,0,0,0,1125,1126,5,119,0,0,1126,1127,5,105,0,0,1127,1128,5,
+ 110,0,0,1128,1129,5,100,0,0,1129,1130,5,111,0,0,1130,1131,5,119,0,0,1131,
+ 1132,5,115,0,0,1132,1133,5,114,0,0,1133,1134,5,117,0,0,1134,1135,5,110,
+ 0,0,1135,1136,5,116,0,0,1136,1137,5,105,0,0,1137,1138,5,109,0,0,1138,1139,
+ 5,101,0,0,1139,122,1,0,0,0,1140,1141,5,110,0,0,1141,1142,5,101,0,0,1142,
+ 1143,5,115,0,0,1143,1144,5,116,0,0,1144,1145,5,101,0,0,1145,1146,5,100,
+ 0,0,1146,124,1,0,0,0,1147,1148,5,102,0,0,1148,1149,5,97,0,0,1149,1150,
+ 5,109,0,0,1150,1151,5,105,0,0,1151,1152,5,108,0,0,1152,1153,5,121,0,0,
+ 1153,126,1,0,0,0,1154,1155,5,97,0,0,1155,1156,5,115,0,0,1156,1157,5,115,
+ 0,0,1157,1158,5,101,0,0,1158,1159,5,109,0,0,1159,1160,5,98,0,0,1160,1161,
+ 5,108,0,0,1161,1162,5,121,0,0,1162,128,1,0,0,0,1163,1164,5,102,0,0,1164,
+ 1165,5,97,0,0,1165,1166,5,109,0,0,1166,1167,5,97,0,0,1167,1168,5,110,0,
+ 0,1168,1169,5,100,0,0,1169,1170,5,97,0,0,1170,1171,5,115,0,0,1171,1172,
+ 5,115,0,0,1172,1173,5,101,0,0,1173,1174,5,109,0,0,1174,130,1,0,0,0,1175,
+ 1176,5,102,0,0,1176,1177,5,97,0,0,1177,1178,5,109,0,0,1178,1179,5,111,
+ 0,0,1179,1180,5,114,0,0,1180,1181,5,97,0,0,1181,1182,5,115,0,0,1182,1183,
+ 5,115,0,0,1183,1184,5,101,0,0,1184,1185,5,109,0,0,1185,132,1,0,0,0,1186,
+ 1187,5,98,0,0,1187,1188,5,101,0,0,1188,1189,5,102,0,0,1189,1190,5,111,
+ 0,0,1190,1191,5,114,0,0,1191,1192,5,101,0,0,1192,1193,5,102,0,0,1193,1194,
+ 5,105,0,0,1194,1195,5,101,0,0,1195,1196,5,108,0,0,1196,1197,5,100,0,0,
+ 1197,1198,5,105,0,0,1198,1199,5,110,0,0,1199,1200,5,105,0,0,1200,1201,
+ 5,116,0,0,1201,134,1,0,0,0,1202,1203,5,115,0,0,1203,1204,5,112,0,0,1204,
+ 1205,5,101,0,0,1205,1206,5,99,0,0,1206,1207,5,105,0,0,1207,1208,5,97,0,
+ 0,1208,1209,5,108,0,0,1209,1210,5,110,0,0,1210,1211,5,97,0,0,1211,1212,
+ 5,109,0,0,1212,1213,5,101,0,0,1213,136,1,0,0,0,1214,1215,5,114,0,0,1215,
+ 1216,5,116,0,0,1216,1217,5,115,0,0,1217,1218,5,112,0,0,1218,1219,5,101,
+ 0,0,1219,1220,5,99,0,0,1220,1221,5,105,0,0,1221,1222,5,97,0,0,1222,1223,
+ 5,108,0,0,1223,1224,5,110,0,0,1224,1225,5,97,0,0,1225,1226,5,109,0,0,1226,
+ 1227,5,101,0,0,1227,138,1,0,0,0,1228,1229,5,102,0,0,1229,1230,5,108,0,
+ 0,1230,1231,5,97,0,0,1231,1232,5,103,0,0,1232,1233,5,115,0,0,1233,140,
+ 1,0,0,0,1234,1235,5,101,0,0,1235,1236,5,120,0,0,1236,1237,5,116,0,0,1237,
+ 1238,5,101,0,0,1238,1239,5,110,0,0,1239,1240,5,100,0,0,1240,1241,5,115,
+ 0,0,1241,142,1,0,0,0,1242,1243,5,105,0,0,1243,1244,5,109,0,0,1244,1245,
+ 5,112,0,0,1245,1246,5,108,0,0,1246,1247,5,101,0,0,1247,1248,5,109,0,0,
+ 1248,1249,5,101,0,0,1249,1250,5,110,0,0,1250,1251,5,116,0,0,1251,1252,
+ 5,115,0,0,1252,144,1,0,0,0,1253,1254,5,46,0,0,1254,1255,5,108,0,0,1255,
+ 1256,5,105,0,0,1256,1257,5,110,0,0,1257,1258,5,101,0,0,1258,146,1,0,0,
+ 0,1259,1260,5,35,0,0,1260,1261,5,108,0,0,1261,1262,5,105,0,0,1262,1263,
+ 5,110,0,0,1263,1264,5,101,0,0,1264,148,1,0,0,0,1265,1266,5,58,0,0,1266,
+ 150,1,0,0,0,1267,1268,5,110,0,0,1268,1269,5,111,0,0,1269,1270,5,109,0,
+ 0,1270,1271,5,101,0,0,1271,1272,5,116,0,0,1272,1273,5,97,0,0,1273,1274,
+ 5,100,0,0,1274,1275,5,97,0,0,1275,1276,5,116,0,0,1276,1277,5,97,0,0,1277,
+ 152,1,0,0,0,1278,1279,5,114,0,0,1279,1280,5,101,0,0,1280,1281,5,116,0,
+ 0,1281,1282,5,97,0,0,1282,1283,5,114,0,0,1283,1284,5,103,0,0,1284,1285,
+ 5,101,0,0,1285,1286,5,116,0,0,1286,1287,5,97,0,0,1287,1288,5,98,0,0,1288,
+ 1289,5,108,0,0,1289,1290,5,101,0,0,1290,154,1,0,0,0,1291,1292,5,110,0,
+ 0,1292,1293,5,111,0,0,1293,1294,5,112,0,0,1294,1295,5,108,0,0,1295,1296,
+ 5,97,0,0,1296,1297,5,116,0,0,1297,1298,5,102,0,0,1298,1299,5,111,0,0,1299,
+ 1300,5,114,0,0,1300,1301,5,109,0,0,1301,156,1,0,0,0,1302,1303,5,108,0,
+ 0,1303,1304,5,101,0,0,1304,1305,5,103,0,0,1305,1306,5,97,0,0,1306,1307,
+ 5,99,0,0,1307,1308,5,121,0,0,1308,1309,5,32,0,0,1309,1310,5,108,0,0,1310,
+ 1311,5,105,0,0,1311,1312,5,98,0,0,1312,1313,5,114,0,0,1313,1314,5,97,0,
+ 0,1314,1315,5,114,0,0,1315,1316,5,121,0,0,1316,158,1,0,0,0,1317,1318,5,
+ 120,0,0,1318,1319,5,56,0,0,1319,1320,5,54,0,0,1320,160,1,0,0,0,1321,1322,
+ 5,97,0,0,1322,1323,5,109,0,0,1323,1324,5,100,0,0,1324,1325,5,54,0,0,1325,
+ 1326,5,52,0,0,1326,162,1,0,0,0,1327,1328,5,97,0,0,1328,1329,5,114,0,0,
+ 1329,1330,5,109,0,0,1330,164,1,0,0,0,1331,1332,5,97,0,0,1332,1333,5,114,
+ 0,0,1333,1334,5,109,0,0,1334,1335,5,54,0,0,1335,1336,5,52,0,0,1336,166,
+ 1,0,0,0,1337,1338,5,98,0,0,1338,1339,5,121,0,0,1339,1340,5,116,0,0,1340,
+ 1341,5,101,0,0,1341,1342,5,97,0,0,1342,1343,5,114,0,0,1343,1344,5,114,
+ 0,0,1344,1345,5,97,0,0,1345,1346,5,121,0,0,1346,168,1,0,0,0,1347,1348,
+ 5,40,0,0,1348,1349,5,41,0,0,1349,170,1,0,0,0,1350,1351,5,60,0,0,1351,172,
+ 1,0,0,0,1352,1353,5,62,0,0,1353,174,1,0,0,0,1354,1355,5,47,0,0,1355,176,
+ 1,0,0,0,1356,1357,5,97,0,0,1357,1358,5,108,0,0,1358,1359,5,103,0,0,1359,
+ 1360,5,111,0,0,1360,1361,5,114,0,0,1361,1362,5,105,0,0,1362,1363,5,116,
+ 0,0,1363,1364,5,104,0,0,1364,1365,5,109,0,0,1365,178,1,0,0,0,1366,1367,
+ 5,117,0,0,1367,1368,5,110,0,0,1368,1369,5,115,0,0,1369,1370,5,105,0,0,
+ 1370,1371,5,103,0,0,1371,1372,5,110,0,0,1372,1373,5,101,0,0,1373,1374,
+ 5,100,0,0,1374,180,1,0,0,0,1375,1376,5,105,0,0,1376,1377,5,105,0,0,1377,
+ 1378,5,100,0,0,1378,1379,5,112,0,0,1379,1380,5,97,0,0,1380,1381,5,114,
+ 0,0,1381,1382,5,97,0,0,1382,1383,5,109,0,0,1383,182,1,0,0,0,1384,1385,
+ 5,112,0,0,1385,1386,5,105,0,0,1386,1387,5,110,0,0,1387,1388,5,110,0,0,
+ 1388,1389,5,101,0,0,1389,1390,5,100,0,0,1390,184,1,0,0,0,1391,1392,5,109,
+ 0,0,1392,1393,5,111,0,0,1393,1394,5,100,0,0,1394,1395,5,114,0,0,1395,1396,
+ 5,101,0,0,1396,1397,5,113,0,0,1397,186,1,0,0,0,1398,1399,5,109,0,0,1399,
+ 1400,5,111,0,0,1400,1401,5,100,0,0,1401,1402,5,111,0,0,1402,1403,5,112,
+ 0,0,1403,1404,5,116,0,0,1404,188,1,0,0,0,1405,1406,5,116,0,0,1406,1407,
+ 5,114,0,0,1407,1408,5,117,0,0,1408,1409,5,101,0,0,1409,190,1,0,0,0,1410,
+ 1411,5,102,0,0,1411,1412,5,97,0,0,1412,1413,5,108,0,0,1413,1414,5,115,
+ 0,0,1414,1415,5,101,0,0,1415,192,1,0,0,0,1416,1417,5,114,0,0,1417,1418,
+ 5,101,0,0,1418,1419,5,113,0,0,1419,1420,5,117,0,0,1420,1421,5,101,0,0,
+ 1421,1422,5,115,0,0,1422,1423,5,116,0,0,1423,194,1,0,0,0,1424,1425,5,100,
+ 0,0,1425,1426,5,101,0,0,1426,1427,5,109,0,0,1427,1428,5,97,0,0,1428,1429,
+ 5,110,0,0,1429,1430,5,100,0,0,1430,196,1,0,0,0,1431,1432,5,97,0,0,1432,
+ 1433,5,115,0,0,1433,1434,5,115,0,0,1434,1435,5,101,0,0,1435,1436,5,114,
+ 0,0,1436,1437,5,116,0,0,1437,198,1,0,0,0,1438,1439,5,100,0,0,1439,1440,
+ 5,101,0,0,1440,1441,5,110,0,0,1441,1442,5,121,0,0,1442,200,1,0,0,0,1443,
+ 1444,5,112,0,0,1444,1445,5,101,0,0,1445,1446,5,114,0,0,1446,1447,5,109,
+ 0,0,1447,1448,5,105,0,0,1448,1449,5,116,0,0,1449,1450,5,111,0,0,1450,1451,
+ 5,110,0,0,1451,1452,5,108,0,0,1452,1453,5,121,0,0,1453,202,1,0,0,0,1454,
+ 1455,5,108,0,0,1455,1456,5,105,0,0,1456,1457,5,110,0,0,1457,1458,5,107,
+ 0,0,1458,1459,5,99,0,0,1459,1460,5,104,0,0,1460,1461,5,101,0,0,1461,1462,
+ 5,99,0,0,1462,1463,5,107,0,0,1463,204,1,0,0,0,1464,1465,5,105,0,0,1465,
+ 1466,5,110,0,0,1466,1467,5,104,0,0,1467,1468,5,101,0,0,1468,1469,5,114,
+ 0,0,1469,1470,5,105,0,0,1470,1471,5,116,0,0,1471,1472,5,99,0,0,1472,1473,
+ 5,104,0,0,1473,1474,5,101,0,0,1474,1475,5,99,0,0,1475,1476,5,107,0,0,1476,
+ 206,1,0,0,0,1477,1478,5,114,0,0,1478,1479,5,101,0,0,1479,1480,5,113,0,
+ 0,1480,1481,5,109,0,0,1481,1482,5,105,0,0,1482,1483,5,110,0,0,1483,208,
+ 1,0,0,0,1484,1485,5,114,0,0,1485,1486,5,101,0,0,1486,1487,5,113,0,0,1487,
+ 1488,5,111,0,0,1488,1489,5,112,0,0,1489,1490,5,116,0,0,1490,210,1,0,0,
+ 0,1491,1492,5,114,0,0,1492,1493,5,101,0,0,1493,1494,5,113,0,0,1494,1495,
+ 5,114,0,0,1495,1496,5,101,0,0,1496,1497,5,102,0,0,1497,1498,5,117,0,0,
+ 1498,1499,5,115,0,0,1499,1500,5,101,0,0,1500,212,1,0,0,0,1501,1502,5,112,
+ 0,0,1502,1503,5,114,0,0,1503,1504,5,101,0,0,1504,1505,5,106,0,0,1505,1506,
+ 5,105,0,0,1506,1507,5,116,0,0,1507,1508,5,103,0,0,1508,1509,5,114,0,0,
+ 1509,1510,5,97,0,0,1510,1511,5,110,0,0,1511,1512,5,116,0,0,1512,214,1,
+ 0,0,0,1513,1514,5,112,0,0,1514,1515,5,114,0,0,1515,1516,5,101,0,0,1516,
+ 1517,5,106,0,0,1517,1518,5,105,0,0,1518,1519,5,116,0,0,1519,1520,5,100,
+ 0,0,1520,1521,5,101,0,0,1521,1522,5,110,0,0,1522,1523,5,121,0,0,1523,216,
+ 1,0,0,0,1524,1525,5,110,0,0,1525,1526,5,111,0,0,1526,1527,5,110,0,0,1527,
+ 1528,5,99,0,0,1528,1529,5,97,0,0,1529,1530,5,115,0,0,1530,1531,5,100,0,
+ 0,1531,1532,5,101,0,0,1532,1533,5,109,0,0,1533,1534,5,97,0,0,1534,1535,
+ 5,110,0,0,1535,1536,5,100,0,0,1536,218,1,0,0,0,1537,1538,5,110,0,0,1538,
+ 1539,5,111,0,0,1539,1540,5,110,0,0,1540,1541,5,99,0,0,1541,1542,5,97,0,
+ 0,1542,1543,5,115,0,0,1543,1544,5,108,0,0,1544,1545,5,105,0,0,1545,1546,
+ 5,110,0,0,1546,1547,5,107,0,0,1547,1548,5,100,0,0,1548,1549,5,101,0,0,
+ 1549,1550,5,109,0,0,1550,1551,5,97,0,0,1551,1552,5,110,0,0,1552,1553,5,
+ 100,0,0,1553,220,1,0,0,0,1554,1555,5,110,0,0,1555,1556,5,111,0,0,1556,
+ 1557,5,110,0,0,1557,1558,5,99,0,0,1558,1559,5,97,0,0,1559,1560,5,115,0,
+ 0,1560,1561,5,105,0,0,1561,1562,5,110,0,0,1562,1563,5,104,0,0,1563,1564,
+ 5,101,0,0,1564,1565,5,114,0,0,1565,1566,5,105,0,0,1566,1567,5,116,0,0,
+ 1567,1568,5,97,0,0,1568,1569,5,110,0,0,1569,1570,5,99,0,0,1570,1571,5,
+ 101,0,0,1571,222,1,0,0,0,1572,1573,5,99,0,0,1573,1574,5,97,0,0,1574,1575,
+ 5,108,0,0,1575,1576,5,108,0,0,1576,1577,5,99,0,0,1577,1578,5,111,0,0,1578,
+ 1579,5,110,0,0,1579,1580,5,118,0,0,1580,224,1,0,0,0,1581,1582,5,109,0,
+ 0,1582,1583,5,100,0,0,1583,1584,5,116,0,0,1584,1585,5,111,0,0,1585,1586,
+ 5,107,0,0,1586,1587,5,101,0,0,1587,1588,5,110,0,0,1588,226,1,0,0,0,1589,
+ 1590,5,45,0,0,1590,228,1,0,0,0,1591,1592,5,98,0,0,1592,1593,5,121,0,0,
+ 1593,1594,5,114,0,0,1594,1595,5,101,0,0,1595,1596,5,102,0,0,1596,1597,
+ 5,108,0,0,1597,1598,5,105,0,0,1598,1599,5,107,0,0,1599,1600,5,101,0,0,
+ 1600,230,1,0,0,0,1601,1602,5,46,0,0,1602,1603,5,99,0,0,1603,1604,5,116,
+ 0,0,1604,1605,5,111,0,0,1605,1606,5,114,0,0,1606,232,1,0,0,0,1607,1608,
+ 5,46,0,0,1608,1609,5,115,0,0,1609,1610,5,105,0,0,1610,1611,5,122,0,0,1611,
+ 1612,5,101,0,0,1612,234,1,0,0,0,1613,1614,5,46,0,0,1614,1615,5,112,0,0,
+ 1615,1616,5,97,0,0,1616,1617,5,99,0,0,1617,1618,5,107,0,0,1618,236,1,0,
+ 0,0,1619,1620,5,119,0,0,1620,1621,5,105,0,0,1621,1622,5,116,0,0,1622,1623,
+ 5,104,0,0,1623,238,1,0,0,0,1624,1625,5,46,0,0,1625,1626,5,105,0,0,1626,
+ 1627,5,110,0,0,1627,1628,5,116,0,0,1628,1629,5,101,0,0,1629,1630,5,114,
+ 0,0,1630,1631,5,102,0,0,1631,1632,5,97,0,0,1632,1633,5,99,0,0,1633,1634,
+ 5,101,0,0,1634,1635,5,105,0,0,1635,1636,5,109,0,0,1636,1637,5,112,0,0,
+ 1637,1638,5,108,0,0,1638,240,1,0,0,0,1639,1640,5,46,0,0,1640,1641,5,102,
+ 0,0,1641,1642,5,105,0,0,1642,1643,5,101,0,0,1643,1644,5,108,0,0,1644,1645,
+ 5,100,0,0,1645,242,1,0,0,0,1646,1647,5,109,0,0,1647,1648,5,97,0,0,1648,
+ 1649,5,114,0,0,1649,1650,5,115,0,0,1650,1651,5,104,0,0,1651,1652,5,97,
+ 0,0,1652,1653,5,108,0,0,1653,244,1,0,0,0,1654,1655,5,115,0,0,1655,1656,
+ 5,116,0,0,1656,1657,5,97,0,0,1657,1658,5,116,0,0,1658,1659,5,105,0,0,1659,
+ 1660,5,99,0,0,1660,246,1,0,0,0,1661,1662,5,105,0,0,1662,1663,5,110,0,0,
+ 1663,1664,5,105,0,0,1664,1665,5,116,0,0,1665,1666,5,111,0,0,1666,1667,
+ 5,110,0,0,1667,1668,5,108,0,0,1668,1669,5,121,0,0,1669,248,1,0,0,0,1670,
+ 1671,5,112,0,0,1671,1672,5,114,0,0,1672,1673,5,105,0,0,1673,1674,5,118,
+ 0,0,1674,1675,5,97,0,0,1675,1676,5,116,0,0,1676,1677,5,101,0,0,1677,1678,
+ 5,115,0,0,1678,1679,5,99,0,0,1679,1680,5,111,0,0,1680,1681,5,112,0,0,1681,
+ 1682,5,101,0,0,1682,250,1,0,0,0,1683,1684,5,108,0,0,1684,1685,5,105,0,
+ 0,1685,1686,5,116,0,0,1686,1687,5,101,0,0,1687,1688,5,114,0,0,1688,1689,
+ 5,97,0,0,1689,1690,5,108,0,0,1690,252,1,0,0,0,1691,1692,5,110,0,0,1692,
+ 1693,5,111,0,0,1693,1694,5,116,0,0,1694,1695,5,115,0,0,1695,1696,5,101,
+ 0,0,1696,1697,5,114,0,0,1697,1698,5,105,0,0,1698,1699,5,97,0,0,1699,1700,
+ 5,108,0,0,1700,1701,5,105,0,0,1701,1702,5,122,0,0,1702,1703,5,101,0,0,
+ 1703,1704,5,100,0,0,1704,254,1,0,0,0,1705,1706,5,46,0,0,1706,1707,5,101,
+ 0,0,1707,1708,5,118,0,0,1708,1709,5,101,0,0,1709,1710,5,110,0,0,1710,1711,
+ 5,116,0,0,1711,256,1,0,0,0,1712,1713,5,46,0,0,1713,1714,5,97,0,0,1714,
+ 1715,5,100,0,0,1715,1716,5,100,0,0,1716,1717,5,111,0,0,1717,1718,5,110,
+ 0,0,1718,258,1,0,0,0,1719,1720,5,46,0,0,1720,1721,5,114,0,0,1721,1722,
+ 5,101,0,0,1722,1723,5,109,0,0,1723,1724,5,111,0,0,1724,1725,5,118,0,0,
+ 1725,1726,5,101,0,0,1726,1727,5,111,0,0,1727,1728,5,110,0,0,1728,260,1,
+ 0,0,0,1729,1730,5,46,0,0,1730,1731,5,102,0,0,1731,1732,5,105,0,0,1732,
+ 1733,5,114,0,0,1733,1734,5,101,0,0,1734,262,1,0,0,0,1735,1736,5,46,0,0,
+ 1736,1737,5,111,0,0,1737,1738,5,116,0,0,1738,1739,5,104,0,0,1739,1740,
+ 5,101,0,0,1740,1741,5,114,0,0,1741,264,1,0,0,0,1742,1743,5,46,0,0,1743,
+ 1744,5,112,0,0,1744,1745,5,114,0,0,1745,1746,5,111,0,0,1746,1747,5,112,
+ 0,0,1747,1748,5,101,0,0,1748,1749,5,114,0,0,1749,1750,5,116,0,0,1750,1751,
+ 5,121,0,0,1751,266,1,0,0,0,1752,1753,5,46,0,0,1753,1754,5,115,0,0,1754,
+ 1755,5,101,0,0,1755,1756,5,116,0,0,1756,268,1,0,0,0,1757,1758,5,46,0,0,
+ 1758,1759,5,103,0,0,1759,1760,5,101,0,0,1760,1761,5,116,0,0,1761,270,1,
+ 0,0,0,1762,1763,5,105,0,0,1763,1764,5,110,0,0,1764,272,1,0,0,0,1765,1766,
+ 5,111,0,0,1766,1767,5,117,0,0,1767,1768,5,116,0,0,1768,274,1,0,0,0,1769,
+ 1770,5,111,0,0,1770,1771,5,112,0,0,1771,1772,5,116,0,0,1772,276,1,0,0,
+ 0,1773,1774,5,46,0,0,1774,1775,5,109,0,0,1775,1776,5,101,0,0,1776,1777,
+ 5,116,0,0,1777,1778,5,104,0,0,1778,1779,5,111,0,0,1779,1780,5,100,0,0,
+ 1780,278,1,0,0,0,1781,1782,5,102,0,0,1782,1783,5,105,0,0,1783,1784,5,110,
+ 0,0,1784,1785,5,97,0,0,1785,1786,5,108,0,0,1786,280,1,0,0,0,1787,1788,
+ 5,118,0,0,1788,1789,5,105,0,0,1789,1790,5,114,0,0,1790,1791,5,116,0,0,
+ 1791,1792,5,117,0,0,1792,1793,5,97,0,0,1793,1794,5,108,0,0,1794,282,1,
+ 0,0,0,1795,1796,5,115,0,0,1796,1797,5,116,0,0,1797,1798,5,114,0,0,1798,
+ 1799,5,105,0,0,1799,1800,5,99,0,0,1800,1801,5,116,0,0,1801,284,1,0,0,0,
+ 1802,1803,5,104,0,0,1803,1804,5,105,0,0,1804,1805,5,100,0,0,1805,1806,
+ 5,101,0,0,1806,1807,5,98,0,0,1807,1808,5,121,0,0,1808,1809,5,115,0,0,1809,
+ 1810,5,105,0,0,1810,1811,5,103,0,0,1811,286,1,0,0,0,1812,1813,5,110,0,
+ 0,1813,1814,5,101,0,0,1814,1815,5,119,0,0,1815,1816,5,115,0,0,1816,1817,
+ 5,108,0,0,1817,1818,5,111,0,0,1818,1819,5,116,0,0,1819,288,1,0,0,0,1820,
+ 1821,5,117,0,0,1821,1822,5,110,0,0,1822,1823,5,109,0,0,1823,1824,5,97,
+ 0,0,1824,1825,5,110,0,0,1825,1826,5,97,0,0,1826,1827,5,103,0,0,1827,1828,
+ 5,101,0,0,1828,1829,5,100,0,0,1829,1830,5,101,0,0,1830,1831,5,120,0,0,
+ 1831,1832,5,112,0,0,1832,290,1,0,0,0,1833,1834,5,114,0,0,1834,1835,5,101,
+ 0,0,1835,1836,5,113,0,0,1836,1837,5,115,0,0,1837,1838,5,101,0,0,1838,1839,
+ 5,99,0,0,1839,1840,5,111,0,0,1840,1841,5,98,0,0,1841,1842,5,106,0,0,1842,
+ 292,1,0,0,0,1843,1844,5,112,0,0,1844,1845,5,105,0,0,1845,1846,5,110,0,
+ 0,1846,1847,5,118,0,0,1847,1848,5,111,0,0,1848,1849,5,107,0,0,1849,1850,
+ 5,101,0,0,1850,1851,5,105,0,0,1851,1852,5,109,0,0,1852,1853,5,112,0,0,
+ 1853,1854,5,108,0,0,1854,294,1,0,0,0,1855,1856,5,110,0,0,1856,1857,5,111,
+ 0,0,1857,1858,5,109,0,0,1858,1859,5,97,0,0,1859,1860,5,110,0,0,1860,1861,
+ 5,103,0,0,1861,1862,5,108,0,0,1862,1863,5,101,0,0,1863,296,1,0,0,0,1864,
+ 1865,5,108,0,0,1865,1866,5,97,0,0,1866,1867,5,115,0,0,1867,1868,5,116,
+ 0,0,1868,1869,5,101,0,0,1869,1870,5,114,0,0,1870,1871,5,114,0,0,1871,298,
+ 1,0,0,0,1872,1873,5,119,0,0,1873,1874,5,105,0,0,1874,1875,5,110,0,0,1875,
+ 1876,5,97,0,0,1876,1877,5,112,0,0,1877,1878,5,105,0,0,1878,300,1,0,0,0,
+ 1879,1880,5,98,0,0,1880,1881,5,101,0,0,1881,1882,5,115,0,0,1882,1883,5,
+ 116,0,0,1883,1884,5,102,0,0,1884,1885,5,105,0,0,1885,1886,5,116,0,0,1886,
+ 302,1,0,0,0,1887,1888,5,111,0,0,1888,1889,5,110,0,0,1889,304,1,0,0,0,1890,
+ 1891,5,111,0,0,1891,1892,5,102,0,0,1892,1893,5,102,0,0,1893,306,1,0,0,
+ 0,1894,1895,5,99,0,0,1895,1896,5,104,0,0,1896,1897,5,97,0,0,1897,1898,
+ 5,114,0,0,1898,1899,5,109,0,0,1899,1900,5,97,0,0,1900,1901,5,112,0,0,1901,
+ 1902,5,101,0,0,1902,1903,5,114,0,0,1903,1904,5,114,0,0,1904,1905,5,111,
+ 0,0,1905,1906,5,114,0,0,1906,308,1,0,0,0,1907,1908,5,46,0,0,1908,1909,
+ 5,99,0,0,1909,1910,5,99,0,0,1910,1911,5,116,0,0,1911,1912,5,111,0,0,1912,
+ 1913,5,114,0,0,1913,310,1,0,0,0,1914,1915,5,105,0,0,1915,1916,5,108,0,
+ 0,1916,312,1,0,0,0,1917,1918,5,105,0,0,1918,1919,5,110,0,0,1919,1920,5,
+ 105,0,0,1920,1921,5,116,0,0,1921,314,1,0,0,0,1922,1923,5,46,0,0,1923,1924,
+ 5,116,0,0,1924,1925,5,114,0,0,1925,1926,5,121,0,0,1926,316,1,0,0,0,1927,
+ 1928,5,116,0,0,1928,1929,5,111,0,0,1929,318,1,0,0,0,1930,1931,5,102,0,
+ 0,1931,1932,5,105,0,0,1932,1933,5,108,0,0,1933,1934,5,116,0,0,1934,1935,
+ 5,101,0,0,1935,1936,5,114,0,0,1936,320,1,0,0,0,1937,1938,5,99,0,0,1938,
+ 1939,5,97,0,0,1939,1940,5,116,0,0,1940,1941,5,99,0,0,1941,1942,5,104,0,
+ 0,1942,322,1,0,0,0,1943,1944,5,102,0,0,1944,1945,5,105,0,0,1945,1946,5,
+ 110,0,0,1946,1947,5,97,0,0,1947,1948,5,108,0,0,1948,1949,5,108,0,0,1949,
+ 1950,5,121,0,0,1950,324,1,0,0,0,1951,1952,5,102,0,0,1952,1953,5,97,0,0,
+ 1953,1954,5,117,0,0,1954,1955,5,108,0,0,1955,1956,5,116,0,0,1956,326,1,
+ 0,0,0,1957,1958,5,104,0,0,1958,1959,5,97,0,0,1959,1960,5,110,0,0,1960,
+ 1961,5,100,0,0,1961,1962,5,108,0,0,1962,1963,5,101,0,0,1963,1964,5,114,
+ 0,0,1964,328,1,0,0,0,1965,1966,5,46,0,0,1966,1967,5,100,0,0,1967,1968,
+ 5,97,0,0,1968,1969,5,116,0,0,1969,1970,5,97,0,0,1970,330,1,0,0,0,1971,
+ 1972,5,116,0,0,1972,1973,5,108,0,0,1973,1974,5,115,0,0,1974,332,1,0,0,
+ 0,1975,1976,5,46,0,0,1976,1977,5,112,0,0,1977,1978,5,117,0,0,1978,1979,
+ 5,98,0,0,1979,1980,5,108,0,0,1980,1981,5,105,0,0,1981,1982,5,99,0,0,1982,
+ 1983,5,107,0,0,1983,1984,5,101,0,0,1984,1985,5,121,0,0,1985,334,1,0,0,
+ 0,1986,1987,5,46,0,0,1987,1988,5,112,0,0,1988,1989,5,117,0,0,1989,1990,
+ 5,98,0,0,1990,1991,5,108,0,0,1991,1992,5,105,0,0,1992,1993,5,99,0,0,1993,
+ 1994,5,75,0,0,1994,1995,5,101,0,0,1995,1996,5,121,0,0,1996,336,1,0,0,0,
+ 1997,1998,5,46,0,0,1998,1999,5,118,0,0,1999,2000,5,101,0,0,2000,2001,5,
+ 114,0,0,2001,338,1,0,0,0,2002,2003,5,46,0,0,2003,2004,5,108,0,0,2004,2005,
+ 5,111,0,0,2005,2006,5,99,0,0,2006,2007,5,97,0,0,2007,2008,5,108,0,0,2008,
+ 2009,5,101,0,0,2009,340,1,0,0,0,2010,2011,5,46,0,0,2011,2012,5,112,0,0,
+ 2012,2013,5,117,0,0,2013,2014,5,98,0,0,2014,2015,5,108,0,0,2015,2016,5,
+ 105,0,0,2016,2017,5,99,0,0,2017,2018,5,107,0,0,2018,2019,5,101,0,0,2019,
+ 2020,5,121,0,0,2020,2021,5,116,0,0,2021,2022,5,111,0,0,2022,2023,5,107,
+ 0,0,2023,2024,5,101,0,0,2024,2025,5,110,0,0,2025,342,1,0,0,0,2026,2027,
+ 5,102,0,0,2027,2028,5,111,0,0,2028,2029,5,114,0,0,2029,2030,5,119,0,0,
+ 2030,2031,5,97,0,0,2031,2032,5,114,0,0,2032,2033,5,100,0,0,2033,2034,5,
+ 101,0,0,2034,2035,5,114,0,0,2035,344,1,0,0,0,2036,2038,5,45,0,0,2037,2036,
+ 1,0,0,0,2037,2038,1,0,0,0,2038,2052,1,0,0,0,2039,2040,5,48,0,0,2040,2041,
+ 5,120,0,0,2041,2043,1,0,0,0,2042,2044,7,0,0,0,2043,2042,1,0,0,0,2044,2045,
+ 1,0,0,0,2045,2043,1,0,0,0,2045,2046,1,0,0,0,2046,2053,1,0,0,0,2047,2049,
+ 7,1,0,0,2048,2047,1,0,0,0,2049,2050,1,0,0,0,2050,2048,1,0,0,0,2050,2051,
+ 1,0,0,0,2051,2053,1,0,0,0,2052,2039,1,0,0,0,2052,2048,1,0,0,0,2053,346,
+ 1,0,0,0,2054,2056,5,45,0,0,2055,2054,1,0,0,0,2055,2056,1,0,0,0,2056,2070,
+ 1,0,0,0,2057,2058,5,48,0,0,2058,2059,5,120,0,0,2059,2061,1,0,0,0,2060,
+ 2062,7,0,0,0,2061,2060,1,0,0,0,2062,2063,1,0,0,0,2063,2061,1,0,0,0,2063,
+ 2064,1,0,0,0,2064,2071,1,0,0,0,2065,2067,7,1,0,0,2066,2065,1,0,0,0,2067,
+ 2068,1,0,0,0,2068,2066,1,0,0,0,2068,2069,1,0,0,0,2069,2071,1,0,0,0,2070,
+ 2057,1,0,0,0,2070,2066,1,0,0,0,2071,348,1,0,0,0,2072,2074,5,45,0,0,2073,
+ 2072,1,0,0,0,2073,2074,1,0,0,0,2074,2125,1,0,0,0,2075,2077,7,1,0,0,2076,
+ 2075,1,0,0,0,2077,2078,1,0,0,0,2078,2076,1,0,0,0,2078,2079,1,0,0,0,2079,
+ 2106,1,0,0,0,2080,2082,5,46,0,0,2081,2083,7,1,0,0,2082,2081,1,0,0,0,2083,
+ 2084,1,0,0,0,2084,2082,1,0,0,0,2084,2085,1,0,0,0,2085,2095,1,0,0,0,2086,
+ 2088,7,2,0,0,2087,2089,7,3,0,0,2088,2087,1,0,0,0,2088,2089,1,0,0,0,2089,
+ 2091,1,0,0,0,2090,2092,7,1,0,0,2091,2090,1,0,0,0,2092,2093,1,0,0,0,2093,
+ 2091,1,0,0,0,2093,2094,1,0,0,0,2094,2096,1,0,0,0,2095,2086,1,0,0,0,2095,
+ 2096,1,0,0,0,2096,2107,1,0,0,0,2097,2099,7,2,0,0,2098,2100,7,3,0,0,2099,
+ 2098,1,0,0,0,2099,2100,1,0,0,0,2100,2102,1,0,0,0,2101,2103,7,1,0,0,2102,
+ 2101,1,0,0,0,2103,2104,1,0,0,0,2104,2102,1,0,0,0,2104,2105,1,0,0,0,2105,
+ 2107,1,0,0,0,2106,2080,1,0,0,0,2106,2097,1,0,0,0,2107,2126,1,0,0,0,2108,
+ 2110,5,46,0,0,2109,2111,7,1,0,0,2110,2109,1,0,0,0,2111,2112,1,0,0,0,2112,
+ 2110,1,0,0,0,2112,2113,1,0,0,0,2113,2123,1,0,0,0,2114,2116,7,2,0,0,2115,
+ 2117,7,3,0,0,2116,2115,1,0,0,0,2116,2117,1,0,0,0,2117,2119,1,0,0,0,2118,
+ 2120,7,1,0,0,2119,2118,1,0,0,0,2120,2121,1,0,0,0,2121,2119,1,0,0,0,2121,
+ 2122,1,0,0,0,2122,2124,1,0,0,0,2123,2114,1,0,0,0,2123,2124,1,0,0,0,2124,
+ 2126,1,0,0,0,2125,2076,1,0,0,0,2125,2108,1,0,0,0,2126,350,1,0,0,0,2127,
+ 2128,5,58,0,0,2128,2129,5,58,0,0,2129,352,1,0,0,0,2130,2131,5,46,0,0,2131,
+ 2132,5,46,0,0,2132,2133,5,46,0,0,2133,354,1,0,0,0,2134,2135,5,110,0,0,
+ 2135,2136,5,117,0,0,2136,2137,5,108,0,0,2137,2138,5,108,0,0,2138,356,1,
+ 0,0,0,2139,2140,5,110,0,0,2140,2141,5,117,0,0,2141,2142,5,108,0,0,2142,
+ 2143,5,108,0,0,2143,2144,5,114,0,0,2144,2145,5,101,0,0,2145,2146,5,102,
+ 0,0,2146,358,1,0,0,0,2147,2148,5,46,0,0,2148,2149,5,104,0,0,2149,2150,
+ 5,97,0,0,2150,2151,5,115,0,0,2151,2152,5,104,0,0,2152,360,1,0,0,0,2153,
+ 2154,5,99,0,0,2154,2155,5,104,0,0,2155,2156,5,97,0,0,2156,2163,5,114,0,
+ 0,2157,2158,5,119,0,0,2158,2159,5,99,0,0,2159,2160,5,104,0,0,2160,2161,
+ 5,97,0,0,2161,2163,5,114,0,0,2162,2153,1,0,0,0,2162,2157,1,0,0,0,2163,
+ 362,1,0,0,0,2164,2165,5,115,0,0,2165,2166,5,116,0,0,2166,2167,5,114,0,
+ 0,2167,2168,5,105,0,0,2168,2169,5,110,0,0,2169,2170,5,103,0,0,2170,364,
+ 1,0,0,0,2171,2172,5,98,0,0,2172,2173,5,111,0,0,2173,2174,5,111,0,0,2174,
+ 2175,5,108,0,0,2175,366,1,0,0,0,2176,2177,5,105,0,0,2177,2178,5,110,0,
+ 0,2178,2179,5,116,0,0,2179,2180,5,56,0,0,2180,368,1,0,0,0,2181,2182,5,
+ 105,0,0,2182,2183,5,110,0,0,2183,2184,5,116,0,0,2184,2185,5,49,0,0,2185,
+ 2186,5,54,0,0,2186,370,1,0,0,0,2187,2188,5,105,0,0,2188,2189,5,110,0,0,
+ 2189,2190,5,116,0,0,2190,2191,5,51,0,0,2191,2192,5,50,0,0,2192,372,1,0,
+ 0,0,2193,2194,5,105,0,0,2194,2195,5,110,0,0,2195,2196,5,116,0,0,2196,2197,
+ 5,54,0,0,2197,2198,5,52,0,0,2198,374,1,0,0,0,2199,2200,5,102,0,0,2200,
+ 2201,5,108,0,0,2201,2202,5,111,0,0,2202,2203,5,97,0,0,2203,2204,5,116,
+ 0,0,2204,2205,5,51,0,0,2205,2206,5,50,0,0,2206,376,1,0,0,0,2207,2208,5,
+ 102,0,0,2208,2209,5,108,0,0,2209,2210,5,111,0,0,2210,2211,5,97,0,0,2211,
+ 2212,5,116,0,0,2212,2213,5,54,0,0,2213,2214,5,52,0,0,2214,378,1,0,0,0,
+ 2215,2216,5,117,0,0,2216,2217,5,110,0,0,2217,2218,5,115,0,0,2218,2219,
+ 5,105,0,0,2219,2220,5,103,0,0,2220,2221,5,110,0,0,2221,2222,5,101,0,0,
+ 2222,2223,5,100,0,0,2223,380,1,0,0,0,2224,2225,5,117,0,0,2225,2226,5,105,
+ 0,0,2226,2227,5,110,0,0,2227,2228,5,116,0,0,2228,2229,5,56,0,0,2229,382,
+ 1,0,0,0,2230,2231,5,117,0,0,2231,2232,5,105,0,0,2232,2233,5,110,0,0,2233,
+ 2234,5,116,0,0,2234,2235,5,49,0,0,2235,2236,5,54,0,0,2236,384,1,0,0,0,
+ 2237,2238,5,117,0,0,2238,2239,5,105,0,0,2239,2240,5,110,0,0,2240,2241,
+ 5,116,0,0,2241,2242,5,51,0,0,2242,2243,5,50,0,0,2243,386,1,0,0,0,2244,
+ 2245,5,117,0,0,2245,2246,5,105,0,0,2246,2247,5,110,0,0,2247,2248,5,116,
+ 0,0,2248,2249,5,54,0,0,2249,2250,5,52,0,0,2250,388,1,0,0,0,2251,2252,5,
+ 105,0,0,2252,2253,5,110,0,0,2253,2254,5,116,0,0,2254,390,1,0,0,0,2255,
+ 2256,5,117,0,0,2256,2257,5,105,0,0,2257,2258,5,110,0,0,2258,2259,5,116,
+ 0,0,2259,392,1,0,0,0,2260,2261,5,116,0,0,2261,2262,5,121,0,0,2262,2263,
+ 5,112,0,0,2263,2264,5,101,0,0,2264,394,1,0,0,0,2265,2266,5,111,0,0,2266,
+ 2267,5,98,0,0,2267,2268,5,106,0,0,2268,2269,5,101,0,0,2269,2270,5,99,0,
+ 0,2270,2271,5,116,0,0,2271,396,1,0,0,0,2272,2273,5,46,0,0,2273,2274,5,
+ 109,0,0,2274,2275,5,111,0,0,2275,2276,5,100,0,0,2276,2277,5,117,0,0,2277,
+ 2278,5,108,0,0,2278,2279,5,101,0,0,2279,398,1,0,0,0,2280,2281,5,118,0,
+ 0,2281,2282,5,97,0,0,2282,2283,5,108,0,0,2283,2284,5,117,0,0,2284,2285,
+ 5,101,0,0,2285,400,1,0,0,0,2286,2287,5,118,0,0,2287,2288,5,97,0,0,2288,
+ 2289,5,108,0,0,2289,2290,5,117,0,0,2290,2291,5,101,0,0,2291,2292,5,116,
+ 0,0,2292,2293,5,121,0,0,2293,2294,5,112,0,0,2294,2295,5,101,0,0,2295,402,
+ 1,0,0,0,2296,2297,5,118,0,0,2297,2298,5,111,0,0,2298,2299,5,105,0,0,2299,
+ 2300,5,100,0,0,2300,404,1,0,0,0,2301,2302,5,101,0,0,2302,2303,5,110,0,
+ 0,2303,2304,5,117,0,0,2304,2305,5,109,0,0,2305,406,1,0,0,0,2306,2307,5,
+ 99,0,0,2307,2308,5,117,0,0,2308,2309,5,115,0,0,2309,2310,5,116,0,0,2310,
+ 2311,5,111,0,0,2311,2312,5,109,0,0,2312,408,1,0,0,0,2313,2314,5,102,0,
+ 0,2314,2315,5,105,0,0,2315,2316,5,120,0,0,2316,2317,5,101,0,0,2317,2318,
+ 5,100,0,0,2318,410,1,0,0,0,2319,2320,5,115,0,0,2320,2321,5,121,0,0,2321,
+ 2322,5,115,0,0,2322,2323,5,115,0,0,2323,2324,5,116,0,0,2324,2325,5,114,
+ 0,0,2325,2326,5,105,0,0,2326,2327,5,110,0,0,2327,2328,5,103,0,0,2328,412,
+ 1,0,0,0,2329,2330,5,97,0,0,2330,2331,5,114,0,0,2331,2332,5,114,0,0,2332,
+ 2333,5,97,0,0,2333,2334,5,121,0,0,2334,414,1,0,0,0,2335,2336,5,118,0,0,
+ 2336,2337,5,97,0,0,2337,2338,5,114,0,0,2338,2339,5,105,0,0,2339,2340,5,
+ 97,0,0,2340,2341,5,110,0,0,2341,2342,5,116,0,0,2342,416,1,0,0,0,2343,2344,
+ 5,99,0,0,2344,2345,5,117,0,0,2345,2346,5,114,0,0,2346,2347,5,114,0,0,2347,
+ 2348,5,101,0,0,2348,2349,5,110,0,0,2349,2350,5,99,0,0,2350,2351,5,121,
+ 0,0,2351,418,1,0,0,0,2352,2353,5,115,0,0,2353,2354,5,121,0,0,2354,2355,
+ 5,115,0,0,2355,2356,5,99,0,0,2356,2357,5,104,0,0,2357,2358,5,97,0,0,2358,
+ 2359,5,114,0,0,2359,420,1,0,0,0,2360,2361,5,101,0,0,2361,2362,5,114,0,
+ 0,2362,2363,5,114,0,0,2363,2364,5,111,0,0,2364,2365,5,114,0,0,2365,422,
+ 1,0,0,0,2366,2367,5,100,0,0,2367,2368,5,101,0,0,2368,2369,5,99,0,0,2369,
+ 2370,5,105,0,0,2370,2371,5,109,0,0,2371,2372,5,97,0,0,2372,2373,5,108,
+ 0,0,2373,424,1,0,0,0,2374,2375,5,100,0,0,2375,2376,5,97,0,0,2376,2377,
+ 5,116,0,0,2377,2378,5,101,0,0,2378,426,1,0,0,0,2379,2380,5,98,0,0,2380,
+ 2381,5,115,0,0,2381,2382,5,116,0,0,2382,2383,5,114,0,0,2383,428,1,0,0,
+ 0,2384,2385,5,108,0,0,2385,2386,5,112,0,0,2386,2387,5,115,0,0,2387,2388,
+ 5,116,0,0,2388,2389,5,114,0,0,2389,430,1,0,0,0,2390,2391,5,108,0,0,2391,
+ 2392,5,112,0,0,2392,2393,5,119,0,0,2393,2394,5,115,0,0,2394,2395,5,116,
+ 0,0,2395,2396,5,114,0,0,2396,432,1,0,0,0,2397,2398,5,108,0,0,2398,2399,
+ 5,112,0,0,2399,2400,5,116,0,0,2400,2401,5,115,0,0,2401,2402,5,116,0,0,
+ 2402,2403,5,114,0,0,2403,434,1,0,0,0,2404,2405,5,111,0,0,2405,2406,5,98,
+ 0,0,2406,2407,5,106,0,0,2407,2408,5,101,0,0,2408,2409,5,99,0,0,2409,2410,
+ 5,116,0,0,2410,2411,5,114,0,0,2411,2412,5,101,0,0,2412,2413,5,102,0,0,
+ 2413,436,1,0,0,0,2414,2415,5,105,0,0,2415,2416,5,117,0,0,2416,2417,5,110,
+ 0,0,2417,2418,5,107,0,0,2418,2419,5,110,0,0,2419,2420,5,111,0,0,2420,2421,
+ 5,119,0,0,2421,2422,5,110,0,0,2422,438,1,0,0,0,2423,2424,5,105,0,0,2424,
+ 2425,5,100,0,0,2425,2426,5,105,0,0,2426,2427,5,115,0,0,2427,2428,5,112,
+ 0,0,2428,2429,5,97,0,0,2429,2430,5,116,0,0,2430,2431,5,99,0,0,2431,2432,
+ 5,104,0,0,2432,440,1,0,0,0,2433,2434,5,115,0,0,2434,2435,5,116,0,0,2435,
+ 2436,5,114,0,0,2436,2437,5,117,0,0,2437,2438,5,99,0,0,2438,2439,5,116,
+ 0,0,2439,442,1,0,0,0,2440,2441,5,105,0,0,2441,2442,5,110,0,0,2442,2443,
+ 5,116,0,0,2443,2444,5,101,0,0,2444,2445,5,114,0,0,2445,2446,5,102,0,0,
+ 2446,2447,5,97,0,0,2447,2448,5,99,0,0,2448,2449,5,101,0,0,2449,444,1,0,
+ 0,0,2450,2451,5,115,0,0,2451,2452,5,97,0,0,2452,2453,5,102,0,0,2453,2454,
+ 5,101,0,0,2454,2455,5,97,0,0,2455,2456,5,114,0,0,2456,2457,5,114,0,0,2457,
+ 2458,5,97,0,0,2458,2459,5,121,0,0,2459,446,1,0,0,0,2460,2461,5,98,0,0,
+ 2461,2462,5,121,0,0,2462,2463,5,118,0,0,2463,2464,5,97,0,0,2464,2465,5,
+ 108,0,0,2465,2466,5,115,0,0,2466,2467,5,116,0,0,2467,2468,5,114,0,0,2468,
+ 448,1,0,0,0,2469,2470,5,97,0,0,2470,2471,5,110,0,0,2471,2472,5,115,0,0,
+ 2472,2473,5,105,0,0,2473,450,1,0,0,0,2474,2475,5,116,0,0,2475,2476,5,98,
+ 0,0,2476,2477,5,115,0,0,2477,2478,5,116,0,0,2478,2479,5,114,0,0,2479,452,
+ 1,0,0,0,2480,2481,5,109,0,0,2481,2482,5,101,0,0,2482,2483,5,116,0,0,2483,
+ 2484,5,104,0,0,2484,2485,5,111,0,0,2485,2486,5,100,0,0,2486,454,1,0,0,
+ 0,2487,2488,5,97,0,0,2488,2489,5,110,0,0,2489,2490,5,121,0,0,2490,456,
+ 1,0,0,0,2491,2492,5,108,0,0,2492,2493,5,112,0,0,2493,2494,5,115,0,0,2494,
+ 2495,5,116,0,0,2495,2496,5,114,0,0,2496,2497,5,117,0,0,2497,2498,5,99,
+ 0,0,2498,2499,5,116,0,0,2499,458,1,0,0,0,2500,2501,5,118,0,0,2501,2502,
+ 5,101,0,0,2502,2503,5,99,0,0,2503,2504,5,116,0,0,2504,2505,5,111,0,0,2505,
+ 2506,5,114,0,0,2506,460,1,0,0,0,2507,2508,5,104,0,0,2508,2509,5,114,0,
+ 0,2509,2510,5,101,0,0,2510,2511,5,115,0,0,2511,2512,5,117,0,0,2512,2513,
+ 5,108,0,0,2513,2514,5,116,0,0,2514,462,1,0,0,0,2515,2516,5,99,0,0,2516,
+ 2517,5,97,0,0,2517,2518,5,114,0,0,2518,2519,5,114,0,0,2519,2520,5,97,0,
+ 0,2520,2521,5,121,0,0,2521,464,1,0,0,0,2522,2523,5,117,0,0,2523,2524,5,
+ 115,0,0,2524,2525,5,101,0,0,2525,2526,5,114,0,0,2526,2527,5,100,0,0,2527,
+ 2528,5,101,0,0,2528,2529,5,102,0,0,2529,2530,5,105,0,0,2530,2531,5,110,
+ 0,0,2531,2532,5,101,0,0,2532,2533,5,100,0,0,2533,466,1,0,0,0,2534,2535,
+ 5,114,0,0,2535,2536,5,101,0,0,2536,2537,5,99,0,0,2537,2538,5,111,0,0,2538,
+ 2539,5,114,0,0,2539,2540,5,100,0,0,2540,468,1,0,0,0,2541,2542,5,102,0,
+ 0,2542,2543,5,105,0,0,2543,2544,5,108,0,0,2544,2545,5,101,0,0,2545,2546,
+ 5,116,0,0,2546,2547,5,105,0,0,2547,2548,5,109,0,0,2548,2549,5,101,0,0,
+ 2549,470,1,0,0,0,2550,2551,5,98,0,0,2551,2552,5,108,0,0,2552,2553,5,111,
+ 0,0,2553,2554,5,98,0,0,2554,472,1,0,0,0,2555,2556,5,115,0,0,2556,2557,
+ 5,116,0,0,2557,2558,5,114,0,0,2558,2559,5,101,0,0,2559,2560,5,97,0,0,2560,
+ 2561,5,109,0,0,2561,474,1,0,0,0,2562,2563,5,115,0,0,2563,2564,5,116,0,
+ 0,2564,2565,5,111,0,0,2565,2566,5,114,0,0,2566,2567,5,97,0,0,2567,2568,
+ 5,103,0,0,2568,2569,5,101,0,0,2569,476,1,0,0,0,2570,2571,5,115,0,0,2571,
+ 2572,5,116,0,0,2572,2573,5,114,0,0,2573,2574,5,101,0,0,2574,2575,5,97,
+ 0,0,2575,2576,5,109,0,0,2576,2577,5,101,0,0,2577,2578,5,100,0,0,2578,2579,
+ 5,95,0,0,2579,2580,5,111,0,0,2580,2581,5,98,0,0,2581,2582,5,106,0,0,2582,
+ 2583,5,101,0,0,2583,2584,5,99,0,0,2584,2585,5,116,0,0,2585,478,1,0,0,0,
+ 2586,2587,5,115,0,0,2587,2588,5,116,0,0,2588,2589,5,111,0,0,2589,2590,
+ 5,114,0,0,2590,2591,5,101,0,0,2591,2592,5,100,0,0,2592,2593,5,95,0,0,2593,
+ 2594,5,111,0,0,2594,2595,5,98,0,0,2595,2596,5,106,0,0,2596,2597,5,101,
+ 0,0,2597,2598,5,99,0,0,2598,2599,5,116,0,0,2599,480,1,0,0,0,2600,2601,
+ 5,98,0,0,2601,2602,5,108,0,0,2602,2603,5,111,0,0,2603,2604,5,98,0,0,2604,
+ 2605,5,95,0,0,2605,2606,5,111,0,0,2606,2607,5,98,0,0,2607,2608,5,106,0,
+ 0,2608,2609,5,101,0,0,2609,2610,5,99,0,0,2610,2611,5,116,0,0,2611,482,
+ 1,0,0,0,2612,2613,5,99,0,0,2613,2614,5,102,0,0,2614,484,1,0,0,0,2615,2616,
+ 5,99,0,0,2616,2617,5,108,0,0,2617,2618,5,115,0,0,2618,2619,5,105,0,0,2619,
+ 2620,5,100,0,0,2620,486,1,0,0,0,2621,2622,5,105,0,0,2622,2623,5,110,0,
+ 0,2623,2624,5,115,0,0,2624,2625,5,116,0,0,2625,2626,5,97,0,0,2626,2627,
+ 5,110,0,0,2627,2628,5,99,0,0,2628,2629,5,101,0,0,2629,488,1,0,0,0,2630,
+ 2631,5,101,0,0,2631,2632,5,120,0,0,2632,2633,5,112,0,0,2633,2634,5,108,
+ 0,0,2634,2635,5,105,0,0,2635,2636,5,99,0,0,2636,2637,5,105,0,0,2637,2638,
+ 5,116,0,0,2638,490,1,0,0,0,2639,2640,5,100,0,0,2640,2641,5,101,0,0,2641,
+ 2642,5,102,0,0,2642,2643,5,97,0,0,2643,2644,5,117,0,0,2644,2645,5,108,
+ 0,0,2645,2646,5,116,0,0,2646,492,1,0,0,0,2647,2648,5,118,0,0,2648,2649,
+ 5,97,0,0,2649,2650,5,114,0,0,2650,2651,5,97,0,0,2651,2652,5,114,0,0,2652,
+ 2653,5,103,0,0,2653,494,1,0,0,0,2654,2655,5,117,0,0,2655,2656,5,110,0,
+ 0,2656,2657,5,109,0,0,2657,2658,5,97,0,0,2658,2659,5,110,0,0,2659,2660,
+ 5,97,0,0,2660,2661,5,103,0,0,2661,2662,5,101,0,0,2662,2663,5,100,0,0,2663,
+ 496,1,0,0,0,2664,2665,5,99,0,0,2665,2666,5,100,0,0,2666,2667,5,101,0,0,
+ 2667,2668,5,99,0,0,2668,2669,5,108,0,0,2669,498,1,0,0,0,2670,2671,5,115,
+ 0,0,2671,2672,5,116,0,0,2672,2673,5,100,0,0,2673,2674,5,99,0,0,2674,2675,
+ 5,97,0,0,2675,2676,5,108,0,0,2676,2677,5,108,0,0,2677,500,1,0,0,0,2678,
+ 2679,5,116,0,0,2679,2680,5,104,0,0,2680,2681,5,105,0,0,2681,2682,5,115,
+ 0,0,2682,2683,5,99,0,0,2683,2684,5,97,0,0,2684,2685,5,108,0,0,2685,2686,
+ 5,108,0,0,2686,502,1,0,0,0,2687,2688,5,102,0,0,2688,2689,5,97,0,0,2689,
+ 2690,5,115,0,0,2690,2691,5,116,0,0,2691,2692,5,99,0,0,2692,2693,5,97,0,
+ 0,2693,2694,5,108,0,0,2694,2695,5,108,0,0,2695,504,1,0,0,0,2696,2697,5,
+ 33,0,0,2697,506,1,0,0,0,2698,2699,5,33,0,0,2699,2700,5,33,0,0,2700,508,
+ 1,0,0,0,2701,2702,5,116,0,0,2702,2703,5,121,0,0,2703,2704,5,112,0,0,2704,
+ 2705,5,101,0,0,2705,2706,5,100,0,0,2706,2707,5,114,0,0,2707,2708,5,101,
+ 0,0,2708,2716,5,102,0,0,2709,2710,5,114,0,0,2710,2711,5,101,0,0,2711,2712,
+ 5,102,0,0,2712,2713,5,97,0,0,2713,2714,5,110,0,0,2714,2716,5,121,0,0,2715,
+ 2701,1,0,0,0,2715,2709,1,0,0,0,2716,510,1,0,0,0,2717,2718,5,46,0,0,2718,
+ 2719,5,112,0,0,2719,2720,5,97,0,0,2720,2721,5,114,0,0,2721,2722,5,97,0,
+ 0,2722,2723,5,109,0,0,2723,512,1,0,0,0,2724,2725,5,99,0,0,2725,2726,5,
+ 111,0,0,2726,2727,5,110,0,0,2727,2728,5,115,0,0,2728,2729,5,116,0,0,2729,
+ 2730,5,114,0,0,2730,2731,5,97,0,0,2731,2732,5,105,0,0,2732,2733,5,110,
+ 0,0,2733,2734,5,116,0,0,2734,514,1,0,0,0,2735,2736,5,46,0,0,2736,2737,
+ 5,116,0,0,2737,2738,5,104,0,0,2738,2739,5,105,0,0,2739,2740,5,115,0,0,
+ 2740,516,1,0,0,0,2741,2742,5,46,0,0,2742,2743,5,98,0,0,2743,2744,5,97,
+ 0,0,2744,2745,5,115,0,0,2745,2746,5,101,0,0,2746,518,1,0,0,0,2747,2748,
+ 5,46,0,0,2748,2749,5,110,0,0,2749,2750,5,101,0,0,2750,2751,5,115,0,0,2751,
+ 2752,5,116,0,0,2752,2753,5,101,0,0,2753,2754,5,114,0,0,2754,520,1,0,0,
+ 0,2755,2756,5,38,0,0,2756,522,1,0,0,0,2757,2758,5,91,0,0,2758,2759,5,93,
+ 0,0,2759,524,1,0,0,0,2760,2761,5,42,0,0,2761,526,1,0,0,0,2762,2775,5,92,
+ 0,0,2763,2776,7,4,0,0,2764,2766,7,5,0,0,2765,2767,7,5,0,0,2766,2765,1,
+ 0,0,0,2766,2767,1,0,0,0,2767,2769,1,0,0,0,2768,2770,7,5,0,0,2769,2768,
+ 1,0,0,0,2769,2770,1,0,0,0,2770,2776,1,0,0,0,2771,2773,5,13,0,0,2772,2771,
+ 1,0,0,0,2772,2773,1,0,0,0,2773,2774,1,0,0,0,2774,2776,5,10,0,0,2775,2763,
+ 1,0,0,0,2775,2764,1,0,0,0,2775,2772,1,0,0,0,2776,528,1,0,0,0,2777,2782,
+ 5,34,0,0,2778,2781,8,6,0,0,2779,2781,3,527,263,0,2780,2778,1,0,0,0,2780,
+ 2779,1,0,0,0,2781,2784,1,0,0,0,2782,2780,1,0,0,0,2782,2783,1,0,0,0,2783,
+ 2785,1,0,0,0,2784,2782,1,0,0,0,2785,2786,5,34,0,0,2786,530,1,0,0,0,2787,
+ 2792,5,39,0,0,2788,2791,8,7,0,0,2789,2791,3,527,263,0,2790,2788,1,0,0,
+ 0,2790,2789,1,0,0,0,2791,2794,1,0,0,0,2792,2790,1,0,0,0,2792,2793,1,0,
+ 0,0,2793,2795,1,0,0,0,2794,2792,1,0,0,0,2795,2796,5,39,0,0,2796,532,1,
+ 0,0,0,2797,2798,5,46,0,0,2798,534,1,0,0,0,2799,2800,5,43,0,0,2800,536,
+ 1,0,0,0,2801,2802,5,35,0,0,2802,2803,5,100,0,0,2803,2804,5,101,0,0,2804,
+ 2805,5,102,0,0,2805,2806,5,105,0,0,2806,2807,5,110,0,0,2807,2808,5,101,
+ 0,0,2808,538,1,0,0,0,2809,2810,5,35,0,0,2810,2811,5,117,0,0,2811,2812,
+ 5,110,0,0,2812,2813,5,100,0,0,2813,2814,5,101,0,0,2814,2815,5,102,0,0,
+ 2815,540,1,0,0,0,2816,2817,5,35,0,0,2817,2818,5,105,0,0,2818,2819,5,102,
+ 0,0,2819,2820,5,100,0,0,2820,2821,5,101,0,0,2821,2822,5,102,0,0,2822,542,
+ 1,0,0,0,2823,2824,5,35,0,0,2824,2825,5,105,0,0,2825,2826,5,102,0,0,2826,
+ 2827,5,110,0,0,2827,2828,5,100,0,0,2828,2829,5,101,0,0,2829,2830,5,102,
+ 0,0,2830,544,1,0,0,0,2831,2832,5,35,0,0,2832,2833,5,101,0,0,2833,2834,
+ 5,108,0,0,2834,2835,5,115,0,0,2835,2836,5,101,0,0,2836,546,1,0,0,0,2837,
+ 2838,5,35,0,0,2838,2839,5,101,0,0,2839,2840,5,110,0,0,2840,2841,5,100,
+ 0,0,2841,2842,5,105,0,0,2842,2843,5,102,0,0,2843,548,1,0,0,0,2844,2845,
+ 5,35,0,0,2845,2846,5,105,0,0,2846,2847,5,110,0,0,2847,2848,5,99,0,0,2848,
+ 2849,5,108,0,0,2849,2850,5,117,0,0,2850,2851,5,100,0,0,2851,2852,5,101,
+ 0,0,2852,550,1,0,0,0,2853,2854,5,46,0,0,2854,2855,5,109,0,0,2855,2856,
+ 5,114,0,0,2856,2857,5,101,0,0,2857,2858,5,115,0,0,2858,2859,5,111,0,0,
+ 2859,2860,5,117,0,0,2860,2861,5,114,0,0,2861,2862,5,99,0,0,2862,2863,5,
+ 101,0,0,2863,552,1,0,0,0,2864,2865,5,110,0,0,2865,2866,5,111,0,0,2866,
+ 4053,5,112,0,0,2867,2868,5,117,0,0,2868,2869,5,110,0,0,2869,2870,5,117,
+ 0,0,2870,2871,5,115,0,0,2871,2872,5,101,0,0,2872,4053,5,100,0,0,2873,2874,
+ 5,98,0,0,2874,2875,5,114,0,0,2875,2876,5,101,0,0,2876,2877,5,97,0,0,2877,
+ 4053,5,107,0,0,2878,2879,5,108,0,0,2879,2880,5,100,0,0,2880,2881,5,97,
+ 0,0,2881,2882,5,114,0,0,2882,2883,5,103,0,0,2883,2884,5,46,0,0,2884,4053,
+ 5,48,0,0,2885,2886,5,108,0,0,2886,2887,5,100,0,0,2887,2888,5,97,0,0,2888,
+ 2889,5,114,0,0,2889,2890,5,103,0,0,2890,2891,5,46,0,0,2891,4053,5,49,0,
+ 0,2892,2893,5,108,0,0,2893,2894,5,100,0,0,2894,2895,5,97,0,0,2895,2896,
+ 5,114,0,0,2896,2897,5,103,0,0,2897,2898,5,46,0,0,2898,4053,5,50,0,0,2899,
+ 2900,5,108,0,0,2900,2901,5,100,0,0,2901,2902,5,97,0,0,2902,2903,5,114,
+ 0,0,2903,2904,5,103,0,0,2904,2905,5,46,0,0,2905,4053,5,51,0,0,2906,2907,
+ 5,108,0,0,2907,2908,5,100,0,0,2908,2909,5,108,0,0,2909,2910,5,111,0,0,
+ 2910,2911,5,99,0,0,2911,2912,5,46,0,0,2912,4053,5,48,0,0,2913,2914,5,108,
+ 0,0,2914,2915,5,100,0,0,2915,2916,5,108,0,0,2916,2917,5,111,0,0,2917,2918,
+ 5,99,0,0,2918,2919,5,46,0,0,2919,4053,5,49,0,0,2920,2921,5,108,0,0,2921,
+ 2922,5,100,0,0,2922,2923,5,108,0,0,2923,2924,5,111,0,0,2924,2925,5,99,
+ 0,0,2925,2926,5,46,0,0,2926,4053,5,50,0,0,2927,2928,5,108,0,0,2928,2929,
+ 5,100,0,0,2929,2930,5,108,0,0,2930,2931,5,111,0,0,2931,2932,5,99,0,0,2932,
+ 2933,5,46,0,0,2933,4053,5,51,0,0,2934,2935,5,115,0,0,2935,2936,5,116,0,
+ 0,2936,2937,5,108,0,0,2937,2938,5,111,0,0,2938,2939,5,99,0,0,2939,2940,
+ 5,46,0,0,2940,4053,5,48,0,0,2941,2942,5,115,0,0,2942,2943,5,116,0,0,2943,
+ 2944,5,108,0,0,2944,2945,5,111,0,0,2945,2946,5,99,0,0,2946,2947,5,46,0,
+ 0,2947,4053,5,49,0,0,2948,2949,5,115,0,0,2949,2950,5,116,0,0,2950,2951,
+ 5,108,0,0,2951,2952,5,111,0,0,2952,2953,5,99,0,0,2953,2954,5,46,0,0,2954,
+ 4053,5,50,0,0,2955,2956,5,115,0,0,2956,2957,5,116,0,0,2957,2958,5,108,
+ 0,0,2958,2959,5,111,0,0,2959,2960,5,99,0,0,2960,2961,5,46,0,0,2961,4053,
+ 5,51,0,0,2962,2963,5,108,0,0,2963,2964,5,100,0,0,2964,2965,5,110,0,0,2965,
+ 2966,5,117,0,0,2966,2967,5,108,0,0,2967,4053,5,108,0,0,2968,2969,5,108,
+ 0,0,2969,2970,5,100,0,0,2970,2971,5,99,0,0,2971,2972,5,46,0,0,2972,2973,
+ 5,105,0,0,2973,2974,5,52,0,0,2974,2975,5,46,0,0,2975,2976,5,109,0,0,2976,
+ 4053,5,49,0,0,2977,2978,5,108,0,0,2978,2979,5,100,0,0,2979,2980,5,99,0,
+ 0,2980,2981,5,46,0,0,2981,2982,5,105,0,0,2982,2983,5,52,0,0,2983,2984,
+ 5,46,0,0,2984,2985,5,77,0,0,2985,4053,5,49,0,0,2986,2987,5,108,0,0,2987,
+ 2988,5,100,0,0,2988,2989,5,99,0,0,2989,2990,5,46,0,0,2990,2991,5,105,0,
+ 0,2991,2992,5,52,0,0,2992,2993,5,46,0,0,2993,4053,5,48,0,0,2994,2995,5,
+ 108,0,0,2995,2996,5,100,0,0,2996,2997,5,99,0,0,2997,2998,5,46,0,0,2998,
+ 2999,5,105,0,0,2999,3000,5,52,0,0,3000,3001,5,46,0,0,3001,4053,5,49,0,
+ 0,3002,3003,5,108,0,0,3003,3004,5,100,0,0,3004,3005,5,99,0,0,3005,3006,
+ 5,46,0,0,3006,3007,5,105,0,0,3007,3008,5,52,0,0,3008,3009,5,46,0,0,3009,
+ 4053,5,50,0,0,3010,3011,5,108,0,0,3011,3012,5,100,0,0,3012,3013,5,99,0,
+ 0,3013,3014,5,46,0,0,3014,3015,5,105,0,0,3015,3016,5,52,0,0,3016,3017,
+ 5,46,0,0,3017,4053,5,51,0,0,3018,3019,5,108,0,0,3019,3020,5,100,0,0,3020,
+ 3021,5,99,0,0,3021,3022,5,46,0,0,3022,3023,5,105,0,0,3023,3024,5,52,0,
+ 0,3024,3025,5,46,0,0,3025,4053,5,52,0,0,3026,3027,5,108,0,0,3027,3028,
+ 5,100,0,0,3028,3029,5,99,0,0,3029,3030,5,46,0,0,3030,3031,5,105,0,0,3031,
+ 3032,5,52,0,0,3032,3033,5,46,0,0,3033,4053,5,53,0,0,3034,3035,5,108,0,
+ 0,3035,3036,5,100,0,0,3036,3037,5,99,0,0,3037,3038,5,46,0,0,3038,3039,
+ 5,105,0,0,3039,3040,5,52,0,0,3040,3041,5,46,0,0,3041,4053,5,54,0,0,3042,
+ 3043,5,108,0,0,3043,3044,5,100,0,0,3044,3045,5,99,0,0,3045,3046,5,46,0,
+ 0,3046,3047,5,105,0,0,3047,3048,5,52,0,0,3048,3049,5,46,0,0,3049,4053,
+ 5,55,0,0,3050,3051,5,108,0,0,3051,3052,5,100,0,0,3052,3053,5,99,0,0,3053,
+ 3054,5,46,0,0,3054,3055,5,105,0,0,3055,3056,5,52,0,0,3056,3057,5,46,0,
+ 0,3057,4053,5,56,0,0,3058,3059,5,100,0,0,3059,3060,5,117,0,0,3060,4053,
+ 5,112,0,0,3061,3062,5,112,0,0,3062,3063,5,111,0,0,3063,4053,5,112,0,0,
+ 3064,3065,5,114,0,0,3065,3066,5,101,0,0,3066,4053,5,116,0,0,3067,3068,
+ 5,108,0,0,3068,3069,5,100,0,0,3069,3070,5,105,0,0,3070,3071,5,110,0,0,
+ 3071,3072,5,100,0,0,3072,3073,5,46,0,0,3073,3074,5,105,0,0,3074,4053,5,
+ 49,0,0,3075,3076,5,108,0,0,3076,3077,5,100,0,0,3077,3078,5,105,0,0,3078,
+ 3079,5,110,0,0,3079,3080,5,100,0,0,3080,3081,5,46,0,0,3081,3082,5,117,
+ 0,0,3082,4053,5,49,0,0,3083,3084,5,108,0,0,3084,3085,5,100,0,0,3085,3086,
+ 5,105,0,0,3086,3087,5,110,0,0,3087,3088,5,100,0,0,3088,3089,5,46,0,0,3089,
+ 3090,5,105,0,0,3090,4053,5,50,0,0,3091,3092,5,108,0,0,3092,3093,5,100,
+ 0,0,3093,3094,5,105,0,0,3094,3095,5,110,0,0,3095,3096,5,100,0,0,3096,3097,
+ 5,46,0,0,3097,3098,5,117,0,0,3098,4053,5,50,0,0,3099,3100,5,108,0,0,3100,
+ 3101,5,100,0,0,3101,3102,5,105,0,0,3102,3103,5,110,0,0,3103,3104,5,100,
+ 0,0,3104,3105,5,46,0,0,3105,3106,5,105,0,0,3106,4053,5,52,0,0,3107,3108,
+ 5,108,0,0,3108,3109,5,100,0,0,3109,3110,5,105,0,0,3110,3111,5,110,0,0,
+ 3111,3112,5,100,0,0,3112,3113,5,46,0,0,3113,3114,5,117,0,0,3114,4053,5,
+ 52,0,0,3115,3116,5,108,0,0,3116,3117,5,100,0,0,3117,3118,5,105,0,0,3118,
+ 3119,5,110,0,0,3119,3120,5,100,0,0,3120,3121,5,46,0,0,3121,3122,5,105,
+ 0,0,3122,4053,5,56,0,0,3123,3124,5,108,0,0,3124,3125,5,100,0,0,3125,3126,
+ 5,105,0,0,3126,3127,5,110,0,0,3127,3128,5,100,0,0,3128,3129,5,46,0,0,3129,
+ 3130,5,117,0,0,3130,4053,5,56,0,0,3131,3132,5,108,0,0,3132,3133,5,100,
+ 0,0,3133,3134,5,105,0,0,3134,3135,5,110,0,0,3135,3136,5,100,0,0,3136,3137,
+ 5,46,0,0,3137,4053,5,105,0,0,3138,3139,5,108,0,0,3139,3140,5,100,0,0,3140,
+ 3141,5,105,0,0,3141,3142,5,110,0,0,3142,3143,5,100,0,0,3143,3144,5,46,
+ 0,0,3144,3145,5,114,0,0,3145,4053,5,52,0,0,3146,3147,5,108,0,0,3147,3148,
+ 5,100,0,0,3148,3149,5,105,0,0,3149,3150,5,110,0,0,3150,3151,5,100,0,0,
+ 3151,3152,5,46,0,0,3152,3153,5,114,0,0,3153,4053,5,56,0,0,3154,3155,5,
+ 108,0,0,3155,3156,5,100,0,0,3156,3157,5,105,0,0,3157,3158,5,110,0,0,3158,
+ 3159,5,100,0,0,3159,3160,5,46,0,0,3160,3161,5,114,0,0,3161,3162,5,101,
+ 0,0,3162,4053,5,102,0,0,3163,3164,5,115,0,0,3164,3165,5,116,0,0,3165,3166,
+ 5,105,0,0,3166,3167,5,110,0,0,3167,3168,5,100,0,0,3168,3169,5,46,0,0,3169,
+ 3170,5,114,0,0,3170,3171,5,101,0,0,3171,4053,5,102,0,0,3172,3173,5,115,
+ 0,0,3173,3174,5,116,0,0,3174,3175,5,105,0,0,3175,3176,5,110,0,0,3176,3177,
+ 5,100,0,0,3177,3178,5,46,0,0,3178,3179,5,105,0,0,3179,4053,5,49,0,0,3180,
+ 3181,5,115,0,0,3181,3182,5,116,0,0,3182,3183,5,105,0,0,3183,3184,5,110,
+ 0,0,3184,3185,5,100,0,0,3185,3186,5,46,0,0,3186,3187,5,105,0,0,3187,4053,
+ 5,50,0,0,3188,3189,5,115,0,0,3189,3190,5,116,0,0,3190,3191,5,105,0,0,3191,
+ 3192,5,110,0,0,3192,3193,5,100,0,0,3193,3194,5,46,0,0,3194,3195,5,105,
+ 0,0,3195,4053,5,52,0,0,3196,3197,5,115,0,0,3197,3198,5,116,0,0,3198,3199,
+ 5,105,0,0,3199,3200,5,110,0,0,3200,3201,5,100,0,0,3201,3202,5,46,0,0,3202,
+ 3203,5,105,0,0,3203,4053,5,56,0,0,3204,3205,5,115,0,0,3205,3206,5,116,
+ 0,0,3206,3207,5,105,0,0,3207,3208,5,110,0,0,3208,3209,5,100,0,0,3209,3210,
+ 5,46,0,0,3210,3211,5,114,0,0,3211,4053,5,52,0,0,3212,3213,5,115,0,0,3213,
+ 3214,5,116,0,0,3214,3215,5,105,0,0,3215,3216,5,110,0,0,3216,3217,5,100,
+ 0,0,3217,3218,5,46,0,0,3218,3219,5,114,0,0,3219,4053,5,56,0,0,3220,3221,
+ 5,97,0,0,3221,3222,5,100,0,0,3222,4053,5,100,0,0,3223,3224,5,115,0,0,3224,
+ 3225,5,117,0,0,3225,4053,5,98,0,0,3226,3227,5,109,0,0,3227,3228,5,117,
+ 0,0,3228,4053,5,108,0,0,3229,3230,5,100,0,0,3230,3231,5,105,0,0,3231,4053,
+ 5,118,0,0,3232,3233,5,100,0,0,3233,3234,5,105,0,0,3234,3235,5,118,0,0,
+ 3235,3236,5,46,0,0,3236,3237,5,117,0,0,3237,4053,5,110,0,0,3238,3239,5,
+ 114,0,0,3239,3240,5,101,0,0,3240,4053,5,109,0,0,3241,3242,5,114,0,0,3242,
+ 3243,5,101,0,0,3243,3244,5,109,0,0,3244,3245,5,46,0,0,3245,3246,5,117,
+ 0,0,3246,4053,5,110,0,0,3247,3248,5,97,0,0,3248,3249,5,110,0,0,3249,4053,
+ 5,100,0,0,3250,3251,5,111,0,0,3251,4053,5,114,0,0,3252,3253,5,120,0,0,
+ 3253,3254,5,111,0,0,3254,4053,5,114,0,0,3255,3256,5,115,0,0,3256,3257,
+ 5,104,0,0,3257,4053,5,108,0,0,3258,3259,5,115,0,0,3259,3260,5,104,0,0,
+ 3260,4053,5,114,0,0,3261,3262,5,115,0,0,3262,3263,5,104,0,0,3263,3264,
+ 5,114,0,0,3264,3265,5,46,0,0,3265,3266,5,117,0,0,3266,4053,5,110,0,0,3267,
+ 3268,5,110,0,0,3268,3269,5,101,0,0,3269,4053,5,103,0,0,3270,3271,5,110,
+ 0,0,3271,3272,5,111,0,0,3272,4053,5,116,0,0,3273,3274,5,99,0,0,3274,3275,
+ 5,111,0,0,3275,3276,5,110,0,0,3276,3277,5,118,0,0,3277,3278,5,46,0,0,3278,
+ 3279,5,105,0,0,3279,4053,5,49,0,0,3280,3281,5,99,0,0,3281,3282,5,111,0,
+ 0,3282,3283,5,110,0,0,3283,3284,5,118,0,0,3284,3285,5,46,0,0,3285,3286,
+ 5,105,0,0,3286,4053,5,50,0,0,3287,3288,5,99,0,0,3288,3289,5,111,0,0,3289,
+ 3290,5,110,0,0,3290,3291,5,118,0,0,3291,3292,5,46,0,0,3292,3293,5,105,
+ 0,0,3293,4053,5,52,0,0,3294,3295,5,99,0,0,3295,3296,5,111,0,0,3296,3297,
+ 5,110,0,0,3297,3298,5,118,0,0,3298,3299,5,46,0,0,3299,3300,5,105,0,0,3300,
+ 4053,5,56,0,0,3301,3302,5,99,0,0,3302,3303,5,111,0,0,3303,3304,5,110,0,
+ 0,3304,3305,5,118,0,0,3305,3306,5,46,0,0,3306,3307,5,114,0,0,3307,4053,
+ 5,52,0,0,3308,3309,5,99,0,0,3309,3310,5,111,0,0,3310,3311,5,110,0,0,3311,
+ 3312,5,118,0,0,3312,3313,5,46,0,0,3313,3314,5,114,0,0,3314,4053,5,56,0,
+ 0,3315,3316,5,99,0,0,3316,3317,5,111,0,0,3317,3318,5,110,0,0,3318,3319,
+ 5,118,0,0,3319,3320,5,46,0,0,3320,3321,5,117,0,0,3321,4053,5,52,0,0,3322,
+ 3323,5,99,0,0,3323,3324,5,111,0,0,3324,3325,5,110,0,0,3325,3326,5,118,
+ 0,0,3326,3327,5,46,0,0,3327,3328,5,117,0,0,3328,4053,5,56,0,0,3329,3330,
+ 5,99,0,0,3330,3331,5,111,0,0,3331,3332,5,110,0,0,3332,3333,5,118,0,0,3333,
+ 3334,5,46,0,0,3334,3335,5,114,0,0,3335,3336,5,46,0,0,3336,3337,5,117,0,
+ 0,3337,4053,5,110,0,0,3338,3339,5,116,0,0,3339,3340,5,104,0,0,3340,3341,
+ 5,114,0,0,3341,3342,5,111,0,0,3342,4053,5,119,0,0,3343,3344,5,99,0,0,3344,
+ 3345,5,111,0,0,3345,3346,5,110,0,0,3346,3347,5,118,0,0,3347,3348,5,46,
+ 0,0,3348,3349,5,111,0,0,3349,3350,5,118,0,0,3350,3351,5,102,0,0,3351,3352,
+ 5,46,0,0,3352,3353,5,105,0,0,3353,3354,5,49,0,0,3354,3355,5,46,0,0,3355,
+ 3356,5,117,0,0,3356,4053,5,110,0,0,3357,3358,5,99,0,0,3358,3359,5,111,
+ 0,0,3359,3360,5,110,0,0,3360,3361,5,118,0,0,3361,3362,5,46,0,0,3362,3363,
+ 5,111,0,0,3363,3364,5,118,0,0,3364,3365,5,102,0,0,3365,3366,5,46,0,0,3366,
+ 3367,5,105,0,0,3367,3368,5,50,0,0,3368,3369,5,46,0,0,3369,3370,5,117,0,
+ 0,3370,4053,5,110,0,0,3371,3372,5,99,0,0,3372,3373,5,111,0,0,3373,3374,
+ 5,110,0,0,3374,3375,5,118,0,0,3375,3376,5,46,0,0,3376,3377,5,111,0,0,3377,
+ 3378,5,118,0,0,3378,3379,5,102,0,0,3379,3380,5,46,0,0,3380,3381,5,105,
+ 0,0,3381,3382,5,52,0,0,3382,3383,5,46,0,0,3383,3384,5,117,0,0,3384,4053,
+ 5,110,0,0,3385,3386,5,99,0,0,3386,3387,5,111,0,0,3387,3388,5,110,0,0,3388,
+ 3389,5,118,0,0,3389,3390,5,46,0,0,3390,3391,5,111,0,0,3391,3392,5,118,
+ 0,0,3392,3393,5,102,0,0,3393,3394,5,46,0,0,3394,3395,5,105,0,0,3395,3396,
+ 5,56,0,0,3396,3397,5,46,0,0,3397,3398,5,117,0,0,3398,4053,5,110,0,0,3399,
+ 3400,5,99,0,0,3400,3401,5,111,0,0,3401,3402,5,110,0,0,3402,3403,5,118,
+ 0,0,3403,3404,5,46,0,0,3404,3405,5,111,0,0,3405,3406,5,118,0,0,3406,3407,
+ 5,102,0,0,3407,3408,5,46,0,0,3408,3409,5,117,0,0,3409,3410,5,49,0,0,3410,
+ 3411,5,46,0,0,3411,3412,5,117,0,0,3412,4053,5,110,0,0,3413,3414,5,99,0,
+ 0,3414,3415,5,111,0,0,3415,3416,5,110,0,0,3416,3417,5,118,0,0,3417,3418,
+ 5,46,0,0,3418,3419,5,111,0,0,3419,3420,5,118,0,0,3420,3421,5,102,0,0,3421,
+ 3422,5,46,0,0,3422,3423,5,117,0,0,3423,3424,5,50,0,0,3424,3425,5,46,0,
+ 0,3425,3426,5,117,0,0,3426,4053,5,110,0,0,3427,3428,5,99,0,0,3428,3429,
+ 5,111,0,0,3429,3430,5,110,0,0,3430,3431,5,118,0,0,3431,3432,5,46,0,0,3432,
+ 3433,5,111,0,0,3433,3434,5,118,0,0,3434,3435,5,102,0,0,3435,3436,5,46,
+ 0,0,3436,3437,5,117,0,0,3437,3438,5,52,0,0,3438,3439,5,46,0,0,3439,3440,
+ 5,117,0,0,3440,4053,5,110,0,0,3441,3442,5,99,0,0,3442,3443,5,111,0,0,3443,
+ 3444,5,110,0,0,3444,3445,5,118,0,0,3445,3446,5,46,0,0,3446,3447,5,111,
+ 0,0,3447,3448,5,118,0,0,3448,3449,5,102,0,0,3449,3450,5,46,0,0,3450,3451,
+ 5,117,0,0,3451,3452,5,56,0,0,3452,3453,5,46,0,0,3453,3454,5,117,0,0,3454,
+ 4053,5,110,0,0,3455,3456,5,99,0,0,3456,3457,5,111,0,0,3457,3458,5,110,
+ 0,0,3458,3459,5,118,0,0,3459,3460,5,46,0,0,3460,3461,5,111,0,0,3461,3462,
+ 5,118,0,0,3462,3463,5,102,0,0,3463,3464,5,46,0,0,3464,3465,5,105,0,0,3465,
+ 3466,5,46,0,0,3466,3467,5,117,0,0,3467,4053,5,110,0,0,3468,3469,5,99,0,
+ 0,3469,3470,5,111,0,0,3470,3471,5,110,0,0,3471,3472,5,118,0,0,3472,3473,
+ 5,46,0,0,3473,3474,5,111,0,0,3474,3475,5,118,0,0,3475,3476,5,102,0,0,3476,
+ 3477,5,46,0,0,3477,3478,5,117,0,0,3478,3479,5,46,0,0,3479,3480,5,117,0,
+ 0,3480,4053,5,110,0,0,3481,3482,5,108,0,0,3482,3483,5,100,0,0,3483,3484,
+ 5,108,0,0,3484,3485,5,101,0,0,3485,4053,5,110,0,0,3486,3487,5,108,0,0,
+ 3487,3488,5,100,0,0,3488,3489,5,101,0,0,3489,3490,5,108,0,0,3490,3491,
+ 5,101,0,0,3491,3492,5,109,0,0,3492,3493,5,46,0,0,3493,3494,5,105,0,0,3494,
+ 4053,5,49,0,0,3495,3496,5,108,0,0,3496,3497,5,100,0,0,3497,3498,5,101,
+ 0,0,3498,3499,5,108,0,0,3499,3500,5,101,0,0,3500,3501,5,109,0,0,3501,3502,
+ 5,46,0,0,3502,3503,5,117,0,0,3503,4053,5,49,0,0,3504,3505,5,108,0,0,3505,
+ 3506,5,100,0,0,3506,3507,5,101,0,0,3507,3508,5,108,0,0,3508,3509,5,101,
+ 0,0,3509,3510,5,109,0,0,3510,3511,5,46,0,0,3511,3512,5,105,0,0,3512,4053,
+ 5,50,0,0,3513,3514,5,108,0,0,3514,3515,5,100,0,0,3515,3516,5,101,0,0,3516,
+ 3517,5,108,0,0,3517,3518,5,101,0,0,3518,3519,5,109,0,0,3519,3520,5,46,
+ 0,0,3520,3521,5,117,0,0,3521,4053,5,50,0,0,3522,3523,5,108,0,0,3523,3524,
+ 5,100,0,0,3524,3525,5,101,0,0,3525,3526,5,108,0,0,3526,3527,5,101,0,0,
+ 3527,3528,5,109,0,0,3528,3529,5,46,0,0,3529,3530,5,105,0,0,3530,4053,5,
+ 52,0,0,3531,3532,5,108,0,0,3532,3533,5,100,0,0,3533,3534,5,101,0,0,3534,
+ 3535,5,108,0,0,3535,3536,5,101,0,0,3536,3537,5,109,0,0,3537,3538,5,46,
+ 0,0,3538,3539,5,117,0,0,3539,4053,5,52,0,0,3540,3541,5,108,0,0,3541,3542,
+ 5,100,0,0,3542,3543,5,101,0,0,3543,3544,5,108,0,0,3544,3545,5,101,0,0,
+ 3545,3546,5,109,0,0,3546,3547,5,46,0,0,3547,3548,5,105,0,0,3548,4053,5,
+ 56,0,0,3549,3550,5,108,0,0,3550,3551,5,100,0,0,3551,3552,5,101,0,0,3552,
+ 3553,5,108,0,0,3553,3554,5,101,0,0,3554,3555,5,109,0,0,3555,3556,5,46,
+ 0,0,3556,3557,5,117,0,0,3557,4053,5,56,0,0,3558,3559,5,108,0,0,3559,3560,
+ 5,100,0,0,3560,3561,5,101,0,0,3561,3562,5,108,0,0,3562,3563,5,101,0,0,
+ 3563,3564,5,109,0,0,3564,3565,5,46,0,0,3565,4053,5,105,0,0,3566,3567,5,
+ 108,0,0,3567,3568,5,100,0,0,3568,3569,5,101,0,0,3569,3570,5,108,0,0,3570,
+ 3571,5,101,0,0,3571,3572,5,109,0,0,3572,3573,5,46,0,0,3573,3574,5,114,
+ 0,0,3574,4053,5,52,0,0,3575,3576,5,108,0,0,3576,3577,5,100,0,0,3577,3578,
+ 5,101,0,0,3578,3579,5,108,0,0,3579,3580,5,101,0,0,3580,3581,5,109,0,0,
+ 3581,3582,5,46,0,0,3582,3583,5,114,0,0,3583,4053,5,56,0,0,3584,3585,5,
+ 108,0,0,3585,3586,5,100,0,0,3586,3587,5,101,0,0,3587,3588,5,108,0,0,3588,
+ 3589,5,101,0,0,3589,3590,5,109,0,0,3590,3591,5,46,0,0,3591,3592,5,114,
+ 0,0,3592,3593,5,101,0,0,3593,4053,5,102,0,0,3594,3595,5,115,0,0,3595,3596,
+ 5,116,0,0,3596,3597,5,101,0,0,3597,3598,5,108,0,0,3598,3599,5,101,0,0,
+ 3599,3600,5,109,0,0,3600,3601,5,46,0,0,3601,4053,5,105,0,0,3602,3603,5,
+ 115,0,0,3603,3604,5,116,0,0,3604,3605,5,101,0,0,3605,3606,5,108,0,0,3606,
+ 3607,5,101,0,0,3607,3608,5,109,0,0,3608,3609,5,46,0,0,3609,3610,5,105,
+ 0,0,3610,4053,5,49,0,0,3611,3612,5,115,0,0,3612,3613,5,116,0,0,3613,3614,
+ 5,101,0,0,3614,3615,5,108,0,0,3615,3616,5,101,0,0,3616,3617,5,109,0,0,
+ 3617,3618,5,46,0,0,3618,3619,5,105,0,0,3619,4053,5,50,0,0,3620,3621,5,
+ 115,0,0,3621,3622,5,116,0,0,3622,3623,5,101,0,0,3623,3624,5,108,0,0,3624,
+ 3625,5,101,0,0,3625,3626,5,109,0,0,3626,3627,5,46,0,0,3627,3628,5,105,
+ 0,0,3628,4053,5,52,0,0,3629,3630,5,115,0,0,3630,3631,5,116,0,0,3631,3632,
+ 5,101,0,0,3632,3633,5,108,0,0,3633,3634,5,101,0,0,3634,3635,5,109,0,0,
+ 3635,3636,5,46,0,0,3636,3637,5,105,0,0,3637,4053,5,56,0,0,3638,3639,5,
+ 115,0,0,3639,3640,5,116,0,0,3640,3641,5,101,0,0,3641,3642,5,108,0,0,3642,
+ 3643,5,101,0,0,3643,3644,5,109,0,0,3644,3645,5,46,0,0,3645,3646,5,114,
+ 0,0,3646,4053,5,52,0,0,3647,3648,5,115,0,0,3648,3649,5,116,0,0,3649,3650,
+ 5,101,0,0,3650,3651,5,108,0,0,3651,3652,5,101,0,0,3652,3653,5,109,0,0,
+ 3653,3654,5,46,0,0,3654,3655,5,114,0,0,3655,4053,5,56,0,0,3656,3657,5,
+ 115,0,0,3657,3658,5,116,0,0,3658,3659,5,101,0,0,3659,3660,5,108,0,0,3660,
+ 3661,5,101,0,0,3661,3662,5,109,0,0,3662,3663,5,46,0,0,3663,3664,5,114,
+ 0,0,3664,3665,5,101,0,0,3665,4053,5,102,0,0,3666,3667,5,99,0,0,3667,3668,
+ 5,111,0,0,3668,3669,5,110,0,0,3669,3670,5,118,0,0,3670,3671,5,46,0,0,3671,
+ 3672,5,111,0,0,3672,3673,5,118,0,0,3673,3674,5,102,0,0,3674,3675,5,46,
+ 0,0,3675,3676,5,105,0,0,3676,4053,5,49,0,0,3677,3678,5,99,0,0,3678,3679,
+ 5,111,0,0,3679,3680,5,110,0,0,3680,3681,5,118,0,0,3681,3682,5,46,0,0,3682,
+ 3683,5,111,0,0,3683,3684,5,118,0,0,3684,3685,5,102,0,0,3685,3686,5,46,
+ 0,0,3686,3687,5,117,0,0,3687,4053,5,49,0,0,3688,3689,5,99,0,0,3689,3690,
+ 5,111,0,0,3690,3691,5,110,0,0,3691,3692,5,118,0,0,3692,3693,5,46,0,0,3693,
+ 3694,5,111,0,0,3694,3695,5,118,0,0,3695,3696,5,102,0,0,3696,3697,5,46,
+ 0,0,3697,3698,5,105,0,0,3698,4053,5,50,0,0,3699,3700,5,99,0,0,3700,3701,
+ 5,111,0,0,3701,3702,5,110,0,0,3702,3703,5,118,0,0,3703,3704,5,46,0,0,3704,
+ 3705,5,111,0,0,3705,3706,5,118,0,0,3706,3707,5,102,0,0,3707,3708,5,46,
+ 0,0,3708,3709,5,117,0,0,3709,4053,5,50,0,0,3710,3711,5,99,0,0,3711,3712,
+ 5,111,0,0,3712,3713,5,110,0,0,3713,3714,5,118,0,0,3714,3715,5,46,0,0,3715,
+ 3716,5,111,0,0,3716,3717,5,118,0,0,3717,3718,5,102,0,0,3718,3719,5,46,
+ 0,0,3719,3720,5,105,0,0,3720,4053,5,52,0,0,3721,3722,5,99,0,0,3722,3723,
+ 5,111,0,0,3723,3724,5,110,0,0,3724,3725,5,118,0,0,3725,3726,5,46,0,0,3726,
+ 3727,5,111,0,0,3727,3728,5,118,0,0,3728,3729,5,102,0,0,3729,3730,5,46,
+ 0,0,3730,3731,5,117,0,0,3731,4053,5,52,0,0,3732,3733,5,99,0,0,3733,3734,
+ 5,111,0,0,3734,3735,5,110,0,0,3735,3736,5,118,0,0,3736,3737,5,46,0,0,3737,
+ 3738,5,111,0,0,3738,3739,5,118,0,0,3739,3740,5,102,0,0,3740,3741,5,46,
+ 0,0,3741,3742,5,105,0,0,3742,4053,5,56,0,0,3743,3744,5,99,0,0,3744,3745,
+ 5,111,0,0,3745,3746,5,110,0,0,3746,3747,5,118,0,0,3747,3748,5,46,0,0,3748,
+ 3749,5,111,0,0,3749,3750,5,118,0,0,3750,3751,5,102,0,0,3751,3752,5,46,
+ 0,0,3752,3753,5,117,0,0,3753,4053,5,56,0,0,3754,3755,5,99,0,0,3755,3756,
+ 5,107,0,0,3756,3757,5,102,0,0,3757,3758,5,105,0,0,3758,3759,5,110,0,0,
+ 3759,3760,5,105,0,0,3760,3761,5,116,0,0,3761,4053,5,101,0,0,3762,3763,
+ 5,99,0,0,3763,3764,5,111,0,0,3764,3765,5,110,0,0,3765,3766,5,118,0,0,3766,
+ 3767,5,46,0,0,3767,3768,5,117,0,0,3768,4053,5,50,0,0,3769,3770,5,99,0,
+ 0,3770,3771,5,111,0,0,3771,3772,5,110,0,0,3772,3773,5,118,0,0,3773,3774,
+ 5,46,0,0,3774,3775,5,117,0,0,3775,4053,5,49,0,0,3776,3777,5,99,0,0,3777,
+ 3778,5,111,0,0,3778,3779,5,110,0,0,3779,3780,5,118,0,0,3780,3781,5,46,
+ 0,0,3781,4053,5,105,0,0,3782,3783,5,99,0,0,3783,3784,5,111,0,0,3784,3785,
+ 5,110,0,0,3785,3786,5,118,0,0,3786,3787,5,46,0,0,3787,3788,5,111,0,0,3788,
+ 3789,5,118,0,0,3789,3790,5,102,0,0,3790,3791,5,46,0,0,3791,4053,5,105,
+ 0,0,3792,3793,5,99,0,0,3793,3794,5,111,0,0,3794,3795,5,110,0,0,3795,3796,
+ 5,118,0,0,3796,3797,5,46,0,0,3797,3798,5,111,0,0,3798,3799,5,118,0,0,3799,
+ 3800,5,102,0,0,3800,3801,5,46,0,0,3801,4053,5,117,0,0,3802,3803,5,97,0,
+ 0,3803,3804,5,100,0,0,3804,3805,5,100,0,0,3805,3806,5,46,0,0,3806,3807,
+ 5,111,0,0,3807,3808,5,118,0,0,3808,4053,5,102,0,0,3809,3810,5,97,0,0,3810,
+ 3811,5,100,0,0,3811,3812,5,100,0,0,3812,3813,5,46,0,0,3813,3814,5,111,
+ 0,0,3814,3815,5,118,0,0,3815,3816,5,102,0,0,3816,3817,5,46,0,0,3817,3818,
+ 5,117,0,0,3818,4053,5,110,0,0,3819,3820,5,109,0,0,3820,3821,5,117,0,0,
+ 3821,3822,5,108,0,0,3822,3823,5,46,0,0,3823,3824,5,111,0,0,3824,3825,5,
+ 118,0,0,3825,4053,5,102,0,0,3826,3827,5,109,0,0,3827,3828,5,117,0,0,3828,
+ 3829,5,108,0,0,3829,3830,5,46,0,0,3830,3831,5,111,0,0,3831,3832,5,118,
+ 0,0,3832,3833,5,102,0,0,3833,3834,5,46,0,0,3834,3835,5,117,0,0,3835,4053,
+ 5,110,0,0,3836,3837,5,115,0,0,3837,3838,5,117,0,0,3838,3839,5,98,0,0,3839,
+ 3840,5,46,0,0,3840,3841,5,111,0,0,3841,3842,5,118,0,0,3842,4053,5,102,
+ 0,0,3843,3844,5,115,0,0,3844,3845,5,117,0,0,3845,3846,5,98,0,0,3846,3847,
+ 5,46,0,0,3847,3848,5,111,0,0,3848,3849,5,118,0,0,3849,3850,5,102,0,0,3850,
+ 3851,5,46,0,0,3851,3852,5,117,0,0,3852,4053,5,110,0,0,3853,3854,5,101,
+ 0,0,3854,3855,5,110,0,0,3855,3856,5,100,0,0,3856,3857,5,102,0,0,3857,3858,
+ 5,105,0,0,3858,3859,5,110,0,0,3859,3860,5,97,0,0,3860,3861,5,108,0,0,3861,
+ 3862,5,108,0,0,3862,4053,5,121,0,0,3863,3864,5,101,0,0,3864,3865,5,110,
+ 0,0,3865,3866,5,100,0,0,3866,3867,5,102,0,0,3867,3868,5,97,0,0,3868,3869,
+ 5,117,0,0,3869,3870,5,108,0,0,3870,4053,5,116,0,0,3871,3872,5,115,0,0,
+ 3872,3873,5,116,0,0,3873,3874,5,105,0,0,3874,3875,5,110,0,0,3875,3876,
+ 5,100,0,0,3876,3877,5,46,0,0,3877,4053,5,105,0,0,3878,3879,5,99,0,0,3879,
+ 3880,5,111,0,0,3880,3881,5,110,0,0,3881,3882,5,118,0,0,3882,3883,5,46,
+ 0,0,3883,4053,5,117,0,0,3884,3885,5,112,0,0,3885,3886,5,114,0,0,3886,3887,
+ 5,101,0,0,3887,3888,5,102,0,0,3888,3889,5,105,0,0,3889,3890,5,120,0,0,
+ 3890,4053,5,55,0,0,3891,3892,5,112,0,0,3892,3893,5,114,0,0,3893,3894,5,
+ 101,0,0,3894,3895,5,102,0,0,3895,3896,5,105,0,0,3896,3897,5,120,0,0,3897,
+ 4053,5,54,0,0,3898,3899,5,112,0,0,3899,3900,5,114,0,0,3900,3901,5,101,
+ 0,0,3901,3902,5,102,0,0,3902,3903,5,105,0,0,3903,3904,5,120,0,0,3904,4053,
+ 5,53,0,0,3905,3906,5,112,0,0,3906,3907,5,114,0,0,3907,3908,5,101,0,0,3908,
+ 3909,5,102,0,0,3909,3910,5,105,0,0,3910,3911,5,120,0,0,3911,4053,5,52,
+ 0,0,3912,3913,5,112,0,0,3913,3914,5,114,0,0,3914,3915,5,101,0,0,3915,3916,
+ 5,102,0,0,3916,3917,5,105,0,0,3917,3918,5,120,0,0,3918,4053,5,51,0,0,3919,
+ 3920,5,112,0,0,3920,3921,5,114,0,0,3921,3922,5,101,0,0,3922,3923,5,102,
+ 0,0,3923,3924,5,105,0,0,3924,3925,5,120,0,0,3925,4053,5,50,0,0,3926,3927,
+ 5,112,0,0,3927,3928,5,114,0,0,3928,3929,5,101,0,0,3929,3930,5,102,0,0,
+ 3930,3931,5,105,0,0,3931,3932,5,120,0,0,3932,4053,5,49,0,0,3933,3934,5,
+ 112,0,0,3934,3935,5,114,0,0,3935,3936,5,101,0,0,3936,3937,5,102,0,0,3937,
+ 3938,5,105,0,0,3938,3939,5,120,0,0,3939,3940,5,114,0,0,3940,3941,5,101,
+ 0,0,3941,4053,5,102,0,0,3942,3943,5,97,0,0,3943,3944,5,114,0,0,3944,3945,
+ 5,103,0,0,3945,3946,5,108,0,0,3946,3947,5,105,0,0,3947,3948,5,115,0,0,
+ 3948,4053,5,116,0,0,3949,3950,5,99,0,0,3950,3951,5,101,0,0,3951,4053,5,
+ 113,0,0,3952,3953,5,99,0,0,3953,3954,5,103,0,0,3954,4053,5,116,0,0,3955,
+ 3956,5,99,0,0,3956,3957,5,103,0,0,3957,3958,5,116,0,0,3958,3959,5,46,0,
+ 0,3959,3960,5,117,0,0,3960,4053,5,110,0,0,3961,3962,5,99,0,0,3962,3963,
+ 5,108,0,0,3963,4053,5,116,0,0,3964,3965,5,99,0,0,3965,3966,5,108,0,0,3966,
+ 3967,5,116,0,0,3967,3968,5,46,0,0,3968,3969,5,117,0,0,3969,4053,5,110,
+ 0,0,3970,3971,5,108,0,0,3971,3972,5,111,0,0,3972,3973,5,99,0,0,3973,3974,
+ 5,97,0,0,3974,3975,5,108,0,0,3975,3976,5,108,0,0,3976,3977,5,111,0,0,3977,
+ 4053,5,99,0,0,3978,3979,5,101,0,0,3979,3980,5,110,0,0,3980,3981,5,100,
+ 0,0,3981,3982,5,102,0,0,3982,3983,5,105,0,0,3983,3984,5,108,0,0,3984,3985,
+ 5,116,0,0,3985,3986,5,101,0,0,3986,4053,5,114,0,0,3987,3988,5,118,0,0,
+ 3988,3989,5,111,0,0,3989,3990,5,108,0,0,3990,3991,5,97,0,0,3991,3992,5,
+ 116,0,0,3992,3993,5,105,0,0,3993,3994,5,108,0,0,3994,3995,5,101,0,0,3995,
+ 4053,5,46,0,0,3996,3997,5,116,0,0,3997,3998,5,97,0,0,3998,3999,5,105,0,
+ 0,3999,4000,5,108,0,0,4000,4053,5,46,0,0,4001,4002,5,99,0,0,4002,4003,
+ 5,112,0,0,4003,4004,5,98,0,0,4004,4005,5,108,0,0,4005,4053,5,107,0,0,4006,
+ 4007,5,105,0,0,4007,4008,5,110,0,0,4008,4009,5,105,0,0,4009,4010,5,116,
+ 0,0,4010,4011,5,98,0,0,4011,4012,5,108,0,0,4012,4053,5,107,0,0,4013,4014,
+ 5,114,0,0,4014,4015,5,101,0,0,4015,4016,5,116,0,0,4016,4017,5,104,0,0,
+ 4017,4018,5,114,0,0,4018,4019,5,111,0,0,4019,4053,5,119,0,0,4020,4021,
+ 5,114,0,0,4021,4022,5,101,0,0,4022,4023,5,102,0,0,4023,4024,5,97,0,0,4024,
+ 4025,5,110,0,0,4025,4026,5,121,0,0,4026,4027,5,116,0,0,4027,4028,5,121,
+ 0,0,4028,4029,5,112,0,0,4029,4053,5,101,0,0,4030,4031,5,114,0,0,4031,4032,
+ 5,101,0,0,4032,4033,5,97,0,0,4033,4034,5,100,0,0,4034,4035,5,111,0,0,4035,
+ 4036,5,110,0,0,4036,4037,5,108,0,0,4037,4038,5,121,0,0,4038,4053,5,46,
+ 0,0,4039,4040,5,105,0,0,4040,4041,5,108,0,0,4041,4042,5,108,0,0,4042,4043,
+ 5,101,0,0,4043,4044,5,103,0,0,4044,4045,5,97,0,0,4045,4053,5,108,0,0,4046,
+ 4047,5,101,0,0,4047,4048,5,110,0,0,4048,4049,5,100,0,0,4049,4050,5,109,
+ 0,0,4050,4051,5,97,0,0,4051,4053,5,99,0,0,4052,2864,1,0,0,0,4052,2867,
+ 1,0,0,0,4052,2873,1,0,0,0,4052,2878,1,0,0,0,4052,2885,1,0,0,0,4052,2892,
+ 1,0,0,0,4052,2899,1,0,0,0,4052,2906,1,0,0,0,4052,2913,1,0,0,0,4052,2920,
+ 1,0,0,0,4052,2927,1,0,0,0,4052,2934,1,0,0,0,4052,2941,1,0,0,0,4052,2948,
+ 1,0,0,0,4052,2955,1,0,0,0,4052,2962,1,0,0,0,4052,2968,1,0,0,0,4052,2977,
+ 1,0,0,0,4052,2986,1,0,0,0,4052,2994,1,0,0,0,4052,3002,1,0,0,0,4052,3010,
+ 1,0,0,0,4052,3018,1,0,0,0,4052,3026,1,0,0,0,4052,3034,1,0,0,0,4052,3042,
+ 1,0,0,0,4052,3050,1,0,0,0,4052,3058,1,0,0,0,4052,3061,1,0,0,0,4052,3064,
+ 1,0,0,0,4052,3067,1,0,0,0,4052,3075,1,0,0,0,4052,3083,1,0,0,0,4052,3091,
+ 1,0,0,0,4052,3099,1,0,0,0,4052,3107,1,0,0,0,4052,3115,1,0,0,0,4052,3123,
+ 1,0,0,0,4052,3131,1,0,0,0,4052,3138,1,0,0,0,4052,3146,1,0,0,0,4052,3154,
+ 1,0,0,0,4052,3163,1,0,0,0,4052,3172,1,0,0,0,4052,3180,1,0,0,0,4052,3188,
+ 1,0,0,0,4052,3196,1,0,0,0,4052,3204,1,0,0,0,4052,3212,1,0,0,0,4052,3220,
+ 1,0,0,0,4052,3223,1,0,0,0,4052,3226,1,0,0,0,4052,3229,1,0,0,0,4052,3232,
+ 1,0,0,0,4052,3238,1,0,0,0,4052,3241,1,0,0,0,4052,3247,1,0,0,0,4052,3250,
+ 1,0,0,0,4052,3252,1,0,0,0,4052,3255,1,0,0,0,4052,3258,1,0,0,0,4052,3261,
+ 1,0,0,0,4052,3267,1,0,0,0,4052,3270,1,0,0,0,4052,3273,1,0,0,0,4052,3280,
+ 1,0,0,0,4052,3287,1,0,0,0,4052,3294,1,0,0,0,4052,3301,1,0,0,0,4052,3308,
+ 1,0,0,0,4052,3315,1,0,0,0,4052,3322,1,0,0,0,4052,3329,1,0,0,0,4052,3338,
+ 1,0,0,0,4052,3343,1,0,0,0,4052,3357,1,0,0,0,4052,3371,1,0,0,0,4052,3385,
+ 1,0,0,0,4052,3399,1,0,0,0,4052,3413,1,0,0,0,4052,3427,1,0,0,0,4052,3441,
+ 1,0,0,0,4052,3455,1,0,0,0,4052,3468,1,0,0,0,4052,3481,1,0,0,0,4052,3486,
+ 1,0,0,0,4052,3495,1,0,0,0,4052,3504,1,0,0,0,4052,3513,1,0,0,0,4052,3522,
+ 1,0,0,0,4052,3531,1,0,0,0,4052,3540,1,0,0,0,4052,3549,1,0,0,0,4052,3558,
+ 1,0,0,0,4052,3566,1,0,0,0,4052,3575,1,0,0,0,4052,3584,1,0,0,0,4052,3594,
+ 1,0,0,0,4052,3602,1,0,0,0,4052,3611,1,0,0,0,4052,3620,1,0,0,0,4052,3629,
+ 1,0,0,0,4052,3638,1,0,0,0,4052,3647,1,0,0,0,4052,3656,1,0,0,0,4052,3666,
+ 1,0,0,0,4052,3677,1,0,0,0,4052,3688,1,0,0,0,4052,3699,1,0,0,0,4052,3710,
+ 1,0,0,0,4052,3721,1,0,0,0,4052,3732,1,0,0,0,4052,3743,1,0,0,0,4052,3754,
+ 1,0,0,0,4052,3762,1,0,0,0,4052,3769,1,0,0,0,4052,3776,1,0,0,0,4052,3782,
+ 1,0,0,0,4052,3792,1,0,0,0,4052,3802,1,0,0,0,4052,3809,1,0,0,0,4052,3819,
+ 1,0,0,0,4052,3826,1,0,0,0,4052,3836,1,0,0,0,4052,3843,1,0,0,0,4052,3853,
+ 1,0,0,0,4052,3863,1,0,0,0,4052,3871,1,0,0,0,4052,3878,1,0,0,0,4052,3884,
+ 1,0,0,0,4052,3891,1,0,0,0,4052,3898,1,0,0,0,4052,3905,1,0,0,0,4052,3912,
+ 1,0,0,0,4052,3919,1,0,0,0,4052,3926,1,0,0,0,4052,3933,1,0,0,0,4052,3942,
+ 1,0,0,0,4052,3949,1,0,0,0,4052,3952,1,0,0,0,4052,3955,1,0,0,0,4052,3961,
+ 1,0,0,0,4052,3964,1,0,0,0,4052,3970,1,0,0,0,4052,3978,1,0,0,0,4052,3987,
+ 1,0,0,0,4052,3996,1,0,0,0,4052,4001,1,0,0,0,4052,4006,1,0,0,0,4052,4013,
+ 1,0,0,0,4052,4020,1,0,0,0,4052,4030,1,0,0,0,4052,4039,1,0,0,0,4052,4046,
+ 1,0,0,0,4053,554,1,0,0,0,4054,4055,5,108,0,0,4055,4056,5,100,0,0,4056,
+ 4057,5,97,0,0,4057,4058,5,114,0,0,4058,4059,5,103,0,0,4059,4060,5,46,0,
+ 0,4060,4131,5,115,0,0,4061,4062,5,108,0,0,4062,4063,5,100,0,0,4063,4064,
+ 5,97,0,0,4064,4065,5,114,0,0,4065,4066,5,103,0,0,4066,4067,5,97,0,0,4067,
+ 4068,5,46,0,0,4068,4131,5,115,0,0,4069,4070,5,115,0,0,4070,4071,5,116,
+ 0,0,4071,4072,5,97,0,0,4072,4073,5,114,0,0,4073,4074,5,103,0,0,4074,4075,
+ 5,46,0,0,4075,4131,5,115,0,0,4076,4077,5,108,0,0,4077,4078,5,100,0,0,4078,
+ 4079,5,108,0,0,4079,4080,5,111,0,0,4080,4081,5,99,0,0,4081,4082,5,46,0,
+ 0,4082,4131,5,115,0,0,4083,4084,5,108,0,0,4084,4085,5,100,0,0,4085,4086,
+ 5,108,0,0,4086,4087,5,111,0,0,4087,4088,5,99,0,0,4088,4089,5,97,0,0,4089,
+ 4090,5,46,0,0,4090,4131,5,115,0,0,4091,4092,5,115,0,0,4092,4093,5,116,
+ 0,0,4093,4094,5,108,0,0,4094,4095,5,111,0,0,4095,4096,5,99,0,0,4096,4097,
+ 5,46,0,0,4097,4131,5,115,0,0,4098,4099,5,108,0,0,4099,4100,5,100,0,0,4100,
+ 4101,5,97,0,0,4101,4102,5,114,0,0,4102,4131,5,103,0,0,4103,4104,5,108,
+ 0,0,4104,4105,5,100,0,0,4105,4106,5,97,0,0,4106,4107,5,114,0,0,4107,4108,
+ 5,103,0,0,4108,4131,5,97,0,0,4109,4110,5,115,0,0,4110,4111,5,116,0,0,4111,
+ 4112,5,97,0,0,4112,4113,5,114,0,0,4113,4131,5,103,0,0,4114,4115,5,108,
+ 0,0,4115,4116,5,100,0,0,4116,4117,5,108,0,0,4117,4118,5,111,0,0,4118,4131,
+ 5,99,0,0,4119,4120,5,108,0,0,4120,4121,5,100,0,0,4121,4122,5,108,0,0,4122,
+ 4123,5,111,0,0,4123,4124,5,99,0,0,4124,4131,5,97,0,0,4125,4126,5,115,0,
+ 0,4126,4127,5,116,0,0,4127,4128,5,108,0,0,4128,4129,5,111,0,0,4129,4131,
+ 5,99,0,0,4130,4054,1,0,0,0,4130,4061,1,0,0,0,4130,4069,1,0,0,0,4130,4076,
+ 1,0,0,0,4130,4083,1,0,0,0,4130,4091,1,0,0,0,4130,4098,1,0,0,0,4130,4103,
+ 1,0,0,0,4130,4109,1,0,0,0,4130,4114,1,0,0,0,4130,4119,1,0,0,0,4130,4125,
+ 1,0,0,0,4131,556,1,0,0,0,4132,4133,5,108,0,0,4133,4134,5,100,0,0,4134,
+ 4135,5,99,0,0,4135,4136,5,46,0,0,4136,4137,5,105,0,0,4137,4138,5,52,0,
+ 0,4138,4139,5,46,0,0,4139,4160,5,115,0,0,4140,4141,5,108,0,0,4141,4142,
+ 5,100,0,0,4142,4143,5,99,0,0,4143,4144,5,46,0,0,4144,4145,5,105,0,0,4145,
+ 4160,5,52,0,0,4146,4147,5,117,0,0,4147,4148,5,110,0,0,4148,4149,5,97,0,
+ 0,4149,4150,5,108,0,0,4150,4151,5,105,0,0,4151,4152,5,103,0,0,4152,4153,
+ 5,110,0,0,4153,4154,5,101,0,0,4154,4155,5,100,0,0,4155,4160,5,46,0,0,4156,
+ 4157,5,110,0,0,4157,4158,5,111,0,0,4158,4160,5,46,0,0,4159,4132,1,0,0,
+ 0,4159,4140,1,0,0,0,4159,4146,1,0,0,0,4159,4156,1,0,0,0,4160,558,1,0,0,
+ 0,4161,4162,5,108,0,0,4162,4163,5,100,0,0,4163,4164,5,99,0,0,4164,4165,
+ 5,46,0,0,4165,4166,5,105,0,0,4166,4167,5,56,0,0,4167,560,1,0,0,0,4168,
+ 4169,5,108,0,0,4169,4170,5,100,0,0,4170,4171,5,99,0,0,4171,4172,5,46,0,
+ 0,4172,4173,5,114,0,0,4173,4181,5,52,0,0,4174,4175,5,108,0,0,4175,4176,
+ 5,100,0,0,4176,4177,5,99,0,0,4177,4178,5,46,0,0,4178,4179,5,114,0,0,4179,
+ 4181,5,56,0,0,4180,4168,1,0,0,0,4180,4174,1,0,0,0,4181,562,1,0,0,0,4182,
+ 4183,5,106,0,0,4183,4184,5,109,0,0,4184,4218,5,112,0,0,4185,4186,5,99,
+ 0,0,4186,4187,5,97,0,0,4187,4188,5,108,0,0,4188,4218,5,108,0,0,4189,4190,
+ 5,99,0,0,4190,4191,5,97,0,0,4191,4192,5,108,0,0,4192,4193,5,108,0,0,4193,
+ 4194,5,118,0,0,4194,4195,5,105,0,0,4195,4196,5,114,0,0,4196,4218,5,116,
+ 0,0,4197,4198,5,110,0,0,4198,4199,5,101,0,0,4199,4200,5,119,0,0,4200,4201,
+ 5,111,0,0,4201,4202,5,98,0,0,4202,4218,5,106,0,0,4203,4204,5,108,0,0,4204,
+ 4205,5,100,0,0,4205,4206,5,102,0,0,4206,4207,5,116,0,0,4207,4218,5,110,
+ 0,0,4208,4209,5,108,0,0,4209,4210,5,100,0,0,4210,4211,5,118,0,0,4211,4212,
+ 5,105,0,0,4212,4213,5,114,0,0,4213,4214,5,116,0,0,4214,4215,5,102,0,0,
+ 4215,4216,5,116,0,0,4216,4218,5,110,0,0,4217,4182,1,0,0,0,4217,4185,1,
+ 0,0,0,4217,4189,1,0,0,0,4217,4197,1,0,0,0,4217,4203,1,0,0,0,4217,4208,
+ 1,0,0,0,4218,564,1,0,0,0,4219,4220,5,99,0,0,4220,4221,5,97,0,0,4221,4222,
+ 5,108,0,0,4222,4223,5,108,0,0,4223,4224,5,105,0,0,4224,566,1,0,0,0,4225,
+ 4226,5,98,0,0,4226,4227,5,114,0,0,4227,4228,5,46,0,0,4228,4384,5,115,0,
+ 0,4229,4230,5,98,0,0,4230,4231,5,114,0,0,4231,4232,5,102,0,0,4232,4233,
+ 5,97,0,0,4233,4234,5,108,0,0,4234,4235,5,115,0,0,4235,4236,5,101,0,0,4236,
+ 4237,5,46,0,0,4237,4384,5,115,0,0,4238,4239,5,98,0,0,4239,4240,5,114,0,
+ 0,4240,4241,5,116,0,0,4241,4242,5,114,0,0,4242,4243,5,117,0,0,4243,4244,
+ 5,101,0,0,4244,4245,5,46,0,0,4245,4384,5,115,0,0,4246,4247,5,98,0,0,4247,
+ 4248,5,101,0,0,4248,4249,5,113,0,0,4249,4250,5,46,0,0,4250,4384,5,115,
+ 0,0,4251,4252,5,98,0,0,4252,4253,5,103,0,0,4253,4254,5,101,0,0,4254,4255,
+ 5,46,0,0,4255,4384,5,115,0,0,4256,4257,5,98,0,0,4257,4258,5,103,0,0,4258,
+ 4259,5,116,0,0,4259,4260,5,46,0,0,4260,4384,5,115,0,0,4261,4262,5,98,0,
+ 0,4262,4263,5,108,0,0,4263,4264,5,101,0,0,4264,4265,5,46,0,0,4265,4384,
+ 5,115,0,0,4266,4267,5,98,0,0,4267,4268,5,108,0,0,4268,4269,5,116,0,0,4269,
+ 4270,5,46,0,0,4270,4384,5,115,0,0,4271,4272,5,98,0,0,4272,4273,5,110,0,
+ 0,4273,4274,5,101,0,0,4274,4275,5,46,0,0,4275,4276,5,117,0,0,4276,4277,
+ 5,110,0,0,4277,4278,5,46,0,0,4278,4384,5,115,0,0,4279,4280,5,98,0,0,4280,
+ 4281,5,103,0,0,4281,4282,5,101,0,0,4282,4283,5,46,0,0,4283,4284,5,117,
+ 0,0,4284,4285,5,110,0,0,4285,4286,5,46,0,0,4286,4384,5,115,0,0,4287,4288,
+ 5,98,0,0,4288,4289,5,103,0,0,4289,4290,5,116,0,0,4290,4291,5,46,0,0,4291,
+ 4292,5,117,0,0,4292,4293,5,110,0,0,4293,4294,5,46,0,0,4294,4384,5,115,
+ 0,0,4295,4296,5,98,0,0,4296,4297,5,108,0,0,4297,4298,5,101,0,0,4298,4299,
+ 5,46,0,0,4299,4300,5,117,0,0,4300,4301,5,110,0,0,4301,4302,5,46,0,0,4302,
+ 4384,5,115,0,0,4303,4304,5,98,0,0,4304,4305,5,108,0,0,4305,4306,5,116,
+ 0,0,4306,4307,5,46,0,0,4307,4308,5,117,0,0,4308,4309,5,110,0,0,4309,4310,
+ 5,46,0,0,4310,4384,5,115,0,0,4311,4312,5,98,0,0,4312,4384,5,114,0,0,4313,
+ 4314,5,98,0,0,4314,4315,5,114,0,0,4315,4316,5,102,0,0,4316,4317,5,97,0,
+ 0,4317,4318,5,108,0,0,4318,4319,5,115,0,0,4319,4384,5,101,0,0,4320,4321,
+ 5,98,0,0,4321,4322,5,114,0,0,4322,4323,5,116,0,0,4323,4324,5,114,0,0,4324,
+ 4325,5,117,0,0,4325,4384,5,101,0,0,4326,4327,5,98,0,0,4327,4328,5,101,
+ 0,0,4328,4384,5,113,0,0,4329,4330,5,98,0,0,4330,4331,5,103,0,0,4331,4384,
+ 5,101,0,0,4332,4333,5,98,0,0,4333,4334,5,103,0,0,4334,4384,5,116,0,0,4335,
+ 4336,5,98,0,0,4336,4337,5,108,0,0,4337,4384,5,101,0,0,4338,4339,5,98,0,
+ 0,4339,4340,5,108,0,0,4340,4384,5,116,0,0,4341,4342,5,98,0,0,4342,4343,
+ 5,110,0,0,4343,4344,5,101,0,0,4344,4345,5,46,0,0,4345,4346,5,117,0,0,4346,
+ 4384,5,110,0,0,4347,4348,5,98,0,0,4348,4349,5,103,0,0,4349,4350,5,101,
+ 0,0,4350,4351,5,46,0,0,4351,4352,5,117,0,0,4352,4384,5,110,0,0,4353,4354,
+ 5,98,0,0,4354,4355,5,103,0,0,4355,4356,5,116,0,0,4356,4357,5,46,0,0,4357,
+ 4358,5,117,0,0,4358,4384,5,110,0,0,4359,4360,5,98,0,0,4360,4361,5,108,
+ 0,0,4361,4362,5,101,0,0,4362,4363,5,46,0,0,4363,4364,5,117,0,0,4364,4384,
+ 5,110,0,0,4365,4366,5,98,0,0,4366,4367,5,108,0,0,4367,4368,5,116,0,0,4368,
+ 4369,5,46,0,0,4369,4370,5,117,0,0,4370,4384,5,110,0,0,4371,4372,5,108,
+ 0,0,4372,4373,5,101,0,0,4373,4374,5,97,0,0,4374,4375,5,118,0,0,4375,4384,
+ 5,101,0,0,4376,4377,5,108,0,0,4377,4378,5,101,0,0,4378,4379,5,97,0,0,4379,
+ 4380,5,118,0,0,4380,4381,5,101,0,0,4381,4382,5,46,0,0,4382,4384,5,115,
+ 0,0,4383,4225,1,0,0,0,4383,4229,1,0,0,0,4383,4238,1,0,0,0,4383,4246,1,
+ 0,0,0,4383,4251,1,0,0,0,4383,4256,1,0,0,0,4383,4261,1,0,0,0,4383,4266,
+ 1,0,0,0,4383,4271,1,0,0,0,4383,4279,1,0,0,0,4383,4287,1,0,0,0,4383,4295,
+ 1,0,0,0,4383,4303,1,0,0,0,4383,4311,1,0,0,0,4383,4313,1,0,0,0,4383,4320,
+ 1,0,0,0,4383,4326,1,0,0,0,4383,4329,1,0,0,0,4383,4332,1,0,0,0,4383,4335,
+ 1,0,0,0,4383,4338,1,0,0,0,4383,4341,1,0,0,0,4383,4347,1,0,0,0,4383,4353,
+ 1,0,0,0,4383,4359,1,0,0,0,4383,4365,1,0,0,0,4383,4371,1,0,0,0,4383,4376,
+ 1,0,0,0,4384,568,1,0,0,0,4385,4386,5,115,0,0,4386,4387,5,119,0,0,4387,
+ 4388,5,105,0,0,4388,4389,5,116,0,0,4389,4390,5,99,0,0,4390,4391,5,104,
+ 0,0,4391,570,1,0,0,0,4392,4393,5,99,0,0,4393,4394,5,112,0,0,4394,4395,
+ 5,111,0,0,4395,4396,5,98,0,0,4396,4507,5,106,0,0,4397,4398,5,108,0,0,4398,
+ 4399,5,100,0,0,4399,4400,5,111,0,0,4400,4401,5,98,0,0,4401,4507,5,106,
+ 0,0,4402,4403,5,99,0,0,4403,4404,5,97,0,0,4404,4405,5,115,0,0,4405,4406,
+ 5,116,0,0,4406,4407,5,99,0,0,4407,4408,5,108,0,0,4408,4409,5,97,0,0,4409,
+ 4410,5,115,0,0,4410,4507,5,115,0,0,4411,4412,5,105,0,0,4412,4413,5,115,
+ 0,0,4413,4414,5,105,0,0,4414,4415,5,110,0,0,4415,4416,5,115,0,0,4416,4507,
+ 5,116,0,0,4417,4418,5,117,0,0,4418,4419,5,110,0,0,4419,4420,5,98,0,0,4420,
+ 4421,5,111,0,0,4421,4507,5,120,0,0,4422,4423,5,115,0,0,4423,4424,5,116,
+ 0,0,4424,4425,5,111,0,0,4425,4426,5,98,0,0,4426,4507,5,106,0,0,4427,4428,
+ 5,98,0,0,4428,4429,5,111,0,0,4429,4507,5,120,0,0,4430,4431,5,110,0,0,4431,
+ 4432,5,101,0,0,4432,4433,5,119,0,0,4433,4434,5,97,0,0,4434,4435,5,114,
+ 0,0,4435,4507,5,114,0,0,4436,4437,5,108,0,0,4437,4438,5,100,0,0,4438,4439,
+ 5,101,0,0,4439,4440,5,108,0,0,4440,4441,5,101,0,0,4441,4442,5,109,0,0,
+ 4442,4507,5,97,0,0,4443,4444,5,108,0,0,4444,4445,5,100,0,0,4445,4446,5,
+ 101,0,0,4446,4447,5,108,0,0,4447,4448,5,101,0,0,4448,4507,5,109,0,0,4449,
+ 4450,5,115,0,0,4450,4451,5,116,0,0,4451,4452,5,101,0,0,4452,4453,5,108,
+ 0,0,4453,4454,5,101,0,0,4454,4507,5,109,0,0,4455,4456,5,117,0,0,4456,4457,
+ 5,110,0,0,4457,4458,5,98,0,0,4458,4459,5,111,0,0,4459,4460,5,120,0,0,4460,
+ 4461,5,46,0,0,4461,4462,5,97,0,0,4462,4463,5,110,0,0,4463,4507,5,121,0,
+ 0,4464,4465,5,114,0,0,4465,4466,5,101,0,0,4466,4467,5,102,0,0,4467,4468,
+ 5,97,0,0,4468,4469,5,110,0,0,4469,4470,5,121,0,0,4470,4471,5,118,0,0,4471,
+ 4472,5,97,0,0,4472,4507,5,108,0,0,4473,4474,5,109,0,0,4474,4475,5,107,
+ 0,0,4475,4476,5,114,0,0,4476,4477,5,101,0,0,4477,4478,5,102,0,0,4478,4479,
+ 5,97,0,0,4479,4480,5,110,0,0,4480,4507,5,121,0,0,4481,4482,5,105,0,0,4482,
+ 4483,5,110,0,0,4483,4484,5,105,0,0,4484,4485,5,116,0,0,4485,4486,5,111,
+ 0,0,4486,4487,5,98,0,0,4487,4507,5,106,0,0,4488,4489,5,99,0,0,4489,4490,
+ 5,111,0,0,4490,4491,5,110,0,0,4491,4492,5,115,0,0,4492,4493,5,116,0,0,
+ 4493,4494,5,114,0,0,4494,4495,5,97,0,0,4495,4496,5,105,0,0,4496,4497,5,
+ 110,0,0,4497,4498,5,101,0,0,4498,4499,5,100,0,0,4499,4507,5,46,0,0,4500,
+ 4501,5,115,0,0,4501,4502,5,105,0,0,4502,4503,5,122,0,0,4503,4504,5,101,
+ 0,0,4504,4505,5,111,0,0,4505,4507,5,102,0,0,4506,4392,1,0,0,0,4506,4397,
+ 1,0,0,0,4506,4402,1,0,0,0,4506,4411,1,0,0,0,4506,4417,1,0,0,0,4506,4422,
+ 1,0,0,0,4506,4427,1,0,0,0,4506,4430,1,0,0,0,4506,4436,1,0,0,0,4506,4443,
+ 1,0,0,0,4506,4449,1,0,0,0,4506,4455,1,0,0,0,4506,4464,1,0,0,0,4506,4473,
+ 1,0,0,0,4506,4481,1,0,0,0,4506,4488,1,0,0,0,4506,4500,1,0,0,0,4507,572,
+ 1,0,0,0,4508,4509,5,108,0,0,4509,4510,5,100,0,0,4510,4511,5,115,0,0,4511,
+ 4512,5,116,0,0,4512,4513,5,114,0,0,4513,574,1,0,0,0,4514,4515,5,108,0,
+ 0,4515,4516,5,100,0,0,4516,4517,5,102,0,0,4517,4518,5,108,0,0,4518,4550,
+ 5,100,0,0,4519,4520,5,108,0,0,4520,4521,5,100,0,0,4521,4522,5,102,0,0,
+ 4522,4523,5,108,0,0,4523,4524,5,100,0,0,4524,4550,5,97,0,0,4525,4526,5,
+ 115,0,0,4526,4527,5,116,0,0,4527,4528,5,102,0,0,4528,4529,5,108,0,0,4529,
+ 4550,5,100,0,0,4530,4531,5,108,0,0,4531,4532,5,100,0,0,4532,4533,5,115,
+ 0,0,4533,4534,5,102,0,0,4534,4535,5,108,0,0,4535,4550,5,100,0,0,4536,4537,
+ 5,108,0,0,4537,4538,5,100,0,0,4538,4539,5,115,0,0,4539,4540,5,102,0,0,
+ 4540,4541,5,108,0,0,4541,4542,5,100,0,0,4542,4550,5,97,0,0,4543,4544,5,
+ 115,0,0,4544,4545,5,116,0,0,4545,4546,5,115,0,0,4546,4547,5,102,0,0,4547,
+ 4548,5,108,0,0,4548,4550,5,100,0,0,4549,4514,1,0,0,0,4549,4519,1,0,0,0,
+ 4549,4525,1,0,0,0,4549,4530,1,0,0,0,4549,4536,1,0,0,0,4549,4543,1,0,0,
+ 0,4550,576,1,0,0,0,4551,4552,5,108,0,0,4552,4553,5,100,0,0,4553,4554,5,
+ 116,0,0,4554,4555,5,111,0,0,4555,4556,5,107,0,0,4556,4557,5,101,0,0,4557,
+ 4558,5,110,0,0,4558,578,1,0,0,0,4559,4560,7,8,0,0,4560,580,1,0,0,0,4561,
+ 4562,7,9,0,0,4562,582,1,0,0,0,4563,4564,3,585,292,0,4564,4565,3,533,266,
+ 0,4565,4567,1,0,0,0,4566,4563,1,0,0,0,4567,4568,1,0,0,0,4568,4566,1,0,
+ 0,0,4568,4569,1,0,0,0,4569,4570,1,0,0,0,4570,4571,3,585,292,0,4571,584,
+ 1,0,0,0,4572,4576,3,579,289,0,4573,4575,3,581,290,0,4574,4573,1,0,0,0,
+ 4575,4578,1,0,0,0,4576,4574,1,0,0,0,4576,4577,1,0,0,0,4577,586,1,0,0,0,
+ 4578,4576,1,0,0,0,4579,4580,7,0,0,0,4580,4581,7,0,0,0,4581,588,1,0,0,0,
+ 4582,4583,7,10,0,0,4583,4584,1,0,0,0,4584,4585,6,294,0,0,4585,590,1,0,
+ 0,0,4586,4587,5,47,0,0,4587,4588,5,47,0,0,4588,4592,1,0,0,0,4589,4591,
+ 8,11,0,0,4590,4589,1,0,0,0,4591,4594,1,0,0,0,4592,4590,1,0,0,0,4592,4593,
+ 1,0,0,0,4593,4595,1,0,0,0,4594,4592,1,0,0,0,4595,4596,6,295,0,0,4596,592,
+ 1,0,0,0,4597,4598,5,47,0,0,4598,4599,5,42,0,0,4599,4603,1,0,0,0,4600,4602,
+ 9,0,0,0,4601,4600,1,0,0,0,4602,4605,1,0,0,0,4603,4604,1,0,0,0,4603,4601,
+ 1,0,0,0,4604,4606,1,0,0,0,4605,4603,1,0,0,0,4606,4607,5,42,0,0,4607,4608,
+ 5,47,0,0,4608,4609,1,0,0,0,4609,4610,6,296,0,0,4610,594,1,0,0,0,4611,4612,
+ 5,46,0,0,4612,4613,5,112,0,0,4613,4614,5,101,0,0,4614,4615,5,114,0,0,4615,
+ 4616,5,109,0,0,4616,4617,5,105,0,0,4617,4618,5,115,0,0,4618,4619,5,115,
+ 0,0,4619,4620,5,105,0,0,4620,4621,5,111,0,0,4621,4622,5,110,0,0,4622,596,
+ 1,0,0,0,4623,4624,5,46,0,0,4624,4625,5,112,0,0,4625,4626,5,101,0,0,4626,
+ 4627,5,114,0,0,4627,4628,5,109,0,0,4628,4629,5,105,0,0,4629,4630,5,115,
+ 0,0,4630,4631,5,115,0,0,4631,4632,5,105,0,0,4632,4633,5,111,0,0,4633,4634,
+ 5,110,0,0,4634,4635,5,115,0,0,4635,4636,5,101,0,0,4636,4637,5,116,0,0,
+ 4637,598,1,0,0,0,4638,4639,5,46,0,0,4639,4640,5,101,0,0,4640,4641,5,109,
+ 0,0,4641,4642,5,105,0,0,4642,4643,5,116,0,0,4643,4644,5,98,0,0,4644,4645,
+ 5,121,0,0,4645,4646,5,116,0,0,4646,4647,5,101,0,0,4647,600,1,0,0,0,4648,
+ 4649,5,46,0,0,4649,4650,5,109,0,0,4650,4651,5,97,0,0,4651,4652,5,120,0,
+ 0,4652,4653,5,115,0,0,4653,4654,5,116,0,0,4654,4655,5,97,0,0,4655,4656,
+ 5,99,0,0,4656,4657,5,107,0,0,4657,602,1,0,0,0,4658,4659,5,46,0,0,4659,
+ 4660,5,101,0,0,4660,4661,5,110,0,0,4661,4662,5,116,0,0,4662,4663,5,114,
+ 0,0,4663,4664,5,121,0,0,4664,4665,5,112,0,0,4665,4666,5,111,0,0,4666,4667,
+ 5,105,0,0,4667,4668,5,110,0,0,4668,4669,5,116,0,0,4669,604,1,0,0,0,4670,
+ 4671,5,46,0,0,4671,4672,5,122,0,0,4672,4673,5,101,0,0,4673,4674,5,114,
+ 0,0,4674,4675,5,111,0,0,4675,4676,5,105,0,0,4676,4677,5,110,0,0,4677,4678,
+ 5,105,0,0,4678,4679,5,116,0,0,4679,606,1,0,0,0,4680,4681,5,46,0,0,4681,
+ 4682,5,108,0,0,4682,4683,5,111,0,0,4683,4684,5,99,0,0,4684,4685,5,97,0,
+ 0,4685,4686,5,108,0,0,4686,4687,5,115,0,0,4687,608,1,0,0,0,4688,4689,5,
+ 46,0,0,4689,4690,5,101,0,0,4690,4691,5,120,0,0,4691,4692,5,112,0,0,4692,
+ 4693,5,111,0,0,4693,4694,5,114,0,0,4694,4695,5,116,0,0,4695,610,1,0,0,
+ 0,4696,4697,5,46,0,0,4697,4698,5,111,0,0,4698,4699,5,118,0,0,4699,4700,
+ 5,101,0,0,4700,4701,5,114,0,0,4701,4702,5,114,0,0,4702,4703,5,105,0,0,
+ 4703,4704,5,100,0,0,4704,4705,5,101,0,0,4705,612,1,0,0,0,4706,4707,5,46,
+ 0,0,4707,4708,5,118,0,0,4708,4709,5,116,0,0,4709,4710,5,101,0,0,4710,4711,
+ 5,110,0,0,4711,4712,5,116,0,0,4712,4713,5,114,0,0,4713,4714,5,121,0,0,
+ 4714,614,1,0,0,0,45,0,2037,2045,2050,2052,2055,2063,2068,2070,2073,2078,
+ 2084,2088,2093,2095,2099,2104,2106,2112,2116,2121,2123,2125,2162,2715,
+ 2766,2769,2772,2775,2780,2782,2790,2792,4052,4130,4159,4180,4217,4383,
+ 4506,4549,4568,4576,4592,4603,1,6,0,0
};
public static readonly ATN _ATN =
diff --git a/src/tools/ilasm/src/ILAssembler/gen/CILLexer.interp b/src/tools/ilasm/src/ILAssembler/gen/CILLexer.interp
index 67afb01bceadcd..c900b3dd62e20b 100644
--- a/src/tools/ilasm/src/ILAssembler/gen/CILLexer.interp
+++ b/src/tools/ilasm/src/ILAssembler/gen/CILLexer.interp
@@ -15,6 +15,7 @@ null
'aggressiveoptimization'
'async'
'extended'
+'volatile'
'{'
'}'
'.subsystem'
@@ -88,11 +89,11 @@ null
'>'
'/'
'algorithm'
+'unsigned'
'iidparam'
'pinned'
'modreq'
'modopt'
-'unsigned'
'true'
'false'
'request'
@@ -126,7 +127,6 @@ null
'privatescope'
'literal'
'notserialized'
-'volatile'
'.event'
'.addon'
'.removeon'
@@ -166,6 +166,7 @@ null
'handler'
'.data'
'tls'
+'.publickey'
'.publicKey'
'.ver'
'.locale'
@@ -203,7 +204,7 @@ null
'enum'
'custom'
'fixed'
-'systring'
+'sysstring'
'array'
'variant'
'currency'
@@ -476,6 +477,7 @@ null
null
null
null
+null
INT32
INT64
FLOAT64
@@ -780,6 +782,7 @@ T__167
T__168
T__169
T__170
+T__171
INT32
INT64
FLOAT64
@@ -924,4 +927,4 @@ mode names:
DEFAULT_MODE
atn:
-[4, 0, 302, 4695, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 2, 185, 7, 185, 2, 186, 7, 186, 2, 187, 7, 187, 2, 188, 7, 188, 2, 189, 7, 189, 2, 190, 7, 190, 2, 191, 7, 191, 2, 192, 7, 192, 2, 193, 7, 193, 2, 194, 7, 194, 2, 195, 7, 195, 2, 196, 7, 196, 2, 197, 7, 197, 2, 198, 7, 198, 2, 199, 7, 199, 2, 200, 7, 200, 2, 201, 7, 201, 2, 202, 7, 202, 2, 203, 7, 203, 2, 204, 7, 204, 2, 205, 7, 205, 2, 206, 7, 206, 2, 207, 7, 207, 2, 208, 7, 208, 2, 209, 7, 209, 2, 210, 7, 210, 2, 211, 7, 211, 2, 212, 7, 212, 2, 213, 7, 213, 2, 214, 7, 214, 2, 215, 7, 215, 2, 216, 7, 216, 2, 217, 7, 217, 2, 218, 7, 218, 2, 219, 7, 219, 2, 220, 7, 220, 2, 221, 7, 221, 2, 222, 7, 222, 2, 223, 7, 223, 2, 224, 7, 224, 2, 225, 7, 225, 2, 226, 7, 226, 2, 227, 7, 227, 2, 228, 7, 228, 2, 229, 7, 229, 2, 230, 7, 230, 2, 231, 7, 231, 2, 232, 7, 232, 2, 233, 7, 233, 2, 234, 7, 234, 2, 235, 7, 235, 2, 236, 7, 236, 2, 237, 7, 237, 2, 238, 7, 238, 2, 239, 7, 239, 2, 240, 7, 240, 2, 241, 7, 241, 2, 242, 7, 242, 2, 243, 7, 243, 2, 244, 7, 244, 2, 245, 7, 245, 2, 246, 7, 246, 2, 247, 7, 247, 2, 248, 7, 248, 2, 249, 7, 249, 2, 250, 7, 250, 2, 251, 7, 251, 2, 252, 7, 252, 2, 253, 7, 253, 2, 254, 7, 254, 2, 255, 7, 255, 2, 256, 7, 256, 2, 257, 7, 257, 2, 258, 7, 258, 2, 259, 7, 259, 2, 260, 7, 260, 2, 261, 7, 261, 2, 262, 7, 262, 2, 263, 7, 263, 2, 264, 7, 264, 2, 265, 7, 265, 2, 266, 7, 266, 2, 267, 7, 267, 2, 268, 7, 268, 2, 269, 7, 269, 2, 270, 7, 270, 2, 271, 7, 271, 2, 272, 7, 272, 2, 273, 7, 273, 2, 274, 7, 274, 2, 275, 7, 275, 2, 276, 7, 276, 2, 277, 7, 277, 2, 278, 7, 278, 2, 279, 7, 279, 2, 280, 7, 280, 2, 281, 7, 281, 2, 282, 7, 282, 2, 283, 7, 283, 2, 284, 7, 284, 2, 285, 7, 285, 2, 286, 7, 286, 2, 287, 7, 287, 2, 288, 7, 288, 2, 289, 7, 289, 2, 290, 7, 290, 2, 291, 7, 291, 2, 292, 7, 292, 2, 293, 7, 293, 2, 294, 7, 294, 2, 295, 7, 295, 2, 296, 7, 296, 2, 297, 7, 297, 2, 298, 7, 298, 2, 299, 7, 299, 2, 300, 7, 300, 2, 301, 7, 301, 2, 302, 7, 302, 2, 303, 7, 303, 2, 304, 7, 304, 2, 305, 7, 305, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 85, 1, 85, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 165, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 3, 171, 2025, 8, 171, 1, 171, 1, 171, 1, 171, 1, 171, 4, 171, 2031, 8, 171, 11, 171, 12, 171, 2032, 1, 171, 4, 171, 2036, 8, 171, 11, 171, 12, 171, 2037, 3, 171, 2040, 8, 171, 1, 172, 3, 172, 2043, 8, 172, 1, 172, 1, 172, 1, 172, 1, 172, 4, 172, 2049, 8, 172, 11, 172, 12, 172, 2050, 1, 172, 4, 172, 2054, 8, 172, 11, 172, 12, 172, 2055, 3, 172, 2058, 8, 172, 1, 173, 3, 173, 2061, 8, 173, 1, 173, 4, 173, 2064, 8, 173, 11, 173, 12, 173, 2065, 1, 173, 1, 173, 4, 173, 2070, 8, 173, 11, 173, 12, 173, 2071, 1, 173, 1, 173, 3, 173, 2076, 8, 173, 1, 173, 4, 173, 2079, 8, 173, 11, 173, 12, 173, 2080, 3, 173, 2083, 8, 173, 1, 173, 1, 173, 3, 173, 2087, 8, 173, 1, 173, 4, 173, 2090, 8, 173, 11, 173, 12, 173, 2091, 3, 173, 2094, 8, 173, 1, 173, 1, 173, 4, 173, 2098, 8, 173, 11, 173, 12, 173, 2099, 1, 173, 1, 173, 3, 173, 2104, 8, 173, 1, 173, 4, 173, 2107, 8, 173, 11, 173, 12, 173, 2108, 3, 173, 2111, 8, 173, 3, 173, 2113, 8, 173, 1, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 1, 176, 1, 176, 1, 176, 1, 177, 1, 177, 1, 177, 1, 177, 1, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 3, 179, 2150, 8, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 193, 1, 193, 1, 193, 1, 193, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 1, 196, 1, 196, 1, 196, 1, 196, 1, 196, 1, 196, 1, 196, 1, 197, 1, 197, 1, 197, 1, 197, 1, 197, 1, 197, 1, 197, 1, 197, 1, 198, 1, 198, 1, 198, 1, 198, 1, 198, 1, 198, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 201, 1, 201, 1, 201, 1, 201, 1, 201, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 205, 1, 205, 1, 205, 1, 205, 1, 205, 1, 205, 1, 206, 1, 206, 1, 206, 1, 206, 1, 206, 1, 206, 1, 206, 1, 206, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 208, 1, 208, 1, 208, 1, 208, 1, 208, 1, 208, 1, 208, 1, 208, 1, 209, 1, 209, 1, 209, 1, 209, 1, 209, 1, 209, 1, 210, 1, 210, 1, 210, 1, 210, 1, 210, 1, 210, 1, 210, 1, 210, 1, 211, 1, 211, 1, 211, 1, 211, 1, 211, 1, 212, 1, 212, 1, 212, 1, 212, 1, 212, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 214, 1, 214, 1, 214, 1, 214, 1, 214, 1, 214, 1, 214, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 219, 1, 219, 1, 219, 1, 219, 1, 219, 1, 219, 1, 219, 1, 220, 1, 220, 1, 220, 1, 220, 1, 220, 1, 220, 1, 220, 1, 220, 1, 220, 1, 220, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 226, 1, 226, 1, 226, 1, 226, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 230, 1, 230, 1, 230, 1, 230, 1, 230, 1, 230, 1, 230, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 235, 1, 235, 1, 235, 1, 235, 1, 235, 1, 235, 1, 235, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 240, 1, 240, 1, 240, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 245, 1, 245, 1, 245, 1, 245, 1, 245, 1, 245, 1, 245, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 247, 1, 247, 1, 247, 1, 247, 1, 247, 1, 247, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 251, 1, 251, 1, 252, 1, 252, 1, 252, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 3, 253, 2702, 8, 253, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 258, 1, 258, 1, 258, 1, 258, 1, 258, 1, 258, 1, 258, 1, 258, 1, 259, 1, 259, 1, 260, 1, 260, 1, 260, 1, 261, 1, 261, 1, 262, 1, 262, 1, 262, 1, 262, 3, 262, 2753, 8, 262, 1, 262, 3, 262, 2756, 8, 262, 1, 262, 3, 262, 2759, 8, 262, 1, 262, 3, 262, 2762, 8, 262, 1, 263, 1, 263, 1, 263, 5, 263, 2767, 8, 263, 10, 263, 12, 263, 2770, 9, 263, 1, 263, 1, 263, 1, 264, 1, 264, 1, 264, 5, 264, 2777, 8, 264, 10, 264, 12, 264, 2780, 9, 264, 1, 264, 1, 264, 1, 265, 1, 265, 1, 266, 1, 266, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 268, 1, 268, 1, 268, 1, 268, 1, 268, 1, 268, 1, 268, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 272, 1, 272, 1, 272, 1, 272, 1, 272, 1, 272, 1, 272, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 3, 275, 4033, 8, 275, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 3, 276, 4111, 8, 276, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 3, 277, 4140, 8, 277, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 3, 279, 4161, 8, 279, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 3, 280, 4198, 8, 280, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 3, 282, 4364, 8, 282, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 3, 284, 4487, 8, 284, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 3, 286, 4530, 8, 286, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 288, 1, 288, 1, 289, 1, 289, 1, 290, 1, 290, 1, 290, 4, 290, 4547, 8, 290, 11, 290, 12, 290, 4548, 1, 290, 1, 290, 1, 291, 1, 291, 5, 291, 4555, 8, 291, 10, 291, 12, 291, 4558, 9, 291, 1, 292, 1, 292, 1, 292, 1, 293, 1, 293, 1, 293, 1, 293, 1, 294, 1, 294, 1, 294, 1, 294, 5, 294, 4571, 8, 294, 10, 294, 12, 294, 4574, 9, 294, 1, 294, 1, 294, 1, 295, 1, 295, 1, 295, 1, 295, 5, 295, 4582, 8, 295, 10, 295, 12, 295, 4585, 9, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 4583, 0, 306, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 132, 265, 133, 267, 134, 269, 135, 271, 136, 273, 137, 275, 138, 277, 139, 279, 140, 281, 141, 283, 142, 285, 143, 287, 144, 289, 145, 291, 146, 293, 147, 295, 148, 297, 149, 299, 150, 301, 151, 303, 152, 305, 153, 307, 154, 309, 155, 311, 156, 313, 157, 315, 158, 317, 159, 319, 160, 321, 161, 323, 162, 325, 163, 327, 164, 329, 165, 331, 166, 333, 167, 335, 168, 337, 169, 339, 170, 341, 171, 343, 172, 345, 173, 347, 174, 349, 175, 351, 176, 353, 177, 355, 178, 357, 179, 359, 180, 361, 181, 363, 182, 365, 183, 367, 184, 369, 185, 371, 186, 373, 187, 375, 188, 377, 0, 379, 189, 381, 190, 383, 191, 385, 192, 387, 193, 389, 194, 391, 195, 393, 196, 395, 197, 397, 198, 399, 199, 401, 200, 403, 201, 405, 202, 407, 203, 409, 204, 411, 205, 413, 206, 415, 207, 417, 208, 419, 209, 421, 210, 423, 211, 425, 212, 427, 213, 429, 214, 431, 215, 433, 216, 435, 217, 437, 218, 439, 219, 441, 220, 443, 221, 445, 222, 447, 223, 449, 224, 451, 225, 453, 226, 455, 227, 457, 228, 459, 229, 461, 230, 463, 231, 465, 232, 467, 233, 469, 234, 471, 235, 473, 236, 475, 237, 477, 238, 479, 239, 481, 240, 483, 241, 485, 242, 487, 243, 489, 244, 491, 245, 493, 246, 495, 247, 497, 248, 499, 249, 501, 250, 503, 251, 505, 252, 507, 253, 509, 254, 511, 255, 513, 256, 515, 257, 517, 258, 519, 259, 521, 260, 523, 261, 525, 0, 527, 262, 529, 263, 531, 264, 533, 265, 535, 266, 537, 267, 539, 268, 541, 269, 543, 270, 545, 271, 547, 272, 549, 273, 551, 274, 553, 275, 555, 276, 557, 277, 559, 278, 561, 279, 563, 280, 565, 281, 567, 282, 569, 283, 571, 284, 573, 285, 575, 286, 577, 0, 579, 0, 581, 287, 583, 288, 585, 289, 587, 290, 589, 291, 591, 292, 593, 293, 595, 294, 597, 295, 599, 296, 601, 297, 603, 298, 605, 299, 607, 300, 609, 301, 611, 302, 1, 0, 12, 3, 0, 48, 57, 65, 70, 97, 102, 1, 0, 48, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 11, 0, 34, 34, 39, 39, 47, 48, 63, 63, 92, 92, 97, 98, 102, 102, 110, 110, 114, 114, 116, 116, 118, 118, 1, 0, 48, 55, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 4, 0, 10, 10, 13, 13, 39, 39, 92, 92, 4, 0, 35, 36, 63, 90, 95, 95, 97, 122, 4, 0, 35, 36, 48, 57, 63, 90, 95, 122, 3, 0, 9, 10, 13, 13, 32, 32, 2, 0, 10, 10, 13, 13, 4947, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 0, 213, 1, 0, 0, 0, 0, 215, 1, 0, 0, 0, 0, 217, 1, 0, 0, 0, 0, 219, 1, 0, 0, 0, 0, 221, 1, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 225, 1, 0, 0, 0, 0, 227, 1, 0, 0, 0, 0, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 261, 1, 0, 0, 0, 0, 263, 1, 0, 0, 0, 0, 265, 1, 0, 0, 0, 0, 267, 1, 0, 0, 0, 0, 269, 1, 0, 0, 0, 0, 271, 1, 0, 0, 0, 0, 273, 1, 0, 0, 0, 0, 275, 1, 0, 0, 0, 0, 277, 1, 0, 0, 0, 0, 279, 1, 0, 0, 0, 0, 281, 1, 0, 0, 0, 0, 283, 1, 0, 0, 0, 0, 285, 1, 0, 0, 0, 0, 287, 1, 0, 0, 0, 0, 289, 1, 0, 0, 0, 0, 291, 1, 0, 0, 0, 0, 293, 1, 0, 0, 0, 0, 295, 1, 0, 0, 0, 0, 297, 1, 0, 0, 0, 0, 299, 1, 0, 0, 0, 0, 301, 1, 0, 0, 0, 0, 303, 1, 0, 0, 0, 0, 305, 1, 0, 0, 0, 0, 307, 1, 0, 0, 0, 0, 309, 1, 0, 0, 0, 0, 311, 1, 0, 0, 0, 0, 313, 1, 0, 0, 0, 0, 315, 1, 0, 0, 0, 0, 317, 1, 0, 0, 0, 0, 319, 1, 0, 0, 0, 0, 321, 1, 0, 0, 0, 0, 323, 1, 0, 0, 0, 0, 325, 1, 0, 0, 0, 0, 327, 1, 0, 0, 0, 0, 329, 1, 0, 0, 0, 0, 331, 1, 0, 0, 0, 0, 333, 1, 0, 0, 0, 0, 335, 1, 0, 0, 0, 0, 337, 1, 0, 0, 0, 0, 339, 1, 0, 0, 0, 0, 341, 1, 0, 0, 0, 0, 343, 1, 0, 0, 0, 0, 345, 1, 0, 0, 0, 0, 347, 1, 0, 0, 0, 0, 349, 1, 0, 0, 0, 0, 351, 1, 0, 0, 0, 0, 353, 1, 0, 0, 0, 0, 355, 1, 0, 0, 0, 0, 357, 1, 0, 0, 0, 0, 359, 1, 0, 0, 0, 0, 361, 1, 0, 0, 0, 0, 363, 1, 0, 0, 0, 0, 365, 1, 0, 0, 0, 0, 367, 1, 0, 0, 0, 0, 369, 1, 0, 0, 0, 0, 371, 1, 0, 0, 0, 0, 373, 1, 0, 0, 0, 0, 375, 1, 0, 0, 0, 0, 379, 1, 0, 0, 0, 0, 381, 1, 0, 0, 0, 0, 383, 1, 0, 0, 0, 0, 385, 1, 0, 0, 0, 0, 387, 1, 0, 0, 0, 0, 389, 1, 0, 0, 0, 0, 391, 1, 0, 0, 0, 0, 393, 1, 0, 0, 0, 0, 395, 1, 0, 0, 0, 0, 397, 1, 0, 0, 0, 0, 399, 1, 0, 0, 0, 0, 401, 1, 0, 0, 0, 0, 403, 1, 0, 0, 0, 0, 405, 1, 0, 0, 0, 0, 407, 1, 0, 0, 0, 0, 409, 1, 0, 0, 0, 0, 411, 1, 0, 0, 0, 0, 413, 1, 0, 0, 0, 0, 415, 1, 0, 0, 0, 0, 417, 1, 0, 0, 0, 0, 419, 1, 0, 0, 0, 0, 421, 1, 0, 0, 0, 0, 423, 1, 0, 0, 0, 0, 425, 1, 0, 0, 0, 0, 427, 1, 0, 0, 0, 0, 429, 1, 0, 0, 0, 0, 431, 1, 0, 0, 0, 0, 433, 1, 0, 0, 0, 0, 435, 1, 0, 0, 0, 0, 437, 1, 0, 0, 0, 0, 439, 1, 0, 0, 0, 0, 441, 1, 0, 0, 0, 0, 443, 1, 0, 0, 0, 0, 445, 1, 0, 0, 0, 0, 447, 1, 0, 0, 0, 0, 449, 1, 0, 0, 0, 0, 451, 1, 0, 0, 0, 0, 453, 1, 0, 0, 0, 0, 455, 1, 0, 0, 0, 0, 457, 1, 0, 0, 0, 0, 459, 1, 0, 0, 0, 0, 461, 1, 0, 0, 0, 0, 463, 1, 0, 0, 0, 0, 465, 1, 0, 0, 0, 0, 467, 1, 0, 0, 0, 0, 469, 1, 0, 0, 0, 0, 471, 1, 0, 0, 0, 0, 473, 1, 0, 0, 0, 0, 475, 1, 0, 0, 0, 0, 477, 1, 0, 0, 0, 0, 479, 1, 0, 0, 0, 0, 481, 1, 0, 0, 0, 0, 483, 1, 0, 0, 0, 0, 485, 1, 0, 0, 0, 0, 487, 1, 0, 0, 0, 0, 489, 1, 0, 0, 0, 0, 491, 1, 0, 0, 0, 0, 493, 1, 0, 0, 0, 0, 495, 1, 0, 0, 0, 0, 497, 1, 0, 0, 0, 0, 499, 1, 0, 0, 0, 0, 501, 1, 0, 0, 0, 0, 503, 1, 0, 0, 0, 0, 505, 1, 0, 0, 0, 0, 507, 1, 0, 0, 0, 0, 509, 1, 0, 0, 0, 0, 511, 1, 0, 0, 0, 0, 513, 1, 0, 0, 0, 0, 515, 1, 0, 0, 0, 0, 517, 1, 0, 0, 0, 0, 519, 1, 0, 0, 0, 0, 521, 1, 0, 0, 0, 0, 523, 1, 0, 0, 0, 0, 527, 1, 0, 0, 0, 0, 529, 1, 0, 0, 0, 0, 531, 1, 0, 0, 0, 0, 533, 1, 0, 0, 0, 0, 535, 1, 0, 0, 0, 0, 537, 1, 0, 0, 0, 0, 539, 1, 0, 0, 0, 0, 541, 1, 0, 0, 0, 0, 543, 1, 0, 0, 0, 0, 545, 1, 0, 0, 0, 0, 547, 1, 0, 0, 0, 0, 549, 1, 0, 0, 0, 0, 551, 1, 0, 0, 0, 0, 553, 1, 0, 0, 0, 0, 555, 1, 0, 0, 0, 0, 557, 1, 0, 0, 0, 0, 559, 1, 0, 0, 0, 0, 561, 1, 0, 0, 0, 0, 563, 1, 0, 0, 0, 0, 565, 1, 0, 0, 0, 0, 567, 1, 0, 0, 0, 0, 569, 1, 0, 0, 0, 0, 571, 1, 0, 0, 0, 0, 573, 1, 0, 0, 0, 0, 575, 1, 0, 0, 0, 0, 581, 1, 0, 0, 0, 0, 583, 1, 0, 0, 0, 0, 585, 1, 0, 0, 0, 0, 587, 1, 0, 0, 0, 0, 589, 1, 0, 0, 0, 0, 591, 1, 0, 0, 0, 0, 593, 1, 0, 0, 0, 0, 595, 1, 0, 0, 0, 0, 597, 1, 0, 0, 0, 0, 599, 1, 0, 0, 0, 0, 601, 1, 0, 0, 0, 0, 603, 1, 0, 0, 0, 0, 605, 1, 0, 0, 0, 0, 607, 1, 0, 0, 0, 0, 609, 1, 0, 0, 0, 0, 611, 1, 0, 0, 0, 1, 613, 1, 0, 0, 0, 3, 620, 1, 0, 0, 0, 5, 624, 1, 0, 0, 0, 7, 630, 1, 0, 0, 0, 9, 638, 1, 0, 0, 0, 11, 649, 1, 0, 0, 0, 13, 661, 1, 0, 0, 0, 15, 669, 1, 0, 0, 0, 17, 682, 1, 0, 0, 0, 19, 695, 1, 0, 0, 0, 21, 706, 1, 0, 0, 0, 23, 725, 1, 0, 0, 0, 25, 740, 1, 0, 0, 0, 27, 763, 1, 0, 0, 0, 29, 769, 1, 0, 0, 0, 31, 778, 1, 0, 0, 0, 33, 780, 1, 0, 0, 0, 35, 782, 1, 0, 0, 0, 37, 793, 1, 0, 0, 0, 39, 803, 1, 0, 0, 0, 41, 809, 1, 0, 0, 0, 43, 819, 1, 0, 0, 0, 45, 830, 1, 0, 0, 0, 47, 844, 1, 0, 0, 0, 49, 854, 1, 0, 0, 0, 51, 864, 1, 0, 0, 0, 53, 874, 1, 0, 0, 0, 55, 876, 1, 0, 0, 0, 57, 886, 1, 0, 0, 0, 59, 888, 1, 0, 0, 0, 61, 890, 1, 0, 0, 0, 63, 892, 1, 0, 0, 0, 65, 901, 1, 0, 0, 0, 67, 904, 1, 0, 0, 0, 69, 912, 1, 0, 0, 0, 71, 914, 1, 0, 0, 0, 73, 920, 1, 0, 0, 0, 75, 929, 1, 0, 0, 0, 77, 935, 1, 0, 0, 0, 79, 942, 1, 0, 0, 0, 81, 951, 1, 0, 0, 0, 83, 953, 1, 0, 0, 0, 85, 955, 1, 0, 0, 0, 87, 958, 1, 0, 0, 0, 89, 972, 1, 0, 0, 0, 91, 988, 1, 0, 0, 0, 93, 1004, 1, 0, 0, 0, 95, 1012, 1, 0, 0, 0, 97, 1023, 1, 0, 0, 0, 99, 1030, 1, 0, 0, 0, 101, 1037, 1, 0, 0, 0, 103, 1045, 1, 0, 0, 0, 105, 1052, 1, 0, 0, 0, 107, 1061, 1, 0, 0, 0, 109, 1066, 1, 0, 0, 0, 111, 1077, 1, 0, 0, 0, 113, 1085, 1, 0, 0, 0, 115, 1094, 1, 0, 0, 0, 117, 1101, 1, 0, 0, 0, 119, 1114, 1, 0, 0, 0, 121, 1129, 1, 0, 0, 0, 123, 1136, 1, 0, 0, 0, 125, 1143, 1, 0, 0, 0, 127, 1152, 1, 0, 0, 0, 129, 1164, 1, 0, 0, 0, 131, 1175, 1, 0, 0, 0, 133, 1191, 1, 0, 0, 0, 135, 1203, 1, 0, 0, 0, 137, 1217, 1, 0, 0, 0, 139, 1223, 1, 0, 0, 0, 141, 1231, 1, 0, 0, 0, 143, 1242, 1, 0, 0, 0, 145, 1248, 1, 0, 0, 0, 147, 1254, 1, 0, 0, 0, 149, 1256, 1, 0, 0, 0, 151, 1267, 1, 0, 0, 0, 153, 1280, 1, 0, 0, 0, 155, 1291, 1, 0, 0, 0, 157, 1306, 1, 0, 0, 0, 159, 1310, 1, 0, 0, 0, 161, 1316, 1, 0, 0, 0, 163, 1320, 1, 0, 0, 0, 165, 1326, 1, 0, 0, 0, 167, 1336, 1, 0, 0, 0, 169, 1339, 1, 0, 0, 0, 171, 1341, 1, 0, 0, 0, 173, 1343, 1, 0, 0, 0, 175, 1345, 1, 0, 0, 0, 177, 1355, 1, 0, 0, 0, 179, 1364, 1, 0, 0, 0, 181, 1371, 1, 0, 0, 0, 183, 1378, 1, 0, 0, 0, 185, 1385, 1, 0, 0, 0, 187, 1394, 1, 0, 0, 0, 189, 1399, 1, 0, 0, 0, 191, 1405, 1, 0, 0, 0, 193, 1413, 1, 0, 0, 0, 195, 1420, 1, 0, 0, 0, 197, 1427, 1, 0, 0, 0, 199, 1432, 1, 0, 0, 0, 201, 1443, 1, 0, 0, 0, 203, 1453, 1, 0, 0, 0, 205, 1466, 1, 0, 0, 0, 207, 1473, 1, 0, 0, 0, 209, 1480, 1, 0, 0, 0, 211, 1490, 1, 0, 0, 0, 213, 1502, 1, 0, 0, 0, 215, 1513, 1, 0, 0, 0, 217, 1526, 1, 0, 0, 0, 219, 1543, 1, 0, 0, 0, 221, 1561, 1, 0, 0, 0, 223, 1570, 1, 0, 0, 0, 225, 1578, 1, 0, 0, 0, 227, 1580, 1, 0, 0, 0, 229, 1590, 1, 0, 0, 0, 231, 1596, 1, 0, 0, 0, 233, 1602, 1, 0, 0, 0, 235, 1608, 1, 0, 0, 0, 237, 1613, 1, 0, 0, 0, 239, 1628, 1, 0, 0, 0, 241, 1635, 1, 0, 0, 0, 243, 1643, 1, 0, 0, 0, 245, 1650, 1, 0, 0, 0, 247, 1659, 1, 0, 0, 0, 249, 1672, 1, 0, 0, 0, 251, 1680, 1, 0, 0, 0, 253, 1694, 1, 0, 0, 0, 255, 1703, 1, 0, 0, 0, 257, 1710, 1, 0, 0, 0, 259, 1717, 1, 0, 0, 0, 261, 1727, 1, 0, 0, 0, 263, 1733, 1, 0, 0, 0, 265, 1740, 1, 0, 0, 0, 267, 1750, 1, 0, 0, 0, 269, 1755, 1, 0, 0, 0, 271, 1760, 1, 0, 0, 0, 273, 1763, 1, 0, 0, 0, 275, 1767, 1, 0, 0, 0, 277, 1771, 1, 0, 0, 0, 279, 1779, 1, 0, 0, 0, 281, 1785, 1, 0, 0, 0, 283, 1793, 1, 0, 0, 0, 285, 1800, 1, 0, 0, 0, 287, 1810, 1, 0, 0, 0, 289, 1818, 1, 0, 0, 0, 291, 1831, 1, 0, 0, 0, 293, 1841, 1, 0, 0, 0, 295, 1853, 1, 0, 0, 0, 297, 1862, 1, 0, 0, 0, 299, 1870, 1, 0, 0, 0, 301, 1877, 1, 0, 0, 0, 303, 1885, 1, 0, 0, 0, 305, 1888, 1, 0, 0, 0, 307, 1892, 1, 0, 0, 0, 309, 1905, 1, 0, 0, 0, 311, 1912, 1, 0, 0, 0, 313, 1915, 1, 0, 0, 0, 315, 1920, 1, 0, 0, 0, 317, 1925, 1, 0, 0, 0, 319, 1928, 1, 0, 0, 0, 321, 1935, 1, 0, 0, 0, 323, 1941, 1, 0, 0, 0, 325, 1949, 1, 0, 0, 0, 327, 1955, 1, 0, 0, 0, 329, 1963, 1, 0, 0, 0, 331, 1969, 1, 0, 0, 0, 333, 1973, 1, 0, 0, 0, 335, 1984, 1, 0, 0, 0, 337, 1989, 1, 0, 0, 0, 339, 1997, 1, 0, 0, 0, 341, 2013, 1, 0, 0, 0, 343, 2024, 1, 0, 0, 0, 345, 2042, 1, 0, 0, 0, 347, 2060, 1, 0, 0, 0, 349, 2114, 1, 0, 0, 0, 351, 2117, 1, 0, 0, 0, 353, 2121, 1, 0, 0, 0, 355, 2126, 1, 0, 0, 0, 357, 2134, 1, 0, 0, 0, 359, 2149, 1, 0, 0, 0, 361, 2151, 1, 0, 0, 0, 363, 2158, 1, 0, 0, 0, 365, 2163, 1, 0, 0, 0, 367, 2168, 1, 0, 0, 0, 369, 2174, 1, 0, 0, 0, 371, 2180, 1, 0, 0, 0, 373, 2186, 1, 0, 0, 0, 375, 2194, 1, 0, 0, 0, 377, 2202, 1, 0, 0, 0, 379, 2211, 1, 0, 0, 0, 381, 2217, 1, 0, 0, 0, 383, 2224, 1, 0, 0, 0, 385, 2231, 1, 0, 0, 0, 387, 2238, 1, 0, 0, 0, 389, 2242, 1, 0, 0, 0, 391, 2247, 1, 0, 0, 0, 393, 2252, 1, 0, 0, 0, 395, 2259, 1, 0, 0, 0, 397, 2267, 1, 0, 0, 0, 399, 2273, 1, 0, 0, 0, 401, 2283, 1, 0, 0, 0, 403, 2288, 1, 0, 0, 0, 405, 2293, 1, 0, 0, 0, 407, 2300, 1, 0, 0, 0, 409, 2306, 1, 0, 0, 0, 411, 2315, 1, 0, 0, 0, 413, 2321, 1, 0, 0, 0, 415, 2329, 1, 0, 0, 0, 417, 2338, 1, 0, 0, 0, 419, 2346, 1, 0, 0, 0, 421, 2352, 1, 0, 0, 0, 423, 2360, 1, 0, 0, 0, 425, 2365, 1, 0, 0, 0, 427, 2370, 1, 0, 0, 0, 429, 2376, 1, 0, 0, 0, 431, 2383, 1, 0, 0, 0, 433, 2390, 1, 0, 0, 0, 435, 2400, 1, 0, 0, 0, 437, 2409, 1, 0, 0, 0, 439, 2419, 1, 0, 0, 0, 441, 2426, 1, 0, 0, 0, 443, 2436, 1, 0, 0, 0, 445, 2446, 1, 0, 0, 0, 447, 2455, 1, 0, 0, 0, 449, 2460, 1, 0, 0, 0, 451, 2466, 1, 0, 0, 0, 453, 2473, 1, 0, 0, 0, 455, 2477, 1, 0, 0, 0, 457, 2486, 1, 0, 0, 0, 459, 2493, 1, 0, 0, 0, 461, 2501, 1, 0, 0, 0, 463, 2508, 1, 0, 0, 0, 465, 2520, 1, 0, 0, 0, 467, 2527, 1, 0, 0, 0, 469, 2536, 1, 0, 0, 0, 471, 2541, 1, 0, 0, 0, 473, 2548, 1, 0, 0, 0, 475, 2556, 1, 0, 0, 0, 477, 2572, 1, 0, 0, 0, 479, 2586, 1, 0, 0, 0, 481, 2598, 1, 0, 0, 0, 483, 2601, 1, 0, 0, 0, 485, 2607, 1, 0, 0, 0, 487, 2616, 1, 0, 0, 0, 489, 2625, 1, 0, 0, 0, 491, 2633, 1, 0, 0, 0, 493, 2640, 1, 0, 0, 0, 495, 2650, 1, 0, 0, 0, 497, 2656, 1, 0, 0, 0, 499, 2664, 1, 0, 0, 0, 501, 2673, 1, 0, 0, 0, 503, 2682, 1, 0, 0, 0, 505, 2684, 1, 0, 0, 0, 507, 2701, 1, 0, 0, 0, 509, 2703, 1, 0, 0, 0, 511, 2710, 1, 0, 0, 0, 513, 2721, 1, 0, 0, 0, 515, 2727, 1, 0, 0, 0, 517, 2733, 1, 0, 0, 0, 519, 2741, 1, 0, 0, 0, 521, 2743, 1, 0, 0, 0, 523, 2746, 1, 0, 0, 0, 525, 2748, 1, 0, 0, 0, 527, 2763, 1, 0, 0, 0, 529, 2773, 1, 0, 0, 0, 531, 2783, 1, 0, 0, 0, 533, 2785, 1, 0, 0, 0, 535, 2787, 1, 0, 0, 0, 537, 2795, 1, 0, 0, 0, 539, 2802, 1, 0, 0, 0, 541, 2809, 1, 0, 0, 0, 543, 2817, 1, 0, 0, 0, 545, 2823, 1, 0, 0, 0, 547, 2830, 1, 0, 0, 0, 549, 2839, 1, 0, 0, 0, 551, 4032, 1, 0, 0, 0, 553, 4110, 1, 0, 0, 0, 555, 4139, 1, 0, 0, 0, 557, 4141, 1, 0, 0, 0, 559, 4160, 1, 0, 0, 0, 561, 4197, 1, 0, 0, 0, 563, 4199, 1, 0, 0, 0, 565, 4363, 1, 0, 0, 0, 567, 4365, 1, 0, 0, 0, 569, 4486, 1, 0, 0, 0, 571, 4488, 1, 0, 0, 0, 573, 4529, 1, 0, 0, 0, 575, 4531, 1, 0, 0, 0, 577, 4539, 1, 0, 0, 0, 579, 4541, 1, 0, 0, 0, 581, 4546, 1, 0, 0, 0, 583, 4552, 1, 0, 0, 0, 585, 4559, 1, 0, 0, 0, 587, 4562, 1, 0, 0, 0, 589, 4566, 1, 0, 0, 0, 591, 4577, 1, 0, 0, 0, 593, 4591, 1, 0, 0, 0, 595, 4603, 1, 0, 0, 0, 597, 4618, 1, 0, 0, 0, 599, 4628, 1, 0, 0, 0, 601, 4638, 1, 0, 0, 0, 603, 4650, 1, 0, 0, 0, 605, 4660, 1, 0, 0, 0, 607, 4668, 1, 0, 0, 0, 609, 4676, 1, 0, 0, 0, 611, 4686, 1, 0, 0, 0, 613, 614, 5, 110, 0, 0, 614, 615, 5, 97, 0, 0, 615, 616, 5, 116, 0, 0, 616, 617, 5, 105, 0, 0, 617, 618, 5, 118, 0, 0, 618, 619, 5, 101, 0, 0, 619, 2, 1, 0, 0, 0, 620, 621, 5, 99, 0, 0, 621, 622, 5, 105, 0, 0, 622, 623, 5, 108, 0, 0, 623, 4, 1, 0, 0, 0, 624, 625, 5, 111, 0, 0, 625, 626, 5, 112, 0, 0, 626, 627, 5, 116, 0, 0, 627, 628, 5, 105, 0, 0, 628, 629, 5, 108, 0, 0, 629, 6, 1, 0, 0, 0, 630, 631, 5, 109, 0, 0, 631, 632, 5, 97, 0, 0, 632, 633, 5, 110, 0, 0, 633, 634, 5, 97, 0, 0, 634, 635, 5, 103, 0, 0, 635, 636, 5, 101, 0, 0, 636, 637, 5, 100, 0, 0, 637, 8, 1, 0, 0, 0, 638, 639, 5, 102, 0, 0, 639, 640, 5, 111, 0, 0, 640, 641, 5, 114, 0, 0, 641, 642, 5, 119, 0, 0, 642, 643, 5, 97, 0, 0, 643, 644, 5, 114, 0, 0, 644, 645, 5, 100, 0, 0, 645, 646, 5, 114, 0, 0, 646, 647, 5, 101, 0, 0, 647, 648, 5, 102, 0, 0, 648, 10, 1, 0, 0, 0, 649, 650, 5, 112, 0, 0, 650, 651, 5, 114, 0, 0, 651, 652, 5, 101, 0, 0, 652, 653, 5, 115, 0, 0, 653, 654, 5, 101, 0, 0, 654, 655, 5, 114, 0, 0, 655, 656, 5, 118, 0, 0, 656, 657, 5, 101, 0, 0, 657, 658, 5, 115, 0, 0, 658, 659, 5, 105, 0, 0, 659, 660, 5, 103, 0, 0, 660, 12, 1, 0, 0, 0, 661, 662, 5, 114, 0, 0, 662, 663, 5, 117, 0, 0, 663, 664, 5, 110, 0, 0, 664, 665, 5, 116, 0, 0, 665, 666, 5, 105, 0, 0, 666, 667, 5, 109, 0, 0, 667, 668, 5, 101, 0, 0, 668, 14, 1, 0, 0, 0, 669, 670, 5, 105, 0, 0, 670, 671, 5, 110, 0, 0, 671, 672, 5, 116, 0, 0, 672, 673, 5, 101, 0, 0, 673, 674, 5, 114, 0, 0, 674, 675, 5, 110, 0, 0, 675, 676, 5, 97, 0, 0, 676, 677, 5, 108, 0, 0, 677, 678, 5, 99, 0, 0, 678, 679, 5, 97, 0, 0, 679, 680, 5, 108, 0, 0, 680, 681, 5, 108, 0, 0, 681, 16, 1, 0, 0, 0, 682, 683, 5, 115, 0, 0, 683, 684, 5, 121, 0, 0, 684, 685, 5, 110, 0, 0, 685, 686, 5, 99, 0, 0, 686, 687, 5, 104, 0, 0, 687, 688, 5, 114, 0, 0, 688, 689, 5, 111, 0, 0, 689, 690, 5, 110, 0, 0, 690, 691, 5, 105, 0, 0, 691, 692, 5, 122, 0, 0, 692, 693, 5, 101, 0, 0, 693, 694, 5, 100, 0, 0, 694, 18, 1, 0, 0, 0, 695, 696, 5, 110, 0, 0, 696, 697, 5, 111, 0, 0, 697, 698, 5, 105, 0, 0, 698, 699, 5, 110, 0, 0, 699, 700, 5, 108, 0, 0, 700, 701, 5, 105, 0, 0, 701, 702, 5, 110, 0, 0, 702, 703, 5, 105, 0, 0, 703, 704, 5, 110, 0, 0, 704, 705, 5, 103, 0, 0, 705, 20, 1, 0, 0, 0, 706, 707, 5, 97, 0, 0, 707, 708, 5, 103, 0, 0, 708, 709, 5, 103, 0, 0, 709, 710, 5, 114, 0, 0, 710, 711, 5, 101, 0, 0, 711, 712, 5, 115, 0, 0, 712, 713, 5, 115, 0, 0, 713, 714, 5, 105, 0, 0, 714, 715, 5, 118, 0, 0, 715, 716, 5, 101, 0, 0, 716, 717, 5, 105, 0, 0, 717, 718, 5, 110, 0, 0, 718, 719, 5, 108, 0, 0, 719, 720, 5, 105, 0, 0, 720, 721, 5, 110, 0, 0, 721, 722, 5, 105, 0, 0, 722, 723, 5, 110, 0, 0, 723, 724, 5, 103, 0, 0, 724, 22, 1, 0, 0, 0, 725, 726, 5, 110, 0, 0, 726, 727, 5, 111, 0, 0, 727, 728, 5, 111, 0, 0, 728, 729, 5, 112, 0, 0, 729, 730, 5, 116, 0, 0, 730, 731, 5, 105, 0, 0, 731, 732, 5, 109, 0, 0, 732, 733, 5, 105, 0, 0, 733, 734, 5, 122, 0, 0, 734, 735, 5, 97, 0, 0, 735, 736, 5, 116, 0, 0, 736, 737, 5, 105, 0, 0, 737, 738, 5, 111, 0, 0, 738, 739, 5, 110, 0, 0, 739, 24, 1, 0, 0, 0, 740, 741, 5, 97, 0, 0, 741, 742, 5, 103, 0, 0, 742, 743, 5, 103, 0, 0, 743, 744, 5, 114, 0, 0, 744, 745, 5, 101, 0, 0, 745, 746, 5, 115, 0, 0, 746, 747, 5, 115, 0, 0, 747, 748, 5, 105, 0, 0, 748, 749, 5, 118, 0, 0, 749, 750, 5, 101, 0, 0, 750, 751, 5, 111, 0, 0, 751, 752, 5, 112, 0, 0, 752, 753, 5, 116, 0, 0, 753, 754, 5, 105, 0, 0, 754, 755, 5, 109, 0, 0, 755, 756, 5, 105, 0, 0, 756, 757, 5, 122, 0, 0, 757, 758, 5, 97, 0, 0, 758, 759, 5, 116, 0, 0, 759, 760, 5, 105, 0, 0, 760, 761, 5, 111, 0, 0, 761, 762, 5, 110, 0, 0, 762, 26, 1, 0, 0, 0, 763, 764, 5, 97, 0, 0, 764, 765, 5, 115, 0, 0, 765, 766, 5, 121, 0, 0, 766, 767, 5, 110, 0, 0, 767, 768, 5, 99, 0, 0, 768, 28, 1, 0, 0, 0, 769, 770, 5, 101, 0, 0, 770, 771, 5, 120, 0, 0, 771, 772, 5, 116, 0, 0, 772, 773, 5, 101, 0, 0, 773, 774, 5, 110, 0, 0, 774, 775, 5, 100, 0, 0, 775, 776, 5, 101, 0, 0, 776, 777, 5, 100, 0, 0, 777, 30, 1, 0, 0, 0, 778, 779, 5, 123, 0, 0, 779, 32, 1, 0, 0, 0, 780, 781, 5, 125, 0, 0, 781, 34, 1, 0, 0, 0, 782, 783, 5, 46, 0, 0, 783, 784, 5, 115, 0, 0, 784, 785, 5, 117, 0, 0, 785, 786, 5, 98, 0, 0, 786, 787, 5, 115, 0, 0, 787, 788, 5, 121, 0, 0, 788, 789, 5, 115, 0, 0, 789, 790, 5, 116, 0, 0, 790, 791, 5, 101, 0, 0, 791, 792, 5, 109, 0, 0, 792, 36, 1, 0, 0, 0, 793, 794, 5, 46, 0, 0, 794, 795, 5, 99, 0, 0, 795, 796, 5, 111, 0, 0, 796, 797, 5, 114, 0, 0, 797, 798, 5, 102, 0, 0, 798, 799, 5, 108, 0, 0, 799, 800, 5, 97, 0, 0, 800, 801, 5, 103, 0, 0, 801, 802, 5, 115, 0, 0, 802, 38, 1, 0, 0, 0, 803, 804, 5, 46, 0, 0, 804, 805, 5, 102, 0, 0, 805, 806, 5, 105, 0, 0, 806, 807, 5, 108, 0, 0, 807, 808, 5, 101, 0, 0, 808, 40, 1, 0, 0, 0, 809, 810, 5, 97, 0, 0, 810, 811, 5, 108, 0, 0, 811, 812, 5, 105, 0, 0, 812, 813, 5, 103, 0, 0, 813, 814, 5, 110, 0, 0, 814, 815, 5, 109, 0, 0, 815, 816, 5, 101, 0, 0, 816, 817, 5, 110, 0, 0, 817, 818, 5, 116, 0, 0, 818, 42, 1, 0, 0, 0, 819, 820, 5, 46, 0, 0, 820, 821, 5, 105, 0, 0, 821, 822, 5, 109, 0, 0, 822, 823, 5, 97, 0, 0, 823, 824, 5, 103, 0, 0, 824, 825, 5, 101, 0, 0, 825, 826, 5, 98, 0, 0, 826, 827, 5, 97, 0, 0, 827, 828, 5, 115, 0, 0, 828, 829, 5, 101, 0, 0, 829, 44, 1, 0, 0, 0, 830, 831, 5, 46, 0, 0, 831, 832, 5, 115, 0, 0, 832, 833, 5, 116, 0, 0, 833, 834, 5, 97, 0, 0, 834, 835, 5, 99, 0, 0, 835, 836, 5, 107, 0, 0, 836, 837, 5, 114, 0, 0, 837, 838, 5, 101, 0, 0, 838, 839, 5, 115, 0, 0, 839, 840, 5, 101, 0, 0, 840, 841, 5, 114, 0, 0, 841, 842, 5, 118, 0, 0, 842, 843, 5, 101, 0, 0, 843, 46, 1, 0, 0, 0, 844, 845, 5, 46, 0, 0, 845, 846, 5, 97, 0, 0, 846, 847, 5, 115, 0, 0, 847, 848, 5, 115, 0, 0, 848, 849, 5, 101, 0, 0, 849, 850, 5, 109, 0, 0, 850, 851, 5, 98, 0, 0, 851, 852, 5, 108, 0, 0, 852, 853, 5, 121, 0, 0, 853, 48, 1, 0, 0, 0, 854, 855, 5, 46, 0, 0, 855, 856, 5, 109, 0, 0, 856, 857, 5, 115, 0, 0, 857, 858, 5, 99, 0, 0, 858, 859, 5, 111, 0, 0, 859, 860, 5, 114, 0, 0, 860, 861, 5, 108, 0, 0, 861, 862, 5, 105, 0, 0, 862, 863, 5, 98, 0, 0, 863, 50, 1, 0, 0, 0, 864, 865, 5, 46, 0, 0, 865, 866, 5, 108, 0, 0, 866, 867, 5, 97, 0, 0, 867, 868, 5, 110, 0, 0, 868, 869, 5, 103, 0, 0, 869, 870, 5, 117, 0, 0, 870, 871, 5, 97, 0, 0, 871, 872, 5, 103, 0, 0, 872, 873, 5, 101, 0, 0, 873, 52, 1, 0, 0, 0, 874, 875, 5, 44, 0, 0, 875, 54, 1, 0, 0, 0, 876, 877, 5, 46, 0, 0, 877, 878, 5, 116, 0, 0, 878, 879, 5, 121, 0, 0, 879, 880, 5, 112, 0, 0, 880, 881, 5, 101, 0, 0, 881, 882, 5, 108, 0, 0, 882, 883, 5, 105, 0, 0, 883, 884, 5, 115, 0, 0, 884, 885, 5, 116, 0, 0, 885, 56, 1, 0, 0, 0, 886, 887, 5, 40, 0, 0, 887, 58, 1, 0, 0, 0, 888, 889, 5, 41, 0, 0, 889, 60, 1, 0, 0, 0, 890, 891, 5, 59, 0, 0, 891, 62, 1, 0, 0, 0, 892, 893, 5, 46, 0, 0, 893, 894, 5, 116, 0, 0, 894, 895, 5, 121, 0, 0, 895, 896, 5, 112, 0, 0, 896, 897, 5, 101, 0, 0, 897, 898, 5, 100, 0, 0, 898, 899, 5, 101, 0, 0, 899, 900, 5, 102, 0, 0, 900, 64, 1, 0, 0, 0, 901, 902, 5, 97, 0, 0, 902, 903, 5, 115, 0, 0, 903, 66, 1, 0, 0, 0, 904, 905, 5, 46, 0, 0, 905, 906, 5, 99, 0, 0, 906, 907, 5, 117, 0, 0, 907, 908, 5, 115, 0, 0, 908, 909, 5, 116, 0, 0, 909, 910, 5, 111, 0, 0, 910, 911, 5, 109, 0, 0, 911, 68, 1, 0, 0, 0, 912, 913, 5, 61, 0, 0, 913, 70, 1, 0, 0, 0, 914, 915, 5, 102, 0, 0, 915, 916, 5, 105, 0, 0, 916, 917, 5, 101, 0, 0, 917, 918, 5, 108, 0, 0, 918, 919, 5, 100, 0, 0, 919, 72, 1, 0, 0, 0, 920, 921, 5, 112, 0, 0, 921, 922, 5, 114, 0, 0, 922, 923, 5, 111, 0, 0, 923, 924, 5, 112, 0, 0, 924, 925, 5, 101, 0, 0, 925, 926, 5, 114, 0, 0, 926, 927, 5, 116, 0, 0, 927, 928, 5, 121, 0, 0, 928, 74, 1, 0, 0, 0, 929, 930, 5, 99, 0, 0, 930, 931, 5, 108, 0, 0, 931, 932, 5, 97, 0, 0, 932, 933, 5, 115, 0, 0, 933, 934, 5, 115, 0, 0, 934, 76, 1, 0, 0, 0, 935, 936, 5, 101, 0, 0, 936, 937, 5, 120, 0, 0, 937, 938, 5, 116, 0, 0, 938, 939, 5, 101, 0, 0, 939, 940, 5, 114, 0, 0, 940, 941, 5, 110, 0, 0, 941, 78, 1, 0, 0, 0, 942, 943, 5, 46, 0, 0, 943, 944, 5, 118, 0, 0, 944, 945, 5, 116, 0, 0, 945, 946, 5, 102, 0, 0, 946, 947, 5, 105, 0, 0, 947, 948, 5, 120, 0, 0, 948, 949, 5, 117, 0, 0, 949, 950, 5, 112, 0, 0, 950, 80, 1, 0, 0, 0, 951, 952, 5, 91, 0, 0, 952, 82, 1, 0, 0, 0, 953, 954, 5, 93, 0, 0, 954, 84, 1, 0, 0, 0, 955, 956, 5, 97, 0, 0, 956, 957, 5, 116, 0, 0, 957, 86, 1, 0, 0, 0, 958, 959, 5, 102, 0, 0, 959, 960, 5, 114, 0, 0, 960, 961, 5, 111, 0, 0, 961, 962, 5, 109, 0, 0, 962, 963, 5, 117, 0, 0, 963, 964, 5, 110, 0, 0, 964, 965, 5, 109, 0, 0, 965, 966, 5, 97, 0, 0, 966, 967, 5, 110, 0, 0, 967, 968, 5, 97, 0, 0, 968, 969, 5, 103, 0, 0, 969, 970, 5, 101, 0, 0, 970, 971, 5, 100, 0, 0, 971, 88, 1, 0, 0, 0, 972, 973, 5, 99, 0, 0, 973, 974, 5, 97, 0, 0, 974, 975, 5, 108, 0, 0, 975, 976, 5, 108, 0, 0, 976, 977, 5, 109, 0, 0, 977, 978, 5, 111, 0, 0, 978, 979, 5, 115, 0, 0, 979, 980, 5, 116, 0, 0, 980, 981, 5, 100, 0, 0, 981, 982, 5, 101, 0, 0, 982, 983, 5, 114, 0, 0, 983, 984, 5, 105, 0, 0, 984, 985, 5, 118, 0, 0, 985, 986, 5, 101, 0, 0, 986, 987, 5, 100, 0, 0, 987, 90, 1, 0, 0, 0, 988, 989, 5, 114, 0, 0, 989, 990, 5, 101, 0, 0, 990, 991, 5, 116, 0, 0, 991, 992, 5, 97, 0, 0, 992, 993, 5, 105, 0, 0, 993, 994, 5, 110, 0, 0, 994, 995, 5, 97, 0, 0, 995, 996, 5, 112, 0, 0, 996, 997, 5, 112, 0, 0, 997, 998, 5, 100, 0, 0, 998, 999, 5, 111, 0, 0, 999, 1000, 5, 109, 0, 0, 1000, 1001, 5, 97, 0, 0, 1001, 1002, 5, 105, 0, 0, 1002, 1003, 5, 110, 0, 0, 1003, 92, 1, 0, 0, 0, 1004, 1005, 5, 46, 0, 0, 1005, 1006, 5, 118, 0, 0, 1006, 1007, 5, 116, 0, 0, 1007, 1008, 5, 97, 0, 0, 1008, 1009, 5, 98, 0, 0, 1009, 1010, 5, 108, 0, 0, 1010, 1011, 5, 101, 0, 0, 1011, 94, 1, 0, 0, 0, 1012, 1013, 5, 46, 0, 0, 1013, 1014, 5, 110, 0, 0, 1014, 1015, 5, 97, 0, 0, 1015, 1016, 5, 109, 0, 0, 1016, 1017, 5, 101, 0, 0, 1017, 1018, 5, 115, 0, 0, 1018, 1019, 5, 112, 0, 0, 1019, 1020, 5, 97, 0, 0, 1020, 1021, 5, 99, 0, 0, 1021, 1022, 5, 101, 0, 0, 1022, 96, 1, 0, 0, 0, 1023, 1024, 5, 46, 0, 0, 1024, 1025, 5, 99, 0, 0, 1025, 1026, 5, 108, 0, 0, 1026, 1027, 5, 97, 0, 0, 1027, 1028, 5, 115, 0, 0, 1028, 1029, 5, 115, 0, 0, 1029, 98, 1, 0, 0, 0, 1030, 1031, 5, 112, 0, 0, 1031, 1032, 5, 117, 0, 0, 1032, 1033, 5, 98, 0, 0, 1033, 1034, 5, 108, 0, 0, 1034, 1035, 5, 105, 0, 0, 1035, 1036, 5, 99, 0, 0, 1036, 100, 1, 0, 0, 0, 1037, 1038, 5, 112, 0, 0, 1038, 1039, 5, 114, 0, 0, 1039, 1040, 5, 105, 0, 0, 1040, 1041, 5, 118, 0, 0, 1041, 1042, 5, 97, 0, 0, 1042, 1043, 5, 116, 0, 0, 1043, 1044, 5, 101, 0, 0, 1044, 102, 1, 0, 0, 0, 1045, 1046, 5, 115, 0, 0, 1046, 1047, 5, 101, 0, 0, 1047, 1048, 5, 97, 0, 0, 1048, 1049, 5, 108, 0, 0, 1049, 1050, 5, 101, 0, 0, 1050, 1051, 5, 100, 0, 0, 1051, 104, 1, 0, 0, 0, 1052, 1053, 5, 97, 0, 0, 1053, 1054, 5, 98, 0, 0, 1054, 1055, 5, 115, 0, 0, 1055, 1056, 5, 116, 0, 0, 1056, 1057, 5, 114, 0, 0, 1057, 1058, 5, 97, 0, 0, 1058, 1059, 5, 99, 0, 0, 1059, 1060, 5, 116, 0, 0, 1060, 106, 1, 0, 0, 0, 1061, 1062, 5, 97, 0, 0, 1062, 1063, 5, 117, 0, 0, 1063, 1064, 5, 116, 0, 0, 1064, 1065, 5, 111, 0, 0, 1065, 108, 1, 0, 0, 0, 1066, 1067, 5, 115, 0, 0, 1067, 1068, 5, 101, 0, 0, 1068, 1069, 5, 113, 0, 0, 1069, 1070, 5, 117, 0, 0, 1070, 1071, 5, 101, 0, 0, 1071, 1072, 5, 110, 0, 0, 1072, 1073, 5, 116, 0, 0, 1073, 1074, 5, 105, 0, 0, 1074, 1075, 5, 97, 0, 0, 1075, 1076, 5, 108, 0, 0, 1076, 110, 1, 0, 0, 0, 1077, 1078, 5, 117, 0, 0, 1078, 1079, 5, 110, 0, 0, 1079, 1080, 5, 105, 0, 0, 1080, 1081, 5, 99, 0, 0, 1081, 1082, 5, 111, 0, 0, 1082, 1083, 5, 100, 0, 0, 1083, 1084, 5, 101, 0, 0, 1084, 112, 1, 0, 0, 0, 1085, 1086, 5, 97, 0, 0, 1086, 1087, 5, 117, 0, 0, 1087, 1088, 5, 116, 0, 0, 1088, 1089, 5, 111, 0, 0, 1089, 1090, 5, 99, 0, 0, 1090, 1091, 5, 104, 0, 0, 1091, 1092, 5, 97, 0, 0, 1092, 1093, 5, 114, 0, 0, 1093, 114, 1, 0, 0, 0, 1094, 1095, 5, 105, 0, 0, 1095, 1096, 5, 109, 0, 0, 1096, 1097, 5, 112, 0, 0, 1097, 1098, 5, 111, 0, 0, 1098, 1099, 5, 114, 0, 0, 1099, 1100, 5, 116, 0, 0, 1100, 116, 1, 0, 0, 0, 1101, 1102, 5, 115, 0, 0, 1102, 1103, 5, 101, 0, 0, 1103, 1104, 5, 114, 0, 0, 1104, 1105, 5, 105, 0, 0, 1105, 1106, 5, 97, 0, 0, 1106, 1107, 5, 108, 0, 0, 1107, 1108, 5, 105, 0, 0, 1108, 1109, 5, 122, 0, 0, 1109, 1110, 5, 97, 0, 0, 1110, 1111, 5, 98, 0, 0, 1111, 1112, 5, 108, 0, 0, 1112, 1113, 5, 101, 0, 0, 1113, 118, 1, 0, 0, 0, 1114, 1115, 5, 119, 0, 0, 1115, 1116, 5, 105, 0, 0, 1116, 1117, 5, 110, 0, 0, 1117, 1118, 5, 100, 0, 0, 1118, 1119, 5, 111, 0, 0, 1119, 1120, 5, 119, 0, 0, 1120, 1121, 5, 115, 0, 0, 1121, 1122, 5, 114, 0, 0, 1122, 1123, 5, 117, 0, 0, 1123, 1124, 5, 110, 0, 0, 1124, 1125, 5, 116, 0, 0, 1125, 1126, 5, 105, 0, 0, 1126, 1127, 5, 109, 0, 0, 1127, 1128, 5, 101, 0, 0, 1128, 120, 1, 0, 0, 0, 1129, 1130, 5, 110, 0, 0, 1130, 1131, 5, 101, 0, 0, 1131, 1132, 5, 115, 0, 0, 1132, 1133, 5, 116, 0, 0, 1133, 1134, 5, 101, 0, 0, 1134, 1135, 5, 100, 0, 0, 1135, 122, 1, 0, 0, 0, 1136, 1137, 5, 102, 0, 0, 1137, 1138, 5, 97, 0, 0, 1138, 1139, 5, 109, 0, 0, 1139, 1140, 5, 105, 0, 0, 1140, 1141, 5, 108, 0, 0, 1141, 1142, 5, 121, 0, 0, 1142, 124, 1, 0, 0, 0, 1143, 1144, 5, 97, 0, 0, 1144, 1145, 5, 115, 0, 0, 1145, 1146, 5, 115, 0, 0, 1146, 1147, 5, 101, 0, 0, 1147, 1148, 5, 109, 0, 0, 1148, 1149, 5, 98, 0, 0, 1149, 1150, 5, 108, 0, 0, 1150, 1151, 5, 121, 0, 0, 1151, 126, 1, 0, 0, 0, 1152, 1153, 5, 102, 0, 0, 1153, 1154, 5, 97, 0, 0, 1154, 1155, 5, 109, 0, 0, 1155, 1156, 5, 97, 0, 0, 1156, 1157, 5, 110, 0, 0, 1157, 1158, 5, 100, 0, 0, 1158, 1159, 5, 97, 0, 0, 1159, 1160, 5, 115, 0, 0, 1160, 1161, 5, 115, 0, 0, 1161, 1162, 5, 101, 0, 0, 1162, 1163, 5, 109, 0, 0, 1163, 128, 1, 0, 0, 0, 1164, 1165, 5, 102, 0, 0, 1165, 1166, 5, 97, 0, 0, 1166, 1167, 5, 109, 0, 0, 1167, 1168, 5, 111, 0, 0, 1168, 1169, 5, 114, 0, 0, 1169, 1170, 5, 97, 0, 0, 1170, 1171, 5, 115, 0, 0, 1171, 1172, 5, 115, 0, 0, 1172, 1173, 5, 101, 0, 0, 1173, 1174, 5, 109, 0, 0, 1174, 130, 1, 0, 0, 0, 1175, 1176, 5, 98, 0, 0, 1176, 1177, 5, 101, 0, 0, 1177, 1178, 5, 102, 0, 0, 1178, 1179, 5, 111, 0, 0, 1179, 1180, 5, 114, 0, 0, 1180, 1181, 5, 101, 0, 0, 1181, 1182, 5, 102, 0, 0, 1182, 1183, 5, 105, 0, 0, 1183, 1184, 5, 101, 0, 0, 1184, 1185, 5, 108, 0, 0, 1185, 1186, 5, 100, 0, 0, 1186, 1187, 5, 105, 0, 0, 1187, 1188, 5, 110, 0, 0, 1188, 1189, 5, 105, 0, 0, 1189, 1190, 5, 116, 0, 0, 1190, 132, 1, 0, 0, 0, 1191, 1192, 5, 115, 0, 0, 1192, 1193, 5, 112, 0, 0, 1193, 1194, 5, 101, 0, 0, 1194, 1195, 5, 99, 0, 0, 1195, 1196, 5, 105, 0, 0, 1196, 1197, 5, 97, 0, 0, 1197, 1198, 5, 108, 0, 0, 1198, 1199, 5, 110, 0, 0, 1199, 1200, 5, 97, 0, 0, 1200, 1201, 5, 109, 0, 0, 1201, 1202, 5, 101, 0, 0, 1202, 134, 1, 0, 0, 0, 1203, 1204, 5, 114, 0, 0, 1204, 1205, 5, 116, 0, 0, 1205, 1206, 5, 115, 0, 0, 1206, 1207, 5, 112, 0, 0, 1207, 1208, 5, 101, 0, 0, 1208, 1209, 5, 99, 0, 0, 1209, 1210, 5, 105, 0, 0, 1210, 1211, 5, 97, 0, 0, 1211, 1212, 5, 108, 0, 0, 1212, 1213, 5, 110, 0, 0, 1213, 1214, 5, 97, 0, 0, 1214, 1215, 5, 109, 0, 0, 1215, 1216, 5, 101, 0, 0, 1216, 136, 1, 0, 0, 0, 1217, 1218, 5, 102, 0, 0, 1218, 1219, 5, 108, 0, 0, 1219, 1220, 5, 97, 0, 0, 1220, 1221, 5, 103, 0, 0, 1221, 1222, 5, 115, 0, 0, 1222, 138, 1, 0, 0, 0, 1223, 1224, 5, 101, 0, 0, 1224, 1225, 5, 120, 0, 0, 1225, 1226, 5, 116, 0, 0, 1226, 1227, 5, 101, 0, 0, 1227, 1228, 5, 110, 0, 0, 1228, 1229, 5, 100, 0, 0, 1229, 1230, 5, 115, 0, 0, 1230, 140, 1, 0, 0, 0, 1231, 1232, 5, 105, 0, 0, 1232, 1233, 5, 109, 0, 0, 1233, 1234, 5, 112, 0, 0, 1234, 1235, 5, 108, 0, 0, 1235, 1236, 5, 101, 0, 0, 1236, 1237, 5, 109, 0, 0, 1237, 1238, 5, 101, 0, 0, 1238, 1239, 5, 110, 0, 0, 1239, 1240, 5, 116, 0, 0, 1240, 1241, 5, 115, 0, 0, 1241, 142, 1, 0, 0, 0, 1242, 1243, 5, 46, 0, 0, 1243, 1244, 5, 108, 0, 0, 1244, 1245, 5, 105, 0, 0, 1245, 1246, 5, 110, 0, 0, 1246, 1247, 5, 101, 0, 0, 1247, 144, 1, 0, 0, 0, 1248, 1249, 5, 35, 0, 0, 1249, 1250, 5, 108, 0, 0, 1250, 1251, 5, 105, 0, 0, 1251, 1252, 5, 110, 0, 0, 1252, 1253, 5, 101, 0, 0, 1253, 146, 1, 0, 0, 0, 1254, 1255, 5, 58, 0, 0, 1255, 148, 1, 0, 0, 0, 1256, 1257, 5, 110, 0, 0, 1257, 1258, 5, 111, 0, 0, 1258, 1259, 5, 109, 0, 0, 1259, 1260, 5, 101, 0, 0, 1260, 1261, 5, 116, 0, 0, 1261, 1262, 5, 97, 0, 0, 1262, 1263, 5, 100, 0, 0, 1263, 1264, 5, 97, 0, 0, 1264, 1265, 5, 116, 0, 0, 1265, 1266, 5, 97, 0, 0, 1266, 150, 1, 0, 0, 0, 1267, 1268, 5, 114, 0, 0, 1268, 1269, 5, 101, 0, 0, 1269, 1270, 5, 116, 0, 0, 1270, 1271, 5, 97, 0, 0, 1271, 1272, 5, 114, 0, 0, 1272, 1273, 5, 103, 0, 0, 1273, 1274, 5, 101, 0, 0, 1274, 1275, 5, 116, 0, 0, 1275, 1276, 5, 97, 0, 0, 1276, 1277, 5, 98, 0, 0, 1277, 1278, 5, 108, 0, 0, 1278, 1279, 5, 101, 0, 0, 1279, 152, 1, 0, 0, 0, 1280, 1281, 5, 110, 0, 0, 1281, 1282, 5, 111, 0, 0, 1282, 1283, 5, 112, 0, 0, 1283, 1284, 5, 108, 0, 0, 1284, 1285, 5, 97, 0, 0, 1285, 1286, 5, 116, 0, 0, 1286, 1287, 5, 102, 0, 0, 1287, 1288, 5, 111, 0, 0, 1288, 1289, 5, 114, 0, 0, 1289, 1290, 5, 109, 0, 0, 1290, 154, 1, 0, 0, 0, 1291, 1292, 5, 108, 0, 0, 1292, 1293, 5, 101, 0, 0, 1293, 1294, 5, 103, 0, 0, 1294, 1295, 5, 97, 0, 0, 1295, 1296, 5, 99, 0, 0, 1296, 1297, 5, 121, 0, 0, 1297, 1298, 5, 32, 0, 0, 1298, 1299, 5, 108, 0, 0, 1299, 1300, 5, 105, 0, 0, 1300, 1301, 5, 98, 0, 0, 1301, 1302, 5, 114, 0, 0, 1302, 1303, 5, 97, 0, 0, 1303, 1304, 5, 114, 0, 0, 1304, 1305, 5, 121, 0, 0, 1305, 156, 1, 0, 0, 0, 1306, 1307, 5, 120, 0, 0, 1307, 1308, 5, 56, 0, 0, 1308, 1309, 5, 54, 0, 0, 1309, 158, 1, 0, 0, 0, 1310, 1311, 5, 97, 0, 0, 1311, 1312, 5, 109, 0, 0, 1312, 1313, 5, 100, 0, 0, 1313, 1314, 5, 54, 0, 0, 1314, 1315, 5, 52, 0, 0, 1315, 160, 1, 0, 0, 0, 1316, 1317, 5, 97, 0, 0, 1317, 1318, 5, 114, 0, 0, 1318, 1319, 5, 109, 0, 0, 1319, 162, 1, 0, 0, 0, 1320, 1321, 5, 97, 0, 0, 1321, 1322, 5, 114, 0, 0, 1322, 1323, 5, 109, 0, 0, 1323, 1324, 5, 54, 0, 0, 1324, 1325, 5, 52, 0, 0, 1325, 164, 1, 0, 0, 0, 1326, 1327, 5, 98, 0, 0, 1327, 1328, 5, 121, 0, 0, 1328, 1329, 5, 116, 0, 0, 1329, 1330, 5, 101, 0, 0, 1330, 1331, 5, 97, 0, 0, 1331, 1332, 5, 114, 0, 0, 1332, 1333, 5, 114, 0, 0, 1333, 1334, 5, 97, 0, 0, 1334, 1335, 5, 121, 0, 0, 1335, 166, 1, 0, 0, 0, 1336, 1337, 5, 40, 0, 0, 1337, 1338, 5, 41, 0, 0, 1338, 168, 1, 0, 0, 0, 1339, 1340, 5, 60, 0, 0, 1340, 170, 1, 0, 0, 0, 1341, 1342, 5, 62, 0, 0, 1342, 172, 1, 0, 0, 0, 1343, 1344, 5, 47, 0, 0, 1344, 174, 1, 0, 0, 0, 1345, 1346, 5, 97, 0, 0, 1346, 1347, 5, 108, 0, 0, 1347, 1348, 5, 103, 0, 0, 1348, 1349, 5, 111, 0, 0, 1349, 1350, 5, 114, 0, 0, 1350, 1351, 5, 105, 0, 0, 1351, 1352, 5, 116, 0, 0, 1352, 1353, 5, 104, 0, 0, 1353, 1354, 5, 109, 0, 0, 1354, 176, 1, 0, 0, 0, 1355, 1356, 5, 105, 0, 0, 1356, 1357, 5, 105, 0, 0, 1357, 1358, 5, 100, 0, 0, 1358, 1359, 5, 112, 0, 0, 1359, 1360, 5, 97, 0, 0, 1360, 1361, 5, 114, 0, 0, 1361, 1362, 5, 97, 0, 0, 1362, 1363, 5, 109, 0, 0, 1363, 178, 1, 0, 0, 0, 1364, 1365, 5, 112, 0, 0, 1365, 1366, 5, 105, 0, 0, 1366, 1367, 5, 110, 0, 0, 1367, 1368, 5, 110, 0, 0, 1368, 1369, 5, 101, 0, 0, 1369, 1370, 5, 100, 0, 0, 1370, 180, 1, 0, 0, 0, 1371, 1372, 5, 109, 0, 0, 1372, 1373, 5, 111, 0, 0, 1373, 1374, 5, 100, 0, 0, 1374, 1375, 5, 114, 0, 0, 1375, 1376, 5, 101, 0, 0, 1376, 1377, 5, 113, 0, 0, 1377, 182, 1, 0, 0, 0, 1378, 1379, 5, 109, 0, 0, 1379, 1380, 5, 111, 0, 0, 1380, 1381, 5, 100, 0, 0, 1381, 1382, 5, 111, 0, 0, 1382, 1383, 5, 112, 0, 0, 1383, 1384, 5, 116, 0, 0, 1384, 184, 1, 0, 0, 0, 1385, 1386, 5, 117, 0, 0, 1386, 1387, 5, 110, 0, 0, 1387, 1388, 5, 115, 0, 0, 1388, 1389, 5, 105, 0, 0, 1389, 1390, 5, 103, 0, 0, 1390, 1391, 5, 110, 0, 0, 1391, 1392, 5, 101, 0, 0, 1392, 1393, 5, 100, 0, 0, 1393, 186, 1, 0, 0, 0, 1394, 1395, 5, 116, 0, 0, 1395, 1396, 5, 114, 0, 0, 1396, 1397, 5, 117, 0, 0, 1397, 1398, 5, 101, 0, 0, 1398, 188, 1, 0, 0, 0, 1399, 1400, 5, 102, 0, 0, 1400, 1401, 5, 97, 0, 0, 1401, 1402, 5, 108, 0, 0, 1402, 1403, 5, 115, 0, 0, 1403, 1404, 5, 101, 0, 0, 1404, 190, 1, 0, 0, 0, 1405, 1406, 5, 114, 0, 0, 1406, 1407, 5, 101, 0, 0, 1407, 1408, 5, 113, 0, 0, 1408, 1409, 5, 117, 0, 0, 1409, 1410, 5, 101, 0, 0, 1410, 1411, 5, 115, 0, 0, 1411, 1412, 5, 116, 0, 0, 1412, 192, 1, 0, 0, 0, 1413, 1414, 5, 100, 0, 0, 1414, 1415, 5, 101, 0, 0, 1415, 1416, 5, 109, 0, 0, 1416, 1417, 5, 97, 0, 0, 1417, 1418, 5, 110, 0, 0, 1418, 1419, 5, 100, 0, 0, 1419, 194, 1, 0, 0, 0, 1420, 1421, 5, 97, 0, 0, 1421, 1422, 5, 115, 0, 0, 1422, 1423, 5, 115, 0, 0, 1423, 1424, 5, 101, 0, 0, 1424, 1425, 5, 114, 0, 0, 1425, 1426, 5, 116, 0, 0, 1426, 196, 1, 0, 0, 0, 1427, 1428, 5, 100, 0, 0, 1428, 1429, 5, 101, 0, 0, 1429, 1430, 5, 110, 0, 0, 1430, 1431, 5, 121, 0, 0, 1431, 198, 1, 0, 0, 0, 1432, 1433, 5, 112, 0, 0, 1433, 1434, 5, 101, 0, 0, 1434, 1435, 5, 114, 0, 0, 1435, 1436, 5, 109, 0, 0, 1436, 1437, 5, 105, 0, 0, 1437, 1438, 5, 116, 0, 0, 1438, 1439, 5, 111, 0, 0, 1439, 1440, 5, 110, 0, 0, 1440, 1441, 5, 108, 0, 0, 1441, 1442, 5, 121, 0, 0, 1442, 200, 1, 0, 0, 0, 1443, 1444, 5, 108, 0, 0, 1444, 1445, 5, 105, 0, 0, 1445, 1446, 5, 110, 0, 0, 1446, 1447, 5, 107, 0, 0, 1447, 1448, 5, 99, 0, 0, 1448, 1449, 5, 104, 0, 0, 1449, 1450, 5, 101, 0, 0, 1450, 1451, 5, 99, 0, 0, 1451, 1452, 5, 107, 0, 0, 1452, 202, 1, 0, 0, 0, 1453, 1454, 5, 105, 0, 0, 1454, 1455, 5, 110, 0, 0, 1455, 1456, 5, 104, 0, 0, 1456, 1457, 5, 101, 0, 0, 1457, 1458, 5, 114, 0, 0, 1458, 1459, 5, 105, 0, 0, 1459, 1460, 5, 116, 0, 0, 1460, 1461, 5, 99, 0, 0, 1461, 1462, 5, 104, 0, 0, 1462, 1463, 5, 101, 0, 0, 1463, 1464, 5, 99, 0, 0, 1464, 1465, 5, 107, 0, 0, 1465, 204, 1, 0, 0, 0, 1466, 1467, 5, 114, 0, 0, 1467, 1468, 5, 101, 0, 0, 1468, 1469, 5, 113, 0, 0, 1469, 1470, 5, 109, 0, 0, 1470, 1471, 5, 105, 0, 0, 1471, 1472, 5, 110, 0, 0, 1472, 206, 1, 0, 0, 0, 1473, 1474, 5, 114, 0, 0, 1474, 1475, 5, 101, 0, 0, 1475, 1476, 5, 113, 0, 0, 1476, 1477, 5, 111, 0, 0, 1477, 1478, 5, 112, 0, 0, 1478, 1479, 5, 116, 0, 0, 1479, 208, 1, 0, 0, 0, 1480, 1481, 5, 114, 0, 0, 1481, 1482, 5, 101, 0, 0, 1482, 1483, 5, 113, 0, 0, 1483, 1484, 5, 114, 0, 0, 1484, 1485, 5, 101, 0, 0, 1485, 1486, 5, 102, 0, 0, 1486, 1487, 5, 117, 0, 0, 1487, 1488, 5, 115, 0, 0, 1488, 1489, 5, 101, 0, 0, 1489, 210, 1, 0, 0, 0, 1490, 1491, 5, 112, 0, 0, 1491, 1492, 5, 114, 0, 0, 1492, 1493, 5, 101, 0, 0, 1493, 1494, 5, 106, 0, 0, 1494, 1495, 5, 105, 0, 0, 1495, 1496, 5, 116, 0, 0, 1496, 1497, 5, 103, 0, 0, 1497, 1498, 5, 114, 0, 0, 1498, 1499, 5, 97, 0, 0, 1499, 1500, 5, 110, 0, 0, 1500, 1501, 5, 116, 0, 0, 1501, 212, 1, 0, 0, 0, 1502, 1503, 5, 112, 0, 0, 1503, 1504, 5, 114, 0, 0, 1504, 1505, 5, 101, 0, 0, 1505, 1506, 5, 106, 0, 0, 1506, 1507, 5, 105, 0, 0, 1507, 1508, 5, 116, 0, 0, 1508, 1509, 5, 100, 0, 0, 1509, 1510, 5, 101, 0, 0, 1510, 1511, 5, 110, 0, 0, 1511, 1512, 5, 121, 0, 0, 1512, 214, 1, 0, 0, 0, 1513, 1514, 5, 110, 0, 0, 1514, 1515, 5, 111, 0, 0, 1515, 1516, 5, 110, 0, 0, 1516, 1517, 5, 99, 0, 0, 1517, 1518, 5, 97, 0, 0, 1518, 1519, 5, 115, 0, 0, 1519, 1520, 5, 100, 0, 0, 1520, 1521, 5, 101, 0, 0, 1521, 1522, 5, 109, 0, 0, 1522, 1523, 5, 97, 0, 0, 1523, 1524, 5, 110, 0, 0, 1524, 1525, 5, 100, 0, 0, 1525, 216, 1, 0, 0, 0, 1526, 1527, 5, 110, 0, 0, 1527, 1528, 5, 111, 0, 0, 1528, 1529, 5, 110, 0, 0, 1529, 1530, 5, 99, 0, 0, 1530, 1531, 5, 97, 0, 0, 1531, 1532, 5, 115, 0, 0, 1532, 1533, 5, 108, 0, 0, 1533, 1534, 5, 105, 0, 0, 1534, 1535, 5, 110, 0, 0, 1535, 1536, 5, 107, 0, 0, 1536, 1537, 5, 100, 0, 0, 1537, 1538, 5, 101, 0, 0, 1538, 1539, 5, 109, 0, 0, 1539, 1540, 5, 97, 0, 0, 1540, 1541, 5, 110, 0, 0, 1541, 1542, 5, 100, 0, 0, 1542, 218, 1, 0, 0, 0, 1543, 1544, 5, 110, 0, 0, 1544, 1545, 5, 111, 0, 0, 1545, 1546, 5, 110, 0, 0, 1546, 1547, 5, 99, 0, 0, 1547, 1548, 5, 97, 0, 0, 1548, 1549, 5, 115, 0, 0, 1549, 1550, 5, 105, 0, 0, 1550, 1551, 5, 110, 0, 0, 1551, 1552, 5, 104, 0, 0, 1552, 1553, 5, 101, 0, 0, 1553, 1554, 5, 114, 0, 0, 1554, 1555, 5, 105, 0, 0, 1555, 1556, 5, 116, 0, 0, 1556, 1557, 5, 97, 0, 0, 1557, 1558, 5, 110, 0, 0, 1558, 1559, 5, 99, 0, 0, 1559, 1560, 5, 101, 0, 0, 1560, 220, 1, 0, 0, 0, 1561, 1562, 5, 99, 0, 0, 1562, 1563, 5, 97, 0, 0, 1563, 1564, 5, 108, 0, 0, 1564, 1565, 5, 108, 0, 0, 1565, 1566, 5, 99, 0, 0, 1566, 1567, 5, 111, 0, 0, 1567, 1568, 5, 110, 0, 0, 1568, 1569, 5, 118, 0, 0, 1569, 222, 1, 0, 0, 0, 1570, 1571, 5, 109, 0, 0, 1571, 1572, 5, 100, 0, 0, 1572, 1573, 5, 116, 0, 0, 1573, 1574, 5, 111, 0, 0, 1574, 1575, 5, 107, 0, 0, 1575, 1576, 5, 101, 0, 0, 1576, 1577, 5, 110, 0, 0, 1577, 224, 1, 0, 0, 0, 1578, 1579, 5, 45, 0, 0, 1579, 226, 1, 0, 0, 0, 1580, 1581, 5, 98, 0, 0, 1581, 1582, 5, 121, 0, 0, 1582, 1583, 5, 114, 0, 0, 1583, 1584, 5, 101, 0, 0, 1584, 1585, 5, 102, 0, 0, 1585, 1586, 5, 108, 0, 0, 1586, 1587, 5, 105, 0, 0, 1587, 1588, 5, 107, 0, 0, 1588, 1589, 5, 101, 0, 0, 1589, 228, 1, 0, 0, 0, 1590, 1591, 5, 46, 0, 0, 1591, 1592, 5, 99, 0, 0, 1592, 1593, 5, 116, 0, 0, 1593, 1594, 5, 111, 0, 0, 1594, 1595, 5, 114, 0, 0, 1595, 230, 1, 0, 0, 0, 1596, 1597, 5, 46, 0, 0, 1597, 1598, 5, 115, 0, 0, 1598, 1599, 5, 105, 0, 0, 1599, 1600, 5, 122, 0, 0, 1600, 1601, 5, 101, 0, 0, 1601, 232, 1, 0, 0, 0, 1602, 1603, 5, 46, 0, 0, 1603, 1604, 5, 112, 0, 0, 1604, 1605, 5, 97, 0, 0, 1605, 1606, 5, 99, 0, 0, 1606, 1607, 5, 107, 0, 0, 1607, 234, 1, 0, 0, 0, 1608, 1609, 5, 119, 0, 0, 1609, 1610, 5, 105, 0, 0, 1610, 1611, 5, 116, 0, 0, 1611, 1612, 5, 104, 0, 0, 1612, 236, 1, 0, 0, 0, 1613, 1614, 5, 46, 0, 0, 1614, 1615, 5, 105, 0, 0, 1615, 1616, 5, 110, 0, 0, 1616, 1617, 5, 116, 0, 0, 1617, 1618, 5, 101, 0, 0, 1618, 1619, 5, 114, 0, 0, 1619, 1620, 5, 102, 0, 0, 1620, 1621, 5, 97, 0, 0, 1621, 1622, 5, 99, 0, 0, 1622, 1623, 5, 101, 0, 0, 1623, 1624, 5, 105, 0, 0, 1624, 1625, 5, 109, 0, 0, 1625, 1626, 5, 112, 0, 0, 1626, 1627, 5, 108, 0, 0, 1627, 238, 1, 0, 0, 0, 1628, 1629, 5, 46, 0, 0, 1629, 1630, 5, 102, 0, 0, 1630, 1631, 5, 105, 0, 0, 1631, 1632, 5, 101, 0, 0, 1632, 1633, 5, 108, 0, 0, 1633, 1634, 5, 100, 0, 0, 1634, 240, 1, 0, 0, 0, 1635, 1636, 5, 109, 0, 0, 1636, 1637, 5, 97, 0, 0, 1637, 1638, 5, 114, 0, 0, 1638, 1639, 5, 115, 0, 0, 1639, 1640, 5, 104, 0, 0, 1640, 1641, 5, 97, 0, 0, 1641, 1642, 5, 108, 0, 0, 1642, 242, 1, 0, 0, 0, 1643, 1644, 5, 115, 0, 0, 1644, 1645, 5, 116, 0, 0, 1645, 1646, 5, 97, 0, 0, 1646, 1647, 5, 116, 0, 0, 1647, 1648, 5, 105, 0, 0, 1648, 1649, 5, 99, 0, 0, 1649, 244, 1, 0, 0, 0, 1650, 1651, 5, 105, 0, 0, 1651, 1652, 5, 110, 0, 0, 1652, 1653, 5, 105, 0, 0, 1653, 1654, 5, 116, 0, 0, 1654, 1655, 5, 111, 0, 0, 1655, 1656, 5, 110, 0, 0, 1656, 1657, 5, 108, 0, 0, 1657, 1658, 5, 121, 0, 0, 1658, 246, 1, 0, 0, 0, 1659, 1660, 5, 112, 0, 0, 1660, 1661, 5, 114, 0, 0, 1661, 1662, 5, 105, 0, 0, 1662, 1663, 5, 118, 0, 0, 1663, 1664, 5, 97, 0, 0, 1664, 1665, 5, 116, 0, 0, 1665, 1666, 5, 101, 0, 0, 1666, 1667, 5, 115, 0, 0, 1667, 1668, 5, 99, 0, 0, 1668, 1669, 5, 111, 0, 0, 1669, 1670, 5, 112, 0, 0, 1670, 1671, 5, 101, 0, 0, 1671, 248, 1, 0, 0, 0, 1672, 1673, 5, 108, 0, 0, 1673, 1674, 5, 105, 0, 0, 1674, 1675, 5, 116, 0, 0, 1675, 1676, 5, 101, 0, 0, 1676, 1677, 5, 114, 0, 0, 1677, 1678, 5, 97, 0, 0, 1678, 1679, 5, 108, 0, 0, 1679, 250, 1, 0, 0, 0, 1680, 1681, 5, 110, 0, 0, 1681, 1682, 5, 111, 0, 0, 1682, 1683, 5, 116, 0, 0, 1683, 1684, 5, 115, 0, 0, 1684, 1685, 5, 101, 0, 0, 1685, 1686, 5, 114, 0, 0, 1686, 1687, 5, 105, 0, 0, 1687, 1688, 5, 97, 0, 0, 1688, 1689, 5, 108, 0, 0, 1689, 1690, 5, 105, 0, 0, 1690, 1691, 5, 122, 0, 0, 1691, 1692, 5, 101, 0, 0, 1692, 1693, 5, 100, 0, 0, 1693, 252, 1, 0, 0, 0, 1694, 1695, 5, 118, 0, 0, 1695, 1696, 5, 111, 0, 0, 1696, 1697, 5, 108, 0, 0, 1697, 1698, 5, 97, 0, 0, 1698, 1699, 5, 116, 0, 0, 1699, 1700, 5, 105, 0, 0, 1700, 1701, 5, 108, 0, 0, 1701, 1702, 5, 101, 0, 0, 1702, 254, 1, 0, 0, 0, 1703, 1704, 5, 46, 0, 0, 1704, 1705, 5, 101, 0, 0, 1705, 1706, 5, 118, 0, 0, 1706, 1707, 5, 101, 0, 0, 1707, 1708, 5, 110, 0, 0, 1708, 1709, 5, 116, 0, 0, 1709, 256, 1, 0, 0, 0, 1710, 1711, 5, 46, 0, 0, 1711, 1712, 5, 97, 0, 0, 1712, 1713, 5, 100, 0, 0, 1713, 1714, 5, 100, 0, 0, 1714, 1715, 5, 111, 0, 0, 1715, 1716, 5, 110, 0, 0, 1716, 258, 1, 0, 0, 0, 1717, 1718, 5, 46, 0, 0, 1718, 1719, 5, 114, 0, 0, 1719, 1720, 5, 101, 0, 0, 1720, 1721, 5, 109, 0, 0, 1721, 1722, 5, 111, 0, 0, 1722, 1723, 5, 118, 0, 0, 1723, 1724, 5, 101, 0, 0, 1724, 1725, 5, 111, 0, 0, 1725, 1726, 5, 110, 0, 0, 1726, 260, 1, 0, 0, 0, 1727, 1728, 5, 46, 0, 0, 1728, 1729, 5, 102, 0, 0, 1729, 1730, 5, 105, 0, 0, 1730, 1731, 5, 114, 0, 0, 1731, 1732, 5, 101, 0, 0, 1732, 262, 1, 0, 0, 0, 1733, 1734, 5, 46, 0, 0, 1734, 1735, 5, 111, 0, 0, 1735, 1736, 5, 116, 0, 0, 1736, 1737, 5, 104, 0, 0, 1737, 1738, 5, 101, 0, 0, 1738, 1739, 5, 114, 0, 0, 1739, 264, 1, 0, 0, 0, 1740, 1741, 5, 46, 0, 0, 1741, 1742, 5, 112, 0, 0, 1742, 1743, 5, 114, 0, 0, 1743, 1744, 5, 111, 0, 0, 1744, 1745, 5, 112, 0, 0, 1745, 1746, 5, 101, 0, 0, 1746, 1747, 5, 114, 0, 0, 1747, 1748, 5, 116, 0, 0, 1748, 1749, 5, 121, 0, 0, 1749, 266, 1, 0, 0, 0, 1750, 1751, 5, 46, 0, 0, 1751, 1752, 5, 115, 0, 0, 1752, 1753, 5, 101, 0, 0, 1753, 1754, 5, 116, 0, 0, 1754, 268, 1, 0, 0, 0, 1755, 1756, 5, 46, 0, 0, 1756, 1757, 5, 103, 0, 0, 1757, 1758, 5, 101, 0, 0, 1758, 1759, 5, 116, 0, 0, 1759, 270, 1, 0, 0, 0, 1760, 1761, 5, 105, 0, 0, 1761, 1762, 5, 110, 0, 0, 1762, 272, 1, 0, 0, 0, 1763, 1764, 5, 111, 0, 0, 1764, 1765, 5, 117, 0, 0, 1765, 1766, 5, 116, 0, 0, 1766, 274, 1, 0, 0, 0, 1767, 1768, 5, 111, 0, 0, 1768, 1769, 5, 112, 0, 0, 1769, 1770, 5, 116, 0, 0, 1770, 276, 1, 0, 0, 0, 1771, 1772, 5, 46, 0, 0, 1772, 1773, 5, 109, 0, 0, 1773, 1774, 5, 101, 0, 0, 1774, 1775, 5, 116, 0, 0, 1775, 1776, 5, 104, 0, 0, 1776, 1777, 5, 111, 0, 0, 1777, 1778, 5, 100, 0, 0, 1778, 278, 1, 0, 0, 0, 1779, 1780, 5, 102, 0, 0, 1780, 1781, 5, 105, 0, 0, 1781, 1782, 5, 110, 0, 0, 1782, 1783, 5, 97, 0, 0, 1783, 1784, 5, 108, 0, 0, 1784, 280, 1, 0, 0, 0, 1785, 1786, 5, 118, 0, 0, 1786, 1787, 5, 105, 0, 0, 1787, 1788, 5, 114, 0, 0, 1788, 1789, 5, 116, 0, 0, 1789, 1790, 5, 117, 0, 0, 1790, 1791, 5, 97, 0, 0, 1791, 1792, 5, 108, 0, 0, 1792, 282, 1, 0, 0, 0, 1793, 1794, 5, 115, 0, 0, 1794, 1795, 5, 116, 0, 0, 1795, 1796, 5, 114, 0, 0, 1796, 1797, 5, 105, 0, 0, 1797, 1798, 5, 99, 0, 0, 1798, 1799, 5, 116, 0, 0, 1799, 284, 1, 0, 0, 0, 1800, 1801, 5, 104, 0, 0, 1801, 1802, 5, 105, 0, 0, 1802, 1803, 5, 100, 0, 0, 1803, 1804, 5, 101, 0, 0, 1804, 1805, 5, 98, 0, 0, 1805, 1806, 5, 121, 0, 0, 1806, 1807, 5, 115, 0, 0, 1807, 1808, 5, 105, 0, 0, 1808, 1809, 5, 103, 0, 0, 1809, 286, 1, 0, 0, 0, 1810, 1811, 5, 110, 0, 0, 1811, 1812, 5, 101, 0, 0, 1812, 1813, 5, 119, 0, 0, 1813, 1814, 5, 115, 0, 0, 1814, 1815, 5, 108, 0, 0, 1815, 1816, 5, 111, 0, 0, 1816, 1817, 5, 116, 0, 0, 1817, 288, 1, 0, 0, 0, 1818, 1819, 5, 117, 0, 0, 1819, 1820, 5, 110, 0, 0, 1820, 1821, 5, 109, 0, 0, 1821, 1822, 5, 97, 0, 0, 1822, 1823, 5, 110, 0, 0, 1823, 1824, 5, 97, 0, 0, 1824, 1825, 5, 103, 0, 0, 1825, 1826, 5, 101, 0, 0, 1826, 1827, 5, 100, 0, 0, 1827, 1828, 5, 101, 0, 0, 1828, 1829, 5, 120, 0, 0, 1829, 1830, 5, 112, 0, 0, 1830, 290, 1, 0, 0, 0, 1831, 1832, 5, 114, 0, 0, 1832, 1833, 5, 101, 0, 0, 1833, 1834, 5, 113, 0, 0, 1834, 1835, 5, 115, 0, 0, 1835, 1836, 5, 101, 0, 0, 1836, 1837, 5, 99, 0, 0, 1837, 1838, 5, 111, 0, 0, 1838, 1839, 5, 98, 0, 0, 1839, 1840, 5, 106, 0, 0, 1840, 292, 1, 0, 0, 0, 1841, 1842, 5, 112, 0, 0, 1842, 1843, 5, 105, 0, 0, 1843, 1844, 5, 110, 0, 0, 1844, 1845, 5, 118, 0, 0, 1845, 1846, 5, 111, 0, 0, 1846, 1847, 5, 107, 0, 0, 1847, 1848, 5, 101, 0, 0, 1848, 1849, 5, 105, 0, 0, 1849, 1850, 5, 109, 0, 0, 1850, 1851, 5, 112, 0, 0, 1851, 1852, 5, 108, 0, 0, 1852, 294, 1, 0, 0, 0, 1853, 1854, 5, 110, 0, 0, 1854, 1855, 5, 111, 0, 0, 1855, 1856, 5, 109, 0, 0, 1856, 1857, 5, 97, 0, 0, 1857, 1858, 5, 110, 0, 0, 1858, 1859, 5, 103, 0, 0, 1859, 1860, 5, 108, 0, 0, 1860, 1861, 5, 101, 0, 0, 1861, 296, 1, 0, 0, 0, 1862, 1863, 5, 108, 0, 0, 1863, 1864, 5, 97, 0, 0, 1864, 1865, 5, 115, 0, 0, 1865, 1866, 5, 116, 0, 0, 1866, 1867, 5, 101, 0, 0, 1867, 1868, 5, 114, 0, 0, 1868, 1869, 5, 114, 0, 0, 1869, 298, 1, 0, 0, 0, 1870, 1871, 5, 119, 0, 0, 1871, 1872, 5, 105, 0, 0, 1872, 1873, 5, 110, 0, 0, 1873, 1874, 5, 97, 0, 0, 1874, 1875, 5, 112, 0, 0, 1875, 1876, 5, 105, 0, 0, 1876, 300, 1, 0, 0, 0, 1877, 1878, 5, 98, 0, 0, 1878, 1879, 5, 101, 0, 0, 1879, 1880, 5, 115, 0, 0, 1880, 1881, 5, 116, 0, 0, 1881, 1882, 5, 102, 0, 0, 1882, 1883, 5, 105, 0, 0, 1883, 1884, 5, 116, 0, 0, 1884, 302, 1, 0, 0, 0, 1885, 1886, 5, 111, 0, 0, 1886, 1887, 5, 110, 0, 0, 1887, 304, 1, 0, 0, 0, 1888, 1889, 5, 111, 0, 0, 1889, 1890, 5, 102, 0, 0, 1890, 1891, 5, 102, 0, 0, 1891, 306, 1, 0, 0, 0, 1892, 1893, 5, 99, 0, 0, 1893, 1894, 5, 104, 0, 0, 1894, 1895, 5, 97, 0, 0, 1895, 1896, 5, 114, 0, 0, 1896, 1897, 5, 109, 0, 0, 1897, 1898, 5, 97, 0, 0, 1898, 1899, 5, 112, 0, 0, 1899, 1900, 5, 101, 0, 0, 1900, 1901, 5, 114, 0, 0, 1901, 1902, 5, 114, 0, 0, 1902, 1903, 5, 111, 0, 0, 1903, 1904, 5, 114, 0, 0, 1904, 308, 1, 0, 0, 0, 1905, 1906, 5, 46, 0, 0, 1906, 1907, 5, 99, 0, 0, 1907, 1908, 5, 99, 0, 0, 1908, 1909, 5, 116, 0, 0, 1909, 1910, 5, 111, 0, 0, 1910, 1911, 5, 114, 0, 0, 1911, 310, 1, 0, 0, 0, 1912, 1913, 5, 105, 0, 0, 1913, 1914, 5, 108, 0, 0, 1914, 312, 1, 0, 0, 0, 1915, 1916, 5, 105, 0, 0, 1916, 1917, 5, 110, 0, 0, 1917, 1918, 5, 105, 0, 0, 1918, 1919, 5, 116, 0, 0, 1919, 314, 1, 0, 0, 0, 1920, 1921, 5, 46, 0, 0, 1921, 1922, 5, 116, 0, 0, 1922, 1923, 5, 114, 0, 0, 1923, 1924, 5, 121, 0, 0, 1924, 316, 1, 0, 0, 0, 1925, 1926, 5, 116, 0, 0, 1926, 1927, 5, 111, 0, 0, 1927, 318, 1, 0, 0, 0, 1928, 1929, 5, 102, 0, 0, 1929, 1930, 5, 105, 0, 0, 1930, 1931, 5, 108, 0, 0, 1931, 1932, 5, 116, 0, 0, 1932, 1933, 5, 101, 0, 0, 1933, 1934, 5, 114, 0, 0, 1934, 320, 1, 0, 0, 0, 1935, 1936, 5, 99, 0, 0, 1936, 1937, 5, 97, 0, 0, 1937, 1938, 5, 116, 0, 0, 1938, 1939, 5, 99, 0, 0, 1939, 1940, 5, 104, 0, 0, 1940, 322, 1, 0, 0, 0, 1941, 1942, 5, 102, 0, 0, 1942, 1943, 5, 105, 0, 0, 1943, 1944, 5, 110, 0, 0, 1944, 1945, 5, 97, 0, 0, 1945, 1946, 5, 108, 0, 0, 1946, 1947, 5, 108, 0, 0, 1947, 1948, 5, 121, 0, 0, 1948, 324, 1, 0, 0, 0, 1949, 1950, 5, 102, 0, 0, 1950, 1951, 5, 97, 0, 0, 1951, 1952, 5, 117, 0, 0, 1952, 1953, 5, 108, 0, 0, 1953, 1954, 5, 116, 0, 0, 1954, 326, 1, 0, 0, 0, 1955, 1956, 5, 104, 0, 0, 1956, 1957, 5, 97, 0, 0, 1957, 1958, 5, 110, 0, 0, 1958, 1959, 5, 100, 0, 0, 1959, 1960, 5, 108, 0, 0, 1960, 1961, 5, 101, 0, 0, 1961, 1962, 5, 114, 0, 0, 1962, 328, 1, 0, 0, 0, 1963, 1964, 5, 46, 0, 0, 1964, 1965, 5, 100, 0, 0, 1965, 1966, 5, 97, 0, 0, 1966, 1967, 5, 116, 0, 0, 1967, 1968, 5, 97, 0, 0, 1968, 330, 1, 0, 0, 0, 1969, 1970, 5, 116, 0, 0, 1970, 1971, 5, 108, 0, 0, 1971, 1972, 5, 115, 0, 0, 1972, 332, 1, 0, 0, 0, 1973, 1974, 5, 46, 0, 0, 1974, 1975, 5, 112, 0, 0, 1975, 1976, 5, 117, 0, 0, 1976, 1977, 5, 98, 0, 0, 1977, 1978, 5, 108, 0, 0, 1978, 1979, 5, 105, 0, 0, 1979, 1980, 5, 99, 0, 0, 1980, 1981, 5, 75, 0, 0, 1981, 1982, 5, 101, 0, 0, 1982, 1983, 5, 121, 0, 0, 1983, 334, 1, 0, 0, 0, 1984, 1985, 5, 46, 0, 0, 1985, 1986, 5, 118, 0, 0, 1986, 1987, 5, 101, 0, 0, 1987, 1988, 5, 114, 0, 0, 1988, 336, 1, 0, 0, 0, 1989, 1990, 5, 46, 0, 0, 1990, 1991, 5, 108, 0, 0, 1991, 1992, 5, 111, 0, 0, 1992, 1993, 5, 99, 0, 0, 1993, 1994, 5, 97, 0, 0, 1994, 1995, 5, 108, 0, 0, 1995, 1996, 5, 101, 0, 0, 1996, 338, 1, 0, 0, 0, 1997, 1998, 5, 46, 0, 0, 1998, 1999, 5, 112, 0, 0, 1999, 2000, 5, 117, 0, 0, 2000, 2001, 5, 98, 0, 0, 2001, 2002, 5, 108, 0, 0, 2002, 2003, 5, 105, 0, 0, 2003, 2004, 5, 99, 0, 0, 2004, 2005, 5, 107, 0, 0, 2005, 2006, 5, 101, 0, 0, 2006, 2007, 5, 121, 0, 0, 2007, 2008, 5, 116, 0, 0, 2008, 2009, 5, 111, 0, 0, 2009, 2010, 5, 107, 0, 0, 2010, 2011, 5, 101, 0, 0, 2011, 2012, 5, 110, 0, 0, 2012, 340, 1, 0, 0, 0, 2013, 2014, 5, 102, 0, 0, 2014, 2015, 5, 111, 0, 0, 2015, 2016, 5, 114, 0, 0, 2016, 2017, 5, 119, 0, 0, 2017, 2018, 5, 97, 0, 0, 2018, 2019, 5, 114, 0, 0, 2019, 2020, 5, 100, 0, 0, 2020, 2021, 5, 101, 0, 0, 2021, 2022, 5, 114, 0, 0, 2022, 342, 1, 0, 0, 0, 2023, 2025, 5, 45, 0, 0, 2024, 2023, 1, 0, 0, 0, 2024, 2025, 1, 0, 0, 0, 2025, 2039, 1, 0, 0, 0, 2026, 2027, 5, 48, 0, 0, 2027, 2028, 5, 120, 0, 0, 2028, 2030, 1, 0, 0, 0, 2029, 2031, 7, 0, 0, 0, 2030, 2029, 1, 0, 0, 0, 2031, 2032, 1, 0, 0, 0, 2032, 2030, 1, 0, 0, 0, 2032, 2033, 1, 0, 0, 0, 2033, 2040, 1, 0, 0, 0, 2034, 2036, 7, 1, 0, 0, 2035, 2034, 1, 0, 0, 0, 2036, 2037, 1, 0, 0, 0, 2037, 2035, 1, 0, 0, 0, 2037, 2038, 1, 0, 0, 0, 2038, 2040, 1, 0, 0, 0, 2039, 2026, 1, 0, 0, 0, 2039, 2035, 1, 0, 0, 0, 2040, 344, 1, 0, 0, 0, 2041, 2043, 5, 45, 0, 0, 2042, 2041, 1, 0, 0, 0, 2042, 2043, 1, 0, 0, 0, 2043, 2057, 1, 0, 0, 0, 2044, 2045, 5, 48, 0, 0, 2045, 2046, 5, 120, 0, 0, 2046, 2048, 1, 0, 0, 0, 2047, 2049, 7, 0, 0, 0, 2048, 2047, 1, 0, 0, 0, 2049, 2050, 1, 0, 0, 0, 2050, 2048, 1, 0, 0, 0, 2050, 2051, 1, 0, 0, 0, 2051, 2058, 1, 0, 0, 0, 2052, 2054, 7, 1, 0, 0, 2053, 2052, 1, 0, 0, 0, 2054, 2055, 1, 0, 0, 0, 2055, 2053, 1, 0, 0, 0, 2055, 2056, 1, 0, 0, 0, 2056, 2058, 1, 0, 0, 0, 2057, 2044, 1, 0, 0, 0, 2057, 2053, 1, 0, 0, 0, 2058, 346, 1, 0, 0, 0, 2059, 2061, 5, 45, 0, 0, 2060, 2059, 1, 0, 0, 0, 2060, 2061, 1, 0, 0, 0, 2061, 2112, 1, 0, 0, 0, 2062, 2064, 7, 1, 0, 0, 2063, 2062, 1, 0, 0, 0, 2064, 2065, 1, 0, 0, 0, 2065, 2063, 1, 0, 0, 0, 2065, 2066, 1, 0, 0, 0, 2066, 2093, 1, 0, 0, 0, 2067, 2069, 5, 46, 0, 0, 2068, 2070, 7, 1, 0, 0, 2069, 2068, 1, 0, 0, 0, 2070, 2071, 1, 0, 0, 0, 2071, 2069, 1, 0, 0, 0, 2071, 2072, 1, 0, 0, 0, 2072, 2082, 1, 0, 0, 0, 2073, 2075, 7, 2, 0, 0, 2074, 2076, 7, 3, 0, 0, 2075, 2074, 1, 0, 0, 0, 2075, 2076, 1, 0, 0, 0, 2076, 2078, 1, 0, 0, 0, 2077, 2079, 7, 1, 0, 0, 2078, 2077, 1, 0, 0, 0, 2079, 2080, 1, 0, 0, 0, 2080, 2078, 1, 0, 0, 0, 2080, 2081, 1, 0, 0, 0, 2081, 2083, 1, 0, 0, 0, 2082, 2073, 1, 0, 0, 0, 2082, 2083, 1, 0, 0, 0, 2083, 2094, 1, 0, 0, 0, 2084, 2086, 7, 2, 0, 0, 2085, 2087, 7, 3, 0, 0, 2086, 2085, 1, 0, 0, 0, 2086, 2087, 1, 0, 0, 0, 2087, 2089, 1, 0, 0, 0, 2088, 2090, 7, 1, 0, 0, 2089, 2088, 1, 0, 0, 0, 2090, 2091, 1, 0, 0, 0, 2091, 2089, 1, 0, 0, 0, 2091, 2092, 1, 0, 0, 0, 2092, 2094, 1, 0, 0, 0, 2093, 2067, 1, 0, 0, 0, 2093, 2084, 1, 0, 0, 0, 2094, 2113, 1, 0, 0, 0, 2095, 2097, 5, 46, 0, 0, 2096, 2098, 7, 1, 0, 0, 2097, 2096, 1, 0, 0, 0, 2098, 2099, 1, 0, 0, 0, 2099, 2097, 1, 0, 0, 0, 2099, 2100, 1, 0, 0, 0, 2100, 2110, 1, 0, 0, 0, 2101, 2103, 7, 2, 0, 0, 2102, 2104, 7, 3, 0, 0, 2103, 2102, 1, 0, 0, 0, 2103, 2104, 1, 0, 0, 0, 2104, 2106, 1, 0, 0, 0, 2105, 2107, 7, 1, 0, 0, 2106, 2105, 1, 0, 0, 0, 2107, 2108, 1, 0, 0, 0, 2108, 2106, 1, 0, 0, 0, 2108, 2109, 1, 0, 0, 0, 2109, 2111, 1, 0, 0, 0, 2110, 2101, 1, 0, 0, 0, 2110, 2111, 1, 0, 0, 0, 2111, 2113, 1, 0, 0, 0, 2112, 2063, 1, 0, 0, 0, 2112, 2095, 1, 0, 0, 0, 2113, 348, 1, 0, 0, 0, 2114, 2115, 5, 58, 0, 0, 2115, 2116, 5, 58, 0, 0, 2116, 350, 1, 0, 0, 0, 2117, 2118, 5, 46, 0, 0, 2118, 2119, 5, 46, 0, 0, 2119, 2120, 5, 46, 0, 0, 2120, 352, 1, 0, 0, 0, 2121, 2122, 5, 110, 0, 0, 2122, 2123, 5, 117, 0, 0, 2123, 2124, 5, 108, 0, 0, 2124, 2125, 5, 108, 0, 0, 2125, 354, 1, 0, 0, 0, 2126, 2127, 5, 110, 0, 0, 2127, 2128, 5, 117, 0, 0, 2128, 2129, 5, 108, 0, 0, 2129, 2130, 5, 108, 0, 0, 2130, 2131, 5, 114, 0, 0, 2131, 2132, 5, 101, 0, 0, 2132, 2133, 5, 102, 0, 0, 2133, 356, 1, 0, 0, 0, 2134, 2135, 5, 46, 0, 0, 2135, 2136, 5, 104, 0, 0, 2136, 2137, 5, 97, 0, 0, 2137, 2138, 5, 115, 0, 0, 2138, 2139, 5, 104, 0, 0, 2139, 358, 1, 0, 0, 0, 2140, 2141, 5, 99, 0, 0, 2141, 2142, 5, 104, 0, 0, 2142, 2143, 5, 97, 0, 0, 2143, 2150, 5, 114, 0, 0, 2144, 2145, 5, 119, 0, 0, 2145, 2146, 5, 99, 0, 0, 2146, 2147, 5, 104, 0, 0, 2147, 2148, 5, 97, 0, 0, 2148, 2150, 5, 114, 0, 0, 2149, 2140, 1, 0, 0, 0, 2149, 2144, 1, 0, 0, 0, 2150, 360, 1, 0, 0, 0, 2151, 2152, 5, 115, 0, 0, 2152, 2153, 5, 116, 0, 0, 2153, 2154, 5, 114, 0, 0, 2154, 2155, 5, 105, 0, 0, 2155, 2156, 5, 110, 0, 0, 2156, 2157, 5, 103, 0, 0, 2157, 362, 1, 0, 0, 0, 2158, 2159, 5, 98, 0, 0, 2159, 2160, 5, 111, 0, 0, 2160, 2161, 5, 111, 0, 0, 2161, 2162, 5, 108, 0, 0, 2162, 364, 1, 0, 0, 0, 2163, 2164, 5, 105, 0, 0, 2164, 2165, 5, 110, 0, 0, 2165, 2166, 5, 116, 0, 0, 2166, 2167, 5, 56, 0, 0, 2167, 366, 1, 0, 0, 0, 2168, 2169, 5, 105, 0, 0, 2169, 2170, 5, 110, 0, 0, 2170, 2171, 5, 116, 0, 0, 2171, 2172, 5, 49, 0, 0, 2172, 2173, 5, 54, 0, 0, 2173, 368, 1, 0, 0, 0, 2174, 2175, 5, 105, 0, 0, 2175, 2176, 5, 110, 0, 0, 2176, 2177, 5, 116, 0, 0, 2177, 2178, 5, 51, 0, 0, 2178, 2179, 5, 50, 0, 0, 2179, 370, 1, 0, 0, 0, 2180, 2181, 5, 105, 0, 0, 2181, 2182, 5, 110, 0, 0, 2182, 2183, 5, 116, 0, 0, 2183, 2184, 5, 54, 0, 0, 2184, 2185, 5, 52, 0, 0, 2185, 372, 1, 0, 0, 0, 2186, 2187, 5, 102, 0, 0, 2187, 2188, 5, 108, 0, 0, 2188, 2189, 5, 111, 0, 0, 2189, 2190, 5, 97, 0, 0, 2190, 2191, 5, 116, 0, 0, 2191, 2192, 5, 51, 0, 0, 2192, 2193, 5, 50, 0, 0, 2193, 374, 1, 0, 0, 0, 2194, 2195, 5, 102, 0, 0, 2195, 2196, 5, 108, 0, 0, 2196, 2197, 5, 111, 0, 0, 2197, 2198, 5, 97, 0, 0, 2198, 2199, 5, 116, 0, 0, 2199, 2200, 5, 54, 0, 0, 2200, 2201, 5, 52, 0, 0, 2201, 376, 1, 0, 0, 0, 2202, 2203, 5, 117, 0, 0, 2203, 2204, 5, 110, 0, 0, 2204, 2205, 5, 115, 0, 0, 2205, 2206, 5, 105, 0, 0, 2206, 2207, 5, 103, 0, 0, 2207, 2208, 5, 110, 0, 0, 2208, 2209, 5, 101, 0, 0, 2209, 2210, 5, 100, 0, 0, 2210, 378, 1, 0, 0, 0, 2211, 2212, 5, 117, 0, 0, 2212, 2213, 5, 105, 0, 0, 2213, 2214, 5, 110, 0, 0, 2214, 2215, 5, 116, 0, 0, 2215, 2216, 5, 56, 0, 0, 2216, 380, 1, 0, 0, 0, 2217, 2218, 5, 117, 0, 0, 2218, 2219, 5, 105, 0, 0, 2219, 2220, 5, 110, 0, 0, 2220, 2221, 5, 116, 0, 0, 2221, 2222, 5, 49, 0, 0, 2222, 2223, 5, 54, 0, 0, 2223, 382, 1, 0, 0, 0, 2224, 2225, 5, 117, 0, 0, 2225, 2226, 5, 105, 0, 0, 2226, 2227, 5, 110, 0, 0, 2227, 2228, 5, 116, 0, 0, 2228, 2229, 5, 51, 0, 0, 2229, 2230, 5, 50, 0, 0, 2230, 384, 1, 0, 0, 0, 2231, 2232, 5, 117, 0, 0, 2232, 2233, 5, 105, 0, 0, 2233, 2234, 5, 110, 0, 0, 2234, 2235, 5, 116, 0, 0, 2235, 2236, 5, 54, 0, 0, 2236, 2237, 5, 52, 0, 0, 2237, 386, 1, 0, 0, 0, 2238, 2239, 5, 105, 0, 0, 2239, 2240, 5, 110, 0, 0, 2240, 2241, 5, 116, 0, 0, 2241, 388, 1, 0, 0, 0, 2242, 2243, 5, 117, 0, 0, 2243, 2244, 5, 105, 0, 0, 2244, 2245, 5, 110, 0, 0, 2245, 2246, 5, 116, 0, 0, 2246, 390, 1, 0, 0, 0, 2247, 2248, 5, 116, 0, 0, 2248, 2249, 5, 121, 0, 0, 2249, 2250, 5, 112, 0, 0, 2250, 2251, 5, 101, 0, 0, 2251, 392, 1, 0, 0, 0, 2252, 2253, 5, 111, 0, 0, 2253, 2254, 5, 98, 0, 0, 2254, 2255, 5, 106, 0, 0, 2255, 2256, 5, 101, 0, 0, 2256, 2257, 5, 99, 0, 0, 2257, 2258, 5, 116, 0, 0, 2258, 394, 1, 0, 0, 0, 2259, 2260, 5, 46, 0, 0, 2260, 2261, 5, 109, 0, 0, 2261, 2262, 5, 111, 0, 0, 2262, 2263, 5, 100, 0, 0, 2263, 2264, 5, 117, 0, 0, 2264, 2265, 5, 108, 0, 0, 2265, 2266, 5, 101, 0, 0, 2266, 396, 1, 0, 0, 0, 2267, 2268, 5, 118, 0, 0, 2268, 2269, 5, 97, 0, 0, 2269, 2270, 5, 108, 0, 0, 2270, 2271, 5, 117, 0, 0, 2271, 2272, 5, 101, 0, 0, 2272, 398, 1, 0, 0, 0, 2273, 2274, 5, 118, 0, 0, 2274, 2275, 5, 97, 0, 0, 2275, 2276, 5, 108, 0, 0, 2276, 2277, 5, 117, 0, 0, 2277, 2278, 5, 101, 0, 0, 2278, 2279, 5, 116, 0, 0, 2279, 2280, 5, 121, 0, 0, 2280, 2281, 5, 112, 0, 0, 2281, 2282, 5, 101, 0, 0, 2282, 400, 1, 0, 0, 0, 2283, 2284, 5, 118, 0, 0, 2284, 2285, 5, 111, 0, 0, 2285, 2286, 5, 105, 0, 0, 2286, 2287, 5, 100, 0, 0, 2287, 402, 1, 0, 0, 0, 2288, 2289, 5, 101, 0, 0, 2289, 2290, 5, 110, 0, 0, 2290, 2291, 5, 117, 0, 0, 2291, 2292, 5, 109, 0, 0, 2292, 404, 1, 0, 0, 0, 2293, 2294, 5, 99, 0, 0, 2294, 2295, 5, 117, 0, 0, 2295, 2296, 5, 115, 0, 0, 2296, 2297, 5, 116, 0, 0, 2297, 2298, 5, 111, 0, 0, 2298, 2299, 5, 109, 0, 0, 2299, 406, 1, 0, 0, 0, 2300, 2301, 5, 102, 0, 0, 2301, 2302, 5, 105, 0, 0, 2302, 2303, 5, 120, 0, 0, 2303, 2304, 5, 101, 0, 0, 2304, 2305, 5, 100, 0, 0, 2305, 408, 1, 0, 0, 0, 2306, 2307, 5, 115, 0, 0, 2307, 2308, 5, 121, 0, 0, 2308, 2309, 5, 115, 0, 0, 2309, 2310, 5, 116, 0, 0, 2310, 2311, 5, 114, 0, 0, 2311, 2312, 5, 105, 0, 0, 2312, 2313, 5, 110, 0, 0, 2313, 2314, 5, 103, 0, 0, 2314, 410, 1, 0, 0, 0, 2315, 2316, 5, 97, 0, 0, 2316, 2317, 5, 114, 0, 0, 2317, 2318, 5, 114, 0, 0, 2318, 2319, 5, 97, 0, 0, 2319, 2320, 5, 121, 0, 0, 2320, 412, 1, 0, 0, 0, 2321, 2322, 5, 118, 0, 0, 2322, 2323, 5, 97, 0, 0, 2323, 2324, 5, 114, 0, 0, 2324, 2325, 5, 105, 0, 0, 2325, 2326, 5, 97, 0, 0, 2326, 2327, 5, 110, 0, 0, 2327, 2328, 5, 116, 0, 0, 2328, 414, 1, 0, 0, 0, 2329, 2330, 5, 99, 0, 0, 2330, 2331, 5, 117, 0, 0, 2331, 2332, 5, 114, 0, 0, 2332, 2333, 5, 114, 0, 0, 2333, 2334, 5, 101, 0, 0, 2334, 2335, 5, 110, 0, 0, 2335, 2336, 5, 99, 0, 0, 2336, 2337, 5, 121, 0, 0, 2337, 416, 1, 0, 0, 0, 2338, 2339, 5, 115, 0, 0, 2339, 2340, 5, 121, 0, 0, 2340, 2341, 5, 115, 0, 0, 2341, 2342, 5, 99, 0, 0, 2342, 2343, 5, 104, 0, 0, 2343, 2344, 5, 97, 0, 0, 2344, 2345, 5, 114, 0, 0, 2345, 418, 1, 0, 0, 0, 2346, 2347, 5, 101, 0, 0, 2347, 2348, 5, 114, 0, 0, 2348, 2349, 5, 114, 0, 0, 2349, 2350, 5, 111, 0, 0, 2350, 2351, 5, 114, 0, 0, 2351, 420, 1, 0, 0, 0, 2352, 2353, 5, 100, 0, 0, 2353, 2354, 5, 101, 0, 0, 2354, 2355, 5, 99, 0, 0, 2355, 2356, 5, 105, 0, 0, 2356, 2357, 5, 109, 0, 0, 2357, 2358, 5, 97, 0, 0, 2358, 2359, 5, 108, 0, 0, 2359, 422, 1, 0, 0, 0, 2360, 2361, 5, 100, 0, 0, 2361, 2362, 5, 97, 0, 0, 2362, 2363, 5, 116, 0, 0, 2363, 2364, 5, 101, 0, 0, 2364, 424, 1, 0, 0, 0, 2365, 2366, 5, 98, 0, 0, 2366, 2367, 5, 115, 0, 0, 2367, 2368, 5, 116, 0, 0, 2368, 2369, 5, 114, 0, 0, 2369, 426, 1, 0, 0, 0, 2370, 2371, 5, 108, 0, 0, 2371, 2372, 5, 112, 0, 0, 2372, 2373, 5, 115, 0, 0, 2373, 2374, 5, 116, 0, 0, 2374, 2375, 5, 114, 0, 0, 2375, 428, 1, 0, 0, 0, 2376, 2377, 5, 108, 0, 0, 2377, 2378, 5, 112, 0, 0, 2378, 2379, 5, 119, 0, 0, 2379, 2380, 5, 115, 0, 0, 2380, 2381, 5, 116, 0, 0, 2381, 2382, 5, 114, 0, 0, 2382, 430, 1, 0, 0, 0, 2383, 2384, 5, 108, 0, 0, 2384, 2385, 5, 112, 0, 0, 2385, 2386, 5, 116, 0, 0, 2386, 2387, 5, 115, 0, 0, 2387, 2388, 5, 116, 0, 0, 2388, 2389, 5, 114, 0, 0, 2389, 432, 1, 0, 0, 0, 2390, 2391, 5, 111, 0, 0, 2391, 2392, 5, 98, 0, 0, 2392, 2393, 5, 106, 0, 0, 2393, 2394, 5, 101, 0, 0, 2394, 2395, 5, 99, 0, 0, 2395, 2396, 5, 116, 0, 0, 2396, 2397, 5, 114, 0, 0, 2397, 2398, 5, 101, 0, 0, 2398, 2399, 5, 102, 0, 0, 2399, 434, 1, 0, 0, 0, 2400, 2401, 5, 105, 0, 0, 2401, 2402, 5, 117, 0, 0, 2402, 2403, 5, 110, 0, 0, 2403, 2404, 5, 107, 0, 0, 2404, 2405, 5, 110, 0, 0, 2405, 2406, 5, 111, 0, 0, 2406, 2407, 5, 119, 0, 0, 2407, 2408, 5, 110, 0, 0, 2408, 436, 1, 0, 0, 0, 2409, 2410, 5, 105, 0, 0, 2410, 2411, 5, 100, 0, 0, 2411, 2412, 5, 105, 0, 0, 2412, 2413, 5, 115, 0, 0, 2413, 2414, 5, 112, 0, 0, 2414, 2415, 5, 97, 0, 0, 2415, 2416, 5, 116, 0, 0, 2416, 2417, 5, 99, 0, 0, 2417, 2418, 5, 104, 0, 0, 2418, 438, 1, 0, 0, 0, 2419, 2420, 5, 115, 0, 0, 2420, 2421, 5, 116, 0, 0, 2421, 2422, 5, 114, 0, 0, 2422, 2423, 5, 117, 0, 0, 2423, 2424, 5, 99, 0, 0, 2424, 2425, 5, 116, 0, 0, 2425, 440, 1, 0, 0, 0, 2426, 2427, 5, 105, 0, 0, 2427, 2428, 5, 110, 0, 0, 2428, 2429, 5, 116, 0, 0, 2429, 2430, 5, 101, 0, 0, 2430, 2431, 5, 114, 0, 0, 2431, 2432, 5, 102, 0, 0, 2432, 2433, 5, 97, 0, 0, 2433, 2434, 5, 99, 0, 0, 2434, 2435, 5, 101, 0, 0, 2435, 442, 1, 0, 0, 0, 2436, 2437, 5, 115, 0, 0, 2437, 2438, 5, 97, 0, 0, 2438, 2439, 5, 102, 0, 0, 2439, 2440, 5, 101, 0, 0, 2440, 2441, 5, 97, 0, 0, 2441, 2442, 5, 114, 0, 0, 2442, 2443, 5, 114, 0, 0, 2443, 2444, 5, 97, 0, 0, 2444, 2445, 5, 121, 0, 0, 2445, 444, 1, 0, 0, 0, 2446, 2447, 5, 98, 0, 0, 2447, 2448, 5, 121, 0, 0, 2448, 2449, 5, 118, 0, 0, 2449, 2450, 5, 97, 0, 0, 2450, 2451, 5, 108, 0, 0, 2451, 2452, 5, 115, 0, 0, 2452, 2453, 5, 116, 0, 0, 2453, 2454, 5, 114, 0, 0, 2454, 446, 1, 0, 0, 0, 2455, 2456, 5, 97, 0, 0, 2456, 2457, 5, 110, 0, 0, 2457, 2458, 5, 115, 0, 0, 2458, 2459, 5, 105, 0, 0, 2459, 448, 1, 0, 0, 0, 2460, 2461, 5, 116, 0, 0, 2461, 2462, 5, 98, 0, 0, 2462, 2463, 5, 115, 0, 0, 2463, 2464, 5, 116, 0, 0, 2464, 2465, 5, 114, 0, 0, 2465, 450, 1, 0, 0, 0, 2466, 2467, 5, 109, 0, 0, 2467, 2468, 5, 101, 0, 0, 2468, 2469, 5, 116, 0, 0, 2469, 2470, 5, 104, 0, 0, 2470, 2471, 5, 111, 0, 0, 2471, 2472, 5, 100, 0, 0, 2472, 452, 1, 0, 0, 0, 2473, 2474, 5, 97, 0, 0, 2474, 2475, 5, 110, 0, 0, 2475, 2476, 5, 121, 0, 0, 2476, 454, 1, 0, 0, 0, 2477, 2478, 5, 108, 0, 0, 2478, 2479, 5, 112, 0, 0, 2479, 2480, 5, 115, 0, 0, 2480, 2481, 5, 116, 0, 0, 2481, 2482, 5, 114, 0, 0, 2482, 2483, 5, 117, 0, 0, 2483, 2484, 5, 99, 0, 0, 2484, 2485, 5, 116, 0, 0, 2485, 456, 1, 0, 0, 0, 2486, 2487, 5, 118, 0, 0, 2487, 2488, 5, 101, 0, 0, 2488, 2489, 5, 99, 0, 0, 2489, 2490, 5, 116, 0, 0, 2490, 2491, 5, 111, 0, 0, 2491, 2492, 5, 114, 0, 0, 2492, 458, 1, 0, 0, 0, 2493, 2494, 5, 104, 0, 0, 2494, 2495, 5, 114, 0, 0, 2495, 2496, 5, 101, 0, 0, 2496, 2497, 5, 115, 0, 0, 2497, 2498, 5, 117, 0, 0, 2498, 2499, 5, 108, 0, 0, 2499, 2500, 5, 116, 0, 0, 2500, 460, 1, 0, 0, 0, 2501, 2502, 5, 99, 0, 0, 2502, 2503, 5, 97, 0, 0, 2503, 2504, 5, 114, 0, 0, 2504, 2505, 5, 114, 0, 0, 2505, 2506, 5, 97, 0, 0, 2506, 2507, 5, 121, 0, 0, 2507, 462, 1, 0, 0, 0, 2508, 2509, 5, 117, 0, 0, 2509, 2510, 5, 115, 0, 0, 2510, 2511, 5, 101, 0, 0, 2511, 2512, 5, 114, 0, 0, 2512, 2513, 5, 100, 0, 0, 2513, 2514, 5, 101, 0, 0, 2514, 2515, 5, 102, 0, 0, 2515, 2516, 5, 105, 0, 0, 2516, 2517, 5, 110, 0, 0, 2517, 2518, 5, 101, 0, 0, 2518, 2519, 5, 100, 0, 0, 2519, 464, 1, 0, 0, 0, 2520, 2521, 5, 114, 0, 0, 2521, 2522, 5, 101, 0, 0, 2522, 2523, 5, 99, 0, 0, 2523, 2524, 5, 111, 0, 0, 2524, 2525, 5, 114, 0, 0, 2525, 2526, 5, 100, 0, 0, 2526, 466, 1, 0, 0, 0, 2527, 2528, 5, 102, 0, 0, 2528, 2529, 5, 105, 0, 0, 2529, 2530, 5, 108, 0, 0, 2530, 2531, 5, 101, 0, 0, 2531, 2532, 5, 116, 0, 0, 2532, 2533, 5, 105, 0, 0, 2533, 2534, 5, 109, 0, 0, 2534, 2535, 5, 101, 0, 0, 2535, 468, 1, 0, 0, 0, 2536, 2537, 5, 98, 0, 0, 2537, 2538, 5, 108, 0, 0, 2538, 2539, 5, 111, 0, 0, 2539, 2540, 5, 98, 0, 0, 2540, 470, 1, 0, 0, 0, 2541, 2542, 5, 115, 0, 0, 2542, 2543, 5, 116, 0, 0, 2543, 2544, 5, 114, 0, 0, 2544, 2545, 5, 101, 0, 0, 2545, 2546, 5, 97, 0, 0, 2546, 2547, 5, 109, 0, 0, 2547, 472, 1, 0, 0, 0, 2548, 2549, 5, 115, 0, 0, 2549, 2550, 5, 116, 0, 0, 2550, 2551, 5, 111, 0, 0, 2551, 2552, 5, 114, 0, 0, 2552, 2553, 5, 97, 0, 0, 2553, 2554, 5, 103, 0, 0, 2554, 2555, 5, 101, 0, 0, 2555, 474, 1, 0, 0, 0, 2556, 2557, 5, 115, 0, 0, 2557, 2558, 5, 116, 0, 0, 2558, 2559, 5, 114, 0, 0, 2559, 2560, 5, 101, 0, 0, 2560, 2561, 5, 97, 0, 0, 2561, 2562, 5, 109, 0, 0, 2562, 2563, 5, 101, 0, 0, 2563, 2564, 5, 100, 0, 0, 2564, 2565, 5, 95, 0, 0, 2565, 2566, 5, 111, 0, 0, 2566, 2567, 5, 98, 0, 0, 2567, 2568, 5, 106, 0, 0, 2568, 2569, 5, 101, 0, 0, 2569, 2570, 5, 99, 0, 0, 2570, 2571, 5, 116, 0, 0, 2571, 476, 1, 0, 0, 0, 2572, 2573, 5, 115, 0, 0, 2573, 2574, 5, 116, 0, 0, 2574, 2575, 5, 111, 0, 0, 2575, 2576, 5, 114, 0, 0, 2576, 2577, 5, 101, 0, 0, 2577, 2578, 5, 100, 0, 0, 2578, 2579, 5, 95, 0, 0, 2579, 2580, 5, 111, 0, 0, 2580, 2581, 5, 98, 0, 0, 2581, 2582, 5, 106, 0, 0, 2582, 2583, 5, 101, 0, 0, 2583, 2584, 5, 99, 0, 0, 2584, 2585, 5, 116, 0, 0, 2585, 478, 1, 0, 0, 0, 2586, 2587, 5, 98, 0, 0, 2587, 2588, 5, 108, 0, 0, 2588, 2589, 5, 111, 0, 0, 2589, 2590, 5, 98, 0, 0, 2590, 2591, 5, 95, 0, 0, 2591, 2592, 5, 111, 0, 0, 2592, 2593, 5, 98, 0, 0, 2593, 2594, 5, 106, 0, 0, 2594, 2595, 5, 101, 0, 0, 2595, 2596, 5, 99, 0, 0, 2596, 2597, 5, 116, 0, 0, 2597, 480, 1, 0, 0, 0, 2598, 2599, 5, 99, 0, 0, 2599, 2600, 5, 102, 0, 0, 2600, 482, 1, 0, 0, 0, 2601, 2602, 5, 99, 0, 0, 2602, 2603, 5, 108, 0, 0, 2603, 2604, 5, 115, 0, 0, 2604, 2605, 5, 105, 0, 0, 2605, 2606, 5, 100, 0, 0, 2606, 484, 1, 0, 0, 0, 2607, 2608, 5, 105, 0, 0, 2608, 2609, 5, 110, 0, 0, 2609, 2610, 5, 115, 0, 0, 2610, 2611, 5, 116, 0, 0, 2611, 2612, 5, 97, 0, 0, 2612, 2613, 5, 110, 0, 0, 2613, 2614, 5, 99, 0, 0, 2614, 2615, 5, 101, 0, 0, 2615, 486, 1, 0, 0, 0, 2616, 2617, 5, 101, 0, 0, 2617, 2618, 5, 120, 0, 0, 2618, 2619, 5, 112, 0, 0, 2619, 2620, 5, 108, 0, 0, 2620, 2621, 5, 105, 0, 0, 2621, 2622, 5, 99, 0, 0, 2622, 2623, 5, 105, 0, 0, 2623, 2624, 5, 116, 0, 0, 2624, 488, 1, 0, 0, 0, 2625, 2626, 5, 100, 0, 0, 2626, 2627, 5, 101, 0, 0, 2627, 2628, 5, 102, 0, 0, 2628, 2629, 5, 97, 0, 0, 2629, 2630, 5, 117, 0, 0, 2630, 2631, 5, 108, 0, 0, 2631, 2632, 5, 116, 0, 0, 2632, 490, 1, 0, 0, 0, 2633, 2634, 5, 118, 0, 0, 2634, 2635, 5, 97, 0, 0, 2635, 2636, 5, 114, 0, 0, 2636, 2637, 5, 97, 0, 0, 2637, 2638, 5, 114, 0, 0, 2638, 2639, 5, 103, 0, 0, 2639, 492, 1, 0, 0, 0, 2640, 2641, 5, 117, 0, 0, 2641, 2642, 5, 110, 0, 0, 2642, 2643, 5, 109, 0, 0, 2643, 2644, 5, 97, 0, 0, 2644, 2645, 5, 110, 0, 0, 2645, 2646, 5, 97, 0, 0, 2646, 2647, 5, 103, 0, 0, 2647, 2648, 5, 101, 0, 0, 2648, 2649, 5, 100, 0, 0, 2649, 494, 1, 0, 0, 0, 2650, 2651, 5, 99, 0, 0, 2651, 2652, 5, 100, 0, 0, 2652, 2653, 5, 101, 0, 0, 2653, 2654, 5, 99, 0, 0, 2654, 2655, 5, 108, 0, 0, 2655, 496, 1, 0, 0, 0, 2656, 2657, 5, 115, 0, 0, 2657, 2658, 5, 116, 0, 0, 2658, 2659, 5, 100, 0, 0, 2659, 2660, 5, 99, 0, 0, 2660, 2661, 5, 97, 0, 0, 2661, 2662, 5, 108, 0, 0, 2662, 2663, 5, 108, 0, 0, 2663, 498, 1, 0, 0, 0, 2664, 2665, 5, 116, 0, 0, 2665, 2666, 5, 104, 0, 0, 2666, 2667, 5, 105, 0, 0, 2667, 2668, 5, 115, 0, 0, 2668, 2669, 5, 99, 0, 0, 2669, 2670, 5, 97, 0, 0, 2670, 2671, 5, 108, 0, 0, 2671, 2672, 5, 108, 0, 0, 2672, 500, 1, 0, 0, 0, 2673, 2674, 5, 102, 0, 0, 2674, 2675, 5, 97, 0, 0, 2675, 2676, 5, 115, 0, 0, 2676, 2677, 5, 116, 0, 0, 2677, 2678, 5, 99, 0, 0, 2678, 2679, 5, 97, 0, 0, 2679, 2680, 5, 108, 0, 0, 2680, 2681, 5, 108, 0, 0, 2681, 502, 1, 0, 0, 0, 2682, 2683, 5, 33, 0, 0, 2683, 504, 1, 0, 0, 0, 2684, 2685, 5, 33, 0, 0, 2685, 2686, 5, 33, 0, 0, 2686, 506, 1, 0, 0, 0, 2687, 2688, 5, 116, 0, 0, 2688, 2689, 5, 121, 0, 0, 2689, 2690, 5, 112, 0, 0, 2690, 2691, 5, 101, 0, 0, 2691, 2692, 5, 100, 0, 0, 2692, 2693, 5, 114, 0, 0, 2693, 2694, 5, 101, 0, 0, 2694, 2702, 5, 102, 0, 0, 2695, 2696, 5, 114, 0, 0, 2696, 2697, 5, 101, 0, 0, 2697, 2698, 5, 102, 0, 0, 2698, 2699, 5, 97, 0, 0, 2699, 2700, 5, 110, 0, 0, 2700, 2702, 5, 121, 0, 0, 2701, 2687, 1, 0, 0, 0, 2701, 2695, 1, 0, 0, 0, 2702, 508, 1, 0, 0, 0, 2703, 2704, 5, 46, 0, 0, 2704, 2705, 5, 112, 0, 0, 2705, 2706, 5, 97, 0, 0, 2706, 2707, 5, 114, 0, 0, 2707, 2708, 5, 97, 0, 0, 2708, 2709, 5, 109, 0, 0, 2709, 510, 1, 0, 0, 0, 2710, 2711, 5, 99, 0, 0, 2711, 2712, 5, 111, 0, 0, 2712, 2713, 5, 110, 0, 0, 2713, 2714, 5, 115, 0, 0, 2714, 2715, 5, 116, 0, 0, 2715, 2716, 5, 114, 0, 0, 2716, 2717, 5, 97, 0, 0, 2717, 2718, 5, 105, 0, 0, 2718, 2719, 5, 110, 0, 0, 2719, 2720, 5, 116, 0, 0, 2720, 512, 1, 0, 0, 0, 2721, 2722, 5, 46, 0, 0, 2722, 2723, 5, 116, 0, 0, 2723, 2724, 5, 104, 0, 0, 2724, 2725, 5, 105, 0, 0, 2725, 2726, 5, 115, 0, 0, 2726, 514, 1, 0, 0, 0, 2727, 2728, 5, 46, 0, 0, 2728, 2729, 5, 98, 0, 0, 2729, 2730, 5, 97, 0, 0, 2730, 2731, 5, 115, 0, 0, 2731, 2732, 5, 101, 0, 0, 2732, 516, 1, 0, 0, 0, 2733, 2734, 5, 46, 0, 0, 2734, 2735, 5, 110, 0, 0, 2735, 2736, 5, 101, 0, 0, 2736, 2737, 5, 115, 0, 0, 2737, 2738, 5, 116, 0, 0, 2738, 2739, 5, 101, 0, 0, 2739, 2740, 5, 114, 0, 0, 2740, 518, 1, 0, 0, 0, 2741, 2742, 5, 38, 0, 0, 2742, 520, 1, 0, 0, 0, 2743, 2744, 5, 91, 0, 0, 2744, 2745, 5, 93, 0, 0, 2745, 522, 1, 0, 0, 0, 2746, 2747, 5, 42, 0, 0, 2747, 524, 1, 0, 0, 0, 2748, 2761, 5, 92, 0, 0, 2749, 2762, 7, 4, 0, 0, 2750, 2752, 7, 5, 0, 0, 2751, 2753, 7, 5, 0, 0, 2752, 2751, 1, 0, 0, 0, 2752, 2753, 1, 0, 0, 0, 2753, 2755, 1, 0, 0, 0, 2754, 2756, 7, 5, 0, 0, 2755, 2754, 1, 0, 0, 0, 2755, 2756, 1, 0, 0, 0, 2756, 2762, 1, 0, 0, 0, 2757, 2759, 5, 13, 0, 0, 2758, 2757, 1, 0, 0, 0, 2758, 2759, 1, 0, 0, 0, 2759, 2760, 1, 0, 0, 0, 2760, 2762, 5, 10, 0, 0, 2761, 2749, 1, 0, 0, 0, 2761, 2750, 1, 0, 0, 0, 2761, 2758, 1, 0, 0, 0, 2762, 526, 1, 0, 0, 0, 2763, 2768, 5, 34, 0, 0, 2764, 2767, 8, 6, 0, 0, 2765, 2767, 3, 525, 262, 0, 2766, 2764, 1, 0, 0, 0, 2766, 2765, 1, 0, 0, 0, 2767, 2770, 1, 0, 0, 0, 2768, 2766, 1, 0, 0, 0, 2768, 2769, 1, 0, 0, 0, 2769, 2771, 1, 0, 0, 0, 2770, 2768, 1, 0, 0, 0, 2771, 2772, 5, 34, 0, 0, 2772, 528, 1, 0, 0, 0, 2773, 2778, 5, 39, 0, 0, 2774, 2777, 8, 7, 0, 0, 2775, 2777, 3, 525, 262, 0, 2776, 2774, 1, 0, 0, 0, 2776, 2775, 1, 0, 0, 0, 2777, 2780, 1, 0, 0, 0, 2778, 2776, 1, 0, 0, 0, 2778, 2779, 1, 0, 0, 0, 2779, 2781, 1, 0, 0, 0, 2780, 2778, 1, 0, 0, 0, 2781, 2782, 5, 39, 0, 0, 2782, 530, 1, 0, 0, 0, 2783, 2784, 5, 46, 0, 0, 2784, 532, 1, 0, 0, 0, 2785, 2786, 5, 43, 0, 0, 2786, 534, 1, 0, 0, 0, 2787, 2788, 5, 35, 0, 0, 2788, 2789, 5, 100, 0, 0, 2789, 2790, 5, 101, 0, 0, 2790, 2791, 5, 102, 0, 0, 2791, 2792, 5, 105, 0, 0, 2792, 2793, 5, 110, 0, 0, 2793, 2794, 5, 101, 0, 0, 2794, 536, 1, 0, 0, 0, 2795, 2796, 5, 35, 0, 0, 2796, 2797, 5, 117, 0, 0, 2797, 2798, 5, 110, 0, 0, 2798, 2799, 5, 100, 0, 0, 2799, 2800, 5, 101, 0, 0, 2800, 2801, 5, 102, 0, 0, 2801, 538, 1, 0, 0, 0, 2802, 2803, 5, 35, 0, 0, 2803, 2804, 5, 105, 0, 0, 2804, 2805, 5, 102, 0, 0, 2805, 2806, 5, 100, 0, 0, 2806, 2807, 5, 101, 0, 0, 2807, 2808, 5, 102, 0, 0, 2808, 540, 1, 0, 0, 0, 2809, 2810, 5, 35, 0, 0, 2810, 2811, 5, 105, 0, 0, 2811, 2812, 5, 102, 0, 0, 2812, 2813, 5, 110, 0, 0, 2813, 2814, 5, 100, 0, 0, 2814, 2815, 5, 101, 0, 0, 2815, 2816, 5, 102, 0, 0, 2816, 542, 1, 0, 0, 0, 2817, 2818, 5, 35, 0, 0, 2818, 2819, 5, 101, 0, 0, 2819, 2820, 5, 108, 0, 0, 2820, 2821, 5, 115, 0, 0, 2821, 2822, 5, 101, 0, 0, 2822, 544, 1, 0, 0, 0, 2823, 2824, 5, 35, 0, 0, 2824, 2825, 5, 101, 0, 0, 2825, 2826, 5, 110, 0, 0, 2826, 2827, 5, 100, 0, 0, 2827, 2828, 5, 105, 0, 0, 2828, 2829, 5, 102, 0, 0, 2829, 546, 1, 0, 0, 0, 2830, 2831, 5, 35, 0, 0, 2831, 2832, 5, 105, 0, 0, 2832, 2833, 5, 110, 0, 0, 2833, 2834, 5, 99, 0, 0, 2834, 2835, 5, 108, 0, 0, 2835, 2836, 5, 117, 0, 0, 2836, 2837, 5, 100, 0, 0, 2837, 2838, 5, 101, 0, 0, 2838, 548, 1, 0, 0, 0, 2839, 2840, 5, 46, 0, 0, 2840, 2841, 5, 109, 0, 0, 2841, 2842, 5, 114, 0, 0, 2842, 2843, 5, 101, 0, 0, 2843, 2844, 5, 115, 0, 0, 2844, 2845, 5, 111, 0, 0, 2845, 2846, 5, 117, 0, 0, 2846, 2847, 5, 114, 0, 0, 2847, 2848, 5, 99, 0, 0, 2848, 2849, 5, 101, 0, 0, 2849, 550, 1, 0, 0, 0, 2850, 2851, 5, 110, 0, 0, 2851, 2852, 5, 111, 0, 0, 2852, 4033, 5, 112, 0, 0, 2853, 2854, 5, 98, 0, 0, 2854, 2855, 5, 114, 0, 0, 2855, 2856, 5, 101, 0, 0, 2856, 2857, 5, 97, 0, 0, 2857, 4033, 5, 107, 0, 0, 2858, 2859, 5, 108, 0, 0, 2859, 2860, 5, 100, 0, 0, 2860, 2861, 5, 97, 0, 0, 2861, 2862, 5, 114, 0, 0, 2862, 2863, 5, 103, 0, 0, 2863, 2864, 5, 46, 0, 0, 2864, 4033, 5, 48, 0, 0, 2865, 2866, 5, 108, 0, 0, 2866, 2867, 5, 100, 0, 0, 2867, 2868, 5, 97, 0, 0, 2868, 2869, 5, 114, 0, 0, 2869, 2870, 5, 103, 0, 0, 2870, 2871, 5, 46, 0, 0, 2871, 4033, 5, 49, 0, 0, 2872, 2873, 5, 108, 0, 0, 2873, 2874, 5, 100, 0, 0, 2874, 2875, 5, 97, 0, 0, 2875, 2876, 5, 114, 0, 0, 2876, 2877, 5, 103, 0, 0, 2877, 2878, 5, 46, 0, 0, 2878, 4033, 5, 50, 0, 0, 2879, 2880, 5, 108, 0, 0, 2880, 2881, 5, 100, 0, 0, 2881, 2882, 5, 97, 0, 0, 2882, 2883, 5, 114, 0, 0, 2883, 2884, 5, 103, 0, 0, 2884, 2885, 5, 46, 0, 0, 2885, 4033, 5, 51, 0, 0, 2886, 2887, 5, 108, 0, 0, 2887, 2888, 5, 100, 0, 0, 2888, 2889, 5, 108, 0, 0, 2889, 2890, 5, 111, 0, 0, 2890, 2891, 5, 99, 0, 0, 2891, 2892, 5, 46, 0, 0, 2892, 4033, 5, 48, 0, 0, 2893, 2894, 5, 108, 0, 0, 2894, 2895, 5, 100, 0, 0, 2895, 2896, 5, 108, 0, 0, 2896, 2897, 5, 111, 0, 0, 2897, 2898, 5, 99, 0, 0, 2898, 2899, 5, 46, 0, 0, 2899, 4033, 5, 49, 0, 0, 2900, 2901, 5, 108, 0, 0, 2901, 2902, 5, 100, 0, 0, 2902, 2903, 5, 108, 0, 0, 2903, 2904, 5, 111, 0, 0, 2904, 2905, 5, 99, 0, 0, 2905, 2906, 5, 46, 0, 0, 2906, 4033, 5, 50, 0, 0, 2907, 2908, 5, 108, 0, 0, 2908, 2909, 5, 100, 0, 0, 2909, 2910, 5, 108, 0, 0, 2910, 2911, 5, 111, 0, 0, 2911, 2912, 5, 99, 0, 0, 2912, 2913, 5, 46, 0, 0, 2913, 4033, 5, 51, 0, 0, 2914, 2915, 5, 115, 0, 0, 2915, 2916, 5, 116, 0, 0, 2916, 2917, 5, 108, 0, 0, 2917, 2918, 5, 111, 0, 0, 2918, 2919, 5, 99, 0, 0, 2919, 2920, 5, 46, 0, 0, 2920, 4033, 5, 48, 0, 0, 2921, 2922, 5, 115, 0, 0, 2922, 2923, 5, 116, 0, 0, 2923, 2924, 5, 108, 0, 0, 2924, 2925, 5, 111, 0, 0, 2925, 2926, 5, 99, 0, 0, 2926, 2927, 5, 46, 0, 0, 2927, 4033, 5, 49, 0, 0, 2928, 2929, 5, 115, 0, 0, 2929, 2930, 5, 116, 0, 0, 2930, 2931, 5, 108, 0, 0, 2931, 2932, 5, 111, 0, 0, 2932, 2933, 5, 99, 0, 0, 2933, 2934, 5, 46, 0, 0, 2934, 4033, 5, 50, 0, 0, 2935, 2936, 5, 115, 0, 0, 2936, 2937, 5, 116, 0, 0, 2937, 2938, 5, 108, 0, 0, 2938, 2939, 5, 111, 0, 0, 2939, 2940, 5, 99, 0, 0, 2940, 2941, 5, 46, 0, 0, 2941, 4033, 5, 51, 0, 0, 2942, 2943, 5, 108, 0, 0, 2943, 2944, 5, 100, 0, 0, 2944, 2945, 5, 110, 0, 0, 2945, 2946, 5, 117, 0, 0, 2946, 2947, 5, 108, 0, 0, 2947, 4033, 5, 108, 0, 0, 2948, 2949, 5, 108, 0, 0, 2949, 2950, 5, 100, 0, 0, 2950, 2951, 5, 99, 0, 0, 2951, 2952, 5, 46, 0, 0, 2952, 2953, 5, 105, 0, 0, 2953, 2954, 5, 52, 0, 0, 2954, 2955, 5, 46, 0, 0, 2955, 2956, 5, 109, 0, 0, 2956, 4033, 5, 49, 0, 0, 2957, 2958, 5, 108, 0, 0, 2958, 2959, 5, 100, 0, 0, 2959, 2960, 5, 99, 0, 0, 2960, 2961, 5, 46, 0, 0, 2961, 2962, 5, 105, 0, 0, 2962, 2963, 5, 52, 0, 0, 2963, 2964, 5, 46, 0, 0, 2964, 2965, 5, 77, 0, 0, 2965, 4033, 5, 49, 0, 0, 2966, 2967, 5, 108, 0, 0, 2967, 2968, 5, 100, 0, 0, 2968, 2969, 5, 99, 0, 0, 2969, 2970, 5, 46, 0, 0, 2970, 2971, 5, 105, 0, 0, 2971, 2972, 5, 52, 0, 0, 2972, 2973, 5, 46, 0, 0, 2973, 4033, 5, 48, 0, 0, 2974, 2975, 5, 108, 0, 0, 2975, 2976, 5, 100, 0, 0, 2976, 2977, 5, 99, 0, 0, 2977, 2978, 5, 46, 0, 0, 2978, 2979, 5, 105, 0, 0, 2979, 2980, 5, 52, 0, 0, 2980, 2981, 5, 46, 0, 0, 2981, 4033, 5, 49, 0, 0, 2982, 2983, 5, 108, 0, 0, 2983, 2984, 5, 100, 0, 0, 2984, 2985, 5, 99, 0, 0, 2985, 2986, 5, 46, 0, 0, 2986, 2987, 5, 105, 0, 0, 2987, 2988, 5, 52, 0, 0, 2988, 2989, 5, 46, 0, 0, 2989, 4033, 5, 50, 0, 0, 2990, 2991, 5, 108, 0, 0, 2991, 2992, 5, 100, 0, 0, 2992, 2993, 5, 99, 0, 0, 2993, 2994, 5, 46, 0, 0, 2994, 2995, 5, 105, 0, 0, 2995, 2996, 5, 52, 0, 0, 2996, 2997, 5, 46, 0, 0, 2997, 4033, 5, 51, 0, 0, 2998, 2999, 5, 108, 0, 0, 2999, 3000, 5, 100, 0, 0, 3000, 3001, 5, 99, 0, 0, 3001, 3002, 5, 46, 0, 0, 3002, 3003, 5, 105, 0, 0, 3003, 3004, 5, 52, 0, 0, 3004, 3005, 5, 46, 0, 0, 3005, 4033, 5, 52, 0, 0, 3006, 3007, 5, 108, 0, 0, 3007, 3008, 5, 100, 0, 0, 3008, 3009, 5, 99, 0, 0, 3009, 3010, 5, 46, 0, 0, 3010, 3011, 5, 105, 0, 0, 3011, 3012, 5, 52, 0, 0, 3012, 3013, 5, 46, 0, 0, 3013, 4033, 5, 53, 0, 0, 3014, 3015, 5, 108, 0, 0, 3015, 3016, 5, 100, 0, 0, 3016, 3017, 5, 99, 0, 0, 3017, 3018, 5, 46, 0, 0, 3018, 3019, 5, 105, 0, 0, 3019, 3020, 5, 52, 0, 0, 3020, 3021, 5, 46, 0, 0, 3021, 4033, 5, 54, 0, 0, 3022, 3023, 5, 108, 0, 0, 3023, 3024, 5, 100, 0, 0, 3024, 3025, 5, 99, 0, 0, 3025, 3026, 5, 46, 0, 0, 3026, 3027, 5, 105, 0, 0, 3027, 3028, 5, 52, 0, 0, 3028, 3029, 5, 46, 0, 0, 3029, 4033, 5, 55, 0, 0, 3030, 3031, 5, 108, 0, 0, 3031, 3032, 5, 100, 0, 0, 3032, 3033, 5, 99, 0, 0, 3033, 3034, 5, 46, 0, 0, 3034, 3035, 5, 105, 0, 0, 3035, 3036, 5, 52, 0, 0, 3036, 3037, 5, 46, 0, 0, 3037, 4033, 5, 56, 0, 0, 3038, 3039, 5, 100, 0, 0, 3039, 3040, 5, 117, 0, 0, 3040, 4033, 5, 112, 0, 0, 3041, 3042, 5, 112, 0, 0, 3042, 3043, 5, 111, 0, 0, 3043, 4033, 5, 112, 0, 0, 3044, 3045, 5, 114, 0, 0, 3045, 3046, 5, 101, 0, 0, 3046, 4033, 5, 116, 0, 0, 3047, 3048, 5, 108, 0, 0, 3048, 3049, 5, 100, 0, 0, 3049, 3050, 5, 105, 0, 0, 3050, 3051, 5, 110, 0, 0, 3051, 3052, 5, 100, 0, 0, 3052, 3053, 5, 46, 0, 0, 3053, 3054, 5, 105, 0, 0, 3054, 4033, 5, 49, 0, 0, 3055, 3056, 5, 108, 0, 0, 3056, 3057, 5, 100, 0, 0, 3057, 3058, 5, 105, 0, 0, 3058, 3059, 5, 110, 0, 0, 3059, 3060, 5, 100, 0, 0, 3060, 3061, 5, 46, 0, 0, 3061, 3062, 5, 117, 0, 0, 3062, 4033, 5, 49, 0, 0, 3063, 3064, 5, 108, 0, 0, 3064, 3065, 5, 100, 0, 0, 3065, 3066, 5, 105, 0, 0, 3066, 3067, 5, 110, 0, 0, 3067, 3068, 5, 100, 0, 0, 3068, 3069, 5, 46, 0, 0, 3069, 3070, 5, 105, 0, 0, 3070, 4033, 5, 50, 0, 0, 3071, 3072, 5, 108, 0, 0, 3072, 3073, 5, 100, 0, 0, 3073, 3074, 5, 105, 0, 0, 3074, 3075, 5, 110, 0, 0, 3075, 3076, 5, 100, 0, 0, 3076, 3077, 5, 46, 0, 0, 3077, 3078, 5, 117, 0, 0, 3078, 4033, 5, 50, 0, 0, 3079, 3080, 5, 108, 0, 0, 3080, 3081, 5, 100, 0, 0, 3081, 3082, 5, 105, 0, 0, 3082, 3083, 5, 110, 0, 0, 3083, 3084, 5, 100, 0, 0, 3084, 3085, 5, 46, 0, 0, 3085, 3086, 5, 105, 0, 0, 3086, 4033, 5, 52, 0, 0, 3087, 3088, 5, 108, 0, 0, 3088, 3089, 5, 100, 0, 0, 3089, 3090, 5, 105, 0, 0, 3090, 3091, 5, 110, 0, 0, 3091, 3092, 5, 100, 0, 0, 3092, 3093, 5, 46, 0, 0, 3093, 3094, 5, 117, 0, 0, 3094, 4033, 5, 52, 0, 0, 3095, 3096, 5, 108, 0, 0, 3096, 3097, 5, 100, 0, 0, 3097, 3098, 5, 105, 0, 0, 3098, 3099, 5, 110, 0, 0, 3099, 3100, 5, 100, 0, 0, 3100, 3101, 5, 46, 0, 0, 3101, 3102, 5, 105, 0, 0, 3102, 4033, 5, 56, 0, 0, 3103, 3104, 5, 108, 0, 0, 3104, 3105, 5, 100, 0, 0, 3105, 3106, 5, 105, 0, 0, 3106, 3107, 5, 110, 0, 0, 3107, 3108, 5, 100, 0, 0, 3108, 3109, 5, 46, 0, 0, 3109, 3110, 5, 117, 0, 0, 3110, 4033, 5, 56, 0, 0, 3111, 3112, 5, 108, 0, 0, 3112, 3113, 5, 100, 0, 0, 3113, 3114, 5, 105, 0, 0, 3114, 3115, 5, 110, 0, 0, 3115, 3116, 5, 100, 0, 0, 3116, 3117, 5, 46, 0, 0, 3117, 4033, 5, 105, 0, 0, 3118, 3119, 5, 108, 0, 0, 3119, 3120, 5, 100, 0, 0, 3120, 3121, 5, 105, 0, 0, 3121, 3122, 5, 110, 0, 0, 3122, 3123, 5, 100, 0, 0, 3123, 3124, 5, 46, 0, 0, 3124, 3125, 5, 114, 0, 0, 3125, 4033, 5, 52, 0, 0, 3126, 3127, 5, 108, 0, 0, 3127, 3128, 5, 100, 0, 0, 3128, 3129, 5, 105, 0, 0, 3129, 3130, 5, 110, 0, 0, 3130, 3131, 5, 100, 0, 0, 3131, 3132, 5, 46, 0, 0, 3132, 3133, 5, 114, 0, 0, 3133, 4033, 5, 56, 0, 0, 3134, 3135, 5, 108, 0, 0, 3135, 3136, 5, 100, 0, 0, 3136, 3137, 5, 105, 0, 0, 3137, 3138, 5, 110, 0, 0, 3138, 3139, 5, 100, 0, 0, 3139, 3140, 5, 46, 0, 0, 3140, 3141, 5, 114, 0, 0, 3141, 3142, 5, 101, 0, 0, 3142, 4033, 5, 102, 0, 0, 3143, 3144, 5, 115, 0, 0, 3144, 3145, 5, 116, 0, 0, 3145, 3146, 5, 105, 0, 0, 3146, 3147, 5, 110, 0, 0, 3147, 3148, 5, 100, 0, 0, 3148, 3149, 5, 46, 0, 0, 3149, 3150, 5, 114, 0, 0, 3150, 3151, 5, 101, 0, 0, 3151, 4033, 5, 102, 0, 0, 3152, 3153, 5, 115, 0, 0, 3153, 3154, 5, 116, 0, 0, 3154, 3155, 5, 105, 0, 0, 3155, 3156, 5, 110, 0, 0, 3156, 3157, 5, 100, 0, 0, 3157, 3158, 5, 46, 0, 0, 3158, 3159, 5, 105, 0, 0, 3159, 4033, 5, 49, 0, 0, 3160, 3161, 5, 115, 0, 0, 3161, 3162, 5, 116, 0, 0, 3162, 3163, 5, 105, 0, 0, 3163, 3164, 5, 110, 0, 0, 3164, 3165, 5, 100, 0, 0, 3165, 3166, 5, 46, 0, 0, 3166, 3167, 5, 105, 0, 0, 3167, 4033, 5, 50, 0, 0, 3168, 3169, 5, 115, 0, 0, 3169, 3170, 5, 116, 0, 0, 3170, 3171, 5, 105, 0, 0, 3171, 3172, 5, 110, 0, 0, 3172, 3173, 5, 100, 0, 0, 3173, 3174, 5, 46, 0, 0, 3174, 3175, 5, 105, 0, 0, 3175, 4033, 5, 52, 0, 0, 3176, 3177, 5, 115, 0, 0, 3177, 3178, 5, 116, 0, 0, 3178, 3179, 5, 105, 0, 0, 3179, 3180, 5, 110, 0, 0, 3180, 3181, 5, 100, 0, 0, 3181, 3182, 5, 46, 0, 0, 3182, 3183, 5, 105, 0, 0, 3183, 4033, 5, 56, 0, 0, 3184, 3185, 5, 115, 0, 0, 3185, 3186, 5, 116, 0, 0, 3186, 3187, 5, 105, 0, 0, 3187, 3188, 5, 110, 0, 0, 3188, 3189, 5, 100, 0, 0, 3189, 3190, 5, 46, 0, 0, 3190, 3191, 5, 114, 0, 0, 3191, 4033, 5, 52, 0, 0, 3192, 3193, 5, 115, 0, 0, 3193, 3194, 5, 116, 0, 0, 3194, 3195, 5, 105, 0, 0, 3195, 3196, 5, 110, 0, 0, 3196, 3197, 5, 100, 0, 0, 3197, 3198, 5, 46, 0, 0, 3198, 3199, 5, 114, 0, 0, 3199, 4033, 5, 56, 0, 0, 3200, 3201, 5, 97, 0, 0, 3201, 3202, 5, 100, 0, 0, 3202, 4033, 5, 100, 0, 0, 3203, 3204, 5, 115, 0, 0, 3204, 3205, 5, 117, 0, 0, 3205, 4033, 5, 98, 0, 0, 3206, 3207, 5, 109, 0, 0, 3207, 3208, 5, 117, 0, 0, 3208, 4033, 5, 108, 0, 0, 3209, 3210, 5, 100, 0, 0, 3210, 3211, 5, 105, 0, 0, 3211, 4033, 5, 118, 0, 0, 3212, 3213, 5, 100, 0, 0, 3213, 3214, 5, 105, 0, 0, 3214, 3215, 5, 118, 0, 0, 3215, 3216, 5, 46, 0, 0, 3216, 3217, 5, 117, 0, 0, 3217, 4033, 5, 110, 0, 0, 3218, 3219, 5, 114, 0, 0, 3219, 3220, 5, 101, 0, 0, 3220, 4033, 5, 109, 0, 0, 3221, 3222, 5, 114, 0, 0, 3222, 3223, 5, 101, 0, 0, 3223, 3224, 5, 109, 0, 0, 3224, 3225, 5, 46, 0, 0, 3225, 3226, 5, 117, 0, 0, 3226, 4033, 5, 110, 0, 0, 3227, 3228, 5, 97, 0, 0, 3228, 3229, 5, 110, 0, 0, 3229, 4033, 5, 100, 0, 0, 3230, 3231, 5, 111, 0, 0, 3231, 4033, 5, 114, 0, 0, 3232, 3233, 5, 120, 0, 0, 3233, 3234, 5, 111, 0, 0, 3234, 4033, 5, 114, 0, 0, 3235, 3236, 5, 115, 0, 0, 3236, 3237, 5, 104, 0, 0, 3237, 4033, 5, 108, 0, 0, 3238, 3239, 5, 115, 0, 0, 3239, 3240, 5, 104, 0, 0, 3240, 4033, 5, 114, 0, 0, 3241, 3242, 5, 115, 0, 0, 3242, 3243, 5, 104, 0, 0, 3243, 3244, 5, 114, 0, 0, 3244, 3245, 5, 46, 0, 0, 3245, 3246, 5, 117, 0, 0, 3246, 4033, 5, 110, 0, 0, 3247, 3248, 5, 110, 0, 0, 3248, 3249, 5, 101, 0, 0, 3249, 4033, 5, 103, 0, 0, 3250, 3251, 5, 110, 0, 0, 3251, 3252, 5, 111, 0, 0, 3252, 4033, 5, 116, 0, 0, 3253, 3254, 5, 99, 0, 0, 3254, 3255, 5, 111, 0, 0, 3255, 3256, 5, 110, 0, 0, 3256, 3257, 5, 118, 0, 0, 3257, 3258, 5, 46, 0, 0, 3258, 3259, 5, 105, 0, 0, 3259, 4033, 5, 49, 0, 0, 3260, 3261, 5, 99, 0, 0, 3261, 3262, 5, 111, 0, 0, 3262, 3263, 5, 110, 0, 0, 3263, 3264, 5, 118, 0, 0, 3264, 3265, 5, 46, 0, 0, 3265, 3266, 5, 105, 0, 0, 3266, 4033, 5, 50, 0, 0, 3267, 3268, 5, 99, 0, 0, 3268, 3269, 5, 111, 0, 0, 3269, 3270, 5, 110, 0, 0, 3270, 3271, 5, 118, 0, 0, 3271, 3272, 5, 46, 0, 0, 3272, 3273, 5, 105, 0, 0, 3273, 4033, 5, 52, 0, 0, 3274, 3275, 5, 99, 0, 0, 3275, 3276, 5, 111, 0, 0, 3276, 3277, 5, 110, 0, 0, 3277, 3278, 5, 118, 0, 0, 3278, 3279, 5, 46, 0, 0, 3279, 3280, 5, 105, 0, 0, 3280, 4033, 5, 56, 0, 0, 3281, 3282, 5, 99, 0, 0, 3282, 3283, 5, 111, 0, 0, 3283, 3284, 5, 110, 0, 0, 3284, 3285, 5, 118, 0, 0, 3285, 3286, 5, 46, 0, 0, 3286, 3287, 5, 114, 0, 0, 3287, 4033, 5, 52, 0, 0, 3288, 3289, 5, 99, 0, 0, 3289, 3290, 5, 111, 0, 0, 3290, 3291, 5, 110, 0, 0, 3291, 3292, 5, 118, 0, 0, 3292, 3293, 5, 46, 0, 0, 3293, 3294, 5, 114, 0, 0, 3294, 4033, 5, 56, 0, 0, 3295, 3296, 5, 99, 0, 0, 3296, 3297, 5, 111, 0, 0, 3297, 3298, 5, 110, 0, 0, 3298, 3299, 5, 118, 0, 0, 3299, 3300, 5, 46, 0, 0, 3300, 3301, 5, 117, 0, 0, 3301, 4033, 5, 52, 0, 0, 3302, 3303, 5, 99, 0, 0, 3303, 3304, 5, 111, 0, 0, 3304, 3305, 5, 110, 0, 0, 3305, 3306, 5, 118, 0, 0, 3306, 3307, 5, 46, 0, 0, 3307, 3308, 5, 117, 0, 0, 3308, 4033, 5, 56, 0, 0, 3309, 3310, 5, 99, 0, 0, 3310, 3311, 5, 111, 0, 0, 3311, 3312, 5, 110, 0, 0, 3312, 3313, 5, 118, 0, 0, 3313, 3314, 5, 46, 0, 0, 3314, 3315, 5, 114, 0, 0, 3315, 3316, 5, 46, 0, 0, 3316, 3317, 5, 117, 0, 0, 3317, 4033, 5, 110, 0, 0, 3318, 3319, 5, 116, 0, 0, 3319, 3320, 5, 104, 0, 0, 3320, 3321, 5, 114, 0, 0, 3321, 3322, 5, 111, 0, 0, 3322, 4033, 5, 119, 0, 0, 3323, 3324, 5, 99, 0, 0, 3324, 3325, 5, 111, 0, 0, 3325, 3326, 5, 110, 0, 0, 3326, 3327, 5, 118, 0, 0, 3327, 3328, 5, 46, 0, 0, 3328, 3329, 5, 111, 0, 0, 3329, 3330, 5, 118, 0, 0, 3330, 3331, 5, 102, 0, 0, 3331, 3332, 5, 46, 0, 0, 3332, 3333, 5, 105, 0, 0, 3333, 3334, 5, 49, 0, 0, 3334, 3335, 5, 46, 0, 0, 3335, 3336, 5, 117, 0, 0, 3336, 4033, 5, 110, 0, 0, 3337, 3338, 5, 99, 0, 0, 3338, 3339, 5, 111, 0, 0, 3339, 3340, 5, 110, 0, 0, 3340, 3341, 5, 118, 0, 0, 3341, 3342, 5, 46, 0, 0, 3342, 3343, 5, 111, 0, 0, 3343, 3344, 5, 118, 0, 0, 3344, 3345, 5, 102, 0, 0, 3345, 3346, 5, 46, 0, 0, 3346, 3347, 5, 105, 0, 0, 3347, 3348, 5, 50, 0, 0, 3348, 3349, 5, 46, 0, 0, 3349, 3350, 5, 117, 0, 0, 3350, 4033, 5, 110, 0, 0, 3351, 3352, 5, 99, 0, 0, 3352, 3353, 5, 111, 0, 0, 3353, 3354, 5, 110, 0, 0, 3354, 3355, 5, 118, 0, 0, 3355, 3356, 5, 46, 0, 0, 3356, 3357, 5, 111, 0, 0, 3357, 3358, 5, 118, 0, 0, 3358, 3359, 5, 102, 0, 0, 3359, 3360, 5, 46, 0, 0, 3360, 3361, 5, 105, 0, 0, 3361, 3362, 5, 52, 0, 0, 3362, 3363, 5, 46, 0, 0, 3363, 3364, 5, 117, 0, 0, 3364, 4033, 5, 110, 0, 0, 3365, 3366, 5, 99, 0, 0, 3366, 3367, 5, 111, 0, 0, 3367, 3368, 5, 110, 0, 0, 3368, 3369, 5, 118, 0, 0, 3369, 3370, 5, 46, 0, 0, 3370, 3371, 5, 111, 0, 0, 3371, 3372, 5, 118, 0, 0, 3372, 3373, 5, 102, 0, 0, 3373, 3374, 5, 46, 0, 0, 3374, 3375, 5, 105, 0, 0, 3375, 3376, 5, 56, 0, 0, 3376, 3377, 5, 46, 0, 0, 3377, 3378, 5, 117, 0, 0, 3378, 4033, 5, 110, 0, 0, 3379, 3380, 5, 99, 0, 0, 3380, 3381, 5, 111, 0, 0, 3381, 3382, 5, 110, 0, 0, 3382, 3383, 5, 118, 0, 0, 3383, 3384, 5, 46, 0, 0, 3384, 3385, 5, 111, 0, 0, 3385, 3386, 5, 118, 0, 0, 3386, 3387, 5, 102, 0, 0, 3387, 3388, 5, 46, 0, 0, 3388, 3389, 5, 117, 0, 0, 3389, 3390, 5, 49, 0, 0, 3390, 3391, 5, 46, 0, 0, 3391, 3392, 5, 117, 0, 0, 3392, 4033, 5, 110, 0, 0, 3393, 3394, 5, 99, 0, 0, 3394, 3395, 5, 111, 0, 0, 3395, 3396, 5, 110, 0, 0, 3396, 3397, 5, 118, 0, 0, 3397, 3398, 5, 46, 0, 0, 3398, 3399, 5, 111, 0, 0, 3399, 3400, 5, 118, 0, 0, 3400, 3401, 5, 102, 0, 0, 3401, 3402, 5, 46, 0, 0, 3402, 3403, 5, 117, 0, 0, 3403, 3404, 5, 50, 0, 0, 3404, 3405, 5, 46, 0, 0, 3405, 3406, 5, 117, 0, 0, 3406, 4033, 5, 110, 0, 0, 3407, 3408, 5, 99, 0, 0, 3408, 3409, 5, 111, 0, 0, 3409, 3410, 5, 110, 0, 0, 3410, 3411, 5, 118, 0, 0, 3411, 3412, 5, 46, 0, 0, 3412, 3413, 5, 111, 0, 0, 3413, 3414, 5, 118, 0, 0, 3414, 3415, 5, 102, 0, 0, 3415, 3416, 5, 46, 0, 0, 3416, 3417, 5, 117, 0, 0, 3417, 3418, 5, 52, 0, 0, 3418, 3419, 5, 46, 0, 0, 3419, 3420, 5, 117, 0, 0, 3420, 4033, 5, 110, 0, 0, 3421, 3422, 5, 99, 0, 0, 3422, 3423, 5, 111, 0, 0, 3423, 3424, 5, 110, 0, 0, 3424, 3425, 5, 118, 0, 0, 3425, 3426, 5, 46, 0, 0, 3426, 3427, 5, 111, 0, 0, 3427, 3428, 5, 118, 0, 0, 3428, 3429, 5, 102, 0, 0, 3429, 3430, 5, 46, 0, 0, 3430, 3431, 5, 117, 0, 0, 3431, 3432, 5, 56, 0, 0, 3432, 3433, 5, 46, 0, 0, 3433, 3434, 5, 117, 0, 0, 3434, 4033, 5, 110, 0, 0, 3435, 3436, 5, 99, 0, 0, 3436, 3437, 5, 111, 0, 0, 3437, 3438, 5, 110, 0, 0, 3438, 3439, 5, 118, 0, 0, 3439, 3440, 5, 46, 0, 0, 3440, 3441, 5, 111, 0, 0, 3441, 3442, 5, 118, 0, 0, 3442, 3443, 5, 102, 0, 0, 3443, 3444, 5, 46, 0, 0, 3444, 3445, 5, 105, 0, 0, 3445, 3446, 5, 46, 0, 0, 3446, 3447, 5, 117, 0, 0, 3447, 4033, 5, 110, 0, 0, 3448, 3449, 5, 99, 0, 0, 3449, 3450, 5, 111, 0, 0, 3450, 3451, 5, 110, 0, 0, 3451, 3452, 5, 118, 0, 0, 3452, 3453, 5, 46, 0, 0, 3453, 3454, 5, 111, 0, 0, 3454, 3455, 5, 118, 0, 0, 3455, 3456, 5, 102, 0, 0, 3456, 3457, 5, 46, 0, 0, 3457, 3458, 5, 117, 0, 0, 3458, 3459, 5, 46, 0, 0, 3459, 3460, 5, 117, 0, 0, 3460, 4033, 5, 110, 0, 0, 3461, 3462, 5, 108, 0, 0, 3462, 3463, 5, 100, 0, 0, 3463, 3464, 5, 108, 0, 0, 3464, 3465, 5, 101, 0, 0, 3465, 4033, 5, 110, 0, 0, 3466, 3467, 5, 108, 0, 0, 3467, 3468, 5, 100, 0, 0, 3468, 3469, 5, 101, 0, 0, 3469, 3470, 5, 108, 0, 0, 3470, 3471, 5, 101, 0, 0, 3471, 3472, 5, 109, 0, 0, 3472, 3473, 5, 46, 0, 0, 3473, 3474, 5, 105, 0, 0, 3474, 4033, 5, 49, 0, 0, 3475, 3476, 5, 108, 0, 0, 3476, 3477, 5, 100, 0, 0, 3477, 3478, 5, 101, 0, 0, 3478, 3479, 5, 108, 0, 0, 3479, 3480, 5, 101, 0, 0, 3480, 3481, 5, 109, 0, 0, 3481, 3482, 5, 46, 0, 0, 3482, 3483, 5, 117, 0, 0, 3483, 4033, 5, 49, 0, 0, 3484, 3485, 5, 108, 0, 0, 3485, 3486, 5, 100, 0, 0, 3486, 3487, 5, 101, 0, 0, 3487, 3488, 5, 108, 0, 0, 3488, 3489, 5, 101, 0, 0, 3489, 3490, 5, 109, 0, 0, 3490, 3491, 5, 46, 0, 0, 3491, 3492, 5, 105, 0, 0, 3492, 4033, 5, 50, 0, 0, 3493, 3494, 5, 108, 0, 0, 3494, 3495, 5, 100, 0, 0, 3495, 3496, 5, 101, 0, 0, 3496, 3497, 5, 108, 0, 0, 3497, 3498, 5, 101, 0, 0, 3498, 3499, 5, 109, 0, 0, 3499, 3500, 5, 46, 0, 0, 3500, 3501, 5, 117, 0, 0, 3501, 4033, 5, 50, 0, 0, 3502, 3503, 5, 108, 0, 0, 3503, 3504, 5, 100, 0, 0, 3504, 3505, 5, 101, 0, 0, 3505, 3506, 5, 108, 0, 0, 3506, 3507, 5, 101, 0, 0, 3507, 3508, 5, 109, 0, 0, 3508, 3509, 5, 46, 0, 0, 3509, 3510, 5, 105, 0, 0, 3510, 4033, 5, 52, 0, 0, 3511, 3512, 5, 108, 0, 0, 3512, 3513, 5, 100, 0, 0, 3513, 3514, 5, 101, 0, 0, 3514, 3515, 5, 108, 0, 0, 3515, 3516, 5, 101, 0, 0, 3516, 3517, 5, 109, 0, 0, 3517, 3518, 5, 46, 0, 0, 3518, 3519, 5, 117, 0, 0, 3519, 4033, 5, 52, 0, 0, 3520, 3521, 5, 108, 0, 0, 3521, 3522, 5, 100, 0, 0, 3522, 3523, 5, 101, 0, 0, 3523, 3524, 5, 108, 0, 0, 3524, 3525, 5, 101, 0, 0, 3525, 3526, 5, 109, 0, 0, 3526, 3527, 5, 46, 0, 0, 3527, 3528, 5, 105, 0, 0, 3528, 4033, 5, 56, 0, 0, 3529, 3530, 5, 108, 0, 0, 3530, 3531, 5, 100, 0, 0, 3531, 3532, 5, 101, 0, 0, 3532, 3533, 5, 108, 0, 0, 3533, 3534, 5, 101, 0, 0, 3534, 3535, 5, 109, 0, 0, 3535, 3536, 5, 46, 0, 0, 3536, 3537, 5, 117, 0, 0, 3537, 4033, 5, 56, 0, 0, 3538, 3539, 5, 108, 0, 0, 3539, 3540, 5, 100, 0, 0, 3540, 3541, 5, 101, 0, 0, 3541, 3542, 5, 108, 0, 0, 3542, 3543, 5, 101, 0, 0, 3543, 3544, 5, 109, 0, 0, 3544, 3545, 5, 46, 0, 0, 3545, 4033, 5, 105, 0, 0, 3546, 3547, 5, 108, 0, 0, 3547, 3548, 5, 100, 0, 0, 3548, 3549, 5, 101, 0, 0, 3549, 3550, 5, 108, 0, 0, 3550, 3551, 5, 101, 0, 0, 3551, 3552, 5, 109, 0, 0, 3552, 3553, 5, 46, 0, 0, 3553, 3554, 5, 114, 0, 0, 3554, 4033, 5, 52, 0, 0, 3555, 3556, 5, 108, 0, 0, 3556, 3557, 5, 100, 0, 0, 3557, 3558, 5, 101, 0, 0, 3558, 3559, 5, 108, 0, 0, 3559, 3560, 5, 101, 0, 0, 3560, 3561, 5, 109, 0, 0, 3561, 3562, 5, 46, 0, 0, 3562, 3563, 5, 114, 0, 0, 3563, 4033, 5, 56, 0, 0, 3564, 3565, 5, 108, 0, 0, 3565, 3566, 5, 100, 0, 0, 3566, 3567, 5, 101, 0, 0, 3567, 3568, 5, 108, 0, 0, 3568, 3569, 5, 101, 0, 0, 3569, 3570, 5, 109, 0, 0, 3570, 3571, 5, 46, 0, 0, 3571, 3572, 5, 114, 0, 0, 3572, 3573, 5, 101, 0, 0, 3573, 4033, 5, 102, 0, 0, 3574, 3575, 5, 115, 0, 0, 3575, 3576, 5, 116, 0, 0, 3576, 3577, 5, 101, 0, 0, 3577, 3578, 5, 108, 0, 0, 3578, 3579, 5, 101, 0, 0, 3579, 3580, 5, 109, 0, 0, 3580, 3581, 5, 46, 0, 0, 3581, 4033, 5, 105, 0, 0, 3582, 3583, 5, 115, 0, 0, 3583, 3584, 5, 116, 0, 0, 3584, 3585, 5, 101, 0, 0, 3585, 3586, 5, 108, 0, 0, 3586, 3587, 5, 101, 0, 0, 3587, 3588, 5, 109, 0, 0, 3588, 3589, 5, 46, 0, 0, 3589, 3590, 5, 105, 0, 0, 3590, 4033, 5, 49, 0, 0, 3591, 3592, 5, 115, 0, 0, 3592, 3593, 5, 116, 0, 0, 3593, 3594, 5, 101, 0, 0, 3594, 3595, 5, 108, 0, 0, 3595, 3596, 5, 101, 0, 0, 3596, 3597, 5, 109, 0, 0, 3597, 3598, 5, 46, 0, 0, 3598, 3599, 5, 105, 0, 0, 3599, 4033, 5, 50, 0, 0, 3600, 3601, 5, 115, 0, 0, 3601, 3602, 5, 116, 0, 0, 3602, 3603, 5, 101, 0, 0, 3603, 3604, 5, 108, 0, 0, 3604, 3605, 5, 101, 0, 0, 3605, 3606, 5, 109, 0, 0, 3606, 3607, 5, 46, 0, 0, 3607, 3608, 5, 105, 0, 0, 3608, 4033, 5, 52, 0, 0, 3609, 3610, 5, 115, 0, 0, 3610, 3611, 5, 116, 0, 0, 3611, 3612, 5, 101, 0, 0, 3612, 3613, 5, 108, 0, 0, 3613, 3614, 5, 101, 0, 0, 3614, 3615, 5, 109, 0, 0, 3615, 3616, 5, 46, 0, 0, 3616, 3617, 5, 105, 0, 0, 3617, 4033, 5, 56, 0, 0, 3618, 3619, 5, 115, 0, 0, 3619, 3620, 5, 116, 0, 0, 3620, 3621, 5, 101, 0, 0, 3621, 3622, 5, 108, 0, 0, 3622, 3623, 5, 101, 0, 0, 3623, 3624, 5, 109, 0, 0, 3624, 3625, 5, 46, 0, 0, 3625, 3626, 5, 114, 0, 0, 3626, 4033, 5, 52, 0, 0, 3627, 3628, 5, 115, 0, 0, 3628, 3629, 5, 116, 0, 0, 3629, 3630, 5, 101, 0, 0, 3630, 3631, 5, 108, 0, 0, 3631, 3632, 5, 101, 0, 0, 3632, 3633, 5, 109, 0, 0, 3633, 3634, 5, 46, 0, 0, 3634, 3635, 5, 114, 0, 0, 3635, 4033, 5, 56, 0, 0, 3636, 3637, 5, 115, 0, 0, 3637, 3638, 5, 116, 0, 0, 3638, 3639, 5, 101, 0, 0, 3639, 3640, 5, 108, 0, 0, 3640, 3641, 5, 101, 0, 0, 3641, 3642, 5, 109, 0, 0, 3642, 3643, 5, 46, 0, 0, 3643, 3644, 5, 114, 0, 0, 3644, 3645, 5, 101, 0, 0, 3645, 4033, 5, 102, 0, 0, 3646, 3647, 5, 99, 0, 0, 3647, 3648, 5, 111, 0, 0, 3648, 3649, 5, 110, 0, 0, 3649, 3650, 5, 118, 0, 0, 3650, 3651, 5, 46, 0, 0, 3651, 3652, 5, 111, 0, 0, 3652, 3653, 5, 118, 0, 0, 3653, 3654, 5, 102, 0, 0, 3654, 3655, 5, 46, 0, 0, 3655, 3656, 5, 105, 0, 0, 3656, 4033, 5, 49, 0, 0, 3657, 3658, 5, 99, 0, 0, 3658, 3659, 5, 111, 0, 0, 3659, 3660, 5, 110, 0, 0, 3660, 3661, 5, 118, 0, 0, 3661, 3662, 5, 46, 0, 0, 3662, 3663, 5, 111, 0, 0, 3663, 3664, 5, 118, 0, 0, 3664, 3665, 5, 102, 0, 0, 3665, 3666, 5, 46, 0, 0, 3666, 3667, 5, 117, 0, 0, 3667, 4033, 5, 49, 0, 0, 3668, 3669, 5, 99, 0, 0, 3669, 3670, 5, 111, 0, 0, 3670, 3671, 5, 110, 0, 0, 3671, 3672, 5, 118, 0, 0, 3672, 3673, 5, 46, 0, 0, 3673, 3674, 5, 111, 0, 0, 3674, 3675, 5, 118, 0, 0, 3675, 3676, 5, 102, 0, 0, 3676, 3677, 5, 46, 0, 0, 3677, 3678, 5, 105, 0, 0, 3678, 4033, 5, 50, 0, 0, 3679, 3680, 5, 99, 0, 0, 3680, 3681, 5, 111, 0, 0, 3681, 3682, 5, 110, 0, 0, 3682, 3683, 5, 118, 0, 0, 3683, 3684, 5, 46, 0, 0, 3684, 3685, 5, 111, 0, 0, 3685, 3686, 5, 118, 0, 0, 3686, 3687, 5, 102, 0, 0, 3687, 3688, 5, 46, 0, 0, 3688, 3689, 5, 117, 0, 0, 3689, 4033, 5, 50, 0, 0, 3690, 3691, 5, 99, 0, 0, 3691, 3692, 5, 111, 0, 0, 3692, 3693, 5, 110, 0, 0, 3693, 3694, 5, 118, 0, 0, 3694, 3695, 5, 46, 0, 0, 3695, 3696, 5, 111, 0, 0, 3696, 3697, 5, 118, 0, 0, 3697, 3698, 5, 102, 0, 0, 3698, 3699, 5, 46, 0, 0, 3699, 3700, 5, 105, 0, 0, 3700, 4033, 5, 52, 0, 0, 3701, 3702, 5, 99, 0, 0, 3702, 3703, 5, 111, 0, 0, 3703, 3704, 5, 110, 0, 0, 3704, 3705, 5, 118, 0, 0, 3705, 3706, 5, 46, 0, 0, 3706, 3707, 5, 111, 0, 0, 3707, 3708, 5, 118, 0, 0, 3708, 3709, 5, 102, 0, 0, 3709, 3710, 5, 46, 0, 0, 3710, 3711, 5, 117, 0, 0, 3711, 4033, 5, 52, 0, 0, 3712, 3713, 5, 99, 0, 0, 3713, 3714, 5, 111, 0, 0, 3714, 3715, 5, 110, 0, 0, 3715, 3716, 5, 118, 0, 0, 3716, 3717, 5, 46, 0, 0, 3717, 3718, 5, 111, 0, 0, 3718, 3719, 5, 118, 0, 0, 3719, 3720, 5, 102, 0, 0, 3720, 3721, 5, 46, 0, 0, 3721, 3722, 5, 105, 0, 0, 3722, 4033, 5, 56, 0, 0, 3723, 3724, 5, 99, 0, 0, 3724, 3725, 5, 111, 0, 0, 3725, 3726, 5, 110, 0, 0, 3726, 3727, 5, 118, 0, 0, 3727, 3728, 5, 46, 0, 0, 3728, 3729, 5, 111, 0, 0, 3729, 3730, 5, 118, 0, 0, 3730, 3731, 5, 102, 0, 0, 3731, 3732, 5, 46, 0, 0, 3732, 3733, 5, 117, 0, 0, 3733, 4033, 5, 56, 0, 0, 3734, 3735, 5, 99, 0, 0, 3735, 3736, 5, 107, 0, 0, 3736, 3737, 5, 102, 0, 0, 3737, 3738, 5, 105, 0, 0, 3738, 3739, 5, 110, 0, 0, 3739, 3740, 5, 105, 0, 0, 3740, 3741, 5, 116, 0, 0, 3741, 4033, 5, 101, 0, 0, 3742, 3743, 5, 99, 0, 0, 3743, 3744, 5, 111, 0, 0, 3744, 3745, 5, 110, 0, 0, 3745, 3746, 5, 118, 0, 0, 3746, 3747, 5, 46, 0, 0, 3747, 3748, 5, 117, 0, 0, 3748, 4033, 5, 50, 0, 0, 3749, 3750, 5, 99, 0, 0, 3750, 3751, 5, 111, 0, 0, 3751, 3752, 5, 110, 0, 0, 3752, 3753, 5, 118, 0, 0, 3753, 3754, 5, 46, 0, 0, 3754, 3755, 5, 117, 0, 0, 3755, 4033, 5, 49, 0, 0, 3756, 3757, 5, 99, 0, 0, 3757, 3758, 5, 111, 0, 0, 3758, 3759, 5, 110, 0, 0, 3759, 3760, 5, 118, 0, 0, 3760, 3761, 5, 46, 0, 0, 3761, 4033, 5, 105, 0, 0, 3762, 3763, 5, 99, 0, 0, 3763, 3764, 5, 111, 0, 0, 3764, 3765, 5, 110, 0, 0, 3765, 3766, 5, 118, 0, 0, 3766, 3767, 5, 46, 0, 0, 3767, 3768, 5, 111, 0, 0, 3768, 3769, 5, 118, 0, 0, 3769, 3770, 5, 102, 0, 0, 3770, 3771, 5, 46, 0, 0, 3771, 4033, 5, 105, 0, 0, 3772, 3773, 5, 99, 0, 0, 3773, 3774, 5, 111, 0, 0, 3774, 3775, 5, 110, 0, 0, 3775, 3776, 5, 118, 0, 0, 3776, 3777, 5, 46, 0, 0, 3777, 3778, 5, 111, 0, 0, 3778, 3779, 5, 118, 0, 0, 3779, 3780, 5, 102, 0, 0, 3780, 3781, 5, 46, 0, 0, 3781, 4033, 5, 117, 0, 0, 3782, 3783, 5, 97, 0, 0, 3783, 3784, 5, 100, 0, 0, 3784, 3785, 5, 100, 0, 0, 3785, 3786, 5, 46, 0, 0, 3786, 3787, 5, 111, 0, 0, 3787, 3788, 5, 118, 0, 0, 3788, 4033, 5, 102, 0, 0, 3789, 3790, 5, 97, 0, 0, 3790, 3791, 5, 100, 0, 0, 3791, 3792, 5, 100, 0, 0, 3792, 3793, 5, 46, 0, 0, 3793, 3794, 5, 111, 0, 0, 3794, 3795, 5, 118, 0, 0, 3795, 3796, 5, 102, 0, 0, 3796, 3797, 5, 46, 0, 0, 3797, 3798, 5, 117, 0, 0, 3798, 4033, 5, 110, 0, 0, 3799, 3800, 5, 109, 0, 0, 3800, 3801, 5, 117, 0, 0, 3801, 3802, 5, 108, 0, 0, 3802, 3803, 5, 46, 0, 0, 3803, 3804, 5, 111, 0, 0, 3804, 3805, 5, 118, 0, 0, 3805, 4033, 5, 102, 0, 0, 3806, 3807, 5, 109, 0, 0, 3807, 3808, 5, 117, 0, 0, 3808, 3809, 5, 108, 0, 0, 3809, 3810, 5, 46, 0, 0, 3810, 3811, 5, 111, 0, 0, 3811, 3812, 5, 118, 0, 0, 3812, 3813, 5, 102, 0, 0, 3813, 3814, 5, 46, 0, 0, 3814, 3815, 5, 117, 0, 0, 3815, 4033, 5, 110, 0, 0, 3816, 3817, 5, 115, 0, 0, 3817, 3818, 5, 117, 0, 0, 3818, 3819, 5, 98, 0, 0, 3819, 3820, 5, 46, 0, 0, 3820, 3821, 5, 111, 0, 0, 3821, 3822, 5, 118, 0, 0, 3822, 4033, 5, 102, 0, 0, 3823, 3824, 5, 115, 0, 0, 3824, 3825, 5, 117, 0, 0, 3825, 3826, 5, 98, 0, 0, 3826, 3827, 5, 46, 0, 0, 3827, 3828, 5, 111, 0, 0, 3828, 3829, 5, 118, 0, 0, 3829, 3830, 5, 102, 0, 0, 3830, 3831, 5, 46, 0, 0, 3831, 3832, 5, 117, 0, 0, 3832, 4033, 5, 110, 0, 0, 3833, 3834, 5, 101, 0, 0, 3834, 3835, 5, 110, 0, 0, 3835, 3836, 5, 100, 0, 0, 3836, 3837, 5, 102, 0, 0, 3837, 3838, 5, 105, 0, 0, 3838, 3839, 5, 110, 0, 0, 3839, 3840, 5, 97, 0, 0, 3840, 3841, 5, 108, 0, 0, 3841, 3842, 5, 108, 0, 0, 3842, 4033, 5, 121, 0, 0, 3843, 3844, 5, 101, 0, 0, 3844, 3845, 5, 110, 0, 0, 3845, 3846, 5, 100, 0, 0, 3846, 3847, 5, 102, 0, 0, 3847, 3848, 5, 97, 0, 0, 3848, 3849, 5, 117, 0, 0, 3849, 3850, 5, 108, 0, 0, 3850, 4033, 5, 116, 0, 0, 3851, 3852, 5, 115, 0, 0, 3852, 3853, 5, 116, 0, 0, 3853, 3854, 5, 105, 0, 0, 3854, 3855, 5, 110, 0, 0, 3855, 3856, 5, 100, 0, 0, 3856, 3857, 5, 46, 0, 0, 3857, 4033, 5, 105, 0, 0, 3858, 3859, 5, 99, 0, 0, 3859, 3860, 5, 111, 0, 0, 3860, 3861, 5, 110, 0, 0, 3861, 3862, 5, 118, 0, 0, 3862, 3863, 5, 46, 0, 0, 3863, 4033, 5, 117, 0, 0, 3864, 3865, 5, 112, 0, 0, 3865, 3866, 5, 114, 0, 0, 3866, 3867, 5, 101, 0, 0, 3867, 3868, 5, 102, 0, 0, 3868, 3869, 5, 105, 0, 0, 3869, 3870, 5, 120, 0, 0, 3870, 4033, 5, 55, 0, 0, 3871, 3872, 5, 112, 0, 0, 3872, 3873, 5, 114, 0, 0, 3873, 3874, 5, 101, 0, 0, 3874, 3875, 5, 102, 0, 0, 3875, 3876, 5, 105, 0, 0, 3876, 3877, 5, 120, 0, 0, 3877, 4033, 5, 54, 0, 0, 3878, 3879, 5, 112, 0, 0, 3879, 3880, 5, 114, 0, 0, 3880, 3881, 5, 101, 0, 0, 3881, 3882, 5, 102, 0, 0, 3882, 3883, 5, 105, 0, 0, 3883, 3884, 5, 120, 0, 0, 3884, 4033, 5, 53, 0, 0, 3885, 3886, 5, 112, 0, 0, 3886, 3887, 5, 114, 0, 0, 3887, 3888, 5, 101, 0, 0, 3888, 3889, 5, 102, 0, 0, 3889, 3890, 5, 105, 0, 0, 3890, 3891, 5, 120, 0, 0, 3891, 4033, 5, 52, 0, 0, 3892, 3893, 5, 112, 0, 0, 3893, 3894, 5, 114, 0, 0, 3894, 3895, 5, 101, 0, 0, 3895, 3896, 5, 102, 0, 0, 3896, 3897, 5, 105, 0, 0, 3897, 3898, 5, 120, 0, 0, 3898, 4033, 5, 51, 0, 0, 3899, 3900, 5, 112, 0, 0, 3900, 3901, 5, 114, 0, 0, 3901, 3902, 5, 101, 0, 0, 3902, 3903, 5, 102, 0, 0, 3903, 3904, 5, 105, 0, 0, 3904, 3905, 5, 120, 0, 0, 3905, 4033, 5, 50, 0, 0, 3906, 3907, 5, 112, 0, 0, 3907, 3908, 5, 114, 0, 0, 3908, 3909, 5, 101, 0, 0, 3909, 3910, 5, 102, 0, 0, 3910, 3911, 5, 105, 0, 0, 3911, 3912, 5, 120, 0, 0, 3912, 4033, 5, 49, 0, 0, 3913, 3914, 5, 112, 0, 0, 3914, 3915, 5, 114, 0, 0, 3915, 3916, 5, 101, 0, 0, 3916, 3917, 5, 102, 0, 0, 3917, 3918, 5, 105, 0, 0, 3918, 3919, 5, 120, 0, 0, 3919, 3920, 5, 114, 0, 0, 3920, 3921, 5, 101, 0, 0, 3921, 4033, 5, 102, 0, 0, 3922, 3923, 5, 97, 0, 0, 3923, 3924, 5, 114, 0, 0, 3924, 3925, 5, 103, 0, 0, 3925, 3926, 5, 108, 0, 0, 3926, 3927, 5, 105, 0, 0, 3927, 3928, 5, 115, 0, 0, 3928, 4033, 5, 116, 0, 0, 3929, 3930, 5, 99, 0, 0, 3930, 3931, 5, 101, 0, 0, 3931, 4033, 5, 113, 0, 0, 3932, 3933, 5, 99, 0, 0, 3933, 3934, 5, 103, 0, 0, 3934, 4033, 5, 116, 0, 0, 3935, 3936, 5, 99, 0, 0, 3936, 3937, 5, 103, 0, 0, 3937, 3938, 5, 116, 0, 0, 3938, 3939, 5, 46, 0, 0, 3939, 3940, 5, 117, 0, 0, 3940, 4033, 5, 110, 0, 0, 3941, 3942, 5, 99, 0, 0, 3942, 3943, 5, 108, 0, 0, 3943, 4033, 5, 116, 0, 0, 3944, 3945, 5, 99, 0, 0, 3945, 3946, 5, 108, 0, 0, 3946, 3947, 5, 116, 0, 0, 3947, 3948, 5, 46, 0, 0, 3948, 3949, 5, 117, 0, 0, 3949, 4033, 5, 110, 0, 0, 3950, 3951, 5, 108, 0, 0, 3951, 3952, 5, 111, 0, 0, 3952, 3953, 5, 99, 0, 0, 3953, 3954, 5, 97, 0, 0, 3954, 3955, 5, 108, 0, 0, 3955, 3956, 5, 108, 0, 0, 3956, 3957, 5, 111, 0, 0, 3957, 4033, 5, 99, 0, 0, 3958, 3959, 5, 101, 0, 0, 3959, 3960, 5, 110, 0, 0, 3960, 3961, 5, 100, 0, 0, 3961, 3962, 5, 102, 0, 0, 3962, 3963, 5, 105, 0, 0, 3963, 3964, 5, 108, 0, 0, 3964, 3965, 5, 116, 0, 0, 3965, 3966, 5, 101, 0, 0, 3966, 4033, 5, 114, 0, 0, 3967, 3968, 5, 118, 0, 0, 3968, 3969, 5, 111, 0, 0, 3969, 3970, 5, 108, 0, 0, 3970, 3971, 5, 97, 0, 0, 3971, 3972, 5, 116, 0, 0, 3972, 3973, 5, 105, 0, 0, 3973, 3974, 5, 108, 0, 0, 3974, 3975, 5, 101, 0, 0, 3975, 4033, 5, 46, 0, 0, 3976, 3977, 5, 116, 0, 0, 3977, 3978, 5, 97, 0, 0, 3978, 3979, 5, 105, 0, 0, 3979, 3980, 5, 108, 0, 0, 3980, 4033, 5, 46, 0, 0, 3981, 3982, 5, 99, 0, 0, 3982, 3983, 5, 112, 0, 0, 3983, 3984, 5, 98, 0, 0, 3984, 3985, 5, 108, 0, 0, 3985, 4033, 5, 107, 0, 0, 3986, 3987, 5, 105, 0, 0, 3987, 3988, 5, 110, 0, 0, 3988, 3989, 5, 105, 0, 0, 3989, 3990, 5, 116, 0, 0, 3990, 3991, 5, 98, 0, 0, 3991, 3992, 5, 108, 0, 0, 3992, 4033, 5, 107, 0, 0, 3993, 3994, 5, 114, 0, 0, 3994, 3995, 5, 101, 0, 0, 3995, 3996, 5, 116, 0, 0, 3996, 3997, 5, 104, 0, 0, 3997, 3998, 5, 114, 0, 0, 3998, 3999, 5, 111, 0, 0, 3999, 4033, 5, 119, 0, 0, 4000, 4001, 5, 114, 0, 0, 4001, 4002, 5, 101, 0, 0, 4002, 4003, 5, 102, 0, 0, 4003, 4004, 5, 97, 0, 0, 4004, 4005, 5, 110, 0, 0, 4005, 4006, 5, 121, 0, 0, 4006, 4007, 5, 116, 0, 0, 4007, 4008, 5, 121, 0, 0, 4008, 4009, 5, 112, 0, 0, 4009, 4033, 5, 101, 0, 0, 4010, 4011, 5, 114, 0, 0, 4011, 4012, 5, 101, 0, 0, 4012, 4013, 5, 97, 0, 0, 4013, 4014, 5, 100, 0, 0, 4014, 4015, 5, 111, 0, 0, 4015, 4016, 5, 110, 0, 0, 4016, 4017, 5, 108, 0, 0, 4017, 4018, 5, 121, 0, 0, 4018, 4033, 5, 46, 0, 0, 4019, 4020, 5, 105, 0, 0, 4020, 4021, 5, 108, 0, 0, 4021, 4022, 5, 108, 0, 0, 4022, 4023, 5, 101, 0, 0, 4023, 4024, 5, 103, 0, 0, 4024, 4025, 5, 97, 0, 0, 4025, 4033, 5, 108, 0, 0, 4026, 4027, 5, 101, 0, 0, 4027, 4028, 5, 110, 0, 0, 4028, 4029, 5, 100, 0, 0, 4029, 4030, 5, 109, 0, 0, 4030, 4031, 5, 97, 0, 0, 4031, 4033, 5, 99, 0, 0, 4032, 2850, 1, 0, 0, 0, 4032, 2853, 1, 0, 0, 0, 4032, 2858, 1, 0, 0, 0, 4032, 2865, 1, 0, 0, 0, 4032, 2872, 1, 0, 0, 0, 4032, 2879, 1, 0, 0, 0, 4032, 2886, 1, 0, 0, 0, 4032, 2893, 1, 0, 0, 0, 4032, 2900, 1, 0, 0, 0, 4032, 2907, 1, 0, 0, 0, 4032, 2914, 1, 0, 0, 0, 4032, 2921, 1, 0, 0, 0, 4032, 2928, 1, 0, 0, 0, 4032, 2935, 1, 0, 0, 0, 4032, 2942, 1, 0, 0, 0, 4032, 2948, 1, 0, 0, 0, 4032, 2957, 1, 0, 0, 0, 4032, 2966, 1, 0, 0, 0, 4032, 2974, 1, 0, 0, 0, 4032, 2982, 1, 0, 0, 0, 4032, 2990, 1, 0, 0, 0, 4032, 2998, 1, 0, 0, 0, 4032, 3006, 1, 0, 0, 0, 4032, 3014, 1, 0, 0, 0, 4032, 3022, 1, 0, 0, 0, 4032, 3030, 1, 0, 0, 0, 4032, 3038, 1, 0, 0, 0, 4032, 3041, 1, 0, 0, 0, 4032, 3044, 1, 0, 0, 0, 4032, 3047, 1, 0, 0, 0, 4032, 3055, 1, 0, 0, 0, 4032, 3063, 1, 0, 0, 0, 4032, 3071, 1, 0, 0, 0, 4032, 3079, 1, 0, 0, 0, 4032, 3087, 1, 0, 0, 0, 4032, 3095, 1, 0, 0, 0, 4032, 3103, 1, 0, 0, 0, 4032, 3111, 1, 0, 0, 0, 4032, 3118, 1, 0, 0, 0, 4032, 3126, 1, 0, 0, 0, 4032, 3134, 1, 0, 0, 0, 4032, 3143, 1, 0, 0, 0, 4032, 3152, 1, 0, 0, 0, 4032, 3160, 1, 0, 0, 0, 4032, 3168, 1, 0, 0, 0, 4032, 3176, 1, 0, 0, 0, 4032, 3184, 1, 0, 0, 0, 4032, 3192, 1, 0, 0, 0, 4032, 3200, 1, 0, 0, 0, 4032, 3203, 1, 0, 0, 0, 4032, 3206, 1, 0, 0, 0, 4032, 3209, 1, 0, 0, 0, 4032, 3212, 1, 0, 0, 0, 4032, 3218, 1, 0, 0, 0, 4032, 3221, 1, 0, 0, 0, 4032, 3227, 1, 0, 0, 0, 4032, 3230, 1, 0, 0, 0, 4032, 3232, 1, 0, 0, 0, 4032, 3235, 1, 0, 0, 0, 4032, 3238, 1, 0, 0, 0, 4032, 3241, 1, 0, 0, 0, 4032, 3247, 1, 0, 0, 0, 4032, 3250, 1, 0, 0, 0, 4032, 3253, 1, 0, 0, 0, 4032, 3260, 1, 0, 0, 0, 4032, 3267, 1, 0, 0, 0, 4032, 3274, 1, 0, 0, 0, 4032, 3281, 1, 0, 0, 0, 4032, 3288, 1, 0, 0, 0, 4032, 3295, 1, 0, 0, 0, 4032, 3302, 1, 0, 0, 0, 4032, 3309, 1, 0, 0, 0, 4032, 3318, 1, 0, 0, 0, 4032, 3323, 1, 0, 0, 0, 4032, 3337, 1, 0, 0, 0, 4032, 3351, 1, 0, 0, 0, 4032, 3365, 1, 0, 0, 0, 4032, 3379, 1, 0, 0, 0, 4032, 3393, 1, 0, 0, 0, 4032, 3407, 1, 0, 0, 0, 4032, 3421, 1, 0, 0, 0, 4032, 3435, 1, 0, 0, 0, 4032, 3448, 1, 0, 0, 0, 4032, 3461, 1, 0, 0, 0, 4032, 3466, 1, 0, 0, 0, 4032, 3475, 1, 0, 0, 0, 4032, 3484, 1, 0, 0, 0, 4032, 3493, 1, 0, 0, 0, 4032, 3502, 1, 0, 0, 0, 4032, 3511, 1, 0, 0, 0, 4032, 3520, 1, 0, 0, 0, 4032, 3529, 1, 0, 0, 0, 4032, 3538, 1, 0, 0, 0, 4032, 3546, 1, 0, 0, 0, 4032, 3555, 1, 0, 0, 0, 4032, 3564, 1, 0, 0, 0, 4032, 3574, 1, 0, 0, 0, 4032, 3582, 1, 0, 0, 0, 4032, 3591, 1, 0, 0, 0, 4032, 3600, 1, 0, 0, 0, 4032, 3609, 1, 0, 0, 0, 4032, 3618, 1, 0, 0, 0, 4032, 3627, 1, 0, 0, 0, 4032, 3636, 1, 0, 0, 0, 4032, 3646, 1, 0, 0, 0, 4032, 3657, 1, 0, 0, 0, 4032, 3668, 1, 0, 0, 0, 4032, 3679, 1, 0, 0, 0, 4032, 3690, 1, 0, 0, 0, 4032, 3701, 1, 0, 0, 0, 4032, 3712, 1, 0, 0, 0, 4032, 3723, 1, 0, 0, 0, 4032, 3734, 1, 0, 0, 0, 4032, 3742, 1, 0, 0, 0, 4032, 3749, 1, 0, 0, 0, 4032, 3756, 1, 0, 0, 0, 4032, 3762, 1, 0, 0, 0, 4032, 3772, 1, 0, 0, 0, 4032, 3782, 1, 0, 0, 0, 4032, 3789, 1, 0, 0, 0, 4032, 3799, 1, 0, 0, 0, 4032, 3806, 1, 0, 0, 0, 4032, 3816, 1, 0, 0, 0, 4032, 3823, 1, 0, 0, 0, 4032, 3833, 1, 0, 0, 0, 4032, 3843, 1, 0, 0, 0, 4032, 3851, 1, 0, 0, 0, 4032, 3858, 1, 0, 0, 0, 4032, 3864, 1, 0, 0, 0, 4032, 3871, 1, 0, 0, 0, 4032, 3878, 1, 0, 0, 0, 4032, 3885, 1, 0, 0, 0, 4032, 3892, 1, 0, 0, 0, 4032, 3899, 1, 0, 0, 0, 4032, 3906, 1, 0, 0, 0, 4032, 3913, 1, 0, 0, 0, 4032, 3922, 1, 0, 0, 0, 4032, 3929, 1, 0, 0, 0, 4032, 3932, 1, 0, 0, 0, 4032, 3935, 1, 0, 0, 0, 4032, 3941, 1, 0, 0, 0, 4032, 3944, 1, 0, 0, 0, 4032, 3950, 1, 0, 0, 0, 4032, 3958, 1, 0, 0, 0, 4032, 3967, 1, 0, 0, 0, 4032, 3976, 1, 0, 0, 0, 4032, 3981, 1, 0, 0, 0, 4032, 3986, 1, 0, 0, 0, 4032, 3993, 1, 0, 0, 0, 4032, 4000, 1, 0, 0, 0, 4032, 4010, 1, 0, 0, 0, 4032, 4019, 1, 0, 0, 0, 4032, 4026, 1, 0, 0, 0, 4033, 552, 1, 0, 0, 0, 4034, 4035, 5, 108, 0, 0, 4035, 4036, 5, 100, 0, 0, 4036, 4037, 5, 97, 0, 0, 4037, 4038, 5, 114, 0, 0, 4038, 4039, 5, 103, 0, 0, 4039, 4040, 5, 46, 0, 0, 4040, 4111, 5, 115, 0, 0, 4041, 4042, 5, 108, 0, 0, 4042, 4043, 5, 100, 0, 0, 4043, 4044, 5, 97, 0, 0, 4044, 4045, 5, 114, 0, 0, 4045, 4046, 5, 103, 0, 0, 4046, 4047, 5, 97, 0, 0, 4047, 4048, 5, 46, 0, 0, 4048, 4111, 5, 115, 0, 0, 4049, 4050, 5, 115, 0, 0, 4050, 4051, 5, 116, 0, 0, 4051, 4052, 5, 97, 0, 0, 4052, 4053, 5, 114, 0, 0, 4053, 4054, 5, 103, 0, 0, 4054, 4055, 5, 46, 0, 0, 4055, 4111, 5, 115, 0, 0, 4056, 4057, 5, 108, 0, 0, 4057, 4058, 5, 100, 0, 0, 4058, 4059, 5, 108, 0, 0, 4059, 4060, 5, 111, 0, 0, 4060, 4061, 5, 99, 0, 0, 4061, 4062, 5, 46, 0, 0, 4062, 4111, 5, 115, 0, 0, 4063, 4064, 5, 108, 0, 0, 4064, 4065, 5, 100, 0, 0, 4065, 4066, 5, 108, 0, 0, 4066, 4067, 5, 111, 0, 0, 4067, 4068, 5, 99, 0, 0, 4068, 4069, 5, 97, 0, 0, 4069, 4070, 5, 46, 0, 0, 4070, 4111, 5, 115, 0, 0, 4071, 4072, 5, 115, 0, 0, 4072, 4073, 5, 116, 0, 0, 4073, 4074, 5, 108, 0, 0, 4074, 4075, 5, 111, 0, 0, 4075, 4076, 5, 99, 0, 0, 4076, 4077, 5, 46, 0, 0, 4077, 4111, 5, 115, 0, 0, 4078, 4079, 5, 108, 0, 0, 4079, 4080, 5, 100, 0, 0, 4080, 4081, 5, 97, 0, 0, 4081, 4082, 5, 114, 0, 0, 4082, 4111, 5, 103, 0, 0, 4083, 4084, 5, 108, 0, 0, 4084, 4085, 5, 100, 0, 0, 4085, 4086, 5, 97, 0, 0, 4086, 4087, 5, 114, 0, 0, 4087, 4088, 5, 103, 0, 0, 4088, 4111, 5, 97, 0, 0, 4089, 4090, 5, 115, 0, 0, 4090, 4091, 5, 116, 0, 0, 4091, 4092, 5, 97, 0, 0, 4092, 4093, 5, 114, 0, 0, 4093, 4111, 5, 103, 0, 0, 4094, 4095, 5, 108, 0, 0, 4095, 4096, 5, 100, 0, 0, 4096, 4097, 5, 108, 0, 0, 4097, 4098, 5, 111, 0, 0, 4098, 4111, 5, 99, 0, 0, 4099, 4100, 5, 108, 0, 0, 4100, 4101, 5, 100, 0, 0, 4101, 4102, 5, 108, 0, 0, 4102, 4103, 5, 111, 0, 0, 4103, 4104, 5, 99, 0, 0, 4104, 4111, 5, 97, 0, 0, 4105, 4106, 5, 115, 0, 0, 4106, 4107, 5, 116, 0, 0, 4107, 4108, 5, 108, 0, 0, 4108, 4109, 5, 111, 0, 0, 4109, 4111, 5, 99, 0, 0, 4110, 4034, 1, 0, 0, 0, 4110, 4041, 1, 0, 0, 0, 4110, 4049, 1, 0, 0, 0, 4110, 4056, 1, 0, 0, 0, 4110, 4063, 1, 0, 0, 0, 4110, 4071, 1, 0, 0, 0, 4110, 4078, 1, 0, 0, 0, 4110, 4083, 1, 0, 0, 0, 4110, 4089, 1, 0, 0, 0, 4110, 4094, 1, 0, 0, 0, 4110, 4099, 1, 0, 0, 0, 4110, 4105, 1, 0, 0, 0, 4111, 554, 1, 0, 0, 0, 4112, 4113, 5, 108, 0, 0, 4113, 4114, 5, 100, 0, 0, 4114, 4115, 5, 99, 0, 0, 4115, 4116, 5, 46, 0, 0, 4116, 4117, 5, 105, 0, 0, 4117, 4118, 5, 52, 0, 0, 4118, 4119, 5, 46, 0, 0, 4119, 4140, 5, 115, 0, 0, 4120, 4121, 5, 108, 0, 0, 4121, 4122, 5, 100, 0, 0, 4122, 4123, 5, 99, 0, 0, 4123, 4124, 5, 46, 0, 0, 4124, 4125, 5, 105, 0, 0, 4125, 4140, 5, 52, 0, 0, 4126, 4127, 5, 117, 0, 0, 4127, 4128, 5, 110, 0, 0, 4128, 4129, 5, 97, 0, 0, 4129, 4130, 5, 108, 0, 0, 4130, 4131, 5, 105, 0, 0, 4131, 4132, 5, 103, 0, 0, 4132, 4133, 5, 110, 0, 0, 4133, 4134, 5, 101, 0, 0, 4134, 4135, 5, 100, 0, 0, 4135, 4140, 5, 46, 0, 0, 4136, 4137, 5, 110, 0, 0, 4137, 4138, 5, 111, 0, 0, 4138, 4140, 5, 46, 0, 0, 4139, 4112, 1, 0, 0, 0, 4139, 4120, 1, 0, 0, 0, 4139, 4126, 1, 0, 0, 0, 4139, 4136, 1, 0, 0, 0, 4140, 556, 1, 0, 0, 0, 4141, 4142, 5, 108, 0, 0, 4142, 4143, 5, 100, 0, 0, 4143, 4144, 5, 99, 0, 0, 4144, 4145, 5, 46, 0, 0, 4145, 4146, 5, 105, 0, 0, 4146, 4147, 5, 56, 0, 0, 4147, 558, 1, 0, 0, 0, 4148, 4149, 5, 108, 0, 0, 4149, 4150, 5, 100, 0, 0, 4150, 4151, 5, 99, 0, 0, 4151, 4152, 5, 46, 0, 0, 4152, 4153, 5, 114, 0, 0, 4153, 4161, 5, 52, 0, 0, 4154, 4155, 5, 108, 0, 0, 4155, 4156, 5, 100, 0, 0, 4156, 4157, 5, 99, 0, 0, 4157, 4158, 5, 46, 0, 0, 4158, 4159, 5, 114, 0, 0, 4159, 4161, 5, 56, 0, 0, 4160, 4148, 1, 0, 0, 0, 4160, 4154, 1, 0, 0, 0, 4161, 560, 1, 0, 0, 0, 4162, 4163, 5, 106, 0, 0, 4163, 4164, 5, 109, 0, 0, 4164, 4198, 5, 112, 0, 0, 4165, 4166, 5, 99, 0, 0, 4166, 4167, 5, 97, 0, 0, 4167, 4168, 5, 108, 0, 0, 4168, 4198, 5, 108, 0, 0, 4169, 4170, 5, 99, 0, 0, 4170, 4171, 5, 97, 0, 0, 4171, 4172, 5, 108, 0, 0, 4172, 4173, 5, 108, 0, 0, 4173, 4174, 5, 118, 0, 0, 4174, 4175, 5, 105, 0, 0, 4175, 4176, 5, 114, 0, 0, 4176, 4198, 5, 116, 0, 0, 4177, 4178, 5, 110, 0, 0, 4178, 4179, 5, 101, 0, 0, 4179, 4180, 5, 119, 0, 0, 4180, 4181, 5, 111, 0, 0, 4181, 4182, 5, 98, 0, 0, 4182, 4198, 5, 106, 0, 0, 4183, 4184, 5, 108, 0, 0, 4184, 4185, 5, 100, 0, 0, 4185, 4186, 5, 102, 0, 0, 4186, 4187, 5, 116, 0, 0, 4187, 4198, 5, 110, 0, 0, 4188, 4189, 5, 108, 0, 0, 4189, 4190, 5, 100, 0, 0, 4190, 4191, 5, 118, 0, 0, 4191, 4192, 5, 105, 0, 0, 4192, 4193, 5, 114, 0, 0, 4193, 4194, 5, 116, 0, 0, 4194, 4195, 5, 102, 0, 0, 4195, 4196, 5, 116, 0, 0, 4196, 4198, 5, 110, 0, 0, 4197, 4162, 1, 0, 0, 0, 4197, 4165, 1, 0, 0, 0, 4197, 4169, 1, 0, 0, 0, 4197, 4177, 1, 0, 0, 0, 4197, 4183, 1, 0, 0, 0, 4197, 4188, 1, 0, 0, 0, 4198, 562, 1, 0, 0, 0, 4199, 4200, 5, 99, 0, 0, 4200, 4201, 5, 97, 0, 0, 4201, 4202, 5, 108, 0, 0, 4202, 4203, 5, 108, 0, 0, 4203, 4204, 5, 105, 0, 0, 4204, 564, 1, 0, 0, 0, 4205, 4206, 5, 98, 0, 0, 4206, 4207, 5, 114, 0, 0, 4207, 4208, 5, 46, 0, 0, 4208, 4364, 5, 115, 0, 0, 4209, 4210, 5, 98, 0, 0, 4210, 4211, 5, 114, 0, 0, 4211, 4212, 5, 102, 0, 0, 4212, 4213, 5, 97, 0, 0, 4213, 4214, 5, 108, 0, 0, 4214, 4215, 5, 115, 0, 0, 4215, 4216, 5, 101, 0, 0, 4216, 4217, 5, 46, 0, 0, 4217, 4364, 5, 115, 0, 0, 4218, 4219, 5, 98, 0, 0, 4219, 4220, 5, 114, 0, 0, 4220, 4221, 5, 116, 0, 0, 4221, 4222, 5, 114, 0, 0, 4222, 4223, 5, 117, 0, 0, 4223, 4224, 5, 101, 0, 0, 4224, 4225, 5, 46, 0, 0, 4225, 4364, 5, 115, 0, 0, 4226, 4227, 5, 98, 0, 0, 4227, 4228, 5, 101, 0, 0, 4228, 4229, 5, 113, 0, 0, 4229, 4230, 5, 46, 0, 0, 4230, 4364, 5, 115, 0, 0, 4231, 4232, 5, 98, 0, 0, 4232, 4233, 5, 103, 0, 0, 4233, 4234, 5, 101, 0, 0, 4234, 4235, 5, 46, 0, 0, 4235, 4364, 5, 115, 0, 0, 4236, 4237, 5, 98, 0, 0, 4237, 4238, 5, 103, 0, 0, 4238, 4239, 5, 116, 0, 0, 4239, 4240, 5, 46, 0, 0, 4240, 4364, 5, 115, 0, 0, 4241, 4242, 5, 98, 0, 0, 4242, 4243, 5, 108, 0, 0, 4243, 4244, 5, 101, 0, 0, 4244, 4245, 5, 46, 0, 0, 4245, 4364, 5, 115, 0, 0, 4246, 4247, 5, 98, 0, 0, 4247, 4248, 5, 108, 0, 0, 4248, 4249, 5, 116, 0, 0, 4249, 4250, 5, 46, 0, 0, 4250, 4364, 5, 115, 0, 0, 4251, 4252, 5, 98, 0, 0, 4252, 4253, 5, 110, 0, 0, 4253, 4254, 5, 101, 0, 0, 4254, 4255, 5, 46, 0, 0, 4255, 4256, 5, 117, 0, 0, 4256, 4257, 5, 110, 0, 0, 4257, 4258, 5, 46, 0, 0, 4258, 4364, 5, 115, 0, 0, 4259, 4260, 5, 98, 0, 0, 4260, 4261, 5, 103, 0, 0, 4261, 4262, 5, 101, 0, 0, 4262, 4263, 5, 46, 0, 0, 4263, 4264, 5, 117, 0, 0, 4264, 4265, 5, 110, 0, 0, 4265, 4266, 5, 46, 0, 0, 4266, 4364, 5, 115, 0, 0, 4267, 4268, 5, 98, 0, 0, 4268, 4269, 5, 103, 0, 0, 4269, 4270, 5, 116, 0, 0, 4270, 4271, 5, 46, 0, 0, 4271, 4272, 5, 117, 0, 0, 4272, 4273, 5, 110, 0, 0, 4273, 4274, 5, 46, 0, 0, 4274, 4364, 5, 115, 0, 0, 4275, 4276, 5, 98, 0, 0, 4276, 4277, 5, 108, 0, 0, 4277, 4278, 5, 101, 0, 0, 4278, 4279, 5, 46, 0, 0, 4279, 4280, 5, 117, 0, 0, 4280, 4281, 5, 110, 0, 0, 4281, 4282, 5, 46, 0, 0, 4282, 4364, 5, 115, 0, 0, 4283, 4284, 5, 98, 0, 0, 4284, 4285, 5, 108, 0, 0, 4285, 4286, 5, 116, 0, 0, 4286, 4287, 5, 46, 0, 0, 4287, 4288, 5, 117, 0, 0, 4288, 4289, 5, 110, 0, 0, 4289, 4290, 5, 46, 0, 0, 4290, 4364, 5, 115, 0, 0, 4291, 4292, 5, 98, 0, 0, 4292, 4364, 5, 114, 0, 0, 4293, 4294, 5, 98, 0, 0, 4294, 4295, 5, 114, 0, 0, 4295, 4296, 5, 102, 0, 0, 4296, 4297, 5, 97, 0, 0, 4297, 4298, 5, 108, 0, 0, 4298, 4299, 5, 115, 0, 0, 4299, 4364, 5, 101, 0, 0, 4300, 4301, 5, 98, 0, 0, 4301, 4302, 5, 114, 0, 0, 4302, 4303, 5, 116, 0, 0, 4303, 4304, 5, 114, 0, 0, 4304, 4305, 5, 117, 0, 0, 4305, 4364, 5, 101, 0, 0, 4306, 4307, 5, 98, 0, 0, 4307, 4308, 5, 101, 0, 0, 4308, 4364, 5, 113, 0, 0, 4309, 4310, 5, 98, 0, 0, 4310, 4311, 5, 103, 0, 0, 4311, 4364, 5, 101, 0, 0, 4312, 4313, 5, 98, 0, 0, 4313, 4314, 5, 103, 0, 0, 4314, 4364, 5, 116, 0, 0, 4315, 4316, 5, 98, 0, 0, 4316, 4317, 5, 108, 0, 0, 4317, 4364, 5, 101, 0, 0, 4318, 4319, 5, 98, 0, 0, 4319, 4320, 5, 108, 0, 0, 4320, 4364, 5, 116, 0, 0, 4321, 4322, 5, 98, 0, 0, 4322, 4323, 5, 110, 0, 0, 4323, 4324, 5, 101, 0, 0, 4324, 4325, 5, 46, 0, 0, 4325, 4326, 5, 117, 0, 0, 4326, 4364, 5, 110, 0, 0, 4327, 4328, 5, 98, 0, 0, 4328, 4329, 5, 103, 0, 0, 4329, 4330, 5, 101, 0, 0, 4330, 4331, 5, 46, 0, 0, 4331, 4332, 5, 117, 0, 0, 4332, 4364, 5, 110, 0, 0, 4333, 4334, 5, 98, 0, 0, 4334, 4335, 5, 103, 0, 0, 4335, 4336, 5, 116, 0, 0, 4336, 4337, 5, 46, 0, 0, 4337, 4338, 5, 117, 0, 0, 4338, 4364, 5, 110, 0, 0, 4339, 4340, 5, 98, 0, 0, 4340, 4341, 5, 108, 0, 0, 4341, 4342, 5, 101, 0, 0, 4342, 4343, 5, 46, 0, 0, 4343, 4344, 5, 117, 0, 0, 4344, 4364, 5, 110, 0, 0, 4345, 4346, 5, 98, 0, 0, 4346, 4347, 5, 108, 0, 0, 4347, 4348, 5, 116, 0, 0, 4348, 4349, 5, 46, 0, 0, 4349, 4350, 5, 117, 0, 0, 4350, 4364, 5, 110, 0, 0, 4351, 4352, 5, 108, 0, 0, 4352, 4353, 5, 101, 0, 0, 4353, 4354, 5, 97, 0, 0, 4354, 4355, 5, 118, 0, 0, 4355, 4364, 5, 101, 0, 0, 4356, 4357, 5, 108, 0, 0, 4357, 4358, 5, 101, 0, 0, 4358, 4359, 5, 97, 0, 0, 4359, 4360, 5, 118, 0, 0, 4360, 4361, 5, 101, 0, 0, 4361, 4362, 5, 46, 0, 0, 4362, 4364, 5, 115, 0, 0, 4363, 4205, 1, 0, 0, 0, 4363, 4209, 1, 0, 0, 0, 4363, 4218, 1, 0, 0, 0, 4363, 4226, 1, 0, 0, 0, 4363, 4231, 1, 0, 0, 0, 4363, 4236, 1, 0, 0, 0, 4363, 4241, 1, 0, 0, 0, 4363, 4246, 1, 0, 0, 0, 4363, 4251, 1, 0, 0, 0, 4363, 4259, 1, 0, 0, 0, 4363, 4267, 1, 0, 0, 0, 4363, 4275, 1, 0, 0, 0, 4363, 4283, 1, 0, 0, 0, 4363, 4291, 1, 0, 0, 0, 4363, 4293, 1, 0, 0, 0, 4363, 4300, 1, 0, 0, 0, 4363, 4306, 1, 0, 0, 0, 4363, 4309, 1, 0, 0, 0, 4363, 4312, 1, 0, 0, 0, 4363, 4315, 1, 0, 0, 0, 4363, 4318, 1, 0, 0, 0, 4363, 4321, 1, 0, 0, 0, 4363, 4327, 1, 0, 0, 0, 4363, 4333, 1, 0, 0, 0, 4363, 4339, 1, 0, 0, 0, 4363, 4345, 1, 0, 0, 0, 4363, 4351, 1, 0, 0, 0, 4363, 4356, 1, 0, 0, 0, 4364, 566, 1, 0, 0, 0, 4365, 4366, 5, 115, 0, 0, 4366, 4367, 5, 119, 0, 0, 4367, 4368, 5, 105, 0, 0, 4368, 4369, 5, 116, 0, 0, 4369, 4370, 5, 99, 0, 0, 4370, 4371, 5, 104, 0, 0, 4371, 568, 1, 0, 0, 0, 4372, 4373, 5, 99, 0, 0, 4373, 4374, 5, 112, 0, 0, 4374, 4375, 5, 111, 0, 0, 4375, 4376, 5, 98, 0, 0, 4376, 4487, 5, 106, 0, 0, 4377, 4378, 5, 108, 0, 0, 4378, 4379, 5, 100, 0, 0, 4379, 4380, 5, 111, 0, 0, 4380, 4381, 5, 98, 0, 0, 4381, 4487, 5, 106, 0, 0, 4382, 4383, 5, 99, 0, 0, 4383, 4384, 5, 97, 0, 0, 4384, 4385, 5, 115, 0, 0, 4385, 4386, 5, 116, 0, 0, 4386, 4387, 5, 99, 0, 0, 4387, 4388, 5, 108, 0, 0, 4388, 4389, 5, 97, 0, 0, 4389, 4390, 5, 115, 0, 0, 4390, 4487, 5, 115, 0, 0, 4391, 4392, 5, 105, 0, 0, 4392, 4393, 5, 115, 0, 0, 4393, 4394, 5, 105, 0, 0, 4394, 4395, 5, 110, 0, 0, 4395, 4396, 5, 115, 0, 0, 4396, 4487, 5, 116, 0, 0, 4397, 4398, 5, 117, 0, 0, 4398, 4399, 5, 110, 0, 0, 4399, 4400, 5, 98, 0, 0, 4400, 4401, 5, 111, 0, 0, 4401, 4487, 5, 120, 0, 0, 4402, 4403, 5, 115, 0, 0, 4403, 4404, 5, 116, 0, 0, 4404, 4405, 5, 111, 0, 0, 4405, 4406, 5, 98, 0, 0, 4406, 4487, 5, 106, 0, 0, 4407, 4408, 5, 98, 0, 0, 4408, 4409, 5, 111, 0, 0, 4409, 4487, 5, 120, 0, 0, 4410, 4411, 5, 110, 0, 0, 4411, 4412, 5, 101, 0, 0, 4412, 4413, 5, 119, 0, 0, 4413, 4414, 5, 97, 0, 0, 4414, 4415, 5, 114, 0, 0, 4415, 4487, 5, 114, 0, 0, 4416, 4417, 5, 108, 0, 0, 4417, 4418, 5, 100, 0, 0, 4418, 4419, 5, 101, 0, 0, 4419, 4420, 5, 108, 0, 0, 4420, 4421, 5, 101, 0, 0, 4421, 4422, 5, 109, 0, 0, 4422, 4487, 5, 97, 0, 0, 4423, 4424, 5, 108, 0, 0, 4424, 4425, 5, 100, 0, 0, 4425, 4426, 5, 101, 0, 0, 4426, 4427, 5, 108, 0, 0, 4427, 4428, 5, 101, 0, 0, 4428, 4487, 5, 109, 0, 0, 4429, 4430, 5, 115, 0, 0, 4430, 4431, 5, 116, 0, 0, 4431, 4432, 5, 101, 0, 0, 4432, 4433, 5, 108, 0, 0, 4433, 4434, 5, 101, 0, 0, 4434, 4487, 5, 109, 0, 0, 4435, 4436, 5, 117, 0, 0, 4436, 4437, 5, 110, 0, 0, 4437, 4438, 5, 98, 0, 0, 4438, 4439, 5, 111, 0, 0, 4439, 4440, 5, 120, 0, 0, 4440, 4441, 5, 46, 0, 0, 4441, 4442, 5, 97, 0, 0, 4442, 4443, 5, 110, 0, 0, 4443, 4487, 5, 121, 0, 0, 4444, 4445, 5, 114, 0, 0, 4445, 4446, 5, 101, 0, 0, 4446, 4447, 5, 102, 0, 0, 4447, 4448, 5, 97, 0, 0, 4448, 4449, 5, 110, 0, 0, 4449, 4450, 5, 121, 0, 0, 4450, 4451, 5, 118, 0, 0, 4451, 4452, 5, 97, 0, 0, 4452, 4487, 5, 108, 0, 0, 4453, 4454, 5, 109, 0, 0, 4454, 4455, 5, 107, 0, 0, 4455, 4456, 5, 114, 0, 0, 4456, 4457, 5, 101, 0, 0, 4457, 4458, 5, 102, 0, 0, 4458, 4459, 5, 97, 0, 0, 4459, 4460, 5, 110, 0, 0, 4460, 4487, 5, 121, 0, 0, 4461, 4462, 5, 105, 0, 0, 4462, 4463, 5, 110, 0, 0, 4463, 4464, 5, 105, 0, 0, 4464, 4465, 5, 116, 0, 0, 4465, 4466, 5, 111, 0, 0, 4466, 4467, 5, 98, 0, 0, 4467, 4487, 5, 106, 0, 0, 4468, 4469, 5, 99, 0, 0, 4469, 4470, 5, 111, 0, 0, 4470, 4471, 5, 110, 0, 0, 4471, 4472, 5, 115, 0, 0, 4472, 4473, 5, 116, 0, 0, 4473, 4474, 5, 114, 0, 0, 4474, 4475, 5, 97, 0, 0, 4475, 4476, 5, 105, 0, 0, 4476, 4477, 5, 110, 0, 0, 4477, 4478, 5, 101, 0, 0, 4478, 4479, 5, 100, 0, 0, 4479, 4487, 5, 46, 0, 0, 4480, 4481, 5, 115, 0, 0, 4481, 4482, 5, 105, 0, 0, 4482, 4483, 5, 122, 0, 0, 4483, 4484, 5, 101, 0, 0, 4484, 4485, 5, 111, 0, 0, 4485, 4487, 5, 102, 0, 0, 4486, 4372, 1, 0, 0, 0, 4486, 4377, 1, 0, 0, 0, 4486, 4382, 1, 0, 0, 0, 4486, 4391, 1, 0, 0, 0, 4486, 4397, 1, 0, 0, 0, 4486, 4402, 1, 0, 0, 0, 4486, 4407, 1, 0, 0, 0, 4486, 4410, 1, 0, 0, 0, 4486, 4416, 1, 0, 0, 0, 4486, 4423, 1, 0, 0, 0, 4486, 4429, 1, 0, 0, 0, 4486, 4435, 1, 0, 0, 0, 4486, 4444, 1, 0, 0, 0, 4486, 4453, 1, 0, 0, 0, 4486, 4461, 1, 0, 0, 0, 4486, 4468, 1, 0, 0, 0, 4486, 4480, 1, 0, 0, 0, 4487, 570, 1, 0, 0, 0, 4488, 4489, 5, 108, 0, 0, 4489, 4490, 5, 100, 0, 0, 4490, 4491, 5, 115, 0, 0, 4491, 4492, 5, 116, 0, 0, 4492, 4493, 5, 114, 0, 0, 4493, 572, 1, 0, 0, 0, 4494, 4495, 5, 108, 0, 0, 4495, 4496, 5, 100, 0, 0, 4496, 4497, 5, 102, 0, 0, 4497, 4498, 5, 108, 0, 0, 4498, 4530, 5, 100, 0, 0, 4499, 4500, 5, 108, 0, 0, 4500, 4501, 5, 100, 0, 0, 4501, 4502, 5, 102, 0, 0, 4502, 4503, 5, 108, 0, 0, 4503, 4504, 5, 100, 0, 0, 4504, 4530, 5, 97, 0, 0, 4505, 4506, 5, 115, 0, 0, 4506, 4507, 5, 116, 0, 0, 4507, 4508, 5, 102, 0, 0, 4508, 4509, 5, 108, 0, 0, 4509, 4530, 5, 100, 0, 0, 4510, 4511, 5, 108, 0, 0, 4511, 4512, 5, 100, 0, 0, 4512, 4513, 5, 115, 0, 0, 4513, 4514, 5, 102, 0, 0, 4514, 4515, 5, 108, 0, 0, 4515, 4530, 5, 100, 0, 0, 4516, 4517, 5, 108, 0, 0, 4517, 4518, 5, 100, 0, 0, 4518, 4519, 5, 115, 0, 0, 4519, 4520, 5, 102, 0, 0, 4520, 4521, 5, 108, 0, 0, 4521, 4522, 5, 100, 0, 0, 4522, 4530, 5, 97, 0, 0, 4523, 4524, 5, 115, 0, 0, 4524, 4525, 5, 116, 0, 0, 4525, 4526, 5, 115, 0, 0, 4526, 4527, 5, 102, 0, 0, 4527, 4528, 5, 108, 0, 0, 4528, 4530, 5, 100, 0, 0, 4529, 4494, 1, 0, 0, 0, 4529, 4499, 1, 0, 0, 0, 4529, 4505, 1, 0, 0, 0, 4529, 4510, 1, 0, 0, 0, 4529, 4516, 1, 0, 0, 0, 4529, 4523, 1, 0, 0, 0, 4530, 574, 1, 0, 0, 0, 4531, 4532, 5, 108, 0, 0, 4532, 4533, 5, 100, 0, 0, 4533, 4534, 5, 116, 0, 0, 4534, 4535, 5, 111, 0, 0, 4535, 4536, 5, 107, 0, 0, 4536, 4537, 5, 101, 0, 0, 4537, 4538, 5, 110, 0, 0, 4538, 576, 1, 0, 0, 0, 4539, 4540, 7, 8, 0, 0, 4540, 578, 1, 0, 0, 0, 4541, 4542, 7, 9, 0, 0, 4542, 580, 1, 0, 0, 0, 4543, 4544, 3, 583, 291, 0, 4544, 4545, 3, 531, 265, 0, 4545, 4547, 1, 0, 0, 0, 4546, 4543, 1, 0, 0, 0, 4547, 4548, 1, 0, 0, 0, 4548, 4546, 1, 0, 0, 0, 4548, 4549, 1, 0, 0, 0, 4549, 4550, 1, 0, 0, 0, 4550, 4551, 3, 583, 291, 0, 4551, 582, 1, 0, 0, 0, 4552, 4556, 3, 577, 288, 0, 4553, 4555, 3, 579, 289, 0, 4554, 4553, 1, 0, 0, 0, 4555, 4558, 1, 0, 0, 0, 4556, 4554, 1, 0, 0, 0, 4556, 4557, 1, 0, 0, 0, 4557, 584, 1, 0, 0, 0, 4558, 4556, 1, 0, 0, 0, 4559, 4560, 7, 0, 0, 0, 4560, 4561, 7, 0, 0, 0, 4561, 586, 1, 0, 0, 0, 4562, 4563, 7, 10, 0, 0, 4563, 4564, 1, 0, 0, 0, 4564, 4565, 6, 293, 0, 0, 4565, 588, 1, 0, 0, 0, 4566, 4567, 5, 47, 0, 0, 4567, 4568, 5, 47, 0, 0, 4568, 4572, 1, 0, 0, 0, 4569, 4571, 8, 11, 0, 0, 4570, 4569, 1, 0, 0, 0, 4571, 4574, 1, 0, 0, 0, 4572, 4570, 1, 0, 0, 0, 4572, 4573, 1, 0, 0, 0, 4573, 4575, 1, 0, 0, 0, 4574, 4572, 1, 0, 0, 0, 4575, 4576, 6, 294, 0, 0, 4576, 590, 1, 0, 0, 0, 4577, 4578, 5, 47, 0, 0, 4578, 4579, 5, 42, 0, 0, 4579, 4583, 1, 0, 0, 0, 4580, 4582, 9, 0, 0, 0, 4581, 4580, 1, 0, 0, 0, 4582, 4585, 1, 0, 0, 0, 4583, 4584, 1, 0, 0, 0, 4583, 4581, 1, 0, 0, 0, 4584, 4586, 1, 0, 0, 0, 4585, 4583, 1, 0, 0, 0, 4586, 4587, 5, 42, 0, 0, 4587, 4588, 5, 47, 0, 0, 4588, 4589, 1, 0, 0, 0, 4589, 4590, 6, 295, 0, 0, 4590, 592, 1, 0, 0, 0, 4591, 4592, 5, 46, 0, 0, 4592, 4593, 5, 112, 0, 0, 4593, 4594, 5, 101, 0, 0, 4594, 4595, 5, 114, 0, 0, 4595, 4596, 5, 109, 0, 0, 4596, 4597, 5, 105, 0, 0, 4597, 4598, 5, 115, 0, 0, 4598, 4599, 5, 115, 0, 0, 4599, 4600, 5, 105, 0, 0, 4600, 4601, 5, 111, 0, 0, 4601, 4602, 5, 110, 0, 0, 4602, 594, 1, 0, 0, 0, 4603, 4604, 5, 46, 0, 0, 4604, 4605, 5, 112, 0, 0, 4605, 4606, 5, 101, 0, 0, 4606, 4607, 5, 114, 0, 0, 4607, 4608, 5, 109, 0, 0, 4608, 4609, 5, 105, 0, 0, 4609, 4610, 5, 115, 0, 0, 4610, 4611, 5, 115, 0, 0, 4611, 4612, 5, 105, 0, 0, 4612, 4613, 5, 111, 0, 0, 4613, 4614, 5, 110, 0, 0, 4614, 4615, 5, 115, 0, 0, 4615, 4616, 5, 101, 0, 0, 4616, 4617, 5, 116, 0, 0, 4617, 596, 1, 0, 0, 0, 4618, 4619, 5, 46, 0, 0, 4619, 4620, 5, 101, 0, 0, 4620, 4621, 5, 109, 0, 0, 4621, 4622, 5, 105, 0, 0, 4622, 4623, 5, 116, 0, 0, 4623, 4624, 5, 98, 0, 0, 4624, 4625, 5, 121, 0, 0, 4625, 4626, 5, 116, 0, 0, 4626, 4627, 5, 101, 0, 0, 4627, 598, 1, 0, 0, 0, 4628, 4629, 5, 46, 0, 0, 4629, 4630, 5, 109, 0, 0, 4630, 4631, 5, 97, 0, 0, 4631, 4632, 5, 120, 0, 0, 4632, 4633, 5, 115, 0, 0, 4633, 4634, 5, 116, 0, 0, 4634, 4635, 5, 97, 0, 0, 4635, 4636, 5, 99, 0, 0, 4636, 4637, 5, 107, 0, 0, 4637, 600, 1, 0, 0, 0, 4638, 4639, 5, 46, 0, 0, 4639, 4640, 5, 101, 0, 0, 4640, 4641, 5, 110, 0, 0, 4641, 4642, 5, 116, 0, 0, 4642, 4643, 5, 114, 0, 0, 4643, 4644, 5, 121, 0, 0, 4644, 4645, 5, 112, 0, 0, 4645, 4646, 5, 111, 0, 0, 4646, 4647, 5, 105, 0, 0, 4647, 4648, 5, 110, 0, 0, 4648, 4649, 5, 116, 0, 0, 4649, 602, 1, 0, 0, 0, 4650, 4651, 5, 46, 0, 0, 4651, 4652, 5, 122, 0, 0, 4652, 4653, 5, 101, 0, 0, 4653, 4654, 5, 114, 0, 0, 4654, 4655, 5, 111, 0, 0, 4655, 4656, 5, 105, 0, 0, 4656, 4657, 5, 110, 0, 0, 4657, 4658, 5, 105, 0, 0, 4658, 4659, 5, 116, 0, 0, 4659, 604, 1, 0, 0, 0, 4660, 4661, 5, 46, 0, 0, 4661, 4662, 5, 108, 0, 0, 4662, 4663, 5, 111, 0, 0, 4663, 4664, 5, 99, 0, 0, 4664, 4665, 5, 97, 0, 0, 4665, 4666, 5, 108, 0, 0, 4666, 4667, 5, 115, 0, 0, 4667, 606, 1, 0, 0, 0, 4668, 4669, 5, 46, 0, 0, 4669, 4670, 5, 101, 0, 0, 4670, 4671, 5, 120, 0, 0, 4671, 4672, 5, 112, 0, 0, 4672, 4673, 5, 111, 0, 0, 4673, 4674, 5, 114, 0, 0, 4674, 4675, 5, 116, 0, 0, 4675, 608, 1, 0, 0, 0, 4676, 4677, 5, 46, 0, 0, 4677, 4678, 5, 111, 0, 0, 4678, 4679, 5, 118, 0, 0, 4679, 4680, 5, 101, 0, 0, 4680, 4681, 5, 114, 0, 0, 4681, 4682, 5, 114, 0, 0, 4682, 4683, 5, 105, 0, 0, 4683, 4684, 5, 100, 0, 0, 4684, 4685, 5, 101, 0, 0, 4685, 610, 1, 0, 0, 0, 4686, 4687, 5, 46, 0, 0, 4687, 4688, 5, 118, 0, 0, 4688, 4689, 5, 116, 0, 0, 4689, 4690, 5, 101, 0, 0, 4690, 4691, 5, 110, 0, 0, 4691, 4692, 5, 116, 0, 0, 4692, 4693, 5, 114, 0, 0, 4693, 4694, 5, 121, 0, 0, 4694, 612, 1, 0, 0, 0, 45, 0, 2024, 2032, 2037, 2039, 2042, 2050, 2055, 2057, 2060, 2065, 2071, 2075, 2080, 2082, 2086, 2091, 2093, 2099, 2103, 2108, 2110, 2112, 2149, 2701, 2752, 2755, 2758, 2761, 2766, 2768, 2776, 2778, 4032, 4110, 4139, 4160, 4197, 4363, 4486, 4529, 4548, 4556, 4572, 4583, 1, 6, 0, 0]
\ No newline at end of file
+[4, 0, 303, 4715, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 2, 185, 7, 185, 2, 186, 7, 186, 2, 187, 7, 187, 2, 188, 7, 188, 2, 189, 7, 189, 2, 190, 7, 190, 2, 191, 7, 191, 2, 192, 7, 192, 2, 193, 7, 193, 2, 194, 7, 194, 2, 195, 7, 195, 2, 196, 7, 196, 2, 197, 7, 197, 2, 198, 7, 198, 2, 199, 7, 199, 2, 200, 7, 200, 2, 201, 7, 201, 2, 202, 7, 202, 2, 203, 7, 203, 2, 204, 7, 204, 2, 205, 7, 205, 2, 206, 7, 206, 2, 207, 7, 207, 2, 208, 7, 208, 2, 209, 7, 209, 2, 210, 7, 210, 2, 211, 7, 211, 2, 212, 7, 212, 2, 213, 7, 213, 2, 214, 7, 214, 2, 215, 7, 215, 2, 216, 7, 216, 2, 217, 7, 217, 2, 218, 7, 218, 2, 219, 7, 219, 2, 220, 7, 220, 2, 221, 7, 221, 2, 222, 7, 222, 2, 223, 7, 223, 2, 224, 7, 224, 2, 225, 7, 225, 2, 226, 7, 226, 2, 227, 7, 227, 2, 228, 7, 228, 2, 229, 7, 229, 2, 230, 7, 230, 2, 231, 7, 231, 2, 232, 7, 232, 2, 233, 7, 233, 2, 234, 7, 234, 2, 235, 7, 235, 2, 236, 7, 236, 2, 237, 7, 237, 2, 238, 7, 238, 2, 239, 7, 239, 2, 240, 7, 240, 2, 241, 7, 241, 2, 242, 7, 242, 2, 243, 7, 243, 2, 244, 7, 244, 2, 245, 7, 245, 2, 246, 7, 246, 2, 247, 7, 247, 2, 248, 7, 248, 2, 249, 7, 249, 2, 250, 7, 250, 2, 251, 7, 251, 2, 252, 7, 252, 2, 253, 7, 253, 2, 254, 7, 254, 2, 255, 7, 255, 2, 256, 7, 256, 2, 257, 7, 257, 2, 258, 7, 258, 2, 259, 7, 259, 2, 260, 7, 260, 2, 261, 7, 261, 2, 262, 7, 262, 2, 263, 7, 263, 2, 264, 7, 264, 2, 265, 7, 265, 2, 266, 7, 266, 2, 267, 7, 267, 2, 268, 7, 268, 2, 269, 7, 269, 2, 270, 7, 270, 2, 271, 7, 271, 2, 272, 7, 272, 2, 273, 7, 273, 2, 274, 7, 274, 2, 275, 7, 275, 2, 276, 7, 276, 2, 277, 7, 277, 2, 278, 7, 278, 2, 279, 7, 279, 2, 280, 7, 280, 2, 281, 7, 281, 2, 282, 7, 282, 2, 283, 7, 283, 2, 284, 7, 284, 2, 285, 7, 285, 2, 286, 7, 286, 2, 287, 7, 287, 2, 288, 7, 288, 2, 289, 7, 289, 2, 290, 7, 290, 2, 291, 7, 291, 2, 292, 7, 292, 2, 293, 7, 293, 2, 294, 7, 294, 2, 295, 7, 295, 2, 296, 7, 296, 2, 297, 7, 297, 2, 298, 7, 298, 2, 299, 7, 299, 2, 300, 7, 300, 2, 301, 7, 301, 2, 302, 7, 302, 2, 303, 7, 303, 2, 304, 7, 304, 2, 305, 7, 305, 2, 306, 7, 306, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 86, 1, 86, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 165, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 172, 3, 172, 2038, 8, 172, 1, 172, 1, 172, 1, 172, 1, 172, 4, 172, 2044, 8, 172, 11, 172, 12, 172, 2045, 1, 172, 4, 172, 2049, 8, 172, 11, 172, 12, 172, 2050, 3, 172, 2053, 8, 172, 1, 173, 3, 173, 2056, 8, 173, 1, 173, 1, 173, 1, 173, 1, 173, 4, 173, 2062, 8, 173, 11, 173, 12, 173, 2063, 1, 173, 4, 173, 2067, 8, 173, 11, 173, 12, 173, 2068, 3, 173, 2071, 8, 173, 1, 174, 3, 174, 2074, 8, 174, 1, 174, 4, 174, 2077, 8, 174, 11, 174, 12, 174, 2078, 1, 174, 1, 174, 4, 174, 2083, 8, 174, 11, 174, 12, 174, 2084, 1, 174, 1, 174, 3, 174, 2089, 8, 174, 1, 174, 4, 174, 2092, 8, 174, 11, 174, 12, 174, 2093, 3, 174, 2096, 8, 174, 1, 174, 1, 174, 3, 174, 2100, 8, 174, 1, 174, 4, 174, 2103, 8, 174, 11, 174, 12, 174, 2104, 3, 174, 2107, 8, 174, 1, 174, 1, 174, 4, 174, 2111, 8, 174, 11, 174, 12, 174, 2112, 1, 174, 1, 174, 3, 174, 2117, 8, 174, 1, 174, 4, 174, 2120, 8, 174, 11, 174, 12, 174, 2121, 3, 174, 2124, 8, 174, 3, 174, 2126, 8, 174, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 1, 176, 1, 176, 1, 177, 1, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 3, 180, 2163, 8, 180, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 193, 1, 193, 1, 193, 1, 193, 1, 193, 1, 193, 1, 193, 1, 194, 1, 194, 1, 194, 1, 194, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 1, 196, 1, 196, 1, 196, 1, 196, 1, 196, 1, 197, 1, 197, 1, 197, 1, 197, 1, 197, 1, 197, 1, 197, 1, 198, 1, 198, 1, 198, 1, 198, 1, 198, 1, 198, 1, 198, 1, 198, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 201, 1, 201, 1, 201, 1, 201, 1, 201, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 205, 1, 205, 1, 205, 1, 205, 1, 205, 1, 205, 1, 205, 1, 205, 1, 205, 1, 205, 1, 206, 1, 206, 1, 206, 1, 206, 1, 206, 1, 206, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 208, 1, 208, 1, 208, 1, 208, 1, 208, 1, 208, 1, 208, 1, 208, 1, 208, 1, 209, 1, 209, 1, 209, 1, 209, 1, 209, 1, 209, 1, 209, 1, 209, 1, 210, 1, 210, 1, 210, 1, 210, 1, 210, 1, 210, 1, 211, 1, 211, 1, 211, 1, 211, 1, 211, 1, 211, 1, 211, 1, 211, 1, 212, 1, 212, 1, 212, 1, 212, 1, 212, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 214, 1, 214, 1, 214, 1, 214, 1, 214, 1, 214, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 219, 1, 219, 1, 219, 1, 219, 1, 219, 1, 219, 1, 219, 1, 219, 1, 219, 1, 219, 1, 220, 1, 220, 1, 220, 1, 220, 1, 220, 1, 220, 1, 220, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 226, 1, 226, 1, 226, 1, 226, 1, 226, 1, 226, 1, 226, 1, 227, 1, 227, 1, 227, 1, 227, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 230, 1, 230, 1, 230, 1, 230, 1, 230, 1, 230, 1, 230, 1, 230, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 235, 1, 235, 1, 235, 1, 235, 1, 235, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 241, 1, 241, 1, 241, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 245, 1, 245, 1, 245, 1, 245, 1, 245, 1, 245, 1, 245, 1, 245, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 247, 1, 247, 1, 247, 1, 247, 1, 247, 1, 247, 1, 247, 1, 247, 1, 247, 1, 247, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 251, 1, 251, 1, 251, 1, 251, 1, 251, 1, 251, 1, 251, 1, 251, 1, 251, 1, 252, 1, 252, 1, 253, 1, 253, 1, 253, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 3, 254, 2716, 8, 254, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 258, 1, 258, 1, 258, 1, 258, 1, 258, 1, 258, 1, 259, 1, 259, 1, 259, 1, 259, 1, 259, 1, 259, 1, 259, 1, 259, 1, 260, 1, 260, 1, 261, 1, 261, 1, 261, 1, 262, 1, 262, 1, 263, 1, 263, 1, 263, 1, 263, 3, 263, 2767, 8, 263, 1, 263, 3, 263, 2770, 8, 263, 1, 263, 3, 263, 2773, 8, 263, 1, 263, 3, 263, 2776, 8, 263, 1, 264, 1, 264, 1, 264, 5, 264, 2781, 8, 264, 10, 264, 12, 264, 2784, 9, 264, 1, 264, 1, 264, 1, 265, 1, 265, 1, 265, 5, 265, 2791, 8, 265, 10, 265, 12, 265, 2794, 9, 265, 1, 265, 1, 265, 1, 266, 1, 266, 1, 267, 1, 267, 1, 268, 1, 268, 1, 268, 1, 268, 1, 268, 1, 268, 1, 268, 1, 268, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 272, 1, 272, 1, 272, 1, 272, 1, 272, 1, 272, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 3, 276, 4053, 8, 276, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 3, 277, 4131, 8, 277, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 3, 278, 4160, 8, 278, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 3, 280, 4181, 8, 280, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 3, 281, 4218, 8, 281, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 3, 283, 4384, 8, 283, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 3, 285, 4507, 8, 285, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 3, 287, 4550, 8, 287, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 289, 1, 289, 1, 290, 1, 290, 1, 291, 1, 291, 1, 291, 4, 291, 4567, 8, 291, 11, 291, 12, 291, 4568, 1, 291, 1, 291, 1, 292, 1, 292, 5, 292, 4575, 8, 292, 10, 292, 12, 292, 4578, 9, 292, 1, 293, 1, 293, 1, 293, 1, 294, 1, 294, 1, 294, 1, 294, 1, 295, 1, 295, 1, 295, 1, 295, 5, 295, 4591, 8, 295, 10, 295, 12, 295, 4594, 9, 295, 1, 295, 1, 295, 1, 296, 1, 296, 1, 296, 1, 296, 5, 296, 4602, 8, 296, 10, 296, 12, 296, 4605, 9, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 4603, 0, 307, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 132, 265, 133, 267, 134, 269, 135, 271, 136, 273, 137, 275, 138, 277, 139, 279, 140, 281, 141, 283, 142, 285, 143, 287, 144, 289, 145, 291, 146, 293, 147, 295, 148, 297, 149, 299, 150, 301, 151, 303, 152, 305, 153, 307, 154, 309, 155, 311, 156, 313, 157, 315, 158, 317, 159, 319, 160, 321, 161, 323, 162, 325, 163, 327, 164, 329, 165, 331, 166, 333, 167, 335, 168, 337, 169, 339, 170, 341, 171, 343, 172, 345, 173, 347, 174, 349, 175, 351, 176, 353, 177, 355, 178, 357, 179, 359, 180, 361, 181, 363, 182, 365, 183, 367, 184, 369, 185, 371, 186, 373, 187, 375, 188, 377, 189, 379, 0, 381, 190, 383, 191, 385, 192, 387, 193, 389, 194, 391, 195, 393, 196, 395, 197, 397, 198, 399, 199, 401, 200, 403, 201, 405, 202, 407, 203, 409, 204, 411, 205, 413, 206, 415, 207, 417, 208, 419, 209, 421, 210, 423, 211, 425, 212, 427, 213, 429, 214, 431, 215, 433, 216, 435, 217, 437, 218, 439, 219, 441, 220, 443, 221, 445, 222, 447, 223, 449, 224, 451, 225, 453, 226, 455, 227, 457, 228, 459, 229, 461, 230, 463, 231, 465, 232, 467, 233, 469, 234, 471, 235, 473, 236, 475, 237, 477, 238, 479, 239, 481, 240, 483, 241, 485, 242, 487, 243, 489, 244, 491, 245, 493, 246, 495, 247, 497, 248, 499, 249, 501, 250, 503, 251, 505, 252, 507, 253, 509, 254, 511, 255, 513, 256, 515, 257, 517, 258, 519, 259, 521, 260, 523, 261, 525, 262, 527, 0, 529, 263, 531, 264, 533, 265, 535, 266, 537, 267, 539, 268, 541, 269, 543, 270, 545, 271, 547, 272, 549, 273, 551, 274, 553, 275, 555, 276, 557, 277, 559, 278, 561, 279, 563, 280, 565, 281, 567, 282, 569, 283, 571, 284, 573, 285, 575, 286, 577, 287, 579, 0, 581, 0, 583, 288, 585, 289, 587, 290, 589, 291, 591, 292, 593, 293, 595, 294, 597, 295, 599, 296, 601, 297, 603, 298, 605, 299, 607, 300, 609, 301, 611, 302, 613, 303, 1, 0, 12, 3, 0, 48, 57, 65, 70, 97, 102, 1, 0, 48, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 11, 0, 34, 34, 39, 39, 47, 48, 63, 63, 92, 92, 97, 98, 102, 102, 110, 110, 114, 114, 116, 116, 118, 118, 1, 0, 48, 55, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 4, 0, 10, 10, 13, 13, 39, 39, 92, 92, 4, 0, 35, 36, 63, 90, 95, 95, 97, 122, 4, 0, 35, 36, 48, 57, 63, 90, 95, 122, 3, 0, 9, 10, 13, 13, 32, 32, 2, 0, 10, 10, 13, 13, 4968, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 0, 213, 1, 0, 0, 0, 0, 215, 1, 0, 0, 0, 0, 217, 1, 0, 0, 0, 0, 219, 1, 0, 0, 0, 0, 221, 1, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 225, 1, 0, 0, 0, 0, 227, 1, 0, 0, 0, 0, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 261, 1, 0, 0, 0, 0, 263, 1, 0, 0, 0, 0, 265, 1, 0, 0, 0, 0, 267, 1, 0, 0, 0, 0, 269, 1, 0, 0, 0, 0, 271, 1, 0, 0, 0, 0, 273, 1, 0, 0, 0, 0, 275, 1, 0, 0, 0, 0, 277, 1, 0, 0, 0, 0, 279, 1, 0, 0, 0, 0, 281, 1, 0, 0, 0, 0, 283, 1, 0, 0, 0, 0, 285, 1, 0, 0, 0, 0, 287, 1, 0, 0, 0, 0, 289, 1, 0, 0, 0, 0, 291, 1, 0, 0, 0, 0, 293, 1, 0, 0, 0, 0, 295, 1, 0, 0, 0, 0, 297, 1, 0, 0, 0, 0, 299, 1, 0, 0, 0, 0, 301, 1, 0, 0, 0, 0, 303, 1, 0, 0, 0, 0, 305, 1, 0, 0, 0, 0, 307, 1, 0, 0, 0, 0, 309, 1, 0, 0, 0, 0, 311, 1, 0, 0, 0, 0, 313, 1, 0, 0, 0, 0, 315, 1, 0, 0, 0, 0, 317, 1, 0, 0, 0, 0, 319, 1, 0, 0, 0, 0, 321, 1, 0, 0, 0, 0, 323, 1, 0, 0, 0, 0, 325, 1, 0, 0, 0, 0, 327, 1, 0, 0, 0, 0, 329, 1, 0, 0, 0, 0, 331, 1, 0, 0, 0, 0, 333, 1, 0, 0, 0, 0, 335, 1, 0, 0, 0, 0, 337, 1, 0, 0, 0, 0, 339, 1, 0, 0, 0, 0, 341, 1, 0, 0, 0, 0, 343, 1, 0, 0, 0, 0, 345, 1, 0, 0, 0, 0, 347, 1, 0, 0, 0, 0, 349, 1, 0, 0, 0, 0, 351, 1, 0, 0, 0, 0, 353, 1, 0, 0, 0, 0, 355, 1, 0, 0, 0, 0, 357, 1, 0, 0, 0, 0, 359, 1, 0, 0, 0, 0, 361, 1, 0, 0, 0, 0, 363, 1, 0, 0, 0, 0, 365, 1, 0, 0, 0, 0, 367, 1, 0, 0, 0, 0, 369, 1, 0, 0, 0, 0, 371, 1, 0, 0, 0, 0, 373, 1, 0, 0, 0, 0, 375, 1, 0, 0, 0, 0, 377, 1, 0, 0, 0, 0, 381, 1, 0, 0, 0, 0, 383, 1, 0, 0, 0, 0, 385, 1, 0, 0, 0, 0, 387, 1, 0, 0, 0, 0, 389, 1, 0, 0, 0, 0, 391, 1, 0, 0, 0, 0, 393, 1, 0, 0, 0, 0, 395, 1, 0, 0, 0, 0, 397, 1, 0, 0, 0, 0, 399, 1, 0, 0, 0, 0, 401, 1, 0, 0, 0, 0, 403, 1, 0, 0, 0, 0, 405, 1, 0, 0, 0, 0, 407, 1, 0, 0, 0, 0, 409, 1, 0, 0, 0, 0, 411, 1, 0, 0, 0, 0, 413, 1, 0, 0, 0, 0, 415, 1, 0, 0, 0, 0, 417, 1, 0, 0, 0, 0, 419, 1, 0, 0, 0, 0, 421, 1, 0, 0, 0, 0, 423, 1, 0, 0, 0, 0, 425, 1, 0, 0, 0, 0, 427, 1, 0, 0, 0, 0, 429, 1, 0, 0, 0, 0, 431, 1, 0, 0, 0, 0, 433, 1, 0, 0, 0, 0, 435, 1, 0, 0, 0, 0, 437, 1, 0, 0, 0, 0, 439, 1, 0, 0, 0, 0, 441, 1, 0, 0, 0, 0, 443, 1, 0, 0, 0, 0, 445, 1, 0, 0, 0, 0, 447, 1, 0, 0, 0, 0, 449, 1, 0, 0, 0, 0, 451, 1, 0, 0, 0, 0, 453, 1, 0, 0, 0, 0, 455, 1, 0, 0, 0, 0, 457, 1, 0, 0, 0, 0, 459, 1, 0, 0, 0, 0, 461, 1, 0, 0, 0, 0, 463, 1, 0, 0, 0, 0, 465, 1, 0, 0, 0, 0, 467, 1, 0, 0, 0, 0, 469, 1, 0, 0, 0, 0, 471, 1, 0, 0, 0, 0, 473, 1, 0, 0, 0, 0, 475, 1, 0, 0, 0, 0, 477, 1, 0, 0, 0, 0, 479, 1, 0, 0, 0, 0, 481, 1, 0, 0, 0, 0, 483, 1, 0, 0, 0, 0, 485, 1, 0, 0, 0, 0, 487, 1, 0, 0, 0, 0, 489, 1, 0, 0, 0, 0, 491, 1, 0, 0, 0, 0, 493, 1, 0, 0, 0, 0, 495, 1, 0, 0, 0, 0, 497, 1, 0, 0, 0, 0, 499, 1, 0, 0, 0, 0, 501, 1, 0, 0, 0, 0, 503, 1, 0, 0, 0, 0, 505, 1, 0, 0, 0, 0, 507, 1, 0, 0, 0, 0, 509, 1, 0, 0, 0, 0, 511, 1, 0, 0, 0, 0, 513, 1, 0, 0, 0, 0, 515, 1, 0, 0, 0, 0, 517, 1, 0, 0, 0, 0, 519, 1, 0, 0, 0, 0, 521, 1, 0, 0, 0, 0, 523, 1, 0, 0, 0, 0, 525, 1, 0, 0, 0, 0, 529, 1, 0, 0, 0, 0, 531, 1, 0, 0, 0, 0, 533, 1, 0, 0, 0, 0, 535, 1, 0, 0, 0, 0, 537, 1, 0, 0, 0, 0, 539, 1, 0, 0, 0, 0, 541, 1, 0, 0, 0, 0, 543, 1, 0, 0, 0, 0, 545, 1, 0, 0, 0, 0, 547, 1, 0, 0, 0, 0, 549, 1, 0, 0, 0, 0, 551, 1, 0, 0, 0, 0, 553, 1, 0, 0, 0, 0, 555, 1, 0, 0, 0, 0, 557, 1, 0, 0, 0, 0, 559, 1, 0, 0, 0, 0, 561, 1, 0, 0, 0, 0, 563, 1, 0, 0, 0, 0, 565, 1, 0, 0, 0, 0, 567, 1, 0, 0, 0, 0, 569, 1, 0, 0, 0, 0, 571, 1, 0, 0, 0, 0, 573, 1, 0, 0, 0, 0, 575, 1, 0, 0, 0, 0, 577, 1, 0, 0, 0, 0, 583, 1, 0, 0, 0, 0, 585, 1, 0, 0, 0, 0, 587, 1, 0, 0, 0, 0, 589, 1, 0, 0, 0, 0, 591, 1, 0, 0, 0, 0, 593, 1, 0, 0, 0, 0, 595, 1, 0, 0, 0, 0, 597, 1, 0, 0, 0, 0, 599, 1, 0, 0, 0, 0, 601, 1, 0, 0, 0, 0, 603, 1, 0, 0, 0, 0, 605, 1, 0, 0, 0, 0, 607, 1, 0, 0, 0, 0, 609, 1, 0, 0, 0, 0, 611, 1, 0, 0, 0, 0, 613, 1, 0, 0, 0, 1, 615, 1, 0, 0, 0, 3, 622, 1, 0, 0, 0, 5, 626, 1, 0, 0, 0, 7, 632, 1, 0, 0, 0, 9, 640, 1, 0, 0, 0, 11, 651, 1, 0, 0, 0, 13, 663, 1, 0, 0, 0, 15, 671, 1, 0, 0, 0, 17, 684, 1, 0, 0, 0, 19, 697, 1, 0, 0, 0, 21, 708, 1, 0, 0, 0, 23, 727, 1, 0, 0, 0, 25, 742, 1, 0, 0, 0, 27, 765, 1, 0, 0, 0, 29, 771, 1, 0, 0, 0, 31, 780, 1, 0, 0, 0, 33, 789, 1, 0, 0, 0, 35, 791, 1, 0, 0, 0, 37, 793, 1, 0, 0, 0, 39, 804, 1, 0, 0, 0, 41, 814, 1, 0, 0, 0, 43, 820, 1, 0, 0, 0, 45, 830, 1, 0, 0, 0, 47, 841, 1, 0, 0, 0, 49, 855, 1, 0, 0, 0, 51, 865, 1, 0, 0, 0, 53, 875, 1, 0, 0, 0, 55, 885, 1, 0, 0, 0, 57, 887, 1, 0, 0, 0, 59, 897, 1, 0, 0, 0, 61, 899, 1, 0, 0, 0, 63, 901, 1, 0, 0, 0, 65, 903, 1, 0, 0, 0, 67, 912, 1, 0, 0, 0, 69, 915, 1, 0, 0, 0, 71, 923, 1, 0, 0, 0, 73, 925, 1, 0, 0, 0, 75, 931, 1, 0, 0, 0, 77, 940, 1, 0, 0, 0, 79, 946, 1, 0, 0, 0, 81, 953, 1, 0, 0, 0, 83, 962, 1, 0, 0, 0, 85, 964, 1, 0, 0, 0, 87, 966, 1, 0, 0, 0, 89, 969, 1, 0, 0, 0, 91, 983, 1, 0, 0, 0, 93, 999, 1, 0, 0, 0, 95, 1015, 1, 0, 0, 0, 97, 1023, 1, 0, 0, 0, 99, 1034, 1, 0, 0, 0, 101, 1041, 1, 0, 0, 0, 103, 1048, 1, 0, 0, 0, 105, 1056, 1, 0, 0, 0, 107, 1063, 1, 0, 0, 0, 109, 1072, 1, 0, 0, 0, 111, 1077, 1, 0, 0, 0, 113, 1088, 1, 0, 0, 0, 115, 1096, 1, 0, 0, 0, 117, 1105, 1, 0, 0, 0, 119, 1112, 1, 0, 0, 0, 121, 1125, 1, 0, 0, 0, 123, 1140, 1, 0, 0, 0, 125, 1147, 1, 0, 0, 0, 127, 1154, 1, 0, 0, 0, 129, 1163, 1, 0, 0, 0, 131, 1175, 1, 0, 0, 0, 133, 1186, 1, 0, 0, 0, 135, 1202, 1, 0, 0, 0, 137, 1214, 1, 0, 0, 0, 139, 1228, 1, 0, 0, 0, 141, 1234, 1, 0, 0, 0, 143, 1242, 1, 0, 0, 0, 145, 1253, 1, 0, 0, 0, 147, 1259, 1, 0, 0, 0, 149, 1265, 1, 0, 0, 0, 151, 1267, 1, 0, 0, 0, 153, 1278, 1, 0, 0, 0, 155, 1291, 1, 0, 0, 0, 157, 1302, 1, 0, 0, 0, 159, 1317, 1, 0, 0, 0, 161, 1321, 1, 0, 0, 0, 163, 1327, 1, 0, 0, 0, 165, 1331, 1, 0, 0, 0, 167, 1337, 1, 0, 0, 0, 169, 1347, 1, 0, 0, 0, 171, 1350, 1, 0, 0, 0, 173, 1352, 1, 0, 0, 0, 175, 1354, 1, 0, 0, 0, 177, 1356, 1, 0, 0, 0, 179, 1366, 1, 0, 0, 0, 181, 1375, 1, 0, 0, 0, 183, 1384, 1, 0, 0, 0, 185, 1391, 1, 0, 0, 0, 187, 1398, 1, 0, 0, 0, 189, 1405, 1, 0, 0, 0, 191, 1410, 1, 0, 0, 0, 193, 1416, 1, 0, 0, 0, 195, 1424, 1, 0, 0, 0, 197, 1431, 1, 0, 0, 0, 199, 1438, 1, 0, 0, 0, 201, 1443, 1, 0, 0, 0, 203, 1454, 1, 0, 0, 0, 205, 1464, 1, 0, 0, 0, 207, 1477, 1, 0, 0, 0, 209, 1484, 1, 0, 0, 0, 211, 1491, 1, 0, 0, 0, 213, 1501, 1, 0, 0, 0, 215, 1513, 1, 0, 0, 0, 217, 1524, 1, 0, 0, 0, 219, 1537, 1, 0, 0, 0, 221, 1554, 1, 0, 0, 0, 223, 1572, 1, 0, 0, 0, 225, 1581, 1, 0, 0, 0, 227, 1589, 1, 0, 0, 0, 229, 1591, 1, 0, 0, 0, 231, 1601, 1, 0, 0, 0, 233, 1607, 1, 0, 0, 0, 235, 1613, 1, 0, 0, 0, 237, 1619, 1, 0, 0, 0, 239, 1624, 1, 0, 0, 0, 241, 1639, 1, 0, 0, 0, 243, 1646, 1, 0, 0, 0, 245, 1654, 1, 0, 0, 0, 247, 1661, 1, 0, 0, 0, 249, 1670, 1, 0, 0, 0, 251, 1683, 1, 0, 0, 0, 253, 1691, 1, 0, 0, 0, 255, 1705, 1, 0, 0, 0, 257, 1712, 1, 0, 0, 0, 259, 1719, 1, 0, 0, 0, 261, 1729, 1, 0, 0, 0, 263, 1735, 1, 0, 0, 0, 265, 1742, 1, 0, 0, 0, 267, 1752, 1, 0, 0, 0, 269, 1757, 1, 0, 0, 0, 271, 1762, 1, 0, 0, 0, 273, 1765, 1, 0, 0, 0, 275, 1769, 1, 0, 0, 0, 277, 1773, 1, 0, 0, 0, 279, 1781, 1, 0, 0, 0, 281, 1787, 1, 0, 0, 0, 283, 1795, 1, 0, 0, 0, 285, 1802, 1, 0, 0, 0, 287, 1812, 1, 0, 0, 0, 289, 1820, 1, 0, 0, 0, 291, 1833, 1, 0, 0, 0, 293, 1843, 1, 0, 0, 0, 295, 1855, 1, 0, 0, 0, 297, 1864, 1, 0, 0, 0, 299, 1872, 1, 0, 0, 0, 301, 1879, 1, 0, 0, 0, 303, 1887, 1, 0, 0, 0, 305, 1890, 1, 0, 0, 0, 307, 1894, 1, 0, 0, 0, 309, 1907, 1, 0, 0, 0, 311, 1914, 1, 0, 0, 0, 313, 1917, 1, 0, 0, 0, 315, 1922, 1, 0, 0, 0, 317, 1927, 1, 0, 0, 0, 319, 1930, 1, 0, 0, 0, 321, 1937, 1, 0, 0, 0, 323, 1943, 1, 0, 0, 0, 325, 1951, 1, 0, 0, 0, 327, 1957, 1, 0, 0, 0, 329, 1965, 1, 0, 0, 0, 331, 1971, 1, 0, 0, 0, 333, 1975, 1, 0, 0, 0, 335, 1986, 1, 0, 0, 0, 337, 1997, 1, 0, 0, 0, 339, 2002, 1, 0, 0, 0, 341, 2010, 1, 0, 0, 0, 343, 2026, 1, 0, 0, 0, 345, 2037, 1, 0, 0, 0, 347, 2055, 1, 0, 0, 0, 349, 2073, 1, 0, 0, 0, 351, 2127, 1, 0, 0, 0, 353, 2130, 1, 0, 0, 0, 355, 2134, 1, 0, 0, 0, 357, 2139, 1, 0, 0, 0, 359, 2147, 1, 0, 0, 0, 361, 2162, 1, 0, 0, 0, 363, 2164, 1, 0, 0, 0, 365, 2171, 1, 0, 0, 0, 367, 2176, 1, 0, 0, 0, 369, 2181, 1, 0, 0, 0, 371, 2187, 1, 0, 0, 0, 373, 2193, 1, 0, 0, 0, 375, 2199, 1, 0, 0, 0, 377, 2207, 1, 0, 0, 0, 379, 2215, 1, 0, 0, 0, 381, 2224, 1, 0, 0, 0, 383, 2230, 1, 0, 0, 0, 385, 2237, 1, 0, 0, 0, 387, 2244, 1, 0, 0, 0, 389, 2251, 1, 0, 0, 0, 391, 2255, 1, 0, 0, 0, 393, 2260, 1, 0, 0, 0, 395, 2265, 1, 0, 0, 0, 397, 2272, 1, 0, 0, 0, 399, 2280, 1, 0, 0, 0, 401, 2286, 1, 0, 0, 0, 403, 2296, 1, 0, 0, 0, 405, 2301, 1, 0, 0, 0, 407, 2306, 1, 0, 0, 0, 409, 2313, 1, 0, 0, 0, 411, 2319, 1, 0, 0, 0, 413, 2329, 1, 0, 0, 0, 415, 2335, 1, 0, 0, 0, 417, 2343, 1, 0, 0, 0, 419, 2352, 1, 0, 0, 0, 421, 2360, 1, 0, 0, 0, 423, 2366, 1, 0, 0, 0, 425, 2374, 1, 0, 0, 0, 427, 2379, 1, 0, 0, 0, 429, 2384, 1, 0, 0, 0, 431, 2390, 1, 0, 0, 0, 433, 2397, 1, 0, 0, 0, 435, 2404, 1, 0, 0, 0, 437, 2414, 1, 0, 0, 0, 439, 2423, 1, 0, 0, 0, 441, 2433, 1, 0, 0, 0, 443, 2440, 1, 0, 0, 0, 445, 2450, 1, 0, 0, 0, 447, 2460, 1, 0, 0, 0, 449, 2469, 1, 0, 0, 0, 451, 2474, 1, 0, 0, 0, 453, 2480, 1, 0, 0, 0, 455, 2487, 1, 0, 0, 0, 457, 2491, 1, 0, 0, 0, 459, 2500, 1, 0, 0, 0, 461, 2507, 1, 0, 0, 0, 463, 2515, 1, 0, 0, 0, 465, 2522, 1, 0, 0, 0, 467, 2534, 1, 0, 0, 0, 469, 2541, 1, 0, 0, 0, 471, 2550, 1, 0, 0, 0, 473, 2555, 1, 0, 0, 0, 475, 2562, 1, 0, 0, 0, 477, 2570, 1, 0, 0, 0, 479, 2586, 1, 0, 0, 0, 481, 2600, 1, 0, 0, 0, 483, 2612, 1, 0, 0, 0, 485, 2615, 1, 0, 0, 0, 487, 2621, 1, 0, 0, 0, 489, 2630, 1, 0, 0, 0, 491, 2639, 1, 0, 0, 0, 493, 2647, 1, 0, 0, 0, 495, 2654, 1, 0, 0, 0, 497, 2664, 1, 0, 0, 0, 499, 2670, 1, 0, 0, 0, 501, 2678, 1, 0, 0, 0, 503, 2687, 1, 0, 0, 0, 505, 2696, 1, 0, 0, 0, 507, 2698, 1, 0, 0, 0, 509, 2715, 1, 0, 0, 0, 511, 2717, 1, 0, 0, 0, 513, 2724, 1, 0, 0, 0, 515, 2735, 1, 0, 0, 0, 517, 2741, 1, 0, 0, 0, 519, 2747, 1, 0, 0, 0, 521, 2755, 1, 0, 0, 0, 523, 2757, 1, 0, 0, 0, 525, 2760, 1, 0, 0, 0, 527, 2762, 1, 0, 0, 0, 529, 2777, 1, 0, 0, 0, 531, 2787, 1, 0, 0, 0, 533, 2797, 1, 0, 0, 0, 535, 2799, 1, 0, 0, 0, 537, 2801, 1, 0, 0, 0, 539, 2809, 1, 0, 0, 0, 541, 2816, 1, 0, 0, 0, 543, 2823, 1, 0, 0, 0, 545, 2831, 1, 0, 0, 0, 547, 2837, 1, 0, 0, 0, 549, 2844, 1, 0, 0, 0, 551, 2853, 1, 0, 0, 0, 553, 4052, 1, 0, 0, 0, 555, 4130, 1, 0, 0, 0, 557, 4159, 1, 0, 0, 0, 559, 4161, 1, 0, 0, 0, 561, 4180, 1, 0, 0, 0, 563, 4217, 1, 0, 0, 0, 565, 4219, 1, 0, 0, 0, 567, 4383, 1, 0, 0, 0, 569, 4385, 1, 0, 0, 0, 571, 4506, 1, 0, 0, 0, 573, 4508, 1, 0, 0, 0, 575, 4549, 1, 0, 0, 0, 577, 4551, 1, 0, 0, 0, 579, 4559, 1, 0, 0, 0, 581, 4561, 1, 0, 0, 0, 583, 4566, 1, 0, 0, 0, 585, 4572, 1, 0, 0, 0, 587, 4579, 1, 0, 0, 0, 589, 4582, 1, 0, 0, 0, 591, 4586, 1, 0, 0, 0, 593, 4597, 1, 0, 0, 0, 595, 4611, 1, 0, 0, 0, 597, 4623, 1, 0, 0, 0, 599, 4638, 1, 0, 0, 0, 601, 4648, 1, 0, 0, 0, 603, 4658, 1, 0, 0, 0, 605, 4670, 1, 0, 0, 0, 607, 4680, 1, 0, 0, 0, 609, 4688, 1, 0, 0, 0, 611, 4696, 1, 0, 0, 0, 613, 4706, 1, 0, 0, 0, 615, 616, 5, 110, 0, 0, 616, 617, 5, 97, 0, 0, 617, 618, 5, 116, 0, 0, 618, 619, 5, 105, 0, 0, 619, 620, 5, 118, 0, 0, 620, 621, 5, 101, 0, 0, 621, 2, 1, 0, 0, 0, 622, 623, 5, 99, 0, 0, 623, 624, 5, 105, 0, 0, 624, 625, 5, 108, 0, 0, 625, 4, 1, 0, 0, 0, 626, 627, 5, 111, 0, 0, 627, 628, 5, 112, 0, 0, 628, 629, 5, 116, 0, 0, 629, 630, 5, 105, 0, 0, 630, 631, 5, 108, 0, 0, 631, 6, 1, 0, 0, 0, 632, 633, 5, 109, 0, 0, 633, 634, 5, 97, 0, 0, 634, 635, 5, 110, 0, 0, 635, 636, 5, 97, 0, 0, 636, 637, 5, 103, 0, 0, 637, 638, 5, 101, 0, 0, 638, 639, 5, 100, 0, 0, 639, 8, 1, 0, 0, 0, 640, 641, 5, 102, 0, 0, 641, 642, 5, 111, 0, 0, 642, 643, 5, 114, 0, 0, 643, 644, 5, 119, 0, 0, 644, 645, 5, 97, 0, 0, 645, 646, 5, 114, 0, 0, 646, 647, 5, 100, 0, 0, 647, 648, 5, 114, 0, 0, 648, 649, 5, 101, 0, 0, 649, 650, 5, 102, 0, 0, 650, 10, 1, 0, 0, 0, 651, 652, 5, 112, 0, 0, 652, 653, 5, 114, 0, 0, 653, 654, 5, 101, 0, 0, 654, 655, 5, 115, 0, 0, 655, 656, 5, 101, 0, 0, 656, 657, 5, 114, 0, 0, 657, 658, 5, 118, 0, 0, 658, 659, 5, 101, 0, 0, 659, 660, 5, 115, 0, 0, 660, 661, 5, 105, 0, 0, 661, 662, 5, 103, 0, 0, 662, 12, 1, 0, 0, 0, 663, 664, 5, 114, 0, 0, 664, 665, 5, 117, 0, 0, 665, 666, 5, 110, 0, 0, 666, 667, 5, 116, 0, 0, 667, 668, 5, 105, 0, 0, 668, 669, 5, 109, 0, 0, 669, 670, 5, 101, 0, 0, 670, 14, 1, 0, 0, 0, 671, 672, 5, 105, 0, 0, 672, 673, 5, 110, 0, 0, 673, 674, 5, 116, 0, 0, 674, 675, 5, 101, 0, 0, 675, 676, 5, 114, 0, 0, 676, 677, 5, 110, 0, 0, 677, 678, 5, 97, 0, 0, 678, 679, 5, 108, 0, 0, 679, 680, 5, 99, 0, 0, 680, 681, 5, 97, 0, 0, 681, 682, 5, 108, 0, 0, 682, 683, 5, 108, 0, 0, 683, 16, 1, 0, 0, 0, 684, 685, 5, 115, 0, 0, 685, 686, 5, 121, 0, 0, 686, 687, 5, 110, 0, 0, 687, 688, 5, 99, 0, 0, 688, 689, 5, 104, 0, 0, 689, 690, 5, 114, 0, 0, 690, 691, 5, 111, 0, 0, 691, 692, 5, 110, 0, 0, 692, 693, 5, 105, 0, 0, 693, 694, 5, 122, 0, 0, 694, 695, 5, 101, 0, 0, 695, 696, 5, 100, 0, 0, 696, 18, 1, 0, 0, 0, 697, 698, 5, 110, 0, 0, 698, 699, 5, 111, 0, 0, 699, 700, 5, 105, 0, 0, 700, 701, 5, 110, 0, 0, 701, 702, 5, 108, 0, 0, 702, 703, 5, 105, 0, 0, 703, 704, 5, 110, 0, 0, 704, 705, 5, 105, 0, 0, 705, 706, 5, 110, 0, 0, 706, 707, 5, 103, 0, 0, 707, 20, 1, 0, 0, 0, 708, 709, 5, 97, 0, 0, 709, 710, 5, 103, 0, 0, 710, 711, 5, 103, 0, 0, 711, 712, 5, 114, 0, 0, 712, 713, 5, 101, 0, 0, 713, 714, 5, 115, 0, 0, 714, 715, 5, 115, 0, 0, 715, 716, 5, 105, 0, 0, 716, 717, 5, 118, 0, 0, 717, 718, 5, 101, 0, 0, 718, 719, 5, 105, 0, 0, 719, 720, 5, 110, 0, 0, 720, 721, 5, 108, 0, 0, 721, 722, 5, 105, 0, 0, 722, 723, 5, 110, 0, 0, 723, 724, 5, 105, 0, 0, 724, 725, 5, 110, 0, 0, 725, 726, 5, 103, 0, 0, 726, 22, 1, 0, 0, 0, 727, 728, 5, 110, 0, 0, 728, 729, 5, 111, 0, 0, 729, 730, 5, 111, 0, 0, 730, 731, 5, 112, 0, 0, 731, 732, 5, 116, 0, 0, 732, 733, 5, 105, 0, 0, 733, 734, 5, 109, 0, 0, 734, 735, 5, 105, 0, 0, 735, 736, 5, 122, 0, 0, 736, 737, 5, 97, 0, 0, 737, 738, 5, 116, 0, 0, 738, 739, 5, 105, 0, 0, 739, 740, 5, 111, 0, 0, 740, 741, 5, 110, 0, 0, 741, 24, 1, 0, 0, 0, 742, 743, 5, 97, 0, 0, 743, 744, 5, 103, 0, 0, 744, 745, 5, 103, 0, 0, 745, 746, 5, 114, 0, 0, 746, 747, 5, 101, 0, 0, 747, 748, 5, 115, 0, 0, 748, 749, 5, 115, 0, 0, 749, 750, 5, 105, 0, 0, 750, 751, 5, 118, 0, 0, 751, 752, 5, 101, 0, 0, 752, 753, 5, 111, 0, 0, 753, 754, 5, 112, 0, 0, 754, 755, 5, 116, 0, 0, 755, 756, 5, 105, 0, 0, 756, 757, 5, 109, 0, 0, 757, 758, 5, 105, 0, 0, 758, 759, 5, 122, 0, 0, 759, 760, 5, 97, 0, 0, 760, 761, 5, 116, 0, 0, 761, 762, 5, 105, 0, 0, 762, 763, 5, 111, 0, 0, 763, 764, 5, 110, 0, 0, 764, 26, 1, 0, 0, 0, 765, 766, 5, 97, 0, 0, 766, 767, 5, 115, 0, 0, 767, 768, 5, 121, 0, 0, 768, 769, 5, 110, 0, 0, 769, 770, 5, 99, 0, 0, 770, 28, 1, 0, 0, 0, 771, 772, 5, 101, 0, 0, 772, 773, 5, 120, 0, 0, 773, 774, 5, 116, 0, 0, 774, 775, 5, 101, 0, 0, 775, 776, 5, 110, 0, 0, 776, 777, 5, 100, 0, 0, 777, 778, 5, 101, 0, 0, 778, 779, 5, 100, 0, 0, 779, 30, 1, 0, 0, 0, 780, 781, 5, 118, 0, 0, 781, 782, 5, 111, 0, 0, 782, 783, 5, 108, 0, 0, 783, 784, 5, 97, 0, 0, 784, 785, 5, 116, 0, 0, 785, 786, 5, 105, 0, 0, 786, 787, 5, 108, 0, 0, 787, 788, 5, 101, 0, 0, 788, 32, 1, 0, 0, 0, 789, 790, 5, 123, 0, 0, 790, 34, 1, 0, 0, 0, 791, 792, 5, 125, 0, 0, 792, 36, 1, 0, 0, 0, 793, 794, 5, 46, 0, 0, 794, 795, 5, 115, 0, 0, 795, 796, 5, 117, 0, 0, 796, 797, 5, 98, 0, 0, 797, 798, 5, 115, 0, 0, 798, 799, 5, 121, 0, 0, 799, 800, 5, 115, 0, 0, 800, 801, 5, 116, 0, 0, 801, 802, 5, 101, 0, 0, 802, 803, 5, 109, 0, 0, 803, 38, 1, 0, 0, 0, 804, 805, 5, 46, 0, 0, 805, 806, 5, 99, 0, 0, 806, 807, 5, 111, 0, 0, 807, 808, 5, 114, 0, 0, 808, 809, 5, 102, 0, 0, 809, 810, 5, 108, 0, 0, 810, 811, 5, 97, 0, 0, 811, 812, 5, 103, 0, 0, 812, 813, 5, 115, 0, 0, 813, 40, 1, 0, 0, 0, 814, 815, 5, 46, 0, 0, 815, 816, 5, 102, 0, 0, 816, 817, 5, 105, 0, 0, 817, 818, 5, 108, 0, 0, 818, 819, 5, 101, 0, 0, 819, 42, 1, 0, 0, 0, 820, 821, 5, 97, 0, 0, 821, 822, 5, 108, 0, 0, 822, 823, 5, 105, 0, 0, 823, 824, 5, 103, 0, 0, 824, 825, 5, 110, 0, 0, 825, 826, 5, 109, 0, 0, 826, 827, 5, 101, 0, 0, 827, 828, 5, 110, 0, 0, 828, 829, 5, 116, 0, 0, 829, 44, 1, 0, 0, 0, 830, 831, 5, 46, 0, 0, 831, 832, 5, 105, 0, 0, 832, 833, 5, 109, 0, 0, 833, 834, 5, 97, 0, 0, 834, 835, 5, 103, 0, 0, 835, 836, 5, 101, 0, 0, 836, 837, 5, 98, 0, 0, 837, 838, 5, 97, 0, 0, 838, 839, 5, 115, 0, 0, 839, 840, 5, 101, 0, 0, 840, 46, 1, 0, 0, 0, 841, 842, 5, 46, 0, 0, 842, 843, 5, 115, 0, 0, 843, 844, 5, 116, 0, 0, 844, 845, 5, 97, 0, 0, 845, 846, 5, 99, 0, 0, 846, 847, 5, 107, 0, 0, 847, 848, 5, 114, 0, 0, 848, 849, 5, 101, 0, 0, 849, 850, 5, 115, 0, 0, 850, 851, 5, 101, 0, 0, 851, 852, 5, 114, 0, 0, 852, 853, 5, 118, 0, 0, 853, 854, 5, 101, 0, 0, 854, 48, 1, 0, 0, 0, 855, 856, 5, 46, 0, 0, 856, 857, 5, 97, 0, 0, 857, 858, 5, 115, 0, 0, 858, 859, 5, 115, 0, 0, 859, 860, 5, 101, 0, 0, 860, 861, 5, 109, 0, 0, 861, 862, 5, 98, 0, 0, 862, 863, 5, 108, 0, 0, 863, 864, 5, 121, 0, 0, 864, 50, 1, 0, 0, 0, 865, 866, 5, 46, 0, 0, 866, 867, 5, 109, 0, 0, 867, 868, 5, 115, 0, 0, 868, 869, 5, 99, 0, 0, 869, 870, 5, 111, 0, 0, 870, 871, 5, 114, 0, 0, 871, 872, 5, 108, 0, 0, 872, 873, 5, 105, 0, 0, 873, 874, 5, 98, 0, 0, 874, 52, 1, 0, 0, 0, 875, 876, 5, 46, 0, 0, 876, 877, 5, 108, 0, 0, 877, 878, 5, 97, 0, 0, 878, 879, 5, 110, 0, 0, 879, 880, 5, 103, 0, 0, 880, 881, 5, 117, 0, 0, 881, 882, 5, 97, 0, 0, 882, 883, 5, 103, 0, 0, 883, 884, 5, 101, 0, 0, 884, 54, 1, 0, 0, 0, 885, 886, 5, 44, 0, 0, 886, 56, 1, 0, 0, 0, 887, 888, 5, 46, 0, 0, 888, 889, 5, 116, 0, 0, 889, 890, 5, 121, 0, 0, 890, 891, 5, 112, 0, 0, 891, 892, 5, 101, 0, 0, 892, 893, 5, 108, 0, 0, 893, 894, 5, 105, 0, 0, 894, 895, 5, 115, 0, 0, 895, 896, 5, 116, 0, 0, 896, 58, 1, 0, 0, 0, 897, 898, 5, 40, 0, 0, 898, 60, 1, 0, 0, 0, 899, 900, 5, 41, 0, 0, 900, 62, 1, 0, 0, 0, 901, 902, 5, 59, 0, 0, 902, 64, 1, 0, 0, 0, 903, 904, 5, 46, 0, 0, 904, 905, 5, 116, 0, 0, 905, 906, 5, 121, 0, 0, 906, 907, 5, 112, 0, 0, 907, 908, 5, 101, 0, 0, 908, 909, 5, 100, 0, 0, 909, 910, 5, 101, 0, 0, 910, 911, 5, 102, 0, 0, 911, 66, 1, 0, 0, 0, 912, 913, 5, 97, 0, 0, 913, 914, 5, 115, 0, 0, 914, 68, 1, 0, 0, 0, 915, 916, 5, 46, 0, 0, 916, 917, 5, 99, 0, 0, 917, 918, 5, 117, 0, 0, 918, 919, 5, 115, 0, 0, 919, 920, 5, 116, 0, 0, 920, 921, 5, 111, 0, 0, 921, 922, 5, 109, 0, 0, 922, 70, 1, 0, 0, 0, 923, 924, 5, 61, 0, 0, 924, 72, 1, 0, 0, 0, 925, 926, 5, 102, 0, 0, 926, 927, 5, 105, 0, 0, 927, 928, 5, 101, 0, 0, 928, 929, 5, 108, 0, 0, 929, 930, 5, 100, 0, 0, 930, 74, 1, 0, 0, 0, 931, 932, 5, 112, 0, 0, 932, 933, 5, 114, 0, 0, 933, 934, 5, 111, 0, 0, 934, 935, 5, 112, 0, 0, 935, 936, 5, 101, 0, 0, 936, 937, 5, 114, 0, 0, 937, 938, 5, 116, 0, 0, 938, 939, 5, 121, 0, 0, 939, 76, 1, 0, 0, 0, 940, 941, 5, 99, 0, 0, 941, 942, 5, 108, 0, 0, 942, 943, 5, 97, 0, 0, 943, 944, 5, 115, 0, 0, 944, 945, 5, 115, 0, 0, 945, 78, 1, 0, 0, 0, 946, 947, 5, 101, 0, 0, 947, 948, 5, 120, 0, 0, 948, 949, 5, 116, 0, 0, 949, 950, 5, 101, 0, 0, 950, 951, 5, 114, 0, 0, 951, 952, 5, 110, 0, 0, 952, 80, 1, 0, 0, 0, 953, 954, 5, 46, 0, 0, 954, 955, 5, 118, 0, 0, 955, 956, 5, 116, 0, 0, 956, 957, 5, 102, 0, 0, 957, 958, 5, 105, 0, 0, 958, 959, 5, 120, 0, 0, 959, 960, 5, 117, 0, 0, 960, 961, 5, 112, 0, 0, 961, 82, 1, 0, 0, 0, 962, 963, 5, 91, 0, 0, 963, 84, 1, 0, 0, 0, 964, 965, 5, 93, 0, 0, 965, 86, 1, 0, 0, 0, 966, 967, 5, 97, 0, 0, 967, 968, 5, 116, 0, 0, 968, 88, 1, 0, 0, 0, 969, 970, 5, 102, 0, 0, 970, 971, 5, 114, 0, 0, 971, 972, 5, 111, 0, 0, 972, 973, 5, 109, 0, 0, 973, 974, 5, 117, 0, 0, 974, 975, 5, 110, 0, 0, 975, 976, 5, 109, 0, 0, 976, 977, 5, 97, 0, 0, 977, 978, 5, 110, 0, 0, 978, 979, 5, 97, 0, 0, 979, 980, 5, 103, 0, 0, 980, 981, 5, 101, 0, 0, 981, 982, 5, 100, 0, 0, 982, 90, 1, 0, 0, 0, 983, 984, 5, 99, 0, 0, 984, 985, 5, 97, 0, 0, 985, 986, 5, 108, 0, 0, 986, 987, 5, 108, 0, 0, 987, 988, 5, 109, 0, 0, 988, 989, 5, 111, 0, 0, 989, 990, 5, 115, 0, 0, 990, 991, 5, 116, 0, 0, 991, 992, 5, 100, 0, 0, 992, 993, 5, 101, 0, 0, 993, 994, 5, 114, 0, 0, 994, 995, 5, 105, 0, 0, 995, 996, 5, 118, 0, 0, 996, 997, 5, 101, 0, 0, 997, 998, 5, 100, 0, 0, 998, 92, 1, 0, 0, 0, 999, 1000, 5, 114, 0, 0, 1000, 1001, 5, 101, 0, 0, 1001, 1002, 5, 116, 0, 0, 1002, 1003, 5, 97, 0, 0, 1003, 1004, 5, 105, 0, 0, 1004, 1005, 5, 110, 0, 0, 1005, 1006, 5, 97, 0, 0, 1006, 1007, 5, 112, 0, 0, 1007, 1008, 5, 112, 0, 0, 1008, 1009, 5, 100, 0, 0, 1009, 1010, 5, 111, 0, 0, 1010, 1011, 5, 109, 0, 0, 1011, 1012, 5, 97, 0, 0, 1012, 1013, 5, 105, 0, 0, 1013, 1014, 5, 110, 0, 0, 1014, 94, 1, 0, 0, 0, 1015, 1016, 5, 46, 0, 0, 1016, 1017, 5, 118, 0, 0, 1017, 1018, 5, 116, 0, 0, 1018, 1019, 5, 97, 0, 0, 1019, 1020, 5, 98, 0, 0, 1020, 1021, 5, 108, 0, 0, 1021, 1022, 5, 101, 0, 0, 1022, 96, 1, 0, 0, 0, 1023, 1024, 5, 46, 0, 0, 1024, 1025, 5, 110, 0, 0, 1025, 1026, 5, 97, 0, 0, 1026, 1027, 5, 109, 0, 0, 1027, 1028, 5, 101, 0, 0, 1028, 1029, 5, 115, 0, 0, 1029, 1030, 5, 112, 0, 0, 1030, 1031, 5, 97, 0, 0, 1031, 1032, 5, 99, 0, 0, 1032, 1033, 5, 101, 0, 0, 1033, 98, 1, 0, 0, 0, 1034, 1035, 5, 46, 0, 0, 1035, 1036, 5, 99, 0, 0, 1036, 1037, 5, 108, 0, 0, 1037, 1038, 5, 97, 0, 0, 1038, 1039, 5, 115, 0, 0, 1039, 1040, 5, 115, 0, 0, 1040, 100, 1, 0, 0, 0, 1041, 1042, 5, 112, 0, 0, 1042, 1043, 5, 117, 0, 0, 1043, 1044, 5, 98, 0, 0, 1044, 1045, 5, 108, 0, 0, 1045, 1046, 5, 105, 0, 0, 1046, 1047, 5, 99, 0, 0, 1047, 102, 1, 0, 0, 0, 1048, 1049, 5, 112, 0, 0, 1049, 1050, 5, 114, 0, 0, 1050, 1051, 5, 105, 0, 0, 1051, 1052, 5, 118, 0, 0, 1052, 1053, 5, 97, 0, 0, 1053, 1054, 5, 116, 0, 0, 1054, 1055, 5, 101, 0, 0, 1055, 104, 1, 0, 0, 0, 1056, 1057, 5, 115, 0, 0, 1057, 1058, 5, 101, 0, 0, 1058, 1059, 5, 97, 0, 0, 1059, 1060, 5, 108, 0, 0, 1060, 1061, 5, 101, 0, 0, 1061, 1062, 5, 100, 0, 0, 1062, 106, 1, 0, 0, 0, 1063, 1064, 5, 97, 0, 0, 1064, 1065, 5, 98, 0, 0, 1065, 1066, 5, 115, 0, 0, 1066, 1067, 5, 116, 0, 0, 1067, 1068, 5, 114, 0, 0, 1068, 1069, 5, 97, 0, 0, 1069, 1070, 5, 99, 0, 0, 1070, 1071, 5, 116, 0, 0, 1071, 108, 1, 0, 0, 0, 1072, 1073, 5, 97, 0, 0, 1073, 1074, 5, 117, 0, 0, 1074, 1075, 5, 116, 0, 0, 1075, 1076, 5, 111, 0, 0, 1076, 110, 1, 0, 0, 0, 1077, 1078, 5, 115, 0, 0, 1078, 1079, 5, 101, 0, 0, 1079, 1080, 5, 113, 0, 0, 1080, 1081, 5, 117, 0, 0, 1081, 1082, 5, 101, 0, 0, 1082, 1083, 5, 110, 0, 0, 1083, 1084, 5, 116, 0, 0, 1084, 1085, 5, 105, 0, 0, 1085, 1086, 5, 97, 0, 0, 1086, 1087, 5, 108, 0, 0, 1087, 112, 1, 0, 0, 0, 1088, 1089, 5, 117, 0, 0, 1089, 1090, 5, 110, 0, 0, 1090, 1091, 5, 105, 0, 0, 1091, 1092, 5, 99, 0, 0, 1092, 1093, 5, 111, 0, 0, 1093, 1094, 5, 100, 0, 0, 1094, 1095, 5, 101, 0, 0, 1095, 114, 1, 0, 0, 0, 1096, 1097, 5, 97, 0, 0, 1097, 1098, 5, 117, 0, 0, 1098, 1099, 5, 116, 0, 0, 1099, 1100, 5, 111, 0, 0, 1100, 1101, 5, 99, 0, 0, 1101, 1102, 5, 104, 0, 0, 1102, 1103, 5, 97, 0, 0, 1103, 1104, 5, 114, 0, 0, 1104, 116, 1, 0, 0, 0, 1105, 1106, 5, 105, 0, 0, 1106, 1107, 5, 109, 0, 0, 1107, 1108, 5, 112, 0, 0, 1108, 1109, 5, 111, 0, 0, 1109, 1110, 5, 114, 0, 0, 1110, 1111, 5, 116, 0, 0, 1111, 118, 1, 0, 0, 0, 1112, 1113, 5, 115, 0, 0, 1113, 1114, 5, 101, 0, 0, 1114, 1115, 5, 114, 0, 0, 1115, 1116, 5, 105, 0, 0, 1116, 1117, 5, 97, 0, 0, 1117, 1118, 5, 108, 0, 0, 1118, 1119, 5, 105, 0, 0, 1119, 1120, 5, 122, 0, 0, 1120, 1121, 5, 97, 0, 0, 1121, 1122, 5, 98, 0, 0, 1122, 1123, 5, 108, 0, 0, 1123, 1124, 5, 101, 0, 0, 1124, 120, 1, 0, 0, 0, 1125, 1126, 5, 119, 0, 0, 1126, 1127, 5, 105, 0, 0, 1127, 1128, 5, 110, 0, 0, 1128, 1129, 5, 100, 0, 0, 1129, 1130, 5, 111, 0, 0, 1130, 1131, 5, 119, 0, 0, 1131, 1132, 5, 115, 0, 0, 1132, 1133, 5, 114, 0, 0, 1133, 1134, 5, 117, 0, 0, 1134, 1135, 5, 110, 0, 0, 1135, 1136, 5, 116, 0, 0, 1136, 1137, 5, 105, 0, 0, 1137, 1138, 5, 109, 0, 0, 1138, 1139, 5, 101, 0, 0, 1139, 122, 1, 0, 0, 0, 1140, 1141, 5, 110, 0, 0, 1141, 1142, 5, 101, 0, 0, 1142, 1143, 5, 115, 0, 0, 1143, 1144, 5, 116, 0, 0, 1144, 1145, 5, 101, 0, 0, 1145, 1146, 5, 100, 0, 0, 1146, 124, 1, 0, 0, 0, 1147, 1148, 5, 102, 0, 0, 1148, 1149, 5, 97, 0, 0, 1149, 1150, 5, 109, 0, 0, 1150, 1151, 5, 105, 0, 0, 1151, 1152, 5, 108, 0, 0, 1152, 1153, 5, 121, 0, 0, 1153, 126, 1, 0, 0, 0, 1154, 1155, 5, 97, 0, 0, 1155, 1156, 5, 115, 0, 0, 1156, 1157, 5, 115, 0, 0, 1157, 1158, 5, 101, 0, 0, 1158, 1159, 5, 109, 0, 0, 1159, 1160, 5, 98, 0, 0, 1160, 1161, 5, 108, 0, 0, 1161, 1162, 5, 121, 0, 0, 1162, 128, 1, 0, 0, 0, 1163, 1164, 5, 102, 0, 0, 1164, 1165, 5, 97, 0, 0, 1165, 1166, 5, 109, 0, 0, 1166, 1167, 5, 97, 0, 0, 1167, 1168, 5, 110, 0, 0, 1168, 1169, 5, 100, 0, 0, 1169, 1170, 5, 97, 0, 0, 1170, 1171, 5, 115, 0, 0, 1171, 1172, 5, 115, 0, 0, 1172, 1173, 5, 101, 0, 0, 1173, 1174, 5, 109, 0, 0, 1174, 130, 1, 0, 0, 0, 1175, 1176, 5, 102, 0, 0, 1176, 1177, 5, 97, 0, 0, 1177, 1178, 5, 109, 0, 0, 1178, 1179, 5, 111, 0, 0, 1179, 1180, 5, 114, 0, 0, 1180, 1181, 5, 97, 0, 0, 1181, 1182, 5, 115, 0, 0, 1182, 1183, 5, 115, 0, 0, 1183, 1184, 5, 101, 0, 0, 1184, 1185, 5, 109, 0, 0, 1185, 132, 1, 0, 0, 0, 1186, 1187, 5, 98, 0, 0, 1187, 1188, 5, 101, 0, 0, 1188, 1189, 5, 102, 0, 0, 1189, 1190, 5, 111, 0, 0, 1190, 1191, 5, 114, 0, 0, 1191, 1192, 5, 101, 0, 0, 1192, 1193, 5, 102, 0, 0, 1193, 1194, 5, 105, 0, 0, 1194, 1195, 5, 101, 0, 0, 1195, 1196, 5, 108, 0, 0, 1196, 1197, 5, 100, 0, 0, 1197, 1198, 5, 105, 0, 0, 1198, 1199, 5, 110, 0, 0, 1199, 1200, 5, 105, 0, 0, 1200, 1201, 5, 116, 0, 0, 1201, 134, 1, 0, 0, 0, 1202, 1203, 5, 115, 0, 0, 1203, 1204, 5, 112, 0, 0, 1204, 1205, 5, 101, 0, 0, 1205, 1206, 5, 99, 0, 0, 1206, 1207, 5, 105, 0, 0, 1207, 1208, 5, 97, 0, 0, 1208, 1209, 5, 108, 0, 0, 1209, 1210, 5, 110, 0, 0, 1210, 1211, 5, 97, 0, 0, 1211, 1212, 5, 109, 0, 0, 1212, 1213, 5, 101, 0, 0, 1213, 136, 1, 0, 0, 0, 1214, 1215, 5, 114, 0, 0, 1215, 1216, 5, 116, 0, 0, 1216, 1217, 5, 115, 0, 0, 1217, 1218, 5, 112, 0, 0, 1218, 1219, 5, 101, 0, 0, 1219, 1220, 5, 99, 0, 0, 1220, 1221, 5, 105, 0, 0, 1221, 1222, 5, 97, 0, 0, 1222, 1223, 5, 108, 0, 0, 1223, 1224, 5, 110, 0, 0, 1224, 1225, 5, 97, 0, 0, 1225, 1226, 5, 109, 0, 0, 1226, 1227, 5, 101, 0, 0, 1227, 138, 1, 0, 0, 0, 1228, 1229, 5, 102, 0, 0, 1229, 1230, 5, 108, 0, 0, 1230, 1231, 5, 97, 0, 0, 1231, 1232, 5, 103, 0, 0, 1232, 1233, 5, 115, 0, 0, 1233, 140, 1, 0, 0, 0, 1234, 1235, 5, 101, 0, 0, 1235, 1236, 5, 120, 0, 0, 1236, 1237, 5, 116, 0, 0, 1237, 1238, 5, 101, 0, 0, 1238, 1239, 5, 110, 0, 0, 1239, 1240, 5, 100, 0, 0, 1240, 1241, 5, 115, 0, 0, 1241, 142, 1, 0, 0, 0, 1242, 1243, 5, 105, 0, 0, 1243, 1244, 5, 109, 0, 0, 1244, 1245, 5, 112, 0, 0, 1245, 1246, 5, 108, 0, 0, 1246, 1247, 5, 101, 0, 0, 1247, 1248, 5, 109, 0, 0, 1248, 1249, 5, 101, 0, 0, 1249, 1250, 5, 110, 0, 0, 1250, 1251, 5, 116, 0, 0, 1251, 1252, 5, 115, 0, 0, 1252, 144, 1, 0, 0, 0, 1253, 1254, 5, 46, 0, 0, 1254, 1255, 5, 108, 0, 0, 1255, 1256, 5, 105, 0, 0, 1256, 1257, 5, 110, 0, 0, 1257, 1258, 5, 101, 0, 0, 1258, 146, 1, 0, 0, 0, 1259, 1260, 5, 35, 0, 0, 1260, 1261, 5, 108, 0, 0, 1261, 1262, 5, 105, 0, 0, 1262, 1263, 5, 110, 0, 0, 1263, 1264, 5, 101, 0, 0, 1264, 148, 1, 0, 0, 0, 1265, 1266, 5, 58, 0, 0, 1266, 150, 1, 0, 0, 0, 1267, 1268, 5, 110, 0, 0, 1268, 1269, 5, 111, 0, 0, 1269, 1270, 5, 109, 0, 0, 1270, 1271, 5, 101, 0, 0, 1271, 1272, 5, 116, 0, 0, 1272, 1273, 5, 97, 0, 0, 1273, 1274, 5, 100, 0, 0, 1274, 1275, 5, 97, 0, 0, 1275, 1276, 5, 116, 0, 0, 1276, 1277, 5, 97, 0, 0, 1277, 152, 1, 0, 0, 0, 1278, 1279, 5, 114, 0, 0, 1279, 1280, 5, 101, 0, 0, 1280, 1281, 5, 116, 0, 0, 1281, 1282, 5, 97, 0, 0, 1282, 1283, 5, 114, 0, 0, 1283, 1284, 5, 103, 0, 0, 1284, 1285, 5, 101, 0, 0, 1285, 1286, 5, 116, 0, 0, 1286, 1287, 5, 97, 0, 0, 1287, 1288, 5, 98, 0, 0, 1288, 1289, 5, 108, 0, 0, 1289, 1290, 5, 101, 0, 0, 1290, 154, 1, 0, 0, 0, 1291, 1292, 5, 110, 0, 0, 1292, 1293, 5, 111, 0, 0, 1293, 1294, 5, 112, 0, 0, 1294, 1295, 5, 108, 0, 0, 1295, 1296, 5, 97, 0, 0, 1296, 1297, 5, 116, 0, 0, 1297, 1298, 5, 102, 0, 0, 1298, 1299, 5, 111, 0, 0, 1299, 1300, 5, 114, 0, 0, 1300, 1301, 5, 109, 0, 0, 1301, 156, 1, 0, 0, 0, 1302, 1303, 5, 108, 0, 0, 1303, 1304, 5, 101, 0, 0, 1304, 1305, 5, 103, 0, 0, 1305, 1306, 5, 97, 0, 0, 1306, 1307, 5, 99, 0, 0, 1307, 1308, 5, 121, 0, 0, 1308, 1309, 5, 32, 0, 0, 1309, 1310, 5, 108, 0, 0, 1310, 1311, 5, 105, 0, 0, 1311, 1312, 5, 98, 0, 0, 1312, 1313, 5, 114, 0, 0, 1313, 1314, 5, 97, 0, 0, 1314, 1315, 5, 114, 0, 0, 1315, 1316, 5, 121, 0, 0, 1316, 158, 1, 0, 0, 0, 1317, 1318, 5, 120, 0, 0, 1318, 1319, 5, 56, 0, 0, 1319, 1320, 5, 54, 0, 0, 1320, 160, 1, 0, 0, 0, 1321, 1322, 5, 97, 0, 0, 1322, 1323, 5, 109, 0, 0, 1323, 1324, 5, 100, 0, 0, 1324, 1325, 5, 54, 0, 0, 1325, 1326, 5, 52, 0, 0, 1326, 162, 1, 0, 0, 0, 1327, 1328, 5, 97, 0, 0, 1328, 1329, 5, 114, 0, 0, 1329, 1330, 5, 109, 0, 0, 1330, 164, 1, 0, 0, 0, 1331, 1332, 5, 97, 0, 0, 1332, 1333, 5, 114, 0, 0, 1333, 1334, 5, 109, 0, 0, 1334, 1335, 5, 54, 0, 0, 1335, 1336, 5, 52, 0, 0, 1336, 166, 1, 0, 0, 0, 1337, 1338, 5, 98, 0, 0, 1338, 1339, 5, 121, 0, 0, 1339, 1340, 5, 116, 0, 0, 1340, 1341, 5, 101, 0, 0, 1341, 1342, 5, 97, 0, 0, 1342, 1343, 5, 114, 0, 0, 1343, 1344, 5, 114, 0, 0, 1344, 1345, 5, 97, 0, 0, 1345, 1346, 5, 121, 0, 0, 1346, 168, 1, 0, 0, 0, 1347, 1348, 5, 40, 0, 0, 1348, 1349, 5, 41, 0, 0, 1349, 170, 1, 0, 0, 0, 1350, 1351, 5, 60, 0, 0, 1351, 172, 1, 0, 0, 0, 1352, 1353, 5, 62, 0, 0, 1353, 174, 1, 0, 0, 0, 1354, 1355, 5, 47, 0, 0, 1355, 176, 1, 0, 0, 0, 1356, 1357, 5, 97, 0, 0, 1357, 1358, 5, 108, 0, 0, 1358, 1359, 5, 103, 0, 0, 1359, 1360, 5, 111, 0, 0, 1360, 1361, 5, 114, 0, 0, 1361, 1362, 5, 105, 0, 0, 1362, 1363, 5, 116, 0, 0, 1363, 1364, 5, 104, 0, 0, 1364, 1365, 5, 109, 0, 0, 1365, 178, 1, 0, 0, 0, 1366, 1367, 5, 117, 0, 0, 1367, 1368, 5, 110, 0, 0, 1368, 1369, 5, 115, 0, 0, 1369, 1370, 5, 105, 0, 0, 1370, 1371, 5, 103, 0, 0, 1371, 1372, 5, 110, 0, 0, 1372, 1373, 5, 101, 0, 0, 1373, 1374, 5, 100, 0, 0, 1374, 180, 1, 0, 0, 0, 1375, 1376, 5, 105, 0, 0, 1376, 1377, 5, 105, 0, 0, 1377, 1378, 5, 100, 0, 0, 1378, 1379, 5, 112, 0, 0, 1379, 1380, 5, 97, 0, 0, 1380, 1381, 5, 114, 0, 0, 1381, 1382, 5, 97, 0, 0, 1382, 1383, 5, 109, 0, 0, 1383, 182, 1, 0, 0, 0, 1384, 1385, 5, 112, 0, 0, 1385, 1386, 5, 105, 0, 0, 1386, 1387, 5, 110, 0, 0, 1387, 1388, 5, 110, 0, 0, 1388, 1389, 5, 101, 0, 0, 1389, 1390, 5, 100, 0, 0, 1390, 184, 1, 0, 0, 0, 1391, 1392, 5, 109, 0, 0, 1392, 1393, 5, 111, 0, 0, 1393, 1394, 5, 100, 0, 0, 1394, 1395, 5, 114, 0, 0, 1395, 1396, 5, 101, 0, 0, 1396, 1397, 5, 113, 0, 0, 1397, 186, 1, 0, 0, 0, 1398, 1399, 5, 109, 0, 0, 1399, 1400, 5, 111, 0, 0, 1400, 1401, 5, 100, 0, 0, 1401, 1402, 5, 111, 0, 0, 1402, 1403, 5, 112, 0, 0, 1403, 1404, 5, 116, 0, 0, 1404, 188, 1, 0, 0, 0, 1405, 1406, 5, 116, 0, 0, 1406, 1407, 5, 114, 0, 0, 1407, 1408, 5, 117, 0, 0, 1408, 1409, 5, 101, 0, 0, 1409, 190, 1, 0, 0, 0, 1410, 1411, 5, 102, 0, 0, 1411, 1412, 5, 97, 0, 0, 1412, 1413, 5, 108, 0, 0, 1413, 1414, 5, 115, 0, 0, 1414, 1415, 5, 101, 0, 0, 1415, 192, 1, 0, 0, 0, 1416, 1417, 5, 114, 0, 0, 1417, 1418, 5, 101, 0, 0, 1418, 1419, 5, 113, 0, 0, 1419, 1420, 5, 117, 0, 0, 1420, 1421, 5, 101, 0, 0, 1421, 1422, 5, 115, 0, 0, 1422, 1423, 5, 116, 0, 0, 1423, 194, 1, 0, 0, 0, 1424, 1425, 5, 100, 0, 0, 1425, 1426, 5, 101, 0, 0, 1426, 1427, 5, 109, 0, 0, 1427, 1428, 5, 97, 0, 0, 1428, 1429, 5, 110, 0, 0, 1429, 1430, 5, 100, 0, 0, 1430, 196, 1, 0, 0, 0, 1431, 1432, 5, 97, 0, 0, 1432, 1433, 5, 115, 0, 0, 1433, 1434, 5, 115, 0, 0, 1434, 1435, 5, 101, 0, 0, 1435, 1436, 5, 114, 0, 0, 1436, 1437, 5, 116, 0, 0, 1437, 198, 1, 0, 0, 0, 1438, 1439, 5, 100, 0, 0, 1439, 1440, 5, 101, 0, 0, 1440, 1441, 5, 110, 0, 0, 1441, 1442, 5, 121, 0, 0, 1442, 200, 1, 0, 0, 0, 1443, 1444, 5, 112, 0, 0, 1444, 1445, 5, 101, 0, 0, 1445, 1446, 5, 114, 0, 0, 1446, 1447, 5, 109, 0, 0, 1447, 1448, 5, 105, 0, 0, 1448, 1449, 5, 116, 0, 0, 1449, 1450, 5, 111, 0, 0, 1450, 1451, 5, 110, 0, 0, 1451, 1452, 5, 108, 0, 0, 1452, 1453, 5, 121, 0, 0, 1453, 202, 1, 0, 0, 0, 1454, 1455, 5, 108, 0, 0, 1455, 1456, 5, 105, 0, 0, 1456, 1457, 5, 110, 0, 0, 1457, 1458, 5, 107, 0, 0, 1458, 1459, 5, 99, 0, 0, 1459, 1460, 5, 104, 0, 0, 1460, 1461, 5, 101, 0, 0, 1461, 1462, 5, 99, 0, 0, 1462, 1463, 5, 107, 0, 0, 1463, 204, 1, 0, 0, 0, 1464, 1465, 5, 105, 0, 0, 1465, 1466, 5, 110, 0, 0, 1466, 1467, 5, 104, 0, 0, 1467, 1468, 5, 101, 0, 0, 1468, 1469, 5, 114, 0, 0, 1469, 1470, 5, 105, 0, 0, 1470, 1471, 5, 116, 0, 0, 1471, 1472, 5, 99, 0, 0, 1472, 1473, 5, 104, 0, 0, 1473, 1474, 5, 101, 0, 0, 1474, 1475, 5, 99, 0, 0, 1475, 1476, 5, 107, 0, 0, 1476, 206, 1, 0, 0, 0, 1477, 1478, 5, 114, 0, 0, 1478, 1479, 5, 101, 0, 0, 1479, 1480, 5, 113, 0, 0, 1480, 1481, 5, 109, 0, 0, 1481, 1482, 5, 105, 0, 0, 1482, 1483, 5, 110, 0, 0, 1483, 208, 1, 0, 0, 0, 1484, 1485, 5, 114, 0, 0, 1485, 1486, 5, 101, 0, 0, 1486, 1487, 5, 113, 0, 0, 1487, 1488, 5, 111, 0, 0, 1488, 1489, 5, 112, 0, 0, 1489, 1490, 5, 116, 0, 0, 1490, 210, 1, 0, 0, 0, 1491, 1492, 5, 114, 0, 0, 1492, 1493, 5, 101, 0, 0, 1493, 1494, 5, 113, 0, 0, 1494, 1495, 5, 114, 0, 0, 1495, 1496, 5, 101, 0, 0, 1496, 1497, 5, 102, 0, 0, 1497, 1498, 5, 117, 0, 0, 1498, 1499, 5, 115, 0, 0, 1499, 1500, 5, 101, 0, 0, 1500, 212, 1, 0, 0, 0, 1501, 1502, 5, 112, 0, 0, 1502, 1503, 5, 114, 0, 0, 1503, 1504, 5, 101, 0, 0, 1504, 1505, 5, 106, 0, 0, 1505, 1506, 5, 105, 0, 0, 1506, 1507, 5, 116, 0, 0, 1507, 1508, 5, 103, 0, 0, 1508, 1509, 5, 114, 0, 0, 1509, 1510, 5, 97, 0, 0, 1510, 1511, 5, 110, 0, 0, 1511, 1512, 5, 116, 0, 0, 1512, 214, 1, 0, 0, 0, 1513, 1514, 5, 112, 0, 0, 1514, 1515, 5, 114, 0, 0, 1515, 1516, 5, 101, 0, 0, 1516, 1517, 5, 106, 0, 0, 1517, 1518, 5, 105, 0, 0, 1518, 1519, 5, 116, 0, 0, 1519, 1520, 5, 100, 0, 0, 1520, 1521, 5, 101, 0, 0, 1521, 1522, 5, 110, 0, 0, 1522, 1523, 5, 121, 0, 0, 1523, 216, 1, 0, 0, 0, 1524, 1525, 5, 110, 0, 0, 1525, 1526, 5, 111, 0, 0, 1526, 1527, 5, 110, 0, 0, 1527, 1528, 5, 99, 0, 0, 1528, 1529, 5, 97, 0, 0, 1529, 1530, 5, 115, 0, 0, 1530, 1531, 5, 100, 0, 0, 1531, 1532, 5, 101, 0, 0, 1532, 1533, 5, 109, 0, 0, 1533, 1534, 5, 97, 0, 0, 1534, 1535, 5, 110, 0, 0, 1535, 1536, 5, 100, 0, 0, 1536, 218, 1, 0, 0, 0, 1537, 1538, 5, 110, 0, 0, 1538, 1539, 5, 111, 0, 0, 1539, 1540, 5, 110, 0, 0, 1540, 1541, 5, 99, 0, 0, 1541, 1542, 5, 97, 0, 0, 1542, 1543, 5, 115, 0, 0, 1543, 1544, 5, 108, 0, 0, 1544, 1545, 5, 105, 0, 0, 1545, 1546, 5, 110, 0, 0, 1546, 1547, 5, 107, 0, 0, 1547, 1548, 5, 100, 0, 0, 1548, 1549, 5, 101, 0, 0, 1549, 1550, 5, 109, 0, 0, 1550, 1551, 5, 97, 0, 0, 1551, 1552, 5, 110, 0, 0, 1552, 1553, 5, 100, 0, 0, 1553, 220, 1, 0, 0, 0, 1554, 1555, 5, 110, 0, 0, 1555, 1556, 5, 111, 0, 0, 1556, 1557, 5, 110, 0, 0, 1557, 1558, 5, 99, 0, 0, 1558, 1559, 5, 97, 0, 0, 1559, 1560, 5, 115, 0, 0, 1560, 1561, 5, 105, 0, 0, 1561, 1562, 5, 110, 0, 0, 1562, 1563, 5, 104, 0, 0, 1563, 1564, 5, 101, 0, 0, 1564, 1565, 5, 114, 0, 0, 1565, 1566, 5, 105, 0, 0, 1566, 1567, 5, 116, 0, 0, 1567, 1568, 5, 97, 0, 0, 1568, 1569, 5, 110, 0, 0, 1569, 1570, 5, 99, 0, 0, 1570, 1571, 5, 101, 0, 0, 1571, 222, 1, 0, 0, 0, 1572, 1573, 5, 99, 0, 0, 1573, 1574, 5, 97, 0, 0, 1574, 1575, 5, 108, 0, 0, 1575, 1576, 5, 108, 0, 0, 1576, 1577, 5, 99, 0, 0, 1577, 1578, 5, 111, 0, 0, 1578, 1579, 5, 110, 0, 0, 1579, 1580, 5, 118, 0, 0, 1580, 224, 1, 0, 0, 0, 1581, 1582, 5, 109, 0, 0, 1582, 1583, 5, 100, 0, 0, 1583, 1584, 5, 116, 0, 0, 1584, 1585, 5, 111, 0, 0, 1585, 1586, 5, 107, 0, 0, 1586, 1587, 5, 101, 0, 0, 1587, 1588, 5, 110, 0, 0, 1588, 226, 1, 0, 0, 0, 1589, 1590, 5, 45, 0, 0, 1590, 228, 1, 0, 0, 0, 1591, 1592, 5, 98, 0, 0, 1592, 1593, 5, 121, 0, 0, 1593, 1594, 5, 114, 0, 0, 1594, 1595, 5, 101, 0, 0, 1595, 1596, 5, 102, 0, 0, 1596, 1597, 5, 108, 0, 0, 1597, 1598, 5, 105, 0, 0, 1598, 1599, 5, 107, 0, 0, 1599, 1600, 5, 101, 0, 0, 1600, 230, 1, 0, 0, 0, 1601, 1602, 5, 46, 0, 0, 1602, 1603, 5, 99, 0, 0, 1603, 1604, 5, 116, 0, 0, 1604, 1605, 5, 111, 0, 0, 1605, 1606, 5, 114, 0, 0, 1606, 232, 1, 0, 0, 0, 1607, 1608, 5, 46, 0, 0, 1608, 1609, 5, 115, 0, 0, 1609, 1610, 5, 105, 0, 0, 1610, 1611, 5, 122, 0, 0, 1611, 1612, 5, 101, 0, 0, 1612, 234, 1, 0, 0, 0, 1613, 1614, 5, 46, 0, 0, 1614, 1615, 5, 112, 0, 0, 1615, 1616, 5, 97, 0, 0, 1616, 1617, 5, 99, 0, 0, 1617, 1618, 5, 107, 0, 0, 1618, 236, 1, 0, 0, 0, 1619, 1620, 5, 119, 0, 0, 1620, 1621, 5, 105, 0, 0, 1621, 1622, 5, 116, 0, 0, 1622, 1623, 5, 104, 0, 0, 1623, 238, 1, 0, 0, 0, 1624, 1625, 5, 46, 0, 0, 1625, 1626, 5, 105, 0, 0, 1626, 1627, 5, 110, 0, 0, 1627, 1628, 5, 116, 0, 0, 1628, 1629, 5, 101, 0, 0, 1629, 1630, 5, 114, 0, 0, 1630, 1631, 5, 102, 0, 0, 1631, 1632, 5, 97, 0, 0, 1632, 1633, 5, 99, 0, 0, 1633, 1634, 5, 101, 0, 0, 1634, 1635, 5, 105, 0, 0, 1635, 1636, 5, 109, 0, 0, 1636, 1637, 5, 112, 0, 0, 1637, 1638, 5, 108, 0, 0, 1638, 240, 1, 0, 0, 0, 1639, 1640, 5, 46, 0, 0, 1640, 1641, 5, 102, 0, 0, 1641, 1642, 5, 105, 0, 0, 1642, 1643, 5, 101, 0, 0, 1643, 1644, 5, 108, 0, 0, 1644, 1645, 5, 100, 0, 0, 1645, 242, 1, 0, 0, 0, 1646, 1647, 5, 109, 0, 0, 1647, 1648, 5, 97, 0, 0, 1648, 1649, 5, 114, 0, 0, 1649, 1650, 5, 115, 0, 0, 1650, 1651, 5, 104, 0, 0, 1651, 1652, 5, 97, 0, 0, 1652, 1653, 5, 108, 0, 0, 1653, 244, 1, 0, 0, 0, 1654, 1655, 5, 115, 0, 0, 1655, 1656, 5, 116, 0, 0, 1656, 1657, 5, 97, 0, 0, 1657, 1658, 5, 116, 0, 0, 1658, 1659, 5, 105, 0, 0, 1659, 1660, 5, 99, 0, 0, 1660, 246, 1, 0, 0, 0, 1661, 1662, 5, 105, 0, 0, 1662, 1663, 5, 110, 0, 0, 1663, 1664, 5, 105, 0, 0, 1664, 1665, 5, 116, 0, 0, 1665, 1666, 5, 111, 0, 0, 1666, 1667, 5, 110, 0, 0, 1667, 1668, 5, 108, 0, 0, 1668, 1669, 5, 121, 0, 0, 1669, 248, 1, 0, 0, 0, 1670, 1671, 5, 112, 0, 0, 1671, 1672, 5, 114, 0, 0, 1672, 1673, 5, 105, 0, 0, 1673, 1674, 5, 118, 0, 0, 1674, 1675, 5, 97, 0, 0, 1675, 1676, 5, 116, 0, 0, 1676, 1677, 5, 101, 0, 0, 1677, 1678, 5, 115, 0, 0, 1678, 1679, 5, 99, 0, 0, 1679, 1680, 5, 111, 0, 0, 1680, 1681, 5, 112, 0, 0, 1681, 1682, 5, 101, 0, 0, 1682, 250, 1, 0, 0, 0, 1683, 1684, 5, 108, 0, 0, 1684, 1685, 5, 105, 0, 0, 1685, 1686, 5, 116, 0, 0, 1686, 1687, 5, 101, 0, 0, 1687, 1688, 5, 114, 0, 0, 1688, 1689, 5, 97, 0, 0, 1689, 1690, 5, 108, 0, 0, 1690, 252, 1, 0, 0, 0, 1691, 1692, 5, 110, 0, 0, 1692, 1693, 5, 111, 0, 0, 1693, 1694, 5, 116, 0, 0, 1694, 1695, 5, 115, 0, 0, 1695, 1696, 5, 101, 0, 0, 1696, 1697, 5, 114, 0, 0, 1697, 1698, 5, 105, 0, 0, 1698, 1699, 5, 97, 0, 0, 1699, 1700, 5, 108, 0, 0, 1700, 1701, 5, 105, 0, 0, 1701, 1702, 5, 122, 0, 0, 1702, 1703, 5, 101, 0, 0, 1703, 1704, 5, 100, 0, 0, 1704, 254, 1, 0, 0, 0, 1705, 1706, 5, 46, 0, 0, 1706, 1707, 5, 101, 0, 0, 1707, 1708, 5, 118, 0, 0, 1708, 1709, 5, 101, 0, 0, 1709, 1710, 5, 110, 0, 0, 1710, 1711, 5, 116, 0, 0, 1711, 256, 1, 0, 0, 0, 1712, 1713, 5, 46, 0, 0, 1713, 1714, 5, 97, 0, 0, 1714, 1715, 5, 100, 0, 0, 1715, 1716, 5, 100, 0, 0, 1716, 1717, 5, 111, 0, 0, 1717, 1718, 5, 110, 0, 0, 1718, 258, 1, 0, 0, 0, 1719, 1720, 5, 46, 0, 0, 1720, 1721, 5, 114, 0, 0, 1721, 1722, 5, 101, 0, 0, 1722, 1723, 5, 109, 0, 0, 1723, 1724, 5, 111, 0, 0, 1724, 1725, 5, 118, 0, 0, 1725, 1726, 5, 101, 0, 0, 1726, 1727, 5, 111, 0, 0, 1727, 1728, 5, 110, 0, 0, 1728, 260, 1, 0, 0, 0, 1729, 1730, 5, 46, 0, 0, 1730, 1731, 5, 102, 0, 0, 1731, 1732, 5, 105, 0, 0, 1732, 1733, 5, 114, 0, 0, 1733, 1734, 5, 101, 0, 0, 1734, 262, 1, 0, 0, 0, 1735, 1736, 5, 46, 0, 0, 1736, 1737, 5, 111, 0, 0, 1737, 1738, 5, 116, 0, 0, 1738, 1739, 5, 104, 0, 0, 1739, 1740, 5, 101, 0, 0, 1740, 1741, 5, 114, 0, 0, 1741, 264, 1, 0, 0, 0, 1742, 1743, 5, 46, 0, 0, 1743, 1744, 5, 112, 0, 0, 1744, 1745, 5, 114, 0, 0, 1745, 1746, 5, 111, 0, 0, 1746, 1747, 5, 112, 0, 0, 1747, 1748, 5, 101, 0, 0, 1748, 1749, 5, 114, 0, 0, 1749, 1750, 5, 116, 0, 0, 1750, 1751, 5, 121, 0, 0, 1751, 266, 1, 0, 0, 0, 1752, 1753, 5, 46, 0, 0, 1753, 1754, 5, 115, 0, 0, 1754, 1755, 5, 101, 0, 0, 1755, 1756, 5, 116, 0, 0, 1756, 268, 1, 0, 0, 0, 1757, 1758, 5, 46, 0, 0, 1758, 1759, 5, 103, 0, 0, 1759, 1760, 5, 101, 0, 0, 1760, 1761, 5, 116, 0, 0, 1761, 270, 1, 0, 0, 0, 1762, 1763, 5, 105, 0, 0, 1763, 1764, 5, 110, 0, 0, 1764, 272, 1, 0, 0, 0, 1765, 1766, 5, 111, 0, 0, 1766, 1767, 5, 117, 0, 0, 1767, 1768, 5, 116, 0, 0, 1768, 274, 1, 0, 0, 0, 1769, 1770, 5, 111, 0, 0, 1770, 1771, 5, 112, 0, 0, 1771, 1772, 5, 116, 0, 0, 1772, 276, 1, 0, 0, 0, 1773, 1774, 5, 46, 0, 0, 1774, 1775, 5, 109, 0, 0, 1775, 1776, 5, 101, 0, 0, 1776, 1777, 5, 116, 0, 0, 1777, 1778, 5, 104, 0, 0, 1778, 1779, 5, 111, 0, 0, 1779, 1780, 5, 100, 0, 0, 1780, 278, 1, 0, 0, 0, 1781, 1782, 5, 102, 0, 0, 1782, 1783, 5, 105, 0, 0, 1783, 1784, 5, 110, 0, 0, 1784, 1785, 5, 97, 0, 0, 1785, 1786, 5, 108, 0, 0, 1786, 280, 1, 0, 0, 0, 1787, 1788, 5, 118, 0, 0, 1788, 1789, 5, 105, 0, 0, 1789, 1790, 5, 114, 0, 0, 1790, 1791, 5, 116, 0, 0, 1791, 1792, 5, 117, 0, 0, 1792, 1793, 5, 97, 0, 0, 1793, 1794, 5, 108, 0, 0, 1794, 282, 1, 0, 0, 0, 1795, 1796, 5, 115, 0, 0, 1796, 1797, 5, 116, 0, 0, 1797, 1798, 5, 114, 0, 0, 1798, 1799, 5, 105, 0, 0, 1799, 1800, 5, 99, 0, 0, 1800, 1801, 5, 116, 0, 0, 1801, 284, 1, 0, 0, 0, 1802, 1803, 5, 104, 0, 0, 1803, 1804, 5, 105, 0, 0, 1804, 1805, 5, 100, 0, 0, 1805, 1806, 5, 101, 0, 0, 1806, 1807, 5, 98, 0, 0, 1807, 1808, 5, 121, 0, 0, 1808, 1809, 5, 115, 0, 0, 1809, 1810, 5, 105, 0, 0, 1810, 1811, 5, 103, 0, 0, 1811, 286, 1, 0, 0, 0, 1812, 1813, 5, 110, 0, 0, 1813, 1814, 5, 101, 0, 0, 1814, 1815, 5, 119, 0, 0, 1815, 1816, 5, 115, 0, 0, 1816, 1817, 5, 108, 0, 0, 1817, 1818, 5, 111, 0, 0, 1818, 1819, 5, 116, 0, 0, 1819, 288, 1, 0, 0, 0, 1820, 1821, 5, 117, 0, 0, 1821, 1822, 5, 110, 0, 0, 1822, 1823, 5, 109, 0, 0, 1823, 1824, 5, 97, 0, 0, 1824, 1825, 5, 110, 0, 0, 1825, 1826, 5, 97, 0, 0, 1826, 1827, 5, 103, 0, 0, 1827, 1828, 5, 101, 0, 0, 1828, 1829, 5, 100, 0, 0, 1829, 1830, 5, 101, 0, 0, 1830, 1831, 5, 120, 0, 0, 1831, 1832, 5, 112, 0, 0, 1832, 290, 1, 0, 0, 0, 1833, 1834, 5, 114, 0, 0, 1834, 1835, 5, 101, 0, 0, 1835, 1836, 5, 113, 0, 0, 1836, 1837, 5, 115, 0, 0, 1837, 1838, 5, 101, 0, 0, 1838, 1839, 5, 99, 0, 0, 1839, 1840, 5, 111, 0, 0, 1840, 1841, 5, 98, 0, 0, 1841, 1842, 5, 106, 0, 0, 1842, 292, 1, 0, 0, 0, 1843, 1844, 5, 112, 0, 0, 1844, 1845, 5, 105, 0, 0, 1845, 1846, 5, 110, 0, 0, 1846, 1847, 5, 118, 0, 0, 1847, 1848, 5, 111, 0, 0, 1848, 1849, 5, 107, 0, 0, 1849, 1850, 5, 101, 0, 0, 1850, 1851, 5, 105, 0, 0, 1851, 1852, 5, 109, 0, 0, 1852, 1853, 5, 112, 0, 0, 1853, 1854, 5, 108, 0, 0, 1854, 294, 1, 0, 0, 0, 1855, 1856, 5, 110, 0, 0, 1856, 1857, 5, 111, 0, 0, 1857, 1858, 5, 109, 0, 0, 1858, 1859, 5, 97, 0, 0, 1859, 1860, 5, 110, 0, 0, 1860, 1861, 5, 103, 0, 0, 1861, 1862, 5, 108, 0, 0, 1862, 1863, 5, 101, 0, 0, 1863, 296, 1, 0, 0, 0, 1864, 1865, 5, 108, 0, 0, 1865, 1866, 5, 97, 0, 0, 1866, 1867, 5, 115, 0, 0, 1867, 1868, 5, 116, 0, 0, 1868, 1869, 5, 101, 0, 0, 1869, 1870, 5, 114, 0, 0, 1870, 1871, 5, 114, 0, 0, 1871, 298, 1, 0, 0, 0, 1872, 1873, 5, 119, 0, 0, 1873, 1874, 5, 105, 0, 0, 1874, 1875, 5, 110, 0, 0, 1875, 1876, 5, 97, 0, 0, 1876, 1877, 5, 112, 0, 0, 1877, 1878, 5, 105, 0, 0, 1878, 300, 1, 0, 0, 0, 1879, 1880, 5, 98, 0, 0, 1880, 1881, 5, 101, 0, 0, 1881, 1882, 5, 115, 0, 0, 1882, 1883, 5, 116, 0, 0, 1883, 1884, 5, 102, 0, 0, 1884, 1885, 5, 105, 0, 0, 1885, 1886, 5, 116, 0, 0, 1886, 302, 1, 0, 0, 0, 1887, 1888, 5, 111, 0, 0, 1888, 1889, 5, 110, 0, 0, 1889, 304, 1, 0, 0, 0, 1890, 1891, 5, 111, 0, 0, 1891, 1892, 5, 102, 0, 0, 1892, 1893, 5, 102, 0, 0, 1893, 306, 1, 0, 0, 0, 1894, 1895, 5, 99, 0, 0, 1895, 1896, 5, 104, 0, 0, 1896, 1897, 5, 97, 0, 0, 1897, 1898, 5, 114, 0, 0, 1898, 1899, 5, 109, 0, 0, 1899, 1900, 5, 97, 0, 0, 1900, 1901, 5, 112, 0, 0, 1901, 1902, 5, 101, 0, 0, 1902, 1903, 5, 114, 0, 0, 1903, 1904, 5, 114, 0, 0, 1904, 1905, 5, 111, 0, 0, 1905, 1906, 5, 114, 0, 0, 1906, 308, 1, 0, 0, 0, 1907, 1908, 5, 46, 0, 0, 1908, 1909, 5, 99, 0, 0, 1909, 1910, 5, 99, 0, 0, 1910, 1911, 5, 116, 0, 0, 1911, 1912, 5, 111, 0, 0, 1912, 1913, 5, 114, 0, 0, 1913, 310, 1, 0, 0, 0, 1914, 1915, 5, 105, 0, 0, 1915, 1916, 5, 108, 0, 0, 1916, 312, 1, 0, 0, 0, 1917, 1918, 5, 105, 0, 0, 1918, 1919, 5, 110, 0, 0, 1919, 1920, 5, 105, 0, 0, 1920, 1921, 5, 116, 0, 0, 1921, 314, 1, 0, 0, 0, 1922, 1923, 5, 46, 0, 0, 1923, 1924, 5, 116, 0, 0, 1924, 1925, 5, 114, 0, 0, 1925, 1926, 5, 121, 0, 0, 1926, 316, 1, 0, 0, 0, 1927, 1928, 5, 116, 0, 0, 1928, 1929, 5, 111, 0, 0, 1929, 318, 1, 0, 0, 0, 1930, 1931, 5, 102, 0, 0, 1931, 1932, 5, 105, 0, 0, 1932, 1933, 5, 108, 0, 0, 1933, 1934, 5, 116, 0, 0, 1934, 1935, 5, 101, 0, 0, 1935, 1936, 5, 114, 0, 0, 1936, 320, 1, 0, 0, 0, 1937, 1938, 5, 99, 0, 0, 1938, 1939, 5, 97, 0, 0, 1939, 1940, 5, 116, 0, 0, 1940, 1941, 5, 99, 0, 0, 1941, 1942, 5, 104, 0, 0, 1942, 322, 1, 0, 0, 0, 1943, 1944, 5, 102, 0, 0, 1944, 1945, 5, 105, 0, 0, 1945, 1946, 5, 110, 0, 0, 1946, 1947, 5, 97, 0, 0, 1947, 1948, 5, 108, 0, 0, 1948, 1949, 5, 108, 0, 0, 1949, 1950, 5, 121, 0, 0, 1950, 324, 1, 0, 0, 0, 1951, 1952, 5, 102, 0, 0, 1952, 1953, 5, 97, 0, 0, 1953, 1954, 5, 117, 0, 0, 1954, 1955, 5, 108, 0, 0, 1955, 1956, 5, 116, 0, 0, 1956, 326, 1, 0, 0, 0, 1957, 1958, 5, 104, 0, 0, 1958, 1959, 5, 97, 0, 0, 1959, 1960, 5, 110, 0, 0, 1960, 1961, 5, 100, 0, 0, 1961, 1962, 5, 108, 0, 0, 1962, 1963, 5, 101, 0, 0, 1963, 1964, 5, 114, 0, 0, 1964, 328, 1, 0, 0, 0, 1965, 1966, 5, 46, 0, 0, 1966, 1967, 5, 100, 0, 0, 1967, 1968, 5, 97, 0, 0, 1968, 1969, 5, 116, 0, 0, 1969, 1970, 5, 97, 0, 0, 1970, 330, 1, 0, 0, 0, 1971, 1972, 5, 116, 0, 0, 1972, 1973, 5, 108, 0, 0, 1973, 1974, 5, 115, 0, 0, 1974, 332, 1, 0, 0, 0, 1975, 1976, 5, 46, 0, 0, 1976, 1977, 5, 112, 0, 0, 1977, 1978, 5, 117, 0, 0, 1978, 1979, 5, 98, 0, 0, 1979, 1980, 5, 108, 0, 0, 1980, 1981, 5, 105, 0, 0, 1981, 1982, 5, 99, 0, 0, 1982, 1983, 5, 107, 0, 0, 1983, 1984, 5, 101, 0, 0, 1984, 1985, 5, 121, 0, 0, 1985, 334, 1, 0, 0, 0, 1986, 1987, 5, 46, 0, 0, 1987, 1988, 5, 112, 0, 0, 1988, 1989, 5, 117, 0, 0, 1989, 1990, 5, 98, 0, 0, 1990, 1991, 5, 108, 0, 0, 1991, 1992, 5, 105, 0, 0, 1992, 1993, 5, 99, 0, 0, 1993, 1994, 5, 75, 0, 0, 1994, 1995, 5, 101, 0, 0, 1995, 1996, 5, 121, 0, 0, 1996, 336, 1, 0, 0, 0, 1997, 1998, 5, 46, 0, 0, 1998, 1999, 5, 118, 0, 0, 1999, 2000, 5, 101, 0, 0, 2000, 2001, 5, 114, 0, 0, 2001, 338, 1, 0, 0, 0, 2002, 2003, 5, 46, 0, 0, 2003, 2004, 5, 108, 0, 0, 2004, 2005, 5, 111, 0, 0, 2005, 2006, 5, 99, 0, 0, 2006, 2007, 5, 97, 0, 0, 2007, 2008, 5, 108, 0, 0, 2008, 2009, 5, 101, 0, 0, 2009, 340, 1, 0, 0, 0, 2010, 2011, 5, 46, 0, 0, 2011, 2012, 5, 112, 0, 0, 2012, 2013, 5, 117, 0, 0, 2013, 2014, 5, 98, 0, 0, 2014, 2015, 5, 108, 0, 0, 2015, 2016, 5, 105, 0, 0, 2016, 2017, 5, 99, 0, 0, 2017, 2018, 5, 107, 0, 0, 2018, 2019, 5, 101, 0, 0, 2019, 2020, 5, 121, 0, 0, 2020, 2021, 5, 116, 0, 0, 2021, 2022, 5, 111, 0, 0, 2022, 2023, 5, 107, 0, 0, 2023, 2024, 5, 101, 0, 0, 2024, 2025, 5, 110, 0, 0, 2025, 342, 1, 0, 0, 0, 2026, 2027, 5, 102, 0, 0, 2027, 2028, 5, 111, 0, 0, 2028, 2029, 5, 114, 0, 0, 2029, 2030, 5, 119, 0, 0, 2030, 2031, 5, 97, 0, 0, 2031, 2032, 5, 114, 0, 0, 2032, 2033, 5, 100, 0, 0, 2033, 2034, 5, 101, 0, 0, 2034, 2035, 5, 114, 0, 0, 2035, 344, 1, 0, 0, 0, 2036, 2038, 5, 45, 0, 0, 2037, 2036, 1, 0, 0, 0, 2037, 2038, 1, 0, 0, 0, 2038, 2052, 1, 0, 0, 0, 2039, 2040, 5, 48, 0, 0, 2040, 2041, 5, 120, 0, 0, 2041, 2043, 1, 0, 0, 0, 2042, 2044, 7, 0, 0, 0, 2043, 2042, 1, 0, 0, 0, 2044, 2045, 1, 0, 0, 0, 2045, 2043, 1, 0, 0, 0, 2045, 2046, 1, 0, 0, 0, 2046, 2053, 1, 0, 0, 0, 2047, 2049, 7, 1, 0, 0, 2048, 2047, 1, 0, 0, 0, 2049, 2050, 1, 0, 0, 0, 2050, 2048, 1, 0, 0, 0, 2050, 2051, 1, 0, 0, 0, 2051, 2053, 1, 0, 0, 0, 2052, 2039, 1, 0, 0, 0, 2052, 2048, 1, 0, 0, 0, 2053, 346, 1, 0, 0, 0, 2054, 2056, 5, 45, 0, 0, 2055, 2054, 1, 0, 0, 0, 2055, 2056, 1, 0, 0, 0, 2056, 2070, 1, 0, 0, 0, 2057, 2058, 5, 48, 0, 0, 2058, 2059, 5, 120, 0, 0, 2059, 2061, 1, 0, 0, 0, 2060, 2062, 7, 0, 0, 0, 2061, 2060, 1, 0, 0, 0, 2062, 2063, 1, 0, 0, 0, 2063, 2061, 1, 0, 0, 0, 2063, 2064, 1, 0, 0, 0, 2064, 2071, 1, 0, 0, 0, 2065, 2067, 7, 1, 0, 0, 2066, 2065, 1, 0, 0, 0, 2067, 2068, 1, 0, 0, 0, 2068, 2066, 1, 0, 0, 0, 2068, 2069, 1, 0, 0, 0, 2069, 2071, 1, 0, 0, 0, 2070, 2057, 1, 0, 0, 0, 2070, 2066, 1, 0, 0, 0, 2071, 348, 1, 0, 0, 0, 2072, 2074, 5, 45, 0, 0, 2073, 2072, 1, 0, 0, 0, 2073, 2074, 1, 0, 0, 0, 2074, 2125, 1, 0, 0, 0, 2075, 2077, 7, 1, 0, 0, 2076, 2075, 1, 0, 0, 0, 2077, 2078, 1, 0, 0, 0, 2078, 2076, 1, 0, 0, 0, 2078, 2079, 1, 0, 0, 0, 2079, 2106, 1, 0, 0, 0, 2080, 2082, 5, 46, 0, 0, 2081, 2083, 7, 1, 0, 0, 2082, 2081, 1, 0, 0, 0, 2083, 2084, 1, 0, 0, 0, 2084, 2082, 1, 0, 0, 0, 2084, 2085, 1, 0, 0, 0, 2085, 2095, 1, 0, 0, 0, 2086, 2088, 7, 2, 0, 0, 2087, 2089, 7, 3, 0, 0, 2088, 2087, 1, 0, 0, 0, 2088, 2089, 1, 0, 0, 0, 2089, 2091, 1, 0, 0, 0, 2090, 2092, 7, 1, 0, 0, 2091, 2090, 1, 0, 0, 0, 2092, 2093, 1, 0, 0, 0, 2093, 2091, 1, 0, 0, 0, 2093, 2094, 1, 0, 0, 0, 2094, 2096, 1, 0, 0, 0, 2095, 2086, 1, 0, 0, 0, 2095, 2096, 1, 0, 0, 0, 2096, 2107, 1, 0, 0, 0, 2097, 2099, 7, 2, 0, 0, 2098, 2100, 7, 3, 0, 0, 2099, 2098, 1, 0, 0, 0, 2099, 2100, 1, 0, 0, 0, 2100, 2102, 1, 0, 0, 0, 2101, 2103, 7, 1, 0, 0, 2102, 2101, 1, 0, 0, 0, 2103, 2104, 1, 0, 0, 0, 2104, 2102, 1, 0, 0, 0, 2104, 2105, 1, 0, 0, 0, 2105, 2107, 1, 0, 0, 0, 2106, 2080, 1, 0, 0, 0, 2106, 2097, 1, 0, 0, 0, 2107, 2126, 1, 0, 0, 0, 2108, 2110, 5, 46, 0, 0, 2109, 2111, 7, 1, 0, 0, 2110, 2109, 1, 0, 0, 0, 2111, 2112, 1, 0, 0, 0, 2112, 2110, 1, 0, 0, 0, 2112, 2113, 1, 0, 0, 0, 2113, 2123, 1, 0, 0, 0, 2114, 2116, 7, 2, 0, 0, 2115, 2117, 7, 3, 0, 0, 2116, 2115, 1, 0, 0, 0, 2116, 2117, 1, 0, 0, 0, 2117, 2119, 1, 0, 0, 0, 2118, 2120, 7, 1, 0, 0, 2119, 2118, 1, 0, 0, 0, 2120, 2121, 1, 0, 0, 0, 2121, 2119, 1, 0, 0, 0, 2121, 2122, 1, 0, 0, 0, 2122, 2124, 1, 0, 0, 0, 2123, 2114, 1, 0, 0, 0, 2123, 2124, 1, 0, 0, 0, 2124, 2126, 1, 0, 0, 0, 2125, 2076, 1, 0, 0, 0, 2125, 2108, 1, 0, 0, 0, 2126, 350, 1, 0, 0, 0, 2127, 2128, 5, 58, 0, 0, 2128, 2129, 5, 58, 0, 0, 2129, 352, 1, 0, 0, 0, 2130, 2131, 5, 46, 0, 0, 2131, 2132, 5, 46, 0, 0, 2132, 2133, 5, 46, 0, 0, 2133, 354, 1, 0, 0, 0, 2134, 2135, 5, 110, 0, 0, 2135, 2136, 5, 117, 0, 0, 2136, 2137, 5, 108, 0, 0, 2137, 2138, 5, 108, 0, 0, 2138, 356, 1, 0, 0, 0, 2139, 2140, 5, 110, 0, 0, 2140, 2141, 5, 117, 0, 0, 2141, 2142, 5, 108, 0, 0, 2142, 2143, 5, 108, 0, 0, 2143, 2144, 5, 114, 0, 0, 2144, 2145, 5, 101, 0, 0, 2145, 2146, 5, 102, 0, 0, 2146, 358, 1, 0, 0, 0, 2147, 2148, 5, 46, 0, 0, 2148, 2149, 5, 104, 0, 0, 2149, 2150, 5, 97, 0, 0, 2150, 2151, 5, 115, 0, 0, 2151, 2152, 5, 104, 0, 0, 2152, 360, 1, 0, 0, 0, 2153, 2154, 5, 99, 0, 0, 2154, 2155, 5, 104, 0, 0, 2155, 2156, 5, 97, 0, 0, 2156, 2163, 5, 114, 0, 0, 2157, 2158, 5, 119, 0, 0, 2158, 2159, 5, 99, 0, 0, 2159, 2160, 5, 104, 0, 0, 2160, 2161, 5, 97, 0, 0, 2161, 2163, 5, 114, 0, 0, 2162, 2153, 1, 0, 0, 0, 2162, 2157, 1, 0, 0, 0, 2163, 362, 1, 0, 0, 0, 2164, 2165, 5, 115, 0, 0, 2165, 2166, 5, 116, 0, 0, 2166, 2167, 5, 114, 0, 0, 2167, 2168, 5, 105, 0, 0, 2168, 2169, 5, 110, 0, 0, 2169, 2170, 5, 103, 0, 0, 2170, 364, 1, 0, 0, 0, 2171, 2172, 5, 98, 0, 0, 2172, 2173, 5, 111, 0, 0, 2173, 2174, 5, 111, 0, 0, 2174, 2175, 5, 108, 0, 0, 2175, 366, 1, 0, 0, 0, 2176, 2177, 5, 105, 0, 0, 2177, 2178, 5, 110, 0, 0, 2178, 2179, 5, 116, 0, 0, 2179, 2180, 5, 56, 0, 0, 2180, 368, 1, 0, 0, 0, 2181, 2182, 5, 105, 0, 0, 2182, 2183, 5, 110, 0, 0, 2183, 2184, 5, 116, 0, 0, 2184, 2185, 5, 49, 0, 0, 2185, 2186, 5, 54, 0, 0, 2186, 370, 1, 0, 0, 0, 2187, 2188, 5, 105, 0, 0, 2188, 2189, 5, 110, 0, 0, 2189, 2190, 5, 116, 0, 0, 2190, 2191, 5, 51, 0, 0, 2191, 2192, 5, 50, 0, 0, 2192, 372, 1, 0, 0, 0, 2193, 2194, 5, 105, 0, 0, 2194, 2195, 5, 110, 0, 0, 2195, 2196, 5, 116, 0, 0, 2196, 2197, 5, 54, 0, 0, 2197, 2198, 5, 52, 0, 0, 2198, 374, 1, 0, 0, 0, 2199, 2200, 5, 102, 0, 0, 2200, 2201, 5, 108, 0, 0, 2201, 2202, 5, 111, 0, 0, 2202, 2203, 5, 97, 0, 0, 2203, 2204, 5, 116, 0, 0, 2204, 2205, 5, 51, 0, 0, 2205, 2206, 5, 50, 0, 0, 2206, 376, 1, 0, 0, 0, 2207, 2208, 5, 102, 0, 0, 2208, 2209, 5, 108, 0, 0, 2209, 2210, 5, 111, 0, 0, 2210, 2211, 5, 97, 0, 0, 2211, 2212, 5, 116, 0, 0, 2212, 2213, 5, 54, 0, 0, 2213, 2214, 5, 52, 0, 0, 2214, 378, 1, 0, 0, 0, 2215, 2216, 5, 117, 0, 0, 2216, 2217, 5, 110, 0, 0, 2217, 2218, 5, 115, 0, 0, 2218, 2219, 5, 105, 0, 0, 2219, 2220, 5, 103, 0, 0, 2220, 2221, 5, 110, 0, 0, 2221, 2222, 5, 101, 0, 0, 2222, 2223, 5, 100, 0, 0, 2223, 380, 1, 0, 0, 0, 2224, 2225, 5, 117, 0, 0, 2225, 2226, 5, 105, 0, 0, 2226, 2227, 5, 110, 0, 0, 2227, 2228, 5, 116, 0, 0, 2228, 2229, 5, 56, 0, 0, 2229, 382, 1, 0, 0, 0, 2230, 2231, 5, 117, 0, 0, 2231, 2232, 5, 105, 0, 0, 2232, 2233, 5, 110, 0, 0, 2233, 2234, 5, 116, 0, 0, 2234, 2235, 5, 49, 0, 0, 2235, 2236, 5, 54, 0, 0, 2236, 384, 1, 0, 0, 0, 2237, 2238, 5, 117, 0, 0, 2238, 2239, 5, 105, 0, 0, 2239, 2240, 5, 110, 0, 0, 2240, 2241, 5, 116, 0, 0, 2241, 2242, 5, 51, 0, 0, 2242, 2243, 5, 50, 0, 0, 2243, 386, 1, 0, 0, 0, 2244, 2245, 5, 117, 0, 0, 2245, 2246, 5, 105, 0, 0, 2246, 2247, 5, 110, 0, 0, 2247, 2248, 5, 116, 0, 0, 2248, 2249, 5, 54, 0, 0, 2249, 2250, 5, 52, 0, 0, 2250, 388, 1, 0, 0, 0, 2251, 2252, 5, 105, 0, 0, 2252, 2253, 5, 110, 0, 0, 2253, 2254, 5, 116, 0, 0, 2254, 390, 1, 0, 0, 0, 2255, 2256, 5, 117, 0, 0, 2256, 2257, 5, 105, 0, 0, 2257, 2258, 5, 110, 0, 0, 2258, 2259, 5, 116, 0, 0, 2259, 392, 1, 0, 0, 0, 2260, 2261, 5, 116, 0, 0, 2261, 2262, 5, 121, 0, 0, 2262, 2263, 5, 112, 0, 0, 2263, 2264, 5, 101, 0, 0, 2264, 394, 1, 0, 0, 0, 2265, 2266, 5, 111, 0, 0, 2266, 2267, 5, 98, 0, 0, 2267, 2268, 5, 106, 0, 0, 2268, 2269, 5, 101, 0, 0, 2269, 2270, 5, 99, 0, 0, 2270, 2271, 5, 116, 0, 0, 2271, 396, 1, 0, 0, 0, 2272, 2273, 5, 46, 0, 0, 2273, 2274, 5, 109, 0, 0, 2274, 2275, 5, 111, 0, 0, 2275, 2276, 5, 100, 0, 0, 2276, 2277, 5, 117, 0, 0, 2277, 2278, 5, 108, 0, 0, 2278, 2279, 5, 101, 0, 0, 2279, 398, 1, 0, 0, 0, 2280, 2281, 5, 118, 0, 0, 2281, 2282, 5, 97, 0, 0, 2282, 2283, 5, 108, 0, 0, 2283, 2284, 5, 117, 0, 0, 2284, 2285, 5, 101, 0, 0, 2285, 400, 1, 0, 0, 0, 2286, 2287, 5, 118, 0, 0, 2287, 2288, 5, 97, 0, 0, 2288, 2289, 5, 108, 0, 0, 2289, 2290, 5, 117, 0, 0, 2290, 2291, 5, 101, 0, 0, 2291, 2292, 5, 116, 0, 0, 2292, 2293, 5, 121, 0, 0, 2293, 2294, 5, 112, 0, 0, 2294, 2295, 5, 101, 0, 0, 2295, 402, 1, 0, 0, 0, 2296, 2297, 5, 118, 0, 0, 2297, 2298, 5, 111, 0, 0, 2298, 2299, 5, 105, 0, 0, 2299, 2300, 5, 100, 0, 0, 2300, 404, 1, 0, 0, 0, 2301, 2302, 5, 101, 0, 0, 2302, 2303, 5, 110, 0, 0, 2303, 2304, 5, 117, 0, 0, 2304, 2305, 5, 109, 0, 0, 2305, 406, 1, 0, 0, 0, 2306, 2307, 5, 99, 0, 0, 2307, 2308, 5, 117, 0, 0, 2308, 2309, 5, 115, 0, 0, 2309, 2310, 5, 116, 0, 0, 2310, 2311, 5, 111, 0, 0, 2311, 2312, 5, 109, 0, 0, 2312, 408, 1, 0, 0, 0, 2313, 2314, 5, 102, 0, 0, 2314, 2315, 5, 105, 0, 0, 2315, 2316, 5, 120, 0, 0, 2316, 2317, 5, 101, 0, 0, 2317, 2318, 5, 100, 0, 0, 2318, 410, 1, 0, 0, 0, 2319, 2320, 5, 115, 0, 0, 2320, 2321, 5, 121, 0, 0, 2321, 2322, 5, 115, 0, 0, 2322, 2323, 5, 115, 0, 0, 2323, 2324, 5, 116, 0, 0, 2324, 2325, 5, 114, 0, 0, 2325, 2326, 5, 105, 0, 0, 2326, 2327, 5, 110, 0, 0, 2327, 2328, 5, 103, 0, 0, 2328, 412, 1, 0, 0, 0, 2329, 2330, 5, 97, 0, 0, 2330, 2331, 5, 114, 0, 0, 2331, 2332, 5, 114, 0, 0, 2332, 2333, 5, 97, 0, 0, 2333, 2334, 5, 121, 0, 0, 2334, 414, 1, 0, 0, 0, 2335, 2336, 5, 118, 0, 0, 2336, 2337, 5, 97, 0, 0, 2337, 2338, 5, 114, 0, 0, 2338, 2339, 5, 105, 0, 0, 2339, 2340, 5, 97, 0, 0, 2340, 2341, 5, 110, 0, 0, 2341, 2342, 5, 116, 0, 0, 2342, 416, 1, 0, 0, 0, 2343, 2344, 5, 99, 0, 0, 2344, 2345, 5, 117, 0, 0, 2345, 2346, 5, 114, 0, 0, 2346, 2347, 5, 114, 0, 0, 2347, 2348, 5, 101, 0, 0, 2348, 2349, 5, 110, 0, 0, 2349, 2350, 5, 99, 0, 0, 2350, 2351, 5, 121, 0, 0, 2351, 418, 1, 0, 0, 0, 2352, 2353, 5, 115, 0, 0, 2353, 2354, 5, 121, 0, 0, 2354, 2355, 5, 115, 0, 0, 2355, 2356, 5, 99, 0, 0, 2356, 2357, 5, 104, 0, 0, 2357, 2358, 5, 97, 0, 0, 2358, 2359, 5, 114, 0, 0, 2359, 420, 1, 0, 0, 0, 2360, 2361, 5, 101, 0, 0, 2361, 2362, 5, 114, 0, 0, 2362, 2363, 5, 114, 0, 0, 2363, 2364, 5, 111, 0, 0, 2364, 2365, 5, 114, 0, 0, 2365, 422, 1, 0, 0, 0, 2366, 2367, 5, 100, 0, 0, 2367, 2368, 5, 101, 0, 0, 2368, 2369, 5, 99, 0, 0, 2369, 2370, 5, 105, 0, 0, 2370, 2371, 5, 109, 0, 0, 2371, 2372, 5, 97, 0, 0, 2372, 2373, 5, 108, 0, 0, 2373, 424, 1, 0, 0, 0, 2374, 2375, 5, 100, 0, 0, 2375, 2376, 5, 97, 0, 0, 2376, 2377, 5, 116, 0, 0, 2377, 2378, 5, 101, 0, 0, 2378, 426, 1, 0, 0, 0, 2379, 2380, 5, 98, 0, 0, 2380, 2381, 5, 115, 0, 0, 2381, 2382, 5, 116, 0, 0, 2382, 2383, 5, 114, 0, 0, 2383, 428, 1, 0, 0, 0, 2384, 2385, 5, 108, 0, 0, 2385, 2386, 5, 112, 0, 0, 2386, 2387, 5, 115, 0, 0, 2387, 2388, 5, 116, 0, 0, 2388, 2389, 5, 114, 0, 0, 2389, 430, 1, 0, 0, 0, 2390, 2391, 5, 108, 0, 0, 2391, 2392, 5, 112, 0, 0, 2392, 2393, 5, 119, 0, 0, 2393, 2394, 5, 115, 0, 0, 2394, 2395, 5, 116, 0, 0, 2395, 2396, 5, 114, 0, 0, 2396, 432, 1, 0, 0, 0, 2397, 2398, 5, 108, 0, 0, 2398, 2399, 5, 112, 0, 0, 2399, 2400, 5, 116, 0, 0, 2400, 2401, 5, 115, 0, 0, 2401, 2402, 5, 116, 0, 0, 2402, 2403, 5, 114, 0, 0, 2403, 434, 1, 0, 0, 0, 2404, 2405, 5, 111, 0, 0, 2405, 2406, 5, 98, 0, 0, 2406, 2407, 5, 106, 0, 0, 2407, 2408, 5, 101, 0, 0, 2408, 2409, 5, 99, 0, 0, 2409, 2410, 5, 116, 0, 0, 2410, 2411, 5, 114, 0, 0, 2411, 2412, 5, 101, 0, 0, 2412, 2413, 5, 102, 0, 0, 2413, 436, 1, 0, 0, 0, 2414, 2415, 5, 105, 0, 0, 2415, 2416, 5, 117, 0, 0, 2416, 2417, 5, 110, 0, 0, 2417, 2418, 5, 107, 0, 0, 2418, 2419, 5, 110, 0, 0, 2419, 2420, 5, 111, 0, 0, 2420, 2421, 5, 119, 0, 0, 2421, 2422, 5, 110, 0, 0, 2422, 438, 1, 0, 0, 0, 2423, 2424, 5, 105, 0, 0, 2424, 2425, 5, 100, 0, 0, 2425, 2426, 5, 105, 0, 0, 2426, 2427, 5, 115, 0, 0, 2427, 2428, 5, 112, 0, 0, 2428, 2429, 5, 97, 0, 0, 2429, 2430, 5, 116, 0, 0, 2430, 2431, 5, 99, 0, 0, 2431, 2432, 5, 104, 0, 0, 2432, 440, 1, 0, 0, 0, 2433, 2434, 5, 115, 0, 0, 2434, 2435, 5, 116, 0, 0, 2435, 2436, 5, 114, 0, 0, 2436, 2437, 5, 117, 0, 0, 2437, 2438, 5, 99, 0, 0, 2438, 2439, 5, 116, 0, 0, 2439, 442, 1, 0, 0, 0, 2440, 2441, 5, 105, 0, 0, 2441, 2442, 5, 110, 0, 0, 2442, 2443, 5, 116, 0, 0, 2443, 2444, 5, 101, 0, 0, 2444, 2445, 5, 114, 0, 0, 2445, 2446, 5, 102, 0, 0, 2446, 2447, 5, 97, 0, 0, 2447, 2448, 5, 99, 0, 0, 2448, 2449, 5, 101, 0, 0, 2449, 444, 1, 0, 0, 0, 2450, 2451, 5, 115, 0, 0, 2451, 2452, 5, 97, 0, 0, 2452, 2453, 5, 102, 0, 0, 2453, 2454, 5, 101, 0, 0, 2454, 2455, 5, 97, 0, 0, 2455, 2456, 5, 114, 0, 0, 2456, 2457, 5, 114, 0, 0, 2457, 2458, 5, 97, 0, 0, 2458, 2459, 5, 121, 0, 0, 2459, 446, 1, 0, 0, 0, 2460, 2461, 5, 98, 0, 0, 2461, 2462, 5, 121, 0, 0, 2462, 2463, 5, 118, 0, 0, 2463, 2464, 5, 97, 0, 0, 2464, 2465, 5, 108, 0, 0, 2465, 2466, 5, 115, 0, 0, 2466, 2467, 5, 116, 0, 0, 2467, 2468, 5, 114, 0, 0, 2468, 448, 1, 0, 0, 0, 2469, 2470, 5, 97, 0, 0, 2470, 2471, 5, 110, 0, 0, 2471, 2472, 5, 115, 0, 0, 2472, 2473, 5, 105, 0, 0, 2473, 450, 1, 0, 0, 0, 2474, 2475, 5, 116, 0, 0, 2475, 2476, 5, 98, 0, 0, 2476, 2477, 5, 115, 0, 0, 2477, 2478, 5, 116, 0, 0, 2478, 2479, 5, 114, 0, 0, 2479, 452, 1, 0, 0, 0, 2480, 2481, 5, 109, 0, 0, 2481, 2482, 5, 101, 0, 0, 2482, 2483, 5, 116, 0, 0, 2483, 2484, 5, 104, 0, 0, 2484, 2485, 5, 111, 0, 0, 2485, 2486, 5, 100, 0, 0, 2486, 454, 1, 0, 0, 0, 2487, 2488, 5, 97, 0, 0, 2488, 2489, 5, 110, 0, 0, 2489, 2490, 5, 121, 0, 0, 2490, 456, 1, 0, 0, 0, 2491, 2492, 5, 108, 0, 0, 2492, 2493, 5, 112, 0, 0, 2493, 2494, 5, 115, 0, 0, 2494, 2495, 5, 116, 0, 0, 2495, 2496, 5, 114, 0, 0, 2496, 2497, 5, 117, 0, 0, 2497, 2498, 5, 99, 0, 0, 2498, 2499, 5, 116, 0, 0, 2499, 458, 1, 0, 0, 0, 2500, 2501, 5, 118, 0, 0, 2501, 2502, 5, 101, 0, 0, 2502, 2503, 5, 99, 0, 0, 2503, 2504, 5, 116, 0, 0, 2504, 2505, 5, 111, 0, 0, 2505, 2506, 5, 114, 0, 0, 2506, 460, 1, 0, 0, 0, 2507, 2508, 5, 104, 0, 0, 2508, 2509, 5, 114, 0, 0, 2509, 2510, 5, 101, 0, 0, 2510, 2511, 5, 115, 0, 0, 2511, 2512, 5, 117, 0, 0, 2512, 2513, 5, 108, 0, 0, 2513, 2514, 5, 116, 0, 0, 2514, 462, 1, 0, 0, 0, 2515, 2516, 5, 99, 0, 0, 2516, 2517, 5, 97, 0, 0, 2517, 2518, 5, 114, 0, 0, 2518, 2519, 5, 114, 0, 0, 2519, 2520, 5, 97, 0, 0, 2520, 2521, 5, 121, 0, 0, 2521, 464, 1, 0, 0, 0, 2522, 2523, 5, 117, 0, 0, 2523, 2524, 5, 115, 0, 0, 2524, 2525, 5, 101, 0, 0, 2525, 2526, 5, 114, 0, 0, 2526, 2527, 5, 100, 0, 0, 2527, 2528, 5, 101, 0, 0, 2528, 2529, 5, 102, 0, 0, 2529, 2530, 5, 105, 0, 0, 2530, 2531, 5, 110, 0, 0, 2531, 2532, 5, 101, 0, 0, 2532, 2533, 5, 100, 0, 0, 2533, 466, 1, 0, 0, 0, 2534, 2535, 5, 114, 0, 0, 2535, 2536, 5, 101, 0, 0, 2536, 2537, 5, 99, 0, 0, 2537, 2538, 5, 111, 0, 0, 2538, 2539, 5, 114, 0, 0, 2539, 2540, 5, 100, 0, 0, 2540, 468, 1, 0, 0, 0, 2541, 2542, 5, 102, 0, 0, 2542, 2543, 5, 105, 0, 0, 2543, 2544, 5, 108, 0, 0, 2544, 2545, 5, 101, 0, 0, 2545, 2546, 5, 116, 0, 0, 2546, 2547, 5, 105, 0, 0, 2547, 2548, 5, 109, 0, 0, 2548, 2549, 5, 101, 0, 0, 2549, 470, 1, 0, 0, 0, 2550, 2551, 5, 98, 0, 0, 2551, 2552, 5, 108, 0, 0, 2552, 2553, 5, 111, 0, 0, 2553, 2554, 5, 98, 0, 0, 2554, 472, 1, 0, 0, 0, 2555, 2556, 5, 115, 0, 0, 2556, 2557, 5, 116, 0, 0, 2557, 2558, 5, 114, 0, 0, 2558, 2559, 5, 101, 0, 0, 2559, 2560, 5, 97, 0, 0, 2560, 2561, 5, 109, 0, 0, 2561, 474, 1, 0, 0, 0, 2562, 2563, 5, 115, 0, 0, 2563, 2564, 5, 116, 0, 0, 2564, 2565, 5, 111, 0, 0, 2565, 2566, 5, 114, 0, 0, 2566, 2567, 5, 97, 0, 0, 2567, 2568, 5, 103, 0, 0, 2568, 2569, 5, 101, 0, 0, 2569, 476, 1, 0, 0, 0, 2570, 2571, 5, 115, 0, 0, 2571, 2572, 5, 116, 0, 0, 2572, 2573, 5, 114, 0, 0, 2573, 2574, 5, 101, 0, 0, 2574, 2575, 5, 97, 0, 0, 2575, 2576, 5, 109, 0, 0, 2576, 2577, 5, 101, 0, 0, 2577, 2578, 5, 100, 0, 0, 2578, 2579, 5, 95, 0, 0, 2579, 2580, 5, 111, 0, 0, 2580, 2581, 5, 98, 0, 0, 2581, 2582, 5, 106, 0, 0, 2582, 2583, 5, 101, 0, 0, 2583, 2584, 5, 99, 0, 0, 2584, 2585, 5, 116, 0, 0, 2585, 478, 1, 0, 0, 0, 2586, 2587, 5, 115, 0, 0, 2587, 2588, 5, 116, 0, 0, 2588, 2589, 5, 111, 0, 0, 2589, 2590, 5, 114, 0, 0, 2590, 2591, 5, 101, 0, 0, 2591, 2592, 5, 100, 0, 0, 2592, 2593, 5, 95, 0, 0, 2593, 2594, 5, 111, 0, 0, 2594, 2595, 5, 98, 0, 0, 2595, 2596, 5, 106, 0, 0, 2596, 2597, 5, 101, 0, 0, 2597, 2598, 5, 99, 0, 0, 2598, 2599, 5, 116, 0, 0, 2599, 480, 1, 0, 0, 0, 2600, 2601, 5, 98, 0, 0, 2601, 2602, 5, 108, 0, 0, 2602, 2603, 5, 111, 0, 0, 2603, 2604, 5, 98, 0, 0, 2604, 2605, 5, 95, 0, 0, 2605, 2606, 5, 111, 0, 0, 2606, 2607, 5, 98, 0, 0, 2607, 2608, 5, 106, 0, 0, 2608, 2609, 5, 101, 0, 0, 2609, 2610, 5, 99, 0, 0, 2610, 2611, 5, 116, 0, 0, 2611, 482, 1, 0, 0, 0, 2612, 2613, 5, 99, 0, 0, 2613, 2614, 5, 102, 0, 0, 2614, 484, 1, 0, 0, 0, 2615, 2616, 5, 99, 0, 0, 2616, 2617, 5, 108, 0, 0, 2617, 2618, 5, 115, 0, 0, 2618, 2619, 5, 105, 0, 0, 2619, 2620, 5, 100, 0, 0, 2620, 486, 1, 0, 0, 0, 2621, 2622, 5, 105, 0, 0, 2622, 2623, 5, 110, 0, 0, 2623, 2624, 5, 115, 0, 0, 2624, 2625, 5, 116, 0, 0, 2625, 2626, 5, 97, 0, 0, 2626, 2627, 5, 110, 0, 0, 2627, 2628, 5, 99, 0, 0, 2628, 2629, 5, 101, 0, 0, 2629, 488, 1, 0, 0, 0, 2630, 2631, 5, 101, 0, 0, 2631, 2632, 5, 120, 0, 0, 2632, 2633, 5, 112, 0, 0, 2633, 2634, 5, 108, 0, 0, 2634, 2635, 5, 105, 0, 0, 2635, 2636, 5, 99, 0, 0, 2636, 2637, 5, 105, 0, 0, 2637, 2638, 5, 116, 0, 0, 2638, 490, 1, 0, 0, 0, 2639, 2640, 5, 100, 0, 0, 2640, 2641, 5, 101, 0, 0, 2641, 2642, 5, 102, 0, 0, 2642, 2643, 5, 97, 0, 0, 2643, 2644, 5, 117, 0, 0, 2644, 2645, 5, 108, 0, 0, 2645, 2646, 5, 116, 0, 0, 2646, 492, 1, 0, 0, 0, 2647, 2648, 5, 118, 0, 0, 2648, 2649, 5, 97, 0, 0, 2649, 2650, 5, 114, 0, 0, 2650, 2651, 5, 97, 0, 0, 2651, 2652, 5, 114, 0, 0, 2652, 2653, 5, 103, 0, 0, 2653, 494, 1, 0, 0, 0, 2654, 2655, 5, 117, 0, 0, 2655, 2656, 5, 110, 0, 0, 2656, 2657, 5, 109, 0, 0, 2657, 2658, 5, 97, 0, 0, 2658, 2659, 5, 110, 0, 0, 2659, 2660, 5, 97, 0, 0, 2660, 2661, 5, 103, 0, 0, 2661, 2662, 5, 101, 0, 0, 2662, 2663, 5, 100, 0, 0, 2663, 496, 1, 0, 0, 0, 2664, 2665, 5, 99, 0, 0, 2665, 2666, 5, 100, 0, 0, 2666, 2667, 5, 101, 0, 0, 2667, 2668, 5, 99, 0, 0, 2668, 2669, 5, 108, 0, 0, 2669, 498, 1, 0, 0, 0, 2670, 2671, 5, 115, 0, 0, 2671, 2672, 5, 116, 0, 0, 2672, 2673, 5, 100, 0, 0, 2673, 2674, 5, 99, 0, 0, 2674, 2675, 5, 97, 0, 0, 2675, 2676, 5, 108, 0, 0, 2676, 2677, 5, 108, 0, 0, 2677, 500, 1, 0, 0, 0, 2678, 2679, 5, 116, 0, 0, 2679, 2680, 5, 104, 0, 0, 2680, 2681, 5, 105, 0, 0, 2681, 2682, 5, 115, 0, 0, 2682, 2683, 5, 99, 0, 0, 2683, 2684, 5, 97, 0, 0, 2684, 2685, 5, 108, 0, 0, 2685, 2686, 5, 108, 0, 0, 2686, 502, 1, 0, 0, 0, 2687, 2688, 5, 102, 0, 0, 2688, 2689, 5, 97, 0, 0, 2689, 2690, 5, 115, 0, 0, 2690, 2691, 5, 116, 0, 0, 2691, 2692, 5, 99, 0, 0, 2692, 2693, 5, 97, 0, 0, 2693, 2694, 5, 108, 0, 0, 2694, 2695, 5, 108, 0, 0, 2695, 504, 1, 0, 0, 0, 2696, 2697, 5, 33, 0, 0, 2697, 506, 1, 0, 0, 0, 2698, 2699, 5, 33, 0, 0, 2699, 2700, 5, 33, 0, 0, 2700, 508, 1, 0, 0, 0, 2701, 2702, 5, 116, 0, 0, 2702, 2703, 5, 121, 0, 0, 2703, 2704, 5, 112, 0, 0, 2704, 2705, 5, 101, 0, 0, 2705, 2706, 5, 100, 0, 0, 2706, 2707, 5, 114, 0, 0, 2707, 2708, 5, 101, 0, 0, 2708, 2716, 5, 102, 0, 0, 2709, 2710, 5, 114, 0, 0, 2710, 2711, 5, 101, 0, 0, 2711, 2712, 5, 102, 0, 0, 2712, 2713, 5, 97, 0, 0, 2713, 2714, 5, 110, 0, 0, 2714, 2716, 5, 121, 0, 0, 2715, 2701, 1, 0, 0, 0, 2715, 2709, 1, 0, 0, 0, 2716, 510, 1, 0, 0, 0, 2717, 2718, 5, 46, 0, 0, 2718, 2719, 5, 112, 0, 0, 2719, 2720, 5, 97, 0, 0, 2720, 2721, 5, 114, 0, 0, 2721, 2722, 5, 97, 0, 0, 2722, 2723, 5, 109, 0, 0, 2723, 512, 1, 0, 0, 0, 2724, 2725, 5, 99, 0, 0, 2725, 2726, 5, 111, 0, 0, 2726, 2727, 5, 110, 0, 0, 2727, 2728, 5, 115, 0, 0, 2728, 2729, 5, 116, 0, 0, 2729, 2730, 5, 114, 0, 0, 2730, 2731, 5, 97, 0, 0, 2731, 2732, 5, 105, 0, 0, 2732, 2733, 5, 110, 0, 0, 2733, 2734, 5, 116, 0, 0, 2734, 514, 1, 0, 0, 0, 2735, 2736, 5, 46, 0, 0, 2736, 2737, 5, 116, 0, 0, 2737, 2738, 5, 104, 0, 0, 2738, 2739, 5, 105, 0, 0, 2739, 2740, 5, 115, 0, 0, 2740, 516, 1, 0, 0, 0, 2741, 2742, 5, 46, 0, 0, 2742, 2743, 5, 98, 0, 0, 2743, 2744, 5, 97, 0, 0, 2744, 2745, 5, 115, 0, 0, 2745, 2746, 5, 101, 0, 0, 2746, 518, 1, 0, 0, 0, 2747, 2748, 5, 46, 0, 0, 2748, 2749, 5, 110, 0, 0, 2749, 2750, 5, 101, 0, 0, 2750, 2751, 5, 115, 0, 0, 2751, 2752, 5, 116, 0, 0, 2752, 2753, 5, 101, 0, 0, 2753, 2754, 5, 114, 0, 0, 2754, 520, 1, 0, 0, 0, 2755, 2756, 5, 38, 0, 0, 2756, 522, 1, 0, 0, 0, 2757, 2758, 5, 91, 0, 0, 2758, 2759, 5, 93, 0, 0, 2759, 524, 1, 0, 0, 0, 2760, 2761, 5, 42, 0, 0, 2761, 526, 1, 0, 0, 0, 2762, 2775, 5, 92, 0, 0, 2763, 2776, 7, 4, 0, 0, 2764, 2766, 7, 5, 0, 0, 2765, 2767, 7, 5, 0, 0, 2766, 2765, 1, 0, 0, 0, 2766, 2767, 1, 0, 0, 0, 2767, 2769, 1, 0, 0, 0, 2768, 2770, 7, 5, 0, 0, 2769, 2768, 1, 0, 0, 0, 2769, 2770, 1, 0, 0, 0, 2770, 2776, 1, 0, 0, 0, 2771, 2773, 5, 13, 0, 0, 2772, 2771, 1, 0, 0, 0, 2772, 2773, 1, 0, 0, 0, 2773, 2774, 1, 0, 0, 0, 2774, 2776, 5, 10, 0, 0, 2775, 2763, 1, 0, 0, 0, 2775, 2764, 1, 0, 0, 0, 2775, 2772, 1, 0, 0, 0, 2776, 528, 1, 0, 0, 0, 2777, 2782, 5, 34, 0, 0, 2778, 2781, 8, 6, 0, 0, 2779, 2781, 3, 527, 263, 0, 2780, 2778, 1, 0, 0, 0, 2780, 2779, 1, 0, 0, 0, 2781, 2784, 1, 0, 0, 0, 2782, 2780, 1, 0, 0, 0, 2782, 2783, 1, 0, 0, 0, 2783, 2785, 1, 0, 0, 0, 2784, 2782, 1, 0, 0, 0, 2785, 2786, 5, 34, 0, 0, 2786, 530, 1, 0, 0, 0, 2787, 2792, 5, 39, 0, 0, 2788, 2791, 8, 7, 0, 0, 2789, 2791, 3, 527, 263, 0, 2790, 2788, 1, 0, 0, 0, 2790, 2789, 1, 0, 0, 0, 2791, 2794, 1, 0, 0, 0, 2792, 2790, 1, 0, 0, 0, 2792, 2793, 1, 0, 0, 0, 2793, 2795, 1, 0, 0, 0, 2794, 2792, 1, 0, 0, 0, 2795, 2796, 5, 39, 0, 0, 2796, 532, 1, 0, 0, 0, 2797, 2798, 5, 46, 0, 0, 2798, 534, 1, 0, 0, 0, 2799, 2800, 5, 43, 0, 0, 2800, 536, 1, 0, 0, 0, 2801, 2802, 5, 35, 0, 0, 2802, 2803, 5, 100, 0, 0, 2803, 2804, 5, 101, 0, 0, 2804, 2805, 5, 102, 0, 0, 2805, 2806, 5, 105, 0, 0, 2806, 2807, 5, 110, 0, 0, 2807, 2808, 5, 101, 0, 0, 2808, 538, 1, 0, 0, 0, 2809, 2810, 5, 35, 0, 0, 2810, 2811, 5, 117, 0, 0, 2811, 2812, 5, 110, 0, 0, 2812, 2813, 5, 100, 0, 0, 2813, 2814, 5, 101, 0, 0, 2814, 2815, 5, 102, 0, 0, 2815, 540, 1, 0, 0, 0, 2816, 2817, 5, 35, 0, 0, 2817, 2818, 5, 105, 0, 0, 2818, 2819, 5, 102, 0, 0, 2819, 2820, 5, 100, 0, 0, 2820, 2821, 5, 101, 0, 0, 2821, 2822, 5, 102, 0, 0, 2822, 542, 1, 0, 0, 0, 2823, 2824, 5, 35, 0, 0, 2824, 2825, 5, 105, 0, 0, 2825, 2826, 5, 102, 0, 0, 2826, 2827, 5, 110, 0, 0, 2827, 2828, 5, 100, 0, 0, 2828, 2829, 5, 101, 0, 0, 2829, 2830, 5, 102, 0, 0, 2830, 544, 1, 0, 0, 0, 2831, 2832, 5, 35, 0, 0, 2832, 2833, 5, 101, 0, 0, 2833, 2834, 5, 108, 0, 0, 2834, 2835, 5, 115, 0, 0, 2835, 2836, 5, 101, 0, 0, 2836, 546, 1, 0, 0, 0, 2837, 2838, 5, 35, 0, 0, 2838, 2839, 5, 101, 0, 0, 2839, 2840, 5, 110, 0, 0, 2840, 2841, 5, 100, 0, 0, 2841, 2842, 5, 105, 0, 0, 2842, 2843, 5, 102, 0, 0, 2843, 548, 1, 0, 0, 0, 2844, 2845, 5, 35, 0, 0, 2845, 2846, 5, 105, 0, 0, 2846, 2847, 5, 110, 0, 0, 2847, 2848, 5, 99, 0, 0, 2848, 2849, 5, 108, 0, 0, 2849, 2850, 5, 117, 0, 0, 2850, 2851, 5, 100, 0, 0, 2851, 2852, 5, 101, 0, 0, 2852, 550, 1, 0, 0, 0, 2853, 2854, 5, 46, 0, 0, 2854, 2855, 5, 109, 0, 0, 2855, 2856, 5, 114, 0, 0, 2856, 2857, 5, 101, 0, 0, 2857, 2858, 5, 115, 0, 0, 2858, 2859, 5, 111, 0, 0, 2859, 2860, 5, 117, 0, 0, 2860, 2861, 5, 114, 0, 0, 2861, 2862, 5, 99, 0, 0, 2862, 2863, 5, 101, 0, 0, 2863, 552, 1, 0, 0, 0, 2864, 2865, 5, 110, 0, 0, 2865, 2866, 5, 111, 0, 0, 2866, 4053, 5, 112, 0, 0, 2867, 2868, 5, 117, 0, 0, 2868, 2869, 5, 110, 0, 0, 2869, 2870, 5, 117, 0, 0, 2870, 2871, 5, 115, 0, 0, 2871, 2872, 5, 101, 0, 0, 2872, 4053, 5, 100, 0, 0, 2873, 2874, 5, 98, 0, 0, 2874, 2875, 5, 114, 0, 0, 2875, 2876, 5, 101, 0, 0, 2876, 2877, 5, 97, 0, 0, 2877, 4053, 5, 107, 0, 0, 2878, 2879, 5, 108, 0, 0, 2879, 2880, 5, 100, 0, 0, 2880, 2881, 5, 97, 0, 0, 2881, 2882, 5, 114, 0, 0, 2882, 2883, 5, 103, 0, 0, 2883, 2884, 5, 46, 0, 0, 2884, 4053, 5, 48, 0, 0, 2885, 2886, 5, 108, 0, 0, 2886, 2887, 5, 100, 0, 0, 2887, 2888, 5, 97, 0, 0, 2888, 2889, 5, 114, 0, 0, 2889, 2890, 5, 103, 0, 0, 2890, 2891, 5, 46, 0, 0, 2891, 4053, 5, 49, 0, 0, 2892, 2893, 5, 108, 0, 0, 2893, 2894, 5, 100, 0, 0, 2894, 2895, 5, 97, 0, 0, 2895, 2896, 5, 114, 0, 0, 2896, 2897, 5, 103, 0, 0, 2897, 2898, 5, 46, 0, 0, 2898, 4053, 5, 50, 0, 0, 2899, 2900, 5, 108, 0, 0, 2900, 2901, 5, 100, 0, 0, 2901, 2902, 5, 97, 0, 0, 2902, 2903, 5, 114, 0, 0, 2903, 2904, 5, 103, 0, 0, 2904, 2905, 5, 46, 0, 0, 2905, 4053, 5, 51, 0, 0, 2906, 2907, 5, 108, 0, 0, 2907, 2908, 5, 100, 0, 0, 2908, 2909, 5, 108, 0, 0, 2909, 2910, 5, 111, 0, 0, 2910, 2911, 5, 99, 0, 0, 2911, 2912, 5, 46, 0, 0, 2912, 4053, 5, 48, 0, 0, 2913, 2914, 5, 108, 0, 0, 2914, 2915, 5, 100, 0, 0, 2915, 2916, 5, 108, 0, 0, 2916, 2917, 5, 111, 0, 0, 2917, 2918, 5, 99, 0, 0, 2918, 2919, 5, 46, 0, 0, 2919, 4053, 5, 49, 0, 0, 2920, 2921, 5, 108, 0, 0, 2921, 2922, 5, 100, 0, 0, 2922, 2923, 5, 108, 0, 0, 2923, 2924, 5, 111, 0, 0, 2924, 2925, 5, 99, 0, 0, 2925, 2926, 5, 46, 0, 0, 2926, 4053, 5, 50, 0, 0, 2927, 2928, 5, 108, 0, 0, 2928, 2929, 5, 100, 0, 0, 2929, 2930, 5, 108, 0, 0, 2930, 2931, 5, 111, 0, 0, 2931, 2932, 5, 99, 0, 0, 2932, 2933, 5, 46, 0, 0, 2933, 4053, 5, 51, 0, 0, 2934, 2935, 5, 115, 0, 0, 2935, 2936, 5, 116, 0, 0, 2936, 2937, 5, 108, 0, 0, 2937, 2938, 5, 111, 0, 0, 2938, 2939, 5, 99, 0, 0, 2939, 2940, 5, 46, 0, 0, 2940, 4053, 5, 48, 0, 0, 2941, 2942, 5, 115, 0, 0, 2942, 2943, 5, 116, 0, 0, 2943, 2944, 5, 108, 0, 0, 2944, 2945, 5, 111, 0, 0, 2945, 2946, 5, 99, 0, 0, 2946, 2947, 5, 46, 0, 0, 2947, 4053, 5, 49, 0, 0, 2948, 2949, 5, 115, 0, 0, 2949, 2950, 5, 116, 0, 0, 2950, 2951, 5, 108, 0, 0, 2951, 2952, 5, 111, 0, 0, 2952, 2953, 5, 99, 0, 0, 2953, 2954, 5, 46, 0, 0, 2954, 4053, 5, 50, 0, 0, 2955, 2956, 5, 115, 0, 0, 2956, 2957, 5, 116, 0, 0, 2957, 2958, 5, 108, 0, 0, 2958, 2959, 5, 111, 0, 0, 2959, 2960, 5, 99, 0, 0, 2960, 2961, 5, 46, 0, 0, 2961, 4053, 5, 51, 0, 0, 2962, 2963, 5, 108, 0, 0, 2963, 2964, 5, 100, 0, 0, 2964, 2965, 5, 110, 0, 0, 2965, 2966, 5, 117, 0, 0, 2966, 2967, 5, 108, 0, 0, 2967, 4053, 5, 108, 0, 0, 2968, 2969, 5, 108, 0, 0, 2969, 2970, 5, 100, 0, 0, 2970, 2971, 5, 99, 0, 0, 2971, 2972, 5, 46, 0, 0, 2972, 2973, 5, 105, 0, 0, 2973, 2974, 5, 52, 0, 0, 2974, 2975, 5, 46, 0, 0, 2975, 2976, 5, 109, 0, 0, 2976, 4053, 5, 49, 0, 0, 2977, 2978, 5, 108, 0, 0, 2978, 2979, 5, 100, 0, 0, 2979, 2980, 5, 99, 0, 0, 2980, 2981, 5, 46, 0, 0, 2981, 2982, 5, 105, 0, 0, 2982, 2983, 5, 52, 0, 0, 2983, 2984, 5, 46, 0, 0, 2984, 2985, 5, 77, 0, 0, 2985, 4053, 5, 49, 0, 0, 2986, 2987, 5, 108, 0, 0, 2987, 2988, 5, 100, 0, 0, 2988, 2989, 5, 99, 0, 0, 2989, 2990, 5, 46, 0, 0, 2990, 2991, 5, 105, 0, 0, 2991, 2992, 5, 52, 0, 0, 2992, 2993, 5, 46, 0, 0, 2993, 4053, 5, 48, 0, 0, 2994, 2995, 5, 108, 0, 0, 2995, 2996, 5, 100, 0, 0, 2996, 2997, 5, 99, 0, 0, 2997, 2998, 5, 46, 0, 0, 2998, 2999, 5, 105, 0, 0, 2999, 3000, 5, 52, 0, 0, 3000, 3001, 5, 46, 0, 0, 3001, 4053, 5, 49, 0, 0, 3002, 3003, 5, 108, 0, 0, 3003, 3004, 5, 100, 0, 0, 3004, 3005, 5, 99, 0, 0, 3005, 3006, 5, 46, 0, 0, 3006, 3007, 5, 105, 0, 0, 3007, 3008, 5, 52, 0, 0, 3008, 3009, 5, 46, 0, 0, 3009, 4053, 5, 50, 0, 0, 3010, 3011, 5, 108, 0, 0, 3011, 3012, 5, 100, 0, 0, 3012, 3013, 5, 99, 0, 0, 3013, 3014, 5, 46, 0, 0, 3014, 3015, 5, 105, 0, 0, 3015, 3016, 5, 52, 0, 0, 3016, 3017, 5, 46, 0, 0, 3017, 4053, 5, 51, 0, 0, 3018, 3019, 5, 108, 0, 0, 3019, 3020, 5, 100, 0, 0, 3020, 3021, 5, 99, 0, 0, 3021, 3022, 5, 46, 0, 0, 3022, 3023, 5, 105, 0, 0, 3023, 3024, 5, 52, 0, 0, 3024, 3025, 5, 46, 0, 0, 3025, 4053, 5, 52, 0, 0, 3026, 3027, 5, 108, 0, 0, 3027, 3028, 5, 100, 0, 0, 3028, 3029, 5, 99, 0, 0, 3029, 3030, 5, 46, 0, 0, 3030, 3031, 5, 105, 0, 0, 3031, 3032, 5, 52, 0, 0, 3032, 3033, 5, 46, 0, 0, 3033, 4053, 5, 53, 0, 0, 3034, 3035, 5, 108, 0, 0, 3035, 3036, 5, 100, 0, 0, 3036, 3037, 5, 99, 0, 0, 3037, 3038, 5, 46, 0, 0, 3038, 3039, 5, 105, 0, 0, 3039, 3040, 5, 52, 0, 0, 3040, 3041, 5, 46, 0, 0, 3041, 4053, 5, 54, 0, 0, 3042, 3043, 5, 108, 0, 0, 3043, 3044, 5, 100, 0, 0, 3044, 3045, 5, 99, 0, 0, 3045, 3046, 5, 46, 0, 0, 3046, 3047, 5, 105, 0, 0, 3047, 3048, 5, 52, 0, 0, 3048, 3049, 5, 46, 0, 0, 3049, 4053, 5, 55, 0, 0, 3050, 3051, 5, 108, 0, 0, 3051, 3052, 5, 100, 0, 0, 3052, 3053, 5, 99, 0, 0, 3053, 3054, 5, 46, 0, 0, 3054, 3055, 5, 105, 0, 0, 3055, 3056, 5, 52, 0, 0, 3056, 3057, 5, 46, 0, 0, 3057, 4053, 5, 56, 0, 0, 3058, 3059, 5, 100, 0, 0, 3059, 3060, 5, 117, 0, 0, 3060, 4053, 5, 112, 0, 0, 3061, 3062, 5, 112, 0, 0, 3062, 3063, 5, 111, 0, 0, 3063, 4053, 5, 112, 0, 0, 3064, 3065, 5, 114, 0, 0, 3065, 3066, 5, 101, 0, 0, 3066, 4053, 5, 116, 0, 0, 3067, 3068, 5, 108, 0, 0, 3068, 3069, 5, 100, 0, 0, 3069, 3070, 5, 105, 0, 0, 3070, 3071, 5, 110, 0, 0, 3071, 3072, 5, 100, 0, 0, 3072, 3073, 5, 46, 0, 0, 3073, 3074, 5, 105, 0, 0, 3074, 4053, 5, 49, 0, 0, 3075, 3076, 5, 108, 0, 0, 3076, 3077, 5, 100, 0, 0, 3077, 3078, 5, 105, 0, 0, 3078, 3079, 5, 110, 0, 0, 3079, 3080, 5, 100, 0, 0, 3080, 3081, 5, 46, 0, 0, 3081, 3082, 5, 117, 0, 0, 3082, 4053, 5, 49, 0, 0, 3083, 3084, 5, 108, 0, 0, 3084, 3085, 5, 100, 0, 0, 3085, 3086, 5, 105, 0, 0, 3086, 3087, 5, 110, 0, 0, 3087, 3088, 5, 100, 0, 0, 3088, 3089, 5, 46, 0, 0, 3089, 3090, 5, 105, 0, 0, 3090, 4053, 5, 50, 0, 0, 3091, 3092, 5, 108, 0, 0, 3092, 3093, 5, 100, 0, 0, 3093, 3094, 5, 105, 0, 0, 3094, 3095, 5, 110, 0, 0, 3095, 3096, 5, 100, 0, 0, 3096, 3097, 5, 46, 0, 0, 3097, 3098, 5, 117, 0, 0, 3098, 4053, 5, 50, 0, 0, 3099, 3100, 5, 108, 0, 0, 3100, 3101, 5, 100, 0, 0, 3101, 3102, 5, 105, 0, 0, 3102, 3103, 5, 110, 0, 0, 3103, 3104, 5, 100, 0, 0, 3104, 3105, 5, 46, 0, 0, 3105, 3106, 5, 105, 0, 0, 3106, 4053, 5, 52, 0, 0, 3107, 3108, 5, 108, 0, 0, 3108, 3109, 5, 100, 0, 0, 3109, 3110, 5, 105, 0, 0, 3110, 3111, 5, 110, 0, 0, 3111, 3112, 5, 100, 0, 0, 3112, 3113, 5, 46, 0, 0, 3113, 3114, 5, 117, 0, 0, 3114, 4053, 5, 52, 0, 0, 3115, 3116, 5, 108, 0, 0, 3116, 3117, 5, 100, 0, 0, 3117, 3118, 5, 105, 0, 0, 3118, 3119, 5, 110, 0, 0, 3119, 3120, 5, 100, 0, 0, 3120, 3121, 5, 46, 0, 0, 3121, 3122, 5, 105, 0, 0, 3122, 4053, 5, 56, 0, 0, 3123, 3124, 5, 108, 0, 0, 3124, 3125, 5, 100, 0, 0, 3125, 3126, 5, 105, 0, 0, 3126, 3127, 5, 110, 0, 0, 3127, 3128, 5, 100, 0, 0, 3128, 3129, 5, 46, 0, 0, 3129, 3130, 5, 117, 0, 0, 3130, 4053, 5, 56, 0, 0, 3131, 3132, 5, 108, 0, 0, 3132, 3133, 5, 100, 0, 0, 3133, 3134, 5, 105, 0, 0, 3134, 3135, 5, 110, 0, 0, 3135, 3136, 5, 100, 0, 0, 3136, 3137, 5, 46, 0, 0, 3137, 4053, 5, 105, 0, 0, 3138, 3139, 5, 108, 0, 0, 3139, 3140, 5, 100, 0, 0, 3140, 3141, 5, 105, 0, 0, 3141, 3142, 5, 110, 0, 0, 3142, 3143, 5, 100, 0, 0, 3143, 3144, 5, 46, 0, 0, 3144, 3145, 5, 114, 0, 0, 3145, 4053, 5, 52, 0, 0, 3146, 3147, 5, 108, 0, 0, 3147, 3148, 5, 100, 0, 0, 3148, 3149, 5, 105, 0, 0, 3149, 3150, 5, 110, 0, 0, 3150, 3151, 5, 100, 0, 0, 3151, 3152, 5, 46, 0, 0, 3152, 3153, 5, 114, 0, 0, 3153, 4053, 5, 56, 0, 0, 3154, 3155, 5, 108, 0, 0, 3155, 3156, 5, 100, 0, 0, 3156, 3157, 5, 105, 0, 0, 3157, 3158, 5, 110, 0, 0, 3158, 3159, 5, 100, 0, 0, 3159, 3160, 5, 46, 0, 0, 3160, 3161, 5, 114, 0, 0, 3161, 3162, 5, 101, 0, 0, 3162, 4053, 5, 102, 0, 0, 3163, 3164, 5, 115, 0, 0, 3164, 3165, 5, 116, 0, 0, 3165, 3166, 5, 105, 0, 0, 3166, 3167, 5, 110, 0, 0, 3167, 3168, 5, 100, 0, 0, 3168, 3169, 5, 46, 0, 0, 3169, 3170, 5, 114, 0, 0, 3170, 3171, 5, 101, 0, 0, 3171, 4053, 5, 102, 0, 0, 3172, 3173, 5, 115, 0, 0, 3173, 3174, 5, 116, 0, 0, 3174, 3175, 5, 105, 0, 0, 3175, 3176, 5, 110, 0, 0, 3176, 3177, 5, 100, 0, 0, 3177, 3178, 5, 46, 0, 0, 3178, 3179, 5, 105, 0, 0, 3179, 4053, 5, 49, 0, 0, 3180, 3181, 5, 115, 0, 0, 3181, 3182, 5, 116, 0, 0, 3182, 3183, 5, 105, 0, 0, 3183, 3184, 5, 110, 0, 0, 3184, 3185, 5, 100, 0, 0, 3185, 3186, 5, 46, 0, 0, 3186, 3187, 5, 105, 0, 0, 3187, 4053, 5, 50, 0, 0, 3188, 3189, 5, 115, 0, 0, 3189, 3190, 5, 116, 0, 0, 3190, 3191, 5, 105, 0, 0, 3191, 3192, 5, 110, 0, 0, 3192, 3193, 5, 100, 0, 0, 3193, 3194, 5, 46, 0, 0, 3194, 3195, 5, 105, 0, 0, 3195, 4053, 5, 52, 0, 0, 3196, 3197, 5, 115, 0, 0, 3197, 3198, 5, 116, 0, 0, 3198, 3199, 5, 105, 0, 0, 3199, 3200, 5, 110, 0, 0, 3200, 3201, 5, 100, 0, 0, 3201, 3202, 5, 46, 0, 0, 3202, 3203, 5, 105, 0, 0, 3203, 4053, 5, 56, 0, 0, 3204, 3205, 5, 115, 0, 0, 3205, 3206, 5, 116, 0, 0, 3206, 3207, 5, 105, 0, 0, 3207, 3208, 5, 110, 0, 0, 3208, 3209, 5, 100, 0, 0, 3209, 3210, 5, 46, 0, 0, 3210, 3211, 5, 114, 0, 0, 3211, 4053, 5, 52, 0, 0, 3212, 3213, 5, 115, 0, 0, 3213, 3214, 5, 116, 0, 0, 3214, 3215, 5, 105, 0, 0, 3215, 3216, 5, 110, 0, 0, 3216, 3217, 5, 100, 0, 0, 3217, 3218, 5, 46, 0, 0, 3218, 3219, 5, 114, 0, 0, 3219, 4053, 5, 56, 0, 0, 3220, 3221, 5, 97, 0, 0, 3221, 3222, 5, 100, 0, 0, 3222, 4053, 5, 100, 0, 0, 3223, 3224, 5, 115, 0, 0, 3224, 3225, 5, 117, 0, 0, 3225, 4053, 5, 98, 0, 0, 3226, 3227, 5, 109, 0, 0, 3227, 3228, 5, 117, 0, 0, 3228, 4053, 5, 108, 0, 0, 3229, 3230, 5, 100, 0, 0, 3230, 3231, 5, 105, 0, 0, 3231, 4053, 5, 118, 0, 0, 3232, 3233, 5, 100, 0, 0, 3233, 3234, 5, 105, 0, 0, 3234, 3235, 5, 118, 0, 0, 3235, 3236, 5, 46, 0, 0, 3236, 3237, 5, 117, 0, 0, 3237, 4053, 5, 110, 0, 0, 3238, 3239, 5, 114, 0, 0, 3239, 3240, 5, 101, 0, 0, 3240, 4053, 5, 109, 0, 0, 3241, 3242, 5, 114, 0, 0, 3242, 3243, 5, 101, 0, 0, 3243, 3244, 5, 109, 0, 0, 3244, 3245, 5, 46, 0, 0, 3245, 3246, 5, 117, 0, 0, 3246, 4053, 5, 110, 0, 0, 3247, 3248, 5, 97, 0, 0, 3248, 3249, 5, 110, 0, 0, 3249, 4053, 5, 100, 0, 0, 3250, 3251, 5, 111, 0, 0, 3251, 4053, 5, 114, 0, 0, 3252, 3253, 5, 120, 0, 0, 3253, 3254, 5, 111, 0, 0, 3254, 4053, 5, 114, 0, 0, 3255, 3256, 5, 115, 0, 0, 3256, 3257, 5, 104, 0, 0, 3257, 4053, 5, 108, 0, 0, 3258, 3259, 5, 115, 0, 0, 3259, 3260, 5, 104, 0, 0, 3260, 4053, 5, 114, 0, 0, 3261, 3262, 5, 115, 0, 0, 3262, 3263, 5, 104, 0, 0, 3263, 3264, 5, 114, 0, 0, 3264, 3265, 5, 46, 0, 0, 3265, 3266, 5, 117, 0, 0, 3266, 4053, 5, 110, 0, 0, 3267, 3268, 5, 110, 0, 0, 3268, 3269, 5, 101, 0, 0, 3269, 4053, 5, 103, 0, 0, 3270, 3271, 5, 110, 0, 0, 3271, 3272, 5, 111, 0, 0, 3272, 4053, 5, 116, 0, 0, 3273, 3274, 5, 99, 0, 0, 3274, 3275, 5, 111, 0, 0, 3275, 3276, 5, 110, 0, 0, 3276, 3277, 5, 118, 0, 0, 3277, 3278, 5, 46, 0, 0, 3278, 3279, 5, 105, 0, 0, 3279, 4053, 5, 49, 0, 0, 3280, 3281, 5, 99, 0, 0, 3281, 3282, 5, 111, 0, 0, 3282, 3283, 5, 110, 0, 0, 3283, 3284, 5, 118, 0, 0, 3284, 3285, 5, 46, 0, 0, 3285, 3286, 5, 105, 0, 0, 3286, 4053, 5, 50, 0, 0, 3287, 3288, 5, 99, 0, 0, 3288, 3289, 5, 111, 0, 0, 3289, 3290, 5, 110, 0, 0, 3290, 3291, 5, 118, 0, 0, 3291, 3292, 5, 46, 0, 0, 3292, 3293, 5, 105, 0, 0, 3293, 4053, 5, 52, 0, 0, 3294, 3295, 5, 99, 0, 0, 3295, 3296, 5, 111, 0, 0, 3296, 3297, 5, 110, 0, 0, 3297, 3298, 5, 118, 0, 0, 3298, 3299, 5, 46, 0, 0, 3299, 3300, 5, 105, 0, 0, 3300, 4053, 5, 56, 0, 0, 3301, 3302, 5, 99, 0, 0, 3302, 3303, 5, 111, 0, 0, 3303, 3304, 5, 110, 0, 0, 3304, 3305, 5, 118, 0, 0, 3305, 3306, 5, 46, 0, 0, 3306, 3307, 5, 114, 0, 0, 3307, 4053, 5, 52, 0, 0, 3308, 3309, 5, 99, 0, 0, 3309, 3310, 5, 111, 0, 0, 3310, 3311, 5, 110, 0, 0, 3311, 3312, 5, 118, 0, 0, 3312, 3313, 5, 46, 0, 0, 3313, 3314, 5, 114, 0, 0, 3314, 4053, 5, 56, 0, 0, 3315, 3316, 5, 99, 0, 0, 3316, 3317, 5, 111, 0, 0, 3317, 3318, 5, 110, 0, 0, 3318, 3319, 5, 118, 0, 0, 3319, 3320, 5, 46, 0, 0, 3320, 3321, 5, 117, 0, 0, 3321, 4053, 5, 52, 0, 0, 3322, 3323, 5, 99, 0, 0, 3323, 3324, 5, 111, 0, 0, 3324, 3325, 5, 110, 0, 0, 3325, 3326, 5, 118, 0, 0, 3326, 3327, 5, 46, 0, 0, 3327, 3328, 5, 117, 0, 0, 3328, 4053, 5, 56, 0, 0, 3329, 3330, 5, 99, 0, 0, 3330, 3331, 5, 111, 0, 0, 3331, 3332, 5, 110, 0, 0, 3332, 3333, 5, 118, 0, 0, 3333, 3334, 5, 46, 0, 0, 3334, 3335, 5, 114, 0, 0, 3335, 3336, 5, 46, 0, 0, 3336, 3337, 5, 117, 0, 0, 3337, 4053, 5, 110, 0, 0, 3338, 3339, 5, 116, 0, 0, 3339, 3340, 5, 104, 0, 0, 3340, 3341, 5, 114, 0, 0, 3341, 3342, 5, 111, 0, 0, 3342, 4053, 5, 119, 0, 0, 3343, 3344, 5, 99, 0, 0, 3344, 3345, 5, 111, 0, 0, 3345, 3346, 5, 110, 0, 0, 3346, 3347, 5, 118, 0, 0, 3347, 3348, 5, 46, 0, 0, 3348, 3349, 5, 111, 0, 0, 3349, 3350, 5, 118, 0, 0, 3350, 3351, 5, 102, 0, 0, 3351, 3352, 5, 46, 0, 0, 3352, 3353, 5, 105, 0, 0, 3353, 3354, 5, 49, 0, 0, 3354, 3355, 5, 46, 0, 0, 3355, 3356, 5, 117, 0, 0, 3356, 4053, 5, 110, 0, 0, 3357, 3358, 5, 99, 0, 0, 3358, 3359, 5, 111, 0, 0, 3359, 3360, 5, 110, 0, 0, 3360, 3361, 5, 118, 0, 0, 3361, 3362, 5, 46, 0, 0, 3362, 3363, 5, 111, 0, 0, 3363, 3364, 5, 118, 0, 0, 3364, 3365, 5, 102, 0, 0, 3365, 3366, 5, 46, 0, 0, 3366, 3367, 5, 105, 0, 0, 3367, 3368, 5, 50, 0, 0, 3368, 3369, 5, 46, 0, 0, 3369, 3370, 5, 117, 0, 0, 3370, 4053, 5, 110, 0, 0, 3371, 3372, 5, 99, 0, 0, 3372, 3373, 5, 111, 0, 0, 3373, 3374, 5, 110, 0, 0, 3374, 3375, 5, 118, 0, 0, 3375, 3376, 5, 46, 0, 0, 3376, 3377, 5, 111, 0, 0, 3377, 3378, 5, 118, 0, 0, 3378, 3379, 5, 102, 0, 0, 3379, 3380, 5, 46, 0, 0, 3380, 3381, 5, 105, 0, 0, 3381, 3382, 5, 52, 0, 0, 3382, 3383, 5, 46, 0, 0, 3383, 3384, 5, 117, 0, 0, 3384, 4053, 5, 110, 0, 0, 3385, 3386, 5, 99, 0, 0, 3386, 3387, 5, 111, 0, 0, 3387, 3388, 5, 110, 0, 0, 3388, 3389, 5, 118, 0, 0, 3389, 3390, 5, 46, 0, 0, 3390, 3391, 5, 111, 0, 0, 3391, 3392, 5, 118, 0, 0, 3392, 3393, 5, 102, 0, 0, 3393, 3394, 5, 46, 0, 0, 3394, 3395, 5, 105, 0, 0, 3395, 3396, 5, 56, 0, 0, 3396, 3397, 5, 46, 0, 0, 3397, 3398, 5, 117, 0, 0, 3398, 4053, 5, 110, 0, 0, 3399, 3400, 5, 99, 0, 0, 3400, 3401, 5, 111, 0, 0, 3401, 3402, 5, 110, 0, 0, 3402, 3403, 5, 118, 0, 0, 3403, 3404, 5, 46, 0, 0, 3404, 3405, 5, 111, 0, 0, 3405, 3406, 5, 118, 0, 0, 3406, 3407, 5, 102, 0, 0, 3407, 3408, 5, 46, 0, 0, 3408, 3409, 5, 117, 0, 0, 3409, 3410, 5, 49, 0, 0, 3410, 3411, 5, 46, 0, 0, 3411, 3412, 5, 117, 0, 0, 3412, 4053, 5, 110, 0, 0, 3413, 3414, 5, 99, 0, 0, 3414, 3415, 5, 111, 0, 0, 3415, 3416, 5, 110, 0, 0, 3416, 3417, 5, 118, 0, 0, 3417, 3418, 5, 46, 0, 0, 3418, 3419, 5, 111, 0, 0, 3419, 3420, 5, 118, 0, 0, 3420, 3421, 5, 102, 0, 0, 3421, 3422, 5, 46, 0, 0, 3422, 3423, 5, 117, 0, 0, 3423, 3424, 5, 50, 0, 0, 3424, 3425, 5, 46, 0, 0, 3425, 3426, 5, 117, 0, 0, 3426, 4053, 5, 110, 0, 0, 3427, 3428, 5, 99, 0, 0, 3428, 3429, 5, 111, 0, 0, 3429, 3430, 5, 110, 0, 0, 3430, 3431, 5, 118, 0, 0, 3431, 3432, 5, 46, 0, 0, 3432, 3433, 5, 111, 0, 0, 3433, 3434, 5, 118, 0, 0, 3434, 3435, 5, 102, 0, 0, 3435, 3436, 5, 46, 0, 0, 3436, 3437, 5, 117, 0, 0, 3437, 3438, 5, 52, 0, 0, 3438, 3439, 5, 46, 0, 0, 3439, 3440, 5, 117, 0, 0, 3440, 4053, 5, 110, 0, 0, 3441, 3442, 5, 99, 0, 0, 3442, 3443, 5, 111, 0, 0, 3443, 3444, 5, 110, 0, 0, 3444, 3445, 5, 118, 0, 0, 3445, 3446, 5, 46, 0, 0, 3446, 3447, 5, 111, 0, 0, 3447, 3448, 5, 118, 0, 0, 3448, 3449, 5, 102, 0, 0, 3449, 3450, 5, 46, 0, 0, 3450, 3451, 5, 117, 0, 0, 3451, 3452, 5, 56, 0, 0, 3452, 3453, 5, 46, 0, 0, 3453, 3454, 5, 117, 0, 0, 3454, 4053, 5, 110, 0, 0, 3455, 3456, 5, 99, 0, 0, 3456, 3457, 5, 111, 0, 0, 3457, 3458, 5, 110, 0, 0, 3458, 3459, 5, 118, 0, 0, 3459, 3460, 5, 46, 0, 0, 3460, 3461, 5, 111, 0, 0, 3461, 3462, 5, 118, 0, 0, 3462, 3463, 5, 102, 0, 0, 3463, 3464, 5, 46, 0, 0, 3464, 3465, 5, 105, 0, 0, 3465, 3466, 5, 46, 0, 0, 3466, 3467, 5, 117, 0, 0, 3467, 4053, 5, 110, 0, 0, 3468, 3469, 5, 99, 0, 0, 3469, 3470, 5, 111, 0, 0, 3470, 3471, 5, 110, 0, 0, 3471, 3472, 5, 118, 0, 0, 3472, 3473, 5, 46, 0, 0, 3473, 3474, 5, 111, 0, 0, 3474, 3475, 5, 118, 0, 0, 3475, 3476, 5, 102, 0, 0, 3476, 3477, 5, 46, 0, 0, 3477, 3478, 5, 117, 0, 0, 3478, 3479, 5, 46, 0, 0, 3479, 3480, 5, 117, 0, 0, 3480, 4053, 5, 110, 0, 0, 3481, 3482, 5, 108, 0, 0, 3482, 3483, 5, 100, 0, 0, 3483, 3484, 5, 108, 0, 0, 3484, 3485, 5, 101, 0, 0, 3485, 4053, 5, 110, 0, 0, 3486, 3487, 5, 108, 0, 0, 3487, 3488, 5, 100, 0, 0, 3488, 3489, 5, 101, 0, 0, 3489, 3490, 5, 108, 0, 0, 3490, 3491, 5, 101, 0, 0, 3491, 3492, 5, 109, 0, 0, 3492, 3493, 5, 46, 0, 0, 3493, 3494, 5, 105, 0, 0, 3494, 4053, 5, 49, 0, 0, 3495, 3496, 5, 108, 0, 0, 3496, 3497, 5, 100, 0, 0, 3497, 3498, 5, 101, 0, 0, 3498, 3499, 5, 108, 0, 0, 3499, 3500, 5, 101, 0, 0, 3500, 3501, 5, 109, 0, 0, 3501, 3502, 5, 46, 0, 0, 3502, 3503, 5, 117, 0, 0, 3503, 4053, 5, 49, 0, 0, 3504, 3505, 5, 108, 0, 0, 3505, 3506, 5, 100, 0, 0, 3506, 3507, 5, 101, 0, 0, 3507, 3508, 5, 108, 0, 0, 3508, 3509, 5, 101, 0, 0, 3509, 3510, 5, 109, 0, 0, 3510, 3511, 5, 46, 0, 0, 3511, 3512, 5, 105, 0, 0, 3512, 4053, 5, 50, 0, 0, 3513, 3514, 5, 108, 0, 0, 3514, 3515, 5, 100, 0, 0, 3515, 3516, 5, 101, 0, 0, 3516, 3517, 5, 108, 0, 0, 3517, 3518, 5, 101, 0, 0, 3518, 3519, 5, 109, 0, 0, 3519, 3520, 5, 46, 0, 0, 3520, 3521, 5, 117, 0, 0, 3521, 4053, 5, 50, 0, 0, 3522, 3523, 5, 108, 0, 0, 3523, 3524, 5, 100, 0, 0, 3524, 3525, 5, 101, 0, 0, 3525, 3526, 5, 108, 0, 0, 3526, 3527, 5, 101, 0, 0, 3527, 3528, 5, 109, 0, 0, 3528, 3529, 5, 46, 0, 0, 3529, 3530, 5, 105, 0, 0, 3530, 4053, 5, 52, 0, 0, 3531, 3532, 5, 108, 0, 0, 3532, 3533, 5, 100, 0, 0, 3533, 3534, 5, 101, 0, 0, 3534, 3535, 5, 108, 0, 0, 3535, 3536, 5, 101, 0, 0, 3536, 3537, 5, 109, 0, 0, 3537, 3538, 5, 46, 0, 0, 3538, 3539, 5, 117, 0, 0, 3539, 4053, 5, 52, 0, 0, 3540, 3541, 5, 108, 0, 0, 3541, 3542, 5, 100, 0, 0, 3542, 3543, 5, 101, 0, 0, 3543, 3544, 5, 108, 0, 0, 3544, 3545, 5, 101, 0, 0, 3545, 3546, 5, 109, 0, 0, 3546, 3547, 5, 46, 0, 0, 3547, 3548, 5, 105, 0, 0, 3548, 4053, 5, 56, 0, 0, 3549, 3550, 5, 108, 0, 0, 3550, 3551, 5, 100, 0, 0, 3551, 3552, 5, 101, 0, 0, 3552, 3553, 5, 108, 0, 0, 3553, 3554, 5, 101, 0, 0, 3554, 3555, 5, 109, 0, 0, 3555, 3556, 5, 46, 0, 0, 3556, 3557, 5, 117, 0, 0, 3557, 4053, 5, 56, 0, 0, 3558, 3559, 5, 108, 0, 0, 3559, 3560, 5, 100, 0, 0, 3560, 3561, 5, 101, 0, 0, 3561, 3562, 5, 108, 0, 0, 3562, 3563, 5, 101, 0, 0, 3563, 3564, 5, 109, 0, 0, 3564, 3565, 5, 46, 0, 0, 3565, 4053, 5, 105, 0, 0, 3566, 3567, 5, 108, 0, 0, 3567, 3568, 5, 100, 0, 0, 3568, 3569, 5, 101, 0, 0, 3569, 3570, 5, 108, 0, 0, 3570, 3571, 5, 101, 0, 0, 3571, 3572, 5, 109, 0, 0, 3572, 3573, 5, 46, 0, 0, 3573, 3574, 5, 114, 0, 0, 3574, 4053, 5, 52, 0, 0, 3575, 3576, 5, 108, 0, 0, 3576, 3577, 5, 100, 0, 0, 3577, 3578, 5, 101, 0, 0, 3578, 3579, 5, 108, 0, 0, 3579, 3580, 5, 101, 0, 0, 3580, 3581, 5, 109, 0, 0, 3581, 3582, 5, 46, 0, 0, 3582, 3583, 5, 114, 0, 0, 3583, 4053, 5, 56, 0, 0, 3584, 3585, 5, 108, 0, 0, 3585, 3586, 5, 100, 0, 0, 3586, 3587, 5, 101, 0, 0, 3587, 3588, 5, 108, 0, 0, 3588, 3589, 5, 101, 0, 0, 3589, 3590, 5, 109, 0, 0, 3590, 3591, 5, 46, 0, 0, 3591, 3592, 5, 114, 0, 0, 3592, 3593, 5, 101, 0, 0, 3593, 4053, 5, 102, 0, 0, 3594, 3595, 5, 115, 0, 0, 3595, 3596, 5, 116, 0, 0, 3596, 3597, 5, 101, 0, 0, 3597, 3598, 5, 108, 0, 0, 3598, 3599, 5, 101, 0, 0, 3599, 3600, 5, 109, 0, 0, 3600, 3601, 5, 46, 0, 0, 3601, 4053, 5, 105, 0, 0, 3602, 3603, 5, 115, 0, 0, 3603, 3604, 5, 116, 0, 0, 3604, 3605, 5, 101, 0, 0, 3605, 3606, 5, 108, 0, 0, 3606, 3607, 5, 101, 0, 0, 3607, 3608, 5, 109, 0, 0, 3608, 3609, 5, 46, 0, 0, 3609, 3610, 5, 105, 0, 0, 3610, 4053, 5, 49, 0, 0, 3611, 3612, 5, 115, 0, 0, 3612, 3613, 5, 116, 0, 0, 3613, 3614, 5, 101, 0, 0, 3614, 3615, 5, 108, 0, 0, 3615, 3616, 5, 101, 0, 0, 3616, 3617, 5, 109, 0, 0, 3617, 3618, 5, 46, 0, 0, 3618, 3619, 5, 105, 0, 0, 3619, 4053, 5, 50, 0, 0, 3620, 3621, 5, 115, 0, 0, 3621, 3622, 5, 116, 0, 0, 3622, 3623, 5, 101, 0, 0, 3623, 3624, 5, 108, 0, 0, 3624, 3625, 5, 101, 0, 0, 3625, 3626, 5, 109, 0, 0, 3626, 3627, 5, 46, 0, 0, 3627, 3628, 5, 105, 0, 0, 3628, 4053, 5, 52, 0, 0, 3629, 3630, 5, 115, 0, 0, 3630, 3631, 5, 116, 0, 0, 3631, 3632, 5, 101, 0, 0, 3632, 3633, 5, 108, 0, 0, 3633, 3634, 5, 101, 0, 0, 3634, 3635, 5, 109, 0, 0, 3635, 3636, 5, 46, 0, 0, 3636, 3637, 5, 105, 0, 0, 3637, 4053, 5, 56, 0, 0, 3638, 3639, 5, 115, 0, 0, 3639, 3640, 5, 116, 0, 0, 3640, 3641, 5, 101, 0, 0, 3641, 3642, 5, 108, 0, 0, 3642, 3643, 5, 101, 0, 0, 3643, 3644, 5, 109, 0, 0, 3644, 3645, 5, 46, 0, 0, 3645, 3646, 5, 114, 0, 0, 3646, 4053, 5, 52, 0, 0, 3647, 3648, 5, 115, 0, 0, 3648, 3649, 5, 116, 0, 0, 3649, 3650, 5, 101, 0, 0, 3650, 3651, 5, 108, 0, 0, 3651, 3652, 5, 101, 0, 0, 3652, 3653, 5, 109, 0, 0, 3653, 3654, 5, 46, 0, 0, 3654, 3655, 5, 114, 0, 0, 3655, 4053, 5, 56, 0, 0, 3656, 3657, 5, 115, 0, 0, 3657, 3658, 5, 116, 0, 0, 3658, 3659, 5, 101, 0, 0, 3659, 3660, 5, 108, 0, 0, 3660, 3661, 5, 101, 0, 0, 3661, 3662, 5, 109, 0, 0, 3662, 3663, 5, 46, 0, 0, 3663, 3664, 5, 114, 0, 0, 3664, 3665, 5, 101, 0, 0, 3665, 4053, 5, 102, 0, 0, 3666, 3667, 5, 99, 0, 0, 3667, 3668, 5, 111, 0, 0, 3668, 3669, 5, 110, 0, 0, 3669, 3670, 5, 118, 0, 0, 3670, 3671, 5, 46, 0, 0, 3671, 3672, 5, 111, 0, 0, 3672, 3673, 5, 118, 0, 0, 3673, 3674, 5, 102, 0, 0, 3674, 3675, 5, 46, 0, 0, 3675, 3676, 5, 105, 0, 0, 3676, 4053, 5, 49, 0, 0, 3677, 3678, 5, 99, 0, 0, 3678, 3679, 5, 111, 0, 0, 3679, 3680, 5, 110, 0, 0, 3680, 3681, 5, 118, 0, 0, 3681, 3682, 5, 46, 0, 0, 3682, 3683, 5, 111, 0, 0, 3683, 3684, 5, 118, 0, 0, 3684, 3685, 5, 102, 0, 0, 3685, 3686, 5, 46, 0, 0, 3686, 3687, 5, 117, 0, 0, 3687, 4053, 5, 49, 0, 0, 3688, 3689, 5, 99, 0, 0, 3689, 3690, 5, 111, 0, 0, 3690, 3691, 5, 110, 0, 0, 3691, 3692, 5, 118, 0, 0, 3692, 3693, 5, 46, 0, 0, 3693, 3694, 5, 111, 0, 0, 3694, 3695, 5, 118, 0, 0, 3695, 3696, 5, 102, 0, 0, 3696, 3697, 5, 46, 0, 0, 3697, 3698, 5, 105, 0, 0, 3698, 4053, 5, 50, 0, 0, 3699, 3700, 5, 99, 0, 0, 3700, 3701, 5, 111, 0, 0, 3701, 3702, 5, 110, 0, 0, 3702, 3703, 5, 118, 0, 0, 3703, 3704, 5, 46, 0, 0, 3704, 3705, 5, 111, 0, 0, 3705, 3706, 5, 118, 0, 0, 3706, 3707, 5, 102, 0, 0, 3707, 3708, 5, 46, 0, 0, 3708, 3709, 5, 117, 0, 0, 3709, 4053, 5, 50, 0, 0, 3710, 3711, 5, 99, 0, 0, 3711, 3712, 5, 111, 0, 0, 3712, 3713, 5, 110, 0, 0, 3713, 3714, 5, 118, 0, 0, 3714, 3715, 5, 46, 0, 0, 3715, 3716, 5, 111, 0, 0, 3716, 3717, 5, 118, 0, 0, 3717, 3718, 5, 102, 0, 0, 3718, 3719, 5, 46, 0, 0, 3719, 3720, 5, 105, 0, 0, 3720, 4053, 5, 52, 0, 0, 3721, 3722, 5, 99, 0, 0, 3722, 3723, 5, 111, 0, 0, 3723, 3724, 5, 110, 0, 0, 3724, 3725, 5, 118, 0, 0, 3725, 3726, 5, 46, 0, 0, 3726, 3727, 5, 111, 0, 0, 3727, 3728, 5, 118, 0, 0, 3728, 3729, 5, 102, 0, 0, 3729, 3730, 5, 46, 0, 0, 3730, 3731, 5, 117, 0, 0, 3731, 4053, 5, 52, 0, 0, 3732, 3733, 5, 99, 0, 0, 3733, 3734, 5, 111, 0, 0, 3734, 3735, 5, 110, 0, 0, 3735, 3736, 5, 118, 0, 0, 3736, 3737, 5, 46, 0, 0, 3737, 3738, 5, 111, 0, 0, 3738, 3739, 5, 118, 0, 0, 3739, 3740, 5, 102, 0, 0, 3740, 3741, 5, 46, 0, 0, 3741, 3742, 5, 105, 0, 0, 3742, 4053, 5, 56, 0, 0, 3743, 3744, 5, 99, 0, 0, 3744, 3745, 5, 111, 0, 0, 3745, 3746, 5, 110, 0, 0, 3746, 3747, 5, 118, 0, 0, 3747, 3748, 5, 46, 0, 0, 3748, 3749, 5, 111, 0, 0, 3749, 3750, 5, 118, 0, 0, 3750, 3751, 5, 102, 0, 0, 3751, 3752, 5, 46, 0, 0, 3752, 3753, 5, 117, 0, 0, 3753, 4053, 5, 56, 0, 0, 3754, 3755, 5, 99, 0, 0, 3755, 3756, 5, 107, 0, 0, 3756, 3757, 5, 102, 0, 0, 3757, 3758, 5, 105, 0, 0, 3758, 3759, 5, 110, 0, 0, 3759, 3760, 5, 105, 0, 0, 3760, 3761, 5, 116, 0, 0, 3761, 4053, 5, 101, 0, 0, 3762, 3763, 5, 99, 0, 0, 3763, 3764, 5, 111, 0, 0, 3764, 3765, 5, 110, 0, 0, 3765, 3766, 5, 118, 0, 0, 3766, 3767, 5, 46, 0, 0, 3767, 3768, 5, 117, 0, 0, 3768, 4053, 5, 50, 0, 0, 3769, 3770, 5, 99, 0, 0, 3770, 3771, 5, 111, 0, 0, 3771, 3772, 5, 110, 0, 0, 3772, 3773, 5, 118, 0, 0, 3773, 3774, 5, 46, 0, 0, 3774, 3775, 5, 117, 0, 0, 3775, 4053, 5, 49, 0, 0, 3776, 3777, 5, 99, 0, 0, 3777, 3778, 5, 111, 0, 0, 3778, 3779, 5, 110, 0, 0, 3779, 3780, 5, 118, 0, 0, 3780, 3781, 5, 46, 0, 0, 3781, 4053, 5, 105, 0, 0, 3782, 3783, 5, 99, 0, 0, 3783, 3784, 5, 111, 0, 0, 3784, 3785, 5, 110, 0, 0, 3785, 3786, 5, 118, 0, 0, 3786, 3787, 5, 46, 0, 0, 3787, 3788, 5, 111, 0, 0, 3788, 3789, 5, 118, 0, 0, 3789, 3790, 5, 102, 0, 0, 3790, 3791, 5, 46, 0, 0, 3791, 4053, 5, 105, 0, 0, 3792, 3793, 5, 99, 0, 0, 3793, 3794, 5, 111, 0, 0, 3794, 3795, 5, 110, 0, 0, 3795, 3796, 5, 118, 0, 0, 3796, 3797, 5, 46, 0, 0, 3797, 3798, 5, 111, 0, 0, 3798, 3799, 5, 118, 0, 0, 3799, 3800, 5, 102, 0, 0, 3800, 3801, 5, 46, 0, 0, 3801, 4053, 5, 117, 0, 0, 3802, 3803, 5, 97, 0, 0, 3803, 3804, 5, 100, 0, 0, 3804, 3805, 5, 100, 0, 0, 3805, 3806, 5, 46, 0, 0, 3806, 3807, 5, 111, 0, 0, 3807, 3808, 5, 118, 0, 0, 3808, 4053, 5, 102, 0, 0, 3809, 3810, 5, 97, 0, 0, 3810, 3811, 5, 100, 0, 0, 3811, 3812, 5, 100, 0, 0, 3812, 3813, 5, 46, 0, 0, 3813, 3814, 5, 111, 0, 0, 3814, 3815, 5, 118, 0, 0, 3815, 3816, 5, 102, 0, 0, 3816, 3817, 5, 46, 0, 0, 3817, 3818, 5, 117, 0, 0, 3818, 4053, 5, 110, 0, 0, 3819, 3820, 5, 109, 0, 0, 3820, 3821, 5, 117, 0, 0, 3821, 3822, 5, 108, 0, 0, 3822, 3823, 5, 46, 0, 0, 3823, 3824, 5, 111, 0, 0, 3824, 3825, 5, 118, 0, 0, 3825, 4053, 5, 102, 0, 0, 3826, 3827, 5, 109, 0, 0, 3827, 3828, 5, 117, 0, 0, 3828, 3829, 5, 108, 0, 0, 3829, 3830, 5, 46, 0, 0, 3830, 3831, 5, 111, 0, 0, 3831, 3832, 5, 118, 0, 0, 3832, 3833, 5, 102, 0, 0, 3833, 3834, 5, 46, 0, 0, 3834, 3835, 5, 117, 0, 0, 3835, 4053, 5, 110, 0, 0, 3836, 3837, 5, 115, 0, 0, 3837, 3838, 5, 117, 0, 0, 3838, 3839, 5, 98, 0, 0, 3839, 3840, 5, 46, 0, 0, 3840, 3841, 5, 111, 0, 0, 3841, 3842, 5, 118, 0, 0, 3842, 4053, 5, 102, 0, 0, 3843, 3844, 5, 115, 0, 0, 3844, 3845, 5, 117, 0, 0, 3845, 3846, 5, 98, 0, 0, 3846, 3847, 5, 46, 0, 0, 3847, 3848, 5, 111, 0, 0, 3848, 3849, 5, 118, 0, 0, 3849, 3850, 5, 102, 0, 0, 3850, 3851, 5, 46, 0, 0, 3851, 3852, 5, 117, 0, 0, 3852, 4053, 5, 110, 0, 0, 3853, 3854, 5, 101, 0, 0, 3854, 3855, 5, 110, 0, 0, 3855, 3856, 5, 100, 0, 0, 3856, 3857, 5, 102, 0, 0, 3857, 3858, 5, 105, 0, 0, 3858, 3859, 5, 110, 0, 0, 3859, 3860, 5, 97, 0, 0, 3860, 3861, 5, 108, 0, 0, 3861, 3862, 5, 108, 0, 0, 3862, 4053, 5, 121, 0, 0, 3863, 3864, 5, 101, 0, 0, 3864, 3865, 5, 110, 0, 0, 3865, 3866, 5, 100, 0, 0, 3866, 3867, 5, 102, 0, 0, 3867, 3868, 5, 97, 0, 0, 3868, 3869, 5, 117, 0, 0, 3869, 3870, 5, 108, 0, 0, 3870, 4053, 5, 116, 0, 0, 3871, 3872, 5, 115, 0, 0, 3872, 3873, 5, 116, 0, 0, 3873, 3874, 5, 105, 0, 0, 3874, 3875, 5, 110, 0, 0, 3875, 3876, 5, 100, 0, 0, 3876, 3877, 5, 46, 0, 0, 3877, 4053, 5, 105, 0, 0, 3878, 3879, 5, 99, 0, 0, 3879, 3880, 5, 111, 0, 0, 3880, 3881, 5, 110, 0, 0, 3881, 3882, 5, 118, 0, 0, 3882, 3883, 5, 46, 0, 0, 3883, 4053, 5, 117, 0, 0, 3884, 3885, 5, 112, 0, 0, 3885, 3886, 5, 114, 0, 0, 3886, 3887, 5, 101, 0, 0, 3887, 3888, 5, 102, 0, 0, 3888, 3889, 5, 105, 0, 0, 3889, 3890, 5, 120, 0, 0, 3890, 4053, 5, 55, 0, 0, 3891, 3892, 5, 112, 0, 0, 3892, 3893, 5, 114, 0, 0, 3893, 3894, 5, 101, 0, 0, 3894, 3895, 5, 102, 0, 0, 3895, 3896, 5, 105, 0, 0, 3896, 3897, 5, 120, 0, 0, 3897, 4053, 5, 54, 0, 0, 3898, 3899, 5, 112, 0, 0, 3899, 3900, 5, 114, 0, 0, 3900, 3901, 5, 101, 0, 0, 3901, 3902, 5, 102, 0, 0, 3902, 3903, 5, 105, 0, 0, 3903, 3904, 5, 120, 0, 0, 3904, 4053, 5, 53, 0, 0, 3905, 3906, 5, 112, 0, 0, 3906, 3907, 5, 114, 0, 0, 3907, 3908, 5, 101, 0, 0, 3908, 3909, 5, 102, 0, 0, 3909, 3910, 5, 105, 0, 0, 3910, 3911, 5, 120, 0, 0, 3911, 4053, 5, 52, 0, 0, 3912, 3913, 5, 112, 0, 0, 3913, 3914, 5, 114, 0, 0, 3914, 3915, 5, 101, 0, 0, 3915, 3916, 5, 102, 0, 0, 3916, 3917, 5, 105, 0, 0, 3917, 3918, 5, 120, 0, 0, 3918, 4053, 5, 51, 0, 0, 3919, 3920, 5, 112, 0, 0, 3920, 3921, 5, 114, 0, 0, 3921, 3922, 5, 101, 0, 0, 3922, 3923, 5, 102, 0, 0, 3923, 3924, 5, 105, 0, 0, 3924, 3925, 5, 120, 0, 0, 3925, 4053, 5, 50, 0, 0, 3926, 3927, 5, 112, 0, 0, 3927, 3928, 5, 114, 0, 0, 3928, 3929, 5, 101, 0, 0, 3929, 3930, 5, 102, 0, 0, 3930, 3931, 5, 105, 0, 0, 3931, 3932, 5, 120, 0, 0, 3932, 4053, 5, 49, 0, 0, 3933, 3934, 5, 112, 0, 0, 3934, 3935, 5, 114, 0, 0, 3935, 3936, 5, 101, 0, 0, 3936, 3937, 5, 102, 0, 0, 3937, 3938, 5, 105, 0, 0, 3938, 3939, 5, 120, 0, 0, 3939, 3940, 5, 114, 0, 0, 3940, 3941, 5, 101, 0, 0, 3941, 4053, 5, 102, 0, 0, 3942, 3943, 5, 97, 0, 0, 3943, 3944, 5, 114, 0, 0, 3944, 3945, 5, 103, 0, 0, 3945, 3946, 5, 108, 0, 0, 3946, 3947, 5, 105, 0, 0, 3947, 3948, 5, 115, 0, 0, 3948, 4053, 5, 116, 0, 0, 3949, 3950, 5, 99, 0, 0, 3950, 3951, 5, 101, 0, 0, 3951, 4053, 5, 113, 0, 0, 3952, 3953, 5, 99, 0, 0, 3953, 3954, 5, 103, 0, 0, 3954, 4053, 5, 116, 0, 0, 3955, 3956, 5, 99, 0, 0, 3956, 3957, 5, 103, 0, 0, 3957, 3958, 5, 116, 0, 0, 3958, 3959, 5, 46, 0, 0, 3959, 3960, 5, 117, 0, 0, 3960, 4053, 5, 110, 0, 0, 3961, 3962, 5, 99, 0, 0, 3962, 3963, 5, 108, 0, 0, 3963, 4053, 5, 116, 0, 0, 3964, 3965, 5, 99, 0, 0, 3965, 3966, 5, 108, 0, 0, 3966, 3967, 5, 116, 0, 0, 3967, 3968, 5, 46, 0, 0, 3968, 3969, 5, 117, 0, 0, 3969, 4053, 5, 110, 0, 0, 3970, 3971, 5, 108, 0, 0, 3971, 3972, 5, 111, 0, 0, 3972, 3973, 5, 99, 0, 0, 3973, 3974, 5, 97, 0, 0, 3974, 3975, 5, 108, 0, 0, 3975, 3976, 5, 108, 0, 0, 3976, 3977, 5, 111, 0, 0, 3977, 4053, 5, 99, 0, 0, 3978, 3979, 5, 101, 0, 0, 3979, 3980, 5, 110, 0, 0, 3980, 3981, 5, 100, 0, 0, 3981, 3982, 5, 102, 0, 0, 3982, 3983, 5, 105, 0, 0, 3983, 3984, 5, 108, 0, 0, 3984, 3985, 5, 116, 0, 0, 3985, 3986, 5, 101, 0, 0, 3986, 4053, 5, 114, 0, 0, 3987, 3988, 5, 118, 0, 0, 3988, 3989, 5, 111, 0, 0, 3989, 3990, 5, 108, 0, 0, 3990, 3991, 5, 97, 0, 0, 3991, 3992, 5, 116, 0, 0, 3992, 3993, 5, 105, 0, 0, 3993, 3994, 5, 108, 0, 0, 3994, 3995, 5, 101, 0, 0, 3995, 4053, 5, 46, 0, 0, 3996, 3997, 5, 116, 0, 0, 3997, 3998, 5, 97, 0, 0, 3998, 3999, 5, 105, 0, 0, 3999, 4000, 5, 108, 0, 0, 4000, 4053, 5, 46, 0, 0, 4001, 4002, 5, 99, 0, 0, 4002, 4003, 5, 112, 0, 0, 4003, 4004, 5, 98, 0, 0, 4004, 4005, 5, 108, 0, 0, 4005, 4053, 5, 107, 0, 0, 4006, 4007, 5, 105, 0, 0, 4007, 4008, 5, 110, 0, 0, 4008, 4009, 5, 105, 0, 0, 4009, 4010, 5, 116, 0, 0, 4010, 4011, 5, 98, 0, 0, 4011, 4012, 5, 108, 0, 0, 4012, 4053, 5, 107, 0, 0, 4013, 4014, 5, 114, 0, 0, 4014, 4015, 5, 101, 0, 0, 4015, 4016, 5, 116, 0, 0, 4016, 4017, 5, 104, 0, 0, 4017, 4018, 5, 114, 0, 0, 4018, 4019, 5, 111, 0, 0, 4019, 4053, 5, 119, 0, 0, 4020, 4021, 5, 114, 0, 0, 4021, 4022, 5, 101, 0, 0, 4022, 4023, 5, 102, 0, 0, 4023, 4024, 5, 97, 0, 0, 4024, 4025, 5, 110, 0, 0, 4025, 4026, 5, 121, 0, 0, 4026, 4027, 5, 116, 0, 0, 4027, 4028, 5, 121, 0, 0, 4028, 4029, 5, 112, 0, 0, 4029, 4053, 5, 101, 0, 0, 4030, 4031, 5, 114, 0, 0, 4031, 4032, 5, 101, 0, 0, 4032, 4033, 5, 97, 0, 0, 4033, 4034, 5, 100, 0, 0, 4034, 4035, 5, 111, 0, 0, 4035, 4036, 5, 110, 0, 0, 4036, 4037, 5, 108, 0, 0, 4037, 4038, 5, 121, 0, 0, 4038, 4053, 5, 46, 0, 0, 4039, 4040, 5, 105, 0, 0, 4040, 4041, 5, 108, 0, 0, 4041, 4042, 5, 108, 0, 0, 4042, 4043, 5, 101, 0, 0, 4043, 4044, 5, 103, 0, 0, 4044, 4045, 5, 97, 0, 0, 4045, 4053, 5, 108, 0, 0, 4046, 4047, 5, 101, 0, 0, 4047, 4048, 5, 110, 0, 0, 4048, 4049, 5, 100, 0, 0, 4049, 4050, 5, 109, 0, 0, 4050, 4051, 5, 97, 0, 0, 4051, 4053, 5, 99, 0, 0, 4052, 2864, 1, 0, 0, 0, 4052, 2867, 1, 0, 0, 0, 4052, 2873, 1, 0, 0, 0, 4052, 2878, 1, 0, 0, 0, 4052, 2885, 1, 0, 0, 0, 4052, 2892, 1, 0, 0, 0, 4052, 2899, 1, 0, 0, 0, 4052, 2906, 1, 0, 0, 0, 4052, 2913, 1, 0, 0, 0, 4052, 2920, 1, 0, 0, 0, 4052, 2927, 1, 0, 0, 0, 4052, 2934, 1, 0, 0, 0, 4052, 2941, 1, 0, 0, 0, 4052, 2948, 1, 0, 0, 0, 4052, 2955, 1, 0, 0, 0, 4052, 2962, 1, 0, 0, 0, 4052, 2968, 1, 0, 0, 0, 4052, 2977, 1, 0, 0, 0, 4052, 2986, 1, 0, 0, 0, 4052, 2994, 1, 0, 0, 0, 4052, 3002, 1, 0, 0, 0, 4052, 3010, 1, 0, 0, 0, 4052, 3018, 1, 0, 0, 0, 4052, 3026, 1, 0, 0, 0, 4052, 3034, 1, 0, 0, 0, 4052, 3042, 1, 0, 0, 0, 4052, 3050, 1, 0, 0, 0, 4052, 3058, 1, 0, 0, 0, 4052, 3061, 1, 0, 0, 0, 4052, 3064, 1, 0, 0, 0, 4052, 3067, 1, 0, 0, 0, 4052, 3075, 1, 0, 0, 0, 4052, 3083, 1, 0, 0, 0, 4052, 3091, 1, 0, 0, 0, 4052, 3099, 1, 0, 0, 0, 4052, 3107, 1, 0, 0, 0, 4052, 3115, 1, 0, 0, 0, 4052, 3123, 1, 0, 0, 0, 4052, 3131, 1, 0, 0, 0, 4052, 3138, 1, 0, 0, 0, 4052, 3146, 1, 0, 0, 0, 4052, 3154, 1, 0, 0, 0, 4052, 3163, 1, 0, 0, 0, 4052, 3172, 1, 0, 0, 0, 4052, 3180, 1, 0, 0, 0, 4052, 3188, 1, 0, 0, 0, 4052, 3196, 1, 0, 0, 0, 4052, 3204, 1, 0, 0, 0, 4052, 3212, 1, 0, 0, 0, 4052, 3220, 1, 0, 0, 0, 4052, 3223, 1, 0, 0, 0, 4052, 3226, 1, 0, 0, 0, 4052, 3229, 1, 0, 0, 0, 4052, 3232, 1, 0, 0, 0, 4052, 3238, 1, 0, 0, 0, 4052, 3241, 1, 0, 0, 0, 4052, 3247, 1, 0, 0, 0, 4052, 3250, 1, 0, 0, 0, 4052, 3252, 1, 0, 0, 0, 4052, 3255, 1, 0, 0, 0, 4052, 3258, 1, 0, 0, 0, 4052, 3261, 1, 0, 0, 0, 4052, 3267, 1, 0, 0, 0, 4052, 3270, 1, 0, 0, 0, 4052, 3273, 1, 0, 0, 0, 4052, 3280, 1, 0, 0, 0, 4052, 3287, 1, 0, 0, 0, 4052, 3294, 1, 0, 0, 0, 4052, 3301, 1, 0, 0, 0, 4052, 3308, 1, 0, 0, 0, 4052, 3315, 1, 0, 0, 0, 4052, 3322, 1, 0, 0, 0, 4052, 3329, 1, 0, 0, 0, 4052, 3338, 1, 0, 0, 0, 4052, 3343, 1, 0, 0, 0, 4052, 3357, 1, 0, 0, 0, 4052, 3371, 1, 0, 0, 0, 4052, 3385, 1, 0, 0, 0, 4052, 3399, 1, 0, 0, 0, 4052, 3413, 1, 0, 0, 0, 4052, 3427, 1, 0, 0, 0, 4052, 3441, 1, 0, 0, 0, 4052, 3455, 1, 0, 0, 0, 4052, 3468, 1, 0, 0, 0, 4052, 3481, 1, 0, 0, 0, 4052, 3486, 1, 0, 0, 0, 4052, 3495, 1, 0, 0, 0, 4052, 3504, 1, 0, 0, 0, 4052, 3513, 1, 0, 0, 0, 4052, 3522, 1, 0, 0, 0, 4052, 3531, 1, 0, 0, 0, 4052, 3540, 1, 0, 0, 0, 4052, 3549, 1, 0, 0, 0, 4052, 3558, 1, 0, 0, 0, 4052, 3566, 1, 0, 0, 0, 4052, 3575, 1, 0, 0, 0, 4052, 3584, 1, 0, 0, 0, 4052, 3594, 1, 0, 0, 0, 4052, 3602, 1, 0, 0, 0, 4052, 3611, 1, 0, 0, 0, 4052, 3620, 1, 0, 0, 0, 4052, 3629, 1, 0, 0, 0, 4052, 3638, 1, 0, 0, 0, 4052, 3647, 1, 0, 0, 0, 4052, 3656, 1, 0, 0, 0, 4052, 3666, 1, 0, 0, 0, 4052, 3677, 1, 0, 0, 0, 4052, 3688, 1, 0, 0, 0, 4052, 3699, 1, 0, 0, 0, 4052, 3710, 1, 0, 0, 0, 4052, 3721, 1, 0, 0, 0, 4052, 3732, 1, 0, 0, 0, 4052, 3743, 1, 0, 0, 0, 4052, 3754, 1, 0, 0, 0, 4052, 3762, 1, 0, 0, 0, 4052, 3769, 1, 0, 0, 0, 4052, 3776, 1, 0, 0, 0, 4052, 3782, 1, 0, 0, 0, 4052, 3792, 1, 0, 0, 0, 4052, 3802, 1, 0, 0, 0, 4052, 3809, 1, 0, 0, 0, 4052, 3819, 1, 0, 0, 0, 4052, 3826, 1, 0, 0, 0, 4052, 3836, 1, 0, 0, 0, 4052, 3843, 1, 0, 0, 0, 4052, 3853, 1, 0, 0, 0, 4052, 3863, 1, 0, 0, 0, 4052, 3871, 1, 0, 0, 0, 4052, 3878, 1, 0, 0, 0, 4052, 3884, 1, 0, 0, 0, 4052, 3891, 1, 0, 0, 0, 4052, 3898, 1, 0, 0, 0, 4052, 3905, 1, 0, 0, 0, 4052, 3912, 1, 0, 0, 0, 4052, 3919, 1, 0, 0, 0, 4052, 3926, 1, 0, 0, 0, 4052, 3933, 1, 0, 0, 0, 4052, 3942, 1, 0, 0, 0, 4052, 3949, 1, 0, 0, 0, 4052, 3952, 1, 0, 0, 0, 4052, 3955, 1, 0, 0, 0, 4052, 3961, 1, 0, 0, 0, 4052, 3964, 1, 0, 0, 0, 4052, 3970, 1, 0, 0, 0, 4052, 3978, 1, 0, 0, 0, 4052, 3987, 1, 0, 0, 0, 4052, 3996, 1, 0, 0, 0, 4052, 4001, 1, 0, 0, 0, 4052, 4006, 1, 0, 0, 0, 4052, 4013, 1, 0, 0, 0, 4052, 4020, 1, 0, 0, 0, 4052, 4030, 1, 0, 0, 0, 4052, 4039, 1, 0, 0, 0, 4052, 4046, 1, 0, 0, 0, 4053, 554, 1, 0, 0, 0, 4054, 4055, 5, 108, 0, 0, 4055, 4056, 5, 100, 0, 0, 4056, 4057, 5, 97, 0, 0, 4057, 4058, 5, 114, 0, 0, 4058, 4059, 5, 103, 0, 0, 4059, 4060, 5, 46, 0, 0, 4060, 4131, 5, 115, 0, 0, 4061, 4062, 5, 108, 0, 0, 4062, 4063, 5, 100, 0, 0, 4063, 4064, 5, 97, 0, 0, 4064, 4065, 5, 114, 0, 0, 4065, 4066, 5, 103, 0, 0, 4066, 4067, 5, 97, 0, 0, 4067, 4068, 5, 46, 0, 0, 4068, 4131, 5, 115, 0, 0, 4069, 4070, 5, 115, 0, 0, 4070, 4071, 5, 116, 0, 0, 4071, 4072, 5, 97, 0, 0, 4072, 4073, 5, 114, 0, 0, 4073, 4074, 5, 103, 0, 0, 4074, 4075, 5, 46, 0, 0, 4075, 4131, 5, 115, 0, 0, 4076, 4077, 5, 108, 0, 0, 4077, 4078, 5, 100, 0, 0, 4078, 4079, 5, 108, 0, 0, 4079, 4080, 5, 111, 0, 0, 4080, 4081, 5, 99, 0, 0, 4081, 4082, 5, 46, 0, 0, 4082, 4131, 5, 115, 0, 0, 4083, 4084, 5, 108, 0, 0, 4084, 4085, 5, 100, 0, 0, 4085, 4086, 5, 108, 0, 0, 4086, 4087, 5, 111, 0, 0, 4087, 4088, 5, 99, 0, 0, 4088, 4089, 5, 97, 0, 0, 4089, 4090, 5, 46, 0, 0, 4090, 4131, 5, 115, 0, 0, 4091, 4092, 5, 115, 0, 0, 4092, 4093, 5, 116, 0, 0, 4093, 4094, 5, 108, 0, 0, 4094, 4095, 5, 111, 0, 0, 4095, 4096, 5, 99, 0, 0, 4096, 4097, 5, 46, 0, 0, 4097, 4131, 5, 115, 0, 0, 4098, 4099, 5, 108, 0, 0, 4099, 4100, 5, 100, 0, 0, 4100, 4101, 5, 97, 0, 0, 4101, 4102, 5, 114, 0, 0, 4102, 4131, 5, 103, 0, 0, 4103, 4104, 5, 108, 0, 0, 4104, 4105, 5, 100, 0, 0, 4105, 4106, 5, 97, 0, 0, 4106, 4107, 5, 114, 0, 0, 4107, 4108, 5, 103, 0, 0, 4108, 4131, 5, 97, 0, 0, 4109, 4110, 5, 115, 0, 0, 4110, 4111, 5, 116, 0, 0, 4111, 4112, 5, 97, 0, 0, 4112, 4113, 5, 114, 0, 0, 4113, 4131, 5, 103, 0, 0, 4114, 4115, 5, 108, 0, 0, 4115, 4116, 5, 100, 0, 0, 4116, 4117, 5, 108, 0, 0, 4117, 4118, 5, 111, 0, 0, 4118, 4131, 5, 99, 0, 0, 4119, 4120, 5, 108, 0, 0, 4120, 4121, 5, 100, 0, 0, 4121, 4122, 5, 108, 0, 0, 4122, 4123, 5, 111, 0, 0, 4123, 4124, 5, 99, 0, 0, 4124, 4131, 5, 97, 0, 0, 4125, 4126, 5, 115, 0, 0, 4126, 4127, 5, 116, 0, 0, 4127, 4128, 5, 108, 0, 0, 4128, 4129, 5, 111, 0, 0, 4129, 4131, 5, 99, 0, 0, 4130, 4054, 1, 0, 0, 0, 4130, 4061, 1, 0, 0, 0, 4130, 4069, 1, 0, 0, 0, 4130, 4076, 1, 0, 0, 0, 4130, 4083, 1, 0, 0, 0, 4130, 4091, 1, 0, 0, 0, 4130, 4098, 1, 0, 0, 0, 4130, 4103, 1, 0, 0, 0, 4130, 4109, 1, 0, 0, 0, 4130, 4114, 1, 0, 0, 0, 4130, 4119, 1, 0, 0, 0, 4130, 4125, 1, 0, 0, 0, 4131, 556, 1, 0, 0, 0, 4132, 4133, 5, 108, 0, 0, 4133, 4134, 5, 100, 0, 0, 4134, 4135, 5, 99, 0, 0, 4135, 4136, 5, 46, 0, 0, 4136, 4137, 5, 105, 0, 0, 4137, 4138, 5, 52, 0, 0, 4138, 4139, 5, 46, 0, 0, 4139, 4160, 5, 115, 0, 0, 4140, 4141, 5, 108, 0, 0, 4141, 4142, 5, 100, 0, 0, 4142, 4143, 5, 99, 0, 0, 4143, 4144, 5, 46, 0, 0, 4144, 4145, 5, 105, 0, 0, 4145, 4160, 5, 52, 0, 0, 4146, 4147, 5, 117, 0, 0, 4147, 4148, 5, 110, 0, 0, 4148, 4149, 5, 97, 0, 0, 4149, 4150, 5, 108, 0, 0, 4150, 4151, 5, 105, 0, 0, 4151, 4152, 5, 103, 0, 0, 4152, 4153, 5, 110, 0, 0, 4153, 4154, 5, 101, 0, 0, 4154, 4155, 5, 100, 0, 0, 4155, 4160, 5, 46, 0, 0, 4156, 4157, 5, 110, 0, 0, 4157, 4158, 5, 111, 0, 0, 4158, 4160, 5, 46, 0, 0, 4159, 4132, 1, 0, 0, 0, 4159, 4140, 1, 0, 0, 0, 4159, 4146, 1, 0, 0, 0, 4159, 4156, 1, 0, 0, 0, 4160, 558, 1, 0, 0, 0, 4161, 4162, 5, 108, 0, 0, 4162, 4163, 5, 100, 0, 0, 4163, 4164, 5, 99, 0, 0, 4164, 4165, 5, 46, 0, 0, 4165, 4166, 5, 105, 0, 0, 4166, 4167, 5, 56, 0, 0, 4167, 560, 1, 0, 0, 0, 4168, 4169, 5, 108, 0, 0, 4169, 4170, 5, 100, 0, 0, 4170, 4171, 5, 99, 0, 0, 4171, 4172, 5, 46, 0, 0, 4172, 4173, 5, 114, 0, 0, 4173, 4181, 5, 52, 0, 0, 4174, 4175, 5, 108, 0, 0, 4175, 4176, 5, 100, 0, 0, 4176, 4177, 5, 99, 0, 0, 4177, 4178, 5, 46, 0, 0, 4178, 4179, 5, 114, 0, 0, 4179, 4181, 5, 56, 0, 0, 4180, 4168, 1, 0, 0, 0, 4180, 4174, 1, 0, 0, 0, 4181, 562, 1, 0, 0, 0, 4182, 4183, 5, 106, 0, 0, 4183, 4184, 5, 109, 0, 0, 4184, 4218, 5, 112, 0, 0, 4185, 4186, 5, 99, 0, 0, 4186, 4187, 5, 97, 0, 0, 4187, 4188, 5, 108, 0, 0, 4188, 4218, 5, 108, 0, 0, 4189, 4190, 5, 99, 0, 0, 4190, 4191, 5, 97, 0, 0, 4191, 4192, 5, 108, 0, 0, 4192, 4193, 5, 108, 0, 0, 4193, 4194, 5, 118, 0, 0, 4194, 4195, 5, 105, 0, 0, 4195, 4196, 5, 114, 0, 0, 4196, 4218, 5, 116, 0, 0, 4197, 4198, 5, 110, 0, 0, 4198, 4199, 5, 101, 0, 0, 4199, 4200, 5, 119, 0, 0, 4200, 4201, 5, 111, 0, 0, 4201, 4202, 5, 98, 0, 0, 4202, 4218, 5, 106, 0, 0, 4203, 4204, 5, 108, 0, 0, 4204, 4205, 5, 100, 0, 0, 4205, 4206, 5, 102, 0, 0, 4206, 4207, 5, 116, 0, 0, 4207, 4218, 5, 110, 0, 0, 4208, 4209, 5, 108, 0, 0, 4209, 4210, 5, 100, 0, 0, 4210, 4211, 5, 118, 0, 0, 4211, 4212, 5, 105, 0, 0, 4212, 4213, 5, 114, 0, 0, 4213, 4214, 5, 116, 0, 0, 4214, 4215, 5, 102, 0, 0, 4215, 4216, 5, 116, 0, 0, 4216, 4218, 5, 110, 0, 0, 4217, 4182, 1, 0, 0, 0, 4217, 4185, 1, 0, 0, 0, 4217, 4189, 1, 0, 0, 0, 4217, 4197, 1, 0, 0, 0, 4217, 4203, 1, 0, 0, 0, 4217, 4208, 1, 0, 0, 0, 4218, 564, 1, 0, 0, 0, 4219, 4220, 5, 99, 0, 0, 4220, 4221, 5, 97, 0, 0, 4221, 4222, 5, 108, 0, 0, 4222, 4223, 5, 108, 0, 0, 4223, 4224, 5, 105, 0, 0, 4224, 566, 1, 0, 0, 0, 4225, 4226, 5, 98, 0, 0, 4226, 4227, 5, 114, 0, 0, 4227, 4228, 5, 46, 0, 0, 4228, 4384, 5, 115, 0, 0, 4229, 4230, 5, 98, 0, 0, 4230, 4231, 5, 114, 0, 0, 4231, 4232, 5, 102, 0, 0, 4232, 4233, 5, 97, 0, 0, 4233, 4234, 5, 108, 0, 0, 4234, 4235, 5, 115, 0, 0, 4235, 4236, 5, 101, 0, 0, 4236, 4237, 5, 46, 0, 0, 4237, 4384, 5, 115, 0, 0, 4238, 4239, 5, 98, 0, 0, 4239, 4240, 5, 114, 0, 0, 4240, 4241, 5, 116, 0, 0, 4241, 4242, 5, 114, 0, 0, 4242, 4243, 5, 117, 0, 0, 4243, 4244, 5, 101, 0, 0, 4244, 4245, 5, 46, 0, 0, 4245, 4384, 5, 115, 0, 0, 4246, 4247, 5, 98, 0, 0, 4247, 4248, 5, 101, 0, 0, 4248, 4249, 5, 113, 0, 0, 4249, 4250, 5, 46, 0, 0, 4250, 4384, 5, 115, 0, 0, 4251, 4252, 5, 98, 0, 0, 4252, 4253, 5, 103, 0, 0, 4253, 4254, 5, 101, 0, 0, 4254, 4255, 5, 46, 0, 0, 4255, 4384, 5, 115, 0, 0, 4256, 4257, 5, 98, 0, 0, 4257, 4258, 5, 103, 0, 0, 4258, 4259, 5, 116, 0, 0, 4259, 4260, 5, 46, 0, 0, 4260, 4384, 5, 115, 0, 0, 4261, 4262, 5, 98, 0, 0, 4262, 4263, 5, 108, 0, 0, 4263, 4264, 5, 101, 0, 0, 4264, 4265, 5, 46, 0, 0, 4265, 4384, 5, 115, 0, 0, 4266, 4267, 5, 98, 0, 0, 4267, 4268, 5, 108, 0, 0, 4268, 4269, 5, 116, 0, 0, 4269, 4270, 5, 46, 0, 0, 4270, 4384, 5, 115, 0, 0, 4271, 4272, 5, 98, 0, 0, 4272, 4273, 5, 110, 0, 0, 4273, 4274, 5, 101, 0, 0, 4274, 4275, 5, 46, 0, 0, 4275, 4276, 5, 117, 0, 0, 4276, 4277, 5, 110, 0, 0, 4277, 4278, 5, 46, 0, 0, 4278, 4384, 5, 115, 0, 0, 4279, 4280, 5, 98, 0, 0, 4280, 4281, 5, 103, 0, 0, 4281, 4282, 5, 101, 0, 0, 4282, 4283, 5, 46, 0, 0, 4283, 4284, 5, 117, 0, 0, 4284, 4285, 5, 110, 0, 0, 4285, 4286, 5, 46, 0, 0, 4286, 4384, 5, 115, 0, 0, 4287, 4288, 5, 98, 0, 0, 4288, 4289, 5, 103, 0, 0, 4289, 4290, 5, 116, 0, 0, 4290, 4291, 5, 46, 0, 0, 4291, 4292, 5, 117, 0, 0, 4292, 4293, 5, 110, 0, 0, 4293, 4294, 5, 46, 0, 0, 4294, 4384, 5, 115, 0, 0, 4295, 4296, 5, 98, 0, 0, 4296, 4297, 5, 108, 0, 0, 4297, 4298, 5, 101, 0, 0, 4298, 4299, 5, 46, 0, 0, 4299, 4300, 5, 117, 0, 0, 4300, 4301, 5, 110, 0, 0, 4301, 4302, 5, 46, 0, 0, 4302, 4384, 5, 115, 0, 0, 4303, 4304, 5, 98, 0, 0, 4304, 4305, 5, 108, 0, 0, 4305, 4306, 5, 116, 0, 0, 4306, 4307, 5, 46, 0, 0, 4307, 4308, 5, 117, 0, 0, 4308, 4309, 5, 110, 0, 0, 4309, 4310, 5, 46, 0, 0, 4310, 4384, 5, 115, 0, 0, 4311, 4312, 5, 98, 0, 0, 4312, 4384, 5, 114, 0, 0, 4313, 4314, 5, 98, 0, 0, 4314, 4315, 5, 114, 0, 0, 4315, 4316, 5, 102, 0, 0, 4316, 4317, 5, 97, 0, 0, 4317, 4318, 5, 108, 0, 0, 4318, 4319, 5, 115, 0, 0, 4319, 4384, 5, 101, 0, 0, 4320, 4321, 5, 98, 0, 0, 4321, 4322, 5, 114, 0, 0, 4322, 4323, 5, 116, 0, 0, 4323, 4324, 5, 114, 0, 0, 4324, 4325, 5, 117, 0, 0, 4325, 4384, 5, 101, 0, 0, 4326, 4327, 5, 98, 0, 0, 4327, 4328, 5, 101, 0, 0, 4328, 4384, 5, 113, 0, 0, 4329, 4330, 5, 98, 0, 0, 4330, 4331, 5, 103, 0, 0, 4331, 4384, 5, 101, 0, 0, 4332, 4333, 5, 98, 0, 0, 4333, 4334, 5, 103, 0, 0, 4334, 4384, 5, 116, 0, 0, 4335, 4336, 5, 98, 0, 0, 4336, 4337, 5, 108, 0, 0, 4337, 4384, 5, 101, 0, 0, 4338, 4339, 5, 98, 0, 0, 4339, 4340, 5, 108, 0, 0, 4340, 4384, 5, 116, 0, 0, 4341, 4342, 5, 98, 0, 0, 4342, 4343, 5, 110, 0, 0, 4343, 4344, 5, 101, 0, 0, 4344, 4345, 5, 46, 0, 0, 4345, 4346, 5, 117, 0, 0, 4346, 4384, 5, 110, 0, 0, 4347, 4348, 5, 98, 0, 0, 4348, 4349, 5, 103, 0, 0, 4349, 4350, 5, 101, 0, 0, 4350, 4351, 5, 46, 0, 0, 4351, 4352, 5, 117, 0, 0, 4352, 4384, 5, 110, 0, 0, 4353, 4354, 5, 98, 0, 0, 4354, 4355, 5, 103, 0, 0, 4355, 4356, 5, 116, 0, 0, 4356, 4357, 5, 46, 0, 0, 4357, 4358, 5, 117, 0, 0, 4358, 4384, 5, 110, 0, 0, 4359, 4360, 5, 98, 0, 0, 4360, 4361, 5, 108, 0, 0, 4361, 4362, 5, 101, 0, 0, 4362, 4363, 5, 46, 0, 0, 4363, 4364, 5, 117, 0, 0, 4364, 4384, 5, 110, 0, 0, 4365, 4366, 5, 98, 0, 0, 4366, 4367, 5, 108, 0, 0, 4367, 4368, 5, 116, 0, 0, 4368, 4369, 5, 46, 0, 0, 4369, 4370, 5, 117, 0, 0, 4370, 4384, 5, 110, 0, 0, 4371, 4372, 5, 108, 0, 0, 4372, 4373, 5, 101, 0, 0, 4373, 4374, 5, 97, 0, 0, 4374, 4375, 5, 118, 0, 0, 4375, 4384, 5, 101, 0, 0, 4376, 4377, 5, 108, 0, 0, 4377, 4378, 5, 101, 0, 0, 4378, 4379, 5, 97, 0, 0, 4379, 4380, 5, 118, 0, 0, 4380, 4381, 5, 101, 0, 0, 4381, 4382, 5, 46, 0, 0, 4382, 4384, 5, 115, 0, 0, 4383, 4225, 1, 0, 0, 0, 4383, 4229, 1, 0, 0, 0, 4383, 4238, 1, 0, 0, 0, 4383, 4246, 1, 0, 0, 0, 4383, 4251, 1, 0, 0, 0, 4383, 4256, 1, 0, 0, 0, 4383, 4261, 1, 0, 0, 0, 4383, 4266, 1, 0, 0, 0, 4383, 4271, 1, 0, 0, 0, 4383, 4279, 1, 0, 0, 0, 4383, 4287, 1, 0, 0, 0, 4383, 4295, 1, 0, 0, 0, 4383, 4303, 1, 0, 0, 0, 4383, 4311, 1, 0, 0, 0, 4383, 4313, 1, 0, 0, 0, 4383, 4320, 1, 0, 0, 0, 4383, 4326, 1, 0, 0, 0, 4383, 4329, 1, 0, 0, 0, 4383, 4332, 1, 0, 0, 0, 4383, 4335, 1, 0, 0, 0, 4383, 4338, 1, 0, 0, 0, 4383, 4341, 1, 0, 0, 0, 4383, 4347, 1, 0, 0, 0, 4383, 4353, 1, 0, 0, 0, 4383, 4359, 1, 0, 0, 0, 4383, 4365, 1, 0, 0, 0, 4383, 4371, 1, 0, 0, 0, 4383, 4376, 1, 0, 0, 0, 4384, 568, 1, 0, 0, 0, 4385, 4386, 5, 115, 0, 0, 4386, 4387, 5, 119, 0, 0, 4387, 4388, 5, 105, 0, 0, 4388, 4389, 5, 116, 0, 0, 4389, 4390, 5, 99, 0, 0, 4390, 4391, 5, 104, 0, 0, 4391, 570, 1, 0, 0, 0, 4392, 4393, 5, 99, 0, 0, 4393, 4394, 5, 112, 0, 0, 4394, 4395, 5, 111, 0, 0, 4395, 4396, 5, 98, 0, 0, 4396, 4507, 5, 106, 0, 0, 4397, 4398, 5, 108, 0, 0, 4398, 4399, 5, 100, 0, 0, 4399, 4400, 5, 111, 0, 0, 4400, 4401, 5, 98, 0, 0, 4401, 4507, 5, 106, 0, 0, 4402, 4403, 5, 99, 0, 0, 4403, 4404, 5, 97, 0, 0, 4404, 4405, 5, 115, 0, 0, 4405, 4406, 5, 116, 0, 0, 4406, 4407, 5, 99, 0, 0, 4407, 4408, 5, 108, 0, 0, 4408, 4409, 5, 97, 0, 0, 4409, 4410, 5, 115, 0, 0, 4410, 4507, 5, 115, 0, 0, 4411, 4412, 5, 105, 0, 0, 4412, 4413, 5, 115, 0, 0, 4413, 4414, 5, 105, 0, 0, 4414, 4415, 5, 110, 0, 0, 4415, 4416, 5, 115, 0, 0, 4416, 4507, 5, 116, 0, 0, 4417, 4418, 5, 117, 0, 0, 4418, 4419, 5, 110, 0, 0, 4419, 4420, 5, 98, 0, 0, 4420, 4421, 5, 111, 0, 0, 4421, 4507, 5, 120, 0, 0, 4422, 4423, 5, 115, 0, 0, 4423, 4424, 5, 116, 0, 0, 4424, 4425, 5, 111, 0, 0, 4425, 4426, 5, 98, 0, 0, 4426, 4507, 5, 106, 0, 0, 4427, 4428, 5, 98, 0, 0, 4428, 4429, 5, 111, 0, 0, 4429, 4507, 5, 120, 0, 0, 4430, 4431, 5, 110, 0, 0, 4431, 4432, 5, 101, 0, 0, 4432, 4433, 5, 119, 0, 0, 4433, 4434, 5, 97, 0, 0, 4434, 4435, 5, 114, 0, 0, 4435, 4507, 5, 114, 0, 0, 4436, 4437, 5, 108, 0, 0, 4437, 4438, 5, 100, 0, 0, 4438, 4439, 5, 101, 0, 0, 4439, 4440, 5, 108, 0, 0, 4440, 4441, 5, 101, 0, 0, 4441, 4442, 5, 109, 0, 0, 4442, 4507, 5, 97, 0, 0, 4443, 4444, 5, 108, 0, 0, 4444, 4445, 5, 100, 0, 0, 4445, 4446, 5, 101, 0, 0, 4446, 4447, 5, 108, 0, 0, 4447, 4448, 5, 101, 0, 0, 4448, 4507, 5, 109, 0, 0, 4449, 4450, 5, 115, 0, 0, 4450, 4451, 5, 116, 0, 0, 4451, 4452, 5, 101, 0, 0, 4452, 4453, 5, 108, 0, 0, 4453, 4454, 5, 101, 0, 0, 4454, 4507, 5, 109, 0, 0, 4455, 4456, 5, 117, 0, 0, 4456, 4457, 5, 110, 0, 0, 4457, 4458, 5, 98, 0, 0, 4458, 4459, 5, 111, 0, 0, 4459, 4460, 5, 120, 0, 0, 4460, 4461, 5, 46, 0, 0, 4461, 4462, 5, 97, 0, 0, 4462, 4463, 5, 110, 0, 0, 4463, 4507, 5, 121, 0, 0, 4464, 4465, 5, 114, 0, 0, 4465, 4466, 5, 101, 0, 0, 4466, 4467, 5, 102, 0, 0, 4467, 4468, 5, 97, 0, 0, 4468, 4469, 5, 110, 0, 0, 4469, 4470, 5, 121, 0, 0, 4470, 4471, 5, 118, 0, 0, 4471, 4472, 5, 97, 0, 0, 4472, 4507, 5, 108, 0, 0, 4473, 4474, 5, 109, 0, 0, 4474, 4475, 5, 107, 0, 0, 4475, 4476, 5, 114, 0, 0, 4476, 4477, 5, 101, 0, 0, 4477, 4478, 5, 102, 0, 0, 4478, 4479, 5, 97, 0, 0, 4479, 4480, 5, 110, 0, 0, 4480, 4507, 5, 121, 0, 0, 4481, 4482, 5, 105, 0, 0, 4482, 4483, 5, 110, 0, 0, 4483, 4484, 5, 105, 0, 0, 4484, 4485, 5, 116, 0, 0, 4485, 4486, 5, 111, 0, 0, 4486, 4487, 5, 98, 0, 0, 4487, 4507, 5, 106, 0, 0, 4488, 4489, 5, 99, 0, 0, 4489, 4490, 5, 111, 0, 0, 4490, 4491, 5, 110, 0, 0, 4491, 4492, 5, 115, 0, 0, 4492, 4493, 5, 116, 0, 0, 4493, 4494, 5, 114, 0, 0, 4494, 4495, 5, 97, 0, 0, 4495, 4496, 5, 105, 0, 0, 4496, 4497, 5, 110, 0, 0, 4497, 4498, 5, 101, 0, 0, 4498, 4499, 5, 100, 0, 0, 4499, 4507, 5, 46, 0, 0, 4500, 4501, 5, 115, 0, 0, 4501, 4502, 5, 105, 0, 0, 4502, 4503, 5, 122, 0, 0, 4503, 4504, 5, 101, 0, 0, 4504, 4505, 5, 111, 0, 0, 4505, 4507, 5, 102, 0, 0, 4506, 4392, 1, 0, 0, 0, 4506, 4397, 1, 0, 0, 0, 4506, 4402, 1, 0, 0, 0, 4506, 4411, 1, 0, 0, 0, 4506, 4417, 1, 0, 0, 0, 4506, 4422, 1, 0, 0, 0, 4506, 4427, 1, 0, 0, 0, 4506, 4430, 1, 0, 0, 0, 4506, 4436, 1, 0, 0, 0, 4506, 4443, 1, 0, 0, 0, 4506, 4449, 1, 0, 0, 0, 4506, 4455, 1, 0, 0, 0, 4506, 4464, 1, 0, 0, 0, 4506, 4473, 1, 0, 0, 0, 4506, 4481, 1, 0, 0, 0, 4506, 4488, 1, 0, 0, 0, 4506, 4500, 1, 0, 0, 0, 4507, 572, 1, 0, 0, 0, 4508, 4509, 5, 108, 0, 0, 4509, 4510, 5, 100, 0, 0, 4510, 4511, 5, 115, 0, 0, 4511, 4512, 5, 116, 0, 0, 4512, 4513, 5, 114, 0, 0, 4513, 574, 1, 0, 0, 0, 4514, 4515, 5, 108, 0, 0, 4515, 4516, 5, 100, 0, 0, 4516, 4517, 5, 102, 0, 0, 4517, 4518, 5, 108, 0, 0, 4518, 4550, 5, 100, 0, 0, 4519, 4520, 5, 108, 0, 0, 4520, 4521, 5, 100, 0, 0, 4521, 4522, 5, 102, 0, 0, 4522, 4523, 5, 108, 0, 0, 4523, 4524, 5, 100, 0, 0, 4524, 4550, 5, 97, 0, 0, 4525, 4526, 5, 115, 0, 0, 4526, 4527, 5, 116, 0, 0, 4527, 4528, 5, 102, 0, 0, 4528, 4529, 5, 108, 0, 0, 4529, 4550, 5, 100, 0, 0, 4530, 4531, 5, 108, 0, 0, 4531, 4532, 5, 100, 0, 0, 4532, 4533, 5, 115, 0, 0, 4533, 4534, 5, 102, 0, 0, 4534, 4535, 5, 108, 0, 0, 4535, 4550, 5, 100, 0, 0, 4536, 4537, 5, 108, 0, 0, 4537, 4538, 5, 100, 0, 0, 4538, 4539, 5, 115, 0, 0, 4539, 4540, 5, 102, 0, 0, 4540, 4541, 5, 108, 0, 0, 4541, 4542, 5, 100, 0, 0, 4542, 4550, 5, 97, 0, 0, 4543, 4544, 5, 115, 0, 0, 4544, 4545, 5, 116, 0, 0, 4545, 4546, 5, 115, 0, 0, 4546, 4547, 5, 102, 0, 0, 4547, 4548, 5, 108, 0, 0, 4548, 4550, 5, 100, 0, 0, 4549, 4514, 1, 0, 0, 0, 4549, 4519, 1, 0, 0, 0, 4549, 4525, 1, 0, 0, 0, 4549, 4530, 1, 0, 0, 0, 4549, 4536, 1, 0, 0, 0, 4549, 4543, 1, 0, 0, 0, 4550, 576, 1, 0, 0, 0, 4551, 4552, 5, 108, 0, 0, 4552, 4553, 5, 100, 0, 0, 4553, 4554, 5, 116, 0, 0, 4554, 4555, 5, 111, 0, 0, 4555, 4556, 5, 107, 0, 0, 4556, 4557, 5, 101, 0, 0, 4557, 4558, 5, 110, 0, 0, 4558, 578, 1, 0, 0, 0, 4559, 4560, 7, 8, 0, 0, 4560, 580, 1, 0, 0, 0, 4561, 4562, 7, 9, 0, 0, 4562, 582, 1, 0, 0, 0, 4563, 4564, 3, 585, 292, 0, 4564, 4565, 3, 533, 266, 0, 4565, 4567, 1, 0, 0, 0, 4566, 4563, 1, 0, 0, 0, 4567, 4568, 1, 0, 0, 0, 4568, 4566, 1, 0, 0, 0, 4568, 4569, 1, 0, 0, 0, 4569, 4570, 1, 0, 0, 0, 4570, 4571, 3, 585, 292, 0, 4571, 584, 1, 0, 0, 0, 4572, 4576, 3, 579, 289, 0, 4573, 4575, 3, 581, 290, 0, 4574, 4573, 1, 0, 0, 0, 4575, 4578, 1, 0, 0, 0, 4576, 4574, 1, 0, 0, 0, 4576, 4577, 1, 0, 0, 0, 4577, 586, 1, 0, 0, 0, 4578, 4576, 1, 0, 0, 0, 4579, 4580, 7, 0, 0, 0, 4580, 4581, 7, 0, 0, 0, 4581, 588, 1, 0, 0, 0, 4582, 4583, 7, 10, 0, 0, 4583, 4584, 1, 0, 0, 0, 4584, 4585, 6, 294, 0, 0, 4585, 590, 1, 0, 0, 0, 4586, 4587, 5, 47, 0, 0, 4587, 4588, 5, 47, 0, 0, 4588, 4592, 1, 0, 0, 0, 4589, 4591, 8, 11, 0, 0, 4590, 4589, 1, 0, 0, 0, 4591, 4594, 1, 0, 0, 0, 4592, 4590, 1, 0, 0, 0, 4592, 4593, 1, 0, 0, 0, 4593, 4595, 1, 0, 0, 0, 4594, 4592, 1, 0, 0, 0, 4595, 4596, 6, 295, 0, 0, 4596, 592, 1, 0, 0, 0, 4597, 4598, 5, 47, 0, 0, 4598, 4599, 5, 42, 0, 0, 4599, 4603, 1, 0, 0, 0, 4600, 4602, 9, 0, 0, 0, 4601, 4600, 1, 0, 0, 0, 4602, 4605, 1, 0, 0, 0, 4603, 4604, 1, 0, 0, 0, 4603, 4601, 1, 0, 0, 0, 4604, 4606, 1, 0, 0, 0, 4605, 4603, 1, 0, 0, 0, 4606, 4607, 5, 42, 0, 0, 4607, 4608, 5, 47, 0, 0, 4608, 4609, 1, 0, 0, 0, 4609, 4610, 6, 296, 0, 0, 4610, 594, 1, 0, 0, 0, 4611, 4612, 5, 46, 0, 0, 4612, 4613, 5, 112, 0, 0, 4613, 4614, 5, 101, 0, 0, 4614, 4615, 5, 114, 0, 0, 4615, 4616, 5, 109, 0, 0, 4616, 4617, 5, 105, 0, 0, 4617, 4618, 5, 115, 0, 0, 4618, 4619, 5, 115, 0, 0, 4619, 4620, 5, 105, 0, 0, 4620, 4621, 5, 111, 0, 0, 4621, 4622, 5, 110, 0, 0, 4622, 596, 1, 0, 0, 0, 4623, 4624, 5, 46, 0, 0, 4624, 4625, 5, 112, 0, 0, 4625, 4626, 5, 101, 0, 0, 4626, 4627, 5, 114, 0, 0, 4627, 4628, 5, 109, 0, 0, 4628, 4629, 5, 105, 0, 0, 4629, 4630, 5, 115, 0, 0, 4630, 4631, 5, 115, 0, 0, 4631, 4632, 5, 105, 0, 0, 4632, 4633, 5, 111, 0, 0, 4633, 4634, 5, 110, 0, 0, 4634, 4635, 5, 115, 0, 0, 4635, 4636, 5, 101, 0, 0, 4636, 4637, 5, 116, 0, 0, 4637, 598, 1, 0, 0, 0, 4638, 4639, 5, 46, 0, 0, 4639, 4640, 5, 101, 0, 0, 4640, 4641, 5, 109, 0, 0, 4641, 4642, 5, 105, 0, 0, 4642, 4643, 5, 116, 0, 0, 4643, 4644, 5, 98, 0, 0, 4644, 4645, 5, 121, 0, 0, 4645, 4646, 5, 116, 0, 0, 4646, 4647, 5, 101, 0, 0, 4647, 600, 1, 0, 0, 0, 4648, 4649, 5, 46, 0, 0, 4649, 4650, 5, 109, 0, 0, 4650, 4651, 5, 97, 0, 0, 4651, 4652, 5, 120, 0, 0, 4652, 4653, 5, 115, 0, 0, 4653, 4654, 5, 116, 0, 0, 4654, 4655, 5, 97, 0, 0, 4655, 4656, 5, 99, 0, 0, 4656, 4657, 5, 107, 0, 0, 4657, 602, 1, 0, 0, 0, 4658, 4659, 5, 46, 0, 0, 4659, 4660, 5, 101, 0, 0, 4660, 4661, 5, 110, 0, 0, 4661, 4662, 5, 116, 0, 0, 4662, 4663, 5, 114, 0, 0, 4663, 4664, 5, 121, 0, 0, 4664, 4665, 5, 112, 0, 0, 4665, 4666, 5, 111, 0, 0, 4666, 4667, 5, 105, 0, 0, 4667, 4668, 5, 110, 0, 0, 4668, 4669, 5, 116, 0, 0, 4669, 604, 1, 0, 0, 0, 4670, 4671, 5, 46, 0, 0, 4671, 4672, 5, 122, 0, 0, 4672, 4673, 5, 101, 0, 0, 4673, 4674, 5, 114, 0, 0, 4674, 4675, 5, 111, 0, 0, 4675, 4676, 5, 105, 0, 0, 4676, 4677, 5, 110, 0, 0, 4677, 4678, 5, 105, 0, 0, 4678, 4679, 5, 116, 0, 0, 4679, 606, 1, 0, 0, 0, 4680, 4681, 5, 46, 0, 0, 4681, 4682, 5, 108, 0, 0, 4682, 4683, 5, 111, 0, 0, 4683, 4684, 5, 99, 0, 0, 4684, 4685, 5, 97, 0, 0, 4685, 4686, 5, 108, 0, 0, 4686, 4687, 5, 115, 0, 0, 4687, 608, 1, 0, 0, 0, 4688, 4689, 5, 46, 0, 0, 4689, 4690, 5, 101, 0, 0, 4690, 4691, 5, 120, 0, 0, 4691, 4692, 5, 112, 0, 0, 4692, 4693, 5, 111, 0, 0, 4693, 4694, 5, 114, 0, 0, 4694, 4695, 5, 116, 0, 0, 4695, 610, 1, 0, 0, 0, 4696, 4697, 5, 46, 0, 0, 4697, 4698, 5, 111, 0, 0, 4698, 4699, 5, 118, 0, 0, 4699, 4700, 5, 101, 0, 0, 4700, 4701, 5, 114, 0, 0, 4701, 4702, 5, 114, 0, 0, 4702, 4703, 5, 105, 0, 0, 4703, 4704, 5, 100, 0, 0, 4704, 4705, 5, 101, 0, 0, 4705, 612, 1, 0, 0, 0, 4706, 4707, 5, 46, 0, 0, 4707, 4708, 5, 118, 0, 0, 4708, 4709, 5, 116, 0, 0, 4709, 4710, 5, 101, 0, 0, 4710, 4711, 5, 110, 0, 0, 4711, 4712, 5, 116, 0, 0, 4712, 4713, 5, 114, 0, 0, 4713, 4714, 5, 121, 0, 0, 4714, 614, 1, 0, 0, 0, 45, 0, 2037, 2045, 2050, 2052, 2055, 2063, 2068, 2070, 2073, 2078, 2084, 2088, 2093, 2095, 2099, 2104, 2106, 2112, 2116, 2121, 2123, 2125, 2162, 2715, 2766, 2769, 2772, 2775, 2780, 2782, 2790, 2792, 4052, 4130, 4159, 4180, 4217, 4383, 4506, 4549, 4568, 4576, 4592, 4603, 1, 6, 0, 0]
\ No newline at end of file
diff --git a/src/tools/ilasm/src/ILAssembler/gen/CILLexer.tokens b/src/tools/ilasm/src/ILAssembler/gen/CILLexer.tokens
index 30f6003a7e601b..c09ff70c9c2c65 100644
--- a/src/tools/ilasm/src/ILAssembler/gen/CILLexer.tokens
+++ b/src/tools/ilasm/src/ILAssembler/gen/CILLexer.tokens
@@ -169,137 +169,138 @@ T__167=168
T__168=169
T__169=170
T__170=171
-INT32=172
-INT64=173
-FLOAT64=174
-DCOLON=175
-ELLIPSIS=176
-NULL=177
-NULLREF=178
-HASH=179
-CHAR=180
-STRING=181
-BOOL=182
-INT8=183
-INT16=184
-INT32_=185
-INT64_=186
-FLOAT32=187
-FLOAT64_=188
-UINT8=189
-UINT16=190
-UINT32=191
-UINT64=192
-INT=193
-UINT=194
-TYPE=195
-OBJECT=196
-MODULE=197
-VALUE=198
-VALUETYPE=199
-VOID=200
-ENUM=201
-CUSTOM=202
-FIXED=203
-SYSSTRING=204
-ARRAY=205
-VARIANT=206
-CURRENCY=207
-SYSCHAR=208
-ERROR=209
-DECIMAL=210
-DATE=211
-BSTR=212
-LPSTR=213
-LPWSTR=214
-LPTSTR=215
-OBJECTREF=216
-IUNKNOWN=217
-IDISPATCH=218
-STRUCT=219
-INTERFACE=220
-SAFEARRAY=221
-BYVALSTR=222
-ANSI=223
-TBSTR=224
-METHOD=225
-ANY=226
-LPSTRUCT=227
-VECTOR=228
-HRESULT=229
-CARRAY=230
-USERDEFINED=231
-RECORD=232
-FILETIME=233
-BLOB=234
-STREAM=235
-STORAGE=236
-STREAMED_OBJECT=237
-STORED_OBJECT=238
-BLOB_OBJECT=239
-CF=240
-CLSID=241
-INSTANCE=242
-EXPLICIT=243
-DEFAULT=244
-VARARG=245
-UNMANAGED=246
-CDECL=247
-STDCALL=248
-THISCALL=249
-FASTCALL=250
-TYPE_PARAMETER=251
-METHOD_TYPE_PARAMETER=252
-TYPEDREF=253
-PARAM=254
-CONSTRAINT=255
-THIS=256
-BASE=257
-NESTER=258
-REF=259
-ARRAY_TYPE_NO_BOUNDS=260
-PTR=261
-QSTRING=262
-SQSTRING=263
-DOT=264
-PLUS=265
-PP_DEFINE=266
-PP_UNDEF=267
-PP_IFDEF=268
-PP_IFNDEF=269
-PP_ELSE=270
-PP_ENDIF=271
-PP_INCLUDE=272
-MRESOURCE=273
-INSTR_NONE=274
-INSTR_VAR=275
-INSTR_I=276
-INSTR_I8=277
-INSTR_R=278
-INSTR_METHOD=279
-INSTR_SIG=280
-INSTR_BRTARGET=281
-INSTR_SWITCH=282
-INSTR_TYPE=283
-INSTR_STRING=284
-INSTR_FIELD=285
-INSTR_TOK=286
-DOTTEDNAME=287
-ID=288
-HEXBYTE=289
-WS=290
-SINGLE_LINE_COMMENT=291
-COMMENT=292
-PERMISSION=293
-PERMISSIONSET=294
-EMITBYTE=295
-MAXSTACK=296
-ENTRYPOINT=297
-ZEROINIT=298
-LOCALS=299
-EXPORT=300
-OVERRIDE=301
-VTENTRY=302
+T__171=172
+INT32=173
+INT64=174
+FLOAT64=175
+DCOLON=176
+ELLIPSIS=177
+NULL=178
+NULLREF=179
+HASH=180
+CHAR=181
+STRING=182
+BOOL=183
+INT8=184
+INT16=185
+INT32_=186
+INT64_=187
+FLOAT32=188
+FLOAT64_=189
+UINT8=190
+UINT16=191
+UINT32=192
+UINT64=193
+INT=194
+UINT=195
+TYPE=196
+OBJECT=197
+MODULE=198
+VALUE=199
+VALUETYPE=200
+VOID=201
+ENUM=202
+CUSTOM=203
+FIXED=204
+SYSSTRING=205
+ARRAY=206
+VARIANT=207
+CURRENCY=208
+SYSCHAR=209
+ERROR=210
+DECIMAL=211
+DATE=212
+BSTR=213
+LPSTR=214
+LPWSTR=215
+LPTSTR=216
+OBJECTREF=217
+IUNKNOWN=218
+IDISPATCH=219
+STRUCT=220
+INTERFACE=221
+SAFEARRAY=222
+BYVALSTR=223
+ANSI=224
+TBSTR=225
+METHOD=226
+ANY=227
+LPSTRUCT=228
+VECTOR=229
+HRESULT=230
+CARRAY=231
+USERDEFINED=232
+RECORD=233
+FILETIME=234
+BLOB=235
+STREAM=236
+STORAGE=237
+STREAMED_OBJECT=238
+STORED_OBJECT=239
+BLOB_OBJECT=240
+CF=241
+CLSID=242
+INSTANCE=243
+EXPLICIT=244
+DEFAULT=245
+VARARG=246
+UNMANAGED=247
+CDECL=248
+STDCALL=249
+THISCALL=250
+FASTCALL=251
+TYPE_PARAMETER=252
+METHOD_TYPE_PARAMETER=253
+TYPEDREF=254
+PARAM=255
+CONSTRAINT=256
+THIS=257
+BASE=258
+NESTER=259
+REF=260
+ARRAY_TYPE_NO_BOUNDS=261
+PTR=262
+QSTRING=263
+SQSTRING=264
+DOT=265
+PLUS=266
+PP_DEFINE=267
+PP_UNDEF=268
+PP_IFDEF=269
+PP_IFNDEF=270
+PP_ELSE=271
+PP_ENDIF=272
+PP_INCLUDE=273
+MRESOURCE=274
+INSTR_NONE=275
+INSTR_VAR=276
+INSTR_I=277
+INSTR_I8=278
+INSTR_R=279
+INSTR_METHOD=280
+INSTR_SIG=281
+INSTR_BRTARGET=282
+INSTR_SWITCH=283
+INSTR_TYPE=284
+INSTR_STRING=285
+INSTR_FIELD=286
+INSTR_TOK=287
+DOTTEDNAME=288
+ID=289
+HEXBYTE=290
+WS=291
+SINGLE_LINE_COMMENT=292
+COMMENT=293
+PERMISSION=294
+PERMISSIONSET=295
+EMITBYTE=296
+MAXSTACK=297
+ENTRYPOINT=298
+ZEROINIT=299
+LOCALS=300
+EXPORT=301
+OVERRIDE=302
+VTENTRY=303
'native'=1
'cil'=2
'optil'=3
@@ -315,118 +316,118 @@ VTENTRY=302
'aggressiveoptimization'=13
'async'=14
'extended'=15
-'{'=16
-'}'=17
-'.subsystem'=18
-'.corflags'=19
-'.file'=20
-'alignment'=21
-'.imagebase'=22
-'.stackreserve'=23
-'.assembly'=24
-'.mscorlib'=25
-'.language'=26
-','=27
-'.typelist'=28
-'('=29
-')'=30
-';'=31
-'.typedef'=32
-'as'=33
-'.custom'=34
-'='=35
-'field'=36
-'property'=37
-'class'=38
-'extern'=39
-'.vtfixup'=40
-'['=41
-']'=42
-'at'=43
-'fromunmanaged'=44
-'callmostderived'=45
-'retainappdomain'=46
-'.vtable'=47
-'.namespace'=48
-'.class'=49
-'public'=50
-'private'=51
-'sealed'=52
-'abstract'=53
-'auto'=54
-'sequential'=55
-'unicode'=56
-'autochar'=57
-'import'=58
-'serializable'=59
-'windowsruntime'=60
-'nested'=61
-'family'=62
-'assembly'=63
-'famandassem'=64
-'famorassem'=65
-'beforefieldinit'=66
-'specialname'=67
-'rtspecialname'=68
-'flags'=69
-'extends'=70
-'implements'=71
-'.line'=72
-'#line'=73
-':'=74
-'nometadata'=75
-'retargetable'=76
-'noplatform'=77
-'legacy library'=78
-'x86'=79
-'amd64'=80
-'arm'=81
-'arm64'=82
-'bytearray'=83
-'()'=84
-'<'=85
-'>'=86
-'/'=87
-'algorithm'=88
-'iidparam'=89
-'pinned'=90
-'modreq'=91
-'modopt'=92
-'unsigned'=93
-'true'=94
-'false'=95
-'request'=96
-'demand'=97
-'assert'=98
-'deny'=99
-'permitonly'=100
-'linkcheck'=101
-'inheritcheck'=102
-'reqmin'=103
-'reqopt'=104
-'reqrefuse'=105
-'prejitgrant'=106
-'prejitdeny'=107
-'noncasdemand'=108
-'noncaslinkdemand'=109
-'noncasinheritance'=110
-'callconv'=111
-'mdtoken'=112
-'-'=113
-'byreflike'=114
-'.ctor'=115
-'.size'=116
-'.pack'=117
-'with'=118
-'.interfaceimpl'=119
-'.field'=120
-'marshal'=121
-'static'=122
-'initonly'=123
-'privatescope'=124
-'literal'=125
-'notserialized'=126
-'volatile'=127
+'volatile'=16
+'{'=17
+'}'=18
+'.subsystem'=19
+'.corflags'=20
+'.file'=21
+'alignment'=22
+'.imagebase'=23
+'.stackreserve'=24
+'.assembly'=25
+'.mscorlib'=26
+'.language'=27
+','=28
+'.typelist'=29
+'('=30
+')'=31
+';'=32
+'.typedef'=33
+'as'=34
+'.custom'=35
+'='=36
+'field'=37
+'property'=38
+'class'=39
+'extern'=40
+'.vtfixup'=41
+'['=42
+']'=43
+'at'=44
+'fromunmanaged'=45
+'callmostderived'=46
+'retainappdomain'=47
+'.vtable'=48
+'.namespace'=49
+'.class'=50
+'public'=51
+'private'=52
+'sealed'=53
+'abstract'=54
+'auto'=55
+'sequential'=56
+'unicode'=57
+'autochar'=58
+'import'=59
+'serializable'=60
+'windowsruntime'=61
+'nested'=62
+'family'=63
+'assembly'=64
+'famandassem'=65
+'famorassem'=66
+'beforefieldinit'=67
+'specialname'=68
+'rtspecialname'=69
+'flags'=70
+'extends'=71
+'implements'=72
+'.line'=73
+'#line'=74
+':'=75
+'nometadata'=76
+'retargetable'=77
+'noplatform'=78
+'legacy library'=79
+'x86'=80
+'amd64'=81
+'arm'=82
+'arm64'=83
+'bytearray'=84
+'()'=85
+'<'=86
+'>'=87
+'/'=88
+'algorithm'=89
+'unsigned'=90
+'iidparam'=91
+'pinned'=92
+'modreq'=93
+'modopt'=94
+'true'=95
+'false'=96
+'request'=97
+'demand'=98
+'assert'=99
+'deny'=100
+'permitonly'=101
+'linkcheck'=102
+'inheritcheck'=103
+'reqmin'=104
+'reqopt'=105
+'reqrefuse'=106
+'prejitgrant'=107
+'prejitdeny'=108
+'noncasdemand'=109
+'noncaslinkdemand'=110
+'noncasinheritance'=111
+'callconv'=112
+'mdtoken'=113
+'-'=114
+'byreflike'=115
+'.ctor'=116
+'.size'=117
+'.pack'=118
+'with'=119
+'.interfaceimpl'=120
+'.field'=121
+'marshal'=122
+'static'=123
+'initonly'=124
+'privatescope'=125
+'literal'=126
+'notserialized'=127
'.event'=128
'.addon'=129
'.removeon'=130
@@ -466,116 +467,117 @@ VTENTRY=302
'handler'=164
'.data'=165
'tls'=166
-'.publicKey'=167
-'.ver'=168
-'.locale'=169
-'.publickeytoken'=170
-'forwarder'=171
-'::'=175
-'...'=176
-'null'=177
-'nullref'=178
-'.hash'=179
-'string'=181
-'bool'=182
-'int8'=183
-'int16'=184
-'int32'=185
-'int64'=186
-'float32'=187
-'float64'=188
-'uint8'=189
-'uint16'=190
-'uint32'=191
-'uint64'=192
-'int'=193
-'uint'=194
-'type'=195
-'object'=196
-'.module'=197
-'value'=198
-'valuetype'=199
-'void'=200
-'enum'=201
-'custom'=202
-'fixed'=203
-'systring'=204
-'array'=205
-'variant'=206
-'currency'=207
-'syschar'=208
-'error'=209
-'decimal'=210
-'date'=211
-'bstr'=212
-'lpstr'=213
-'lpwstr'=214
-'lptstr'=215
-'objectref'=216
-'iunknown'=217
-'idispatch'=218
-'struct'=219
-'interface'=220
-'safearray'=221
-'byvalstr'=222
-'ansi'=223
-'tbstr'=224
-'method'=225
-'any'=226
-'lpstruct'=227
-'vector'=228
-'hresult'=229
-'carray'=230
-'userdefined'=231
-'record'=232
-'filetime'=233
-'blob'=234
-'stream'=235
-'storage'=236
-'streamed_object'=237
-'stored_object'=238
-'blob_object'=239
-'cf'=240
-'clsid'=241
-'instance'=242
-'explicit'=243
-'default'=244
-'vararg'=245
-'unmanaged'=246
-'cdecl'=247
-'stdcall'=248
-'thiscall'=249
-'fastcall'=250
-'!'=251
-'.param'=254
-'constraint'=255
-'.this'=256
-'.base'=257
-'.nester'=258
-'&'=259
-'*'=261
-'.'=264
-'+'=265
-'#define'=266
-'#undef'=267
-'#ifdef'=268
-'#ifndef'=269
-'#else'=270
-'#endif'=271
-'#include'=272
-'.mresource'=273
-'ldc.i8'=277
-'calli'=280
-'switch'=282
-'ldstr'=284
-'ldtoken'=286
-'.permission'=293
-'.permissionset'=294
-'.emitbyte'=295
-'.maxstack'=296
-'.entrypoint'=297
-'.zeroinit'=298
-'.locals'=299
-'.export'=300
-'.override'=301
-'.vtentry'=302
+'.publickey'=167
+'.publicKey'=168
+'.ver'=169
+'.locale'=170
+'.publickeytoken'=171
+'forwarder'=172
+'::'=176
+'...'=177
+'null'=178
+'nullref'=179
+'.hash'=180
+'string'=182
+'bool'=183
+'int8'=184
+'int16'=185
+'int32'=186
+'int64'=187
+'float32'=188
+'float64'=189
+'uint8'=190
+'uint16'=191
+'uint32'=192
+'uint64'=193
+'int'=194
+'uint'=195
+'type'=196
+'object'=197
+'.module'=198
+'value'=199
+'valuetype'=200
+'void'=201
+'enum'=202
+'custom'=203
+'fixed'=204
+'sysstring'=205
+'array'=206
+'variant'=207
+'currency'=208
+'syschar'=209
+'error'=210
+'decimal'=211
+'date'=212
+'bstr'=213
+'lpstr'=214
+'lpwstr'=215
+'lptstr'=216
+'objectref'=217
+'iunknown'=218
+'idispatch'=219
+'struct'=220
+'interface'=221
+'safearray'=222
+'byvalstr'=223
+'ansi'=224
+'tbstr'=225
+'method'=226
+'any'=227
+'lpstruct'=228
+'vector'=229
+'hresult'=230
+'carray'=231
+'userdefined'=232
+'record'=233
+'filetime'=234
+'blob'=235
+'stream'=236
+'storage'=237
+'streamed_object'=238
+'stored_object'=239
+'blob_object'=240
+'cf'=241
+'clsid'=242
+'instance'=243
+'explicit'=244
+'default'=245
+'vararg'=246
+'unmanaged'=247
+'cdecl'=248
+'stdcall'=249
+'thiscall'=250
+'fastcall'=251
+'!'=252
+'.param'=255
+'constraint'=256
+'.this'=257
+'.base'=258
+'.nester'=259
+'&'=260
+'*'=262
+'.'=265
+'+'=266
+'#define'=267
+'#undef'=268
+'#ifdef'=269
+'#ifndef'=270
+'#else'=271
+'#endif'=272
+'#include'=273
+'.mresource'=274
+'ldc.i8'=278
+'calli'=281
+'switch'=283
+'ldstr'=285
+'ldtoken'=287
+'.permission'=294
+'.permissionset'=295
+'.emitbyte'=296
+'.maxstack'=297
+'.entrypoint'=298
+'.zeroinit'=299
+'.locals'=300
+'.export'=301
+'.override'=302
+'.vtentry'=303
diff --git a/src/tools/ilasm/src/ILAssembler/gen/CILParser.cs b/src/tools/ilasm/src/ILAssembler/gen/CILParser.cs
index 6f6801484367b6..0f956c8e6f6b69 100644
--- a/src/tools/ilasm/src/ILAssembler/gen/CILParser.cs
+++ b/src/tools/ilasm/src/ILAssembler/gen/CILParser.cs
@@ -62,30 +62,31 @@ public const int
T__149=150, T__150=151, T__151=152, T__152=153, T__153=154, T__154=155,
T__155=156, T__156=157, T__157=158, T__158=159, T__159=160, T__160=161,
T__161=162, T__162=163, T__163=164, T__164=165, T__165=166, T__166=167,
- T__167=168, T__168=169, T__169=170, T__170=171, INT32=172, INT64=173,
- FLOAT64=174, DCOLON=175, ELLIPSIS=176, NULL=177, NULLREF=178, HASH=179,
- CHAR=180, STRING=181, BOOL=182, INT8=183, INT16=184, INT32_=185, INT64_=186,
- FLOAT32=187, FLOAT64_=188, UINT8=189, UINT16=190, UINT32=191, UINT64=192,
- INT=193, UINT=194, TYPE=195, OBJECT=196, MODULE=197, VALUE=198, VALUETYPE=199,
- VOID=200, ENUM=201, CUSTOM=202, FIXED=203, SYSSTRING=204, ARRAY=205, VARIANT=206,
- CURRENCY=207, SYSCHAR=208, ERROR=209, DECIMAL=210, DATE=211, BSTR=212,
- LPSTR=213, LPWSTR=214, LPTSTR=215, OBJECTREF=216, IUNKNOWN=217, IDISPATCH=218,
- STRUCT=219, INTERFACE=220, SAFEARRAY=221, BYVALSTR=222, ANSI=223, TBSTR=224,
- METHOD=225, ANY=226, LPSTRUCT=227, VECTOR=228, HRESULT=229, CARRAY=230,
- USERDEFINED=231, RECORD=232, FILETIME=233, BLOB=234, STREAM=235, STORAGE=236,
- STREAMED_OBJECT=237, STORED_OBJECT=238, BLOB_OBJECT=239, CF=240, CLSID=241,
- INSTANCE=242, EXPLICIT=243, DEFAULT=244, VARARG=245, UNMANAGED=246, CDECL=247,
- STDCALL=248, THISCALL=249, FASTCALL=250, TYPE_PARAMETER=251, METHOD_TYPE_PARAMETER=252,
- TYPEDREF=253, PARAM=254, CONSTRAINT=255, THIS=256, BASE=257, NESTER=258,
- REF=259, ARRAY_TYPE_NO_BOUNDS=260, PTR=261, QSTRING=262, SQSTRING=263,
- DOT=264, PLUS=265, PP_DEFINE=266, PP_UNDEF=267, PP_IFDEF=268, PP_IFNDEF=269,
- PP_ELSE=270, PP_ENDIF=271, PP_INCLUDE=272, MRESOURCE=273, INSTR_NONE=274,
- INSTR_VAR=275, INSTR_I=276, INSTR_I8=277, INSTR_R=278, INSTR_METHOD=279,
- INSTR_SIG=280, INSTR_BRTARGET=281, INSTR_SWITCH=282, INSTR_TYPE=283, INSTR_STRING=284,
- INSTR_FIELD=285, INSTR_TOK=286, DOTTEDNAME=287, ID=288, HEXBYTE=289, WS=290,
- SINGLE_LINE_COMMENT=291, COMMENT=292, PERMISSION=293, PERMISSIONSET=294,
- EMITBYTE=295, MAXSTACK=296, ENTRYPOINT=297, ZEROINIT=298, LOCALS=299,
- EXPORT=300, OVERRIDE=301, VTENTRY=302, IncludedFileEof=303, SyntheticIncludedFileEof=304;
+ T__167=168, T__168=169, T__169=170, T__170=171, T__171=172, INT32=173,
+ INT64=174, FLOAT64=175, DCOLON=176, ELLIPSIS=177, NULL=178, NULLREF=179,
+ HASH=180, CHAR=181, STRING=182, BOOL=183, INT8=184, INT16=185, INT32_=186,
+ INT64_=187, FLOAT32=188, FLOAT64_=189, UINT8=190, UINT16=191, UINT32=192,
+ UINT64=193, INT=194, UINT=195, TYPE=196, OBJECT=197, MODULE=198, VALUE=199,
+ VALUETYPE=200, VOID=201, ENUM=202, CUSTOM=203, FIXED=204, SYSSTRING=205,
+ ARRAY=206, VARIANT=207, CURRENCY=208, SYSCHAR=209, ERROR=210, DECIMAL=211,
+ DATE=212, BSTR=213, LPSTR=214, LPWSTR=215, LPTSTR=216, OBJECTREF=217,
+ IUNKNOWN=218, IDISPATCH=219, STRUCT=220, INTERFACE=221, SAFEARRAY=222,
+ BYVALSTR=223, ANSI=224, TBSTR=225, METHOD=226, ANY=227, LPSTRUCT=228,
+ VECTOR=229, HRESULT=230, CARRAY=231, USERDEFINED=232, RECORD=233, FILETIME=234,
+ BLOB=235, STREAM=236, STORAGE=237, STREAMED_OBJECT=238, STORED_OBJECT=239,
+ BLOB_OBJECT=240, CF=241, CLSID=242, INSTANCE=243, EXPLICIT=244, DEFAULT=245,
+ VARARG=246, UNMANAGED=247, CDECL=248, STDCALL=249, THISCALL=250, FASTCALL=251,
+ TYPE_PARAMETER=252, METHOD_TYPE_PARAMETER=253, TYPEDREF=254, PARAM=255,
+ CONSTRAINT=256, THIS=257, BASE=258, NESTER=259, REF=260, ARRAY_TYPE_NO_BOUNDS=261,
+ PTR=262, QSTRING=263, SQSTRING=264, DOT=265, PLUS=266, PP_DEFINE=267,
+ PP_UNDEF=268, PP_IFDEF=269, PP_IFNDEF=270, PP_ELSE=271, PP_ENDIF=272,
+ PP_INCLUDE=273, MRESOURCE=274, INSTR_NONE=275, INSTR_VAR=276, INSTR_I=277,
+ INSTR_I8=278, INSTR_R=279, INSTR_METHOD=280, INSTR_SIG=281, INSTR_BRTARGET=282,
+ INSTR_SWITCH=283, INSTR_TYPE=284, INSTR_STRING=285, INSTR_FIELD=286, INSTR_TOK=287,
+ DOTTEDNAME=288, ID=289, HEXBYTE=290, WS=291, SINGLE_LINE_COMMENT=292,
+ COMMENT=293, PERMISSION=294, PERMISSIONSET=295, EMITBYTE=296, MAXSTACK=297,
+ ENTRYPOINT=298, ZEROINIT=299, LOCALS=300, EXPORT=301, OVERRIDE=302, VTENTRY=303,
+ IncludedFileEof=304, SyntheticIncludedFileEof=305;
public const int
RULE_id = 0, RULE_dottedName = 1, RULE_dottedNamePart = 2, RULE_compQstring = 3,
RULE_decls = 4, RULE_decl = 5, RULE_subsystem = 6, RULE_corflags = 7,
@@ -180,53 +181,53 @@ public const int
null, "'native'", "'cil'", "'optil'", "'managed'", "'forwardref'", "'preservesig'",
"'runtime'", "'internalcall'", "'synchronized'", "'noinlining'", "'aggressiveinlining'",
"'nooptimization'", "'aggressiveoptimization'", "'async'", "'extended'",
- "'{'", "'}'", "'.subsystem'", "'.corflags'", "'.file'", "'alignment'",
- "'.imagebase'", "'.stackreserve'", "'.assembly'", "'.mscorlib'", "'.language'",
- "','", "'.typelist'", "'('", "')'", "';'", "'.typedef'", "'as'", "'.custom'",
- "'='", "'field'", "'property'", "'class'", "'extern'", "'.vtfixup'", "'['",
- "']'", "'at'", "'fromunmanaged'", "'callmostderived'", "'retainappdomain'",
- "'.vtable'", "'.namespace'", "'.class'", "'public'", "'private'", "'sealed'",
- "'abstract'", "'auto'", "'sequential'", "'unicode'", "'autochar'", "'import'",
- "'serializable'", "'windowsruntime'", "'nested'", "'family'", "'assembly'",
- "'famandassem'", "'famorassem'", "'beforefieldinit'", "'specialname'",
- "'rtspecialname'", "'flags'", "'extends'", "'implements'", "'.line'",
- "'#line'", "':'", "'nometadata'", "'retargetable'", "'noplatform'", "'legacy library'",
- "'x86'", "'amd64'", "'arm'", "'arm64'", "'bytearray'", "'()'", "'<'",
- "'>'", "'/'", "'algorithm'", "'iidparam'", "'pinned'", "'modreq'", "'modopt'",
- "'unsigned'", "'true'", "'false'", "'request'", "'demand'", "'assert'",
- "'deny'", "'permitonly'", "'linkcheck'", "'inheritcheck'", "'reqmin'",
- "'reqopt'", "'reqrefuse'", "'prejitgrant'", "'prejitdeny'", "'noncasdemand'",
- "'noncaslinkdemand'", "'noncasinheritance'", "'callconv'", "'mdtoken'",
- "'-'", "'byreflike'", "'.ctor'", "'.size'", "'.pack'", "'with'", "'.interfaceimpl'",
- "'.field'", "'marshal'", "'static'", "'initonly'", "'privatescope'", "'literal'",
- "'notserialized'", "'volatile'", "'.event'", "'.addon'", "'.removeon'",
- "'.fire'", "'.other'", "'.property'", "'.set'", "'.get'", "'in'", "'out'",
- "'opt'", "'.method'", "'final'", "'virtual'", "'strict'", "'hidebysig'",
- "'newslot'", "'unmanagedexp'", "'reqsecobj'", "'pinvokeimpl'", "'nomangle'",
- "'lasterr'", "'winapi'", "'bestfit'", "'on'", "'off'", "'charmaperror'",
+ "'volatile'", "'{'", "'}'", "'.subsystem'", "'.corflags'", "'.file'",
+ "'alignment'", "'.imagebase'", "'.stackreserve'", "'.assembly'", "'.mscorlib'",
+ "'.language'", "','", "'.typelist'", "'('", "')'", "';'", "'.typedef'",
+ "'as'", "'.custom'", "'='", "'field'", "'property'", "'class'", "'extern'",
+ "'.vtfixup'", "'['", "']'", "'at'", "'fromunmanaged'", "'callmostderived'",
+ "'retainappdomain'", "'.vtable'", "'.namespace'", "'.class'", "'public'",
+ "'private'", "'sealed'", "'abstract'", "'auto'", "'sequential'", "'unicode'",
+ "'autochar'", "'import'", "'serializable'", "'windowsruntime'", "'nested'",
+ "'family'", "'assembly'", "'famandassem'", "'famorassem'", "'beforefieldinit'",
+ "'specialname'", "'rtspecialname'", "'flags'", "'extends'", "'implements'",
+ "'.line'", "'#line'", "':'", "'nometadata'", "'retargetable'", "'noplatform'",
+ "'legacy library'", "'x86'", "'amd64'", "'arm'", "'arm64'", "'bytearray'",
+ "'()'", "'<'", "'>'", "'/'", "'algorithm'", "'unsigned'", "'iidparam'",
+ "'pinned'", "'modreq'", "'modopt'", "'true'", "'false'", "'request'",
+ "'demand'", "'assert'", "'deny'", "'permitonly'", "'linkcheck'", "'inheritcheck'",
+ "'reqmin'", "'reqopt'", "'reqrefuse'", "'prejitgrant'", "'prejitdeny'",
+ "'noncasdemand'", "'noncaslinkdemand'", "'noncasinheritance'", "'callconv'",
+ "'mdtoken'", "'-'", "'byreflike'", "'.ctor'", "'.size'", "'.pack'", "'with'",
+ "'.interfaceimpl'", "'.field'", "'marshal'", "'static'", "'initonly'",
+ "'privatescope'", "'literal'", "'notserialized'", "'.event'", "'.addon'",
+ "'.removeon'", "'.fire'", "'.other'", "'.property'", "'.set'", "'.get'",
+ "'in'", "'out'", "'opt'", "'.method'", "'final'", "'virtual'", "'strict'",
+ "'hidebysig'", "'newslot'", "'unmanagedexp'", "'reqsecobj'", "'pinvokeimpl'",
+ "'nomangle'", "'lasterr'", "'winapi'", "'bestfit'", "'on'", "'off'", "'charmaperror'",
"'.cctor'", "'il'", "'init'", "'.try'", "'to'", "'filter'", "'catch'",
- "'finally'", "'fault'", "'handler'", "'.data'", "'tls'", "'.publicKey'",
- "'.ver'", "'.locale'", "'.publickeytoken'", "'forwarder'", null, null,
- null, "'::'", "'...'", "'null'", "'nullref'", "'.hash'", null, "'string'",
- "'bool'", "'int8'", "'int16'", "'int32'", "'int64'", "'float32'", "'float64'",
- "'uint8'", "'uint16'", "'uint32'", "'uint64'", "'int'", "'uint'", "'type'",
- "'object'", "'.module'", "'value'", "'valuetype'", "'void'", "'enum'",
- "'custom'", "'fixed'", "'systring'", "'array'", "'variant'", "'currency'",
- "'syschar'", "'error'", "'decimal'", "'date'", "'bstr'", "'lpstr'", "'lpwstr'",
- "'lptstr'", "'objectref'", "'iunknown'", "'idispatch'", "'struct'", "'interface'",
- "'safearray'", "'byvalstr'", "'ansi'", "'tbstr'", "'method'", "'any'",
- "'lpstruct'", "'vector'", "'hresult'", "'carray'", "'userdefined'", "'record'",
- "'filetime'", "'blob'", "'stream'", "'storage'", "'streamed_object'",
- "'stored_object'", "'blob_object'", "'cf'", "'clsid'", "'instance'", "'explicit'",
- "'default'", "'vararg'", "'unmanaged'", "'cdecl'", "'stdcall'", "'thiscall'",
- "'fastcall'", "'!'", null, null, "'.param'", "'constraint'", "'.this'",
- "'.base'", "'.nester'", "'&'", null, "'*'", null, null, "'.'", "'+'",
- "'#define'", "'#undef'", "'#ifdef'", "'#ifndef'", "'#else'", "'#endif'",
- "'#include'", "'.mresource'", null, null, null, "'ldc.i8'", null, null,
- "'calli'", null, "'switch'", null, "'ldstr'", null, "'ldtoken'", null,
- null, null, null, null, null, "'.permission'", "'.permissionset'", "'.emitbyte'",
- "'.maxstack'", "'.entrypoint'", "'.zeroinit'", "'.locals'", "'.export'",
- "'.override'", "'.vtentry'"
+ "'finally'", "'fault'", "'handler'", "'.data'", "'tls'", "'.publickey'",
+ "'.publicKey'", "'.ver'", "'.locale'", "'.publickeytoken'", "'forwarder'",
+ null, null, null, "'::'", "'...'", "'null'", "'nullref'", "'.hash'", null,
+ "'string'", "'bool'", "'int8'", "'int16'", "'int32'", "'int64'", "'float32'",
+ "'float64'", "'uint8'", "'uint16'", "'uint32'", "'uint64'", "'int'", "'uint'",
+ "'type'", "'object'", "'.module'", "'value'", "'valuetype'", "'void'",
+ "'enum'", "'custom'", "'fixed'", "'sysstring'", "'array'", "'variant'",
+ "'currency'", "'syschar'", "'error'", "'decimal'", "'date'", "'bstr'",
+ "'lpstr'", "'lpwstr'", "'lptstr'", "'objectref'", "'iunknown'", "'idispatch'",
+ "'struct'", "'interface'", "'safearray'", "'byvalstr'", "'ansi'", "'tbstr'",
+ "'method'", "'any'", "'lpstruct'", "'vector'", "'hresult'", "'carray'",
+ "'userdefined'", "'record'", "'filetime'", "'blob'", "'stream'", "'storage'",
+ "'streamed_object'", "'stored_object'", "'blob_object'", "'cf'", "'clsid'",
+ "'instance'", "'explicit'", "'default'", "'vararg'", "'unmanaged'", "'cdecl'",
+ "'stdcall'", "'thiscall'", "'fastcall'", "'!'", null, null, "'.param'",
+ "'constraint'", "'.this'", "'.base'", "'.nester'", "'&'", null, "'*'",
+ null, null, "'.'", "'+'", "'#define'", "'#undef'", "'#ifdef'", "'#ifndef'",
+ "'#else'", "'#endif'", "'#include'", "'.mresource'", null, null, null,
+ "'ldc.i8'", null, null, "'calli'", null, "'switch'", null, "'ldstr'",
+ null, "'ldtoken'", null, null, null, null, null, null, "'.permission'",
+ "'.permissionset'", "'.emitbyte'", "'.maxstack'", "'.entrypoint'", "'.zeroinit'",
+ "'.locals'", "'.export'", "'.override'", "'.vtentry'"
};
private static readonly string[] _SymbolicNames = {
null, null, null, null, null, null, null, null, null, null, null, null,
@@ -243,7 +244,7 @@ public const int
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, "INT32", "INT64", "FLOAT64", "DCOLON", "ELLIPSIS",
+ null, null, null, null, null, "INT32", "INT64", "FLOAT64", "DCOLON", "ELLIPSIS",
"NULL", "NULLREF", "HASH", "CHAR", "STRING", "BOOL", "INT8", "INT16",
"INT32_", "INT64_", "FLOAT32", "FLOAT64_", "UINT8", "UINT16", "UINT32",
"UINT64", "INT", "UINT", "TYPE", "OBJECT", "MODULE", "VALUE", "VALUETYPE",
@@ -326,7 +327,7 @@ public IdContext id() {
{
State = 370;
_la = TokenStream.LA(1);
- if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 65534L) != 0) || ((((_la - 198)) & ~0x3f) == 0 && ((1L << (_la - 198)) & 299067162755073L) != 0) || _la==SQSTRING || _la==ID) ) {
+ if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 65534L) != 0) || ((((_la - 199)) & ~0x3f) == 0 && ((1L << (_la - 199)) & 299067162755073L) != 0) || _la==SQSTRING || _la==ID) ) {
ErrorHandler.RecoverInline(this);
}
else {
@@ -380,17 +381,15 @@ public DottedNameContext dottedName() {
int _alt;
State = 383;
ErrorHandler.Sync(this);
- switch (TokenStream.LA(1)) {
- case DOTTEDNAME:
+ switch ( Interpreter.AdaptivePredict(TokenStream,1,Context) ) {
+ case 1:
EnterOuterAlt(_localctx, 1);
{
State = 372;
Match(DOTTEDNAME);
}
break;
- case VALUE:
- case INSTANCE:
- case ID:
+ case 2:
EnterOuterAlt(_localctx, 2);
{
{
@@ -417,15 +416,13 @@ public DottedNameContext dottedName() {
}
}
break;
- case SQSTRING:
+ case 3:
EnterOuterAlt(_localctx, 3);
{
State = 382;
Match(SQSTRING);
}
break;
- default:
- throw new NoViableAltException(this);
}
}
catch (RecognitionException re) {
@@ -443,6 +440,8 @@ public partial class DottedNamePartContext : ParserRuleContext {
[System.Diagnostics.DebuggerNonUserCode] public ITerminalNode ID() { return GetToken(CILParser.ID, 0); }
[System.Diagnostics.DebuggerNonUserCode] public ITerminalNode VALUE() { return GetToken(CILParser.VALUE, 0); }
[System.Diagnostics.DebuggerNonUserCode] public ITerminalNode INSTANCE() { return GetToken(CILParser.INSTANCE, 0); }
+ [System.Diagnostics.DebuggerNonUserCode] public ITerminalNode SQSTRING() { return GetToken(CILParser.SQSTRING, 0); }
+ [System.Diagnostics.DebuggerNonUserCode] public ITerminalNode DOTTEDNAME() { return GetToken(CILParser.DOTTEDNAME, 0); }
public DottedNamePartContext(ParserRuleContext parent, int invokingState)
: base(parent, invokingState)
{
@@ -466,7 +465,7 @@ public DottedNamePartContext dottedNamePart() {
{
State = 385;
_la = TokenStream.LA(1);
- if ( !(_la==VALUE || _la==INSTANCE || _la==ID) ) {
+ if ( !(_la==T__15 || _la==VALUE || _la==INSTANCE || ((((_la - 264)) & ~0x3f) == 0 && ((1L << (_la - 264)) & 50331649L) != 0)) ) {
ErrorHandler.RecoverInline(this);
}
else {
@@ -580,7 +579,7 @@ public DeclsContext decls() {
State = 399;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 986285952729088L) != 0) || ((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & 281474976710659L) != 0) || ((((_la - 139)) & ~0x3f) == 0 && ((1L << (_la - 139)) & 864691128522244097L) != 0) || ((((_la - 242)) & ~0x3f) == 0 && ((1L << (_la - 242)) & 6860956837609473L) != 0)) {
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1972571905523712L) != 0) || ((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & 281474976710659L) != 0) || ((((_la - 139)) & ~0x3f) == 0 && ((1L << (_la - 139)) & 1729382256977379329L) != 0) || ((((_la - 243)) & ~0x3f) == 0 && ((1L << (_la - 243)) & 6860956837609473L) != 0)) {
{
{
State = 396;
@@ -728,11 +727,11 @@ public DeclContext decl() {
State = 402;
classHead();
State = 403;
- Match(T__15);
+ Match(T__16);
State = 404;
classDecls();
State = 405;
- Match(T__16);
+ Match(T__17);
}
break;
case 2:
@@ -741,11 +740,11 @@ public DeclContext decl() {
State = 407;
nameSpaceHead();
State = 408;
- Match(T__15);
+ Match(T__16);
State = 409;
decls();
State = 410;
- Match(T__16);
+ Match(T__17);
}
break;
case 3:
@@ -754,11 +753,11 @@ public DeclContext decl() {
State = 412;
methodHead();
State = 413;
- Match(T__15);
+ Match(T__16);
State = 414;
methodDecls();
State = 415;
- Match(T__16);
+ Match(T__17);
}
break;
case 4:
@@ -816,11 +815,11 @@ public DeclContext decl() {
State = 424;
assemblyRefHead();
State = 425;
- Match(T__15);
+ Match(T__16);
State = 426;
assemblyRefDecls();
State = 427;
- Match(T__16);
+ Match(T__17);
}
break;
case 12:
@@ -829,11 +828,11 @@ public DeclContext decl() {
State = 429;
exptypeHead();
State = 430;
- Match(T__15);
+ Match(T__16);
State = 431;
exptypeDecls();
State = 432;
- Match(T__16);
+ Match(T__17);
}
break;
case 13:
@@ -842,11 +841,11 @@ public DeclContext decl() {
State = 434;
manifestResHead();
State = 435;
- Match(T__15);
+ Match(T__16);
State = 436;
manifestResDecls();
State = 437;
- Match(T__16);
+ Match(T__17);
}
break;
case 14:
@@ -978,7 +977,7 @@ public SubsystemContext subsystem() {
EnterOuterAlt(_localctx, 1);
{
State = 454;
- Match(T__17);
+ Match(T__18);
State = 455;
int32();
}
@@ -1019,7 +1018,7 @@ public CorflagsContext corflags() {
EnterOuterAlt(_localctx, 1);
{
State = 457;
- Match(T__18);
+ Match(T__19);
State = 458;
int32();
}
@@ -1060,9 +1059,9 @@ public AlignmentContext alignment() {
EnterOuterAlt(_localctx, 1);
{
State = 460;
- Match(T__19);
- State = 461;
Match(T__20);
+ State = 461;
+ Match(T__21);
State = 462;
int32();
}
@@ -1103,7 +1102,7 @@ public ImagebaseContext imagebase() {
EnterOuterAlt(_localctx, 1);
{
State = 464;
- Match(T__21);
+ Match(T__22);
State = 465;
int64();
}
@@ -1144,7 +1143,7 @@ public StackreserveContext stackreserve() {
EnterOuterAlt(_localctx, 1);
{
State = 467;
- Match(T__22);
+ Match(T__23);
State = 468;
int64();
}
@@ -1191,17 +1190,17 @@ public AssemblyBlockContext assemblyBlock() {
EnterOuterAlt(_localctx, 1);
{
State = 470;
- Match(T__23);
+ Match(T__24);
State = 471;
asmAttr();
State = 472;
dottedName();
State = 473;
- Match(T__15);
+ Match(T__16);
State = 474;
assemblyDecls();
State = 475;
- Match(T__16);
+ Match(T__17);
}
}
catch (RecognitionException re) {
@@ -1237,7 +1236,7 @@ public MscorlibContext mscorlib() {
EnterOuterAlt(_localctx, 1);
{
State = 477;
- Match(T__24);
+ Match(T__25);
}
}
catch (RecognitionException re) {
@@ -1283,7 +1282,7 @@ public LanguageDeclContext languageDecl() {
EnterOuterAlt(_localctx, 1);
{
State = 479;
- Match(T__25);
+ Match(T__26);
State = 480;
languageString();
}
@@ -1292,11 +1291,11 @@ public LanguageDeclContext languageDecl() {
EnterOuterAlt(_localctx, 2);
{
State = 481;
- Match(T__25);
+ Match(T__26);
State = 482;
languageString();
State = 483;
- Match(T__26);
+ Match(T__27);
State = 484;
languageString();
}
@@ -1305,15 +1304,15 @@ public LanguageDeclContext languageDecl() {
EnterOuterAlt(_localctx, 3);
{
State = 486;
- Match(T__25);
+ Match(T__26);
State = 487;
languageString();
State = 488;
- Match(T__26);
+ Match(T__27);
State = 489;
languageString();
State = 490;
- Match(T__26);
+ Match(T__27);
State = 491;
languageString();
}
@@ -1406,13 +1405,13 @@ public TypelistContext typelist() {
EnterOuterAlt(_localctx, 1);
{
State = 497;
- Match(T__27);
+ Match(T__28);
State = 498;
- Match(T__15);
+ Match(T__16);
State = 502;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while (_la==T__40 || _la==T__111 || ((((_la - 198)) & ~0x3f) == 0 && ((1L << (_la - 198)) & 2017630225248026625L) != 0) || ((((_la - 263)) & ~0x3f) == 0 && ((1L << (_la - 263)) & 50331649L) != 0)) {
+ while (_la==T__15 || _la==T__41 || _la==T__112 || ((((_la - 199)) & ~0x3f) == 0 && ((1L << (_la - 199)) & 2017630225248026625L) != 0) || ((((_la - 264)) & ~0x3f) == 0 && ((1L << (_la - 264)) & 50331649L) != 0)) {
{
{
State = 499;
@@ -1424,7 +1423,7 @@ public TypelistContext typelist() {
_la = TokenStream.LA(1);
}
State = 505;
- Match(T__16);
+ Match(T__17);
}
}
catch (RecognitionException re) {
@@ -1582,11 +1581,11 @@ public Float64Context float64() {
State = 516;
Match(FLOAT32);
State = 517;
- Match(T__28);
+ Match(T__29);
State = 518;
int32();
State = 519;
- Match(T__29);
+ Match(T__30);
}
break;
case 5:
@@ -1595,11 +1594,11 @@ public Float64Context float64() {
State = 521;
Match(FLOAT64_);
State = 522;
- Match(T__28);
+ Match(T__29);
State = 523;
int64();
State = 524;
- Match(T__29);
+ Match(T__30);
}
break;
}
@@ -1775,7 +1774,7 @@ public CompControlContext compControl() {
EnterOuterAlt(_localctx, 9);
{
State = 547;
- Match(T__30);
+ Match(T__31);
}
break;
}
@@ -1835,11 +1834,11 @@ public TypedefDeclContext typedefDecl() {
EnterOuterAlt(_localctx, 1);
{
State = 550;
- Match(T__31);
+ Match(T__32);
State = 551;
type();
State = 552;
- Match(T__32);
+ Match(T__33);
State = 553;
dottedName();
}
@@ -1848,11 +1847,11 @@ public TypedefDeclContext typedefDecl() {
EnterOuterAlt(_localctx, 2);
{
State = 555;
- Match(T__31);
+ Match(T__32);
State = 556;
className();
State = 557;
- Match(T__32);
+ Match(T__33);
State = 558;
dottedName();
}
@@ -1861,11 +1860,11 @@ public TypedefDeclContext typedefDecl() {
EnterOuterAlt(_localctx, 3);
{
State = 560;
- Match(T__31);
+ Match(T__32);
State = 561;
memberRef();
State = 562;
- Match(T__32);
+ Match(T__33);
State = 563;
dottedName();
}
@@ -1874,11 +1873,11 @@ public TypedefDeclContext typedefDecl() {
EnterOuterAlt(_localctx, 4);
{
State = 565;
- Match(T__31);
+ Match(T__32);
State = 566;
customDescr();
State = 567;
- Match(T__32);
+ Match(T__33);
State = 568;
dottedName();
}
@@ -1887,11 +1886,11 @@ public TypedefDeclContext typedefDecl() {
EnterOuterAlt(_localctx, 5);
{
State = 570;
- Match(T__31);
+ Match(T__32);
State = 571;
customDescrWithOwner();
State = 572;
- Match(T__32);
+ Match(T__33);
State = 573;
dottedName();
}
@@ -1947,7 +1946,7 @@ public CustomDescrContext customDescr() {
EnterOuterAlt(_localctx, 1);
{
State = 577;
- Match(T__33);
+ Match(T__34);
State = 578;
customType();
}
@@ -1956,11 +1955,11 @@ public CustomDescrContext customDescr() {
EnterOuterAlt(_localctx, 2);
{
State = 579;
- Match(T__33);
+ Match(T__34);
State = 580;
customType();
State = 581;
- Match(T__34);
+ Match(T__35);
State = 582;
compQstring();
}
@@ -1969,34 +1968,34 @@ public CustomDescrContext customDescr() {
EnterOuterAlt(_localctx, 3);
{
State = 584;
- Match(T__33);
+ Match(T__34);
State = 585;
customType();
State = 586;
- Match(T__34);
+ Match(T__35);
State = 587;
- Match(T__15);
+ Match(T__16);
State = 588;
customBlobDescr();
State = 589;
- Match(T__16);
+ Match(T__17);
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
State = 591;
- Match(T__33);
+ Match(T__34);
State = 592;
customType();
State = 593;
- Match(T__34);
+ Match(T__35);
State = 594;
- Match(T__28);
+ Match(T__29);
State = 595;
bytes();
State = 596;
- Match(T__29);
+ Match(T__30);
}
break;
}
@@ -2053,13 +2052,13 @@ public CustomDescrWithOwnerContext customDescrWithOwner() {
EnterOuterAlt(_localctx, 1);
{
State = 600;
- Match(T__33);
+ Match(T__34);
State = 601;
- Match(T__28);
+ Match(T__29);
State = 602;
ownerType();
State = 603;
- Match(T__29);
+ Match(T__30);
State = 604;
customType();
}
@@ -2068,17 +2067,17 @@ public CustomDescrWithOwnerContext customDescrWithOwner() {
EnterOuterAlt(_localctx, 2);
{
State = 606;
- Match(T__33);
+ Match(T__34);
State = 607;
- Match(T__28);
+ Match(T__29);
State = 608;
ownerType();
State = 609;
- Match(T__29);
+ Match(T__30);
State = 610;
customType();
State = 611;
- Match(T__34);
+ Match(T__35);
State = 612;
compQstring();
}
@@ -2087,46 +2086,46 @@ public CustomDescrWithOwnerContext customDescrWithOwner() {
EnterOuterAlt(_localctx, 3);
{
State = 614;
- Match(T__33);
+ Match(T__34);
State = 615;
- Match(T__28);
+ Match(T__29);
State = 616;
ownerType();
State = 617;
- Match(T__29);
+ Match(T__30);
State = 618;
customType();
State = 619;
- Match(T__34);
+ Match(T__35);
State = 620;
- Match(T__15);
+ Match(T__16);
State = 621;
customBlobDescr();
State = 622;
- Match(T__16);
+ Match(T__17);
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
State = 624;
- Match(T__33);
+ Match(T__34);
State = 625;
- Match(T__28);
+ Match(T__29);
State = 626;
ownerType();
State = 627;
- Match(T__29);
+ Match(T__30);
State = 628;
customType();
State = 629;
- Match(T__34);
+ Match(T__35);
State = 630;
- Match(T__28);
+ Match(T__29);
State = 631;
bytes();
State = 632;
- Match(T__29);
+ Match(T__30);
}
break;
}
@@ -2323,7 +2322,7 @@ public CustomBlobArgsContext customBlobArgs() {
State = 647;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__82:
+ case T__83:
case CHAR:
case STRING:
case BOOL:
@@ -2344,7 +2343,7 @@ public CustomBlobArgsContext customBlobArgs() {
serInit();
}
break;
- case T__30:
+ case T__31:
case PP_DEFINE:
case PP_UNDEF:
case PP_IFDEF:
@@ -2434,13 +2433,13 @@ public CustomBlobNVPairsContext customBlobNVPairs() {
State = 661;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 208305913856L) != 0) || ((((_la - 266)) & ~0x3f) == 0 && ((1L << (_la - 266)) & 127L) != 0)) {
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 416611827712L) != 0) || ((((_la - 267)) & ~0x3f) == 0 && ((1L << (_la - 267)) & 127L) != 0)) {
{
State = 659;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__35:
case T__36:
+ case T__37:
{
State = 652;
fieldOrProp();
@@ -2449,12 +2448,12 @@ public CustomBlobNVPairsContext customBlobNVPairs() {
State = 654;
dottedName();
State = 655;
- Match(T__34);
+ Match(T__35);
State = 656;
serInit();
}
break;
- case T__30:
+ case T__31:
case PP_DEFINE:
case PP_UNDEF:
case PP_IFDEF:
@@ -2512,7 +2511,7 @@ public FieldOrPropContext fieldOrProp() {
{
State = 664;
_la = TokenStream.LA(1);
- if ( !(_la==T__35 || _la==T__36) ) {
+ if ( !(_la==T__36 || _la==T__37) ) {
ErrorHandler.RecoverInline(this);
}
else {
@@ -2652,7 +2651,7 @@ public SerializTypeElementContext serializTypeElement() {
State = 674;
Match(ENUM);
State = 675;
- Match(T__37);
+ Match(T__38);
State = 676;
Match(SQSTRING);
}
@@ -2711,7 +2710,7 @@ public ModuleHeadContext moduleHead() {
State = 681;
Match(MODULE);
State = 682;
- Match(T__38);
+ Match(T__39);
State = 683;
dottedName();
}
@@ -2776,17 +2775,17 @@ public VtfixupDeclContext vtfixupDecl() {
EnterOuterAlt(_localctx, 1);
{
State = 689;
- Match(T__39);
- State = 690;
Match(T__40);
+ State = 690;
+ Match(T__41);
State = 691;
int32();
State = 692;
- Match(T__41);
+ Match(T__42);
State = 693;
vtfixupAttr(0);
State = 694;
- Match(T__42);
+ Match(T__43);
State = 695;
id();
}
@@ -2879,7 +2878,7 @@ private VtfixupAttrContext vtfixupAttr(int _p) {
State = 702;
if (!(Precpred(Context, 3))) throw new FailedPredicateException(this, "Precpred(Context, 3)");
State = 703;
- Match(T__43);
+ Match(T__44);
}
break;
case 4:
@@ -2889,7 +2888,7 @@ private VtfixupAttrContext vtfixupAttr(int _p) {
State = 704;
if (!(Precpred(Context, 2))) throw new FailedPredicateException(this, "Precpred(Context, 2)");
State = 705;
- Match(T__44);
+ Match(T__45);
}
break;
case 5:
@@ -2899,7 +2898,7 @@ private VtfixupAttrContext vtfixupAttr(int _p) {
State = 706;
if (!(Precpred(Context, 1))) throw new FailedPredicateException(this, "Precpred(Context, 1)");
State = 707;
- Match(T__45);
+ Match(T__46);
}
break;
}
@@ -2947,15 +2946,15 @@ public VtableDeclContext vtableDecl() {
EnterOuterAlt(_localctx, 1);
{
State = 713;
- Match(T__46);
+ Match(T__47);
State = 714;
- Match(T__34);
+ Match(T__35);
State = 715;
- Match(T__28);
+ Match(T__29);
State = 716;
bytes();
State = 717;
- Match(T__29);
+ Match(T__30);
}
}
catch (RecognitionException re) {
@@ -2994,7 +2993,7 @@ public NameSpaceHeadContext nameSpaceHead() {
EnterOuterAlt(_localctx, 1);
{
State = 719;
- Match(T__47);
+ Match(T__48);
State = 720;
dottedName();
}
@@ -3051,7 +3050,7 @@ public ClassHeadContext classHead() {
EnterOuterAlt(_localctx, 1);
{
State = 722;
- Match(T__48);
+ Match(T__49);
State = 726;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,23,Context);
@@ -3123,14 +3122,14 @@ public ClassAttrContext classAttr() {
EnterOuterAlt(_localctx, 1);
{
State = 734;
- Match(T__49);
+ Match(T__50);
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
State = 735;
- Match(T__50);
+ Match(T__51);
}
break;
case 3:
@@ -3158,28 +3157,28 @@ public ClassAttrContext classAttr() {
EnterOuterAlt(_localctx, 6);
{
State = 739;
- Match(T__51);
+ Match(T__52);
}
break;
case 7:
EnterOuterAlt(_localctx, 7);
{
State = 740;
- Match(T__52);
+ Match(T__53);
}
break;
case 8:
EnterOuterAlt(_localctx, 8);
{
State = 741;
- Match(T__53);
+ Match(T__54);
}
break;
case 9:
EnterOuterAlt(_localctx, 9);
{
State = 742;
- Match(T__54);
+ Match(T__55);
}
break;
case 10:
@@ -3207,123 +3206,123 @@ public ClassAttrContext classAttr() {
EnterOuterAlt(_localctx, 13);
{
State = 746;
- Match(T__55);
+ Match(T__56);
}
break;
case 14:
EnterOuterAlt(_localctx, 14);
{
State = 747;
- Match(T__56);
+ Match(T__57);
}
break;
case 15:
EnterOuterAlt(_localctx, 15);
{
State = 748;
- Match(T__57);
+ Match(T__58);
}
break;
case 16:
EnterOuterAlt(_localctx, 16);
{
State = 749;
- Match(T__58);
+ Match(T__59);
}
break;
case 17:
EnterOuterAlt(_localctx, 17);
{
State = 750;
- Match(T__59);
+ Match(T__60);
}
break;
case 18:
EnterOuterAlt(_localctx, 18);
{
State = 751;
- Match(T__60);
+ Match(T__61);
State = 752;
- Match(T__49);
+ Match(T__50);
}
break;
case 19:
EnterOuterAlt(_localctx, 19);
{
State = 753;
- Match(T__60);
+ Match(T__61);
State = 754;
- Match(T__50);
+ Match(T__51);
}
break;
case 20:
EnterOuterAlt(_localctx, 20);
{
State = 755;
- Match(T__60);
- State = 756;
Match(T__61);
+ State = 756;
+ Match(T__62);
}
break;
case 21:
EnterOuterAlt(_localctx, 21);
{
State = 757;
- Match(T__60);
+ Match(T__61);
State = 758;
- Match(T__62);
+ Match(T__63);
}
break;
case 22:
EnterOuterAlt(_localctx, 22);
{
State = 759;
- Match(T__60);
+ Match(T__61);
State = 760;
- Match(T__63);
+ Match(T__64);
}
break;
case 23:
EnterOuterAlt(_localctx, 23);
{
State = 761;
- Match(T__60);
+ Match(T__61);
State = 762;
- Match(T__64);
+ Match(T__65);
}
break;
case 24:
EnterOuterAlt(_localctx, 24);
{
State = 763;
- Match(T__65);
+ Match(T__66);
}
break;
case 25:
EnterOuterAlt(_localctx, 25);
{
State = 764;
- Match(T__66);
+ Match(T__67);
}
break;
case 26:
EnterOuterAlt(_localctx, 26);
{
State = 765;
- Match(T__67);
+ Match(T__68);
}
break;
case 27:
EnterOuterAlt(_localctx, 27);
{
State = 766;
- Match(T__68);
+ Match(T__69);
State = 767;
- Match(T__28);
+ Match(T__29);
State = 768;
int32();
State = 769;
- Match(T__29);
+ Match(T__30);
}
break;
}
@@ -3364,17 +3363,17 @@ public ExtendsClauseContext extendsClause() {
State = 776;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__15:
- case T__70:
+ case T__16:
+ case T__71:
EnterOuterAlt(_localctx, 1);
{
}
break;
- case T__69:
+ case T__70:
EnterOuterAlt(_localctx, 2);
{
State = 774;
- Match(T__69);
+ Match(T__70);
State = 775;
typeSpec();
}
@@ -3419,16 +3418,16 @@ public ImplClauseContext implClause() {
State = 781;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__15:
+ case T__16:
EnterOuterAlt(_localctx, 1);
{
}
break;
- case T__70:
+ case T__71:
EnterOuterAlt(_localctx, 2);
{
State = 779;
- Match(T__70);
+ Match(T__71);
State = 780;
implList();
}
@@ -3479,7 +3478,7 @@ public ClassDeclsContext classDecls() {
State = 786;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 562969347883008L) != 0) || ((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & 2378375592274821123L) != 0) || ((((_la - 139)) & ~0x3f) == 0 && ((1L << (_la - 139)) & 576460752370532353L) != 0) || ((((_la - 242)) & ~0x3f) == 0 && ((1L << (_la - 242)) & 871552083145265153L) != 0)) {
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1125938695831552L) != 0) || ((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & 1189425290649010179L) != 0) || ((((_la - 139)) & ~0x3f) == 0 && ((1L << (_la - 139)) & 1152921504673955841L) != 0) || ((((_la - 243)) & ~0x3f) == 0 && ((1L << (_la - 243)) & 871552083145265153L) != 0)) {
{
{
State = 783;
@@ -3541,7 +3540,7 @@ public ImplListContext implList() {
State = 789;
typeSpec();
State = 790;
- Match(T__26);
+ Match(T__27);
}
}
}
@@ -3588,7 +3587,7 @@ public EsHeadContext esHead() {
{
State = 799;
_la = TokenStream.LA(1);
- if ( !(_la==T__71 || _la==T__72) ) {
+ if ( !(_la==T__72 || _la==T__73) ) {
ErrorHandler.RecoverInline(this);
}
else {
@@ -3669,7 +3668,7 @@ public ExtSourceSpecContext extSourceSpec() {
State = 809;
int32();
State = 810;
- Match(T__73);
+ Match(T__74);
State = 811;
int32();
State = 812;
@@ -3684,7 +3683,7 @@ public ExtSourceSpecContext extSourceSpec() {
State = 815;
int32();
State = 816;
- Match(T__73);
+ Match(T__74);
State = 817;
int32();
}
@@ -3697,11 +3696,11 @@ public ExtSourceSpecContext extSourceSpec() {
State = 820;
int32();
State = 821;
- Match(T__73);
+ Match(T__74);
State = 822;
int32();
State = 823;
- Match(T__26);
+ Match(T__27);
State = 824;
int32();
State = 825;
@@ -3716,11 +3715,11 @@ public ExtSourceSpecContext extSourceSpec() {
State = 828;
int32();
State = 829;
- Match(T__73);
+ Match(T__74);
State = 830;
int32();
State = 831;
- Match(T__26);
+ Match(T__27);
State = 832;
int32();
}
@@ -3733,11 +3732,11 @@ public ExtSourceSpecContext extSourceSpec() {
State = 835;
int32();
State = 836;
- Match(T__26);
+ Match(T__27);
State = 837;
int32();
State = 838;
- Match(T__73);
+ Match(T__74);
State = 839;
int32();
State = 840;
@@ -3752,11 +3751,11 @@ public ExtSourceSpecContext extSourceSpec() {
State = 843;
int32();
State = 844;
- Match(T__26);
+ Match(T__27);
State = 845;
int32();
State = 846;
- Match(T__73);
+ Match(T__74);
State = 847;
int32();
}
@@ -3769,15 +3768,15 @@ public ExtSourceSpecContext extSourceSpec() {
State = 850;
int32();
State = 851;
- Match(T__26);
+ Match(T__27);
State = 852;
int32();
State = 853;
- Match(T__73);
+ Match(T__74);
State = 854;
int32();
State = 855;
- Match(T__26);
+ Match(T__27);
State = 856;
int32();
State = 857;
@@ -3792,15 +3791,15 @@ public ExtSourceSpecContext extSourceSpec() {
State = 860;
int32();
State = 861;
- Match(T__26);
+ Match(T__27);
State = 862;
int32();
State = 863;
- Match(T__73);
+ Match(T__74);
State = 864;
int32();
State = 865;
- Match(T__26);
+ Match(T__27);
State = 866;
int32();
}
@@ -3824,7 +3823,7 @@ public ExtSourceSpecContext extSourceSpec() {
State = 873;
int32();
State = 874;
- Match(T__73);
+ Match(T__74);
State = 875;
int32();
State = 876;
@@ -3839,11 +3838,11 @@ public ExtSourceSpecContext extSourceSpec() {
State = 879;
int32();
State = 880;
- Match(T__73);
+ Match(T__74);
State = 881;
int32();
State = 882;
- Match(T__26);
+ Match(T__27);
State = 883;
int32();
State = 884;
@@ -3858,11 +3857,11 @@ public ExtSourceSpecContext extSourceSpec() {
State = 887;
int32();
State = 888;
- Match(T__26);
+ Match(T__27);
State = 889;
int32();
State = 890;
- Match(T__73);
+ Match(T__74);
State = 891;
int32();
State = 892;
@@ -3877,15 +3876,15 @@ public ExtSourceSpecContext extSourceSpec() {
State = 895;
int32();
State = 896;
- Match(T__26);
+ Match(T__27);
State = 897;
int32();
State = 898;
- Match(T__73);
+ Match(T__74);
State = 899;
int32();
State = 900;
- Match(T__26);
+ Match(T__27);
State = 901;
int32();
State = 902;
@@ -3951,11 +3950,11 @@ public FileDeclContext fileDecl() {
EnterOuterAlt(_localctx, 1);
{
State = 906;
- Match(T__19);
+ Match(T__20);
State = 910;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while (_la==T__74) {
+ while (_la==T__75) {
{
{
State = 907;
@@ -3973,13 +3972,13 @@ public FileDeclContext fileDecl() {
State = 915;
Match(HASH);
State = 916;
- Match(T__34);
+ Match(T__35);
State = 917;
- Match(T__28);
+ Match(T__29);
State = 918;
bytes();
State = 919;
- Match(T__29);
+ Match(T__30);
State = 920;
fileEntry();
}
@@ -3988,11 +3987,11 @@ public FileDeclContext fileDecl() {
EnterOuterAlt(_localctx, 2);
{
State = 922;
- Match(T__19);
+ Match(T__20);
State = 926;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while (_la==T__74) {
+ while (_la==T__75) {
{
{
State = 923;
@@ -4044,7 +4043,7 @@ public FileAttrContext fileAttr() {
EnterOuterAlt(_localctx, 1);
{
State = 934;
- Match(T__74);
+ Match(T__75);
}
}
catch (RecognitionException re) {
@@ -4081,26 +4080,27 @@ public FileEntryContext fileEntry() {
State = 938;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__16:
+ case T__15:
case T__17:
case T__18:
case T__19:
- case T__21:
+ case T__20:
case T__22:
case T__23:
case T__24:
case T__25:
- case T__27:
- case T__30:
+ case T__26:
+ case T__28:
case T__31:
- case T__33:
- case T__39:
- case T__46:
- case T__47:
- case T__48:
- case T__71:
+ case T__32:
+ case T__34:
+ case T__40:
+ case T__47:
+ case T__48:
+ case T__49:
case T__72:
- case T__119:
+ case T__73:
+ case T__120:
case T__138:
case T__164:
case HASH:
@@ -4170,7 +4170,7 @@ public AsmAttrAnyContext asmAttrAny() {
{
State = 940;
_la = TokenStream.LA(1);
- if ( !(_la==T__1 || _la==T__59 || ((((_la - 76)) & ~0x3f) == 0 && ((1L << (_la - 76)) & 127L) != 0)) ) {
+ if ( !(_la==T__1 || _la==T__60 || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & 127L) != 0)) ) {
ErrorHandler.RecoverInline(this);
}
else {
@@ -4221,7 +4221,7 @@ public AsmAttrContext asmAttr() {
State = 945;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while (_la==T__1 || _la==T__59 || ((((_la - 76)) & ~0x3f) == 0 && ((1L << (_la - 76)) & 127L) != 0)) {
+ while (_la==T__1 || _la==T__60 || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & 127L) != 0)) {
{
{
State = 942;
@@ -4830,7 +4830,7 @@ public InstrContext instr() {
InstrContext _localctx = new InstrContext(Context, State);
EnterRule(_localctx, 126, RULE_instr);
try {
- State = 1053;
+ State = 1056;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,35,Context) ) {
case 1:
@@ -4900,11 +4900,11 @@ public InstrContext instr() {
State = 993;
instr_r();
State = 994;
- Match(T__28);
+ Match(T__29);
State = 995;
bytes();
State = 996;
- Match(T__29);
+ Match(T__30);
}
break;
case 9:
@@ -4913,13 +4913,13 @@ public InstrContext instr() {
State = 998;
instr_r();
State = 999;
- Match(T__82);
+ Match(T__83);
State = 1000;
- Match(T__28);
+ Match(T__29);
State = 1001;
bytes();
State = 1002;
- Match(T__29);
+ Match(T__30);
}
break;
case 10:
@@ -4993,11 +4993,11 @@ public InstrContext instr() {
State = 1026;
Match(ANSI);
State = 1027;
- Match(T__28);
+ Match(T__29);
State = 1028;
compQstring();
State = 1029;
- Match(T__29);
+ Match(T__30);
}
break;
case 18:
@@ -5006,13 +5006,13 @@ public InstrContext instr() {
State = 1031;
instr_string();
State = 1032;
- Match(T__82);
+ Match(T__83);
State = 1033;
- Match(T__28);
+ Match(T__29);
State = 1034;
bytes();
State = 1035;
- Match(T__29);
+ Match(T__30);
}
break;
case 19:
@@ -5041,22 +5041,31 @@ public InstrContext instr() {
EnterOuterAlt(_localctx, 21);
{
State = 1045;
- instr_switch();
+ instr_tok();
State = 1046;
- Match(T__28);
- State = 1047;
- labels();
- State = 1048;
- Match(T__29);
+ int32();
}
break;
case 22:
EnterOuterAlt(_localctx, 22);
{
- State = 1050;
+ State = 1048;
instr_switch();
+ State = 1049;
+ Match(T__29);
+ State = 1050;
+ labels();
State = 1051;
- Match(T__83);
+ Match(T__30);
+ }
+ break;
+ case 23:
+ EnterOuterAlt(_localctx, 23);
+ {
+ State = 1053;
+ instr_switch();
+ State = 1054;
+ Match(T__84);
}
break;
}
@@ -5104,10 +5113,10 @@ public LabelsContext labels() {
EnterRule(_localctx, 128, RULE_labels);
try {
int _alt;
- State = 1071;
+ State = 1074;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__29:
+ case T__30:
EnterOuterAlt(_localctx, 1);
{
}
@@ -5135,14 +5144,14 @@ public LabelsContext labels() {
case ID:
EnterOuterAlt(_localctx, 2);
{
- State = 1064;
+ State = 1067;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,37,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 1058;
+ State = 1061;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
case T__0:
@@ -5166,29 +5175,29 @@ public LabelsContext labels() {
case SQSTRING:
case ID:
{
- State = 1056;
+ State = 1059;
id();
}
break;
case INT32:
{
- State = 1057;
+ State = 1060;
int32();
}
break;
default:
throw new NoViableAltException(this);
}
- State = 1060;
- Match(T__26);
+ State = 1063;
+ Match(T__27);
}
}
}
- State = 1066;
+ State = 1069;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,37,Context);
}
- State = 1069;
+ State = 1072;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
case T__0:
@@ -5212,13 +5221,13 @@ public LabelsContext labels() {
case SQSTRING:
case ID:
{
- State = 1067;
+ State = 1070;
id();
}
break;
case INT32:
{
- State = 1068;
+ State = 1071;
int32();
}
break;
@@ -5270,30 +5279,30 @@ public TypeArgsContext typeArgs() {
int _alt;
EnterOuterAlt(_localctx, 1);
{
- State = 1073;
- Match(T__84);
- State = 1079;
+ State = 1076;
+ Match(T__85);
+ State = 1082;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,40,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 1074;
+ State = 1077;
type();
- State = 1075;
- Match(T__26);
+ State = 1078;
+ Match(T__27);
}
}
}
- State = 1081;
+ State = 1084;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,40,Context);
}
- State = 1082;
+ State = 1085;
type();
- State = 1083;
- Match(T__85);
+ State = 1086;
+ Match(T__86);
}
}
catch (RecognitionException re) {
@@ -5335,30 +5344,30 @@ public BoundsContext bounds() {
int _alt;
EnterOuterAlt(_localctx, 1);
{
- State = 1085;
- Match(T__40);
- State = 1091;
+ State = 1088;
+ Match(T__41);
+ State = 1094;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,41,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 1086;
+ State = 1089;
bound();
- State = 1087;
- Match(T__26);
+ State = 1090;
+ Match(T__27);
}
}
}
- State = 1093;
+ State = 1096;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,41,Context);
}
- State = 1094;
+ State = 1097;
bound();
- State = 1095;
- Match(T__41);
+ State = 1098;
+ Match(T__42);
}
}
catch (RecognitionException re) {
@@ -5398,43 +5407,43 @@ public SigArgsContext sigArgs() {
EnterRule(_localctx, 134, RULE_sigArgs);
try {
int _alt;
- State = 1110;
+ State = 1113;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__28:
+ case T__29:
EnterOuterAlt(_localctx, 1);
{
- State = 1097;
- Match(T__28);
- State = 1103;
+ State = 1100;
+ Match(T__29);
+ State = 1106;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,42,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 1098;
+ State = 1101;
sigArg();
- State = 1099;
- Match(T__26);
+ State = 1102;
+ Match(T__27);
}
}
}
- State = 1105;
+ State = 1108;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,42,Context);
}
- State = 1106;
+ State = 1109;
sigArg();
- State = 1107;
- Match(T__29);
+ State = 1110;
+ Match(T__30);
}
break;
- case T__83:
+ case T__84:
EnterOuterAlt(_localctx, 2);
{
- State = 1109;
- Match(T__83);
+ State = 1112;
+ Match(T__84);
}
break;
default:
@@ -5485,31 +5494,31 @@ public SigArgContext sigArg() {
EnterRule(_localctx, 136, RULE_sigArg);
int _la;
try {
- State = 1119;
+ State = 1122;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,45,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 1112;
+ State = 1115;
Match(ELLIPSIS);
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1113;
+ State = 1116;
paramAttr();
- State = 1114;
+ State = 1117;
type();
- State = 1115;
+ State = 1118;
marshalClause();
- State = 1117;
+ State = 1120;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 65534L) != 0) || ((((_la - 198)) & ~0x3f) == 0 && ((1L << (_la - 198)) & 299067162755073L) != 0) || _la==SQSTRING || _la==ID) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 65534L) != 0) || ((((_la - 199)) & ~0x3f) == 0 && ((1L << (_la - 199)) & 299067162755073L) != 0) || _la==SQSTRING || _la==ID) {
{
- State = 1116;
+ State = 1119;
id();
}
}
@@ -5562,95 +5571,95 @@ public ClassNameContext className() {
ClassNameContext _localctx = new ClassNameContext(Context, State);
EnterRule(_localctx, 138, RULE_className);
try {
- State = 1146;
+ State = 1149;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,46,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 1121;
- Match(T__40);
- State = 1122;
- dottedName();
- State = 1123;
- Match(T__41);
State = 1124;
+ Match(T__41);
+ State = 1125;
+ dottedName();
+ State = 1126;
+ Match(T__42);
+ State = 1127;
slashedName();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1126;
- Match(T__40);
- State = 1127;
- mdtoken();
- State = 1128;
- Match(T__41);
State = 1129;
+ Match(T__41);
+ State = 1130;
+ mdtoken();
+ State = 1131;
+ Match(T__42);
+ State = 1132;
slashedName();
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 1131;
- Match(T__40);
- State = 1132;
- Match(PTR);
- State = 1133;
- Match(T__41);
State = 1134;
+ Match(T__41);
+ State = 1135;
+ Match(PTR);
+ State = 1136;
+ Match(T__42);
+ State = 1137;
slashedName();
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 1135;
- Match(T__40);
- State = 1136;
- Match(MODULE);
- State = 1137;
- dottedName();
State = 1138;
Match(T__41);
State = 1139;
+ Match(MODULE);
+ State = 1140;
+ dottedName();
+ State = 1141;
+ Match(T__42);
+ State = 1142;
slashedName();
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 1141;
+ State = 1144;
slashedName();
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 1142;
+ State = 1145;
mdtoken();
}
break;
case 7:
EnterOuterAlt(_localctx, 7);
{
- State = 1143;
+ State = 1146;
Match(THIS);
}
break;
case 8:
EnterOuterAlt(_localctx, 8);
{
- State = 1144;
+ State = 1147;
Match(BASE);
}
break;
case 9:
EnterOuterAlt(_localctx, 9);
{
- State = 1145;
+ State = 1148;
Match(NESTER);
}
break;
@@ -5695,25 +5704,25 @@ public SlashedNameContext slashedName() {
int _alt;
EnterOuterAlt(_localctx, 1);
{
- State = 1153;
+ State = 1156;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,47,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 1148;
+ State = 1151;
dottedName();
- State = 1149;
- Match(T__86);
+ State = 1152;
+ Match(T__87);
}
}
}
- State = 1155;
+ State = 1158;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,47,Context);
}
- State = 1156;
+ State = 1159;
dottedName();
}
}
@@ -5756,17 +5765,17 @@ public AssemblyDeclsContext assemblyDecls() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1161;
+ State = 1164;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while (_la==T__30 || _la==T__33 || ((((_la - 167)) & ~0x3f) == 0 && ((1L << (_la - 167)) & 2147487751L) != 0) || ((((_la - 242)) & ~0x3f) == 0 && ((1L << (_la - 242)) & 6860954690125825L) != 0)) {
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 38654771200L) != 0) || ((((_la - 167)) & ~0x3f) == 0 && ((1L << (_la - 167)) & 4294975503L) != 0) || ((((_la - 243)) & ~0x3f) == 0 && ((1L << (_la - 243)) & 6860954690125825L) != 0)) {
{
{
- State = 1158;
+ State = 1161;
assemblyDecl();
}
}
- State = 1163;
+ State = 1166;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -5812,18 +5821,18 @@ public AssemblyDeclContext assemblyDecl() {
AssemblyDeclContext _localctx = new AssemblyDeclContext(Context, State);
EnterRule(_localctx, 144, RULE_assemblyDecl);
try {
- State = 1169;
+ State = 1172;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
case HASH:
EnterOuterAlt(_localctx, 1);
{
{
- State = 1164;
+ State = 1167;
Match(HASH);
- State = 1165;
- Match(T__87);
- State = 1166;
+ State = 1168;
+ Match(T__88);
+ State = 1169;
int32();
}
}
@@ -5832,15 +5841,17 @@ public AssemblyDeclContext assemblyDecl() {
case PERMISSIONSET:
EnterOuterAlt(_localctx, 2);
{
- State = 1167;
+ State = 1170;
secDecl();
}
break;
- case T__30:
- case T__33:
+ case T__15:
+ case T__31:
+ case T__34:
case T__166:
case T__167:
case T__168:
+ case T__169:
case VALUE:
case INSTANCE:
case SQSTRING:
@@ -5855,7 +5866,7 @@ public AssemblyDeclContext assemblyDecl() {
case ID:
EnterOuterAlt(_localctx, 3);
{
- State = 1168;
+ State = 1171;
asmOrRefDecl();
}
break;
@@ -5903,44 +5914,44 @@ public TypeSpecContext typeSpec() {
TypeSpecContext _localctx = new TypeSpecContext(Context, State);
EnterRule(_localctx, 146, RULE_typeSpec);
try {
- State = 1182;
+ State = 1185;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,50,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 1171;
+ State = 1174;
className();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1172;
- Match(T__40);
- State = 1173;
- dottedName();
- State = 1174;
+ State = 1175;
Match(T__41);
+ State = 1176;
+ dottedName();
+ State = 1177;
+ Match(T__42);
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 1176;
- Match(T__40);
- State = 1177;
- Match(MODULE);
- State = 1178;
- dottedName();
State = 1179;
Match(T__41);
+ State = 1180;
+ Match(MODULE);
+ State = 1181;
+ dottedName();
+ State = 1182;
+ Match(T__42);
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 1181;
+ State = 1184;
type();
}
break;
@@ -5986,7 +5997,7 @@ public NativeTypeContext nativeType() {
EnterRule(_localctx, 148, RULE_nativeType);
try {
int _alt;
- State = 1192;
+ State = 1195;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,52,Context) ) {
case 1:
@@ -5997,21 +6008,21 @@ public NativeTypeContext nativeType() {
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1185;
+ State = 1188;
nativeTypeElement();
- State = 1189;
+ State = 1192;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,51,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 1186;
+ State = 1189;
nativeTypeArrayPointerInfo();
}
}
}
- State = 1191;
+ State = 1194;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,51,Context);
}
@@ -6109,14 +6120,14 @@ public NativeTypeArrayPointerInfoContext nativeTypeArrayPointerInfo() {
NativeTypeArrayPointerInfoContext _localctx = new NativeTypeArrayPointerInfoContext(Context, State);
EnterRule(_localctx, 150, RULE_nativeTypeArrayPointerInfo);
try {
- State = 1211;
+ State = 1214;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,53,Context) ) {
case 1:
_localctx = new PointerNativeTypeContext(_localctx);
EnterOuterAlt(_localctx, 1);
{
- State = 1194;
+ State = 1197;
Match(PTR);
}
break;
@@ -6124,7 +6135,7 @@ public NativeTypeArrayPointerInfoContext nativeTypeArrayPointerInfo() {
_localctx = new PointerArrayTypeNoSizeDataContext(_localctx);
EnterOuterAlt(_localctx, 2);
{
- State = 1195;
+ State = 1198;
Match(ARRAY_TYPE_NO_BOUNDS);
}
break;
@@ -6132,42 +6143,42 @@ public NativeTypeArrayPointerInfoContext nativeTypeArrayPointerInfo() {
_localctx = new PointerArrayTypeSizeContext(_localctx);
EnterOuterAlt(_localctx, 3);
{
- State = 1196;
- Match(T__40);
- State = 1197;
- int32();
- State = 1198;
+ State = 1199;
Match(T__41);
+ State = 1200;
+ int32();
+ State = 1201;
+ Match(T__42);
}
break;
case 4:
_localctx = new PointerArrayTypeSizeParamIndexContext(_localctx);
EnterOuterAlt(_localctx, 4);
{
- State = 1200;
- Match(T__40);
- State = 1201;
+ State = 1203;
+ Match(T__41);
+ State = 1204;
int32();
- State = 1202;
+ State = 1205;
Match(PLUS);
- State = 1203;
+ State = 1206;
int32();
- State = 1204;
- Match(T__41);
+ State = 1207;
+ Match(T__42);
}
break;
case 5:
_localctx = new PointerArrayTypeParamIndexContext(_localctx);
EnterOuterAlt(_localctx, 5);
{
- State = 1206;
- Match(T__40);
- State = 1207;
- Match(PLUS);
- State = 1208;
- int32();
State = 1209;
Match(T__41);
+ State = 1210;
+ Match(PLUS);
+ State = 1211;
+ int32();
+ State = 1212;
+ Match(T__42);
}
break;
}
@@ -6185,6 +6196,7 @@ public NativeTypeArrayPointerInfoContext nativeTypeArrayPointerInfo() {
public partial class NativeTypeElementContext : ParserRuleContext {
public IToken marshalType;
+ public IToken unsignedMarshalType;
public IToken marshalBool;
[System.Diagnostics.DebuggerNonUserCode] public CompQstringContext[] compQstring() {
return GetRuleContexts();
@@ -6265,7 +6277,7 @@ public NativeTypeElementContext nativeTypeElement() {
NativeTypeElementContext _localctx = new NativeTypeElementContext(Context, State);
EnterRule(_localctx, 152, RULE_nativeTypeElement);
try {
- State = 1297;
+ State = 1308;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,54,Context) ) {
case 1:
@@ -6276,376 +6288,412 @@ public NativeTypeElementContext nativeTypeElement() {
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1214;
- _localctx.marshalType = Match(CUSTOM);
- State = 1215;
- Match(T__28);
- State = 1216;
- compQstring();
State = 1217;
- Match(T__26);
+ _localctx.marshalType = Match(CUSTOM);
State = 1218;
- compQstring();
+ Match(T__29);
State = 1219;
- Match(T__26);
- State = 1220;
compQstring();
+ State = 1220;
+ Match(T__27);
State = 1221;
- Match(T__26);
- State = 1222;
compQstring();
+ State = 1222;
+ Match(T__27);
State = 1223;
- Match(T__29);
+ compQstring();
+ State = 1224;
+ Match(T__27);
+ State = 1225;
+ compQstring();
+ State = 1226;
+ Match(T__30);
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 1225;
- _localctx.marshalType = Match(CUSTOM);
- State = 1226;
- Match(T__28);
- State = 1227;
- compQstring();
State = 1228;
- Match(T__26);
+ _localctx.marshalType = Match(CUSTOM);
State = 1229;
- compQstring();
- State = 1230;
Match(T__29);
+ State = 1230;
+ compQstring();
+ State = 1231;
+ Match(T__27);
+ State = 1232;
+ compQstring();
+ State = 1233;
+ Match(T__30);
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 1232;
- Match(FIXED);
- State = 1233;
- _localctx.marshalType = Match(SYSSTRING);
- State = 1234;
- Match(T__40);
State = 1235;
- int32();
+ Match(FIXED);
State = 1236;
+ _localctx.marshalType = Match(SYSSTRING);
+ State = 1237;
Match(T__41);
+ State = 1238;
+ int32();
+ State = 1239;
+ Match(T__42);
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 1238;
- Match(FIXED);
- State = 1239;
- _localctx.marshalType = Match(ARRAY);
- State = 1240;
- Match(T__40);
State = 1241;
- int32();
+ Match(FIXED);
State = 1242;
- Match(T__41);
+ _localctx.marshalType = Match(ARRAY);
State = 1243;
+ Match(T__41);
+ State = 1244;
+ int32();
+ State = 1245;
+ Match(T__42);
+ State = 1246;
nativeType();
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 1245;
+ State = 1248;
_localctx.marshalType = Match(VARIANT);
}
break;
case 7:
EnterOuterAlt(_localctx, 7);
{
- State = 1246;
+ State = 1249;
_localctx.marshalType = Match(CURRENCY);
}
break;
case 8:
EnterOuterAlt(_localctx, 8);
{
- State = 1247;
+ State = 1250;
_localctx.marshalType = Match(SYSCHAR);
}
break;
case 9:
EnterOuterAlt(_localctx, 9);
{
- State = 1248;
+ State = 1251;
_localctx.marshalType = Match(VOID);
}
break;
case 10:
EnterOuterAlt(_localctx, 10);
{
- State = 1249;
+ State = 1252;
_localctx.marshalType = Match(BOOL);
}
break;
case 11:
EnterOuterAlt(_localctx, 11);
{
- State = 1250;
+ State = 1253;
_localctx.marshalType = Match(INT8);
}
break;
case 12:
EnterOuterAlt(_localctx, 12);
{
- State = 1251;
+ State = 1254;
_localctx.marshalType = Match(INT16);
}
break;
case 13:
EnterOuterAlt(_localctx, 13);
{
- State = 1252;
+ State = 1255;
_localctx.marshalType = Match(INT32_);
}
break;
case 14:
EnterOuterAlt(_localctx, 14);
{
- State = 1253;
+ State = 1256;
_localctx.marshalType = Match(INT64_);
}
break;
case 15:
EnterOuterAlt(_localctx, 15);
{
- State = 1254;
+ State = 1257;
_localctx.marshalType = Match(FLOAT32);
}
break;
case 16:
EnterOuterAlt(_localctx, 16);
{
- State = 1255;
+ State = 1258;
_localctx.marshalType = Match(FLOAT64_);
}
break;
case 17:
EnterOuterAlt(_localctx, 17);
{
- State = 1256;
+ State = 1259;
_localctx.marshalType = Match(ERROR);
}
break;
case 18:
EnterOuterAlt(_localctx, 18);
{
- State = 1257;
+ State = 1260;
_localctx.marshalType = Match(UINT8);
}
break;
case 19:
EnterOuterAlt(_localctx, 19);
{
- State = 1258;
+ State = 1261;
_localctx.marshalType = Match(UINT16);
}
break;
case 20:
EnterOuterAlt(_localctx, 20);
{
- State = 1259;
+ State = 1262;
_localctx.marshalType = Match(UINT32);
}
break;
case 21:
EnterOuterAlt(_localctx, 21);
{
- State = 1260;
+ State = 1263;
_localctx.marshalType = Match(UINT64);
}
break;
case 22:
EnterOuterAlt(_localctx, 22);
{
- State = 1261;
+ State = 1264;
_localctx.marshalType = Match(DECIMAL);
}
break;
case 23:
EnterOuterAlt(_localctx, 23);
{
- State = 1262;
+ State = 1265;
_localctx.marshalType = Match(DATE);
}
break;
case 24:
EnterOuterAlt(_localctx, 24);
{
- State = 1263;
+ State = 1266;
_localctx.marshalType = Match(BSTR);
}
break;
case 25:
EnterOuterAlt(_localctx, 25);
{
- State = 1264;
+ State = 1267;
_localctx.marshalType = Match(LPSTR);
}
break;
case 26:
EnterOuterAlt(_localctx, 26);
{
- State = 1265;
+ State = 1268;
_localctx.marshalType = Match(LPWSTR);
}
break;
case 27:
EnterOuterAlt(_localctx, 27);
{
- State = 1266;
+ State = 1269;
_localctx.marshalType = Match(LPTSTR);
}
break;
case 28:
EnterOuterAlt(_localctx, 28);
{
- State = 1267;
+ State = 1270;
_localctx.marshalType = Match(OBJECTREF);
}
break;
case 29:
EnterOuterAlt(_localctx, 29);
{
- State = 1268;
+ State = 1271;
_localctx.marshalType = Match(IUNKNOWN);
- State = 1269;
+ State = 1272;
iidParamIndex();
}
break;
case 30:
EnterOuterAlt(_localctx, 30);
{
- State = 1270;
+ State = 1273;
_localctx.marshalType = Match(IDISPATCH);
- State = 1271;
+ State = 1274;
iidParamIndex();
}
break;
case 31:
EnterOuterAlt(_localctx, 31);
{
- State = 1272;
+ State = 1275;
_localctx.marshalType = Match(STRUCT);
}
break;
case 32:
EnterOuterAlt(_localctx, 32);
{
- State = 1273;
+ State = 1276;
_localctx.marshalType = Match(INTERFACE);
- State = 1274;
+ State = 1277;
iidParamIndex();
}
break;
case 33:
EnterOuterAlt(_localctx, 33);
{
- State = 1275;
+ State = 1278;
_localctx.marshalType = Match(SAFEARRAY);
- State = 1276;
+ State = 1279;
variantType();
}
break;
case 34:
EnterOuterAlt(_localctx, 34);
{
- State = 1277;
+ State = 1280;
_localctx.marshalType = Match(SAFEARRAY);
- State = 1278;
+ State = 1281;
variantType();
- State = 1279;
- Match(T__26);
- State = 1280;
+ State = 1282;
+ Match(T__27);
+ State = 1283;
compQstring();
}
break;
case 35:
EnterOuterAlt(_localctx, 35);
{
- State = 1282;
+ State = 1285;
_localctx.marshalType = Match(INT);
}
break;
case 36:
EnterOuterAlt(_localctx, 36);
{
- State = 1283;
+ State = 1286;
_localctx.marshalType = Match(UINT);
}
break;
case 37:
EnterOuterAlt(_localctx, 37);
{
- State = 1284;
- Match(T__60);
- State = 1285;
- _localctx.marshalType = Match(STRUCT);
+ State = 1287;
+ Match(T__89);
+ State = 1288;
+ _localctx.unsignedMarshalType = Match(INT8);
}
break;
case 38:
EnterOuterAlt(_localctx, 38);
{
- State = 1286;
- _localctx.marshalType = Match(BYVALSTR);
+ State = 1289;
+ Match(T__89);
+ State = 1290;
+ _localctx.unsignedMarshalType = Match(INT16);
}
break;
case 39:
EnterOuterAlt(_localctx, 39);
{
- State = 1287;
- Match(ANSI);
- State = 1288;
- _localctx.marshalType = Match(BSTR);
+ State = 1291;
+ Match(T__89);
+ State = 1292;
+ _localctx.unsignedMarshalType = Match(INT32_);
}
break;
case 40:
EnterOuterAlt(_localctx, 40);
{
- State = 1289;
- _localctx.marshalType = Match(TBSTR);
+ State = 1293;
+ Match(T__89);
+ State = 1294;
+ _localctx.unsignedMarshalType = Match(INT64_);
}
break;
case 41:
EnterOuterAlt(_localctx, 41);
{
- State = 1290;
- Match(VARIANT);
- State = 1291;
- _localctx.marshalBool = Match(BOOL);
+ State = 1295;
+ Match(T__61);
+ State = 1296;
+ _localctx.marshalType = Match(STRUCT);
}
break;
case 42:
EnterOuterAlt(_localctx, 42);
{
- State = 1292;
- _localctx.marshalType = Match(METHOD);
+ State = 1297;
+ _localctx.marshalType = Match(BYVALSTR);
}
break;
case 43:
EnterOuterAlt(_localctx, 43);
{
- State = 1293;
- _localctx.marshalType = Match(LPSTRUCT);
+ State = 1298;
+ Match(ANSI);
+ State = 1299;
+ _localctx.marshalType = Match(BSTR);
}
break;
case 44:
EnterOuterAlt(_localctx, 44);
{
- State = 1294;
- Match(T__32);
- State = 1295;
- _localctx.marshalType = Match(ANY);
+ State = 1300;
+ _localctx.marshalType = Match(TBSTR);
}
break;
case 45:
EnterOuterAlt(_localctx, 45);
{
- State = 1296;
+ State = 1301;
+ Match(VARIANT);
+ State = 1302;
+ _localctx.marshalBool = Match(BOOL);
+ }
+ break;
+ case 46:
+ EnterOuterAlt(_localctx, 46);
+ {
+ State = 1303;
+ _localctx.marshalType = Match(METHOD);
+ }
+ break;
+ case 47:
+ EnterOuterAlt(_localctx, 47);
+ {
+ State = 1304;
+ _localctx.marshalType = Match(LPSTRUCT);
+ }
+ break;
+ case 48:
+ EnterOuterAlt(_localctx, 48);
+ {
+ State = 1305;
+ Match(T__33);
+ State = 1306;
+ _localctx.marshalType = Match(ANY);
+ }
+ break;
+ case 49:
+ EnterOuterAlt(_localctx, 49);
+ {
+ State = 1307;
dottedName();
}
break;
@@ -6684,30 +6732,30 @@ public IidParamIndexContext iidParamIndex() {
IidParamIndexContext _localctx = new IidParamIndexContext(Context, State);
EnterRule(_localctx, 154, RULE_iidParamIndex);
try {
- State = 1306;
+ State = 1317;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__29:
- case T__40:
+ case T__30:
+ case T__41:
case ARRAY_TYPE_NO_BOUNDS:
case PTR:
EnterOuterAlt(_localctx, 1);
{
}
break;
- case T__28:
+ case T__29:
EnterOuterAlt(_localctx, 2);
{
- State = 1300;
- Match(T__28);
- State = 1301;
- Match(T__88);
- State = 1302;
- Match(T__34);
- State = 1303;
- int32();
- State = 1304;
+ State = 1311;
Match(T__29);
+ State = 1312;
+ Match(T__90);
+ State = 1313;
+ Match(T__35);
+ State = 1314;
+ int32();
+ State = 1315;
+ Match(T__30);
}
break;
default:
@@ -6761,7 +6809,7 @@ public VariantTypeContext variantType() {
int _la;
try {
int _alt;
- State = 1316;
+ State = 1327;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,57,Context) ) {
case 1:
@@ -6772,18 +6820,18 @@ public VariantTypeContext variantType() {
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1309;
+ State = 1320;
variantTypeElement();
- State = 1313;
+ State = 1324;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,56,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 1310;
+ State = 1321;
_la = TokenStream.LA(1);
- if ( !(((((_la - 228)) & ~0x3f) == 0 && ((1L << (_la - 228)) & 6442450945L) != 0)) ) {
+ if ( !(((((_la - 229)) & ~0x3f) == 0 && ((1L << (_la - 229)) & 6442450945L) != 0)) ) {
ErrorHandler.RecoverInline(this);
}
else {
@@ -6793,7 +6841,7 @@ public VariantTypeContext variantType() {
}
}
}
- State = 1315;
+ State = 1326;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,56,Context);
}
@@ -6874,9 +6922,9 @@ public VariantTypeElementContext variantTypeElement() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1318;
+ State = 1329;
_la = TokenStream.LA(1);
- if ( !(((((_la - 177)) & ~0x3f) == 0 && ((1L << (_la - 177)) & -4482436704239647L) != 0) || _la==CLSID || _la==PTR) ) {
+ if ( !(((((_la - 178)) & ~0x3f) == 0 && ((1L << (_la - 178)) & -4482436704239647L) != 0) || _la==CLSID || _la==PTR) ) {
ErrorHandler.RecoverInline(this);
}
else {
@@ -6927,21 +6975,21 @@ public TypeContext type() {
int _alt;
EnterOuterAlt(_localctx, 1);
{
- State = 1320;
+ State = 1331;
elementType();
- State = 1324;
+ State = 1335;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,58,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 1321;
+ State = 1332;
typeModifiers();
}
}
}
- State = 1326;
+ State = 1337;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,58,Context);
}
@@ -7063,14 +7111,14 @@ public TypeModifiersContext typeModifiers() {
TypeModifiersContext _localctx = new TypeModifiersContext(Context, State);
EnterRule(_localctx, 162, RULE_typeModifiers);
try {
- State = 1345;
+ State = 1356;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,59,Context) ) {
case 1:
_localctx = new SZArrayModifierContext(_localctx);
EnterOuterAlt(_localctx, 1);
{
- State = 1327;
+ State = 1338;
Match(ARRAY_TYPE_NO_BOUNDS);
}
break;
@@ -7078,17 +7126,17 @@ public TypeModifiersContext typeModifiers() {
_localctx = new SZArrayModifierContext(_localctx);
EnterOuterAlt(_localctx, 2);
{
- State = 1328;
- Match(T__40);
- State = 1329;
+ State = 1339;
Match(T__41);
+ State = 1340;
+ Match(T__42);
}
break;
case 3:
_localctx = new ArrayModifierContext(_localctx);
EnterOuterAlt(_localctx, 3);
{
- State = 1330;
+ State = 1341;
bounds();
}
break;
@@ -7096,7 +7144,7 @@ public TypeModifiersContext typeModifiers() {
_localctx = new ByRefModifierContext(_localctx);
EnterOuterAlt(_localctx, 4);
{
- State = 1331;
+ State = 1342;
Match(REF);
}
break;
@@ -7104,7 +7152,7 @@ public TypeModifiersContext typeModifiers() {
_localctx = new PtrModifierContext(_localctx);
EnterOuterAlt(_localctx, 5);
{
- State = 1332;
+ State = 1343;
Match(PTR);
}
break;
@@ -7112,43 +7160,43 @@ public TypeModifiersContext typeModifiers() {
_localctx = new PinnedModifierContext(_localctx);
EnterOuterAlt(_localctx, 6);
{
- State = 1333;
- Match(T__89);
+ State = 1344;
+ Match(T__91);
}
break;
case 7:
_localctx = new RequiredModifierContext(_localctx);
EnterOuterAlt(_localctx, 7);
{
- State = 1334;
- Match(T__90);
- State = 1335;
- Match(T__28);
- State = 1336;
- typeSpec();
- State = 1337;
+ State = 1345;
+ Match(T__92);
+ State = 1346;
Match(T__29);
+ State = 1347;
+ typeSpec();
+ State = 1348;
+ Match(T__30);
}
break;
case 8:
_localctx = new OptionalModifierContext(_localctx);
EnterOuterAlt(_localctx, 8);
{
- State = 1339;
- Match(T__91);
- State = 1340;
- Match(T__28);
- State = 1341;
- typeSpec();
- State = 1342;
+ State = 1350;
+ Match(T__93);
+ State = 1351;
Match(T__29);
+ State = 1352;
+ typeSpec();
+ State = 1353;
+ Match(T__30);
}
break;
case 9:
_localctx = new GenericArgumentsModifierContext(_localctx);
EnterOuterAlt(_localctx, 9);
{
- State = 1344;
+ State = 1355;
typeArgs();
}
break;
@@ -7221,144 +7269,144 @@ public ElementTypeContext elementType() {
ElementTypeContext _localctx = new ElementTypeContext(Context, State);
EnterRule(_localctx, 164, RULE_elementType);
try {
- State = 1377;
+ State = 1388;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,60,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 1347;
- Match(T__37);
- State = 1348;
+ State = 1358;
+ Match(T__38);
+ State = 1359;
className();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1349;
+ State = 1360;
Match(OBJECT);
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 1350;
+ State = 1361;
Match(VALUE);
- State = 1351;
- Match(T__37);
- State = 1352;
+ State = 1362;
+ Match(T__38);
+ State = 1363;
className();
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 1353;
+ State = 1364;
Match(VALUETYPE);
- State = 1354;
+ State = 1365;
className();
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 1355;
+ State = 1366;
Match(METHOD);
- State = 1356;
+ State = 1367;
callConv();
- State = 1357;
+ State = 1368;
type();
- State = 1358;
+ State = 1369;
Match(PTR);
- State = 1359;
+ State = 1370;
sigArgs();
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 1361;
+ State = 1372;
Match(METHOD_TYPE_PARAMETER);
- State = 1362;
+ State = 1373;
int32();
}
break;
case 7:
EnterOuterAlt(_localctx, 7);
{
- State = 1363;
+ State = 1374;
Match(TYPE_PARAMETER);
- State = 1364;
+ State = 1375;
int32();
}
break;
case 8:
EnterOuterAlt(_localctx, 8);
{
- State = 1365;
+ State = 1376;
Match(METHOD_TYPE_PARAMETER);
- State = 1366;
+ State = 1377;
dottedName();
}
break;
case 9:
EnterOuterAlt(_localctx, 9);
{
- State = 1367;
+ State = 1378;
Match(TYPE_PARAMETER);
- State = 1368;
+ State = 1379;
dottedName();
}
break;
case 10:
EnterOuterAlt(_localctx, 10);
{
- State = 1369;
+ State = 1380;
Match(TYPEDREF);
}
break;
case 11:
EnterOuterAlt(_localctx, 11);
{
- State = 1370;
+ State = 1381;
Match(VOID);
}
break;
case 12:
EnterOuterAlt(_localctx, 12);
{
- State = 1371;
+ State = 1382;
nativeInt();
}
break;
case 13:
EnterOuterAlt(_localctx, 13);
{
- State = 1372;
+ State = 1383;
nativeUint();
}
break;
case 14:
EnterOuterAlt(_localctx, 14);
{
- State = 1373;
+ State = 1384;
simpleType();
}
break;
case 15:
EnterOuterAlt(_localctx, 15);
{
- State = 1374;
+ State = 1385;
dottedName();
}
break;
case 16:
EnterOuterAlt(_localctx, 16);
{
- State = 1375;
+ State = 1386;
Match(ELLIPSIS);
- State = 1376;
+ State = 1387;
type();
}
break;
@@ -7407,133 +7455,133 @@ public SimpleTypeContext simpleType() {
SimpleTypeContext _localctx = new SimpleTypeContext(Context, State);
EnterRule(_localctx, 166, RULE_simpleType);
try {
- State = 1400;
+ State = 1411;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,61,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 1379;
+ State = 1390;
Match(CHAR);
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1380;
+ State = 1391;
Match(STRING);
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 1381;
+ State = 1392;
Match(BOOL);
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 1382;
+ State = 1393;
Match(INT8);
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 1383;
+ State = 1394;
Match(INT16);
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 1384;
+ State = 1395;
Match(INT32_);
}
break;
case 7:
EnterOuterAlt(_localctx, 7);
{
- State = 1385;
+ State = 1396;
Match(INT64_);
}
break;
case 8:
EnterOuterAlt(_localctx, 8);
{
- State = 1386;
+ State = 1397;
Match(FLOAT32);
}
break;
case 9:
EnterOuterAlt(_localctx, 9);
{
- State = 1387;
+ State = 1398;
Match(FLOAT64_);
}
break;
case 10:
EnterOuterAlt(_localctx, 10);
{
- State = 1388;
+ State = 1399;
Match(UINT8);
}
break;
case 11:
EnterOuterAlt(_localctx, 11);
{
- State = 1389;
+ State = 1400;
Match(UINT16);
}
break;
case 12:
EnterOuterAlt(_localctx, 12);
{
- State = 1390;
+ State = 1401;
Match(UINT32);
}
break;
case 13:
EnterOuterAlt(_localctx, 13);
{
- State = 1391;
+ State = 1402;
Match(UINT64);
}
break;
case 14:
EnterOuterAlt(_localctx, 14);
{
- State = 1392;
- Match(T__92);
- State = 1393;
+ State = 1403;
+ Match(T__89);
+ State = 1404;
Match(INT8);
}
break;
case 15:
EnterOuterAlt(_localctx, 15);
{
- State = 1394;
- Match(T__92);
- State = 1395;
- Match(INT16);
- }
+ State = 1405;
+ Match(T__89);
+ State = 1406;
+ Match(INT16);
+ }
break;
case 16:
EnterOuterAlt(_localctx, 16);
{
- State = 1396;
- Match(T__92);
- State = 1397;
+ State = 1407;
+ Match(T__89);
+ State = 1408;
Match(INT32_);
}
break;
case 17:
EnterOuterAlt(_localctx, 17);
{
- State = 1398;
- Match(T__92);
- State = 1399;
+ State = 1409;
+ Match(T__89);
+ State = 1410;
Match(INT64_);
}
break;
@@ -7576,7 +7624,7 @@ public BoundContext bound() {
BoundContext _localctx = new BoundContext(Context, State);
EnterRule(_localctx, 168, RULE_bound);
try {
- State = 1412;
+ State = 1423;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,62,Context) ) {
case 1:
@@ -7587,34 +7635,34 @@ public BoundContext bound() {
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1403;
+ State = 1414;
Match(ELLIPSIS);
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 1404;
+ State = 1415;
int32();
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 1405;
+ State = 1416;
int32();
- State = 1406;
+ State = 1417;
Match(ELLIPSIS);
- State = 1407;
+ State = 1418;
int32();
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 1409;
+ State = 1420;
int32();
- State = 1410;
+ State = 1421;
Match(ELLIPSIS);
}
break;
@@ -7653,9 +7701,9 @@ public NativeIntContext nativeInt() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1414;
+ State = 1425;
Match(T__0);
- State = 1415;
+ State = 1426;
Match(INT);
}
}
@@ -7693,22 +7741,22 @@ public NativeUintContext nativeUint() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1417;
+ State = 1428;
Match(T__0);
- State = 1421;
+ State = 1432;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__92:
+ case T__89:
{
- State = 1418;
- Match(T__92);
- State = 1419;
+ State = 1429;
+ Match(T__89);
+ State = 1430;
Match(INT);
}
break;
case UINT:
{
- State = 1420;
+ State = 1431;
Match(UINT);
}
break;
@@ -7771,109 +7819,126 @@ public SecDeclContext secDecl() {
EnterRule(_localctx, 174, RULE_secDecl);
int _la;
try {
- State = 1463;
+ State = 1481;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,65,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 1423;
+ State = 1434;
Match(PERMISSION);
- State = 1424;
+ State = 1435;
secAction();
- State = 1425;
+ State = 1436;
typeSpec();
- State = 1426;
- Match(T__28);
- State = 1427;
- nameValPairs();
- State = 1428;
+ State = 1437;
Match(T__29);
+ State = 1438;
+ nameValPairs();
+ State = 1439;
+ Match(T__30);
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1430;
+ State = 1441;
Match(PERMISSION);
- State = 1431;
+ State = 1442;
secAction();
- State = 1432;
+ State = 1443;
typeSpec();
- State = 1433;
- Match(T__34);
- State = 1434;
- Match(T__15);
- State = 1435;
- customBlobDescr();
- State = 1436;
+ State = 1444;
+ Match(T__35);
+ State = 1445;
Match(T__16);
+ State = 1446;
+ customBlobDescr();
+ State = 1447;
+ Match(T__17);
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 1438;
+ State = 1449;
Match(PERMISSION);
- State = 1439;
+ State = 1450;
secAction();
- State = 1440;
+ State = 1451;
typeSpec();
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 1442;
+ State = 1453;
Match(PERMISSIONSET);
- State = 1443;
+ State = 1454;
secAction();
- State = 1444;
- Match(T__34);
- State = 1446;
+ State = 1455;
+ Match(T__35);
+ State = 1457;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- if (_la==T__82) {
+ if (_la==T__83) {
{
- State = 1445;
- Match(T__82);
+ State = 1456;
+ Match(T__83);
}
}
- State = 1448;
- Match(T__28);
- State = 1449;
- bytes();
- State = 1450;
+ State = 1459;
Match(T__29);
+ State = 1460;
+ bytes();
+ State = 1461;
+ Match(T__30);
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 1452;
+ State = 1463;
Match(PERMISSIONSET);
- State = 1453;
+ State = 1464;
secAction();
- State = 1454;
- compQstring();
+ State = 1465;
+ Match(T__83);
+ State = 1466;
+ Match(T__29);
+ State = 1467;
+ bytes();
+ State = 1468;
+ Match(T__30);
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 1456;
+ State = 1470;
Match(PERMISSIONSET);
- State = 1457;
+ State = 1471;
secAction();
- State = 1458;
- Match(T__34);
- State = 1459;
- Match(T__15);
- State = 1460;
- secAttrSetBlob();
- State = 1461;
+ State = 1472;
+ compQstring();
+ }
+ break;
+ case 7:
+ EnterOuterAlt(_localctx, 7);
+ {
+ State = 1474;
+ Match(PERMISSIONSET);
+ State = 1475;
+ secAction();
+ State = 1476;
+ Match(T__35);
+ State = 1477;
Match(T__16);
+ State = 1478;
+ secAttrSetBlob();
+ State = 1479;
+ Match(T__17);
}
break;
}
@@ -7915,19 +7980,20 @@ public SecAttrSetBlobContext secAttrSetBlob() {
EnterRule(_localctx, 176, RULE_secAttrSetBlob);
try {
int _alt;
- State = 1475;
+ State = 1493;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__16:
+ case T__17:
EnterOuterAlt(_localctx, 1);
{
}
break;
case T__0:
- case T__37:
- case T__40:
- case T__92:
- case T__111:
+ case T__15:
+ case T__38:
+ case T__41:
+ case T__89:
+ case T__112:
case ELLIPSIS:
case CHAR:
case STRING:
@@ -7959,25 +8025,25 @@ public SecAttrSetBlobContext secAttrSetBlob() {
case ID:
EnterOuterAlt(_localctx, 2);
{
- State = 1471;
+ State = 1489;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,66,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 1466;
+ State = 1484;
secAttrBlob();
- State = 1467;
- Match(T__26);
+ State = 1485;
+ Match(T__27);
}
}
}
- State = 1473;
+ State = 1491;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,66,Context);
}
- State = 1474;
+ State = 1492;
secAttrBlob();
}
break;
@@ -8022,39 +8088,39 @@ public SecAttrBlobContext secAttrBlob() {
SecAttrBlobContext _localctx = new SecAttrBlobContext(Context, State);
EnterRule(_localctx, 178, RULE_secAttrBlob);
try {
- State = 1490;
+ State = 1508;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,68,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 1477;
- Match(T__37);
- State = 1478;
+ State = 1495;
+ Match(T__38);
+ State = 1496;
Match(SQSTRING);
- State = 1479;
- Match(T__34);
- State = 1480;
- Match(T__15);
- State = 1481;
- customBlobNVPairs();
- State = 1482;
+ State = 1497;
+ Match(T__35);
+ State = 1498;
Match(T__16);
+ State = 1499;
+ customBlobNVPairs();
+ State = 1500;
+ Match(T__17);
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1484;
+ State = 1502;
typeSpec();
- State = 1485;
- Match(T__34);
- State = 1486;
- Match(T__15);
- State = 1487;
- customBlobNVPairs();
- State = 1488;
+ State = 1503;
+ Match(T__35);
+ State = 1504;
Match(T__16);
+ State = 1505;
+ customBlobNVPairs();
+ State = 1506;
+ Match(T__17);
}
break;
}
@@ -8098,25 +8164,25 @@ public NameValPairsContext nameValPairs() {
int _alt;
EnterOuterAlt(_localctx, 1);
{
- State = 1497;
+ State = 1515;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,69,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 1492;
+ State = 1510;
nameValPair();
- State = 1493;
- Match(T__26);
+ State = 1511;
+ Match(T__27);
}
}
}
- State = 1499;
+ State = 1517;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,69,Context);
}
- State = 1500;
+ State = 1518;
nameValPair();
}
}
@@ -8158,11 +8224,11 @@ public NameValPairContext nameValPair() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1502;
+ State = 1520;
compQstring();
- State = 1503;
- Match(T__34);
- State = 1504;
+ State = 1521;
+ Match(T__35);
+ State = 1522;
caValue();
}
}
@@ -8199,9 +8265,9 @@ public TruefalseContext truefalse() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1506;
+ State = 1524;
_la = TokenStream.LA(1);
- if ( !(_la==T__93 || _la==T__94) ) {
+ if ( !(_la==T__94 || _la==T__95) ) {
ErrorHandler.RecoverInline(this);
}
else {
@@ -8255,105 +8321,105 @@ public CaValueContext caValue() {
CaValueContext _localctx = new CaValueContext(Context, State);
EnterRule(_localctx, 186, RULE_caValue);
try {
- State = 1542;
+ State = 1560;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,70,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 1508;
+ State = 1526;
truefalse();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1509;
+ State = 1527;
int32();
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 1510;
+ State = 1528;
Match(INT32_);
- State = 1511;
- Match(T__28);
- State = 1512;
- int32();
- State = 1513;
+ State = 1529;
Match(T__29);
+ State = 1530;
+ int32();
+ State = 1531;
+ Match(T__30);
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 1515;
+ State = 1533;
compQstring();
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 1516;
+ State = 1534;
className();
- State = 1517;
- Match(T__28);
- State = 1518;
+ State = 1535;
+ Match(T__29);
+ State = 1536;
Match(INT8);
- State = 1519;
- Match(T__73);
- State = 1520;
+ State = 1537;
+ Match(T__74);
+ State = 1538;
int32();
- State = 1521;
- Match(T__29);
+ State = 1539;
+ Match(T__30);
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 1523;
+ State = 1541;
className();
- State = 1524;
- Match(T__28);
- State = 1525;
+ State = 1542;
+ Match(T__29);
+ State = 1543;
Match(INT16);
- State = 1526;
- Match(T__73);
- State = 1527;
+ State = 1544;
+ Match(T__74);
+ State = 1545;
int32();
- State = 1528;
- Match(T__29);
+ State = 1546;
+ Match(T__30);
}
break;
case 7:
EnterOuterAlt(_localctx, 7);
{
- State = 1530;
+ State = 1548;
className();
- State = 1531;
- Match(T__28);
- State = 1532;
+ State = 1549;
+ Match(T__29);
+ State = 1550;
Match(INT32_);
- State = 1533;
- Match(T__73);
- State = 1534;
+ State = 1551;
+ Match(T__74);
+ State = 1552;
int32();
- State = 1535;
- Match(T__29);
+ State = 1553;
+ Match(T__30);
}
break;
case 8:
EnterOuterAlt(_localctx, 8);
{
- State = 1537;
+ State = 1555;
className();
- State = 1538;
- Match(T__28);
- State = 1539;
- int32();
- State = 1540;
+ State = 1556;
Match(T__29);
+ State = 1557;
+ int32();
+ State = 1558;
+ Match(T__30);
}
break;
}
@@ -8391,9 +8457,9 @@ public SecActionContext secAction() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1544;
+ State = 1562;
_la = TokenStream.LA(1);
- if ( !(((((_la - 96)) & ~0x3f) == 0 && ((1L << (_la - 96)) & 32767L) != 0)) ) {
+ if ( !(((((_la - 97)) & ~0x3f) == 0 && ((1L << (_la - 97)) & 32767L) != 0)) ) {
ErrorHandler.RecoverInline(this);
}
else {
@@ -8461,104 +8527,104 @@ public MethodRefContext methodRef() {
EnterRule(_localctx, 190, RULE_methodRef);
int _la;
try {
- State = 1580;
+ State = 1598;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,73,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 1546;
+ State = 1564;
callConv();
- State = 1547;
+ State = 1565;
type();
- State = 1548;
+ State = 1566;
typeSpec();
- State = 1549;
+ State = 1567;
Match(DCOLON);
- State = 1550;
+ State = 1568;
methodName();
- State = 1552;
+ State = 1570;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- if (_la==T__84) {
+ if (_la==T__85) {
{
- State = 1551;
+ State = 1569;
typeArgs();
}
}
- State = 1554;
+ State = 1572;
sigArgs();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1556;
+ State = 1574;
callConv();
- State = 1557;
+ State = 1575;
type();
- State = 1558;
+ State = 1576;
typeSpec();
- State = 1559;
+ State = 1577;
Match(DCOLON);
- State = 1560;
+ State = 1578;
methodName();
- State = 1561;
+ State = 1579;
genArityNotEmpty();
- State = 1562;
+ State = 1580;
sigArgs();
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 1564;
+ State = 1582;
callConv();
- State = 1565;
+ State = 1583;
type();
- State = 1566;
+ State = 1584;
methodName();
- State = 1568;
+ State = 1586;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- if (_la==T__84) {
+ if (_la==T__85) {
{
- State = 1567;
+ State = 1585;
typeArgs();
}
}
- State = 1570;
+ State = 1588;
sigArgs();
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 1572;
+ State = 1590;
callConv();
- State = 1573;
+ State = 1591;
type();
- State = 1574;
+ State = 1592;
methodName();
- State = 1575;
+ State = 1593;
genArityNotEmpty();
- State = 1576;
+ State = 1594;
sigArgs();
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 1578;
+ State = 1596;
mdtoken();
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 1579;
+ State = 1597;
dottedName();
}
break;
@@ -8605,45 +8671,45 @@ public CallConvContext callConv() {
CallConvContext _localctx = new CallConvContext(Context, State);
EnterRule(_localctx, 192, RULE_callConv);
try {
- State = 1592;
+ State = 1610;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,74,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 1582;
+ State = 1600;
Match(INSTANCE);
- State = 1583;
+ State = 1601;
callConv();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1584;
+ State = 1602;
Match(EXPLICIT);
- State = 1585;
+ State = 1603;
callConv();
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 1586;
+ State = 1604;
callKind();
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 1587;
- Match(T__110);
- State = 1588;
- Match(T__28);
- State = 1589;
- int32();
- State = 1590;
+ State = 1605;
+ Match(T__111);
+ State = 1606;
Match(T__29);
+ State = 1607;
+ int32();
+ State = 1608;
+ Match(T__30);
}
break;
}
@@ -8685,7 +8751,7 @@ public CallKindContext callKind() {
CallKindContext _localctx = new CallKindContext(Context, State);
EnterRule(_localctx, 194, RULE_callKind);
try {
- State = 1606;
+ State = 1624;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,75,Context) ) {
case 1:
@@ -8696,57 +8762,57 @@ public CallKindContext callKind() {
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1595;
+ State = 1613;
Match(DEFAULT);
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 1596;
+ State = 1614;
Match(VARARG);
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 1597;
+ State = 1615;
Match(UNMANAGED);
- State = 1598;
+ State = 1616;
Match(CDECL);
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 1599;
+ State = 1617;
Match(UNMANAGED);
- State = 1600;
+ State = 1618;
Match(STDCALL);
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 1601;
+ State = 1619;
Match(UNMANAGED);
- State = 1602;
+ State = 1620;
Match(THISCALL);
}
break;
case 7:
EnterOuterAlt(_localctx, 7);
{
- State = 1603;
+ State = 1621;
Match(UNMANAGED);
- State = 1604;
+ State = 1622;
Match(FASTCALL);
}
break;
case 8:
EnterOuterAlt(_localctx, 8);
{
- State = 1605;
+ State = 1623;
Match(UNMANAGED);
}
break;
@@ -8787,14 +8853,14 @@ public MdtokenContext mdtoken() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1608;
- Match(T__111);
- State = 1609;
- Match(T__28);
- State = 1610;
- int32();
- State = 1611;
+ State = 1626;
+ Match(T__112);
+ State = 1627;
Match(T__29);
+ State = 1628;
+ int32();
+ State = 1629;
+ Match(T__30);
}
}
catch (RecognitionException re) {
@@ -8837,31 +8903,31 @@ public MemberRefContext memberRef() {
MemberRefContext _localctx = new MemberRefContext(Context, State);
EnterRule(_localctx, 198, RULE_memberRef);
try {
- State = 1618;
+ State = 1636;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
case METHOD:
EnterOuterAlt(_localctx, 1);
{
- State = 1613;
+ State = 1631;
Match(METHOD);
- State = 1614;
+ State = 1632;
methodRef();
}
break;
- case T__35:
+ case T__36:
EnterOuterAlt(_localctx, 2);
{
- State = 1615;
- Match(T__35);
- State = 1616;
+ State = 1633;
+ Match(T__36);
+ State = 1634;
fieldRef();
}
break;
- case T__111:
+ case T__112:
EnterOuterAlt(_localctx, 3);
{
- State = 1617;
+ State = 1635;
mdtoken();
}
break;
@@ -8909,35 +8975,35 @@ public FieldRefContext fieldRef() {
FieldRefContext _localctx = new FieldRefContext(Context, State);
EnterRule(_localctx, 200, RULE_fieldRef);
try {
- State = 1629;
+ State = 1647;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,77,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 1620;
+ State = 1638;
type();
- State = 1621;
+ State = 1639;
typeSpec();
- State = 1622;
+ State = 1640;
Match(DCOLON);
- State = 1623;
+ State = 1641;
dottedName();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1625;
+ State = 1643;
type();
- State = 1626;
+ State = 1644;
dottedName();
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 1628;
+ State = 1646;
dottedName();
}
break;
@@ -8982,25 +9048,25 @@ public TypeListContext typeList() {
int _alt;
EnterOuterAlt(_localctx, 1);
{
- State = 1636;
+ State = 1654;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,78,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 1631;
+ State = 1649;
typeSpec();
- State = 1632;
- Match(T__26);
+ State = 1650;
+ Match(T__27);
}
}
}
- State = 1638;
+ State = 1656;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,78,Context);
}
- State = 1639;
+ State = 1657;
typeSpec();
}
}
@@ -9037,27 +9103,27 @@ public TyparsClauseContext typarsClause() {
TyparsClauseContext _localctx = new TyparsClauseContext(Context, State);
EnterRule(_localctx, 204, RULE_typarsClause);
try {
- State = 1646;
+ State = 1664;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__15:
- case T__28:
- case T__69:
+ case T__16:
+ case T__29:
case T__70:
- case T__83:
+ case T__71:
+ case T__84:
EnterOuterAlt(_localctx, 1);
{
}
break;
- case T__84:
+ case T__85:
EnterOuterAlt(_localctx, 2);
{
- State = 1642;
- Match(T__84);
- State = 1643;
- typars();
- State = 1644;
+ State = 1660;
Match(T__85);
+ State = 1661;
+ typars();
+ State = 1662;
+ Match(T__86);
}
break;
default:
@@ -9106,62 +9172,62 @@ public TyparAttribContext typarAttrib() {
TyparAttribContext _localctx = new TyparAttribContext(Context, State);
EnterRule(_localctx, 206, RULE_typarAttrib);
try {
- State = 1659;
+ State = 1677;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
case PLUS:
EnterOuterAlt(_localctx, 1);
{
- State = 1648;
+ State = 1666;
_localctx.covariant = Match(PLUS);
}
break;
- case T__112:
+ case T__113:
EnterOuterAlt(_localctx, 2);
{
- State = 1649;
- _localctx.contravariant = Match(T__112);
+ State = 1667;
+ _localctx.contravariant = Match(T__113);
}
break;
- case T__37:
+ case T__38:
EnterOuterAlt(_localctx, 3);
{
- State = 1650;
- _localctx.@class = Match(T__37);
+ State = 1668;
+ _localctx.@class = Match(T__38);
}
break;
case VALUETYPE:
EnterOuterAlt(_localctx, 4);
{
- State = 1651;
+ State = 1669;
_localctx.valuetype = Match(VALUETYPE);
}
break;
- case T__113:
+ case T__114:
EnterOuterAlt(_localctx, 5);
{
- State = 1652;
- _localctx.byrefLike = Match(T__113);
+ State = 1670;
+ _localctx.byrefLike = Match(T__114);
}
break;
- case T__114:
+ case T__115:
EnterOuterAlt(_localctx, 6);
{
- State = 1653;
- _localctx.ctor = Match(T__114);
+ State = 1671;
+ _localctx.ctor = Match(T__115);
}
break;
- case T__68:
+ case T__69:
EnterOuterAlt(_localctx, 7);
{
- State = 1654;
- Match(T__68);
- State = 1655;
- Match(T__28);
- State = 1656;
- _localctx.flags = int32();
- State = 1657;
+ State = 1672;
+ Match(T__69);
+ State = 1673;
Match(T__29);
+ State = 1674;
+ _localctx.flags = int32();
+ State = 1675;
+ Match(T__30);
}
break;
default:
@@ -9207,17 +9273,17 @@ public TyparAttribsContext typarAttribs() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1664;
+ State = 1682;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while (_la==T__37 || ((((_la - 69)) & ~0x3f) == 0 && ((1L << (_la - 69)) & 123145302310913L) != 0) || _la==VALUETYPE || _la==PLUS) {
+ while (_la==T__38 || ((((_la - 70)) & ~0x3f) == 0 && ((1L << (_la - 70)) & 123145302310913L) != 0) || _la==VALUETYPE || _la==PLUS) {
{
{
- State = 1661;
+ State = 1679;
typarAttrib();
}
}
- State = 1666;
+ State = 1684;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -9265,19 +9331,19 @@ public TyparContext typar() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1667;
+ State = 1685;
typarAttribs();
- State = 1669;
+ State = 1687;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- if (_la==T__28) {
+ if (_la==T__29) {
{
- State = 1668;
+ State = 1686;
tyBound();
}
}
- State = 1671;
+ State = 1689;
dottedName();
}
}
@@ -9320,25 +9386,25 @@ public TyparsContext typars() {
int _alt;
EnterOuterAlt(_localctx, 1);
{
- State = 1678;
+ State = 1696;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,83,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 1673;
+ State = 1691;
typar();
- State = 1674;
- Match(T__26);
+ State = 1692;
+ Match(T__27);
}
}
}
- State = 1680;
+ State = 1698;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,83,Context);
}
- State = 1681;
+ State = 1699;
typar();
}
}
@@ -9377,12 +9443,12 @@ public TyBoundContext tyBound() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1683;
- Match(T__28);
- State = 1684;
- typeList();
- State = 1685;
+ State = 1701;
Match(T__29);
+ State = 1702;
+ typeList();
+ State = 1703;
+ Match(T__30);
}
}
catch (RecognitionException re) {
@@ -9418,19 +9484,19 @@ public GenArityContext genArity() {
GenArityContext _localctx = new GenArityContext(Context, State);
EnterRule(_localctx, 216, RULE_genArity);
try {
- State = 1689;
+ State = 1707;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__28:
- case T__83:
+ case T__29:
+ case T__84:
EnterOuterAlt(_localctx, 1);
{
}
break;
- case T__84:
+ case T__85:
EnterOuterAlt(_localctx, 2);
{
- State = 1688;
+ State = 1706;
genArityNotEmpty();
}
break;
@@ -9473,16 +9539,16 @@ public GenArityNotEmptyContext genArityNotEmpty() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1691;
- Match(T__84);
- State = 1692;
- Match(T__40);
- State = 1693;
- int32();
- State = 1694;
- Match(T__41);
- State = 1695;
+ State = 1709;
Match(T__85);
+ State = 1710;
+ Match(T__41);
+ State = 1711;
+ int32();
+ State = 1712;
+ Match(T__42);
+ State = 1713;
+ Match(T__86);
}
}
catch (RecognitionException re) {
@@ -9627,235 +9693,235 @@ public ClassDeclContext classDecl() {
EnterRule(_localctx, 220, RULE_classDecl);
try {
int _alt;
- State = 1813;
+ State = 1831;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,89,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 1697;
+ State = 1715;
methodHead();
- State = 1698;
- Match(T__15);
- State = 1699;
- methodDecls();
- State = 1700;
+ State = 1716;
Match(T__16);
+ State = 1717;
+ methodDecls();
+ State = 1718;
+ Match(T__17);
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1702;
+ State = 1720;
classHead();
- State = 1703;
- Match(T__15);
- State = 1704;
- classDecls();
- State = 1705;
+ State = 1721;
Match(T__16);
+ State = 1722;
+ classDecls();
+ State = 1723;
+ Match(T__17);
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 1707;
+ State = 1725;
eventHead();
- State = 1708;
- Match(T__15);
- State = 1709;
- eventDecls();
- State = 1710;
+ State = 1726;
Match(T__16);
+ State = 1727;
+ eventDecls();
+ State = 1728;
+ Match(T__17);
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 1712;
+ State = 1730;
propHead();
- State = 1713;
- Match(T__15);
- State = 1714;
- propDecls();
- State = 1715;
+ State = 1731;
Match(T__16);
+ State = 1732;
+ propDecls();
+ State = 1733;
+ Match(T__17);
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 1717;
+ State = 1735;
fieldDecl();
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 1718;
+ State = 1736;
dataDecl();
}
break;
case 7:
EnterOuterAlt(_localctx, 7);
{
- State = 1719;
+ State = 1737;
secDecl();
}
break;
case 8:
EnterOuterAlt(_localctx, 8);
{
- State = 1720;
+ State = 1738;
extSourceSpec();
}
break;
case 9:
EnterOuterAlt(_localctx, 9);
{
- State = 1721;
+ State = 1739;
customAttrDecl();
}
break;
case 10:
EnterOuterAlt(_localctx, 10);
{
- State = 1722;
- Match(T__115);
- State = 1723;
+ State = 1740;
+ Match(T__116);
+ State = 1741;
int32();
}
break;
case 11:
EnterOuterAlt(_localctx, 11);
{
- State = 1724;
- Match(T__116);
- State = 1725;
+ State = 1742;
+ Match(T__117);
+ State = 1743;
int32();
}
break;
case 12:
EnterOuterAlt(_localctx, 12);
{
- State = 1726;
+ State = 1744;
exportHead();
- State = 1727;
- Match(T__15);
- State = 1728;
- exptypeDecls();
- State = 1729;
+ State = 1745;
Match(T__16);
+ State = 1746;
+ exptypeDecls();
+ State = 1747;
+ Match(T__17);
}
break;
case 13:
EnterOuterAlt(_localctx, 13);
{
- State = 1731;
+ State = 1749;
Match(OVERRIDE);
- State = 1732;
+ State = 1750;
typeSpec();
- State = 1733;
+ State = 1751;
Match(DCOLON);
- State = 1734;
+ State = 1752;
methodName();
- State = 1735;
- Match(T__117);
- State = 1736;
+ State = 1753;
+ Match(T__118);
+ State = 1754;
callConv();
- State = 1737;
+ State = 1755;
type();
- State = 1738;
+ State = 1756;
typeSpec();
- State = 1739;
+ State = 1757;
Match(DCOLON);
- State = 1740;
+ State = 1758;
methodName();
- State = 1741;
+ State = 1759;
sigArgs();
}
break;
case 14:
EnterOuterAlt(_localctx, 14);
{
- State = 1743;
+ State = 1761;
Match(OVERRIDE);
- State = 1744;
+ State = 1762;
Match(METHOD);
- State = 1745;
+ State = 1763;
callConv();
- State = 1746;
+ State = 1764;
type();
- State = 1747;
+ State = 1765;
typeSpec();
- State = 1748;
+ State = 1766;
Match(DCOLON);
- State = 1749;
+ State = 1767;
methodName();
- State = 1750;
+ State = 1768;
genArity();
- State = 1751;
+ State = 1769;
sigArgs();
- State = 1752;
- Match(T__117);
- State = 1753;
+ State = 1770;
+ Match(T__118);
+ State = 1771;
Match(METHOD);
- State = 1754;
+ State = 1772;
callConv();
- State = 1755;
+ State = 1773;
type();
- State = 1756;
+ State = 1774;
typeSpec();
- State = 1757;
+ State = 1775;
Match(DCOLON);
- State = 1758;
+ State = 1776;
methodName();
- State = 1759;
+ State = 1777;
genArity();
- State = 1760;
+ State = 1778;
sigArgs();
}
break;
case 15:
EnterOuterAlt(_localctx, 15);
{
- State = 1762;
+ State = 1780;
languageDecl();
}
break;
case 16:
EnterOuterAlt(_localctx, 16);
{
- State = 1763;
+ State = 1781;
compControl();
}
break;
case 17:
EnterOuterAlt(_localctx, 17);
{
- State = 1764;
+ State = 1782;
Match(PARAM);
- State = 1765;
+ State = 1783;
Match(TYPE);
- State = 1766;
- Match(T__40);
- State = 1767;
- int32();
- State = 1768;
+ State = 1784;
Match(T__41);
- State = 1772;
+ State = 1785;
+ int32();
+ State = 1786;
+ Match(T__42);
+ State = 1790;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,85,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 1769;
+ State = 1787;
customAttrDecl();
}
}
}
- State = 1774;
+ State = 1792;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,85,Context);
}
@@ -9864,25 +9930,25 @@ public ClassDeclContext classDecl() {
case 18:
EnterOuterAlt(_localctx, 18);
{
- State = 1775;
+ State = 1793;
Match(PARAM);
- State = 1776;
+ State = 1794;
Match(TYPE);
- State = 1777;
+ State = 1795;
dottedName();
- State = 1781;
+ State = 1799;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,86,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 1778;
+ State = 1796;
customAttrDecl();
}
}
}
- State = 1783;
+ State = 1801;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,86,Context);
}
@@ -9891,33 +9957,33 @@ public ClassDeclContext classDecl() {
case 19:
EnterOuterAlt(_localctx, 19);
{
- State = 1784;
+ State = 1802;
Match(PARAM);
- State = 1785;
+ State = 1803;
Match(CONSTRAINT);
- State = 1786;
- Match(T__40);
- State = 1787;
- int32();
- State = 1788;
+ State = 1804;
Match(T__41);
- State = 1789;
- Match(T__26);
- State = 1790;
+ State = 1805;
+ int32();
+ State = 1806;
+ Match(T__42);
+ State = 1807;
+ Match(T__27);
+ State = 1808;
typeSpec();
- State = 1794;
+ State = 1812;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,87,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 1791;
+ State = 1809;
customAttrDecl();
}
}
}
- State = 1796;
+ State = 1814;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,87,Context);
}
@@ -9926,29 +9992,29 @@ public ClassDeclContext classDecl() {
case 20:
EnterOuterAlt(_localctx, 20);
{
- State = 1797;
+ State = 1815;
Match(PARAM);
- State = 1798;
+ State = 1816;
Match(CONSTRAINT);
- State = 1799;
+ State = 1817;
dottedName();
- State = 1800;
- Match(T__26);
- State = 1801;
+ State = 1818;
+ Match(T__27);
+ State = 1819;
typeSpec();
- State = 1805;
+ State = 1823;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,88,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 1802;
+ State = 1820;
customAttrDecl();
}
}
}
- State = 1807;
+ State = 1825;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,88,Context);
}
@@ -9957,13 +10023,13 @@ public ClassDeclContext classDecl() {
case 21:
EnterOuterAlt(_localctx, 21);
{
- State = 1808;
- Match(T__118);
- State = 1809;
+ State = 1826;
+ Match(T__119);
+ State = 1827;
Match(TYPE);
- State = 1810;
+ State = 1828;
typeSpec();
- State = 1811;
+ State = 1829;
customDescr();
}
break;
@@ -10025,69 +10091,71 @@ public override TResult Accept(IParseTreeVisitor visitor) {
public FieldDeclContext fieldDecl() {
FieldDeclContext _localctx = new FieldDeclContext(Context, State);
EnterRule(_localctx, 222, RULE_fieldDecl);
- int _la;
try {
+ int _alt;
EnterOuterAlt(_localctx, 1);
{
- State = 1815;
- Match(T__119);
- State = 1816;
+ State = 1833;
+ Match(T__120);
+ State = 1834;
repeatOpt();
- State = 1825;
+ State = 1843;
ErrorHandler.Sync(this);
- _la = TokenStream.LA(1);
- while ((((_la) & ~0x3f) == 0 && ((1L << _la) & -4608308318706860032L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -144115188075855813L) != 0)) {
- {
- State = 1823;
- ErrorHandler.Sync(this);
- switch (TokenStream.LA(1)) {
- case T__49:
- case T__50:
- case T__61:
- case T__62:
- case T__63:
- case T__64:
- case T__66:
- case T__67:
- case T__68:
- case T__121:
- case T__122:
- case T__123:
- case T__124:
- case T__125:
- case T__126:
- {
- State = 1817;
- fieldAttr();
- }
- break;
- case T__120:
+ _alt = Interpreter.AdaptivePredict(TokenStream,91,Context);
+ while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
+ if ( _alt==1 ) {
{
- State = 1818;
- Match(T__120);
- State = 1819;
- Match(T__28);
- State = 1820;
- marshalBlob();
- State = 1821;
- Match(T__29);
+ State = 1841;
+ ErrorHandler.Sync(this);
+ switch (TokenStream.LA(1)) {
+ case T__15:
+ case T__50:
+ case T__51:
+ case T__62:
+ case T__63:
+ case T__64:
+ case T__65:
+ case T__67:
+ case T__68:
+ case T__69:
+ case T__122:
+ case T__123:
+ case T__124:
+ case T__125:
+ case T__126:
+ {
+ State = 1835;
+ fieldAttr();
+ }
+ break;
+ case T__121:
+ {
+ State = 1836;
+ Match(T__121);
+ State = 1837;
+ Match(T__29);
+ State = 1838;
+ marshalBlob();
+ State = 1839;
+ Match(T__30);
+ }
+ break;
+ default:
+ throw new NoViableAltException(this);
}
- break;
- default:
- throw new NoViableAltException(this);
- }
+ }
}
- State = 1827;
+ State = 1845;
ErrorHandler.Sync(this);
- _la = TokenStream.LA(1);
+ _alt = Interpreter.AdaptivePredict(TokenStream,91,Context);
}
- State = 1828;
+ State = 1846;
type();
- State = 1829;
+ State = 1847;
dottedName();
- State = 1830;
+ State = 1848;
atOpt();
- State = 1831;
+ State = 1849;
initOpt();
}
}
@@ -10124,118 +10192,118 @@ public FieldAttrContext fieldAttr() {
FieldAttrContext _localctx = new FieldAttrContext(Context, State);
EnterRule(_localctx, 224, RULE_fieldAttr);
try {
- State = 1852;
+ State = 1870;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__121:
+ case T__122:
EnterOuterAlt(_localctx, 1);
{
- State = 1833;
- Match(T__121);
+ State = 1851;
+ Match(T__122);
}
break;
- case T__49:
+ case T__50:
EnterOuterAlt(_localctx, 2);
{
- State = 1834;
- Match(T__49);
+ State = 1852;
+ Match(T__50);
}
break;
- case T__50:
+ case T__51:
EnterOuterAlt(_localctx, 3);
{
- State = 1835;
- Match(T__50);
+ State = 1853;
+ Match(T__51);
}
break;
- case T__61:
+ case T__62:
EnterOuterAlt(_localctx, 4);
{
- State = 1836;
- Match(T__61);
+ State = 1854;
+ Match(T__62);
}
break;
- case T__122:
+ case T__123:
EnterOuterAlt(_localctx, 5);
{
- State = 1837;
- Match(T__122);
+ State = 1855;
+ Match(T__123);
}
break;
- case T__67:
+ case T__68:
EnterOuterAlt(_localctx, 6);
{
- State = 1838;
- Match(T__67);
+ State = 1856;
+ Match(T__68);
}
break;
- case T__66:
+ case T__67:
EnterOuterAlt(_localctx, 7);
{
- State = 1839;
- Match(T__66);
- }
- break;
- case T__62:
- EnterOuterAlt(_localctx, 8);
- {
- State = 1840;
- Match(T__62);
+ State = 1857;
+ Match(T__67);
}
break;
case T__63:
- EnterOuterAlt(_localctx, 9);
+ EnterOuterAlt(_localctx, 8);
{
- State = 1841;
+ State = 1858;
Match(T__63);
}
break;
case T__64:
- EnterOuterAlt(_localctx, 10);
+ EnterOuterAlt(_localctx, 9);
{
- State = 1842;
+ State = 1859;
Match(T__64);
}
break;
- case T__123:
- EnterOuterAlt(_localctx, 11);
+ case T__65:
+ EnterOuterAlt(_localctx, 10);
{
- State = 1843;
- Match(T__123);
+ State = 1860;
+ Match(T__65);
}
break;
case T__124:
- EnterOuterAlt(_localctx, 12);
+ EnterOuterAlt(_localctx, 11);
{
- State = 1844;
+ State = 1861;
Match(T__124);
}
break;
case T__125:
- EnterOuterAlt(_localctx, 13);
+ EnterOuterAlt(_localctx, 12);
{
- State = 1845;
+ State = 1862;
Match(T__125);
}
break;
case T__126:
- EnterOuterAlt(_localctx, 14);
+ EnterOuterAlt(_localctx, 13);
{
- State = 1846;
+ State = 1863;
Match(T__126);
}
break;
- case T__68:
+ case T__15:
+ EnterOuterAlt(_localctx, 14);
+ {
+ State = 1864;
+ Match(T__15);
+ }
+ break;
+ case T__69:
EnterOuterAlt(_localctx, 15);
{
- State = 1847;
- Match(T__68);
- State = 1848;
- Match(T__28);
- State = 1849;
- int32();
- State = 1850;
+ State = 1865;
+ Match(T__69);
+ State = 1866;
Match(T__29);
+ State = 1867;
+ int32();
+ State = 1868;
+ Match(T__30);
}
break;
default:
@@ -10278,7 +10346,7 @@ public AtOptContext atOpt() {
AtOptContext _localctx = new AtOptContext(Context, State);
EnterRule(_localctx, 226, RULE_atOpt);
try {
- State = 1859;
+ State = 1877;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,93,Context) ) {
case 1:
@@ -10289,18 +10357,18 @@ public AtOptContext atOpt() {
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1855;
- Match(T__42);
- State = 1856;
+ State = 1873;
+ Match(T__43);
+ State = 1874;
id();
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 1857;
- Match(T__42);
- State = 1858;
+ State = 1875;
+ Match(T__43);
+ State = 1876;
int32();
}
break;
@@ -10339,7 +10407,7 @@ public InitOptContext initOpt() {
InitOptContext _localctx = new InitOptContext(Context, State);
EnterRule(_localctx, 228, RULE_initOpt);
try {
- State = 1864;
+ State = 1882;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
case T__0:
@@ -10362,25 +10430,26 @@ public InitOptContext initOpt() {
case T__17:
case T__18:
case T__19:
- case T__21:
+ case T__20:
case T__22:
case T__23:
case T__24:
case T__25:
- case T__27:
- case T__30:
+ case T__26:
+ case T__28:
case T__31:
- case T__33:
- case T__39:
- case T__46:
+ case T__32:
+ case T__34:
+ case T__40:
case T__47:
case T__48:
- case T__71:
+ case T__49:
case T__72:
- case T__115:
+ case T__73:
case T__116:
- case T__118:
+ case T__117:
case T__119:
+ case T__120:
case T__127:
case T__132:
case T__138:
@@ -10429,12 +10498,12 @@ public InitOptContext initOpt() {
{
}
break;
- case T__34:
+ case T__35:
EnterOuterAlt(_localctx, 2);
{
- State = 1862;
- Match(T__34);
- State = 1863;
+ State = 1880;
+ Match(T__35);
+ State = 1881;
fieldInit();
}
break;
@@ -10475,22 +10544,22 @@ public RepeatOptContext repeatOpt() {
RepeatOptContext _localctx = new RepeatOptContext(Context, State);
EnterRule(_localctx, 230, RULE_repeatOpt);
try {
- State = 1871;
+ State = 1889;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
case T__0:
- case T__37:
- case T__49:
+ case T__15:
+ case T__38:
case T__50:
- case T__61:
+ case T__51:
case T__62:
case T__63:
case T__64:
- case T__66:
+ case T__65:
case T__67:
case T__68:
- case T__92:
- case T__120:
+ case T__69:
+ case T__89:
case T__121:
case T__122:
case T__123:
@@ -10527,15 +10596,15 @@ public RepeatOptContext repeatOpt() {
{
}
break;
- case T__40:
+ case T__41:
EnterOuterAlt(_localctx, 2);
{
- State = 1867;
- Match(T__40);
- State = 1868;
- int32();
- State = 1869;
+ State = 1885;
Match(T__41);
+ State = 1886;
+ int32();
+ State = 1887;
+ Match(T__42);
}
break;
default:
@@ -10585,54 +10654,54 @@ public EventHeadContext eventHead() {
EnterRule(_localctx, 232, RULE_eventHead);
int _la;
try {
- State = 1891;
+ State = 1909;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,98,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 1873;
+ State = 1891;
Match(T__127);
- State = 1877;
+ State = 1895;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while (_la==T__66 || _la==T__67) {
+ while (_la==T__67 || _la==T__68) {
{
{
- State = 1874;
+ State = 1892;
eventAttr();
}
}
- State = 1879;
+ State = 1897;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
- State = 1880;
+ State = 1898;
typeSpec();
- State = 1881;
+ State = 1899;
dottedName();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1883;
+ State = 1901;
Match(T__127);
- State = 1887;
+ State = 1905;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while (_la==T__66 || _la==T__67) {
+ while (_la==T__67 || _la==T__68) {
{
{
- State = 1884;
+ State = 1902;
eventAttr();
}
}
- State = 1889;
+ State = 1907;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
- State = 1890;
+ State = 1908;
dottedName();
}
break;
@@ -10671,9 +10740,9 @@ public EventAttrContext eventAttr() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1893;
+ State = 1911;
_la = TokenStream.LA(1);
- if ( !(_la==T__66 || _la==T__67) ) {
+ if ( !(_la==T__67 || _la==T__68) ) {
ErrorHandler.RecoverInline(this);
}
else {
@@ -10721,17 +10790,17 @@ public EventDeclsContext eventDecls() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1898;
+ State = 1916;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 19394461696L) != 0) || ((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & 2161727821137838083L) != 0) || _la==VALUE || _la==INSTANCE || ((((_la - 263)) & ~0x3f) == 0 && ((1L << (_la - 263)) & 50332665L) != 0)) {
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 38788988928L) != 0) || ((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & 1080863910568919043L) != 0) || _la==VALUE || _la==INSTANCE || ((((_la - 264)) & ~0x3f) == 0 && ((1L << (_la - 264)) & 50332665L) != 0)) {
{
{
- State = 1895;
+ State = 1913;
eventDecl();
}
}
- State = 1900;
+ State = 1918;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -10782,54 +10851,55 @@ public EventDeclContext eventDecl() {
EventDeclContext _localctx = new EventDeclContext(Context, State);
EnterRule(_localctx, 238, RULE_eventDecl);
try {
- State = 1913;
+ State = 1931;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
case T__128:
EnterOuterAlt(_localctx, 1);
{
- State = 1901;
+ State = 1919;
Match(T__128);
- State = 1902;
+ State = 1920;
methodRef();
}
break;
case T__129:
EnterOuterAlt(_localctx, 2);
{
- State = 1903;
+ State = 1921;
Match(T__129);
- State = 1904;
+ State = 1922;
methodRef();
}
break;
case T__130:
EnterOuterAlt(_localctx, 3);
{
- State = 1905;
+ State = 1923;
Match(T__130);
- State = 1906;
+ State = 1924;
methodRef();
}
break;
case T__131:
EnterOuterAlt(_localctx, 4);
{
- State = 1907;
+ State = 1925;
Match(T__131);
- State = 1908;
+ State = 1926;
methodRef();
}
break;
- case T__71:
case T__72:
+ case T__73:
EnterOuterAlt(_localctx, 5);
{
- State = 1909;
+ State = 1927;
extSourceSpec();
}
break;
- case T__33:
+ case T__15:
+ case T__34:
case VALUE:
case INSTANCE:
case SQSTRING:
@@ -10837,18 +10907,18 @@ public EventDeclContext eventDecl() {
case ID:
EnterOuterAlt(_localctx, 6);
{
- State = 1910;
+ State = 1928;
customAttrDecl();
}
break;
- case T__25:
+ case T__26:
EnterOuterAlt(_localctx, 7);
{
- State = 1911;
+ State = 1929;
languageDecl();
}
break;
- case T__30:
+ case T__31:
case PP_DEFINE:
case PP_UNDEF:
case PP_IFDEF:
@@ -10858,7 +10928,7 @@ public EventDeclContext eventDecl() {
case PP_INCLUDE:
EnterOuterAlt(_localctx, 8);
{
- State = 1912;
+ State = 1930;
compControl();
}
break;
@@ -10920,31 +10990,31 @@ public PropHeadContext propHead() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1915;
+ State = 1933;
Match(T__132);
- State = 1919;
+ State = 1937;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while (_la==T__66 || _la==T__67) {
+ while (_la==T__67 || _la==T__68) {
{
{
- State = 1916;
+ State = 1934;
propAttr();
}
}
- State = 1921;
+ State = 1939;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
- State = 1922;
+ State = 1940;
callConv();
- State = 1923;
+ State = 1941;
type();
- State = 1924;
+ State = 1942;
dottedName();
- State = 1925;
+ State = 1943;
sigArgs();
- State = 1926;
+ State = 1944;
initOpt();
}
}
@@ -10981,9 +11051,9 @@ public PropAttrContext propAttr() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1928;
+ State = 1946;
_la = TokenStream.LA(1);
- if ( !(_la==T__66 || _la==T__67) ) {
+ if ( !(_la==T__67 || _la==T__68) ) {
ErrorHandler.RecoverInline(this);
}
else {
@@ -11031,17 +11101,17 @@ public PropDeclsContext propDecls() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1933;
+ State = 1951;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 19394461696L) != 0) || ((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & -3458764513820540925L) != 0) || _la==VALUE || _la==INSTANCE || ((((_la - 263)) & ~0x3f) == 0 && ((1L << (_la - 263)) & 50332665L) != 0)) {
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 38788988928L) != 0) || ((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & 7493989779944505347L) != 0) || _la==VALUE || _la==INSTANCE || ((((_la - 264)) & ~0x3f) == 0 && ((1L << (_la - 264)) & 50332665L) != 0)) {
{
{
- State = 1930;
+ State = 1948;
propDecl();
}
}
- State = 1935;
+ State = 1953;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -11092,37 +11162,38 @@ public PropDeclContext propDecl() {
PropDeclContext _localctx = new PropDeclContext(Context, State);
EnterRule(_localctx, 246, RULE_propDecl);
try {
- State = 1946;
+ State = 1964;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
case T__133:
EnterOuterAlt(_localctx, 1);
{
- State = 1936;
+ State = 1954;
Match(T__133);
- State = 1937;
+ State = 1955;
methodRef();
}
break;
case T__134:
EnterOuterAlt(_localctx, 2);
{
- State = 1938;
+ State = 1956;
Match(T__134);
- State = 1939;
+ State = 1957;
methodRef();
}
break;
case T__131:
EnterOuterAlt(_localctx, 3);
{
- State = 1940;
+ State = 1958;
Match(T__131);
- State = 1941;
+ State = 1959;
methodRef();
}
break;
- case T__33:
+ case T__15:
+ case T__34:
case VALUE:
case INSTANCE:
case SQSTRING:
@@ -11130,26 +11201,26 @@ public PropDeclContext propDecl() {
case ID:
EnterOuterAlt(_localctx, 4);
{
- State = 1942;
+ State = 1960;
customAttrDecl();
}
break;
- case T__71:
case T__72:
+ case T__73:
EnterOuterAlt(_localctx, 5);
{
- State = 1943;
+ State = 1961;
extSourceSpec();
}
break;
- case T__25:
+ case T__26:
EnterOuterAlt(_localctx, 6);
{
- State = 1944;
+ State = 1962;
languageDecl();
}
break;
- case T__30:
+ case T__31:
case PP_DEFINE:
case PP_UNDEF:
case PP_IFDEF:
@@ -11159,7 +11230,7 @@ public PropDeclContext propDecl() {
case PP_INCLUDE:
EnterOuterAlt(_localctx, 7);
{
- State = 1945;
+ State = 1963;
compControl();
}
break;
@@ -11200,7 +11271,7 @@ public MarshalClauseContext marshalClause() {
MarshalClauseContext _localctx = new MarshalClauseContext(Context, State);
EnterRule(_localctx, 248, RULE_marshalClause);
try {
- State = 1954;
+ State = 1972;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
case T__0:
@@ -11218,9 +11289,10 @@ public MarshalClauseContext marshalClause() {
case T__12:
case T__13:
case T__14:
- case T__26:
- case T__29:
- case T__114:
+ case T__15:
+ case T__27:
+ case T__30:
+ case T__115:
case T__154:
case VALUE:
case INSTANCE:
@@ -11232,17 +11304,17 @@ public MarshalClauseContext marshalClause() {
{
}
break;
- case T__120:
+ case T__121:
EnterOuterAlt(_localctx, 2);
{
- State = 1949;
- Match(T__120);
- State = 1950;
- Match(T__28);
- State = 1951;
- marshalBlob();
- State = 1952;
+ State = 1967;
+ Match(T__121);
+ State = 1968;
Match(T__29);
+ State = 1969;
+ marshalBlob();
+ State = 1970;
+ Match(T__30);
}
break;
default:
@@ -11289,13 +11361,15 @@ public MarshalBlobContext marshalBlob() {
EnterRule(_localctx, 250, RULE_marshalBlob);
int _la;
try {
- State = 1965;
+ State = 1983;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__29:
- case T__32:
- case T__40:
- case T__60:
+ case T__15:
+ case T__30:
+ case T__33:
+ case T__41:
+ case T__61:
+ case T__89:
case BOOL:
case INT8:
case INT16:
@@ -11342,31 +11416,31 @@ public MarshalBlobContext marshalBlob() {
case ID:
EnterOuterAlt(_localctx, 1);
{
- State = 1956;
+ State = 1974;
nativeType();
}
break;
- case T__15:
+ case T__16:
EnterOuterAlt(_localctx, 2);
{
- State = 1957;
- Match(T__15);
- State = 1959;
+ State = 1975;
+ Match(T__16);
+ State = 1977;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
do {
{
{
- State = 1958;
+ State = 1976;
hexbyte();
}
}
- State = 1961;
+ State = 1979;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
} while ( _la==INT32 || _la==ID || _la==HEXBYTE );
- State = 1963;
- Match(T__16);
+ State = 1981;
+ Match(T__17);
}
break;
default:
@@ -11412,17 +11486,17 @@ public ParamAttrContext paramAttr() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1970;
+ State = 1988;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while (_la==T__40) {
+ while (_la==T__41) {
{
{
- State = 1967;
+ State = 1985;
paramAttrElement();
}
}
- State = 1972;
+ State = 1990;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -11464,51 +11538,51 @@ public ParamAttrElementContext paramAttrElement() {
ParamAttrElementContext _localctx = new ParamAttrElementContext(Context, State);
EnterRule(_localctx, 254, RULE_paramAttrElement);
try {
- State = 1986;
+ State = 2004;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,108,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 1973;
- Match(T__40);
- State = 1974;
- _localctx.@in = Match(T__135);
- State = 1975;
+ State = 1991;
Match(T__41);
+ State = 1992;
+ _localctx.@in = Match(T__135);
+ State = 1993;
+ Match(T__42);
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1976;
- Match(T__40);
- State = 1977;
- _localctx.@out = Match(T__136);
- State = 1978;
+ State = 1994;
Match(T__41);
+ State = 1995;
+ _localctx.@out = Match(T__136);
+ State = 1996;
+ Match(T__42);
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 1979;
- Match(T__40);
- State = 1980;
- _localctx.opt = Match(T__137);
- State = 1981;
+ State = 1997;
Match(T__41);
+ State = 1998;
+ _localctx.opt = Match(T__137);
+ State = 1999;
+ Match(T__42);
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 1982;
- Match(T__40);
- State = 1983;
- int32();
- State = 1984;
+ State = 2000;
Match(T__41);
+ State = 2001;
+ int32();
+ State = 2002;
+ Match(T__42);
}
break;
}
@@ -11585,28 +11659,28 @@ public MethodHeadContext methodHead() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1988;
+ State = 2006;
Match(T__138);
- State = 1993;
+ State = 2011;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while (((((_la - 50)) & ~0x3f) == 0 && ((1L << (_la - 50)) & 978955L) != 0) || ((((_la - 122)) & ~0x3f) == 0 && ((1L << (_la - 122)) & 66846725L) != 0)) {
+ while (((((_la - 51)) & ~0x3f) == 0 && ((1L << (_la - 51)) & 978955L) != 0) || ((((_la - 123)) & ~0x3f) == 0 && ((1L << (_la - 123)) & 33423365L) != 0)) {
{
- State = 1991;
+ State = 2009;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__49:
case T__50:
- case T__52:
- case T__61:
+ case T__51:
+ case T__53:
case T__62:
case T__63:
case T__64:
- case T__66:
+ case T__65:
case T__67:
case T__68:
- case T__121:
- case T__123:
+ case T__69:
+ case T__122:
+ case T__124:
case T__139:
case T__140:
case T__141:
@@ -11615,13 +11689,13 @@ public MethodHeadContext methodHead() {
case T__144:
case T__145:
{
- State = 1989;
+ State = 2007;
methAttr();
}
break;
case T__146:
{
- State = 1990;
+ State = 2008;
pinvImpl();
}
break;
@@ -11629,35 +11703,35 @@ public MethodHeadContext methodHead() {
throw new NoViableAltException(this);
}
}
- State = 1995;
+ State = 2013;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
- State = 1996;
+ State = 2014;
callConv();
- State = 1997;
+ State = 2015;
paramAttr();
- State = 1998;
+ State = 2016;
type();
- State = 1999;
+ State = 2017;
marshalClause();
- State = 2000;
+ State = 2018;
methodName();
- State = 2001;
+ State = 2019;
typarsClause();
- State = 2002;
+ State = 2020;
sigArgs();
- State = 2006;
+ State = 2024;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 32766L) != 0) || _la==T__68 || _la==T__155 || _la==UNMANAGED) {
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 32766L) != 0) || _la==T__69 || _la==T__155 || _la==UNMANAGED) {
{
{
- State = 2003;
+ State = 2021;
implAttr();
}
}
- State = 2008;
+ State = 2026;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -11696,146 +11770,146 @@ public MethAttrContext methAttr() {
MethAttrContext _localctx = new MethAttrContext(Context, State);
EnterRule(_localctx, 258, RULE_methAttr);
try {
- State = 2032;
+ State = 2050;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__121:
+ case T__122:
EnterOuterAlt(_localctx, 1);
{
- State = 2009;
- Match(T__121);
+ State = 2027;
+ Match(T__122);
}
break;
- case T__49:
+ case T__50:
EnterOuterAlt(_localctx, 2);
{
- State = 2010;
- Match(T__49);
+ State = 2028;
+ Match(T__50);
}
break;
- case T__50:
+ case T__51:
EnterOuterAlt(_localctx, 3);
{
- State = 2011;
- Match(T__50);
+ State = 2029;
+ Match(T__51);
}
break;
- case T__61:
+ case T__62:
EnterOuterAlt(_localctx, 4);
{
- State = 2012;
- Match(T__61);
+ State = 2030;
+ Match(T__62);
}
break;
case T__139:
EnterOuterAlt(_localctx, 5);
{
- State = 2013;
+ State = 2031;
Match(T__139);
}
break;
- case T__66:
+ case T__67:
EnterOuterAlt(_localctx, 6);
{
- State = 2014;
- Match(T__66);
+ State = 2032;
+ Match(T__67);
}
break;
case T__140:
EnterOuterAlt(_localctx, 7);
{
- State = 2015;
+ State = 2033;
Match(T__140);
}
break;
case T__141:
EnterOuterAlt(_localctx, 8);
{
- State = 2016;
+ State = 2034;
Match(T__141);
}
break;
- case T__52:
+ case T__53:
EnterOuterAlt(_localctx, 9);
{
- State = 2017;
- Match(T__52);
+ State = 2035;
+ Match(T__53);
}
break;
- case T__62:
+ case T__63:
EnterOuterAlt(_localctx, 10);
{
- State = 2018;
- Match(T__62);
+ State = 2036;
+ Match(T__63);
}
break;
- case T__63:
+ case T__64:
EnterOuterAlt(_localctx, 11);
{
- State = 2019;
- Match(T__63);
+ State = 2037;
+ Match(T__64);
}
break;
- case T__64:
+ case T__65:
EnterOuterAlt(_localctx, 12);
{
- State = 2020;
- Match(T__64);
+ State = 2038;
+ Match(T__65);
}
break;
- case T__123:
+ case T__124:
EnterOuterAlt(_localctx, 13);
{
- State = 2021;
- Match(T__123);
+ State = 2039;
+ Match(T__124);
}
break;
case T__142:
EnterOuterAlt(_localctx, 14);
{
- State = 2022;
+ State = 2040;
Match(T__142);
}
break;
case T__143:
EnterOuterAlt(_localctx, 15);
{
- State = 2023;
+ State = 2041;
Match(T__143);
}
break;
- case T__67:
+ case T__68:
EnterOuterAlt(_localctx, 16);
{
- State = 2024;
- Match(T__67);
+ State = 2042;
+ Match(T__68);
}
break;
case T__144:
EnterOuterAlt(_localctx, 17);
{
- State = 2025;
+ State = 2043;
Match(T__144);
}
break;
case T__145:
EnterOuterAlt(_localctx, 18);
{
- State = 2026;
+ State = 2044;
Match(T__145);
}
break;
- case T__68:
+ case T__69:
EnterOuterAlt(_localctx, 19);
{
- State = 2027;
- Match(T__68);
- State = 2028;
- Match(T__28);
- State = 2029;
- int32();
- State = 2030;
+ State = 2045;
+ Match(T__69);
+ State = 2046;
Match(T__29);
+ State = 2047;
+ int32();
+ State = 2048;
+ Match(T__30);
}
break;
default:
@@ -11885,31 +11959,31 @@ public PinvImplContext pinvImpl() {
EnterRule(_localctx, 260, RULE_pinvImpl);
int _la;
try {
- State = 2052;
+ State = 2070;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,116,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 2034;
+ State = 2052;
Match(T__146);
- State = 2035;
- Match(T__28);
- State = 2041;
+ State = 2053;
+ Match(T__29);
+ State = 2059;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
if (_la==QSTRING) {
{
- State = 2036;
+ State = 2054;
compQstring();
- State = 2039;
+ State = 2057;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- if (_la==T__32) {
+ if (_la==T__33) {
{
- State = 2037;
- Match(T__32);
- State = 2038;
+ State = 2055;
+ Match(T__33);
+ State = 2056;
compQstring();
}
}
@@ -11917,31 +11991,31 @@ public PinvImplContext pinvImpl() {
}
}
- State = 2046;
+ State = 2064;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while (((((_la - 56)) & ~0x3f) == 0 && ((1L << (_la - 56)) & 8195L) != 0) || ((((_la - 148)) & ~0x3f) == 0 && ((1L << (_la - 148)) & 79L) != 0) || ((((_la - 223)) & ~0x3f) == 0 && ((1L << (_la - 223)) & 251658241L) != 0)) {
+ while (((((_la - 57)) & ~0x3f) == 0 && ((1L << (_la - 57)) & 8195L) != 0) || ((((_la - 148)) & ~0x3f) == 0 && ((1L << (_la - 148)) & 79L) != 0) || ((((_la - 224)) & ~0x3f) == 0 && ((1L << (_la - 224)) & 251658241L) != 0)) {
{
{
- State = 2043;
+ State = 2061;
pinvAttr();
}
}
- State = 2048;
+ State = 2066;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
- State = 2049;
- Match(T__29);
+ State = 2067;
+ Match(T__30);
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 2050;
+ State = 2068;
Match(T__146);
- State = 2051;
- Match(T__83);
+ State = 2069;
+ Match(T__84);
}
break;
}
@@ -11984,134 +12058,134 @@ public PinvAttrContext pinvAttr() {
PinvAttrContext _localctx = new PinvAttrContext(Context, State);
EnterRule(_localctx, 262, RULE_pinvAttr);
try {
- State = 2081;
+ State = 2099;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,117,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 2054;
+ State = 2072;
Match(T__147);
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 2055;
+ State = 2073;
Match(ANSI);
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 2056;
- Match(T__55);
+ State = 2074;
+ Match(T__56);
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 2057;
- Match(T__56);
+ State = 2075;
+ Match(T__57);
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 2058;
+ State = 2076;
Match(T__148);
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 2059;
+ State = 2077;
Match(T__149);
}
break;
case 7:
EnterOuterAlt(_localctx, 7);
{
- State = 2060;
+ State = 2078;
Match(CDECL);
}
break;
case 8:
EnterOuterAlt(_localctx, 8);
{
- State = 2061;
+ State = 2079;
Match(STDCALL);
}
break;
case 9:
EnterOuterAlt(_localctx, 9);
{
- State = 2062;
+ State = 2080;
Match(THISCALL);
}
break;
case 10:
EnterOuterAlt(_localctx, 10);
{
- State = 2063;
+ State = 2081;
Match(FASTCALL);
}
break;
case 11:
EnterOuterAlt(_localctx, 11);
{
- State = 2064;
+ State = 2082;
Match(T__150);
- State = 2065;
- Match(T__73);
- State = 2066;
+ State = 2083;
+ Match(T__74);
+ State = 2084;
Match(T__151);
}
break;
case 12:
EnterOuterAlt(_localctx, 12);
{
- State = 2067;
+ State = 2085;
Match(T__150);
- State = 2068;
- Match(T__73);
- State = 2069;
+ State = 2086;
+ Match(T__74);
+ State = 2087;
Match(T__152);
}
break;
case 13:
EnterOuterAlt(_localctx, 13);
{
- State = 2070;
+ State = 2088;
Match(T__153);
- State = 2071;
- Match(T__73);
- State = 2072;
+ State = 2089;
+ Match(T__74);
+ State = 2090;
Match(T__151);
}
break;
case 14:
EnterOuterAlt(_localctx, 14);
{
- State = 2073;
+ State = 2091;
Match(T__153);
- State = 2074;
- Match(T__73);
- State = 2075;
+ State = 2092;
+ Match(T__74);
+ State = 2093;
Match(T__152);
}
break;
case 15:
EnterOuterAlt(_localctx, 15);
{
- State = 2076;
- Match(T__68);
- State = 2077;
- Match(T__28);
- State = 2078;
- int32();
- State = 2079;
+ State = 2094;
+ Match(T__69);
+ State = 2095;
Match(T__29);
+ State = 2096;
+ int32();
+ State = 2097;
+ Match(T__30);
}
break;
}
@@ -12149,23 +12223,24 @@ public MethodNameContext methodName() {
MethodNameContext _localctx = new MethodNameContext(Context, State);
EnterRule(_localctx, 264, RULE_methodName);
try {
- State = 2086;
+ State = 2104;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__114:
+ case T__115:
EnterOuterAlt(_localctx, 1);
{
- State = 2083;
- Match(T__114);
+ State = 2101;
+ Match(T__115);
}
break;
case T__154:
EnterOuterAlt(_localctx, 2);
{
- State = 2084;
+ State = 2102;
Match(T__154);
}
break;
+ case T__15:
case VALUE:
case INSTANCE:
case SQSTRING:
@@ -12173,7 +12248,7 @@ public MethodNameContext methodName() {
case ID:
EnterOuterAlt(_localctx, 3);
{
- State = 2085;
+ State = 2103;
dottedName();
}
break;
@@ -12215,132 +12290,132 @@ public ImplAttrContext implAttr() {
ImplAttrContext _localctx = new ImplAttrContext(Context, State);
EnterRule(_localctx, 266, RULE_implAttr);
try {
- State = 2109;
+ State = 2127;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
case T__0:
EnterOuterAlt(_localctx, 1);
{
- State = 2088;
+ State = 2106;
Match(T__0);
}
break;
case T__1:
EnterOuterAlt(_localctx, 2);
{
- State = 2089;
+ State = 2107;
Match(T__1);
}
break;
case T__155:
EnterOuterAlt(_localctx, 3);
{
- State = 2090;
+ State = 2108;
Match(T__155);
}
break;
case T__2:
EnterOuterAlt(_localctx, 4);
{
- State = 2091;
+ State = 2109;
Match(T__2);
}
break;
case T__3:
EnterOuterAlt(_localctx, 5);
{
- State = 2092;
+ State = 2110;
Match(T__3);
}
break;
case UNMANAGED:
EnterOuterAlt(_localctx, 6);
{
- State = 2093;
+ State = 2111;
Match(UNMANAGED);
}
break;
case T__4:
EnterOuterAlt(_localctx, 7);
{
- State = 2094;
+ State = 2112;
Match(T__4);
}
break;
case T__5:
EnterOuterAlt(_localctx, 8);
{
- State = 2095;
+ State = 2113;
Match(T__5);
}
break;
case T__6:
EnterOuterAlt(_localctx, 9);
{
- State = 2096;
+ State = 2114;
Match(T__6);
}
break;
case T__7:
EnterOuterAlt(_localctx, 10);
{
- State = 2097;
+ State = 2115;
Match(T__7);
}
break;
case T__8:
EnterOuterAlt(_localctx, 11);
{
- State = 2098;
+ State = 2116;
Match(T__8);
}
break;
case T__9:
EnterOuterAlt(_localctx, 12);
{
- State = 2099;
+ State = 2117;
Match(T__9);
}
break;
case T__10:
EnterOuterAlt(_localctx, 13);
{
- State = 2100;
+ State = 2118;
Match(T__10);
}
break;
case T__11:
EnterOuterAlt(_localctx, 14);
{
- State = 2101;
+ State = 2119;
Match(T__11);
}
break;
case T__12:
EnterOuterAlt(_localctx, 15);
{
- State = 2102;
+ State = 2120;
Match(T__12);
}
break;
case T__13:
EnterOuterAlt(_localctx, 16);
{
- State = 2103;
+ State = 2121;
Match(T__13);
}
break;
- case T__68:
+ case T__69:
EnterOuterAlt(_localctx, 17);
{
- State = 2104;
- Match(T__68);
- State = 2105;
- Match(T__28);
- State = 2106;
- int32();
- State = 2107;
+ State = 2122;
+ Match(T__69);
+ State = 2123;
Match(T__29);
+ State = 2124;
+ int32();
+ State = 2125;
+ Match(T__30);
}
break;
default:
@@ -12386,17 +12461,17 @@ public MethodDeclsContext methodDecls() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2114;
+ State = 2132;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 19394592766L) != 0) || _la==T__71 || _la==T__72 || ((((_la - 158)) & ~0x3f) == 0 && ((1L << (_la - 158)) & 1099511627905L) != 0) || ((((_la - 242)) & ~0x3f) == 0 && ((1L << (_la - 242)) & 2303696760354115601L) != 0)) {
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 38789119998L) != 0) || _la==T__72 || _la==T__73 || ((((_la - 158)) & ~0x3f) == 0 && ((1L << (_la - 158)) & 2199023255681L) != 0) || ((((_la - 243)) & ~0x3f) == 0 && ((1L << (_la - 243)) & 2303696760354115601L) != 0)) {
{
{
- State = 2111;
+ State = 2129;
methodDecl();
}
}
- State = 2116;
+ State = 2134;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -12515,236 +12590,236 @@ public MethodDeclContext methodDecl() {
EnterRule(_localctx, 270, RULE_methodDecl);
try {
int _alt;
- State = 2225;
+ State = 2243;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,126,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 2117;
+ State = 2135;
instr();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 2118;
+ State = 2136;
Match(EMITBYTE);
- State = 2119;
+ State = 2137;
int32();
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 2120;
+ State = 2138;
sehBlock();
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 2121;
+ State = 2139;
Match(MAXSTACK);
- State = 2122;
+ State = 2140;
int32();
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 2123;
+ State = 2141;
Match(LOCALS);
- State = 2124;
+ State = 2142;
sigArgs();
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 2125;
+ State = 2143;
Match(LOCALS);
- State = 2126;
+ State = 2144;
Match(T__156);
- State = 2127;
+ State = 2145;
sigArgs();
}
break;
case 7:
EnterOuterAlt(_localctx, 7);
{
- State = 2128;
+ State = 2146;
Match(ENTRYPOINT);
}
break;
case 8:
EnterOuterAlt(_localctx, 8);
{
- State = 2129;
+ State = 2147;
Match(ZEROINIT);
}
break;
case 9:
EnterOuterAlt(_localctx, 9);
{
- State = 2130;
+ State = 2148;
dataDecl();
}
break;
case 10:
EnterOuterAlt(_localctx, 10);
{
- State = 2131;
+ State = 2149;
labelDecl();
}
break;
case 11:
EnterOuterAlt(_localctx, 11);
{
- State = 2132;
+ State = 2150;
secDecl();
}
break;
case 12:
EnterOuterAlt(_localctx, 12);
{
- State = 2133;
+ State = 2151;
extSourceSpec();
}
break;
case 13:
EnterOuterAlt(_localctx, 13);
{
- State = 2134;
+ State = 2152;
languageDecl();
}
break;
case 14:
EnterOuterAlt(_localctx, 14);
{
- State = 2135;
+ State = 2153;
customDescrInMethodBody();
}
break;
case 15:
EnterOuterAlt(_localctx, 15);
{
- State = 2136;
+ State = 2154;
compControl();
}
break;
case 16:
EnterOuterAlt(_localctx, 16);
{
- State = 2137;
+ State = 2155;
Match(EXPORT);
- State = 2138;
- Match(T__40);
- State = 2139;
- int32();
- State = 2140;
+ State = 2156;
Match(T__41);
+ State = 2157;
+ int32();
+ State = 2158;
+ Match(T__42);
}
break;
case 17:
EnterOuterAlt(_localctx, 17);
{
- State = 2142;
+ State = 2160;
Match(EXPORT);
- State = 2143;
- Match(T__40);
- State = 2144;
- int32();
- State = 2145;
+ State = 2161;
Match(T__41);
- State = 2146;
- Match(T__32);
- State = 2147;
+ State = 2162;
+ int32();
+ State = 2163;
+ Match(T__42);
+ State = 2164;
+ Match(T__33);
+ State = 2165;
id();
}
break;
case 18:
EnterOuterAlt(_localctx, 18);
{
- State = 2149;
+ State = 2167;
Match(VTENTRY);
- State = 2150;
+ State = 2168;
int32();
- State = 2151;
- Match(T__73);
- State = 2152;
+ State = 2169;
+ Match(T__74);
+ State = 2170;
int32();
}
break;
case 19:
EnterOuterAlt(_localctx, 19);
{
- State = 2154;
+ State = 2172;
Match(OVERRIDE);
- State = 2155;
+ State = 2173;
typeSpec();
- State = 2156;
+ State = 2174;
Match(DCOLON);
- State = 2157;
+ State = 2175;
methodName();
}
break;
case 20:
EnterOuterAlt(_localctx, 20);
{
- State = 2159;
+ State = 2177;
Match(OVERRIDE);
- State = 2160;
+ State = 2178;
Match(METHOD);
- State = 2161;
+ State = 2179;
callConv();
- State = 2162;
+ State = 2180;
type();
- State = 2163;
+ State = 2181;
typeSpec();
- State = 2164;
+ State = 2182;
Match(DCOLON);
- State = 2165;
+ State = 2183;
methodName();
- State = 2166;
+ State = 2184;
genArity();
- State = 2167;
+ State = 2185;
sigArgs();
}
break;
case 21:
EnterOuterAlt(_localctx, 21);
{
- State = 2169;
+ State = 2187;
scopeBlock();
}
break;
case 22:
EnterOuterAlt(_localctx, 22);
{
- State = 2170;
+ State = 2188;
Match(PARAM);
- State = 2171;
+ State = 2189;
Match(TYPE);
- State = 2172;
- Match(T__40);
- State = 2173;
- int32();
- State = 2174;
+ State = 2190;
Match(T__41);
- State = 2178;
+ State = 2191;
+ int32();
+ State = 2192;
+ Match(T__42);
+ State = 2196;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,121,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 2175;
+ State = 2193;
customAttrDecl();
}
}
}
- State = 2180;
+ State = 2198;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,121,Context);
}
@@ -12753,25 +12828,25 @@ public MethodDeclContext methodDecl() {
case 23:
EnterOuterAlt(_localctx, 23);
{
- State = 2181;
+ State = 2199;
Match(PARAM);
- State = 2182;
+ State = 2200;
Match(TYPE);
- State = 2183;
+ State = 2201;
dottedName();
- State = 2187;
+ State = 2205;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,122,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 2184;
+ State = 2202;
customAttrDecl();
}
}
}
- State = 2189;
+ State = 2207;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,122,Context);
}
@@ -12780,33 +12855,33 @@ public MethodDeclContext methodDecl() {
case 24:
EnterOuterAlt(_localctx, 24);
{
- State = 2190;
+ State = 2208;
Match(PARAM);
- State = 2191;
+ State = 2209;
Match(CONSTRAINT);
- State = 2192;
- Match(T__40);
- State = 2193;
- int32();
- State = 2194;
+ State = 2210;
Match(T__41);
- State = 2195;
- Match(T__26);
- State = 2196;
+ State = 2211;
+ int32();
+ State = 2212;
+ Match(T__42);
+ State = 2213;
+ Match(T__27);
+ State = 2214;
typeSpec();
- State = 2200;
+ State = 2218;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,123,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 2197;
+ State = 2215;
customAttrDecl();
}
}
}
- State = 2202;
+ State = 2220;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,123,Context);
}
@@ -12815,29 +12890,29 @@ public MethodDeclContext methodDecl() {
case 25:
EnterOuterAlt(_localctx, 25);
{
- State = 2203;
+ State = 2221;
Match(PARAM);
- State = 2204;
+ State = 2222;
Match(CONSTRAINT);
- State = 2205;
+ State = 2223;
dottedName();
- State = 2206;
- Match(T__26);
- State = 2207;
+ State = 2224;
+ Match(T__27);
+ State = 2225;
typeSpec();
- State = 2211;
+ State = 2229;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,124,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 2208;
+ State = 2226;
customAttrDecl();
}
}
}
- State = 2213;
+ State = 2231;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,124,Context);
}
@@ -12846,29 +12921,29 @@ public MethodDeclContext methodDecl() {
case 26:
EnterOuterAlt(_localctx, 26);
{
- State = 2214;
+ State = 2232;
Match(PARAM);
- State = 2215;
- Match(T__40);
- State = 2216;
- int32();
- State = 2217;
+ State = 2233;
Match(T__41);
- State = 2218;
+ State = 2234;
+ int32();
+ State = 2235;
+ Match(T__42);
+ State = 2236;
initOpt();
- State = 2222;
+ State = 2240;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,125,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 2219;
+ State = 2237;
customAttrDecl();
}
}
}
- State = 2224;
+ State = 2242;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,125,Context);
}
@@ -12911,10 +12986,10 @@ public LabelDeclContext labelDecl() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2227;
+ State = 2245;
id();
- State = 2228;
- Match(T__73);
+ State = 2246;
+ Match(T__74);
}
}
catch (RecognitionException re) {
@@ -12953,20 +13028,20 @@ public CustomDescrInMethodBodyContext customDescrInMethodBody() {
CustomDescrInMethodBodyContext _localctx = new CustomDescrInMethodBodyContext(Context, State);
EnterRule(_localctx, 274, RULE_customDescrInMethodBody);
try {
- State = 2232;
+ State = 2250;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,127,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 2230;
+ State = 2248;
customDescr();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 2231;
+ State = 2249;
customDescrWithOwner();
}
break;
@@ -13007,12 +13082,12 @@ public ScopeBlockContext scopeBlock() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2234;
- Match(T__15);
- State = 2235;
- methodDecls();
- State = 2236;
+ State = 2252;
Match(T__16);
+ State = 2253;
+ methodDecls();
+ State = 2254;
+ Match(T__17);
}
}
catch (RecognitionException re) {
@@ -13053,9 +13128,9 @@ public SehBlockContext sehBlock() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2238;
+ State = 2256;
tryBlock();
- State = 2239;
+ State = 2257;
sehClauses();
}
}
@@ -13098,17 +13173,17 @@ public SehClausesContext sehClauses() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2242;
+ State = 2260;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
do {
{
{
- State = 2241;
+ State = 2259;
sehClause();
}
}
- State = 2244;
+ State = 2262;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
} while ( ((((_la - 160)) & ~0x3f) == 0 && ((1L << (_la - 160)) & 15L) != 0) );
@@ -13159,41 +13234,41 @@ public TryBlockContext tryBlock() {
TryBlockContext _localctx = new TryBlockContext(Context, State);
EnterRule(_localctx, 282, RULE_tryBlock);
try {
- State = 2258;
+ State = 2276;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,129,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 2246;
+ State = 2264;
Match(T__157);
- State = 2247;
+ State = 2265;
scopeBlock();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 2248;
+ State = 2266;
Match(T__157);
- State = 2249;
+ State = 2267;
id();
- State = 2250;
+ State = 2268;
Match(T__158);
- State = 2251;
+ State = 2269;
id();
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 2253;
+ State = 2271;
Match(T__157);
- State = 2254;
+ State = 2272;
int32();
- State = 2255;
+ State = 2273;
Match(T__158);
- State = 2256;
+ State = 2274;
int32();
}
break;
@@ -13244,42 +13319,42 @@ public SehClauseContext sehClause() {
SehClauseContext _localctx = new SehClauseContext(Context, State);
EnterRule(_localctx, 284, RULE_sehClause);
try {
- State = 2272;
+ State = 2290;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
case T__160:
EnterOuterAlt(_localctx, 1);
{
- State = 2260;
+ State = 2278;
catchClause();
- State = 2261;
+ State = 2279;
handlerBlock();
}
break;
case T__159:
EnterOuterAlt(_localctx, 2);
{
- State = 2263;
+ State = 2281;
filterClause();
- State = 2264;
+ State = 2282;
handlerBlock();
}
break;
case T__161:
EnterOuterAlt(_localctx, 3);
{
- State = 2266;
+ State = 2284;
finallyClause();
- State = 2267;
+ State = 2285;
handlerBlock();
}
break;
case T__162:
EnterOuterAlt(_localctx, 4);
{
- State = 2269;
+ State = 2287;
faultClause();
- State = 2270;
+ State = 2288;
handlerBlock();
}
break;
@@ -13326,33 +13401,33 @@ public FilterClauseContext filterClause() {
FilterClauseContext _localctx = new FilterClauseContext(Context, State);
EnterRule(_localctx, 286, RULE_filterClause);
try {
- State = 2280;
+ State = 2298;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,131,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 2274;
+ State = 2292;
Match(T__159);
- State = 2275;
+ State = 2293;
scopeBlock();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 2276;
+ State = 2294;
Match(T__159);
- State = 2277;
+ State = 2295;
id();
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 2278;
+ State = 2296;
Match(T__159);
- State = 2279;
+ State = 2297;
int32();
}
break;
@@ -13393,9 +13468,9 @@ public CatchClauseContext catchClause() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2282;
+ State = 2300;
Match(T__160);
- State = 2283;
+ State = 2301;
typeSpec();
}
}
@@ -13431,7 +13506,7 @@ public FinallyClauseContext finallyClause() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2285;
+ State = 2303;
Match(T__161);
}
}
@@ -13467,7 +13542,7 @@ public FaultClauseContext faultClause() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2287;
+ State = 2305;
Match(T__162);
}
}
@@ -13516,39 +13591,39 @@ public HandlerBlockContext handlerBlock() {
HandlerBlockContext _localctx = new HandlerBlockContext(Context, State);
EnterRule(_localctx, 294, RULE_handlerBlock);
try {
- State = 2300;
+ State = 2318;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,132,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 2289;
+ State = 2307;
scopeBlock();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 2290;
+ State = 2308;
Match(T__163);
- State = 2291;
+ State = 2309;
id();
- State = 2292;
+ State = 2310;
Match(T__158);
- State = 2293;
+ State = 2311;
id();
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 2295;
+ State = 2313;
Match(T__163);
- State = 2296;
+ State = 2314;
int32();
- State = 2297;
+ State = 2315;
Match(T__158);
- State = 2298;
+ State = 2316;
int32();
}
break;
@@ -13592,9 +13667,9 @@ public DataDeclContext dataDecl() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2302;
+ State = 2320;
ddHead();
- State = 2303;
+ State = 2321;
ddBody();
}
}
@@ -13634,28 +13709,28 @@ public DdHeadContext ddHead() {
DdHeadContext _localctx = new DdHeadContext(Context, State);
EnterRule(_localctx, 298, RULE_ddHead);
try {
- State = 2312;
+ State = 2330;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,133,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 2305;
+ State = 2323;
Match(T__164);
- State = 2306;
+ State = 2324;
tls();
- State = 2307;
+ State = 2325;
id();
- State = 2308;
- Match(T__34);
+ State = 2326;
+ Match(T__35);
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 2310;
+ State = 2328;
Match(T__164);
- State = 2311;
+ State = 2329;
tls();
}
break;
@@ -13691,7 +13766,7 @@ public TlsContext tls() {
TlsContext _localctx = new TlsContext(Context, State);
EnterRule(_localctx, 300, RULE_tls);
try {
- State = 2317;
+ State = 2335;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,134,Context) ) {
case 1:
@@ -13702,14 +13777,14 @@ public TlsContext tls() {
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 2315;
+ State = 2333;
Match(T__165);
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 2316;
+ State = 2334;
Match(T__1);
}
break;
@@ -13755,21 +13830,21 @@ public DdBodyContext ddBody() {
EnterRule(_localctx, 302, RULE_ddBody);
int _la;
try {
- State = 2328;
+ State = 2346;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__15:
+ case T__16:
EnterOuterAlt(_localctx, 1);
{
- State = 2319;
- Match(T__15);
- State = 2320;
- ddItemList();
- State = 2321;
+ State = 2337;
Match(T__16);
+ State = 2338;
+ ddItemList();
+ State = 2339;
+ Match(T__17);
}
break;
- case T__82:
+ case T__83:
case CHAR:
case INT8:
case INT16:
@@ -13780,20 +13855,20 @@ public DdBodyContext ddBody() {
case REF:
EnterOuterAlt(_localctx, 2);
{
- State = 2324;
+ State = 2342;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
do {
{
{
- State = 2323;
+ State = 2341;
ddItem();
}
}
- State = 2326;
+ State = 2344;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- } while ( _la==T__82 || ((((_la - 180)) & ~0x3f) == 0 && ((1L << (_la - 180)) & 505L) != 0) || _la==REF );
+ } while ( _la==T__83 || ((((_la - 181)) & ~0x3f) == 0 && ((1L << (_la - 181)) & 505L) != 0) || _la==REF );
}
break;
default:
@@ -13839,25 +13914,25 @@ public DdItemListContext ddItemList() {
int _alt;
EnterOuterAlt(_localctx, 1);
{
- State = 2335;
+ State = 2353;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,137,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 2330;
+ State = 2348;
ddItem();
- State = 2331;
- Match(T__26);
+ State = 2349;
+ Match(T__27);
}
}
}
- State = 2337;
+ State = 2355;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,137,Context);
}
- State = 2338;
+ State = 2356;
ddItem();
}
}
@@ -13894,7 +13969,7 @@ public DdItemCountContext ddItemCount() {
DdItemCountContext _localctx = new DdItemCountContext(Context, State);
EnterRule(_localctx, 306, RULE_ddItemCount);
try {
- State = 2345;
+ State = 2363;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
case T__0:
@@ -13917,27 +13992,28 @@ public DdItemCountContext ddItemCount() {
case T__17:
case T__18:
case T__19:
- case T__21:
+ case T__20:
case T__22:
case T__23:
case T__24:
case T__25:
case T__26:
case T__27:
- case T__30:
+ case T__28:
case T__31:
- case T__33:
- case T__39:
- case T__46:
+ case T__32:
+ case T__34:
+ case T__40:
case T__47:
case T__48:
- case T__71:
+ case T__49:
case T__72:
- case T__82:
- case T__115:
+ case T__73:
+ case T__83:
case T__116:
- case T__118:
+ case T__117:
case T__119:
+ case T__120:
case T__127:
case T__132:
case T__138:
@@ -13994,15 +14070,15 @@ public DdItemCountContext ddItemCount() {
{
}
break;
- case T__40:
+ case T__41:
EnterOuterAlt(_localctx, 2);
{
- State = 2341;
- Match(T__40);
- State = 2342;
- int32();
- State = 2343;
+ State = 2359;
Match(T__41);
+ State = 2360;
+ int32();
+ State = 2361;
+ Match(T__42);
}
break;
default:
@@ -14069,200 +14145,200 @@ public DdItemContext ddItem() {
DdItemContext _localctx = new DdItemContext(Context, State);
EnterRule(_localctx, 308, RULE_ddItem);
try {
- State = 2413;
+ State = 2431;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,139,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 2347;
+ State = 2365;
Match(CHAR);
- State = 2348;
+ State = 2366;
Match(PTR);
- State = 2349;
- Match(T__28);
- State = 2350;
- compQstring();
- State = 2351;
+ State = 2367;
Match(T__29);
+ State = 2368;
+ compQstring();
+ State = 2369;
+ Match(T__30);
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 2353;
+ State = 2371;
Match(REF);
- State = 2354;
- Match(T__28);
- State = 2355;
- id();
- State = 2356;
+ State = 2372;
Match(T__29);
+ State = 2373;
+ id();
+ State = 2374;
+ Match(T__30);
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 2358;
+ State = 2376;
Match(REF);
- State = 2359;
+ State = 2377;
id();
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 2360;
- Match(T__82);
- State = 2361;
- Match(T__28);
- State = 2362;
- bytes();
- State = 2363;
+ State = 2378;
+ Match(T__83);
+ State = 2379;
Match(T__29);
+ State = 2380;
+ bytes();
+ State = 2381;
+ Match(T__30);
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 2365;
+ State = 2383;
Match(FLOAT32);
- State = 2366;
- Match(T__28);
- State = 2367;
- float64();
- State = 2368;
+ State = 2384;
Match(T__29);
- State = 2369;
+ State = 2385;
+ float64();
+ State = 2386;
+ Match(T__30);
+ State = 2387;
ddItemCount();
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 2371;
+ State = 2389;
Match(FLOAT64_);
- State = 2372;
- Match(T__28);
- State = 2373;
- float64();
- State = 2374;
+ State = 2390;
Match(T__29);
- State = 2375;
+ State = 2391;
+ float64();
+ State = 2392;
+ Match(T__30);
+ State = 2393;
ddItemCount();
}
break;
case 7:
EnterOuterAlt(_localctx, 7);
{
- State = 2377;
+ State = 2395;
Match(INT64_);
- State = 2378;
- Match(T__28);
- State = 2379;
- int64();
- State = 2380;
+ State = 2396;
Match(T__29);
- State = 2381;
+ State = 2397;
+ int64();
+ State = 2398;
+ Match(T__30);
+ State = 2399;
ddItemCount();
}
break;
case 8:
EnterOuterAlt(_localctx, 8);
{
- State = 2383;
+ State = 2401;
Match(INT32_);
- State = 2384;
- Match(T__28);
- State = 2385;
- int32();
- State = 2386;
+ State = 2402;
Match(T__29);
- State = 2387;
+ State = 2403;
+ int32();
+ State = 2404;
+ Match(T__30);
+ State = 2405;
ddItemCount();
}
break;
case 9:
EnterOuterAlt(_localctx, 9);
{
- State = 2389;
+ State = 2407;
Match(INT16);
- State = 2390;
- Match(T__28);
- State = 2391;
- int32();
- State = 2392;
+ State = 2408;
Match(T__29);
- State = 2393;
+ State = 2409;
+ int32();
+ State = 2410;
+ Match(T__30);
+ State = 2411;
ddItemCount();
}
break;
case 10:
EnterOuterAlt(_localctx, 10);
{
- State = 2395;
+ State = 2413;
Match(INT8);
- State = 2396;
- Match(T__28);
- State = 2397;
- int32();
- State = 2398;
+ State = 2414;
Match(T__29);
- State = 2399;
+ State = 2415;
+ int32();
+ State = 2416;
+ Match(T__30);
+ State = 2417;
ddItemCount();
}
break;
case 11:
EnterOuterAlt(_localctx, 11);
{
- State = 2401;
+ State = 2419;
Match(FLOAT32);
- State = 2402;
+ State = 2420;
ddItemCount();
}
break;
case 12:
EnterOuterAlt(_localctx, 12);
{
- State = 2403;
+ State = 2421;
Match(FLOAT64_);
- State = 2404;
+ State = 2422;
ddItemCount();
}
break;
case 13:
EnterOuterAlt(_localctx, 13);
{
- State = 2405;
+ State = 2423;
Match(INT64_);
- State = 2406;
+ State = 2424;
ddItemCount();
}
break;
case 14:
EnterOuterAlt(_localctx, 14);
{
- State = 2407;
+ State = 2425;
Match(INT32_);
- State = 2408;
+ State = 2426;
ddItemCount();
}
break;
case 15:
EnterOuterAlt(_localctx, 15);
{
- State = 2409;
+ State = 2427;
Match(INT16);
- State = 2410;
+ State = 2428;
ddItemCount();
}
break;
case 16:
EnterOuterAlt(_localctx, 16);
{
- State = 2411;
+ State = 2429;
Match(INT8);
- State = 2412;
+ State = 2430;
ddItemCount();
}
break;
@@ -14325,202 +14401,202 @@ public FieldSerInitContext fieldSerInit() {
FieldSerInitContext _localctx = new FieldSerInitContext(Context, State);
EnterRule(_localctx, 310, RULE_fieldSerInit);
try {
- State = 2490;
+ State = 2508;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,140,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 2415;
+ State = 2433;
Match(FLOAT32);
- State = 2416;
- Match(T__28);
- State = 2417;
- float64();
- State = 2418;
+ State = 2434;
Match(T__29);
+ State = 2435;
+ float64();
+ State = 2436;
+ Match(T__30);
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 2420;
+ State = 2438;
Match(FLOAT64_);
- State = 2421;
- Match(T__28);
- State = 2422;
- float64();
- State = 2423;
+ State = 2439;
Match(T__29);
+ State = 2440;
+ float64();
+ State = 2441;
+ Match(T__30);
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 2425;
+ State = 2443;
Match(FLOAT32);
- State = 2426;
- Match(T__28);
- State = 2427;
- int32();
- State = 2428;
+ State = 2444;
Match(T__29);
+ State = 2445;
+ int32();
+ State = 2446;
+ Match(T__30);
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 2430;
+ State = 2448;
Match(FLOAT64_);
- State = 2431;
- Match(T__28);
- State = 2432;
- int64();
- State = 2433;
+ State = 2449;
Match(T__29);
+ State = 2450;
+ int64();
+ State = 2451;
+ Match(T__30);
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 2435;
+ State = 2453;
Match(INT64_);
- State = 2436;
- Match(T__28);
- State = 2437;
- int64();
- State = 2438;
+ State = 2454;
Match(T__29);
+ State = 2455;
+ int64();
+ State = 2456;
+ Match(T__30);
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 2440;
+ State = 2458;
Match(INT32_);
- State = 2441;
- Match(T__28);
- State = 2442;
- int32();
- State = 2443;
+ State = 2459;
Match(T__29);
- }
- break;
- case 7:
+ State = 2460;
+ int32();
+ State = 2461;
+ Match(T__30);
+ }
+ break;
+ case 7:
EnterOuterAlt(_localctx, 7);
{
- State = 2445;
+ State = 2463;
Match(INT16);
- State = 2446;
- Match(T__28);
- State = 2447;
- int32();
- State = 2448;
+ State = 2464;
Match(T__29);
+ State = 2465;
+ int32();
+ State = 2466;
+ Match(T__30);
}
break;
case 8:
EnterOuterAlt(_localctx, 8);
{
- State = 2450;
+ State = 2468;
Match(INT8);
- State = 2451;
- Match(T__28);
- State = 2452;
- int32();
- State = 2453;
+ State = 2469;
Match(T__29);
+ State = 2470;
+ int32();
+ State = 2471;
+ Match(T__30);
}
break;
case 9:
EnterOuterAlt(_localctx, 9);
{
- State = 2455;
+ State = 2473;
Match(UINT64);
- State = 2456;
- Match(T__28);
- State = 2457;
- int64();
- State = 2458;
+ State = 2474;
Match(T__29);
+ State = 2475;
+ int64();
+ State = 2476;
+ Match(T__30);
}
break;
case 10:
EnterOuterAlt(_localctx, 10);
{
- State = 2460;
+ State = 2478;
Match(UINT32);
- State = 2461;
- Match(T__28);
- State = 2462;
- int32();
- State = 2463;
+ State = 2479;
Match(T__29);
+ State = 2480;
+ int32();
+ State = 2481;
+ Match(T__30);
}
break;
case 11:
EnterOuterAlt(_localctx, 11);
{
- State = 2465;
+ State = 2483;
Match(UINT16);
- State = 2466;
- Match(T__28);
- State = 2467;
- int32();
- State = 2468;
+ State = 2484;
Match(T__29);
+ State = 2485;
+ int32();
+ State = 2486;
+ Match(T__30);
}
break;
case 12:
EnterOuterAlt(_localctx, 12);
{
- State = 2470;
+ State = 2488;
Match(UINT8);
- State = 2471;
- Match(T__28);
- State = 2472;
- int32();
- State = 2473;
+ State = 2489;
Match(T__29);
+ State = 2490;
+ int32();
+ State = 2491;
+ Match(T__30);
}
break;
case 13:
EnterOuterAlt(_localctx, 13);
{
- State = 2475;
+ State = 2493;
Match(CHAR);
- State = 2476;
- Match(T__28);
- State = 2477;
- int32();
- State = 2478;
+ State = 2494;
Match(T__29);
+ State = 2495;
+ int32();
+ State = 2496;
+ Match(T__30);
}
break;
case 14:
EnterOuterAlt(_localctx, 14);
{
- State = 2480;
+ State = 2498;
Match(BOOL);
- State = 2481;
- Match(T__28);
- State = 2482;
- truefalse();
- State = 2483;
+ State = 2499;
Match(T__29);
+ State = 2500;
+ truefalse();
+ State = 2501;
+ Match(T__30);
}
break;
case 15:
EnterOuterAlt(_localctx, 15);
{
- State = 2485;
- Match(T__82);
- State = 2486;
- Match(T__28);
- State = 2487;
- bytes();
- State = 2488;
+ State = 2503;
+ Match(T__83);
+ State = 2504;
Match(T__29);
+ State = 2505;
+ bytes();
+ State = 2506;
+ Match(T__30);
}
break;
}
@@ -14564,17 +14640,17 @@ public BytesContext bytes() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2495;
+ State = 2513;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
while (_la==INT32 || _la==ID || _la==HEXBYTE) {
{
{
- State = 2492;
+ State = 2510;
hexbyte();
}
}
- State = 2497;
+ State = 2515;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -14616,7 +14692,7 @@ public HexbyteContext hexbyte() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2498;
+ State = 2516;
_la = TokenStream.LA(1);
if ( !(_la==INT32 || _la==ID || _la==HEXBYTE) ) {
ErrorHandler.RecoverInline(this);
@@ -14664,10 +14740,10 @@ public FieldInitContext fieldInit() {
FieldInitContext _localctx = new FieldInitContext(Context, State);
EnterRule(_localctx, 316, RULE_fieldInit);
try {
- State = 2503;
+ State = 2521;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__82:
+ case T__83:
case CHAR:
case BOOL:
case INT8:
@@ -14682,21 +14758,21 @@ public FieldInitContext fieldInit() {
case UINT64:
EnterOuterAlt(_localctx, 1);
{
- State = 2500;
+ State = 2518;
fieldSerInit();
}
break;
case QSTRING:
EnterOuterAlt(_localctx, 2);
{
- State = 2501;
+ State = 2519;
compQstring();
}
break;
case NULLREF:
EnterOuterAlt(_localctx, 3);
{
- State = 2502;
+ State = 2520;
Match(NULLREF);
}
break;
@@ -14793,379 +14869,379 @@ public SerInitContext serInit() {
SerInitContext _localctx = new SerInitContext(Context, State);
EnterRule(_localctx, 318, RULE_serInit);
try {
- State = 2653;
+ State = 2671;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,143,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 2505;
+ State = 2523;
fieldSerInit();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 2506;
+ State = 2524;
Match(STRING);
- State = 2507;
- Match(T__28);
- State = 2508;
- Match(NULLREF);
- State = 2509;
+ State = 2525;
Match(T__29);
+ State = 2526;
+ Match(NULLREF);
+ State = 2527;
+ Match(T__30);
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 2510;
+ State = 2528;
Match(STRING);
- State = 2511;
- Match(T__28);
- State = 2512;
- Match(SQSTRING);
- State = 2513;
+ State = 2529;
Match(T__29);
+ State = 2530;
+ Match(SQSTRING);
+ State = 2531;
+ Match(T__30);
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 2514;
+ State = 2532;
Match(TYPE);
- State = 2515;
- Match(T__28);
- State = 2516;
- Match(T__37);
- State = 2517;
- Match(SQSTRING);
- State = 2518;
+ State = 2533;
Match(T__29);
+ State = 2534;
+ Match(T__38);
+ State = 2535;
+ Match(SQSTRING);
+ State = 2536;
+ Match(T__30);
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 2519;
+ State = 2537;
Match(TYPE);
- State = 2520;
- Match(T__28);
- State = 2521;
- className();
- State = 2522;
+ State = 2538;
Match(T__29);
+ State = 2539;
+ className();
+ State = 2540;
+ Match(T__30);
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 2524;
+ State = 2542;
Match(TYPE);
- State = 2525;
- Match(T__28);
- State = 2526;
- Match(NULLREF);
- State = 2527;
+ State = 2543;
Match(T__29);
+ State = 2544;
+ Match(NULLREF);
+ State = 2545;
+ Match(T__30);
}
break;
case 7:
EnterOuterAlt(_localctx, 7);
{
- State = 2528;
+ State = 2546;
Match(OBJECT);
- State = 2529;
- Match(T__28);
- State = 2530;
- serInit();
- State = 2531;
+ State = 2547;
Match(T__29);
+ State = 2548;
+ serInit();
+ State = 2549;
+ Match(T__30);
}
break;
case 8:
EnterOuterAlt(_localctx, 8);
{
- State = 2533;
- Match(FLOAT32);
- State = 2534;
- Match(T__40);
- State = 2535;
- int32();
- State = 2536;
- Match(T__41);
- State = 2537;
- Match(T__28);
- State = 2538;
- f32seq();
- State = 2539;
- Match(T__29);
- }
- break;
- case 9:
- EnterOuterAlt(_localctx, 9);
- {
- State = 2541;
- Match(FLOAT64_);
- State = 2542;
- Match(T__40);
- State = 2543;
- int32();
- State = 2544;
- Match(T__41);
- State = 2545;
- Match(T__28);
- State = 2546;
- f64seq();
- State = 2547;
- Match(T__29);
- }
- break;
- case 10:
- EnterOuterAlt(_localctx, 10);
- {
- State = 2549;
- Match(INT64_);
- State = 2550;
- Match(T__40);
State = 2551;
- int32();
+ Match(FLOAT32);
State = 2552;
Match(T__41);
State = 2553;
- Match(T__28);
+ int32();
State = 2554;
- i64seq();
+ Match(T__42);
State = 2555;
Match(T__29);
+ State = 2556;
+ f32seq();
+ State = 2557;
+ Match(T__30);
}
break;
- case 11:
- EnterOuterAlt(_localctx, 11);
+ case 9:
+ EnterOuterAlt(_localctx, 9);
{
- State = 2557;
- Match(INT32_);
- State = 2558;
- Match(T__40);
State = 2559;
- int32();
+ Match(FLOAT64_);
State = 2560;
Match(T__41);
State = 2561;
- Match(T__28);
+ int32();
State = 2562;
- i32seq();
+ Match(T__42);
State = 2563;
Match(T__29);
+ State = 2564;
+ f64seq();
+ State = 2565;
+ Match(T__30);
}
break;
- case 12:
- EnterOuterAlt(_localctx, 12);
+ case 10:
+ EnterOuterAlt(_localctx, 10);
{
- State = 2565;
- Match(INT16);
- State = 2566;
- Match(T__40);
State = 2567;
- int32();
+ Match(INT64_);
State = 2568;
Match(T__41);
State = 2569;
- Match(T__28);
+ int32();
State = 2570;
- i16seq();
+ Match(T__42);
State = 2571;
Match(T__29);
+ State = 2572;
+ i64seq();
+ State = 2573;
+ Match(T__30);
}
break;
- case 13:
- EnterOuterAlt(_localctx, 13);
+ case 11:
+ EnterOuterAlt(_localctx, 11);
{
- State = 2573;
- Match(INT8);
- State = 2574;
- Match(T__40);
State = 2575;
- int32();
+ Match(INT32_);
State = 2576;
Match(T__41);
State = 2577;
- Match(T__28);
+ int32();
State = 2578;
- i8seq();
+ Match(T__42);
State = 2579;
Match(T__29);
+ State = 2580;
+ i32seq();
+ State = 2581;
+ Match(T__30);
}
break;
- case 14:
- EnterOuterAlt(_localctx, 14);
+ case 12:
+ EnterOuterAlt(_localctx, 12);
{
- State = 2581;
- Match(UINT64);
- State = 2582;
- Match(T__40);
State = 2583;
- int32();
+ Match(INT16);
State = 2584;
Match(T__41);
State = 2585;
- Match(T__28);
+ int32();
State = 2586;
- i64seq();
+ Match(T__42);
State = 2587;
Match(T__29);
+ State = 2588;
+ i16seq();
+ State = 2589;
+ Match(T__30);
}
break;
- case 15:
- EnterOuterAlt(_localctx, 15);
+ case 13:
+ EnterOuterAlt(_localctx, 13);
{
- State = 2589;
- Match(UINT32);
- State = 2590;
- Match(T__40);
State = 2591;
- int32();
+ Match(INT8);
State = 2592;
Match(T__41);
State = 2593;
- Match(T__28);
+ int32();
State = 2594;
- i32seq();
+ Match(T__42);
State = 2595;
Match(T__29);
+ State = 2596;
+ i8seq();
+ State = 2597;
+ Match(T__30);
}
break;
- case 16:
- EnterOuterAlt(_localctx, 16);
+ case 14:
+ EnterOuterAlt(_localctx, 14);
{
- State = 2597;
- Match(UINT16);
- State = 2598;
- Match(T__40);
State = 2599;
- int32();
+ Match(UINT64);
State = 2600;
Match(T__41);
State = 2601;
- Match(T__28);
+ int32();
State = 2602;
- i16seq();
+ Match(T__42);
State = 2603;
Match(T__29);
+ State = 2604;
+ i64seq();
+ State = 2605;
+ Match(T__30);
}
break;
- case 17:
- EnterOuterAlt(_localctx, 17);
+ case 15:
+ EnterOuterAlt(_localctx, 15);
{
- State = 2605;
- Match(UINT8);
- State = 2606;
- Match(T__40);
State = 2607;
- int32();
+ Match(UINT32);
State = 2608;
Match(T__41);
State = 2609;
- Match(T__28);
+ int32();
State = 2610;
- i8seq();
+ Match(T__42);
State = 2611;
Match(T__29);
+ State = 2612;
+ i32seq();
+ State = 2613;
+ Match(T__30);
}
break;
- case 18:
- EnterOuterAlt(_localctx, 18);
+ case 16:
+ EnterOuterAlt(_localctx, 16);
{
- State = 2613;
- Match(CHAR);
- State = 2614;
- Match(T__40);
State = 2615;
- int32();
+ Match(UINT16);
State = 2616;
Match(T__41);
State = 2617;
- Match(T__28);
+ int32();
State = 2618;
- i16seq();
+ Match(T__42);
State = 2619;
Match(T__29);
+ State = 2620;
+ i16seq();
+ State = 2621;
+ Match(T__30);
}
break;
- case 19:
- EnterOuterAlt(_localctx, 19);
+ case 17:
+ EnterOuterAlt(_localctx, 17);
{
- State = 2621;
- Match(BOOL);
- State = 2622;
- Match(T__40);
State = 2623;
- int32();
+ Match(UINT8);
State = 2624;
Match(T__41);
State = 2625;
- Match(T__28);
+ int32();
State = 2626;
- boolSeq();
+ Match(T__42);
State = 2627;
Match(T__29);
+ State = 2628;
+ i8seq();
+ State = 2629;
+ Match(T__30);
}
break;
- case 20:
- EnterOuterAlt(_localctx, 20);
+ case 18:
+ EnterOuterAlt(_localctx, 18);
{
- State = 2629;
- Match(STRING);
- State = 2630;
- Match(T__40);
State = 2631;
- int32();
+ Match(CHAR);
State = 2632;
Match(T__41);
State = 2633;
- Match(T__28);
+ int32();
State = 2634;
- sqstringSeq();
+ Match(T__42);
State = 2635;
Match(T__29);
+ State = 2636;
+ i16seq();
+ State = 2637;
+ Match(T__30);
}
break;
- case 21:
- EnterOuterAlt(_localctx, 21);
+ case 19:
+ EnterOuterAlt(_localctx, 19);
{
- State = 2637;
- Match(TYPE);
- State = 2638;
- Match(T__40);
State = 2639;
- int32();
+ Match(BOOL);
State = 2640;
Match(T__41);
State = 2641;
- Match(T__28);
+ int32();
State = 2642;
- classSeq();
+ Match(T__42);
State = 2643;
Match(T__29);
+ State = 2644;
+ boolSeq();
+ State = 2645;
+ Match(T__30);
}
break;
- case 22:
- EnterOuterAlt(_localctx, 22);
+ case 20:
+ EnterOuterAlt(_localctx, 20);
{
- State = 2645;
- Match(OBJECT);
- State = 2646;
- Match(T__40);
State = 2647;
- int32();
+ Match(STRING);
State = 2648;
Match(T__41);
State = 2649;
- Match(T__28);
+ int32();
State = 2650;
- objSeq();
+ Match(T__42);
State = 2651;
Match(T__29);
+ State = 2652;
+ sqstringSeq();
+ State = 2653;
+ Match(T__30);
+ }
+ break;
+ case 21:
+ EnterOuterAlt(_localctx, 21);
+ {
+ State = 2655;
+ Match(TYPE);
+ State = 2656;
+ Match(T__41);
+ State = 2657;
+ int32();
+ State = 2658;
+ Match(T__42);
+ State = 2659;
+ Match(T__29);
+ State = 2660;
+ classSeq();
+ State = 2661;
+ Match(T__30);
+ }
+ break;
+ case 22:
+ EnterOuterAlt(_localctx, 22);
+ {
+ State = 2663;
+ Match(OBJECT);
+ State = 2664;
+ Match(T__41);
+ State = 2665;
+ int32();
+ State = 2666;
+ Match(T__42);
+ State = 2667;
+ Match(T__29);
+ State = 2668;
+ objSeq();
+ State = 2669;
+ Match(T__30);
}
break;
}
@@ -15215,29 +15291,29 @@ public F32seqContext f32seq() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2659;
+ State = 2677;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while (((((_la - 172)) & ~0x3f) == 0 && ((1L << (_la - 172)) & 98309L) != 0)) {
+ while (((((_la - 173)) & ~0x3f) == 0 && ((1L << (_la - 173)) & 98309L) != 0)) {
{
- State = 2657;
+ State = 2675;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,144,Context) ) {
case 1:
{
- State = 2655;
+ State = 2673;
float64();
}
break;
case 2:
{
- State = 2656;
+ State = 2674;
int32();
}
break;
}
}
- State = 2661;
+ State = 2679;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -15288,29 +15364,29 @@ public F64seqContext f64seq() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2666;
+ State = 2684;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while (((((_la - 172)) & ~0x3f) == 0 && ((1L << (_la - 172)) & 98311L) != 0)) {
+ while (((((_la - 173)) & ~0x3f) == 0 && ((1L << (_la - 173)) & 98311L) != 0)) {
{
- State = 2664;
+ State = 2682;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,146,Context) ) {
case 1:
{
- State = 2662;
+ State = 2680;
float64();
}
break;
case 2:
{
- State = 2663;
+ State = 2681;
int64();
}
break;
}
}
- State = 2668;
+ State = 2686;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -15355,17 +15431,17 @@ public I64seqContext i64seq() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2672;
+ State = 2690;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
while (_la==INT32 || _la==INT64) {
{
{
- State = 2669;
+ State = 2687;
int64();
}
}
- State = 2674;
+ State = 2692;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -15410,17 +15486,17 @@ public I32seqContext i32seq() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2678;
+ State = 2696;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
while (_la==INT32) {
{
{
- State = 2675;
+ State = 2693;
int32();
}
}
- State = 2680;
+ State = 2698;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -15465,17 +15541,17 @@ public I16seqContext i16seq() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2684;
+ State = 2702;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
while (_la==INT32) {
{
{
- State = 2681;
+ State = 2699;
int32();
}
}
- State = 2686;
+ State = 2704;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -15520,17 +15596,17 @@ public I8seqContext i8seq() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2690;
+ State = 2708;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
while (_la==INT32) {
{
{
- State = 2687;
+ State = 2705;
int32();
}
}
- State = 2692;
+ State = 2710;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -15575,17 +15651,17 @@ public BoolSeqContext boolSeq() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2696;
+ State = 2714;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while (_la==T__93 || _la==T__94) {
+ while (_la==T__94 || _la==T__95) {
{
{
- State = 2693;
+ State = 2711;
truefalse();
}
}
- State = 2698;
+ State = 2716;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -15632,13 +15708,13 @@ public SqstringSeqContext sqstringSeq() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2702;
+ State = 2720;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
while (_la==NULLREF || _la==SQSTRING) {
{
{
- State = 2699;
+ State = 2717;
_la = TokenStream.LA(1);
if ( !(_la==NULLREF || _la==SQSTRING) ) {
ErrorHandler.RecoverInline(this);
@@ -15649,7 +15725,7 @@ public SqstringSeqContext sqstringSeq() {
}
}
}
- State = 2704;
+ State = 2722;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -15694,17 +15770,17 @@ public ClassSeqContext classSeq() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2708;
+ State = 2726;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while (_la==T__37 || _la==T__40 || _la==T__111 || _la==NULLREF || _la==VALUE || ((((_la - 242)) & ~0x3f) == 0 && ((1L << (_la - 242)) & 105553118478337L) != 0)) {
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 4947802390528L) != 0) || _la==T__112 || _la==NULLREF || _la==VALUE || ((((_la - 243)) & ~0x3f) == 0 && ((1L << (_la - 243)) & 105553118478337L) != 0)) {
{
{
- State = 2705;
+ State = 2723;
classSeqElement();
}
}
- State = 2710;
+ State = 2728;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -15745,27 +15821,28 @@ public ClassSeqElementContext classSeqElement() {
ClassSeqElementContext _localctx = new ClassSeqElementContext(Context, State);
EnterRule(_localctx, 338, RULE_classSeqElement);
try {
- State = 2715;
+ State = 2733;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
case NULLREF:
EnterOuterAlt(_localctx, 1);
{
- State = 2711;
+ State = 2729;
Match(NULLREF);
}
break;
- case T__37:
+ case T__38:
EnterOuterAlt(_localctx, 2);
{
- State = 2712;
- Match(T__37);
- State = 2713;
+ State = 2730;
+ Match(T__38);
+ State = 2731;
Match(SQSTRING);
}
break;
- case T__40:
- case T__111:
+ case T__15:
+ case T__41:
+ case T__112:
case VALUE:
case INSTANCE:
case THIS:
@@ -15776,7 +15853,7 @@ public ClassSeqElementContext classSeqElement() {
case ID:
EnterOuterAlt(_localctx, 3);
{
- State = 2714;
+ State = 2732;
className();
}
break;
@@ -15823,17 +15900,17 @@ public ObjSeqContext objSeq() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2720;
+ State = 2738;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while (_la==T__82 || ((((_la - 180)) & ~0x3f) == 0 && ((1L << (_la - 180)) & 106495L) != 0)) {
+ while (_la==T__83 || ((((_la - 181)) & ~0x3f) == 0 && ((1L << (_la - 181)) & 106495L) != 0)) {
{
{
- State = 2717;
+ State = 2735;
serInit();
}
}
- State = 2722;
+ State = 2740;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -15878,27 +15955,27 @@ public CustomAttrDeclContext customAttrDecl() {
CustomAttrDeclContext _localctx = new CustomAttrDeclContext(Context, State);
EnterRule(_localctx, 342, RULE_customAttrDecl);
try {
- State = 2726;
+ State = 2744;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,157,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 2723;
+ State = 2741;
customDescr();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 2724;
+ State = 2742;
customDescrWithOwner();
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 2725;
+ State = 2743;
dottedName();
}
break;
@@ -15951,81 +16028,89 @@ public override TResult Accept(IParseTreeVisitor visitor) {
public AsmOrRefDeclContext asmOrRefDecl() {
AsmOrRefDeclContext _localctx = new AsmOrRefDeclContext(Context, State);
EnterRule(_localctx, 344, RULE_asmOrRefDecl);
+ int _la;
try {
- State = 2753;
+ State = 2771;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,158,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 2728;
- Match(T__166);
- State = 2729;
- Match(T__34);
- State = 2730;
- Match(T__28);
- State = 2731;
- bytes();
- State = 2732;
+ State = 2746;
+ _la = TokenStream.LA(1);
+ if ( !(_la==T__166 || _la==T__167) ) {
+ ErrorHandler.RecoverInline(this);
+ }
+ else {
+ ErrorHandler.ReportMatch(this);
+ Consume();
+ }
+ State = 2747;
+ Match(T__35);
+ State = 2748;
Match(T__29);
+ State = 2749;
+ bytes();
+ State = 2750;
+ Match(T__30);
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 2734;
- Match(T__167);
- State = 2735;
+ State = 2752;
+ Match(T__168);
+ State = 2753;
intOrWildcard();
- State = 2736;
- Match(T__73);
- State = 2737;
+ State = 2754;
+ Match(T__74);
+ State = 2755;
intOrWildcard();
- State = 2738;
- Match(T__73);
- State = 2739;
+ State = 2756;
+ Match(T__74);
+ State = 2757;
intOrWildcard();
- State = 2740;
- Match(T__73);
- State = 2741;
+ State = 2758;
+ Match(T__74);
+ State = 2759;
intOrWildcard();
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 2743;
- Match(T__168);
- State = 2744;
+ State = 2761;
+ Match(T__169);
+ State = 2762;
compQstring();
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 2745;
- Match(T__168);
- State = 2746;
- Match(T__34);
- State = 2747;
- Match(T__28);
- State = 2748;
- bytes();
- State = 2749;
+ State = 2763;
+ Match(T__169);
+ State = 2764;
+ Match(T__35);
+ State = 2765;
Match(T__29);
+ State = 2766;
+ bytes();
+ State = 2767;
+ Match(T__30);
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 2751;
+ State = 2769;
customAttrDecl();
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 2752;
+ State = 2770;
compControl();
}
break;
@@ -16070,36 +16155,36 @@ public AssemblyRefHeadContext assemblyRefHead() {
AssemblyRefHeadContext _localctx = new AssemblyRefHeadContext(Context, State);
EnterRule(_localctx, 346, RULE_assemblyRefHead);
try {
- State = 2767;
+ State = 2785;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,159,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 2755;
- Match(T__23);
- State = 2756;
- Match(T__38);
- State = 2757;
+ State = 2773;
+ Match(T__24);
+ State = 2774;
+ Match(T__39);
+ State = 2775;
asmAttr();
- State = 2758;
+ State = 2776;
dottedName();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 2760;
- Match(T__23);
- State = 2761;
- Match(T__38);
- State = 2762;
+ State = 2778;
+ Match(T__24);
+ State = 2779;
+ Match(T__39);
+ State = 2780;
asmAttr();
- State = 2763;
+ State = 2781;
dottedName();
- State = 2764;
- Match(T__32);
- State = 2765;
+ State = 2782;
+ Match(T__33);
+ State = 2783;
dottedName();
}
break;
@@ -16144,17 +16229,17 @@ public AssemblyRefDeclsContext assemblyRefDecls() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2772;
+ State = 2790;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 18014417836834816L) != 0) || ((((_la - 167)) & ~0x3f) == 0 && ((1L << (_la - 167)) & 2147487759L) != 0) || ((((_la - 242)) & ~0x3f) == 0 && ((1L << (_la - 242)) & 105555249070081L) != 0)) {
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 36028835673735168L) != 0) || ((((_la - 167)) & ~0x3f) == 0 && ((1L << (_la - 167)) & 4294975519L) != 0) || ((((_la - 243)) & ~0x3f) == 0 && ((1L << (_la - 243)) & 105555249070081L) != 0)) {
{
{
- State = 2769;
+ State = 2787;
assemblyRefDecl();
}
}
- State = 2774;
+ State = 2792;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -16197,29 +16282,31 @@ public AssemblyRefDeclContext assemblyRefDecl() {
AssemblyRefDeclContext _localctx = new AssemblyRefDeclContext(Context, State);
EnterRule(_localctx, 350, RULE_assemblyRefDecl);
try {
- State = 2789;
+ State = 2807;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
case HASH:
EnterOuterAlt(_localctx, 1);
{
- State = 2775;
+ State = 2793;
Match(HASH);
- State = 2776;
- Match(T__34);
- State = 2777;
- Match(T__28);
- State = 2778;
- bytes();
- State = 2779;
+ State = 2794;
+ Match(T__35);
+ State = 2795;
Match(T__29);
+ State = 2796;
+ bytes();
+ State = 2797;
+ Match(T__30);
}
break;
- case T__30:
- case T__33:
+ case T__15:
+ case T__31:
+ case T__34:
case T__166:
case T__167:
case T__168:
+ case T__169:
case VALUE:
case INSTANCE:
case SQSTRING:
@@ -16234,30 +16321,30 @@ public AssemblyRefDeclContext assemblyRefDecl() {
case ID:
EnterOuterAlt(_localctx, 2);
{
- State = 2781;
+ State = 2799;
asmOrRefDecl();
}
break;
- case T__169:
+ case T__170:
EnterOuterAlt(_localctx, 3);
{
- State = 2782;
- Match(T__169);
- State = 2783;
- Match(T__34);
- State = 2784;
- Match(T__28);
- State = 2785;
- bytes();
- State = 2786;
+ State = 2800;
+ Match(T__170);
+ State = 2801;
+ Match(T__35);
+ State = 2802;
Match(T__29);
+ State = 2803;
+ bytes();
+ State = 2804;
+ Match(T__30);
}
break;
- case T__53:
+ case T__54:
EnterOuterAlt(_localctx, 4);
{
- State = 2788;
- Match(T__53);
+ State = 2806;
+ Match(T__54);
}
break;
default:
@@ -16306,25 +16393,25 @@ public ExptypeHeadContext exptypeHead() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2791;
- Match(T__48);
- State = 2792;
- Match(T__38);
- State = 2796;
+ State = 2809;
+ Match(T__49);
+ State = 2810;
+ Match(T__39);
+ State = 2814;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2309220708934221824L) != 0) || _la==T__170) {
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 4618441417868443648L) != 0) || _la==T__171) {
{
{
- State = 2793;
+ State = 2811;
exptAttr();
}
}
- State = 2798;
+ State = 2816;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
- State = 2799;
+ State = 2817;
dottedName();
}
}
@@ -16371,23 +16458,23 @@ public ExportHeadContext exportHead() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2801;
+ State = 2819;
Match(EXPORT);
- State = 2805;
+ State = 2823;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2309220708934221824L) != 0) || _la==T__170) {
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 4618441417868443648L) != 0) || _la==T__171) {
{
{
- State = 2802;
+ State = 2820;
exptAttr();
}
}
- State = 2807;
+ State = 2825;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
- State = 2808;
+ State = 2826;
dottedName();
}
}
@@ -16421,82 +16508,82 @@ public ExptAttrContext exptAttr() {
ExptAttrContext _localctx = new ExptAttrContext(Context, State);
EnterRule(_localctx, 356, RULE_exptAttr);
try {
- State = 2825;
+ State = 2843;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,164,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 2810;
- Match(T__50);
+ State = 2828;
+ Match(T__51);
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 2811;
- Match(T__49);
+ State = 2829;
+ Match(T__50);
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 2812;
- Match(T__170);
+ State = 2830;
+ Match(T__171);
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 2813;
- Match(T__60);
- State = 2814;
- Match(T__49);
+ State = 2831;
+ Match(T__61);
+ State = 2832;
+ Match(T__50);
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 2815;
- Match(T__60);
- State = 2816;
- Match(T__50);
+ State = 2833;
+ Match(T__61);
+ State = 2834;
+ Match(T__51);
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 2817;
- Match(T__60);
- State = 2818;
+ State = 2835;
Match(T__61);
+ State = 2836;
+ Match(T__62);
}
break;
case 7:
EnterOuterAlt(_localctx, 7);
{
- State = 2819;
- Match(T__60);
- State = 2820;
- Match(T__62);
+ State = 2837;
+ Match(T__61);
+ State = 2838;
+ Match(T__63);
}
break;
case 8:
EnterOuterAlt(_localctx, 8);
{
- State = 2821;
- Match(T__60);
- State = 2822;
- Match(T__63);
+ State = 2839;
+ Match(T__61);
+ State = 2840;
+ Match(T__64);
}
break;
case 9:
EnterOuterAlt(_localctx, 9);
{
- State = 2823;
- Match(T__60);
- State = 2824;
- Match(T__64);
+ State = 2841;
+ Match(T__61);
+ State = 2842;
+ Match(T__65);
}
break;
}
@@ -16540,17 +16627,17 @@ public ExptypeDeclsContext exptypeDecls() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2830;
+ State = 2848;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 562969298599936L) != 0) || _la==T__111 || _la==VALUE || _la==INSTANCE || ((((_la - 263)) & ~0x3f) == 0 && ((1L << (_la - 263)) & 50332665L) != 0)) {
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1125938597265408L) != 0) || _la==T__112 || _la==VALUE || _la==INSTANCE || ((((_la - 264)) & ~0x3f) == 0 && ((1L << (_la - 264)) & 50332665L) != 0)) {
{
{
- State = 2827;
+ State = 2845;
exptypeDecl();
}
}
- State = 2832;
+ State = 2850;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -16604,67 +16691,67 @@ public ExptypeDeclContext exptypeDecl() {
ExptypeDeclContext _localctx = new ExptypeDeclContext(Context, State);
EnterRule(_localctx, 360, RULE_exptypeDecl);
try {
- State = 2846;
+ State = 2864;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,166,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 2833;
- Match(T__19);
- State = 2834;
+ State = 2851;
+ Match(T__20);
+ State = 2852;
dottedName();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 2835;
- Match(T__48);
- State = 2836;
- Match(T__38);
- State = 2837;
+ State = 2853;
+ Match(T__49);
+ State = 2854;
+ Match(T__39);
+ State = 2855;
slashedName();
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 2838;
- Match(T__23);
- State = 2839;
- Match(T__38);
- State = 2840;
+ State = 2856;
+ Match(T__24);
+ State = 2857;
+ Match(T__39);
+ State = 2858;
dottedName();
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 2841;
+ State = 2859;
mdtoken();
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 2842;
- Match(T__48);
- State = 2843;
+ State = 2860;
+ Match(T__49);
+ State = 2861;
int32();
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 2844;
+ State = 2862;
customAttrDecl();
}
break;
case 7:
EnterOuterAlt(_localctx, 7);
{
- State = 2845;
+ State = 2863;
compControl();
}
break;
@@ -16714,56 +16801,56 @@ public ManifestResHeadContext manifestResHead() {
EnterRule(_localctx, 362, RULE_manifestResHead);
int _la;
try {
- State = 2867;
+ State = 2885;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,169,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 2848;
+ State = 2866;
Match(MRESOURCE);
- State = 2852;
+ State = 2870;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while (_la==T__49 || _la==T__50) {
+ while (_la==T__50 || _la==T__51) {
{
{
- State = 2849;
+ State = 2867;
manresAttr();
}
}
- State = 2854;
+ State = 2872;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
- State = 2855;
+ State = 2873;
dottedName();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 2856;
+ State = 2874;
Match(MRESOURCE);
- State = 2860;
+ State = 2878;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while (_la==T__49 || _la==T__50) {
+ while (_la==T__50 || _la==T__51) {
{
{
- State = 2857;
+ State = 2875;
manresAttr();
}
}
- State = 2862;
+ State = 2880;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
- State = 2863;
+ State = 2881;
dottedName();
- State = 2864;
- Match(T__32);
- State = 2865;
+ State = 2882;
+ Match(T__33);
+ State = 2883;
dottedName();
}
break;
@@ -16802,9 +16889,9 @@ public ManresAttrContext manresAttr() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2869;
+ State = 2887;
_la = TokenStream.LA(1);
- if ( !(_la==T__49 || _la==T__50) ) {
+ if ( !(_la==T__50 || _la==T__51) ) {
ErrorHandler.RecoverInline(this);
}
else {
@@ -16852,17 +16939,17 @@ public ManifestResDeclsContext manifestResDecls() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2874;
+ State = 2892;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 19345178624L) != 0) || _la==VALUE || _la==INSTANCE || ((((_la - 263)) & ~0x3f) == 0 && ((1L << (_la - 263)) & 50332665L) != 0)) {
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 38690422784L) != 0) || _la==VALUE || _la==INSTANCE || ((((_la - 264)) & ~0x3f) == 0 && ((1L << (_la - 264)) & 50332665L) != 0)) {
{
{
- State = 2871;
+ State = 2889;
manifestResDecl();
}
}
- State = 2876;
+ State = 2894;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -16910,34 +16997,35 @@ public ManifestResDeclContext manifestResDecl() {
ManifestResDeclContext _localctx = new ManifestResDeclContext(Context, State);
EnterRule(_localctx, 368, RULE_manifestResDecl);
try {
- State = 2887;
+ State = 2905;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__19:
+ case T__20:
EnterOuterAlt(_localctx, 1);
{
- State = 2877;
- Match(T__19);
- State = 2878;
+ State = 2895;
+ Match(T__20);
+ State = 2896;
dottedName();
- State = 2879;
- Match(T__42);
- State = 2880;
+ State = 2897;
+ Match(T__43);
+ State = 2898;
int32();
}
break;
- case T__23:
+ case T__24:
EnterOuterAlt(_localctx, 2);
{
- State = 2882;
- Match(T__23);
- State = 2883;
- Match(T__38);
- State = 2884;
+ State = 2900;
+ Match(T__24);
+ State = 2901;
+ Match(T__39);
+ State = 2902;
dottedName();
}
break;
- case T__33:
+ case T__15:
+ case T__34:
case VALUE:
case INSTANCE:
case SQSTRING:
@@ -16945,11 +17033,11 @@ public ManifestResDeclContext manifestResDecl() {
case ID:
EnterOuterAlt(_localctx, 3);
{
- State = 2885;
+ State = 2903;
customAttrDecl();
}
break;
- case T__30:
+ case T__31:
case PP_DEFINE:
case PP_UNDEF:
case PP_IFDEF:
@@ -16959,7 +17047,7 @@ public ManifestResDeclContext manifestResDecl() {
case PP_INCLUDE:
EnterOuterAlt(_localctx, 4);
{
- State = 2886;
+ State = 2904;
compControl();
}
break;
@@ -16996,7 +17084,7 @@ private bool vtfixupAttr_sempred(VtfixupAttrContext _localctx, int predIndex) {
}
private static int[] _serializedATN = {
- 4,1,304,2890,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6,2,
+ 4,1,305,2908,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6,2,
7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,2,14,7,14,
2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7,19,2,20,7,20,2,21,7,21,
2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2,26,7,26,2,27,7,27,2,28,7,28,
@@ -17074,132 +17162,134 @@ private bool vtfixupAttr_sempred(VtfixupAttrContext _localctx, int predIndex) {
63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,
63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,
63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,
- 63,1,63,1,63,1,63,1,63,3,63,1054,8,63,1,64,1,64,1,64,3,64,1059,8,64,1,
- 64,1,64,5,64,1063,8,64,10,64,12,64,1066,9,64,1,64,1,64,3,64,1070,8,64,
- 3,64,1072,8,64,1,65,1,65,1,65,1,65,5,65,1078,8,65,10,65,12,65,1081,9,65,
- 1,65,1,65,1,65,1,66,1,66,1,66,1,66,5,66,1090,8,66,10,66,12,66,1093,9,66,
- 1,66,1,66,1,66,1,67,1,67,1,67,1,67,5,67,1102,8,67,10,67,12,67,1105,9,67,
- 1,67,1,67,1,67,1,67,3,67,1111,8,67,1,68,1,68,1,68,1,68,1,68,3,68,1118,
- 8,68,3,68,1120,8,68,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,
+ 63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,3,63,1057,8,63,1,64,1,64,1,64,3,
+ 64,1062,8,64,1,64,1,64,5,64,1066,8,64,10,64,12,64,1069,9,64,1,64,1,64,
+ 3,64,1073,8,64,3,64,1075,8,64,1,65,1,65,1,65,1,65,5,65,1081,8,65,10,65,
+ 12,65,1084,9,65,1,65,1,65,1,65,1,66,1,66,1,66,1,66,5,66,1093,8,66,10,66,
+ 12,66,1096,9,66,1,66,1,66,1,66,1,67,1,67,1,67,1,67,5,67,1105,8,67,10,67,
+ 12,67,1108,9,67,1,67,1,67,1,67,1,67,3,67,1114,8,67,1,68,1,68,1,68,1,68,
+ 1,68,3,68,1121,8,68,3,68,1123,8,68,1,69,1,69,1,69,1,69,1,69,1,69,1,69,
1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,
- 1,69,3,69,1147,8,69,1,70,1,70,1,70,5,70,1152,8,70,10,70,12,70,1155,9,70,
- 1,70,1,70,1,71,5,71,1160,8,71,10,71,12,71,1163,9,71,1,72,1,72,1,72,1,72,
- 1,72,3,72,1170,8,72,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,
- 1,73,3,73,1183,8,73,1,74,1,74,1,74,5,74,1188,8,74,10,74,12,74,1191,9,74,
- 3,74,1193,8,74,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,
- 1,75,1,75,1,75,1,75,1,75,1,75,3,75,1212,8,75,1,76,1,76,1,76,1,76,1,76,
- 1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,
- 1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,
- 1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,
- 1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,
- 1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,
- 1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,3,76,1298,8,76,1,77,1,77,
- 1,77,1,77,1,77,1,77,1,77,3,77,1307,8,77,1,78,1,78,1,78,5,78,1312,8,78,
- 10,78,12,78,1315,9,78,3,78,1317,8,78,1,79,1,79,1,80,1,80,5,80,1323,8,80,
- 10,80,12,80,1326,9,80,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,
- 1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,3,81,1346,8,81,1,82,1,82,1,82,
+ 1,69,1,69,1,69,1,69,3,69,1150,8,69,1,70,1,70,1,70,5,70,1155,8,70,10,70,
+ 12,70,1158,9,70,1,70,1,70,1,71,5,71,1163,8,71,10,71,12,71,1166,9,71,1,
+ 72,1,72,1,72,1,72,1,72,3,72,1173,8,72,1,73,1,73,1,73,1,73,1,73,1,73,1,
+ 73,1,73,1,73,1,73,1,73,3,73,1186,8,73,1,74,1,74,1,74,5,74,1191,8,74,10,
+ 74,12,74,1194,9,74,3,74,1196,8,74,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,
+ 75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,3,75,1215,8,75,1,76,1,
+ 76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,
+ 76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,
+ 76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,
+ 76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,
+ 76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,
+ 76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,
+ 76,1,76,1,76,1,76,1,76,1,76,1,76,3,76,1309,8,76,1,77,1,77,1,77,1,77,1,
+ 77,1,77,1,77,3,77,1318,8,77,1,78,1,78,1,78,5,78,1323,8,78,10,78,12,78,
+ 1326,9,78,3,78,1328,8,78,1,79,1,79,1,80,1,80,5,80,1334,8,80,10,80,12,80,
+ 1337,9,80,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,
+ 1,81,1,81,1,81,1,81,1,81,1,81,3,81,1357,8,81,1,82,1,82,1,82,1,82,1,82,
1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,
- 1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,3,82,
- 1378,8,82,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,
- 1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,3,83,1401,8,83,1,84,1,84,
- 1,84,1,84,1,84,1,84,1,84,1,84,1,84,1,84,3,84,1413,8,84,1,85,1,85,1,85,
- 1,86,1,86,1,86,1,86,3,86,1422,8,86,1,87,1,87,1,87,1,87,1,87,1,87,1,87,
+ 1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,3,82,1389,8,82,
+ 1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,
+ 1,83,1,83,1,83,1,83,1,83,1,83,1,83,3,83,1412,8,83,1,84,1,84,1,84,1,84,
+ 1,84,1,84,1,84,1,84,1,84,1,84,3,84,1424,8,84,1,85,1,85,1,85,1,86,1,86,
+ 1,86,1,86,3,86,1433,8,86,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,
1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,
- 1,87,1,87,3,87,1447,8,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,
- 1,87,1,87,1,87,1,87,1,87,1,87,3,87,1464,8,87,1,88,1,88,1,88,1,88,5,88,
- 1470,8,88,10,88,12,88,1473,9,88,1,88,3,88,1476,8,88,1,89,1,89,1,89,1,89,
- 1,89,1,89,1,89,1,89,1,89,1,89,1,89,1,89,1,89,3,89,1491,8,89,1,90,1,90,
- 1,90,5,90,1496,8,90,10,90,12,90,1499,9,90,1,90,1,90,1,91,1,91,1,91,1,91,
- 1,92,1,92,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,
+ 3,87,1458,8,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,
+ 1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,3,87,1482,8,87,
+ 1,88,1,88,1,88,1,88,5,88,1488,8,88,10,88,12,88,1491,9,88,1,88,3,88,1494,
+ 8,88,1,89,1,89,1,89,1,89,1,89,1,89,1,89,1,89,1,89,1,89,1,89,1,89,1,89,
+ 3,89,1509,8,89,1,90,1,90,1,90,5,90,1514,8,90,10,90,12,90,1517,9,90,1,90,
+ 1,90,1,91,1,91,1,91,1,91,1,92,1,92,1,93,1,93,1,93,1,93,1,93,1,93,1,93,
1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,
- 1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,3,93,1543,8,93,1,94,1,94,1,95,
- 1,95,1,95,1,95,1,95,1,95,3,95,1553,8,95,1,95,1,95,1,95,1,95,1,95,1,95,
- 1,95,1,95,1,95,1,95,1,95,1,95,1,95,1,95,3,95,1569,8,95,1,95,1,95,1,95,
- 1,95,1,95,1,95,1,95,1,95,1,95,1,95,3,95,1581,8,95,1,96,1,96,1,96,1,96,
- 1,96,1,96,1,96,1,96,1,96,1,96,3,96,1593,8,96,1,97,1,97,1,97,1,97,1,97,
- 1,97,1,97,1,97,1,97,1,97,1,97,1,97,3,97,1607,8,97,1,98,1,98,1,98,1,98,
- 1,98,1,99,1,99,1,99,1,99,1,99,3,99,1619,8,99,1,100,1,100,1,100,1,100,1,
- 100,1,100,1,100,1,100,1,100,3,100,1630,8,100,1,101,1,101,1,101,5,101,1635,
- 8,101,10,101,12,101,1638,9,101,1,101,1,101,1,102,1,102,1,102,1,102,1,102,
- 3,102,1647,8,102,1,103,1,103,1,103,1,103,1,103,1,103,1,103,1,103,1,103,
- 1,103,1,103,3,103,1660,8,103,1,104,5,104,1663,8,104,10,104,12,104,1666,
- 9,104,1,105,1,105,3,105,1670,8,105,1,105,1,105,1,106,1,106,1,106,5,106,
- 1677,8,106,10,106,12,106,1680,9,106,1,106,1,106,1,107,1,107,1,107,1,107,
- 1,108,1,108,3,108,1690,8,108,1,109,1,109,1,109,1,109,1,109,1,109,1,110,
+ 1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,3,93,
+ 1561,8,93,1,94,1,94,1,95,1,95,1,95,1,95,1,95,1,95,3,95,1571,8,95,1,95,
+ 1,95,1,95,1,95,1,95,1,95,1,95,1,95,1,95,1,95,1,95,1,95,1,95,1,95,3,95,
+ 1587,8,95,1,95,1,95,1,95,1,95,1,95,1,95,1,95,1,95,1,95,1,95,3,95,1599,
+ 8,95,1,96,1,96,1,96,1,96,1,96,1,96,1,96,1,96,1,96,1,96,3,96,1611,8,96,
+ 1,97,1,97,1,97,1,97,1,97,1,97,1,97,1,97,1,97,1,97,1,97,1,97,3,97,1625,
+ 8,97,1,98,1,98,1,98,1,98,1,98,1,99,1,99,1,99,1,99,1,99,3,99,1637,8,99,
+ 1,100,1,100,1,100,1,100,1,100,1,100,1,100,1,100,1,100,3,100,1648,8,100,
+ 1,101,1,101,1,101,5,101,1653,8,101,10,101,12,101,1656,9,101,1,101,1,101,
+ 1,102,1,102,1,102,1,102,1,102,3,102,1665,8,102,1,103,1,103,1,103,1,103,
+ 1,103,1,103,1,103,1,103,1,103,1,103,1,103,3,103,1678,8,103,1,104,5,104,
+ 1681,8,104,10,104,12,104,1684,9,104,1,105,1,105,3,105,1688,8,105,1,105,
+ 1,105,1,106,1,106,1,106,5,106,1695,8,106,10,106,12,106,1698,9,106,1,106,
+ 1,106,1,107,1,107,1,107,1,107,1,108,1,108,3,108,1708,8,108,1,109,1,109,
+ 1,109,1,109,1,109,1,109,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,
1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,
1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,
1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,
1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,
1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,
- 1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,
- 5,110,1771,8,110,10,110,12,110,1774,9,110,1,110,1,110,1,110,1,110,5,110,
- 1780,8,110,10,110,12,110,1783,9,110,1,110,1,110,1,110,1,110,1,110,1,110,
- 1,110,1,110,5,110,1793,8,110,10,110,12,110,1796,9,110,1,110,1,110,1,110,
- 1,110,1,110,1,110,5,110,1804,8,110,10,110,12,110,1807,9,110,1,110,1,110,
- 1,110,1,110,1,110,3,110,1814,8,110,1,111,1,111,1,111,1,111,1,111,1,111,
- 1,111,1,111,5,111,1824,8,111,10,111,12,111,1827,9,111,1,111,1,111,1,111,
- 1,111,1,111,1,112,1,112,1,112,1,112,1,112,1,112,1,112,1,112,1,112,1,112,
- 1,112,1,112,1,112,1,112,1,112,1,112,1,112,1,112,1,112,3,112,1853,8,112,
- 1,113,1,113,1,113,1,113,1,113,3,113,1860,8,113,1,114,1,114,1,114,3,114,
- 1865,8,114,1,115,1,115,1,115,1,115,1,115,3,115,1872,8,115,1,116,1,116,
- 5,116,1876,8,116,10,116,12,116,1879,9,116,1,116,1,116,1,116,1,116,1,116,
- 5,116,1886,8,116,10,116,12,116,1889,9,116,1,116,3,116,1892,8,116,1,117,
- 1,117,1,118,5,118,1897,8,118,10,118,12,118,1900,9,118,1,119,1,119,1,119,
- 1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,119,3,119,1914,8,119,
- 1,120,1,120,5,120,1918,8,120,10,120,12,120,1921,9,120,1,120,1,120,1,120,
- 1,120,1,120,1,120,1,121,1,121,1,122,5,122,1932,8,122,10,122,12,122,1935,
- 9,122,1,123,1,123,1,123,1,123,1,123,1,123,1,123,1,123,1,123,1,123,3,123,
- 1947,8,123,1,124,1,124,1,124,1,124,1,124,1,124,3,124,1955,8,124,1,125,
- 1,125,1,125,4,125,1960,8,125,11,125,12,125,1961,1,125,1,125,3,125,1966,
- 8,125,1,126,5,126,1969,8,126,10,126,12,126,1972,9,126,1,127,1,127,1,127,
- 1,127,1,127,1,127,1,127,1,127,1,127,1,127,1,127,1,127,1,127,3,127,1987,
- 8,127,1,128,1,128,1,128,5,128,1992,8,128,10,128,12,128,1995,9,128,1,128,
- 1,128,1,128,1,128,1,128,1,128,1,128,1,128,5,128,2005,8,128,10,128,12,128,
- 2008,9,128,1,129,1,129,1,129,1,129,1,129,1,129,1,129,1,129,1,129,1,129,
+ 1,110,1,110,1,110,1,110,1,110,5,110,1789,8,110,10,110,12,110,1792,9,110,
+ 1,110,1,110,1,110,1,110,5,110,1798,8,110,10,110,12,110,1801,9,110,1,110,
+ 1,110,1,110,1,110,1,110,1,110,1,110,1,110,5,110,1811,8,110,10,110,12,110,
+ 1814,9,110,1,110,1,110,1,110,1,110,1,110,1,110,5,110,1822,8,110,10,110,
+ 12,110,1825,9,110,1,110,1,110,1,110,1,110,1,110,3,110,1832,8,110,1,111,
+ 1,111,1,111,1,111,1,111,1,111,1,111,1,111,5,111,1842,8,111,10,111,12,111,
+ 1845,9,111,1,111,1,111,1,111,1,111,1,111,1,112,1,112,1,112,1,112,1,112,
+ 1,112,1,112,1,112,1,112,1,112,1,112,1,112,1,112,1,112,1,112,1,112,1,112,
+ 1,112,1,112,3,112,1871,8,112,1,113,1,113,1,113,1,113,1,113,3,113,1878,
+ 8,113,1,114,1,114,1,114,3,114,1883,8,114,1,115,1,115,1,115,1,115,1,115,
+ 3,115,1890,8,115,1,116,1,116,5,116,1894,8,116,10,116,12,116,1897,9,116,
+ 1,116,1,116,1,116,1,116,1,116,5,116,1904,8,116,10,116,12,116,1907,9,116,
+ 1,116,3,116,1910,8,116,1,117,1,117,1,118,5,118,1915,8,118,10,118,12,118,
+ 1918,9,118,1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,119,
+ 1,119,1,119,3,119,1932,8,119,1,120,1,120,5,120,1936,8,120,10,120,12,120,
+ 1939,9,120,1,120,1,120,1,120,1,120,1,120,1,120,1,121,1,121,1,122,5,122,
+ 1950,8,122,10,122,12,122,1953,9,122,1,123,1,123,1,123,1,123,1,123,1,123,
+ 1,123,1,123,1,123,1,123,3,123,1965,8,123,1,124,1,124,1,124,1,124,1,124,
+ 1,124,3,124,1973,8,124,1,125,1,125,1,125,4,125,1978,8,125,11,125,12,125,
+ 1979,1,125,1,125,3,125,1984,8,125,1,126,5,126,1987,8,126,10,126,12,126,
+ 1990,9,126,1,127,1,127,1,127,1,127,1,127,1,127,1,127,1,127,1,127,1,127,
+ 1,127,1,127,1,127,3,127,2005,8,127,1,128,1,128,1,128,5,128,2010,8,128,
+ 10,128,12,128,2013,9,128,1,128,1,128,1,128,1,128,1,128,1,128,1,128,1,128,
+ 5,128,2023,8,128,10,128,12,128,2026,9,128,1,129,1,129,1,129,1,129,1,129,
1,129,1,129,1,129,1,129,1,129,1,129,1,129,1,129,1,129,1,129,1,129,1,129,
- 1,129,3,129,2033,8,129,1,130,1,130,1,130,1,130,1,130,3,130,2040,8,130,
- 3,130,2042,8,130,1,130,5,130,2045,8,130,10,130,12,130,2048,9,130,1,130,
- 1,130,1,130,3,130,2053,8,130,1,131,1,131,1,131,1,131,1,131,1,131,1,131,
+ 1,129,1,129,1,129,1,129,1,129,1,129,3,129,2051,8,129,1,130,1,130,1,130,
+ 1,130,1,130,3,130,2058,8,130,3,130,2060,8,130,1,130,5,130,2063,8,130,10,
+ 130,12,130,2066,9,130,1,130,1,130,1,130,3,130,2071,8,130,1,131,1,131,1,
+ 131,1,131,1,131,1,131,1,131,1,131,1,131,1,131,1,131,1,131,1,131,1,131,
1,131,1,131,1,131,1,131,1,131,1,131,1,131,1,131,1,131,1,131,1,131,1,131,
- 1,131,1,131,1,131,1,131,1,131,1,131,1,131,1,131,3,131,2082,8,131,1,132,
- 1,132,1,132,3,132,2087,8,132,1,133,1,133,1,133,1,133,1,133,1,133,1,133,
+ 1,131,3,131,2100,8,131,1,132,1,132,1,132,3,132,2105,8,132,1,133,1,133,
1,133,1,133,1,133,1,133,1,133,1,133,1,133,1,133,1,133,1,133,1,133,1,133,
- 1,133,1,133,3,133,2110,8,133,1,134,5,134,2113,8,134,10,134,12,134,2116,
- 9,134,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,
+ 1,133,1,133,1,133,1,133,1,133,1,133,1,133,3,133,2128,8,133,1,134,5,134,
+ 2131,8,134,10,134,12,134,2134,9,134,1,135,1,135,1,135,1,135,1,135,1,135,
1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,
1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,
1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,
1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,
- 5,135,2177,8,135,10,135,12,135,2180,9,135,1,135,1,135,1,135,1,135,5,135,
- 2186,8,135,10,135,12,135,2189,9,135,1,135,1,135,1,135,1,135,1,135,1,135,
- 1,135,1,135,5,135,2199,8,135,10,135,12,135,2202,9,135,1,135,1,135,1,135,
- 1,135,1,135,1,135,5,135,2210,8,135,10,135,12,135,2213,9,135,1,135,1,135,
- 1,135,1,135,1,135,1,135,5,135,2221,8,135,10,135,12,135,2224,9,135,3,135,
- 2226,8,135,1,136,1,136,1,136,1,137,1,137,3,137,2233,8,137,1,138,1,138,
- 1,138,1,138,1,139,1,139,1,139,1,140,4,140,2243,8,140,11,140,12,140,2244,
- 1,141,1,141,1,141,1,141,1,141,1,141,1,141,1,141,1,141,1,141,1,141,1,141,
- 3,141,2259,8,141,1,142,1,142,1,142,1,142,1,142,1,142,1,142,1,142,1,142,
- 1,142,1,142,1,142,3,142,2273,8,142,1,143,1,143,1,143,1,143,1,143,1,143,
- 3,143,2281,8,143,1,144,1,144,1,144,1,145,1,145,1,146,1,146,1,147,1,147,
- 1,147,1,147,1,147,1,147,1,147,1,147,1,147,1,147,1,147,3,147,2301,8,147,
- 1,148,1,148,1,148,1,149,1,149,1,149,1,149,1,149,1,149,1,149,3,149,2313,
- 8,149,1,150,1,150,1,150,3,150,2318,8,150,1,151,1,151,1,151,1,151,1,151,
- 4,151,2325,8,151,11,151,12,151,2326,3,151,2329,8,151,1,152,1,152,1,152,
- 5,152,2334,8,152,10,152,12,152,2337,9,152,1,152,1,152,1,153,1,153,1,153,
- 1,153,1,153,3,153,2346,8,153,1,154,1,154,1,154,1,154,1,154,1,154,1,154,
+ 1,135,1,135,1,135,1,135,1,135,5,135,2195,8,135,10,135,12,135,2198,9,135,
+ 1,135,1,135,1,135,1,135,5,135,2204,8,135,10,135,12,135,2207,9,135,1,135,
+ 1,135,1,135,1,135,1,135,1,135,1,135,1,135,5,135,2217,8,135,10,135,12,135,
+ 2220,9,135,1,135,1,135,1,135,1,135,1,135,1,135,5,135,2228,8,135,10,135,
+ 12,135,2231,9,135,1,135,1,135,1,135,1,135,1,135,1,135,5,135,2239,8,135,
+ 10,135,12,135,2242,9,135,3,135,2244,8,135,1,136,1,136,1,136,1,137,1,137,
+ 3,137,2251,8,137,1,138,1,138,1,138,1,138,1,139,1,139,1,139,1,140,4,140,
+ 2261,8,140,11,140,12,140,2262,1,141,1,141,1,141,1,141,1,141,1,141,1,141,
+ 1,141,1,141,1,141,1,141,1,141,3,141,2277,8,141,1,142,1,142,1,142,1,142,
+ 1,142,1,142,1,142,1,142,1,142,1,142,1,142,1,142,3,142,2291,8,142,1,143,
+ 1,143,1,143,1,143,1,143,1,143,3,143,2299,8,143,1,144,1,144,1,144,1,145,
+ 1,145,1,146,1,146,1,147,1,147,1,147,1,147,1,147,1,147,1,147,1,147,1,147,
+ 1,147,1,147,3,147,2319,8,147,1,148,1,148,1,148,1,149,1,149,1,149,1,149,
+ 1,149,1,149,1,149,3,149,2331,8,149,1,150,1,150,1,150,3,150,2336,8,150,
+ 1,151,1,151,1,151,1,151,1,151,4,151,2343,8,151,11,151,12,151,2344,3,151,
+ 2347,8,151,1,152,1,152,1,152,5,152,2352,8,152,10,152,12,152,2355,9,152,
+ 1,152,1,152,1,153,1,153,1,153,1,153,1,153,3,153,2364,8,153,1,154,1,154,
+ 1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,
1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,
1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,
1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,
1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,
- 1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,3,154,
- 2414,8,154,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,
+ 1,154,1,154,1,154,1,154,3,154,2432,8,154,1,155,1,155,1,155,1,155,1,155,
1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,
1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,
1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,
1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,
1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,
- 1,155,1,155,1,155,1,155,1,155,3,155,2491,8,155,1,156,5,156,2494,8,156,
- 10,156,12,156,2497,9,156,1,157,1,157,1,158,1,158,1,158,3,158,2504,8,158,
+ 1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,3,155,2509,
+ 8,155,1,156,5,156,2512,8,156,10,156,12,156,2515,9,156,1,157,1,157,1,158,
+ 1,158,1,158,3,158,2522,8,158,1,159,1,159,1,159,1,159,1,159,1,159,1,159,
1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,
1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,
1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,
@@ -17211,907 +17301,913 @@ private bool vtfixupAttr_sempred(VtfixupAttrContext _localctx, int predIndex) {
1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,
1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,
1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,
- 1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,
- 1,159,1,159,1,159,1,159,3,159,2654,8,159,1,160,1,160,5,160,2658,8,160,
- 10,160,12,160,2661,9,160,1,161,1,161,5,161,2665,8,161,10,161,12,161,2668,
- 9,161,1,162,5,162,2671,8,162,10,162,12,162,2674,9,162,1,163,5,163,2677,
- 8,163,10,163,12,163,2680,9,163,1,164,5,164,2683,8,164,10,164,12,164,2686,
- 9,164,1,165,5,165,2689,8,165,10,165,12,165,2692,9,165,1,166,5,166,2695,
- 8,166,10,166,12,166,2698,9,166,1,167,5,167,2701,8,167,10,167,12,167,2704,
- 9,167,1,168,5,168,2707,8,168,10,168,12,168,2710,9,168,1,169,1,169,1,169,
- 1,169,3,169,2716,8,169,1,170,5,170,2719,8,170,10,170,12,170,2722,9,170,
- 1,171,1,171,1,171,3,171,2727,8,171,1,172,1,172,1,172,1,172,1,172,1,172,
+ 1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,3,159,2672,8,159,
+ 1,160,1,160,5,160,2676,8,160,10,160,12,160,2679,9,160,1,161,1,161,5,161,
+ 2683,8,161,10,161,12,161,2686,9,161,1,162,5,162,2689,8,162,10,162,12,162,
+ 2692,9,162,1,163,5,163,2695,8,163,10,163,12,163,2698,9,163,1,164,5,164,
+ 2701,8,164,10,164,12,164,2704,9,164,1,165,5,165,2707,8,165,10,165,12,165,
+ 2710,9,165,1,166,5,166,2713,8,166,10,166,12,166,2716,9,166,1,167,5,167,
+ 2719,8,167,10,167,12,167,2722,9,167,1,168,5,168,2725,8,168,10,168,12,168,
+ 2728,9,168,1,169,1,169,1,169,1,169,3,169,2734,8,169,1,170,5,170,2737,8,
+ 170,10,170,12,170,2740,9,170,1,171,1,171,1,171,3,171,2745,8,171,1,172,
+ 1,172,1,172,1,172,1,172,1,172,1,172,1,172,1,172,1,172,1,172,1,172,1,172,
1,172,1,172,1,172,1,172,1,172,1,172,1,172,1,172,1,172,1,172,1,172,1,172,
- 1,172,1,172,1,172,1,172,1,172,1,172,1,172,3,172,2754,8,172,1,173,1,173,
- 1,173,1,173,1,173,1,173,1,173,1,173,1,173,1,173,1,173,1,173,3,173,2768,
- 8,173,1,174,5,174,2771,8,174,10,174,12,174,2774,9,174,1,175,1,175,1,175,
- 1,175,1,175,1,175,1,175,1,175,1,175,1,175,1,175,1,175,1,175,1,175,3,175,
- 2790,8,175,1,176,1,176,1,176,5,176,2795,8,176,10,176,12,176,2798,9,176,
- 1,176,1,176,1,177,1,177,5,177,2804,8,177,10,177,12,177,2807,9,177,1,177,
- 1,177,1,178,1,178,1,178,1,178,1,178,1,178,1,178,1,178,1,178,1,178,1,178,
- 1,178,1,178,1,178,1,178,3,178,2826,8,178,1,179,5,179,2829,8,179,10,179,
- 12,179,2832,9,179,1,180,1,180,1,180,1,180,1,180,1,180,1,180,1,180,1,180,
- 1,180,1,180,1,180,1,180,3,180,2847,8,180,1,181,1,181,5,181,2851,8,181,
- 10,181,12,181,2854,9,181,1,181,1,181,1,181,5,181,2859,8,181,10,181,12,
- 181,2862,9,181,1,181,1,181,1,181,1,181,3,181,2868,8,181,1,182,1,182,1,
- 183,5,183,2873,8,183,10,183,12,183,2876,9,183,1,184,1,184,1,184,1,184,
- 1,184,1,184,1,184,1,184,1,184,1,184,3,184,2888,8,184,1,184,0,1,68,185,
- 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,
- 50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,
- 98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,
- 134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,166,168,
- 170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,200,202,204,
- 206,208,210,212,214,216,218,220,222,224,226,228,230,232,234,236,238,240,
- 242,244,246,248,250,252,254,256,258,260,262,264,266,268,270,272,274,276,
- 278,280,282,284,286,288,290,292,294,296,298,300,302,304,306,308,310,312,
- 314,316,318,320,322,324,326,328,330,332,334,336,338,340,342,344,346,348,
- 350,352,354,356,358,360,362,364,366,368,0,15,6,0,1,15,198,198,242,242,
- 246,246,263,263,288,288,3,0,198,198,242,242,288,288,1,0,262,263,1,0,172,
- 173,1,0,36,37,1,0,72,73,3,0,2,2,60,60,76,82,2,0,228,228,259,260,9,0,177,
- 177,182,194,200,200,206,207,209,214,217,218,221,221,229,241,261,261,1,
- 0,94,95,1,0,96,110,1,0,67,68,2,0,172,172,288,289,2,0,178,178,263,263,1,
- 0,50,51,3301,0,370,1,0,0,0,2,383,1,0,0,0,4,385,1,0,0,0,6,391,1,0,0,0,8,
- 399,1,0,0,0,10,452,1,0,0,0,12,454,1,0,0,0,14,457,1,0,0,0,16,460,1,0,0,
- 0,18,464,1,0,0,0,20,467,1,0,0,0,22,470,1,0,0,0,24,477,1,0,0,0,26,493,1,
- 0,0,0,28,495,1,0,0,0,30,497,1,0,0,0,32,507,1,0,0,0,34,509,1,0,0,0,36,526,
- 1,0,0,0,38,530,1,0,0,0,40,548,1,0,0,0,42,575,1,0,0,0,44,598,1,0,0,0,46,
- 634,1,0,0,0,48,636,1,0,0,0,50,640,1,0,0,0,52,642,1,0,0,0,54,649,1,0,0,
- 0,56,661,1,0,0,0,58,664,1,0,0,0,60,666,1,0,0,0,62,679,1,0,0,0,64,687,1,
- 0,0,0,66,689,1,0,0,0,68,697,1,0,0,0,70,713,1,0,0,0,72,719,1,0,0,0,74,722,
- 1,0,0,0,76,771,1,0,0,0,78,776,1,0,0,0,80,781,1,0,0,0,82,786,1,0,0,0,84,
- 794,1,0,0,0,86,799,1,0,0,0,88,904,1,0,0,0,90,932,1,0,0,0,92,934,1,0,0,
- 0,94,938,1,0,0,0,96,940,1,0,0,0,98,945,1,0,0,0,100,948,1,0,0,0,102,950,
- 1,0,0,0,104,952,1,0,0,0,106,954,1,0,0,0,108,956,1,0,0,0,110,958,1,0,0,
- 0,112,960,1,0,0,0,114,962,1,0,0,0,116,964,1,0,0,0,118,966,1,0,0,0,120,
- 968,1,0,0,0,122,970,1,0,0,0,124,972,1,0,0,0,126,1053,1,0,0,0,128,1071,
- 1,0,0,0,130,1073,1,0,0,0,132,1085,1,0,0,0,134,1110,1,0,0,0,136,1119,1,
- 0,0,0,138,1146,1,0,0,0,140,1153,1,0,0,0,142,1161,1,0,0,0,144,1169,1,0,
- 0,0,146,1182,1,0,0,0,148,1192,1,0,0,0,150,1211,1,0,0,0,152,1297,1,0,0,
- 0,154,1306,1,0,0,0,156,1316,1,0,0,0,158,1318,1,0,0,0,160,1320,1,0,0,0,
- 162,1345,1,0,0,0,164,1377,1,0,0,0,166,1400,1,0,0,0,168,1412,1,0,0,0,170,
- 1414,1,0,0,0,172,1417,1,0,0,0,174,1463,1,0,0,0,176,1475,1,0,0,0,178,1490,
- 1,0,0,0,180,1497,1,0,0,0,182,1502,1,0,0,0,184,1506,1,0,0,0,186,1542,1,
- 0,0,0,188,1544,1,0,0,0,190,1580,1,0,0,0,192,1592,1,0,0,0,194,1606,1,0,
- 0,0,196,1608,1,0,0,0,198,1618,1,0,0,0,200,1629,1,0,0,0,202,1636,1,0,0,
- 0,204,1646,1,0,0,0,206,1659,1,0,0,0,208,1664,1,0,0,0,210,1667,1,0,0,0,
- 212,1678,1,0,0,0,214,1683,1,0,0,0,216,1689,1,0,0,0,218,1691,1,0,0,0,220,
- 1813,1,0,0,0,222,1815,1,0,0,0,224,1852,1,0,0,0,226,1859,1,0,0,0,228,1864,
- 1,0,0,0,230,1871,1,0,0,0,232,1891,1,0,0,0,234,1893,1,0,0,0,236,1898,1,
- 0,0,0,238,1913,1,0,0,0,240,1915,1,0,0,0,242,1928,1,0,0,0,244,1933,1,0,
- 0,0,246,1946,1,0,0,0,248,1954,1,0,0,0,250,1965,1,0,0,0,252,1970,1,0,0,
- 0,254,1986,1,0,0,0,256,1988,1,0,0,0,258,2032,1,0,0,0,260,2052,1,0,0,0,
- 262,2081,1,0,0,0,264,2086,1,0,0,0,266,2109,1,0,0,0,268,2114,1,0,0,0,270,
- 2225,1,0,0,0,272,2227,1,0,0,0,274,2232,1,0,0,0,276,2234,1,0,0,0,278,2238,
- 1,0,0,0,280,2242,1,0,0,0,282,2258,1,0,0,0,284,2272,1,0,0,0,286,2280,1,
- 0,0,0,288,2282,1,0,0,0,290,2285,1,0,0,0,292,2287,1,0,0,0,294,2300,1,0,
- 0,0,296,2302,1,0,0,0,298,2312,1,0,0,0,300,2317,1,0,0,0,302,2328,1,0,0,
- 0,304,2335,1,0,0,0,306,2345,1,0,0,0,308,2413,1,0,0,0,310,2490,1,0,0,0,
- 312,2495,1,0,0,0,314,2498,1,0,0,0,316,2503,1,0,0,0,318,2653,1,0,0,0,320,
- 2659,1,0,0,0,322,2666,1,0,0,0,324,2672,1,0,0,0,326,2678,1,0,0,0,328,2684,
- 1,0,0,0,330,2690,1,0,0,0,332,2696,1,0,0,0,334,2702,1,0,0,0,336,2708,1,
- 0,0,0,338,2715,1,0,0,0,340,2720,1,0,0,0,342,2726,1,0,0,0,344,2753,1,0,
- 0,0,346,2767,1,0,0,0,348,2772,1,0,0,0,350,2789,1,0,0,0,352,2791,1,0,0,
- 0,354,2801,1,0,0,0,356,2825,1,0,0,0,358,2830,1,0,0,0,360,2846,1,0,0,0,
- 362,2867,1,0,0,0,364,2869,1,0,0,0,366,2874,1,0,0,0,368,2887,1,0,0,0,370,
- 371,7,0,0,0,371,1,1,0,0,0,372,384,5,287,0,0,373,374,3,4,2,0,374,375,5,
- 264,0,0,375,377,1,0,0,0,376,373,1,0,0,0,377,380,1,0,0,0,378,376,1,0,0,
- 0,378,379,1,0,0,0,379,381,1,0,0,0,380,378,1,0,0,0,381,384,3,4,2,0,382,
- 384,5,263,0,0,383,372,1,0,0,0,383,378,1,0,0,0,383,382,1,0,0,0,384,3,1,
- 0,0,0,385,386,7,1,0,0,386,5,1,0,0,0,387,388,5,262,0,0,388,390,5,265,0,
- 0,389,387,1,0,0,0,390,393,1,0,0,0,391,389,1,0,0,0,391,392,1,0,0,0,392,
- 394,1,0,0,0,393,391,1,0,0,0,394,395,5,262,0,0,395,7,1,0,0,0,396,398,3,
- 10,5,0,397,396,1,0,0,0,398,401,1,0,0,0,399,397,1,0,0,0,399,400,1,0,0,0,
- 400,9,1,0,0,0,401,399,1,0,0,0,402,403,3,74,37,0,403,404,5,16,0,0,404,405,
- 3,82,41,0,405,406,5,17,0,0,406,453,1,0,0,0,407,408,3,72,36,0,408,409,5,
- 16,0,0,409,410,3,8,4,0,410,411,5,17,0,0,411,453,1,0,0,0,412,413,3,256,
- 128,0,413,414,5,16,0,0,414,415,3,268,134,0,415,416,5,17,0,0,416,453,1,
- 0,0,0,417,453,3,222,111,0,418,453,3,296,148,0,419,453,3,70,35,0,420,453,
- 3,66,33,0,421,453,3,88,44,0,422,453,3,90,45,0,423,453,3,22,11,0,424,425,
- 3,346,173,0,425,426,5,16,0,0,426,427,3,348,174,0,427,428,5,17,0,0,428,
- 453,1,0,0,0,429,430,3,352,176,0,430,431,5,16,0,0,431,432,3,358,179,0,432,
- 433,5,17,0,0,433,453,1,0,0,0,434,435,3,362,181,0,435,436,5,16,0,0,436,
- 437,3,366,183,0,437,438,5,17,0,0,438,453,1,0,0,0,439,453,3,64,32,0,440,
- 453,3,174,87,0,441,453,3,342,171,0,442,453,3,12,6,0,443,453,3,14,7,0,444,
- 453,3,16,8,0,445,453,3,18,9,0,446,453,3,20,10,0,447,453,3,26,13,0,448,
- 453,3,42,21,0,449,453,3,40,20,0,450,453,3,30,15,0,451,453,3,24,12,0,452,
- 402,1,0,0,0,452,407,1,0,0,0,452,412,1,0,0,0,452,417,1,0,0,0,452,418,1,
- 0,0,0,452,419,1,0,0,0,452,420,1,0,0,0,452,421,1,0,0,0,452,422,1,0,0,0,
- 452,423,1,0,0,0,452,424,1,0,0,0,452,429,1,0,0,0,452,434,1,0,0,0,452,439,
- 1,0,0,0,452,440,1,0,0,0,452,441,1,0,0,0,452,442,1,0,0,0,452,443,1,0,0,
- 0,452,444,1,0,0,0,452,445,1,0,0,0,452,446,1,0,0,0,452,447,1,0,0,0,452,
- 448,1,0,0,0,452,449,1,0,0,0,452,450,1,0,0,0,452,451,1,0,0,0,453,11,1,0,
- 0,0,454,455,5,18,0,0,455,456,3,32,16,0,456,13,1,0,0,0,457,458,5,19,0,0,
- 458,459,3,32,16,0,459,15,1,0,0,0,460,461,5,20,0,0,461,462,5,21,0,0,462,
- 463,3,32,16,0,463,17,1,0,0,0,464,465,5,22,0,0,465,466,3,34,17,0,466,19,
- 1,0,0,0,467,468,5,23,0,0,468,469,3,34,17,0,469,21,1,0,0,0,470,471,5,24,
- 0,0,471,472,3,98,49,0,472,473,3,2,1,0,473,474,5,16,0,0,474,475,3,142,71,
- 0,475,476,5,17,0,0,476,23,1,0,0,0,477,478,5,25,0,0,478,25,1,0,0,0,479,
- 480,5,26,0,0,480,494,3,28,14,0,481,482,5,26,0,0,482,483,3,28,14,0,483,
- 484,5,27,0,0,484,485,3,28,14,0,485,494,1,0,0,0,486,487,5,26,0,0,487,488,
- 3,28,14,0,488,489,5,27,0,0,489,490,3,28,14,0,490,491,5,27,0,0,491,492,
- 3,28,14,0,492,494,1,0,0,0,493,479,1,0,0,0,493,481,1,0,0,0,493,486,1,0,
- 0,0,494,27,1,0,0,0,495,496,7,2,0,0,496,29,1,0,0,0,497,498,5,28,0,0,498,
- 502,5,16,0,0,499,501,3,138,69,0,500,499,1,0,0,0,501,504,1,0,0,0,502,500,
- 1,0,0,0,502,503,1,0,0,0,503,505,1,0,0,0,504,502,1,0,0,0,505,506,5,17,0,
- 0,506,31,1,0,0,0,507,508,5,172,0,0,508,33,1,0,0,0,509,510,7,3,0,0,510,
- 35,1,0,0,0,511,527,5,174,0,0,512,513,3,32,16,0,513,514,5,264,0,0,514,527,
- 1,0,0,0,515,527,3,32,16,0,516,517,5,187,0,0,517,518,5,29,0,0,518,519,3,
- 32,16,0,519,520,5,30,0,0,520,527,1,0,0,0,521,522,5,188,0,0,522,523,5,29,
- 0,0,523,524,3,34,17,0,524,525,5,30,0,0,525,527,1,0,0,0,526,511,1,0,0,0,
- 526,512,1,0,0,0,526,515,1,0,0,0,526,516,1,0,0,0,526,521,1,0,0,0,527,37,
- 1,0,0,0,528,531,3,32,16,0,529,531,5,261,0,0,530,528,1,0,0,0,530,529,1,
- 0,0,0,531,39,1,0,0,0,532,533,5,266,0,0,533,549,5,288,0,0,534,535,5,266,
- 0,0,535,536,5,288,0,0,536,549,5,262,0,0,537,538,5,267,0,0,538,549,5,288,
- 0,0,539,540,5,268,0,0,540,549,5,288,0,0,541,542,5,269,0,0,542,549,5,288,
- 0,0,543,549,5,270,0,0,544,549,5,271,0,0,545,546,5,272,0,0,546,549,5,262,
- 0,0,547,549,5,31,0,0,548,532,1,0,0,0,548,534,1,0,0,0,548,537,1,0,0,0,548,
- 539,1,0,0,0,548,541,1,0,0,0,548,543,1,0,0,0,548,544,1,0,0,0,548,545,1,
- 0,0,0,548,547,1,0,0,0,549,41,1,0,0,0,550,551,5,32,0,0,551,552,3,160,80,
- 0,552,553,5,33,0,0,553,554,3,2,1,0,554,576,1,0,0,0,555,556,5,32,0,0,556,
- 557,3,138,69,0,557,558,5,33,0,0,558,559,3,2,1,0,559,576,1,0,0,0,560,561,
- 5,32,0,0,561,562,3,198,99,0,562,563,5,33,0,0,563,564,3,2,1,0,564,576,1,
- 0,0,0,565,566,5,32,0,0,566,567,3,44,22,0,567,568,5,33,0,0,568,569,3,2,
- 1,0,569,576,1,0,0,0,570,571,5,32,0,0,571,572,3,46,23,0,572,573,5,33,0,
- 0,573,574,3,2,1,0,574,576,1,0,0,0,575,550,1,0,0,0,575,555,1,0,0,0,575,
- 560,1,0,0,0,575,565,1,0,0,0,575,570,1,0,0,0,576,43,1,0,0,0,577,578,5,34,
- 0,0,578,599,3,48,24,0,579,580,5,34,0,0,580,581,3,48,24,0,581,582,5,35,
- 0,0,582,583,3,6,3,0,583,599,1,0,0,0,584,585,5,34,0,0,585,586,3,48,24,0,
- 586,587,5,35,0,0,587,588,5,16,0,0,588,589,3,52,26,0,589,590,5,17,0,0,590,
- 599,1,0,0,0,591,592,5,34,0,0,592,593,3,48,24,0,593,594,5,35,0,0,594,595,
- 5,29,0,0,595,596,3,312,156,0,596,597,5,30,0,0,597,599,1,0,0,0,598,577,
- 1,0,0,0,598,579,1,0,0,0,598,584,1,0,0,0,598,591,1,0,0,0,599,45,1,0,0,0,
- 600,601,5,34,0,0,601,602,5,29,0,0,602,603,3,50,25,0,603,604,5,30,0,0,604,
- 605,3,48,24,0,605,635,1,0,0,0,606,607,5,34,0,0,607,608,5,29,0,0,608,609,
- 3,50,25,0,609,610,5,30,0,0,610,611,3,48,24,0,611,612,5,35,0,0,612,613,
- 3,6,3,0,613,635,1,0,0,0,614,615,5,34,0,0,615,616,5,29,0,0,616,617,3,50,
- 25,0,617,618,5,30,0,0,618,619,3,48,24,0,619,620,5,35,0,0,620,621,5,16,
- 0,0,621,622,3,52,26,0,622,623,5,17,0,0,623,635,1,0,0,0,624,625,5,34,0,
- 0,625,626,5,29,0,0,626,627,3,50,25,0,627,628,5,30,0,0,628,629,3,48,24,
- 0,629,630,5,35,0,0,630,631,5,29,0,0,631,632,3,312,156,0,632,633,5,30,0,
- 0,633,635,1,0,0,0,634,600,1,0,0,0,634,606,1,0,0,0,634,614,1,0,0,0,634,
- 624,1,0,0,0,635,47,1,0,0,0,636,637,3,190,95,0,637,49,1,0,0,0,638,641,3,
- 146,73,0,639,641,3,198,99,0,640,638,1,0,0,0,640,639,1,0,0,0,641,51,1,0,
- 0,0,642,643,3,54,27,0,643,644,3,56,28,0,644,53,1,0,0,0,645,648,3,318,159,
- 0,646,648,3,40,20,0,647,645,1,0,0,0,647,646,1,0,0,0,648,651,1,0,0,0,649,
- 647,1,0,0,0,649,650,1,0,0,0,650,55,1,0,0,0,651,649,1,0,0,0,652,653,3,58,
- 29,0,653,654,3,60,30,0,654,655,3,2,1,0,655,656,5,35,0,0,656,657,3,318,
- 159,0,657,660,1,0,0,0,658,660,3,40,20,0,659,652,1,0,0,0,659,658,1,0,0,
- 0,660,663,1,0,0,0,661,659,1,0,0,0,661,662,1,0,0,0,662,57,1,0,0,0,663,661,
- 1,0,0,0,664,665,7,4,0,0,665,59,1,0,0,0,666,668,3,62,31,0,667,669,5,260,
- 0,0,668,667,1,0,0,0,668,669,1,0,0,0,669,61,1,0,0,0,670,680,3,166,83,0,
- 671,680,3,2,1,0,672,680,5,195,0,0,673,680,5,196,0,0,674,675,5,201,0,0,
- 675,676,5,38,0,0,676,680,5,263,0,0,677,678,5,201,0,0,678,680,3,138,69,
- 0,679,670,1,0,0,0,679,671,1,0,0,0,679,672,1,0,0,0,679,673,1,0,0,0,679,
- 674,1,0,0,0,679,677,1,0,0,0,680,63,1,0,0,0,681,682,5,197,0,0,682,683,5,
- 39,0,0,683,688,3,2,1,0,684,685,5,197,0,0,685,688,3,2,1,0,686,688,5,197,
- 0,0,687,681,1,0,0,0,687,684,1,0,0,0,687,686,1,0,0,0,688,65,1,0,0,0,689,
- 690,5,40,0,0,690,691,5,41,0,0,691,692,3,32,16,0,692,693,5,42,0,0,693,694,
- 3,68,34,0,694,695,5,43,0,0,695,696,3,0,0,0,696,67,1,0,0,0,697,710,6,34,
- -1,0,698,699,10,5,0,0,699,709,5,185,0,0,700,701,10,4,0,0,701,709,5,186,
- 0,0,702,703,10,3,0,0,703,709,5,44,0,0,704,705,10,2,0,0,705,709,5,45,0,
- 0,706,707,10,1,0,0,707,709,5,46,0,0,708,698,1,0,0,0,708,700,1,0,0,0,708,
- 702,1,0,0,0,708,704,1,0,0,0,708,706,1,0,0,0,709,712,1,0,0,0,710,708,1,
- 0,0,0,710,711,1,0,0,0,711,69,1,0,0,0,712,710,1,0,0,0,713,714,5,47,0,0,
- 714,715,5,35,0,0,715,716,5,29,0,0,716,717,3,312,156,0,717,718,5,30,0,0,
- 718,71,1,0,0,0,719,720,5,48,0,0,720,721,3,2,1,0,721,73,1,0,0,0,722,726,
- 5,49,0,0,723,725,3,76,38,0,724,723,1,0,0,0,725,728,1,0,0,0,726,724,1,0,
- 0,0,726,727,1,0,0,0,727,729,1,0,0,0,728,726,1,0,0,0,729,730,3,2,1,0,730,
- 731,3,204,102,0,731,732,3,78,39,0,732,733,3,80,40,0,733,75,1,0,0,0,734,
- 772,5,50,0,0,735,772,5,51,0,0,736,772,5,198,0,0,737,772,5,201,0,0,738,
- 772,5,220,0,0,739,772,5,52,0,0,740,772,5,53,0,0,741,772,5,54,0,0,742,772,
- 5,55,0,0,743,772,5,243,0,0,744,772,5,15,0,0,745,772,5,223,0,0,746,772,
- 5,56,0,0,747,772,5,57,0,0,748,772,5,58,0,0,749,772,5,59,0,0,750,772,5,
- 60,0,0,751,752,5,61,0,0,752,772,5,50,0,0,753,754,5,61,0,0,754,772,5,51,
- 0,0,755,756,5,61,0,0,756,772,5,62,0,0,757,758,5,61,0,0,758,772,5,63,0,
- 0,759,760,5,61,0,0,760,772,5,64,0,0,761,762,5,61,0,0,762,772,5,65,0,0,
- 763,772,5,66,0,0,764,772,5,67,0,0,765,772,5,68,0,0,766,767,5,69,0,0,767,
- 768,5,29,0,0,768,769,3,32,16,0,769,770,5,30,0,0,770,772,1,0,0,0,771,734,
- 1,0,0,0,771,735,1,0,0,0,771,736,1,0,0,0,771,737,1,0,0,0,771,738,1,0,0,
- 0,771,739,1,0,0,0,771,740,1,0,0,0,771,741,1,0,0,0,771,742,1,0,0,0,771,
- 743,1,0,0,0,771,744,1,0,0,0,771,745,1,0,0,0,771,746,1,0,0,0,771,747,1,
- 0,0,0,771,748,1,0,0,0,771,749,1,0,0,0,771,750,1,0,0,0,771,751,1,0,0,0,
- 771,753,1,0,0,0,771,755,1,0,0,0,771,757,1,0,0,0,771,759,1,0,0,0,771,761,
- 1,0,0,0,771,763,1,0,0,0,771,764,1,0,0,0,771,765,1,0,0,0,771,766,1,0,0,
- 0,772,77,1,0,0,0,773,777,1,0,0,0,774,775,5,70,0,0,775,777,3,146,73,0,776,
- 773,1,0,0,0,776,774,1,0,0,0,777,79,1,0,0,0,778,782,1,0,0,0,779,780,5,71,
- 0,0,780,782,3,84,42,0,781,778,1,0,0,0,781,779,1,0,0,0,782,81,1,0,0,0,783,
- 785,3,220,110,0,784,783,1,0,0,0,785,788,1,0,0,0,786,784,1,0,0,0,786,787,
- 1,0,0,0,787,83,1,0,0,0,788,786,1,0,0,0,789,790,3,146,73,0,790,791,5,27,
- 0,0,791,793,1,0,0,0,792,789,1,0,0,0,793,796,1,0,0,0,794,792,1,0,0,0,794,
- 795,1,0,0,0,795,797,1,0,0,0,796,794,1,0,0,0,797,798,3,146,73,0,798,85,
- 1,0,0,0,799,800,7,5,0,0,800,87,1,0,0,0,801,802,3,86,43,0,802,803,3,32,
- 16,0,803,804,5,263,0,0,804,905,1,0,0,0,805,806,3,86,43,0,806,807,3,32,
- 16,0,807,905,1,0,0,0,808,809,3,86,43,0,809,810,3,32,16,0,810,811,5,74,
- 0,0,811,812,3,32,16,0,812,813,5,263,0,0,813,905,1,0,0,0,814,815,3,86,43,
- 0,815,816,3,32,16,0,816,817,5,74,0,0,817,818,3,32,16,0,818,905,1,0,0,0,
- 819,820,3,86,43,0,820,821,3,32,16,0,821,822,5,74,0,0,822,823,3,32,16,0,
- 823,824,5,27,0,0,824,825,3,32,16,0,825,826,5,263,0,0,826,905,1,0,0,0,827,
- 828,3,86,43,0,828,829,3,32,16,0,829,830,5,74,0,0,830,831,3,32,16,0,831,
- 832,5,27,0,0,832,833,3,32,16,0,833,905,1,0,0,0,834,835,3,86,43,0,835,836,
- 3,32,16,0,836,837,5,27,0,0,837,838,3,32,16,0,838,839,5,74,0,0,839,840,
- 3,32,16,0,840,841,5,263,0,0,841,905,1,0,0,0,842,843,3,86,43,0,843,844,
- 3,32,16,0,844,845,5,27,0,0,845,846,3,32,16,0,846,847,5,74,0,0,847,848,
- 3,32,16,0,848,905,1,0,0,0,849,850,3,86,43,0,850,851,3,32,16,0,851,852,
- 5,27,0,0,852,853,3,32,16,0,853,854,5,74,0,0,854,855,3,32,16,0,855,856,
- 5,27,0,0,856,857,3,32,16,0,857,858,5,263,0,0,858,905,1,0,0,0,859,860,3,
- 86,43,0,860,861,3,32,16,0,861,862,5,27,0,0,862,863,3,32,16,0,863,864,5,
- 74,0,0,864,865,3,32,16,0,865,866,5,27,0,0,866,867,3,32,16,0,867,905,1,
- 0,0,0,868,869,3,86,43,0,869,870,3,32,16,0,870,871,5,262,0,0,871,905,1,
- 0,0,0,872,873,3,86,43,0,873,874,3,32,16,0,874,875,5,74,0,0,875,876,3,32,
- 16,0,876,877,5,262,0,0,877,905,1,0,0,0,878,879,3,86,43,0,879,880,3,32,
- 16,0,880,881,5,74,0,0,881,882,3,32,16,0,882,883,5,27,0,0,883,884,3,32,
- 16,0,884,885,5,262,0,0,885,905,1,0,0,0,886,887,3,86,43,0,887,888,3,32,
- 16,0,888,889,5,27,0,0,889,890,3,32,16,0,890,891,5,74,0,0,891,892,3,32,
- 16,0,892,893,5,262,0,0,893,905,1,0,0,0,894,895,3,86,43,0,895,896,3,32,
- 16,0,896,897,5,27,0,0,897,898,3,32,16,0,898,899,5,74,0,0,899,900,3,32,
- 16,0,900,901,5,27,0,0,901,902,3,32,16,0,902,903,5,262,0,0,903,905,1,0,
- 0,0,904,801,1,0,0,0,904,805,1,0,0,0,904,808,1,0,0,0,904,814,1,0,0,0,904,
- 819,1,0,0,0,904,827,1,0,0,0,904,834,1,0,0,0,904,842,1,0,0,0,904,849,1,
- 0,0,0,904,859,1,0,0,0,904,868,1,0,0,0,904,872,1,0,0,0,904,878,1,0,0,0,
- 904,886,1,0,0,0,904,894,1,0,0,0,905,89,1,0,0,0,906,910,5,20,0,0,907,909,
- 3,92,46,0,908,907,1,0,0,0,909,912,1,0,0,0,910,908,1,0,0,0,910,911,1,0,
- 0,0,911,913,1,0,0,0,912,910,1,0,0,0,913,914,3,2,1,0,914,915,3,94,47,0,
- 915,916,5,179,0,0,916,917,5,35,0,0,917,918,5,29,0,0,918,919,3,312,156,
- 0,919,920,5,30,0,0,920,921,3,94,47,0,921,933,1,0,0,0,922,926,5,20,0,0,
- 923,925,3,92,46,0,924,923,1,0,0,0,925,928,1,0,0,0,926,924,1,0,0,0,926,
- 927,1,0,0,0,927,929,1,0,0,0,928,926,1,0,0,0,929,930,3,2,1,0,930,931,3,
- 94,47,0,931,933,1,0,0,0,932,906,1,0,0,0,932,922,1,0,0,0,933,91,1,0,0,0,
- 934,935,5,75,0,0,935,93,1,0,0,0,936,939,1,0,0,0,937,939,5,297,0,0,938,
- 936,1,0,0,0,938,937,1,0,0,0,939,95,1,0,0,0,940,941,7,6,0,0,941,97,1,0,
- 0,0,942,944,3,96,48,0,943,942,1,0,0,0,944,947,1,0,0,0,945,943,1,0,0,0,
- 945,946,1,0,0,0,946,99,1,0,0,0,947,945,1,0,0,0,948,949,5,274,0,0,949,101,
- 1,0,0,0,950,951,5,275,0,0,951,103,1,0,0,0,952,953,5,276,0,0,953,105,1,
- 0,0,0,954,955,5,277,0,0,955,107,1,0,0,0,956,957,5,278,0,0,957,109,1,0,
- 0,0,958,959,5,281,0,0,959,111,1,0,0,0,960,961,5,279,0,0,961,113,1,0,0,
- 0,962,963,5,285,0,0,963,115,1,0,0,0,964,965,5,283,0,0,965,117,1,0,0,0,
- 966,967,5,284,0,0,967,119,1,0,0,0,968,969,5,280,0,0,969,121,1,0,0,0,970,
- 971,5,286,0,0,971,123,1,0,0,0,972,973,5,282,0,0,973,125,1,0,0,0,974,1054,
- 3,100,50,0,975,976,3,102,51,0,976,977,3,32,16,0,977,1054,1,0,0,0,978,979,
- 3,102,51,0,979,980,3,0,0,0,980,1054,1,0,0,0,981,982,3,104,52,0,982,983,
- 3,32,16,0,983,1054,1,0,0,0,984,985,3,106,53,0,985,986,3,34,17,0,986,1054,
- 1,0,0,0,987,988,3,108,54,0,988,989,3,36,18,0,989,1054,1,0,0,0,990,991,
- 3,108,54,0,991,992,3,34,17,0,992,1054,1,0,0,0,993,994,3,108,54,0,994,995,
- 5,29,0,0,995,996,3,312,156,0,996,997,5,30,0,0,997,1054,1,0,0,0,998,999,
- 3,108,54,0,999,1000,5,83,0,0,1000,1001,5,29,0,0,1001,1002,3,312,156,0,
- 1002,1003,5,30,0,0,1003,1054,1,0,0,0,1004,1005,3,110,55,0,1005,1006,3,
- 32,16,0,1006,1054,1,0,0,0,1007,1008,3,110,55,0,1008,1009,3,0,0,0,1009,
- 1054,1,0,0,0,1010,1011,3,112,56,0,1011,1012,3,190,95,0,1012,1054,1,0,0,
- 0,1013,1014,3,114,57,0,1014,1015,3,200,100,0,1015,1054,1,0,0,0,1016,1017,
- 3,114,57,0,1017,1018,3,196,98,0,1018,1054,1,0,0,0,1019,1020,3,116,58,0,
- 1020,1021,3,146,73,0,1021,1054,1,0,0,0,1022,1023,3,118,59,0,1023,1024,
- 3,6,3,0,1024,1054,1,0,0,0,1025,1026,3,118,59,0,1026,1027,5,223,0,0,1027,
- 1028,5,29,0,0,1028,1029,3,6,3,0,1029,1030,5,30,0,0,1030,1054,1,0,0,0,1031,
- 1032,3,118,59,0,1032,1033,5,83,0,0,1033,1034,5,29,0,0,1034,1035,3,312,
- 156,0,1035,1036,5,30,0,0,1036,1054,1,0,0,0,1037,1038,3,120,60,0,1038,1039,
- 3,192,96,0,1039,1040,3,160,80,0,1040,1041,3,134,67,0,1041,1054,1,0,0,0,
- 1042,1043,3,122,61,0,1043,1044,3,50,25,0,1044,1054,1,0,0,0,1045,1046,3,
- 124,62,0,1046,1047,5,29,0,0,1047,1048,3,128,64,0,1048,1049,5,30,0,0,1049,
- 1054,1,0,0,0,1050,1051,3,124,62,0,1051,1052,5,84,0,0,1052,1054,1,0,0,0,
- 1053,974,1,0,0,0,1053,975,1,0,0,0,1053,978,1,0,0,0,1053,981,1,0,0,0,1053,
- 984,1,0,0,0,1053,987,1,0,0,0,1053,990,1,0,0,0,1053,993,1,0,0,0,1053,998,
- 1,0,0,0,1053,1004,1,0,0,0,1053,1007,1,0,0,0,1053,1010,1,0,0,0,1053,1013,
- 1,0,0,0,1053,1016,1,0,0,0,1053,1019,1,0,0,0,1053,1022,1,0,0,0,1053,1025,
- 1,0,0,0,1053,1031,1,0,0,0,1053,1037,1,0,0,0,1053,1042,1,0,0,0,1053,1045,
- 1,0,0,0,1053,1050,1,0,0,0,1054,127,1,0,0,0,1055,1072,1,0,0,0,1056,1059,
- 3,0,0,0,1057,1059,3,32,16,0,1058,1056,1,0,0,0,1058,1057,1,0,0,0,1059,1060,
- 1,0,0,0,1060,1061,5,27,0,0,1061,1063,1,0,0,0,1062,1058,1,0,0,0,1063,1066,
- 1,0,0,0,1064,1062,1,0,0,0,1064,1065,1,0,0,0,1065,1069,1,0,0,0,1066,1064,
- 1,0,0,0,1067,1070,3,0,0,0,1068,1070,3,32,16,0,1069,1067,1,0,0,0,1069,1068,
- 1,0,0,0,1070,1072,1,0,0,0,1071,1055,1,0,0,0,1071,1064,1,0,0,0,1072,129,
- 1,0,0,0,1073,1079,5,85,0,0,1074,1075,3,160,80,0,1075,1076,5,27,0,0,1076,
- 1078,1,0,0,0,1077,1074,1,0,0,0,1078,1081,1,0,0,0,1079,1077,1,0,0,0,1079,
- 1080,1,0,0,0,1080,1082,1,0,0,0,1081,1079,1,0,0,0,1082,1083,3,160,80,0,
- 1083,1084,5,86,0,0,1084,131,1,0,0,0,1085,1091,5,41,0,0,1086,1087,3,168,
- 84,0,1087,1088,5,27,0,0,1088,1090,1,0,0,0,1089,1086,1,0,0,0,1090,1093,
- 1,0,0,0,1091,1089,1,0,0,0,1091,1092,1,0,0,0,1092,1094,1,0,0,0,1093,1091,
- 1,0,0,0,1094,1095,3,168,84,0,1095,1096,5,42,0,0,1096,133,1,0,0,0,1097,
- 1103,5,29,0,0,1098,1099,3,136,68,0,1099,1100,5,27,0,0,1100,1102,1,0,0,
- 0,1101,1098,1,0,0,0,1102,1105,1,0,0,0,1103,1101,1,0,0,0,1103,1104,1,0,
- 0,0,1104,1106,1,0,0,0,1105,1103,1,0,0,0,1106,1107,3,136,68,0,1107,1108,
- 5,30,0,0,1108,1111,1,0,0,0,1109,1111,5,84,0,0,1110,1097,1,0,0,0,1110,1109,
- 1,0,0,0,1111,135,1,0,0,0,1112,1120,5,176,0,0,1113,1114,3,252,126,0,1114,
- 1115,3,160,80,0,1115,1117,3,248,124,0,1116,1118,3,0,0,0,1117,1116,1,0,
- 0,0,1117,1118,1,0,0,0,1118,1120,1,0,0,0,1119,1112,1,0,0,0,1119,1113,1,
- 0,0,0,1120,137,1,0,0,0,1121,1122,5,41,0,0,1122,1123,3,2,1,0,1123,1124,
- 5,42,0,0,1124,1125,3,140,70,0,1125,1147,1,0,0,0,1126,1127,5,41,0,0,1127,
- 1128,3,196,98,0,1128,1129,5,42,0,0,1129,1130,3,140,70,0,1130,1147,1,0,
- 0,0,1131,1132,5,41,0,0,1132,1133,5,261,0,0,1133,1134,5,42,0,0,1134,1147,
- 3,140,70,0,1135,1136,5,41,0,0,1136,1137,5,197,0,0,1137,1138,3,2,1,0,1138,
- 1139,5,42,0,0,1139,1140,3,140,70,0,1140,1147,1,0,0,0,1141,1147,3,140,70,
- 0,1142,1147,3,196,98,0,1143,1147,5,256,0,0,1144,1147,5,257,0,0,1145,1147,
- 5,258,0,0,1146,1121,1,0,0,0,1146,1126,1,0,0,0,1146,1131,1,0,0,0,1146,1135,
- 1,0,0,0,1146,1141,1,0,0,0,1146,1142,1,0,0,0,1146,1143,1,0,0,0,1146,1144,
- 1,0,0,0,1146,1145,1,0,0,0,1147,139,1,0,0,0,1148,1149,3,2,1,0,1149,1150,
- 5,87,0,0,1150,1152,1,0,0,0,1151,1148,1,0,0,0,1152,1155,1,0,0,0,1153,1151,
- 1,0,0,0,1153,1154,1,0,0,0,1154,1156,1,0,0,0,1155,1153,1,0,0,0,1156,1157,
- 3,2,1,0,1157,141,1,0,0,0,1158,1160,3,144,72,0,1159,1158,1,0,0,0,1160,1163,
- 1,0,0,0,1161,1159,1,0,0,0,1161,1162,1,0,0,0,1162,143,1,0,0,0,1163,1161,
- 1,0,0,0,1164,1165,5,179,0,0,1165,1166,5,88,0,0,1166,1170,3,32,16,0,1167,
- 1170,3,174,87,0,1168,1170,3,344,172,0,1169,1164,1,0,0,0,1169,1167,1,0,
- 0,0,1169,1168,1,0,0,0,1170,145,1,0,0,0,1171,1183,3,138,69,0,1172,1173,
- 5,41,0,0,1173,1174,3,2,1,0,1174,1175,5,42,0,0,1175,1183,1,0,0,0,1176,1177,
- 5,41,0,0,1177,1178,5,197,0,0,1178,1179,3,2,1,0,1179,1180,5,42,0,0,1180,
- 1183,1,0,0,0,1181,1183,3,160,80,0,1182,1171,1,0,0,0,1182,1172,1,0,0,0,
- 1182,1176,1,0,0,0,1182,1181,1,0,0,0,1183,147,1,0,0,0,1184,1193,1,0,0,0,
- 1185,1189,3,152,76,0,1186,1188,3,150,75,0,1187,1186,1,0,0,0,1188,1191,
- 1,0,0,0,1189,1187,1,0,0,0,1189,1190,1,0,0,0,1190,1193,1,0,0,0,1191,1189,
- 1,0,0,0,1192,1184,1,0,0,0,1192,1185,1,0,0,0,1193,149,1,0,0,0,1194,1212,
- 5,261,0,0,1195,1212,5,260,0,0,1196,1197,5,41,0,0,1197,1198,3,32,16,0,1198,
- 1199,5,42,0,0,1199,1212,1,0,0,0,1200,1201,5,41,0,0,1201,1202,3,32,16,0,
- 1202,1203,5,265,0,0,1203,1204,3,32,16,0,1204,1205,5,42,0,0,1205,1212,1,
- 0,0,0,1206,1207,5,41,0,0,1207,1208,5,265,0,0,1208,1209,3,32,16,0,1209,
- 1210,5,42,0,0,1210,1212,1,0,0,0,1211,1194,1,0,0,0,1211,1195,1,0,0,0,1211,
- 1196,1,0,0,0,1211,1200,1,0,0,0,1211,1206,1,0,0,0,1212,151,1,0,0,0,1213,
- 1298,1,0,0,0,1214,1215,5,202,0,0,1215,1216,5,29,0,0,1216,1217,3,6,3,0,
- 1217,1218,5,27,0,0,1218,1219,3,6,3,0,1219,1220,5,27,0,0,1220,1221,3,6,
- 3,0,1221,1222,5,27,0,0,1222,1223,3,6,3,0,1223,1224,5,30,0,0,1224,1298,
- 1,0,0,0,1225,1226,5,202,0,0,1226,1227,5,29,0,0,1227,1228,3,6,3,0,1228,
- 1229,5,27,0,0,1229,1230,3,6,3,0,1230,1231,5,30,0,0,1231,1298,1,0,0,0,1232,
- 1233,5,203,0,0,1233,1234,5,204,0,0,1234,1235,5,41,0,0,1235,1236,3,32,16,
- 0,1236,1237,5,42,0,0,1237,1298,1,0,0,0,1238,1239,5,203,0,0,1239,1240,5,
- 205,0,0,1240,1241,5,41,0,0,1241,1242,3,32,16,0,1242,1243,5,42,0,0,1243,
- 1244,3,148,74,0,1244,1298,1,0,0,0,1245,1298,5,206,0,0,1246,1298,5,207,
- 0,0,1247,1298,5,208,0,0,1248,1298,5,200,0,0,1249,1298,5,182,0,0,1250,1298,
- 5,183,0,0,1251,1298,5,184,0,0,1252,1298,5,185,0,0,1253,1298,5,186,0,0,
- 1254,1298,5,187,0,0,1255,1298,5,188,0,0,1256,1298,5,209,0,0,1257,1298,
- 5,189,0,0,1258,1298,5,190,0,0,1259,1298,5,191,0,0,1260,1298,5,192,0,0,
- 1261,1298,5,210,0,0,1262,1298,5,211,0,0,1263,1298,5,212,0,0,1264,1298,
- 5,213,0,0,1265,1298,5,214,0,0,1266,1298,5,215,0,0,1267,1298,5,216,0,0,
- 1268,1269,5,217,0,0,1269,1298,3,154,77,0,1270,1271,5,218,0,0,1271,1298,
- 3,154,77,0,1272,1298,5,219,0,0,1273,1274,5,220,0,0,1274,1298,3,154,77,
- 0,1275,1276,5,221,0,0,1276,1298,3,156,78,0,1277,1278,5,221,0,0,1278,1279,
- 3,156,78,0,1279,1280,5,27,0,0,1280,1281,3,6,3,0,1281,1298,1,0,0,0,1282,
- 1298,5,193,0,0,1283,1298,5,194,0,0,1284,1285,5,61,0,0,1285,1298,5,219,
- 0,0,1286,1298,5,222,0,0,1287,1288,5,223,0,0,1288,1298,5,212,0,0,1289,1298,
- 5,224,0,0,1290,1291,5,206,0,0,1291,1298,5,182,0,0,1292,1298,5,225,0,0,
- 1293,1298,5,227,0,0,1294,1295,5,33,0,0,1295,1298,5,226,0,0,1296,1298,3,
- 2,1,0,1297,1213,1,0,0,0,1297,1214,1,0,0,0,1297,1225,1,0,0,0,1297,1232,
- 1,0,0,0,1297,1238,1,0,0,0,1297,1245,1,0,0,0,1297,1246,1,0,0,0,1297,1247,
- 1,0,0,0,1297,1248,1,0,0,0,1297,1249,1,0,0,0,1297,1250,1,0,0,0,1297,1251,
- 1,0,0,0,1297,1252,1,0,0,0,1297,1253,1,0,0,0,1297,1254,1,0,0,0,1297,1255,
- 1,0,0,0,1297,1256,1,0,0,0,1297,1257,1,0,0,0,1297,1258,1,0,0,0,1297,1259,
- 1,0,0,0,1297,1260,1,0,0,0,1297,1261,1,0,0,0,1297,1262,1,0,0,0,1297,1263,
- 1,0,0,0,1297,1264,1,0,0,0,1297,1265,1,0,0,0,1297,1266,1,0,0,0,1297,1267,
- 1,0,0,0,1297,1268,1,0,0,0,1297,1270,1,0,0,0,1297,1272,1,0,0,0,1297,1273,
- 1,0,0,0,1297,1275,1,0,0,0,1297,1277,1,0,0,0,1297,1282,1,0,0,0,1297,1283,
- 1,0,0,0,1297,1284,1,0,0,0,1297,1286,1,0,0,0,1297,1287,1,0,0,0,1297,1289,
- 1,0,0,0,1297,1290,1,0,0,0,1297,1292,1,0,0,0,1297,1293,1,0,0,0,1297,1294,
- 1,0,0,0,1297,1296,1,0,0,0,1298,153,1,0,0,0,1299,1307,1,0,0,0,1300,1301,
- 5,29,0,0,1301,1302,5,89,0,0,1302,1303,5,35,0,0,1303,1304,3,32,16,0,1304,
- 1305,5,30,0,0,1305,1307,1,0,0,0,1306,1299,1,0,0,0,1306,1300,1,0,0,0,1307,
- 155,1,0,0,0,1308,1317,1,0,0,0,1309,1313,3,158,79,0,1310,1312,7,7,0,0,1311,
- 1310,1,0,0,0,1312,1315,1,0,0,0,1313,1311,1,0,0,0,1313,1314,1,0,0,0,1314,
- 1317,1,0,0,0,1315,1313,1,0,0,0,1316,1308,1,0,0,0,1316,1309,1,0,0,0,1317,
- 157,1,0,0,0,1318,1319,7,8,0,0,1319,159,1,0,0,0,1320,1324,3,164,82,0,1321,
- 1323,3,162,81,0,1322,1321,1,0,0,0,1323,1326,1,0,0,0,1324,1322,1,0,0,0,
- 1324,1325,1,0,0,0,1325,161,1,0,0,0,1326,1324,1,0,0,0,1327,1346,5,260,0,
- 0,1328,1329,5,41,0,0,1329,1346,5,42,0,0,1330,1346,3,132,66,0,1331,1346,
- 5,259,0,0,1332,1346,5,261,0,0,1333,1346,5,90,0,0,1334,1335,5,91,0,0,1335,
- 1336,5,29,0,0,1336,1337,3,146,73,0,1337,1338,5,30,0,0,1338,1346,1,0,0,
- 0,1339,1340,5,92,0,0,1340,1341,5,29,0,0,1341,1342,3,146,73,0,1342,1343,
- 5,30,0,0,1343,1346,1,0,0,0,1344,1346,3,130,65,0,1345,1327,1,0,0,0,1345,
- 1328,1,0,0,0,1345,1330,1,0,0,0,1345,1331,1,0,0,0,1345,1332,1,0,0,0,1345,
- 1333,1,0,0,0,1345,1334,1,0,0,0,1345,1339,1,0,0,0,1345,1344,1,0,0,0,1346,
- 163,1,0,0,0,1347,1348,5,38,0,0,1348,1378,3,138,69,0,1349,1378,5,196,0,
- 0,1350,1351,5,198,0,0,1351,1352,5,38,0,0,1352,1378,3,138,69,0,1353,1354,
- 5,199,0,0,1354,1378,3,138,69,0,1355,1356,5,225,0,0,1356,1357,3,192,96,
- 0,1357,1358,3,160,80,0,1358,1359,5,261,0,0,1359,1360,3,134,67,0,1360,1378,
- 1,0,0,0,1361,1362,5,252,0,0,1362,1378,3,32,16,0,1363,1364,5,251,0,0,1364,
- 1378,3,32,16,0,1365,1366,5,252,0,0,1366,1378,3,2,1,0,1367,1368,5,251,0,
- 0,1368,1378,3,2,1,0,1369,1378,5,253,0,0,1370,1378,5,200,0,0,1371,1378,
- 3,170,85,0,1372,1378,3,172,86,0,1373,1378,3,166,83,0,1374,1378,3,2,1,0,
- 1375,1376,5,176,0,0,1376,1378,3,160,80,0,1377,1347,1,0,0,0,1377,1349,1,
- 0,0,0,1377,1350,1,0,0,0,1377,1353,1,0,0,0,1377,1355,1,0,0,0,1377,1361,
- 1,0,0,0,1377,1363,1,0,0,0,1377,1365,1,0,0,0,1377,1367,1,0,0,0,1377,1369,
- 1,0,0,0,1377,1370,1,0,0,0,1377,1371,1,0,0,0,1377,1372,1,0,0,0,1377,1373,
- 1,0,0,0,1377,1374,1,0,0,0,1377,1375,1,0,0,0,1378,165,1,0,0,0,1379,1401,
- 5,180,0,0,1380,1401,5,181,0,0,1381,1401,5,182,0,0,1382,1401,5,183,0,0,
- 1383,1401,5,184,0,0,1384,1401,5,185,0,0,1385,1401,5,186,0,0,1386,1401,
- 5,187,0,0,1387,1401,5,188,0,0,1388,1401,5,189,0,0,1389,1401,5,190,0,0,
- 1390,1401,5,191,0,0,1391,1401,5,192,0,0,1392,1393,5,93,0,0,1393,1401,5,
- 183,0,0,1394,1395,5,93,0,0,1395,1401,5,184,0,0,1396,1397,5,93,0,0,1397,
- 1401,5,185,0,0,1398,1399,5,93,0,0,1399,1401,5,186,0,0,1400,1379,1,0,0,
- 0,1400,1380,1,0,0,0,1400,1381,1,0,0,0,1400,1382,1,0,0,0,1400,1383,1,0,
- 0,0,1400,1384,1,0,0,0,1400,1385,1,0,0,0,1400,1386,1,0,0,0,1400,1387,1,
- 0,0,0,1400,1388,1,0,0,0,1400,1389,1,0,0,0,1400,1390,1,0,0,0,1400,1391,
- 1,0,0,0,1400,1392,1,0,0,0,1400,1394,1,0,0,0,1400,1396,1,0,0,0,1400,1398,
- 1,0,0,0,1401,167,1,0,0,0,1402,1413,1,0,0,0,1403,1413,5,176,0,0,1404,1413,
- 3,32,16,0,1405,1406,3,32,16,0,1406,1407,5,176,0,0,1407,1408,3,32,16,0,
- 1408,1413,1,0,0,0,1409,1410,3,32,16,0,1410,1411,5,176,0,0,1411,1413,1,
- 0,0,0,1412,1402,1,0,0,0,1412,1403,1,0,0,0,1412,1404,1,0,0,0,1412,1405,
- 1,0,0,0,1412,1409,1,0,0,0,1413,169,1,0,0,0,1414,1415,5,1,0,0,1415,1416,
- 5,193,0,0,1416,171,1,0,0,0,1417,1421,5,1,0,0,1418,1419,5,93,0,0,1419,1422,
- 5,193,0,0,1420,1422,5,194,0,0,1421,1418,1,0,0,0,1421,1420,1,0,0,0,1422,
- 173,1,0,0,0,1423,1424,5,293,0,0,1424,1425,3,188,94,0,1425,1426,3,146,73,
- 0,1426,1427,5,29,0,0,1427,1428,3,180,90,0,1428,1429,5,30,0,0,1429,1464,
- 1,0,0,0,1430,1431,5,293,0,0,1431,1432,3,188,94,0,1432,1433,3,146,73,0,
- 1433,1434,5,35,0,0,1434,1435,5,16,0,0,1435,1436,3,52,26,0,1436,1437,5,
- 17,0,0,1437,1464,1,0,0,0,1438,1439,5,293,0,0,1439,1440,3,188,94,0,1440,
- 1441,3,146,73,0,1441,1464,1,0,0,0,1442,1443,5,294,0,0,1443,1444,3,188,
- 94,0,1444,1446,5,35,0,0,1445,1447,5,83,0,0,1446,1445,1,0,0,0,1446,1447,
- 1,0,0,0,1447,1448,1,0,0,0,1448,1449,5,29,0,0,1449,1450,3,312,156,0,1450,
- 1451,5,30,0,0,1451,1464,1,0,0,0,1452,1453,5,294,0,0,1453,1454,3,188,94,
- 0,1454,1455,3,6,3,0,1455,1464,1,0,0,0,1456,1457,5,294,0,0,1457,1458,3,
- 188,94,0,1458,1459,5,35,0,0,1459,1460,5,16,0,0,1460,1461,3,176,88,0,1461,
- 1462,5,17,0,0,1462,1464,1,0,0,0,1463,1423,1,0,0,0,1463,1430,1,0,0,0,1463,
- 1438,1,0,0,0,1463,1442,1,0,0,0,1463,1452,1,0,0,0,1463,1456,1,0,0,0,1464,
- 175,1,0,0,0,1465,1476,1,0,0,0,1466,1467,3,178,89,0,1467,1468,5,27,0,0,
- 1468,1470,1,0,0,0,1469,1466,1,0,0,0,1470,1473,1,0,0,0,1471,1469,1,0,0,
- 0,1471,1472,1,0,0,0,1472,1474,1,0,0,0,1473,1471,1,0,0,0,1474,1476,3,178,
- 89,0,1475,1465,1,0,0,0,1475,1471,1,0,0,0,1476,177,1,0,0,0,1477,1478,5,
- 38,0,0,1478,1479,5,263,0,0,1479,1480,5,35,0,0,1480,1481,5,16,0,0,1481,
- 1482,3,56,28,0,1482,1483,5,17,0,0,1483,1491,1,0,0,0,1484,1485,3,146,73,
- 0,1485,1486,5,35,0,0,1486,1487,5,16,0,0,1487,1488,3,56,28,0,1488,1489,
- 5,17,0,0,1489,1491,1,0,0,0,1490,1477,1,0,0,0,1490,1484,1,0,0,0,1491,179,
- 1,0,0,0,1492,1493,3,182,91,0,1493,1494,5,27,0,0,1494,1496,1,0,0,0,1495,
- 1492,1,0,0,0,1496,1499,1,0,0,0,1497,1495,1,0,0,0,1497,1498,1,0,0,0,1498,
- 1500,1,0,0,0,1499,1497,1,0,0,0,1500,1501,3,182,91,0,1501,181,1,0,0,0,1502,
- 1503,3,6,3,0,1503,1504,5,35,0,0,1504,1505,3,186,93,0,1505,183,1,0,0,0,
- 1506,1507,7,9,0,0,1507,185,1,0,0,0,1508,1543,3,184,92,0,1509,1543,3,32,
- 16,0,1510,1511,5,185,0,0,1511,1512,5,29,0,0,1512,1513,3,32,16,0,1513,1514,
- 5,30,0,0,1514,1543,1,0,0,0,1515,1543,3,6,3,0,1516,1517,3,138,69,0,1517,
- 1518,5,29,0,0,1518,1519,5,183,0,0,1519,1520,5,74,0,0,1520,1521,3,32,16,
- 0,1521,1522,5,30,0,0,1522,1543,1,0,0,0,1523,1524,3,138,69,0,1524,1525,
- 5,29,0,0,1525,1526,5,184,0,0,1526,1527,5,74,0,0,1527,1528,3,32,16,0,1528,
- 1529,5,30,0,0,1529,1543,1,0,0,0,1530,1531,3,138,69,0,1531,1532,5,29,0,
- 0,1532,1533,5,185,0,0,1533,1534,5,74,0,0,1534,1535,3,32,16,0,1535,1536,
- 5,30,0,0,1536,1543,1,0,0,0,1537,1538,3,138,69,0,1538,1539,5,29,0,0,1539,
- 1540,3,32,16,0,1540,1541,5,30,0,0,1541,1543,1,0,0,0,1542,1508,1,0,0,0,
- 1542,1509,1,0,0,0,1542,1510,1,0,0,0,1542,1515,1,0,0,0,1542,1516,1,0,0,
- 0,1542,1523,1,0,0,0,1542,1530,1,0,0,0,1542,1537,1,0,0,0,1543,187,1,0,0,
- 0,1544,1545,7,10,0,0,1545,189,1,0,0,0,1546,1547,3,192,96,0,1547,1548,3,
- 160,80,0,1548,1549,3,146,73,0,1549,1550,5,175,0,0,1550,1552,3,264,132,
- 0,1551,1553,3,130,65,0,1552,1551,1,0,0,0,1552,1553,1,0,0,0,1553,1554,1,
- 0,0,0,1554,1555,3,134,67,0,1555,1581,1,0,0,0,1556,1557,3,192,96,0,1557,
- 1558,3,160,80,0,1558,1559,3,146,73,0,1559,1560,5,175,0,0,1560,1561,3,264,
- 132,0,1561,1562,3,218,109,0,1562,1563,3,134,67,0,1563,1581,1,0,0,0,1564,
- 1565,3,192,96,0,1565,1566,3,160,80,0,1566,1568,3,264,132,0,1567,1569,3,
- 130,65,0,1568,1567,1,0,0,0,1568,1569,1,0,0,0,1569,1570,1,0,0,0,1570,1571,
- 3,134,67,0,1571,1581,1,0,0,0,1572,1573,3,192,96,0,1573,1574,3,160,80,0,
- 1574,1575,3,264,132,0,1575,1576,3,218,109,0,1576,1577,3,134,67,0,1577,
- 1581,1,0,0,0,1578,1581,3,196,98,0,1579,1581,3,2,1,0,1580,1546,1,0,0,0,
- 1580,1556,1,0,0,0,1580,1564,1,0,0,0,1580,1572,1,0,0,0,1580,1578,1,0,0,
- 0,1580,1579,1,0,0,0,1581,191,1,0,0,0,1582,1583,5,242,0,0,1583,1593,3,192,
- 96,0,1584,1585,5,243,0,0,1585,1593,3,192,96,0,1586,1593,3,194,97,0,1587,
- 1588,5,111,0,0,1588,1589,5,29,0,0,1589,1590,3,32,16,0,1590,1591,5,30,0,
- 0,1591,1593,1,0,0,0,1592,1582,1,0,0,0,1592,1584,1,0,0,0,1592,1586,1,0,
- 0,0,1592,1587,1,0,0,0,1593,193,1,0,0,0,1594,1607,1,0,0,0,1595,1607,5,244,
- 0,0,1596,1607,5,245,0,0,1597,1598,5,246,0,0,1598,1607,5,247,0,0,1599,1600,
- 5,246,0,0,1600,1607,5,248,0,0,1601,1602,5,246,0,0,1602,1607,5,249,0,0,
- 1603,1604,5,246,0,0,1604,1607,5,250,0,0,1605,1607,5,246,0,0,1606,1594,
- 1,0,0,0,1606,1595,1,0,0,0,1606,1596,1,0,0,0,1606,1597,1,0,0,0,1606,1599,
- 1,0,0,0,1606,1601,1,0,0,0,1606,1603,1,0,0,0,1606,1605,1,0,0,0,1607,195,
- 1,0,0,0,1608,1609,5,112,0,0,1609,1610,5,29,0,0,1610,1611,3,32,16,0,1611,
- 1612,5,30,0,0,1612,197,1,0,0,0,1613,1614,5,225,0,0,1614,1619,3,190,95,
- 0,1615,1616,5,36,0,0,1616,1619,3,200,100,0,1617,1619,3,196,98,0,1618,1613,
- 1,0,0,0,1618,1615,1,0,0,0,1618,1617,1,0,0,0,1619,199,1,0,0,0,1620,1621,
- 3,160,80,0,1621,1622,3,146,73,0,1622,1623,5,175,0,0,1623,1624,3,2,1,0,
- 1624,1630,1,0,0,0,1625,1626,3,160,80,0,1626,1627,3,2,1,0,1627,1630,1,0,
- 0,0,1628,1630,3,2,1,0,1629,1620,1,0,0,0,1629,1625,1,0,0,0,1629,1628,1,
- 0,0,0,1630,201,1,0,0,0,1631,1632,3,146,73,0,1632,1633,5,27,0,0,1633,1635,
- 1,0,0,0,1634,1631,1,0,0,0,1635,1638,1,0,0,0,1636,1634,1,0,0,0,1636,1637,
- 1,0,0,0,1637,1639,1,0,0,0,1638,1636,1,0,0,0,1639,1640,3,146,73,0,1640,
- 203,1,0,0,0,1641,1647,1,0,0,0,1642,1643,5,85,0,0,1643,1644,3,212,106,0,
- 1644,1645,5,86,0,0,1645,1647,1,0,0,0,1646,1641,1,0,0,0,1646,1642,1,0,0,
- 0,1647,205,1,0,0,0,1648,1660,5,265,0,0,1649,1660,5,113,0,0,1650,1660,5,
- 38,0,0,1651,1660,5,199,0,0,1652,1660,5,114,0,0,1653,1660,5,115,0,0,1654,
- 1655,5,69,0,0,1655,1656,5,29,0,0,1656,1657,3,32,16,0,1657,1658,5,30,0,
- 0,1658,1660,1,0,0,0,1659,1648,1,0,0,0,1659,1649,1,0,0,0,1659,1650,1,0,
- 0,0,1659,1651,1,0,0,0,1659,1652,1,0,0,0,1659,1653,1,0,0,0,1659,1654,1,
- 0,0,0,1660,207,1,0,0,0,1661,1663,3,206,103,0,1662,1661,1,0,0,0,1663,1666,
- 1,0,0,0,1664,1662,1,0,0,0,1664,1665,1,0,0,0,1665,209,1,0,0,0,1666,1664,
- 1,0,0,0,1667,1669,3,208,104,0,1668,1670,3,214,107,0,1669,1668,1,0,0,0,
- 1669,1670,1,0,0,0,1670,1671,1,0,0,0,1671,1672,3,2,1,0,1672,211,1,0,0,0,
- 1673,1674,3,210,105,0,1674,1675,5,27,0,0,1675,1677,1,0,0,0,1676,1673,1,
- 0,0,0,1677,1680,1,0,0,0,1678,1676,1,0,0,0,1678,1679,1,0,0,0,1679,1681,
- 1,0,0,0,1680,1678,1,0,0,0,1681,1682,3,210,105,0,1682,213,1,0,0,0,1683,
- 1684,5,29,0,0,1684,1685,3,202,101,0,1685,1686,5,30,0,0,1686,215,1,0,0,
- 0,1687,1690,1,0,0,0,1688,1690,3,218,109,0,1689,1687,1,0,0,0,1689,1688,
- 1,0,0,0,1690,217,1,0,0,0,1691,1692,5,85,0,0,1692,1693,5,41,0,0,1693,1694,
- 3,32,16,0,1694,1695,5,42,0,0,1695,1696,5,86,0,0,1696,219,1,0,0,0,1697,
- 1698,3,256,128,0,1698,1699,5,16,0,0,1699,1700,3,268,134,0,1700,1701,5,
- 17,0,0,1701,1814,1,0,0,0,1702,1703,3,74,37,0,1703,1704,5,16,0,0,1704,1705,
- 3,82,41,0,1705,1706,5,17,0,0,1706,1814,1,0,0,0,1707,1708,3,232,116,0,1708,
- 1709,5,16,0,0,1709,1710,3,236,118,0,1710,1711,5,17,0,0,1711,1814,1,0,0,
- 0,1712,1713,3,240,120,0,1713,1714,5,16,0,0,1714,1715,3,244,122,0,1715,
- 1716,5,17,0,0,1716,1814,1,0,0,0,1717,1814,3,222,111,0,1718,1814,3,296,
- 148,0,1719,1814,3,174,87,0,1720,1814,3,88,44,0,1721,1814,3,342,171,0,1722,
- 1723,5,116,0,0,1723,1814,3,32,16,0,1724,1725,5,117,0,0,1725,1814,3,32,
- 16,0,1726,1727,3,354,177,0,1727,1728,5,16,0,0,1728,1729,3,358,179,0,1729,
- 1730,5,17,0,0,1730,1814,1,0,0,0,1731,1732,5,301,0,0,1732,1733,3,146,73,
- 0,1733,1734,5,175,0,0,1734,1735,3,264,132,0,1735,1736,5,118,0,0,1736,1737,
- 3,192,96,0,1737,1738,3,160,80,0,1738,1739,3,146,73,0,1739,1740,5,175,0,
- 0,1740,1741,3,264,132,0,1741,1742,3,134,67,0,1742,1814,1,0,0,0,1743,1744,
- 5,301,0,0,1744,1745,5,225,0,0,1745,1746,3,192,96,0,1746,1747,3,160,80,
- 0,1747,1748,3,146,73,0,1748,1749,5,175,0,0,1749,1750,3,264,132,0,1750,
- 1751,3,216,108,0,1751,1752,3,134,67,0,1752,1753,5,118,0,0,1753,1754,5,
- 225,0,0,1754,1755,3,192,96,0,1755,1756,3,160,80,0,1756,1757,3,146,73,0,
- 1757,1758,5,175,0,0,1758,1759,3,264,132,0,1759,1760,3,216,108,0,1760,1761,
- 3,134,67,0,1761,1814,1,0,0,0,1762,1814,3,26,13,0,1763,1814,3,40,20,0,1764,
- 1765,5,254,0,0,1765,1766,5,195,0,0,1766,1767,5,41,0,0,1767,1768,3,32,16,
- 0,1768,1772,5,42,0,0,1769,1771,3,342,171,0,1770,1769,1,0,0,0,1771,1774,
- 1,0,0,0,1772,1770,1,0,0,0,1772,1773,1,0,0,0,1773,1814,1,0,0,0,1774,1772,
- 1,0,0,0,1775,1776,5,254,0,0,1776,1777,5,195,0,0,1777,1781,3,2,1,0,1778,
- 1780,3,342,171,0,1779,1778,1,0,0,0,1780,1783,1,0,0,0,1781,1779,1,0,0,0,
- 1781,1782,1,0,0,0,1782,1814,1,0,0,0,1783,1781,1,0,0,0,1784,1785,5,254,
- 0,0,1785,1786,5,255,0,0,1786,1787,5,41,0,0,1787,1788,3,32,16,0,1788,1789,
- 5,42,0,0,1789,1790,5,27,0,0,1790,1794,3,146,73,0,1791,1793,3,342,171,0,
- 1792,1791,1,0,0,0,1793,1796,1,0,0,0,1794,1792,1,0,0,0,1794,1795,1,0,0,
- 0,1795,1814,1,0,0,0,1796,1794,1,0,0,0,1797,1798,5,254,0,0,1798,1799,5,
- 255,0,0,1799,1800,3,2,1,0,1800,1801,5,27,0,0,1801,1805,3,146,73,0,1802,
- 1804,3,342,171,0,1803,1802,1,0,0,0,1804,1807,1,0,0,0,1805,1803,1,0,0,0,
- 1805,1806,1,0,0,0,1806,1814,1,0,0,0,1807,1805,1,0,0,0,1808,1809,5,119,
- 0,0,1809,1810,5,195,0,0,1810,1811,3,146,73,0,1811,1812,3,44,22,0,1812,
- 1814,1,0,0,0,1813,1697,1,0,0,0,1813,1702,1,0,0,0,1813,1707,1,0,0,0,1813,
- 1712,1,0,0,0,1813,1717,1,0,0,0,1813,1718,1,0,0,0,1813,1719,1,0,0,0,1813,
- 1720,1,0,0,0,1813,1721,1,0,0,0,1813,1722,1,0,0,0,1813,1724,1,0,0,0,1813,
- 1726,1,0,0,0,1813,1731,1,0,0,0,1813,1743,1,0,0,0,1813,1762,1,0,0,0,1813,
- 1763,1,0,0,0,1813,1764,1,0,0,0,1813,1775,1,0,0,0,1813,1784,1,0,0,0,1813,
- 1797,1,0,0,0,1813,1808,1,0,0,0,1814,221,1,0,0,0,1815,1816,5,120,0,0,1816,
- 1825,3,230,115,0,1817,1824,3,224,112,0,1818,1819,5,121,0,0,1819,1820,5,
- 29,0,0,1820,1821,3,250,125,0,1821,1822,5,30,0,0,1822,1824,1,0,0,0,1823,
- 1817,1,0,0,0,1823,1818,1,0,0,0,1824,1827,1,0,0,0,1825,1823,1,0,0,0,1825,
- 1826,1,0,0,0,1826,1828,1,0,0,0,1827,1825,1,0,0,0,1828,1829,3,160,80,0,
- 1829,1830,3,2,1,0,1830,1831,3,226,113,0,1831,1832,3,228,114,0,1832,223,
- 1,0,0,0,1833,1853,5,122,0,0,1834,1853,5,50,0,0,1835,1853,5,51,0,0,1836,
- 1853,5,62,0,0,1837,1853,5,123,0,0,1838,1853,5,68,0,0,1839,1853,5,67,0,
- 0,1840,1853,5,63,0,0,1841,1853,5,64,0,0,1842,1853,5,65,0,0,1843,1853,5,
- 124,0,0,1844,1853,5,125,0,0,1845,1853,5,126,0,0,1846,1853,5,127,0,0,1847,
- 1848,5,69,0,0,1848,1849,5,29,0,0,1849,1850,3,32,16,0,1850,1851,5,30,0,
- 0,1851,1853,1,0,0,0,1852,1833,1,0,0,0,1852,1834,1,0,0,0,1852,1835,1,0,
- 0,0,1852,1836,1,0,0,0,1852,1837,1,0,0,0,1852,1838,1,0,0,0,1852,1839,1,
- 0,0,0,1852,1840,1,0,0,0,1852,1841,1,0,0,0,1852,1842,1,0,0,0,1852,1843,
- 1,0,0,0,1852,1844,1,0,0,0,1852,1845,1,0,0,0,1852,1846,1,0,0,0,1852,1847,
- 1,0,0,0,1853,225,1,0,0,0,1854,1860,1,0,0,0,1855,1856,5,43,0,0,1856,1860,
- 3,0,0,0,1857,1858,5,43,0,0,1858,1860,3,32,16,0,1859,1854,1,0,0,0,1859,
- 1855,1,0,0,0,1859,1857,1,0,0,0,1860,227,1,0,0,0,1861,1865,1,0,0,0,1862,
- 1863,5,35,0,0,1863,1865,3,316,158,0,1864,1861,1,0,0,0,1864,1862,1,0,0,
- 0,1865,229,1,0,0,0,1866,1872,1,0,0,0,1867,1868,5,41,0,0,1868,1869,3,32,
- 16,0,1869,1870,5,42,0,0,1870,1872,1,0,0,0,1871,1866,1,0,0,0,1871,1867,
- 1,0,0,0,1872,231,1,0,0,0,1873,1877,5,128,0,0,1874,1876,3,234,117,0,1875,
- 1874,1,0,0,0,1876,1879,1,0,0,0,1877,1875,1,0,0,0,1877,1878,1,0,0,0,1878,
- 1880,1,0,0,0,1879,1877,1,0,0,0,1880,1881,3,146,73,0,1881,1882,3,2,1,0,
- 1882,1892,1,0,0,0,1883,1887,5,128,0,0,1884,1886,3,234,117,0,1885,1884,
- 1,0,0,0,1886,1889,1,0,0,0,1887,1885,1,0,0,0,1887,1888,1,0,0,0,1888,1890,
- 1,0,0,0,1889,1887,1,0,0,0,1890,1892,3,2,1,0,1891,1873,1,0,0,0,1891,1883,
- 1,0,0,0,1892,233,1,0,0,0,1893,1894,7,11,0,0,1894,235,1,0,0,0,1895,1897,
- 3,238,119,0,1896,1895,1,0,0,0,1897,1900,1,0,0,0,1898,1896,1,0,0,0,1898,
- 1899,1,0,0,0,1899,237,1,0,0,0,1900,1898,1,0,0,0,1901,1902,5,129,0,0,1902,
- 1914,3,190,95,0,1903,1904,5,130,0,0,1904,1914,3,190,95,0,1905,1906,5,131,
- 0,0,1906,1914,3,190,95,0,1907,1908,5,132,0,0,1908,1914,3,190,95,0,1909,
- 1914,3,88,44,0,1910,1914,3,342,171,0,1911,1914,3,26,13,0,1912,1914,3,40,
- 20,0,1913,1901,1,0,0,0,1913,1903,1,0,0,0,1913,1905,1,0,0,0,1913,1907,1,
- 0,0,0,1913,1909,1,0,0,0,1913,1910,1,0,0,0,1913,1911,1,0,0,0,1913,1912,
- 1,0,0,0,1914,239,1,0,0,0,1915,1919,5,133,0,0,1916,1918,3,242,121,0,1917,
- 1916,1,0,0,0,1918,1921,1,0,0,0,1919,1917,1,0,0,0,1919,1920,1,0,0,0,1920,
- 1922,1,0,0,0,1921,1919,1,0,0,0,1922,1923,3,192,96,0,1923,1924,3,160,80,
- 0,1924,1925,3,2,1,0,1925,1926,3,134,67,0,1926,1927,3,228,114,0,1927,241,
- 1,0,0,0,1928,1929,7,11,0,0,1929,243,1,0,0,0,1930,1932,3,246,123,0,1931,
- 1930,1,0,0,0,1932,1935,1,0,0,0,1933,1931,1,0,0,0,1933,1934,1,0,0,0,1934,
- 245,1,0,0,0,1935,1933,1,0,0,0,1936,1937,5,134,0,0,1937,1947,3,190,95,0,
- 1938,1939,5,135,0,0,1939,1947,3,190,95,0,1940,1941,5,132,0,0,1941,1947,
- 3,190,95,0,1942,1947,3,342,171,0,1943,1947,3,88,44,0,1944,1947,3,26,13,
- 0,1945,1947,3,40,20,0,1946,1936,1,0,0,0,1946,1938,1,0,0,0,1946,1940,1,
- 0,0,0,1946,1942,1,0,0,0,1946,1943,1,0,0,0,1946,1944,1,0,0,0,1946,1945,
- 1,0,0,0,1947,247,1,0,0,0,1948,1955,1,0,0,0,1949,1950,5,121,0,0,1950,1951,
- 5,29,0,0,1951,1952,3,250,125,0,1952,1953,5,30,0,0,1953,1955,1,0,0,0,1954,
- 1948,1,0,0,0,1954,1949,1,0,0,0,1955,249,1,0,0,0,1956,1966,3,148,74,0,1957,
- 1959,5,16,0,0,1958,1960,3,314,157,0,1959,1958,1,0,0,0,1960,1961,1,0,0,
- 0,1961,1959,1,0,0,0,1961,1962,1,0,0,0,1962,1963,1,0,0,0,1963,1964,5,17,
- 0,0,1964,1966,1,0,0,0,1965,1956,1,0,0,0,1965,1957,1,0,0,0,1966,251,1,0,
- 0,0,1967,1969,3,254,127,0,1968,1967,1,0,0,0,1969,1972,1,0,0,0,1970,1968,
- 1,0,0,0,1970,1971,1,0,0,0,1971,253,1,0,0,0,1972,1970,1,0,0,0,1973,1974,
- 5,41,0,0,1974,1975,5,136,0,0,1975,1987,5,42,0,0,1976,1977,5,41,0,0,1977,
- 1978,5,137,0,0,1978,1987,5,42,0,0,1979,1980,5,41,0,0,1980,1981,5,138,0,
- 0,1981,1987,5,42,0,0,1982,1983,5,41,0,0,1983,1984,3,32,16,0,1984,1985,
- 5,42,0,0,1985,1987,1,0,0,0,1986,1973,1,0,0,0,1986,1976,1,0,0,0,1986,1979,
- 1,0,0,0,1986,1982,1,0,0,0,1987,255,1,0,0,0,1988,1993,5,139,0,0,1989,1992,
- 3,258,129,0,1990,1992,3,260,130,0,1991,1989,1,0,0,0,1991,1990,1,0,0,0,
- 1992,1995,1,0,0,0,1993,1991,1,0,0,0,1993,1994,1,0,0,0,1994,1996,1,0,0,
- 0,1995,1993,1,0,0,0,1996,1997,3,192,96,0,1997,1998,3,252,126,0,1998,1999,
- 3,160,80,0,1999,2000,3,248,124,0,2000,2001,3,264,132,0,2001,2002,3,204,
- 102,0,2002,2006,3,134,67,0,2003,2005,3,266,133,0,2004,2003,1,0,0,0,2005,
- 2008,1,0,0,0,2006,2004,1,0,0,0,2006,2007,1,0,0,0,2007,257,1,0,0,0,2008,
- 2006,1,0,0,0,2009,2033,5,122,0,0,2010,2033,5,50,0,0,2011,2033,5,51,0,0,
- 2012,2033,5,62,0,0,2013,2033,5,140,0,0,2014,2033,5,67,0,0,2015,2033,5,
- 141,0,0,2016,2033,5,142,0,0,2017,2033,5,53,0,0,2018,2033,5,63,0,0,2019,
- 2033,5,64,0,0,2020,2033,5,65,0,0,2021,2033,5,124,0,0,2022,2033,5,143,0,
- 0,2023,2033,5,144,0,0,2024,2033,5,68,0,0,2025,2033,5,145,0,0,2026,2033,
- 5,146,0,0,2027,2028,5,69,0,0,2028,2029,5,29,0,0,2029,2030,3,32,16,0,2030,
- 2031,5,30,0,0,2031,2033,1,0,0,0,2032,2009,1,0,0,0,2032,2010,1,0,0,0,2032,
- 2011,1,0,0,0,2032,2012,1,0,0,0,2032,2013,1,0,0,0,2032,2014,1,0,0,0,2032,
- 2015,1,0,0,0,2032,2016,1,0,0,0,2032,2017,1,0,0,0,2032,2018,1,0,0,0,2032,
- 2019,1,0,0,0,2032,2020,1,0,0,0,2032,2021,1,0,0,0,2032,2022,1,0,0,0,2032,
- 2023,1,0,0,0,2032,2024,1,0,0,0,2032,2025,1,0,0,0,2032,2026,1,0,0,0,2032,
- 2027,1,0,0,0,2033,259,1,0,0,0,2034,2035,5,147,0,0,2035,2041,5,29,0,0,2036,
- 2039,3,6,3,0,2037,2038,5,33,0,0,2038,2040,3,6,3,0,2039,2037,1,0,0,0,2039,
- 2040,1,0,0,0,2040,2042,1,0,0,0,2041,2036,1,0,0,0,2041,2042,1,0,0,0,2042,
- 2046,1,0,0,0,2043,2045,3,262,131,0,2044,2043,1,0,0,0,2045,2048,1,0,0,0,
- 2046,2044,1,0,0,0,2046,2047,1,0,0,0,2047,2049,1,0,0,0,2048,2046,1,0,0,
- 0,2049,2053,5,30,0,0,2050,2051,5,147,0,0,2051,2053,5,84,0,0,2052,2034,
- 1,0,0,0,2052,2050,1,0,0,0,2053,261,1,0,0,0,2054,2082,5,148,0,0,2055,2082,
- 5,223,0,0,2056,2082,5,56,0,0,2057,2082,5,57,0,0,2058,2082,5,149,0,0,2059,
- 2082,5,150,0,0,2060,2082,5,247,0,0,2061,2082,5,248,0,0,2062,2082,5,249,
- 0,0,2063,2082,5,250,0,0,2064,2065,5,151,0,0,2065,2066,5,74,0,0,2066,2082,
- 5,152,0,0,2067,2068,5,151,0,0,2068,2069,5,74,0,0,2069,2082,5,153,0,0,2070,
- 2071,5,154,0,0,2071,2072,5,74,0,0,2072,2082,5,152,0,0,2073,2074,5,154,
- 0,0,2074,2075,5,74,0,0,2075,2082,5,153,0,0,2076,2077,5,69,0,0,2077,2078,
- 5,29,0,0,2078,2079,3,32,16,0,2079,2080,5,30,0,0,2080,2082,1,0,0,0,2081,
- 2054,1,0,0,0,2081,2055,1,0,0,0,2081,2056,1,0,0,0,2081,2057,1,0,0,0,2081,
- 2058,1,0,0,0,2081,2059,1,0,0,0,2081,2060,1,0,0,0,2081,2061,1,0,0,0,2081,
- 2062,1,0,0,0,2081,2063,1,0,0,0,2081,2064,1,0,0,0,2081,2067,1,0,0,0,2081,
- 2070,1,0,0,0,2081,2073,1,0,0,0,2081,2076,1,0,0,0,2082,263,1,0,0,0,2083,
- 2087,5,115,0,0,2084,2087,5,155,0,0,2085,2087,3,2,1,0,2086,2083,1,0,0,0,
- 2086,2084,1,0,0,0,2086,2085,1,0,0,0,2087,265,1,0,0,0,2088,2110,5,1,0,0,
- 2089,2110,5,2,0,0,2090,2110,5,156,0,0,2091,2110,5,3,0,0,2092,2110,5,4,
- 0,0,2093,2110,5,246,0,0,2094,2110,5,5,0,0,2095,2110,5,6,0,0,2096,2110,
- 5,7,0,0,2097,2110,5,8,0,0,2098,2110,5,9,0,0,2099,2110,5,10,0,0,2100,2110,
- 5,11,0,0,2101,2110,5,12,0,0,2102,2110,5,13,0,0,2103,2110,5,14,0,0,2104,
- 2105,5,69,0,0,2105,2106,5,29,0,0,2106,2107,3,32,16,0,2107,2108,5,30,0,
- 0,2108,2110,1,0,0,0,2109,2088,1,0,0,0,2109,2089,1,0,0,0,2109,2090,1,0,
- 0,0,2109,2091,1,0,0,0,2109,2092,1,0,0,0,2109,2093,1,0,0,0,2109,2094,1,
- 0,0,0,2109,2095,1,0,0,0,2109,2096,1,0,0,0,2109,2097,1,0,0,0,2109,2098,
- 1,0,0,0,2109,2099,1,0,0,0,2109,2100,1,0,0,0,2109,2101,1,0,0,0,2109,2102,
- 1,0,0,0,2109,2103,1,0,0,0,2109,2104,1,0,0,0,2110,267,1,0,0,0,2111,2113,
- 3,270,135,0,2112,2111,1,0,0,0,2113,2116,1,0,0,0,2114,2112,1,0,0,0,2114,
- 2115,1,0,0,0,2115,269,1,0,0,0,2116,2114,1,0,0,0,2117,2226,3,126,63,0,2118,
- 2119,5,295,0,0,2119,2226,3,32,16,0,2120,2226,3,278,139,0,2121,2122,5,296,
- 0,0,2122,2226,3,32,16,0,2123,2124,5,299,0,0,2124,2226,3,134,67,0,2125,
- 2126,5,299,0,0,2126,2127,5,157,0,0,2127,2226,3,134,67,0,2128,2226,5,297,
- 0,0,2129,2226,5,298,0,0,2130,2226,3,296,148,0,2131,2226,3,272,136,0,2132,
- 2226,3,174,87,0,2133,2226,3,88,44,0,2134,2226,3,26,13,0,2135,2226,3,274,
- 137,0,2136,2226,3,40,20,0,2137,2138,5,300,0,0,2138,2139,5,41,0,0,2139,
- 2140,3,32,16,0,2140,2141,5,42,0,0,2141,2226,1,0,0,0,2142,2143,5,300,0,
- 0,2143,2144,5,41,0,0,2144,2145,3,32,16,0,2145,2146,5,42,0,0,2146,2147,
- 5,33,0,0,2147,2148,3,0,0,0,2148,2226,1,0,0,0,2149,2150,5,302,0,0,2150,
- 2151,3,32,16,0,2151,2152,5,74,0,0,2152,2153,3,32,16,0,2153,2226,1,0,0,
- 0,2154,2155,5,301,0,0,2155,2156,3,146,73,0,2156,2157,5,175,0,0,2157,2158,
- 3,264,132,0,2158,2226,1,0,0,0,2159,2160,5,301,0,0,2160,2161,5,225,0,0,
- 2161,2162,3,192,96,0,2162,2163,3,160,80,0,2163,2164,3,146,73,0,2164,2165,
- 5,175,0,0,2165,2166,3,264,132,0,2166,2167,3,216,108,0,2167,2168,3,134,
- 67,0,2168,2226,1,0,0,0,2169,2226,3,276,138,0,2170,2171,5,254,0,0,2171,
- 2172,5,195,0,0,2172,2173,5,41,0,0,2173,2174,3,32,16,0,2174,2178,5,42,0,
- 0,2175,2177,3,342,171,0,2176,2175,1,0,0,0,2177,2180,1,0,0,0,2178,2176,
- 1,0,0,0,2178,2179,1,0,0,0,2179,2226,1,0,0,0,2180,2178,1,0,0,0,2181,2182,
- 5,254,0,0,2182,2183,5,195,0,0,2183,2187,3,2,1,0,2184,2186,3,342,171,0,
- 2185,2184,1,0,0,0,2186,2189,1,0,0,0,2187,2185,1,0,0,0,2187,2188,1,0,0,
- 0,2188,2226,1,0,0,0,2189,2187,1,0,0,0,2190,2191,5,254,0,0,2191,2192,5,
- 255,0,0,2192,2193,5,41,0,0,2193,2194,3,32,16,0,2194,2195,5,42,0,0,2195,
- 2196,5,27,0,0,2196,2200,3,146,73,0,2197,2199,3,342,171,0,2198,2197,1,0,
- 0,0,2199,2202,1,0,0,0,2200,2198,1,0,0,0,2200,2201,1,0,0,0,2201,2226,1,
- 0,0,0,2202,2200,1,0,0,0,2203,2204,5,254,0,0,2204,2205,5,255,0,0,2205,2206,
- 3,2,1,0,2206,2207,5,27,0,0,2207,2211,3,146,73,0,2208,2210,3,342,171,0,
- 2209,2208,1,0,0,0,2210,2213,1,0,0,0,2211,2209,1,0,0,0,2211,2212,1,0,0,
- 0,2212,2226,1,0,0,0,2213,2211,1,0,0,0,2214,2215,5,254,0,0,2215,2216,5,
- 41,0,0,2216,2217,3,32,16,0,2217,2218,5,42,0,0,2218,2222,3,228,114,0,2219,
- 2221,3,342,171,0,2220,2219,1,0,0,0,2221,2224,1,0,0,0,2222,2220,1,0,0,0,
- 2222,2223,1,0,0,0,2223,2226,1,0,0,0,2224,2222,1,0,0,0,2225,2117,1,0,0,
- 0,2225,2118,1,0,0,0,2225,2120,1,0,0,0,2225,2121,1,0,0,0,2225,2123,1,0,
- 0,0,2225,2125,1,0,0,0,2225,2128,1,0,0,0,2225,2129,1,0,0,0,2225,2130,1,
- 0,0,0,2225,2131,1,0,0,0,2225,2132,1,0,0,0,2225,2133,1,0,0,0,2225,2134,
- 1,0,0,0,2225,2135,1,0,0,0,2225,2136,1,0,0,0,2225,2137,1,0,0,0,2225,2142,
- 1,0,0,0,2225,2149,1,0,0,0,2225,2154,1,0,0,0,2225,2159,1,0,0,0,2225,2169,
- 1,0,0,0,2225,2170,1,0,0,0,2225,2181,1,0,0,0,2225,2190,1,0,0,0,2225,2203,
- 1,0,0,0,2225,2214,1,0,0,0,2226,271,1,0,0,0,2227,2228,3,0,0,0,2228,2229,
- 5,74,0,0,2229,273,1,0,0,0,2230,2233,3,44,22,0,2231,2233,3,46,23,0,2232,
- 2230,1,0,0,0,2232,2231,1,0,0,0,2233,275,1,0,0,0,2234,2235,5,16,0,0,2235,
- 2236,3,268,134,0,2236,2237,5,17,0,0,2237,277,1,0,0,0,2238,2239,3,282,141,
- 0,2239,2240,3,280,140,0,2240,279,1,0,0,0,2241,2243,3,284,142,0,2242,2241,
- 1,0,0,0,2243,2244,1,0,0,0,2244,2242,1,0,0,0,2244,2245,1,0,0,0,2245,281,
- 1,0,0,0,2246,2247,5,158,0,0,2247,2259,3,276,138,0,2248,2249,5,158,0,0,
- 2249,2250,3,0,0,0,2250,2251,5,159,0,0,2251,2252,3,0,0,0,2252,2259,1,0,
- 0,0,2253,2254,5,158,0,0,2254,2255,3,32,16,0,2255,2256,5,159,0,0,2256,2257,
- 3,32,16,0,2257,2259,1,0,0,0,2258,2246,1,0,0,0,2258,2248,1,0,0,0,2258,2253,
- 1,0,0,0,2259,283,1,0,0,0,2260,2261,3,288,144,0,2261,2262,3,294,147,0,2262,
- 2273,1,0,0,0,2263,2264,3,286,143,0,2264,2265,3,294,147,0,2265,2273,1,0,
- 0,0,2266,2267,3,290,145,0,2267,2268,3,294,147,0,2268,2273,1,0,0,0,2269,
- 2270,3,292,146,0,2270,2271,3,294,147,0,2271,2273,1,0,0,0,2272,2260,1,0,
- 0,0,2272,2263,1,0,0,0,2272,2266,1,0,0,0,2272,2269,1,0,0,0,2273,285,1,0,
- 0,0,2274,2275,5,160,0,0,2275,2281,3,276,138,0,2276,2277,5,160,0,0,2277,
- 2281,3,0,0,0,2278,2279,5,160,0,0,2279,2281,3,32,16,0,2280,2274,1,0,0,0,
- 2280,2276,1,0,0,0,2280,2278,1,0,0,0,2281,287,1,0,0,0,2282,2283,5,161,0,
- 0,2283,2284,3,146,73,0,2284,289,1,0,0,0,2285,2286,5,162,0,0,2286,291,1,
- 0,0,0,2287,2288,5,163,0,0,2288,293,1,0,0,0,2289,2301,3,276,138,0,2290,
- 2291,5,164,0,0,2291,2292,3,0,0,0,2292,2293,5,159,0,0,2293,2294,3,0,0,0,
- 2294,2301,1,0,0,0,2295,2296,5,164,0,0,2296,2297,3,32,16,0,2297,2298,5,
- 159,0,0,2298,2299,3,32,16,0,2299,2301,1,0,0,0,2300,2289,1,0,0,0,2300,2290,
- 1,0,0,0,2300,2295,1,0,0,0,2301,295,1,0,0,0,2302,2303,3,298,149,0,2303,
- 2304,3,302,151,0,2304,297,1,0,0,0,2305,2306,5,165,0,0,2306,2307,3,300,
- 150,0,2307,2308,3,0,0,0,2308,2309,5,35,0,0,2309,2313,1,0,0,0,2310,2311,
- 5,165,0,0,2311,2313,3,300,150,0,2312,2305,1,0,0,0,2312,2310,1,0,0,0,2313,
- 299,1,0,0,0,2314,2318,1,0,0,0,2315,2318,5,166,0,0,2316,2318,5,2,0,0,2317,
- 2314,1,0,0,0,2317,2315,1,0,0,0,2317,2316,1,0,0,0,2318,301,1,0,0,0,2319,
- 2320,5,16,0,0,2320,2321,3,304,152,0,2321,2322,5,17,0,0,2322,2329,1,0,0,
- 0,2323,2325,3,308,154,0,2324,2323,1,0,0,0,2325,2326,1,0,0,0,2326,2324,
- 1,0,0,0,2326,2327,1,0,0,0,2327,2329,1,0,0,0,2328,2319,1,0,0,0,2328,2324,
- 1,0,0,0,2329,303,1,0,0,0,2330,2331,3,308,154,0,2331,2332,5,27,0,0,2332,
- 2334,1,0,0,0,2333,2330,1,0,0,0,2334,2337,1,0,0,0,2335,2333,1,0,0,0,2335,
- 2336,1,0,0,0,2336,2338,1,0,0,0,2337,2335,1,0,0,0,2338,2339,3,308,154,0,
- 2339,305,1,0,0,0,2340,2346,1,0,0,0,2341,2342,5,41,0,0,2342,2343,3,32,16,
- 0,2343,2344,5,42,0,0,2344,2346,1,0,0,0,2345,2340,1,0,0,0,2345,2341,1,0,
- 0,0,2346,307,1,0,0,0,2347,2348,5,180,0,0,2348,2349,5,261,0,0,2349,2350,
- 5,29,0,0,2350,2351,3,6,3,0,2351,2352,5,30,0,0,2352,2414,1,0,0,0,2353,2354,
- 5,259,0,0,2354,2355,5,29,0,0,2355,2356,3,0,0,0,2356,2357,5,30,0,0,2357,
- 2414,1,0,0,0,2358,2359,5,259,0,0,2359,2414,3,0,0,0,2360,2361,5,83,0,0,
- 2361,2362,5,29,0,0,2362,2363,3,312,156,0,2363,2364,5,30,0,0,2364,2414,
- 1,0,0,0,2365,2366,5,187,0,0,2366,2367,5,29,0,0,2367,2368,3,36,18,0,2368,
- 2369,5,30,0,0,2369,2370,3,306,153,0,2370,2414,1,0,0,0,2371,2372,5,188,
- 0,0,2372,2373,5,29,0,0,2373,2374,3,36,18,0,2374,2375,5,30,0,0,2375,2376,
- 3,306,153,0,2376,2414,1,0,0,0,2377,2378,5,186,0,0,2378,2379,5,29,0,0,2379,
- 2380,3,34,17,0,2380,2381,5,30,0,0,2381,2382,3,306,153,0,2382,2414,1,0,
- 0,0,2383,2384,5,185,0,0,2384,2385,5,29,0,0,2385,2386,3,32,16,0,2386,2387,
- 5,30,0,0,2387,2388,3,306,153,0,2388,2414,1,0,0,0,2389,2390,5,184,0,0,2390,
- 2391,5,29,0,0,2391,2392,3,32,16,0,2392,2393,5,30,0,0,2393,2394,3,306,153,
- 0,2394,2414,1,0,0,0,2395,2396,5,183,0,0,2396,2397,5,29,0,0,2397,2398,3,
- 32,16,0,2398,2399,5,30,0,0,2399,2400,3,306,153,0,2400,2414,1,0,0,0,2401,
- 2402,5,187,0,0,2402,2414,3,306,153,0,2403,2404,5,188,0,0,2404,2414,3,306,
- 153,0,2405,2406,5,186,0,0,2406,2414,3,306,153,0,2407,2408,5,185,0,0,2408,
- 2414,3,306,153,0,2409,2410,5,184,0,0,2410,2414,3,306,153,0,2411,2412,5,
- 183,0,0,2412,2414,3,306,153,0,2413,2347,1,0,0,0,2413,2353,1,0,0,0,2413,
- 2358,1,0,0,0,2413,2360,1,0,0,0,2413,2365,1,0,0,0,2413,2371,1,0,0,0,2413,
- 2377,1,0,0,0,2413,2383,1,0,0,0,2413,2389,1,0,0,0,2413,2395,1,0,0,0,2413,
- 2401,1,0,0,0,2413,2403,1,0,0,0,2413,2405,1,0,0,0,2413,2407,1,0,0,0,2413,
- 2409,1,0,0,0,2413,2411,1,0,0,0,2414,309,1,0,0,0,2415,2416,5,187,0,0,2416,
- 2417,5,29,0,0,2417,2418,3,36,18,0,2418,2419,5,30,0,0,2419,2491,1,0,0,0,
- 2420,2421,5,188,0,0,2421,2422,5,29,0,0,2422,2423,3,36,18,0,2423,2424,5,
- 30,0,0,2424,2491,1,0,0,0,2425,2426,5,187,0,0,2426,2427,5,29,0,0,2427,2428,
- 3,32,16,0,2428,2429,5,30,0,0,2429,2491,1,0,0,0,2430,2431,5,188,0,0,2431,
- 2432,5,29,0,0,2432,2433,3,34,17,0,2433,2434,5,30,0,0,2434,2491,1,0,0,0,
- 2435,2436,5,186,0,0,2436,2437,5,29,0,0,2437,2438,3,34,17,0,2438,2439,5,
- 30,0,0,2439,2491,1,0,0,0,2440,2441,5,185,0,0,2441,2442,5,29,0,0,2442,2443,
- 3,32,16,0,2443,2444,5,30,0,0,2444,2491,1,0,0,0,2445,2446,5,184,0,0,2446,
- 2447,5,29,0,0,2447,2448,3,32,16,0,2448,2449,5,30,0,0,2449,2491,1,0,0,0,
- 2450,2451,5,183,0,0,2451,2452,5,29,0,0,2452,2453,3,32,16,0,2453,2454,5,
- 30,0,0,2454,2491,1,0,0,0,2455,2456,5,192,0,0,2456,2457,5,29,0,0,2457,2458,
- 3,34,17,0,2458,2459,5,30,0,0,2459,2491,1,0,0,0,2460,2461,5,191,0,0,2461,
- 2462,5,29,0,0,2462,2463,3,32,16,0,2463,2464,5,30,0,0,2464,2491,1,0,0,0,
- 2465,2466,5,190,0,0,2466,2467,5,29,0,0,2467,2468,3,32,16,0,2468,2469,5,
- 30,0,0,2469,2491,1,0,0,0,2470,2471,5,189,0,0,2471,2472,5,29,0,0,2472,2473,
- 3,32,16,0,2473,2474,5,30,0,0,2474,2491,1,0,0,0,2475,2476,5,180,0,0,2476,
- 2477,5,29,0,0,2477,2478,3,32,16,0,2478,2479,5,30,0,0,2479,2491,1,0,0,0,
- 2480,2481,5,182,0,0,2481,2482,5,29,0,0,2482,2483,3,184,92,0,2483,2484,
- 5,30,0,0,2484,2491,1,0,0,0,2485,2486,5,83,0,0,2486,2487,5,29,0,0,2487,
- 2488,3,312,156,0,2488,2489,5,30,0,0,2489,2491,1,0,0,0,2490,2415,1,0,0,
- 0,2490,2420,1,0,0,0,2490,2425,1,0,0,0,2490,2430,1,0,0,0,2490,2435,1,0,
- 0,0,2490,2440,1,0,0,0,2490,2445,1,0,0,0,2490,2450,1,0,0,0,2490,2455,1,
- 0,0,0,2490,2460,1,0,0,0,2490,2465,1,0,0,0,2490,2470,1,0,0,0,2490,2475,
- 1,0,0,0,2490,2480,1,0,0,0,2490,2485,1,0,0,0,2491,311,1,0,0,0,2492,2494,
- 3,314,157,0,2493,2492,1,0,0,0,2494,2497,1,0,0,0,2495,2493,1,0,0,0,2495,
- 2496,1,0,0,0,2496,313,1,0,0,0,2497,2495,1,0,0,0,2498,2499,7,12,0,0,2499,
- 315,1,0,0,0,2500,2504,3,310,155,0,2501,2504,3,6,3,0,2502,2504,5,178,0,
- 0,2503,2500,1,0,0,0,2503,2501,1,0,0,0,2503,2502,1,0,0,0,2504,317,1,0,0,
- 0,2505,2654,3,310,155,0,2506,2507,5,181,0,0,2507,2508,5,29,0,0,2508,2509,
- 5,178,0,0,2509,2654,5,30,0,0,2510,2511,5,181,0,0,2511,2512,5,29,0,0,2512,
- 2513,5,263,0,0,2513,2654,5,30,0,0,2514,2515,5,195,0,0,2515,2516,5,29,0,
- 0,2516,2517,5,38,0,0,2517,2518,5,263,0,0,2518,2654,5,30,0,0,2519,2520,
- 5,195,0,0,2520,2521,5,29,0,0,2521,2522,3,138,69,0,2522,2523,5,30,0,0,2523,
- 2654,1,0,0,0,2524,2525,5,195,0,0,2525,2526,5,29,0,0,2526,2527,5,178,0,
- 0,2527,2654,5,30,0,0,2528,2529,5,196,0,0,2529,2530,5,29,0,0,2530,2531,
- 3,318,159,0,2531,2532,5,30,0,0,2532,2654,1,0,0,0,2533,2534,5,187,0,0,2534,
- 2535,5,41,0,0,2535,2536,3,32,16,0,2536,2537,5,42,0,0,2537,2538,5,29,0,
- 0,2538,2539,3,320,160,0,2539,2540,5,30,0,0,2540,2654,1,0,0,0,2541,2542,
- 5,188,0,0,2542,2543,5,41,0,0,2543,2544,3,32,16,0,2544,2545,5,42,0,0,2545,
- 2546,5,29,0,0,2546,2547,3,322,161,0,2547,2548,5,30,0,0,2548,2654,1,0,0,
- 0,2549,2550,5,186,0,0,2550,2551,5,41,0,0,2551,2552,3,32,16,0,2552,2553,
- 5,42,0,0,2553,2554,5,29,0,0,2554,2555,3,324,162,0,2555,2556,5,30,0,0,2556,
- 2654,1,0,0,0,2557,2558,5,185,0,0,2558,2559,5,41,0,0,2559,2560,3,32,16,
- 0,2560,2561,5,42,0,0,2561,2562,5,29,0,0,2562,2563,3,326,163,0,2563,2564,
- 5,30,0,0,2564,2654,1,0,0,0,2565,2566,5,184,0,0,2566,2567,5,41,0,0,2567,
- 2568,3,32,16,0,2568,2569,5,42,0,0,2569,2570,5,29,0,0,2570,2571,3,328,164,
- 0,2571,2572,5,30,0,0,2572,2654,1,0,0,0,2573,2574,5,183,0,0,2574,2575,5,
- 41,0,0,2575,2576,3,32,16,0,2576,2577,5,42,0,0,2577,2578,5,29,0,0,2578,
- 2579,3,330,165,0,2579,2580,5,30,0,0,2580,2654,1,0,0,0,2581,2582,5,192,
- 0,0,2582,2583,5,41,0,0,2583,2584,3,32,16,0,2584,2585,5,42,0,0,2585,2586,
- 5,29,0,0,2586,2587,3,324,162,0,2587,2588,5,30,0,0,2588,2654,1,0,0,0,2589,
- 2590,5,191,0,0,2590,2591,5,41,0,0,2591,2592,3,32,16,0,2592,2593,5,42,0,
- 0,2593,2594,5,29,0,0,2594,2595,3,326,163,0,2595,2596,5,30,0,0,2596,2654,
- 1,0,0,0,2597,2598,5,190,0,0,2598,2599,5,41,0,0,2599,2600,3,32,16,0,2600,
- 2601,5,42,0,0,2601,2602,5,29,0,0,2602,2603,3,328,164,0,2603,2604,5,30,
- 0,0,2604,2654,1,0,0,0,2605,2606,5,189,0,0,2606,2607,5,41,0,0,2607,2608,
- 3,32,16,0,2608,2609,5,42,0,0,2609,2610,5,29,0,0,2610,2611,3,330,165,0,
- 2611,2612,5,30,0,0,2612,2654,1,0,0,0,2613,2614,5,180,0,0,2614,2615,5,41,
- 0,0,2615,2616,3,32,16,0,2616,2617,5,42,0,0,2617,2618,5,29,0,0,2618,2619,
- 3,328,164,0,2619,2620,5,30,0,0,2620,2654,1,0,0,0,2621,2622,5,182,0,0,2622,
- 2623,5,41,0,0,2623,2624,3,32,16,0,2624,2625,5,42,0,0,2625,2626,5,29,0,
- 0,2626,2627,3,332,166,0,2627,2628,5,30,0,0,2628,2654,1,0,0,0,2629,2630,
- 5,181,0,0,2630,2631,5,41,0,0,2631,2632,3,32,16,0,2632,2633,5,42,0,0,2633,
- 2634,5,29,0,0,2634,2635,3,334,167,0,2635,2636,5,30,0,0,2636,2654,1,0,0,
- 0,2637,2638,5,195,0,0,2638,2639,5,41,0,0,2639,2640,3,32,16,0,2640,2641,
- 5,42,0,0,2641,2642,5,29,0,0,2642,2643,3,336,168,0,2643,2644,5,30,0,0,2644,
- 2654,1,0,0,0,2645,2646,5,196,0,0,2646,2647,5,41,0,0,2647,2648,3,32,16,
- 0,2648,2649,5,42,0,0,2649,2650,5,29,0,0,2650,2651,3,340,170,0,2651,2652,
- 5,30,0,0,2652,2654,1,0,0,0,2653,2505,1,0,0,0,2653,2506,1,0,0,0,2653,2510,
- 1,0,0,0,2653,2514,1,0,0,0,2653,2519,1,0,0,0,2653,2524,1,0,0,0,2653,2528,
- 1,0,0,0,2653,2533,1,0,0,0,2653,2541,1,0,0,0,2653,2549,1,0,0,0,2653,2557,
- 1,0,0,0,2653,2565,1,0,0,0,2653,2573,1,0,0,0,2653,2581,1,0,0,0,2653,2589,
- 1,0,0,0,2653,2597,1,0,0,0,2653,2605,1,0,0,0,2653,2613,1,0,0,0,2653,2621,
- 1,0,0,0,2653,2629,1,0,0,0,2653,2637,1,0,0,0,2653,2645,1,0,0,0,2654,319,
- 1,0,0,0,2655,2658,3,36,18,0,2656,2658,3,32,16,0,2657,2655,1,0,0,0,2657,
- 2656,1,0,0,0,2658,2661,1,0,0,0,2659,2657,1,0,0,0,2659,2660,1,0,0,0,2660,
- 321,1,0,0,0,2661,2659,1,0,0,0,2662,2665,3,36,18,0,2663,2665,3,34,17,0,
- 2664,2662,1,0,0,0,2664,2663,1,0,0,0,2665,2668,1,0,0,0,2666,2664,1,0,0,
- 0,2666,2667,1,0,0,0,2667,323,1,0,0,0,2668,2666,1,0,0,0,2669,2671,3,34,
- 17,0,2670,2669,1,0,0,0,2671,2674,1,0,0,0,2672,2670,1,0,0,0,2672,2673,1,
- 0,0,0,2673,325,1,0,0,0,2674,2672,1,0,0,0,2675,2677,3,32,16,0,2676,2675,
- 1,0,0,0,2677,2680,1,0,0,0,2678,2676,1,0,0,0,2678,2679,1,0,0,0,2679,327,
- 1,0,0,0,2680,2678,1,0,0,0,2681,2683,3,32,16,0,2682,2681,1,0,0,0,2683,2686,
- 1,0,0,0,2684,2682,1,0,0,0,2684,2685,1,0,0,0,2685,329,1,0,0,0,2686,2684,
- 1,0,0,0,2687,2689,3,32,16,0,2688,2687,1,0,0,0,2689,2692,1,0,0,0,2690,2688,
- 1,0,0,0,2690,2691,1,0,0,0,2691,331,1,0,0,0,2692,2690,1,0,0,0,2693,2695,
- 3,184,92,0,2694,2693,1,0,0,0,2695,2698,1,0,0,0,2696,2694,1,0,0,0,2696,
- 2697,1,0,0,0,2697,333,1,0,0,0,2698,2696,1,0,0,0,2699,2701,7,13,0,0,2700,
- 2699,1,0,0,0,2701,2704,1,0,0,0,2702,2700,1,0,0,0,2702,2703,1,0,0,0,2703,
- 335,1,0,0,0,2704,2702,1,0,0,0,2705,2707,3,338,169,0,2706,2705,1,0,0,0,
- 2707,2710,1,0,0,0,2708,2706,1,0,0,0,2708,2709,1,0,0,0,2709,337,1,0,0,0,
- 2710,2708,1,0,0,0,2711,2716,5,178,0,0,2712,2713,5,38,0,0,2713,2716,5,263,
- 0,0,2714,2716,3,138,69,0,2715,2711,1,0,0,0,2715,2712,1,0,0,0,2715,2714,
- 1,0,0,0,2716,339,1,0,0,0,2717,2719,3,318,159,0,2718,2717,1,0,0,0,2719,
- 2722,1,0,0,0,2720,2718,1,0,0,0,2720,2721,1,0,0,0,2721,341,1,0,0,0,2722,
- 2720,1,0,0,0,2723,2727,3,44,22,0,2724,2727,3,46,23,0,2725,2727,3,2,1,0,
- 2726,2723,1,0,0,0,2726,2724,1,0,0,0,2726,2725,1,0,0,0,2727,343,1,0,0,0,
- 2728,2729,5,167,0,0,2729,2730,5,35,0,0,2730,2731,5,29,0,0,2731,2732,3,
- 312,156,0,2732,2733,5,30,0,0,2733,2754,1,0,0,0,2734,2735,5,168,0,0,2735,
- 2736,3,38,19,0,2736,2737,5,74,0,0,2737,2738,3,38,19,0,2738,2739,5,74,0,
- 0,2739,2740,3,38,19,0,2740,2741,5,74,0,0,2741,2742,3,38,19,0,2742,2754,
- 1,0,0,0,2743,2744,5,169,0,0,2744,2754,3,6,3,0,2745,2746,5,169,0,0,2746,
- 2747,5,35,0,0,2747,2748,5,29,0,0,2748,2749,3,312,156,0,2749,2750,5,30,
- 0,0,2750,2754,1,0,0,0,2751,2754,3,342,171,0,2752,2754,3,40,20,0,2753,2728,
- 1,0,0,0,2753,2734,1,0,0,0,2753,2743,1,0,0,0,2753,2745,1,0,0,0,2753,2751,
- 1,0,0,0,2753,2752,1,0,0,0,2754,345,1,0,0,0,2755,2756,5,24,0,0,2756,2757,
- 5,39,0,0,2757,2758,3,98,49,0,2758,2759,3,2,1,0,2759,2768,1,0,0,0,2760,
- 2761,5,24,0,0,2761,2762,5,39,0,0,2762,2763,3,98,49,0,2763,2764,3,2,1,0,
- 2764,2765,5,33,0,0,2765,2766,3,2,1,0,2766,2768,1,0,0,0,2767,2755,1,0,0,
- 0,2767,2760,1,0,0,0,2768,347,1,0,0,0,2769,2771,3,350,175,0,2770,2769,1,
- 0,0,0,2771,2774,1,0,0,0,2772,2770,1,0,0,0,2772,2773,1,0,0,0,2773,349,1,
- 0,0,0,2774,2772,1,0,0,0,2775,2776,5,179,0,0,2776,2777,5,35,0,0,2777,2778,
- 5,29,0,0,2778,2779,3,312,156,0,2779,2780,5,30,0,0,2780,2790,1,0,0,0,2781,
- 2790,3,344,172,0,2782,2783,5,170,0,0,2783,2784,5,35,0,0,2784,2785,5,29,
- 0,0,2785,2786,3,312,156,0,2786,2787,5,30,0,0,2787,2790,1,0,0,0,2788,2790,
- 5,54,0,0,2789,2775,1,0,0,0,2789,2781,1,0,0,0,2789,2782,1,0,0,0,2789,2788,
- 1,0,0,0,2790,351,1,0,0,0,2791,2792,5,49,0,0,2792,2796,5,39,0,0,2793,2795,
- 3,356,178,0,2794,2793,1,0,0,0,2795,2798,1,0,0,0,2796,2794,1,0,0,0,2796,
- 2797,1,0,0,0,2797,2799,1,0,0,0,2798,2796,1,0,0,0,2799,2800,3,2,1,0,2800,
- 353,1,0,0,0,2801,2805,5,300,0,0,2802,2804,3,356,178,0,2803,2802,1,0,0,
- 0,2804,2807,1,0,0,0,2805,2803,1,0,0,0,2805,2806,1,0,0,0,2806,2808,1,0,
- 0,0,2807,2805,1,0,0,0,2808,2809,3,2,1,0,2809,355,1,0,0,0,2810,2826,5,51,
- 0,0,2811,2826,5,50,0,0,2812,2826,5,171,0,0,2813,2814,5,61,0,0,2814,2826,
- 5,50,0,0,2815,2816,5,61,0,0,2816,2826,5,51,0,0,2817,2818,5,61,0,0,2818,
- 2826,5,62,0,0,2819,2820,5,61,0,0,2820,2826,5,63,0,0,2821,2822,5,61,0,0,
- 2822,2826,5,64,0,0,2823,2824,5,61,0,0,2824,2826,5,65,0,0,2825,2810,1,0,
- 0,0,2825,2811,1,0,0,0,2825,2812,1,0,0,0,2825,2813,1,0,0,0,2825,2815,1,
- 0,0,0,2825,2817,1,0,0,0,2825,2819,1,0,0,0,2825,2821,1,0,0,0,2825,2823,
- 1,0,0,0,2826,357,1,0,0,0,2827,2829,3,360,180,0,2828,2827,1,0,0,0,2829,
- 2832,1,0,0,0,2830,2828,1,0,0,0,2830,2831,1,0,0,0,2831,359,1,0,0,0,2832,
- 2830,1,0,0,0,2833,2834,5,20,0,0,2834,2847,3,2,1,0,2835,2836,5,49,0,0,2836,
- 2837,5,39,0,0,2837,2847,3,140,70,0,2838,2839,5,24,0,0,2839,2840,5,39,0,
- 0,2840,2847,3,2,1,0,2841,2847,3,196,98,0,2842,2843,5,49,0,0,2843,2847,
- 3,32,16,0,2844,2847,3,342,171,0,2845,2847,3,40,20,0,2846,2833,1,0,0,0,
- 2846,2835,1,0,0,0,2846,2838,1,0,0,0,2846,2841,1,0,0,0,2846,2842,1,0,0,
- 0,2846,2844,1,0,0,0,2846,2845,1,0,0,0,2847,361,1,0,0,0,2848,2852,5,273,
- 0,0,2849,2851,3,364,182,0,2850,2849,1,0,0,0,2851,2854,1,0,0,0,2852,2850,
- 1,0,0,0,2852,2853,1,0,0,0,2853,2855,1,0,0,0,2854,2852,1,0,0,0,2855,2868,
- 3,2,1,0,2856,2860,5,273,0,0,2857,2859,3,364,182,0,2858,2857,1,0,0,0,2859,
- 2862,1,0,0,0,2860,2858,1,0,0,0,2860,2861,1,0,0,0,2861,2863,1,0,0,0,2862,
- 2860,1,0,0,0,2863,2864,3,2,1,0,2864,2865,5,33,0,0,2865,2866,3,2,1,0,2866,
- 2868,1,0,0,0,2867,2848,1,0,0,0,2867,2856,1,0,0,0,2868,363,1,0,0,0,2869,
- 2870,7,14,0,0,2870,365,1,0,0,0,2871,2873,3,368,184,0,2872,2871,1,0,0,0,
- 2873,2876,1,0,0,0,2874,2872,1,0,0,0,2874,2875,1,0,0,0,2875,367,1,0,0,0,
- 2876,2874,1,0,0,0,2877,2878,5,20,0,0,2878,2879,3,2,1,0,2879,2880,5,43,
- 0,0,2880,2881,3,32,16,0,2881,2888,1,0,0,0,2882,2883,5,24,0,0,2883,2884,
- 5,39,0,0,2884,2888,3,2,1,0,2885,2888,3,342,171,0,2886,2888,3,40,20,0,2887,
- 2877,1,0,0,0,2887,2882,1,0,0,0,2887,2885,1,0,0,0,2887,2886,1,0,0,0,2888,
+ 3,172,2772,8,172,1,173,1,173,1,173,1,173,1,173,1,173,1,173,1,173,1,173,
+ 1,173,1,173,1,173,3,173,2786,8,173,1,174,5,174,2789,8,174,10,174,12,174,
+ 2792,9,174,1,175,1,175,1,175,1,175,1,175,1,175,1,175,1,175,1,175,1,175,
+ 1,175,1,175,1,175,1,175,3,175,2808,8,175,1,176,1,176,1,176,5,176,2813,
+ 8,176,10,176,12,176,2816,9,176,1,176,1,176,1,177,1,177,5,177,2822,8,177,
+ 10,177,12,177,2825,9,177,1,177,1,177,1,178,1,178,1,178,1,178,1,178,1,178,
+ 1,178,1,178,1,178,1,178,1,178,1,178,1,178,1,178,1,178,3,178,2844,8,178,
+ 1,179,5,179,2847,8,179,10,179,12,179,2850,9,179,1,180,1,180,1,180,1,180,
+ 1,180,1,180,1,180,1,180,1,180,1,180,1,180,1,180,1,180,3,180,2865,8,180,
+ 1,181,1,181,5,181,2869,8,181,10,181,12,181,2872,9,181,1,181,1,181,1,181,
+ 5,181,2877,8,181,10,181,12,181,2880,9,181,1,181,1,181,1,181,1,181,3,181,
+ 2886,8,181,1,182,1,182,1,183,5,183,2891,8,183,10,183,12,183,2894,9,183,
+ 1,184,1,184,1,184,1,184,1,184,1,184,1,184,1,184,1,184,1,184,3,184,2906,
+ 8,184,1,184,0,1,68,185,0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,
+ 36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,
+ 84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,
+ 124,126,128,130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,
+ 160,162,164,166,168,170,172,174,176,178,180,182,184,186,188,190,192,194,
+ 196,198,200,202,204,206,208,210,212,214,216,218,220,222,224,226,228,230,
+ 232,234,236,238,240,242,244,246,248,250,252,254,256,258,260,262,264,266,
+ 268,270,272,274,276,278,280,282,284,286,288,290,292,294,296,298,300,302,
+ 304,306,308,310,312,314,316,318,320,322,324,326,328,330,332,334,336,338,
+ 340,342,344,346,348,350,352,354,356,358,360,362,364,366,368,0,16,6,0,1,
+ 15,199,199,243,243,247,247,264,264,289,289,5,0,16,16,199,199,243,243,264,
+ 264,288,289,1,0,263,264,1,0,173,174,1,0,37,38,1,0,73,74,3,0,2,2,61,61,
+ 77,83,2,0,229,229,260,261,9,0,178,178,183,195,201,201,207,208,210,215,
+ 218,219,222,222,230,242,262,262,1,0,95,96,1,0,97,111,1,0,68,69,2,0,173,
+ 173,289,290,2,0,179,179,264,264,1,0,167,168,1,0,51,52,3325,0,370,1,0,0,
+ 0,2,383,1,0,0,0,4,385,1,0,0,0,6,391,1,0,0,0,8,399,1,0,0,0,10,452,1,0,0,
+ 0,12,454,1,0,0,0,14,457,1,0,0,0,16,460,1,0,0,0,18,464,1,0,0,0,20,467,1,
+ 0,0,0,22,470,1,0,0,0,24,477,1,0,0,0,26,493,1,0,0,0,28,495,1,0,0,0,30,497,
+ 1,0,0,0,32,507,1,0,0,0,34,509,1,0,0,0,36,526,1,0,0,0,38,530,1,0,0,0,40,
+ 548,1,0,0,0,42,575,1,0,0,0,44,598,1,0,0,0,46,634,1,0,0,0,48,636,1,0,0,
+ 0,50,640,1,0,0,0,52,642,1,0,0,0,54,649,1,0,0,0,56,661,1,0,0,0,58,664,1,
+ 0,0,0,60,666,1,0,0,0,62,679,1,0,0,0,64,687,1,0,0,0,66,689,1,0,0,0,68,697,
+ 1,0,0,0,70,713,1,0,0,0,72,719,1,0,0,0,74,722,1,0,0,0,76,771,1,0,0,0,78,
+ 776,1,0,0,0,80,781,1,0,0,0,82,786,1,0,0,0,84,794,1,0,0,0,86,799,1,0,0,
+ 0,88,904,1,0,0,0,90,932,1,0,0,0,92,934,1,0,0,0,94,938,1,0,0,0,96,940,1,
+ 0,0,0,98,945,1,0,0,0,100,948,1,0,0,0,102,950,1,0,0,0,104,952,1,0,0,0,106,
+ 954,1,0,0,0,108,956,1,0,0,0,110,958,1,0,0,0,112,960,1,0,0,0,114,962,1,
+ 0,0,0,116,964,1,0,0,0,118,966,1,0,0,0,120,968,1,0,0,0,122,970,1,0,0,0,
+ 124,972,1,0,0,0,126,1056,1,0,0,0,128,1074,1,0,0,0,130,1076,1,0,0,0,132,
+ 1088,1,0,0,0,134,1113,1,0,0,0,136,1122,1,0,0,0,138,1149,1,0,0,0,140,1156,
+ 1,0,0,0,142,1164,1,0,0,0,144,1172,1,0,0,0,146,1185,1,0,0,0,148,1195,1,
+ 0,0,0,150,1214,1,0,0,0,152,1308,1,0,0,0,154,1317,1,0,0,0,156,1327,1,0,
+ 0,0,158,1329,1,0,0,0,160,1331,1,0,0,0,162,1356,1,0,0,0,164,1388,1,0,0,
+ 0,166,1411,1,0,0,0,168,1423,1,0,0,0,170,1425,1,0,0,0,172,1428,1,0,0,0,
+ 174,1481,1,0,0,0,176,1493,1,0,0,0,178,1508,1,0,0,0,180,1515,1,0,0,0,182,
+ 1520,1,0,0,0,184,1524,1,0,0,0,186,1560,1,0,0,0,188,1562,1,0,0,0,190,1598,
+ 1,0,0,0,192,1610,1,0,0,0,194,1624,1,0,0,0,196,1626,1,0,0,0,198,1636,1,
+ 0,0,0,200,1647,1,0,0,0,202,1654,1,0,0,0,204,1664,1,0,0,0,206,1677,1,0,
+ 0,0,208,1682,1,0,0,0,210,1685,1,0,0,0,212,1696,1,0,0,0,214,1701,1,0,0,
+ 0,216,1707,1,0,0,0,218,1709,1,0,0,0,220,1831,1,0,0,0,222,1833,1,0,0,0,
+ 224,1870,1,0,0,0,226,1877,1,0,0,0,228,1882,1,0,0,0,230,1889,1,0,0,0,232,
+ 1909,1,0,0,0,234,1911,1,0,0,0,236,1916,1,0,0,0,238,1931,1,0,0,0,240,1933,
+ 1,0,0,0,242,1946,1,0,0,0,244,1951,1,0,0,0,246,1964,1,0,0,0,248,1972,1,
+ 0,0,0,250,1983,1,0,0,0,252,1988,1,0,0,0,254,2004,1,0,0,0,256,2006,1,0,
+ 0,0,258,2050,1,0,0,0,260,2070,1,0,0,0,262,2099,1,0,0,0,264,2104,1,0,0,
+ 0,266,2127,1,0,0,0,268,2132,1,0,0,0,270,2243,1,0,0,0,272,2245,1,0,0,0,
+ 274,2250,1,0,0,0,276,2252,1,0,0,0,278,2256,1,0,0,0,280,2260,1,0,0,0,282,
+ 2276,1,0,0,0,284,2290,1,0,0,0,286,2298,1,0,0,0,288,2300,1,0,0,0,290,2303,
+ 1,0,0,0,292,2305,1,0,0,0,294,2318,1,0,0,0,296,2320,1,0,0,0,298,2330,1,
+ 0,0,0,300,2335,1,0,0,0,302,2346,1,0,0,0,304,2353,1,0,0,0,306,2363,1,0,
+ 0,0,308,2431,1,0,0,0,310,2508,1,0,0,0,312,2513,1,0,0,0,314,2516,1,0,0,
+ 0,316,2521,1,0,0,0,318,2671,1,0,0,0,320,2677,1,0,0,0,322,2684,1,0,0,0,
+ 324,2690,1,0,0,0,326,2696,1,0,0,0,328,2702,1,0,0,0,330,2708,1,0,0,0,332,
+ 2714,1,0,0,0,334,2720,1,0,0,0,336,2726,1,0,0,0,338,2733,1,0,0,0,340,2738,
+ 1,0,0,0,342,2744,1,0,0,0,344,2771,1,0,0,0,346,2785,1,0,0,0,348,2790,1,
+ 0,0,0,350,2807,1,0,0,0,352,2809,1,0,0,0,354,2819,1,0,0,0,356,2843,1,0,
+ 0,0,358,2848,1,0,0,0,360,2864,1,0,0,0,362,2885,1,0,0,0,364,2887,1,0,0,
+ 0,366,2892,1,0,0,0,368,2905,1,0,0,0,370,371,7,0,0,0,371,1,1,0,0,0,372,
+ 384,5,288,0,0,373,374,3,4,2,0,374,375,5,265,0,0,375,377,1,0,0,0,376,373,
+ 1,0,0,0,377,380,1,0,0,0,378,376,1,0,0,0,378,379,1,0,0,0,379,381,1,0,0,
+ 0,380,378,1,0,0,0,381,384,3,4,2,0,382,384,5,264,0,0,383,372,1,0,0,0,383,
+ 378,1,0,0,0,383,382,1,0,0,0,384,3,1,0,0,0,385,386,7,1,0,0,386,5,1,0,0,
+ 0,387,388,5,263,0,0,388,390,5,266,0,0,389,387,1,0,0,0,390,393,1,0,0,0,
+ 391,389,1,0,0,0,391,392,1,0,0,0,392,394,1,0,0,0,393,391,1,0,0,0,394,395,
+ 5,263,0,0,395,7,1,0,0,0,396,398,3,10,5,0,397,396,1,0,0,0,398,401,1,0,0,
+ 0,399,397,1,0,0,0,399,400,1,0,0,0,400,9,1,0,0,0,401,399,1,0,0,0,402,403,
+ 3,74,37,0,403,404,5,17,0,0,404,405,3,82,41,0,405,406,5,18,0,0,406,453,
+ 1,0,0,0,407,408,3,72,36,0,408,409,5,17,0,0,409,410,3,8,4,0,410,411,5,18,
+ 0,0,411,453,1,0,0,0,412,413,3,256,128,0,413,414,5,17,0,0,414,415,3,268,
+ 134,0,415,416,5,18,0,0,416,453,1,0,0,0,417,453,3,222,111,0,418,453,3,296,
+ 148,0,419,453,3,70,35,0,420,453,3,66,33,0,421,453,3,88,44,0,422,453,3,
+ 90,45,0,423,453,3,22,11,0,424,425,3,346,173,0,425,426,5,17,0,0,426,427,
+ 3,348,174,0,427,428,5,18,0,0,428,453,1,0,0,0,429,430,3,352,176,0,430,431,
+ 5,17,0,0,431,432,3,358,179,0,432,433,5,18,0,0,433,453,1,0,0,0,434,435,
+ 3,362,181,0,435,436,5,17,0,0,436,437,3,366,183,0,437,438,5,18,0,0,438,
+ 453,1,0,0,0,439,453,3,64,32,0,440,453,3,174,87,0,441,453,3,342,171,0,442,
+ 453,3,12,6,0,443,453,3,14,7,0,444,453,3,16,8,0,445,453,3,18,9,0,446,453,
+ 3,20,10,0,447,453,3,26,13,0,448,453,3,42,21,0,449,453,3,40,20,0,450,453,
+ 3,30,15,0,451,453,3,24,12,0,452,402,1,0,0,0,452,407,1,0,0,0,452,412,1,
+ 0,0,0,452,417,1,0,0,0,452,418,1,0,0,0,452,419,1,0,0,0,452,420,1,0,0,0,
+ 452,421,1,0,0,0,452,422,1,0,0,0,452,423,1,0,0,0,452,424,1,0,0,0,452,429,
+ 1,0,0,0,452,434,1,0,0,0,452,439,1,0,0,0,452,440,1,0,0,0,452,441,1,0,0,
+ 0,452,442,1,0,0,0,452,443,1,0,0,0,452,444,1,0,0,0,452,445,1,0,0,0,452,
+ 446,1,0,0,0,452,447,1,0,0,0,452,448,1,0,0,0,452,449,1,0,0,0,452,450,1,
+ 0,0,0,452,451,1,0,0,0,453,11,1,0,0,0,454,455,5,19,0,0,455,456,3,32,16,
+ 0,456,13,1,0,0,0,457,458,5,20,0,0,458,459,3,32,16,0,459,15,1,0,0,0,460,
+ 461,5,21,0,0,461,462,5,22,0,0,462,463,3,32,16,0,463,17,1,0,0,0,464,465,
+ 5,23,0,0,465,466,3,34,17,0,466,19,1,0,0,0,467,468,5,24,0,0,468,469,3,34,
+ 17,0,469,21,1,0,0,0,470,471,5,25,0,0,471,472,3,98,49,0,472,473,3,2,1,0,
+ 473,474,5,17,0,0,474,475,3,142,71,0,475,476,5,18,0,0,476,23,1,0,0,0,477,
+ 478,5,26,0,0,478,25,1,0,0,0,479,480,5,27,0,0,480,494,3,28,14,0,481,482,
+ 5,27,0,0,482,483,3,28,14,0,483,484,5,28,0,0,484,485,3,28,14,0,485,494,
+ 1,0,0,0,486,487,5,27,0,0,487,488,3,28,14,0,488,489,5,28,0,0,489,490,3,
+ 28,14,0,490,491,5,28,0,0,491,492,3,28,14,0,492,494,1,0,0,0,493,479,1,0,
+ 0,0,493,481,1,0,0,0,493,486,1,0,0,0,494,27,1,0,0,0,495,496,7,2,0,0,496,
+ 29,1,0,0,0,497,498,5,29,0,0,498,502,5,17,0,0,499,501,3,138,69,0,500,499,
+ 1,0,0,0,501,504,1,0,0,0,502,500,1,0,0,0,502,503,1,0,0,0,503,505,1,0,0,
+ 0,504,502,1,0,0,0,505,506,5,18,0,0,506,31,1,0,0,0,507,508,5,173,0,0,508,
+ 33,1,0,0,0,509,510,7,3,0,0,510,35,1,0,0,0,511,527,5,175,0,0,512,513,3,
+ 32,16,0,513,514,5,265,0,0,514,527,1,0,0,0,515,527,3,32,16,0,516,517,5,
+ 188,0,0,517,518,5,30,0,0,518,519,3,32,16,0,519,520,5,31,0,0,520,527,1,
+ 0,0,0,521,522,5,189,0,0,522,523,5,30,0,0,523,524,3,34,17,0,524,525,5,31,
+ 0,0,525,527,1,0,0,0,526,511,1,0,0,0,526,512,1,0,0,0,526,515,1,0,0,0,526,
+ 516,1,0,0,0,526,521,1,0,0,0,527,37,1,0,0,0,528,531,3,32,16,0,529,531,5,
+ 262,0,0,530,528,1,0,0,0,530,529,1,0,0,0,531,39,1,0,0,0,532,533,5,267,0,
+ 0,533,549,5,289,0,0,534,535,5,267,0,0,535,536,5,289,0,0,536,549,5,263,
+ 0,0,537,538,5,268,0,0,538,549,5,289,0,0,539,540,5,269,0,0,540,549,5,289,
+ 0,0,541,542,5,270,0,0,542,549,5,289,0,0,543,549,5,271,0,0,544,549,5,272,
+ 0,0,545,546,5,273,0,0,546,549,5,263,0,0,547,549,5,32,0,0,548,532,1,0,0,
+ 0,548,534,1,0,0,0,548,537,1,0,0,0,548,539,1,0,0,0,548,541,1,0,0,0,548,
+ 543,1,0,0,0,548,544,1,0,0,0,548,545,1,0,0,0,548,547,1,0,0,0,549,41,1,0,
+ 0,0,550,551,5,33,0,0,551,552,3,160,80,0,552,553,5,34,0,0,553,554,3,2,1,
+ 0,554,576,1,0,0,0,555,556,5,33,0,0,556,557,3,138,69,0,557,558,5,34,0,0,
+ 558,559,3,2,1,0,559,576,1,0,0,0,560,561,5,33,0,0,561,562,3,198,99,0,562,
+ 563,5,34,0,0,563,564,3,2,1,0,564,576,1,0,0,0,565,566,5,33,0,0,566,567,
+ 3,44,22,0,567,568,5,34,0,0,568,569,3,2,1,0,569,576,1,0,0,0,570,571,5,33,
+ 0,0,571,572,3,46,23,0,572,573,5,34,0,0,573,574,3,2,1,0,574,576,1,0,0,0,
+ 575,550,1,0,0,0,575,555,1,0,0,0,575,560,1,0,0,0,575,565,1,0,0,0,575,570,
+ 1,0,0,0,576,43,1,0,0,0,577,578,5,35,0,0,578,599,3,48,24,0,579,580,5,35,
+ 0,0,580,581,3,48,24,0,581,582,5,36,0,0,582,583,3,6,3,0,583,599,1,0,0,0,
+ 584,585,5,35,0,0,585,586,3,48,24,0,586,587,5,36,0,0,587,588,5,17,0,0,588,
+ 589,3,52,26,0,589,590,5,18,0,0,590,599,1,0,0,0,591,592,5,35,0,0,592,593,
+ 3,48,24,0,593,594,5,36,0,0,594,595,5,30,0,0,595,596,3,312,156,0,596,597,
+ 5,31,0,0,597,599,1,0,0,0,598,577,1,0,0,0,598,579,1,0,0,0,598,584,1,0,0,
+ 0,598,591,1,0,0,0,599,45,1,0,0,0,600,601,5,35,0,0,601,602,5,30,0,0,602,
+ 603,3,50,25,0,603,604,5,31,0,0,604,605,3,48,24,0,605,635,1,0,0,0,606,607,
+ 5,35,0,0,607,608,5,30,0,0,608,609,3,50,25,0,609,610,5,31,0,0,610,611,3,
+ 48,24,0,611,612,5,36,0,0,612,613,3,6,3,0,613,635,1,0,0,0,614,615,5,35,
+ 0,0,615,616,5,30,0,0,616,617,3,50,25,0,617,618,5,31,0,0,618,619,3,48,24,
+ 0,619,620,5,36,0,0,620,621,5,17,0,0,621,622,3,52,26,0,622,623,5,18,0,0,
+ 623,635,1,0,0,0,624,625,5,35,0,0,625,626,5,30,0,0,626,627,3,50,25,0,627,
+ 628,5,31,0,0,628,629,3,48,24,0,629,630,5,36,0,0,630,631,5,30,0,0,631,632,
+ 3,312,156,0,632,633,5,31,0,0,633,635,1,0,0,0,634,600,1,0,0,0,634,606,1,
+ 0,0,0,634,614,1,0,0,0,634,624,1,0,0,0,635,47,1,0,0,0,636,637,3,190,95,
+ 0,637,49,1,0,0,0,638,641,3,146,73,0,639,641,3,198,99,0,640,638,1,0,0,0,
+ 640,639,1,0,0,0,641,51,1,0,0,0,642,643,3,54,27,0,643,644,3,56,28,0,644,
+ 53,1,0,0,0,645,648,3,318,159,0,646,648,3,40,20,0,647,645,1,0,0,0,647,646,
+ 1,0,0,0,648,651,1,0,0,0,649,647,1,0,0,0,649,650,1,0,0,0,650,55,1,0,0,0,
+ 651,649,1,0,0,0,652,653,3,58,29,0,653,654,3,60,30,0,654,655,3,2,1,0,655,
+ 656,5,36,0,0,656,657,3,318,159,0,657,660,1,0,0,0,658,660,3,40,20,0,659,
+ 652,1,0,0,0,659,658,1,0,0,0,660,663,1,0,0,0,661,659,1,0,0,0,661,662,1,
+ 0,0,0,662,57,1,0,0,0,663,661,1,0,0,0,664,665,7,4,0,0,665,59,1,0,0,0,666,
+ 668,3,62,31,0,667,669,5,261,0,0,668,667,1,0,0,0,668,669,1,0,0,0,669,61,
+ 1,0,0,0,670,680,3,166,83,0,671,680,3,2,1,0,672,680,5,196,0,0,673,680,5,
+ 197,0,0,674,675,5,202,0,0,675,676,5,39,0,0,676,680,5,264,0,0,677,678,5,
+ 202,0,0,678,680,3,138,69,0,679,670,1,0,0,0,679,671,1,0,0,0,679,672,1,0,
+ 0,0,679,673,1,0,0,0,679,674,1,0,0,0,679,677,1,0,0,0,680,63,1,0,0,0,681,
+ 682,5,198,0,0,682,683,5,40,0,0,683,688,3,2,1,0,684,685,5,198,0,0,685,688,
+ 3,2,1,0,686,688,5,198,0,0,687,681,1,0,0,0,687,684,1,0,0,0,687,686,1,0,
+ 0,0,688,65,1,0,0,0,689,690,5,41,0,0,690,691,5,42,0,0,691,692,3,32,16,0,
+ 692,693,5,43,0,0,693,694,3,68,34,0,694,695,5,44,0,0,695,696,3,0,0,0,696,
+ 67,1,0,0,0,697,710,6,34,-1,0,698,699,10,5,0,0,699,709,5,186,0,0,700,701,
+ 10,4,0,0,701,709,5,187,0,0,702,703,10,3,0,0,703,709,5,45,0,0,704,705,10,
+ 2,0,0,705,709,5,46,0,0,706,707,10,1,0,0,707,709,5,47,0,0,708,698,1,0,0,
+ 0,708,700,1,0,0,0,708,702,1,0,0,0,708,704,1,0,0,0,708,706,1,0,0,0,709,
+ 712,1,0,0,0,710,708,1,0,0,0,710,711,1,0,0,0,711,69,1,0,0,0,712,710,1,0,
+ 0,0,713,714,5,48,0,0,714,715,5,36,0,0,715,716,5,30,0,0,716,717,3,312,156,
+ 0,717,718,5,31,0,0,718,71,1,0,0,0,719,720,5,49,0,0,720,721,3,2,1,0,721,
+ 73,1,0,0,0,722,726,5,50,0,0,723,725,3,76,38,0,724,723,1,0,0,0,725,728,
+ 1,0,0,0,726,724,1,0,0,0,726,727,1,0,0,0,727,729,1,0,0,0,728,726,1,0,0,
+ 0,729,730,3,2,1,0,730,731,3,204,102,0,731,732,3,78,39,0,732,733,3,80,40,
+ 0,733,75,1,0,0,0,734,772,5,51,0,0,735,772,5,52,0,0,736,772,5,199,0,0,737,
+ 772,5,202,0,0,738,772,5,221,0,0,739,772,5,53,0,0,740,772,5,54,0,0,741,
+ 772,5,55,0,0,742,772,5,56,0,0,743,772,5,244,0,0,744,772,5,15,0,0,745,772,
+ 5,224,0,0,746,772,5,57,0,0,747,772,5,58,0,0,748,772,5,59,0,0,749,772,5,
+ 60,0,0,750,772,5,61,0,0,751,752,5,62,0,0,752,772,5,51,0,0,753,754,5,62,
+ 0,0,754,772,5,52,0,0,755,756,5,62,0,0,756,772,5,63,0,0,757,758,5,62,0,
+ 0,758,772,5,64,0,0,759,760,5,62,0,0,760,772,5,65,0,0,761,762,5,62,0,0,
+ 762,772,5,66,0,0,763,772,5,67,0,0,764,772,5,68,0,0,765,772,5,69,0,0,766,
+ 767,5,70,0,0,767,768,5,30,0,0,768,769,3,32,16,0,769,770,5,31,0,0,770,772,
+ 1,0,0,0,771,734,1,0,0,0,771,735,1,0,0,0,771,736,1,0,0,0,771,737,1,0,0,
+ 0,771,738,1,0,0,0,771,739,1,0,0,0,771,740,1,0,0,0,771,741,1,0,0,0,771,
+ 742,1,0,0,0,771,743,1,0,0,0,771,744,1,0,0,0,771,745,1,0,0,0,771,746,1,
+ 0,0,0,771,747,1,0,0,0,771,748,1,0,0,0,771,749,1,0,0,0,771,750,1,0,0,0,
+ 771,751,1,0,0,0,771,753,1,0,0,0,771,755,1,0,0,0,771,757,1,0,0,0,771,759,
+ 1,0,0,0,771,761,1,0,0,0,771,763,1,0,0,0,771,764,1,0,0,0,771,765,1,0,0,
+ 0,771,766,1,0,0,0,772,77,1,0,0,0,773,777,1,0,0,0,774,775,5,71,0,0,775,
+ 777,3,146,73,0,776,773,1,0,0,0,776,774,1,0,0,0,777,79,1,0,0,0,778,782,
+ 1,0,0,0,779,780,5,72,0,0,780,782,3,84,42,0,781,778,1,0,0,0,781,779,1,0,
+ 0,0,782,81,1,0,0,0,783,785,3,220,110,0,784,783,1,0,0,0,785,788,1,0,0,0,
+ 786,784,1,0,0,0,786,787,1,0,0,0,787,83,1,0,0,0,788,786,1,0,0,0,789,790,
+ 3,146,73,0,790,791,5,28,0,0,791,793,1,0,0,0,792,789,1,0,0,0,793,796,1,
+ 0,0,0,794,792,1,0,0,0,794,795,1,0,0,0,795,797,1,0,0,0,796,794,1,0,0,0,
+ 797,798,3,146,73,0,798,85,1,0,0,0,799,800,7,5,0,0,800,87,1,0,0,0,801,802,
+ 3,86,43,0,802,803,3,32,16,0,803,804,5,264,0,0,804,905,1,0,0,0,805,806,
+ 3,86,43,0,806,807,3,32,16,0,807,905,1,0,0,0,808,809,3,86,43,0,809,810,
+ 3,32,16,0,810,811,5,75,0,0,811,812,3,32,16,0,812,813,5,264,0,0,813,905,
+ 1,0,0,0,814,815,3,86,43,0,815,816,3,32,16,0,816,817,5,75,0,0,817,818,3,
+ 32,16,0,818,905,1,0,0,0,819,820,3,86,43,0,820,821,3,32,16,0,821,822,5,
+ 75,0,0,822,823,3,32,16,0,823,824,5,28,0,0,824,825,3,32,16,0,825,826,5,
+ 264,0,0,826,905,1,0,0,0,827,828,3,86,43,0,828,829,3,32,16,0,829,830,5,
+ 75,0,0,830,831,3,32,16,0,831,832,5,28,0,0,832,833,3,32,16,0,833,905,1,
+ 0,0,0,834,835,3,86,43,0,835,836,3,32,16,0,836,837,5,28,0,0,837,838,3,32,
+ 16,0,838,839,5,75,0,0,839,840,3,32,16,0,840,841,5,264,0,0,841,905,1,0,
+ 0,0,842,843,3,86,43,0,843,844,3,32,16,0,844,845,5,28,0,0,845,846,3,32,
+ 16,0,846,847,5,75,0,0,847,848,3,32,16,0,848,905,1,0,0,0,849,850,3,86,43,
+ 0,850,851,3,32,16,0,851,852,5,28,0,0,852,853,3,32,16,0,853,854,5,75,0,
+ 0,854,855,3,32,16,0,855,856,5,28,0,0,856,857,3,32,16,0,857,858,5,264,0,
+ 0,858,905,1,0,0,0,859,860,3,86,43,0,860,861,3,32,16,0,861,862,5,28,0,0,
+ 862,863,3,32,16,0,863,864,5,75,0,0,864,865,3,32,16,0,865,866,5,28,0,0,
+ 866,867,3,32,16,0,867,905,1,0,0,0,868,869,3,86,43,0,869,870,3,32,16,0,
+ 870,871,5,263,0,0,871,905,1,0,0,0,872,873,3,86,43,0,873,874,3,32,16,0,
+ 874,875,5,75,0,0,875,876,3,32,16,0,876,877,5,263,0,0,877,905,1,0,0,0,878,
+ 879,3,86,43,0,879,880,3,32,16,0,880,881,5,75,0,0,881,882,3,32,16,0,882,
+ 883,5,28,0,0,883,884,3,32,16,0,884,885,5,263,0,0,885,905,1,0,0,0,886,887,
+ 3,86,43,0,887,888,3,32,16,0,888,889,5,28,0,0,889,890,3,32,16,0,890,891,
+ 5,75,0,0,891,892,3,32,16,0,892,893,5,263,0,0,893,905,1,0,0,0,894,895,3,
+ 86,43,0,895,896,3,32,16,0,896,897,5,28,0,0,897,898,3,32,16,0,898,899,5,
+ 75,0,0,899,900,3,32,16,0,900,901,5,28,0,0,901,902,3,32,16,0,902,903,5,
+ 263,0,0,903,905,1,0,0,0,904,801,1,0,0,0,904,805,1,0,0,0,904,808,1,0,0,
+ 0,904,814,1,0,0,0,904,819,1,0,0,0,904,827,1,0,0,0,904,834,1,0,0,0,904,
+ 842,1,0,0,0,904,849,1,0,0,0,904,859,1,0,0,0,904,868,1,0,0,0,904,872,1,
+ 0,0,0,904,878,1,0,0,0,904,886,1,0,0,0,904,894,1,0,0,0,905,89,1,0,0,0,906,
+ 910,5,21,0,0,907,909,3,92,46,0,908,907,1,0,0,0,909,912,1,0,0,0,910,908,
+ 1,0,0,0,910,911,1,0,0,0,911,913,1,0,0,0,912,910,1,0,0,0,913,914,3,2,1,
+ 0,914,915,3,94,47,0,915,916,5,180,0,0,916,917,5,36,0,0,917,918,5,30,0,
+ 0,918,919,3,312,156,0,919,920,5,31,0,0,920,921,3,94,47,0,921,933,1,0,0,
+ 0,922,926,5,21,0,0,923,925,3,92,46,0,924,923,1,0,0,0,925,928,1,0,0,0,926,
+ 924,1,0,0,0,926,927,1,0,0,0,927,929,1,0,0,0,928,926,1,0,0,0,929,930,3,
+ 2,1,0,930,931,3,94,47,0,931,933,1,0,0,0,932,906,1,0,0,0,932,922,1,0,0,
+ 0,933,91,1,0,0,0,934,935,5,76,0,0,935,93,1,0,0,0,936,939,1,0,0,0,937,939,
+ 5,298,0,0,938,936,1,0,0,0,938,937,1,0,0,0,939,95,1,0,0,0,940,941,7,6,0,
+ 0,941,97,1,0,0,0,942,944,3,96,48,0,943,942,1,0,0,0,944,947,1,0,0,0,945,
+ 943,1,0,0,0,945,946,1,0,0,0,946,99,1,0,0,0,947,945,1,0,0,0,948,949,5,275,
+ 0,0,949,101,1,0,0,0,950,951,5,276,0,0,951,103,1,0,0,0,952,953,5,277,0,
+ 0,953,105,1,0,0,0,954,955,5,278,0,0,955,107,1,0,0,0,956,957,5,279,0,0,
+ 957,109,1,0,0,0,958,959,5,282,0,0,959,111,1,0,0,0,960,961,5,280,0,0,961,
+ 113,1,0,0,0,962,963,5,286,0,0,963,115,1,0,0,0,964,965,5,284,0,0,965,117,
+ 1,0,0,0,966,967,5,285,0,0,967,119,1,0,0,0,968,969,5,281,0,0,969,121,1,
+ 0,0,0,970,971,5,287,0,0,971,123,1,0,0,0,972,973,5,283,0,0,973,125,1,0,
+ 0,0,974,1057,3,100,50,0,975,976,3,102,51,0,976,977,3,32,16,0,977,1057,
+ 1,0,0,0,978,979,3,102,51,0,979,980,3,0,0,0,980,1057,1,0,0,0,981,982,3,
+ 104,52,0,982,983,3,32,16,0,983,1057,1,0,0,0,984,985,3,106,53,0,985,986,
+ 3,34,17,0,986,1057,1,0,0,0,987,988,3,108,54,0,988,989,3,36,18,0,989,1057,
+ 1,0,0,0,990,991,3,108,54,0,991,992,3,34,17,0,992,1057,1,0,0,0,993,994,
+ 3,108,54,0,994,995,5,30,0,0,995,996,3,312,156,0,996,997,5,31,0,0,997,1057,
+ 1,0,0,0,998,999,3,108,54,0,999,1000,5,84,0,0,1000,1001,5,30,0,0,1001,1002,
+ 3,312,156,0,1002,1003,5,31,0,0,1003,1057,1,0,0,0,1004,1005,3,110,55,0,
+ 1005,1006,3,32,16,0,1006,1057,1,0,0,0,1007,1008,3,110,55,0,1008,1009,3,
+ 0,0,0,1009,1057,1,0,0,0,1010,1011,3,112,56,0,1011,1012,3,190,95,0,1012,
+ 1057,1,0,0,0,1013,1014,3,114,57,0,1014,1015,3,200,100,0,1015,1057,1,0,
+ 0,0,1016,1017,3,114,57,0,1017,1018,3,196,98,0,1018,1057,1,0,0,0,1019,1020,
+ 3,116,58,0,1020,1021,3,146,73,0,1021,1057,1,0,0,0,1022,1023,3,118,59,0,
+ 1023,1024,3,6,3,0,1024,1057,1,0,0,0,1025,1026,3,118,59,0,1026,1027,5,224,
+ 0,0,1027,1028,5,30,0,0,1028,1029,3,6,3,0,1029,1030,5,31,0,0,1030,1057,
+ 1,0,0,0,1031,1032,3,118,59,0,1032,1033,5,84,0,0,1033,1034,5,30,0,0,1034,
+ 1035,3,312,156,0,1035,1036,5,31,0,0,1036,1057,1,0,0,0,1037,1038,3,120,
+ 60,0,1038,1039,3,192,96,0,1039,1040,3,160,80,0,1040,1041,3,134,67,0,1041,
+ 1057,1,0,0,0,1042,1043,3,122,61,0,1043,1044,3,50,25,0,1044,1057,1,0,0,
+ 0,1045,1046,3,122,61,0,1046,1047,3,32,16,0,1047,1057,1,0,0,0,1048,1049,
+ 3,124,62,0,1049,1050,5,30,0,0,1050,1051,3,128,64,0,1051,1052,5,31,0,0,
+ 1052,1057,1,0,0,0,1053,1054,3,124,62,0,1054,1055,5,85,0,0,1055,1057,1,
+ 0,0,0,1056,974,1,0,0,0,1056,975,1,0,0,0,1056,978,1,0,0,0,1056,981,1,0,
+ 0,0,1056,984,1,0,0,0,1056,987,1,0,0,0,1056,990,1,0,0,0,1056,993,1,0,0,
+ 0,1056,998,1,0,0,0,1056,1004,1,0,0,0,1056,1007,1,0,0,0,1056,1010,1,0,0,
+ 0,1056,1013,1,0,0,0,1056,1016,1,0,0,0,1056,1019,1,0,0,0,1056,1022,1,0,
+ 0,0,1056,1025,1,0,0,0,1056,1031,1,0,0,0,1056,1037,1,0,0,0,1056,1042,1,
+ 0,0,0,1056,1045,1,0,0,0,1056,1048,1,0,0,0,1056,1053,1,0,0,0,1057,127,1,
+ 0,0,0,1058,1075,1,0,0,0,1059,1062,3,0,0,0,1060,1062,3,32,16,0,1061,1059,
+ 1,0,0,0,1061,1060,1,0,0,0,1062,1063,1,0,0,0,1063,1064,5,28,0,0,1064,1066,
+ 1,0,0,0,1065,1061,1,0,0,0,1066,1069,1,0,0,0,1067,1065,1,0,0,0,1067,1068,
+ 1,0,0,0,1068,1072,1,0,0,0,1069,1067,1,0,0,0,1070,1073,3,0,0,0,1071,1073,
+ 3,32,16,0,1072,1070,1,0,0,0,1072,1071,1,0,0,0,1073,1075,1,0,0,0,1074,1058,
+ 1,0,0,0,1074,1067,1,0,0,0,1075,129,1,0,0,0,1076,1082,5,86,0,0,1077,1078,
+ 3,160,80,0,1078,1079,5,28,0,0,1079,1081,1,0,0,0,1080,1077,1,0,0,0,1081,
+ 1084,1,0,0,0,1082,1080,1,0,0,0,1082,1083,1,0,0,0,1083,1085,1,0,0,0,1084,
+ 1082,1,0,0,0,1085,1086,3,160,80,0,1086,1087,5,87,0,0,1087,131,1,0,0,0,
+ 1088,1094,5,42,0,0,1089,1090,3,168,84,0,1090,1091,5,28,0,0,1091,1093,1,
+ 0,0,0,1092,1089,1,0,0,0,1093,1096,1,0,0,0,1094,1092,1,0,0,0,1094,1095,
+ 1,0,0,0,1095,1097,1,0,0,0,1096,1094,1,0,0,0,1097,1098,3,168,84,0,1098,
+ 1099,5,43,0,0,1099,133,1,0,0,0,1100,1106,5,30,0,0,1101,1102,3,136,68,0,
+ 1102,1103,5,28,0,0,1103,1105,1,0,0,0,1104,1101,1,0,0,0,1105,1108,1,0,0,
+ 0,1106,1104,1,0,0,0,1106,1107,1,0,0,0,1107,1109,1,0,0,0,1108,1106,1,0,
+ 0,0,1109,1110,3,136,68,0,1110,1111,5,31,0,0,1111,1114,1,0,0,0,1112,1114,
+ 5,85,0,0,1113,1100,1,0,0,0,1113,1112,1,0,0,0,1114,135,1,0,0,0,1115,1123,
+ 5,177,0,0,1116,1117,3,252,126,0,1117,1118,3,160,80,0,1118,1120,3,248,124,
+ 0,1119,1121,3,0,0,0,1120,1119,1,0,0,0,1120,1121,1,0,0,0,1121,1123,1,0,
+ 0,0,1122,1115,1,0,0,0,1122,1116,1,0,0,0,1123,137,1,0,0,0,1124,1125,5,42,
+ 0,0,1125,1126,3,2,1,0,1126,1127,5,43,0,0,1127,1128,3,140,70,0,1128,1150,
+ 1,0,0,0,1129,1130,5,42,0,0,1130,1131,3,196,98,0,1131,1132,5,43,0,0,1132,
+ 1133,3,140,70,0,1133,1150,1,0,0,0,1134,1135,5,42,0,0,1135,1136,5,262,0,
+ 0,1136,1137,5,43,0,0,1137,1150,3,140,70,0,1138,1139,5,42,0,0,1139,1140,
+ 5,198,0,0,1140,1141,3,2,1,0,1141,1142,5,43,0,0,1142,1143,3,140,70,0,1143,
+ 1150,1,0,0,0,1144,1150,3,140,70,0,1145,1150,3,196,98,0,1146,1150,5,257,
+ 0,0,1147,1150,5,258,0,0,1148,1150,5,259,0,0,1149,1124,1,0,0,0,1149,1129,
+ 1,0,0,0,1149,1134,1,0,0,0,1149,1138,1,0,0,0,1149,1144,1,0,0,0,1149,1145,
+ 1,0,0,0,1149,1146,1,0,0,0,1149,1147,1,0,0,0,1149,1148,1,0,0,0,1150,139,
+ 1,0,0,0,1151,1152,3,2,1,0,1152,1153,5,88,0,0,1153,1155,1,0,0,0,1154,1151,
+ 1,0,0,0,1155,1158,1,0,0,0,1156,1154,1,0,0,0,1156,1157,1,0,0,0,1157,1159,
+ 1,0,0,0,1158,1156,1,0,0,0,1159,1160,3,2,1,0,1160,141,1,0,0,0,1161,1163,
+ 3,144,72,0,1162,1161,1,0,0,0,1163,1166,1,0,0,0,1164,1162,1,0,0,0,1164,
+ 1165,1,0,0,0,1165,143,1,0,0,0,1166,1164,1,0,0,0,1167,1168,5,180,0,0,1168,
+ 1169,5,89,0,0,1169,1173,3,32,16,0,1170,1173,3,174,87,0,1171,1173,3,344,
+ 172,0,1172,1167,1,0,0,0,1172,1170,1,0,0,0,1172,1171,1,0,0,0,1173,145,1,
+ 0,0,0,1174,1186,3,138,69,0,1175,1176,5,42,0,0,1176,1177,3,2,1,0,1177,1178,
+ 5,43,0,0,1178,1186,1,0,0,0,1179,1180,5,42,0,0,1180,1181,5,198,0,0,1181,
+ 1182,3,2,1,0,1182,1183,5,43,0,0,1183,1186,1,0,0,0,1184,1186,3,160,80,0,
+ 1185,1174,1,0,0,0,1185,1175,1,0,0,0,1185,1179,1,0,0,0,1185,1184,1,0,0,
+ 0,1186,147,1,0,0,0,1187,1196,1,0,0,0,1188,1192,3,152,76,0,1189,1191,3,
+ 150,75,0,1190,1189,1,0,0,0,1191,1194,1,0,0,0,1192,1190,1,0,0,0,1192,1193,
+ 1,0,0,0,1193,1196,1,0,0,0,1194,1192,1,0,0,0,1195,1187,1,0,0,0,1195,1188,
+ 1,0,0,0,1196,149,1,0,0,0,1197,1215,5,262,0,0,1198,1215,5,261,0,0,1199,
+ 1200,5,42,0,0,1200,1201,3,32,16,0,1201,1202,5,43,0,0,1202,1215,1,0,0,0,
+ 1203,1204,5,42,0,0,1204,1205,3,32,16,0,1205,1206,5,266,0,0,1206,1207,3,
+ 32,16,0,1207,1208,5,43,0,0,1208,1215,1,0,0,0,1209,1210,5,42,0,0,1210,1211,
+ 5,266,0,0,1211,1212,3,32,16,0,1212,1213,5,43,0,0,1213,1215,1,0,0,0,1214,
+ 1197,1,0,0,0,1214,1198,1,0,0,0,1214,1199,1,0,0,0,1214,1203,1,0,0,0,1214,
+ 1209,1,0,0,0,1215,151,1,0,0,0,1216,1309,1,0,0,0,1217,1218,5,203,0,0,1218,
+ 1219,5,30,0,0,1219,1220,3,6,3,0,1220,1221,5,28,0,0,1221,1222,3,6,3,0,1222,
+ 1223,5,28,0,0,1223,1224,3,6,3,0,1224,1225,5,28,0,0,1225,1226,3,6,3,0,1226,
+ 1227,5,31,0,0,1227,1309,1,0,0,0,1228,1229,5,203,0,0,1229,1230,5,30,0,0,
+ 1230,1231,3,6,3,0,1231,1232,5,28,0,0,1232,1233,3,6,3,0,1233,1234,5,31,
+ 0,0,1234,1309,1,0,0,0,1235,1236,5,204,0,0,1236,1237,5,205,0,0,1237,1238,
+ 5,42,0,0,1238,1239,3,32,16,0,1239,1240,5,43,0,0,1240,1309,1,0,0,0,1241,
+ 1242,5,204,0,0,1242,1243,5,206,0,0,1243,1244,5,42,0,0,1244,1245,3,32,16,
+ 0,1245,1246,5,43,0,0,1246,1247,3,148,74,0,1247,1309,1,0,0,0,1248,1309,
+ 5,207,0,0,1249,1309,5,208,0,0,1250,1309,5,209,0,0,1251,1309,5,201,0,0,
+ 1252,1309,5,183,0,0,1253,1309,5,184,0,0,1254,1309,5,185,0,0,1255,1309,
+ 5,186,0,0,1256,1309,5,187,0,0,1257,1309,5,188,0,0,1258,1309,5,189,0,0,
+ 1259,1309,5,210,0,0,1260,1309,5,190,0,0,1261,1309,5,191,0,0,1262,1309,
+ 5,192,0,0,1263,1309,5,193,0,0,1264,1309,5,211,0,0,1265,1309,5,212,0,0,
+ 1266,1309,5,213,0,0,1267,1309,5,214,0,0,1268,1309,5,215,0,0,1269,1309,
+ 5,216,0,0,1270,1309,5,217,0,0,1271,1272,5,218,0,0,1272,1309,3,154,77,0,
+ 1273,1274,5,219,0,0,1274,1309,3,154,77,0,1275,1309,5,220,0,0,1276,1277,
+ 5,221,0,0,1277,1309,3,154,77,0,1278,1279,5,222,0,0,1279,1309,3,156,78,
+ 0,1280,1281,5,222,0,0,1281,1282,3,156,78,0,1282,1283,5,28,0,0,1283,1284,
+ 3,6,3,0,1284,1309,1,0,0,0,1285,1309,5,194,0,0,1286,1309,5,195,0,0,1287,
+ 1288,5,90,0,0,1288,1309,5,184,0,0,1289,1290,5,90,0,0,1290,1309,5,185,0,
+ 0,1291,1292,5,90,0,0,1292,1309,5,186,0,0,1293,1294,5,90,0,0,1294,1309,
+ 5,187,0,0,1295,1296,5,62,0,0,1296,1309,5,220,0,0,1297,1309,5,223,0,0,1298,
+ 1299,5,224,0,0,1299,1309,5,213,0,0,1300,1309,5,225,0,0,1301,1302,5,207,
+ 0,0,1302,1309,5,183,0,0,1303,1309,5,226,0,0,1304,1309,5,228,0,0,1305,1306,
+ 5,34,0,0,1306,1309,5,227,0,0,1307,1309,3,2,1,0,1308,1216,1,0,0,0,1308,
+ 1217,1,0,0,0,1308,1228,1,0,0,0,1308,1235,1,0,0,0,1308,1241,1,0,0,0,1308,
+ 1248,1,0,0,0,1308,1249,1,0,0,0,1308,1250,1,0,0,0,1308,1251,1,0,0,0,1308,
+ 1252,1,0,0,0,1308,1253,1,0,0,0,1308,1254,1,0,0,0,1308,1255,1,0,0,0,1308,
+ 1256,1,0,0,0,1308,1257,1,0,0,0,1308,1258,1,0,0,0,1308,1259,1,0,0,0,1308,
+ 1260,1,0,0,0,1308,1261,1,0,0,0,1308,1262,1,0,0,0,1308,1263,1,0,0,0,1308,
+ 1264,1,0,0,0,1308,1265,1,0,0,0,1308,1266,1,0,0,0,1308,1267,1,0,0,0,1308,
+ 1268,1,0,0,0,1308,1269,1,0,0,0,1308,1270,1,0,0,0,1308,1271,1,0,0,0,1308,
+ 1273,1,0,0,0,1308,1275,1,0,0,0,1308,1276,1,0,0,0,1308,1278,1,0,0,0,1308,
+ 1280,1,0,0,0,1308,1285,1,0,0,0,1308,1286,1,0,0,0,1308,1287,1,0,0,0,1308,
+ 1289,1,0,0,0,1308,1291,1,0,0,0,1308,1293,1,0,0,0,1308,1295,1,0,0,0,1308,
+ 1297,1,0,0,0,1308,1298,1,0,0,0,1308,1300,1,0,0,0,1308,1301,1,0,0,0,1308,
+ 1303,1,0,0,0,1308,1304,1,0,0,0,1308,1305,1,0,0,0,1308,1307,1,0,0,0,1309,
+ 153,1,0,0,0,1310,1318,1,0,0,0,1311,1312,5,30,0,0,1312,1313,5,91,0,0,1313,
+ 1314,5,36,0,0,1314,1315,3,32,16,0,1315,1316,5,31,0,0,1316,1318,1,0,0,0,
+ 1317,1310,1,0,0,0,1317,1311,1,0,0,0,1318,155,1,0,0,0,1319,1328,1,0,0,0,
+ 1320,1324,3,158,79,0,1321,1323,7,7,0,0,1322,1321,1,0,0,0,1323,1326,1,0,
+ 0,0,1324,1322,1,0,0,0,1324,1325,1,0,0,0,1325,1328,1,0,0,0,1326,1324,1,
+ 0,0,0,1327,1319,1,0,0,0,1327,1320,1,0,0,0,1328,157,1,0,0,0,1329,1330,7,
+ 8,0,0,1330,159,1,0,0,0,1331,1335,3,164,82,0,1332,1334,3,162,81,0,1333,
+ 1332,1,0,0,0,1334,1337,1,0,0,0,1335,1333,1,0,0,0,1335,1336,1,0,0,0,1336,
+ 161,1,0,0,0,1337,1335,1,0,0,0,1338,1357,5,261,0,0,1339,1340,5,42,0,0,1340,
+ 1357,5,43,0,0,1341,1357,3,132,66,0,1342,1357,5,260,0,0,1343,1357,5,262,
+ 0,0,1344,1357,5,92,0,0,1345,1346,5,93,0,0,1346,1347,5,30,0,0,1347,1348,
+ 3,146,73,0,1348,1349,5,31,0,0,1349,1357,1,0,0,0,1350,1351,5,94,0,0,1351,
+ 1352,5,30,0,0,1352,1353,3,146,73,0,1353,1354,5,31,0,0,1354,1357,1,0,0,
+ 0,1355,1357,3,130,65,0,1356,1338,1,0,0,0,1356,1339,1,0,0,0,1356,1341,1,
+ 0,0,0,1356,1342,1,0,0,0,1356,1343,1,0,0,0,1356,1344,1,0,0,0,1356,1345,
+ 1,0,0,0,1356,1350,1,0,0,0,1356,1355,1,0,0,0,1357,163,1,0,0,0,1358,1359,
+ 5,39,0,0,1359,1389,3,138,69,0,1360,1389,5,197,0,0,1361,1362,5,199,0,0,
+ 1362,1363,5,39,0,0,1363,1389,3,138,69,0,1364,1365,5,200,0,0,1365,1389,
+ 3,138,69,0,1366,1367,5,226,0,0,1367,1368,3,192,96,0,1368,1369,3,160,80,
+ 0,1369,1370,5,262,0,0,1370,1371,3,134,67,0,1371,1389,1,0,0,0,1372,1373,
+ 5,253,0,0,1373,1389,3,32,16,0,1374,1375,5,252,0,0,1375,1389,3,32,16,0,
+ 1376,1377,5,253,0,0,1377,1389,3,2,1,0,1378,1379,5,252,0,0,1379,1389,3,
+ 2,1,0,1380,1389,5,254,0,0,1381,1389,5,201,0,0,1382,1389,3,170,85,0,1383,
+ 1389,3,172,86,0,1384,1389,3,166,83,0,1385,1389,3,2,1,0,1386,1387,5,177,
+ 0,0,1387,1389,3,160,80,0,1388,1358,1,0,0,0,1388,1360,1,0,0,0,1388,1361,
+ 1,0,0,0,1388,1364,1,0,0,0,1388,1366,1,0,0,0,1388,1372,1,0,0,0,1388,1374,
+ 1,0,0,0,1388,1376,1,0,0,0,1388,1378,1,0,0,0,1388,1380,1,0,0,0,1388,1381,
+ 1,0,0,0,1388,1382,1,0,0,0,1388,1383,1,0,0,0,1388,1384,1,0,0,0,1388,1385,
+ 1,0,0,0,1388,1386,1,0,0,0,1389,165,1,0,0,0,1390,1412,5,181,0,0,1391,1412,
+ 5,182,0,0,1392,1412,5,183,0,0,1393,1412,5,184,0,0,1394,1412,5,185,0,0,
+ 1395,1412,5,186,0,0,1396,1412,5,187,0,0,1397,1412,5,188,0,0,1398,1412,
+ 5,189,0,0,1399,1412,5,190,0,0,1400,1412,5,191,0,0,1401,1412,5,192,0,0,
+ 1402,1412,5,193,0,0,1403,1404,5,90,0,0,1404,1412,5,184,0,0,1405,1406,5,
+ 90,0,0,1406,1412,5,185,0,0,1407,1408,5,90,0,0,1408,1412,5,186,0,0,1409,
+ 1410,5,90,0,0,1410,1412,5,187,0,0,1411,1390,1,0,0,0,1411,1391,1,0,0,0,
+ 1411,1392,1,0,0,0,1411,1393,1,0,0,0,1411,1394,1,0,0,0,1411,1395,1,0,0,
+ 0,1411,1396,1,0,0,0,1411,1397,1,0,0,0,1411,1398,1,0,0,0,1411,1399,1,0,
+ 0,0,1411,1400,1,0,0,0,1411,1401,1,0,0,0,1411,1402,1,0,0,0,1411,1403,1,
+ 0,0,0,1411,1405,1,0,0,0,1411,1407,1,0,0,0,1411,1409,1,0,0,0,1412,167,1,
+ 0,0,0,1413,1424,1,0,0,0,1414,1424,5,177,0,0,1415,1424,3,32,16,0,1416,1417,
+ 3,32,16,0,1417,1418,5,177,0,0,1418,1419,3,32,16,0,1419,1424,1,0,0,0,1420,
+ 1421,3,32,16,0,1421,1422,5,177,0,0,1422,1424,1,0,0,0,1423,1413,1,0,0,0,
+ 1423,1414,1,0,0,0,1423,1415,1,0,0,0,1423,1416,1,0,0,0,1423,1420,1,0,0,
+ 0,1424,169,1,0,0,0,1425,1426,5,1,0,0,1426,1427,5,194,0,0,1427,171,1,0,
+ 0,0,1428,1432,5,1,0,0,1429,1430,5,90,0,0,1430,1433,5,194,0,0,1431,1433,
+ 5,195,0,0,1432,1429,1,0,0,0,1432,1431,1,0,0,0,1433,173,1,0,0,0,1434,1435,
+ 5,294,0,0,1435,1436,3,188,94,0,1436,1437,3,146,73,0,1437,1438,5,30,0,0,
+ 1438,1439,3,180,90,0,1439,1440,5,31,0,0,1440,1482,1,0,0,0,1441,1442,5,
+ 294,0,0,1442,1443,3,188,94,0,1443,1444,3,146,73,0,1444,1445,5,36,0,0,1445,
+ 1446,5,17,0,0,1446,1447,3,52,26,0,1447,1448,5,18,0,0,1448,1482,1,0,0,0,
+ 1449,1450,5,294,0,0,1450,1451,3,188,94,0,1451,1452,3,146,73,0,1452,1482,
+ 1,0,0,0,1453,1454,5,295,0,0,1454,1455,3,188,94,0,1455,1457,5,36,0,0,1456,
+ 1458,5,84,0,0,1457,1456,1,0,0,0,1457,1458,1,0,0,0,1458,1459,1,0,0,0,1459,
+ 1460,5,30,0,0,1460,1461,3,312,156,0,1461,1462,5,31,0,0,1462,1482,1,0,0,
+ 0,1463,1464,5,295,0,0,1464,1465,3,188,94,0,1465,1466,5,84,0,0,1466,1467,
+ 5,30,0,0,1467,1468,3,312,156,0,1468,1469,5,31,0,0,1469,1482,1,0,0,0,1470,
+ 1471,5,295,0,0,1471,1472,3,188,94,0,1472,1473,3,6,3,0,1473,1482,1,0,0,
+ 0,1474,1475,5,295,0,0,1475,1476,3,188,94,0,1476,1477,5,36,0,0,1477,1478,
+ 5,17,0,0,1478,1479,3,176,88,0,1479,1480,5,18,0,0,1480,1482,1,0,0,0,1481,
+ 1434,1,0,0,0,1481,1441,1,0,0,0,1481,1449,1,0,0,0,1481,1453,1,0,0,0,1481,
+ 1463,1,0,0,0,1481,1470,1,0,0,0,1481,1474,1,0,0,0,1482,175,1,0,0,0,1483,
+ 1494,1,0,0,0,1484,1485,3,178,89,0,1485,1486,5,28,0,0,1486,1488,1,0,0,0,
+ 1487,1484,1,0,0,0,1488,1491,1,0,0,0,1489,1487,1,0,0,0,1489,1490,1,0,0,
+ 0,1490,1492,1,0,0,0,1491,1489,1,0,0,0,1492,1494,3,178,89,0,1493,1483,1,
+ 0,0,0,1493,1489,1,0,0,0,1494,177,1,0,0,0,1495,1496,5,39,0,0,1496,1497,
+ 5,264,0,0,1497,1498,5,36,0,0,1498,1499,5,17,0,0,1499,1500,3,56,28,0,1500,
+ 1501,5,18,0,0,1501,1509,1,0,0,0,1502,1503,3,146,73,0,1503,1504,5,36,0,
+ 0,1504,1505,5,17,0,0,1505,1506,3,56,28,0,1506,1507,5,18,0,0,1507,1509,
+ 1,0,0,0,1508,1495,1,0,0,0,1508,1502,1,0,0,0,1509,179,1,0,0,0,1510,1511,
+ 3,182,91,0,1511,1512,5,28,0,0,1512,1514,1,0,0,0,1513,1510,1,0,0,0,1514,
+ 1517,1,0,0,0,1515,1513,1,0,0,0,1515,1516,1,0,0,0,1516,1518,1,0,0,0,1517,
+ 1515,1,0,0,0,1518,1519,3,182,91,0,1519,181,1,0,0,0,1520,1521,3,6,3,0,1521,
+ 1522,5,36,0,0,1522,1523,3,186,93,0,1523,183,1,0,0,0,1524,1525,7,9,0,0,
+ 1525,185,1,0,0,0,1526,1561,3,184,92,0,1527,1561,3,32,16,0,1528,1529,5,
+ 186,0,0,1529,1530,5,30,0,0,1530,1531,3,32,16,0,1531,1532,5,31,0,0,1532,
+ 1561,1,0,0,0,1533,1561,3,6,3,0,1534,1535,3,138,69,0,1535,1536,5,30,0,0,
+ 1536,1537,5,184,0,0,1537,1538,5,75,0,0,1538,1539,3,32,16,0,1539,1540,5,
+ 31,0,0,1540,1561,1,0,0,0,1541,1542,3,138,69,0,1542,1543,5,30,0,0,1543,
+ 1544,5,185,0,0,1544,1545,5,75,0,0,1545,1546,3,32,16,0,1546,1547,5,31,0,
+ 0,1547,1561,1,0,0,0,1548,1549,3,138,69,0,1549,1550,5,30,0,0,1550,1551,
+ 5,186,0,0,1551,1552,5,75,0,0,1552,1553,3,32,16,0,1553,1554,5,31,0,0,1554,
+ 1561,1,0,0,0,1555,1556,3,138,69,0,1556,1557,5,30,0,0,1557,1558,3,32,16,
+ 0,1558,1559,5,31,0,0,1559,1561,1,0,0,0,1560,1526,1,0,0,0,1560,1527,1,0,
+ 0,0,1560,1528,1,0,0,0,1560,1533,1,0,0,0,1560,1534,1,0,0,0,1560,1541,1,
+ 0,0,0,1560,1548,1,0,0,0,1560,1555,1,0,0,0,1561,187,1,0,0,0,1562,1563,7,
+ 10,0,0,1563,189,1,0,0,0,1564,1565,3,192,96,0,1565,1566,3,160,80,0,1566,
+ 1567,3,146,73,0,1567,1568,5,176,0,0,1568,1570,3,264,132,0,1569,1571,3,
+ 130,65,0,1570,1569,1,0,0,0,1570,1571,1,0,0,0,1571,1572,1,0,0,0,1572,1573,
+ 3,134,67,0,1573,1599,1,0,0,0,1574,1575,3,192,96,0,1575,1576,3,160,80,0,
+ 1576,1577,3,146,73,0,1577,1578,5,176,0,0,1578,1579,3,264,132,0,1579,1580,
+ 3,218,109,0,1580,1581,3,134,67,0,1581,1599,1,0,0,0,1582,1583,3,192,96,
+ 0,1583,1584,3,160,80,0,1584,1586,3,264,132,0,1585,1587,3,130,65,0,1586,
+ 1585,1,0,0,0,1586,1587,1,0,0,0,1587,1588,1,0,0,0,1588,1589,3,134,67,0,
+ 1589,1599,1,0,0,0,1590,1591,3,192,96,0,1591,1592,3,160,80,0,1592,1593,
+ 3,264,132,0,1593,1594,3,218,109,0,1594,1595,3,134,67,0,1595,1599,1,0,0,
+ 0,1596,1599,3,196,98,0,1597,1599,3,2,1,0,1598,1564,1,0,0,0,1598,1574,1,
+ 0,0,0,1598,1582,1,0,0,0,1598,1590,1,0,0,0,1598,1596,1,0,0,0,1598,1597,
+ 1,0,0,0,1599,191,1,0,0,0,1600,1601,5,243,0,0,1601,1611,3,192,96,0,1602,
+ 1603,5,244,0,0,1603,1611,3,192,96,0,1604,1611,3,194,97,0,1605,1606,5,112,
+ 0,0,1606,1607,5,30,0,0,1607,1608,3,32,16,0,1608,1609,5,31,0,0,1609,1611,
+ 1,0,0,0,1610,1600,1,0,0,0,1610,1602,1,0,0,0,1610,1604,1,0,0,0,1610,1605,
+ 1,0,0,0,1611,193,1,0,0,0,1612,1625,1,0,0,0,1613,1625,5,245,0,0,1614,1625,
+ 5,246,0,0,1615,1616,5,247,0,0,1616,1625,5,248,0,0,1617,1618,5,247,0,0,
+ 1618,1625,5,249,0,0,1619,1620,5,247,0,0,1620,1625,5,250,0,0,1621,1622,
+ 5,247,0,0,1622,1625,5,251,0,0,1623,1625,5,247,0,0,1624,1612,1,0,0,0,1624,
+ 1613,1,0,0,0,1624,1614,1,0,0,0,1624,1615,1,0,0,0,1624,1617,1,0,0,0,1624,
+ 1619,1,0,0,0,1624,1621,1,0,0,0,1624,1623,1,0,0,0,1625,195,1,0,0,0,1626,
+ 1627,5,113,0,0,1627,1628,5,30,0,0,1628,1629,3,32,16,0,1629,1630,5,31,0,
+ 0,1630,197,1,0,0,0,1631,1632,5,226,0,0,1632,1637,3,190,95,0,1633,1634,
+ 5,37,0,0,1634,1637,3,200,100,0,1635,1637,3,196,98,0,1636,1631,1,0,0,0,
+ 1636,1633,1,0,0,0,1636,1635,1,0,0,0,1637,199,1,0,0,0,1638,1639,3,160,80,
+ 0,1639,1640,3,146,73,0,1640,1641,5,176,0,0,1641,1642,3,2,1,0,1642,1648,
+ 1,0,0,0,1643,1644,3,160,80,0,1644,1645,3,2,1,0,1645,1648,1,0,0,0,1646,
+ 1648,3,2,1,0,1647,1638,1,0,0,0,1647,1643,1,0,0,0,1647,1646,1,0,0,0,1648,
+ 201,1,0,0,0,1649,1650,3,146,73,0,1650,1651,5,28,0,0,1651,1653,1,0,0,0,
+ 1652,1649,1,0,0,0,1653,1656,1,0,0,0,1654,1652,1,0,0,0,1654,1655,1,0,0,
+ 0,1655,1657,1,0,0,0,1656,1654,1,0,0,0,1657,1658,3,146,73,0,1658,203,1,
+ 0,0,0,1659,1665,1,0,0,0,1660,1661,5,86,0,0,1661,1662,3,212,106,0,1662,
+ 1663,5,87,0,0,1663,1665,1,0,0,0,1664,1659,1,0,0,0,1664,1660,1,0,0,0,1665,
+ 205,1,0,0,0,1666,1678,5,266,0,0,1667,1678,5,114,0,0,1668,1678,5,39,0,0,
+ 1669,1678,5,200,0,0,1670,1678,5,115,0,0,1671,1678,5,116,0,0,1672,1673,
+ 5,70,0,0,1673,1674,5,30,0,0,1674,1675,3,32,16,0,1675,1676,5,31,0,0,1676,
+ 1678,1,0,0,0,1677,1666,1,0,0,0,1677,1667,1,0,0,0,1677,1668,1,0,0,0,1677,
+ 1669,1,0,0,0,1677,1670,1,0,0,0,1677,1671,1,0,0,0,1677,1672,1,0,0,0,1678,
+ 207,1,0,0,0,1679,1681,3,206,103,0,1680,1679,1,0,0,0,1681,1684,1,0,0,0,
+ 1682,1680,1,0,0,0,1682,1683,1,0,0,0,1683,209,1,0,0,0,1684,1682,1,0,0,0,
+ 1685,1687,3,208,104,0,1686,1688,3,214,107,0,1687,1686,1,0,0,0,1687,1688,
+ 1,0,0,0,1688,1689,1,0,0,0,1689,1690,3,2,1,0,1690,211,1,0,0,0,1691,1692,
+ 3,210,105,0,1692,1693,5,28,0,0,1693,1695,1,0,0,0,1694,1691,1,0,0,0,1695,
+ 1698,1,0,0,0,1696,1694,1,0,0,0,1696,1697,1,0,0,0,1697,1699,1,0,0,0,1698,
+ 1696,1,0,0,0,1699,1700,3,210,105,0,1700,213,1,0,0,0,1701,1702,5,30,0,0,
+ 1702,1703,3,202,101,0,1703,1704,5,31,0,0,1704,215,1,0,0,0,1705,1708,1,
+ 0,0,0,1706,1708,3,218,109,0,1707,1705,1,0,0,0,1707,1706,1,0,0,0,1708,217,
+ 1,0,0,0,1709,1710,5,86,0,0,1710,1711,5,42,0,0,1711,1712,3,32,16,0,1712,
+ 1713,5,43,0,0,1713,1714,5,87,0,0,1714,219,1,0,0,0,1715,1716,3,256,128,
+ 0,1716,1717,5,17,0,0,1717,1718,3,268,134,0,1718,1719,5,18,0,0,1719,1832,
+ 1,0,0,0,1720,1721,3,74,37,0,1721,1722,5,17,0,0,1722,1723,3,82,41,0,1723,
+ 1724,5,18,0,0,1724,1832,1,0,0,0,1725,1726,3,232,116,0,1726,1727,5,17,0,
+ 0,1727,1728,3,236,118,0,1728,1729,5,18,0,0,1729,1832,1,0,0,0,1730,1731,
+ 3,240,120,0,1731,1732,5,17,0,0,1732,1733,3,244,122,0,1733,1734,5,18,0,
+ 0,1734,1832,1,0,0,0,1735,1832,3,222,111,0,1736,1832,3,296,148,0,1737,1832,
+ 3,174,87,0,1738,1832,3,88,44,0,1739,1832,3,342,171,0,1740,1741,5,117,0,
+ 0,1741,1832,3,32,16,0,1742,1743,5,118,0,0,1743,1832,3,32,16,0,1744,1745,
+ 3,354,177,0,1745,1746,5,17,0,0,1746,1747,3,358,179,0,1747,1748,5,18,0,
+ 0,1748,1832,1,0,0,0,1749,1750,5,302,0,0,1750,1751,3,146,73,0,1751,1752,
+ 5,176,0,0,1752,1753,3,264,132,0,1753,1754,5,119,0,0,1754,1755,3,192,96,
+ 0,1755,1756,3,160,80,0,1756,1757,3,146,73,0,1757,1758,5,176,0,0,1758,1759,
+ 3,264,132,0,1759,1760,3,134,67,0,1760,1832,1,0,0,0,1761,1762,5,302,0,0,
+ 1762,1763,5,226,0,0,1763,1764,3,192,96,0,1764,1765,3,160,80,0,1765,1766,
+ 3,146,73,0,1766,1767,5,176,0,0,1767,1768,3,264,132,0,1768,1769,3,216,108,
+ 0,1769,1770,3,134,67,0,1770,1771,5,119,0,0,1771,1772,5,226,0,0,1772,1773,
+ 3,192,96,0,1773,1774,3,160,80,0,1774,1775,3,146,73,0,1775,1776,5,176,0,
+ 0,1776,1777,3,264,132,0,1777,1778,3,216,108,0,1778,1779,3,134,67,0,1779,
+ 1832,1,0,0,0,1780,1832,3,26,13,0,1781,1832,3,40,20,0,1782,1783,5,255,0,
+ 0,1783,1784,5,196,0,0,1784,1785,5,42,0,0,1785,1786,3,32,16,0,1786,1790,
+ 5,43,0,0,1787,1789,3,342,171,0,1788,1787,1,0,0,0,1789,1792,1,0,0,0,1790,
+ 1788,1,0,0,0,1790,1791,1,0,0,0,1791,1832,1,0,0,0,1792,1790,1,0,0,0,1793,
+ 1794,5,255,0,0,1794,1795,5,196,0,0,1795,1799,3,2,1,0,1796,1798,3,342,171,
+ 0,1797,1796,1,0,0,0,1798,1801,1,0,0,0,1799,1797,1,0,0,0,1799,1800,1,0,
+ 0,0,1800,1832,1,0,0,0,1801,1799,1,0,0,0,1802,1803,5,255,0,0,1803,1804,
+ 5,256,0,0,1804,1805,5,42,0,0,1805,1806,3,32,16,0,1806,1807,5,43,0,0,1807,
+ 1808,5,28,0,0,1808,1812,3,146,73,0,1809,1811,3,342,171,0,1810,1809,1,0,
+ 0,0,1811,1814,1,0,0,0,1812,1810,1,0,0,0,1812,1813,1,0,0,0,1813,1832,1,
+ 0,0,0,1814,1812,1,0,0,0,1815,1816,5,255,0,0,1816,1817,5,256,0,0,1817,1818,
+ 3,2,1,0,1818,1819,5,28,0,0,1819,1823,3,146,73,0,1820,1822,3,342,171,0,
+ 1821,1820,1,0,0,0,1822,1825,1,0,0,0,1823,1821,1,0,0,0,1823,1824,1,0,0,
+ 0,1824,1832,1,0,0,0,1825,1823,1,0,0,0,1826,1827,5,120,0,0,1827,1828,5,
+ 196,0,0,1828,1829,3,146,73,0,1829,1830,3,44,22,0,1830,1832,1,0,0,0,1831,
+ 1715,1,0,0,0,1831,1720,1,0,0,0,1831,1725,1,0,0,0,1831,1730,1,0,0,0,1831,
+ 1735,1,0,0,0,1831,1736,1,0,0,0,1831,1737,1,0,0,0,1831,1738,1,0,0,0,1831,
+ 1739,1,0,0,0,1831,1740,1,0,0,0,1831,1742,1,0,0,0,1831,1744,1,0,0,0,1831,
+ 1749,1,0,0,0,1831,1761,1,0,0,0,1831,1780,1,0,0,0,1831,1781,1,0,0,0,1831,
+ 1782,1,0,0,0,1831,1793,1,0,0,0,1831,1802,1,0,0,0,1831,1815,1,0,0,0,1831,
+ 1826,1,0,0,0,1832,221,1,0,0,0,1833,1834,5,121,0,0,1834,1843,3,230,115,
+ 0,1835,1842,3,224,112,0,1836,1837,5,122,0,0,1837,1838,5,30,0,0,1838,1839,
+ 3,250,125,0,1839,1840,5,31,0,0,1840,1842,1,0,0,0,1841,1835,1,0,0,0,1841,
+ 1836,1,0,0,0,1842,1845,1,0,0,0,1843,1841,1,0,0,0,1843,1844,1,0,0,0,1844,
+ 1846,1,0,0,0,1845,1843,1,0,0,0,1846,1847,3,160,80,0,1847,1848,3,2,1,0,
+ 1848,1849,3,226,113,0,1849,1850,3,228,114,0,1850,223,1,0,0,0,1851,1871,
+ 5,123,0,0,1852,1871,5,51,0,0,1853,1871,5,52,0,0,1854,1871,5,63,0,0,1855,
+ 1871,5,124,0,0,1856,1871,5,69,0,0,1857,1871,5,68,0,0,1858,1871,5,64,0,
+ 0,1859,1871,5,65,0,0,1860,1871,5,66,0,0,1861,1871,5,125,0,0,1862,1871,
+ 5,126,0,0,1863,1871,5,127,0,0,1864,1871,5,16,0,0,1865,1866,5,70,0,0,1866,
+ 1867,5,30,0,0,1867,1868,3,32,16,0,1868,1869,5,31,0,0,1869,1871,1,0,0,0,
+ 1870,1851,1,0,0,0,1870,1852,1,0,0,0,1870,1853,1,0,0,0,1870,1854,1,0,0,
+ 0,1870,1855,1,0,0,0,1870,1856,1,0,0,0,1870,1857,1,0,0,0,1870,1858,1,0,
+ 0,0,1870,1859,1,0,0,0,1870,1860,1,0,0,0,1870,1861,1,0,0,0,1870,1862,1,
+ 0,0,0,1870,1863,1,0,0,0,1870,1864,1,0,0,0,1870,1865,1,0,0,0,1871,225,1,
+ 0,0,0,1872,1878,1,0,0,0,1873,1874,5,44,0,0,1874,1878,3,0,0,0,1875,1876,
+ 5,44,0,0,1876,1878,3,32,16,0,1877,1872,1,0,0,0,1877,1873,1,0,0,0,1877,
+ 1875,1,0,0,0,1878,227,1,0,0,0,1879,1883,1,0,0,0,1880,1881,5,36,0,0,1881,
+ 1883,3,316,158,0,1882,1879,1,0,0,0,1882,1880,1,0,0,0,1883,229,1,0,0,0,
+ 1884,1890,1,0,0,0,1885,1886,5,42,0,0,1886,1887,3,32,16,0,1887,1888,5,43,
+ 0,0,1888,1890,1,0,0,0,1889,1884,1,0,0,0,1889,1885,1,0,0,0,1890,231,1,0,
+ 0,0,1891,1895,5,128,0,0,1892,1894,3,234,117,0,1893,1892,1,0,0,0,1894,1897,
+ 1,0,0,0,1895,1893,1,0,0,0,1895,1896,1,0,0,0,1896,1898,1,0,0,0,1897,1895,
+ 1,0,0,0,1898,1899,3,146,73,0,1899,1900,3,2,1,0,1900,1910,1,0,0,0,1901,
+ 1905,5,128,0,0,1902,1904,3,234,117,0,1903,1902,1,0,0,0,1904,1907,1,0,0,
+ 0,1905,1903,1,0,0,0,1905,1906,1,0,0,0,1906,1908,1,0,0,0,1907,1905,1,0,
+ 0,0,1908,1910,3,2,1,0,1909,1891,1,0,0,0,1909,1901,1,0,0,0,1910,233,1,0,
+ 0,0,1911,1912,7,11,0,0,1912,235,1,0,0,0,1913,1915,3,238,119,0,1914,1913,
+ 1,0,0,0,1915,1918,1,0,0,0,1916,1914,1,0,0,0,1916,1917,1,0,0,0,1917,237,
+ 1,0,0,0,1918,1916,1,0,0,0,1919,1920,5,129,0,0,1920,1932,3,190,95,0,1921,
+ 1922,5,130,0,0,1922,1932,3,190,95,0,1923,1924,5,131,0,0,1924,1932,3,190,
+ 95,0,1925,1926,5,132,0,0,1926,1932,3,190,95,0,1927,1932,3,88,44,0,1928,
+ 1932,3,342,171,0,1929,1932,3,26,13,0,1930,1932,3,40,20,0,1931,1919,1,0,
+ 0,0,1931,1921,1,0,0,0,1931,1923,1,0,0,0,1931,1925,1,0,0,0,1931,1927,1,
+ 0,0,0,1931,1928,1,0,0,0,1931,1929,1,0,0,0,1931,1930,1,0,0,0,1932,239,1,
+ 0,0,0,1933,1937,5,133,0,0,1934,1936,3,242,121,0,1935,1934,1,0,0,0,1936,
+ 1939,1,0,0,0,1937,1935,1,0,0,0,1937,1938,1,0,0,0,1938,1940,1,0,0,0,1939,
+ 1937,1,0,0,0,1940,1941,3,192,96,0,1941,1942,3,160,80,0,1942,1943,3,2,1,
+ 0,1943,1944,3,134,67,0,1944,1945,3,228,114,0,1945,241,1,0,0,0,1946,1947,
+ 7,11,0,0,1947,243,1,0,0,0,1948,1950,3,246,123,0,1949,1948,1,0,0,0,1950,
+ 1953,1,0,0,0,1951,1949,1,0,0,0,1951,1952,1,0,0,0,1952,245,1,0,0,0,1953,
+ 1951,1,0,0,0,1954,1955,5,134,0,0,1955,1965,3,190,95,0,1956,1957,5,135,
+ 0,0,1957,1965,3,190,95,0,1958,1959,5,132,0,0,1959,1965,3,190,95,0,1960,
+ 1965,3,342,171,0,1961,1965,3,88,44,0,1962,1965,3,26,13,0,1963,1965,3,40,
+ 20,0,1964,1954,1,0,0,0,1964,1956,1,0,0,0,1964,1958,1,0,0,0,1964,1960,1,
+ 0,0,0,1964,1961,1,0,0,0,1964,1962,1,0,0,0,1964,1963,1,0,0,0,1965,247,1,
+ 0,0,0,1966,1973,1,0,0,0,1967,1968,5,122,0,0,1968,1969,5,30,0,0,1969,1970,
+ 3,250,125,0,1970,1971,5,31,0,0,1971,1973,1,0,0,0,1972,1966,1,0,0,0,1972,
+ 1967,1,0,0,0,1973,249,1,0,0,0,1974,1984,3,148,74,0,1975,1977,5,17,0,0,
+ 1976,1978,3,314,157,0,1977,1976,1,0,0,0,1978,1979,1,0,0,0,1979,1977,1,
+ 0,0,0,1979,1980,1,0,0,0,1980,1981,1,0,0,0,1981,1982,5,18,0,0,1982,1984,
+ 1,0,0,0,1983,1974,1,0,0,0,1983,1975,1,0,0,0,1984,251,1,0,0,0,1985,1987,
+ 3,254,127,0,1986,1985,1,0,0,0,1987,1990,1,0,0,0,1988,1986,1,0,0,0,1988,
+ 1989,1,0,0,0,1989,253,1,0,0,0,1990,1988,1,0,0,0,1991,1992,5,42,0,0,1992,
+ 1993,5,136,0,0,1993,2005,5,43,0,0,1994,1995,5,42,0,0,1995,1996,5,137,0,
+ 0,1996,2005,5,43,0,0,1997,1998,5,42,0,0,1998,1999,5,138,0,0,1999,2005,
+ 5,43,0,0,2000,2001,5,42,0,0,2001,2002,3,32,16,0,2002,2003,5,43,0,0,2003,
+ 2005,1,0,0,0,2004,1991,1,0,0,0,2004,1994,1,0,0,0,2004,1997,1,0,0,0,2004,
+ 2000,1,0,0,0,2005,255,1,0,0,0,2006,2011,5,139,0,0,2007,2010,3,258,129,
+ 0,2008,2010,3,260,130,0,2009,2007,1,0,0,0,2009,2008,1,0,0,0,2010,2013,
+ 1,0,0,0,2011,2009,1,0,0,0,2011,2012,1,0,0,0,2012,2014,1,0,0,0,2013,2011,
+ 1,0,0,0,2014,2015,3,192,96,0,2015,2016,3,252,126,0,2016,2017,3,160,80,
+ 0,2017,2018,3,248,124,0,2018,2019,3,264,132,0,2019,2020,3,204,102,0,2020,
+ 2024,3,134,67,0,2021,2023,3,266,133,0,2022,2021,1,0,0,0,2023,2026,1,0,
+ 0,0,2024,2022,1,0,0,0,2024,2025,1,0,0,0,2025,257,1,0,0,0,2026,2024,1,0,
+ 0,0,2027,2051,5,123,0,0,2028,2051,5,51,0,0,2029,2051,5,52,0,0,2030,2051,
+ 5,63,0,0,2031,2051,5,140,0,0,2032,2051,5,68,0,0,2033,2051,5,141,0,0,2034,
+ 2051,5,142,0,0,2035,2051,5,54,0,0,2036,2051,5,64,0,0,2037,2051,5,65,0,
+ 0,2038,2051,5,66,0,0,2039,2051,5,125,0,0,2040,2051,5,143,0,0,2041,2051,
+ 5,144,0,0,2042,2051,5,69,0,0,2043,2051,5,145,0,0,2044,2051,5,146,0,0,2045,
+ 2046,5,70,0,0,2046,2047,5,30,0,0,2047,2048,3,32,16,0,2048,2049,5,31,0,
+ 0,2049,2051,1,0,0,0,2050,2027,1,0,0,0,2050,2028,1,0,0,0,2050,2029,1,0,
+ 0,0,2050,2030,1,0,0,0,2050,2031,1,0,0,0,2050,2032,1,0,0,0,2050,2033,1,
+ 0,0,0,2050,2034,1,0,0,0,2050,2035,1,0,0,0,2050,2036,1,0,0,0,2050,2037,
+ 1,0,0,0,2050,2038,1,0,0,0,2050,2039,1,0,0,0,2050,2040,1,0,0,0,2050,2041,
+ 1,0,0,0,2050,2042,1,0,0,0,2050,2043,1,0,0,0,2050,2044,1,0,0,0,2050,2045,
+ 1,0,0,0,2051,259,1,0,0,0,2052,2053,5,147,0,0,2053,2059,5,30,0,0,2054,2057,
+ 3,6,3,0,2055,2056,5,34,0,0,2056,2058,3,6,3,0,2057,2055,1,0,0,0,2057,2058,
+ 1,0,0,0,2058,2060,1,0,0,0,2059,2054,1,0,0,0,2059,2060,1,0,0,0,2060,2064,
+ 1,0,0,0,2061,2063,3,262,131,0,2062,2061,1,0,0,0,2063,2066,1,0,0,0,2064,
+ 2062,1,0,0,0,2064,2065,1,0,0,0,2065,2067,1,0,0,0,2066,2064,1,0,0,0,2067,
+ 2071,5,31,0,0,2068,2069,5,147,0,0,2069,2071,5,85,0,0,2070,2052,1,0,0,0,
+ 2070,2068,1,0,0,0,2071,261,1,0,0,0,2072,2100,5,148,0,0,2073,2100,5,224,
+ 0,0,2074,2100,5,57,0,0,2075,2100,5,58,0,0,2076,2100,5,149,0,0,2077,2100,
+ 5,150,0,0,2078,2100,5,248,0,0,2079,2100,5,249,0,0,2080,2100,5,250,0,0,
+ 2081,2100,5,251,0,0,2082,2083,5,151,0,0,2083,2084,5,75,0,0,2084,2100,5,
+ 152,0,0,2085,2086,5,151,0,0,2086,2087,5,75,0,0,2087,2100,5,153,0,0,2088,
+ 2089,5,154,0,0,2089,2090,5,75,0,0,2090,2100,5,152,0,0,2091,2092,5,154,
+ 0,0,2092,2093,5,75,0,0,2093,2100,5,153,0,0,2094,2095,5,70,0,0,2095,2096,
+ 5,30,0,0,2096,2097,3,32,16,0,2097,2098,5,31,0,0,2098,2100,1,0,0,0,2099,
+ 2072,1,0,0,0,2099,2073,1,0,0,0,2099,2074,1,0,0,0,2099,2075,1,0,0,0,2099,
+ 2076,1,0,0,0,2099,2077,1,0,0,0,2099,2078,1,0,0,0,2099,2079,1,0,0,0,2099,
+ 2080,1,0,0,0,2099,2081,1,0,0,0,2099,2082,1,0,0,0,2099,2085,1,0,0,0,2099,
+ 2088,1,0,0,0,2099,2091,1,0,0,0,2099,2094,1,0,0,0,2100,263,1,0,0,0,2101,
+ 2105,5,116,0,0,2102,2105,5,155,0,0,2103,2105,3,2,1,0,2104,2101,1,0,0,0,
+ 2104,2102,1,0,0,0,2104,2103,1,0,0,0,2105,265,1,0,0,0,2106,2128,5,1,0,0,
+ 2107,2128,5,2,0,0,2108,2128,5,156,0,0,2109,2128,5,3,0,0,2110,2128,5,4,
+ 0,0,2111,2128,5,247,0,0,2112,2128,5,5,0,0,2113,2128,5,6,0,0,2114,2128,
+ 5,7,0,0,2115,2128,5,8,0,0,2116,2128,5,9,0,0,2117,2128,5,10,0,0,2118,2128,
+ 5,11,0,0,2119,2128,5,12,0,0,2120,2128,5,13,0,0,2121,2128,5,14,0,0,2122,
+ 2123,5,70,0,0,2123,2124,5,30,0,0,2124,2125,3,32,16,0,2125,2126,5,31,0,
+ 0,2126,2128,1,0,0,0,2127,2106,1,0,0,0,2127,2107,1,0,0,0,2127,2108,1,0,
+ 0,0,2127,2109,1,0,0,0,2127,2110,1,0,0,0,2127,2111,1,0,0,0,2127,2112,1,
+ 0,0,0,2127,2113,1,0,0,0,2127,2114,1,0,0,0,2127,2115,1,0,0,0,2127,2116,
+ 1,0,0,0,2127,2117,1,0,0,0,2127,2118,1,0,0,0,2127,2119,1,0,0,0,2127,2120,
+ 1,0,0,0,2127,2121,1,0,0,0,2127,2122,1,0,0,0,2128,267,1,0,0,0,2129,2131,
+ 3,270,135,0,2130,2129,1,0,0,0,2131,2134,1,0,0,0,2132,2130,1,0,0,0,2132,
+ 2133,1,0,0,0,2133,269,1,0,0,0,2134,2132,1,0,0,0,2135,2244,3,126,63,0,2136,
+ 2137,5,296,0,0,2137,2244,3,32,16,0,2138,2244,3,278,139,0,2139,2140,5,297,
+ 0,0,2140,2244,3,32,16,0,2141,2142,5,300,0,0,2142,2244,3,134,67,0,2143,
+ 2144,5,300,0,0,2144,2145,5,157,0,0,2145,2244,3,134,67,0,2146,2244,5,298,
+ 0,0,2147,2244,5,299,0,0,2148,2244,3,296,148,0,2149,2244,3,272,136,0,2150,
+ 2244,3,174,87,0,2151,2244,3,88,44,0,2152,2244,3,26,13,0,2153,2244,3,274,
+ 137,0,2154,2244,3,40,20,0,2155,2156,5,301,0,0,2156,2157,5,42,0,0,2157,
+ 2158,3,32,16,0,2158,2159,5,43,0,0,2159,2244,1,0,0,0,2160,2161,5,301,0,
+ 0,2161,2162,5,42,0,0,2162,2163,3,32,16,0,2163,2164,5,43,0,0,2164,2165,
+ 5,34,0,0,2165,2166,3,0,0,0,2166,2244,1,0,0,0,2167,2168,5,303,0,0,2168,
+ 2169,3,32,16,0,2169,2170,5,75,0,0,2170,2171,3,32,16,0,2171,2244,1,0,0,
+ 0,2172,2173,5,302,0,0,2173,2174,3,146,73,0,2174,2175,5,176,0,0,2175,2176,
+ 3,264,132,0,2176,2244,1,0,0,0,2177,2178,5,302,0,0,2178,2179,5,226,0,0,
+ 2179,2180,3,192,96,0,2180,2181,3,160,80,0,2181,2182,3,146,73,0,2182,2183,
+ 5,176,0,0,2183,2184,3,264,132,0,2184,2185,3,216,108,0,2185,2186,3,134,
+ 67,0,2186,2244,1,0,0,0,2187,2244,3,276,138,0,2188,2189,5,255,0,0,2189,
+ 2190,5,196,0,0,2190,2191,5,42,0,0,2191,2192,3,32,16,0,2192,2196,5,43,0,
+ 0,2193,2195,3,342,171,0,2194,2193,1,0,0,0,2195,2198,1,0,0,0,2196,2194,
+ 1,0,0,0,2196,2197,1,0,0,0,2197,2244,1,0,0,0,2198,2196,1,0,0,0,2199,2200,
+ 5,255,0,0,2200,2201,5,196,0,0,2201,2205,3,2,1,0,2202,2204,3,342,171,0,
+ 2203,2202,1,0,0,0,2204,2207,1,0,0,0,2205,2203,1,0,0,0,2205,2206,1,0,0,
+ 0,2206,2244,1,0,0,0,2207,2205,1,0,0,0,2208,2209,5,255,0,0,2209,2210,5,
+ 256,0,0,2210,2211,5,42,0,0,2211,2212,3,32,16,0,2212,2213,5,43,0,0,2213,
+ 2214,5,28,0,0,2214,2218,3,146,73,0,2215,2217,3,342,171,0,2216,2215,1,0,
+ 0,0,2217,2220,1,0,0,0,2218,2216,1,0,0,0,2218,2219,1,0,0,0,2219,2244,1,
+ 0,0,0,2220,2218,1,0,0,0,2221,2222,5,255,0,0,2222,2223,5,256,0,0,2223,2224,
+ 3,2,1,0,2224,2225,5,28,0,0,2225,2229,3,146,73,0,2226,2228,3,342,171,0,
+ 2227,2226,1,0,0,0,2228,2231,1,0,0,0,2229,2227,1,0,0,0,2229,2230,1,0,0,
+ 0,2230,2244,1,0,0,0,2231,2229,1,0,0,0,2232,2233,5,255,0,0,2233,2234,5,
+ 42,0,0,2234,2235,3,32,16,0,2235,2236,5,43,0,0,2236,2240,3,228,114,0,2237,
+ 2239,3,342,171,0,2238,2237,1,0,0,0,2239,2242,1,0,0,0,2240,2238,1,0,0,0,
+ 2240,2241,1,0,0,0,2241,2244,1,0,0,0,2242,2240,1,0,0,0,2243,2135,1,0,0,
+ 0,2243,2136,1,0,0,0,2243,2138,1,0,0,0,2243,2139,1,0,0,0,2243,2141,1,0,
+ 0,0,2243,2143,1,0,0,0,2243,2146,1,0,0,0,2243,2147,1,0,0,0,2243,2148,1,
+ 0,0,0,2243,2149,1,0,0,0,2243,2150,1,0,0,0,2243,2151,1,0,0,0,2243,2152,
+ 1,0,0,0,2243,2153,1,0,0,0,2243,2154,1,0,0,0,2243,2155,1,0,0,0,2243,2160,
+ 1,0,0,0,2243,2167,1,0,0,0,2243,2172,1,0,0,0,2243,2177,1,0,0,0,2243,2187,
+ 1,0,0,0,2243,2188,1,0,0,0,2243,2199,1,0,0,0,2243,2208,1,0,0,0,2243,2221,
+ 1,0,0,0,2243,2232,1,0,0,0,2244,271,1,0,0,0,2245,2246,3,0,0,0,2246,2247,
+ 5,75,0,0,2247,273,1,0,0,0,2248,2251,3,44,22,0,2249,2251,3,46,23,0,2250,
+ 2248,1,0,0,0,2250,2249,1,0,0,0,2251,275,1,0,0,0,2252,2253,5,17,0,0,2253,
+ 2254,3,268,134,0,2254,2255,5,18,0,0,2255,277,1,0,0,0,2256,2257,3,282,141,
+ 0,2257,2258,3,280,140,0,2258,279,1,0,0,0,2259,2261,3,284,142,0,2260,2259,
+ 1,0,0,0,2261,2262,1,0,0,0,2262,2260,1,0,0,0,2262,2263,1,0,0,0,2263,281,
+ 1,0,0,0,2264,2265,5,158,0,0,2265,2277,3,276,138,0,2266,2267,5,158,0,0,
+ 2267,2268,3,0,0,0,2268,2269,5,159,0,0,2269,2270,3,0,0,0,2270,2277,1,0,
+ 0,0,2271,2272,5,158,0,0,2272,2273,3,32,16,0,2273,2274,5,159,0,0,2274,2275,
+ 3,32,16,0,2275,2277,1,0,0,0,2276,2264,1,0,0,0,2276,2266,1,0,0,0,2276,2271,
+ 1,0,0,0,2277,283,1,0,0,0,2278,2279,3,288,144,0,2279,2280,3,294,147,0,2280,
+ 2291,1,0,0,0,2281,2282,3,286,143,0,2282,2283,3,294,147,0,2283,2291,1,0,
+ 0,0,2284,2285,3,290,145,0,2285,2286,3,294,147,0,2286,2291,1,0,0,0,2287,
+ 2288,3,292,146,0,2288,2289,3,294,147,0,2289,2291,1,0,0,0,2290,2278,1,0,
+ 0,0,2290,2281,1,0,0,0,2290,2284,1,0,0,0,2290,2287,1,0,0,0,2291,285,1,0,
+ 0,0,2292,2293,5,160,0,0,2293,2299,3,276,138,0,2294,2295,5,160,0,0,2295,
+ 2299,3,0,0,0,2296,2297,5,160,0,0,2297,2299,3,32,16,0,2298,2292,1,0,0,0,
+ 2298,2294,1,0,0,0,2298,2296,1,0,0,0,2299,287,1,0,0,0,2300,2301,5,161,0,
+ 0,2301,2302,3,146,73,0,2302,289,1,0,0,0,2303,2304,5,162,0,0,2304,291,1,
+ 0,0,0,2305,2306,5,163,0,0,2306,293,1,0,0,0,2307,2319,3,276,138,0,2308,
+ 2309,5,164,0,0,2309,2310,3,0,0,0,2310,2311,5,159,0,0,2311,2312,3,0,0,0,
+ 2312,2319,1,0,0,0,2313,2314,5,164,0,0,2314,2315,3,32,16,0,2315,2316,5,
+ 159,0,0,2316,2317,3,32,16,0,2317,2319,1,0,0,0,2318,2307,1,0,0,0,2318,2308,
+ 1,0,0,0,2318,2313,1,0,0,0,2319,295,1,0,0,0,2320,2321,3,298,149,0,2321,
+ 2322,3,302,151,0,2322,297,1,0,0,0,2323,2324,5,165,0,0,2324,2325,3,300,
+ 150,0,2325,2326,3,0,0,0,2326,2327,5,36,0,0,2327,2331,1,0,0,0,2328,2329,
+ 5,165,0,0,2329,2331,3,300,150,0,2330,2323,1,0,0,0,2330,2328,1,0,0,0,2331,
+ 299,1,0,0,0,2332,2336,1,0,0,0,2333,2336,5,166,0,0,2334,2336,5,2,0,0,2335,
+ 2332,1,0,0,0,2335,2333,1,0,0,0,2335,2334,1,0,0,0,2336,301,1,0,0,0,2337,
+ 2338,5,17,0,0,2338,2339,3,304,152,0,2339,2340,5,18,0,0,2340,2347,1,0,0,
+ 0,2341,2343,3,308,154,0,2342,2341,1,0,0,0,2343,2344,1,0,0,0,2344,2342,
+ 1,0,0,0,2344,2345,1,0,0,0,2345,2347,1,0,0,0,2346,2337,1,0,0,0,2346,2342,
+ 1,0,0,0,2347,303,1,0,0,0,2348,2349,3,308,154,0,2349,2350,5,28,0,0,2350,
+ 2352,1,0,0,0,2351,2348,1,0,0,0,2352,2355,1,0,0,0,2353,2351,1,0,0,0,2353,
+ 2354,1,0,0,0,2354,2356,1,0,0,0,2355,2353,1,0,0,0,2356,2357,3,308,154,0,
+ 2357,305,1,0,0,0,2358,2364,1,0,0,0,2359,2360,5,42,0,0,2360,2361,3,32,16,
+ 0,2361,2362,5,43,0,0,2362,2364,1,0,0,0,2363,2358,1,0,0,0,2363,2359,1,0,
+ 0,0,2364,307,1,0,0,0,2365,2366,5,181,0,0,2366,2367,5,262,0,0,2367,2368,
+ 5,30,0,0,2368,2369,3,6,3,0,2369,2370,5,31,0,0,2370,2432,1,0,0,0,2371,2372,
+ 5,260,0,0,2372,2373,5,30,0,0,2373,2374,3,0,0,0,2374,2375,5,31,0,0,2375,
+ 2432,1,0,0,0,2376,2377,5,260,0,0,2377,2432,3,0,0,0,2378,2379,5,84,0,0,
+ 2379,2380,5,30,0,0,2380,2381,3,312,156,0,2381,2382,5,31,0,0,2382,2432,
+ 1,0,0,0,2383,2384,5,188,0,0,2384,2385,5,30,0,0,2385,2386,3,36,18,0,2386,
+ 2387,5,31,0,0,2387,2388,3,306,153,0,2388,2432,1,0,0,0,2389,2390,5,189,
+ 0,0,2390,2391,5,30,0,0,2391,2392,3,36,18,0,2392,2393,5,31,0,0,2393,2394,
+ 3,306,153,0,2394,2432,1,0,0,0,2395,2396,5,187,0,0,2396,2397,5,30,0,0,2397,
+ 2398,3,34,17,0,2398,2399,5,31,0,0,2399,2400,3,306,153,0,2400,2432,1,0,
+ 0,0,2401,2402,5,186,0,0,2402,2403,5,30,0,0,2403,2404,3,32,16,0,2404,2405,
+ 5,31,0,0,2405,2406,3,306,153,0,2406,2432,1,0,0,0,2407,2408,5,185,0,0,2408,
+ 2409,5,30,0,0,2409,2410,3,32,16,0,2410,2411,5,31,0,0,2411,2412,3,306,153,
+ 0,2412,2432,1,0,0,0,2413,2414,5,184,0,0,2414,2415,5,30,0,0,2415,2416,3,
+ 32,16,0,2416,2417,5,31,0,0,2417,2418,3,306,153,0,2418,2432,1,0,0,0,2419,
+ 2420,5,188,0,0,2420,2432,3,306,153,0,2421,2422,5,189,0,0,2422,2432,3,306,
+ 153,0,2423,2424,5,187,0,0,2424,2432,3,306,153,0,2425,2426,5,186,0,0,2426,
+ 2432,3,306,153,0,2427,2428,5,185,0,0,2428,2432,3,306,153,0,2429,2430,5,
+ 184,0,0,2430,2432,3,306,153,0,2431,2365,1,0,0,0,2431,2371,1,0,0,0,2431,
+ 2376,1,0,0,0,2431,2378,1,0,0,0,2431,2383,1,0,0,0,2431,2389,1,0,0,0,2431,
+ 2395,1,0,0,0,2431,2401,1,0,0,0,2431,2407,1,0,0,0,2431,2413,1,0,0,0,2431,
+ 2419,1,0,0,0,2431,2421,1,0,0,0,2431,2423,1,0,0,0,2431,2425,1,0,0,0,2431,
+ 2427,1,0,0,0,2431,2429,1,0,0,0,2432,309,1,0,0,0,2433,2434,5,188,0,0,2434,
+ 2435,5,30,0,0,2435,2436,3,36,18,0,2436,2437,5,31,0,0,2437,2509,1,0,0,0,
+ 2438,2439,5,189,0,0,2439,2440,5,30,0,0,2440,2441,3,36,18,0,2441,2442,5,
+ 31,0,0,2442,2509,1,0,0,0,2443,2444,5,188,0,0,2444,2445,5,30,0,0,2445,2446,
+ 3,32,16,0,2446,2447,5,31,0,0,2447,2509,1,0,0,0,2448,2449,5,189,0,0,2449,
+ 2450,5,30,0,0,2450,2451,3,34,17,0,2451,2452,5,31,0,0,2452,2509,1,0,0,0,
+ 2453,2454,5,187,0,0,2454,2455,5,30,0,0,2455,2456,3,34,17,0,2456,2457,5,
+ 31,0,0,2457,2509,1,0,0,0,2458,2459,5,186,0,0,2459,2460,5,30,0,0,2460,2461,
+ 3,32,16,0,2461,2462,5,31,0,0,2462,2509,1,0,0,0,2463,2464,5,185,0,0,2464,
+ 2465,5,30,0,0,2465,2466,3,32,16,0,2466,2467,5,31,0,0,2467,2509,1,0,0,0,
+ 2468,2469,5,184,0,0,2469,2470,5,30,0,0,2470,2471,3,32,16,0,2471,2472,5,
+ 31,0,0,2472,2509,1,0,0,0,2473,2474,5,193,0,0,2474,2475,5,30,0,0,2475,2476,
+ 3,34,17,0,2476,2477,5,31,0,0,2477,2509,1,0,0,0,2478,2479,5,192,0,0,2479,
+ 2480,5,30,0,0,2480,2481,3,32,16,0,2481,2482,5,31,0,0,2482,2509,1,0,0,0,
+ 2483,2484,5,191,0,0,2484,2485,5,30,0,0,2485,2486,3,32,16,0,2486,2487,5,
+ 31,0,0,2487,2509,1,0,0,0,2488,2489,5,190,0,0,2489,2490,5,30,0,0,2490,2491,
+ 3,32,16,0,2491,2492,5,31,0,0,2492,2509,1,0,0,0,2493,2494,5,181,0,0,2494,
+ 2495,5,30,0,0,2495,2496,3,32,16,0,2496,2497,5,31,0,0,2497,2509,1,0,0,0,
+ 2498,2499,5,183,0,0,2499,2500,5,30,0,0,2500,2501,3,184,92,0,2501,2502,
+ 5,31,0,0,2502,2509,1,0,0,0,2503,2504,5,84,0,0,2504,2505,5,30,0,0,2505,
+ 2506,3,312,156,0,2506,2507,5,31,0,0,2507,2509,1,0,0,0,2508,2433,1,0,0,
+ 0,2508,2438,1,0,0,0,2508,2443,1,0,0,0,2508,2448,1,0,0,0,2508,2453,1,0,
+ 0,0,2508,2458,1,0,0,0,2508,2463,1,0,0,0,2508,2468,1,0,0,0,2508,2473,1,
+ 0,0,0,2508,2478,1,0,0,0,2508,2483,1,0,0,0,2508,2488,1,0,0,0,2508,2493,
+ 1,0,0,0,2508,2498,1,0,0,0,2508,2503,1,0,0,0,2509,311,1,0,0,0,2510,2512,
+ 3,314,157,0,2511,2510,1,0,0,0,2512,2515,1,0,0,0,2513,2511,1,0,0,0,2513,
+ 2514,1,0,0,0,2514,313,1,0,0,0,2515,2513,1,0,0,0,2516,2517,7,12,0,0,2517,
+ 315,1,0,0,0,2518,2522,3,310,155,0,2519,2522,3,6,3,0,2520,2522,5,179,0,
+ 0,2521,2518,1,0,0,0,2521,2519,1,0,0,0,2521,2520,1,0,0,0,2522,317,1,0,0,
+ 0,2523,2672,3,310,155,0,2524,2525,5,182,0,0,2525,2526,5,30,0,0,2526,2527,
+ 5,179,0,0,2527,2672,5,31,0,0,2528,2529,5,182,0,0,2529,2530,5,30,0,0,2530,
+ 2531,5,264,0,0,2531,2672,5,31,0,0,2532,2533,5,196,0,0,2533,2534,5,30,0,
+ 0,2534,2535,5,39,0,0,2535,2536,5,264,0,0,2536,2672,5,31,0,0,2537,2538,
+ 5,196,0,0,2538,2539,5,30,0,0,2539,2540,3,138,69,0,2540,2541,5,31,0,0,2541,
+ 2672,1,0,0,0,2542,2543,5,196,0,0,2543,2544,5,30,0,0,2544,2545,5,179,0,
+ 0,2545,2672,5,31,0,0,2546,2547,5,197,0,0,2547,2548,5,30,0,0,2548,2549,
+ 3,318,159,0,2549,2550,5,31,0,0,2550,2672,1,0,0,0,2551,2552,5,188,0,0,2552,
+ 2553,5,42,0,0,2553,2554,3,32,16,0,2554,2555,5,43,0,0,2555,2556,5,30,0,
+ 0,2556,2557,3,320,160,0,2557,2558,5,31,0,0,2558,2672,1,0,0,0,2559,2560,
+ 5,189,0,0,2560,2561,5,42,0,0,2561,2562,3,32,16,0,2562,2563,5,43,0,0,2563,
+ 2564,5,30,0,0,2564,2565,3,322,161,0,2565,2566,5,31,0,0,2566,2672,1,0,0,
+ 0,2567,2568,5,187,0,0,2568,2569,5,42,0,0,2569,2570,3,32,16,0,2570,2571,
+ 5,43,0,0,2571,2572,5,30,0,0,2572,2573,3,324,162,0,2573,2574,5,31,0,0,2574,
+ 2672,1,0,0,0,2575,2576,5,186,0,0,2576,2577,5,42,0,0,2577,2578,3,32,16,
+ 0,2578,2579,5,43,0,0,2579,2580,5,30,0,0,2580,2581,3,326,163,0,2581,2582,
+ 5,31,0,0,2582,2672,1,0,0,0,2583,2584,5,185,0,0,2584,2585,5,42,0,0,2585,
+ 2586,3,32,16,0,2586,2587,5,43,0,0,2587,2588,5,30,0,0,2588,2589,3,328,164,
+ 0,2589,2590,5,31,0,0,2590,2672,1,0,0,0,2591,2592,5,184,0,0,2592,2593,5,
+ 42,0,0,2593,2594,3,32,16,0,2594,2595,5,43,0,0,2595,2596,5,30,0,0,2596,
+ 2597,3,330,165,0,2597,2598,5,31,0,0,2598,2672,1,0,0,0,2599,2600,5,193,
+ 0,0,2600,2601,5,42,0,0,2601,2602,3,32,16,0,2602,2603,5,43,0,0,2603,2604,
+ 5,30,0,0,2604,2605,3,324,162,0,2605,2606,5,31,0,0,2606,2672,1,0,0,0,2607,
+ 2608,5,192,0,0,2608,2609,5,42,0,0,2609,2610,3,32,16,0,2610,2611,5,43,0,
+ 0,2611,2612,5,30,0,0,2612,2613,3,326,163,0,2613,2614,5,31,0,0,2614,2672,
+ 1,0,0,0,2615,2616,5,191,0,0,2616,2617,5,42,0,0,2617,2618,3,32,16,0,2618,
+ 2619,5,43,0,0,2619,2620,5,30,0,0,2620,2621,3,328,164,0,2621,2622,5,31,
+ 0,0,2622,2672,1,0,0,0,2623,2624,5,190,0,0,2624,2625,5,42,0,0,2625,2626,
+ 3,32,16,0,2626,2627,5,43,0,0,2627,2628,5,30,0,0,2628,2629,3,330,165,0,
+ 2629,2630,5,31,0,0,2630,2672,1,0,0,0,2631,2632,5,181,0,0,2632,2633,5,42,
+ 0,0,2633,2634,3,32,16,0,2634,2635,5,43,0,0,2635,2636,5,30,0,0,2636,2637,
+ 3,328,164,0,2637,2638,5,31,0,0,2638,2672,1,0,0,0,2639,2640,5,183,0,0,2640,
+ 2641,5,42,0,0,2641,2642,3,32,16,0,2642,2643,5,43,0,0,2643,2644,5,30,0,
+ 0,2644,2645,3,332,166,0,2645,2646,5,31,0,0,2646,2672,1,0,0,0,2647,2648,
+ 5,182,0,0,2648,2649,5,42,0,0,2649,2650,3,32,16,0,2650,2651,5,43,0,0,2651,
+ 2652,5,30,0,0,2652,2653,3,334,167,0,2653,2654,5,31,0,0,2654,2672,1,0,0,
+ 0,2655,2656,5,196,0,0,2656,2657,5,42,0,0,2657,2658,3,32,16,0,2658,2659,
+ 5,43,0,0,2659,2660,5,30,0,0,2660,2661,3,336,168,0,2661,2662,5,31,0,0,2662,
+ 2672,1,0,0,0,2663,2664,5,197,0,0,2664,2665,5,42,0,0,2665,2666,3,32,16,
+ 0,2666,2667,5,43,0,0,2667,2668,5,30,0,0,2668,2669,3,340,170,0,2669,2670,
+ 5,31,0,0,2670,2672,1,0,0,0,2671,2523,1,0,0,0,2671,2524,1,0,0,0,2671,2528,
+ 1,0,0,0,2671,2532,1,0,0,0,2671,2537,1,0,0,0,2671,2542,1,0,0,0,2671,2546,
+ 1,0,0,0,2671,2551,1,0,0,0,2671,2559,1,0,0,0,2671,2567,1,0,0,0,2671,2575,
+ 1,0,0,0,2671,2583,1,0,0,0,2671,2591,1,0,0,0,2671,2599,1,0,0,0,2671,2607,
+ 1,0,0,0,2671,2615,1,0,0,0,2671,2623,1,0,0,0,2671,2631,1,0,0,0,2671,2639,
+ 1,0,0,0,2671,2647,1,0,0,0,2671,2655,1,0,0,0,2671,2663,1,0,0,0,2672,319,
+ 1,0,0,0,2673,2676,3,36,18,0,2674,2676,3,32,16,0,2675,2673,1,0,0,0,2675,
+ 2674,1,0,0,0,2676,2679,1,0,0,0,2677,2675,1,0,0,0,2677,2678,1,0,0,0,2678,
+ 321,1,0,0,0,2679,2677,1,0,0,0,2680,2683,3,36,18,0,2681,2683,3,34,17,0,
+ 2682,2680,1,0,0,0,2682,2681,1,0,0,0,2683,2686,1,0,0,0,2684,2682,1,0,0,
+ 0,2684,2685,1,0,0,0,2685,323,1,0,0,0,2686,2684,1,0,0,0,2687,2689,3,34,
+ 17,0,2688,2687,1,0,0,0,2689,2692,1,0,0,0,2690,2688,1,0,0,0,2690,2691,1,
+ 0,0,0,2691,325,1,0,0,0,2692,2690,1,0,0,0,2693,2695,3,32,16,0,2694,2693,
+ 1,0,0,0,2695,2698,1,0,0,0,2696,2694,1,0,0,0,2696,2697,1,0,0,0,2697,327,
+ 1,0,0,0,2698,2696,1,0,0,0,2699,2701,3,32,16,0,2700,2699,1,0,0,0,2701,2704,
+ 1,0,0,0,2702,2700,1,0,0,0,2702,2703,1,0,0,0,2703,329,1,0,0,0,2704,2702,
+ 1,0,0,0,2705,2707,3,32,16,0,2706,2705,1,0,0,0,2707,2710,1,0,0,0,2708,2706,
+ 1,0,0,0,2708,2709,1,0,0,0,2709,331,1,0,0,0,2710,2708,1,0,0,0,2711,2713,
+ 3,184,92,0,2712,2711,1,0,0,0,2713,2716,1,0,0,0,2714,2712,1,0,0,0,2714,
+ 2715,1,0,0,0,2715,333,1,0,0,0,2716,2714,1,0,0,0,2717,2719,7,13,0,0,2718,
+ 2717,1,0,0,0,2719,2722,1,0,0,0,2720,2718,1,0,0,0,2720,2721,1,0,0,0,2721,
+ 335,1,0,0,0,2722,2720,1,0,0,0,2723,2725,3,338,169,0,2724,2723,1,0,0,0,
+ 2725,2728,1,0,0,0,2726,2724,1,0,0,0,2726,2727,1,0,0,0,2727,337,1,0,0,0,
+ 2728,2726,1,0,0,0,2729,2734,5,179,0,0,2730,2731,5,39,0,0,2731,2734,5,264,
+ 0,0,2732,2734,3,138,69,0,2733,2729,1,0,0,0,2733,2730,1,0,0,0,2733,2732,
+ 1,0,0,0,2734,339,1,0,0,0,2735,2737,3,318,159,0,2736,2735,1,0,0,0,2737,
+ 2740,1,0,0,0,2738,2736,1,0,0,0,2738,2739,1,0,0,0,2739,341,1,0,0,0,2740,
+ 2738,1,0,0,0,2741,2745,3,44,22,0,2742,2745,3,46,23,0,2743,2745,3,2,1,0,
+ 2744,2741,1,0,0,0,2744,2742,1,0,0,0,2744,2743,1,0,0,0,2745,343,1,0,0,0,
+ 2746,2747,7,14,0,0,2747,2748,5,36,0,0,2748,2749,5,30,0,0,2749,2750,3,312,
+ 156,0,2750,2751,5,31,0,0,2751,2772,1,0,0,0,2752,2753,5,169,0,0,2753,2754,
+ 3,38,19,0,2754,2755,5,75,0,0,2755,2756,3,38,19,0,2756,2757,5,75,0,0,2757,
+ 2758,3,38,19,0,2758,2759,5,75,0,0,2759,2760,3,38,19,0,2760,2772,1,0,0,
+ 0,2761,2762,5,170,0,0,2762,2772,3,6,3,0,2763,2764,5,170,0,0,2764,2765,
+ 5,36,0,0,2765,2766,5,30,0,0,2766,2767,3,312,156,0,2767,2768,5,31,0,0,2768,
+ 2772,1,0,0,0,2769,2772,3,342,171,0,2770,2772,3,40,20,0,2771,2746,1,0,0,
+ 0,2771,2752,1,0,0,0,2771,2761,1,0,0,0,2771,2763,1,0,0,0,2771,2769,1,0,
+ 0,0,2771,2770,1,0,0,0,2772,345,1,0,0,0,2773,2774,5,25,0,0,2774,2775,5,
+ 40,0,0,2775,2776,3,98,49,0,2776,2777,3,2,1,0,2777,2786,1,0,0,0,2778,2779,
+ 5,25,0,0,2779,2780,5,40,0,0,2780,2781,3,98,49,0,2781,2782,3,2,1,0,2782,
+ 2783,5,34,0,0,2783,2784,3,2,1,0,2784,2786,1,0,0,0,2785,2773,1,0,0,0,2785,
+ 2778,1,0,0,0,2786,347,1,0,0,0,2787,2789,3,350,175,0,2788,2787,1,0,0,0,
+ 2789,2792,1,0,0,0,2790,2788,1,0,0,0,2790,2791,1,0,0,0,2791,349,1,0,0,0,
+ 2792,2790,1,0,0,0,2793,2794,5,180,0,0,2794,2795,5,36,0,0,2795,2796,5,30,
+ 0,0,2796,2797,3,312,156,0,2797,2798,5,31,0,0,2798,2808,1,0,0,0,2799,2808,
+ 3,344,172,0,2800,2801,5,171,0,0,2801,2802,5,36,0,0,2802,2803,5,30,0,0,
+ 2803,2804,3,312,156,0,2804,2805,5,31,0,0,2805,2808,1,0,0,0,2806,2808,5,
+ 55,0,0,2807,2793,1,0,0,0,2807,2799,1,0,0,0,2807,2800,1,0,0,0,2807,2806,
+ 1,0,0,0,2808,351,1,0,0,0,2809,2810,5,50,0,0,2810,2814,5,40,0,0,2811,2813,
+ 3,356,178,0,2812,2811,1,0,0,0,2813,2816,1,0,0,0,2814,2812,1,0,0,0,2814,
+ 2815,1,0,0,0,2815,2817,1,0,0,0,2816,2814,1,0,0,0,2817,2818,3,2,1,0,2818,
+ 353,1,0,0,0,2819,2823,5,301,0,0,2820,2822,3,356,178,0,2821,2820,1,0,0,
+ 0,2822,2825,1,0,0,0,2823,2821,1,0,0,0,2823,2824,1,0,0,0,2824,2826,1,0,
+ 0,0,2825,2823,1,0,0,0,2826,2827,3,2,1,0,2827,355,1,0,0,0,2828,2844,5,52,
+ 0,0,2829,2844,5,51,0,0,2830,2844,5,172,0,0,2831,2832,5,62,0,0,2832,2844,
+ 5,51,0,0,2833,2834,5,62,0,0,2834,2844,5,52,0,0,2835,2836,5,62,0,0,2836,
+ 2844,5,63,0,0,2837,2838,5,62,0,0,2838,2844,5,64,0,0,2839,2840,5,62,0,0,
+ 2840,2844,5,65,0,0,2841,2842,5,62,0,0,2842,2844,5,66,0,0,2843,2828,1,0,
+ 0,0,2843,2829,1,0,0,0,2843,2830,1,0,0,0,2843,2831,1,0,0,0,2843,2833,1,
+ 0,0,0,2843,2835,1,0,0,0,2843,2837,1,0,0,0,2843,2839,1,0,0,0,2843,2841,
+ 1,0,0,0,2844,357,1,0,0,0,2845,2847,3,360,180,0,2846,2845,1,0,0,0,2847,
+ 2850,1,0,0,0,2848,2846,1,0,0,0,2848,2849,1,0,0,0,2849,359,1,0,0,0,2850,
+ 2848,1,0,0,0,2851,2852,5,21,0,0,2852,2865,3,2,1,0,2853,2854,5,50,0,0,2854,
+ 2855,5,40,0,0,2855,2865,3,140,70,0,2856,2857,5,25,0,0,2857,2858,5,40,0,
+ 0,2858,2865,3,2,1,0,2859,2865,3,196,98,0,2860,2861,5,50,0,0,2861,2865,
+ 3,32,16,0,2862,2865,3,342,171,0,2863,2865,3,40,20,0,2864,2851,1,0,0,0,
+ 2864,2853,1,0,0,0,2864,2856,1,0,0,0,2864,2859,1,0,0,0,2864,2860,1,0,0,
+ 0,2864,2862,1,0,0,0,2864,2863,1,0,0,0,2865,361,1,0,0,0,2866,2870,5,274,
+ 0,0,2867,2869,3,364,182,0,2868,2867,1,0,0,0,2869,2872,1,0,0,0,2870,2868,
+ 1,0,0,0,2870,2871,1,0,0,0,2871,2873,1,0,0,0,2872,2870,1,0,0,0,2873,2886,
+ 3,2,1,0,2874,2878,5,274,0,0,2875,2877,3,364,182,0,2876,2875,1,0,0,0,2877,
+ 2880,1,0,0,0,2878,2876,1,0,0,0,2878,2879,1,0,0,0,2879,2881,1,0,0,0,2880,
+ 2878,1,0,0,0,2881,2882,3,2,1,0,2882,2883,5,34,0,0,2883,2884,3,2,1,0,2884,
+ 2886,1,0,0,0,2885,2866,1,0,0,0,2885,2874,1,0,0,0,2886,363,1,0,0,0,2887,
+ 2888,7,15,0,0,2888,365,1,0,0,0,2889,2891,3,368,184,0,2890,2889,1,0,0,0,
+ 2891,2894,1,0,0,0,2892,2890,1,0,0,0,2892,2893,1,0,0,0,2893,367,1,0,0,0,
+ 2894,2892,1,0,0,0,2895,2896,5,21,0,0,2896,2897,3,2,1,0,2897,2898,5,44,
+ 0,0,2898,2899,3,32,16,0,2899,2906,1,0,0,0,2900,2901,5,25,0,0,2901,2902,
+ 5,40,0,0,2902,2906,3,2,1,0,2903,2906,3,342,171,0,2904,2906,3,40,20,0,2905,
+ 2895,1,0,0,0,2905,2900,1,0,0,0,2905,2903,1,0,0,0,2905,2904,1,0,0,0,2906,
369,1,0,0,0,172,378,383,391,399,452,493,502,526,530,548,575,598,634,640,
647,649,659,661,668,679,687,708,710,726,771,776,781,786,794,904,910,926,
- 932,938,945,1053,1058,1064,1069,1071,1079,1091,1103,1110,1117,1119,1146,
- 1153,1161,1169,1182,1189,1192,1211,1297,1306,1313,1316,1324,1345,1377,
- 1400,1412,1421,1446,1463,1471,1475,1490,1497,1542,1552,1568,1580,1592,
- 1606,1618,1629,1636,1646,1659,1664,1669,1678,1689,1772,1781,1794,1805,
- 1813,1823,1825,1852,1859,1864,1871,1877,1887,1891,1898,1913,1919,1933,
- 1946,1954,1961,1965,1970,1986,1991,1993,2006,2032,2039,2041,2046,2052,
- 2081,2086,2109,2114,2178,2187,2200,2211,2222,2225,2232,2244,2258,2272,
- 2280,2300,2312,2317,2326,2328,2335,2345,2413,2490,2495,2503,2653,2657,
- 2659,2664,2666,2672,2678,2684,2690,2696,2702,2708,2715,2720,2726,2753,
- 2767,2772,2789,2796,2805,2825,2830,2846,2852,2860,2867,2874,2887
+ 932,938,945,1056,1061,1067,1072,1074,1082,1094,1106,1113,1120,1122,1149,
+ 1156,1164,1172,1185,1192,1195,1214,1308,1317,1324,1327,1335,1356,1388,
+ 1411,1423,1432,1457,1481,1489,1493,1508,1515,1560,1570,1586,1598,1610,
+ 1624,1636,1647,1654,1664,1677,1682,1687,1696,1707,1790,1799,1812,1823,
+ 1831,1841,1843,1870,1877,1882,1889,1895,1905,1909,1916,1931,1937,1951,
+ 1964,1972,1979,1983,1988,2004,2009,2011,2024,2050,2057,2059,2064,2070,
+ 2099,2104,2127,2132,2196,2205,2218,2229,2240,2243,2250,2262,2276,2290,
+ 2298,2318,2330,2335,2344,2346,2353,2363,2431,2508,2513,2521,2671,2675,
+ 2677,2682,2684,2690,2696,2702,2708,2714,2720,2726,2733,2738,2744,2771,
+ 2785,2790,2807,2814,2823,2843,2848,2864,2870,2878,2885,2892,2905
};
public static readonly ATN _ATN =
diff --git a/src/tools/ilasm/src/ilasm/Program.cs b/src/tools/ilasm/src/ilasm/Program.cs
index bcccce1398c279..fd593d6d66ca33 100644
--- a/src/tools/ilasm/src/ilasm/Program.cs
+++ b/src/tools/ilasm/src/ilasm/Program.cs
@@ -82,6 +82,7 @@ public int Run()
bool errorTolerant = Get(_command.ErrorTolerant);
var options = new Options
{
+ Dll = isDll,
NoAutoInherit = Get(_command.NoAutoInherit),
ErrorTolerant = errorTolerant,
};
diff --git a/src/tools/ilasm/src/ilasm/ilasm.csproj b/src/tools/ilasm/src/ilasm/ilasm.csproj
index 8a1e3d9fe0a6b4..14c464f957b06d 100644
--- a/src/tools/ilasm/src/ilasm/ilasm.csproj
+++ b/src/tools/ilasm/src/ilasm/ilasm.csproj
@@ -15,7 +15,18 @@
enable
-
+
+
+ true
+ false
+ true
+ Speed
+ Guard
+ true
+ false
+ false
+ true
+
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/AssemblyTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/AssemblyTests.cs
index 542bfe2e2c225d..1057888fae43b2 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/AssemblyTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/AssemblyTests.cs
@@ -21,6 +21,50 @@ namespace ILAssembler.Tests
{
public class AssemblyTests
{
+ [Theory]
+ [InlineData(false)]
+ [InlineData(true)]
+ public void ImageCharacteristics_AreValid(bool dll)
+ {
+ string source = """
+ .assembly test { }
+ .method public static void Main() cil managed
+ {
+ .entrypoint
+ ret
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options { Dll = dll });
+ Characteristics characteristics = pe.PEHeaders.CoffHeader.Characteristics;
+
+ Assert.True(characteristics.HasFlag(Characteristics.ExecutableImage));
+ Assert.True(characteristics.HasFlag(Characteristics.Bit32Machine));
+ Assert.Equal(dll, characteristics.HasFlag(Characteristics.Dll));
+ }
+
+ [Theory]
+ [InlineData(Machine.Amd64)]
+ [InlineData(Machine.Arm64)]
+ public void ImageCharacteristics_64BitImageIsLargeAddressAware(Machine machine)
+ {
+ string source = """
+ .assembly test { }
+ .method public static void Main() cil managed
+ {
+ .entrypoint
+ ret
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options { Machine = machine });
+ Characteristics characteristics = pe.PEHeaders.CoffHeader.Characteristics;
+
+ Assert.True(characteristics.HasFlag(Characteristics.ExecutableImage));
+ Assert.True(characteristics.HasFlag(Characteristics.LargeAddressAware));
+ Assert.False(characteristics.HasFlag(Characteristics.Bit32Machine));
+ }
+
[Fact]
public void Diagnostic_AssemblyNotFound()
{
@@ -71,6 +115,85 @@ .class public auto ansi beforefieldinit Test
Assert.Equal(asmRefs[0].Name, reader.GetAssemblyReference((AssemblyReferenceHandle)objectRef.ResolutionScope).Name);
}
+ [Fact]
+ public void AssemblyReference_KeywordName_IsAccepted()
+ {
+ string source = """
+ .assembly extern volatile
+ {
+ .ver 0:0:0:0
+ }
+ .assembly test { }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var assemblyReference = Assert.Single(reader.AssemblyReferences);
+
+ Assert.Equal("volatile", reader.GetString(reader.GetAssemblyReference(assemblyReference).Name));
+ }
+
+ [Theory]
+ [InlineData(".publickey")]
+ [InlineData(".publicKey")]
+ public void AssemblyReference_PublicKeySpellings_AreAccepted(string directive)
+ {
+ string source = $$"""
+ .assembly extern mscorlib
+ {
+ {{directive}} = (01 02 03 04)
+ .ver 2:0:0:0
+ }
+ .assembly test { }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var assemblyReference = reader.GetAssemblyReference(Assert.Single(reader.AssemblyReferences));
+
+ Assert.True(assemblyReference.Flags.HasFlag(AssemblyFlags.PublicKey));
+ Assert.Equal([1, 2, 3, 4], reader.GetBlobBytes(assemblyReference.PublicKeyOrToken));
+ }
+
+ [Fact]
+ public void AssemblyDefinition_PublicKeySetsFlag()
+ {
+ string source = """
+ .assembly test
+ {
+ .publickey = (01 02 03 04)
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var assembly = reader.GetAssemblyDefinition();
+
+ Assert.True(assembly.Flags.HasFlag(AssemblyFlags.PublicKey));
+ Assert.Equal([1, 2, 3, 4], reader.GetBlobBytes(assembly.PublicKey));
+ }
+
+ [Theory]
+ [InlineData(".publickey = (01 02 03 04)\n.publickeytoken = (05 06 07 08)")]
+ [InlineData(".publickeytoken = (05 06 07 08)\n.publickey = (01 02 03 04)")]
+ public void AssemblyReference_PublicKeyTokenTakesPrecedence(string declarations)
+ {
+ string source = $$"""
+ .assembly extern External
+ {
+ {{declarations}}
+ }
+ .assembly test { }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var assemblyReference = reader.GetAssemblyReference(Assert.Single(reader.AssemblyReferences));
+
+ Assert.False(assemblyReference.Flags.HasFlag(AssemblyFlags.PublicKey));
+ Assert.Equal([5, 6, 7, 8], reader.GetBlobBytes(assemblyReference.PublicKeyOrToken));
+ }
+
[Fact]
public void CoreAssemblyResolution_PrefersSystemPrivateCoreLib()
@@ -257,6 +380,99 @@ .class public auto ansi beforefieldinit Test
Assert.Equal(new Version(8, 0, 0, 0), asmRef.Version);
}
+ [Theory]
+ [InlineData("Deterministic.dll", false)]
+ [InlineData("Deterministic.exe", true)]
+ public void ManagedIlasm_DeterministicOutput_IsByteIdentical(string outputFileName, bool executable)
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly Deterministic
+ {
+ .ver 1:2:3:4
+ }
+ .class public auto ansi beforefieldinit Program extends [mscorlib]System.Object
+ {
+ .method public static void Main() cil managed
+ {
+ ENTRYPOINT
+ ldstr "deterministic"
+ pop
+ ret
+ }
+ }
+ """.Replace("ENTRYPOINT", executable ? ".entrypoint" : string.Empty);
+
+ var options = new Options
+ {
+ Deterministic = true,
+ OutputFileName = outputFileName,
+ };
+
+ ImmutableArray firstImage = DocumentCompilerTestHelpers.Compile(source, options);
+ ImmutableArray secondImage = DocumentCompilerTestHelpers.Compile(source, options);
+
+ Assert.Equal(firstImage, secondImage);
+ }
+
+ [Fact]
+ public void ManagedIlasm_DeterministicPdbOutput_IsByteIdentical()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly Deterministic { }
+ .class public auto ansi beforefieldinit Program extends [mscorlib]System.Object
+ {
+ .method public static void Main() cil managed
+ {
+ .line 1 "deterministic.il"
+ ret
+ }
+ }
+ """;
+
+ var options = new Options
+ {
+ Deterministic = true,
+ Pdb = true,
+ };
+
+ ImmutableArray firstPdb = DocumentCompilerTestHelpers.CompileAndGetEmbeddedPortablePdb(source, options);
+ ImmutableArray secondPdb = DocumentCompilerTestHelpers.CompileAndGetEmbeddedPortablePdb(source, options);
+
+ Assert.Equal(firstPdb, secondPdb);
+ }
+
+ [Theory]
+ [InlineData(false)]
+ [InlineData(true)]
+ public void ManagedIlasm_PdbIdGuid_IsNotEmpty(bool deterministic)
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly PdbId { }
+ .class public auto ansi beforefieldinit Program extends [mscorlib]System.Object
+ {
+ .method public static void Main() cil managed
+ {
+ ret
+ }
+ }
+ """;
+
+ var options = new Options
+ {
+ Deterministic = deterministic,
+ Pdb = true,
+ };
+
+ ImmutableArray pdb = DocumentCompilerTestHelpers.CompileAndGetEmbeddedPortablePdb(source, options);
+ using MetadataReaderProvider pdbProvider = MetadataReaderProvider.FromPortablePdbImage(pdb);
+ BlobContentId pdbId = new(pdbProvider.GetMetadataReader().DebugMetadataHeader!.Id);
+
+ Assert.NotEqual(Guid.Empty, pdbId.Guid);
+ }
+
[Fact]
public void SqstringAssemblyName_ParsedCorrectly()
@@ -634,5 +850,90 @@ leave.s DONE
var catchRegion = ehRegions.First(r => r.Kind == ExceptionRegionKind.Catch);
Assert.Equal(HandleKind.TypeDefinition, catchRegion.CatchType.Kind);
}
+
+ [Fact]
+ public void AssemblyReferenceMetadata_EmitsExpectedIdentity()
+ {
+ string source = """
+ .assembly extern Sample.Dependency
+ {
+ .ver 2:5:0:7
+ .locale "en-US"
+ .publickeytoken = (01 23 45 67 89 AB CD EF)
+ .hash = (AA BB CC)
+ }
+ .assembly TestAssembly { }
+ .class public auto ansi beforefieldinit Test
+ {
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var assemblyRef = reader.GetAssemblyReference(MetadataTokens.AssemblyReferenceHandle(1));
+ Assert.Equal("Sample.Dependency", reader.GetString(assemblyRef.Name));
+ Assert.Equal(new Version(2, 5, 0, 7), assemblyRef.Version);
+ Assert.Equal("en-US", reader.GetString(assemblyRef.Culture));
+ Assert.Equal([0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF], reader.GetBlobBytes(assemblyRef.PublicKeyOrToken));
+ Assert.Equal([0xAA, 0xBB, 0xCC], reader.GetBlobBytes(assemblyRef.HashValue));
+ }
+
+ [Fact]
+ public void AssemblyAndAliasedReferenceDeclarations_EmitKeysWildcardsLocalesAndAttributes()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly extern Original.Dependency as Alias
+ {
+ .publicKey = (01 02 03 04)
+ .ver *:2:*:4
+ .locale = (65 00 6E 00)
+ .hash = (AA BB)
+ auto
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ ;
+ }
+ .assembly test
+ {
+ .publicKey = (10 20 30 40)
+ .ver *:5:*:7
+ .locale = (66 00 72 00)
+ .custom instance void [mscorlib]System.CLSCompliantAttribute::.ctor(bool) = (01 00 01 00 00)
+ ;
+ }
+ .class public auto ansi Test
+ {
+ .field public class [Alias]Contoso.External Value
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var assembly = reader.GetAssemblyDefinition();
+ var dependencyHandle = reader.AssemblyReferences
+ .Single(handle => reader.GetString(reader.GetAssemblyReference(handle).Name) == "Original.Dependency");
+ var dependency = reader.GetAssemblyReference(dependencyHandle);
+ var externalType = reader.TypeReferences
+ .Select(reader.GetTypeReference)
+ .Single(type => reader.GetString(type.Name) == "External");
+
+ Assert.Equal(new Version(0, 5, 0, 7), assembly.Version);
+ Assert.Equal("fr", reader.GetString(assembly.Culture));
+ Assert.True(assembly.Flags.HasFlag(AssemblyFlags.PublicKey));
+ Assert.Equal([0x10, 0x20, 0x30, 0x40], reader.GetBlobBytes(assembly.PublicKey));
+ CustomAttributeValue assemblyAttribute = reader
+ .GetCustomAttribute(Assert.Single(reader.GetAssemblyDefinition().GetCustomAttributes()))
+ .DecodeValue(DocumentCompilerTestHelpers.Decoder);
+ Assert.Equal(true, Assert.Single(assemblyAttribute.FixedArguments).Value);
+
+ Assert.Equal(new Version(0, 2, 0, 4), dependency.Version);
+ Assert.Equal("en", reader.GetString(dependency.Culture));
+ Assert.True(dependency.Flags.HasFlag(AssemblyFlags.PublicKey));
+ Assert.Equal([0x01, 0x02, 0x03, 0x04], reader.GetBlobBytes(dependency.PublicKeyOrToken));
+ Assert.Equal([0xAA, 0xBB], reader.GetBlobBytes(dependency.HashValue));
+ Assert.Single(reader.GetCustomAttributes(dependencyHandle));
+ Assert.Equal(dependencyHandle, externalType.ResolutionScope);
+ }
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/CompilerOptionsTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/CompilerOptionsTests.cs
new file mode 100644
index 00000000000000..ef1ba7797b18a6
--- /dev/null
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/CompilerOptionsTests.cs
@@ -0,0 +1,431 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Reflection.Metadata;
+using System.Reflection.Metadata.Ecma335;
+using System.Reflection.PortableExecutable;
+using Xunit;
+using DocumentCompilerTestHelpers = ILAssembler.Tests.DocumentCompilerTestHelpers;
+
+namespace ILAssembler.Tests
+{
+ public class CompilerOptionsTests
+ {
+ [Fact]
+ public void AssemblyNameMetadataVersionAndModuleNameOptions_AreApplied()
+ {
+ string source = """
+ .assembly SourceAssembly { }
+ .class public auto ansi beforefieldinit Test
+ {
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options
+ {
+ AssemblyName = "Overridden.Assembly",
+ MetadataVersion = "vTestMetadata",
+ OutputFileName = "override.dll"
+ });
+ var reader = pe.GetMetadataReader();
+
+ Assert.Equal("Overridden.Assembly", reader.GetString(reader.GetAssemblyDefinition().Name));
+ Assert.Equal("vTestMetadata", reader.MetadataVersion);
+ Assert.Equal("override.dll", reader.GetString(reader.GetModuleDefinition().Name));
+ }
+
+ [Fact]
+ public void PeHeaderAndCorFlagsOptions_AreApplied()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test
+ {
+ .method public static void Main() cil managed
+ {
+ .entrypoint
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options
+ {
+ Machine = Machine.Amd64,
+ FileAlignment = 0x200,
+ ImageBase = 0x140000000,
+ Subsystem = Subsystem.WindowsCui,
+ SubsystemVersion = (6, 1),
+ StackReserve = 0x200000,
+ CorFlags = CorFlags.ILOnly
+ });
+
+ var peHeader = pe.PEHeaders.PEHeader!;
+ Assert.Equal(0x200, peHeader.FileAlignment);
+ Assert.Equal((ulong)0x140000000, peHeader.ImageBase);
+ Assert.Equal(Subsystem.WindowsCui, peHeader.Subsystem);
+ Assert.Equal((ushort)6, peHeader.MajorSubsystemVersion);
+ Assert.Equal((ushort)1, peHeader.MinorSubsystemVersion);
+ Assert.Equal((ulong)0x200000, peHeader.SizeOfStackReserve);
+ Assert.Equal(Machine.Amd64, pe.PEHeaders.CoffHeader.Machine);
+ Assert.Equal(CorFlags.ILOnly, pe.PEHeaders.CorHeader!.Flags);
+ }
+
+ [Fact]
+ public void Prefer32BitOption_AddsPreferredCorFlag()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test
+ {
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options
+ {
+ CorFlags = CorFlags.ILOnly | CorFlags.Requires32Bit,
+ Prefer32Bit = true
+ });
+
+ CorFlags flags = pe.PEHeaders.CorHeader!.Flags;
+ Assert.True(flags.HasFlag(CorFlags.Requires32Bit));
+ Assert.True(flags.HasFlag(CorFlags.Prefers32Bit));
+ }
+
+ [Fact]
+ public void NoAutoInheritOption_SuppressesImplicitObjectBaseType()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test
+ {
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options { NoAutoInherit = true });
+ var reader = pe.GetMetadataReader();
+ var typeDef = reader.TypeDefinitions
+ .Select(reader.GetTypeDefinition)
+ .First(type => reader.GetString(type.Name) == "Test");
+
+ Assert.True(typeDef.BaseType.IsNil);
+ }
+
+ [Fact]
+ public void DebugModeOpt_EmitsDebuggableAttributeBlob()
+ {
+ string source = """
+ .assembly extern System.Runtime { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test
+ {
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options
+ {
+ Debug = true,
+ DebugMode = DebugMode.Opt
+ });
+ var reader = pe.GetMetadataReader();
+
+ var assemblyAttributes = reader.GetAssemblyDefinition().GetCustomAttributes().ToArray();
+ var attributeHandle = Assert.Single(assemblyAttributes);
+ var attribute = reader.GetCustomAttribute(attributeHandle);
+ var constructor = reader.GetMemberReference((MemberReferenceHandle)attribute.Constructor);
+ var attributeType = reader.GetTypeReference((TypeReferenceHandle)constructor.Parent);
+
+ Assert.Equal(".ctor", reader.GetString(constructor.Name));
+ Assert.Equal("DebuggableAttribute", reader.GetString(attributeType.Name));
+ AssertDebuggableAttribute(attribute, expectedMode: 0x03);
+ }
+
+ [Fact]
+ public void DllCharacteristicsOptions_EmitExpectedPeBits()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test
+ {
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options
+ {
+ Machine = Machine.Amd64,
+ AppContainer = true,
+ HighEntropyVA = true,
+ StripReloc = true
+ });
+
+ DllCharacteristics characteristics = pe.PEHeaders.PEHeader!.DllCharacteristics;
+ Assert.True(characteristics.HasFlag(DllCharacteristics.AppContainer));
+ Assert.True(characteristics.HasFlag(DllCharacteristics.HighEntropyVirtualAddressSpace));
+ Assert.True(characteristics.HasFlag(DllCharacteristics.NxCompatible));
+ Assert.True(characteristics.HasFlag(DllCharacteristics.NoSeh));
+ Assert.True(characteristics.HasFlag(DllCharacteristics.TerminalServerAware));
+ Assert.False(characteristics.HasFlag(DllCharacteristics.DynamicBase));
+ }
+
+ [Fact]
+ public void DeterministicOption_ProducesValidImageAndMvid()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test
+ {
+ .method public static void Main() cil managed
+ {
+ .entrypoint
+ ret
+ }
+ }
+ """;
+
+ var image = DocumentCompilerTestHelpers.CompileAndGetImageBytes(source, new Options { Deterministic = true });
+
+ using var pe = new PEReader(image);
+ var reader = pe.GetMetadataReader();
+ Assert.NotEqual(Guid.Empty, reader.GetGuid(reader.GetModuleDefinition().Mvid));
+ Assert.NotEqual(0, pe.PEHeaders.PEHeader!.SizeOfImage);
+ }
+
+ [Fact]
+ public void PdbOption_EmitsEmbeddedPortablePdbWithoutLineDirectives()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test
+ {
+ .method public static void M() cil managed
+ {
+ nop
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options { Pdb = true });
+
+ var debugDirectory = pe.ReadDebugDirectory();
+ var embeddedPdbEntry = debugDirectory.Single(entry => entry.Type == DebugDirectoryEntryType.EmbeddedPortablePdb);
+ var pdbProvider = pe.ReadEmbeddedPortablePdbDebugDirectoryData(embeddedPdbEntry);
+ var pdbReader = pdbProvider.GetMetadataReader();
+
+ Assert.Empty(pdbReader.Documents);
+ Assert.NotEmpty(pdbReader.MethodDebugInformation);
+ }
+
+ [Fact]
+ public void DebugModeImpl_EmitsDebuggableAttributeBlob()
+ {
+ string source = """
+ .assembly extern System.Runtime { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test
+ {
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options
+ {
+ Debug = true,
+ DebugMode = DebugMode.Impl
+ });
+ var reader = pe.GetMetadataReader();
+
+ var assemblyAttributes = reader.GetAssemblyDefinition().GetCustomAttributes().ToArray();
+ var attributeHandle = Assert.Single(assemblyAttributes);
+ var attribute = reader.GetCustomAttribute(attributeHandle);
+ var constructor = reader.GetMemberReference((MemberReferenceHandle)attribute.Constructor);
+ var attributeType = reader.GetTypeReference((TypeReferenceHandle)constructor.Parent);
+
+ Assert.Equal(".ctor", reader.GetString(constructor.Name));
+ Assert.Equal("DebuggableAttribute", reader.GetString(attributeType.Name));
+ AssertDebuggableAttribute(attribute, expectedMode: 0x103);
+ }
+
+ [Fact]
+ public void DebugOption_WithoutExplicitMode_EmitsDefaultDebuggableAttributeBlob()
+ {
+ string source = """
+ .assembly extern System.Runtime { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test
+ {
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options
+ {
+ Debug = true
+ });
+ var reader = pe.GetMetadataReader();
+
+ var assemblyAttributes = reader.GetAssemblyDefinition().GetCustomAttributes().ToArray();
+ var attributeHandle = Assert.Single(assemblyAttributes);
+ var attribute = reader.GetCustomAttribute(attributeHandle);
+ var constructor = reader.GetMemberReference((MemberReferenceHandle)attribute.Constructor);
+ var attributeType = reader.GetTypeReference((TypeReferenceHandle)constructor.Parent);
+
+ Assert.Equal(".ctor", reader.GetString(constructor.Name));
+ Assert.Equal("DebuggableAttribute", reader.GetString(attributeType.Name));
+ AssertDebuggableAttribute(attribute, expectedMode: 0x101);
+ }
+
+ [Fact]
+ public void ValidKeyFile_EmbedsPublicKeyAndSetsAssemblyFlag()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test
+ {
+ }
+ """;
+ string tempDirectory = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString("N"));
+ Directory.CreateDirectory(tempDirectory);
+ string keyFile = Path.Combine(tempDirectory, "test.snk");
+ byte[] expectedKeyBytes = [0x06, 0x02, 0x23, 0x29, 0x47, 0x6B, 0x8D, 0xAF];
+
+ try
+ {
+ File.WriteAllBytes(keyFile, expectedKeyBytes);
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options
+ {
+ KeyFile = keyFile
+ });
+ var reader = pe.GetMetadataReader();
+ var assemblyDefinition = reader.GetAssemblyDefinition();
+
+ Assert.True(assemblyDefinition.Flags.HasFlag(AssemblyFlags.PublicKey));
+ Assert.Equal(expectedKeyBytes, reader.GetBlobBytes(assemblyDefinition.PublicKey));
+ }
+ finally
+ {
+ if (File.Exists(keyFile))
+ {
+ File.Delete(keyFile);
+ }
+
+ if (Directory.Exists(tempDirectory))
+ {
+ Directory.Delete(tempDirectory);
+ }
+ }
+ }
+
+ [Fact]
+ public void InvalidKeyFile_WithErrorTolerantOption_EmitsAssemblyAndReportsDiagnostic()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test
+ {
+ }
+ """;
+ string missingKeyFile = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString("N"), "missing.snk");
+ var sourceText = new SourceText(source, "test.il");
+ var compiler = new DocumentCompiler();
+
+ var (diagnostics, image) = compiler.Compile(
+ sourceText,
+ _ => throw new InvalidOperationException("Unexpected include"),
+ _ => throw new InvalidOperationException("Unexpected resource"),
+ new Options
+ {
+ ErrorTolerant = true,
+ KeyFile = missingKeyFile
+ });
+
+ var diagnostic = Assert.Single(diagnostics, d => d.Id == DiagnosticIds.KeyFileError);
+ Assert.Contains(missingKeyFile, diagnostic.Message);
+ Assert.NotNull(image);
+
+ var blobBuilder = new BlobBuilder();
+ image!.Serialize(blobBuilder);
+ using var pe = new PEReader(blobBuilder.ToImmutableArray());
+ var reader = pe.GetMetadataReader();
+ var assemblyDefinition = reader.GetAssemblyDefinition();
+
+ Assert.False(assemblyDefinition.Flags.HasFlag(AssemblyFlags.PublicKey));
+ Assert.True(assemblyDefinition.PublicKey.IsNil);
+ }
+
+ [Fact]
+ public void ErrorTolerantOption_ReturnsImageForStructuralMetadataError()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class extern public MissingType
+ {
+ .assembly extern MissingAssembly
+ }
+ """;
+ var sourceText = new SourceText(source, "test.il");
+ var compiler = new DocumentCompiler();
+
+ var (strictDiagnostics, strictImage) = compiler.Compile(
+ sourceText,
+ _ => throw new InvalidOperationException("Unexpected include"),
+ _ => throw new InvalidOperationException("Unexpected resource"),
+ new Options());
+ var strictDiagnostic = Assert.Single(strictDiagnostics, d => d.Id == DiagnosticIds.AssemblyNotFound);
+ Assert.Equal(DiagnosticSeverity.Error, strictDiagnostic.Severity);
+ Assert.Null(strictImage);
+
+ var (tolerantDiagnostics, tolerantImage) = compiler.Compile(
+ sourceText,
+ _ => throw new InvalidOperationException("Unexpected include"),
+ _ => throw new InvalidOperationException("Unexpected resource"),
+ new Options { ErrorTolerant = true });
+ var tolerantDiagnostic = Assert.Single(tolerantDiagnostics, d => d.Id == DiagnosticIds.AssemblyNotFound);
+ Assert.Equal(DiagnosticSeverity.Error, tolerantDiagnostic.Severity);
+ Assert.NotNull(tolerantImage);
+
+ var blobBuilder = new BlobBuilder();
+ tolerantImage!.Serialize(blobBuilder);
+ using var pe = new PEReader(blobBuilder.ToImmutableArray());
+ var reader = pe.GetMetadataReader();
+ Assert.True(reader.TypeDefinitions.Count >= 1);
+ }
+
+ [Fact]
+ public void PeDirectives_EmitSpecifiedHeaderValues()
+ {
+ string source = """
+ .assembly test { }
+ .subsystem 0x0002
+ .corflags 0x00000003
+ .file alignment 0x00000400
+ .imagebase 0x10000000
+ .stackreserve 0x00200000
+ .class public auto ansi Test { }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var peHeader = pe.PEHeaders.PEHeader!;
+ var corHeader = pe.PEHeaders.CorHeader!;
+
+ Assert.Equal(Subsystem.WindowsGui, peHeader.Subsystem);
+ Assert.Equal(0x400, peHeader.FileAlignment);
+ Assert.Equal(0x10000000UL, peHeader.ImageBase);
+ Assert.Equal(0x00200000UL, peHeader.SizeOfStackReserve);
+ Assert.Equal(CorFlags.ILOnly | CorFlags.Requires32Bit, corHeader.Flags);
+ }
+
+ private static void AssertDebuggableAttribute(CustomAttribute attribute, int expectedMode)
+ {
+ CustomAttributeValue value =
+ attribute.DecodeValue(DocumentCompilerTestHelpers.Decoder);
+ var argument = Assert.Single(value.FixedArguments);
+ Assert.Equal(expectedMode, argument.Value);
+ Assert.Empty(value.NamedArguments);
+ }
+ }
+}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/CustomAttributeTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/CustomAttributeTests.cs
index 2511c4be007d41..60d063d6518581 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/CustomAttributeTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/CustomAttributeTests.cs
@@ -178,5 +178,642 @@ .method public static void TestMethod() cil managed
Assert.Equal(0x00, blobBytes[3]); // named arg count high
}
+ [Fact]
+ public void CustomAttribute_LocalAttributeConstructor_UsesMethodDefinitionHandleAndBlob()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi sealed beforefieldinit LocalAttribute extends [mscorlib]System.Attribute
+ {
+ .method public hidebysig specialname rtspecialname instance void .ctor(int32 value) cil managed
+ {
+ ldarg.0
+ call instance void [mscorlib]System.Attribute::.ctor()
+ ret
+ }
+ }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .custom instance void LocalAttribute::.ctor(int32) = ( 01 00 2A 00 00 00 00 00 )
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var testTypeHandle = reader.TypeDefinitions
+ .First(handle => reader.GetString(reader.GetTypeDefinition(handle).Name) == "Test");
+ var customAttributeHandle = Assert.Single(reader.GetCustomAttributes(testTypeHandle));
+ var customAttribute = reader.GetCustomAttribute(customAttributeHandle);
+
+ Assert.Equal(HandleKind.MethodDefinition, customAttribute.Constructor.Kind);
+
+ var constructorHandle = (MethodDefinitionHandle)customAttribute.Constructor;
+ var constructor = reader.GetMethodDefinition(constructorHandle);
+ Assert.Equal(".ctor", reader.GetString(constructor.Name));
+
+ var attributeTypeHandle = reader.TypeDefinitions
+ .First(handle => reader.GetTypeDefinition(handle).GetMethods().Contains(constructorHandle));
+ Assert.Equal("LocalAttribute", reader.GetString(reader.GetTypeDefinition(attributeTypeHandle).Name));
+
+ Assert.Equal([0x01, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00], reader.GetBlobBytes(customAttribute.Value));
+ }
+
+ [Fact]
+ public void CustomAttribute_VerbalPrimitiveArrays_EmitExpectedBlob()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi sealed ArrayAttribute extends [mscorlib]System.Attribute
+ {
+ .method public specialname rtspecialname instance void .ctor(
+ float32[] singles,
+ float64[] doubles,
+ float32[] emptySingles,
+ float64[] emptyDoubles,
+ int64[] int64s,
+ int32[] int32s,
+ int16[] int16s,
+ int8[] int8s,
+ uint64[] uint64s,
+ uint32[] uint32s,
+ uint16[] uint16s,
+ uint8[] uint8s,
+ char[] chars,
+ bool[] bools,
+ string[] strings,
+ string[] emptyStrings) cil managed
+ {
+ ldarg.0
+ call instance void [mscorlib]System.Attribute::.ctor()
+ ret
+ }
+ }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .custom instance void ArrayAttribute::.ctor(
+ float32[],
+ float64[],
+ float32[],
+ float64[],
+ int64[],
+ int32[],
+ int16[],
+ int8[],
+ uint64[],
+ uint32[],
+ uint16[],
+ uint8[],
+ char[],
+ bool[],
+ string[],
+ string[]) = {
+ float32[2](1.5 2)
+ float64[2](3.5 4)
+ float32[0]( )
+ float64[0]( )
+ int64[2](5 6)
+ int32[2](7 8)
+ int16[2](9 10)
+ int8[2](11 12)
+ uint64[2](13 14)
+ uint32[2](15 16)
+ uint16[2](17 18)
+ uint8[2](19 20)
+ char[2](65 66)
+ bool[2](true false)
+ string[2]('alpha' nullref)
+ string[0]( )
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var type = reader.TypeDefinitions
+ .Single(handle => reader.GetString(reader.GetTypeDefinition(handle).Name) == "Test");
+ var attribute = reader.GetCustomAttribute(Assert.Single(reader.GetCustomAttributes(type)));
+ CustomAttributeValue value = attribute.DecodeValue(DocumentCompilerTestHelpers.Decoder);
+
+ Assert.Empty(value.NamedArguments);
+ Assert.Equal(16, value.FixedArguments.Length);
+ AssertArrayArgument(value.FixedArguments[0], "float32[]", 1.5f, 2f);
+ AssertArrayArgument(value.FixedArguments[1], "float64[]", 3.5, 4d);
+ AssertArrayArgument(value.FixedArguments[2], "float32[]");
+ AssertArrayArgument(value.FixedArguments[3], "float64[]");
+ AssertArrayArgument(value.FixedArguments[4], "int64[]", 5L, 6L);
+ AssertArrayArgument(value.FixedArguments[5], "int32[]", 7, 8);
+ AssertArrayArgument(value.FixedArguments[6], "int16[]", (short)9, (short)10);
+ AssertArrayArgument(value.FixedArguments[7], "int8[]", (sbyte)11, (sbyte)12);
+ AssertArrayArgument(value.FixedArguments[8], "uint64[]", 13UL, 14UL);
+ AssertArrayArgument(value.FixedArguments[9], "uint32[]", 15U, 16U);
+ AssertArrayArgument(value.FixedArguments[10], "uint16[]", (ushort)17, (ushort)18);
+ AssertArrayArgument(value.FixedArguments[11], "uint8[]", (byte)19, (byte)20);
+ AssertArrayArgument(value.FixedArguments[12], "char[]", 'A', 'B');
+ AssertArrayArgument(value.FixedArguments[13], "bool[]", true, false);
+ AssertArrayArgument(value.FixedArguments[14], "string[]", "alpha", null);
+ AssertArrayArgument(value.FixedArguments[15], "string[]");
+ }
+
+ [Fact]
+ public void CustomAttribute_VerbalScalarArguments_DecodeExpectedValues()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi sealed ScalarAttribute extends [mscorlib]System.Attribute
+ {
+ .method public specialname rtspecialname instance void .ctor(
+ bool booleanValue,
+ int8 int8Value,
+ uint8 uint8Value,
+ int16 int16Value,
+ uint16 uint16Value,
+ int32 int32Value,
+ uint32 uint32Value,
+ int64 int64Value,
+ uint64 uint64Value,
+ char charValue,
+ float32 singleValue,
+ float32 singleBits,
+ float64 doubleValue,
+ float64 doubleBits,
+ string text,
+ class [mscorlib]System.Type typeValue) cil managed
+ {
+ ldarg.0
+ call instance void [mscorlib]System.Attribute::.ctor()
+ ret
+ }
+ }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .custom instance void ScalarAttribute::.ctor(
+ bool,
+ int8,
+ uint8,
+ int16,
+ uint16,
+ int32,
+ uint32,
+ int64,
+ uint64,
+ char,
+ float32,
+ float32,
+ float64,
+ float64,
+ string,
+ class [mscorlib]System.Type) = {
+ bool(true)
+ int8(-1)
+ uint8(255)
+ int16(-2)
+ uint16(65535)
+ int32(-3)
+ uint32(4294967295)
+ int64(-4)
+ uint64(9223372036854775807)
+ char(65)
+ float32(1.5)
+ float32(1065353216)
+ float64(2.5)
+ float64(4607182418800017408)
+ string('text')
+ type(class 'Contoso.Target')
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var type = reader.TypeDefinitions
+ .Single(handle => reader.GetString(reader.GetTypeDefinition(handle).Name) == "Test");
+ CustomAttributeValue value = reader
+ .GetCustomAttribute(Assert.Single(reader.GetCustomAttributes(type)))
+ .DecodeValue(DocumentCompilerTestHelpers.Decoder);
+
+ Assert.Equal(
+ new object?[]
+ {
+ true,
+ (sbyte)-1,
+ (byte)255,
+ (short)-2,
+ (ushort)65535,
+ -3,
+ uint.MaxValue,
+ -4L,
+ 9223372036854775807UL,
+ 'A',
+ 1.5f,
+ 1f,
+ 2.5d,
+ 1d,
+ "text",
+ "Contoso.Target",
+ },
+ value.FixedArguments.Select(argument => argument.Value));
+ Assert.Empty(value.NamedArguments);
+ }
+
+ [Fact]
+ public void CustomAttribute_VerbalNamedArguments_EmitExpectedBlob()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi sealed NamedAttribute extends [mscorlib]System.Attribute
+ {
+ .method public specialname rtspecialname instance void .ctor() cil managed
+ {
+ ldarg.0
+ call instance void [mscorlib]System.Attribute::.ctor()
+ ret
+ }
+ }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .custom instance void NamedAttribute::.ctor() = {
+ field int32 Number = int32(42)
+ property string Message = string('hello')
+ property type Target = type(class 'Contoso.Target')
+ property object Boxed = object(int32(7))
+ property int32[] Values = int32[2](1 2)
+ property enum class 'Contoso.Kind' Kind = int32(3)
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var type = reader.TypeDefinitions
+ .Single(handle => reader.GetString(reader.GetTypeDefinition(handle).Name) == "Test");
+ var attribute = reader.GetCustomAttribute(Assert.Single(reader.GetCustomAttributes(type)));
+ CustomAttributeValue value = attribute.DecodeValue(DocumentCompilerTestHelpers.Decoder);
+
+ Assert.Empty(value.FixedArguments);
+ Assert.Equal(6, value.NamedArguments.Length);
+ AssertNamedArgument(value.NamedArguments[0], CustomAttributeNamedArgumentKind.Field, "Number", "int32", 42);
+ AssertNamedArgument(value.NamedArguments[1], CustomAttributeNamedArgumentKind.Property, "Message", "string", "hello");
+ AssertNamedArgument(value.NamedArguments[2], CustomAttributeNamedArgumentKind.Property, "Target", "System.Type", "Contoso.Target");
+ AssertNamedArgument(value.NamedArguments[3], CustomAttributeNamedArgumentKind.Property, "Boxed", "int32", 7);
+ Assert.Equal("Values", value.NamedArguments[4].Name);
+ Assert.Equal("int32[]", value.NamedArguments[4].Type);
+ AssertArrayValue(value.NamedArguments[4].Value, 1, 2);
+ AssertNamedArgument(value.NamedArguments[5], CustomAttributeNamedArgumentKind.Property, "Kind", "Contoso.Kind", 3);
+ }
+
+ [Fact]
+ public void CustomAttribute_VerbalTypeArgumentFromUnversionedAssemblyReference_EmitsAssemblyQualifiedTypeName()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly extern External.Assembly { }
+ .assembly test { }
+ .class public auto ansi sealed TypeAttribute extends [mscorlib]System.Attribute
+ {
+ .method public specialname rtspecialname instance void .ctor(class [mscorlib]System.Type value) cil managed
+ {
+ ldarg.0
+ call instance void [mscorlib]System.Attribute::.ctor()
+ ret
+ }
+ }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .custom instance void TypeAttribute::.ctor(class [mscorlib]System.Type) = {
+ type([External.Assembly]Contoso.ExternalType)
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var externalAssembly = reader.AssemblyReferences
+ .Select(reader.GetAssemblyReference)
+ .Single(reference => reader.GetString(reference.Name) == "External.Assembly");
+ var testType = reader.TypeDefinitions
+ .Single(handle => reader.GetString(reader.GetTypeDefinition(handle).Name) == "Test");
+ var attribute = reader.GetCustomAttribute(Assert.Single(reader.GetCustomAttributes(testType)));
+
+ Assert.Equal(new Version(0, 0, 0, 0), externalAssembly.Version);
+ CustomAttributeValue value = attribute.DecodeValue(DocumentCompilerTestHelpers.Decoder);
+
+ var argument = Assert.Single(value.FixedArguments);
+ Assert.Equal("System.Type", argument.Type);
+ Assert.Equal(
+ "Contoso.ExternalType, External.Assembly, PublicKeyToken=null",
+ argument.Value);
+ Assert.Empty(value.NamedArguments);
+ }
+
+ [Fact]
+ public void CustomAttribute_VerbalTypeAndObjectArrays_PreserveElementOrder()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly extern External.Assembly { }
+ .assembly test { }
+ .class public auto ansi sealed ArrayAttribute extends [mscorlib]System.Attribute
+ {
+ .method public specialname rtspecialname instance void .ctor(
+ class [mscorlib]System.Type[] types,
+ object[] values) cil managed
+ {
+ ldarg.0
+ call instance void [mscorlib]System.Attribute::.ctor()
+ ret
+ }
+ }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .custom instance void ArrayAttribute::.ctor(class [mscorlib]System.Type[], object[]) = {
+ type[3]([External.Assembly]Contoso.ExternalType nullref class 'Quoted.Type')
+ object[3](int32(1) string('text') object(bool(true)))
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var type = reader.TypeDefinitions
+ .Single(handle => reader.GetString(reader.GetTypeDefinition(handle).Name) == "Test");
+ var attribute = reader.GetCustomAttribute(Assert.Single(reader.GetCustomAttributes(type)));
+ CustomAttributeValue value = attribute.DecodeValue(DocumentCompilerTestHelpers.Decoder);
+
+ Assert.Equal(2, value.FixedArguments.Length);
+ Assert.Equal("System.Type[]", value.FixedArguments[0].Type);
+ AssertArrayValue(
+ value.FixedArguments[0].Value,
+ "Contoso.ExternalType, External.Assembly, PublicKeyToken=null",
+ null,
+ "Quoted.Type");
+
+ Assert.Equal("object[]", value.FixedArguments[1].Type);
+ ImmutableArray> boxedValues =
+ Assert.IsType>>(value.FixedArguments[1].Value);
+ Assert.Collection(
+ boxedValues,
+ item =>
+ {
+ Assert.Equal("int32", item.Type);
+ Assert.Equal(1, item.Value);
+ },
+ item =>
+ {
+ Assert.Equal("string", item.Type);
+ Assert.Equal("text", item.Value);
+ },
+ item =>
+ {
+ Assert.Equal("bool", item.Type);
+ Assert.Equal(true, item.Value);
+ });
+ Assert.Empty(value.NamedArguments);
+ }
+
+ [Fact]
+ public void CustomAttribute_ExplicitOwners_AttachToTypeFieldAndMethod()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .field public int32 Value
+ .method public static void M() cil managed
+ {
+ ret
+ }
+ }
+
+ .custom (Test) instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ .custom (field int32 Test::Value) instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ .custom (method void Test::M()) instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var typeHandle = reader.TypeDefinitions
+ .Single(handle => reader.GetString(reader.GetTypeDefinition(handle).Name) == "Test");
+ var type = reader.GetTypeDefinition(typeHandle);
+ var fieldHandle = Assert.Single(type.GetFields());
+ var methodHandle = Assert.Single(type.GetMethods());
+
+ AssertCustomAttributeBlob(reader, Assert.Single(reader.GetCustomAttributes(typeHandle)));
+ AssertCustomAttributeBlob(reader, Assert.Single(reader.GetCustomAttributes(fieldHandle)));
+ AssertCustomAttributeBlob(reader, Assert.Single(reader.GetCustomAttributes(methodHandle)));
+ }
+
+ [Fact]
+ public void CustomAttribute_NoValueAndExplicitOwnerVerbalForms_DecodeExpectedValues()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi sealed ValueAttribute extends [mscorlib]System.Attribute
+ {
+ .method public specialname rtspecialname instance void .ctor(int32 value) cil managed
+ {
+ ldarg.0
+ call instance void [mscorlib]System.Attribute::.ctor()
+ ret
+ }
+ }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor()
+ }
+ .custom (Test) instance void ValueAttribute::.ctor(int32) = { int32(42) }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var testType = reader.TypeDefinitions
+ .Single(handle => reader.GetString(reader.GetTypeDefinition(handle).Name) == "Test");
+ var attributes = reader.GetCustomAttributes(testType)
+ .Select(reader.GetCustomAttribute)
+ .Select(attribute => attribute.DecodeValue(DocumentCompilerTestHelpers.Decoder))
+ .ToArray();
+
+ Assert.Equal(2, attributes.Length);
+ Assert.Contains(
+ attributes,
+ attribute => attribute.FixedArguments.Length == 0 && attribute.NamedArguments.Length == 0);
+ Assert.Contains(
+ attributes,
+ attribute =>
+ attribute.FixedArguments.Length == 1 &&
+ attribute.FixedArguments[0].Type == "int32" &&
+ Equals(attribute.FixedArguments[0].Value, 42));
+ }
+
+ [Fact]
+ public void CustomAttribute_BoxedByteArray_ReportsErrorAndEmitsDecodableFallback()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi sealed ArrayAttribute extends [mscorlib]System.Attribute
+ {
+ .method public specialname rtspecialname instance void .ctor(object[] values) cil managed
+ {
+ ldarg.0
+ call instance void [mscorlib]System.Attribute::.ctor()
+ ret
+ }
+ }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .custom instance void ArrayAttribute::.ctor(object[]) = {
+ object[1](bytearray(01))
+ }
+ }
+ """;
+
+ var compiler = new DocumentCompiler();
+ var (diagnostics, result) = compiler.Compile(
+ new SourceText(source, "test.il"),
+ _ => { Assert.Fail("Expected no includes"); return default; },
+ _ => { Assert.Fail("Expected no resources"); return default; },
+ new Options { ErrorTolerant = true });
+
+ Assert.Contains(diagnostics, diagnostic => diagnostic.Id == DiagnosticIds.InvalidMetadataToken);
+ Assert.NotNull(result);
+
+ var image = new BlobBuilder();
+ result!.Serialize(image);
+ using var pe = new PEReader(image.ToImmutableArray());
+ var reader = pe.GetMetadataReader();
+ var testType = reader.TypeDefinitions
+ .Single(handle => reader.GetString(reader.GetTypeDefinition(handle).Name) == "Test");
+ CustomAttributeValue attribute = reader
+ .GetCustomAttribute(Assert.Single(reader.GetCustomAttributes(testType)))
+ .DecodeValue(DocumentCompilerTestHelpers.Decoder);
+ var values = Assert.IsType>>(
+ Assert.Single(attribute.FixedArguments).Value);
+
+ var value = Assert.Single(values);
+ Assert.Equal("string", value.Type);
+ Assert.Null(value.Value);
+ }
+
+ [Fact]
+ public void AssemblyCustomAttribute_PreservesConstructorAndBlob()
+ {
+ string source = """
+ .assembly extern System.Runtime { }
+ .assembly TestAssembly
+ {
+ .custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
+ }
+ .class public auto ansi beforefieldinit Test
+ {
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var customAttributeHandle = Assert.Single(reader.GetAssemblyDefinition().GetCustomAttributes());
+ var customAttribute = reader.GetCustomAttribute(customAttributeHandle);
+ var constructor = reader.GetMemberReference((MemberReferenceHandle)customAttribute.Constructor);
+ var attributeType = reader.GetTypeReference((TypeReferenceHandle)constructor.Parent);
+
+ Assert.Equal(".ctor", reader.GetString(constructor.Name));
+ Assert.Equal("CompilationRelaxationsAttribute", reader.GetString(attributeType.Name));
+ Assert.Equal([0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00], reader.GetBlobBytes(customAttribute.Value));
+ }
+
+ private static void AssertArrayArgument(
+ CustomAttributeTypedArgument argument,
+ string expectedType,
+ params object?[] expectedValues)
+ {
+ Assert.Equal(expectedType, argument.Type);
+ AssertArrayValue(argument.Value, expectedValues);
+ }
+
+ private static void AssertArrayValue(object? value, params object?[] expectedValues)
+ {
+ ImmutableArray> values =
+ Assert.IsType>>(value);
+ Assert.Equal(expectedValues, values.Select(item => item.Value));
+ }
+
+ private static void AssertNamedArgument(
+ CustomAttributeNamedArgument argument,
+ CustomAttributeNamedArgumentKind kind,
+ string name,
+ string type,
+ object? value)
+ {
+ Assert.Equal(kind, argument.Kind);
+ Assert.Equal(name, argument.Name);
+ Assert.Equal(type, argument.Type);
+ Assert.Equal(value, argument.Value);
+ }
+
+ private static void AssertCustomAttributeBlob(MetadataReader reader, CustomAttributeHandle handle)
+ {
+ var attribute = reader.GetCustomAttribute(handle);
+ Assert.Equal(
+ [0x01, 0x00, 0x00, 0x00],
+ reader.GetBlobBytes(attribute.Value));
+ }
+
+ [Fact]
+ public void CustomAttribute_ObjectArrayWithNestedObjectWrapper_DecodesProperly()
+ {
+ // Regression test: object(object(...)) elements in object[] were previously encoded with
+ // a TaggedObject (0x51) type code, which caused BadImageFormatException when decoding.
+ // The fix ensures object(...) wrappers are unwrapped to the concrete inner type.
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi sealed ObjArrAttribute extends [mscorlib]System.Attribute
+ {
+ .method public specialname rtspecialname instance void .ctor(object[] values) cil managed
+ {
+ ldarg.0
+ call instance void [mscorlib]System.Attribute::.ctor()
+ ret
+ }
+ }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .custom instance void ObjArrAttribute::.ctor(object[]) = {
+ object[2](object(bool(true)) object(int32(42)))
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var testType = reader.TypeDefinitions
+ .Single(handle => reader.GetString(reader.GetTypeDefinition(handle).Name) == "Test");
+ var attribute = reader.GetCustomAttribute(Assert.Single(reader.GetCustomAttributes(testType)));
+ CustomAttributeValue value = attribute.DecodeValue(DocumentCompilerTestHelpers.Decoder);
+
+ Assert.Single(value.FixedArguments);
+ ImmutableArray> elements =
+ Assert.IsType>>(value.FixedArguments[0].Value);
+ Assert.Collection(
+ elements,
+ item =>
+ {
+ Assert.Equal("bool", item.Type);
+ Assert.Equal(true, item.Value);
+ },
+ item =>
+ {
+ Assert.Equal("int32", item.Type);
+ Assert.Equal(42, item.Value);
+ });
+ }
+
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/DataTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/DataTests.cs
index 7cbc689ac330b9..59f867a02114f2 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/DataTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/DataTests.cs
@@ -11,6 +11,7 @@
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using System.Reflection.PortableExecutable;
+using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using Internal.IL;
@@ -21,6 +22,138 @@ namespace ILAssembler.Tests
{
public class DataTests
{
+ [Fact]
+ public void DataItems_EmitExpectedTypedBytesAndRepeatCounts()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+
+ .data D_STRING = char*("Hi")
+ .data D_BYTES = bytearray(01 02 03 04)
+ .data D_BRACES = { int32(0x11223344), int16(0x5566), int8(0x77) }
+ .data D_REPEAT = int32(7)[3]
+ .data D_F32 = float32(1.5)
+ .data D_F64 = float64(2.25)
+ .data D_ZERO8 = int8[3]
+ .data D_ZERO16 = int16[2]
+ .data D_ZERO32 = int32[2]
+ .data D_ZERO64 = int64[2]
+ .data D_ZEROF32 = float32[2]
+ .data D_ZEROF64 = float64[2]
+
+ .class public explicit ansi sealed DataHolder extends [mscorlib]System.ValueType
+ {
+ .size 64
+ .field [0] public static int8 StringData at D_STRING
+ .field [4] public static int8 ByteData at D_BYTES
+ .field [8] public static int8 BracedData at D_BRACES
+ .field [16] public static int8 RepeatedData at D_REPEAT
+ .field [28] public static int8 Float32Data at D_F32
+ .field [32] public static int8 Float64Data at D_F64
+ .field [40] public static int8 Zero8Data at D_ZERO8
+ .field [44] public static int8 Zero16Data at D_ZERO16
+ .field [48] public static int8 Zero32Data at D_ZERO32
+ .field [52] public static int8 Zero64Data at D_ZERO64
+ .field [56] public static int8 ZeroFloat32Data at D_ZEROF32
+ .field [60] public static int8 ZeroFloat64Data at D_ZEROF64
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var fields = reader.FieldDefinitions
+ .Select(reader.GetFieldDefinition)
+ .ToDictionary(field => reader.GetString(field.Name));
+
+ Assert.Equal(
+ [0x48, 0x00, 0x69, 0x00],
+ ReadData(pe, fields["StringData"], 4));
+ Assert.Equal(
+ [0x01, 0x02, 0x03, 0x04],
+ ReadData(pe, fields["ByteData"], 4));
+ Assert.Equal(
+ [0x44, 0x33, 0x22, 0x11, 0x66, 0x55, 0x77],
+ ReadData(pe, fields["BracedData"], 7));
+
+ byte[] repeatedData = ReadData(pe, fields["RepeatedData"], 12);
+ Assert.Equal(new[] { 7, 7, 7 }, MemoryMarshal.Cast(repeatedData).ToArray());
+ Assert.Equal(1.5f, BitConverter.ToSingle(ReadData(pe, fields["Float32Data"], 4)));
+ Assert.Equal(2.25, BitConverter.ToDouble(ReadData(pe, fields["Float64Data"], 8)));
+
+ Assert.All(ReadData(pe, fields["Zero8Data"], 3), value => Assert.Equal(0, value));
+ Assert.All(ReadData(pe, fields["Zero16Data"], 4), value => Assert.Equal(0, value));
+ Assert.All(ReadData(pe, fields["Zero32Data"], 8), value => Assert.Equal(0, value));
+ Assert.All(ReadData(pe, fields["Zero64Data"], 16), value => Assert.Equal(0, value));
+ Assert.All(ReadData(pe, fields["ZeroFloat32Data"], 8), value => Assert.Equal(0, value));
+ Assert.All(ReadData(pe, fields["ZeroFloat64Data"], 16), value => Assert.Equal(0, value));
+ }
+
+ [Fact]
+ public void ClassScopedDataDirective_EmitsFieldRvaValue()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public explicit ansi sealed DataHolder extends [mscorlib]System.ValueType
+ {
+ .size 4
+ .data ClassData = int32(1234)
+ .field [0] public static int32 Value at ClassData
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var field = reader.GetFieldDefinition(Assert.Single(reader.FieldDefinitions));
+
+ Assert.Equal(
+ 1234,
+ BitConverter.ToInt32(
+ pe.GetSectionData(field.GetRelativeVirtualAddress()).GetContent().AsSpan(0, sizeof(int))));
+ }
+
+ [Fact]
+ public void DataDirectives_EmitExpectedMappedFieldDataBytes()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .data IntData = int32(0x12345678)
+ .data ByteData = bytearray (AA BB CC DD)
+ .data FloatData = float32(3.5)
+
+ .class public explicit ansi sealed beforefieldinit DataHolder extends [mscorlib]System.ValueType
+ {
+ .size 16
+ .field [0] public static int32 IntField at IntData
+ .field [4] public static int32 ByteField at ByteData
+ .field [8] public static float32 FloatField at FloatData
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var type = reader.TypeDefinitions
+ .Select(reader.GetTypeDefinition)
+ .First(definition => reader.GetString(definition.Name) == "DataHolder");
+ var fields = new Dictionary();
+
+ foreach (var fieldHandle in type.GetFields())
+ {
+ var field = reader.GetFieldDefinition(fieldHandle);
+ fields.Add(reader.GetString(field.Name), field);
+ }
+
+ int intRva = fields["IntField"].GetRelativeVirtualAddress();
+ int byteRva = fields["ByteField"].GetRelativeVirtualAddress();
+ int floatRva = fields["FloatField"].GetRelativeVirtualAddress();
+
+ Assert.Equal([0x78, 0x56, 0x34, 0x12], pe.GetSectionData(intRva).GetContent().Take(4).ToArray());
+ Assert.Equal([0xAA, 0xBB, 0xCC, 0xDD], pe.GetSectionData(byteRva).GetContent().Take(4).ToArray());
+ Assert.Equal([0x00, 0x00, 0x60, 0x40], pe.GetSectionData(floatRva).GetContent().Take(4).ToArray());
+ }
+
[Fact]
public void Diagnostic_InvalidMetadataToken()
{
@@ -42,5 +175,32 @@ .assembly extern ForwardedAssembly
Assert.Equal(DiagnosticIds.InvalidMetadataToken, error.Id);
Assert.Equal(DiagnosticSeverity.Error, error.Severity);
}
+
+ [Fact]
+ public void Float64Data_IntegerLiteral_PreservesValue()
+ {
+ string source = """
+ .assembly test { }
+ .data D = float64(4503599627370496.)
+ .class public auto ansi Test
+ {
+ .field public static float64 Value at D
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
+ ReadOnlySpan data = pe.GetSectionData(field.GetRelativeVirtualAddress()).GetContent().AsSpan(0, sizeof(double));
+
+ Assert.Equal(4503599627370496d, BitConverter.Int64BitsToDouble(BinaryPrimitives.ReadInt64LittleEndian(data)));
+ }
+
+ private static byte[] ReadData(PEReader pe, FieldDefinition field, int length)
+ {
+ int rva = field.GetRelativeVirtualAddress();
+ Assert.NotEqual(0, rva);
+ return pe.GetSectionData(rva).GetContent().AsSpan(0, length).ToArray();
+ }
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/DocumentCompilerTestHelpers.cs b/src/tools/ilasm/tests/ILAssembler.Tests/DocumentCompilerTestHelpers.cs
index 9b61bd9a7ed5e5..9b915d2e25d864 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/DocumentCompilerTestHelpers.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/DocumentCompilerTestHelpers.cs
@@ -5,11 +5,13 @@
using System.Buffers.Binary;
using System.Collections.Generic;
using System.Collections.Immutable;
+using System.IO;
+using System.IO.Compression;
using System.Linq;
-using System.Reflection;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using System.Reflection.PortableExecutable;
+using System.Text;
using Internal.IL;
using Xunit;
@@ -17,7 +19,43 @@ namespace ILAssembler.Tests
{
internal static class DocumentCompilerTestHelpers
{
+ internal static MetadataStringDecoder Decoder { get; } = new();
+
internal static PEReader CompileAndGetReader(string source, Options options)
+ {
+ var sourceText = new SourceText(source, "test.il");
+ return CompileAndGetReader(sourceText, _ =>
+ {
+ Assert.Fail("Expected no includes");
+ return default;
+ }, _ =>
+ {
+ Assert.Fail("Expected no resources");
+ return default;
+ }, options);
+ }
+
+ internal static PEReader CompileAndGetReader(SourceText sourceText, Func includedDocumentLoader, Options options)
+ {
+ return CompileAndGetReader(sourceText, includedDocumentLoader, _ =>
+ {
+ Assert.Fail("Expected no resources");
+ return default;
+ }, options);
+ }
+
+ internal static PEReader CompileAndGetReader(SourceText sourceText, Func includedDocumentLoader, Func resourceLocator, Options options)
+ {
+ var documentCompiler = new DocumentCompiler();
+ var (diagnostics, result) = documentCompiler.Compile(sourceText, includedDocumentLoader, resourceLocator, options);
+ Assert.Empty(diagnostics);
+ Assert.NotNull(result);
+ var blobBuilder = new BlobBuilder();
+ result!.Serialize(blobBuilder);
+ return new PEReader(blobBuilder.ToImmutableArray());
+ }
+
+ internal static ImmutableArray Compile(string source, Options options)
{
var sourceText = new SourceText(source, "test.il");
var documentCompiler = new DocumentCompiler();
@@ -30,7 +68,32 @@ internal static PEReader CompileAndGetReader(string source, Options options)
Assert.NotNull(result);
var blobBuilder = new BlobBuilder();
result!.Serialize(blobBuilder);
- return new PEReader(blobBuilder.ToImmutableArray());
+ return blobBuilder.ToImmutableArray();
+ }
+
+ internal static ImmutableArray CompileAndGetImageBytes(string source, Options options)
+ {
+ return Compile(source, options);
+ }
+
+ internal static ImmutableArray CompileAndGetEmbeddedPortablePdb(string source, Options options)
+ {
+ using PEReader pe = CompileAndGetReader(source, options);
+ DebugDirectoryEntry embeddedPdbEntry = pe.ReadDebugDirectory()
+ .Single(entry => entry.Type == DebugDirectoryEntryType.EmbeddedPortablePdb);
+ ImmutableArray embeddedPdb = pe.GetSectionData(embeddedPdbEntry.DataRelativeVirtualAddress)
+ .GetContent(0, embeddedPdbEntry.DataSize);
+
+ const int EmbeddedPdbHeaderSize = 8;
+ ReadOnlySpan embeddedPdbBytes = embeddedPdb.AsSpan();
+ int uncompressedSize = BinaryPrimitives.ReadInt32LittleEndian(embeddedPdbBytes.Slice(sizeof(int)));
+ using MemoryStream compressedStream = new(embeddedPdbBytes.Slice(EmbeddedPdbHeaderSize).ToArray());
+ using DeflateStream deflateStream = new(compressedStream, CompressionMode.Decompress);
+ using MemoryStream pdbStream = new(uncompressedSize);
+ deflateStream.CopyTo(pdbStream);
+ Assert.Equal(uncompressedSize, pdbStream.Length);
+
+ return ImmutableArray.CreateRange(pdbStream.ToArray());
}
internal static int GetFirstTokenOperand(PEReader pe, MetadataReader reader, string methodName, ILOpcode targetOpcode)
@@ -73,6 +136,48 @@ internal static int GetFirstTokenOperand(PEReader pe, MetadataReader reader, str
return 0;
}
+ internal static ImmutableArray GetTokenOperands(
+ PEReader pe,
+ MetadataReader reader,
+ string methodName,
+ ILOpcode targetOpcode)
+ {
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .First(definition => reader.GetString(definition.Name) == methodName);
+ byte[] il = pe.GetMethodBody(method.RelativeVirtualAddress).GetILBytes()!;
+ var operands = ImmutableArray.CreateBuilder();
+
+ int offset = 0;
+ while (offset < il.Length)
+ {
+ var opcode = (ILOpcode)il[offset];
+ int operandStart = offset + 1;
+ if (opcode == ILOpcode.prefix1)
+ {
+ opcode = (ILOpcode)(0x100 + il[offset + 1]);
+ operandStart = offset + 2;
+ }
+
+ if (opcode == targetOpcode)
+ {
+ operands.Add(BinaryPrimitives.ReadInt32LittleEndian(il.AsSpan(operandStart)));
+ }
+
+ if (opcode == ILOpcode.switch_)
+ {
+ uint count = BinaryPrimitives.ReadUInt32LittleEndian(il.AsSpan(operandStart));
+ offset = operandStart + 4 + checked((int)count * 4);
+ }
+ else
+ {
+ offset += opcode.GetSize();
+ }
+ }
+
+ return operands.ToImmutable();
+ }
+
internal static void AssertTypeDefToken(MetadataReader reader, int token, string expectedName)
{
var handle = MetadataTokens.EntityHandle(token);
@@ -123,5 +228,162 @@ internal static ImmutableArray CompileAndGetDiagnostics(string sourc
}, _ => { Assert.Fail("Expected no resources"); return default; }, options);
return diagnostics;
}
+
+ internal sealed class MetadataStringDecoder :
+ ISignatureTypeProvider,
+ ICustomAttributeTypeProvider
+ {
+ public string GetArrayType(string elementType, ArrayShape shape)
+ {
+ var builder = new StringBuilder(elementType);
+ builder.Append('[');
+ for (int i = 0; i < shape.Rank; i++)
+ {
+ if (i > 0)
+ {
+ builder.Append(',');
+ }
+
+ int lowerBound = i < shape.LowerBounds.Length ? shape.LowerBounds[i] : 0;
+ if (i < shape.LowerBounds.Length)
+ {
+ builder.Append(lowerBound);
+ }
+
+ builder.Append("...");
+ if (i < shape.Sizes.Length)
+ {
+ builder.Append(lowerBound + shape.Sizes[i] - 1);
+ }
+ }
+
+ builder.Append(']');
+ return builder.ToString();
+ }
+
+ public string GetByReferenceType(string elementType) => elementType + "&";
+
+ public string GetFunctionPointerType(MethodSignature signature)
+ {
+ var builder = new StringBuilder("method ");
+ builder.Append(signature.ReturnType);
+ builder.Append(" *(");
+ for (int i = 0; i < signature.ParameterTypes.Length; i++)
+ {
+ if (i > 0)
+ {
+ builder.Append(", ");
+ }
+
+ if (i == signature.RequiredParameterCount)
+ {
+ builder.Append("..., ");
+ }
+
+ builder.Append(signature.ParameterTypes[i]);
+ }
+
+ builder.Append(')');
+ return builder.ToString();
+ }
+
+ public string GetGenericInstantiation(string genericType, ImmutableArray typeArguments) =>
+ genericType + "<" + string.Join(",", typeArguments) + ">";
+
+ public string GetGenericMethodParameter(object? genericContext, int index) => "!!" + index;
+
+ public string GetGenericTypeParameter(object? genericContext, int index) => "!" + index;
+
+ public string GetModifiedType(string modifier, string unmodifiedType, bool isRequired) =>
+ unmodifiedType + (isRequired ? " modreq(" : " modopt(") + modifier + ")";
+
+ public string GetPinnedType(string elementType) => elementType + " pinned";
+
+ public string GetPointerType(string elementType) => elementType + "*";
+
+ public string GetPrimitiveType(PrimitiveTypeCode typeCode) => typeCode switch
+ {
+ PrimitiveTypeCode.Boolean => "bool",
+ PrimitiveTypeCode.Byte => "uint8",
+ PrimitiveTypeCode.Char => "char",
+ PrimitiveTypeCode.Double => "float64",
+ PrimitiveTypeCode.Int16 => "int16",
+ PrimitiveTypeCode.Int32 => "int32",
+ PrimitiveTypeCode.Int64 => "int64",
+ PrimitiveTypeCode.IntPtr => "native int",
+ PrimitiveTypeCode.Object => "object",
+ PrimitiveTypeCode.SByte => "int8",
+ PrimitiveTypeCode.Single => "float32",
+ PrimitiveTypeCode.String => "string",
+ PrimitiveTypeCode.TypedReference => "typedref",
+ PrimitiveTypeCode.UInt16 => "uint16",
+ PrimitiveTypeCode.UInt32 => "uint32",
+ PrimitiveTypeCode.UInt64 => "uint64",
+ PrimitiveTypeCode.UIntPtr => "native uint",
+ PrimitiveTypeCode.Void => "void",
+ _ => throw new ArgumentOutOfRangeException(nameof(typeCode)),
+ };
+
+ public string GetSZArrayType(string elementType) => elementType + "[]";
+
+ public string GetSystemType() => "System.Type";
+
+ public string GetTypeFromDefinition(
+ MetadataReader reader,
+ TypeDefinitionHandle handle,
+ byte rawTypeKind)
+ {
+ TypeDefinition definition = reader.GetTypeDefinition(handle);
+ string name = definition.Namespace.IsNil
+ ? reader.GetString(definition.Name)
+ : reader.GetString(definition.Namespace) + "." + reader.GetString(definition.Name);
+
+ TypeDefinitionHandle declaringType = definition.GetDeclaringType();
+ return declaringType.IsNil
+ ? name
+ : GetTypeFromDefinition(reader, declaringType, 0) + "/" + reader.GetString(definition.Name);
+ }
+
+ public string GetTypeFromReference(
+ MetadataReader reader,
+ TypeReferenceHandle handle,
+ byte rawTypeKind)
+ {
+ TypeReference reference = reader.GetTypeReference(handle);
+ string name = reference.Namespace.IsNil
+ ? reader.GetString(reference.Name)
+ : reader.GetString(reference.Namespace) + "." + reader.GetString(reference.Name);
+
+ if (name == "System.Type")
+ {
+ return name;
+ }
+
+ return reference.ResolutionScope.Kind switch
+ {
+ HandleKind.AssemblyReference =>
+ "[" + reader.GetString(reader.GetAssemblyReference((AssemblyReferenceHandle)reference.ResolutionScope).Name) + "]" + name,
+ HandleKind.ModuleReference =>
+ "[.module " + reader.GetString(reader.GetModuleReference((ModuleReferenceHandle)reference.ResolutionScope).Name) + "]" + name,
+ HandleKind.TypeReference =>
+ GetTypeFromReference(reader, (TypeReferenceHandle)reference.ResolutionScope, 0) + "/" + name,
+ _ => name,
+ };
+ }
+
+ public string GetTypeFromSerializedName(string name) => name;
+
+ public string GetTypeFromSpecification(
+ MetadataReader reader,
+ object? genericContext,
+ TypeSpecificationHandle handle,
+ byte rawTypeKind) =>
+ reader.GetTypeSpecification(handle).DecodeSignature(this, genericContext);
+
+ public PrimitiveTypeCode GetUnderlyingEnumType(string type) => PrimitiveTypeCode.Int32;
+
+ public bool IsSystemType(string type) =>
+ type is "System.Type" or "[mscorlib]System.Type" or "[System.Runtime]System.Type";
+ }
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/DocumentCompilerTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/DocumentCompilerTests.cs
new file mode 100644
index 00000000000000..9ccf33c124cf93
--- /dev/null
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/DocumentCompilerTests.cs
@@ -0,0 +1,59 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using System.Collections.Immutable;
+using System.Linq;
+using System.Reflection.Metadata;
+using System.Reflection.PortableExecutable;
+using Xunit;
+
+namespace ILAssembler.Tests
+{
+ public class DocumentCompilerTests
+ {
+ [Fact]
+ public void ParserDiagnosticInLaterDocument_UsesDocumentPath_AndErrorTolerantStillEmitsImage()
+ {
+ var documents = ImmutableArray.Create(
+ new SourceText("""
+ .assembly test { }
+ .class public auto ansi beforefieldinit ValidFromDoc1
+ {
+ }
+ """, "valid.il"),
+ new SourceText("""
+ .class public auto ansi beforefieldinit Broken
+ {
+ .method public static void M(int32 int32 int32) cil managed
+ {
+ ret
+ }
+ }
+ """, "broken.il"));
+
+ var compiler = new DocumentCompiler();
+ var (diagnostics, image) = compiler.Compile(
+ documents,
+ _ => throw new InvalidOperationException("Unexpected include"),
+ _ => throw new InvalidOperationException("Unexpected resource"),
+ new Options { ErrorTolerant = true });
+ var parserDiagnostic = Assert.Single(diagnostics.Where(diagnostic => diagnostic.Id == "Parser"));
+
+ Assert.Equal("broken.il", parserDiagnostic.Location.Source.Path);
+ Assert.True(parserDiagnostic.Location.Span.Start >= 0);
+ Assert.True(parserDiagnostic.Location.Span.Length > 0);
+ Assert.NotNull(image);
+
+ var imageBuilder = new BlobBuilder();
+ image!.Serialize(imageBuilder);
+ using var pe = new PEReader(imageBuilder.ToImmutableArray());
+ var reader = pe.GetMetadataReader();
+ var typeNames = reader.TypeDefinitions
+ .Select(handle => reader.GetString(reader.GetTypeDefinition(handle).Name))
+ .ToArray();
+
+ Assert.Contains("ValidFromDoc1", typeNames);
+ }
+ }
+}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/EventTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/EventTests.cs
index 4e897e6d1fd3ae..6ea3a47b34bece 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/EventTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/EventTests.cs
@@ -68,5 +68,111 @@ .event MyDelegate MyEvent
var attrs = reader.GetCustomAttributes(eventHandle);
Assert.True(attrs.Count >= 1, $"Event should have at least 1 custom attribute, got {attrs.Count}");
}
+
+ [Fact]
+ public void EventWithRaiseAccessor_EmitsAccessorMetadata()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi MyDelegate extends [mscorlib]System.MulticastDelegate
+ {
+ .method public specialname rtspecialname instance void .ctor(object 'object', native int 'method') runtime managed
+ {
+ }
+ .method public virtual instance void Invoke() runtime managed
+ {
+ }
+ }
+ .class public auto ansi MyClass extends [mscorlib]System.Object
+ {
+ .method public hidebysig specialname instance void add_MyEvent(class MyDelegate value) cil managed
+ {
+ ret
+ }
+ .method public hidebysig specialname instance void remove_MyEvent(class MyDelegate value) cil managed
+ {
+ ret
+ }
+ .method public hidebysig specialname instance void raise_MyEvent() cil managed
+ {
+ ret
+ }
+ .event MyDelegate MyEvent
+ {
+ .addon instance void MyClass::add_MyEvent(class MyDelegate)
+ .removeon instance void MyClass::remove_MyEvent(class MyDelegate)
+ .fire instance void MyClass::raise_MyEvent()
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var eventHandle = reader.EventDefinitions.Single();
+ var @event = reader.GetEventDefinition(eventHandle);
+ var accessors = @event.GetAccessors();
+ string eventTypeName = @event.Type.Kind switch
+ {
+ HandleKind.TypeDefinition => reader.GetString(reader.GetTypeDefinition((TypeDefinitionHandle)@event.Type).Name),
+ HandleKind.TypeReference => reader.GetString(reader.GetTypeReference((TypeReferenceHandle)@event.Type).Name),
+ _ => throw new InvalidOperationException($"Unexpected event type handle kind '{@event.Type.Kind}'."),
+ };
+
+ Assert.Equal("MyEvent", reader.GetString(@event.Name));
+ Assert.Equal("MyDelegate", eventTypeName);
+ Assert.Equal("add_MyEvent", reader.GetString(reader.GetMethodDefinition(accessors.Adder).Name));
+ Assert.Equal("remove_MyEvent", reader.GetString(reader.GetMethodDefinition(accessors.Remover).Name));
+ Assert.Equal("raise_MyEvent", reader.GetString(reader.GetMethodDefinition(accessors.Raiser).Name));
+ Assert.Equal(3, reader.GetTableRowCount(TableIndex.MethodSemantics));
+ }
+
+ [Fact]
+ public void EventAttributesOtherAccessorAndCustomAttribute_EmitMetadata()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi MyDelegate extends [mscorlib]System.MulticastDelegate
+ {
+ .method public specialname rtspecialname instance void .ctor(object 'object', native int 'method') runtime managed { }
+ .method public virtual instance void Invoke() runtime managed { }
+ }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public specialname instance void add_Changed(class MyDelegate value) cil managed { ret }
+ .method public specialname instance void remove_Changed(class MyDelegate value) cil managed { ret }
+ .method public specialname instance void raise_Changed() cil managed { ret }
+ .method public specialname instance void other_Changed() cil managed { ret }
+
+ .event specialname rtspecialname MyDelegate Changed
+ {
+ .addon instance void Test::add_Changed(class MyDelegate)
+ .removeon instance void Test::remove_Changed(class MyDelegate)
+ .fire instance void Test::raise_Changed()
+ .other instance void Test::other_Changed()
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var eventHandle = Assert.Single(reader.EventDefinitions);
+ var @event = reader.GetEventDefinition(eventHandle);
+ var accessors = @event.GetAccessors();
+
+ Assert.True(@event.Attributes.HasFlag(EventAttributes.SpecialName));
+ Assert.Equal("add_Changed", reader.GetString(reader.GetMethodDefinition(accessors.Adder).Name));
+ Assert.Equal("remove_Changed", reader.GetString(reader.GetMethodDefinition(accessors.Remover).Name));
+ Assert.Equal("raise_Changed", reader.GetString(reader.GetMethodDefinition(accessors.Raiser).Name));
+ Assert.Equal(
+ "other_Changed",
+ reader.GetString(reader.GetMethodDefinition(Assert.Single(accessors.Others)).Name));
+ Assert.Equal(
+ [0x01, 0x00, 0x00, 0x00],
+ reader.GetBlobBytes(reader.GetCustomAttribute(Assert.Single(reader.GetCustomAttributes(eventHandle))).Value));
+ }
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/ExceptionHandlingTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/ExceptionHandlingTests.cs
index 0096d504f27497..892136bf565412 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/ExceptionHandlingTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/ExceptionHandlingTests.cs
@@ -196,5 +196,250 @@ leave.s IL_5 // 1-2
Assert.True(methodDef.RelativeVirtualAddress != 0);
}
+ [Fact]
+ public void OffsetBasedCatchRegion_EmitsExactExceptionRegionBounds()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void TestMethod() cil managed
+ {
+ .maxstack 1
+ .try 0 to 5 catch [mscorlib]System.Exception handler 5 to 8
+ nop
+ nop
+ nop
+ leave.s IL_8
+ IL_5:
+ pop
+ leave.s IL_8
+ IL_8:
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .First(definition => reader.GetString(definition.Name) == "TestMethod");
+ var body = pe.GetMethodBody(method.RelativeVirtualAddress);
+ var region = Assert.Single(body.ExceptionRegions);
+
+ Assert.Equal(ExceptionRegionKind.Catch, region.Kind);
+ Assert.Equal(0, region.TryOffset);
+ Assert.Equal(5, region.TryLength);
+ Assert.Equal(5, region.HandlerOffset);
+ Assert.Equal(3, region.HandlerLength);
+ Assert.Equal("Exception", reader.GetString(reader.GetTypeReference((TypeReferenceHandle)region.CatchType).Name));
+ }
+
+ [Fact]
+ public void OffsetBasedFinallyRegion_EmitsExactExceptionRegionBounds()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void TestMethod() cil managed
+ {
+ .maxstack 1
+ .try 0 to 3 finally handler 3 to 4
+ nop
+ leave.s IL_4
+ IL_3:
+ endfinally
+ IL_4:
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .First(definition => reader.GetString(definition.Name) == "TestMethod");
+ var body = pe.GetMethodBody(method.RelativeVirtualAddress);
+ var region = Assert.Single(body.ExceptionRegions);
+
+ Assert.Equal(ExceptionRegionKind.Finally, region.Kind);
+ Assert.Equal(0, region.TryOffset);
+ Assert.Equal(3, region.TryLength);
+ Assert.Equal(3, region.HandlerOffset);
+ Assert.Equal(1, region.HandlerLength);
+ }
+
+ [Fact]
+ public void FilterHandler_EmitsFilterExceptionRegion()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void TestMethod() cil managed
+ {
+ .maxstack 1
+ .try
+ {
+ ldnull
+ throw
+ }
+ filter
+ {
+ pop
+ ldc.i4.1
+ endfilter
+ }
+ {
+ pop
+ leave.s DONE
+ }
+ DONE:
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .Single(definition => reader.GetString(definition.Name) == "TestMethod");
+ var body = pe.GetMethodBody(method.RelativeVirtualAddress);
+ var region = Assert.Single(body.ExceptionRegions);
+
+ Assert.Equal(ExceptionRegionKind.Filter, region.Kind);
+ Assert.True(region.TryLength > 0);
+ Assert.True(region.FilterOffset >= 0);
+ Assert.True(region.HandlerOffset >= 0);
+ Assert.True(region.HandlerLength > 0);
+ }
+
+ [Fact]
+ public void FaultHandler_EmitsFaultExceptionRegion()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void TestMethod() cil managed
+ {
+ .maxstack 1
+ .try
+ {
+ nop
+ leave.s DONE
+ }
+ fault
+ {
+ endfinally
+ }
+ DONE:
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .Single(definition => reader.GetString(definition.Name) == "TestMethod");
+ var body = pe.GetMethodBody(method.RelativeVirtualAddress);
+ var region = Assert.Single(body.ExceptionRegions);
+
+ Assert.Equal(ExceptionRegionKind.Fault, region.Kind);
+ Assert.True(region.TryLength > 0);
+ Assert.True(region.HandlerOffset >= region.TryOffset + region.TryLength);
+ Assert.True(region.HandlerLength > 0);
+ }
+
+ [Fact]
+ public void CatchBlock_EmitsCatchExceptionRegion()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test extends [mscorlib]System.Object
+ {
+ .method public static void M() cil managed
+ {
+ .maxstack 1
+ .try
+ {
+ nop
+ leave.s DONE
+ }
+ catch [mscorlib]System.Exception
+ {
+ pop
+ leave.s DONE
+ }
+ DONE:
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .First(definition => reader.GetString(definition.Name) == "M");
+ var body = pe.GetMethodBody(method.RelativeVirtualAddress);
+ var region = Assert.Single(body.ExceptionRegions);
+
+ Assert.Equal(ExceptionRegionKind.Catch, region.Kind);
+ Assert.True(region.TryLength > 0);
+ Assert.True(region.HandlerLength > 0);
+ Assert.Equal("Exception", reader.GetString(reader.GetTypeReference((TypeReferenceHandle)region.CatchType).Name));
+ }
+
+ [Fact]
+ public void FinallyBlock_EmitsFinallyExceptionRegion()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test extends [mscorlib]System.Object
+ {
+ .method public static void M() cil managed
+ {
+ .maxstack 1
+ .try
+ {
+ nop
+ leave.s DONE
+ }
+ finally
+ {
+ endfinally
+ }
+ DONE:
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .First(definition => reader.GetString(definition.Name) == "M");
+ var body = pe.GetMethodBody(method.RelativeVirtualAddress);
+ var region = Assert.Single(body.ExceptionRegions);
+
+ Assert.Equal(ExceptionRegionKind.Finally, region.Kind);
+ Assert.True(region.TryLength > 0);
+ Assert.True(region.HandlerLength > 0);
+ }
+
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/ExportedTypeTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/ExportedTypeTests.cs
index cf80e241dd8f1c..22eb18c3b8b165 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/ExportedTypeTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/ExportedTypeTests.cs
@@ -153,5 +153,96 @@ .class extern forwarder System.ForwardedType
Assert.Equal(DiagnosticSeverity.Warning, warning.Severity);
}
+ [Fact]
+ public void ExportedTypeAttributesAndImplementations_EmitExpectedMetadata()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly extern ForwardedAssembly { }
+ .assembly test { }
+ .file Module.netmodule .hash = (01 02 03 04)
+
+ .class extern public Outer
+ {
+ .assembly extern ForwardedAssembly
+ }
+ .class extern private PrivateType
+ {
+ .assembly extern ForwardedAssembly
+ }
+ .class extern forwarder ForwardedType
+ {
+ .assembly extern ForwardedAssembly
+ }
+ .class extern nested public NestedPublic
+ {
+ .class extern Outer
+ }
+ .class extern nested private NestedPrivate
+ {
+ .class extern Outer
+ }
+ .class extern nested family NestedFamily
+ {
+ .class extern Outer
+ }
+ .class extern nested assembly NestedAssembly
+ {
+ .class extern Outer
+ }
+ .class extern nested famandassem NestedFamAndAssem
+ {
+ .class extern Outer
+ }
+ .class extern nested famorassem NestedFamOrAssem
+ {
+ .class extern Outer
+ }
+ .class extern public FileBackedType
+ {
+ .file Module.netmodule
+ }
+ .class extern public TypeDefIdType
+ {
+ .assembly extern ForwardedAssembly
+ .class 42
+ }
+ .class extern public AttributedType
+ {
+ .assembly extern ForwardedAssembly
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ ;
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var exportedTypes = reader.ExportedTypes
+ .ToDictionary(
+ handle => reader.GetString(reader.GetExportedType(handle).Name),
+ handle => (Handle: handle, Type: reader.GetExportedType(handle)));
+
+ Assert.Equal(TypeAttributes.Public, exportedTypes["Outer"].Type.Attributes & TypeAttributes.VisibilityMask);
+ Assert.Equal(TypeAttributes.NotPublic, exportedTypes["PrivateType"].Type.Attributes & TypeAttributes.VisibilityMask);
+ Assert.True(exportedTypes["ForwardedType"].Type.IsForwarder);
+ Assert.Equal(TypeAttributes.NestedPublic, exportedTypes["NestedPublic"].Type.Attributes & TypeAttributes.VisibilityMask);
+ Assert.Equal(TypeAttributes.NestedPrivate, exportedTypes["NestedPrivate"].Type.Attributes & TypeAttributes.VisibilityMask);
+ Assert.Equal(TypeAttributes.NestedFamily, exportedTypes["NestedFamily"].Type.Attributes & TypeAttributes.VisibilityMask);
+ Assert.Equal(TypeAttributes.NestedAssembly, exportedTypes["NestedAssembly"].Type.Attributes & TypeAttributes.VisibilityMask);
+ Assert.Equal(TypeAttributes.NestedFamANDAssem, exportedTypes["NestedFamAndAssem"].Type.Attributes & TypeAttributes.VisibilityMask);
+ Assert.Equal(TypeAttributes.NestedFamORAssem, exportedTypes["NestedFamOrAssem"].Type.Attributes & TypeAttributes.VisibilityMask);
+
+ Assert.Equal(HandleKind.AssemblyReference, exportedTypes["Outer"].Type.Implementation.Kind);
+ Assert.Equal(HandleKind.AssemblyFile, exportedTypes["FileBackedType"].Type.Implementation.Kind);
+ Assert.Equal(HandleKind.ExportedType, exportedTypes["NestedPublic"].Type.Implementation.Kind);
+ Assert.Equal(42, exportedTypes["TypeDefIdType"].Type.GetTypeDefinitionId());
+
+ var attribute = reader.GetCustomAttribute(
+ Assert.Single(reader.GetCustomAttributes(exportedTypes["AttributedType"].Handle)));
+ Assert.Equal(
+ [0x01, 0x00, 0x00, 0x00],
+ reader.GetBlobBytes(attribute.Value));
+ }
+
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/FieldTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/FieldTests.cs
index 3d0a13705cea38..cbefb36dc474a3 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/FieldTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/FieldTests.cs
@@ -21,6 +21,72 @@ namespace ILAssembler.Tests
{
public class FieldTests
{
+ [Fact]
+ public void TrailingCustomAttribute_AttachesToField()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .field public static int32 Value
+ .custom instance void [mscorlib]System.ThreadStaticAttribute::.ctor() = (01 00 00 00)
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var type = reader.GetTypeDefinition(MetadataTokens.TypeDefinitionHandle(2));
+ var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
+
+ Assert.Empty(type.GetCustomAttributes());
+ Assert.Single(field.GetCustomAttributes());
+ }
+
+ [Fact]
+ public void TrailingFieldCustomAttribute_DoesNotLeakAcrossClasses()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi A
+ {
+ .field public static int32 Value
+ }
+ .class public auto ansi B
+ {
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
+ var typeB = reader.TypeDefinitions
+ .Select(reader.GetTypeDefinition)
+ .Single(type => reader.GetString(type.Name) == "B");
+
+ Assert.Empty(field.GetCustomAttributes());
+ Assert.Single(typeB.GetCustomAttributes());
+ }
+
+ [Fact]
+ public void GlobalFieldTrailingCustomAttribute_AttachesToField()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .field public static int32 Value
+ .custom instance void [mscorlib]System.ThreadStaticAttribute::.ctor() = (01 00 00 00)
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
+
+ Assert.Empty(reader.GetModuleDefinition().GetCustomAttributes());
+ Assert.Single(field.GetCustomAttributes());
+ }
[Fact]
public void FieldLayout_ExplicitOffset()
@@ -59,6 +125,48 @@ .assembly extern System.Runtime { }
Assert.Equal(0, fields[2].GetOffset());
}
+ [Fact]
+ public void FieldAttributes_EmitExpectedFlagsAndNullConstant()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .field family initonly int32 FamilyInitOnly
+ .field assembly int32 AssemblyField
+ .field famandassem int32 FamAndAssemField
+ .field famorassem int32 FamOrAssemField
+ .field privatescope int32 PrivateScopeField
+ .field public notserialized int32 NotSerializedField
+ .field flags(0x36) int32 FlaggedField
+ .field public volatile int32 VolatileField
+ .field public static literal string NullString = nullref
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var fields = reader.FieldDefinitions
+ .Select(reader.GetFieldDefinition)
+ .ToDictionary(field => reader.GetString(field.Name));
+
+ Assert.Equal(FieldAttributes.Family, fields["FamilyInitOnly"].Attributes & FieldAttributes.FieldAccessMask);
+ Assert.True(fields["FamilyInitOnly"].Attributes.HasFlag(FieldAttributes.InitOnly));
+ Assert.Equal(FieldAttributes.Assembly, fields["AssemblyField"].Attributes & FieldAttributes.FieldAccessMask);
+ Assert.Equal(FieldAttributes.FamANDAssem, fields["FamAndAssemField"].Attributes & FieldAttributes.FieldAccessMask);
+ Assert.Equal(FieldAttributes.FamORAssem, fields["FamOrAssemField"].Attributes & FieldAttributes.FieldAccessMask);
+ Assert.Equal(FieldAttributes.PrivateScope, fields["PrivateScopeField"].Attributes & FieldAttributes.FieldAccessMask);
+#pragma warning disable SYSLIB0050
+ Assert.True(fields["NotSerializedField"].Attributes.HasFlag(FieldAttributes.NotSerialized));
+#pragma warning restore SYSLIB0050
+ Assert.Equal((FieldAttributes)0x36, fields["FlaggedField"].Attributes);
+ Assert.Equal(FieldAttributes.Public, fields["VolatileField"].Attributes & FieldAttributes.FieldAccessMask);
+
+ var nullConstant = reader.GetConstant(fields["NullString"].GetDefaultValue());
+ Assert.Equal(ConstantTypeCode.NullReference, nullConstant.TypeCode);
+ }
+
[Fact]
public void FieldRVA_MultipleDataSections()
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/FunctionPointerTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/FunctionPointerTests.cs
index 0a3e83b1c0b39f..de68c84f921465 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/FunctionPointerTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/FunctionPointerTests.cs
@@ -40,16 +40,9 @@ .class public auto ansi Test extends [mscorlib]System.Object
var reader = pe.GetMetadataReader();
var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
- var sigBytes = reader.GetBlobBytes(field.Signature);
-
- // Field signature: 0x06 (FIELD), 0x1B (FNPTR), ...
- Assert.Equal(0x06, sigBytes[0]); // FIELD calling convention
- Assert.Equal(0x1B, sigBytes[1]); // ELEMENT_TYPE_FNPTR
- // After FNPTR: calling convention byte, param count, return type, param types
- Assert.Equal(0x00, sigBytes[2]); // DEFAULT calling convention
- Assert.Equal(0x01, sigBytes[3]); // 1 parameter
- Assert.Equal(0x01, sigBytes[4]); // return type: void
- Assert.Equal(0x08, sigBytes[5]); // param type: int32
+ Assert.Equal(
+ "method void *(int32)",
+ field.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
}
@@ -76,13 +69,10 @@ .method public static void Invoke(method void *(int32) callback) cil managed
.Select(h => reader.GetMethodDefinition(h))
.First(m => reader.GetString(m.Name) == "Invoke");
- var sigBytes = reader.GetBlobBytes(method.Signature);
- // Method signature: 0x00 (DEFAULT), 0x01 (1 param), 0x01 (void ret), ...
- Assert.Equal(0x00, sigBytes[0]); // DEFAULT calling convention
- Assert.Equal(0x01, sigBytes[1]); // 1 parameter
- Assert.Equal(0x01, sigBytes[2]); // return type: void
- // Parameter should be ELEMENT_TYPE_FNPTR (0x1B)
- Assert.Equal(0x1B, sigBytes[3]); // ELEMENT_TYPE_FNPTR
+ MethodSignature signature =
+ method.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null);
+ Assert.Equal("void", signature.ReturnType);
+ Assert.Equal(new[] { "method void *(int32)" }, signature.ParameterTypes);
}
@@ -111,18 +101,10 @@ .class public auto ansi Test extends [mscorlib]System.Object
.Select(h => reader.GetMethodDefinition(h))
.First(m => reader.GetString(m.Name) == "GetAdder");
- var sigBytes = reader.GetBlobBytes(method.Signature);
- // Method signature: 0x00 (DEFAULT), 0x00 (0 params), return type...
- Assert.Equal(0x00, sigBytes[0]); // DEFAULT calling convention
- Assert.Equal(0x00, sigBytes[1]); // 0 parameters
- // Return type should be ELEMENT_TYPE_FNPTR (0x1B)
- Assert.Equal(0x1B, sigBytes[2]); // ELEMENT_TYPE_FNPTR
- // After FNPTR: calling convention, param count, return type (int32), param types (int32, int32)
- Assert.Equal(0x00, sigBytes[3]); // DEFAULT calling convention for inner sig
- Assert.Equal(0x02, sigBytes[4]); // 2 parameters in inner sig
- Assert.Equal(0x08, sigBytes[5]); // inner return type: int32
- Assert.Equal(0x08, sigBytes[6]); // inner param 1: int32
- Assert.Equal(0x08, sigBytes[7]); // inner param 2: int32
+ MethodSignature signature =
+ method.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null);
+ Assert.Equal("method int32 *(int32, int32)", signature.ReturnType);
+ Assert.Empty(signature.ParameterTypes);
}
@@ -143,13 +125,9 @@ .class public auto ansi Test extends [mscorlib]System.Object
var reader = pe.GetMetadataReader();
var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
- var sigBytes = reader.GetBlobBytes(field.Signature);
-
- Assert.Equal(0x06, sigBytes[0]); // FIELD calling convention
- Assert.Equal(0x1B, sigBytes[1]); // ELEMENT_TYPE_FNPTR
- Assert.Equal(0x00, sigBytes[2]); // DEFAULT calling convention
- Assert.Equal(0x00, sigBytes[3]); // 0 parameters
- Assert.Equal(0x01, sigBytes[4]); // return type: void
+ Assert.Equal(
+ "method void *()",
+ field.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
}
@@ -172,17 +150,9 @@ .class public auto ansi Test extends [mscorlib]System.Object
var reader = pe.GetMetadataReader();
var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
- var sigBytes = reader.GetBlobBytes(field.Signature);
-
- // Field sig: 0x06 (FIELD), 0x1B (FNPTR), 0x00 (DEFAULT), 0x01 (1 param),
- // 0x0F (PTR), 0x01 (VOID) [= void* return type], 0x08 (int32 param)
- Assert.Equal(0x06, sigBytes[0]); // FIELD calling convention
- Assert.Equal(0x1B, sigBytes[1]); // ELEMENT_TYPE_FNPTR
- Assert.Equal(0x00, sigBytes[2]); // DEFAULT calling convention
- Assert.Equal(0x01, sigBytes[3]); // 1 parameter
- Assert.Equal(0x0F, sigBytes[4]); // return type: ELEMENT_TYPE_PTR
- Assert.Equal(0x01, sigBytes[5]); // return type inner: VOID (making void*)
- Assert.Equal(0x08, sigBytes[6]); // param type: int32
+ Assert.Equal(
+ "method void* *(int32)",
+ field.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
}
@@ -203,16 +173,9 @@ .class public auto ansi Test extends [mscorlib]System.Object
var reader = pe.GetMetadataReader();
var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
- var sigBytes = reader.GetBlobBytes(field.Signature);
-
- // Field sig: 0x06 (FIELD), 0x1B (FNPTR), 0x00 (DEFAULT), 0x00 (0 params),
- // 0x0F (PTR), 0x01 (VOID) [= void* return type]
- Assert.Equal(0x06, sigBytes[0]); // FIELD calling convention
- Assert.Equal(0x1B, sigBytes[1]); // ELEMENT_TYPE_FNPTR
- Assert.Equal(0x00, sigBytes[2]); // DEFAULT calling convention
- Assert.Equal(0x00, sigBytes[3]); // 0 parameters
- Assert.Equal(0x0F, sigBytes[4]); // return type: ELEMENT_TYPE_PTR
- Assert.Equal(0x01, sigBytes[5]); // return type inner: VOID (making void*)
+ Assert.Equal(
+ "method void* *()",
+ field.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
}
@@ -233,17 +196,9 @@ .class public auto ansi Test extends [mscorlib]System.Object
var reader = pe.GetMetadataReader();
var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
- var sigBytes = reader.GetBlobBytes(field.Signature);
-
- // Field sig: 0x06 (FIELD), 0x1B (FNPTR), 0x00 (DEFAULT), 0x01 (1 param),
- // 0x0F (PTR), 0x08 (I4) [= int32* return type], 0x08 (int32 param)
- Assert.Equal(0x06, sigBytes[0]); // FIELD calling convention
- Assert.Equal(0x1B, sigBytes[1]); // ELEMENT_TYPE_FNPTR
- Assert.Equal(0x00, sigBytes[2]); // DEFAULT calling convention
- Assert.Equal(0x01, sigBytes[3]); // 1 parameter
- Assert.Equal(0x0F, sigBytes[4]); // return type: ELEMENT_TYPE_PTR
- Assert.Equal(0x08, sigBytes[5]); // return type inner: int32 (making int32*)
- Assert.Equal(0x08, sigBytes[6]); // param type: int32
+ Assert.Equal(
+ "method int32* *(int32)",
+ field.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
}
@@ -265,15 +220,30 @@ .class public auto ansi Test extends [mscorlib]System.Object
var reader = pe.GetMetadataReader();
var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
- var sigBytes = reader.GetBlobBytes(field.Signature);
-
- // Field sig: 0x06 (FIELD), then the type is FNPTR(void(int32)) with PTR modifier
- // The modifier ordering means: 0x06, 0x1B (FNPTR), ..., then 0x0F (PTR) wraps it
- // But in practice ECMA-335 encodes: 0x06, 0x0F (PTR), 0x1B (FNPTR), ...
- Assert.Equal(0x06, sigBytes[0]); // FIELD calling convention
- // The next two bytes must contain both PTR and FNPTR
- Assert.Contains((byte)0x1B, sigBytes.Skip(1).ToArray()); // Must have ELEMENT_TYPE_FNPTR
- Assert.Contains((byte)0x0F, sigBytes.Skip(1).ToArray()); // Must have ELEMENT_TYPE_PTR
+ Assert.Equal(
+ "method void *(int32)*",
+ field.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
+ }
+
+ [Fact]
+ public void FunctionPointer_VarargSignature_EmitsSentinel()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .field public static method vararg void *(int32, ..., object) fnPtrField
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
+ Assert.Equal(
+ "method void *(int32, ..., object)",
+ field.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/GenericTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/GenericTests.cs
index 561c1bf0d4a713..b05e5cd1b3617e 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/GenericTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/GenericTests.cs
@@ -126,6 +126,148 @@ .field public !1 fieldU
Assert.Equal(2, genericParams.Count);
}
+ [Fact]
+ public void DuplicateGenericParameterNames_PreserveFirstNameBindingInFieldSignature()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit DuplicateName`2 extends [mscorlib]System.Object
+ {
+ .field public !T Value
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var typeDef = reader.TypeDefinitions
+ .Select(h => reader.GetTypeDefinition(h))
+ .First(t => reader.GetString(t.Name) == "DuplicateName`2");
+
+ var genericParameters = typeDef.GetGenericParameters()
+ .Select(reader.GetGenericParameter)
+ .ToArray();
+ Assert.Equal(2, genericParameters.Length);
+ Assert.All(genericParameters, parameter => Assert.Equal("T", reader.GetString(parameter.Name)));
+
+ var field = reader.GetFieldDefinition(typeDef.GetFields().Single());
+ Assert.Equal("!0", field.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
+ }
+
+ [Fact]
+ public void GenericParameterAttributesAndBounds_EmitExpectedMetadata()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class interface public abstract auto ansi IVariant`5<+T, -U, class .ctor V, valuetype byreflike W, flags(0x0004) X>
+ {
+ }
+ .class public auto ansi Constrained`1<(class [mscorlib]System.IDisposable) T> extends [mscorlib]System.Object
+ {
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var variantType = reader.TypeDefinitions
+ .Select(reader.GetTypeDefinition)
+ .Single(type => reader.GetString(type.Name) == "IVariant`5");
+ var parameters = variantType.GetGenericParameters()
+ .Select(reader.GetGenericParameter)
+ .ToDictionary(parameter => reader.GetString(parameter.Name));
+
+ Assert.Equal(GenericParameterAttributes.Covariant, parameters["T"].Attributes & GenericParameterAttributes.VarianceMask);
+ Assert.Equal(GenericParameterAttributes.Contravariant, parameters["U"].Attributes & GenericParameterAttributes.VarianceMask);
+ Assert.True(parameters["V"].Attributes.HasFlag(GenericParameterAttributes.ReferenceTypeConstraint));
+ Assert.True(parameters["V"].Attributes.HasFlag(GenericParameterAttributes.DefaultConstructorConstraint));
+ Assert.True(parameters["W"].Attributes.HasFlag(GenericParameterAttributes.NotNullableValueTypeConstraint));
+ Assert.True(((int)parameters["W"].Attributes & 0x20) != 0);
+ Assert.Equal((GenericParameterAttributes)0x0004, parameters["X"].Attributes);
+
+ var constrainedType = reader.TypeDefinitions
+ .Select(reader.GetTypeDefinition)
+ .Single(type => reader.GetString(type.Name) == "Constrained`1");
+ var constrainedParameter = reader.GetGenericParameter(Assert.Single(constrainedType.GetGenericParameters()));
+ var constraint = reader.GetGenericParameterConstraint(Assert.Single(constrainedParameter.GetConstraints()));
+
+ Assert.Equal(HandleKind.TypeSpecification, constraint.Type.Kind);
+ Assert.Equal(
+ "[mscorlib]System.IDisposable",
+ reader.GetTypeSpecification((TypeSpecificationHandle)constraint.Type)
+ .DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
+ }
+
+ [Fact]
+ public void ClassGenericParameterAndConstraintDirectives_AttachCustomAttributes()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi ByName`1<([mscorlib]System.ICloneable) T> extends [mscorlib]System.Object
+ {
+ .param type T
+ .custom instance void [mscorlib]System.CLSCompliantAttribute::.ctor(bool) = (01 00 01 00 00)
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ .param constraint T, [mscorlib]System.ICloneable
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ .custom instance void [mscorlib]System.CLSCompliantAttribute::.ctor(bool) = (01 00 01 00 00)
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var types = reader.TypeDefinitions
+ .Select(reader.GetTypeDefinition)
+ .Where(definition => reader.GetString(definition.Name) == "ByName`1")
+ .ToDictionary(definition => reader.GetString(definition.Name));
+
+ AssertGenericParameterAnnotation(reader, types["ByName`1"], "ICloneable");
+ }
+
+ [Fact]
+ public void MethodGenericParameterAndConstraintDirectives_AttachCustomAttributes()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void M() cil managed
+ {
+ .param type [0]
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ .param type T
+ .custom instance void [mscorlib]System.CLSCompliantAttribute::.ctor(bool) = (01 00 01 00 00)
+ .param constraint [0], [mscorlib]System.IDisposable
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ .param constraint T, [mscorlib]System.ICloneable
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.GetMethodDefinition(Assert.Single(reader.MethodDefinitions));
+ var parameterHandle = Assert.Single(method.GetGenericParameters());
+ var parameter = reader.GetGenericParameter(parameterHandle);
+ var constraints = parameter.GetConstraints().ToArray();
+
+ Assert.Equal(2, reader.GetCustomAttributes(parameterHandle).Count);
+ Assert.Equal(2, constraints.Length);
+ Assert.All(constraints, constraint => Assert.Single(reader.GetCustomAttributes(constraint)));
+ Assert.Equal(
+ new[] { "ICloneable", "IDisposable" },
+ constraints
+ .Select(reader.GetGenericParameterConstraint)
+ .Select(constraint => reader.GetString(reader.GetTypeReference((TypeReferenceHandle)constraint.Type).Name))
+ .OrderBy(name => name));
+ }
+
[Fact]
public void GenericMethod_UsesNamedElementList()
@@ -156,6 +298,37 @@ .maxstack 1
Assert.Single(genericParams);
}
+ [Fact]
+ public void GenericType_MoreThanMetadataIndexRange_IsAcceptedForCompatibility()
+ {
+ const int GenericParameterCount = 65_537;
+ StringBuilder source = new("""
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test<
+ """);
+
+ for (int i = 0; i < GenericParameterCount; i++)
+ {
+ if (i != 0)
+ {
+ source.Append(',');
+ }
+ if (i == GenericParameterCount - 1)
+ {
+ source.Append("(class [mscorlib]System.Object) ");
+ }
+ source.Append('T').Append(i);
+ }
+
+ source.Append("> { }");
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source.ToString(), new Options());
+ var reader = pe.GetMetadataReader();
+
+ Assert.Equal(ushort.MaxValue + 1, reader.GetTableRowCount(TableIndex.GenericParam));
+ Assert.Equal(0, reader.GetTableRowCount(TableIndex.GenericParamConstraint));
+ }
[Fact]
public void GenericOverride_EmitsMethodImpl()
@@ -300,13 +473,31 @@ .method public hidebysig instance void M() cil managed
// NOT a TypeRef to System.Object.
Assert.Equal(HandleKind.TypeSpecification, constraintType.Kind);
- // Decode the TypeSpec blob to verify it's a generic instantiation of IMinusT`1
var typeSpec = reader.GetTypeSpecification((TypeSpecificationHandle)constraintType);
- var sigBytes = reader.GetBlobBytes(typeSpec.Signature);
+ Assert.Equal(
+ "IMinusT`1",
+ typeSpec.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
+ }
- // Expected: GENERICINST (0x15), CLASS (0x12), ,
- // 1 (generic arg count), VAR 1 (type parameter !U which is index 1)
- Assert.Equal(0x15, sigBytes[0]); // ELEMENT_TYPE_GENERICINST
+ [Fact]
+ public void RepeatedSelfReferentialConstraint_IsNotDuplicated()
+ {
+ string source = """
+ .assembly test { }
+ .class interface public abstract auto ansi I`1<(class I`1) TSelf>
+ {
+ .param constraint TSelf, class I`1
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var type = reader.TypeDefinitions
+ .Select(reader.GetTypeDefinition)
+ .Single(type => reader.GetString(type.Name) == "I`1");
+ var parameter = reader.GetGenericParameter(Assert.Single(type.GetGenericParameters()));
+
+ Assert.Single(parameter.GetConstraints());
}
@@ -365,11 +556,100 @@ .method public hidebysig newslot abstract virtual instance void
Assert.Equal(HandleKind.TypeSpecification, constraintType.Kind);
var typeSpec = reader.GetTypeSpecification((TypeSpecificationHandle)constraintType);
- var sigBytes = reader.GetBlobBytes(typeSpec.Signature);
+ Assert.Equal(
+ "IMinusT`1",
+ typeSpec.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
+ }
- // Expected: GENERICINST (0x15), CLASS (0x12), ,
- // 1 (generic arg count), VAR 0 (type parameter !PlusT at index 0)
- Assert.Equal(0x15, sigBytes[0]); // ELEMENT_TYPE_GENERICINST
+ [Fact]
+ public void VariantGenericParameters_EmitVarianceFlags()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+
+ .class interface public abstract auto ansi IVariant`2<+([mscorlib]System.Object) TOut, -([mscorlib]System.Object) TIn>
+ {
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var type = reader.TypeDefinitions
+ .Select(reader.GetTypeDefinition)
+ .First(definition => reader.GetString(definition.Name) == "IVariant`2");
+ var parameters = type.GetGenericParameters()
+ .Select(reader.GetGenericParameter)
+ .ToArray();
+
+ Assert.Equal(2, parameters.Length);
+ Assert.Equal("TOut", reader.GetString(parameters[0].Name));
+ Assert.Equal("TIn", reader.GetString(parameters[1].Name));
+ Assert.True((parameters[0].Attributes & GenericParameterAttributes.Covariant) != 0);
+ Assert.True((parameters[1].Attributes & GenericParameterAttributes.Contravariant) != 0);
+ }
+
+ [Fact]
+ public void GenericFieldAndMethod_EmitVarAndMVarSignatures()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit GenericBox`1 extends [mscorlib]System.Object
+ {
+ .field public !0 Value
+
+ .method public static !!0 Identity(!!0 arg) cil managed
+ {
+ ldarg.0
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var type = reader.TypeDefinitions
+ .Select(reader.GetTypeDefinition)
+ .First(definition => reader.GetString(definition.Name) == "GenericBox`1");
+ var field = reader.GetFieldDefinition(type.GetFields().Single());
+ var method = type.GetMethods()
+ .Select(reader.GetMethodDefinition)
+ .First(definition => reader.GetString(definition.Name) == "Identity");
+
+ Assert.Equal("!0", field.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
+
+ var typeParameter = reader.GetGenericParameter(type.GetGenericParameters().Single());
+ var methodParameter = reader.GetGenericParameter(method.GetGenericParameters().Single());
+ Assert.Equal("T", reader.GetString(typeParameter.Name));
+ Assert.Equal("U", reader.GetString(methodParameter.Name));
+
+ MethodSignature methodSignature =
+ method.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null);
+ Assert.True(methodSignature.Header.IsGeneric);
+ Assert.Equal(1, methodSignature.GenericParameterCount);
+ Assert.Equal("!!0", methodSignature.ReturnType);
+ Assert.Equal(new[] { "!!0" }, methodSignature.ParameterTypes);
+ }
+
+ private static void AssertGenericParameterAnnotation(
+ MetadataReader reader,
+ TypeDefinition type,
+ string expectedConstraint)
+ {
+ var parameterHandle = Assert.Single(type.GetGenericParameters());
+ var parameter = reader.GetGenericParameter(parameterHandle);
+ var constraintHandle = Assert.Single(parameter.GetConstraints());
+ var constraint = reader.GetGenericParameterConstraint(constraintHandle);
+
+ Assert.Equal(2, reader.GetCustomAttributes(parameterHandle).Count);
+ Assert.Equal(2, reader.GetCustomAttributes(constraintHandle).Count);
+ Assert.Equal(HandleKind.TypeReference, constraint.Type.Kind);
+ Assert.Equal(
+ expectedConstraint,
+ reader.GetString(reader.GetTypeReference((TypeReferenceHandle)constraint.Type).Name));
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/InstructionTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/InstructionTests.cs
index 2c15eace3f5360..67e4a77013ef1a 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/InstructionTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/InstructionTests.cs
@@ -232,6 +232,356 @@ .method public static void M(unsigned int64[] arr) cil managed
Assert.Empty(diagnostics);
}
+ [Fact]
+ public void UnusedInstruction_ParsedCorrectly()
+ {
+ string source = """
+ .assembly test { }
+ .method public static void F() cil managed
+ {
+ IL_0000: unused
+ IL_0001: ret
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .Single(method => reader.GetString(method.Name) == "F");
+ byte[] il = pe.GetMethodBody(method.RelativeVirtualAddress).GetILBytes()!;
+
+ Assert.Equal([0xFE, 0x22, 0x2A], il);
+ }
+
+ [Fact]
+ public void Ldtoken_NumericTokenEmittedCorrectly()
+ {
+ string source = """
+ .assembly test { }
+ .method public static void F() cil managed
+ {
+ ldtoken 0
+ ret
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .Single(method => reader.GetString(method.Name) == "F");
+ byte[] il = pe.GetMethodBody(method.RelativeVirtualAddress).GetILBytes()!;
+
+ Assert.Equal([0xD0, 0x00, 0x00, 0x00, 0x00, 0x2A], il);
+ }
+
+ [Fact]
+ public void Calli_WritesOpcodeAndSignatureToken()
+ {
+ string source = """
+ .assembly Test { }
+ .class public auto ansi Test
+ {
+ .method public static void F() cil managed
+ {
+ calli void()
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .Single(method => reader.GetString(method.Name) == "F");
+ byte[] il = pe.GetMethodBody(method.RelativeVirtualAddress).GetILBytes()!;
+
+ Assert.Equal(0x29, il[0]);
+ var signatureHandle = (StandaloneSignatureHandle)MetadataTokens.EntityHandle(BinaryPrimitives.ReadInt32LittleEndian(il.AsSpan(1)));
+ Assert.Equal(0x2A, il[5]);
+
+ MethodSignature signature = DecodeCalliSignature(reader, signatureHandle);
+ Assert.Equal(SignatureCallingConvention.Default, signature.Header.CallingConvention);
+ Assert.False(signature.Header.IsInstance);
+ Assert.False(signature.Header.HasExplicitThis);
+ Assert.Equal(PrimitiveTypeCode.Void, signature.ReturnType);
+ Assert.Empty(signature.ParameterTypes);
+ }
+
+ [Theory]
+ [InlineData("explicit instance")]
+ [InlineData("instance explicit")]
+ public void Calli_ExplicitInstance_PreservesExplicitThis(string callingConvention)
+ {
+ string source = $$"""
+ .assembly Test { }
+ .class public auto ansi Test
+ {
+ .method public static void F() cil managed
+ {
+ calli {{callingConvention}} void()
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ MethodSignature signature = DecodeCalliSignature(reader, MetadataTokens.StandaloneSignatureHandle(1));
+
+ Assert.Equal(SignatureCallingConvention.Default, signature.Header.CallingConvention);
+ Assert.True(signature.Header.IsInstance);
+ Assert.True(signature.Header.HasExplicitThis);
+ Assert.Equal(PrimitiveTypeCode.Void, signature.ReturnType);
+ Assert.Empty(signature.ParameterTypes);
+ }
+
+ [Fact]
+ public void Calli_VarArgSignature_DoesNotCountSentinelAsParameter()
+ {
+ string source = """
+ .assembly Test { }
+ .class public auto ansi Test
+ {
+ .method public static void F() cil managed
+ {
+ calli vararg void(int32, ..., string, int64)
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ MethodSignature signature = DecodeCalliSignature(reader, MetadataTokens.StandaloneSignatureHandle(1));
+
+ Assert.Equal(SignatureCallingConvention.VarArgs, signature.Header.CallingConvention);
+ Assert.Equal(1, signature.RequiredParameterCount);
+ Assert.Equal([PrimitiveTypeCode.Int32, PrimitiveTypeCode.String, PrimitiveTypeCode.Int64], signature.ParameterTypes.ToArray());
+ }
+
+ [Fact]
+ public void MaxStackDirective_IsPreserved()
+ {
+ string source = """
+ .assembly Test { }
+ .class public auto ansi Test
+ {
+ .method public static void F() cil managed
+ {
+ .maxstack 3
+ ldc.i4.1
+ localloc
+ pop
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .Single(method => reader.GetString(method.Name) == "F");
+
+ MethodBodyBlock body = pe.GetMethodBody(method.RelativeVirtualAddress);
+ Assert.Equal(3, body.MaxStack);
+ Assert.True(body.LocalVariablesInitialized);
+ }
+
+ [Fact]
+ public void MaxStackDirective_DoesNotInitializeExistingLocals()
+ {
+ string source = """
+ .assembly Test { }
+ .class public auto ansi Test
+ {
+ .method public static void F() cil managed
+ {
+ .maxstack 3
+ .locals (int32 V_0)
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .Single(method => reader.GetString(method.Name) == "F");
+ MethodBodyBlock body = pe.GetMethodBody(method.RelativeVirtualAddress);
+
+ Assert.Equal(3, body.MaxStack);
+ Assert.False(body.LocalVariablesInitialized);
+ }
+
+ [Fact]
+ public void MethodWithoutMaxStack_UsesNativeDefault()
+ {
+ string source = """
+ .assembly Test { }
+ .class public auto ansi Test
+ {
+ .method public static void F() cil managed
+ {
+ ldc.i4.0
+ pop
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .Single(method => reader.GetString(method.Name) == "F");
+ MethodBodyBlock body = pe.GetMethodBody(method.RelativeVirtualAddress);
+
+ Assert.Equal(8, body.MaxStack);
+ Assert.False(body.LocalVariablesInitialized);
+ }
+
+ [Fact]
+ public void ZeroInitWithoutLocals_ForcesFatHeader()
+ {
+ string source = """
+ .assembly Test { }
+ .class public auto ansi Test
+ {
+ .method public static void F() cil managed
+ {
+ .zeroinit
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .Single(method => reader.GetString(method.Name) == "F");
+ MethodBodyBlock body = pe.GetMethodBody(method.RelativeVirtualAddress);
+
+ Assert.Equal(8, body.MaxStack);
+ Assert.True(body.LocalVariablesInitialized);
+ }
+
+ [Theory]
+ [InlineData("4294967295", 4294967295d)]
+ [InlineData("4503599627370496", 4503599627370496d)]
+ [InlineData("-4294967295", -4294967295d)]
+ [InlineData("0xFFFFFFFF", 4294967295d)]
+ [InlineData("4294967295.", 4294967295d)]
+ public void LdcR8_IntegerLiteral_PreservesValue(string literal, double expected)
+ {
+ string source = $$"""
+ .assembly Test { }
+ .class public auto ansi Test
+ {
+ .method public static void F() cil managed
+ {
+ ldc.r8 {{literal}}
+ pop
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .Single(method => reader.GetString(method.Name) == "F");
+ byte[] il = pe.GetMethodBody(method.RelativeVirtualAddress).GetILBytes()!;
+
+ Assert.Equal(0x23, il[0]);
+ Assert.Equal(expected, BitConverter.Int64BitsToDouble(BinaryPrimitives.ReadInt64LittleEndian(il.AsSpan(1))));
+ }
+
+ [Fact]
+ public void LdcR4_IntegerLiteral_PreservesValue()
+ {
+ string source = """
+ .assembly Test { }
+ .class public auto ansi Test
+ {
+ .method public static void F() cil managed
+ {
+ ldc.r4 4294967295
+ pop
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .Single(method => reader.GetString(method.Name) == "F");
+ byte[] il = pe.GetMethodBody(method.RelativeVirtualAddress).GetILBytes()!;
+
+ Assert.Equal(0x22, il[0]);
+ Assert.Equal(4294967295f, BitConverter.Int32BitsToSingle(BinaryPrimitives.ReadInt32LittleEndian(il.AsSpan(1))));
+ }
+
+ private static MethodSignature DecodeCalliSignature(MetadataReader reader, StandaloneSignatureHandle handle)
+ {
+ BlobReader blobReader = reader.GetBlobReader(reader.GetStandaloneSignature(handle).Signature);
+ var decoder = new SignatureDecoder(PrimitiveTypeProvider.Instance, reader, genericContext: null);
+
+ return decoder.DecodeMethodSignature(ref blobReader);
+ }
+
+ private sealed class PrimitiveTypeProvider : ISignatureTypeProvider
+ {
+ public static PrimitiveTypeProvider Instance { get; } = new();
+
+ public PrimitiveTypeCode GetArrayType(PrimitiveTypeCode elementType, ArrayShape shape) => elementType;
+ public PrimitiveTypeCode GetByReferenceType(PrimitiveTypeCode elementType) => elementType;
+ public PrimitiveTypeCode GetFunctionPointerType(MethodSignature signature) => PrimitiveTypeCode.IntPtr;
+ public PrimitiveTypeCode GetGenericInstantiation(PrimitiveTypeCode genericType, ImmutableArray typeArguments) => genericType;
+ public PrimitiveTypeCode GetGenericMethodParameter(object? genericContext, int index) => PrimitiveTypeCode.Object;
+ public PrimitiveTypeCode GetGenericTypeParameter(object? genericContext, int index) => PrimitiveTypeCode.Object;
+ public PrimitiveTypeCode GetModifiedType(PrimitiveTypeCode modifier, PrimitiveTypeCode unmodifiedType, bool isRequired) => unmodifiedType;
+ public PrimitiveTypeCode GetPinnedType(PrimitiveTypeCode elementType) => elementType;
+ public PrimitiveTypeCode GetPointerType(PrimitiveTypeCode elementType) => elementType;
+ public PrimitiveTypeCode GetPrimitiveType(PrimitiveTypeCode typeCode) => typeCode;
+ public PrimitiveTypeCode GetSZArrayType(PrimitiveTypeCode elementType) => elementType;
+ public PrimitiveTypeCode GetTypeFromDefinition(MetadataReader reader, TypeDefinitionHandle handle, byte rawTypeKind) => PrimitiveTypeCode.Object;
+ public PrimitiveTypeCode GetTypeFromReference(MetadataReader reader, TypeReferenceHandle handle, byte rawTypeKind) => PrimitiveTypeCode.Object;
+ public PrimitiveTypeCode GetTypeFromSpecification(MetadataReader reader, object? genericContext, TypeSpecificationHandle handle, byte rawTypeKind) => PrimitiveTypeCode.Object;
+ }
+
+ [Fact]
+ public void Ldtoken_FieldReference_IsBackpatched()
+ {
+ string source = """
+ .assembly Test { }
+ .class public auto ansi Test
+ {
+ .field public static int32 F
+ .method public static void M() cil managed
+ {
+ ldtoken field int32 Test::F
+ pop
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ int token = DocumentCompilerTestHelpers.GetFirstTokenOperand(pe, reader, "M", ILOpcode.ldtoken);
+
+ DocumentCompilerTestHelpers.AssertFieldDefToken(reader, token, "F");
+ }
+
[Fact]
public void MethodNameF1_NotConfusedWithHexByte()
@@ -281,6 +631,368 @@ .method public static void M() cil managed
Assert.Empty(diagnostics);
}
+ [Fact]
+ public void FloatingPointInstruction_Float64BitPattern_EmitsExpectedDouble()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static float64 GetPi() cil managed
+ {
+ ldc.r8 float64(0x400921FB54442D18)
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ byte[] il = GetMethodIL(pe, "GetPi");
+
+ Assert.Equal(0x23, il[0]);
+ Assert.Equal(Math.PI, BitConverter.ToDouble(il, 1), 14);
+ }
+
+ [Fact]
+ public void FloatingPointInstruction_ByteForms_EmitExpectedConstants()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static float32 GetSingle() cil managed
+ {
+ ldc.r4 (00 00 80 3F)
+ ret
+ }
+
+ .method public static float64 GetDouble() cil managed
+ {
+ ldc.r8 bytearray(00 00 00 00 00 00 F0 3F)
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ byte[] singleIL = GetMethodIL(pe, "GetSingle");
+ byte[] doubleIL = GetMethodIL(pe, "GetDouble");
+
+ Assert.Equal(0x22, singleIL[0]);
+ Assert.Equal(1f, BitConverter.ToSingle(singleIL, 1));
+ Assert.Equal(0x23, doubleIL[0]);
+ Assert.Equal(1d, BitConverter.ToDouble(doubleIL, 1));
+ }
+
+ [Fact]
+ public void CalliInstruction_EmitsStandaloneSignatureToken()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static int32 M(native int functionPointer) cil managed
+ {
+ ldarg.0
+ calli default int32()
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ Assert.Equal(1, reader.GetTableRowCount(TableIndex.StandAloneSig));
+
+ var signature = reader.GetStandaloneSignature(MetadataTokens.StandaloneSignatureHandle(1));
+ MethodSignature decodedSignature =
+ signature.DecodeMethodSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null);
+ Assert.Equal(SignatureCallingConvention.Default, decodedSignature.Header.CallingConvention);
+ Assert.Equal("int32", decodedSignature.ReturnType);
+ Assert.Empty(decodedSignature.ParameterTypes);
+
+ int token = DocumentCompilerTestHelpers.GetFirstTokenOperand(pe, reader, "M", ILOpcode.calli);
+ Assert.Equal(MetadataTokens.GetToken(MetadataTokens.StandaloneSignatureHandle(1)), token);
+ }
+
+ [Theory]
+ [InlineData("unmanaged cdecl", (int)SignatureCallingConvention.CDecl, false, false)]
+ [InlineData("unmanaged stdcall", (int)SignatureCallingConvention.StdCall, false, false)]
+ [InlineData("unmanaged thiscall", (int)SignatureCallingConvention.ThisCall, false, false)]
+ [InlineData("unmanaged fastcall", (int)SignatureCallingConvention.FastCall, false, false)]
+ [InlineData("unmanaged", (int)SignatureCallingConvention.Unmanaged, false, false)]
+ [InlineData("vararg", (int)SignatureCallingConvention.VarArgs, false, false)]
+ [InlineData("instance default", (int)SignatureCallingConvention.Default, true, false)]
+ [InlineData("callconv(0x05)", (int)SignatureCallingConvention.VarArgs, false, false)]
+ public void CalliInstruction_CallingConvention_EmitsDecodedSignature(
+ string callingConvention,
+ int expectedCallingConvention,
+ bool expectedInstance,
+ bool expectedExplicitThis)
+ {
+ string source = $$"""
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void M() cil managed
+ {
+ ldc.i4.0
+ conv.i
+ calli {{callingConvention}} void()
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var signature = reader.GetStandaloneSignature(Assert.Single(
+ Enumerable.Range(1, reader.GetTableRowCount(TableIndex.StandAloneSig))
+ .Select(MetadataTokens.StandaloneSignatureHandle)));
+ MethodSignature decoded =
+ signature.DecodeMethodSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null);
+
+ Assert.Equal((SignatureCallingConvention)expectedCallingConvention, decoded.Header.CallingConvention);
+ Assert.Equal(expectedInstance, decoded.Header.IsInstance);
+ Assert.True(
+ decoded.Header.HasExplicitThis == expectedExplicitThis,
+ $"Expected explicit-this={expectedExplicitThis}, header=0x{decoded.Header.RawValue:X2}");
+ Assert.Equal("void", decoded.ReturnType);
+ Assert.Empty(decoded.ParameterTypes);
+ }
+
+ [Fact]
+ public void LdstrInstruction_ByteArrayAndAnsiForms_EmitExpectedUserStrings()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static string GetUtf16() cil managed
+ {
+ ldstr bytearray(48 00 69 00)
+ ret
+ }
+
+ .method public static string GetAnsi() cil managed
+ {
+ ldstr ansi("AB")
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ Assert.Equal("Hi", ReadLdstrValue(pe, reader, "GetUtf16"));
+ Assert.Equal("\u4241", ReadLdstrValue(pe, reader, "GetAnsi"));
+ }
+
+ [Fact]
+ public void Ldstr_WithControlAndQuotedEscapes_EmitsExpectedUserStrings()
+ {
+ string source = """
+ .assembly extern System.Runtime { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test extends [System.Runtime]System.Object
+ {
+ .method public static string ControlEscapes() cil managed
+ {
+ ldstr "A\bB\fC\vD\aE\?F\'G"
+ ret
+ }
+
+ .method public static string QuotedLiteral() cil managed
+ {
+ ldstr "double\"quoted\?"
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ Assert.Equal("A\bB\fC\vD\aE?F'G", ReadLdstrValue(pe, reader, "ControlEscapes"));
+ Assert.Equal("double\"quoted?", ReadLdstrValue(pe, reader, "QuotedLiteral"));
+ }
+
+ [Fact]
+ public void Ldstr_WithLineContinuationAndShortOrHighOctalEscapes_EmitsExpectedUserString()
+ {
+ string source =
+ ".assembly extern System.Runtime { }\n" +
+ ".assembly test { }\n" +
+ ".class public auto ansi beforefieldinit Test extends [System.Runtime]System.Object\n" +
+ "{\n" +
+ " .method public static string FallbackEscapes() cil managed\n" +
+ " {\n" +
+ " ldstr \"line\\\n" +
+ " continued\\12\\400!\"\n" +
+ " ret\n" +
+ " }\n" +
+ "}\n";
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ Assert.Equal("linecontinued12400!", ReadLdstrValue(pe, reader, "FallbackEscapes"));
+ }
+
+ [Fact]
+ public void SwitchInstruction_IntegerOffsets_EmitsExpectedBranchTable()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static int32 M(int32 value) cil managed
+ {
+ ldarg.0
+ switch (3, 6)
+ ldc.i4.0
+ ret
+ ldc.i4.1
+ ret
+ ldc.i4.2
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ byte[] il = GetMethodIL(pe, "M");
+ int switchOffset = Array.IndexOf(il, (byte)0x45);
+
+ Assert.True(switchOffset >= 0);
+ Assert.Equal(2, BitConverter.ToInt32(il, switchOffset + 1));
+ Assert.Equal(3, BitConverter.ToInt32(il, switchOffset + 5));
+ Assert.Equal(6, BitConverter.ToInt32(il, switchOffset + 9));
+ }
+
+ [Fact]
+ public void LdtokenInstruction_TypeReference_EmitsTypeReferenceToken()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static valuetype [mscorlib]System.RuntimeTypeHandle GetHandle() cil managed
+ {
+ ldtoken [mscorlib]System.Int32
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ byte[] il = GetMethodIL(pe, "GetHandle");
+
+ Assert.Equal(0xD0, il[0]);
+ int token = BitConverter.ToInt32(il, 1);
+ var handle = MetadataTokens.EntityHandle(token);
+ Assert.Equal(HandleKind.TypeReference, handle.Kind);
+ Assert.Equal("Int32", reader.GetString(reader.GetTypeReference((TypeReferenceHandle)handle).Name));
+ }
+
+ [Fact]
+ public void InstructionOperandForms_EmitExpectedTokensAndRawOperands()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .field public static int32 Value
+
+ .method public specialname rtspecialname instance void .ctor() cil managed
+ {
+ ldarg.0
+ call instance void [mscorlib]System.Object::.ctor()
+ ret
+ }
+
+ .method public static void Exercise(object value) cil managed
+ {
+ br 0
+ ldsfld mdtoken(0x04000001)
+ pop
+ ldsfld int32 Test::Value
+ pop
+ ldsfld mdtoken(0x01000001)
+ pop
+ ldarg.0
+ unaligned. 1
+ ldind.i4
+ pop
+ ldarg.0
+ callvirt instance string [mscorlib]System.Object::ToString()
+ pop
+ newobj instance void Test::.ctor()
+ pop
+ ldc.i4.0
+ ldnull
+ ldc.i4.0
+ conv.i
+ calli default void(int32, string)
+ ldtoken Test
+ pop
+ switch ()
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ byte[] il = GetMethodIL(pe, "Exercise");
+
+ ImmutableArray fieldTokens =
+ DocumentCompilerTestHelpers.GetTokenOperands(pe, reader, "Exercise", ILOpcode.ldsfld);
+ Assert.Equal(3, fieldTokens.Length);
+ Assert.Equal(HandleKind.FieldDefinition, MetadataTokens.EntityHandle(fieldTokens[0]).Kind);
+ Assert.Equal(HandleKind.FieldDefinition, MetadataTokens.EntityHandle(fieldTokens[1]).Kind);
+ Assert.Equal(HandleKind.TypeReference, MetadataTokens.EntityHandle(fieldTokens[2]).Kind);
+
+ int callvirtToken =
+ DocumentCompilerTestHelpers.GetFirstTokenOperand(pe, reader, "Exercise", ILOpcode.callvirt);
+ Assert.Equal(
+ "ToString",
+ reader.GetString(reader.GetMemberReference((MemberReferenceHandle)MetadataTokens.EntityHandle(callvirtToken)).Name));
+
+ int newobjToken =
+ DocumentCompilerTestHelpers.GetFirstTokenOperand(pe, reader, "Exercise", ILOpcode.newobj);
+ Assert.Equal(
+ ".ctor",
+ reader.GetString(reader.GetMethodDefinition((MethodDefinitionHandle)MetadataTokens.EntityHandle(newobjToken)).Name));
+
+ int typeToken =
+ DocumentCompilerTestHelpers.GetFirstTokenOperand(pe, reader, "Exercise", ILOpcode.ldtoken);
+ Assert.Equal(
+ "Test",
+ reader.GetString(reader.GetTypeDefinition((TypeDefinitionHandle)MetadataTokens.EntityHandle(typeToken)).Name));
+
+ var calliSignature = reader.GetStandaloneSignature(
+ MetadataTokens.StandaloneSignatureHandle(reader.GetTableRowCount(TableIndex.StandAloneSig)));
+ MethodSignature decodedCalli =
+ calliSignature.DecodeMethodSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null);
+ Assert.Equal("void", decodedCalli.ReturnType);
+ Assert.Equal(new[] { "int32", "string" }, decodedCalli.ParameterTypes);
+
+ Assert.True(ContainsSequence(il, [0x38, 0x00, 0x00, 0x00, 0x00]));
+ Assert.True(ContainsSequence(il, [0xFE, 0x12, 0x01]));
+ Assert.True(ContainsSequence(il, [0x45, 0x00, 0x00, 0x00, 0x00]));
+ }
+
[Fact]
public void FieldRVA_DataLabelEmitted()
@@ -303,5 +1015,36 @@ .field public static int32 myData at D_1
Assert.True(fieldRvaCount >= 1, $"FieldRVA table should have at least 1 entry, has {fieldRvaCount}");
}
+ private static byte[] GetMethodIL(PEReader pe, string methodName)
+ {
+ var reader = pe.GetMetadataReader();
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .Single(definition => reader.GetString(definition.Name) == methodName);
+ return pe.GetMethodBody(method.RelativeVirtualAddress).GetILBytes()!;
+ }
+
+ private static string ReadLdstrValue(PEReader pe, MetadataReader reader, string methodName)
+ {
+ byte[] il = GetMethodIL(pe, methodName);
+ Assert.Equal(0x72, il[0]);
+ int token = BitConverter.ToInt32(il, 1);
+ Assert.Equal(0x70, (token >> 24) & 0xFF);
+ return reader.GetUserString(MetadataTokens.UserStringHandle(token & 0x00FFFFFF));
+ }
+
+ private static bool ContainsSequence(byte[] bytes, ReadOnlySpan sequence)
+ {
+ for (int i = 0; i <= bytes.Length - sequence.Length; i++)
+ {
+ if (bytes.AsSpan(i, sequence.Length).SequenceEqual(sequence))
+ {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/InteropTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/InteropTests.cs
index 6f5981510ca25e..a5312987a9d986 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/InteropTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/InteropTests.cs
@@ -1,10 +1,12 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Collections.Immutable;
using System.Reflection;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using System.Reflection.PortableExecutable;
+using System.Runtime.InteropServices;
using Internal.IL;
using Xunit;
using DocumentCompilerTestHelpers = ILAssembler.Tests.DocumentCompilerTestHelpers;
@@ -103,6 +105,575 @@ int32 GetCurrentProcessId() cil managed preservesig
Assert.True(method.Attributes.HasFlag(MethodAttributes.PinvokeImpl));
var import = method.GetImport();
Assert.False(import.Module.IsNil);
+ Assert.Equal("GetCurrentProcessId", reader.GetString(import.Name));
+ }
+
+ [Fact]
+ public void FixedArrayMarshalWithoutElementType_EmitsDescriptor()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .field assembly marshal(fixed array [1024]) bool[] Bool
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
+
+ Assert.Equal([0x1E, 0x84, 0x00], reader.GetBlobBytes(field.GetMarshallingDescriptor()));
+ }
+
+ [Fact]
+ public void SafeArrayMarshalWithoutVariantType_EmitsDescriptor()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .field public marshal(safearray) object[] Values
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
+
+ Assert.Equal([(byte)UnmanagedType.SafeArray, 0, 0], reader.GetBlobBytes(field.GetMarshallingDescriptor()));
+ }
+
+ [Fact]
+ public void VariantBoolMarshal_EmitsDescriptor()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .field public marshal(variant bool) bool Value
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
+
+ Assert.Equal([(byte)UnmanagedType.VariantBool], reader.GetBlobBytes(field.GetMarshallingDescriptor()));
+ }
+
+ [Theory]
+ [InlineData("[]", "2A50")]
+ [InlineData("[100]", "2A50006400")]
+ [InlineData("[100 + 1]", "2A50016401")]
+ [InlineData("[+ 1]", "2A5001")]
+ public void LPArrayMarshalSizeSyntax_EmitsNativeCompatibleDescriptor(string sizeSyntax, string expectedHex)
+ {
+ string source = $$"""
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .field public marshal({{sizeSyntax}}) int32[] Values
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
+
+ Assert.Equal(Convert.FromHexString(expectedHex), reader.GetBlobBytes(field.GetMarshallingDescriptor()));
+ }
+
+ [Theory]
+ [InlineData("int8", UnmanagedType.U1)]
+ [InlineData("int16", UnmanagedType.U2)]
+ [InlineData("int32", UnmanagedType.U4)]
+ [InlineData("int64", UnmanagedType.U8)]
+ public void UnsignedNativeTypeSpelling_EmitsUnsignedDescriptor(string type, UnmanagedType expected)
+ {
+ string source = $$"""
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .method public static bool marshal(unsigned {{type}}) F() cil managed
+ {
+ ldc.i4.0
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.GetMethodDefinition(MetadataTokens.MethodDefinitionHandle(1));
+ var returnParameter = method.GetParameters()
+ .Select(reader.GetParameter)
+ .Single(parameter => parameter.SequenceNumber == 0);
+
+ Assert.Equal([(byte)expected], reader.GetBlobBytes(returnParameter.GetMarshallingDescriptor()));
+ }
+
+ [Fact]
+ public void FixedSysStringMarshal_EmitsDescriptor()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .field public marshal(fixed sysstring [256]) string Value
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
+
+ Assert.Equal([0x17, 0x81, 0x00], reader.GetBlobBytes(field.GetMarshallingDescriptor()));
+ }
+
+ [Fact]
+ public void MarshalLpStrParameter_EmitsMarshallingDescriptorBlob()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void Print(string marshal(lpstr) text) cil managed
+ {
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var method = reader.MethodDefinitions
+ .Select(h => reader.GetMethodDefinition(h))
+ .First(m => reader.GetString(m.Name) == "Print");
+ var parameterHandle = Assert.Single(method.GetParameters());
+ var parameter = reader.GetParameter(parameterHandle);
+ var descriptor = parameter.GetMarshallingDescriptor();
+
+ Assert.False(descriptor.IsNil);
+ Assert.Equal("text", reader.GetString(parameter.Name));
+ Assert.Equal(1, reader.GetTableRowCount(TableIndex.FieldMarshal));
+ BlobReader descriptorReader = reader.GetBlobReader(descriptor);
+ Assert.Equal((byte)UnmanagedType.LPStr, descriptorReader.ReadByte());
+ Assert.Equal(0, descriptorReader.RemainingBytes);
+ }
+
+ [Fact]
+ public void PinvokeMethod_WithAlias_EmitsImportNameAndModuleReference()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .module test.dll
+ .class public auto ansi beforefieldinit NativeMethods extends [mscorlib]System.Object
+ {
+ .method public static pinvokeimpl("kernel32.dll" as "GetTickCount" winapi)
+ int32 GetTickCountManaged() cil managed preservesig
+ {
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .First(definition => reader.GetString(definition.Name) == "GetTickCountManaged");
+ var import = method.GetImport();
+ var moduleRef = reader.GetModuleReference(import.Module);
+
+ Assert.True(method.Attributes.HasFlag(MethodAttributes.PinvokeImpl));
+ Assert.Equal("GetTickCount", reader.GetString(import.Name));
+ Assert.Equal("kernel32.dll", reader.GetString(moduleRef.Name));
+ }
+
+ [Fact]
+ public void PinvokeMethod_EmitsImportMetadata()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .module test.dll
+ .class public auto ansi beforefieldinit NativeMethods extends [mscorlib]System.Object
+ {
+ .method public static pinvokeimpl("kernel32.dll" winapi)
+ int32 GetCurrentProcessId() cil managed preservesig
+ {
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .First(definition => reader.GetString(definition.Name) == "GetCurrentProcessId");
+ var import = method.GetImport();
+ var moduleRef = reader.GetModuleReference(import.Module);
+
+ Assert.True(method.Attributes.HasFlag(MethodAttributes.PinvokeImpl));
+ Assert.Equal("kernel32.dll", reader.GetString(moduleRef.Name));
+ Assert.Equal(1, reader.GetTableRowCount(TableIndex.ModuleRef));
+ }
+
+ [Theory]
+ [InlineData("nomangle", (int)MethodImportAttributes.ExactSpelling)]
+ [InlineData("ansi", (int)MethodImportAttributes.CharSetAnsi)]
+ [InlineData("unicode", (int)MethodImportAttributes.CharSetUnicode)]
+ [InlineData("autochar", (int)MethodImportAttributes.CharSetAuto)]
+ [InlineData("lasterr", (int)MethodImportAttributes.SetLastError)]
+ [InlineData("cdecl", (int)MethodImportAttributes.CallingConventionCDecl)]
+ [InlineData("stdcall", (int)MethodImportAttributes.CallingConventionStdCall)]
+ [InlineData("thiscall", (int)MethodImportAttributes.CallingConventionThisCall)]
+ [InlineData("fastcall", (int)MethodImportAttributes.CallingConventionFastCall)]
+ [InlineData("bestfit:on", (int)MethodImportAttributes.BestFitMappingEnable)]
+ [InlineData("bestfit:off", (int)MethodImportAttributes.BestFitMappingDisable)]
+ [InlineData("charmaperror:on", (int)MethodImportAttributes.ThrowOnUnmappableCharEnable)]
+ [InlineData("charmaperror:off", (int)MethodImportAttributes.ThrowOnUnmappableCharDisable)]
+ [InlineData("flags(0x1234)", 0x1234)]
+ public void PinvokeAttribute_EmitsExpectedImportFlags(string attribute, int expectedFlags)
+ {
+ string source = $$"""
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi NativeMethods extends [mscorlib]System.Object
+ {
+ .method public static pinvokeimpl("native.dll" {{attribute}})
+ void M() cil managed preservesig
+ {
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.GetMethodDefinition(Assert.Single(reader.MethodDefinitions));
+ var import = method.GetImport();
+
+ Assert.Equal((MethodImportAttributes)expectedFlags, import.Attributes);
+ Assert.Equal("M", reader.GetString(method.Name));
+ Assert.Equal("M", reader.GetString(import.Name));
+ Assert.Equal("native.dll", reader.GetString(reader.GetModuleReference(import.Module).Name));
+ }
+
+ [Theory]
+ [InlineData("bool", 0x02)]
+ [InlineData("int8", 0x03)]
+ [InlineData("uint8", 0x04)]
+ [InlineData("int16", 0x05)]
+ [InlineData("uint16", 0x06)]
+ [InlineData("int32", 0x07)]
+ [InlineData("uint32", 0x08)]
+ [InlineData("int64", 0x09)]
+ [InlineData("uint64", 0x0A)]
+ [InlineData("float32", 0x0B)]
+ [InlineData("float64", 0x0C)]
+ [InlineData("currency", 0x0F)]
+ [InlineData("bstr", 0x13)]
+ [InlineData("lpstr", 0x14)]
+ [InlineData("lpwstr", 0x15)]
+ [InlineData("lptstr", 0x16)]
+ [InlineData("iunknown", 0x19)]
+ [InlineData("idispatch", 0x1A)]
+ [InlineData("struct", 0x1B)]
+ [InlineData("interface", 0x1C)]
+ [InlineData("int", 0x1F)]
+ [InlineData("uint", 0x20)]
+ [InlineData("byvalstr", 0x22)]
+ [InlineData("ansi bstr", 0x23)]
+ [InlineData("tbstr", 0x24)]
+ [InlineData("method", 0x26)]
+ [InlineData("as any", 0x28)]
+ [InlineData("lpstruct", 0x2B)]
+ [InlineData("error", 0x2D)]
+ public void MarshalSimpleNativeType_EmitsExpectedDescriptor(string nativeType, int expectedTypeCode)
+ {
+ var (diagnostics, image) = CompileParameterMarshallingDescriptor(nativeType);
+ Assert.Empty(diagnostics);
+
+ using var pe = new PEReader(image);
+ var reader = pe.GetMetadataReader();
+ BlobReader descriptor = reader.GetBlobReader(GetOnlyMarshallingDescriptor(reader));
+
+ Assert.Equal((byte)expectedTypeCode, descriptor.ReadByte());
+ Assert.Equal(0, descriptor.RemainingBytes);
+ }
+
+ [Theory]
+ [InlineData("fixed sysstring[5]")]
+ [InlineData("fixed array[3] int16")]
+ [InlineData("iunknown(iidparam=2)")]
+ [InlineData("idispatch(iidparam=3)")]
+ [InlineData("interface(iidparam=4)")]
+ [InlineData("int32*")]
+ [InlineData("int32[]")]
+ [InlineData("int32[3]")]
+ [InlineData("int32[3+2]")]
+ [InlineData("int32[+2]")]
+ public void MarshalNativeTypeWithPayload_EmitsExpectedDescriptor(string nativeType)
+ {
+ var (diagnostics, image) = CompileParameterMarshallingDescriptor(nativeType);
+ if (nativeType == "int32*")
+ {
+ Assert.Contains(diagnostics, diagnostic => diagnostic.Id == DiagnosticIds.DeprecatedNativeType);
+ }
+ else
+ {
+ Assert.Empty(diagnostics);
+ }
+
+ using var pe = new PEReader(image);
+ var reader = pe.GetMetadataReader();
+ BlobReader descriptor = reader.GetBlobReader(GetOnlyMarshallingDescriptor(reader));
+
+ switch (nativeType)
+ {
+ case "fixed sysstring[5]":
+ Assert.Equal((byte)UnmanagedType.ByValTStr, descriptor.ReadByte());
+ Assert.Equal(5, descriptor.ReadCompressedInteger());
+ break;
+
+ case "fixed array[3] int16":
+ Assert.Equal((byte)UnmanagedType.ByValArray, descriptor.ReadByte());
+ Assert.Equal(3, descriptor.ReadCompressedInteger());
+ Assert.Equal((byte)UnmanagedType.I2, descriptor.ReadByte());
+ break;
+
+ case "iunknown(iidparam=2)":
+ Assert.Equal((byte)UnmanagedType.IUnknown, descriptor.ReadByte());
+ Assert.Equal(2, descriptor.ReadCompressedInteger());
+ break;
+
+ case "idispatch(iidparam=3)":
+ Assert.Equal((byte)UnmanagedType.IDispatch, descriptor.ReadByte());
+ Assert.Equal(3, descriptor.ReadCompressedInteger());
+ break;
+
+ case "interface(iidparam=4)":
+ Assert.Equal((byte)UnmanagedType.Interface, descriptor.ReadByte());
+ Assert.Equal(4, descriptor.ReadCompressedInteger());
+ break;
+
+ case "int32*":
+ Assert.Equal(0x10, descriptor.ReadByte());
+ Assert.Equal((byte)UnmanagedType.I4, descriptor.ReadByte());
+ break;
+
+ case "int32[]":
+ Assert.Equal((byte)UnmanagedType.LPArray, descriptor.ReadByte());
+ Assert.Equal((byte)UnmanagedType.I4, descriptor.ReadByte());
+ break;
+
+ case "int32[3]":
+ Assert.Equal((byte)UnmanagedType.LPArray, descriptor.ReadByte());
+ Assert.Equal((byte)UnmanagedType.I4, descriptor.ReadByte());
+ Assert.Equal(0, descriptor.ReadCompressedInteger());
+ Assert.Equal(3, descriptor.ReadCompressedInteger());
+ Assert.Equal(0, descriptor.ReadCompressedInteger());
+ break;
+
+ case "int32[3+2]":
+ Assert.Equal((byte)UnmanagedType.LPArray, descriptor.ReadByte());
+ Assert.Equal((byte)UnmanagedType.I4, descriptor.ReadByte());
+ Assert.Equal(2, descriptor.ReadCompressedInteger());
+ Assert.Equal(3, descriptor.ReadCompressedInteger());
+ Assert.Equal(1, descriptor.ReadCompressedInteger());
+ break;
+
+ case "int32[+2]":
+ Assert.Equal((byte)UnmanagedType.LPArray, descriptor.ReadByte());
+ Assert.Equal((byte)UnmanagedType.I4, descriptor.ReadByte());
+ Assert.Equal(2, descriptor.ReadCompressedInteger());
+ break;
+ }
+
+ Assert.Equal(0, descriptor.RemainingBytes);
+ }
+
+ [Theory]
+ [InlineData("custom(\"Marshaller.Type\", \"cookie\")", false)]
+ [InlineData("custom(\"guid\", \"native\", \"Marshaller.Type\", \"cookie\")", true)]
+ public void MarshalCustomMarshaller_EmitsStructuredDescriptor(
+ string nativeType,
+ bool usesDeprecatedForm)
+ {
+ var (diagnostics, image) = CompileParameterMarshallingDescriptor(nativeType);
+ if (usesDeprecatedForm)
+ {
+ Assert.Contains(
+ diagnostics,
+ diagnostic => diagnostic.Id == DiagnosticIds.DeprecatedCustomMarshaller);
+ }
+ else
+ {
+ Assert.Empty(diagnostics);
+ }
+
+ using var pe = new PEReader(image);
+ var reader = pe.GetMetadataReader();
+ BlobReader descriptor = reader.GetBlobReader(GetOnlyMarshallingDescriptor(reader));
+
+ Assert.Equal((byte)UnmanagedType.CustomMarshaler, descriptor.ReadByte());
+ if (usesDeprecatedForm)
+ {
+ Assert.Equal("guid", descriptor.ReadSerializedString());
+ Assert.Equal("native", descriptor.ReadSerializedString());
+ }
+ else
+ {
+ Assert.Equal(0, descriptor.ReadCompressedInteger());
+ Assert.Equal(0, descriptor.ReadCompressedInteger());
+ }
+
+ Assert.Equal("Marshaller.Type", descriptor.ReadSerializedString());
+ Assert.Equal("cookie", descriptor.ReadSerializedString());
+ Assert.Equal(0, descriptor.RemainingBytes);
+ }
+
+ [Theory]
+ [InlineData("variant", (int)VarEnum.VT_VARIANT)]
+ [InlineData("currency", (int)VarEnum.VT_CY)]
+ [InlineData("void", (int)VarEnum.VT_VOID)]
+ [InlineData("bool", (int)VarEnum.VT_BOOL)]
+ [InlineData("int8", (int)VarEnum.VT_I1)]
+ [InlineData("int16", (int)VarEnum.VT_I2)]
+ [InlineData("int32", (int)VarEnum.VT_I4)]
+ [InlineData("int64", (int)VarEnum.VT_I8)]
+ [InlineData("float32", (int)VarEnum.VT_R4)]
+ [InlineData("float64", (int)VarEnum.VT_R8)]
+ [InlineData("uint8", (int)VarEnum.VT_UI1)]
+ [InlineData("uint16", (int)VarEnum.VT_UI2)]
+ [InlineData("uint32", (int)VarEnum.VT_UI4)]
+ [InlineData("uint64", (int)VarEnum.VT_UI8)]
+ [InlineData("decimal", (int)VarEnum.VT_DECIMAL)]
+ [InlineData("date", (int)VarEnum.VT_DATE)]
+ [InlineData("bstr", (int)VarEnum.VT_BSTR)]
+ [InlineData("lpstr", (int)VarEnum.VT_LPSTR)]
+ [InlineData("lpwstr", (int)VarEnum.VT_LPWSTR)]
+ [InlineData("iunknown", (int)VarEnum.VT_UNKNOWN)]
+ [InlineData("idispatch", (int)VarEnum.VT_DISPATCH)]
+ [InlineData("safearray", (int)VarEnum.VT_SAFEARRAY)]
+ [InlineData("int", (int)VarEnum.VT_INT)]
+ [InlineData("uint", (int)VarEnum.VT_UINT)]
+ [InlineData("error", (int)VarEnum.VT_ERROR)]
+ [InlineData("hresult", (int)VarEnum.VT_HRESULT)]
+ [InlineData("carray", (int)VarEnum.VT_CARRAY)]
+ [InlineData("userdefined", (int)VarEnum.VT_USERDEFINED)]
+ [InlineData("record", (int)VarEnum.VT_RECORD)]
+ [InlineData("filetime", (int)VarEnum.VT_FILETIME)]
+ [InlineData("blob", (int)VarEnum.VT_BLOB)]
+ [InlineData("stream", (int)VarEnum.VT_STREAM)]
+ [InlineData("storage", (int)VarEnum.VT_STORAGE)]
+ [InlineData("streamed_object", (int)VarEnum.VT_STREAMED_OBJECT)]
+ [InlineData("stored_object", (int)VarEnum.VT_STORED_OBJECT)]
+ [InlineData("blob_object", (int)VarEnum.VT_BLOB_OBJECT)]
+ [InlineData("cf", (int)VarEnum.VT_CF)]
+ [InlineData("clsid", (int)VarEnum.VT_CLSID)]
+ [InlineData("int32[]", (int)(VarEnum.VT_I4 | VarEnum.VT_ARRAY))]
+ [InlineData("int32 vector", (int)(VarEnum.VT_I4 | VarEnum.VT_VECTOR))]
+ [InlineData("int32&", (int)(VarEnum.VT_I4 | VarEnum.VT_BYREF))]
+ public void MarshalSafeArrayVariantType_EmitsExpectedDescriptor(string variantType, int expectedVariantType)
+ {
+ var (diagnostics, image) = CompileParameterMarshallingDescriptor($"safearray {variantType}");
+ Assert.Empty(diagnostics);
+
+ using var pe = new PEReader(image);
+ var reader = pe.GetMetadataReader();
+ BlobHandle descriptorHandle = GetOnlyMarshallingDescriptor(reader);
+ BlobReader descriptor = reader.GetBlobReader(descriptorHandle);
+
+ Assert.True(
+ descriptor.ReadByte() == (byte)UnmanagedType.SafeArray,
+ Convert.ToHexString(reader.GetBlobBytes(descriptorHandle)));
+ Assert.Equal(expectedVariantType, descriptor.ReadCompressedInteger());
+ Assert.Equal(0, descriptor.ReadCompressedInteger());
+ Assert.Equal(0, descriptor.RemainingBytes);
+ }
+
+ [Theory]
+ [InlineData("variant", 0x0E)]
+ [InlineData("syschar", 0x0D)]
+ [InlineData("void", 0x01)]
+ [InlineData("decimal", 0x11)]
+ [InlineData("date", 0x12)]
+ [InlineData("objectref", 0x18)]
+ [InlineData("nested struct", 0x21)]
+ public void DeprecatedMarshalNativeType_EmitsDescriptorAndWarning(
+ string nativeType,
+ int expectedTypeCode)
+ {
+ var (diagnostics, image) = CompileParameterMarshallingDescriptor(nativeType);
+ Assert.Contains(diagnostics, diagnostic => diagnostic.Id == DiagnosticIds.DeprecatedNativeType);
+
+ using var pe = new PEReader(image);
+ var reader = pe.GetMetadataReader();
+ BlobReader descriptor = reader.GetBlobReader(GetOnlyMarshallingDescriptor(reader));
+
+ Assert.Equal((byte)expectedTypeCode, descriptor.ReadByte());
+ Assert.Equal(0, descriptor.RemainingBytes);
+ }
+
+ [Fact]
+ public void MarshalSafeArrayWithUserDefinedType_EmitsVariantAndTypeName()
+ {
+ var (diagnostics, image) =
+ CompileParameterMarshallingDescriptor("safearray int32, \"Contoso.Element\"");
+ Assert.Empty(diagnostics);
+
+ using var pe = new PEReader(image);
+ var reader = pe.GetMetadataReader();
+ BlobHandle descriptorHandle = GetOnlyMarshallingDescriptor(reader);
+ BlobReader descriptor = reader.GetBlobReader(descriptorHandle);
+
+ Assert.True(
+ descriptor.ReadByte() == (byte)UnmanagedType.SafeArray,
+ Convert.ToHexString(reader.GetBlobBytes(descriptorHandle)));
+ Assert.Equal((int)VarEnum.VT_I4, descriptor.ReadCompressedInteger());
+ Assert.Equal("Contoso.Element", descriptor.ReadSerializedString());
+ Assert.Equal(0, descriptor.RemainingBytes);
+ }
+
+ private static (ImmutableArray Diagnostics, ImmutableArray Image)
+ CompileParameterMarshallingDescriptor(string nativeType)
+ {
+ string source = $$"""
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test extends [mscorlib]System.Object
+ {
+ .method public static void M(object marshal({{nativeType}}) value) cil managed
+ {
+ ret
+ }
+ }
+ """;
+
+ var compiler = new DocumentCompiler();
+ var (diagnostics, result) = compiler.Compile(
+ new SourceText(source, "test.il"),
+ _ => { Assert.Fail("Expected no includes"); return default; },
+ _ => { Assert.Fail("Expected no resources"); return default; },
+ new Options());
+
+ Assert.NotNull(result);
+ var image = new BlobBuilder();
+ result!.Serialize(image);
+ return (diagnostics, image.ToImmutableArray());
+ }
+
+ private static BlobHandle GetOnlyMarshallingDescriptor(MetadataReader reader)
+ {
+ var method = reader.GetMethodDefinition(Assert.Single(reader.MethodDefinitions));
+ var parameter = reader.GetParameter(Assert.Single(method.GetParameters()));
+ Assert.Equal(1, reader.GetTableRowCount(TableIndex.FieldMarshal));
+ Assert.Equal("value", reader.GetString(parameter.Name));
+ return parameter.GetMarshallingDescriptor();
}
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/ManifestResourceTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/ManifestResourceTests.cs
new file mode 100644
index 00000000000000..afd14a7d827443
--- /dev/null
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/ManifestResourceTests.cs
@@ -0,0 +1,268 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using System.Buffers.Binary;
+using System.Collections.Generic;
+using System.Collections.Immutable;
+using System.Linq;
+using System.Reflection;
+using System.Reflection.Metadata;
+using System.Reflection.Metadata.Ecma335;
+using System.Reflection.PortableExecutable;
+using Xunit;
+
+namespace ILAssembler.Tests
+{
+ public class ManifestResourceTests
+ {
+ [Fact]
+ public void EmbeddedManifestResource_UsesResourceLocatorAliasAndEmitsResourceBytes()
+ {
+ string source = """
+ .assembly test { }
+ .mresource public Test.Resource as ResourceAlias
+ {
+ }
+ .class public auto ansi beforefieldinit Test
+ {
+ }
+ """;
+ byte[] expectedResourceBytes = [0x10, 0x20, 0x30, 0x40];
+ List requestedAliases = new();
+
+ var (diagnostics, imageBytes) = CompileAndGetImageBytes(
+ source,
+ new Options(),
+ resourceLocator: alias =>
+ {
+ requestedAliases.Add(alias);
+ return expectedResourceBytes;
+ });
+
+ Assert.Empty(diagnostics);
+ Assert.Equal(new[] { "ResourceAlias" }, requestedAliases);
+ Assert.False(imageBytes.IsDefault);
+
+ using var pe = new PEReader(imageBytes);
+ var reader = pe.GetMetadataReader();
+
+ var resource = reader.GetManifestResource(Assert.Single(reader.ManifestResources));
+ Assert.Equal("Test.Resource", reader.GetString(resource.Name));
+ Assert.Equal(ManifestResourceAttributes.Public, resource.Attributes);
+ Assert.True(resource.Implementation.IsNil);
+ Assert.Equal(0u, resource.Offset);
+ Assert.Equal(0, reader.GetTableRowCount(TableIndex.File));
+ Assert.Equal(expectedResourceBytes, ReadEmbeddedResource(pe, resource));
+ }
+
+ [Fact]
+ public void AssemblyBackedManifestResource_EmitsAssemblyImplementation()
+ {
+ string source = """
+ .assembly extern ResourceAssembly { }
+ .assembly test { }
+ .mresource private External.Resource
+ {
+ .assembly extern ResourceAssembly
+ }
+ .class public auto ansi beforefieldinit Test
+ {
+ }
+ """;
+ int resourceLocatorCallCount = 0;
+
+ var (diagnostics, imageBytes) = CompileAndGetImageBytes(
+ source,
+ new Options(),
+ resourceLocator: _ =>
+ {
+ resourceLocatorCallCount++;
+ return new byte[] { 0xFF };
+ });
+
+ Assert.Empty(diagnostics);
+ Assert.Equal(0, resourceLocatorCallCount);
+ Assert.False(imageBytes.IsDefault);
+
+ using var pe = new PEReader(imageBytes);
+ var reader = pe.GetMetadataReader();
+
+ var resource = reader.GetManifestResource(Assert.Single(reader.ManifestResources));
+ Assert.Equal("External.Resource", reader.GetString(resource.Name));
+ Assert.Equal(ManifestResourceAttributes.Private, resource.Attributes);
+ Assert.Equal(HandleKind.AssemblyReference, resource.Implementation.Kind);
+ Assert.Equal("ResourceAssembly", reader.GetString(reader.GetAssemblyReference((AssemblyReferenceHandle)resource.Implementation).Name));
+ Assert.Equal(0u, resource.Offset);
+ }
+
+ [Fact]
+ public void MissingEmbeddedManifestResource_WithErrorTolerantOption_StillEmitsMetadataRow()
+ {
+ string source = """
+ .assembly test { }
+ .mresource public Missing.Resource as MissingAlias
+ {
+ }
+ .class public auto ansi beforefieldinit Test
+ {
+ }
+ """;
+
+ var (strictDiagnostics, strictImageBytes) = CompileAndGetImageBytes(
+ source,
+ new Options(),
+ resourceLocator: alias =>
+ {
+ Assert.Equal("MissingAlias", alias);
+ return null!;
+ });
+
+ var strictDiagnostic = Assert.Single(strictDiagnostics.Where(d => d.Id == DiagnosticIds.FileNotFound));
+ Assert.Equal(DiagnosticSeverity.Error, strictDiagnostic.Severity);
+ Assert.Equal("test.il", strictDiagnostic.Location.Source.Path);
+ Assert.True(strictImageBytes.IsDefault);
+
+ var (tolerantDiagnostics, tolerantImageBytes) = CompileAndGetImageBytes(
+ source,
+ new Options { ErrorTolerant = true },
+ resourceLocator: alias =>
+ {
+ Assert.Equal("MissingAlias", alias);
+ return null!;
+ });
+
+ var tolerantDiagnostic = Assert.Single(tolerantDiagnostics.Where(d => d.Id == DiagnosticIds.FileNotFound));
+ Assert.Equal(DiagnosticSeverity.Error, tolerantDiagnostic.Severity);
+ Assert.False(tolerantImageBytes.IsDefault);
+
+ using var pe = new PEReader(tolerantImageBytes);
+ var reader = pe.GetMetadataReader();
+ var resource = reader.GetManifestResource(Assert.Single(reader.ManifestResources));
+
+ Assert.Equal("Missing.Resource", reader.GetString(resource.Name));
+ Assert.True(resource.Implementation.IsNil);
+ Assert.Equal(0u, resource.Offset);
+ Assert.Equal(0, pe.PEHeaders.CorHeader!.ResourcesDirectory.Size);
+ }
+
+ [Fact]
+ public void DeterministicOption_WithEmbeddedManifestResource_ProducesValidResourceImage()
+ {
+ string source = """
+ .assembly test { }
+ .mresource public Stable.Resource as StableAlias
+ {
+ }
+ .class public auto ansi beforefieldinit Test
+ {
+ }
+ """;
+ byte[] expectedResourceBytes = [0x01, 0x23, 0x45, 0x67];
+
+ var (firstDiagnostics, firstImageBytes) = CompileAndGetImageBytes(
+ source,
+ new Options { Deterministic = true },
+ resourceLocator: alias =>
+ {
+ Assert.Equal("StableAlias", alias);
+ return expectedResourceBytes;
+ });
+ Assert.Empty(firstDiagnostics);
+ Assert.False(firstImageBytes.IsDefault);
+
+ using var firstPe = new PEReader(firstImageBytes);
+ var firstReader = firstPe.GetMetadataReader();
+ var firstResource = firstReader.GetManifestResource(Assert.Single(firstReader.ManifestResources));
+
+ Assert.NotEqual(Guid.Empty, firstReader.GetGuid(firstReader.GetModuleDefinition().Mvid));
+ Assert.Equal("Stable.Resource", firstReader.GetString(firstResource.Name));
+ Assert.Equal(expectedResourceBytes, ReadEmbeddedResource(firstPe, firstResource));
+ }
+
+ [Fact]
+ public void FileBackedManifestResource_EmitsFileImplementationOffsetAndCustomAttribute()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .file nometadata Data.resources .hash = (01 02 03 04)
+ .mresource public File.Resource
+ {
+ .file Data.resources at 12
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ }
+ .class public auto ansi Test extends [mscorlib]System.Object { }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var resourceHandle = Assert.Single(reader.ManifestResources);
+ var resource = reader.GetManifestResource(resourceHandle);
+
+ Assert.Equal("File.Resource", reader.GetString(resource.Name));
+ Assert.Equal(ManifestResourceAttributes.Public, resource.Attributes);
+ Assert.Equal(12u, resource.Offset);
+ Assert.Equal(HandleKind.AssemblyFile, resource.Implementation.Kind);
+
+ var file = reader.GetAssemblyFile((AssemblyFileHandle)resource.Implementation);
+ Assert.Equal("Data.resources", reader.GetString(file.Name));
+ Assert.False(file.ContainsMetadata);
+ Assert.Equal([0x01, 0x02, 0x03, 0x04], reader.GetBlobBytes(file.HashValue));
+
+ var attribute = reader.GetCustomAttribute(Assert.Single(reader.GetCustomAttributes(resourceHandle)));
+ Assert.Equal(
+ [0x01, 0x00, 0x00, 0x00],
+ reader.GetBlobBytes(attribute.Value));
+ }
+
+ private static (ImmutableArray Diagnostics, ImmutableArray ImageBytes) CompileAndGetImageBytes(
+ string source,
+ Options options,
+ Func? includedDocumentLoader = null,
+ Func? resourceLocator = null)
+ {
+ return CompileAndGetImageBytes(
+ ImmutableArray.Create(new SourceText(source, "test.il")),
+ options,
+ includedDocumentLoader,
+ resourceLocator);
+ }
+
+ private static (ImmutableArray Diagnostics, ImmutableArray ImageBytes) CompileAndGetImageBytes(
+ ImmutableArray documents,
+ Options options,
+ Func? includedDocumentLoader = null,
+ Func? resourceLocator = null)
+ {
+ var compiler = new DocumentCompiler();
+ var (diagnostics, image) = compiler.Compile(
+ documents,
+ includedDocumentLoader ?? (_ => throw new InvalidOperationException("Unexpected include")),
+ resourceLocator ?? (_ => throw new InvalidOperationException("Unexpected resource")),
+ options);
+
+ if (image is null)
+ {
+ return (diagnostics, default);
+ }
+
+ var blobBuilder = new BlobBuilder();
+ image.Serialize(blobBuilder);
+ return (diagnostics, blobBuilder.ToImmutableArray());
+ }
+
+ private static byte[] ReadEmbeddedResource(PEReader pe, ManifestResource resource)
+ {
+ Assert.True(resource.Implementation.IsNil);
+
+ int resourcesRva = pe.PEHeaders.CorHeader!.ResourcesDirectory.RelativeVirtualAddress;
+ Assert.NotEqual(0, resourcesRva);
+
+ var resourceBlob = pe.GetSectionData(resourcesRva).GetContent();
+ int offset = checked((int)resource.Offset);
+ int length = BinaryPrimitives.ReadInt32LittleEndian(resourceBlob.AsSpan(offset, sizeof(int)));
+ return resourceBlob.AsSpan(offset + sizeof(int), length).ToArray();
+ }
+ }
+}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/MemberReferenceTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/MemberReferenceTests.cs
index e7fe59d280196d..30a0fa340e548d 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/MemberReferenceTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/MemberReferenceTests.cs
@@ -1,18 +1,11 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-
using System;
-using System.Buffers.Binary;
-using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
-using System.Reflection;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
-using System.Reflection.PortableExecutable;
-using System.Text;
-using System.Threading.Tasks;
using Internal.IL;
using Xunit;
using DocumentCompilerTestHelpers = ILAssembler.Tests.DocumentCompilerTestHelpers;
@@ -21,5 +14,419 @@ namespace ILAssembler.Tests
{
public class MemberReferenceTests
{
+ [Fact]
+ public void UnqualifiedGlobalMethodReference_ResolvesToMethodDefinition()
+ {
+ string source = """
+ .assembly test { }
+ .method public static int32 Helper() cil managed
+ {
+ ldc.i4.s 100
+ ret
+ }
+ .class public auto ansi Program
+ {
+ .method public static int32 Main() cil managed
+ {
+ call int32 Helper()
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ int token = DocumentCompilerTestHelpers.GetFirstTokenOperand(pe, reader, "Main", ILOpcode.call);
+ EntityHandle handle = MetadataTokens.EntityHandle(token);
+
+ Assert.Equal(HandleKind.MethodDefinition, handle.Kind);
+ Assert.Equal("Helper", reader.GetString(reader.GetMethodDefinition((MethodDefinitionHandle)handle).Name));
+ }
+
+ [Fact]
+ public void UnqualifiedGlobalFieldReference_ResolvesToFieldDefinition()
+ {
+ string source = """
+ .assembly test { }
+ .field public static int32 Value
+ .class public auto ansi Program
+ {
+ .method public static void Main() cil managed
+ {
+ ldsfld int32 Value
+ pop
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ int token = DocumentCompilerTestHelpers.GetFirstTokenOperand(pe, reader, "Main", ILOpcode.ldsfld);
+
+ DocumentCompilerTestHelpers.AssertFieldDefToken(reader, token, "Value");
+ }
+
+ [Fact]
+ public void PrivateScopeDisplaySuffix_IsNotStoredInMemberNames()
+ {
+ string source = """
+ .assembly test { }
+ .field privatescope static int32 'Value$PST04000001'
+ .method privatescope static void 'Helper$PST06000001'() cil managed
+ {
+ ret
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
+ var method = reader.GetMethodDefinition(MetadataTokens.MethodDefinitionHandle(1));
+
+ Assert.Equal("Value", reader.GetString(field.Name));
+ Assert.Equal("Helper", reader.GetString(method.Name));
+ }
+
+ [Fact]
+ public void PrivateScopeDisplaySuffix_DisambiguatesMethodReferences()
+ {
+ string source = """
+ .assembly test { }
+ .method privatescope static void 'Helper$PST06000001'() cil managed
+ {
+ ret
+ }
+ .method privatescope static void 'Helper$PST06000002'() cil managed
+ {
+ ret
+ }
+ .method public static void Caller() cil managed
+ {
+ call void 'Helper$PST06000002'()
+ ret
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ int token = DocumentCompilerTestHelpers.GetFirstTokenOperand(pe, reader, "Caller", ILOpcode.call);
+
+ Assert.Equal(MetadataTokens.GetToken(MetadataTokens.MethodDefinitionHandle(2)), token);
+ Assert.All(reader.MethodDefinitions.Take(2), handle => Assert.Equal("Helper", reader.GetString(reader.GetMethodDefinition(handle).Name)));
+ }
+
+ [Fact]
+ public void NonPrivateScopeMember_PreservesPrivateScopeLikeSuffix()
+ {
+ string source = """
+ .assembly test { }
+ .field public static int32 'Value$PST04000001'
+ .method public static void 'Helper$PST06000001'() cil managed
+ {
+ ret
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
+ var method = reader.GetMethodDefinition(MetadataTokens.MethodDefinitionHandle(1));
+
+ Assert.Equal("Value$PST04000001", reader.GetString(field.Name));
+ Assert.Equal("Helper$PST06000001", reader.GetString(method.Name));
+ }
+
+ [Fact]
+ public void PrivateScopeVarArgReference_PreservesExplicitThisAndStripsDisplaySuffix()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .method privatescope explicit instance vararg void 'Helper$PST06000001'(int32 value) cil managed
+ {
+ ret
+ }
+ .method public static void Caller() cil managed
+ {
+ ldnull
+ ldc.i4.0
+ ldstr ""
+ call explicit instance vararg void Test::'Helper$PST06000001'(int32, ..., string)
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var memberReference = reader.GetMemberReference(Assert.Single(reader.MemberReferences));
+
+ Assert.Equal(HandleKind.MethodDefinition, memberReference.Parent.Kind);
+ Assert.Equal("Helper", reader.GetString(memberReference.Name));
+ Assert.Equal(0x65, reader.GetBlobBytes(memberReference.Signature)[0]);
+ }
+
+ [Fact]
+ public void ExternalVarArgReference_DoesNotShiftLaterMemberReferenceTokens()
+ {
+ string source = """
+ .assembly extern External { }
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .method public static void VarArgCaller() cil managed
+ {
+ ldc.i4.0
+ ldstr ""
+ call vararg void [External]ExternalType::VarArg(int32, ..., string)
+ ret
+ }
+ .method public static void NormalCaller() cil managed
+ {
+ call void [External]ExternalType::Normal()
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ int varArgToken = DocumentCompilerTestHelpers.GetFirstTokenOperand(pe, reader, "VarArgCaller", ILOpcode.call);
+ int normalToken = DocumentCompilerTestHelpers.GetFirstTokenOperand(pe, reader, "NormalCaller", ILOpcode.call);
+
+ Assert.Equal("VarArg", reader.GetString(reader.GetMemberReference((MemberReferenceHandle)MetadataTokens.EntityHandle(varArgToken)).Name));
+ Assert.Equal("Normal", reader.GetString(reader.GetMemberReference((MemberReferenceHandle)MetadataTokens.EntityHandle(normalToken)).Name));
+ Assert.Equal(2, reader.GetTableRowCount(TableIndex.MemberRef));
+ }
+
+ [Fact]
+ public void LocalVarargCallSite_WithLocalOptionalType_EmitsSentinelMemberRefSignature()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit Payload extends [mscorlib]System.Object
+ {
+ }
+ .class public auto ansi beforefieldinit Printer extends [mscorlib]System.Object
+ {
+ .method public static vararg void Print(string format) cil managed
+ {
+ ret
+ }
+
+ .method public static void Caller() cil managed
+ {
+ ldstr "payload"
+ ldnull
+ call vararg void Printer::Print(string, ..., class [test]Payload)
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var memberRefHandle = Assert.Single(reader.MemberReferences);
+ var memberRef = reader.GetMemberReference(memberRefHandle);
+ Assert.Equal("Print", reader.GetString(memberRef.Name));
+ Assert.Equal(HandleKind.MethodDefinition, memberRef.Parent.Kind);
+
+ // The optional vararg parameter is carried by the MemberRef signature only.
+ Assert.Equal(1, reader.GetTableRowCount(TableIndex.Param));
+
+ MethodSignature signature =
+ memberRef.DecodeMethodSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null);
+ Assert.Equal(SignatureCallingConvention.VarArgs, signature.Header.CallingConvention);
+ Assert.Equal(1, signature.RequiredParameterCount);
+ Assert.Equal("void", signature.ReturnType);
+ Assert.Equal(new[] { "string", "Payload" }, signature.ParameterTypes);
+
+ int callToken = DocumentCompilerTestHelpers.GetFirstTokenOperand(pe, reader, "Caller", ILOpcode.call);
+ Assert.Equal(MetadataTokens.GetToken(memberRefHandle), callToken);
+ }
+
+ [Fact]
+ public void FieldReference_OnLocalGenericInstantiation_UsesTypeSpecParent()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit Box`1 extends [mscorlib]System.Object
+ {
+ .field public !0 Value
+ }
+ .class public auto ansi beforefieldinit Caller extends [mscorlib]System.Object
+ {
+ .method public static int32 Read(class Box`1 boxInstance) cil managed
+ {
+ ldarg.0
+ ldfld int32 class Box`1::Value
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var memberRefHandle = Assert.Single(reader.MemberReferences);
+ var memberRef = reader.GetMemberReference(memberRefHandle);
+ Assert.Equal("Value", reader.GetString(memberRef.Name));
+ Assert.Equal(HandleKind.TypeSpecification, memberRef.Parent.Kind);
+ Assert.Equal(
+ "int32",
+ memberRef.DecodeFieldSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
+
+ var parentTypeSpec = reader.GetTypeSpecification((TypeSpecificationHandle)memberRef.Parent);
+ Assert.Equal(
+ "Box`1",
+ parentTypeSpec.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
+
+ int fieldToken = DocumentCompilerTestHelpers.GetFirstTokenOperand(pe, reader, "Read", ILOpcode.ldfld);
+ Assert.Equal(MetadataTokens.GetToken(memberRefHandle), fieldToken);
+ }
+
+ [Fact]
+ public void MethodReference_OnLocalGenericInstantiation_UsesTypeSpecParent()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit Box`1 extends [mscorlib]System.Object
+ {
+ .method public hidebysig instance void Touch() cil managed
+ {
+ ret
+ }
+ }
+ .class public auto ansi beforefieldinit Caller extends [mscorlib]System.Object
+ {
+ .method public static void Invoke(class Box`1 boxInstance) cil managed
+ {
+ ldarg.0
+ call instance void class Box`1::Touch()
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var memberRefHandle = Assert.Single(reader.MemberReferences);
+ var memberRef = reader.GetMemberReference(memberRefHandle);
+ Assert.Equal("Touch", reader.GetString(memberRef.Name));
+ Assert.Equal(HandleKind.TypeSpecification, memberRef.Parent.Kind);
+
+ MethodSignature signature =
+ memberRef.DecodeMethodSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null);
+ Assert.True(signature.Header.IsInstance);
+ Assert.Equal("void", signature.ReturnType);
+ Assert.Empty(signature.ParameterTypes);
+
+ var parentTypeSpec = reader.GetTypeSpecification((TypeSpecificationHandle)memberRef.Parent);
+ Assert.Equal(
+ "Box`1",
+ parentTypeSpec.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
+
+ int callToken = DocumentCompilerTestHelpers.GetFirstTokenOperand(pe, reader, "Invoke", ILOpcode.call);
+ Assert.Equal(MetadataTokens.GetToken(memberRefHandle), callToken);
+ }
+
+ [Fact]
+ public void MethodReferenceForms_EmitResolvableCallTokensAndMethodSpecification()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .typedef method void Test::Target() as TargetAlias
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void Target() cil managed
+ {
+ ret
+ }
+
+ .method public static void GenericTarget() cil managed
+ {
+ ret
+ }
+
+ .method public static void Caller() cil managed
+ {
+ call void Target()
+ call void Test::GenericTarget<[1]>()
+ call void Test::GenericTarget()
+ call mdtoken(0x06000001)
+ call TargetAlias
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ ImmutableArray callTokens =
+ DocumentCompilerTestHelpers.GetTokenOperands(pe, reader, "Caller", ILOpcode.call);
+
+ Assert.Equal(5, callTokens.Length);
+ Assert.Equal("Target", GetMethodName(reader, MetadataTokens.EntityHandle(callTokens[0])));
+ Assert.Equal("GenericTarget", GetMethodName(reader, MetadataTokens.EntityHandle(callTokens[1])));
+ Assert.Equal(HandleKind.MethodSpecification, MetadataTokens.EntityHandle(callTokens[2]).Kind);
+ Assert.Equal("Target", GetMethodName(reader, MetadataTokens.EntityHandle(callTokens[3])));
+ Assert.Equal("Target", GetMethodName(reader, MetadataTokens.EntityHandle(callTokens[4])));
+
+ var methodSpecification = reader.GetMethodSpecification(
+ (MethodSpecificationHandle)MetadataTokens.EntityHandle(callTokens[2]));
+ Assert.Equal(
+ new[] { "int32" },
+ methodSpecification.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
+ }
+
+ [Fact]
+ public void ExternalFieldReference_EmitsMemberRefFieldSignature()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit Reader extends [mscorlib]System.Object
+ {
+ .method public static string GetEmpty() cil managed
+ {
+ ldsfld string [mscorlib]System.String::Empty
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var memberRefHandle = Assert.Single(reader.MemberReferences);
+ var memberRef = reader.GetMemberReference(memberRefHandle);
+ var parent = reader.GetTypeReference((TypeReferenceHandle)memberRef.Parent);
+
+ Assert.Equal("Empty", reader.GetString(memberRef.Name));
+ Assert.Equal("String", reader.GetString(parent.Name));
+ Assert.Equal(
+ "string",
+ memberRef.DecodeFieldSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
+ }
+
+ private static string GetMethodName(MetadataReader reader, EntityHandle handle)
+ {
+ return handle.Kind switch
+ {
+ HandleKind.MethodDefinition =>
+ reader.GetString(reader.GetMethodDefinition((MethodDefinitionHandle)handle).Name),
+ HandleKind.MemberReference =>
+ reader.GetString(reader.GetMemberReference((MemberReferenceHandle)handle).Name),
+ _ => throw new InvalidOperationException($"Unexpected method handle kind {handle.Kind}."),
+ };
+ }
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/MethodTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/MethodTests.cs
index 0490d709aaf742..07c82d2d011a5c 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/MethodTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/MethodTests.cs
@@ -96,6 +96,144 @@ .method public static vararg void VarargMethod(int32 x) cil managed
Assert.Equal(0x5, header & 0x0F);
}
+ [Fact]
+ public void MethodAndImplementationAttributes_EmitExpectedFlags()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public abstract auto ansi Test extends [mscorlib]System.Object
+ {
+ .method private static void PrivateMethod() cil managed { ret }
+ .method family static void FamilyMethod() cil managed { ret }
+ .method assembly static void AssemblyMethod() cil managed { ret }
+ .method famandassem static void FamAndAssemMethod() cil managed { ret }
+ .method famorassem static void FamOrAssemMethod() cil managed { ret }
+ .method privatescope static void PrivateScopeMethod() cil managed { ret }
+ .method public virtual strict instance void StrictMethod() cil managed { ret }
+ .method public static unmanagedexp void UnmanagedExportMethod() cil managed { ret }
+ .method public static reqsecobj void RequireSecurityObjectMethod() cil managed { ret }
+ .method flags(0x16) void FlaggedMethod() cil managed { ret }
+
+ .method public static void NativeMethod() native unmanaged { }
+ .method public static void OptilMethod() optil managed { }
+ .method public static void RuntimeMethod() runtime managed internalcall { }
+ .method public static void ForwardMethod() cil managed forwardref preservesig synchronized noinlining aggressiveinlining nooptimization aggressiveoptimization async { }
+ .method public static void FlaggedImplMethod() flags(0x1000) { }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var methods = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .ToDictionary(method => reader.GetString(method.Name));
+
+ Assert.Equal(MethodAttributes.Private, methods["PrivateMethod"].Attributes & MethodAttributes.MemberAccessMask);
+ Assert.Equal(MethodAttributes.Family, methods["FamilyMethod"].Attributes & MethodAttributes.MemberAccessMask);
+ Assert.Equal(MethodAttributes.Assembly, methods["AssemblyMethod"].Attributes & MethodAttributes.MemberAccessMask);
+ Assert.Equal(MethodAttributes.FamANDAssem, methods["FamAndAssemMethod"].Attributes & MethodAttributes.MemberAccessMask);
+ Assert.Equal(MethodAttributes.FamORAssem, methods["FamOrAssemMethod"].Attributes & MethodAttributes.MemberAccessMask);
+ Assert.Equal(MethodAttributes.PrivateScope, methods["PrivateScopeMethod"].Attributes & MethodAttributes.MemberAccessMask);
+ Assert.True(methods["StrictMethod"].Attributes.HasFlag(MethodAttributes.CheckAccessOnOverride));
+ Assert.True(methods["UnmanagedExportMethod"].Attributes.HasFlag(MethodAttributes.UnmanagedExport));
+ Assert.True(methods["RequireSecurityObjectMethod"].Attributes.HasFlag(MethodAttributes.RequireSecObject));
+ Assert.Equal((MethodAttributes)0x16, methods["FlaggedMethod"].Attributes);
+
+ Assert.Equal(
+ MethodImplAttributes.Native | MethodImplAttributes.Unmanaged,
+ methods["NativeMethod"].ImplAttributes & (MethodImplAttributes.CodeTypeMask | MethodImplAttributes.ManagedMask));
+ Assert.Equal(MethodImplAttributes.OPTIL, methods["OptilMethod"].ImplAttributes & MethodImplAttributes.CodeTypeMask);
+ Assert.Equal(MethodImplAttributes.Runtime, methods["RuntimeMethod"].ImplAttributes & MethodImplAttributes.CodeTypeMask);
+ Assert.True(methods["RuntimeMethod"].ImplAttributes.HasFlag(MethodImplAttributes.InternalCall));
+
+ MethodImplAttributes forwardFlags = methods["ForwardMethod"].ImplAttributes;
+ Assert.True(forwardFlags.HasFlag(MethodImplAttributes.ForwardRef));
+ Assert.True(forwardFlags.HasFlag(MethodImplAttributes.PreserveSig));
+ Assert.True(forwardFlags.HasFlag(MethodImplAttributes.Synchronized));
+ Assert.True(forwardFlags.HasFlag(MethodImplAttributes.NoInlining));
+ Assert.True(forwardFlags.HasFlag(MethodImplAttributes.AggressiveInlining));
+ Assert.True(forwardFlags.HasFlag(MethodImplAttributes.NoOptimization));
+ Assert.True(forwardFlags.HasFlag(MethodImplAttributes.AggressiveOptimization));
+ Assert.True(forwardFlags.HasFlag(MethodImplAttributes.Async));
+ Assert.Equal((MethodImplAttributes)0x1000, methods["FlaggedImplMethod"].ImplAttributes);
+ }
+
+ [Fact]
+ public void MethodBodyDirectives_EmitRawInstructionLocalsInitializationAndMappedData()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public explicit ansi sealed DataHolder extends [mscorlib]System.ValueType
+ {
+ .size 4
+ .field [0] public static int32 Value at MethodData
+ .method public static void M() cil managed
+ {
+ .maxstack 1
+ .zeroinit
+ .locals (int32 local)
+ .emitbyte 0x00
+ {
+ nop
+ }
+ .data MethodData = int32(42)
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var type = reader.TypeDefinitions
+ .Select(reader.GetTypeDefinition)
+ .Single(definition => reader.GetString(definition.Name) == "DataHolder");
+ var method = type.GetMethods()
+ .Select(reader.GetMethodDefinition)
+ .Single(definition => reader.GetString(definition.Name) == "M");
+ var field = reader.GetFieldDefinition(Assert.Single(type.GetFields()));
+ var body = pe.GetMethodBody(method.RelativeVirtualAddress);
+
+ Assert.Equal([0x00, 0x00, 0x2A], body.GetILBytes());
+ Assert.True(body.LocalVariablesInitialized);
+ Assert.Equal(
+ new[] { "int32" },
+ reader.GetStandaloneSignature(body.LocalSignature)
+ .DecodeLocalSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
+ Assert.Equal(
+ 42,
+ BitConverter.ToInt32(
+ pe.GetSectionData(field.GetRelativeVirtualAddress()).GetContent().AsSpan(0, sizeof(int))));
+ }
+
+ [Fact]
+ public void EntryPointMethod_SetsCorHeaderEntryPointToken()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit Program extends [mscorlib]System.Object
+ {
+ .method public static int32 Main() cil managed
+ {
+ .entrypoint
+ ldc.i4.0
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var mainHandle = reader.MethodDefinitions
+ .First(handle => reader.GetString(reader.GetMethodDefinition(handle).Name) == "Main");
+
+ Assert.Equal(
+ MetadataTokens.GetToken(mainHandle),
+ pe.PEHeaders.CorHeader!.EntryPointTokenOrRelativeVirtualAddress);
+ }
+
[Fact]
public void ArrayType_InMethodSignature_ParsedCorrectly()
@@ -195,6 +333,67 @@ .method public hidebysig newslot virtual instance object GetVal(string& res) cil
Assert.Equal(1, methodImplCount);
}
+ [Theory]
+ [InlineData(".override method instance int32 [External]IFoo::M(string) with method instance int32 Bar::Impl(string)")]
+ [InlineData(".override [External]IFoo::M with instance int32 Bar::Impl(string)")]
+ public void ClassScopeOverride_EmitsMethodImpl(string overrideDirective)
+ {
+ string source = $$"""
+ .assembly extern mscorlib { }
+ .assembly extern External { }
+ .assembly TestOverride { }
+ .class public auto ansi beforefieldinit Bar extends [mscorlib]System.Object implements [External]IFoo
+ {
+ {{overrideDirective}}
+ .method public hidebysig newslot virtual final instance int32 Impl(string value) cil managed
+ {
+ ldc.i4.s 42
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var bar = reader.TypeDefinitions
+ .Select(handle => (Handle: handle, Definition: reader.GetTypeDefinition(handle)))
+ .Single(type => reader.GetString(type.Definition.Name) == "Bar");
+ var implementation = reader.GetMethodImplementation(Assert.Single(bar.Definition.GetMethodImplementations()));
+
+ Assert.Equal(HandleKind.MethodDefinition, implementation.MethodBody.Kind);
+ Assert.Equal("Impl", reader.GetString(reader.GetMethodDefinition((MethodDefinitionHandle)implementation.MethodBody).Name));
+ Assert.Equal("M", reader.GetString(reader.GetMemberReference((MemberReferenceHandle)implementation.MethodDeclaration).Name));
+ }
+
+ [Fact]
+ public void ClassScopeShortOverride_EmitsDeclarationMemberRefFirst()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly extern External { }
+ .assembly TestOverride { }
+ .class public auto ansi Bar extends [mscorlib]System.Object
+ {
+ .override [External]IFoo::M with instance int32 [External]Body::Impl(string)
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var bar = reader.TypeDefinitions
+ .Select(handle => reader.GetTypeDefinition(handle))
+ .Single(type => reader.GetString(type.Name) == "Bar");
+ var implementation = reader.GetMethodImplementation(Assert.Single(bar.GetMethodImplementations()));
+
+ Assert.Equal(HandleKind.MemberReference, implementation.MethodDeclaration.Kind);
+ Assert.Equal(HandleKind.MemberReference, implementation.MethodBody.Kind);
+ Assert.True(
+ MetadataTokens.GetRowNumber((MemberReferenceHandle)implementation.MethodDeclaration)
+ < MetadataTokens.GetRowNumber((MemberReferenceHandle)implementation.MethodBody));
+ Assert.Equal("M", reader.GetString(reader.GetMemberReference((MemberReferenceHandle)implementation.MethodDeclaration).Name));
+ Assert.Equal("Impl", reader.GetString(reader.GetMemberReference((MemberReferenceHandle)implementation.MethodBody).Name));
+ }
+
[Fact]
public void MultipleOverrides_EmitsAllMethodImpls()
@@ -241,6 +440,118 @@ .method public hidebysig newslot virtual instance object Func2(string& res) cil
Assert.Equal(2, methodImplCount);
}
+ [Fact]
+ public void ClassLevelOverrideForms_EmitMethodImplementations()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Base extends [mscorlib]System.Object
+ {
+ .method public virtual instance void M() cil managed { ret }
+ .method public virtual instance void G() cil managed { ret }
+ }
+ .class public auto ansi Derived extends Base
+ {
+ .method public virtual instance void BodyM() cil managed { ret }
+ .method public virtual instance void BodyG() cil managed { ret }
+
+ .override Base::M with instance void Derived::BodyM()
+ .override method instance void Base::G<[1]>() with method instance void Derived::BodyG<[1]>()
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var derived = reader.TypeDefinitions
+ .Select(reader.GetTypeDefinition)
+ .Single(definition => reader.GetString(definition.Name) == "Derived");
+ var implementations = derived.GetMethodImplementations()
+ .Select(reader.GetMethodImplementation)
+ .ToArray();
+
+ Assert.Equal(2, implementations.Length);
+ Assert.Equal(
+ new[] { "BodyG", "BodyM" },
+ implementations
+ .Select(implementation =>
+ reader.GetString(reader.GetMethodDefinition((MethodDefinitionHandle)implementation.MethodBody).Name))
+ .OrderBy(name => name));
+
+ var declarations = implementations
+ .Select(implementation => implementation.MethodDeclaration)
+ .ToDictionary(handle => GetMethodName(reader, handle));
+ Assert.Equal(
+ "void",
+ DecodeMethodSignature(reader, declarations["M"]).ReturnType);
+ MethodSignature genericSignature =
+ DecodeMethodSignature(reader, declarations["G"]);
+ Assert.True(genericSignature.Header.IsGeneric);
+ Assert.Equal(1, genericSignature.GenericParameterCount);
+ }
+
+ [Fact]
+ public void ClassLevelOverrideWithMissingBody_ReportsErrorAndEmitsTypeMetadata()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Base extends [mscorlib]System.Object
+ {
+ .method public virtual instance void M() cil managed { ret }
+ }
+ .class public auto ansi Derived extends Base
+ {
+ .override Base::M with instance void Derived::Missing()
+ }
+ """;
+
+ var compiler = new DocumentCompiler();
+ var (diagnostics, result) = compiler.Compile(
+ new SourceText(source, "test.il"),
+ _ => { Assert.Fail("Expected no includes"); return default; },
+ _ => { Assert.Fail("Expected no resources"); return default; },
+ new Options { ErrorTolerant = true });
+
+ Assert.Contains(diagnostics, diagnostic => diagnostic.Id == DiagnosticIds.InvalidMetadataToken);
+ Assert.NotNull(result);
+
+ var image = new BlobBuilder();
+ result!.Serialize(image);
+ using var pe = new PEReader(image.ToImmutableArray());
+ var reader = pe.GetMetadataReader();
+ var derived = reader.TypeDefinitions
+ .Select(reader.GetTypeDefinition)
+ .Single(definition => reader.GetString(definition.Name) == "Derived");
+
+ Assert.Empty(derived.GetMethodImplementations());
+ Assert.Equal("Base", reader.GetString(reader.GetTypeDefinition((TypeDefinitionHandle)derived.BaseType).Name));
+ }
+
+ private static string GetMethodName(MetadataReader reader, EntityHandle handle) => handle.Kind switch
+ {
+ HandleKind.MethodDefinition =>
+ reader.GetString(reader.GetMethodDefinition((MethodDefinitionHandle)handle).Name),
+ HandleKind.MemberReference =>
+ reader.GetString(reader.GetMemberReference((MemberReferenceHandle)handle).Name),
+ _ => throw new InvalidOperationException($"Unexpected method handle kind {handle.Kind}."),
+ };
+
+ private static MethodSignature DecodeMethodSignature(
+ MetadataReader reader,
+ EntityHandle handle) => handle.Kind switch
+ {
+ HandleKind.MethodDefinition =>
+ reader.GetMethodDefinition((MethodDefinitionHandle)handle).DecodeSignature(
+ DocumentCompilerTestHelpers.Decoder,
+ genericContext: null),
+ HandleKind.MemberReference =>
+ reader.GetMemberReference((MemberReferenceHandle)handle).DecodeMethodSignature(
+ DocumentCompilerTestHelpers.Decoder,
+ genericContext: null),
+ _ => throw new InvalidOperationException($"Unexpected method handle kind {handle.Kind}."),
+ };
+
[Fact]
public void MethodRtSpecialName_Preserved()
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/ModuleTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/ModuleTests.cs
index ce7251c02c6ae4..d4df8e471d4737 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/ModuleTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/ModuleTests.cs
@@ -123,5 +123,131 @@ .class public auto ansi beforefieldinit Test
var diagnostics = DocumentCompilerTestHelpers.CompileAndGetDiagnostics(source, new Options());
Assert.Empty(diagnostics);
}
+
+ [Fact]
+ public void FileDeclaration_WithHash_EmitsMetadataFileRow()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .file NetModule.netmodule .hash = (AB CD EF 01)
+ .class public auto ansi Test extends [mscorlib]System.Object { }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var file = reader.GetAssemblyFile(Assert.Single(reader.AssemblyFiles));
+
+ Assert.Equal("NetModule.netmodule", reader.GetString(file.Name));
+ Assert.Equal([0xAB, 0xCD, 0xEF, 0x01], reader.GetBlobBytes(file.HashValue));
+ Assert.True(file.ContainsMetadata);
+ Assert.Equal(0, pe.PEHeaders.CorHeader!.EntryPointTokenOrRelativeVirtualAddress);
+ }
+
+ [Fact]
+ public void FileDeclaration_NoMetadata_EmitsResourceFileRow()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .file nometadata DataFile.resources .hash = (FF FE)
+ .class public auto ansi Test extends [mscorlib]System.Object { }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var file = reader.GetAssemblyFile(Assert.Single(reader.AssemblyFiles));
+
+ Assert.Equal("DataFile.resources", reader.GetString(file.Name));
+ Assert.Equal([0xFF, 0xFE], reader.GetBlobBytes(file.HashValue));
+ Assert.False(file.ContainsMetadata);
+ Assert.Equal(0, pe.PEHeaders.CorHeader!.EntryPointTokenOrRelativeVirtualAddress);
+ }
+
+ [Fact]
+ public void ModuleExtern_EmitsModuleReference()
+ {
+ string source = """
+ .assembly test { }
+ .module extern Native.netmodule
+ .class public auto ansi Test { }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ Assert.Equal(1, reader.GetTableRowCount(TableIndex.ModuleRef));
+ var moduleReference = reader.GetModuleReference(MetadataTokens.ModuleReferenceHandle(1));
+
+ Assert.Equal("Native.netmodule", reader.GetString(moduleReference.Name));
+ Assert.True(reader.GetModuleDefinition().Name.IsNil);
+ }
+
+ [Fact]
+ public void BareModuleDirective_PreservesDefaultOutputModuleName()
+ {
+ string source = """
+ .assembly test { }
+ .module
+ .class public auto ansi Test { }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(
+ source,
+ new Options { OutputFileName = "Output.dll" });
+ var reader = pe.GetMetadataReader();
+
+ Assert.Equal("Output.dll", reader.GetString(reader.GetModuleDefinition().Name));
+ Assert.Equal(0, reader.GetTableRowCount(TableIndex.ModuleRef));
+ }
+
+ [Fact]
+ public void GlobalMethodAndModuleAttribute_EmitModuleMetadataAndPdb()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor()
+ .line 1 "global.cs"
+ .method public static int32 Global() cil managed
+ {
+ .locals init (int32 value)
+ .line 10
+ ldc.i4.s 42
+ stloc.0
+ ldloc.0
+ ret
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var moduleType = reader.GetTypeDefinition(MetadataTokens.TypeDefinitionHandle(1));
+ var globalMethod = reader.GetMethodDefinition(Assert.Single(moduleType.GetMethods()));
+ var body = pe.GetMethodBody(globalMethod.RelativeVirtualAddress);
+
+ Assert.Equal("", reader.GetString(moduleType.Name));
+ Assert.Equal("Global", reader.GetString(globalMethod.Name));
+ Assert.True(body.LocalVariablesInitialized);
+ Assert.Equal(
+ new[] { "int32" },
+ reader.GetStandaloneSignature(body.LocalSignature)
+ .DecodeLocalSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
+ Assert.Equal(42, body.GetILBytes()![1]);
+
+ CustomAttributeValue attribute = reader
+ .GetCustomAttribute(Assert.Single(reader.GetModuleDefinition().GetCustomAttributes()))
+ .DecodeValue(DocumentCompilerTestHelpers.Decoder);
+ Assert.Empty(attribute.FixedArguments);
+ Assert.Empty(attribute.NamedArguments);
+
+ var embeddedPdb = Assert.Single(
+ pe.ReadDebugDirectory(),
+ entry => entry.Type == DebugDirectoryEntryType.EmbeddedPortablePdb);
+ using var pdbProvider = pe.ReadEmbeddedPortablePdbDebugDirectoryData(embeddedPdb);
+ var pdbReader = pdbProvider.GetMetadataReader();
+ Assert.Contains(
+ "global.cs",
+ pdbReader.GetString(pdbReader.GetDocument(Assert.Single(pdbReader.Documents)).Name));
+ }
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/NativeExportTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/NativeExportTests.cs
new file mode 100644
index 00000000000000..76022ff15e1199
--- /dev/null
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/NativeExportTests.cs
@@ -0,0 +1,149 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Buffers.Binary;
+using System.Linq;
+using System.Reflection.PortableExecutable;
+using System.Text;
+using Xunit;
+using DocumentCompilerTestHelpers = ILAssembler.Tests.DocumentCompilerTestHelpers;
+
+namespace ILAssembler.Tests
+{
+ public class NativeExportTests
+ {
+ [Fact]
+ public void ExportDirective_WithoutVTableFixup_DoesNotEmitNativeExportArtifacts()
+ {
+ string source = """
+ .assembly test { }
+ .assembly extern mscorlib { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void ExportedMethod() cil managed
+ {
+ .export [1] as MyExport
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+
+ Assert.False(pe.PEHeaders.SectionHeaders.Any(section => section.Name == ".sdata"));
+
+ DirectoryEntry exportTableDirectory = pe.PEHeaders.PEHeader!.ExportTableDirectory;
+ Assert.Equal(0, exportTableDirectory.RelativeVirtualAddress);
+ Assert.Equal(0, exportTableDirectory.Size);
+ }
+
+ [Fact]
+ public void VTableFixupAndExport_EmitClrAndPeDirectories()
+ {
+ string source = """
+ .assembly test { }
+ .assembly extern mscorlib { }
+ .data VT = int32(0) int32(0)
+ .vtfixup [2] int32 fromunmanaged at VT
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void Zed() cil managed
+ {
+ .vtentry 1 : 1
+ .export [1] as Zed
+ ret
+ }
+
+ .method public static void Alpha() cil managed
+ {
+ .vtentry 1 : 2
+ .export [3] as Alpha
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var sdataSection = pe.PEHeaders.SectionHeaders.Single(section => section.Name == ".sdata");
+ DirectoryEntry vtableFixups = pe.PEHeaders.CorHeader!.VtableFixupsDirectory;
+ DirectoryEntry exports = pe.PEHeaders.PEHeader!.ExportTableDirectory;
+
+ Assert.Equal(sdataSection.VirtualAddress, vtableFixups.RelativeVirtualAddress);
+ Assert.Equal(8, vtableFixups.Size);
+ Assert.NotEqual(0, exports.RelativeVirtualAddress);
+ Assert.True(exports.Size > 0);
+
+ int dllNameRva = ReadInt32(pe, exports.RelativeVirtualAddress + 12);
+ int baseOrdinal = ReadInt32(pe, exports.RelativeVirtualAddress + 16);
+ int numberOfFunctions = ReadInt32(pe, exports.RelativeVirtualAddress + 20);
+ int numberOfNames = ReadInt32(pe, exports.RelativeVirtualAddress + 24);
+ int addressTableRva = ReadInt32(pe, exports.RelativeVirtualAddress + 28);
+ int namePointerTableRva = ReadInt32(pe, exports.RelativeVirtualAddress + 32);
+ int ordinalTableRva = ReadInt32(pe, exports.RelativeVirtualAddress + 36);
+
+ Assert.Equal(1, baseOrdinal);
+ Assert.Equal(3, numberOfFunctions);
+ Assert.Equal(2, numberOfNames);
+ Assert.Equal("output.dll", ReadAsciiString(pe, dllNameRva));
+ Assert.Equal("Alpha", ReadAsciiString(pe, ReadInt32(pe, namePointerTableRva)));
+ Assert.Equal("Zed", ReadAsciiString(pe, ReadInt32(pe, namePointerTableRva + 4)));
+ Assert.Equal(2, ReadUInt16(pe, ordinalTableRva));
+ Assert.Equal(0, ReadUInt16(pe, ordinalTableRva + 2));
+ Assert.Equal(sdataSection.VirtualAddress + 16, ReadInt32(pe, addressTableRva));
+ Assert.Equal(0, ReadInt32(pe, addressTableRva + 4));
+ Assert.Equal(sdataSection.VirtualAddress + 22, ReadInt32(pe, addressTableRva + 8));
+ }
+
+ [Theory]
+ [InlineData(Machine.Amd64, "48A1")]
+ [InlineData(Machine.Arm, "DFF800F0")]
+ [InlineData(Machine.Arm64, "50000058")]
+ public void ExportStub_TargetMachine_EmitsExpectedInstructionPrefix(
+ Machine machine,
+ string expectedPrefix)
+ {
+ string source = """
+ .assembly test { }
+ .assembly extern mscorlib { }
+ .data VT = int32(0)
+ .vtfixup [1] int32 fromunmanaged at VT
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void Exported() cil managed
+ {
+ .vtentry 1 : 1
+ .export [1] as Exported
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(
+ source,
+ new Options { Machine = machine });
+ DirectoryEntry exports = pe.PEHeaders.PEHeader!.ExportTableDirectory;
+ int addressTableRva = ReadInt32(pe, exports.RelativeVirtualAddress + 28);
+ int stubRva = ReadInt32(pe, addressTableRva);
+ byte[] prefix = Convert.FromHexString(expectedPrefix);
+
+ Assert.Equal(machine, pe.PEHeaders.CoffHeader.Machine);
+ Assert.NotEqual(0, exports.RelativeVirtualAddress);
+ Assert.True(
+ pe.GetSectionData(stubRva).GetContent().AsSpan(0, prefix.Length).SequenceEqual(prefix));
+ }
+
+ private static int ReadInt32(PEReader pe, int rva) =>
+ BinaryPrimitives.ReadInt32LittleEndian(pe.GetSectionData(rva).GetContent().AsSpan(0, sizeof(int)));
+
+ private static ushort ReadUInt16(PEReader pe, int rva) =>
+ BinaryPrimitives.ReadUInt16LittleEndian(pe.GetSectionData(rva).GetContent().AsSpan(0, sizeof(ushort)));
+
+ private static string ReadAsciiString(PEReader pe, int rva)
+ {
+ var content = pe.GetSectionData(rva).GetContent();
+ int length = content.AsSpan().IndexOf((byte)0);
+ return Encoding.ASCII.GetString(content.AsSpan(0, length));
+ }
+
+ }
+}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/ParameterTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/ParameterTests.cs
index 32bb09e3bc0c55..3931daef2d36e1 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/ParameterTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/ParameterTests.cs
@@ -197,6 +197,38 @@ .method public hidebysig static void M([in] int32& x) cil managed
Assert.True(param.Attributes.HasFlag(ParameterAttributes.In));
}
+ [Fact]
+ public void ParameterAttributeForms_EmitExpectedFlags()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void M(
+ [in] int32 input,
+ [out] int32 output,
+ [opt] int32 optional,
+ [7] int32 rawFlags) cil managed
+ {
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.GetMethodDefinition(Assert.Single(reader.MethodDefinitions));
+ var parameters = method.GetParameters()
+ .Select(reader.GetParameter)
+ .ToDictionary(parameter => reader.GetString(parameter.Name));
+
+ Assert.Equal(ParameterAttributes.In, parameters["input"].Attributes);
+ Assert.Equal(ParameterAttributes.Out, parameters["output"].Attributes);
+ Assert.Equal(ParameterAttributes.Optional, parameters["optional"].Attributes);
+ Assert.Equal((ParameterAttributes)8, parameters["rawFlags"].Attributes);
+ }
+
[Fact]
public void UnnamedInstanceParam_EmitsParamRow()
{
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/PreprocessorIntegrationTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/PreprocessorIntegrationTests.cs
new file mode 100644
index 00000000000000..005433345bf790
--- /dev/null
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/PreprocessorIntegrationTests.cs
@@ -0,0 +1,154 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using System.Buffers.Binary;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection.Metadata;
+using System.Reflection.Metadata.Ecma335;
+using System.Reflection.PortableExecutable;
+using Xunit;
+using DocumentCompilerTestHelpers = ILAssembler.Tests.DocumentCompilerTestHelpers;
+
+namespace ILAssembler.Tests
+{
+ public class PreprocessorIntegrationTests
+ {
+ [Fact]
+ public void NestedIncludes_EmitExpectedTypesAndUserString()
+ {
+ string source = """
+ .assembly extern System.Runtime { }
+ .assembly test { }
+ #include "level1.il"
+ .class public auto ansi beforefieldinit AfterInclude extends [System.Runtime]System.Object
+ {
+ .method public static string GetIncludedLiteral() cil managed
+ {
+ ldstr INCLUDED_LITERAL
+ ret
+ }
+ }
+ """;
+
+ using var pe = CompileWithIncludesAndGetReader(source, new Dictionary
+ {
+ ["level1.il"] = """
+ #define INCLUDED_LITERAL "\"double-quoted-from-include\""
+ #include "level2.il"
+ .class public auto ansi beforefieldinit Included.Namespace.IncludedType extends [System.Runtime]System.Object
+ {
+ }
+ """,
+ ["level2.il"] = """
+ .class public auto ansi beforefieldinit Nested.DeepType extends [System.Runtime]System.Object
+ {
+ }
+ """
+ });
+
+ var reader = pe.GetMetadataReader();
+ var typeNames = reader.TypeDefinitions
+ .Select(handle =>
+ {
+ var type = reader.GetTypeDefinition(handle);
+ return (Namespace: reader.GetString(type.Namespace), Name: reader.GetString(type.Name));
+ })
+ .ToArray();
+
+ Assert.Contains(("Included.Namespace", "IncludedType"), typeNames);
+ Assert.Contains(("Nested", "DeepType"), typeNames);
+ Assert.Contains((string.Empty, "AfterInclude"), typeNames);
+ Assert.Equal("double-quoted-from-include", GetLdstrUserString(pe, reader, "GetIncludedLiteral"));
+ }
+
+ [Fact]
+ public void ConditionalCompilation_EmitsOnlyActiveTypes()
+ {
+ string source = """
+ .assembly extern System.Runtime { }
+ .assembly test { }
+ #define OUTER
+ #ifdef OUTER
+ .class public auto ansi beforefieldinit OuterSelected extends [System.Runtime]System.Object { }
+ #else
+ .class public auto ansi beforefieldinit WrongOuter extends [System.Runtime]System.Object { }
+ #endif
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var typeNames = reader.TypeDefinitions
+ .Select(handle => reader.GetString(reader.GetTypeDefinition(handle).Name))
+ .ToHashSet();
+
+ Assert.Equal(2, typeNames.Count);
+ Assert.Contains("OuterSelected", typeNames);
+ Assert.DoesNotContain("WrongOuter", typeNames);
+ }
+
+ [Fact]
+ public void IncludedMultiTokenMacro_EmitsExpectedFloatOperand()
+ {
+ string source = """
+ .assembly extern System.Runtime { }
+ .assembly test { }
+ #include "constants.il"
+ .class public auto ansi beforefieldinit Test extends [System.Runtime]System.Object
+ {
+ .method public static float32 GetValue() cil managed
+ {
+ ldc.r4 NEG_INF
+ ret
+ }
+ }
+ """;
+
+ using var pe = CompileWithIncludesAndGetReader(source, new Dictionary
+ {
+ ["constants.il"] = """
+ #define NEG_INF "float32(0xFF800000)"
+ """
+ });
+
+ var reader = pe.GetMetadataReader();
+ byte[] il = GetMethodBody(pe, reader, "GetValue");
+
+ Assert.Equal(6, il.Length);
+ Assert.True(float.IsNegativeInfinity(BitConverter.Int32BitsToSingle(BinaryPrimitives.ReadInt32LittleEndian(il.AsSpan(1, 4)))));
+ }
+
+ private static PEReader CompileWithIncludesAndGetReader(string source, IReadOnlyDictionary includes)
+ {
+ return DocumentCompilerTestHelpers.CompileAndGetReader(
+ new SourceText(source, "root.il"),
+ path =>
+ {
+ Assert.True(includes.TryGetValue(path, out string? includedSource), $"Unexpected include path '{path}'");
+ return new SourceText(includedSource!, path);
+ },
+ new Options());
+ }
+
+ private static string GetLdstrUserString(PEReader pe, MetadataReader reader, string methodName)
+ {
+ int token = DocumentCompilerTestHelpers.GetFirstTokenOperand(
+ pe,
+ reader,
+ methodName,
+ Internal.IL.ILOpcode.ldstr);
+ return reader.GetUserString(MetadataTokens.UserStringHandle(token & 0x00FFFFFF));
+ }
+
+ private static byte[] GetMethodBody(PEReader pe, MetadataReader reader, string methodName)
+ {
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .First(definition => reader.GetString(definition.Name) == methodName);
+
+ Assert.True(method.RelativeVirtualAddress > 0, $"Method '{methodName}' should have a body");
+ return pe.GetMethodBody(method.RelativeVirtualAddress).GetILBytes()!;
+ }
+ }
+}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/PropertyEventTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/PropertyEventTests.cs
new file mode 100644
index 00000000000000..468c1d7aedd50b
--- /dev/null
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/PropertyEventTests.cs
@@ -0,0 +1,88 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Linq;
+using System.Reflection.Metadata;
+using System.Reflection.Metadata.Ecma335;
+using Xunit;
+using DocumentCompilerTestHelpers = ILAssembler.Tests.DocumentCompilerTestHelpers;
+
+namespace ILAssembler.Tests
+{
+ public class PropertyEventTests
+ {
+ [Fact]
+ public void PropertyAndEvent_EmitMapsAndMethodSemantics()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi MyDelegate extends [mscorlib]System.MulticastDelegate
+ {
+ .method public specialname rtspecialname instance void .ctor(object 'object', native int 'method') runtime managed
+ {
+ }
+ .method public virtual instance void Invoke() runtime managed
+ {
+ }
+ }
+ .class public auto ansi beforefieldinit Test extends [mscorlib]System.Object
+ {
+ .field private int32 _value
+
+ .method public hidebysig specialname instance int32 get_Value() cil managed
+ {
+ ldarg.0
+ ldfld int32 Test::_value
+ ret
+ }
+
+ .method public hidebysig specialname instance void set_Value(int32 value) cil managed
+ {
+ ldarg.0
+ ldarg.1
+ stfld int32 Test::_value
+ ret
+ }
+
+ .method public hidebysig specialname instance void add_Changed(class MyDelegate value) cil managed
+ {
+ ret
+ }
+
+ .method public hidebysig specialname instance void remove_Changed(class MyDelegate value) cil managed
+ {
+ ret
+ }
+
+ .property int32 Value()
+ {
+ .get instance int32 Test::get_Value()
+ .set instance void Test::set_Value(int32)
+ }
+
+ .event MyDelegate Changed
+ {
+ .addon instance void Test::add_Changed(class MyDelegate)
+ .removeon instance void Test::remove_Changed(class MyDelegate)
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ Assert.Equal(1, reader.GetTableRowCount(TableIndex.Property));
+ Assert.Equal(1, reader.GetTableRowCount(TableIndex.Event));
+ Assert.Equal(1, reader.GetTableRowCount(TableIndex.PropertyMap));
+ Assert.Equal(1, reader.GetTableRowCount(TableIndex.EventMap));
+ Assert.Equal(4, reader.GetTableRowCount(TableIndex.MethodSemantics));
+
+ var property = reader.GetPropertyDefinition(reader.PropertyDefinitions.Single());
+ var @event = reader.GetEventDefinition(reader.EventDefinitions.Single());
+
+ Assert.Equal("Value", reader.GetString(property.Name));
+ Assert.Equal("Changed", reader.GetString(@event.Name));
+ }
+ }
+}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/PropertyTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/PropertyTests.cs
index e53e81f0e589f5..12cf95fd7b0ee2 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/PropertyTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/PropertyTests.cs
@@ -66,6 +66,46 @@ .method public hidebysig specialname instance int32 get_Value() cil managed
Assert.True(propCount > 0, $"Expected at least 1 property, got {propCount}");
}
+ [Fact]
+ public void PropertyAttributesOtherAccessorAndCustomAttribute_EmitMetadata()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public specialname instance int32 get_Value() cil managed { ldc.i4.0 ret }
+ .method public specialname instance void set_Value(int32 value) cil managed { ret }
+ .method public specialname instance void other_Value() cil managed { ret }
+
+ .property specialname rtspecialname instance int32 Value()
+ {
+ .get instance int32 Test::get_Value()
+ .set instance void Test::set_Value(int32)
+ .other instance void Test::other_Value()
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var propertyHandle = Assert.Single(reader.PropertyDefinitions);
+ var property = reader.GetPropertyDefinition(propertyHandle);
+ var accessors = property.GetAccessors();
+
+ Assert.True(property.Attributes.HasFlag(PropertyAttributes.SpecialName));
+ Assert.Equal("get_Value", reader.GetString(reader.GetMethodDefinition(accessors.Getter).Name));
+ Assert.Equal("set_Value", reader.GetString(reader.GetMethodDefinition(accessors.Setter).Name));
+ Assert.Equal(
+ "other_Value",
+ reader.GetString(reader.GetMethodDefinition(Assert.Single(accessors.Others)).Name));
+ Assert.Equal(
+ [0x01, 0x00, 0x00, 0x00],
+ reader.GetBlobBytes(reader.GetCustomAttribute(Assert.Single(reader.GetCustomAttributes(propertyHandle))).Value));
+ }
+
+
[Fact]
public void PropertyInitOpt_WithConstantValue_CreatesConstantEntry()
{
@@ -217,5 +257,49 @@ .property instance int32 Value()
var attrs = reader.GetCustomAttributes(propHandle);
Assert.True(attrs.Count >= 1, $"Property should have at least 1 custom attribute, got {attrs.Count}");
}
+
+ [Fact]
+ public void IndexedProperty_EmitsSignatureAndAccessorMetadata()
+ {
+ string source = """
+ .assembly test { }
+ .assembly extern mscorlib { }
+ .class public auto ansi beforefieldinit Test
+ {
+ .property instance int32 Item(int32)
+ {
+ .get instance int32 Test::get_Item(int32)
+ .set instance void Test::set_Item(int32, int32)
+ }
+
+ .method public hidebysig specialname instance int32 get_Item(int32 index) cil managed
+ {
+ ldarg.1
+ ret
+ }
+
+ .method public hidebysig specialname instance void set_Item(int32 index, int32 value) cil managed
+ {
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var propertyHandle = reader.PropertyDefinitions.Single();
+ var property = reader.GetPropertyDefinition(propertyHandle);
+ var accessors = property.GetAccessors();
+ MethodSignature signature =
+ property.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null);
+
+ Assert.Equal("Item", reader.GetString(property.Name));
+ Assert.Equal("get_Item", reader.GetString(reader.GetMethodDefinition(accessors.Getter).Name));
+ Assert.Equal("set_Item", reader.GetString(reader.GetMethodDefinition(accessors.Setter).Name));
+ Assert.True(signature.Header.IsInstance);
+ Assert.Equal("int32", signature.ReturnType);
+ Assert.Equal(new[] { "int32" }, signature.ParameterTypes);
+ }
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/SecurityTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/SecurityTests.cs
index d28234893aaf90..a44d1c521cc6c7 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/SecurityTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/SecurityTests.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Reflection;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using System.Reflection.PortableExecutable;
@@ -54,5 +55,194 @@ .class public auto ansi Test { }
// Verify assembly compiled successfully with the permission set
Assert.True(reader.GetTableRowCount(TableIndex.DeclSecurity) >= 1);
}
+
+ [Fact]
+ public void PermissionSet_ByteArrayWithoutEquals_IsAccepted()
+ {
+ string source = """
+ .assembly test
+ {
+ .permissionset reqrefuse bytearray (2E)
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var declaration = reader.GetDeclarativeSecurityAttribute(MetadataTokens.DeclarativeSecurityAttributeHandle(1));
+
+ Assert.Equal(System.Reflection.DeclarativeSecurityAction.RequestRefuse, declaration.Action);
+ Assert.Equal([0x2E], reader.GetBlobBytes(declaration.PermissionSet));
+ }
+
+ [Fact]
+ public void PermissionSet_WithDemand_EmitsDeclSecurityBlob()
+ {
+ string source = """
+ .assembly test
+ {
+ .permissionset demand = (2E)
+ .ver 1:0:0:0
+ }
+ .class public auto ansi Test { }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var securityHandle = MetadataTokens.DeclarativeSecurityAttributeHandle(1);
+ var security = reader.GetDeclarativeSecurityAttribute(securityHandle);
+
+ Assert.Equal(1, reader.GetTableRowCount(TableIndex.DeclSecurity));
+ Assert.Equal(2, (int)security.Action);
+ Assert.Equal(HandleKind.AssemblyDefinition, security.Parent.Kind);
+ Assert.Equal([0x2E], reader.GetBlobBytes(security.PermissionSet));
+ }
+
+ [Theory]
+ [InlineData("request", 1)]
+ [InlineData("demand", 2)]
+ [InlineData("assert", 3)]
+ [InlineData("deny", 4)]
+ [InlineData("permitonly", 5)]
+ [InlineData("linkcheck", 6)]
+ [InlineData("inheritcheck", 7)]
+ [InlineData("reqmin", 8)]
+ [InlineData("reqopt", 9)]
+ [InlineData("reqrefuse", 10)]
+ [InlineData("prejitgrant", 11)]
+ [InlineData("prejitdeny", 12)]
+ [InlineData("noncasdemand", 13)]
+ [InlineData("noncaslinkdemand", 14)]
+ [InlineData("noncasinheritance", 15)]
+ public void PermissionSet_Action_EmitsExpectedDeclSecurityAction(string action, int expectedAction)
+ {
+ string source = $$"""
+ .assembly test
+ {
+ .permissionset {{action}} = (2E)
+ }
+ .class public auto ansi Test { }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var security = reader.GetDeclarativeSecurityAttribute(
+ Assert.Single(reader.GetAssemblyDefinition().GetDeclarativeSecurityAttributes()));
+
+ Assert.Equal((DeclarativeSecurityAction)expectedAction, security.Action);
+ Assert.Equal(HandleKind.AssemblyDefinition, security.Parent.Kind);
+ Assert.Equal([0x2E], reader.GetBlobBytes(security.PermissionSet));
+ }
+
+ [Fact]
+ public void PermissionSet_VerbalForm_EmitsSerializedAttributeAndNamedProperty()
+ {
+ string source = """
+ .assembly test
+ {
+ .permissionset deny = {
+ class 'My.Permission' = {
+ property bool Enabled = bool(true)
+ }
+ }
+ }
+ .class public auto ansi Test { }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var security = reader.GetDeclarativeSecurityAttribute(
+ Assert.Single(reader.GetAssemblyDefinition().GetDeclarativeSecurityAttributes()));
+
+ Assert.Equal(DeclarativeSecurityAction.Deny, security.Action);
+ BlobReader permissionSet = reader.GetBlobReader(security.PermissionSet);
+ Assert.Equal((byte)'.', permissionSet.ReadByte());
+ Assert.Equal(1, permissionSet.ReadCompressedInteger());
+ Assert.Equal("My.Permission", permissionSet.ReadSerializedString());
+ Assert.Equal(1, permissionSet.ReadUInt16());
+ Assert.Equal((byte)CustomAttributeNamedArgumentKind.Property, permissionSet.ReadByte());
+ Assert.Equal((byte)SerializationTypeCode.Boolean, permissionSet.ReadByte());
+ Assert.Equal("Enabled", permissionSet.ReadSerializedString());
+ Assert.True(permissionSet.ReadBoolean());
+ Assert.Equal(0, permissionSet.RemainingBytes);
+ }
+
+ [Fact]
+ public void UnsupportedPermission_NameValueForms_ErrorTolerantImageRemainsValid()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .permission demand [mscorlib]System.Security.Permissions.SecurityPermissionAttribute(
+ "Boolean" = true,
+ "Integer" = 123,
+ "WrappedInteger" = int32(456),
+ "Text" = "hello",
+ "Enum8" = [mscorlib]Contoso.Kind(int8:1),
+ "Enum16" = [mscorlib]Contoso.Kind(int16:2),
+ "Enum32" = [mscorlib]Contoso.Kind(int32:3),
+ "EnumDefault" = [mscorlib]Contoso.Kind(4)
+ )
+ .class public auto ansi Test extends [mscorlib]System.Object { }
+ """;
+
+ var compiler = new DocumentCompiler();
+ var (diagnostics, result) = compiler.Compile(
+ new SourceText(source, "test.il"),
+ _ => { Assert.Fail("Expected no includes"); return default; },
+ _ => { Assert.Fail("Expected no resources"); return default; },
+ new Options { ErrorTolerant = true });
+
+ Assert.Contains(
+ diagnostics,
+ diagnostic => diagnostic.Id == DiagnosticIds.UnsupportedSecurityDeclaration);
+ Assert.NotNull(result);
+
+ var image = new BlobBuilder();
+ result!.Serialize(image);
+ using var pe = new PEReader(image.ToImmutableArray());
+ var reader = pe.GetMetadataReader();
+
+ Assert.Contains(
+ reader.TypeDefinitions,
+ handle => reader.GetString(reader.GetTypeDefinition(handle).Name) == "Test");
+ Assert.Equal(0, reader.GetTableRowCount(TableIndex.DeclSecurity));
+ }
+
+ [Fact]
+ public void TypeAndMethodPermissionSets_EmitExpectedParentsAndActions()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .permissionset demand = (2E)
+ .method public static void M() cil managed
+ {
+ .permissionset assert = (2F)
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var securityDeclarations = Enumerable.Range(1, reader.GetTableRowCount(TableIndex.DeclSecurity))
+ .Select(row => reader.GetDeclarativeSecurityAttribute(MetadataTokens.DeclarativeSecurityAttributeHandle(row)))
+ .ToArray();
+
+ Assert.Contains(
+ securityDeclarations,
+ security =>
+ security.Parent.Kind == HandleKind.TypeDefinition &&
+ security.Action == DeclarativeSecurityAction.Demand &&
+ reader.GetBlobBytes(security.PermissionSet).SequenceEqual((byte[])[0x2E]));
+ Assert.Contains(
+ securityDeclarations,
+ security =>
+ security.Parent.Kind == HandleKind.MethodDefinition &&
+ security.Action == DeclarativeSecurityAction.Assert &&
+ reader.GetBlobBytes(security.PermissionSet).SequenceEqual((byte[])[0x2F]));
+ }
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/SourceDirectiveTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/SourceDirectiveTests.cs
index 1a2b337581c94e..cfa11aebdef362 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/SourceDirectiveTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/SourceDirectiveTests.cs
@@ -267,8 +267,11 @@ .method public static void M() cil managed
}
""";
- var diagnostics = DocumentCompilerTestHelpers.CompileAndGetDiagnostics(source, new Options());
- Assert.Empty(diagnostics);
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ int token = DocumentCompilerTestHelpers.GetFirstTokenOperand(pe, reader, "M", ILOpcode.ldstr);
+ string value = reader.GetUserString(MetadataTokens.UserStringHandle(token & 0x00FFFFFF));
+ Assert.Equal("Hello\nWorld\t!", value);
}
@@ -307,5 +310,222 @@ .class public auto ansi beforefieldinit ASSEMBLY_NAME extends [mscorlib]System.O
Assert.Equal("TestAssembly", reader.GetString(typeDef.Name));
}
+ [Fact]
+ public void LineDirective_WithRange_EmitsPortablePdbSequencePointWithSpecifiedStartPosition()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test
+ {
+ .method public static void TestMethod() cil managed
+ {
+ .line 10, 10 : 5, 6 "test.cs"
+ nop
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var methodHandle = reader.MethodDefinitions.Single(handle => reader.GetString(reader.GetMethodDefinition(handle).Name) == "TestMethod");
+
+ var embeddedPdbEntry = pe.ReadDebugDirectory().Single(entry => entry.Type == DebugDirectoryEntryType.EmbeddedPortablePdb);
+ using var pdbProvider = pe.ReadEmbeddedPortablePdbDebugDirectoryData(embeddedPdbEntry);
+ var pdbReader = pdbProvider.GetMetadataReader();
+ var debugHandle = MetadataTokens.MethodDebugInformationHandle(MetadataTokens.GetRowNumber(methodHandle));
+ var debugInfo = pdbReader.GetMethodDebugInformation(debugHandle);
+ var sequencePoint = debugInfo.GetSequencePoints().First(point => !point.IsHidden);
+
+ Assert.Equal(0, sequencePoint.Offset);
+ Assert.Equal(10, sequencePoint.StartLine);
+ Assert.Equal(5, sequencePoint.StartColumn);
+
+ var document = pdbReader.GetDocument(sequencePoint.Document);
+ Assert.Contains("test.cs", pdbReader.GetString(document.Name));
+ }
+
+ [Theory]
+ [InlineData(".line 10 'single.cs'", "single.cs")]
+ [InlineData(".line 11", "default.cs")]
+ [InlineData(".line 12 : 3 'single.cs'", "single.cs")]
+ [InlineData(".line 13 : 4", "default.cs")]
+ [InlineData(".line 14 : 5, 6 'single.cs'", "single.cs")]
+ [InlineData(".line 15 : 6, 7", "default.cs")]
+ [InlineData(".line 16, 17 : 8 'single.cs'", "single.cs")]
+ [InlineData(".line 18, 19 : 9", "default.cs")]
+ [InlineData(".line 20, 21 : 10, 11 'single.cs'", "single.cs")]
+ [InlineData(".line 22, 23 : 12, 13", "default.cs")]
+ [InlineData(".line 24 \"double.cs\"", "double.cs")]
+ [InlineData(".line 25 : 14 \"double.cs\"", "double.cs")]
+ [InlineData(".line 26 : 15, 16 \"double.cs\"", "double.cs")]
+ [InlineData(".line 27, 28 : 17 \"double.cs\"", "double.cs")]
+ [InlineData(".line 29, 30 : 18, 19 \"double.cs\"", "double.cs")]
+ public void LineDirective_SyntaxVariant_EmitsPortablePdbMethodDebugInformation(
+ string directive,
+ string expectedDocument)
+ {
+ string initialDirective =
+ directive.Contains('\'') || directive.Contains('"')
+ ? string.Empty
+ : ".line 1, 1 : 1, 2 \"default.cs\"";
+ string source = $$"""
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .method public static void M() cil managed
+ {
+ {{initialDirective}}
+ {{directive}}
+ nop
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var methodHandle = reader.MethodDefinitions
+ .Single(handle => reader.GetString(reader.GetMethodDefinition(handle).Name) == "M");
+ var embeddedPdb = Assert.Single(
+ pe.ReadDebugDirectory(),
+ entry => entry.Type == DebugDirectoryEntryType.EmbeddedPortablePdb);
+ using var pdbProvider = pe.ReadEmbeddedPortablePdbDebugDirectoryData(embeddedPdb);
+ var pdbReader = pdbProvider.GetMetadataReader();
+ var debugInformation = pdbReader.GetMethodDebugInformation(
+ MetadataTokens.MethodDebugInformationHandle(MetadataTokens.GetRowNumber(methodHandle)));
+ SequencePoint[] sequencePoints = debugInformation.GetSequencePoints().ToArray();
+
+ Assert.False(debugInformation.SequencePointsBlob.IsNil);
+ Assert.NotEmpty(sequencePoints);
+ Assert.Contains(
+ expectedDocument,
+ pdbReader.GetString(pdbReader.GetDocument(debugInformation.Document).Name));
+ }
+
+ [Theory]
+ [InlineData(".language '3f5162f8-07c6-11d3-9053-00c04fa302a1'")]
+ [InlineData(".language '3f5162f8-07c6-11d3-9053-00c04fa302a1', '994b45c4-e6e9-11d2-903f-00c04fa302a1'")]
+ [InlineData(".language '3f5162f8-07c6-11d3-9053-00c04fa302a1', '994b45c4-e6e9-11d2-903f-00c04fa302a1', '5a869d0b-6611-11d3-bd2a-0000f80849bd'")]
+ [InlineData(".language \"3f5162f8-07c6-11d3-9053-00c04fa302a1\", \"994b45c4-e6e9-11d2-903f-00c04fa302a1\"")]
+ [InlineData(".language \"3f5162f8-07c6-11d3-9053-00c04fa302a1\", \"994b45c4-e6e9-11d2-903f-00c04fa302a1\", \"5a869d0b-6611-11d3-bd2a-0000f80849bd\"")]
+ public void LanguageDirective_SyntaxVariant_EmitsDocumentLanguage(string languageDirective)
+ {
+ string source = $$"""
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .method public static void M() cil managed
+ {
+ {{languageDirective}}
+ .line 10 "document.cs"
+ nop
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var embeddedPdb = Assert.Single(
+ pe.ReadDebugDirectory(),
+ entry => entry.Type == DebugDirectoryEntryType.EmbeddedPortablePdb);
+ using var pdbProvider = pe.ReadEmbeddedPortablePdbDebugDirectoryData(embeddedPdb);
+ var pdbReader = pdbProvider.GetMetadataReader();
+ var document = pdbReader.GetDocument(Assert.Single(pdbReader.Documents));
+
+ Assert.Equal(
+ new Guid("3f5162f8-07c6-11d3-9053-00c04fa302a1"),
+ pdbReader.GetGuid(document.Language));
+ Assert.Contains("document.cs", pdbReader.GetString(document.Name));
+ }
+
+ [Fact]
+ public void ClassScopedLanguageAndLineDirectives_ApplyToMethodSequencePoint()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .language '3f5162f8-07c6-11d3-9053-00c04fa302a1'
+ .line 1 "class.cs"
+ .method public static void M() cil managed
+ {
+ .line 10
+ nop
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var embeddedPdb = Assert.Single(
+ pe.ReadDebugDirectory(),
+ entry => entry.Type == DebugDirectoryEntryType.EmbeddedPortablePdb);
+ using var pdbProvider = pe.ReadEmbeddedPortablePdbDebugDirectoryData(embeddedPdb);
+ var pdbReader = pdbProvider.GetMetadataReader();
+ var document = pdbReader.GetDocument(Assert.Single(pdbReader.Documents));
+
+ Assert.Equal(
+ new Guid("3f5162f8-07c6-11d3-9053-00c04fa302a1"),
+ pdbReader.GetGuid(document.Language));
+ Assert.Contains("class.cs", pdbReader.GetString(document.Name));
+ }
+
+ [Fact]
+ public void MultiDocumentCompile_WithLineDirectivesAcrossDocuments_EmitsPdbDocumentsForEachSource()
+ {
+ var documents = ImmutableArray.Create(
+ new SourceText("""
+ .assembly test { }
+ .class public auto ansi beforefieldinit First
+ {
+ .method public static void M1() cil managed
+ {
+ .line 10 "doc1.cs"
+ nop
+ ret
+ }
+ }
+ """, "doc1.il"),
+ new SourceText("""
+ .class public auto ansi beforefieldinit Second
+ {
+ .method public static void M2() cil managed
+ {
+ .line 20 "doc2.cs"
+ nop
+ ret
+ }
+ }
+ """, "doc2.il"));
+
+ var compiler = new DocumentCompiler();
+ var (diagnostics, image) = compiler.Compile(
+ documents,
+ _ => throw new InvalidOperationException("Unexpected include"),
+ _ => throw new InvalidOperationException("Unexpected resource"),
+ new Options { Pdb = true });
+
+ Assert.Empty(diagnostics);
+ Assert.NotNull(image);
+
+ var imageBuilder = new BlobBuilder();
+ image!.Serialize(imageBuilder);
+ using var pe = new PEReader(imageBuilder.ToImmutableArray());
+ var embeddedPdbEntry = Assert.Single(
+ pe.ReadDebugDirectory(),
+ entry => entry.Type == DebugDirectoryEntryType.EmbeddedPortablePdb);
+ using var pdbProvider = pe.ReadEmbeddedPortablePdbDebugDirectoryData(embeddedPdbEntry);
+ var pdbReader = pdbProvider.GetMetadataReader();
+ var documentNames = pdbReader.Documents
+ .Select(handle => pdbReader.GetString(pdbReader.GetDocument(handle).Name))
+ .ToArray();
+
+ Assert.Equal(2, documentNames.Length);
+ Assert.Contains(documentNames, name => name.Contains("doc1.cs", StringComparison.Ordinal));
+ Assert.Contains(documentNames, name => name.Contains("doc2.cs", StringComparison.Ordinal));
+ Assert.Equal(pe.GetMetadataReader().MethodDefinitions.Count, pdbReader.MethodDebugInformation.Count);
+ }
+
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/TypeDefinitionTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/TypeDefinitionTests.cs
index dfcdea81056e29..ef4033cf5919b0 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/TypeDefinitionTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/TypeDefinitionTests.cs
@@ -393,6 +393,74 @@ .class public auto ansi beforefieldinit MyNamespace.MyType extends [mscorlib]Sys
Assert.Equal("MyNamespace", reader.GetString(typeDef.Namespace));
}
+ [Fact]
+ public void TypeName_QuotedNamespaceSegment()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly Test { }
+ .class public auto ansi beforefieldinit 'tls'.tls1 extends [mscorlib]System.Object { }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var typeDef = reader.GetTypeDefinition(MetadataTokens.TypeDefinitionHandle(2));
+ Assert.Equal("tls1", reader.GetString(typeDef.Name));
+ Assert.Equal("tls", reader.GetString(typeDef.Namespace));
+ }
+
+ [Fact]
+ public void TypeName_QuotedStartupCodeNamespaceSegment()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly Test { }
+ .class private abstract auto ansi sealed ''.$Test extends [mscorlib]System.Object { }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var typeDef = reader.GetTypeDefinition(MetadataTokens.TypeDefinitionHandle(2));
+ Assert.Equal("$Test", reader.GetString(typeDef.Name));
+ Assert.Equal("", reader.GetString(typeDef.Namespace));
+ }
+
+ [Fact]
+ public void TypeName_QuotedSegmentAfterDottedName()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly Test { }
+ .class public auto ansi beforefieldinit System.Collections.'Type' extends [mscorlib]System.Object { }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var typeDef = reader.GetTypeDefinition(MetadataTokens.TypeDefinitionHandle(2));
+ Assert.Equal("Type", reader.GetString(typeDef.Name));
+ Assert.Equal("System.Collections", reader.GetString(typeDef.Namespace));
+ }
+
+ [Fact]
+ public void TypeName_EmptyQuotedNamespaceSegmentPreservesSeparator()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly Test { }
+ .class public auto ansi beforefieldinit ''.Foo.'Bar' extends [mscorlib]System.Object { }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var typeDef = reader.GetTypeDefinition(MetadataTokens.TypeDefinitionHandle(2));
+ Assert.Equal("Bar", reader.GetString(typeDef.Name));
+ Assert.Equal(".Foo", reader.GetString(typeDef.Namespace));
+ }
+
[Fact]
public void Namespace_NoLeadingDot()
@@ -571,5 +639,220 @@ .field [4] public int32 y
Assert.Equal(16, layout.Size);
}
+ [Fact]
+ public void QuotedTypeName_WithConsecutiveDots_SplitsAtLastDot()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit 'Contoso.Tools..ctor' extends [mscorlib]System.Object
+ {
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var typeDef = reader.TypeDefinitions
+ .Select(handle => reader.GetTypeDefinition(handle))
+ .Single(type => reader.GetString(type.Name) == "ctor");
+
+ Assert.Equal("ctor", reader.GetString(typeDef.Name));
+ Assert.Equal("Contoso.Tools.", reader.GetString(typeDef.Namespace));
+ }
+
+ [Fact]
+ public void ClassAttributes_EmitExpectedFlagsAndImplicitBaseTypes()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+
+ .class public auto ansi Outer extends [mscorlib]System.Object
+ {
+ .class nested private auto ansi NestedPrivate extends [mscorlib]System.Object { }
+ .class nested family auto ansi NestedFamily extends [mscorlib]System.Object { }
+ .class nested assembly auto ansi NestedAssembly extends [mscorlib]System.Object { }
+ .class nested famandassem auto ansi NestedFamAndAssem extends [mscorlib]System.Object { }
+ .class nested famorassem auto ansi NestedFamOrAssem extends [mscorlib]System.Object { }
+ }
+
+ .class public auto unicode import serializable windowsruntime UnicodeImported extends [mscorlib]System.Object { }
+ .class public value ValueTypeByKeyword { }
+ .class public enum EnumTypeByKeyword { }
+ .class flags(0x00100001) FlaggedType extends [mscorlib]System.Object { }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var types = reader.TypeDefinitions
+ .Select(handle => (Handle: handle, Definition: reader.GetTypeDefinition(handle)))
+ .ToDictionary(item => reader.GetString(item.Definition.Name));
+
+ Assert.Equal(
+ TypeAttributes.NestedPrivate,
+ types["NestedPrivate"].Definition.Attributes & TypeAttributes.VisibilityMask);
+ Assert.Equal(
+ TypeAttributes.NestedFamily,
+ types["NestedFamily"].Definition.Attributes & TypeAttributes.VisibilityMask);
+ Assert.Equal(
+ TypeAttributes.NestedAssembly,
+ types["NestedAssembly"].Definition.Attributes & TypeAttributes.VisibilityMask);
+ Assert.Equal(
+ TypeAttributes.NestedFamANDAssem,
+ types["NestedFamAndAssem"].Definition.Attributes & TypeAttributes.VisibilityMask);
+ Assert.Equal(
+ TypeAttributes.NestedFamORAssem,
+ types["NestedFamOrAssem"].Definition.Attributes & TypeAttributes.VisibilityMask);
+
+ TypeAttributes unicodeImported = types["UnicodeImported"].Definition.Attributes;
+ Assert.Equal(TypeAttributes.UnicodeClass, unicodeImported & TypeAttributes.StringFormatMask);
+ Assert.True(unicodeImported.HasFlag(TypeAttributes.Import));
+ Assert.True(unicodeImported.HasFlag(TypeAttributes.Serializable));
+ Assert.True(unicodeImported.HasFlag(TypeAttributes.WindowsRuntime));
+
+ Assert.True(types["ValueTypeByKeyword"].Definition.Attributes.HasFlag(TypeAttributes.Sealed));
+ Assert.Equal("ValueType", GetBaseTypeName(reader, types["ValueTypeByKeyword"].Definition));
+ Assert.Equal("Enum", GetBaseTypeName(reader, types["EnumTypeByKeyword"].Definition));
+
+ Assert.Equal((TypeAttributes)0x00100001, types["FlaggedType"].Definition.Attributes);
+ }
+
+ [Fact]
+ public void LegacyClassFlagSentinels_EmitImplicitValueTypeAndEnumBases()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class flags(0x80100001) FlagValueType { }
+ .class flags(0x40100001) FlagEnumType { }
+ """;
+
+ var compiler = new DocumentCompiler();
+ var (diagnostics, result) = compiler.Compile(
+ new SourceText(source, "test.il"),
+ _ => { Assert.Fail("Expected no includes"); return default; },
+ _ => { Assert.Fail("Expected no resources"); return default; },
+ new Options { ErrorTolerant = true });
+
+ Assert.Contains(diagnostics, diagnostic => diagnostic.Id == DiagnosticIds.UnsealedValueType);
+ Assert.NotNull(result);
+
+ var image = new BlobBuilder();
+ result!.Serialize(image);
+ using var pe = new PEReader(image.ToImmutableArray());
+ var reader = pe.GetMetadataReader();
+ var types = reader.TypeDefinitions
+ .Select(handle => reader.GetTypeDefinition(handle))
+ .ToDictionary(type => reader.GetString(type.Name));
+
+ Assert.True(types["FlagValueType"].Attributes.HasFlag(TypeAttributes.BeforeFieldInit));
+ Assert.True(types["FlagValueType"].Attributes.HasFlag(TypeAttributes.Sealed));
+ Assert.Equal("ValueType", GetBaseTypeName(reader, types["FlagValueType"]));
+ Assert.True(types["FlagEnumType"].Attributes.HasFlag(TypeAttributes.BeforeFieldInit));
+ Assert.Equal("Enum", GetBaseTypeName(reader, types["FlagEnumType"]));
+ }
+
+ [Fact]
+ public void NestedType_EmitsDeclaringTypeMetadata()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit Outer extends [mscorlib]System.Object
+ {
+ .class nested public auto ansi beforefieldinit Inner extends [mscorlib]System.Object
+ {
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var outerHandle = reader.TypeDefinitions
+ .First(handle => reader.GetString(reader.GetTypeDefinition(handle).Name) == "Outer");
+ var innerHandle = reader.TypeDefinitions
+ .First(handle => reader.GetString(reader.GetTypeDefinition(handle).Name) == "Inner");
+
+ var inner = reader.GetTypeDefinition(innerHandle);
+ Assert.Equal(TypeAttributes.NestedPublic, inner.Attributes & TypeAttributes.VisibilityMask);
+ Assert.Equal("Outer", reader.GetString(reader.GetTypeDefinition(outerHandle).Name));
+ Assert.Equal(1, reader.GetTableRowCount(TableIndex.NestedClass));
+ }
+
+ [Fact]
+ public void InterfaceImplementation_EmitsInterfaceImplRow()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class interface public abstract auto ansi IWorker
+ {
+ .method public hidebysig newslot abstract virtual instance void Run() cil managed { }
+ }
+ .class public auto ansi beforefieldinit Worker extends [mscorlib]System.Object implements IWorker
+ {
+ .method public hidebysig newslot virtual instance void Run() cil managed
+ {
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var workerHandle = reader.TypeDefinitions
+ .First(handle => reader.GetString(reader.GetTypeDefinition(handle).Name) == "Worker");
+ var worker = reader.GetTypeDefinition(workerHandle);
+ var interfaceImplHandle = Assert.Single(worker.GetInterfaceImplementations());
+ var interfaceImpl = reader.GetInterfaceImplementation(interfaceImplHandle);
+
+ Assert.Equal(HandleKind.TypeDefinition, interfaceImpl.Interface.Kind);
+ Assert.Equal("IWorker", reader.GetString(reader.GetTypeDefinition((TypeDefinitionHandle)interfaceImpl.Interface).Name));
+ }
+
+ [Fact]
+ public void InterfaceImplementationDirective_EmitsCustomAttributeOnInterfaceImpl()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class interface public abstract auto ansi IWorker
+ {
+ }
+ .class public auto ansi Worker extends [mscorlib]System.Object implements IWorker
+ {
+ .interfaceimpl type IWorker
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var worker = reader.TypeDefinitions
+ .Select(reader.GetTypeDefinition)
+ .Single(definition => reader.GetString(definition.Name) == "Worker");
+ var implementationHandle = Assert.Single(worker.GetInterfaceImplementations());
+ var implementation = reader.GetInterfaceImplementation(implementationHandle);
+ var attribute = reader.GetCustomAttribute(
+ Assert.Single(reader.GetCustomAttributes(implementationHandle)));
+
+ Assert.Equal(HandleKind.TypeDefinition, implementation.Interface.Kind);
+ Assert.Equal(
+ "IWorker",
+ reader.GetString(reader.GetTypeDefinition((TypeDefinitionHandle)implementation.Interface).Name));
+ Assert.Equal(
+ [0x01, 0x00, 0x00, 0x00],
+ reader.GetBlobBytes(attribute.Value));
+ }
+
+ private static string GetBaseTypeName(MetadataReader reader, TypeDefinition type)
+ {
+ Assert.Equal(HandleKind.TypeReference, type.BaseType.Kind);
+ return reader.GetString(reader.GetTypeReference((TypeReferenceHandle)type.BaseType).Name);
+ }
+
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/TypeReferenceTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/TypeReferenceTests.cs
index ec6a3a3e26ada5..3cf464b4862c3f 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/TypeReferenceTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/TypeReferenceTests.cs
@@ -118,6 +118,61 @@ .method public static void Main() cil managed
Assert.True(reader.GetTableRowCount(TableIndex.TypeRef) >= 1);
}
+ [Fact]
+ public void ExplicitNetstandardTypeRef_PreservesResolutionScope()
+ {
+ string source = """
+ .assembly extern System.Runtime { }
+ .assembly extern netstandard { }
+ .assembly test { }
+ .class public auto ansi Test extends [System.Runtime]System.Object
+ {
+ .method public static void M() cil managed
+ {
+ call void [netstandard]System.Console::WriteLine()
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ TypeReferenceHandle consoleHandle = DocumentCompilerTestHelpers.FindTypeRef(reader, "Console");
+ var console = reader.GetTypeReference(consoleHandle);
+ var assemblyReference = reader.GetAssemblyReference((AssemblyReferenceHandle)console.ResolutionScope);
+
+ Assert.Equal("netstandard", reader.GetString(assemblyReference.Name));
+ }
+
+ [Theory]
+ [InlineData("Console")]
+ [InlineData("Exception")]
+ public void ExplicitMscorlibNonCoreTypeRef_PreservesResolutionScope(string typeName)
+ {
+ string source = $$"""
+ .assembly extern mscorlib { }
+ .assembly extern System.Runtime { }
+ .assembly test { }
+ .class public auto ansi Test extends [System.Runtime]System.Object
+ {
+ .method public static void M() cil managed
+ {
+ ldtoken [mscorlib]System.{{typeName}}
+ pop
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ TypeReferenceHandle typeHandle = DocumentCompilerTestHelpers.FindTypeRef(reader, typeName);
+ var type = reader.GetTypeReference(typeHandle);
+ var assemblyReference = reader.GetAssemblyReference((AssemblyReferenceHandle)type.ResolutionScope);
+
+ Assert.Equal("mscorlib", reader.GetString(assemblyReference.Name));
+ }
+
[Fact]
public void ResolvedTypeRefs_StillEmittedAsRows_InPseudoHandleOrder()
@@ -289,5 +344,135 @@ ldtoken [test]MyType
DocumentCompilerTestHelpers.AssertTypeDefToken(reader, token, "MyType");
}
+ [Fact]
+ public void ThisBaseNesterAndMetadataTokenTypeReferences_EmitExpectedTypeTokens()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Base extends [mscorlib]System.Object { }
+ .class public auto ansi Outer extends Base
+ {
+ .method public static void UseThisAndBase(object value) cil managed
+ {
+ ldarg.0
+ box .this
+ pop
+ ldarg.0
+ box .base
+ pop
+ ldarg.0
+ box mdtoken(0x02000002)
+ pop
+ ret
+ }
+
+ .class nested public auto ansi Inner extends [mscorlib]System.Object
+ {
+ .method public static void UseNester(object value) cil managed
+ {
+ ldarg.0
+ box .nester
+ pop
+ ret
+ }
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ ImmutableArray outerTokens =
+ DocumentCompilerTestHelpers.GetTokenOperands(pe, reader, "UseThisAndBase", ILOpcode.box);
+ ImmutableArray innerTokens =
+ DocumentCompilerTestHelpers.GetTokenOperands(pe, reader, "UseNester", ILOpcode.box);
+
+ Assert.Equal(
+ new[] { "Outer", "Base", "Base" },
+ outerTokens.Select(token => GetTypeName(reader, MetadataTokens.EntityHandle(token))));
+ Assert.Equal(
+ "Outer",
+ GetTypeName(reader, MetadataTokens.EntityHandle(Assert.Single(innerTokens))));
+ }
+
+ [Fact]
+ public void ModuleScopedTypeReference_EmitsModuleReferenceResolutionScope()
+ {
+ string source = """
+ .assembly test { }
+ .module extern Native.netmodule
+ .class public auto ansi Test
+ {
+ .field public class [.module Native.netmodule]Contoso.External Value
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var field = reader.GetFieldDefinition(Assert.Single(reader.FieldDefinitions));
+ var typeReference = reader.TypeReferences
+ .Select(handle => (Handle: handle, Type: reader.GetTypeReference(handle)))
+ .Single(item => reader.GetString(item.Type.Name) == "External");
+
+ Assert.Equal(
+ "[.module Native.netmodule]Contoso.External",
+ field.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
+ Assert.Equal(HandleKind.ModuleReference, typeReference.Type.ResolutionScope.Kind);
+ Assert.Equal(
+ "Native.netmodule",
+ reader.GetString(reader.GetModuleReference((ModuleReferenceHandle)typeReference.Type.ResolutionScope).Name));
+ }
+
+ [Fact]
+ public void TypelistMscorlibAndSemicolonControls_EmitExpectedMetadata()
+ {
+ string source = """
+ .assembly extern External.Assembly { }
+ .assembly test { }
+ .mscorlib
+ .typelist {
+ [External.Assembly]Contoso.First
+ [External.Assembly]Contoso.Outer/Nested
+ }
+ ;
+ .class public auto ansi Test
+ {
+ ;
+ .method public static void M() cil managed
+ {
+ ;
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var typeReferences = reader.TypeReferences
+ .Select(reader.GetTypeReference)
+ .Select(type => (Namespace: reader.GetString(type.Namespace), Name: reader.GetString(type.Name)))
+ .ToArray();
+
+ Assert.Contains(("Contoso", "First"), typeReferences);
+ Assert.Contains(("Contoso", "Outer"), typeReferences);
+ Assert.Contains((string.Empty, "Nested"), typeReferences);
+
+ var testType = reader.TypeDefinitions
+ .Select(reader.GetTypeDefinition)
+ .Single(type => reader.GetString(type.Name) == "Test");
+ var method = reader.GetMethodDefinition(Assert.Single(testType.GetMethods()));
+ Assert.Equal("M", reader.GetString(method.Name));
+ Assert.Equal([0x2A], pe.GetMethodBody(method.RelativeVirtualAddress).GetILBytes());
+ }
+
+ private static string GetTypeName(MetadataReader reader, EntityHandle handle) => handle.Kind switch
+ {
+ HandleKind.TypeDefinition =>
+ reader.GetString(reader.GetTypeDefinition((TypeDefinitionHandle)handle).Name),
+ HandleKind.TypeReference =>
+ reader.GetString(reader.GetTypeReference((TypeReferenceHandle)handle).Name),
+ _ => throw new InvalidOperationException($"Unexpected type handle kind {handle.Kind}."),
+ };
+
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/TypeSignatureTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/TypeSignatureTests.cs
index fa2e2253354490..185ac34cb11f47 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/TypeSignatureTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/TypeSignatureTests.cs
@@ -42,5 +42,91 @@ .locals init (int32[0...,0...] V_0)
Assert.Empty(diagnostics);
}
+ [Fact]
+ public void MultiDimArrayLocal_EmitsArraySignatureShape()
+ {
+ string source = """
+ .assembly extern System.Runtime { }
+ .assembly TestAssembly { }
+ .class public auto ansi beforefieldinit Test
+ {
+ .method public static void M() cil managed
+ {
+ .locals init (int32[0...,0...] V_0)
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var signature = reader.GetStandaloneSignature(MetadataTokens.StandaloneSignatureHandle(1));
+ Assert.Equal(
+ new[] { "int32[0...,0...]" },
+ signature.DecodeLocalSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
+ }
+
+ [Fact]
+ public void ArrayBoundVariants_DecodeExpectedShapes()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void M() cil managed
+ {
+ .locals init (
+ int32[] szArray,
+ int32[,] unspecified,
+ int32[5] sized,
+ int32[2...] lowerBoundOnly,
+ int32[2...5] bounded)
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var signature = reader.GetStandaloneSignature(MetadataTokens.StandaloneSignatureHandle(1));
+
+ Assert.Equal(
+ new[]
+ {
+ "int32[]",
+ "int32[..., ...]".Replace(" ", string.Empty),
+ "int32[0...4]",
+ "int32[2...]",
+ "int32[2...5]",
+ },
+ signature.DecodeLocalSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
+ }
+
+ [Fact]
+ public void MultiDimensionalLocalSignature_EmitsArrayShape()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test extends [mscorlib]System.Object
+ {
+ .method public static void M() cil managed
+ {
+ .locals init (int32[0...,0...] matrix)
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var signature = reader.GetStandaloneSignature(MetadataTokens.StandaloneSignatureHandle(1));
+ Assert.Equal(
+ new[] { "int32[0...,0...]" },
+ signature.DecodeLocalSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
+ }
+
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/TypedefTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/TypedefTests.cs
index 94605d871dd495..5f4f3b8fc37d29 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/TypedefTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/TypedefTests.cs
@@ -143,5 +143,51 @@ .method public static void TestMethod() cil managed
Assert.Empty(diagnostics);
}
+ [Fact]
+ public void Typedef_FieldAndCustomAttributeForms_EmitResolvableMetadata()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .typedef field int32 Test::Value as ValueAlias
+ .typedef .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00) as AttributeAlias
+ .typedef .custom (Test) instance void [mscorlib]System.CLSCompliantAttribute::.ctor(bool) = (01 00 01 00 00) as OwnedAttributeAlias
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .field public static int32 Value
+ AttributeAlias
+ .method public static int32 Read() cil managed
+ {
+ ldsfld ValueAlias
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var testTypeHandle = reader.TypeDefinitions
+ .Single(handle => reader.GetString(reader.GetTypeDefinition(handle).Name) == "Test");
+ var testType = reader.GetTypeDefinition(testTypeHandle);
+ var fieldHandle = Assert.Single(testType.GetFields());
+ int fieldToken =
+ DocumentCompilerTestHelpers.GetFirstTokenOperand(pe, reader, "Read", ILOpcode.ldsfld);
+
+ Assert.Equal(MetadataTokens.GetToken(fieldHandle), fieldToken);
+
+ var attributes = reader.GetCustomAttributes(testTypeHandle)
+ .Select(reader.GetCustomAttribute)
+ .Select(attribute => attribute.DecodeValue(DocumentCompilerTestHelpers.Decoder))
+ .ToArray();
+ Assert.Equal(2, attributes.Length);
+ Assert.Contains(attributes, attribute => attribute.FixedArguments.Length == 0);
+ Assert.Contains(
+ attributes,
+ attribute =>
+ attribute.FixedArguments.Length == 1 &&
+ attribute.FixedArguments[0].Type == "bool" &&
+ Equals(attribute.FixedArguments[0].Value, true));
+ }
+
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/VTableTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/VTableTests.cs
index 24b400fd56c7b7..08603d775abdde 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/VTableTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/VTableTests.cs
@@ -185,5 +185,6 @@ .export [2] as Export2
Assert.Contains("Method1", methodNames);
Assert.Contains("Method2", methodNames);
}
+
}
}