From 619c640844511fd9ea12deeb48ad18dd744feadf Mon Sep 17 00:00:00 2001 From: Tim Haasdyk Date: Fri, 3 Jul 2026 16:03:25 +0200 Subject: [PATCH 01/21] Add variant model, CRDT changes and API surface One Variant link = one LexEntryRef (RefType=Variant) with per-link Types, HideMinorEntry and Comment (LCM Summary), per VARIANTS.md. Co-Authored-By: Claude Fable 5 --- .../Api/FwDataMiniLcmApi.cs | 285 ++++- .../Api/UpdateProxy/UpdateVariantProxy.cs | 61 ++ .../Api/UpdateProxy/UpdateVariantTypeProxy.cs | 33 + .../FwLiteProjectSync/DryRunMiniLcmApi.cs | 80 +- .../Services/MiniLcmApiNotifyWrapper.cs | 32 + ...lizationRegressionData.latest.verified.txt | 205 ++++ .../LcmCrdt.Tests/Changes/UseChangesTests.cs | 19 + .../LcmCrdt/Changes/CreateVariantType.cs | 21 + .../Changes/Entries/AddVariantChange.cs | 115 +++ .../Changes/Entries/AddVariantTypeChange.cs | 18 + .../Entries/RemoveVariantTypeChange.cs | 15 + backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs | 139 +++ .../FwLite/LcmCrdt/Data/EntryQueryHelpers.cs | 3 + .../FwLite/LcmCrdt/Data/MiniLcmRepository.cs | 24 +- backend/FwLite/LcmCrdt/LcmCrdtDbContext.cs | 2 + backend/FwLite/LcmCrdt/LcmCrdtKernel.cs | 53 + .../20260703134525_AddVariants.Designer.cs | 972 ++++++++++++++++++ .../Migrations/20260703134525_AddVariants.cs | 126 +++ .../LcmCrdtDbContextModelSnapshot.cs | 120 +++ backend/FwLite/LcmCrdt/QueryHelpers.cs | 27 +- backend/FwLite/MiniLcm/CreateEntryOptions.cs | 3 +- backend/FwLite/MiniLcm/IMiniLcmReadApi.cs | 2 + backend/FwLite/MiniLcm/IMiniLcmWriteApi.cs | 21 + backend/FwLite/MiniLcm/Models/Entry.cs | 32 +- .../FwLite/MiniLcm/Models/IObjectWithId.cs | 2 + backend/FwLite/MiniLcm/Models/Variant.cs | 104 ++ backend/FwLite/MiniLcm/Models/VariantType.cs | 23 + .../MiniLcmApiWriteNormalizationWrapper.cs | 78 +- .../FwLite/MiniLcm/SyncHelpers/EntrySync.cs | 38 + .../FwLite/MiniLcm/SyncHelpers/VariantSync.cs | 57 + .../MiniLcm/SyncHelpers/VariantTypeSync.cs | 56 + .../MiniLcm/Validators/EntryValidator.cs | 34 + .../Validators/MiniLcmApiValidationWrapper.cs | 24 + .../MiniLcm/Validators/MiniLcmValidators.cs | 14 + .../Validators/VariantTypeValidator.cs | 13 + .../MiniLcm/Validators/VariantValidator.cs | 19 + backend/FwLite/VARIANTS.md | 278 +++++ backend/LfClassicData/LfClassicMiniLcmApi.cs | 10 + .../generated-types/MiniLcm/Models/IEntry.ts | 3 + .../MiniLcm/Models/IVariant.ts | 22 + .../MiniLcm/Models/IVariantType.ts | 15 + 41 files changed, 3149 insertions(+), 49 deletions(-) create mode 100644 backend/FwLite/FwDataMiniLcmBridge/Api/UpdateProxy/UpdateVariantProxy.cs create mode 100644 backend/FwLite/FwDataMiniLcmBridge/Api/UpdateProxy/UpdateVariantTypeProxy.cs create mode 100644 backend/FwLite/LcmCrdt/Changes/CreateVariantType.cs create mode 100644 backend/FwLite/LcmCrdt/Changes/Entries/AddVariantChange.cs create mode 100644 backend/FwLite/LcmCrdt/Changes/Entries/AddVariantTypeChange.cs create mode 100644 backend/FwLite/LcmCrdt/Changes/Entries/RemoveVariantTypeChange.cs create mode 100644 backend/FwLite/LcmCrdt/Migrations/20260703134525_AddVariants.Designer.cs create mode 100644 backend/FwLite/LcmCrdt/Migrations/20260703134525_AddVariants.cs create mode 100644 backend/FwLite/MiniLcm/Models/Variant.cs create mode 100644 backend/FwLite/MiniLcm/Models/VariantType.cs create mode 100644 backend/FwLite/MiniLcm/SyncHelpers/VariantSync.cs create mode 100644 backend/FwLite/MiniLcm/SyncHelpers/VariantTypeSync.cs create mode 100644 backend/FwLite/MiniLcm/Validators/VariantTypeValidator.cs create mode 100644 backend/FwLite/MiniLcm/Validators/VariantValidator.cs create mode 100644 backend/FwLite/VARIANTS.md create mode 100644 frontend/viewer/src/lib/dotnet-types/generated-types/MiniLcm/Models/IVariant.ts create mode 100644 frontend/viewer/src/lib/dotnet-types/generated-types/MiniLcm/Models/IVariantType.ts diff --git a/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs b/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs index 4d390f93f5..6bd396bf82 100644 --- a/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs +++ b/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs @@ -68,6 +68,7 @@ public LcmCache Cache internal IEnumerable ComplexFormTypesFlattened => ComplexFormTypes.PossibilitiesOS.Cast().Flatten(); private ICmPossibilityList VariantTypes => Cache.LangProject.LexDbOA.VariantEntryTypesOA; + internal IEnumerable VariantTypesFlattened => VariantTypes.PossibilitiesOS.Cast().Flatten(); private ICmPossibilityList Publications => Cache.LangProject.LexDbOA.PublicationTypesOA; public void Dispose() @@ -568,6 +569,76 @@ await Cache.DoUsingNewOrCurrentUOW("Delete Complex Form Type", }); } + // flattened (unlike complex-form types' public read) because the Irregularly Inflected Form + // subtypes (Plural, Past) are children in the possibility list and must be assignable + public IAsyncEnumerable GetVariantTypes() + { + return VariantTypesFlattened.Select(ToVariantType).ToAsyncEnumerable(); + } + + public Task GetVariantType(Guid id) + { + var lexEntryType = VariantTypesFlattened.SingleOrDefault(t => t.Guid == id); + if (lexEntryType is null) return Task.FromResult(null); + return Task.FromResult(ToVariantType(lexEntryType)); + } + + private VariantType ToVariantType(ILexEntryType t) + { + return new VariantType() { Id = t.Guid, Name = FromLcmMultiString(t.Name) }; + } + + public Task CreateVariantType(VariantType variantType) + { + if (variantType.Id == default) variantType.Id = Guid.NewGuid(); + UndoableUnitOfWorkHelper.DoUsingNewOrCurrentUOW("Create variant type", + "Remove variant type", + Cache.ActionHandlerAccessor, + () => + { + var lexVariantType = Cache.ServiceLocator + .GetInstance() + .Create(variantType.Id); + VariantTypes.PossibilitiesOS.Add(lexVariantType); + UpdateLcmMultiString(lexVariantType.Name, variantType.Name); + }); + return Task.FromResult(ToVariantType(VariantTypesFlattened.Single(t => t.Guid == variantType.Id))); + } + + public Task UpdateVariantType(Guid id, UpdateObjectInput update) + { + var type = VariantTypesFlattened.SingleOrDefault(t => t.Guid == id); + if (type is null) throw new NullReferenceException($"unable to find variant type with id {id}"); + UndoableUnitOfWorkHelper.DoUsingNewOrCurrentUOW("Update Variant Type", + "Revert Variant Type", + Cache.ServiceLocator.ActionHandler, + () => + { + var updateProxy = new UpdateVariantTypeProxy(type, this); + update.Apply(updateProxy); + }); + return Task.FromResult(ToVariantType(type)); + } + + public async Task UpdateVariantType(VariantType before, VariantType after, IMiniLcmApi? api = null) + { + await VariantTypeSync.Sync(before, after, api ?? this); + return ToVariantType(VariantTypesFlattened.Single(t => t.Guid == after.Id)); + } + + public async Task DeleteVariantType(Guid id) + { + var type = VariantTypesFlattened.SingleOrDefault(t => t.Guid == id); + if (type is null) return; + await Cache.DoUsingNewOrCurrentUOW("Delete Variant Type", + "Revert delete", + () => + { + type.Delete(); + return ValueTask.CompletedTask; + }); + } + public IAsyncEnumerable GetMorphTypes() { return @@ -634,12 +705,6 @@ public async Task UpdateMorphType(MorphType before, MorphType after, return await GetMorphType(after.Id) ?? throw new NullReferenceException("unable to find morph type with id " + after.Id); } - public IAsyncEnumerable GetVariantTypes() - { - return VariantTypes.PossibilitiesOS - .Select(t => new VariantType() { Id = t.Guid, Name = FromLcmMultiString(t.Name) }) - .ToAsyncEnumerable(); - } public IAsyncEnumerable GetPublications() { return Publications.PossibilitiesOS @@ -688,6 +753,8 @@ private Entry FromLexEntry(ILexEntry entry) ..entry.ComplexFormEntries.Select(complexEntry => ToEntryReference(entry, complexEntry)), ..entry.AllSenses.SelectMany(sense => sense.ComplexFormEntries.Select(complexEntry => ToSenseReference(sense, complexEntry))) ], + VariantOf = [.. ToVariantOf(entry)], + Variants = [.. ToVariants(entry)], // ILexEntry.PublishIn is a virtual property that inverts DoNotPublishInRC against all publications PublishIn = entry.PublishIn.Select(FromLcmPossibility).ToList(), }; @@ -718,27 +785,40 @@ private IEnumerable ToComplexFormComponents(ILexEntry entr }).DistinctBy(c => (c.ComponentEntryId, c.ComplexFormEntryId, c.ComponentSenseId)); } - private Variants? ToVariants(ILexEntry entry) + private IEnumerable ToVariantOf(ILexEntry entry) { - var variantEntryRef = entry.VariantEntryRefs.SingleOrDefault(); - if (variantEntryRef is null) return null; - return new Variants - { - Id = variantEntryRef.Guid, - VariantsOf = - [ - ..variantEntryRef.ComponentLexemesRS.Select(o => o switch + return entry.VariantEntryRefs.SelectMany(r => r.ComponentLexemesRS, + (r, o) => o switch { - ILexEntry component => ToEntryReference(component, entry), - ILexSense s => ToSenseReference(s, entry), + ILexEntry mainEntry => ToVariant(entry, r, mainEntry, null), + ILexSense mainSense => ToVariant(entry, r, mainSense.Entry, mainSense), _ => throw new NotSupportedException($"object type {o.ClassName} not supported") }) - ], - Types = - [ - ..variantEntryRef.VariantEntryTypesRS.Select(t => - new VariantType() { Id = t.Guid, Name = FromLcmMultiString(t.Name), }) - ] + .DistinctBy(v => (v.VariantEntryId, v.MainEntryId, v.MainSenseId)); + } + + private IEnumerable ToVariants(ILexEntry entry) + { + return + [ + ..entry.VariantFormEntryBackRefs.Select(r => ToVariant(r.OwningEntry, r, entry, null)), + ..entry.AllSenses.SelectMany(sense => + sense.VariantFormEntryBackRefs.Select(r => ToVariant(r.OwningEntry, r, entry, sense))) + ]; + } + + private Variant ToVariant(ILexEntry variantEntry, ILexEntryRef variantRef, ILexEntry mainEntry, ILexSense? mainSense) + { + return new Variant + { + VariantEntryId = variantEntry.Guid, + VariantHeadword = variantEntry.LexEntryHeadwordOrUnknown(), + MainEntryId = mainEntry.Guid, + MainSenseId = mainSense?.Guid, + MainHeadword = mainEntry.LexEntryHeadwordOrUnknown(), + Types = [..variantRef.VariantEntryTypesRS.Select(ToVariantType)], + HideMinorEntry = variantRef.HideMinorEntry != 0, + Comment = FromLcmMultiString(variantRef.Summary), }; } @@ -1078,6 +1158,19 @@ public async Task CreateEntry(Entry entry, CreateEntryOptions? options = var complexLexEntry = EntriesRepository.GetObject(complexForm.ComplexFormEntryId); AddComplexFormComponent(complexLexEntry, complexForm); } + + foreach (var variantOf in entry.VariantOf) + { + if (variantOf.VariantEntryId == default) variantOf.VariantEntryId = entry.Id; + AddVariant(lexEntry, variantOf); + } + + foreach (var variant in entry.Variants) + { + if (variant.MainEntryId == default) variant.MainEntryId = entry.Id; + var lexVariantEntry = EntriesRepository.GetObject(variant.VariantEntryId); + AddVariant(lexVariantEntry, variant); + } } // Remove publications not in entry.PublishIn from lexEntry.PublishIn foreach (var lcmPub in Publications.PossibilitiesOS.Where(p => entry.PublishIn.All(ep => ep.Id != p.Guid))) @@ -1285,6 +1378,152 @@ internal void RemoveComplexFormType(ILexEntry lexEntry, Guid complexFormTypeId) } } + public Task CreateVariant(Variant variant) + { + UndoableUnitOfWorkHelper.DoUsingNewOrCurrentUOW("Create Variant", + "Remove Variant", + Cache.ServiceLocator.ActionHandler, + () => + { + var lexVariantEntry = EntriesRepository.GetObject(variant.VariantEntryId); + AddVariant(lexVariantEntry, variant); + }); + return Task.FromResult(ToVariantOf(EntriesRepository.GetObject(variant.VariantEntryId)) + .Single(v => v.MainEntryId == variant.MainEntryId && v.MainSenseId == variant.MainSenseId)); + } + + public async Task UpdateVariant(Variant before, Variant after, IMiniLcmApi? api = null) + { + await VariantSync.Sync(before, after, api ?? this); + return ToVariantOf(EntriesRepository.GetObject(after.VariantEntryId)) + .Single(v => v.MainEntryId == after.MainEntryId && v.MainSenseId == after.MainSenseId); + } + + public Task SubmitUpdateVariant(Variant variant, UpdateObjectInput update) + { + var lexVariantEntry = EntriesRepository.GetObject(variant.VariantEntryId); + var entryRef = FindVariantRef(lexVariantEntry, variant) + ?? throw NotFoundException.ForType(variant.VariantEntryId); + UndoableUnitOfWorkHelper.DoUsingNewOrCurrentUOW("Update Variant", + "Revert Variant", + Cache.ServiceLocator.ActionHandler, + () => + { + var updateProxy = new UpdateVariantProxy(entryRef, this); + update.Apply(updateProxy); + }); + return Task.CompletedTask; + } + + public Task DeleteVariant(Variant variant) + { + //variant entry has been deleted, so this link is gone already + if (!EntriesRepository.TryGetObject(variant.VariantEntryId, out var lexVariantEntry)) + return Task.CompletedTask; + + UndoableUnitOfWorkHelper.DoUsingNewOrCurrentUOW("Delete Variant", + "Add Variant", + Cache.ServiceLocator.ActionHandler, + () => + { + RemoveVariant(lexVariantEntry, variant); + }); + return Task.CompletedTask; + } + + public Task AddVariantType(Variant variant, Guid variantTypeId) + { + UndoableUnitOfWorkHelper.DoUsingNewOrCurrentUOW("Add Variant Type", + "Remove Variant Type", + Cache.ServiceLocator.ActionHandler, + () => + { + //link (or its entry) deleted already — match CRDT tolerance + if (!EntriesRepository.TryGetObject(variant.VariantEntryId, out var lexVariantEntry)) return; + var entryRef = FindVariantRef(lexVariantEntry, variant); + if (entryRef is null) return; + var lexEntryType = VariantTypesFlattened.Single(t => t.Guid == variantTypeId); + if (entryRef.VariantEntryTypesRS.Contains(lexEntryType)) return; + entryRef.VariantEntryTypesRS.Add(lexEntryType); + }); + return Task.CompletedTask; + } + + public Task RemoveVariantType(Variant variant, Guid variantTypeId) + { + UndoableUnitOfWorkHelper.DoUsingNewOrCurrentUOW("Remove Variant Type", + "Add Variant Type", + Cache.ServiceLocator.ActionHandler, + () => + { + if (!EntriesRepository.TryGetObject(variant.VariantEntryId, out var lexVariantEntry)) return; + var entryRef = FindVariantRef(lexVariantEntry, variant); + if (entryRef is null) return; + var lexEntryType = entryRef.VariantEntryTypesRS.SingleOrDefault(t => t.Guid == variantTypeId); + if (lexEntryType is null) return; + entryRef.VariantEntryTypesRS.Remove(lexEntryType); + }); + return Task.CompletedTask; + } + + /// + /// must be called as part of an lcm action + /// + internal void AddVariant(ILexEntry lexVariantEntry, Variant variant) + { + if (FindVariantRef(lexVariantEntry, variant) is not null) return; //idempotent, like the CRDT side + var target = variant.MainSenseId is not null + ? (ICmObject)SenseRepository.GetObject(variant.MainSenseId.Value) + : EntriesRepository.GetObject(variant.MainEntryId); + //one LexEntryRef per link — multiple variant refs on an entry are how FLEx represents + //being a variant of multiple things with different types + var entryRef = Cache.ServiceLocator.GetInstance().Create(); + lexVariantEntry.EntryRefsOS.Add(entryRef); + entryRef.RefType = LexEntryRefTags.krtVariant; + entryRef.HideMinorEntry = variant.HideMinorEntry ? 1 : 0; + UpdateLcmMultiString(entryRef.Summary, variant.Comment); + foreach (var type in variant.Types) + { + entryRef.VariantEntryTypesRS.Add(VariantTypesFlattened.Single(t => t.Guid == type.Id)); + } + entryRef.ComponentLexemesRS.Add(target); + } + + internal void RemoveVariant(ILexEntry lexVariantEntry, Variant variant) + { + ICmObject target; + if (variant.MainSenseId is not null) + { + //sense has been deleted, so this link is gone already + if (!SenseRepository.TryGetObject(variant.MainSenseId.Value, out var sense)) return; + target = sense; + } + else + { + //entry has been deleted, so this link is gone already + if (!EntriesRepository.TryGetObject(variant.MainEntryId, out var mainEntry)) return; + target = mainEntry; + } + + foreach (var entryRef in lexVariantEntry.VariantEntryRefs.ToArray()) + { + entryRef.ComponentLexemesRS.Remove(target); + if (entryRef.ComponentLexemesRS.Count == 0) + { + //an empty variant ref is meaningless; liblcm deletes them in its own cleanup paths too + lexVariantEntry.EntryRefsOS.Remove(entryRef); + } + } + //not throwing to match CRDT behavior + } + + internal ILexEntryRef? FindVariantRef(ILexEntry lexVariantEntry, Variant variant) + { + var targetGuid = variant.MainSenseId ?? variant.MainEntryId; + return lexVariantEntry.VariantEntryRefs + .FirstOrDefault(r => r.ComponentLexemesRS.Any(o => o.Guid == targetGuid)); + } + private IList MultiStringToTsStrings(MultiString? multiString) { if (multiString is null) return []; diff --git a/backend/FwLite/FwDataMiniLcmBridge/Api/UpdateProxy/UpdateVariantProxy.cs b/backend/FwLite/FwDataMiniLcmBridge/Api/UpdateProxy/UpdateVariantProxy.cs new file mode 100644 index 0000000000..e19e327cdd --- /dev/null +++ b/backend/FwLite/FwDataMiniLcmBridge/Api/UpdateProxy/UpdateVariantProxy.cs @@ -0,0 +1,61 @@ +using System.Diagnostics.CodeAnalysis; +using MiniLcm.Models; +using SIL.LCModel; + +namespace FwDataMiniLcmBridge.Api.UpdateProxy; + +/// +/// Applies patches of a variant link's own fields (HideMinorEntry, Comment) to the +/// LexEntryRef. Endpoints and Types are not patchable — links are recreated for endpoint +/// changes and types go through Add/RemoveVariantType. +/// +public record UpdateVariantProxy : Variant +{ + private readonly ILexEntryRef _lexEntryRef; + private readonly FwDataMiniLcmApi _lexboxLcmApi; + + [SetsRequiredMembers] + public UpdateVariantProxy(ILexEntryRef lexEntryRef, FwDataMiniLcmApi lexboxLcmApi) + { + _lexEntryRef = lexEntryRef; + _lexboxLcmApi = lexboxLcmApi; + } + + public override required Guid VariantEntryId + { + get => _lexEntryRef.Owner.Guid; + set => throw new NotImplementedException(); + } + + public override required Guid MainEntryId + { + get => throw new NotImplementedException(); + set => throw new NotImplementedException(); + } + + public override Guid? MainSenseId + { + get => throw new NotImplementedException(); + set => throw new NotImplementedException(); + } + + public override List Types + { + get => throw new NotImplementedException(); + set => throw new NotImplementedException(); + } + + public override bool HideMinorEntry + { + get => _lexEntryRef.HideMinorEntry != 0; + set => _lexEntryRef.HideMinorEntry = value ? 1 : 0; + } + + public override RichMultiString Comment + { + get => new UpdateRichMultiStringProxy(_lexEntryRef.Summary, _lexboxLcmApi); + set + { + } + } +} diff --git a/backend/FwLite/FwDataMiniLcmBridge/Api/UpdateProxy/UpdateVariantTypeProxy.cs b/backend/FwLite/FwDataMiniLcmBridge/Api/UpdateProxy/UpdateVariantTypeProxy.cs new file mode 100644 index 0000000000..3c2a8b15ca --- /dev/null +++ b/backend/FwLite/FwDataMiniLcmBridge/Api/UpdateProxy/UpdateVariantTypeProxy.cs @@ -0,0 +1,33 @@ +using System.Diagnostics.CodeAnalysis; +using MiniLcm.Models; +using SIL.LCModel; + +namespace FwDataMiniLcmBridge.Api.UpdateProxy; + +public record UpdateVariantTypeProxy : VariantType +{ + private readonly ILexEntryType _lexEntryType; + private readonly FwDataMiniLcmApi _lexboxLcmApi; + + [SetsRequiredMembers] + public UpdateVariantTypeProxy(ILexEntryType lexEntryType, FwDataMiniLcmApi lexboxLcmApi) + { + _lexEntryType = lexEntryType; + _lexboxLcmApi = lexboxLcmApi; + Name = base.Name = new(); + } + + public override Guid Id + { + get => _lexEntryType.Guid; + set => throw new NotImplementedException(); + } + + public override required MultiString Name + { + get => new UpdateMultiStringProxy(_lexEntryType.Name, _lexboxLcmApi); + set + { + } + } +} diff --git a/backend/FwLite/FwLiteProjectSync/DryRunMiniLcmApi.cs b/backend/FwLite/FwLiteProjectSync/DryRunMiniLcmApi.cs index 61ea258c89..057855673e 100644 --- a/backend/FwLite/FwLiteProjectSync/DryRunMiniLcmApi.cs +++ b/backend/FwLite/FwLiteProjectSync/DryRunMiniLcmApi.cs @@ -126,6 +126,31 @@ public Task DeleteComplexFormType(Guid id) return Task.CompletedTask; } + public Task CreateVariantType(VariantType variantType) + { + DryRunRecords.Add(new DryRunRecord(nameof(CreateVariantType), + $"Create variant type {variantType.Name}")); + return Task.FromResult(variantType); + } + + public async Task UpdateVariantType(Guid id, UpdateObjectInput update) + { + DryRunRecords.Add(new DryRunRecord(nameof(UpdateVariantType), $"Update variant type {id}")); + return await _api.GetVariantType(id) ?? throw new NullReferenceException($"unable to find variant type with id {id}"); + } + + public Task UpdateVariantType(VariantType before, VariantType after, IMiniLcmApi? api) + { + DryRunRecords.Add(new DryRunRecord(nameof(UpdateVariantType), $"Update variant type {after.Id}")); + return Task.FromResult(after); + } + + public Task DeleteVariantType(Guid id) + { + DryRunRecords.Add(new DryRunRecord(nameof(DeleteVariantType), $"Delete variant type {id}")); + return Task.CompletedTask; + } + public Task CreateMorphType(MorphType morphType) { DryRunRecords.Add(new DryRunRecord(nameof(CreateMorphType), $"Create morph type {morphType.Kind} ({morphType.Id})")); @@ -152,7 +177,7 @@ public Task CreateEntry(Entry entry, CreateEntryOptions? options) if (options.IncludeComplexFormsAndComponents) return Task.FromResult(entry); else - return Task.FromResult(entry with { Components = [], ComplexForms = [] }); + return Task.FromResult(entry with { Components = [], ComplexForms = [], VariantOf = [], Variants = [] }); } public Task UpdateEntry(Guid id, UpdateObjectInput update) @@ -364,6 +389,41 @@ public async Task AddComplexFormType(Guid entryId, Guid complexFormTypeId) await Task.CompletedTask; } + public Task CreateVariant(Variant variant) + { + DryRunRecords.Add(new DryRunRecord(nameof(CreateVariant), $"Create variant link {VariantName(variant)}")); + return Task.FromResult(variant); + } + + public Task UpdateVariant(Variant before, Variant after, IMiniLcmApi? api = null) + { + DryRunRecords.Add(new DryRunRecord(nameof(UpdateVariant), $"Update variant link {VariantName(after)}")); + return Task.FromResult(after); + } + + public Task DeleteVariant(Variant variant) + { + DryRunRecords.Add(new DryRunRecord(nameof(DeleteVariant), $"Delete variant link {VariantName(variant)}")); + return Task.CompletedTask; + } + + public Task AddVariantType(Variant variant, Guid variantTypeId) + { + DryRunRecords.Add(new DryRunRecord(nameof(AddVariantType), $"Add variant type {variantTypeId} to variant link {VariantName(variant)}")); + return Task.CompletedTask; + } + + public Task RemoveVariantType(Variant variant, Guid variantTypeId) + { + DryRunRecords.Add(new DryRunRecord(nameof(RemoveVariantType), $"Remove variant type {variantTypeId} from variant link {VariantName(variant)}")); + return Task.CompletedTask; + } + + private static string VariantName(Variant variant) + { + return $"{variant.VariantHeadword ?? variant.VariantEntryId.ToString()} -> {variant.MainHeadword ?? variant.MainEntryId.ToString()}{(variant.MainSenseId is null ? "" : $" (sense {variant.MainSenseId})")}"; + } + public async Task CreatePublication(Publication pub) { DryRunRecords.Add(new DryRunRecord(nameof(CreatePublication), $"Create publication {pub.Id}")); @@ -440,6 +500,24 @@ public Task SubmitCreateComplexFormComponent(ComplexFormComponent complexFormCom return Task.CompletedTask; } + public Task SubmitCreateVariant(Variant variant) + { + DryRunRecords.Add(new DryRunRecord(nameof(SubmitCreateVariant), $"Create variant link {VariantName(variant)}")); + return Task.CompletedTask; + } + + public Task SubmitUpdateVariant(Variant variant, UpdateObjectInput update) + { + DryRunRecords.Add(new DryRunRecord(nameof(SubmitUpdateVariant), $"Update variant link {VariantName(variant)}")); + return Task.CompletedTask; + } + + public Task SubmitUpdateVariantType(Guid id, UpdateObjectInput update) + { + DryRunRecords.Add(new DryRunRecord(nameof(SubmitUpdateVariantType), $"Update variant type {id}")); + return Task.CompletedTask; + } + public Task SubmitUpdatePartOfSpeech(Guid id, UpdateObjectInput update) { DryRunRecords.Add(new DryRunRecord(nameof(SubmitUpdatePartOfSpeech), $"Update part of speech {id}")); diff --git a/backend/FwLite/FwLiteShared/Services/MiniLcmApiNotifyWrapper.cs b/backend/FwLite/FwLiteShared/Services/MiniLcmApiNotifyWrapper.cs index ebf9048bd3..d8642e6de5 100644 --- a/backend/FwLite/FwLiteShared/Services/MiniLcmApiNotifyWrapper.cs +++ b/backend/FwLite/FwLiteShared/Services/MiniLcmApiNotifyWrapper.cs @@ -136,6 +136,38 @@ async Task IMiniLcmWriteApi.DeleteComplexFormComponent(ComplexFormComponent comp NotifyEntriesChanged(complexFormComponent.ComplexFormEntryId, complexFormComponent.ComponentEntryId); } + async Task IMiniLcmWriteApi.CreateVariant(Variant variant) + { + var result = await _api.CreateVariant(variant); + NotifyEntriesChanged(result.VariantEntryId, result.MainEntryId); + return result; + } + + async Task IMiniLcmWriteApi.UpdateVariant(Variant before, Variant after, IMiniLcmApi? api) + { + var result = await _api.UpdateVariant(before, after, api ?? this); + NotifyEntriesChanged(result.VariantEntryId, result.MainEntryId); + return result; + } + + async Task IMiniLcmWriteApi.DeleteVariant(Variant variant) + { + await _api.DeleteVariant(variant); + NotifyEntriesChanged(variant.VariantEntryId, variant.MainEntryId); + } + + async Task IMiniLcmWriteApi.AddVariantType(Variant variant, Guid variantTypeId) + { + await _api.AddVariantType(variant, variantTypeId); + NotifyEntriesChanged(variant.VariantEntryId, variant.MainEntryId); + } + + async Task IMiniLcmWriteApi.RemoveVariantType(Variant variant, Guid variantTypeId) + { + await _api.RemoveVariantType(variant, variantTypeId); + NotifyEntriesChanged(variant.VariantEntryId, variant.MainEntryId); + } + async Task IMiniLcmWriteApi.DeleteEntry(Guid id) { await _api.DeleteEntry(id); diff --git a/backend/FwLite/LcmCrdt.Tests/Changes/ChangeDeserializationRegressionData.latest.verified.txt b/backend/FwLite/LcmCrdt.Tests/Changes/ChangeDeserializationRegressionData.latest.verified.txt index b28168b1ba..ced3095eae 100644 --- a/backend/FwLite/LcmCrdt.Tests/Changes/ChangeDeserializationRegressionData.latest.verified.txt +++ b/backend/FwLite/LcmCrdt.Tests/Changes/ChangeDeserializationRegressionData.latest.verified.txt @@ -1293,5 +1293,210 @@ { "$type": "SetMainPublicationChange", "EntityId": "c775e310-fc5c-6d01-5a02-146d579a88e5" + }, + { + "$type": "jsonPatch:VariantType", + "PatchDocument": [], + "EntityId": "7f36b194-09c4-1938-164e-820359470a8d" + }, + { + "$type": "jsonPatch:Variant", + "PatchDocument": [], + "EntityId": "2c441083-20d5-f98e-bd30-453dee57152e" + }, + { + "$type": "delete:VariantType", + "EntityId": "c76a3a53-8fa6-d2c3-df38-a742996e450e" + }, + { + "$type": "delete:Variant", + "EntityId": "a33e0d22-ca25-baaa-b103-61595e8d8443" + }, + { + "$type": "AddVariantChange", + "VariantEntryId": "6d309276-3cdc-3d59-7564-174855c2a66d", + "MainEntryId": "4ee3936e-f7bb-7bff-43ba-57a83f6e9090", + "MainSenseId": "51be3bfc-8d80-10f3-04a0-2f1b6b02a54a", + "Types": [ + { + "Id": "d0d4caf3-7fcf-3cca-9044-fd1c8874a40e", + "Name": { + "bge": "Tactics", + "lla": "teal" + }, + "DeletedAt": null + }, + { + "Id": "eccfe67c-656e-b7a1-61f8-16fd6115f982", + "Name": { + "mrs": "ability" + }, + "DeletedAt": null + } + ], + "HideMinorEntry": true, + "Comment": { + "dzl": { + "Spans": [ + { + "Text": "Home Loan Account", + "Ws": "tdd", + "Bold": "Invert", + "FontSize": -635375918, + "ForeColor": "#FF0000", + "Tags": [ + "284e5f58-55ce-28ae-b48a-2c683cfb7cd9" + ] + }, + { + "Text": "calculate", + "Ws": "dzl", + "Tags": [ + "f58baf48-036d-457f-a52f-359d4b662ee4" + ] + }, + { + "Text": "XML", + "Ws": "dzl", + "Tags": [ + "6f8f8ed2-6ada-498e-8bbf-1516e1a38946" + ] + } + ] + }, + "poh": { + "Spans": [ + { + "Text": "navigating", + "Ws": "plv", + "Bold": "Invert", + "FontSize": -1766572977, + "ForeColor": "#FF0000", + "Tags": [ + "9a7525d3-a3a0-f5b6-75b8-dcc31842bd4b" + ] + }, + { + "Text": "Buckinghamshire", + "Ws": "poh", + "Tags": [ + "9733340e-a780-4915-9c6e-6a0a773bb624" + ] + }, + { + "Text": "Reactive", + "Ws": "khw", + "Bold": "On", + "FontSize": 217067649, + "ForeColor": "#FF0000", + "Tags": [ + "6590d40b-9c9e-6bf4-022e-cbef362e2539" + ] + }, + { + "Text": "bypassing", + "Ws": "bao", + "Bold": "On", + "FontSize": -1139203638, + "ForeColor": "#00FFFF", + "Tags": [ + "a158092c-95c6-ece7-40f0-245eef31b440" + ] + } + ] + }, + "mto": { + "Spans": [ + { + "Text": "Small Wooden Mouse", + "Ws": "mto", + "Tags": [ + "82ce54e3-899e-49f9-b68e-a32aac910447" + ] + }, + { + "Text": "invoice", + "Ws": "ggo", + "Bold": "Off", + "FontSize": 156095798, + "ForeColor": "#FF0000", + "Tags": [ + "8c03dece-11db-82ec-d8db-7f5b322993eb" + ] + }, + { + "Text": "Square", + "Ws": "mto", + "Tags": [ + "bb75edd3-cfcf-49f2-ac3a-a675fc34068d" + ] + }, + { + "Text": "Borders", + "Ws": "mof", + "Bold": "Off", + "FontSize": 1551749924, + "ForeColor": "#A52A2A", + "Tags": [ + "83245146-9102-463d-6702-9805ecddf9ed" + ] + } + ] + }, + "boj": { + "Spans": [ + { + "Text": "Customer", + "Ws": "boj", + "Tags": [ + "ab794f7a-1958-4c2f-82d8-dd80b331317f" + ] + }, + { + "Text": "Response", + "Ws": "aso", + "Bold": "On", + "FontSize": 745397328, + "ForeColor": "#ADFF2F", + "Tags": [ + "45286390-397e-4f46-c918-fc743707fe27" + ] + }, + { + "Text": "visionary", + "Ws": "boj", + "Tags": [ + "7f95818c-4e9f-4d43-85e4-91e2b1b7d7f6" + ] + } + ] + } + }, + "EntityId": "696c660f-bc0e-75b2-3dc8-cd549fb77bc0" + }, + { + "$type": "AddVariantTypeChange", + "VariantType": { + "Id": "c1d3f294-1a67-25b2-5110-864e2debb6bc", + "Name": { + "ggt": "Viaduct" + }, + "DeletedAt": null + }, + "EntityId": "0da6b6a5-5e7a-6f91-9610-a62c595dbdfb" + }, + { + "$type": "RemoveVariantTypeChange", + "VariantTypeId": "33b6d5be-8799-580d-5587-8879e04c8cc9", + "EntityId": "8181bc40-4b7a-5402-4442-7eed4904cff1" + }, + { + "$type": "CreateVariantType", + "Name": { + "csj": "calculating", + "ljp": "open system", + "nab": "Overpass" + }, + "EntityId": "6a8e727c-2e47-90af-a1ec-42d94fc3e38e" } ] \ No newline at end of file diff --git a/backend/FwLite/LcmCrdt.Tests/Changes/UseChangesTests.cs b/backend/FwLite/LcmCrdt.Tests/Changes/UseChangesTests.cs index 7b81d89da0..7107c7b541 100644 --- a/backend/FwLite/LcmCrdt.Tests/Changes/UseChangesTests.cs +++ b/backend/FwLite/LcmCrdt.Tests/Changes/UseChangesTests.cs @@ -238,6 +238,25 @@ private static IEnumerable GetAllChanges() var setComplexFormComponentChange = SetComplexFormComponentChange.NewComponent(complexFormComponent.Id, componentEntry.Id); yield return new ChangeWithDependencies(setComplexFormComponentChange, [createcomponentEntryChange, createComplexFormComponentChange]); + var variantTypeName = new MultiString { { "en", "test vt" } }; + var variantType = new VariantType { Id = Guid.NewGuid(), Name = variantTypeName }; + var createVariantType = new CreateVariantType(variantType.Id, variantTypeName); + yield return new ChangeWithDependencies(createVariantType); + + var variantEntry = new Entry { Id = Guid.NewGuid(), LexemeForm = { { "en", "test variant" } } }; + var createVariantEntryChange = new CreateEntryChange(variantEntry); + yield return new ChangeWithDependencies(createVariantEntryChange); + + var variant = Variant.FromEntries(variantEntry, entry, sense.Id); + var addVariantChange = new AddVariantChange(variant); + yield return new ChangeWithDependencies(addVariantChange, [createVariantEntryChange, createEntryChange, createSenseChange]); + + var addVariantTypeChange = new AddVariantTypeChange(variant.Id, variantType); + yield return new ChangeWithDependencies(addVariantTypeChange, [createVariantType, addVariantChange]); + + var removeVariantTypeChange = new RemoveVariantTypeChange(variant.Id, variantType.Id); + yield return new ChangeWithDependencies(removeVariantTypeChange, [addVariantTypeChange]); + var setSenseOrderChange = new LcmCrdt.Changes.SetOrderChange(sense.Id, 10); yield return new ChangeWithDependencies(setSenseOrderChange, [createSenseChange]); diff --git a/backend/FwLite/LcmCrdt/Changes/CreateVariantType.cs b/backend/FwLite/LcmCrdt/Changes/CreateVariantType.cs new file mode 100644 index 0000000000..cf39fc9d86 --- /dev/null +++ b/backend/FwLite/LcmCrdt/Changes/CreateVariantType.cs @@ -0,0 +1,21 @@ +using LcmCrdt.Objects; +using MiniLcm.Models; +using SIL.Harmony; +using SIL.Harmony.Changes; +using SIL.Harmony.Core; +using SIL.Harmony.Entities; + +namespace LcmCrdt.Changes; + +public class CreateVariantType(Guid entityId, MultiString name) : CreateChange(entityId), ISelfNamedType +{ + public MultiString Name { get; } = name; + public override ValueTask NewEntity(Commit commit, IChangeContext context) + { + return ValueTask.FromResult(new VariantType + { + Id = EntityId, + Name = Name + }); + } +} diff --git a/backend/FwLite/LcmCrdt/Changes/Entries/AddVariantChange.cs b/backend/FwLite/LcmCrdt/Changes/Entries/AddVariantChange.cs new file mode 100644 index 0000000000..4e232f4e2b --- /dev/null +++ b/backend/FwLite/LcmCrdt/Changes/Entries/AddVariantChange.cs @@ -0,0 +1,115 @@ +using System.Text.Json.Serialization; +using SIL.Harmony; +using SIL.Harmony.Changes; +using SIL.Harmony.Core; +using SIL.Harmony.Entities; + +namespace LcmCrdt.Changes.Entries; + +public class AddVariantChange : CreateChange, ISelfNamedType +{ + public Guid VariantEntryId { get; } + public Guid MainEntryId { get; } + public Guid? MainSenseId { get; } + public List Types { get; } + public bool HideMinorEntry { get; } + public RichMultiString Comment { get; } + + [JsonConstructor] + public AddVariantChange(Guid entityId, + Guid variantEntryId, + Guid mainEntryId, + Guid? mainSenseId = null, + List? types = null, + bool hideMinorEntry = false, + RichMultiString? comment = null) : base(entityId) + { + VariantEntryId = variantEntryId; + MainEntryId = mainEntryId; + MainSenseId = mainSenseId; + Types = types ?? []; + HideMinorEntry = hideMinorEntry; + Comment = comment ?? new(); + } + + public AddVariantChange(Variant variant) : this(variant.MaybeId ?? Guid.NewGuid(), + variant.VariantEntryId, + variant.MainEntryId, + variant.MainSenseId, + [..variant.Types.Select(t => t.Copy())], + variant.HideMinorEntry, + variant.Comment.Copy()) + { + } + + public override async ValueTask NewEntity(Commit commit, IChangeContext context) + { + var variantEntry = await context.GetCurrent(VariantEntryId); + var mainEntry = await context.GetCurrent(MainEntryId); + Sense? mainSense = null; + if (MainSenseId is not null) + mainSense = await context.GetCurrent(MainSenseId.Value); + var shouldBeDeleted = (variantEntry is null or {DeletedAt: not null } || + mainEntry is null or { DeletedAt: not null } || + (MainSenseId.HasValue && mainSense?.DeletedAt is not null)); + var types = new List(Types.Count); + foreach (var type in Types) + { + if (await context.IsObjectDeleted(type.Id)) continue; + types.Add(type); + } + var variant = new Variant + { + Id = EntityId, + VariantEntryId = VariantEntryId, + VariantHeadword = variantEntry?.Headword(), + MainEntryId = MainEntryId, + MainHeadword = mainEntry?.Headword(), + MainSenseId = MainSenseId, + Types = types, + HideMinorEntry = HideMinorEntry, + Comment = Comment.Copy(), + DeletedAt = shouldBeDeleted + ? commit.DateTime + : (DateTime?)null, + }; + if (variant.DeletedAt is null && await CreatesReferenceCycleOrDuplicate(variant, context)) + { + variant.DeletedAt = commit.DateTime; + } + + return variant; + } + + private static async ValueTask CreatesReferenceCycleOrDuplicate(Variant parent, IChangeContext context) + { + if (parent.VariantEntryId == parent.MainEntryId) return true; + //used to avoid checking the same Variant multiple times + HashSet visited = [parent.Id]; + Queue queue = new Queue(); + queue.Enqueue(parent); + while (queue.Count > 0) + { + var current = queue.Dequeue(); + if (current.VariantEntryId == parent.MainEntryId) return true; + await foreach (var o in context.GetObjectsReferencing(current.VariantEntryId)) + { + if (o is not Variant v) continue; + if (v.DeletedAt is not null) continue; + if (visited.Contains(v.Id)) continue; + if (current == parent) + { + var duplicate = v.VariantEntryId == parent.VariantEntryId && + v.MainEntryId == parent.MainEntryId && + v.MainSenseId == parent.MainSenseId; + if (duplicate) return true; + } + + if (v.VariantEntryId == parent.MainEntryId) return true; + queue.Enqueue(v); + visited.Add(v.Id); + } + } + return false; + } +} diff --git a/backend/FwLite/LcmCrdt/Changes/Entries/AddVariantTypeChange.cs b/backend/FwLite/LcmCrdt/Changes/Entries/AddVariantTypeChange.cs new file mode 100644 index 0000000000..d6ea54bacb --- /dev/null +++ b/backend/FwLite/LcmCrdt/Changes/Entries/AddVariantTypeChange.cs @@ -0,0 +1,18 @@ +using SIL.Harmony.Changes; +using SIL.Harmony.Core; +using SIL.Harmony.Entities; + +namespace LcmCrdt.Changes.Entries; + +public class AddVariantTypeChange(Guid entityId, VariantType variantType) + : EditChange(entityId), ISelfNamedType +{ + public VariantType VariantType { get; } = variantType; + + public override async ValueTask ApplyChange(Variant entity, IChangeContext context) + { + if (entity.Types.Any(t => t.Id == VariantType.Id)) return; + if (await context.IsObjectDeleted(VariantType.Id)) return; + entity.Types.Add(VariantType); + } +} diff --git a/backend/FwLite/LcmCrdt/Changes/Entries/RemoveVariantTypeChange.cs b/backend/FwLite/LcmCrdt/Changes/Entries/RemoveVariantTypeChange.cs new file mode 100644 index 0000000000..27e3be012a --- /dev/null +++ b/backend/FwLite/LcmCrdt/Changes/Entries/RemoveVariantTypeChange.cs @@ -0,0 +1,15 @@ +using SIL.Harmony.Changes; +using SIL.Harmony.Core; +using SIL.Harmony.Entities; + +namespace LcmCrdt.Changes.Entries; + +public class RemoveVariantTypeChange(Guid entityId, Guid variantTypeId) : EditChange(entityId), ISelfNamedType +{ + public Guid VariantTypeId { get; } = variantTypeId; + public override ValueTask ApplyChange(Variant entity, IChangeContext context) + { + entity.Types.RemoveAll(t => t.Id == VariantTypeId); + return ValueTask.CompletedTask; + } +} diff --git a/backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs b/backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs index 1aa48ada4a..1a0c27f75b 100644 --- a/backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs +++ b/backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs @@ -404,6 +404,124 @@ public async Task RemoveComplexFormType(Guid entryId, Guid complexFormTypeId) await AddChange(new RemoveComplexFormTypeChange(entryId, complexFormTypeId)); } + public async IAsyncEnumerable GetVariantTypes() + { + await using var repo = await repoFactory.CreateRepoAsync(); + await foreach (var variantType in repo.VariantTypes.AsAsyncEnumerable()) + { + yield return variantType; + } + } + + public async Task GetVariantType(Guid id) + { + await using var repo = await repoFactory.CreateRepoAsync(); + return await repo.VariantTypes.SingleOrDefaultAsync(v => v.Id == id); + } + + public async Task CreateVariantType(VariantType variantType) + { + await using var repo = await repoFactory.CreateRepoAsync(); + if (variantType.Id == default) variantType.Id = Guid.NewGuid(); + await AddChange(new CreateVariantType(variantType.Id, variantType.Name)); + return await repo.VariantTypes.SingleAsync(v => v.Id == variantType.Id); + } + + public async Task SubmitUpdateVariantType(Guid id, UpdateObjectInput update) + { + await AddChange(new JsonPatchChange(id, update.Patch)); + } + + public async Task UpdateVariantType(Guid id, UpdateObjectInput update) + { + await SubmitUpdateVariantType(id, update); + return await GetVariantType(id) ?? throw NotFoundException.ForType(id); + } + + public async Task UpdateVariantType(VariantType before, VariantType after, IMiniLcmApi? api = null) + { + await VariantTypeSync.Sync(before, after, api ?? this); + return await GetVariantType(after.Id) ?? throw NotFoundException.ForType(after.Id); + } + + public async Task DeleteVariantType(Guid id) + { + await AddChange(new DeleteChange(id)); + } + + public async Task SubmitCreateVariant(Variant variant) + { + await using var repo = await repoFactory.CreateRepoAsync(); + var existing = await repo.FindVariant(variant); + if (existing is not null) return; + // Always generate a new entity ID — the caller's ID is never used. + // This aligns with FwData (which ignores the ID entirely) and prevents + // Harmony duplicate-ID pitfalls during sync. + variant.Id = Guid.NewGuid(); + await AddChange(await CreateVariantChange(repo, variant)); + } + + private static async Task CreateVariantChange(MiniLcmRepository repo, Variant variant) + { + var typeIds = variant.Types.Select(t => t.Id).ToArray(); + var resolvedTypes = await repo.VariantTypes.Where(t => typeIds.Contains(t.Id)).ToArrayAsync(); + var missing = typeIds.Except(resolvedTypes.Select(t => t.Id)).ToArray(); + if (missing.Length > 0) + throw new InvalidOperationException($"Variant {variant} references variant types which do not exist: {string.Join(", ", missing)}"); + // use the repo's canonical type objects so embedded copies match CRDT state + return new AddVariantChange(variant with + { + Types = [..typeIds.Select(id => resolvedTypes.Single(t => t.Id == id))] + }); + } + + public async Task CreateVariant(Variant variant) + { + await SubmitCreateVariant(variant); + await using var repo = await repoFactory.CreateRepoAsync(); + return await repo.FindVariant(variant) ?? throw NotFoundException.ForType(variant.VariantEntryId); + } + + public async Task UpdateVariant(Variant before, Variant after, IMiniLcmApi? api = null) + { + await VariantSync.Sync(before, after, api ?? this); + await using var repo = await repoFactory.CreateRepoAsync(); + return await repo.FindVariant(after) ?? throw NotFoundException.ForType(after.VariantEntryId); + } + + public async Task SubmitUpdateVariant(Variant variant, UpdateObjectInput update) + { + await using var repo = await repoFactory.CreateRepoAsync(); + // resolved by composite key; a link deleted on the other side stays deleted (delete wins) + var existing = await repo.FindVariant(variant); + if (existing is null) return; + await AddChange(new JsonPatchChange(existing.Id, update.Patch)); + } + + public async Task DeleteVariant(Variant variant) + { + await using var repo = await repoFactory.CreateRepoAsync(); + var existing = await repo.FindVariant(variant); + if (existing is null) return; + await AddChange(new DeleteChange(existing.Id)); + } + + public async Task AddVariantType(Variant variant, Guid variantTypeId) + { + await using var repo = await repoFactory.CreateRepoAsync(); + var existing = await repo.FindVariant(variant); + if (existing is null) return; + await AddChange(new AddVariantTypeChange(existing.Id, await repo.VariantTypes.SingleAsync(vt => vt.Id == variantTypeId))); + } + + public async Task RemoveVariantType(Variant variant, Guid variantTypeId) + { + await using var repo = await repoFactory.CreateRepoAsync(); + var existing = await repo.FindVariant(variant); + if (existing is null) return; + await AddChange(new RemoveVariantTypeChange(existing.Id, variantTypeId)); + } + public async IAsyncEnumerable GetMorphTypes() { await using var repo = await repoFactory.CreateRepoAsync(); @@ -602,6 +720,12 @@ await ToComplexFormComponents(entry.Components).ToArrayAsync() : ..options.IncludeComplexFormsAndComponents ? await ToComplexFormComponents(entry.ComplexForms).ToArrayAsync() : Enumerable.Empty(), + ..options.IncludeComplexFormsAndComponents ? + await ToVariants(entry.VariantOf).ToArrayAsync() : + Enumerable.Empty(), + ..options.IncludeComplexFormsAndComponents ? + await ToVariants(entry.Variants).ToArrayAsync() : + Enumerable.Empty(), ..await ToComplexFormTypes(entry.ComplexFormTypes).ToArrayAsync() ]); return await repo.GetEntry(entry.Id) ?? throw NotFoundException.ForType(entry.Id); @@ -649,6 +773,21 @@ async IAsyncEnumerable ToComplexFormComponents(IList ToVariants(IList variants) + { + foreach (var variant in variants) + { + if (variant.VariantEntryId == default) variant.VariantEntryId = entry.Id; + if (variant.MainEntryId == default) variant.MainEntryId = entry.Id; + if (variant.VariantEntryId == variant.MainEntryId) + { + throw new InvalidOperationException($"Variant {variant} has the same variant entry id as its main entry"); + } + if (variant.MaybeId is null) variant.Id = Guid.NewGuid(); + yield return await CreateVariantChange(repo, variant); + } + } + async IAsyncEnumerable ToComplexFormTypes(IList complexFormTypes) { foreach (var complexFormType in complexFormTypes) diff --git a/backend/FwLite/LcmCrdt/Data/EntryQueryHelpers.cs b/backend/FwLite/LcmCrdt/Data/EntryQueryHelpers.cs index b2af7868fa..f6d816f351 100644 --- a/backend/FwLite/LcmCrdt/Data/EntryQueryHelpers.cs +++ b/backend/FwLite/LcmCrdt/Data/EntryQueryHelpers.cs @@ -42,6 +42,9 @@ public static string Headword(this Entry e, WritingSystemId ws) public static Entry? QueryComponentEntry(ComplexFormComponent c) => throw new NotSupportedException(); public static Sense? QueryComponentSense(ComplexFormComponent c) => throw new NotSupportedException(); public static Entry? QueryComplexFormEntry(ComplexFormComponent c) => throw new NotSupportedException(); + public static Entry? QueryVariantEntry(Variant v) => throw new NotSupportedException(); + public static Entry? QueryMainEntry(Variant v) => throw new NotSupportedException(); + public static Sense? QueryMainSense(Variant v) => throw new NotSupportedException(); [Sql.Expression(""" (select WsId diff --git a/backend/FwLite/LcmCrdt/Data/MiniLcmRepository.cs b/backend/FwLite/LcmCrdt/Data/MiniLcmRepository.cs index 4ed9fb5a2d..a426ee397e 100644 --- a/backend/FwLite/LcmCrdt/Data/MiniLcmRepository.cs +++ b/backend/FwLite/LcmCrdt/Data/MiniLcmRepository.cs @@ -66,6 +66,8 @@ public void Dispose() public IQueryable Entries => dbContext.Entries.ToLinqToDB(); public IQueryable ComplexFormComponents => dbContext.ComplexFormComponents; public IQueryable ComplexFormTypes => dbContext.ComplexFormTypes; + public IQueryable Variants => dbContext.Variants; + public IQueryable VariantTypes => dbContext.VariantTypes; public IQueryable MorphTypes => dbContext.MorphTypes; public IQueryable Senses => dbContext.Senses; public IQueryable ExampleSentences => dbContext.ExampleSentences; @@ -121,6 +123,15 @@ public async Task FindComplexFormComponent(Guid objectId) throw NotFoundException.ForType(objectId); } + public async Task FindVariant(Variant variant) + { + return await AsyncExtensions.SingleOrDefaultAsync(Variants, + v => + v.VariantEntryId == variant.VariantEntryId + && v.MainEntryId == variant.MainEntryId + && v.MainSenseId == variant.MainSenseId); + } + public async Task CountEntries(string? query = null, FilterQueryOptions? options = null) { options ??= FilterQueryOptions.Default; @@ -141,16 +152,17 @@ public async IAsyncEnumerable GetEntries( .LoadWith(e => e.Senses).ThenLoad(s => s.PartOfSpeech) .LoadWith(e => e.ComplexForms) .LoadWith(e => e.Components) + .LoadWith(e => e.VariantOf) + .LoadWith(e => e.Variants) .AsQueryable(); queryable = options.ApplyPaging(queryable); - var complexFormComparer = cultureProvider.GetCompareInfo(await GetWritingSystem(default, WritingSystemType.Vernacular)) - .AsComplexFormComparer(); + var compareInfo = cultureProvider.GetCompareInfo(await GetWritingSystem(default, WritingSystemType.Vernacular)); var entries = AsyncExtensions.AsAsyncEnumerable(queryable); await EnsureConnectionOpen();//sometimes there can be a race condition where the collations arent setup await foreach (var entry in EfExtensions.SafeIterate(entries)) { - entry.Finalize(complexFormComparer); + entry.Finalize(compareInfo); yield return entry; } } @@ -248,13 +260,13 @@ private ValueTask> ApplySorting(IQueryable queryable, Q .LoadWith(e => e.Senses).ThenLoad(s => s.PartOfSpeech) .LoadWith(e => e.ComplexForms) .LoadWith(e => e.Components) + .LoadWith(e => e.VariantOf) + .LoadWith(e => e.Variants) .AsQueryable(), e => e.Id == id); if (entry is not null) { var sortWs = await GetWritingSystem(WritingSystemId.Default, WritingSystemType.Vernacular); - var complexFormComparer = cultureProvider.GetCompareInfo(sortWs) - .AsComplexFormComparer(); - entry.Finalize(complexFormComparer); + entry.Finalize(cultureProvider.GetCompareInfo(sortWs)); } return entry; diff --git a/backend/FwLite/LcmCrdt/LcmCrdtDbContext.cs b/backend/FwLite/LcmCrdt/LcmCrdtDbContext.cs index af8cd93174..e65d39cee9 100644 --- a/backend/FwLite/LcmCrdt/LcmCrdtDbContext.cs +++ b/backend/FwLite/LcmCrdt/LcmCrdtDbContext.cs @@ -21,6 +21,8 @@ IOptions options public IQueryable Entries => Set().AsNoTracking(); public IQueryable ComplexFormComponents => Set().AsNoTracking(); public IQueryable ComplexFormTypes => Set().AsNoTracking(); + public IQueryable Variants => Set().AsNoTracking(); + public IQueryable VariantTypes => Set().AsNoTracking(); public IQueryable MorphTypes => Set().AsNoTracking(); public IQueryable Senses => Set().AsNoTracking(); public IQueryable ExampleSentences => Set().AsNoTracking(); diff --git a/backend/FwLite/LcmCrdt/LcmCrdtKernel.cs b/backend/FwLite/LcmCrdt/LcmCrdtKernel.cs index d6282371ed..569b52bbc6 100644 --- a/backend/FwLite/LcmCrdt/LcmCrdtKernel.cs +++ b/backend/FwLite/LcmCrdt/LcmCrdtKernel.cs @@ -144,6 +144,11 @@ public static void ConfigureDbOptions(IServiceProvider provider, DbContextOption .Entity().Association(c => EntryQueryHelpers.QueryComplexFormEntry(c), c => c.ComplexFormEntryId, e => e!.Id) .Entity().Property(c => c.ComponentHeadword).IsExpression(c => EntryQueryHelpers.QueryComponentEntry(c)!.QueryHeadwordWithTokens(EntryQueryHelpers.DefaultWritingSystem(WritingSystemType.Vernacular)), isColumn: true, alias: "componentHeadword") .Entity().Property(c => c.ComplexFormHeadword).IsExpression(c => EntryQueryHelpers.QueryComplexFormEntry(c)!.QueryHeadwordWithTokens(EntryQueryHelpers.DefaultWritingSystem(WritingSystemType.Vernacular)), isColumn: true, alias: "complexFormHeadword") + .Entity().Association(v => EntryQueryHelpers.QueryVariantEntry(v), v => v.VariantEntryId, e => e!.Id) + .Entity().Association(v => EntryQueryHelpers.QueryMainEntry(v), v => v.MainEntryId, e => e!.Id) + .Entity().Association(v => EntryQueryHelpers.QueryMainSense(v), v => v.MainSenseId, s => s!.Id) + .Entity().Property(v => v.VariantHeadword).IsExpression(v => EntryQueryHelpers.QueryVariantEntry(v)!.QueryHeadwordWithTokens(EntryQueryHelpers.DefaultWritingSystem(WritingSystemType.Vernacular)), isColumn: true, alias: "variantHeadword") + .Entity().Property(v => v.MainHeadword).IsExpression(v => EntryQueryHelpers.QueryMainEntry(v)!.QueryHeadwordWithTokens(EntryQueryHelpers.DefaultWritingSystem(WritingSystemType.Vernacular)), isColumn: true, alias: "mainHeadword") .Entity().Member(r => r.GetPlainText()).IsExpression(r => Json.GetPlainText(r)) .Entity().Member(g => g.ToString()).IsExpression(g => Json.ToString(g)) .Build(); @@ -199,6 +204,16 @@ public static void ConfigureCrdt(CrdtConfig config) .HasPrincipalKey(entry => entry.Id) .HasForeignKey(c => c.ComponentEntryId) .OnDelete(DeleteBehavior.Cascade); + builder.HasMany(e => e.VariantOf) + .WithOne() + .HasPrincipalKey(entry => entry.Id) + .HasForeignKey(v => v.VariantEntryId) + .OnDelete(DeleteBehavior.Cascade); + builder.HasMany(e => e.Variants) + .WithOne() + .HasPrincipalKey(entry => entry.Id) + .HasForeignKey(v => v.MainEntryId) + .OnDelete(DeleteBehavior.Cascade); builder .Property(e => e.ComplexFormTypes) .HasColumnType("jsonb") @@ -218,6 +233,10 @@ public static void ConfigureCrdt(CrdtConfig config) .WithOne() .HasForeignKey(c => c.ComponentSenseId) .OnDelete(DeleteBehavior.Cascade); + builder.HasMany() + .WithOne() + .HasForeignKey(v => v.MainSenseId) + .OnDelete(DeleteBehavior.Cascade); builder.HasOne() .WithMany(e => e.Senses) .HasForeignKey(sense => sense.EntryId); @@ -306,6 +325,32 @@ public static void ConfigureCrdt(CrdtConfig config) component.ComplexFormEntryId, component.ComponentEntryId }).IsUnique().HasFilter($"{componentSenseId} IS NULL"); + }) + .Add() + .Add(builder => + { + const string mainSenseId = "MainSenseId"; + builder.ToTable("Variants"); + builder.Property(v => v.MainSenseId).HasColumnName(mainSenseId); + builder + .Property(v => v.Types) + .HasColumnType("jsonb") + .HasConversion(list => JsonSerializer.Serialize(list, (JsonSerializerOptions?)null), + json => JsonSerializer.Deserialize>(json, + (JsonSerializerOptions?)null) ?? new()); + //these indexes are used to ensure that we don't create duplicate variant links + //we need the filter otherwise 2 links which are the same and have a null sense id can be created because 2 rows with the same null are not considered duplicates + builder.HasIndex(variant => new + { + variant.VariantEntryId, + variant.MainEntryId, + variant.MainSenseId + }).IsUnique().HasFilter($"{mainSenseId} IS NOT NULL"); + builder.HasIndex(variant => new + { + variant.VariantEntryId, + variant.MainEntryId + }).IsUnique().HasFilter($"{mainSenseId} IS NULL"); }); config.AddRemoteResourceEntity(); @@ -316,6 +361,8 @@ public static void ConfigureCrdt(CrdtConfig config) .Add>() .Add>() .Add>() + .Add>() + .Add>() .Add>() .Add>() .Add>() @@ -325,6 +372,8 @@ public static void ConfigureCrdt(CrdtConfig config) .Add>() .Add>() .Add>() + .Add>() + .Add>() .Add>() .Add() .Add() @@ -361,6 +410,10 @@ public static void ConfigureCrdt(CrdtConfig config) .Add() .Add() .Add() + .Add() + .Add() + .Add() + .Add() .Add() .Add() .Add>() diff --git a/backend/FwLite/LcmCrdt/Migrations/20260703134525_AddVariants.Designer.cs b/backend/FwLite/LcmCrdt/Migrations/20260703134525_AddVariants.Designer.cs new file mode 100644 index 0000000000..81306c0d27 --- /dev/null +++ b/backend/FwLite/LcmCrdt/Migrations/20260703134525_AddVariants.Designer.cs @@ -0,0 +1,972 @@ +// +using System; +using System.Collections.Generic; +using LcmCrdt; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace LcmCrdt.Migrations +{ + [DbContext(typeof(LcmCrdtDbContext))] + [Migration("20260703134525_AddVariants")] + partial class AddVariants + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "10.0.8"); + + modelBuilder.Entity("LcmCrdt.FullTextSearch.EntrySearchRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CitationForm") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Definition") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Gloss") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Headword") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("LexemeForm") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("EntrySearchRecord", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("LcmCrdt.ProjectData", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("ClientId") + .HasColumnType("TEXT"); + + b.Property("Code") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("FwProjectId") + .HasColumnType("TEXT"); + + b.Property("LastUserId") + .HasColumnType("TEXT"); + + b.Property("LastUserName") + .HasColumnType("TEXT"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("OriginDomain") + .HasColumnType("TEXT"); + + b.Property("Role") + .IsRequired() + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValue("Editor"); + + b.HasKey("Id"); + + b.ToTable("ProjectData"); + }); + + modelBuilder.Entity("MiniLcm.Models.ComplexFormComponent", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("ComplexFormEntryId") + .HasColumnType("TEXT"); + + b.Property("ComplexFormHeadword") + .HasColumnType("TEXT"); + + b.Property("ComponentEntryId") + .HasColumnType("TEXT"); + + b.Property("ComponentHeadword") + .HasColumnType("TEXT"); + + b.Property("ComponentSenseId") + .HasColumnType("TEXT") + .HasColumnName("ComponentSenseId"); + + b.Property("DeletedAt") + .HasColumnType("TEXT"); + + b.Property("Order") + .HasColumnType("REAL"); + + b.Property("SnapshotId") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("ComponentEntryId"); + + b.HasIndex("ComponentSenseId"); + + b.HasIndex("SnapshotId") + .IsUnique(); + + b.HasIndex("ComplexFormEntryId", "ComponentEntryId") + .IsUnique() + .HasFilter("ComponentSenseId IS NULL"); + + b.HasIndex("ComplexFormEntryId", "ComponentEntryId", "ComponentSenseId") + .IsUnique() + .HasFilter("ComponentSenseId IS NOT NULL"); + + b.ToTable("ComplexFormComponents", (string)null); + }); + + modelBuilder.Entity("MiniLcm.Models.ComplexFormType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("DeletedAt") + .HasColumnType("TEXT"); + + b.Property("Name") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("SnapshotId") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("SnapshotId") + .IsUnique(); + + b.ToTable("ComplexFormType"); + }); + + modelBuilder.Entity("MiniLcm.Models.CustomView", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Analysis") + .HasColumnType("jsonb"); + + b.Property("Base") + .HasColumnType("INTEGER"); + + b.Property("DeletedAt") + .HasColumnType("TEXT"); + + b.Property("EntryFields") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("ExampleFields") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("SenseFields") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("SnapshotId") + .HasColumnType("TEXT"); + + b.Property("Vernacular") + .HasColumnType("jsonb"); + + b.HasKey("Id"); + + b.HasIndex("SnapshotId") + .IsUnique(); + + b.ToTable("CustomView"); + }); + + modelBuilder.Entity("MiniLcm.Models.Entry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CitationForm") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("ComplexFormTypes") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("DeletedAt") + .HasColumnType("TEXT"); + + b.Property("HomographNumber") + .HasColumnType("INTEGER"); + + b.Property("LexemeForm") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("LiteralMeaning") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("MorphType") + .HasColumnType("INTEGER"); + + b.Property("Note") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("PublishIn") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("SnapshotId") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("SnapshotId") + .IsUnique(); + + b.ToTable("Entry"); + }); + + modelBuilder.Entity("MiniLcm.Models.ExampleSentence", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("DeletedAt") + .HasColumnType("TEXT"); + + b.Property("Order") + .HasColumnType("REAL"); + + b.Property("Reference") + .HasColumnType("jsonb"); + + b.Property("SenseId") + .HasColumnType("TEXT"); + + b.Property("Sentence") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("SnapshotId") + .HasColumnType("TEXT"); + + b.Property("Translations") + .IsRequired() + .HasColumnType("jsonb"); + + b.HasKey("Id"); + + b.HasIndex("SenseId"); + + b.HasIndex("SnapshotId") + .IsUnique(); + + b.ToTable("ExampleSentence"); + }); + + modelBuilder.Entity("MiniLcm.Models.MorphType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Abbreviation") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("DeletedAt") + .HasColumnType("TEXT"); + + b.Property("Description") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("Kind") + .HasColumnType("INTEGER"); + + b.Property("Name") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("Postfix") + .HasColumnType("TEXT"); + + b.Property("Prefix") + .HasColumnType("TEXT"); + + b.Property("SecondaryOrder") + .HasColumnType("INTEGER"); + + b.Property("SnapshotId") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("Kind") + .IsUnique(); + + b.HasIndex("SnapshotId") + .IsUnique(); + + b.ToTable("MorphType"); + }); + + modelBuilder.Entity("MiniLcm.Models.PartOfSpeech", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("DeletedAt") + .HasColumnType("TEXT"); + + b.Property("Name") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("Predefined") + .HasColumnType("INTEGER"); + + b.Property("SnapshotId") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("SnapshotId") + .IsUnique(); + + b.ToTable("PartOfSpeech"); + }); + + modelBuilder.Entity("MiniLcm.Models.Publication", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("DeletedAt") + .HasColumnType("TEXT"); + + b.Property("IsMain") + .HasColumnType("INTEGER"); + + b.Property("Name") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("SnapshotId") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("SnapshotId") + .IsUnique(); + + b.ToTable("Publication"); + }); + + modelBuilder.Entity("MiniLcm.Models.SemanticDomain", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Code") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DeletedAt") + .HasColumnType("TEXT"); + + b.Property("Name") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("Predefined") + .HasColumnType("INTEGER"); + + b.Property("SnapshotId") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("SnapshotId") + .IsUnique(); + + b.ToTable("SemanticDomain"); + }); + + modelBuilder.Entity("MiniLcm.Models.Sense", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Definition") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("DeletedAt") + .HasColumnType("TEXT"); + + b.Property("EntryId") + .HasColumnType("TEXT"); + + b.Property("Gloss") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("Order") + .HasColumnType("REAL"); + + b.Property("PartOfSpeechId") + .HasColumnType("TEXT"); + + b.Property("Pictures") + .IsRequired() + .ValueGeneratedOnAdd() + .HasColumnType("jsonb") + .HasDefaultValueSql("'[]'"); + + b.Property("SemanticDomains") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("SnapshotId") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("EntryId"); + + b.HasIndex("PartOfSpeechId"); + + b.HasIndex("SnapshotId") + .IsUnique(); + + b.ToTable("Sense"); + }); + + modelBuilder.Entity("MiniLcm.Models.Variant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("DeletedAt") + .HasColumnType("TEXT"); + + b.Property("HideMinorEntry") + .HasColumnType("INTEGER"); + + b.Property("MainEntryId") + .HasColumnType("TEXT"); + + b.Property("MainHeadword") + .HasColumnType("TEXT"); + + b.Property("MainSenseId") + .HasColumnType("TEXT") + .HasColumnName("MainSenseId"); + + b.Property("SnapshotId") + .HasColumnType("TEXT"); + + b.Property("Types") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("VariantEntryId") + .HasColumnType("TEXT"); + + b.Property("VariantHeadword") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("MainEntryId"); + + b.HasIndex("MainSenseId"); + + b.HasIndex("SnapshotId") + .IsUnique(); + + b.HasIndex("VariantEntryId", "MainEntryId") + .IsUnique() + .HasFilter("MainSenseId IS NULL"); + + b.HasIndex("VariantEntryId", "MainEntryId", "MainSenseId") + .IsUnique() + .HasFilter("MainSenseId IS NOT NULL"); + + b.ToTable("Variants", (string)null); + }); + + modelBuilder.Entity("MiniLcm.Models.VariantType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("DeletedAt") + .HasColumnType("TEXT"); + + b.Property("Name") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("SnapshotId") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("SnapshotId") + .IsUnique(); + + b.ToTable("VariantType"); + }); + + modelBuilder.Entity("MiniLcm.Models.WritingSystem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Abbreviation") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DeletedAt") + .HasColumnType("TEXT"); + + b.Property("Exemplars") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("Font") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Order") + .HasColumnType("REAL"); + + b.Property("SnapshotId") + .HasColumnType("TEXT"); + + b.Property("Type") + .HasColumnType("INTEGER"); + + b.Property("WsId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("SnapshotId") + .IsUnique(); + + b.HasIndex("WsId", "Type") + .IsUnique(); + + b.ToTable("WritingSystem"); + }); + + modelBuilder.Entity("SIL.Harmony.Commit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("ClientId") + .HasColumnType("TEXT"); + + b.Property("Hash") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Metadata") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("ParentHash") + .IsRequired() + .HasColumnType("TEXT"); + + b.ComplexProperty(typeof(Dictionary), "HybridDateTime", "SIL.Harmony.Commit.HybridDateTime#HybridDateTime", b1 => + { + b1.IsRequired(); + + b1.Property("Counter") + .HasColumnType("INTEGER") + .HasColumnName("Counter"); + + b1.Property("DateTime") + .HasColumnType("TEXT") + .HasColumnName("DateTime"); + }); + + b.HasKey("Id"); + + b.ToTable("Commits", (string)null); + + b.HasAnnotation("CustomIndex:CompositeIndexes", "[{\"paths\":[\"HybridDateTime.DateTime\",\"HybridDateTime.Counter\",\"Id\"],\"unique\":false,\"name\":\"IX_Commits_DateTime_Counter_Id\"}]"); + }); + + modelBuilder.Entity("SIL.Harmony.Core.ChangeEntity", b => + { + b.Property("CommitId") + .HasColumnType("TEXT"); + + b.Property("Index") + .HasColumnType("INTEGER"); + + b.Property("Change") + .HasColumnType("jsonb"); + + b.Property("EntityId") + .HasColumnType("TEXT"); + + b.HasKey("CommitId", "Index"); + + b.ToTable("ChangeEntities", (string)null); + }); + + modelBuilder.Entity("SIL.Harmony.Db.ObjectSnapshot", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CommitId") + .HasColumnType("TEXT"); + + b.Property("Entity") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("EntityId") + .HasColumnType("TEXT"); + + b.Property("EntityIsDeleted") + .HasColumnType("INTEGER"); + + b.Property("IsRoot") + .HasColumnType("INTEGER"); + + b.PrimitiveCollection("References") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TypeName") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("EntityId"); + + b.HasIndex("CommitId", "EntityId") + .IsUnique(); + + b.ToTable("Snapshots", (string)null); + }); + + modelBuilder.Entity("SIL.Harmony.Resource.LocalResource", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("LocalPath") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("LocalResource"); + }); + + modelBuilder.Entity("SIL.Harmony.Resource.RemoteResource", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("DeletedAt") + .HasColumnType("TEXT"); + + b.Property("RemoteId") + .HasColumnType("TEXT"); + + b.Property("SnapshotId") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("SnapshotId") + .IsUnique(); + + b.ToTable("RemoteResource"); + }); + + modelBuilder.Entity("MiniLcm.Models.ComplexFormComponent", b => + { + b.HasOne("MiniLcm.Models.Entry", null) + .WithMany("Components") + .HasForeignKey("ComplexFormEntryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("MiniLcm.Models.Entry", null) + .WithMany("ComplexForms") + .HasForeignKey("ComponentEntryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("MiniLcm.Models.Sense", null) + .WithMany() + .HasForeignKey("ComponentSenseId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("SIL.Harmony.Db.ObjectSnapshot", null) + .WithOne() + .HasForeignKey("MiniLcm.Models.ComplexFormComponent", "SnapshotId") + .OnDelete(DeleteBehavior.SetNull); + }); + + modelBuilder.Entity("MiniLcm.Models.ComplexFormType", b => + { + b.HasOne("SIL.Harmony.Db.ObjectSnapshot", null) + .WithOne() + .HasForeignKey("MiniLcm.Models.ComplexFormType", "SnapshotId") + .OnDelete(DeleteBehavior.SetNull); + }); + + modelBuilder.Entity("MiniLcm.Models.CustomView", b => + { + b.HasOne("SIL.Harmony.Db.ObjectSnapshot", null) + .WithOne() + .HasForeignKey("MiniLcm.Models.CustomView", "SnapshotId") + .OnDelete(DeleteBehavior.SetNull); + }); + + modelBuilder.Entity("MiniLcm.Models.Entry", b => + { + b.HasOne("SIL.Harmony.Db.ObjectSnapshot", null) + .WithOne() + .HasForeignKey("MiniLcm.Models.Entry", "SnapshotId") + .OnDelete(DeleteBehavior.SetNull); + }); + + modelBuilder.Entity("MiniLcm.Models.ExampleSentence", b => + { + b.HasOne("MiniLcm.Models.Sense", null) + .WithMany("ExampleSentences") + .HasForeignKey("SenseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("SIL.Harmony.Db.ObjectSnapshot", null) + .WithOne() + .HasForeignKey("MiniLcm.Models.ExampleSentence", "SnapshotId") + .OnDelete(DeleteBehavior.SetNull); + }); + + modelBuilder.Entity("MiniLcm.Models.MorphType", b => + { + b.HasOne("SIL.Harmony.Db.ObjectSnapshot", null) + .WithOne() + .HasForeignKey("MiniLcm.Models.MorphType", "SnapshotId") + .OnDelete(DeleteBehavior.SetNull); + }); + + modelBuilder.Entity("MiniLcm.Models.PartOfSpeech", b => + { + b.HasOne("SIL.Harmony.Db.ObjectSnapshot", null) + .WithOne() + .HasForeignKey("MiniLcm.Models.PartOfSpeech", "SnapshotId") + .OnDelete(DeleteBehavior.SetNull); + }); + + modelBuilder.Entity("MiniLcm.Models.Publication", b => + { + b.HasOne("SIL.Harmony.Db.ObjectSnapshot", null) + .WithOne() + .HasForeignKey("MiniLcm.Models.Publication", "SnapshotId") + .OnDelete(DeleteBehavior.SetNull); + }); + + modelBuilder.Entity("MiniLcm.Models.SemanticDomain", b => + { + b.HasOne("SIL.Harmony.Db.ObjectSnapshot", null) + .WithOne() + .HasForeignKey("MiniLcm.Models.SemanticDomain", "SnapshotId") + .OnDelete(DeleteBehavior.SetNull); + }); + + modelBuilder.Entity("MiniLcm.Models.Sense", b => + { + b.HasOne("MiniLcm.Models.Entry", null) + .WithMany("Senses") + .HasForeignKey("EntryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("MiniLcm.Models.PartOfSpeech", "PartOfSpeech") + .WithMany() + .HasForeignKey("PartOfSpeechId") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("SIL.Harmony.Db.ObjectSnapshot", null) + .WithOne() + .HasForeignKey("MiniLcm.Models.Sense", "SnapshotId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("PartOfSpeech"); + }); + + modelBuilder.Entity("MiniLcm.Models.Variant", b => + { + b.HasOne("MiniLcm.Models.Entry", null) + .WithMany("Variants") + .HasForeignKey("MainEntryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("MiniLcm.Models.Sense", null) + .WithMany() + .HasForeignKey("MainSenseId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("SIL.Harmony.Db.ObjectSnapshot", null) + .WithOne() + .HasForeignKey("MiniLcm.Models.Variant", "SnapshotId") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("MiniLcm.Models.Entry", null) + .WithMany("VariantOf") + .HasForeignKey("VariantEntryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MiniLcm.Models.VariantType", b => + { + b.HasOne("SIL.Harmony.Db.ObjectSnapshot", null) + .WithOne() + .HasForeignKey("MiniLcm.Models.VariantType", "SnapshotId") + .OnDelete(DeleteBehavior.SetNull); + }); + + modelBuilder.Entity("MiniLcm.Models.WritingSystem", b => + { + b.HasOne("SIL.Harmony.Db.ObjectSnapshot", null) + .WithOne() + .HasForeignKey("MiniLcm.Models.WritingSystem", "SnapshotId") + .OnDelete(DeleteBehavior.SetNull); + }); + + modelBuilder.Entity("SIL.Harmony.Core.ChangeEntity", b => + { + b.HasOne("SIL.Harmony.Commit", null) + .WithMany("ChangeEntities") + .HasForeignKey("CommitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("SIL.Harmony.Db.ObjectSnapshot", b => + { + b.HasOne("SIL.Harmony.Commit", "Commit") + .WithMany("Snapshots") + .HasForeignKey("CommitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Commit"); + }); + + modelBuilder.Entity("SIL.Harmony.Resource.RemoteResource", b => + { + b.HasOne("SIL.Harmony.Db.ObjectSnapshot", null) + .WithOne() + .HasForeignKey("SIL.Harmony.Resource.RemoteResource", "SnapshotId") + .OnDelete(DeleteBehavior.SetNull); + }); + + modelBuilder.Entity("MiniLcm.Models.Entry", b => + { + b.Navigation("ComplexForms"); + + b.Navigation("Components"); + + b.Navigation("Senses"); + + b.Navigation("VariantOf"); + + b.Navigation("Variants"); + }); + + modelBuilder.Entity("MiniLcm.Models.Sense", b => + { + b.Navigation("ExampleSentences"); + }); + + modelBuilder.Entity("SIL.Harmony.Commit", b => + { + b.Navigation("ChangeEntities"); + + b.Navigation("Snapshots"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/backend/FwLite/LcmCrdt/Migrations/20260703134525_AddVariants.cs b/backend/FwLite/LcmCrdt/Migrations/20260703134525_AddVariants.cs new file mode 100644 index 0000000000..2e0dc6ac85 --- /dev/null +++ b/backend/FwLite/LcmCrdt/Migrations/20260703134525_AddVariants.cs @@ -0,0 +1,126 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace LcmCrdt.Migrations +{ + /// + public partial class AddVariants : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Variants", + columns: table => new + { + Id = table.Column(type: "TEXT", nullable: false), + DeletedAt = table.Column(type: "TEXT", nullable: true), + VariantEntryId = table.Column(type: "TEXT", nullable: false), + VariantHeadword = table.Column(type: "TEXT", nullable: true), + MainEntryId = table.Column(type: "TEXT", nullable: false), + MainSenseId = table.Column(type: "TEXT", nullable: true), + MainHeadword = table.Column(type: "TEXT", nullable: true), + Types = table.Column(type: "jsonb", nullable: false), + HideMinorEntry = table.Column(type: "INTEGER", nullable: false), + Comment = table.Column(type: "jsonb", nullable: false), + SnapshotId = table.Column(type: "TEXT", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Variants", x => x.Id); + table.ForeignKey( + name: "FK_Variants_Entry_MainEntryId", + column: x => x.MainEntryId, + principalTable: "Entry", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_Variants_Entry_VariantEntryId", + column: x => x.VariantEntryId, + principalTable: "Entry", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_Variants_Sense_MainSenseId", + column: x => x.MainSenseId, + principalTable: "Sense", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_Variants_Snapshots_SnapshotId", + column: x => x.SnapshotId, + principalTable: "Snapshots", + principalColumn: "Id", + onDelete: ReferentialAction.SetNull); + }); + + migrationBuilder.CreateTable( + name: "VariantType", + columns: table => new + { + Id = table.Column(type: "TEXT", nullable: false), + Name = table.Column(type: "jsonb", nullable: false), + DeletedAt = table.Column(type: "TEXT", nullable: true), + SnapshotId = table.Column(type: "TEXT", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_VariantType", x => x.Id); + table.ForeignKey( + name: "FK_VariantType_Snapshots_SnapshotId", + column: x => x.SnapshotId, + principalTable: "Snapshots", + principalColumn: "Id", + onDelete: ReferentialAction.SetNull); + }); + + migrationBuilder.CreateIndex( + name: "IX_Variants_MainEntryId", + table: "Variants", + column: "MainEntryId"); + + migrationBuilder.CreateIndex( + name: "IX_Variants_MainSenseId", + table: "Variants", + column: "MainSenseId"); + + migrationBuilder.CreateIndex( + name: "IX_Variants_SnapshotId", + table: "Variants", + column: "SnapshotId", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_Variants_VariantEntryId_MainEntryId", + table: "Variants", + columns: new[] { "VariantEntryId", "MainEntryId" }, + unique: true, + filter: "MainSenseId IS NULL"); + + migrationBuilder.CreateIndex( + name: "IX_Variants_VariantEntryId_MainEntryId_MainSenseId", + table: "Variants", + columns: new[] { "VariantEntryId", "MainEntryId", "MainSenseId" }, + unique: true, + filter: "MainSenseId IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_VariantType_SnapshotId", + table: "VariantType", + column: "SnapshotId", + unique: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Variants"); + + migrationBuilder.DropTable( + name: "VariantType"); + } + } +} diff --git a/backend/FwLite/LcmCrdt/Migrations/LcmCrdtDbContextModelSnapshot.cs b/backend/FwLite/LcmCrdt/Migrations/LcmCrdtDbContextModelSnapshot.cs index 650a5b9420..5818a033ab 100644 --- a/backend/FwLite/LcmCrdt/Migrations/LcmCrdtDbContextModelSnapshot.cs +++ b/backend/FwLite/LcmCrdt/Migrations/LcmCrdtDbContextModelSnapshot.cs @@ -484,6 +484,89 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("Sense"); }); + modelBuilder.Entity("MiniLcm.Models.Variant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("DeletedAt") + .HasColumnType("TEXT"); + + b.Property("HideMinorEntry") + .HasColumnType("INTEGER"); + + b.Property("MainEntryId") + .HasColumnType("TEXT"); + + b.Property("MainHeadword") + .HasColumnType("TEXT"); + + b.Property("MainSenseId") + .HasColumnType("TEXT") + .HasColumnName("MainSenseId"); + + b.Property("SnapshotId") + .HasColumnType("TEXT"); + + b.Property("Types") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("VariantEntryId") + .HasColumnType("TEXT"); + + b.Property("VariantHeadword") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("MainEntryId"); + + b.HasIndex("MainSenseId"); + + b.HasIndex("SnapshotId") + .IsUnique(); + + b.HasIndex("VariantEntryId", "MainEntryId") + .IsUnique() + .HasFilter("MainSenseId IS NULL"); + + b.HasIndex("VariantEntryId", "MainEntryId", "MainSenseId") + .IsUnique() + .HasFilter("MainSenseId IS NOT NULL"); + + b.ToTable("Variants", (string)null); + }); + + modelBuilder.Entity("MiniLcm.Models.VariantType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("DeletedAt") + .HasColumnType("TEXT"); + + b.Property("Name") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("SnapshotId") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("SnapshotId") + .IsUnique(); + + b.ToTable("VariantType"); + }); + modelBuilder.Entity("MiniLcm.Models.WritingSystem", b => { b.Property("Id") @@ -787,6 +870,39 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Navigation("PartOfSpeech"); }); + modelBuilder.Entity("MiniLcm.Models.Variant", b => + { + b.HasOne("MiniLcm.Models.Entry", null) + .WithMany("Variants") + .HasForeignKey("MainEntryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("MiniLcm.Models.Sense", null) + .WithMany() + .HasForeignKey("MainSenseId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("SIL.Harmony.Db.ObjectSnapshot", null) + .WithOne() + .HasForeignKey("MiniLcm.Models.Variant", "SnapshotId") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("MiniLcm.Models.Entry", null) + .WithMany("VariantOf") + .HasForeignKey("VariantEntryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MiniLcm.Models.VariantType", b => + { + b.HasOne("SIL.Harmony.Db.ObjectSnapshot", null) + .WithOne() + .HasForeignKey("MiniLcm.Models.VariantType", "SnapshotId") + .OnDelete(DeleteBehavior.SetNull); + }); + modelBuilder.Entity("MiniLcm.Models.WritingSystem", b => { b.HasOne("SIL.Harmony.Db.ObjectSnapshot", null) @@ -830,6 +946,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Navigation("Components"); b.Navigation("Senses"); + + b.Navigation("VariantOf"); + + b.Navigation("Variants"); }); modelBuilder.Entity("MiniLcm.Models.Sense", b => diff --git a/backend/FwLite/LcmCrdt/QueryHelpers.cs b/backend/FwLite/LcmCrdt/QueryHelpers.cs index 37e151c271..a20e94a758 100644 --- a/backend/FwLite/LcmCrdt/QueryHelpers.cs +++ b/backend/FwLite/LcmCrdt/QueryHelpers.cs @@ -4,12 +4,13 @@ namespace LcmCrdt; public static class QueryHelpers { - public static void Finalize(this Entry entry, - IComparer complexFormComparer) + public static void Finalize(this Entry entry, CompareInfo compareInfo) { entry.Senses.ApplySortOrder(); entry.Components.ApplySortOrder(); - entry.ComplexForms.Sort(complexFormComparer); + entry.ComplexForms.Sort(compareInfo.AsComplexFormComparer()); + entry.VariantOf.Sort(compareInfo.AsVariantOfComparer()); + entry.Variants.Sort(compareInfo.AsVariantsComparer()); foreach (var sense in entry.Senses) { sense.Finalize(); @@ -55,4 +56,24 @@ public static IComparer AsComplexFormComparer(this Compare return a.ComplexFormEntryId.CompareTo(b.ComplexFormEntryId); }); } + + public static IComparer AsVariantOfComparer(this CompareInfo compareInfo) + { + return Comparer.Create((a, b) => + { + var result = compareInfo.Compare(a.MainHeadword, b.MainHeadword, CompareOptions.IgnoreCase); + if (result != 0) return result; + return a.MainEntryId.CompareTo(b.MainEntryId); + }); + } + + public static IComparer AsVariantsComparer(this CompareInfo compareInfo) + { + return Comparer.Create((a, b) => + { + var result = compareInfo.Compare(a.VariantHeadword, b.VariantHeadword, CompareOptions.IgnoreCase); + if (result != 0) return result; + return a.VariantEntryId.CompareTo(b.VariantEntryId); + }); + } } diff --git a/backend/FwLite/MiniLcm/CreateEntryOptions.cs b/backend/FwLite/MiniLcm/CreateEntryOptions.cs index 4816296074..5a2a81e446 100644 --- a/backend/FwLite/MiniLcm/CreateEntryOptions.cs +++ b/backend/FwLite/MiniLcm/CreateEntryOptions.cs @@ -2,7 +2,8 @@ namespace MiniLcm; public record CreateEntryOptions( /// - /// Can be excluded for the purpose of deferring referencing entities that might not exist yet. + /// Also gates variant links. Can be excluded for the purpose of deferring + /// referencing entities that might not exist yet. /// bool IncludeComplexFormsAndComponents = true, bool AutoAddMainPublication = false diff --git a/backend/FwLite/MiniLcm/IMiniLcmReadApi.cs b/backend/FwLite/MiniLcm/IMiniLcmReadApi.cs index 36523faf83..aadff068c1 100644 --- a/backend/FwLite/MiniLcm/IMiniLcmReadApi.cs +++ b/backend/FwLite/MiniLcm/IMiniLcmReadApi.cs @@ -15,8 +15,10 @@ public interface IMiniLcmReadApi IAsyncEnumerable GetPublications(); IAsyncEnumerable GetSemanticDomains(); IAsyncEnumerable GetComplexFormTypes(); + IAsyncEnumerable GetVariantTypes(); IAsyncEnumerable GetMorphTypes(); Task GetComplexFormType(Guid id); + Task GetVariantType(Guid id); Task GetMorphType(Guid id); Task GetMorphType(MorphTypeKind kind); Task CountEntries(string? query = null, FilterQueryOptions? options = null); diff --git a/backend/FwLite/MiniLcm/IMiniLcmWriteApi.cs b/backend/FwLite/MiniLcm/IMiniLcmWriteApi.cs index 310095dd30..8cecfdcca5 100644 --- a/backend/FwLite/MiniLcm/IMiniLcmWriteApi.cs +++ b/backend/FwLite/MiniLcm/IMiniLcmWriteApi.cs @@ -44,6 +44,13 @@ Task UpdateWritingSystem(WritingSystemId id, Task DeleteComplexFormType(Guid id); #endregion + #region VariantType + Task CreateVariantType(VariantType variantType); + Task UpdateVariantType(Guid id, UpdateObjectInput update); + Task UpdateVariantType(VariantType before, VariantType after, IMiniLcmApi? api = null); + Task DeleteVariantType(Guid id); + #endregion + #region MorphType Task CreateMorphType(MorphType morphType); Task UpdateMorphType(Guid id, UpdateObjectInput update); @@ -65,6 +72,13 @@ Task UpdateWritingSystem(WritingSystemId id, Task DeleteComplexFormComponent(ComplexFormComponent complexFormComponent); Task AddComplexFormType(Guid entryId, Guid complexFormTypeId); Task RemoveComplexFormType(Guid entryId, Guid complexFormTypeId); + // Variant links are unordered (no position/move) and resolved by their composite key + // (VariantEntryId, MainEntryId, MainSenseId) — see VARIANTS.md + Task CreateVariant(Variant variant); + Task UpdateVariant(Variant before, Variant after, IMiniLcmApi? api = null); + Task DeleteVariant(Variant variant); + Task AddVariantType(Variant variant, Guid variantTypeId); + Task RemoveVariantType(Variant variant, Guid variantTypeId); Task AddPublication(Guid entryId, Guid publicationId); Task RemovePublication(Guid entryId, Guid publicationId); #endregion @@ -146,6 +160,12 @@ Task UpdatePicture(Guid entryId, Task SubmitUpdateEntry(Guid id, UpdateObjectInput update) => UpdateEntry(id, update); Task SubmitCreateComplexFormComponent(ComplexFormComponent complexFormComponent, BetweenPosition? position = null) => CreateComplexFormComponent(complexFormComponent, position); Task SubmitMoveComplexFormComponent(ComplexFormComponent complexFormComponent, BetweenPosition between) => MoveComplexFormComponent(complexFormComponent, between); + Task SubmitCreateVariant(Variant variant) => CreateVariant(variant); + /// + /// Patches a variant link's own fields (HideMinorEntry, Comment) — the link is located by + /// its composite key, not its Id, since FwData links have no stable Id. + /// + Task SubmitUpdateVariant(Variant variant, UpdateObjectInput update); Task SubmitCreateSense(Guid entryId, Sense sense, BetweenPosition? position = null) => CreateSense(entryId, sense, position); Task SubmitUpdateSense(Guid entryId, Guid senseId, UpdateObjectInput update) => UpdateSense(entryId, senseId, update); Task SubmitCreateExampleSentence(Guid entryId, Guid senseId, ExampleSentence exampleSentence, BetweenPosition? position = null) => CreateExampleSentence(entryId, senseId, exampleSentence, position); @@ -157,6 +177,7 @@ Task UpdatePicture(Guid entryId, Task SubmitUpdatePublication(Guid id, UpdateObjectInput update) => UpdatePublication(id, update); Task SubmitUpdateSemanticDomain(Guid id, UpdateObjectInput update) => UpdateSemanticDomain(id, update); Task SubmitUpdateComplexFormType(Guid id, UpdateObjectInput update) => UpdateComplexFormType(id, update); + Task SubmitUpdateVariantType(Guid id, UpdateObjectInput update) => UpdateVariantType(id, update); #endregion #region CustomView diff --git a/backend/FwLite/MiniLcm/Models/Entry.cs b/backend/FwLite/MiniLcm/Models/Entry.cs index f4ce83daa6..a7654f6487 100644 --- a/backend/FwLite/MiniLcm/Models/Entry.cs +++ b/backend/FwLite/MiniLcm/Models/Entry.cs @@ -33,6 +33,16 @@ public record Entry : IObjectWithId public virtual List ComplexFormTypes { get; set; } = []; + /// + /// This entry is a variant of these entries/senses + /// + public virtual List VariantOf { get; set; } = []; + + /// + /// Entries which are variants of this entry (or one of its senses) + /// + public virtual List Variants { get; set; } = []; + public virtual List PublishIn { get; set; } = []; //Server-side query rewrite target — LcmCrdt rewrites this to Json.Query(PublishIn) so @@ -78,6 +88,14 @@ public Entry Copy() [ ..ComplexFormTypes.Select(cft => cft.Copy()) ], + VariantOf = + [ + ..VariantOf.Select(v => v.Copy()) + ], + Variants = + [ + ..Variants.Select(v => v.Copy()) + ], PublishIn = [ ..PublishIn.Select(p => p.Copy())] }; } @@ -91,17 +109,3 @@ public void RemoveReference(Guid id, DateTimeOffset time) { } } - -public class Variants -{ - public Guid Id { get; set; } - public IList VariantsOf { get; set; } = []; - public IList Types { get; set; } = []; -} - - -public class VariantType -{ - public required Guid Id { get; set; } - public required MultiString Name { get; set; } -} diff --git a/backend/FwLite/MiniLcm/Models/IObjectWithId.cs b/backend/FwLite/MiniLcm/Models/IObjectWithId.cs index 606dca4192..f5ccc63290 100644 --- a/backend/FwLite/MiniLcm/Models/IObjectWithId.cs +++ b/backend/FwLite/MiniLcm/Models/IObjectWithId.cs @@ -12,6 +12,8 @@ namespace MiniLcm.Models; [JsonDerivedType(typeof(SemanticDomain), nameof(SemanticDomain))] [JsonDerivedType(typeof(ComplexFormType), nameof(ComplexFormType))] [JsonDerivedType(typeof(ComplexFormComponent), nameof(ComplexFormComponent))] +[JsonDerivedType(typeof(VariantType), nameof(VariantType))] +[JsonDerivedType(typeof(Variant), nameof(Variant))] [JsonDerivedType(typeof(CustomView), nameof(CustomView))] [JsonDerivedType(typeof(MorphType), nameof(MorphType))] public interface IObjectWithId diff --git a/backend/FwLite/MiniLcm/Models/Variant.cs b/backend/FwLite/MiniLcm/Models/Variant.cs new file mode 100644 index 0000000000..7ba8d25996 --- /dev/null +++ b/backend/FwLite/MiniLcm/Models/Variant.cs @@ -0,0 +1,104 @@ +using System.Diagnostics; +using MiniLcm.Attributes; + +namespace MiniLcm.Models; + +/// +/// One variant relationship: a variant (minor) entry pointing at the main entry (or sense) +/// it is a variant of. Maps 1:1 to a FieldWorks LexEntryRef with RefType = Variant, so the +/// per-relationship fields (Types, HideMinorEntry, Comment) live here rather than on the +/// entry. Unlike there is no Order — variant lists have +/// no user-meaningful order in FieldWorks. +/// +public record Variant : IObjectWithId +{ + public static Variant FromEntries(Entry variantEntry, + Entry mainEntry, + Guid? mainSenseId = null) + { + if (mainEntry.Id == default) throw new ArgumentException("mainEntry.Id is empty"); + if (variantEntry.Id == default) throw new ArgumentException("variantEntry.Id is empty"); + return new Variant + { + Id = Guid.NewGuid(), + VariantEntryId = variantEntry.Id, + VariantHeadword = variantEntry.Headword(), + MainEntryId = mainEntry.Id, + MainHeadword = mainEntry.Headword(), + MainSenseId = mainSenseId, + }; + } + + private Guid _id; + [MiniLcmInternal] + public Guid Id + { + get + { + Debug.Assert(_id != Guid.Empty, "Id is not set and should not be used"); + return _id; + } + set + { + _id = value; + } + } + + [MiniLcmInternal] + public Guid? MaybeId => _id == Guid.Empty ? null : _id; + + public DateTimeOffset? DeletedAt { get; set; } + public virtual required Guid VariantEntryId { get; set; } + public string? VariantHeadword { get; set; } + public virtual required Guid MainEntryId { get; set; } + public virtual Guid? MainSenseId { get; set; } = null; + public string? MainHeadword { get; set; } + public virtual List Types { get; set; } = []; + public virtual bool HideMinorEntry { get; set; } + public virtual RichMultiString Comment { get; set; } = new(); + + public Guid[] GetReferences() + { + Span senseId = (MainSenseId.HasValue ? [MainSenseId.Value] : []); + return + [ + VariantEntryId, + MainEntryId, + ..senseId, + ..Types.Select(t => t.Id) + ]; + } + + public void RemoveReference(Guid id, DateTimeOffset time) + { + if (MainEntryId == id || VariantEntryId == id || MainSenseId == id) + { + DeletedAt = time; + return; + } + Types.RemoveAll(t => t.Id == id); + } + + public Variant Copy() + { + return new Variant + { + Id = _id, + VariantEntryId = VariantEntryId, + VariantHeadword = VariantHeadword, + MainEntryId = MainEntryId, + MainHeadword = MainHeadword, + MainSenseId = MainSenseId, + Types = [..Types.Select(t => t.Copy())], + HideMinorEntry = HideMinorEntry, + Comment = Comment.Copy(), + DeletedAt = DeletedAt, + }; + } + + public override string ToString() + { + return + $"{nameof(DeletedAt)}: {DeletedAt}, {nameof(VariantEntryId)}: {VariantEntryId}, {nameof(VariantHeadword)}: {VariantHeadword}, {nameof(MainEntryId)}: {MainEntryId}, {nameof(MainSenseId)}: {MainSenseId}, {nameof(MainHeadword)}: {MainHeadword}, Types: [{string.Join(", ", Types.Select(t => t.Id))}]"; + } +} diff --git a/backend/FwLite/MiniLcm/Models/VariantType.cs b/backend/FwLite/MiniLcm/Models/VariantType.cs new file mode 100644 index 0000000000..6531b0b6e9 --- /dev/null +++ b/backend/FwLite/MiniLcm/Models/VariantType.cs @@ -0,0 +1,23 @@ +namespace MiniLcm.Models; + +public record VariantType : IObjectWithId +{ + public virtual Guid Id { get; set; } + public virtual required MultiString Name { get; set; } + + public DateTimeOffset? DeletedAt { get; set; } + + public Guid[] GetReferences() + { + return []; + } + + public void RemoveReference(Guid id, DateTimeOffset time) + { + } + + public VariantType Copy() + { + return new VariantType { Id = Id, Name = Name.Copy(), DeletedAt = DeletedAt }; + } +} diff --git a/backend/FwLite/MiniLcm/Normalization/MiniLcmApiWriteNormalizationWrapper.cs b/backend/FwLite/MiniLcm/Normalization/MiniLcmApiWriteNormalizationWrapper.cs index dfb231e83d..0749e03776 100644 --- a/backend/FwLite/MiniLcm/Normalization/MiniLcmApiWriteNormalizationWrapper.cs +++ b/backend/FwLite/MiniLcm/Normalization/MiniLcmApiWriteNormalizationWrapper.cs @@ -207,6 +207,39 @@ private static ComplexFormType NormalizeComplexFormType(ComplexFormType cft) #endregion + #region VariantType + + public async Task CreateVariantType(VariantType variantType) + { + return await _api.CreateVariantType(NormalizeVariantType(variantType)); + } + + public Task UpdateVariantType(Guid id, UpdateObjectInput update) + { + return _api.UpdateVariantType(id, NormalizePatch(update)); + } + + + public async Task UpdateVariantType(VariantType before, VariantType after, IMiniLcmApi? api = null) + { + return await _api.UpdateVariantType(NormalizeVariantType(before), NormalizeVariantType(after), api); + } + + public Task DeleteVariantType(Guid id) + { + return _api.DeleteVariantType(id); + } + + private static VariantType NormalizeVariantType(VariantType vt) + { + return vt with + { + Name = StringNormalizer.Normalize(vt.Name) + }; + } + + #endregion + #region MorphType public async Task CreateMorphType(MorphType morphType) @@ -286,6 +319,36 @@ public Task RemoveComplexFormType(Guid entryId, Guid complexFormTypeId) return _api.RemoveComplexFormType(entryId, complexFormTypeId); } + public async Task CreateVariant(Variant variant) + { + return await _api.CreateVariant(NormalizeVariant(variant)); + } + + public async Task UpdateVariant(Variant before, Variant after, IMiniLcmApi? api = null) + { + return await _api.UpdateVariant(NormalizeVariant(before), NormalizeVariant(after), api); + } + + public Task SubmitUpdateVariant(Variant variant, UpdateObjectInput update) + { + return _api.SubmitUpdateVariant(variant, NormalizePatch(update)); + } + + public Task DeleteVariant(Variant variant) + { + return _api.DeleteVariant(variant); + } + + public Task AddVariantType(Variant variant, Guid variantTypeId) + { + return _api.AddVariantType(variant, variantTypeId); + } + + public Task RemoveVariantType(Variant variant, Guid variantTypeId) + { + return _api.RemoveVariantType(variant, variantTypeId); + } + public Task AddPublication(Guid entryId, Guid publicationId) { return _api.AddPublication(entryId, publicationId); @@ -306,7 +369,9 @@ private static Entry NormalizeEntry(Entry entry) Note = StringNormalizer.Normalize(entry.Note), Senses = [.. entry.Senses.Select(NormalizeSense)], Components = [.. entry.Components.Select(NormalizeComplexFormComponent)], - ComplexForms = [.. entry.ComplexForms.Select(NormalizeComplexFormComponent)] + ComplexForms = [.. entry.ComplexForms.Select(NormalizeComplexFormComponent)], + VariantOf = [.. entry.VariantOf.Select(NormalizeVariant)], + Variants = [.. entry.Variants.Select(NormalizeVariant)] }; } @@ -319,6 +384,17 @@ private static ComplexFormComponent NormalizeComplexFormComponent(ComplexFormCom }; } + private static Variant NormalizeVariant(Variant variant) + { + return variant with + { + VariantHeadword = StringNormalizer.Normalize(variant.VariantHeadword), + MainHeadword = StringNormalizer.Normalize(variant.MainHeadword), + Comment = StringNormalizer.Normalize(variant.Comment), + Types = [.. variant.Types.Select(NormalizeVariantType)] + }; + } + #endregion #region Sense diff --git a/backend/FwLite/MiniLcm/SyncHelpers/EntrySync.cs b/backend/FwLite/MiniLcm/SyncHelpers/EntrySync.cs index 353b905113..bb19a2e751 100644 --- a/backend/FwLite/MiniLcm/SyncHelpers/EntrySync.cs +++ b/backend/FwLite/MiniLcm/SyncHelpers/EntrySync.cs @@ -70,6 +70,8 @@ public static async Task SyncComplexFormsAndComponents(Entry beforeEntry, E var changes = 0; changes += await SyncComplexFormComponents(beforeEntry.Components, afterEntry.Components, api); changes += await SyncComplexForms(beforeEntry.ComplexForms, afterEntry.ComplexForms, api); + changes += await SyncVariants(beforeEntry.VariantOf, afterEntry.VariantOf, api); + changes += await SyncVariants(beforeEntry.Variants, afterEntry.Variants, api); return changes; } catch (Exception e) @@ -118,6 +120,15 @@ private static async Task SyncComplexForms(IList befo ); } + private static async Task SyncVariants(IList beforeVariants, IList afterVariants, IMiniLcmApi api) + { + return await DiffCollection.Diff( + beforeVariants, + afterVariants, + new VariantsDiffApi(api) + ); + } + private static async Task SensesSync(Guid entryId, IList beforeSenses, IList afterSenses, @@ -286,6 +297,33 @@ public Task Replace(ComplexFormComponent beforeComponent, ComplexFormCompon } } + private class VariantsDiffApi(IMiniLcmApi api) : CollectionDiffApi + { + public override (Guid, Guid, Guid?) GetId(Variant variant) + { + //we can't use the ID as there's none defined by Fw so it won't work as a sync key + return (variant.VariantEntryId, variant.MainEntryId, variant.MainSenseId); + } + + public override async Task Add(Variant after) + { + await api.SubmitCreateVariant(after); + return 1; + } + + public override async Task Remove(Variant before) + { + await api.DeleteVariant(before); + return 1; + } + + public override Task Replace(Variant beforeVariant, Variant afterVariant) + { + //endpoints match (same composite key) — sync the link's own data (types, HideMinorEntry, Comment) + return VariantSync.Sync(beforeVariant, afterVariant, api); + } + } + private class SensesDiffApi(IMiniLcmApi api, Guid entryId, Dictionary? allBeforeSenses, Dictionary? allAfterSenses) : IOrderableCollectionDiffApi { public Guid GetId(Sense sense) diff --git a/backend/FwLite/MiniLcm/SyncHelpers/VariantSync.cs b/backend/FwLite/MiniLcm/SyncHelpers/VariantSync.cs new file mode 100644 index 0000000000..0b17ec7782 --- /dev/null +++ b/backend/FwLite/MiniLcm/SyncHelpers/VariantSync.cs @@ -0,0 +1,57 @@ +using MiniLcm.Models; +using SystemTextJsonPatch; +using SystemTextJsonPatch.Operations; + +namespace MiniLcm.SyncHelpers; + +public static class VariantSync +{ + /// + /// Syncs one variant link's own data (types, HideMinorEntry, Comment). The link is + /// located by its composite key; changing endpoints is delete-and-recreate, handled by + /// the collection diff in . + /// + public static async Task Sync(Variant before, Variant after, IMiniLcmApi api) + { + var changes = 0; + var updateObjectInput = VariantDiffToUpdate(before, after); + if (updateObjectInput is not null) + { + await api.SubmitUpdateVariant(after, updateObjectInput); + changes++; + } + changes += await DiffCollection.Diff(before.Types, after.Types, new VariantTypesDiffApi(api, after)); + return changes; + } + + public static UpdateObjectInput? VariantDiffToUpdate(Variant before, Variant after) + { + JsonPatchDocument patchDocument = new(); + if (before.HideMinorEntry != after.HideMinorEntry) + patchDocument.Operations.Add(new Operation("replace", $"/{nameof(Variant.HideMinorEntry)}", null, after.HideMinorEntry)); + patchDocument.Operations.AddRange(MultiStringDiff.GetMultiStringDiff(nameof(Variant.Comment), before.Comment, after.Comment)); + if (patchDocument.Operations.Count == 0) return null; + return new UpdateObjectInput(patchDocument); + } + + private class VariantTypesDiffApi(IMiniLcmApi api, Variant variant) : ObjectWithIdCollectionDiffApi + { + public override async Task Add(VariantType afterVariantType) + { + await api.AddVariantType(variant, afterVariantType.Id); + return 1; + } + + public override async Task Remove(VariantType beforeVariantType) + { + await api.RemoveVariantType(variant, beforeVariantType.Id); + return 1; + } + + public override Task Replace(VariantType before, VariantType after) + { + // type renames sync via VariantTypeSync (top-level list), not through the link + return Task.FromResult(0); + } + } +} diff --git a/backend/FwLite/MiniLcm/SyncHelpers/VariantTypeSync.cs b/backend/FwLite/MiniLcm/SyncHelpers/VariantTypeSync.cs new file mode 100644 index 0000000000..3ac8d7771e --- /dev/null +++ b/backend/FwLite/MiniLcm/SyncHelpers/VariantTypeSync.cs @@ -0,0 +1,56 @@ +using MiniLcm.Models; +using SystemTextJsonPatch; + +namespace MiniLcm.SyncHelpers; + +public static class VariantTypeSync +{ + public static async Task Sync(VariantType[] beforeVariantTypes, + VariantType[] afterVariantTypes, + IMiniLcmApi api) + { + return await DiffCollection.Diff( + beforeVariantTypes, + afterVariantTypes, + new VariantTypesDiffApi(api)); + } + + public static async Task Sync(VariantType before, + VariantType after, + IMiniLcmApi api) + { + var updateObjectInput = VariantTypeDiffToUpdate(before, after); + if (updateObjectInput is not null) await api.SubmitUpdateVariantType(after.Id, updateObjectInput); + return updateObjectInput is null ? 0 : 1; + } + + public static UpdateObjectInput? VariantTypeDiffToUpdate(VariantType before, VariantType after) + { + JsonPatchDocument patchDocument = new(); + patchDocument.Operations.AddRange(MultiStringDiff.GetMultiStringDiff(nameof(VariantType.Name), + before.Name, + after.Name)); + if (patchDocument.Operations.Count == 0) return null; + return new UpdateObjectInput(patchDocument); + } + + private class VariantTypesDiffApi(IMiniLcmApi api) : ObjectWithIdCollectionDiffApi + { + public override async Task Add(VariantType afterVariantType) + { + await api.CreateVariantType(afterVariantType); + return 1; + } + + public override async Task Remove(VariantType beforeVariantType) + { + await api.DeleteVariantType(beforeVariantType.Id); + return 1; + } + + public override Task Replace(VariantType beforeVariantType, VariantType afterVariantType) + { + return Sync(beforeVariantType, afterVariantType, api); + } + } +} diff --git a/backend/FwLite/MiniLcm/Validators/EntryValidator.cs b/backend/FwLite/MiniLcm/Validators/EntryValidator.cs index 3874801821..e07d1de399 100644 --- a/backend/FwLite/MiniLcm/Validators/EntryValidator.cs +++ b/backend/FwLite/MiniLcm/Validators/EntryValidator.cs @@ -22,6 +22,13 @@ public EntryValidator() // RuleForEach(e => e.ComplexForms).SetValidator(entry => new ComplexFormComponentValidator(entry)); // TODO: Not implemented yet // TODO: ComplexFormComponentValidator(entry) might need to know the "direction" of the entry it's validating, i.e. one class for "I'm a component" and another for "I'm the complex entry" RuleForEach(e => e.ComplexFormTypes).SetValidator(new ComplexFormTypeValidator()); + RuleForEach(e => e.VariantOf).Must(NotBeEmptyMainEntryReference).WithMessage("Variant main-entry reference must not be empty."); + RuleForEach(e => e.VariantOf).Must(NotBeVariantOfSelfReference).WithMessage("Variant main-entry reference must not be the same as the entry."); + RuleForEach(e => e.VariantOf).Must(HaveCorrectVariantEntryReference).WithMessage("Variant entry reference must be correct."); + RuleForEach(e => e.Variants).Must(NotBeVariantSelfReference).WithMessage("Variant entry reference must not be the same as the entry."); + RuleForEach(e => e.Variants).Must(HaveCorrectMainEntryReference).WithMessage("Variant main-entry reference must be correct."); + RuleForEach(e => e.VariantOf).SetValidator(new VariantValidator()); + RuleForEach(e => e.Variants).SetValidator(new VariantValidator()); } private bool NotBeEmptyComponentReference(Entry entry, ComplexFormComponent component) @@ -51,6 +58,33 @@ private bool HaveCorrectComponentEntryReference(Entry entry, ComplexFormComponen return component.ComponentEntryId == entry.Id || component.ComponentEntryId == Guid.Empty; } + private bool NotBeEmptyMainEntryReference(Entry entry, Variant variant) + { + return variant.MainEntryId != Guid.Empty; + } + + private bool NotBeVariantOfSelfReference(Entry entry, Variant variant) + { + return variant.MainEntryId != entry.Id; + } + + private bool HaveCorrectVariantEntryReference(Entry entry, Variant variant) + { + // Empty GUID is okay here because it can be guessed from the parent object + return variant.VariantEntryId == entry.Id || variant.VariantEntryId == Guid.Empty; + } + + private bool NotBeVariantSelfReference(Entry entry, Variant variant) + { + return variant.VariantEntryId != entry.Id || variant.VariantEntryId == Guid.Empty; + } + + private bool HaveCorrectMainEntryReference(Entry entry, Variant variant) + { + // Empty GUID is okay here because it can be guessed from the parent object + return variant.MainEntryId == entry.Id || variant.MainEntryId == Guid.Empty; + } + private string GetEntryIdentifier(Entry entry) { return $"{entry.Headword()} - {entry.Id}"; diff --git a/backend/FwLite/MiniLcm/Validators/MiniLcmApiValidationWrapper.cs b/backend/FwLite/MiniLcm/Validators/MiniLcmApiValidationWrapper.cs index db2019ae15..3a696e1629 100644 --- a/backend/FwLite/MiniLcm/Validators/MiniLcmApiValidationWrapper.cs +++ b/backend/FwLite/MiniLcm/Validators/MiniLcmApiValidationWrapper.cs @@ -129,6 +129,30 @@ public async Task UpdateComplexFormType(ComplexFormType before, return await _api.UpdateComplexFormType(before, after, api ?? this); } + public async Task CreateVariantType(VariantType variantType) + { + await validators.ValidateAndThrow(variantType); + return await _api.CreateVariantType(variantType); + } + + public async Task UpdateVariantType(VariantType before, VariantType after, IMiniLcmApi? api = null) + { + await validators.ValidateAndThrow(after); + return await _api.UpdateVariantType(before, after, api ?? this); + } + + public async Task CreateVariant(Variant variant) + { + await validators.ValidateAndThrow(variant); + return await _api.CreateVariant(variant); + } + + public async Task UpdateVariant(Variant before, Variant after, IMiniLcmApi? api = null) + { + await validators.ValidateAndThrow(after); + return await _api.UpdateVariant(before, after, api ?? this); + } + public async Task UpdateMorphType(Guid id, UpdateObjectInput update) { await validators.ValidateAndThrow(update); diff --git a/backend/FwLite/MiniLcm/Validators/MiniLcmValidators.cs b/backend/FwLite/MiniLcm/Validators/MiniLcmValidators.cs index 4d516f6583..566d87f043 100644 --- a/backend/FwLite/MiniLcm/Validators/MiniLcmValidators.cs +++ b/backend/FwLite/MiniLcm/Validators/MiniLcmValidators.cs @@ -8,6 +8,8 @@ namespace MiniLcm.Validators; public record MiniLcmValidators( IValidator ComplexFormTypeValidator, + IValidator VariantTypeValidator, + IValidator VariantValidator, IValidator MorphTypeValidator, IValidator EntryValidator, IValidator SenseValidator, @@ -25,6 +27,16 @@ public async Task ValidateAndThrow(ComplexFormType value) await ComplexFormTypeValidator.ValidateAndThrowAsync(value); } + public async Task ValidateAndThrow(VariantType value) + { + await VariantTypeValidator.ValidateAndThrowAsync(value); + } + + public async Task ValidateAndThrow(Variant value) + { + await VariantValidator.ValidateAndThrowAsync(value); + } + public async Task ValidateAndThrow(MorphType value) { await MorphTypeValidator.ValidateAndThrowAsync(value); @@ -88,6 +100,8 @@ public static IServiceCollection AddMiniLcmValidators(this IServiceCollection se services.AddTransient(); services.AddTransient(); services.AddTransient, ComplexFormTypeValidator>(); + services.AddTransient, VariantTypeValidator>(); + services.AddTransient, VariantValidator>(); services.AddTransient, MorphTypeValidator>(); services.AddTransient, EntryValidator>(); services.AddTransient, SenseValidator>(); diff --git a/backend/FwLite/MiniLcm/Validators/VariantTypeValidator.cs b/backend/FwLite/MiniLcm/Validators/VariantTypeValidator.cs new file mode 100644 index 0000000000..0692ef36fc --- /dev/null +++ b/backend/FwLite/MiniLcm/Validators/VariantTypeValidator.cs @@ -0,0 +1,13 @@ +using FluentValidation; +using MiniLcm.Models; + +namespace MiniLcm.Validators; + +internal class VariantTypeValidator : AbstractValidator +{ + public VariantTypeValidator() + { + RuleFor(c => c.DeletedAt).Null(); + RuleFor(c => c.Name).Required(c => c.Id.ToString("D")); + } +} diff --git a/backend/FwLite/MiniLcm/Validators/VariantValidator.cs b/backend/FwLite/MiniLcm/Validators/VariantValidator.cs new file mode 100644 index 0000000000..43fe4d7eb2 --- /dev/null +++ b/backend/FwLite/MiniLcm/Validators/VariantValidator.cs @@ -0,0 +1,19 @@ +using FluentValidation; +using MiniLcm.Models; + +namespace MiniLcm.Validators; + +internal class VariantValidator : AbstractValidator +{ + public VariantValidator() + { + RuleFor(v => v.DeletedAt).Null(); + RuleFor(v => v.Comment).NoEmptyValues(GetIdentifier).NoDefaultWritingSystems(GetIdentifier); + RuleForEach(v => v.Types).SetValidator(new VariantTypeValidator()); + } + + private string GetIdentifier(Variant variant) + { + return $"{variant.VariantHeadword} -> {variant.MainHeadword} ({variant.VariantEntryId} -> {variant.MainEntryId})"; + } +} diff --git a/backend/FwLite/VARIANTS.md b/backend/FwLite/VARIANTS.md new file mode 100644 index 0000000000..5a5883d9f2 --- /dev/null +++ b/backend/FwLite/VARIANTS.md @@ -0,0 +1,278 @@ +# Variants in FieldWorks Lite — design & work log + +Working document for adding variant support to FwLite (model → sync → UI). Written so any +dev/agent can pick up the work mid-stream. Update the **Status** section as steps land. + +## Status + +- [x] Exploration (complex-forms blueprint, liblcm variant model, viewer UI) +- [x] Design review with Tim (2026-07-03): per-link model confirmed, naming settled +- [ ] Step 1 — MiniLcm model, CRDT change types, both API implementations, conformance tests +- [ ] Step 2 — FwData↔CRDT project sync (orchestration, snapshot, round-trip tests) +- [ ] Step 3 — Viewer UI (fields, picker, i18n, Playwright) + +Branches are stacked: `feat/variants-model` ← `feat/variants-sync` ← `feat/variants-ui`. + +## The LCM model (authority: liblcm) + +A variant relationship is a `LexEntryRef` **owned by the variant (minor) entry** +(`LexEntry.EntryRefsOS`), with: + +| LexEntryRef field | Variant usage | FLEx UI label | +|---|---|---| +| `RefType` | `LexEntryRefTags.krtVariant` (= 0; complex form = 1) | — | +| `ComponentLexemesRS` | The main entry **or sense** this is a variant of. Sequence — multiple targets allowed by the model; FLEx UI uses one per ref. | "Variant of" | +| `VariantEntryTypesRS` | Types from `LexDb.VariantEntryTypesOA` (per ref!) | "Variant Type" | +| `HideMinorEntry` | 0 = show as minor entry (default on create) | "Show Minor Entry" (inverted) | +| `Summary` | Per-ref note | "Comment" | +| `PrimaryLexemesRS` | **Unused** for variants (complex-forms only) | — | + +Key liblcm business rules (`SIL.LCModel/DomainImpl/OverridesLing_Lex.cs`): + +- `LexEntry.MakeVariantOf` creates the ref with `HideMinorEntry = 0` and defaults the type + to *Unspecified Variant* when none is given. +- A `LexEntryRef` is deleted when its `ComponentLexemesRS` becomes empty (merge/cleanup paths). +- An entry can own **multiple** variant refs (e.g. variant of two entries with different + types); back-refs (`VariantFormEntryBackRefs`, also on senses) are computed. +- Variant entries **may have senses** (no model restriction). An entry created *as* a variant + has none; an entry converted to a variant keeps its senses (FLEx course A7: *pagaye* vs + *placoter*). + +The variant-types list is **hierarchical**: *Irregularly Inflected Form* (a `LexEntryInflType`) +has child types *Plural* and *Past*. `LexEntryInflType` extends `LexEntryType` with +`GlossPrepend/GlossAppend/InflFeatsOA/SlotsRC` (not modeled in v1). Well-known GUIDs: +Unspecified `3942addb…`, Dialectal `024b62c9…`, Free `4343b1ef…`, Spelling `0c4663b3…`, +Irregularly Inflected Form `01d4fbc1…`, Plural `a32f1d1c…`, Past `837ebe72…`. + +## Design: one link = one LexEntryRef (per-link types) + +**FLEx compatibility is the top priority** (Tim, design review): we don't have to model every +field, but what we model must round-trip losslessly. Variant Type / Show Minor Entry / +Comment are **per relationship** in FLEx (they live on the `LexEntryRef`), so the MiniLcm +link carries them — unlike complex forms, which flatten types to entry level. + +```csharp +public record Variant : IObjectWithId +{ + Guid Id; // synthetic in CRDT; unset when read from FwData (sync keys on the composite below) + Guid VariantEntryId; // the variant (minor) entry — owns the LexEntryRef in FW + string? VariantHeadword; // derived cache, like ComplexFormComponent headwords + Guid MainEntryId; // the entry this is a variant of (LCM: ComponentLexemes) + Guid? MainSenseId; // …or a specific sense of it + string? MainHeadword; // derived cache + List Types; // LexEntryRef.VariantEntryTypesRS + bool HideMinorEntry; // LexEntryRef.HideMinorEntry != 0 (LCM polarity kept; UI shows "Show minor entry" inverted) + RichMultiString? Comment; // LexEntryRef.Summary (FLEx UI labels it "Comment") — check actual MultiString kind at impl time + DateTimeOffset? DeletedAt; +} +``` + +- **`Entry.Variants: List`** — links where this entry (or one of its senses) is the + main. Matches the FLEx "Variants" section on a main entry. +- **`Entry.VariantOf: List`** — links where this entry is the variant. Matches the + FLEx "Variant of" field on a minor entry. +- **`VariantType`**: `Id`, `Name`, `DeletedAt` — same shape as `ComplexFormType`, a + first-class CRDT object with its own sync. +- Sync key: **composite `(VariantEntryId, MainEntryId, MainSenseId)`**, never `Id` + (FW-side links are keyed by the ref they live in; ids don't line up across sides — + same rule as `ComplexFormComponent`). + +### Decisions (and the reasoning) + +1. **Per-link model, not complex-form parity flattening** (Tim confirmed). One `Variant` = + one `LexEntryRef` with exactly one target. Reading a multi-target ref (model-legal, rare, + not creatable in FLEx UI) yields one link per target sharing the ref's types/fields; + writing back would split into per-link refs. Two refs to the *same* target collapse to + one link (composite-key dedupe, first ref wins) — documented edge, mirrors complex forms. +2. **Naming leans FLEx-user-facing, not LCM-internal** (Tim: "Component = the main entry" is + unintuitive, even though liblcm's `ComponentLexemesRS` is exactly that). Hence + `MainEntryId`/`MainSenseId`, record name `Variant`, entry fields `Variants`/`VariantOf`. + `Comment` (FLEx label) maps to LCM `Summary`; precedent: MiniLcm `Entry.Note` ↔ LCM + `LexEntry.Comment`. `HideMinorEntry` keeps LCM's name *and polarity* so bridge code never + flips signs; the UI can present "Show minor entry". +3. **`HideMinorEntry` + `Comment` are modeled and synced in v1, UI deferred** (Tim). Cheap on + the link entity, avoids a second migration + sync fanout later, and deleting/recreating a + link in FWL can never silently drop FLEx data. +4. **Variant types are read *flattened*** (`GetVariantTypes` must be changed — it exists today + reading only top-level `PossibilitiesOS`): the IIF subtypes (*Plural*, *Past*) are children + in the list and are what IIF-heavy projects assign. Creating a type missing on the other + side creates a **plain top-level `LexEntryType`** — standard types exist everywhere + (well-known GUIDs), so this is rare; hierarchy and `LexEntryInflType` payloads don't + round-trip in v1. +5. **Link edits are allowed** (unlike complex forms' "delete and recreate"): type add/remove + are dedicated CRDT changes on the link (`AddVariantTypeChange`/`RemoveVariantTypeChange`, + `EditChange`); `HideMinorEntry`/`Comment` sync via `JsonPatchChange`. + This is what makes concurrent type edits merge instead of last-writer-wins. +6. **No ordering.** Variant lists have no user-meaningful order in FLEx; both directions diff + as sets. No `IOrderable`, no `SetOrderChange`, no Move API. +7. **Cycle/duplicate guard mirrors `AddEntryComponentChange`** — lives in the *change class* + (soft-deletes instead of throwing, because sync must tolerate incoming duplicates); + validator only rejects self-reference cheaply. Don't duplicate the BFS in validators. +8. **Deleted `VariantType` cleanup**: `Variant.GetReferences()` includes its `Types` ids, and + `RemoveReference` removes the type from the list (only endpoint ids soft-delete the link). + Better than the complex-forms quirk where deleted types linger in `Entry.ComplexFormTypes`. +9. **Variant entries with no senses are first-class** and must be covered by tests both ways + (headline behavioral difference; FLEx "Insert Variant" creates sense-less entries). +10. **A variant can target a sense** (`MainSenseId`); on the main side such links still + surface under the owning entry's `Variants`. +11. **Minor-entry visibility in FWL UI** (step 3): users must be able to see at a glance that + an entry is a variant, not a first-class entry (badge / "Variant of X" in the editor; + list styling is a follow-up). + +### FwData bridge mapping + +Read (`FwDataMiniLcmApi.FromLexEntry`): +- `VariantOf` ← each `entry.VariantEntryRefs` ref × each `ComponentLexemesRS` target + (`ILexEntry`/`ILexSense`), `DistinctBy` composite key; per-link `Types`/`HideMinorEntry`/ + `Comment` from the ref. +- `Variants` ← back-refs: `entry.VariantFormEntryBackRefs` + per-sense back-refs (verify + exact liblcm property names at impl time), mapped the same way. +- `GetVariantTypes()` ← `LexDb.VariantEntryTypesOA` **flattened** (decision 4). + +Write: +- `CreateVariant` → **new** `LexEntryRef` on the variant entry (`RefType = krtVariant`), + `HideMinorEntry`/`Summary`/types from the link, add the single target. Idempotent when the + composite already exists. +- `DeleteVariant` → find the ref holding the target; remove the target; delete the ref when + its components empty (liblcm's own cleanup semantics). +- `AddVariantType`/`RemoveVariantType` (link-locator + type id) → that ref's + `VariantEntryTypesRS`. +- `SubmitUpdateVariant` (scalars) → proxy over the ref (`UpdateComplexFormTypeProxy` pattern). +- Type CRUD → possibility list (create = plain top-level `LexEntryType`). + +### CRDT side + +- `Variant` table (`Variants`): FK cascades — Entry×2 (`VariantEntryId`, `MainEntryId`), + Sense (`MainSenseId`); filtered unique indexes on the composite (sense null / not null), + mirroring `ComplexFormComponents`; `Types` jsonb; `Comment` jsonb. +- `VariantType` snapshot table (mirror `ComplexFormType`). +- linq2db headword expressions for `VariantHeadword`/`MainHeadword` (mirror the + `ComplexFormComponent` `IsExpression` mappings in `ConfigureDbOptions`), plus `Finalize` + sorting for deterministic list order. +- EF migration `AddVariants`. +- Changes (register in `LcmCrdtKernel.ConfigureCrdt` **and** add instances to + `UseChangesTests.GetAllChanges()` — kernel comment mandates it): + `AddVariantChange` (create; carries types+scalars; dedupe/cycle/deleted-ref handling + mirroring `AddEntryComponentChange`), `SetVariantChange` (mirror + `SetComplexFormComponentChange`; needs a hand-written generator branch in + `ChangeSerializationTests.GeneratedChangesForType` — protected ctor), + `AddVariantTypeChange`/`RemoveVariantTypeChange` (`EditChange`), + `CreateVariantType`, `JsonPatchChange`, `JsonPatchChange`, + `DeleteChange`, `DeleteChange`. + Check `ConfigRegistrationTests.AllChangesAreRegistered` exclusion list (it force-crosses + generic changes with all object types). + +### API surface (both implementations + wrappers) + +Read: `GetVariantTypes()`, `GetVariantType(Guid)`. +Write: `CreateVariantType`, `UpdateVariantType` ×2, `DeleteVariantType`, +`CreateVariant(variant)`, `DeleteVariant(variant)`, `UpdateVariant(before, after)`, +`AddVariantType(variant, typeId)`, `RemoveVariantType(variant, typeId)` — link-locator +arguments resolve by composite key on both sides. +Submit (sync, result-less): `SubmitCreateVariant`, `SubmitUpdateVariant(variant, patch)`, +`SubmitUpdateVariantType`. + +Fanout sites that must stay in lockstep: +- `CrdtMiniLcmApi`, `FwDataMiniLcmApi` (manual implementations) +- `DryRunMiniLcmApi` (manual write methods; reads auto-forward) +- `MiniLcmApiWriteNormalizationWrapper` (manual write methods) +- `MiniLcmApiValidationWrapper` — **explicit** additions or the new writes silently skip + validation (BeaKona auto-forwards; the CreateEntry gap #2362 is the cautionary tale) +- `ResumableImportApi` — cache `CreateVariantType` like `CreateComplexFormType` (step 2) +- `MiniLcmApiNotifyWrapper` (FwLiteShared) — notify on variant writes for UI refresh +- `MiniLcmJsInvokable`, `InMemoryDemoApi`, generated TS types (step 3) + +### Sync design (step 2) + +- `VariantTypeSync` (mirror `ComplexFormTypeSync`); runs in `SyncInternal` next to + `ComplexFormTypeSync`, before entries. +- `VariantSync` (per-link): types diff via `Add/RemoveVariantType`; `HideMinorEntry`/`Comment` + via `SubmitUpdateVariant` patch. Used by EntrySync diff Replace and `UpdateVariant`. +- `VariantOf`/`Variants` link diffs join **phase 2** (`SyncComplexFormsAndComponents`, both + directions — a one-direction wiring won't reconcile deletes). Phase/option names stay + as-is in these PRs (`…ComplexFormsAndComponents` now covers variants too; renaming is a + separate no-behavior PR — reviewer advice, keeps the critical diff small). +- `CreateEntryOptions.IncludeComplexFormsAndComponents` also gates variant links (doc + comment updated; entry-to-entry refs need both endpoints to exist). +- `ProjectSnapshot` gains `VariantTypes` — update **`TakeProjectSnapshot()`** + (`MiniLcmApiExtensions`) and `ProjectSnapshot.Empty`, or it compiles-but-snapshots-empty + (landmine #1912-class). +- `ProjectImporter`/`MiniLcmImport`: explicit `VariantType` creation loop (same slot as + complex-form types, before entries) — import is a separate code path from sync. +- `ResumableImportApi`: cache `CreateVariantType`. +- Legacy snapshots need **no** MorphTypes-style patch: CRDT genuinely has no variants yet, so + the first sync after upgrade imports FwData variants into the CRDT (dedicated upgrade test: + snapshot without variants + FwData with variants → added to CRDT, nothing deleted from + FwData). +- **Verified files must be regenerated regardless of Sena3 content**: entry shape changes + break `ProjectSnapshotSerializationTests.LatestSena3SnapshotRoundTrips` (+ the dated + `Snapshots/` files) and possibly `LiveSena3Sync`'s `sena-3-live.verified.sqlite` / + `CrdtChanges == 0` assertion (Sena 3 contains variants → first sync after upgrade + produces changes). Regenerate + eyeball, don't hand-edit. +- `EntryFakerHelper`/AutoFaker: `CanSyncRandomEntries` will start generating variant links — + extend `PrepareToCreateEntry` to create referenced variant entries/types (mirror the + `createComponents` flag) and extend `SyncTests.SyncExclusions` for the derived + `VariantHeadword`/`MainHeadword` caches. + +### Rollout / compatibility notes + +- Same story as every previous model addition (MorphTypes, Publications): the lexbox server + stores change JSON opaquely, but **old FwLite clients cannot deserialize a new change + type** — they break only when someone actually uses variants in a synced project, and + auto-update closes the window. No extra gating exists or is added (precedent). +- FwHeadless consumes the same sync libraries; it must be deployed with/before a client + release that writes variant changes. + +### Test plan + +Mirror the *named* complex-forms cases (test-auditor sweep), not just categories: + +- `MiniLcm.Tests/VariantTestsBase` (subclassed by LcmCrdt.Tests + FwDataMiniLcmBridge.Tests): + create/delete; headwords update when referenced entries change; replaying returned object + is idempotent; same-link-again does nothing (null and non-null sense); changing a property + and creating again creates both; multi-layer cycle guards (1/2/3 levels) + works when a + would-be-cycle member was deleted; **variant entry without senses; variant-of-a-sense; + entry that is both a variant and a component; per-link types round-trip; type add/remove; + HideMinorEntry/Comment round-trip**. +- `LcmCrdt.Tests/Changes/VariantTests` (mirror `ComplexFormTests`: add/remove type, add + link, delete link, duplicate links are soft-deleted) + `UseChangesTests.GetAllChanges()` + entries + `ChangeSerializationTests` generator branch + regression-data regen. +- Validator tests (self-reference, empty refs, wrong-direction ids, nested type validation). +- `FwLiteProjectSync.Tests`: EntrySync diff tests; round-trip create/edit/delete both + directions (two named delete-cascade tests: delete main entry vs delete variant entry); + link-target deleted between syncs (delete-vs-edit race); sense-targeted link when the + sense moves entries; new link referencing a new sense; sense-less variant round-trip; + legacy-snapshot upgrade; flattened-type read + create-missing-type-lands-top-level + (FwData bridge); Sena3 + verified files regen. +- Playwright (step 3): add/remove a variant link + type via the demo project. + +## Stacked PR plan + +1. **`feat/variants-model`** — models, validators, API surface, CRDT entities + changes + + migration, FwData bridge read/write, SyncHelpers (`VariantTypeSync`, `VariantSync`, + EntrySync diffs — they also power `UpdateEntry(before, after)`), conformance tests. + Green standalone; project-sync orchestration doesn't move variants yet. +2. **`feat/variants-sync`** — `CrdtFwdataProjectSyncService` + `ProjectSnapshot.VariantTypes` + + `TakeProjectSnapshot`, `ProjectImporter`/`MiniLcmImport`/`ResumableImportApi`, + round-trip + upgrade tests, verified-file regens (incl. Sena3). +3. **`feat/variants-ui`** — `MiniLcmJsInvokable` + `MiniLcmApiNotifyWrapper` hooks, + regenerated dotnet-types, entity-config + view-data fields (`variantOf`, `variants` — + decide `show` defaults: mirror complexForms=true; variant-type picker inside the link + rows), `VariantOf.svelte`/`Variants.svelte` (reuse `EntryOrSensePicker` + + `EntryOrSenseItemList`, **both non-orderable**, `pt()` dual labels for FW-Classic view, + disable self/duplicates but allow cross-type overlap with components), variant badge for + minor entries (decision 11), demo data seeded with a variant pair + real (not stub) + `InMemoryDemoApi` support for the paths the UI uses, i18n extraction **with context + comments**, Playwright test. + +## Open questions / follow-ups (not blockers) + +- Dictionary preview (`DictionaryEntry.svelte`) shows neither complex forms nor variants; + "variant of X" there is a follow-up. +- `LexEntryInflType` extras (GlossPrepend/Append, InflFeats, Slots), type hierarchy + round-trip — future work. +- Entry-list styling of minor entries (beyond the editor badge) — follow-up. +- FLEx "Insert Variant" convenience (create variant entry + link in one step) in the + new-entry dialog — follow-up UX; v1 links existing entries. +- `HideMinorEntry` is modeled as bool; LCM docs hint the int may become per-publication bit + flags someday — revisit if FLEx ever uses values other than 0/1. diff --git a/backend/LfClassicData/LfClassicMiniLcmApi.cs b/backend/LfClassicData/LfClassicMiniLcmApi.cs index a9352a0e0d..284846fd09 100644 --- a/backend/LfClassicData/LfClassicMiniLcmApi.cs +++ b/backend/LfClassicData/LfClassicMiniLcmApi.cs @@ -26,6 +26,16 @@ public IAsyncEnumerable GetComplexFormTypes() return Task.FromResult(null); } + public IAsyncEnumerable GetVariantTypes() + { + return AsyncEnumerable.Empty(); + } + + public Task GetVariantType(Guid id) + { + return Task.FromResult(null); + } + public IAsyncEnumerable GetMorphTypes() { return AsyncEnumerable.Empty(); diff --git a/frontend/viewer/src/lib/dotnet-types/generated-types/MiniLcm/Models/IEntry.ts b/frontend/viewer/src/lib/dotnet-types/generated-types/MiniLcm/Models/IEntry.ts index eaf8d5ecb1..fa1724839d 100644 --- a/frontend/viewer/src/lib/dotnet-types/generated-types/MiniLcm/Models/IEntry.ts +++ b/frontend/viewer/src/lib/dotnet-types/generated-types/MiniLcm/Models/IEntry.ts @@ -10,6 +10,7 @@ import type {MorphTypeKind} from './MorphTypeKind'; import type {ISense} from './ISense'; import type {IComplexFormComponent} from './IComplexFormComponent'; import type {IComplexFormType} from './IComplexFormType'; +import type {IVariant} from './IVariant'; import type {IPublication} from './IPublication'; export interface IEntry extends IObjectWithId @@ -26,6 +27,8 @@ export interface IEntry extends IObjectWithId components: IComplexFormComponent[]; complexForms: IComplexFormComponent[]; complexFormTypes: IComplexFormType[]; + variantOf: IVariant[]; + variants: IVariant[]; publishIn: IPublication[]; } /* eslint-enable */ diff --git a/frontend/viewer/src/lib/dotnet-types/generated-types/MiniLcm/Models/IVariant.ts b/frontend/viewer/src/lib/dotnet-types/generated-types/MiniLcm/Models/IVariant.ts new file mode 100644 index 0000000000..ddbd970889 --- /dev/null +++ b/frontend/viewer/src/lib/dotnet-types/generated-types/MiniLcm/Models/IVariant.ts @@ -0,0 +1,22 @@ +/* eslint-disable */ +// This code was generated by a Reinforced.Typings tool. +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. + +import type {IObjectWithId} from './IObjectWithId'; +import type {IVariantType} from './IVariantType'; +import type {IRichMultiString} from '$lib/dotnet-types/i-multi-string'; + +export interface IVariant extends IObjectWithId +{ + deletedAt?: string; + variantEntryId: string; + variantHeadword?: string; + mainEntryId: string; + mainSenseId?: string; + mainHeadword?: string; + types: IVariantType[]; + hideMinorEntry: boolean; + comment: IRichMultiString; +} +/* eslint-enable */ diff --git a/frontend/viewer/src/lib/dotnet-types/generated-types/MiniLcm/Models/IVariantType.ts b/frontend/viewer/src/lib/dotnet-types/generated-types/MiniLcm/Models/IVariantType.ts new file mode 100644 index 0000000000..9eafe80d30 --- /dev/null +++ b/frontend/viewer/src/lib/dotnet-types/generated-types/MiniLcm/Models/IVariantType.ts @@ -0,0 +1,15 @@ +/* eslint-disable */ +// This code was generated by a Reinforced.Typings tool. +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. + +import type {IObjectWithId} from './IObjectWithId'; +import type {IMultiString} from '$lib/dotnet-types/i-multi-string'; + +export interface IVariantType extends IObjectWithId +{ + id: string; + name: IMultiString; + deletedAt?: string; +} +/* eslint-enable */ From 979f1ad4ca44ce017ac48d42c73c28b6eaa4e7d6 Mon Sep 17 00:00:00 2001 From: Tim Haasdyk Date: Sat, 4 Jul 2026 13:56:42 +0200 Subject: [PATCH 02/21] Wire variants into sync orchestration, import and tests Conformance suites for both IMiniLcmApi implementations, change/usage/serialization tests, verified-file regens, AutoFaker support. LCM enforces acyclicity over the combined complex-form + variant graph, so AddVariantChange mirrors that check. Co-Authored-By: Claude Fable 5 --- .../MiniLcmTests/VariantTests.cs | 122 + .../Api/FwDataMiniLcmApi.cs | 14 +- .../FwLiteProjectSync.Tests/SyncTests.cs | 7 +- .../CrdtFwdataProjectSyncService.cs | 6 + .../Import/ResumableImportApi.cs | 4 + .../Changes/VariantChangeTests.cs | 193 ++ .../LcmCrdt.Tests/Data/MigrationTests.cs | 3 + ...ScriptedDb.v1.ProjectSnapshot.verified.txt | 3 + ...s_FromScriptedDb.v1.Snapshots.verified.txt | 2 + ...ScriptedDb.v2.ProjectSnapshot.verified.txt | 9 + ...s_FromScriptedDb.v2.Snapshots.verified.txt | 18 + ...lizationRegressionData.latest.verified.txt | 2800 ++++++++++++++++- ...lizationRegressionData.legacy.verified.txt | 848 +++++ ...erMigrationFromScriptedDb.v1.verified.json | 2 + ...erMigrationFromScriptedDb.v2.verified.json | 8 + ...pshotTests.VerifyChangeModels.verified.txt | 32 + ...elSnapshotTests.VerifyDbModel.verified.txt | 66 + ...sts.VerifyIObjectWithIdModels.verified.txt | 8 + .../MiniLcmTests/VariantTests.cs | 55 + .../SnapshotAtCommitServiceTests.cs | 1 + .../Changes/Entries/AddVariantChange.cs | 48 +- .../AutoFakerHelpers/EntryFakerHelper.cs | 64 +- .../Validators/VariantTypeValidationTests.cs | 44 + .../Validators/VariantValidationTests.cs | 64 + .../FwLite/MiniLcm.Tests/VariantTestsBase.cs | 381 +++ .../FwLite/MiniLcm/Import/ProjectImporter.cs | 13 +- .../FwLite/MiniLcm/MiniLcmApiExtensions.cs | 1 + backend/FwLite/MiniLcm/ProjectSnapshot.cs | 6 +- .../MiniLcm/Validators/VariantValidator.cs | 5 + backend/FwLite/VARIANTS.md | 22 +- 30 files changed, 4647 insertions(+), 202 deletions(-) create mode 100644 backend/FwLite/FwDataMiniLcmBridge.Tests/MiniLcmTests/VariantTests.cs create mode 100644 backend/FwLite/LcmCrdt.Tests/Changes/VariantChangeTests.cs create mode 100644 backend/FwLite/LcmCrdt.Tests/MiniLcmTests/VariantTests.cs create mode 100644 backend/FwLite/MiniLcm.Tests/Validators/VariantTypeValidationTests.cs create mode 100644 backend/FwLite/MiniLcm.Tests/Validators/VariantValidationTests.cs create mode 100644 backend/FwLite/MiniLcm.Tests/VariantTestsBase.cs diff --git a/backend/FwLite/FwDataMiniLcmBridge.Tests/MiniLcmTests/VariantTests.cs b/backend/FwLite/FwDataMiniLcmBridge.Tests/MiniLcmTests/VariantTests.cs new file mode 100644 index 0000000000..302805aeb6 --- /dev/null +++ b/backend/FwLite/FwDataMiniLcmBridge.Tests/MiniLcmTests/VariantTests.cs @@ -0,0 +1,122 @@ +using FwDataMiniLcmBridge.Api; +using FwDataMiniLcmBridge.LcmUtils; +using FwDataMiniLcmBridge.Tests.Fixtures; +using MiniLcm.Models; +using SIL.LCModel; + +namespace FwDataMiniLcmBridge.Tests.MiniLcmTests; + +[Collection(ProjectLoaderFixture.Name)] +public class VariantTests(ProjectLoaderFixture fixture) : VariantTestsBase +{ + protected override Task NewApi() + { + return Task.FromResult(fixture.NewProjectApi("variant-test", "en", "en")); + } + + [Fact] + public async Task GetVariantTypes_IncludesIrregularlyInflectedFormSubtypes() + { + // Plural and Past are children of Irregularly Inflected Form in the possibility + // list; the flattened read must surface them (they're the headline use case) + var types = await Api.GetVariantTypes().ToArrayAsync(); + types.Should().Contain(t => t.Id == LexEntryTypeTags.kguidLexTypPluralVar); + types.Should().Contain(t => t.Id == LexEntryTypeTags.kguidLexTypPastVar); + types.Should().Contain(t => t.Id == LexEntryTypeTags.kguidLexTypSpellingVar); + } +} + +/// +/// tests the per-link fidelity when FwData has multiple variant LexEntryRefs on one entry +/// +[Collection(ProjectLoaderFixture.Name)] +public class VariantTestsMultipleRefs(ProjectLoaderFixture fixture) : VariantTestsBase +{ + protected override Task NewApi() + { + return Task.FromResult(fixture.NewProjectApi("variant-test-multipleRefs", "en", "en")); + } + + public override async Task InitializeAsync() + { + await base.InitializeAsync(); + var fwDataApi = (FwDataMiniLcmApi)BaseApi; + var variantEntry = fwDataApi.EntriesRepository.GetObject(_variantEntryId); + await fwDataApi.Cache.DoUsingNewOrCurrentUOW("Add dangling variant LexEntryRefs", + "Remove dangling variant LexEntryRefs", + () => + { + //FLEx data can contain variant refs with no components; they must not confuse reads or writes + foreach (var _ in Enumerable.Range(0, 2)) + { + var entryRef = fwDataApi.Cache.ServiceLocator.GetInstance().Create(); + variantEntry.EntryRefsOS.Add(entryRef); + entryRef.RefType = LexEntryRefTags.krtVariant; + } + return ValueTask.CompletedTask; + }); + } + + [Fact] + public async Task VariantRefsWithDifferentTypes_ReadAsSeparateLinksWithOwnTypes() + { + var otherMainEntry = await Api.CreateEntry(new() + { + Id = Guid.NewGuid(), + LexemeForm = { { "en", "other main" } } + }); + var typeA = await Api.CreateVariantType(new VariantType { Id = Guid.NewGuid(), Name = new() { { "en", "type a" } } }); + var typeB = await Api.CreateVariantType(new VariantType { Id = Guid.NewGuid(), Name = new() { { "en", "type b" } } }); + + await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with { Types = [typeA] }); + await Api.CreateVariant(Variant.FromEntries(_variantEntry, otherMainEntry) with { Types = [typeB] }); + + var entry = await Api.GetEntry(_variantEntryId); + entry!.VariantOf.Should().HaveCount(2); + entry.VariantOf.Should().ContainSingle(v => v.MainEntryId == _mainEntryId) + .Which.Types.Should().ContainSingle(t => t.Id == typeA.Id); + entry.VariantOf.Should().ContainSingle(v => v.MainEntryId == otherMainEntry.Id) + .Which.Types.Should().ContainSingle(t => t.Id == typeB.Id); + } + + [Fact] + public async Task DuplicateVariantRefs_AreNotDuplicated() + { + await AddDuplicateVariantRef(); + + var entry = await Api.GetEntry(_variantEntryId); + entry.Should().NotBeNull(); + entry!.VariantOf.Should().HaveCount(1); + var mainEntry = await Api.GetEntry(_mainEntryId); + mainEntry.Should().NotBeNull(); + mainEntry!.Variants.Should().HaveCount(1); + } + + [Fact] + public async Task DuplicateVariantRefs_BothAreRemoved() + { + await AddDuplicateVariantRef(); + + var entry = await Api.GetEntry(_variantEntryId); + await Api.DeleteVariant(entry!.VariantOf.Single()); + + entry = await Api.GetEntry(_variantEntryId); + entry.Should().NotBeNull(); + entry!.VariantOf.Should().BeEmpty(); + } + + private async Task AddDuplicateVariantRef() + { + var fwDataApi = (FwDataMiniLcmApi)BaseApi; + var variantEntry = fwDataApi.EntriesRepository.GetObject(_variantEntryId); + var mainEntry = fwDataApi.EntriesRepository.GetObject(_mainEntryId); + await fwDataApi.Cache.DoUsingNewOrCurrentUOW("Add variant LexEntryRefs", + "Remove variant LexEntryRefs", + () => + { + variantEntry.MakeVariantOf(mainEntry, fwDataApi.VariantTypesFlattened.First()); + variantEntry.MakeVariantOf(mainEntry, fwDataApi.VariantTypesFlattened.Last()); + return ValueTask.CompletedTask; + }); + } +} diff --git a/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs b/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs index 6bd396bf82..577190511c 100644 --- a/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs +++ b/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs @@ -799,12 +799,14 @@ private IEnumerable ToVariantOf(ILexEntry entry) private IEnumerable ToVariants(ILexEntry entry) { - return - [ - ..entry.VariantFormEntryBackRefs.Select(r => ToVariant(r.OwningEntry, r, entry, null)), - ..entry.AllSenses.SelectMany(sense => - sense.VariantFormEntryBackRefs.Select(r => ToVariant(r.OwningEntry, r, entry, sense))) - ]; + return new[] + { + entry.VariantFormEntryBackRefs.Select(r => ToVariant(r.OwningEntry, r, entry, null)), + entry.AllSenses.SelectMany(sense => + sense.VariantFormEntryBackRefs.Select(r => ToVariant(r.OwningEntry, r, entry, sense))) + } + .SelectMany(v => v) + .DistinctBy(v => (v.VariantEntryId, v.MainEntryId, v.MainSenseId)); } private Variant ToVariant(ILexEntry variantEntry, ILexEntryRef variantRef, ILexEntry mainEntry, ILexSense? mainSense) diff --git a/backend/FwLite/FwLiteProjectSync.Tests/SyncTests.cs b/backend/FwLite/FwLiteProjectSync.Tests/SyncTests.cs index 3f313a5b0f..1abc4ba73c 100644 --- a/backend/FwLite/FwLiteProjectSync.Tests/SyncTests.cs +++ b/backend/FwLite/FwLiteProjectSync.Tests/SyncTests.cs @@ -92,14 +92,16 @@ internal static EquivalencyOptions SyncExclusions(EquivalencyOptions e.Components).Exclude(c => c.Id) .For(e => e.Components).Exclude(c => c.Order) .For(e => e.ComplexForms).Exclude(c => c.Id) - .For(e => e.ComplexForms).Exclude(c => c.Order); + .For(e => e.ComplexForms).Exclude(c => c.Order) + .For(e => e.VariantOf).Exclude(v => v.Id) + .For(e => e.Variants).Exclude(v => v.Id); return options; } internal static void AssertSnapshotsAreEquivalent(ProjectSnapshot expected, ProjectSnapshot actual) { var excludeOrderTypes = new[] { typeof(Sense), typeof(ExampleSentence), typeof(Picture), typeof(ComplexFormComponent), typeof(WritingSystem) }; - var excludeIds = new[] { typeof(ComplexFormComponent), typeof(WritingSystem) }; + var excludeIds = new[] { typeof(ComplexFormComponent), typeof(Variant), typeof(WritingSystem) }; actual.Should().BeEquivalentTo(expected, options => options @@ -109,6 +111,7 @@ internal static void AssertSnapshotsAreEquivalent(ProjectSnapshot expected, Proj .WithoutStrictOrderingFor(x => x.SemanticDomains) .WithoutStrictOrderingFor(x => x.ComplexFormTypes) .WithoutStrictOrderingFor(x => x.MorphTypes) + .WithoutStrictOrderingFor(x => x.VariantTypes) //when excluding properties consider https://github.com/sillsdev/languageforge-lexbox/issues/1912 .Using(Exclude) .When(info => info.RuntimeType == typeof(double) && info.Path.EndsWith(".Order") && excludeOrderTypes.Contains(info.ParentType)) diff --git a/backend/FwLite/FwLiteProjectSync/CrdtFwdataProjectSyncService.cs b/backend/FwLite/FwLiteProjectSync/CrdtFwdataProjectSyncService.cs index 588803caba..63fea51dde 100644 --- a/backend/FwLite/FwLiteProjectSync/CrdtFwdataProjectSyncService.cs +++ b/backend/FwLite/FwLiteProjectSync/CrdtFwdataProjectSyncService.cs @@ -134,6 +134,12 @@ private async Task SyncInternal(IMiniLcmApi crdtApi, IMiniLcmApi fwd crdtChanges += await ComplexFormTypeSync.Sync(projectSnapshot.ComplexFormTypes, currentFwDataComplexFormTypes, crdtApi); fwdataChanges += await ComplexFormTypeSync.Sync(currentFwDataComplexFormTypes, await crdtApi.GetComplexFormTypes().ToArrayAsync(), fwdataApi); + var currentFwDataVariantTypes = await fwdataApi.GetVariantTypes().ToArrayAsync(); + // Legacy snapshots predate variant support and deserialize with an empty list; the CRDT + // genuinely has no variant types yet, so that baseline correctly imports FwData's list. + crdtChanges += await VariantTypeSync.Sync(projectSnapshot.VariantTypes, currentFwDataVariantTypes, crdtApi); + fwdataChanges += await VariantTypeSync.Sync(currentFwDataVariantTypes, await crdtApi.GetVariantTypes().ToArrayAsync(), fwdataApi); + var currentFwDataMorphTypes = await fwdataApi.GetMorphTypes().ToArrayAsync(); crdtChanges += await MorphTypeSync.Sync(projectSnapshot.MorphTypes, currentFwDataMorphTypes, crdtApi); fwdataChanges += await MorphTypeSync.Sync(currentFwDataMorphTypes, await crdtApi.GetMorphTypes().ToArrayAsync(), fwdataApi); diff --git a/backend/FwLite/FwLiteProjectSync/Import/ResumableImportApi.cs b/backend/FwLite/FwLiteProjectSync/Import/ResumableImportApi.cs index 942b81f900..159c6de0dd 100644 --- a/backend/FwLite/FwLiteProjectSync/Import/ResumableImportApi.cs +++ b/backend/FwLite/FwLiteProjectSync/Import/ResumableImportApi.cs @@ -58,6 +58,10 @@ async Task IMiniLcmWriteApi.CreateComplexFormType(ComplexFormTy { return await HasCreated(complexFormType, _api.GetComplexFormTypes(), () => _api.CreateComplexFormType(complexFormType)); } + async Task IMiniLcmWriteApi.CreateVariantType(VariantType variantType) + { + return await HasCreated(variantType, _api.GetVariantTypes(), () => _api.CreateVariantType(variantType)); + } async Task IMiniLcmWriteApi.CreateSemanticDomain(SemanticDomain semanticDomain) { return await HasCreated(semanticDomain, _api.GetSemanticDomains(), () => _api.CreateSemanticDomain(semanticDomain)); diff --git a/backend/FwLite/LcmCrdt.Tests/Changes/VariantChangeTests.cs b/backend/FwLite/LcmCrdt.Tests/Changes/VariantChangeTests.cs new file mode 100644 index 0000000000..1f34c53ad2 --- /dev/null +++ b/backend/FwLite/LcmCrdt.Tests/Changes/VariantChangeTests.cs @@ -0,0 +1,193 @@ +using LcmCrdt.Changes.Entries; +using MiniLcm.Models; +using SIL.Harmony.Changes; + +namespace LcmCrdt.Tests.Changes; + +public class VariantChangeTests(MiniLcmApiFixture fixture) : IClassFixture +{ + private async Task<(Entry variantEntry, Entry mainEntry)> CreateEntryPair() + { + var variantEntry = await fixture.Api.CreateEntry(new() { LexemeForm = { { "en", "colour" } }, }); + var mainEntry = await fixture.Api.CreateEntry(new() { LexemeForm = { { "en", "color" } }, }); + return (variantEntry, mainEntry); + } + + [Fact] + public async Task AddVariant() + { + var (variantEntry, mainEntry) = await CreateEntryPair(); + + await fixture.DataModel.AddChange(Guid.NewGuid(), new AddVariantChange(Variant.FromEntries(variantEntry, mainEntry))); + var updatedVariantEntry = await fixture.Api.GetEntry(variantEntry.Id); + updatedVariantEntry.Should().NotBeNull(); + updatedVariantEntry!.VariantOf.Should().ContainSingle(v => v.MainEntryId == mainEntry.Id); + + var updatedMainEntry = await fixture.Api.GetEntry(mainEntry.Id); + updatedMainEntry.Should().NotBeNull(); + updatedMainEntry!.Variants.Should().ContainSingle(v => v.VariantEntryId == variantEntry.Id); + } + + [Fact] + public async Task AddVariant_CarriesTypesAndScalars() + { + var (variantEntry, mainEntry) = await CreateEntryPair(); + var variantType = await fixture.Api.CreateVariantType(new VariantType { Id = Guid.NewGuid(), Name = new() { { "en", "spelling" } } }); + + var variant = Variant.FromEntries(variantEntry, mainEntry) with + { + Types = [variantType], + HideMinorEntry = true, + Comment = new() { { "en", new RichString("british spelling") } }, + }; + await fixture.DataModel.AddChange(Guid.NewGuid(), new AddVariantChange(variant)); + + var link = (await fixture.Api.GetEntry(variantEntry.Id))!.VariantOf.Should().ContainSingle().Subject; + link.Types.Should().ContainSingle(t => t.Id == variantType.Id); + link.HideMinorEntry.Should().BeTrue(); + link.Comment["en"].GetPlainText().Should().Be("british spelling"); + } + + [Fact] + public async Task AddVariant_SkipsDeletedTypes() + { + var (variantEntry, mainEntry) = await CreateEntryPair(); + var variantType = await fixture.Api.CreateVariantType(new VariantType { Id = Guid.NewGuid(), Name = new() { { "en", "doomed" } } }); + await fixture.Api.DeleteVariantType(variantType.Id); + + var variant = Variant.FromEntries(variantEntry, mainEntry) with { Types = [variantType] }; + await fixture.DataModel.AddChange(Guid.NewGuid(), new AddVariantChange(variant)); + + var link = (await fixture.Api.GetEntry(variantEntry.Id))!.VariantOf.Should().ContainSingle().Subject; + link.Types.Should().BeEmpty(); + } + + [Fact] + public async Task DeleteVariant() + { + var (variantEntry, mainEntry) = await CreateEntryPair(); + + await fixture.DataModel.AddChange(Guid.NewGuid(), new AddVariantChange(Variant.FromEntries(variantEntry, mainEntry))); + var link = (await fixture.Api.GetEntry(variantEntry.Id))!.VariantOf.Should().ContainSingle().Subject; + + await fixture.DataModel.AddChange(Guid.NewGuid(), new DeleteChange(link.Id)); + (await fixture.Api.GetEntry(variantEntry.Id))!.VariantOf.Should().BeEmpty(); + (await fixture.Api.GetEntry(mainEntry.Id))!.Variants.Should().BeEmpty(); + } + + [Fact] + public async Task DuplicateVariantsAreDeleted() + { + var (variantEntry, mainEntry) = await CreateEntryPair(); + + await fixture.DataModel.AddChange(Guid.NewGuid(), new AddVariantChange(Variant.FromEntries(variantEntry, mainEntry))); + await fixture.DataModel.AddChange(Guid.NewGuid(), new AddVariantChange(Variant.FromEntries(variantEntry, mainEntry))); + + var updatedVariantEntry = await fixture.Api.GetEntry(variantEntry.Id); + updatedVariantEntry.Should().NotBeNull(); + updatedVariantEntry!.VariantOf.Should().ContainSingle(v => v.MainEntryId == mainEntry.Id); + + var updatedMainEntry = await fixture.Api.GetEntry(mainEntry.Id); + updatedMainEntry.Should().NotBeNull(); + updatedMainEntry!.Variants.Should().ContainSingle(v => v.VariantEntryId == variantEntry.Id); + } + + [Fact] + public async Task SelfReferenceVariantIsDeleted() + { + var (variantEntry, _) = await CreateEntryPair(); + + await fixture.DataModel.AddChange(Guid.NewGuid(), + new AddVariantChange(new Variant { Id = Guid.NewGuid(), VariantEntryId = variantEntry.Id, MainEntryId = variantEntry.Id })); + + var updated = await fixture.Api.GetEntry(variantEntry.Id); + updated.Should().NotBeNull(); + updated!.VariantOf.Should().BeEmpty(); + updated.Variants.Should().BeEmpty(); + } + + [Fact] + public async Task AddVariantType() + { + var (variantEntry, mainEntry) = await CreateEntryPair(); + var variantType = await fixture.Api.CreateVariantType(new VariantType { Id = Guid.NewGuid(), Name = new() { { "en", "test" } } }); + + await fixture.DataModel.AddChange(Guid.NewGuid(), new AddVariantChange(Variant.FromEntries(variantEntry, mainEntry))); + var link = (await fixture.Api.GetEntry(variantEntry.Id))!.VariantOf.Single(); + + var change = new AddVariantTypeChange(link.Id, variantType); + await fixture.DataModel.AddChange(Guid.NewGuid(), change); + + link = (await fixture.Api.GetEntry(variantEntry.Id))!.VariantOf.Single(); + link.Types.Should().ContainSingle().Which.Id.Should().Be(variantType.Id); + } + + [Fact] + public async Task RemoveVariantType() + { + var (variantEntry, mainEntry) = await CreateEntryPair(); + var variantType = await fixture.Api.CreateVariantType(new VariantType { Id = Guid.NewGuid(), Name = new() { { "en", "test" } } }); + + await fixture.DataModel.AddChange(Guid.NewGuid(), new AddVariantChange(Variant.FromEntries(variantEntry, mainEntry) with { Types = [variantType] })); + var link = (await fixture.Api.GetEntry(variantEntry.Id))!.VariantOf.Single(); + link.Types.Should().ContainSingle(); + + await fixture.DataModel.AddChange(Guid.NewGuid(), new RemoveVariantTypeChange(link.Id, variantType.Id)); + + link = (await fixture.Api.GetEntry(variantEntry.Id))!.VariantOf.Single(); + link.Types.Should().BeEmpty(); + } + + [Fact] + public async Task DeletingVariantTypeRemovesItFromLinks() + { + var (variantEntry, mainEntry) = await CreateEntryPair(); + var variantType = await fixture.Api.CreateVariantType(new VariantType { Id = Guid.NewGuid(), Name = new() { { "en", "test" } } }); + + await fixture.DataModel.AddChange(Guid.NewGuid(), new AddVariantChange(Variant.FromEntries(variantEntry, mainEntry) with { Types = [variantType] })); + await fixture.DataModel.AddChange(Guid.NewGuid(), new DeleteChange(variantType.Id)); + + var link = (await fixture.Api.GetEntry(variantEntry.Id))!.VariantOf.Should().ContainSingle().Subject; + link.DeletedAt.Should().BeNull("deleting a type must not delete the link"); + link.Types.Should().BeEmpty(); + } + + [Fact] + public async Task DeletingMainEntryDeletesTheLink() + { + var (variantEntry, mainEntry) = await CreateEntryPair(); + await fixture.DataModel.AddChange(Guid.NewGuid(), new AddVariantChange(Variant.FromEntries(variantEntry, mainEntry))); + + await fixture.DataModel.AddChange(Guid.NewGuid(), new DeleteChange(mainEntry.Id)); + + var updatedVariantEntry = await fixture.Api.GetEntry(variantEntry.Id); + updatedVariantEntry.Should().NotBeNull("only the link dies, not the variant entry"); + updatedVariantEntry!.VariantOf.Should().BeEmpty(); + } + + [Fact] + public async Task DeletingVariantEntryDeletesTheLink() + { + var (variantEntry, mainEntry) = await CreateEntryPair(); + await fixture.DataModel.AddChange(Guid.NewGuid(), new AddVariantChange(Variant.FromEntries(variantEntry, mainEntry))); + + await fixture.DataModel.AddChange(Guid.NewGuid(), new DeleteChange(variantEntry.Id)); + + var updatedMainEntry = await fixture.Api.GetEntry(mainEntry.Id); + updatedMainEntry.Should().NotBeNull("only the link dies, not the main entry"); + updatedMainEntry!.Variants.Should().BeEmpty(); + } + + [Fact] + public async Task DeletingTargetSenseDeletesTheLink() + { + var (variantEntry, mainEntry) = await CreateEntryPair(); + var sense = await fixture.Api.CreateSense(mainEntry.Id, new Sense { Id = Guid.NewGuid(), Gloss = { { "en", "target" } } }); + await fixture.DataModel.AddChange(Guid.NewGuid(), new AddVariantChange(Variant.FromEntries(variantEntry, mainEntry, sense.Id))); + + await fixture.Api.DeleteSense(mainEntry.Id, sense.Id); + + (await fixture.Api.GetEntry(variantEntry.Id))!.VariantOf.Should().BeEmpty(); + (await fixture.Api.GetEntry(mainEntry.Id))!.Variants.Should().BeEmpty(); + } +} diff --git a/backend/FwLite/LcmCrdt.Tests/Data/MigrationTests.cs b/backend/FwLite/LcmCrdt.Tests/Data/MigrationTests.cs index b8c985e6c4..24e979e04f 100644 --- a/backend/FwLite/LcmCrdt.Tests/Data/MigrationTests.cs +++ b/backend/FwLite/LcmCrdt.Tests/Data/MigrationTests.cs @@ -164,6 +164,9 @@ await api.GetComplexFormTypes() await api.GetMorphTypes() .OrderBy(m => m.Id) .ToArrayAsync(), + await api.GetVariantTypes() + .OrderBy(v => v.Id) + .ToArrayAsync(), await api.GetWritingSystems()); } diff --git a/backend/FwLite/LcmCrdt.Tests/Data/MigrationTests_FromScriptedDb.v1.ProjectSnapshot.verified.txt b/backend/FwLite/LcmCrdt.Tests/Data/MigrationTests_FromScriptedDb.v1.ProjectSnapshot.verified.txt index 51798c24e9..64a5a30f0b 100644 --- a/backend/FwLite/LcmCrdt.Tests/Data/MigrationTests_FromScriptedDb.v1.ProjectSnapshot.verified.txt +++ b/backend/FwLite/LcmCrdt.Tests/Data/MigrationTests_FromScriptedDb.v1.ProjectSnapshot.verified.txt @@ -70,6 +70,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [] } ], @@ -166,6 +168,7 @@ } ], "MorphTypes": [], + "VariantTypes": [], "WritingSystems": { "Analysis": [ { diff --git a/backend/FwLite/LcmCrdt.Tests/Data/MigrationTests_FromScriptedDb.v1.Snapshots.verified.txt b/backend/FwLite/LcmCrdt.Tests/Data/MigrationTests_FromScriptedDb.v1.Snapshots.verified.txt index 54ae3b7d2e..90d6a2b57c 100644 --- a/backend/FwLite/LcmCrdt.Tests/Data/MigrationTests_FromScriptedDb.v1.Snapshots.verified.txt +++ b/backend/FwLite/LcmCrdt.Tests/Data/MigrationTests_FromScriptedDb.v1.Snapshots.verified.txt @@ -77,6 +77,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [] }, "Id": "b802e01f-fac1-42b8-b605-a5bbb7efcdc1", diff --git a/backend/FwLite/LcmCrdt.Tests/Data/MigrationTests_FromScriptedDb.v2.ProjectSnapshot.verified.txt b/backend/FwLite/LcmCrdt.Tests/Data/MigrationTests_FromScriptedDb.v2.ProjectSnapshot.verified.txt index c25af14c52..493e75ff38 100644 --- a/backend/FwLite/LcmCrdt.Tests/Data/MigrationTests_FromScriptedDb.v2.ProjectSnapshot.verified.txt +++ b/backend/FwLite/LcmCrdt.Tests/Data/MigrationTests_FromScriptedDb.v2.ProjectSnapshot.verified.txt @@ -164,6 +164,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [] }, { @@ -248,6 +250,8 @@ ], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [] }, { @@ -320,6 +324,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [] }, { @@ -392,6 +398,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [] } ], @@ -488,6 +496,7 @@ } ], "MorphTypes": [], + "VariantTypes": [], "WritingSystems": { "Analysis": [ { diff --git a/backend/FwLite/LcmCrdt.Tests/Data/MigrationTests_FromScriptedDb.v2.Snapshots.verified.txt b/backend/FwLite/LcmCrdt.Tests/Data/MigrationTests_FromScriptedDb.v2.Snapshots.verified.txt index fea2fb4e3e..7a8a7c489d 100644 --- a/backend/FwLite/LcmCrdt.Tests/Data/MigrationTests_FromScriptedDb.v2.Snapshots.verified.txt +++ b/backend/FwLite/LcmCrdt.Tests/Data/MigrationTests_FromScriptedDb.v2.Snapshots.verified.txt @@ -107,6 +107,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [] }, "Id": "00edefeb-173e-45cd-836c-eea2ba514429", @@ -152,6 +154,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [] }, "Id": "00edefeb-173e-45cd-836c-eea2ba514429", @@ -198,6 +202,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [] }, "Id": "00edefeb-173e-45cd-836c-eea2ba514429", @@ -252,6 +258,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [] }, "Id": "00edefeb-173e-45cd-836c-eea2ba514429", @@ -314,6 +322,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [] }, "Id": "00edefeb-173e-45cd-836c-eea2ba514429", @@ -385,6 +395,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [] }, "Id": "00edefeb-173e-45cd-836c-eea2ba514429", @@ -429,6 +441,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [] }, "Id": "75050583-70d7-4605-a6e6-872b8f36c482", @@ -473,6 +487,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [] }, "Id": "9e84db09-1885-4bbb-9482-4891a46f6f49", @@ -517,6 +533,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [] }, "Id": "d9f70cf9-a479-4141-92e5-44155d063da2", diff --git a/backend/FwLite/LcmCrdt.Tests/Data/SnapshotDeserializationRegressionData.latest.verified.txt b/backend/FwLite/LcmCrdt.Tests/Data/SnapshotDeserializationRegressionData.latest.verified.txt index b7e45c5eb4..a5a070732d 100644 --- a/backend/FwLite/LcmCrdt.Tests/Data/SnapshotDeserializationRegressionData.latest.verified.txt +++ b/backend/FwLite/LcmCrdt.Tests/Data/SnapshotDeserializationRegressionData.latest.verified.txt @@ -88,11 +88,346 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [] }, "Id": "8f403ae3-9859-4a74-a52d-3c0736bb5917", "DeletedAt": null }, + { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "2e6a7e6c-7abf-cd99-94b0-80c04d315d98", + "DeletedAt": null, + "LexemeForm": { + "xbn": "Direct", + "hla": "Soft" + }, + "CitationForm": { + "mxb": "Money Market Account", + "lkb": "payment" + }, + "LiteralMeaning": { + "ong": { + "Spans": [ + { + "Text": "reciprocal", + "Ws": "ong", + "Tags": [ + "ea0639e3-938a-40fa-b8dd-da4672d64210" + ] + } + ] + }, + "kxu": { + "Spans": [ + { + "Text": "invoice", + "Ws": "kxu", + "Tags": [ + "42b03468-0642-407f-a3d8-eea36bfc95a0" + ] + }, + { + "Text": "Outdoors \u0026 Shoes", + "Ws": "kxu", + "Tags": [ + "3ad34dad-b720-427c-9dd0-6090c5d6a5c6" + ] + }, + { + "Text": "feed", + "Ws": "kxu", + "Tags": [ + "b912d284-481e-48de-a9b4-870a5e285a08" + ] + }, + { + "Text": "SMTP", + "Ws": "kxu", + "Tags": [ + "0d3c4aa2-a3b3-4871-bf66-8406e5e8ec3c" + ] + } + ] + }, + "ihi": { + "Spans": [ + { + "Text": "generate", + "Ws": "wwb", + "Bold": "Off", + "FontSize": 1075171932, + "ForeColor": "#ADFF2F", + "Tags": [ + "422d0492-d48e-0c65-b609-1690caad3603" + ] + }, + { + "Text": "synergistic", + "Ws": "ihi", + "Tags": [ + "dacf7482-f6ec-4ac3-9a30-9c105833df66" + ] + }, + { + "Text": "Computers", + "Ws": "ihi", + "Tags": [ + "41ca560f-1ae7-41d1-a37d-c4faf18b0b58" + ] + } + ] + } + }, + "MorphType": "Simulfix", + "HomographNumber": -1674377933, + "Senses": [], + "Note": { + "xuo": { + "Spans": [ + { + "Text": "Security", + "Ws": "gin", + "Bold": "Off", + "FontSize": 1340465988, + "ForeColor": "#ADFF2F", + "Tags": [ + "5879c653-6e26-d703-ce85-9ca519ef0bcb" + ] + }, + { + "Text": "calculating", + "Ws": "xuo", + "Tags": [ + "072c66e5-b950-45f4-b7e7-b70e4e279ecf" + ] + } + ] + } + }, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [ + { + "Id": "3aca6492-07a4-3de2-e2c6-aba408f397bb", + "Name": { + "vmd": "reboot", + "duk": "invoice", + "ium": "Practical Plastic Towels", + "kxr": "withdrawal" + }, + "DeletedAt": null + } + ], + "VariantOf": [ + { + "Id": "4c619f87-442f-23b4-2983-41412a7ffe95", + "MaybeId": "4c619f87-442f-23b4-2983-41412a7ffe95", + "DeletedAt": null, + "VariantEntryId": "81176034-5b4d-85c1-2a47-04f8176759bd", + "VariantHeadword": "Wall", + "MainEntryId": "d93de12e-07f9-4f2f-8954-190e2abe06e9", + "MainSenseId": "96e31a4a-bbee-996b-759c-5187b29cfa7f", + "MainHeadword": "Tasty Soft Salad", + "Types": [ + { + "Id": "99ab5593-63d1-ca4f-b979-d5e1af87d1ea", + "Name": { + "mok": "El Salvador", + "trx": "Coordinator", + "duc": "lime", + "xua": "cross-platform" + }, + "DeletedAt": null + } + ], + "HideMinorEntry": true, + "Comment": { + "gew": { + "Spans": [ + { + "Text": "program", + "Ws": "gew", + "Tags": [ + "cc0c91a9-eea7-4948-8990-cc07a570056d" + ] + }, + { + "Text": "Denmark", + "Ws": "gew", + "Tags": [ + "dc29b510-b94d-4eb6-af91-0903deea2fc6" + ] + }, + { + "Text": "invoice", + "Ws": "gew", + "Tags": [ + "29a99076-1ccb-4b95-9beb-338ad843962f" + ] + } + ] + }, + "nik": { + "Spans": [ + { + "Text": "synthesize", + "Ws": "nik", + "Tags": [ + "6f54f2fd-e638-403d-9735-16257878b92a" + ] + }, + { + "Text": "Multi-lateral", + "Ws": "nik", + "Tags": [ + "4d67e4b7-1604-4262-afd4-af42580aa1b5" + ] + } + ] + }, + "aeq": { + "Spans": [ + { + "Text": "Rustic", + "Ws": "ojp", + "Bold": "Off", + "FontSize": -1057944399, + "ForeColor": "#A52A2A", + "Tags": [ + "e454379a-dbba-1d27-58b0-45d4b40b6742" + ] + } + ] + } + } + } + ], + "Variants": [ + { + "Id": "86a01a92-d1aa-d020-4806-f4f7472b56d3", + "MaybeId": "86a01a92-d1aa-d020-4806-f4f7472b56d3", + "DeletedAt": null, + "VariantEntryId": "0a076330-b823-c5f3-092f-7df61125a364", + "VariantHeadword": "Dynamic", + "MainEntryId": "5cc279a5-baa9-1049-c88c-f2bde24e2531", + "MainSenseId": "587131ac-caff-2f98-9279-8fb32b29fed6", + "MainHeadword": "Communications", + "Types": [ + { + "Id": "66c9952f-5b85-39fd-e4f9-cdcc1c69273c", + "Name": { + "nlk": "copy" + }, + "DeletedAt": null + } + ], + "HideMinorEntry": false, + "Comment": { + "mdp": { + "Spans": [ + { + "Text": "Jewelery", + "Ws": "eri", + "Bold": "On", + "FontSize": -1242542580, + "ForeColor": "#ADFF2F", + "Tags": [ + "89d044a5-c286-2b2b-1682-64d47fc7d4bf" + ] + }, + { + "Text": "methodologies", + "Ws": "aba", + "Bold": "On", + "FontSize": 110774510, + "ForeColor": "#A52A2A", + "Tags": [ + "d744100f-a080-0581-82db-f7d2344df273" + ] + } + ] + }, + "xkg": { + "Spans": [ + { + "Text": "Intelligent Rubber Pizza", + "Ws": "xkg", + "Tags": [ + "c648d2fd-77c1-4a80-90f7-67e4da636439" + ] + } + ] + }, + "cpg": { + "Spans": [ + { + "Text": "calculating", + "Ws": "cpg", + "Tags": [ + "31ebc98f-9179-4edc-9e89-7c4711220151" + ] + } + ] + }, + "ify": { + "Spans": [ + { + "Text": "olive", + "Ws": "ify", + "Tags": [ + "6b281f29-55b9-4f4c-bf31-945fc1f12407" + ] + }, + { + "Text": "Granite", + "Ws": "agz", + "Bold": "On", + "FontSize": -1607886368, + "ForeColor": "#A52A2A", + "Tags": [ + "674f1746-1295-ea46-3a8a-24375fc1dca7" + ] + }, + { + "Text": "Sleek Rubber Hat", + "Ws": "ify", + "Tags": [ + "2b5777aa-eb2a-4291-aef7-bd714ca05900" + ] + }, + { + "Text": "reboot", + "Ws": "nsw", + "Bold": "Invert", + "FontSize": -1160287576, + "ForeColor": "#00FFFF", + "Tags": [ + "e3ad9b6e-8b58-187e-d876-e40a78e36968" + ] + } + ] + } + } + } + ], + "PublishIn": [ + { + "Id": "ee0b6860-87ac-709a-aa8c-0f20b06efa0b", + "DeletedAt": null, + "IsMain": false, + "Name": { + "amf": "Refined" + } + } + ] + }, + "Id": "2e6a7e6c-7abf-cd99-94b0-80c04d315d98", + "DeletedAt": null + }, { "$type": "MiniLcmCrdtAdapter", "Obj": { @@ -187,6 +522,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "ec21b4b7-3861-38d4-bc7b-fe77bd2321c2", @@ -205,184 +542,2061 @@ "$type": "MiniLcmCrdtAdapter", "Obj": { "$type": "Entry", - "Id": "82cf7254-3a4f-497a-9e15-7d93fc830356", - "DeletedAt": null, - "LexemeForm": { - "en": "\uD83C\uDF4C", - "th": "\u0E01\u0E25\u0E49\u0E27\u0E22" - }, - "CitationForm": {}, - "LiteralMeaning": { - "en": { - "Spans": [ - { - "Text": "yellow fruit that comes in bunches.", - "Ws": "en" - } - ] - } - }, - "MorphType": "Stem", - "HomographNumber": 0, - "Senses": [], - "Note": { - "en": { - "Spans": [ - { - "Text": "often used in cartoon gags for slipping", - "Ws": "en" - } - ] - } - }, - "Components": [], - "ComplexForms": [], - "ComplexFormTypes": [], - "PublishIn": [] - }, - "Id": "82cf7254-3a4f-497a-9e15-7d93fc830356", - "DeletedAt": null - }, - { - "$type": "MiniLcmCrdtAdapter", - "Obj": { - "$type": "Entry", - "Id": "8dbc0f41-998e-836a-97e1-f05d46d95c92", + "Id": "a9cd7853-c982-5959-3186-ec248d8d41de", "DeletedAt": null, "LexemeForm": { - "mqs": "maximized" + "cnl": "hard drive", + "all": "Taiwan" }, "CitationForm": { - "nrz": "Portugal" + "pam": "District" }, "LiteralMeaning": { - "juy": { + "ama": { "Spans": [ { - "Text": "Kyat", - "Ws": "juy", + "Text": "Sleek", + "Ws": "bbd", + "Bold": "Invert", + "FontSize": -85638709, + "ForeColor": "#ADFF2F", "Tags": [ - "bc47798c-6e35-430e-a94a-2d1aa82d9119" + "52197334-e928-b0cc-8914-ee3cca6d000e" ] }, { - "Text": "synthesize", - "Ws": "juy", + "Text": "Personal Loan Account", + "Ws": "ama", "Tags": [ - "75fc659a-ae47-45ec-87a8-2475d5667496" + "c6badbfd-0430-4245-b1f3-6dbfc3cf5ced" ] - } - ] - }, - "rer": { + }, + { + "Text": "Wooden", + "Ws": "fgr", + "Bold": "Invert", + "FontSize": -1658278656, + "ForeColor": "#A52A2A", + "Tags": [ + "99c5aa5c-271c-d860-b815-a713850e4403" + ] + } + ] + }, + "jaj": { "Spans": [ { - "Text": "Licensed", - "Ws": "rer", + "Text": "connect", + "Ws": "noi", + "Bold": "Off", + "FontSize": -1470543244, + "ForeColor": "#FF0000", "Tags": [ - "adf734b1-3abb-4644-a5b7-e712c29a59e6" + "87c38be9-027c-83c7-cb99-59210e09f3d8" ] }, { - "Text": "architectures", - "Ws": "dos", + "Text": "streamline", + "Ws": "jaj", + "Tags": [ + "c49682bf-c285-4acf-9a3e-f6cb391b184b" + ] + }, + { + "Text": "Bedfordshire", + "Ws": "xcw", + "Bold": "Invert", + "FontSize": 1053195674, + "ForeColor": "#FF0000", + "Tags": [ + "f0ab79c7-ddff-63a0-1746-2825fd24206e" + ] + } + ] + } + }, + "MorphType": "Suffix", + "HomographNumber": 996368112, + "Senses": [], + "Note": { + "nrb": { + "Spans": [ + { + "Text": "blockchains", + "Ws": "nrb", + "Tags": [ + "b62b9429-69ad-4f80-a66b-b3678383663b" + ] + }, + { + "Text": "Ergonomic Soft Shoes", + "Ws": "jac", "Bold": "On", - "FontSize": -1392951304, + "FontSize": -1052383363, + "ForeColor": "#A52A2A", + "Tags": [ + "a9a9dec9-08cc-2c34-a5ca-cf78d1107839" + ] + }, + { + "Text": "Tasty", + "Ws": "nrb", + "Tags": [ + "462f2665-8c79-4f7f-be99-86a100958929" + ] + }, + { + "Text": "Shoes", + "Ws": "khr", + "Bold": "Invert", + "FontSize": 492536191, "ForeColor": "#ADFF2F", "Tags": [ - "b316a4f4-208a-e75f-13f0-09a91a2b3506" + "27770394-7f08-6701-ac8a-e78f75048a9b" ] } ] }, - "zpa": { + "cky": { "Spans": [ { - "Text": "Concrete", - "Ws": "zpa", + "Text": "Auto Loan Account", + "Ws": "cky", "Tags": [ - "10cb16c2-6f15-4101-8689-7c77e6576f52" + "d864c261-66c8-4887-94ec-32d891358f72" ] }, { - "Text": "Shoals", - "Ws": "cjy", + "Text": "Montana", + "Ws": "cky", + "Tags": [ + "4562dc77-f99d-4de1-b832-cd8473543713" + ] + }, + { + "Text": "optimal", + "Ws": "avt", "Bold": "Invert", - "FontSize": -437265941, + "FontSize": 212594793, + "ForeColor": "#00FFFF", + "Tags": [ + "8bbd2e0e-13a5-b378-3193-a1a9498f4a1d" + ] + } + ] + }, + "aqp": { + "Spans": [ + { + "Text": "cross-platform", + "Ws": "wbq", + "Bold": "On", + "FontSize": -1898908819, "ForeColor": "#ADFF2F", "Tags": [ - "53cd8e2b-15c6-0490-70d6-738a6708b9ca" + "1a98d7cc-742b-9e51-64e8-4849f6811d32" ] } ] } }, - "MorphType": "BoundStem", + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [ + { + "Id": "bfea70b0-ebd5-86d8-ecfc-9ad4facfd9ca", + "Name": { + "aoe": "bypass" + }, + "DeletedAt": null + } + ], + "VariantOf": [ + { + "Id": "54c228d3-10b3-20c2-d7e6-38cbb280740c", + "MaybeId": "54c228d3-10b3-20c2-d7e6-38cbb280740c", + "DeletedAt": null, + "VariantEntryId": "d141258e-c100-a4fb-c1cd-63b059ddfb62", + "VariantHeadword": "Corporate", + "MainEntryId": "fc6512ab-e796-7a71-da3d-5c3edb7b3b10", + "MainSenseId": "43bf7d1b-292e-ba0c-9e10-56d4229036af", + "MainHeadword": "Chief", + "Types": [ + { + "Id": "766ce347-e58e-c772-7e7c-ec5332c5b48b", + "Name": { + "bhh": "Avon" + }, + "DeletedAt": null + } + ], + "HideMinorEntry": false, + "Comment": { + "iry": { + "Spans": [ + { + "Text": "Practical Cotton Pants", + "Ws": "iry", + "Tags": [ + "49a57a3f-8891-49be-8487-9bbd4f399f84" + ] + } + ] + } + } + } + ], + "Variants": [ + { + "Id": "5b9c87d1-f228-81fd-e6fc-463b4ed48bb6", + "MaybeId": "5b9c87d1-f228-81fd-e6fc-463b4ed48bb6", + "DeletedAt": null, + "VariantEntryId": "a50a0851-684a-795c-5f22-8275682b0caa", + "VariantHeadword": "Lead", + "MainEntryId": "b26c4da8-08fe-9bf7-5ceb-6538be2ad689", + "MainSenseId": "710bd056-4f07-0627-407d-e744ffb759c3", + "MainHeadword": "Fantastic Fresh Shirt", + "Types": [ + { + "Id": "d5886872-d109-8e7c-21f0-aaac0e8efe15", + "Name": { + "ett": "Berkshire", + "gbn": "Rubber", + "suw": "payment", + "xtu": "paradigm" + }, + "DeletedAt": null + } + ], + "HideMinorEntry": true, + "Comment": { + "mls": { + "Spans": [ + { + "Text": "architect", + "Ws": "chl", + "Bold": "Off", + "FontSize": 1325800089, + "ForeColor": "#A52A2A", + "Tags": [ + "3ca232e9-ef03-a7c3-d5b1-75f06befc75c" + ] + }, + { + "Text": "Executive", + "Ws": "mls", + "Tags": [ + "b0c2ea57-6dac-4d6e-8146-c5d383587416" + ] + }, + { + "Text": "Unbranded", + "Ws": "mls", + "Tags": [ + "442f2eb4-936b-415b-807b-f0556f2f7ec5" + ] + } + ] + }, + "ibm": { + "Spans": [ + { + "Text": "override", + "Ws": "ibm", + "Tags": [ + "f9d5659d-2e1e-48cf-bee6-0f1453705837" + ] + }, + { + "Text": "Virginia", + "Ws": "ibm", + "Tags": [ + "ef5e05cf-c1ed-4497-a243-ad1e3365c5d1" + ] + } + ] + }, + "wac": { + "Spans": [ + { + "Text": "Avon", + "Ws": "gwa", + "Bold": "Invert", + "FontSize": 279365784, + "ForeColor": "#A52A2A", + "Tags": [ + "770c6ac7-0a37-293a-fcdb-cbd7d402f71b" + ] + }, + { + "Text": "initiatives", + "Ws": "wac", + "Tags": [ + "a99c4e9b-95a0-490d-89c0-13200670d310" + ] + } + ] + }, + "tl": { + "Spans": [ + { + "Text": "back up", + "Ws": "tl", + "Tags": [ + "cad367a0-ba3c-412d-b5aa-19db5f5d7037" + ] + } + ] + } + } + } + ], + "PublishIn": [ + { + "Id": "dc1d47e6-1a02-204d-923f-c8cb761a7e36", + "DeletedAt": null, + "IsMain": false, + "Name": { + "gra": "Tennessee" + } + } + ] + }, + "Id": "a9cd7853-c982-5959-3186-ec248d8d41de", + "DeletedAt": null + }, + { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "82cf7254-3a4f-497a-9e15-7d93fc830356", + "DeletedAt": null, + "LexemeForm": { + "en": "\uD83C\uDF4C", + "th": "\u0E01\u0E25\u0E49\u0E27\u0E22" + }, + "CitationForm": {}, + "LiteralMeaning": { + "en": { + "Spans": [ + { + "Text": "yellow fruit that comes in bunches.", + "Ws": "en" + } + ] + } + }, + "MorphType": "Stem", "HomographNumber": 0, "Senses": [], "Note": { - "rkw": { + "en": { "Spans": [ { - "Text": "XML", - "Ws": "vot", - "Bold": "On", - "FontSize": -1698959192, + "Text": "often used in cartoon gags for slipping", + "Ws": "en" + } + ] + } + }, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], + "PublishIn": [] + }, + "Id": "82cf7254-3a4f-497a-9e15-7d93fc830356", + "DeletedAt": null + }, + { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "3cdafca5-46e6-60ed-0b8a-e302d40f7ab8", + "DeletedAt": null, + "LexemeForm": { + "pkt": "reboot" + }, + "CitationForm": { + "bqw": "Auto Loan Account", + "myq": "1080p", + "ula": "Director", + "xwg": "Toys \u0026 Kids" + }, + "LiteralMeaning": { + "hav": { + "Spans": [ + { + "Text": "system", + "Ws": "hav", + "Tags": [ + "1d22ad30-96dc-47c3-a7f8-761b3d830b25" + ] + }, + { + "Text": "front-end", + "Ws": "mnw", + "Bold": "Off", + "FontSize": 1230763621, + "ForeColor": "#00000000", + "Tags": [ + "fd1b73bd-ad1b-a20d-c981-905c8823e12c" + ] + }, + { + "Text": "Stream", + "Ws": "bve", + "Bold": "Off", + "FontSize": 621343644, "ForeColor": "#ADFF2F", "Tags": [ - "9218c79b-f453-0ef3-de05-ea5eeba26367" + "aaeeb616-fd0d-f67d-7738-b0d39c4c9512" ] }, { - "Text": "invoice", - "Ws": "rkw", + "Text": "Electronics", + "Ws": "aiy", + "Bold": "Invert", + "FontSize": 39794053, + "ForeColor": "#A52A2A", "Tags": [ - "6ef3cf72-b5a5-488c-9381-fb7a7f6f961e" + "7e50c044-9786-1e39-a9ac-92d54342ac3e" + ] + } + ] + }, + "dyr": { + "Spans": [ + { + "Text": "extend", + "Ws": "kve", + "Bold": "Invert", + "FontSize": -422062800, + "ForeColor": "#00FFFF", + "Tags": [ + "b6172c2b-3580-8f98-81c5-4789bb11e455" ] }, { - "Text": "bypass", - "Ws": "rkw", + "Text": "synthesizing", + "Ws": "aja", + "Bold": "Invert", + "FontSize": 1174438189, + "ForeColor": "#00000000", "Tags": [ - "e615bb12-61d9-452e-bac5-06deb6942851" + "41548c3d-3532-3798-84aa-9d40adf93824" ] } ] }, - "kee": { + "pea": { "Spans": [ { - "Text": "Money Market Account", - "Ws": "ekp", - "Bold": "On", - "FontSize": -315220510, - "ForeColor": "#A52A2A", + "Text": "back-end", + "Ws": "pea", + "Tags": [ + "3cb309a7-8115-4482-bfdc-ac8f257eb4ad" + ] + } + ] + } + }, + "MorphType": "Particle", + "HomographNumber": -762509614, + "Senses": [], + "Note": { + "mda": { + "Spans": [ + { + "Text": "frictionless", + "Ws": "mda", + "Tags": [ + "2c0851ea-e5be-41d5-b49e-cf8fec10c89c" + ] + }, + { + "Text": "collaborative", + "Ws": "prb", + "Bold": "Off", + "FontSize": -1566428427, + "ForeColor": "#00FFFF", + "Tags": [ + "c1c64703-55b8-e014-a74d-a979ac3d8e02" + ] + }, + { + "Text": "Congo", + "Ws": "mda", + "Tags": [ + "e48be2ae-71b7-45d7-a57f-358267cfff47" + ] + } + ] + }, + "kyx": { + "Spans": [ + { + "Text": "web-enabled", + "Ws": "sgh", + "Bold": "Off", + "FontSize": 1542390070, + "ForeColor": "#00FFFF", + "Tags": [ + "b23f7a6a-1857-cb51-3aa5-6694483629fe" + ] + }, + { + "Text": "back-end", + "Ws": "npl", + "Bold": "On", + "FontSize": -1671856556, + "ForeColor": "#0000FF", + "Tags": [ + "4304b005-673b-15e7-1b73-a16c7e107d62" + ] + } + ] + } + }, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [ + { + "Id": "ccfdf2a2-ac60-433a-41ea-22b4ffff2d4b", + "Name": { + "gno": "Massachusetts" + }, + "DeletedAt": null + } + ], + "VariantOf": [ + { + "Id": "9db32aab-3ce1-a8e8-3ed9-cf3b240f6968", + "MaybeId": "9db32aab-3ce1-a8e8-3ed9-cf3b240f6968", + "DeletedAt": null, + "VariantEntryId": "6d4179be-9789-faa0-a60d-0124b5e6aedc", + "VariantHeadword": "purple", + "MainEntryId": "36b6909e-b5e9-397d-05d4-1dbae22ec50a", + "MainSenseId": "266fba93-8a74-c0b3-ca71-65164b008f52", + "MainHeadword": "convergence", + "Types": [ + { + "Id": "54162871-9d18-ad79-b155-ce2f98f97265", + "Name": { + "bwh": "back up", + "xba": "reinvent", + "aza": "Mews" + }, + "DeletedAt": null + } + ], + "HideMinorEntry": false, + "Comment": { + "niz": { + "Spans": [ + { + "Text": "alarm", + "Ws": "niz", + "Tags": [ + "8cf34d1a-b942-4794-a42d-568e56fb1249" + ] + }, + { + "Text": "Manager", + "Ws": "niz", + "Tags": [ + "749f132e-5b62-42b7-86ff-059a2a4fcd5e" + ] + }, + { + "Text": "Madagascar", + "Ws": "ktw", + "Bold": "Off", + "FontSize": -1245901176, + "ForeColor": "#00FFFF", + "Tags": [ + "f002ec10-2a72-7416-f135-278e82c48b14" + ] + }, + { + "Text": "Fresh", + "Ws": "niz", + "Tags": [ + "4257831c-6cf6-445c-bdfc-d2e10c6546fc" + ] + } + ] + }, + "pmz": { + "Spans": [ + { + "Text": "Realigned", + "Ws": "mzi", + "Bold": "Invert", + "FontSize": -208583590, + "ForeColor": "#00FFFF", + "Tags": [ + "946afd05-dfdd-48cf-6615-a55dbc30ce72" + ] + }, + { + "Text": "Optimized", + "Ws": "pmz", + "Tags": [ + "c14fd0d8-9f8f-4d81-b40e-0dc89703b261" + ] + } + ] + }, + "khr": { + "Spans": [ + { + "Text": "knowledge user", + "Ws": "mlc", + "Bold": "Off", + "FontSize": 81689857, + "ForeColor": "#ADFF2F", + "Tags": [ + "8a91586b-d2a7-c062-8089-300cf9e5b686" + ] + }, + { + "Text": "Trail", + "Ws": "khr", + "Tags": [ + "e75ec01a-e52c-4e30-b929-ad09a709fd7f" + ] + }, + { + "Text": "Metrics", + "Ws": "khr", + "Tags": [ + "f1c8ab11-3d04-484b-83aa-b473de8ce350" + ] + } + ] + } + } + } + ], + "Variants": [ + { + "Id": "9a6a68d5-58a6-81c0-ab95-e365558ee35a", + "MaybeId": "9a6a68d5-58a6-81c0-ab95-e365558ee35a", + "DeletedAt": null, + "VariantEntryId": "7618d904-0761-ab81-ba1c-853b9401d1d5", + "VariantHeadword": "interfaces", + "MainEntryId": "ccc647fd-fca5-9c93-d296-43f13c223506", + "MainSenseId": "90f4721d-d38c-497f-955b-955acb2499f4", + "MainHeadword": "Fresh", + "Types": [ + { + "Id": "aa41d766-846e-2d53-cebd-50ca612bd6de", + "Name": { + "pxm": "magenta", + "lmi": "database" + }, + "DeletedAt": null + } + ], + "HideMinorEntry": false, + "Comment": { + "gcl": { + "Spans": [ + { + "Text": "Refined Rubber Sausages", + "Ws": "cmt", + "Bold": "Off", + "FontSize": -430354912, + "ForeColor": "#00FFFF", + "Tags": [ + "19fbeff0-b9b2-dbc0-83c0-18af65ac176d" + ] + }, + { + "Text": "Bedfordshire", + "Ws": "ald", + "Bold": "On", + "FontSize": -605772228, + "ForeColor": "#0000FF", + "Tags": [ + "ea667bb7-8cd0-872e-aff4-6534377ff096" + ] + }, + { + "Text": "Director", + "Ws": "gcl", + "Tags": [ + "45b61b57-989d-41f8-9ffd-ff957f611934" + ] + }, + { + "Text": "Generic Rubber Chicken", + "Ws": "omp", + "Bold": "On", + "FontSize": 1234054480, + "ForeColor": "#ADFF2F", + "Tags": [ + "93241b11-508c-6711-2e9f-99d55ed4c489" + ] + } + ] + }, + "sdu": { + "Spans": [ + { + "Text": "e-services", + "Ws": "sdu", + "Tags": [ + "69d83464-b127-45a3-8e80-1f12c6414995" + ] + }, + { + "Text": "rich", + "Ws": "psy", + "Bold": "Invert", + "FontSize": 425981535, + "ForeColor": "#A52A2A", + "Tags": [ + "cb4eafe1-71dc-53cf-e8d1-87fee8792d65" + ] + }, + { + "Text": "Cote d\u0027Ivoire", + "Ws": "gyi", + "Bold": "Off", + "FontSize": -802216504, + "ForeColor": "#ADFF2F", + "Tags": [ + "3be90aaa-fb8b-21c8-f217-daa170c8d4f6" + ] + } + ] + } + } + } + ], + "PublishIn": [ + { + "Id": "d2892b2c-fc81-8c2f-5586-baa81b6d1530", + "DeletedAt": null, + "IsMain": false, + "Name": { + "mnj": "Plastic" + } + } + ] + }, + "Id": "3cdafca5-46e6-60ed-0b8a-e302d40f7ab8", + "DeletedAt": null + }, + { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "8dbc0f41-998e-836a-97e1-f05d46d95c92", + "DeletedAt": null, + "LexemeForm": { + "mqs": "maximized" + }, + "CitationForm": { + "nrz": "Portugal" + }, + "LiteralMeaning": { + "juy": { + "Spans": [ + { + "Text": "Kyat", + "Ws": "juy", + "Tags": [ + "bc47798c-6e35-430e-a94a-2d1aa82d9119" + ] + }, + { + "Text": "synthesize", + "Ws": "juy", + "Tags": [ + "75fc659a-ae47-45ec-87a8-2475d5667496" + ] + } + ] + }, + "rer": { + "Spans": [ + { + "Text": "Licensed", + "Ws": "rer", + "Tags": [ + "adf734b1-3abb-4644-a5b7-e712c29a59e6" + ] + }, + { + "Text": "architectures", + "Ws": "dos", + "Bold": "On", + "FontSize": -1392951304, + "ForeColor": "#ADFF2F", + "Tags": [ + "b316a4f4-208a-e75f-13f0-09a91a2b3506" + ] + } + ] + }, + "zpa": { + "Spans": [ + { + "Text": "Concrete", + "Ws": "zpa", + "Tags": [ + "10cb16c2-6f15-4101-8689-7c77e6576f52" + ] + }, + { + "Text": "Shoals", + "Ws": "cjy", + "Bold": "Invert", + "FontSize": -437265941, + "ForeColor": "#ADFF2F", + "Tags": [ + "53cd8e2b-15c6-0490-70d6-738a6708b9ca" + ] + } + ] + } + }, + "MorphType": "BoundStem", + "HomographNumber": 0, + "Senses": [], + "Note": { + "rkw": { + "Spans": [ + { + "Text": "XML", + "Ws": "vot", + "Bold": "On", + "FontSize": -1698959192, + "ForeColor": "#ADFF2F", + "Tags": [ + "9218c79b-f453-0ef3-de05-ea5eeba26367" + ] + }, + { + "Text": "invoice", + "Ws": "rkw", + "Tags": [ + "6ef3cf72-b5a5-488c-9381-fb7a7f6f961e" + ] + }, + { + "Text": "bypass", + "Ws": "rkw", + "Tags": [ + "e615bb12-61d9-452e-bac5-06deb6942851" + ] + } + ] + }, + "kee": { + "Spans": [ + { + "Text": "Money Market Account", + "Ws": "ekp", + "Bold": "On", + "FontSize": -315220510, + "ForeColor": "#A52A2A", + "Tags": [ + "424e0f12-78a7-37c7-8fa5-74dd81ccc8a7" + ] + }, + { + "Text": "Glens", + "Ws": "kee", + "Tags": [ + "a323544c-2b85-4fa7-b3c7-f5321ad75c49" + ] + }, + { + "Text": "Buckinghamshire", + "Ws": "kee", + "Tags": [ + "13a974bf-8b90-4f36-99c6-9f0771f53db0" + ] + }, + { + "Text": "SMTP", + "Ws": "cly", + "Bold": "Invert", + "FontSize": 872689318, + "ForeColor": "#0000FF", + "Tags": [ + "498aea00-217b-9a3e-7fd0-2748edadf3b3" + ] + } + ] + } + }, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [ + { + "Id": "292e9847-8c7c-56e1-87fb-41d200c789e1", + "Name": { + "hup": "THX", + "rsk": "Reduced", + "zmq": "hard drive", + "nnx": "cyan" + }, + "DeletedAt": null + } + ], + "VariantOf": [], + "Variants": [], + "PublishIn": [ + { + "Id": "bd874c92-e063-2a20-d263-bdc6897a1e85", + "DeletedAt": null, + "IsMain": false, + "Name": { + "zrg": "cross-platform", + "bno": "heuristic" + } + } + ] + }, + "Id": "8dbc0f41-998e-836a-97e1-f05d46d95c92", + "DeletedAt": null + }, + { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "21b941a4-fbb7-f706-0aab-529c84b402b5", + "DeletedAt": null, + "LexemeForm": { + "nar": "Tasty Rubber Chair", + "luh": "Brunei Dollar", + "mok": "navigate" + }, + "CitationForm": { + "mih": "hub", + "tiq": "New Zealand Dollar" + }, + "LiteralMeaning": { + "mtu": { + "Spans": [ + { + "Text": "Unbranded Rubber Sausages", + "Ws": "qvo", + "Bold": "Off", + "FontSize": 1178067194, + "ForeColor": "#A52A2A", + "Tags": [ + "d321668f-b5fb-4eea-8064-de2784319aa4" + ] + }, + { + "Text": "Soft", + "Ws": "jio", + "Bold": "On", + "FontSize": 897718303, + "ForeColor": "#A52A2A", + "Tags": [ + "9a5e7604-a21f-546d-3b49-d730a05bacb7" + ] + }, + { + "Text": "haptic", + "Ws": "mtu", + "Tags": [ + "ba19fe02-0e18-4e92-9fb4-73f7b4ff7e29" + ] + } + ] + }, + "tnc": { + "Spans": [ + { + "Text": "Practical", + "Ws": "wof", + "Bold": "Off", + "FontSize": -1535748655, + "ForeColor": "#00FFFF", + "Tags": [ + "bfb0c24e-3275-7312-a6af-171f2e77adea" + ] + }, + { + "Text": "quantifying", + "Ws": "awy", + "Bold": "Off", + "FontSize": -281573942, + "ForeColor": "#ADFF2F", + "Tags": [ + "e9bdeced-7404-3248-6b7d-3d73579133b4" + ] + }, + { + "Text": "Lebanese Pound", + "Ws": "tnc", + "Tags": [ + "d9b188e4-9a17-4636-a39b-ca4268035281" + ] + }, + { + "Text": "Officer", + "Ws": "kwy", + "Bold": "Off", + "FontSize": -907207124, + "ForeColor": "#ADFF2F", + "Tags": [ + "6f598667-4c76-a59f-6639-d85fa5caaee3" + ] + } + ] + }, + "met": { + "Spans": [ + { + "Text": "incremental", + "Ws": "kpl", + "Bold": "On", + "FontSize": 309135679, + "ForeColor": "#A52A2A", + "Tags": [ + "b76f0bac-9fe3-afb3-cc64-c01aa7c650cc" + ] + }, + { + "Text": "Awesome Steel Shirt", + "Ws": "met", + "Tags": [ + "421ee914-5d3a-4ccb-b71e-114b560efe88" + ] + }, + { + "Text": "XSS", + "Ws": "met", + "Tags": [ + "9cf1278d-37a5-4ba7-968d-0817a1280b1d" + ] + }, + { + "Text": "Wyoming", + "Ws": "lkh", + "Bold": "Off", + "FontSize": 2029647080, + "ForeColor": "#00FFFF", + "Tags": [ + "ccf7b25b-931a-7f85-62e9-5fe9b49d7aa0" + ] + } + ] + }, + "bmk": { + "Spans": [ + { + "Text": "incubate", + "Ws": "bmk", + "Tags": [ + "27ff80df-e700-49db-8a7b-517933050d07" + ] + }, + { + "Text": "Rubber", + "Ws": "ddi", + "Bold": "Off", + "FontSize": 1247133799, + "ForeColor": "#A52A2A", + "Tags": [ + "520317dc-2190-3cf0-bbba-bcd6ff830999" + ] + }, + { + "Text": "Buckinghamshire", + "Ws": "bmk", + "Tags": [ + "35e9e4c6-24fe-46aa-b3ea-788e4729a500" + ] + } + ] + } + }, + "MorphType": "Enclitic", + "HomographNumber": 288646034, + "Senses": [], + "Note": { + "obl": { + "Spans": [ + { + "Text": "Maryland", + "Ws": "yhd", + "Bold": "Off", + "FontSize": -49334912, + "ForeColor": "#00000000", + "Tags": [ + "2d8fec7c-5396-ea81-55e2-28e9ca2fb19a" + ] + } + ] + }, + "urn": { + "Spans": [ + { + "Text": "PCI", + "Ws": "apz", + "Bold": "Invert", + "FontSize": -101349684, + "ForeColor": "#ADFF2F", + "Tags": [ + "3f4fcdb6-49ae-0047-84a9-dd8c5387e0c6" + ] + } + ] + }, + "vmd": { + "Spans": [ + { + "Text": "whiteboard", + "Ws": "vmd", + "Tags": [ + "ac082b83-c17e-4dde-88e4-f5496c06da55" + ] + }, + { + "Text": "cutting-edge", + "Ws": "vmd", + "Tags": [ + "ebc22ab4-9861-469b-8eb3-24bd8ee77271" + ] + } + ] + }, + "lo": { + "Spans": [ + { + "Text": "Graphical User Interface", + "Ws": "sjc", + "Bold": "Invert", + "FontSize": 1010008301, + "ForeColor": "#FF0000", + "Tags": [ + "738f95ee-777f-bd8e-9c25-fdf853919571" + ] + }, + { + "Text": "Trace", + "Ws": "lo", + "Tags": [ + "cec5d529-8bef-40d1-9007-8284f9b62813" + ] + } + ] + } + }, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [ + { + "Id": "e011543b-218d-8dc9-cb5b-ef51b039e01b", + "Name": { + "hih": "transition" + }, + "DeletedAt": null + } + ], + "VariantOf": [ + { + "Id": "81e7a0f3-07ae-9501-c9fc-012c9f4d72f8", + "MaybeId": "81e7a0f3-07ae-9501-c9fc-012c9f4d72f8", + "DeletedAt": null, + "VariantEntryId": "0d7ecb9e-640e-0136-3177-5f3725e3ff9c", + "VariantHeadword": "copying", + "MainEntryId": "c28531d2-4de4-3de3-36c3-c4eda08de343", + "MainSenseId": "917b785c-8a5c-d651-e6bf-8ee95b975268", + "MainHeadword": "matrix", + "Types": [ + { + "Id": "47b33565-0be3-32c4-e0ad-348f191b6763", + "Name": { + "tto": "Function-based", + "mln": "Toys \u0026 Health" + }, + "DeletedAt": null + } + ], + "HideMinorEntry": false, + "Comment": { + "kdu": { + "Spans": [ + { + "Text": "Soft", + "Ws": "lbb", + "Bold": "Off", + "FontSize": 1504894779, + "ForeColor": "#ADFF2F", + "Tags": [ + "23000220-e88c-70d5-9add-4df3ce8fe113" + ] + }, + { + "Text": "Azerbaijanian Manat", + "Ws": "kdu", + "Tags": [ + "84781e74-2daf-4343-9163-07146adbf10d" + ] + }, + { + "Text": "Fantastic", + "Ws": "kdu", + "Tags": [ + "bf26f933-43e6-4836-8110-83a70c57ed9c" + ] + } + ] + }, + "kgu": { + "Spans": [ + { + "Text": "Savings Account", + "Ws": "hmi", + "Bold": "Invert", + "FontSize": -1415115979, + "ForeColor": "#A52A2A", + "Tags": [ + "eae2f706-1777-c843-9406-53c52fa6c245" + ] + }, + { + "Text": "index", + "Ws": "kgu", + "Tags": [ + "7a3a569c-2ed4-4fa2-8c32-79435d943ba6" + ] + } + ] + }, + "dlg": { + "Spans": [ + { + "Text": "Wooden", + "Ws": "dlg", + "Tags": [ + "fd4f43a8-1fa6-4269-aab0-4e6d4d4bcd92" + ] + }, + { + "Text": "website", + "Ws": "dlg", + "Tags": [ + "03d3f612-c192-428d-97f4-419ca77bed8e" + ] + }, + { + "Text": "Manager", + "Ws": "gvs", + "Bold": "On", + "FontSize": -1069962004, + "ForeColor": "#00FFFF", + "Tags": [ + "8dc4a280-da41-d085-2e52-9787f7db26ea" + ] + } + ] + }, + "mtf": { + "Spans": [ + { + "Text": "Licensed Plastic Sausages", + "Ws": "nra", + "Bold": "On", + "FontSize": -883851573, + "ForeColor": "#0000FF", + "Tags": [ + "4f6ea9d5-5680-42bb-93b4-ceb1d18b90a3" + ] + }, + { + "Text": "Progressive", + "Ws": "mtf", + "Tags": [ + "3a8e2fe9-679c-4a3d-a980-d82240464ed2" + ] + }, + { + "Text": "Borders", + "Ws": "mtf", + "Tags": [ + "0af175a1-59ef-42e2-886c-73b6a11ad0e1" + ] + } + ] + } + } + } + ], + "Variants": [ + { + "Id": "9bfecd7f-6382-5236-4f2f-0a762a72fb90", + "MaybeId": "9bfecd7f-6382-5236-4f2f-0a762a72fb90", + "DeletedAt": null, + "VariantEntryId": "43f0a46f-364f-eee0-a013-1812448b50e1", + "VariantHeadword": "olive", + "MainEntryId": "9441127f-18dd-b52f-d49e-629ca50611ac", + "MainSenseId": "519758f1-a6c0-7833-468e-8f326607cf0c", + "MainHeadword": "Orchestrator", + "Types": [ + { + "Id": "0bc3123f-673b-215f-1f24-5fae892969ee", + "Name": { + "blb": "calculating", + "rga": "Awesome Metal Chicken" + }, + "DeletedAt": null + } + ], + "HideMinorEntry": true, + "Comment": { + "sfe": { + "Spans": [ + { + "Text": "synthesize", + "Ws": "wmc", + "Bold": "On", + "FontSize": -410677030, + "ForeColor": "#00FFFF", + "Tags": [ + "793b16c8-e48a-7890-bb1a-7381255585b4" + ] + }, + { + "Text": "Planner", + "Ws": "smc", + "Bold": "On", + "FontSize": 190202871, + "ForeColor": "#A52A2A", + "Tags": [ + "6109cb4e-9d80-7172-070f-aaab5148e02b" + ] + } + ] + }, + "mkp": { + "Spans": [ + { + "Text": "Port", + "Ws": "yxu", + "Bold": "Invert", + "FontSize": 1607188846, + "ForeColor": "#00FFFF", + "Tags": [ + "58bc979b-7c64-d947-165b-c7f2ebe2f63b" + ] + } + ] + }, + "ckz": { + "Spans": [ + { + "Text": "Product", + "Ws": "ywn", + "Bold": "Invert", + "FontSize": -23641957, + "ForeColor": "#A52A2A", + "Tags": [ + "b0594316-051c-beca-3f4a-fd5a3500a18d" + ] + }, + { + "Text": "approach", + "Ws": "pbm", + "Bold": "Off", + "FontSize": 1715313845, + "ForeColor": "#A52A2A", + "Tags": [ + "0eb2ca90-dde1-95d6-9801-54c992c804b3" + ] + } + ] + } + } + } + ], + "PublishIn": [ + { + "Id": "cb689065-ea18-98a0-74a6-5cb471da3fbc", + "DeletedAt": null, + "IsMain": false, + "Name": { + "lnu": "Applications" + } + } + ] + }, + "Id": "21b941a4-fbb7-f706-0aab-529c84b402b5", + "DeletedAt": null + }, + { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "84bb5f48-b2a9-d0c8-85ee-aec9203830ee", + "DeletedAt": null, + "LexemeForm": { + "dkk": "Product" + }, + "CitationForm": {}, + "LiteralMeaning": {}, + "MorphType": "Infix", + "HomographNumber": 1102525176, + "Senses": [], + "Note": {}, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], + "PublishIn": [ + { + "Id": "78c00e29-d69e-56ba-77f5-b5be25469c4f", + "DeletedAt": null, + "IsMain": true, + "Name": { + "mps": "Small Granite Salad" + } + } + ] + }, + "Id": "84bb5f48-b2a9-d0c8-85ee-aec9203830ee", + "DeletedAt": null + }, + { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "7ccb582e-442b-9cde-6f59-7d2658224810", + "DeletedAt": null, + "LexemeForm": { + "alt": "redefine", + "mtg": "feed", + "cie": "haptic" + }, + "CitationForm": { + "nqo": "Investment Account", + "dkg": "Optimization" + }, + "LiteralMeaning": { + "gnr": { + "Spans": [ + { + "Text": "Springs", + "Ws": "gnr", + "Tags": [ + "18fbfdb3-2e2a-4291-8b21-00702f47a4c6" + ] + }, + { + "Text": "human-resource", + "Ws": "gnr", + "Tags": [ + "90ec01f7-a258-41c9-b9dd-b4eccd570f9c" + ] + } + ] + }, + "stt": { + "Spans": [ + { + "Text": "withdrawal", + "Ws": "tpi", + "Bold": "On", + "FontSize": -1350488265, + "ForeColor": "#FF0000", + "Tags": [ + "39acebc8-f34a-93c9-4c84-f7cc84c5985d" + ] + }, + { + "Text": "Intelligent Concrete Table", + "Ws": "guq", + "Bold": "On", + "FontSize": -25655285, + "ForeColor": "#ADFF2F", + "Tags": [ + "b72087c2-32d8-29af-97ca-53158f52e13b" + ] + }, + { + "Text": "Research", + "Ws": "ani", + "Bold": "Invert", + "FontSize": 611743561, + "ForeColor": "#00FFFF", + "Tags": [ + "7debebd6-974d-0fd4-c077-c55407f924ea" + ] + } + ] + }, + "czh": { + "Spans": [ + { + "Text": "Future", + "Ws": "ypo", + "Bold": "Off", + "FontSize": 1307816951, + "ForeColor": "#FF0000", + "Tags": [ + "86cf0663-8ac2-0d8e-b85b-007c44ee27d2" + ] + }, + { + "Text": "Square", + "Ws": "czh", + "Tags": [ + "ca6c94cc-2237-4dad-af21-1e4f048b7ab4" + ] + } + ] + } + }, + "MorphType": "Circumfix", + "HomographNumber": -1416309114, + "Senses": [], + "Note": { + "xsy": { + "Spans": [ + { + "Text": "backing up", + "Ws": "nsh", + "Bold": "Off", + "FontSize": -559106786, + "ForeColor": "#FF0000", + "Tags": [ + "9c63fff5-5626-197d-9952-cca19e542578" + ] + } + ] + }, + "rgn": { + "Spans": [ + { + "Text": "Streamlined", + "Ws": "rgn", + "Tags": [ + "9edca3e0-5249-4f77-bfbb-c900353ae5c1" + ] + }, + { + "Text": "Micronesia", + "Ws": "env", + "Bold": "Invert", + "FontSize": 87635850, + "ForeColor": "#00FFFF", + "Tags": [ + "041fd30c-a5e7-f92a-e0b3-a59400a752af" + ] + }, + { + "Text": "transform", + "Ws": "cnc", + "Bold": "On", + "FontSize": -1985104153, + "ForeColor": "#FF0000", + "Tags": [ + "5c74852f-f7e5-249f-31f5-6b1d45ed8630" + ] + }, + { + "Text": "Identity", + "Ws": "byf", + "Bold": "Off", + "FontSize": -1853399160, + "ForeColor": "#0000FF", + "Tags": [ + "b6a400e8-2427-45a3-5ab1-758a2e28a6d1" + ] + } + ] + }, + "zkt": { + "Spans": [ + { + "Text": "COM", + "Ws": "yle", + "Bold": "Off", + "FontSize": 229320307, + "ForeColor": "#A52A2A", + "Tags": [ + "38575d9b-1ae7-0daa-3572-b22dcde78f5d" + ] + } + ] + }, + "sav": { + "Spans": [ + { + "Text": "Generic Steel Shirt", + "Ws": "cho", + "Bold": "Invert", + "FontSize": 1060021924, + "ForeColor": "#A52A2A", + "Tags": [ + "754ec847-76fb-1ccb-a494-dd703a87a162" + ] + }, + { + "Text": "Rustic Fresh Sausages", + "Ws": "mmv", + "Bold": "Off", + "FontSize": 1033279533, + "ForeColor": "#00000000", + "Tags": [ + "e2a95409-ebd0-322b-c20d-a2f3b3c98397" + ] + }, + { + "Text": "Tasty Plastic Table", + "Ws": "sav", + "Tags": [ + "0ac2af44-1be6-4bd7-9899-117faf3089ec" + ] + }, + { + "Text": "New Zealand", + "Ws": "sav", + "Tags": [ + "46d65c88-2ff5-4966-8463-cb5feade8426" + ] + } + ] + } + }, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [ + { + "Id": "e4009891-0d12-f226-b1c8-aa5558128394", + "Name": { + "ril": "Human" + }, + "DeletedAt": null + } + ], + "VariantOf": [ + { + "Id": "d1ceb8e2-7b90-c398-3589-7509df51c011", + "MaybeId": "d1ceb8e2-7b90-c398-3589-7509df51c011", + "DeletedAt": null, + "VariantEntryId": "9970c40e-d0c0-d21a-b1b9-1da8bc1e03de", + "VariantHeadword": "Sleek Soft Bacon", + "MainEntryId": "6638f491-2bb0-d597-aac2-c7a3f7401ac1", + "MainSenseId": "f145e4a2-c26e-6e1a-b638-cfa8e7c76b22", + "MainHeadword": "Coordinator", + "Types": [ + { + "Id": "9b171c50-74e6-0153-0532-9e150820fd84", + "Name": { + "daa": "next-generation", + "tzh": "Credit Card Account", + "soo": "Orchestrator" + }, + "DeletedAt": null + } + ], + "HideMinorEntry": true, + "Comment": { + "put": { + "Spans": [ + { + "Text": "overriding", + "Ws": "put", + "Tags": [ + "73d43eb7-259e-46b6-b97e-e862bf483e93" + ] + }, + { + "Text": "Central", + "Ws": "jao", + "Bold": "On", + "FontSize": 583944008, + "ForeColor": "#00000000", + "Tags": [ + "67f97cd8-36bb-87d6-48c8-8032e5bc70f0" + ] + }, + { + "Text": "generate", + "Ws": "gbv", + "Bold": "On", + "FontSize": -1131714599, + "ForeColor": "#A52A2A", + "Tags": [ + "576874ce-c7a4-ca02-57f2-96707015cf7e" + ] + }, + { + "Text": "Baby \u0026 Grocery", + "Ws": "hur", + "Bold": "Off", + "FontSize": 105023831, + "ForeColor": "#0000FF", + "Tags": [ + "8ee1c6c3-4571-550f-aab0-c74250e744ae" + ] + } + ] + }, + "kdp": { + "Spans": [ + { + "Text": "EXE", + "Ws": "kdp", + "Tags": [ + "d81a9037-f01a-442e-945e-2da83fc59b72" + ] + }, + { + "Text": "Street", + "Ws": "bxb", + "Bold": "Off", + "FontSize": -1107158038, + "ForeColor": "#FF0000", + "Tags": [ + "86a630b1-0d04-0ce0-4e33-b4328f318e4f" + ] + }, + { + "Text": "Cross-group", + "Ws": "kdp", + "Tags": [ + "028304f1-6068-456c-9dd6-daf2e6318035" + ] + } + ] + }, + "slc": { + "Spans": [ + { + "Text": "fresh-thinking", + "Ws": "rn", + "Bold": "On", + "FontSize": -1290428814, + "ForeColor": "#00000000", + "Tags": [ + "c8622d2c-cfdd-f92c-85f3-0c594aee98e1" + ] + }, + { + "Text": "Executive", + "Ws": "slc", + "Tags": [ + "1024acaa-5a55-48f6-a801-6d033e58f225" + ] + }, + { + "Text": "Egyptian Pound", + "Ws": "slc", + "Tags": [ + "234f074f-8d0d-4629-884f-2441eea1ddfa" + ] + }, + { + "Text": "moderator", + "Ws": "slc", + "Tags": [ + "81b664ca-2179-43ec-a71c-025af7fe288d" + ] + } + ] + } + } + } + ], + "Variants": [ + { + "Id": "3f49ac95-a997-74af-e061-6159fc340fd2", + "MaybeId": "3f49ac95-a997-74af-e061-6159fc340fd2", + "DeletedAt": null, + "VariantEntryId": "36c20f18-c9ae-c828-7cea-7bf5f4ddee03", + "VariantHeadword": "Borders", + "MainEntryId": "cc77233c-a886-c6ee-703a-4e5a4443c087", + "MainSenseId": "18a2340e-56f8-94de-bf35-bef23f6a3d76", + "MainHeadword": "Concrete", + "Types": [ + { + "Id": "39b5de5d-fc3e-6516-2ac5-fbdde15e8d90", + "Name": { + "ygi": "Granite", + "ihp": "Small Granite Salad", + "bzx": "Avon" + }, + "DeletedAt": null + } + ], + "HideMinorEntry": true, + "Comment": { + "pna": { + "Spans": [ + { + "Text": "Guinea", + "Ws": "twq", + "Bold": "Off", + "FontSize": 548037479, + "ForeColor": "#00FFFF", + "Tags": [ + "b31e5ede-63ce-0ec0-f672-6801296e0617" + ] + }, + { + "Text": "Minnesota", + "Ws": "zor", + "Bold": "On", + "FontSize": -1619185103, + "ForeColor": "#00000000", + "Tags": [ + "6db14049-c1d8-4610-67b6-f080a67d198c" + ] + } + ] + }, + "nii": { + "Spans": [ + { + "Text": "Florida", + "Ws": "kqj", + "Bold": "On", + "FontSize": 1839918198, + "ForeColor": "#00FFFF", + "Tags": [ + "54a11218-ede8-4a66-e796-8fb5954a2866" + ] + } + ] + }, + "goh": { + "Spans": [ + { + "Text": "Re-engineered", + "Ws": "ppu", + "Bold": "On", + "FontSize": 121777806, + "ForeColor": "#FF0000", + "Tags": [ + "d7394e85-12ef-0453-59a4-f789ec8cd6b6" + ] + } + ] + }, + "mss": { + "Spans": [ + { + "Text": "Rustic", + "Ws": "sok", + "Bold": "On", + "FontSize": -232538291, + "ForeColor": "#FF0000", + "Tags": [ + "672e67c4-f22f-4f38-e5ef-fa8230ae0642" + ] + }, + { + "Text": "Fantastic", + "Ws": "mss", + "Tags": [ + "4b2371f2-69a7-4056-a1c5-f0b4151e85b8" + ] + }, + { + "Text": "Gibraltar Pound", + "Ws": "mss", + "Tags": [ + "0ef5a73e-8c43-42b3-8637-1bb90d0b2b62" + ] + } + ] + } + } + } + ], + "PublishIn": [ + { + "Id": "a27a7789-bcba-ee7a-57d3-fa256d3356c1", + "DeletedAt": null, + "IsMain": false, + "Name": { + "kkk": "Analyst", + "dkk": "Investment Account" + } + } + ] + }, + "Id": "7ccb582e-442b-9cde-6f59-7d2658224810", + "DeletedAt": null + }, + { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "249c38f3-fc0d-195f-7533-97e8c140d0d7", + "DeletedAt": null, + "LexemeForm": { + "kvj": "Florida" + }, + "CitationForm": null, + "LiteralMeaning": null, + "MorphType": "Prefix", + "HomographNumber": 4, + "Senses": [], + "Note": null, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], + "PublishIn": [] + }, + "Id": "249c38f3-fc0d-195f-7533-97e8c140d0d7", + "DeletedAt": null + }, + { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "c3c7439d-8508-897d-ec90-dfb8c6233f52", + "DeletedAt": null, + "LexemeForm": { + "sbf": "Triple-buffered", + "nuo": "clear-thinking", + "ewo": "modular" + }, + "CitationForm": { + "mzp": "Rial Omani" + }, + "LiteralMeaning": { + "mku": { + "Spans": [ + { + "Text": "holistic", + "Ws": "mku", + "Tags": [ + "9350e875-0918-4188-8b80-e94b87a852bf" + ] + }, + { + "Text": "Oklahoma", + "Ws": "bnx", + "Bold": "On", + "FontSize": 1103510228, + "ForeColor": "#FF0000", + "Tags": [ + "ed09f714-b175-6596-9983-16cdf0cf34d8" + ] + }, + { + "Text": "Handcrafted", + "Ws": "mku", + "Tags": [ + "182d16db-157e-4fbc-9d8d-fb3df1acc534" + ] + } + ] + }, + "kdr": { + "Spans": [ + { + "Text": "Liaison", + "Ws": "kdr", + "Tags": [ + "f526be31-e1dc-4710-b90d-0c747d57434f" + ] + } + ] + } + }, + "MorphType": "Prefix", + "HomographNumber": -1630247524, + "Senses": [], + "Note": { + "crv": { + "Spans": [ + { + "Text": "Isle of Man", + "Ws": "crv", + "Tags": [ + "7bde6377-d4cb-49ae-9803-86cd678d56d7" + ] + }, + { + "Text": "projection", + "Ws": "crv", + "Tags": [ + "764ca726-5a42-499a-8965-0da244a52a6a" + ] + }, + { + "Text": "transmitting", + "Ws": "hnn", + "Bold": "Off", + "FontSize": -1687247291, + "ForeColor": "#ADFF2F", + "Tags": [ + "54262fd2-0ed1-d0ec-59b2-c2ade27b2a03" + ] + } + ] + }, + "gnw": { + "Spans": [ + { + "Text": "Neck", + "Ws": "bvo", + "Bold": "Off", + "FontSize": -990208762, + "ForeColor": "#00FFFF", "Tags": [ - "424e0f12-78a7-37c7-8fa5-74dd81ccc8a7" + "99ed537a-80b3-8de1-7650-6365d2e6083f" ] }, { - "Text": "Glens", - "Ws": "kee", + "Text": "Data", + "Ws": "gnw", "Tags": [ - "a323544c-2b85-4fa7-b3c7-f5321ad75c49" + "d241a639-233a-45c7-8935-7b9f3f06157a" ] }, { - "Text": "Buckinghamshire", - "Ws": "kee", + "Text": "withdrawal", + "Ws": "pmf", + "Bold": "Off", + "FontSize": -1959771791, + "ForeColor": "#0000FF", "Tags": [ - "13a974bf-8b90-4f36-99c6-9f0771f53db0" + "8fd780f0-42f6-34ec-0f95-356321691992" ] - }, + } + ] + }, + "ekm": { + "Spans": [ { - "Text": "SMTP", - "Ws": "cly", + "Text": "Developer", + "Ws": "hag", "Bold": "Invert", - "FontSize": 872689318, + "FontSize": -858017395, "ForeColor": "#0000FF", "Tags": [ - "498aea00-217b-9a3e-7fd0-2748edadf3b3" + "846f0198-2a38-de9c-5c83-d597ce88fecd" + ] + }, + { + "Text": "Handcrafted", + "Ws": "mix", + "Bold": "On", + "FontSize": -1819622732, + "ForeColor": "#FF0000", + "Tags": [ + "bce2d057-9660-de23-ad57-3783b9014de8" ] } ] @@ -392,84 +2606,204 @@ "ComplexForms": [], "ComplexFormTypes": [ { - "Id": "292e9847-8c7c-56e1-87fb-41d200c789e1", + "Id": "68f76f7d-5ec4-2006-ed56-236b8c0acdb3", "Name": { - "hup": "THX", - "rsk": "Reduced", - "zmq": "hard drive", - "nnx": "cyan" + "mtn": "Libyan Dinar", + "kot": "white", + "sax": "Accounts", + "tlu": "invoice" }, "DeletedAt": null } ], - "PublishIn": [ + "VariantOf": [ { - "Id": "bd874c92-e063-2a20-d263-bdc6897a1e85", + "Id": "30687039-cd15-839f-0f15-88239cea4ee7", + "MaybeId": "30687039-cd15-839f-0f15-88239cea4ee7", "DeletedAt": null, - "IsMain": false, - "Name": { - "zrg": "cross-platform", - "bno": "heuristic" + "VariantEntryId": "a7cea784-faa5-08b1-5a30-ea546c3e84a6", + "VariantHeadword": "methodologies", + "MainEntryId": "d38e046a-5051-8542-0ee0-a8816c4a38fc", + "MainSenseId": "20ae5516-4681-5b6f-9a37-441f37d30636", + "MainHeadword": "National", + "Types": [ + { + "Id": "4efbf4f2-7182-25a1-8279-18849ca5d1dc", + "Name": { + "xpu": "Intelligent Soft Shirt" + }, + "DeletedAt": null + } + ], + "HideMinorEntry": false, + "Comment": { + "ug": { + "Spans": [ + { + "Text": "input", + "Ws": "ug", + "Tags": [ + "009c5014-9b97-498d-94d7-b49c2f60f7ce" + ] + }, + { + "Text": "high-level", + "Ws": "pub", + "Bold": "On", + "FontSize": 1878116492, + "ForeColor": "#0000FF", + "Tags": [ + "5a727ee0-4a4d-6d0f-5ff0-7225db4443b9" + ] + }, + { + "Text": "Liberian Dollar", + "Ws": "ug", + "Tags": [ + "9def2648-5fc8-473b-91a0-e4b870483323" + ] + }, + { + "Text": "teal", + "Ws": "dux", + "Bold": "On", + "FontSize": -447656843, + "ForeColor": "#00FFFF", + "Tags": [ + "3f01efa1-0307-9615-9c0a-abd13268297f" + ] + } + ] + }, + "tkx": { + "Spans": [ + { + "Text": "Handcrafted Plastic Gloves", + "Ws": "ktm", + "Bold": "Off", + "FontSize": 980860579, + "ForeColor": "#0000FF", + "Tags": [ + "3aa66e0d-0c3b-f1fe-000b-f2b073e8bbcf" + ] + }, + { + "Text": "teal", + "Ws": "tkx", + "Tags": [ + "ffc128c8-dd58-490e-bbb6-ff9c9dae2c21" + ] + } + ] + }, + "mvg": { + "Spans": [ + { + "Text": "Synchronised", + "Ws": "lof", + "Bold": "Off", + "FontSize": -448515709, + "ForeColor": "#A52A2A", + "Tags": [ + "cccf656b-6627-2403-6651-e9778e6784b3" + ] + }, + { + "Text": "pink", + "Ws": "mvg", + "Tags": [ + "227cf26e-397c-4d4c-9799-5bb7c880ffcd" + ] + }, + { + "Text": "Tasty Rubber Tuna", + "Ws": "jcs", + "Bold": "Invert", + "FontSize": -1218964834, + "ForeColor": "#FF0000", + "Tags": [ + "8d1b02a7-1a2b-3cad-ee5b-5d9d44e54785" + ] + }, + { + "Text": "Rue", + "Ws": "mvg", + "Tags": [ + "98ac4a79-c23c-47d3-af3b-6352a3905df4" + ] + } + ] + } } } - ] - }, - "Id": "8dbc0f41-998e-836a-97e1-f05d46d95c92", - "DeletedAt": null - }, - { - "$type": "MiniLcmCrdtAdapter", - "Obj": { - "$type": "Entry", - "Id": "84bb5f48-b2a9-d0c8-85ee-aec9203830ee", - "DeletedAt": null, - "LexemeForm": { - "dkk": "Product" - }, - "CitationForm": {}, - "LiteralMeaning": {}, - "MorphType": "Infix", - "HomographNumber": 1102525176, - "Senses": [], - "Note": {}, - "Components": [], - "ComplexForms": [], - "ComplexFormTypes": [], + ], + "Variants": [ + { + "Id": "eb7771bf-50ec-05c5-f943-2f36625e25db", + "MaybeId": "eb7771bf-50ec-05c5-f943-2f36625e25db", + "DeletedAt": null, + "VariantEntryId": "dd84ea90-cfe1-a254-021d-efca8b022ddf", + "VariantHeadword": "Configuration", + "MainEntryId": "2bae2145-2f23-b490-102b-cf1d03c8f5bf", + "MainSenseId": "bb0e0056-9948-fd94-0c89-e89fd4ba8cce", + "MainHeadword": "withdrawal", + "Types": [ + { + "Id": "e2b0fab5-16ff-63da-ab2c-3137e2d8fcea", + "Name": { + "nli": "Architect", + "dcc": "Decentralized", + "dgd": "leverage", + "pne": "Intelligent Steel Cheese" + }, + "DeletedAt": null + } + ], + "HideMinorEntry": true, + "Comment": { + "afs": { + "Spans": [ + { + "Text": "Investment Account", + "Ws": "afs", + "Tags": [ + "222a259a-328a-41e6-8d2e-ad2e0a06cf21" + ] + }, + { + "Text": "Morocco", + "Ws": "afs", + "Tags": [ + "184ab8d1-b318-407d-8eaf-d60d2615e680" + ] + }, + { + "Text": "Kids \u0026 Kids", + "Ws": "afs", + "Tags": [ + "805122d3-96f3-4129-a887-edb34bd994c5" + ] + } + ] + } + } + } + ], "PublishIn": [ { - "Id": "78c00e29-d69e-56ba-77f5-b5be25469c4f", + "Id": "5421adab-b84b-1d1c-5da9-ff96c4e76d6f", "DeletedAt": null, - "IsMain": true, + "IsMain": false, "Name": { - "mps": "Small Granite Salad" + "arn": "Money Market Account", + "myt": "withdrawal", + "bni": "Libyan Arab Jamahiriya", + "peh": "web-readiness" } } ] }, - "Id": "84bb5f48-b2a9-d0c8-85ee-aec9203830ee", - "DeletedAt": null - }, - { - "$type": "MiniLcmCrdtAdapter", - "Obj": { - "$type": "Entry", - "Id": "249c38f3-fc0d-195f-7533-97e8c140d0d7", - "DeletedAt": null, - "LexemeForm": { - "kvj": "Florida" - }, - "CitationForm": null, - "LiteralMeaning": null, - "MorphType": "Prefix", - "HomographNumber": 4, - "Senses": [], - "Note": null, - "Components": [], - "ComplexForms": [], - "ComplexFormTypes": [], - "PublishIn": [] - }, - "Id": "249c38f3-fc0d-195f-7533-97e8c140d0d7", + "Id": "c3c7439d-8508-897d-ec90-dfb8c6233f52", "DeletedAt": null }, { @@ -3935,5 +6269,145 @@ }, "Id": "edd0c7a1-e37c-c67b-7522-eed5ec86fde8", "DeletedAt": null + }, + { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "VariantType", + "Id": "ab0ff154-d4bb-e26d-4136-805ff65fe3f7", + "Name": { + "kvv": "Idaho" + }, + "DeletedAt": null + }, + "Id": "ab0ff154-d4bb-e26d-4136-805ff65fe3f7", + "DeletedAt": null + }, + { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Variant", + "Id": "f3c8bd18-ddae-319c-7af9-aec8a1f24db9", + "MaybeId": "f3c8bd18-ddae-319c-7af9-aec8a1f24db9", + "DeletedAt": null, + "VariantEntryId": "8844401a-9b59-2dbb-d0a6-b8072698fdbe", + "VariantHeadword": "compressing", + "MainEntryId": "4c6734dd-5df2-ef98-f925-4bedccafffd6", + "MainSenseId": "5299433f-bed8-0440-f6b7-be7185a94c91", + "MainHeadword": "Future-proofed", + "Types": [ + { + "Id": "bd29dadc-ed05-75a2-2dd2-1f4e7a8ed28c", + "Name": { + "qvs": "transition", + "bnj": "input", + "prx": "1080p", + "stw": "Cotton" + }, + "DeletedAt": null + } + ], + "HideMinorEntry": true, + "Comment": { + "mkv": { + "Spans": [ + { + "Text": "FTP", + "Ws": "afg", + "Bold": "Off", + "FontSize": 786310720, + "ForeColor": "#FF0000", + "Tags": [ + "080df177-19fa-0182-fd6d-8bfe3c6899b8" + ] + } + ] + }, + "jup": { + "Spans": [ + { + "Text": "Configuration", + "Ws": "jkr", + "Bold": "Invert", + "FontSize": 901303494, + "ForeColor": "#00000000", + "Tags": [ + "4764d0bd-8463-ac55-13e6-5c97bf5e1eeb" + ] + }, + { + "Text": "Extended", + "Ws": "jup", + "Tags": [ + "cc3de0c0-de63-4f90-b243-ed8cffce4b43" + ] + }, + { + "Text": "Berkshire", + "Ws": "duq", + "Bold": "Invert", + "FontSize": -820321295, + "ForeColor": "#FF0000", + "Tags": [ + "89b096e2-d417-54cc-90ce-6b3d0d6beea9" + ] + }, + { + "Text": "Handmade", + "Ws": "jup", + "Tags": [ + "8b3d963a-e282-4efa-b1b3-72bd5cc0b97a" + ] + } + ] + }, + "knq": { + "Spans": [ + { + "Text": "back-end", + "Ws": "rga", + "Bold": "On", + "FontSize": -1164842275, + "ForeColor": "#0000FF", + "Tags": [ + "e16af6f0-6073-064a-be78-5476ae80129b" + ] + }, + { + "Text": "Fresh", + "Ws": "hrt", + "Bold": "Off", + "FontSize": -1676676744, + "ForeColor": "#00FFFF", + "Tags": [ + "04081eef-8df9-8078-2aff-8a1fc6f565d6" + ] + }, + { + "Text": "Bedfordshire", + "Ws": "xag", + "Bold": "Off", + "FontSize": 588490506, + "ForeColor": "#ADFF2F", + "Tags": [ + "d5d24888-6538-6447-e34b-90436626e505" + ] + }, + { + "Text": "neural", + "Ws": "kpw", + "Bold": "Off", + "FontSize": 1635502143, + "ForeColor": "#FF0000", + "Tags": [ + "3ff5314e-8007-7517-f840-e3a86ec6f913" + ] + } + ] + } + } + }, + "Id": "f3c8bd18-ddae-319c-7af9-aec8a1f24db9", + "DeletedAt": null } ] \ No newline at end of file diff --git a/backend/FwLite/LcmCrdt.Tests/Data/SnapshotDeserializationRegressionData.legacy.verified.txt b/backend/FwLite/LcmCrdt.Tests/Data/SnapshotDeserializationRegressionData.legacy.verified.txt index a3fe21d28d..1dd30608e8 100644 --- a/backend/FwLite/LcmCrdt.Tests/Data/SnapshotDeserializationRegressionData.legacy.verified.txt +++ b/backend/FwLite/LcmCrdt.Tests/Data/SnapshotDeserializationRegressionData.legacy.verified.txt @@ -158,6 +158,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [] }, "Id": "8f403ae3-9859-4a74-a52d-3c0736bb5917", @@ -246,6 +248,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [] }, "Id": "82cf7254-3a4f-497a-9e15-7d93fc830356", @@ -3900,5 +3904,849 @@ "Id": "853b91e6-d738-7d5d-cc98-e62904160c35", "DeletedAt": null } + }, + { + "Input": { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "8f403ae3-9859-4a74-a52d-3c0736bb5917", + "DeletedAt": null, + "LexemeForm": { + "en": "Pineapple" + }, + "CitationForm": {}, + "LiteralMeaning": {}, + "MorphType": "Stem", + "HomographNumber": 0, + "Senses": [], + "Note": {}, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [ + { + "Id": "1f6ae209-141a-40db-983c-bee93af0ca3c", + "Name": { + "en": "Compound" + }, + "DeletedAt": null + } + ], + "PublishIn": [] + }, + "Id": "8f403ae3-9859-4a74-a52d-3c0736bb5917", + "DeletedAt": null + }, + "Output": { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "8f403ae3-9859-4a74-a52d-3c0736bb5917", + "DeletedAt": null, + "LexemeForm": { + "en": "Pineapple" + }, + "CitationForm": {}, + "LiteralMeaning": {}, + "MorphType": "Stem", + "HomographNumber": 0, + "Senses": [], + "Note": {}, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [ + { + "Id": "1f6ae209-141a-40db-983c-bee93af0ca3c", + "Name": { + "en": "Compound" + }, + "DeletedAt": null + } + ], + "VariantOf": [], + "Variants": [], + "PublishIn": [] + }, + "Id": "8f403ae3-9859-4a74-a52d-3c0736bb5917", + "DeletedAt": null + } + }, + { + "Input": { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "691dda9c-b83e-71c6-3638-e66a279c396e", + "DeletedAt": null, + "LexemeForm": { + "luq": "Communications" + }, + "CitationForm": { + "ykl": "Dominican Republic", + "tw": "Unbranded", + "sqh": "hack" + }, + "LiteralMeaning": { + "rpn": { + "Spans": [ + { + "Text": "Home Loan Account", + "Ws": "kmd", + "Bold": "On", + "FontSize": 1210454949, + "ForeColor": "#A52A2A", + "Tags": [ + "7231e128-410a-9cae-4141-997965f4a853" + ] + } + ] + } + }, + "MorphType": "Particle", + "HomographNumber": 0, + "Senses": [], + "Note": { + "ekl": { + "Spans": [ + { + "Text": "Sleek", + "Ws": "akv", + "Bold": "Off", + "FontSize": 2066121125, + "ForeColor": "#ADFF2F", + "Tags": [ + "82408188-7ce4-ba9a-5f35-8ffec5b3b254" + ] + } + ] + }, + "uki": { + "Spans": [ + { + "Text": "Refined Fresh Computer", + "Ws": "uki", + "Tags": [ + "122f575c-140b-4bb1-9c8c-f98e1969951d" + ] + }, + { + "Text": "internet solution", + "Ws": "uki", + "Tags": [ + "a5bd8ab1-99a0-4bcc-baaf-93c7ccc77429" + ] + }, + { + "Text": "wireless", + "Ws": "uki", + "Tags": [ + "005d71cb-4f05-486c-897c-710a7a6b5346" + ] + }, + { + "Text": "navigate", + "Ws": "uki", + "Tags": [ + "f04879c9-1e04-49b5-b4e0-0ce28e77aacd" + ] + } + ] + } + }, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [ + { + "Id": "15a8d32f-5cac-8a71-7b31-cbefa36ad322", + "Name": { + "tgi": "input", + "gnk": "silver", + "suo": "Refined Wooden Chair" + }, + "DeletedAt": null + } + ], + "PublishIn": [ + { + "Id": "ec21b4b7-3861-38d4-bc7b-fe77bd2321c2", + "DeletedAt": null, + "IsMain": false, + "Name": { + "nak": "CSS" + } + } + ] + }, + "Id": "691dda9c-b83e-71c6-3638-e66a279c396e", + "DeletedAt": null + }, + "Output": { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "691dda9c-b83e-71c6-3638-e66a279c396e", + "DeletedAt": null, + "LexemeForm": { + "luq": "Communications" + }, + "CitationForm": { + "ykl": "Dominican Republic", + "tw": "Unbranded", + "sqh": "hack" + }, + "LiteralMeaning": { + "rpn": { + "Spans": [ + { + "Text": "Home Loan Account", + "Ws": "kmd", + "Bold": "On", + "FontSize": 1210454949, + "ForeColor": "#A52A2A", + "Tags": [ + "7231e128-410a-9cae-4141-997965f4a853" + ] + } + ] + } + }, + "MorphType": "Particle", + "HomographNumber": 0, + "Senses": [], + "Note": { + "ekl": { + "Spans": [ + { + "Text": "Sleek", + "Ws": "akv", + "Bold": "Off", + "FontSize": 2066121125, + "ForeColor": "#ADFF2F", + "Tags": [ + "82408188-7ce4-ba9a-5f35-8ffec5b3b254" + ] + } + ] + }, + "uki": { + "Spans": [ + { + "Text": "Refined Fresh Computer", + "Ws": "uki", + "Tags": [ + "122f575c-140b-4bb1-9c8c-f98e1969951d" + ] + }, + { + "Text": "internet solution", + "Ws": "uki", + "Tags": [ + "a5bd8ab1-99a0-4bcc-baaf-93c7ccc77429" + ] + }, + { + "Text": "wireless", + "Ws": "uki", + "Tags": [ + "005d71cb-4f05-486c-897c-710a7a6b5346" + ] + }, + { + "Text": "navigate", + "Ws": "uki", + "Tags": [ + "f04879c9-1e04-49b5-b4e0-0ce28e77aacd" + ] + } + ] + } + }, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [ + { + "Id": "15a8d32f-5cac-8a71-7b31-cbefa36ad322", + "Name": { + "tgi": "input", + "gnk": "silver", + "suo": "Refined Wooden Chair" + }, + "DeletedAt": null + } + ], + "VariantOf": [], + "Variants": [], + "PublishIn": [ + { + "Id": "ec21b4b7-3861-38d4-bc7b-fe77bd2321c2", + "DeletedAt": null, + "IsMain": false, + "Name": { + "nak": "CSS" + } + } + ] + }, + "Id": "691dda9c-b83e-71c6-3638-e66a279c396e", + "DeletedAt": null + } + }, + { + "Input": { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "82cf7254-3a4f-497a-9e15-7d93fc830356", + "DeletedAt": null, + "LexemeForm": { + "en": "\uD83C\uDF4C", + "th": "\u0E01\u0E25\u0E49\u0E27\u0E22" + }, + "CitationForm": {}, + "LiteralMeaning": { + "en": { + "Spans": [ + { + "Text": "yellow fruit that comes in bunches.", + "Ws": "en" + } + ] + } + }, + "MorphType": "Stem", + "HomographNumber": 0, + "Senses": [], + "Note": { + "en": { + "Spans": [ + { + "Text": "often used in cartoon gags for slipping", + "Ws": "en" + } + ] + } + }, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [], + "PublishIn": [] + }, + "Id": "82cf7254-3a4f-497a-9e15-7d93fc830356", + "DeletedAt": null + }, + "Output": { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "82cf7254-3a4f-497a-9e15-7d93fc830356", + "DeletedAt": null, + "LexemeForm": { + "en": "\uD83C\uDF4C", + "th": "\u0E01\u0E25\u0E49\u0E27\u0E22" + }, + "CitationForm": {}, + "LiteralMeaning": { + "en": { + "Spans": [ + { + "Text": "yellow fruit that comes in bunches.", + "Ws": "en" + } + ] + } + }, + "MorphType": "Stem", + "HomographNumber": 0, + "Senses": [], + "Note": { + "en": { + "Spans": [ + { + "Text": "often used in cartoon gags for slipping", + "Ws": "en" + } + ] + } + }, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], + "PublishIn": [] + }, + "Id": "82cf7254-3a4f-497a-9e15-7d93fc830356", + "DeletedAt": null + } + }, + { + "Input": { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "8dbc0f41-998e-836a-97e1-f05d46d95c92", + "DeletedAt": null, + "LexemeForm": { + "mqs": "maximized" + }, + "CitationForm": { + "nrz": "Portugal" + }, + "LiteralMeaning": { + "juy": { + "Spans": [ + { + "Text": "Kyat", + "Ws": "juy", + "Tags": [ + "bc47798c-6e35-430e-a94a-2d1aa82d9119" + ] + }, + { + "Text": "synthesize", + "Ws": "juy", + "Tags": [ + "75fc659a-ae47-45ec-87a8-2475d5667496" + ] + } + ] + }, + "rer": { + "Spans": [ + { + "Text": "Licensed", + "Ws": "rer", + "Tags": [ + "adf734b1-3abb-4644-a5b7-e712c29a59e6" + ] + }, + { + "Text": "architectures", + "Ws": "dos", + "Bold": "On", + "FontSize": -1392951304, + "ForeColor": "#ADFF2F", + "Tags": [ + "b316a4f4-208a-e75f-13f0-09a91a2b3506" + ] + } + ] + }, + "zpa": { + "Spans": [ + { + "Text": "Concrete", + "Ws": "zpa", + "Tags": [ + "10cb16c2-6f15-4101-8689-7c77e6576f52" + ] + }, + { + "Text": "Shoals", + "Ws": "cjy", + "Bold": "Invert", + "FontSize": -437265941, + "ForeColor": "#ADFF2F", + "Tags": [ + "53cd8e2b-15c6-0490-70d6-738a6708b9ca" + ] + } + ] + } + }, + "MorphType": "BoundStem", + "HomographNumber": 0, + "Senses": [], + "Note": { + "rkw": { + "Spans": [ + { + "Text": "XML", + "Ws": "vot", + "Bold": "On", + "FontSize": -1698959192, + "ForeColor": "#ADFF2F", + "Tags": [ + "9218c79b-f453-0ef3-de05-ea5eeba26367" + ] + }, + { + "Text": "invoice", + "Ws": "rkw", + "Tags": [ + "6ef3cf72-b5a5-488c-9381-fb7a7f6f961e" + ] + }, + { + "Text": "bypass", + "Ws": "rkw", + "Tags": [ + "e615bb12-61d9-452e-bac5-06deb6942851" + ] + } + ] + }, + "kee": { + "Spans": [ + { + "Text": "Money Market Account", + "Ws": "ekp", + "Bold": "On", + "FontSize": -315220510, + "ForeColor": "#A52A2A", + "Tags": [ + "424e0f12-78a7-37c7-8fa5-74dd81ccc8a7" + ] + }, + { + "Text": "Glens", + "Ws": "kee", + "Tags": [ + "a323544c-2b85-4fa7-b3c7-f5321ad75c49" + ] + }, + { + "Text": "Buckinghamshire", + "Ws": "kee", + "Tags": [ + "13a974bf-8b90-4f36-99c6-9f0771f53db0" + ] + }, + { + "Text": "SMTP", + "Ws": "cly", + "Bold": "Invert", + "FontSize": 872689318, + "ForeColor": "#0000FF", + "Tags": [ + "498aea00-217b-9a3e-7fd0-2748edadf3b3" + ] + } + ] + } + }, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [ + { + "Id": "292e9847-8c7c-56e1-87fb-41d200c789e1", + "Name": { + "hup": "THX", + "rsk": "Reduced", + "zmq": "hard drive", + "nnx": "cyan" + }, + "DeletedAt": null + } + ], + "PublishIn": [ + { + "Id": "bd874c92-e063-2a20-d263-bdc6897a1e85", + "DeletedAt": null, + "IsMain": false, + "Name": { + "zrg": "cross-platform", + "bno": "heuristic" + } + } + ] + }, + "Id": "8dbc0f41-998e-836a-97e1-f05d46d95c92", + "DeletedAt": null + }, + "Output": { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "8dbc0f41-998e-836a-97e1-f05d46d95c92", + "DeletedAt": null, + "LexemeForm": { + "mqs": "maximized" + }, + "CitationForm": { + "nrz": "Portugal" + }, + "LiteralMeaning": { + "juy": { + "Spans": [ + { + "Text": "Kyat", + "Ws": "juy", + "Tags": [ + "bc47798c-6e35-430e-a94a-2d1aa82d9119" + ] + }, + { + "Text": "synthesize", + "Ws": "juy", + "Tags": [ + "75fc659a-ae47-45ec-87a8-2475d5667496" + ] + } + ] + }, + "rer": { + "Spans": [ + { + "Text": "Licensed", + "Ws": "rer", + "Tags": [ + "adf734b1-3abb-4644-a5b7-e712c29a59e6" + ] + }, + { + "Text": "architectures", + "Ws": "dos", + "Bold": "On", + "FontSize": -1392951304, + "ForeColor": "#ADFF2F", + "Tags": [ + "b316a4f4-208a-e75f-13f0-09a91a2b3506" + ] + } + ] + }, + "zpa": { + "Spans": [ + { + "Text": "Concrete", + "Ws": "zpa", + "Tags": [ + "10cb16c2-6f15-4101-8689-7c77e6576f52" + ] + }, + { + "Text": "Shoals", + "Ws": "cjy", + "Bold": "Invert", + "FontSize": -437265941, + "ForeColor": "#ADFF2F", + "Tags": [ + "53cd8e2b-15c6-0490-70d6-738a6708b9ca" + ] + } + ] + } + }, + "MorphType": "BoundStem", + "HomographNumber": 0, + "Senses": [], + "Note": { + "rkw": { + "Spans": [ + { + "Text": "XML", + "Ws": "vot", + "Bold": "On", + "FontSize": -1698959192, + "ForeColor": "#ADFF2F", + "Tags": [ + "9218c79b-f453-0ef3-de05-ea5eeba26367" + ] + }, + { + "Text": "invoice", + "Ws": "rkw", + "Tags": [ + "6ef3cf72-b5a5-488c-9381-fb7a7f6f961e" + ] + }, + { + "Text": "bypass", + "Ws": "rkw", + "Tags": [ + "e615bb12-61d9-452e-bac5-06deb6942851" + ] + } + ] + }, + "kee": { + "Spans": [ + { + "Text": "Money Market Account", + "Ws": "ekp", + "Bold": "On", + "FontSize": -315220510, + "ForeColor": "#A52A2A", + "Tags": [ + "424e0f12-78a7-37c7-8fa5-74dd81ccc8a7" + ] + }, + { + "Text": "Glens", + "Ws": "kee", + "Tags": [ + "a323544c-2b85-4fa7-b3c7-f5321ad75c49" + ] + }, + { + "Text": "Buckinghamshire", + "Ws": "kee", + "Tags": [ + "13a974bf-8b90-4f36-99c6-9f0771f53db0" + ] + }, + { + "Text": "SMTP", + "Ws": "cly", + "Bold": "Invert", + "FontSize": 872689318, + "ForeColor": "#0000FF", + "Tags": [ + "498aea00-217b-9a3e-7fd0-2748edadf3b3" + ] + } + ] + } + }, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [ + { + "Id": "292e9847-8c7c-56e1-87fb-41d200c789e1", + "Name": { + "hup": "THX", + "rsk": "Reduced", + "zmq": "hard drive", + "nnx": "cyan" + }, + "DeletedAt": null + } + ], + "VariantOf": [], + "Variants": [], + "PublishIn": [ + { + "Id": "bd874c92-e063-2a20-d263-bdc6897a1e85", + "DeletedAt": null, + "IsMain": false, + "Name": { + "zrg": "cross-platform", + "bno": "heuristic" + } + } + ] + }, + "Id": "8dbc0f41-998e-836a-97e1-f05d46d95c92", + "DeletedAt": null + } + }, + { + "Input": { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "84bb5f48-b2a9-d0c8-85ee-aec9203830ee", + "DeletedAt": null, + "LexemeForm": { + "dkk": "Product" + }, + "CitationForm": {}, + "LiteralMeaning": {}, + "MorphType": "Infix", + "HomographNumber": 1102525176, + "Senses": [], + "Note": {}, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [], + "PublishIn": [ + { + "Id": "78c00e29-d69e-56ba-77f5-b5be25469c4f", + "DeletedAt": null, + "IsMain": true, + "Name": { + "mps": "Small Granite Salad" + } + } + ] + }, + "Id": "84bb5f48-b2a9-d0c8-85ee-aec9203830ee", + "DeletedAt": null + }, + "Output": { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "84bb5f48-b2a9-d0c8-85ee-aec9203830ee", + "DeletedAt": null, + "LexemeForm": { + "dkk": "Product" + }, + "CitationForm": {}, + "LiteralMeaning": {}, + "MorphType": "Infix", + "HomographNumber": 1102525176, + "Senses": [], + "Note": {}, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], + "PublishIn": [ + { + "Id": "78c00e29-d69e-56ba-77f5-b5be25469c4f", + "DeletedAt": null, + "IsMain": true, + "Name": { + "mps": "Small Granite Salad" + } + } + ] + }, + "Id": "84bb5f48-b2a9-d0c8-85ee-aec9203830ee", + "DeletedAt": null + } + }, + { + "Input": { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "249c38f3-fc0d-195f-7533-97e8c140d0d7", + "DeletedAt": null, + "LexemeForm": { + "kvj": "Florida" + }, + "CitationForm": null, + "LiteralMeaning": null, + "MorphType": "Prefix", + "HomographNumber": 4, + "Senses": [], + "Note": null, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [], + "PublishIn": [] + }, + "Id": "249c38f3-fc0d-195f-7533-97e8c140d0d7", + "DeletedAt": null + }, + "Output": { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "249c38f3-fc0d-195f-7533-97e8c140d0d7", + "DeletedAt": null, + "LexemeForm": { + "kvj": "Florida" + }, + "CitationForm": null, + "LiteralMeaning": null, + "MorphType": "Prefix", + "HomographNumber": 4, + "Senses": [], + "Note": null, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], + "PublishIn": [] + }, + "Id": "249c38f3-fc0d-195f-7533-97e8c140d0d7", + "DeletedAt": null + } } ] \ No newline at end of file diff --git a/backend/FwLite/LcmCrdt.Tests/Data/VerifyRegeneratedSnapshotsAfterMigrationFromScriptedDb.v1.verified.json b/backend/FwLite/LcmCrdt.Tests/Data/VerifyRegeneratedSnapshotsAfterMigrationFromScriptedDb.v1.verified.json index b087157ce9..e733d6c2ac 100644 --- a/backend/FwLite/LcmCrdt.Tests/Data/VerifyRegeneratedSnapshotsAfterMigrationFromScriptedDb.v1.verified.json +++ b/backend/FwLite/LcmCrdt.Tests/Data/VerifyRegeneratedSnapshotsAfterMigrationFromScriptedDb.v1.verified.json @@ -70,6 +70,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [] }, "Id": "Guid_7" diff --git a/backend/FwLite/LcmCrdt.Tests/Data/VerifyRegeneratedSnapshotsAfterMigrationFromScriptedDb.v2.verified.json b/backend/FwLite/LcmCrdt.Tests/Data/VerifyRegeneratedSnapshotsAfterMigrationFromScriptedDb.v2.verified.json index b10f437131..77a842a4ac 100644 --- a/backend/FwLite/LcmCrdt.Tests/Data/VerifyRegeneratedSnapshotsAfterMigrationFromScriptedDb.v2.verified.json +++ b/backend/FwLite/LcmCrdt.Tests/Data/VerifyRegeneratedSnapshotsAfterMigrationFromScriptedDb.v2.verified.json @@ -122,6 +122,8 @@ } } ], + "VariantOf": [], + "Variants": [], "PublishIn": [] }, "Id": "Guid_4" @@ -163,6 +165,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [] }, "Id": "Guid_3" @@ -204,6 +208,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [] }, "Id": "Guid_16" @@ -245,6 +251,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [] }, "Id": "Guid_19" diff --git a/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.VerifyChangeModels.verified.txt b/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.VerifyChangeModels.verified.txt index f11904f409..9b70a58db5 100644 --- a/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.VerifyChangeModels.verified.txt +++ b/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.VerifyChangeModels.verified.txt @@ -40,6 +40,14 @@ DerivedType: JsonPatchChange, TypeDiscriminator: jsonPatch:ComplexFormType }, + { + DerivedType: JsonPatchChange, + TypeDiscriminator: jsonPatch:VariantType + }, + { + DerivedType: JsonPatchChange, + TypeDiscriminator: jsonPatch:Variant + }, { DerivedType: JsonPatchChange, TypeDiscriminator: jsonPatch:MorphType @@ -76,6 +84,14 @@ DerivedType: DeleteChange, TypeDiscriminator: delete:ComplexFormComponent }, + { + DerivedType: DeleteChange, + TypeDiscriminator: delete:VariantType + }, + { + DerivedType: DeleteChange, + TypeDiscriminator: delete:Variant + }, { DerivedType: DeleteChange, TypeDiscriminator: delete:Publication @@ -208,6 +224,22 @@ DerivedType: CreateComplexFormType, TypeDiscriminator: CreateComplexFormType }, + { + DerivedType: AddVariantChange, + TypeDiscriminator: AddVariantChange + }, + { + DerivedType: AddVariantTypeChange, + TypeDiscriminator: AddVariantTypeChange + }, + { + DerivedType: RemoveVariantTypeChange, + TypeDiscriminator: RemoveVariantTypeChange + }, + { + DerivedType: CreateVariantType, + TypeDiscriminator: CreateVariantType + }, { DerivedType: CreateCustomViewChange, TypeDiscriminator: CreateCustomViewChange diff --git a/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.VerifyDbModel.verified.txt b/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.VerifyDbModel.verified.txt index 6eaccd9213..23715abfaf 100644 --- a/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.VerifyDbModel.verified.txt +++ b/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.VerifyDbModel.verified.txt @@ -160,6 +160,8 @@ ComplexForms (List) Collection ToDependent ComplexFormComponent Components (List) Collection ToDependent ComplexFormComponent Senses (List) Collection ToDependent Sense + VariantOf (List) Collection ToDependent Variant + Variants (List) Collection ToDependent Variant Keys: Id PK Foreign keys: @@ -344,6 +346,70 @@ Relational:TableName: Sense Relational:ViewName: Relational:ViewSchema: + EntityType: Variant + Properties: + Id (_id, Guid) Required PK AfterSave:Throw ValueGenerated.OnAdd + Comment (RichMultiString) Required + Annotations: + Relational:ColumnType: jsonb + DeletedAt (DateTimeOffset?) + HideMinorEntry (bool) Required + MainEntryId (Guid) Required FK Index + MainHeadword (string) + MainSenseId (Guid?) FK Index + Annotations: + Relational:ColumnName: MainSenseId + SnapshotId (no field, Guid?) Shadow FK Index + Types (List) Required + Annotations: + Relational:ColumnType: jsonb + VariantEntryId (Guid) Required FK Index + VariantHeadword (string) + Keys: + Id PK + Foreign keys: + Variant {'MainEntryId'} -> Entry {'Id'} Required Cascade ToDependent: Variants + Variant {'MainSenseId'} -> Sense {'Id'} Cascade + Variant {'SnapshotId'} -> ObjectSnapshot {'Id'} Unique SetNull + Variant {'VariantEntryId'} -> Entry {'Id'} Required Cascade ToDependent: VariantOf + Indexes: + MainEntryId + MainSenseId + SnapshotId Unique + VariantEntryId, MainEntryId Unique + Annotations: + Relational:Filter: MainSenseId IS NULL + VariantEntryId, MainEntryId, MainSenseId Unique + Annotations: + Relational:Filter: MainSenseId IS NOT NULL + Annotations: + Relational:FunctionName: + Relational:Schema: + Relational:SqlQuery: + Relational:TableName: Variants + Relational:ViewName: + Relational:ViewSchema: + EntityType: VariantType + Properties: + Id (Guid) Required PK AfterSave:Throw ValueGenerated.OnAdd + DeletedAt (DateTimeOffset?) + Name (MultiString) Required + Annotations: + Relational:ColumnType: jsonb + SnapshotId (no field, Guid?) Shadow FK Index + Keys: + Id PK + Foreign keys: + VariantType {'SnapshotId'} -> ObjectSnapshot {'Id'} Unique SetNull + Indexes: + SnapshotId Unique + Annotations: + Relational:FunctionName: + Relational:Schema: + Relational:SqlQuery: + Relational:TableName: VariantType + Relational:ViewName: + Relational:ViewSchema: EntityType: WritingSystem Properties: Id (_id, Guid) Required PK AfterSave:Throw ValueGenerated.OnAdd diff --git a/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.VerifyIObjectWithIdModels.verified.txt b/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.VerifyIObjectWithIdModels.verified.txt index 048b425e86..09a82c9b55 100644 --- a/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.VerifyIObjectWithIdModels.verified.txt +++ b/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.VerifyIObjectWithIdModels.verified.txt @@ -36,6 +36,14 @@ DerivedType: ComplexFormComponent, TypeDiscriminator: ComplexFormComponent }, + { + DerivedType: VariantType, + TypeDiscriminator: VariantType + }, + { + DerivedType: Variant, + TypeDiscriminator: Variant + }, { DerivedType: CustomView, TypeDiscriminator: CustomView diff --git a/backend/FwLite/LcmCrdt.Tests/MiniLcmTests/VariantTests.cs b/backend/FwLite/LcmCrdt.Tests/MiniLcmTests/VariantTests.cs new file mode 100644 index 0000000000..d6fdefe61f --- /dev/null +++ b/backend/FwLite/LcmCrdt.Tests/MiniLcmTests/VariantTests.cs @@ -0,0 +1,55 @@ +namespace LcmCrdt.Tests.MiniLcmTests; + +public class VariantTests : VariantTestsBase +{ + private readonly MiniLcmApiFixture _fixture = new(); + + protected override async Task NewApi() + { + await _fixture.InitializeAsync(); + return _fixture.Api; + } + + public override async Task DisposeAsync() + { + await base.DisposeAsync(); + await _fixture.DisposeAsync(); + } + + [Fact] + public async Task Create_AlwaysAssignsNewEntityId() + { + // The caller's entity ID is never used. This matches FwData behavior (which ignores + // the ID entirely) and prevents Harmony duplicate-ID pitfalls during sync. + var input = Variant.FromEntries( + (await Api.GetEntry(_variantEntryId))!, + (await Api.GetEntry(_mainEntryId))!); + var providedId = input.Id; + + var created = await Api.CreateVariant(input); + + created.MaybeId.Should().NotBeNull(); + created.Id.Should().NotBe(providedId); + } + + [Fact] + public async Task Create_ChangingProperty_ProducesNewEntityId() + { + // When the sync diff detects a property change (e.g. MainEntryId), it does + // remove + add. The "add" reuses the same input object with the old entity ID. + var newMainEntry = await Api.CreateEntry(new() + { + LexemeForm = { { "en", "New Main" } } + }); + + var input = Variant.FromEntries( + (await Api.GetEntry(_variantEntryId))!, + (await Api.GetEntry(_mainEntryId))!); + var first = await Api.CreateVariant(input); + + input.MainEntryId = newMainEntry.Id; + var second = await Api.CreateVariant(input); + + second.Id.Should().NotBe(first.Id); + } +} diff --git a/backend/FwLite/LcmCrdt.Tests/SnapshotAtCommitServiceTests.cs b/backend/FwLite/LcmCrdt.Tests/SnapshotAtCommitServiceTests.cs index 64ce9d5783..5031284225 100644 --- a/backend/FwLite/LcmCrdt.Tests/SnapshotAtCommitServiceTests.cs +++ b/backend/FwLite/LcmCrdt.Tests/SnapshotAtCommitServiceTests.cs @@ -26,6 +26,7 @@ private void AssertSnapshotsAreEquivalentEqual(ProjectSnapshot expected, Project .WithoutStrictOrderingFor(x => x.SemanticDomains) .WithoutStrictOrderingFor(x => x.ComplexFormTypes) .WithoutStrictOrderingFor(x => x.MorphTypes) + .WithoutStrictOrderingFor(x => x.VariantTypes) ); } diff --git a/backend/FwLite/LcmCrdt/Changes/Entries/AddVariantChange.cs b/backend/FwLite/LcmCrdt/Changes/Entries/AddVariantChange.cs index 4e232f4e2b..d3c283d28f 100644 --- a/backend/FwLite/LcmCrdt/Changes/Entries/AddVariantChange.cs +++ b/backend/FwLite/LcmCrdt/Changes/Entries/AddVariantChange.cs @@ -84,30 +84,40 @@ public override async ValueTask NewEntity(Commit commit, IChangeContext private static async ValueTask CreatesReferenceCycleOrDuplicate(Variant parent, IChangeContext context) { if (parent.VariantEntryId == parent.MainEntryId) return true; - //used to avoid checking the same Variant multiple times - HashSet visited = [parent.Id]; - Queue queue = new Queue(); - queue.Enqueue(parent); + await foreach (var o in context.GetObjectsReferencing(parent.VariantEntryId)) + { + if (o is not Variant v) continue; + if (v.DeletedAt is not null) continue; + if (v.Id == parent.Id) continue; + var duplicate = v.VariantEntryId == parent.VariantEntryId && + v.MainEntryId == parent.MainEntryId && + v.MainSenseId == parent.MainSenseId; + if (duplicate) return true; + } + + //LCM enforces acyclicity over the COMBINED complex-form + variant component graph + //(LexEntryRef.ValidateAddObjectInternal → LexEntry.AllComponents), so mirror that: + //walk everything the main entry depends on through both link types; if the variant + //entry is reachable, this link would close a cycle FLEx rejects + HashSet visited = []; + Queue queue = new(); + queue.Enqueue(parent.MainEntryId); while (queue.Count > 0) { - var current = queue.Dequeue(); - if (current.VariantEntryId == parent.MainEntryId) return true; - await foreach (var o in context.GetObjectsReferencing(current.VariantEntryId)) + var entryId = queue.Dequeue(); + if (entryId == parent.VariantEntryId) return true; + if (!visited.Add(entryId)) continue; + await foreach (var o in context.GetObjectsReferencing(entryId)) { - if (o is not Variant v) continue; - if (v.DeletedAt is not null) continue; - if (visited.Contains(v.Id)) continue; - if (current == parent) + switch (o) { - var duplicate = v.VariantEntryId == parent.VariantEntryId && - v.MainEntryId == parent.MainEntryId && - v.MainSenseId == parent.MainSenseId; - if (duplicate) return true; + case Variant v when v.DeletedAt is null && v.VariantEntryId == entryId: + queue.Enqueue(v.MainEntryId); + break; + case ComplexFormComponent cfc when cfc.DeletedAt is null && cfc.ComplexFormEntryId == entryId: + queue.Enqueue(cfc.ComponentEntryId); + break; } - - if (v.VariantEntryId == parent.MainEntryId) return true; - queue.Enqueue(v); - visited.Add(v.Id); } } return false; diff --git a/backend/FwLite/MiniLcm.Tests/AutoFakerHelpers/EntryFakerHelper.cs b/backend/FwLite/MiniLcm.Tests/AutoFakerHelpers/EntryFakerHelper.cs index 71a884d72e..096dadb867 100644 --- a/backend/FwLite/MiniLcm.Tests/AutoFakerHelpers/EntryFakerHelper.cs +++ b/backend/FwLite/MiniLcm.Tests/AutoFakerHelpers/EntryFakerHelper.cs @@ -10,11 +10,12 @@ public static async Task EntryReadyForCreation(this AutoFaker autoFaker, bool createComplexForms = true, bool createComplexFormTypes = true, bool createComponents = true, - bool createPublications = true) + bool createPublications = true, + bool createVariants = true) { var entry = autoFaker.Generate(); if (entryId.HasValue) entry.Id = entryId.Value; - await PrepareToCreateEntry(api, entry, createComplexForms, createComplexFormTypes, createComponents, createPublications); + await PrepareToCreateEntry(api, entry, createComplexForms, createComplexFormTypes, createComponents, createPublications, createVariants); return entry; } @@ -27,12 +28,23 @@ public static async Task PrepareToCreateEntry( bool createComplexForms = true, bool createComplexFormTypes = true, bool createComponents = true, - bool createPublications = true) + bool createPublications = true, + bool createVariants = true) { if (createComponents) await CreateComplexFormComponentEntry(entry, true, entry.Components, api); if (createComplexForms) await CreateComplexFormComponentEntry(entry, false, entry.ComplexForms, api); if (createComplexFormTypes) await CreateComplexFormTypes(entry.ComplexFormTypes, api); if (createPublications) await CreatePublications(entry.PublishIn, api); + if (createVariants) + { + await CreateVariantLinkEntry(entry, isVariantOf: true, entry.VariantOf, api); + await CreateVariantLinkEntry(entry, isVariantOf: false, entry.Variants, api); + } + else + { + entry.VariantOf.Clear(); + entry.Variants.Clear(); + } foreach (var sense in entry.Senses) { @@ -130,6 +142,52 @@ private static async Task CreateComplexFormComponentEntry(Entry entry, } } + private static async Task CreateVariantLinkEntry(Entry entry, + bool isVariantOf, + IList variants, + IMiniLcmApi api) + { + int i = 1; + foreach (var variant in variants) + { + //generated entries won't have the expected ids, so fix them up here + if (isVariantOf) + { + variant.VariantEntryId = entry.Id; + } + else + { + variant.MainEntryId = entry.Id; + } + //generated sense ids don't reference real senses; targeting the entry is enough here + variant.MainSenseId = null; + + foreach (var variantType in variant.Types) + { + if (await api.GetVariantType(variantType.Id) is null) + await api.CreateVariantType(variantType); + } + + var name = $"test {(isVariantOf ? "main" : "variant")} entry {i}"; + var createdEntry = await api.CreateEntry(new() + { + Id = isVariantOf ? variant.MainEntryId : variant.VariantEntryId, + LexemeForm = { { "en", name } }, + }); + if (isVariantOf) + { + variant.MainHeadword = createdEntry.Headword(); + variant.VariantHeadword = entry.Headword(); + } + else + { + variant.VariantHeadword = createdEntry.Headword(); + variant.MainHeadword = entry.Headword(); + } + i++; + } + } + private static async Task CreateComplexFormTypes(IList complexFormTypes, IMiniLcmApi api) { foreach (var complexFormType in complexFormTypes) diff --git a/backend/FwLite/MiniLcm.Tests/Validators/VariantTypeValidationTests.cs b/backend/FwLite/MiniLcm.Tests/Validators/VariantTypeValidationTests.cs new file mode 100644 index 0000000000..57ee87f7cc --- /dev/null +++ b/backend/FwLite/MiniLcm.Tests/Validators/VariantTypeValidationTests.cs @@ -0,0 +1,44 @@ +using FluentValidation.TestHelper; +using MiniLcm.Validators; + +namespace MiniLcm.Tests.Validators; + +public class VariantTypeValidationTests +{ + private readonly VariantTypeValidator _validator = new(); + + [Fact] + public void FailsForEmptyName() + { + var variantType = new VariantType() { Name = new MultiString() }; + _validator.TestValidate(variantType).ShouldHaveValidationErrorFor(c => c.Name); + } + + [Fact] + public void FailsForNameWithEmptyStringValue() + { + var variantType = new VariantType() { Name = new() { { "en", string.Empty } } }; + _validator.TestValidate(variantType).ShouldHaveValidationErrorFor(c => c.Name); + } + + [Fact] + public void FailsForNonNullDeletedAt() + { + var variantType = new VariantType() + { + Name = new() { { "en", "test" } }, DeletedAt = DateTimeOffset.UtcNow + }; + _validator.TestValidate(variantType).ShouldHaveValidationErrorFor(c => c.DeletedAt); + } + + [Fact] + public void Succeeds() + { + var variantType = new VariantType() + { + Name = new() { { "en", "test" } }, + DeletedAt = null + }; + _validator.TestValidate(variantType).ShouldNotHaveAnyValidationErrors(); + } +} diff --git a/backend/FwLite/MiniLcm.Tests/Validators/VariantValidationTests.cs b/backend/FwLite/MiniLcm.Tests/Validators/VariantValidationTests.cs new file mode 100644 index 0000000000..3e4830b672 --- /dev/null +++ b/backend/FwLite/MiniLcm.Tests/Validators/VariantValidationTests.cs @@ -0,0 +1,64 @@ +using FluentValidation.TestHelper; +using MiniLcm.Validators; + +namespace MiniLcm.Tests.Validators; + +public class VariantValidationTests +{ + private readonly VariantValidator _validator = new(); + + private static Variant NewVariant() + { + return new Variant + { + Id = Guid.NewGuid(), + VariantEntryId = Guid.NewGuid(), + MainEntryId = Guid.NewGuid(), + }; + } + + [Fact] + public void Succeeds() + { + _validator.TestValidate(NewVariant()).ShouldNotHaveAnyValidationErrors(); + } + + [Fact] + public void FailsForNonNullDeletedAt() + { + var variant = NewVariant() with { DeletedAt = DateTimeOffset.UtcNow }; + _validator.TestValidate(variant).ShouldHaveValidationErrorFor(v => v.DeletedAt); + } + + [Fact] + public void FailsForSelfReference() + { + var id = Guid.NewGuid(); + var variant = NewVariant() with { VariantEntryId = id, MainEntryId = id }; + _validator.TestValidate(variant).IsValid.Should().BeFalse(); + } + + [Fact] + public void SucceedsWhenVariantEntryIdIsEmpty() + { + // nested in an entry the variant-entry side may be inferred from the parent + var variant = NewVariant() with { VariantEntryId = Guid.Empty }; + _validator.TestValidate(variant).ShouldNotHaveAnyValidationErrors(); + } + + [Fact] + public void FailsForCommentWithEmptyStringValue() + { + var variant = NewVariant(); + variant.Comment = new() { { "en", new RichString(string.Empty) } }; + _validator.TestValidate(variant).ShouldHaveValidationErrorFor(v => v.Comment); + } + + [Fact] + public void FailsForTypeWithEmptyName() + { + var variant = NewVariant(); + variant.Types = [new VariantType { Id = Guid.NewGuid(), Name = new MultiString() }]; + _validator.TestValidate(variant).IsValid.Should().BeFalse(); + } +} diff --git a/backend/FwLite/MiniLcm.Tests/VariantTestsBase.cs b/backend/FwLite/MiniLcm.Tests/VariantTestsBase.cs new file mode 100644 index 0000000000..701a05e97a --- /dev/null +++ b/backend/FwLite/MiniLcm.Tests/VariantTestsBase.cs @@ -0,0 +1,381 @@ +using MiniLcm.Models; + +namespace MiniLcm.Tests; + +public abstract class VariantTestsBase : MiniLcmTestBase +{ + protected readonly Guid _mainEntryId = Guid.NewGuid(); + protected readonly Guid _variantEntryId = Guid.NewGuid(); + protected readonly Guid _mainSenseId1 = Guid.NewGuid(); + protected readonly Guid _mainSenseId2 = Guid.NewGuid(); + protected Entry _mainEntry = null!; + protected Entry _variantEntry = null!; + + public override async Task InitializeAsync() + { + await base.InitializeAsync(); + _mainEntry = await Api.CreateEntry(new() + { + Id = _mainEntryId, + LexemeForm = { { "en", "main entry" } }, + Senses = + [ + new Sense + { + Id = _mainSenseId1, + Gloss = { { "en", "main sense 1" } } + }, + new Sense + { + Id = _mainSenseId2, + Gloss = { { "en", "main sense 2" } } + } + ] + }); + // deliberately sense-less: FLEx's "Insert Variant" creates variant entries without senses + _variantEntry = await Api.CreateEntry(new() + { + Id = _variantEntryId, + LexemeForm = { { "en", "variant form" } } + }); + } + + private async Task CreateVariantType(string name = "test type") + { + return await Api.CreateVariantType(new VariantType { Id = Guid.NewGuid(), Name = new() { { "en", name } } }); + } + + [Fact] + public async Task CreateVariant_Works() + { + var variant = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry)); + variant.VariantEntryId.Should().Be(_variantEntryId); + variant.MainEntryId.Should().Be(_mainEntryId); + variant.MainSenseId.Should().BeNull(); + variant.VariantHeadword.Should().Be("variant form"); + variant.MainHeadword.Should().Be("main entry"); + variant.Types.Should().BeEmpty(); + variant.HideMinorEntry.Should().BeFalse(); + variant.Comment.Should().BeEmpty(); + } + + [Fact] + public async Task CreateVariant_WithSense_Works() + { + var variant = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry, _mainSenseId1)); + variant.MainSenseId.Should().Be(_mainSenseId1); + + // a sense-targeted link still surfaces under the owning entry's Variants + var mainEntry = await Api.GetEntry(_mainEntryId); + mainEntry!.Variants.Should().ContainSingle(v => v.VariantEntryId == _variantEntryId && v.MainSenseId == _mainSenseId1); + } + + [Fact] + public async Task CreateVariant_WithTypesCommentAndHideMinorEntry_RoundTrips() + { + var type = await CreateVariantType(); + var input = Variant.FromEntries(_variantEntry, _mainEntry) with + { + Types = [type], + HideMinorEntry = true, + Comment = new() { { "en", new RichString("originally meant something else") } }, + }; + await Api.CreateVariant(input); + + var variantEntry = await Api.GetEntry(_variantEntryId); + var link = variantEntry!.VariantOf.Should().ContainSingle().Subject; + link.Types.Should().ContainSingle(t => t.Id == type.Id); + link.HideMinorEntry.Should().BeTrue(); + link.Comment["en"].GetPlainText().Should().Be("originally meant something else"); + + var mainEntry = await Api.GetEntry(_mainEntryId); + var backLink = mainEntry!.Variants.Should().ContainSingle().Subject; + backLink.Types.Should().ContainSingle(t => t.Id == type.Id); + backLink.HideMinorEntry.Should().BeTrue(); + backLink.Comment["en"].GetPlainText().Should().Be("originally meant something else"); + } + + [Fact] + public async Task VariantHeadwords_UpdateWhenReferencedEntriesChange() + { + await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry)); + + var beforeVariant = _variantEntry.Copy(); + _variantEntry.LexemeForm["en"] = "renamed variant"; + await Api.UpdateEntry(beforeVariant, _variantEntry); + + var mainEntry = (await Api.GetEntry(_mainEntryId))!; + var beforeMain = mainEntry.Copy(); + mainEntry.LexemeForm["en"] = "renamed main"; + await Api.UpdateEntry(beforeMain, mainEntry); + + var link = (await Api.GetEntry(_mainEntryId))!.Variants.Should().ContainSingle().Subject; + link.VariantHeadword.Should().Be("renamed variant"); + link.MainHeadword.Should().Be("renamed main"); + } + + [Fact] + public async Task DeleteVariant_Works() + { + var variant = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry)); + await Api.DeleteVariant(variant); + var entries = await Api.GetEntries().ToArrayAsync(); + var variantEntry = entries.Should().ContainSingle(e => e.Id == _variantEntryId).Subject; + var mainEntry = entries.Should().ContainSingle(e => e.Id == _mainEntryId).Subject; + variantEntry.VariantOf.Should().BeEmpty(); + mainEntry.Variants.Should().BeEmpty(); + } + + [Fact] + public async Task GetEntries_Works() + { + await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry)); + var entries = await Api.GetEntries().ToArrayAsync(); + var variantEntry = entries.Should().ContainSingle(e => e.Id == _variantEntryId).Subject; + var mainEntry = entries.Should().ContainSingle(e => e.Id == _mainEntryId).Subject; + variantEntry.VariantOf.Should().ContainSingle(v => v.MainEntryId == _mainEntryId); + mainEntry.Variants.Should().ContainSingle(v => v.VariantEntryId == _variantEntryId); + } + + [Fact] + public async Task VariantEntryWithoutSenses_RoundTrips() + { + await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry)); + var variantEntry = await Api.GetEntry(_variantEntryId); + variantEntry.Should().NotBeNull(); + variantEntry!.Senses.Should().BeEmpty(); + variantEntry.VariantOf.Should().ContainSingle(); + } + + [Fact] + public async Task CreateVariant_UsingTheSameLinkDoesNothing() + { + var variant1 = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry)); + var variant2 = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry)); + variant2.Should().BeEquivalentTo(variant1, options => options.ComparingByMembers().Excluding(v => v.Id)); + (await Api.GetEntry(_variantEntryId))!.VariantOf.Should().ContainSingle(); + } + + [Fact] + public async Task CreateVariant_UsingTheSameLinkWithSenseDoesNothing() + { + var variant1 = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry, _mainSenseId1)); + var variant2 = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry, _mainSenseId1)); + variant2.Should().BeEquivalentTo(variant1, options => options.ComparingByMembers().Excluding(v => v.Id)); + (await Api.GetEntry(_variantEntryId))!.VariantOf.Should().ContainSingle(); + } + + [Fact] + public async Task CreateVariant_ReplayingReturnedObject_IsIdempotent() + { + // Sync can be interrupted and replayed, so the exact same object (including its + // internal entity ID) may be passed to CreateVariant again. + var created = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry)); + var again = await Api.CreateVariant(created); + again.Should().BeEquivalentTo(created, options => options.ComparingByMembers().Excluding(v => v.Id)); + } + + [Fact] + public async Task CreateVariant_CanTargetMultipleSensesOfSameEntry() + { + var variant1 = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry, _mainSenseId1)); + variant1.MainSenseId.Should().Be(_mainSenseId1); + var variant2 = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry, _mainSenseId2)); + variant2.MainSenseId.Should().Be(_mainSenseId2); + + // ensure our sync code can handle them too + _variantEntry = (await Api.GetEntry(_variantEntryId))!; + await Api.UpdateEntry(_variantEntry, _variantEntry); + _mainEntry = (await Api.GetEntry(_mainEntryId))!; + await Api.UpdateEntry(_mainEntry, _mainEntry); + } + + [Fact] + public async Task CreateVariant_ChangingPropertyAndCreatingAgain_CreatesBoth() + { + var newMainEntry = await Api.CreateEntry(new() + { + Id = Guid.NewGuid(), + LexemeForm = { { "en", "new main" } } + }); + + var input = Variant.FromEntries(_variantEntry, _mainEntry); + var first = await Api.CreateVariant(input); + first.MainEntryId.Should().Be(_mainEntryId); + + // Mutate a property on the same object and create again. + // The sync diff does this when a property changes (remove + add). + input.MainEntryId = newMainEntry.Id; + var second = await Api.CreateVariant(input); + second.MainEntryId.Should().Be(newMainEntry.Id); + + var entry = await Api.GetEntry(_variantEntryId); + entry!.VariantOf.Should().HaveCount(2); + } + + [Fact] + public async Task CreateVariant_ThrowsOnSelfReference() + { + var act = async () => await Api.CreateVariant(Variant.FromEntries(_mainEntry, _mainEntry)); + await act.Should().ThrowAsync(); + } + + [Fact] + public async Task CreateVariant_AllowsChains() + { + // FLEx allows variant chains (a variant of a variant); we must too + var entry3 = await Api.CreateEntry(new() + { + Id = Guid.NewGuid(), + LexemeForm = { { "en", "entry3" } } + }); + await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry)); + await Api.CreateVariant(Variant.FromEntries(entry3, _variantEntry)); + var middle = await Api.GetEntry(_variantEntryId); + middle!.VariantOf.Should().ContainSingle(v => v.MainEntryId == _mainEntryId); + middle.Variants.Should().ContainSingle(v => v.VariantEntryId == entry3.Id); + } + + [Fact] + public async Task CreateVariant_ThrowsWhenMakingA2LayerReferenceCycle() + { + // LCM rejects circular component references (LexEntryRef.ValidateAddObjectInternal), + // so both implementations must too + await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry)); + var act = async () => await Api.CreateVariant(Variant.FromEntries(_mainEntry, _variantEntry)); + await act.Should().ThrowAsync(); + } + + [Fact] + public async Task CreateVariant_ThrowsWhenMakingA3LayerReferenceCycle() + { + var entry3 = await Api.CreateEntry(new() + { + Id = Guid.NewGuid(), + LexemeForm = { { "en", "entry3" } } + }); + await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry)); + await Api.CreateVariant(Variant.FromEntries(_mainEntry, entry3)); + var act = async () => await Api.CreateVariant(Variant.FromEntries(entry3, _variantEntry)); + await act.Should().ThrowAsync(); + } + + [Fact] + public async Task CreateVariant_ThrowsWhenClosingAMixedCycleThroughAComplexForm() + { + // LCM's cycle check spans the combined complex-form + variant component graph + await Api.CreateComplexFormComponent(ComplexFormComponent.FromEntries(_mainEntry, _variantEntry)); + var act = async () => await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry)); + await act.Should().ThrowAsync(); + } + + [Fact] + public async Task CreateVariant_WorksWhenALinkWasDeletedWhichWouldCauseACycle() + { + var created = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry)); + await Api.DeleteVariant(created); + var act = async () => await Api.CreateVariant(Variant.FromEntries(_mainEntry, _variantEntry)); + await act.Should().NotThrowAsync("a link was deleted which was part of the cycle"); + } + + [Fact] + public async Task UpdateVariant_SyncsTypesAndScalars() + { + var typeA = await CreateVariantType("type a"); + var typeB = await CreateVariantType("type b"); + var created = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with { Types = [typeA] }); + + var after = created.Copy(); + after.Types = [typeB]; + after.HideMinorEntry = true; + after.Comment = new() { { "en", new RichString("now hidden") } }; + await Api.UpdateVariant(created, after); + + var link = (await Api.GetEntry(_variantEntryId))!.VariantOf.Should().ContainSingle().Subject; + link.Types.Should().ContainSingle(t => t.Id == typeB.Id); + link.HideMinorEntry.Should().BeTrue(); + link.Comment["en"].GetPlainText().Should().Be("now hidden"); + } + + [Fact] + public async Task AddVariantType_Works() + { + var type = await CreateVariantType(); + var variant = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry)); + await Api.AddVariantType(variant, type.Id); + var link = (await Api.GetEntry(_variantEntryId))!.VariantOf.Should().ContainSingle().Subject; + link.Types.Should().ContainSingle(t => t.Id == type.Id); + } + + [Fact] + public async Task AddVariantType_IsIdempotent() + { + var type = await CreateVariantType(); + var variant = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry)); + await Api.AddVariantType(variant, type.Id); + await Api.AddVariantType(variant, type.Id); + var link = (await Api.GetEntry(_variantEntryId))!.VariantOf.Should().ContainSingle().Subject; + link.Types.Should().ContainSingle(t => t.Id == type.Id); + } + + [Fact] + public async Task RemoveVariantType_Works() + { + var type = await CreateVariantType(); + var variant = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with { Types = [type] }); + await Api.RemoveVariantType(variant, type.Id); + var link = (await Api.GetEntry(_variantEntryId))!.VariantOf.Should().ContainSingle().Subject; + link.Types.Should().BeEmpty(); + } + + [Fact] + public async Task RemoveVariantType_WorksWhenTypeIsNotOnLink() + { + var variant = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry)); + await Api.RemoveVariantType(variant, Guid.NewGuid()); + } + + [Fact] + public async Task CreateVariantType_Works() + { + var variantType = new VariantType() { Id = Guid.NewGuid(), Name = new() { { "en", "test" } } }; + await Api.CreateVariantType(variantType); + var types = await Api.GetVariantTypes().ToArrayAsync(); + types.Should().ContainSingle(t => t.Id == variantType.Id); + } + + [Fact] + public async Task UpdateVariantType_Works() + { + var variantType = new VariantType() { Id = Guid.NewGuid(), Name = new() { { "en", "test" } } }; + await Api.CreateVariantType(variantType); + var updatedVariantType = await Api.UpdateVariantType(variantType.Id, new UpdateObjectInput().Set(c => c.Name["en"], "updated")); + updatedVariantType.Name["en"].Should().Be("updated"); + } + + [Fact] + public async Task UpdateVariantTypeSync_Works() + { + var variantType = new VariantType() { Id = Guid.NewGuid(), Name = new() { { "en", "test" } } }; + await Api.CreateVariantType(variantType); + var afterVariantType = variantType with { Name = new() { { "en", "updated" } } }; + var actualVariantType = await Api.UpdateVariantType(variantType, afterVariantType); + actualVariantType.Should().BeEquivalentTo(afterVariantType, options => options.Excluding(c => c.Id)); + } + + [Fact] + public async Task EntryCanBeBothVariantAndComponent() + { + var complexFormEntry = await Api.CreateEntry(new() + { + Id = Guid.NewGuid(), + LexemeForm = { { "en", "complex form" } } + }); + await Api.CreateComplexFormComponent(ComplexFormComponent.FromEntries(complexFormEntry, _variantEntry)); + await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry)); + + var entry = await Api.GetEntry(_variantEntryId); + entry!.ComplexForms.Should().ContainSingle(c => c.ComplexFormEntryId == complexFormEntry.Id); + entry.VariantOf.Should().ContainSingle(v => v.MainEntryId == _mainEntryId); + } +} diff --git a/backend/FwLite/MiniLcm/Import/ProjectImporter.cs b/backend/FwLite/MiniLcm/Import/ProjectImporter.cs index 95cf713b52..4084505f17 100644 --- a/backend/FwLite/MiniLcm/Import/ProjectImporter.cs +++ b/backend/FwLite/MiniLcm/Import/ProjectImporter.cs @@ -6,9 +6,9 @@ namespace MiniLcm.Import; /// /// Populates from a in dependency order -/// (writing systems → parts of speech → publications → complex-form types → morph types → -/// semantic domains → entries). Both FwData→CRDT import and template-based project creation funnel -/// through here, so the ordering and the create-vs-update rules live in exactly one place. +/// (writing systems → parts of speech → publications → complex-form types → variant types → +/// morph types → semantic domains → entries). Both FwData→CRDT import and template-based project +/// creation funnel through here, so the ordering and the create-vs-update rules live in exactly one place. /// public class ProjectImporter(ILogger logger) { @@ -39,6 +39,13 @@ public async Task ImportProject(IMiniLcmApi importTo, ProjectSnapshot snapshot) logger.LogInformation("Imported complex form type {Id}", complexFormType.Id); } + logger.LogInformation("Importing {Count} variant types", snapshot.VariantTypes.Length); + foreach (var variantType in snapshot.VariantTypes) + { + await importTo.CreateVariantType(variantType); + logger.LogInformation("Imported variant type {Id}", variantType.Id); + } + // Reconcile against the destination's existing morph types: MorphTypeSync updates them in place // and creates any missing, but rejects removals — canonical morph types can't be deleted. logger.LogInformation("Importing/Syncing {Count} morph types", snapshot.MorphTypes.Length); diff --git a/backend/FwLite/MiniLcm/MiniLcmApiExtensions.cs b/backend/FwLite/MiniLcm/MiniLcmApiExtensions.cs index e6165321c4..02bc3fa560 100644 --- a/backend/FwLite/MiniLcm/MiniLcmApiExtensions.cs +++ b/backend/FwLite/MiniLcm/MiniLcmApiExtensions.cs @@ -18,6 +18,7 @@ await api.GetPublications().ToArrayAsync(), await api.GetSemanticDomains().ToArrayAsync(), await api.GetComplexFormTypes().ToArrayAsync(), await api.GetMorphTypes().ToArrayAsync(), + await api.GetVariantTypes().ToArrayAsync(), await api.GetWritingSystems()); } } diff --git a/backend/FwLite/MiniLcm/ProjectSnapshot.cs b/backend/FwLite/MiniLcm/ProjectSnapshot.cs index f6c880fe76..95ae5f8920 100644 --- a/backend/FwLite/MiniLcm/ProjectSnapshot.cs +++ b/backend/FwLite/MiniLcm/ProjectSnapshot.cs @@ -9,7 +9,11 @@ public record ProjectSnapshot( SemanticDomain[] SemanticDomains, ComplexFormType[] ComplexFormTypes, MorphType[] MorphTypes, + VariantType[] VariantTypes, WritingSystems WritingSystems) { - public static ProjectSnapshot Empty { get; } = new([], [], [], [], [], [], new WritingSystems()); + public static ProjectSnapshot Empty { get; } = new([], [], [], [], [], [], [], new WritingSystems()); + + //snapshots and templates serialized before variant support deserialize this as null + public VariantType[] VariantTypes { get; init; } = VariantTypes ?? []; } diff --git a/backend/FwLite/MiniLcm/Validators/VariantValidator.cs b/backend/FwLite/MiniLcm/Validators/VariantValidator.cs index 43fe4d7eb2..f03f2799e4 100644 --- a/backend/FwLite/MiniLcm/Validators/VariantValidator.cs +++ b/backend/FwLite/MiniLcm/Validators/VariantValidator.cs @@ -8,6 +8,11 @@ internal class VariantValidator : AbstractValidator public VariantValidator() { RuleFor(v => v.DeletedAt).Null(); + //one endpoint may be an empty guid when nested in an entry (inferred from the parent), + //so only reject self-reference when both are set + RuleFor(v => v) + .Must(v => v.VariantEntryId == Guid.Empty || v.VariantEntryId != v.MainEntryId) + .WithMessage(v => $"Variant {GetIdentifier(v)} must not be a variant of itself."); RuleFor(v => v.Comment).NoEmptyValues(GetIdentifier).NoDefaultWritingSystems(GetIdentifier); RuleForEach(v => v.Types).SetValidator(new VariantTypeValidator()); } diff --git a/backend/FwLite/VARIANTS.md b/backend/FwLite/VARIANTS.md index 5a5883d9f2..df4c93050b 100644 --- a/backend/FwLite/VARIANTS.md +++ b/backend/FwLite/VARIANTS.md @@ -7,12 +7,20 @@ dev/agent can pick up the work mid-stream. Update the **Status** section as step - [x] Exploration (complex-forms blueprint, liblcm variant model, viewer UI) - [x] Design review with Tim (2026-07-03): per-link model confirmed, naming settled -- [ ] Step 1 — MiniLcm model, CRDT change types, both API implementations, conformance tests -- [ ] Step 2 — FwData↔CRDT project sync (orchestration, snapshot, round-trip tests) +- [~] Step 1 — model, changes, both APIs, sync orchestration, conformance tests + (in progress: conformance suites green both sides; chasing fallout in broader + LcmCrdt.Tests run) +- [ ] Step 2 — sync round-trip test suite, upgrade tests, Sena3 + verified regens - [ ] Step 3 — Viewer UI (fields, picker, i18n, Playwright) Branches are stacked: `feat/variants-model` ← `feat/variants-sync` ← `feat/variants-ui`. +**Boundary change vs the original plan**: the sync/import orchestration +(`VariantTypeSync` in `SyncInternal`, `ProjectSnapshot.VariantTypes`, `ProjectImporter` +variant-type loop, `ResumableImportApi` caching) moved INTO step 1 — the moment the FwData +bridge reads variants, importing a variant-containing project crashes unless variant types +are imported before entries, so a "model-only" PR can't be green against real projects. + ## The LCM model (authority: liblcm) A variant relationship is a `LexEntryRef` **owned by the variant (minor) entry** @@ -105,9 +113,13 @@ public record Variant : IObjectWithId This is what makes concurrent type edits merge instead of last-writer-wins. 6. **No ordering.** Variant lists have no user-meaningful order in FLEx; both directions diff as sets. No `IOrderable`, no `SetOrderChange`, no Move API. -7. **Cycle/duplicate guard mirrors `AddEntryComponentChange`** — lives in the *change class* - (soft-deletes instead of throwing, because sync must tolerate incoming duplicates); - validator only rejects self-reference cheaply. Don't duplicate the BFS in validators. +7. **Only self-reference and duplicates are rejected — NOT chains or cycles.** This + deliberately diverges from complex forms' BFS cycle guard: FLEx itself allows variant + chains and cycles (`MakeVariantOf` has no cycle check, unlike complex-form components), + and FwLite never traverses variant links recursively, so rejecting shapes FLEx data can + contain would make sync diverge permanently. The duplicate guard lives in + `AddVariantChange` (soft-delete, sync-tolerant); self-reference is rejected by + `VariantValidator` in the validation wrapper (consistent across both implementations). 8. **Deleted `VariantType` cleanup**: `Variant.GetReferences()` includes its `Types` ids, and `RemoveReference` removes the type from the list (only endpoint ids soft-delete the link). Better than the complex-forms quirk where deleted types linger in `Entry.ComplexFormTypes`. From deb8129365f3d7c93ba14dec56342b277a638519 Mon Sep 17 00:00:00 2001 From: Tim Haasdyk Date: Sat, 4 Jul 2026 14:01:03 +0200 Subject: [PATCH 03/21] Add variant fields to viewer entry factories and demo data Co-Authored-By: Claude Fable 5 --- frontend/viewer/src/lib/utils.ts | 2 ++ frontend/viewer/src/project/demo/demo-entry-data.ts | 6 ++++-- .../entity-primitives/entry-editor-primitive.stories.svelte | 2 ++ frontend/viewer/tests/entry-api-helper.ts | 4 ++++ 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/frontend/viewer/src/lib/utils.ts b/frontend/viewer/src/lib/utils.ts index 55ccdacd9f..9e2c201945 100644 --- a/frontend/viewer/src/lib/utils.ts +++ b/frontend/viewer/src/lib/utils.ts @@ -44,6 +44,8 @@ export function defaultEntry(): IEntry { complexForms: [], complexFormTypes: [], components: [], + variantOf: [], + variants: [], publishIn: [], morphType: MorphTypeKind.Stem, homographNumber: 0, diff --git a/frontend/viewer/src/project/demo/demo-entry-data.ts b/frontend/viewer/src/project/demo/demo-entry-data.ts index 787da7cb05..02af4eadc2 100644 --- a/frontend/viewer/src/project/demo/demo-entry-data.ts +++ b/frontend/viewer/src/project/demo/demo-entry-data.ts @@ -207,7 +207,7 @@ export const _entries: IEntry[] = [ 'exampleSentences': [] } ], 'note': {}, - complexForms: [], complexFormTypes: [], components: [], publishIn: [], + complexForms: [], complexFormTypes: [], components: [], variantOf: [], variants: [], publishIn: [], homographNumber: 0, }, { @@ -277,6 +277,8 @@ export const _entries: IEntry[] = [ complexForms: [], complexFormTypes: [], components: [], + variantOf: [], + variants: [], publishIn: [], homographNumber: 0, }, @@ -321,7 +323,7 @@ export const allWsEntry: IEntry = { }], }], note: {}, - complexForms: [], complexFormTypes: [], components: [], publishIn: [], + complexForms: [], complexFormTypes: [], components: [], variantOf: [], variants: [], publishIn: [], homographNumber: 0, }; diff --git a/frontend/viewer/src/stories/editor/entity-primitives/entry-editor-primitive.stories.svelte b/frontend/viewer/src/stories/editor/entity-primitives/entry-editor-primitive.stories.svelte index fda6e8d5fd..695c8f09c7 100644 --- a/frontend/viewer/src/stories/editor/entity-primitives/entry-editor-primitive.stories.svelte +++ b/frontend/viewer/src/stories/editor/entity-primitives/entry-editor-primitive.stories.svelte @@ -40,6 +40,8 @@ complexForms: [], complexFormTypes: [], components: [], + variantOf: [], + variants: [], publishIn: [], senses: [], morphType: MorphTypeKind.Stem, diff --git a/frontend/viewer/tests/entry-api-helper.ts b/frontend/viewer/tests/entry-api-helper.ts index 485cfe1164..3d4917d01b 100644 --- a/frontend/viewer/tests/entry-api-helper.ts +++ b/frontend/viewer/tests/entry-api-helper.ts @@ -79,6 +79,8 @@ export class EntryApiHelper { components: [], complexForms: [], complexFormTypes: [], + variantOf: [], + variants: [], publishIn: [], homographNumber: 0, }; @@ -101,6 +103,8 @@ export class EntryApiHelper { components: [], complexForms: [], complexFormTypes: [], + variantOf: [], + variants: [], publishIn: [], homographNumber: 0, }; From ef20839886d205673adb7bbf70a408e32c79777f Mon Sep 17 00:00:00 2001 From: Tim Haasdyk Date: Sat, 4 Jul 2026 14:15:07 +0200 Subject: [PATCH 04/21] Seed standard variant types in the blank project template Regenerated via ProjectTemplateTests.GenerateTemplate; new CRDT projects get the 7 standard FLEx variant types (well-known guids), matching FieldWorks. Co-Authored-By: Claude Fable 5 --- ...ScriptedDb.v1.ProjectSnapshot.verified.txt | 4 +- ...ScriptedDb.v2.ProjectSnapshot.verified.txt | 4 +- .../Templates/blank-project-template.json | 57 ++++++++++++++++++- .../MiniLcm.Tests/FluentAssertGlobalConfig.cs | 2 +- .../FwLite/MiniLcm.Tests/VariantTestsBase.cs | 6 +- 5 files changed, 62 insertions(+), 11 deletions(-) diff --git a/backend/FwLite/LcmCrdt.Tests/Data/MigrationTests_FromScriptedDb.v1.ProjectSnapshot.verified.txt b/backend/FwLite/LcmCrdt.Tests/Data/MigrationTests_FromScriptedDb.v1.ProjectSnapshot.verified.txt index 64a5a30f0b..10b9e90d11 100644 --- a/backend/FwLite/LcmCrdt.Tests/Data/MigrationTests_FromScriptedDb.v1.ProjectSnapshot.verified.txt +++ b/backend/FwLite/LcmCrdt.Tests/Data/MigrationTests_FromScriptedDb.v1.ProjectSnapshot.verified.txt @@ -168,7 +168,6 @@ } ], "MorphTypes": [], - "VariantTypes": [], "WritingSystems": { "Analysis": [ { @@ -254,5 +253,6 @@ "Order": 0 } ] - } + }, + "VariantTypes": [] } \ No newline at end of file diff --git a/backend/FwLite/LcmCrdt.Tests/Data/MigrationTests_FromScriptedDb.v2.ProjectSnapshot.verified.txt b/backend/FwLite/LcmCrdt.Tests/Data/MigrationTests_FromScriptedDb.v2.ProjectSnapshot.verified.txt index 493e75ff38..4eea61e35a 100644 --- a/backend/FwLite/LcmCrdt.Tests/Data/MigrationTests_FromScriptedDb.v2.ProjectSnapshot.verified.txt +++ b/backend/FwLite/LcmCrdt.Tests/Data/MigrationTests_FromScriptedDb.v2.ProjectSnapshot.verified.txt @@ -496,7 +496,6 @@ } ], "MorphTypes": [], - "VariantTypes": [], "WritingSystems": { "Analysis": [ { @@ -742,5 +741,6 @@ "Order": 3 } ] - } + }, + "VariantTypes": [] } \ No newline at end of file diff --git a/backend/FwLite/LcmCrdt/Templates/blank-project-template.json b/backend/FwLite/LcmCrdt/Templates/blank-project-template.json index 1958dfe164..6b08a17f7f 100644 --- a/backend/FwLite/LcmCrdt/Templates/blank-project-template.json +++ b/backend/FwLite/LcmCrdt/Templates/blank-project-template.json @@ -16739,8 +16739,8 @@ "WritingSystems": { "Analysis": [ { - "Id": "e15928c1-48ce-439c-bbf7-f23457718d72", - "MaybeId": "e15928c1-48ce-439c-bbf7-f23457718d72", + "Id": "53f7afa3-13c7-4c07-a9e4-038912170095", + "MaybeId": "53f7afa3-13c7-4c07-a9e4-038912170095", "WsId": "en", "IsAudio": false, "Name": "en", @@ -16780,5 +16780,56 @@ } ], "Vernacular": [] - } + }, + "VariantTypes": [ + { + "Id": "3942addb-99fd-43e9-ab7d-99025ceb0d4e", + "Name": { + "en": "Unspecified Variant" + }, + "DeletedAt": null + }, + { + "Id": "024b62c9-93b3-41a0-ab19-587a0030219a", + "Name": { + "en": "Dialectal Variant" + }, + "DeletedAt": null + }, + { + "Id": "4343b1ef-b54f-4fa4-9998-271319a6d74c", + "Name": { + "en": "Free Variant" + }, + "DeletedAt": null + }, + { + "Id": "01d4fbc1-3b0c-4f52-9163-7ab0d4f4711c", + "Name": { + "en": "Irregularly Inflected Form" + }, + "DeletedAt": null + }, + { + "Id": "a32f1d1c-4832-46a2-9732-c2276d6547e8", + "Name": { + "en": "Plural" + }, + "DeletedAt": null + }, + { + "Id": "837ebe72-8c1d-4864-95d9-fa313c499d78", + "Name": { + "en": "Past" + }, + "DeletedAt": null + }, + { + "Id": "0c4663b3-4d9a-47af-b9a1-c8565d8112ed", + "Name": { + "en": "Spelling Variant" + }, + "DeletedAt": null + } + ] } \ No newline at end of file diff --git a/backend/FwLite/MiniLcm.Tests/FluentAssertGlobalConfig.cs b/backend/FwLite/MiniLcm.Tests/FluentAssertGlobalConfig.cs index c8b247b304..a71382a606 100644 --- a/backend/FwLite/MiniLcm.Tests/FluentAssertGlobalConfig.cs +++ b/backend/FwLite/MiniLcm.Tests/FluentAssertGlobalConfig.cs @@ -14,7 +14,7 @@ public static void Initialize() //however that will result in very poor error messages, so we override it .ComparingByMembers() .ComparingByMembers() - .Excluding(m => (m.DeclaringType == typeof(ComplexFormComponent) || m.DeclaringType == typeof(WritingSystem)) + .Excluding(m => (m.DeclaringType == typeof(ComplexFormComponent) || m.DeclaringType == typeof(Variant) || m.DeclaringType == typeof(WritingSystem)) && (m.Name == nameof(ComplexFormComponent.Id) || m.Name == nameof(ComplexFormComponent.MaybeId))) //Shadow query-rewrite targets — domain state lives on the underlying collection. .Excluding(m => (m.DeclaringType == typeof(Entry) && m.Name == nameof(Entry.PublishInRows)) diff --git a/backend/FwLite/MiniLcm.Tests/VariantTestsBase.cs b/backend/FwLite/MiniLcm.Tests/VariantTestsBase.cs index 701a05e97a..6f6f616e8c 100644 --- a/backend/FwLite/MiniLcm.Tests/VariantTestsBase.cs +++ b/backend/FwLite/MiniLcm.Tests/VariantTestsBase.cs @@ -152,7 +152,7 @@ public async Task CreateVariant_UsingTheSameLinkDoesNothing() { var variant1 = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry)); var variant2 = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry)); - variant2.Should().BeEquivalentTo(variant1, options => options.ComparingByMembers().Excluding(v => v.Id)); + variant2.Should().BeEquivalentTo(variant1); (await Api.GetEntry(_variantEntryId))!.VariantOf.Should().ContainSingle(); } @@ -161,7 +161,7 @@ public async Task CreateVariant_UsingTheSameLinkWithSenseDoesNothing() { var variant1 = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry, _mainSenseId1)); var variant2 = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry, _mainSenseId1)); - variant2.Should().BeEquivalentTo(variant1, options => options.ComparingByMembers().Excluding(v => v.Id)); + variant2.Should().BeEquivalentTo(variant1); (await Api.GetEntry(_variantEntryId))!.VariantOf.Should().ContainSingle(); } @@ -172,7 +172,7 @@ public async Task CreateVariant_ReplayingReturnedObject_IsIdempotent() // internal entity ID) may be passed to CreateVariant again. var created = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry)); var again = await Api.CreateVariant(created); - again.Should().BeEquivalentTo(created, options => options.ComparingByMembers().Excluding(v => v.Id)); + again.Should().BeEquivalentTo(created); } [Fact] From f11fc37f8aeb0a0022f6d1d049cb265d424e0f91 Mon Sep 17 00:00:00 2001 From: Tim Haasdyk Date: Sat, 4 Jul 2026 14:43:32 +0200 Subject: [PATCH 05/21] Sync variants FwData<->CRDT: round-trip tests, import fast path, Sena3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Variant lists sort by composite key on both sides (deterministic, culture-free); BulkCreateEntries emits variant links; regenerated Sena3 live db + snapshots — sena-3's real variants (custom Pronunciation Variant type) now round-trip. Co-Authored-By: Claude Fable 5 --- .../Api/FwDataMiniLcmApi.cs | 6 +- .../FwLiteProjectSync.Tests/EntrySyncTests.cs | 9 + .../Import/ResumableTests.cs | 6 + .../sena-3_snapshot.2026-06-18.verified.txt | 2927 ++++++++++++++- .../UpdateDiffTests.cs | 2 + .../VariantSyncTests.cs | 316 ++ .../sena-3-live.verified.sqlite | Bin 11436032 -> 11436032 bytes .../sena-3-live_snapshot.verified.txt | 3150 ++++++++++++++++- .../Services/MiniLcmJsInvokable.cs | 42 + backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs | 12 + backend/FwLite/LcmCrdt/QueryHelpers.cs | 23 +- backend/FwLite/MiniLcm/Models/Variant.cs | 17 + .../Services/IMiniLcmJsInvokable.ts | 8 + frontend/viewer/src/project/data/index.ts | 1 + .../viewer/src/project/data/variant-types.ts | 10 + 15 files changed, 6504 insertions(+), 25 deletions(-) create mode 100644 backend/FwLite/FwLiteProjectSync.Tests/VariantSyncTests.cs create mode 100644 frontend/viewer/src/project/data/variant-types.ts diff --git a/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs b/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs index 577190511c..670d205b5a 100644 --- a/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs +++ b/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs @@ -794,7 +794,8 @@ private IEnumerable ToVariantOf(ILexEntry entry) ILexSense mainSense => ToVariant(entry, r, mainSense.Entry, mainSense), _ => throw new NotSupportedException($"object type {o.ClassName} not supported") }) - .DistinctBy(v => (v.VariantEntryId, v.MainEntryId, v.MainSenseId)); + .DistinctBy(v => (v.VariantEntryId, v.MainEntryId, v.MainSenseId)) + .Order(Variant.VariantOfOrder); } private IEnumerable ToVariants(ILexEntry entry) @@ -806,7 +807,8 @@ private IEnumerable ToVariants(ILexEntry entry) sense.VariantFormEntryBackRefs.Select(r => ToVariant(r.OwningEntry, r, entry, sense))) } .SelectMany(v => v) - .DistinctBy(v => (v.VariantEntryId, v.MainEntryId, v.MainSenseId)); + .DistinctBy(v => (v.VariantEntryId, v.MainEntryId, v.MainSenseId)) + .Order(Variant.VariantsOrder); } private Variant ToVariant(ILexEntry variantEntry, ILexEntryRef variantRef, ILexEntry mainEntry, ILexSense? mainSense) diff --git a/backend/FwLite/FwLiteProjectSync.Tests/EntrySyncTests.cs b/backend/FwLite/FwLiteProjectSync.Tests/EntrySyncTests.cs index e204582aeb..3435128a85 100644 --- a/backend/FwLite/FwLiteProjectSync.Tests/EntrySyncTests.cs +++ b/backend/FwLite/FwLiteProjectSync.Tests/EntrySyncTests.cs @@ -370,6 +370,15 @@ public async Task CanSyncRandomEntries(ApiType? roundTripApiType) options = options .For(e => e.Components).Exclude(c => c.ComplexFormHeadword) .For(e => e.ComplexForms).Exclude(c => c.ComponentHeadword); + // both apis sort variant links by composite key, not the order the expected object was built in; + // headwords are derived on read like the complex-form ones above (see VariantTestsBase) + options = options + .WithoutStrictOrderingFor(e => e.VariantOf) + .WithoutStrictOrderingFor(e => e.Variants) + .For(e => e.VariantOf).Exclude(v => v.VariantHeadword) + .For(e => e.VariantOf).Exclude(v => v.MainHeadword) + .For(e => e.Variants).Exclude(v => v.VariantHeadword) + .For(e => e.Variants).Exclude(v => v.MainHeadword); if (currentApiType == ApiType.FwData) { // does not support changing MorphType yet (see UpdateEntryProxy.MorphType) diff --git a/backend/FwLite/FwLiteProjectSync.Tests/Import/ResumableTests.cs b/backend/FwLite/FwLiteProjectSync.Tests/Import/ResumableTests.cs index 7bb31a7e67..127a4d9cd2 100644 --- a/backend/FwLite/FwLiteProjectSync.Tests/Import/ResumableTests.cs +++ b/backend/FwLite/FwLiteProjectSync.Tests/Import/ResumableTests.cs @@ -82,6 +82,12 @@ public async Task ImportProject_IsResumable_AcrossRandomFailures() Id = Guid.NewGuid(), Name = new(){ ["en"] = "Test Complex Form Type" } }])); + mockFrom.Setup(f => f.GetVariantTypes()) + .Returns(MockAsyncEnumerable([new VariantType() + { + Id = Guid.NewGuid(), + Name = new(){ ["en"] = "Test Variant Type" } + }])); mockFrom.Setup(f => f.GetMorphTypes()) .Returns(MockAsyncEnumerable(expectedMorphTypes)); mockFrom.Setup(f => f.GetSemanticDomains()) diff --git a/backend/FwLite/FwLiteProjectSync.Tests/Snapshots/sena-3_snapshot.2026-06-18.verified.txt b/backend/FwLite/FwLiteProjectSync.Tests/Snapshots/sena-3_snapshot.2026-06-18.verified.txt index 37f9fde0ec..a2568e6031 100644 --- a/backend/FwLite/FwLiteProjectSync.Tests/Snapshots/sena-3_snapshot.2026-06-18.verified.txt +++ b/backend/FwLite/FwLiteProjectSync.Tests/Snapshots/sena-3_snapshot.2026-06-18.verified.txt @@ -98,6 +98,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -238,6 +240,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -313,6 +317,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -477,6 +483,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -528,6 +536,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -579,6 +589,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -662,6 +674,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -713,6 +727,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -764,6 +780,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -872,6 +890,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -915,6 +935,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -966,6 +988,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -1076,6 +1100,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -1163,6 +1189,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -1214,6 +1242,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -1265,6 +1295,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -1332,6 +1364,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -1383,6 +1417,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -1434,6 +1470,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -1485,6 +1523,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -1578,6 +1618,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -1658,6 +1700,8 @@ } ], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -1728,6 +1772,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -1815,6 +1861,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -1878,6 +1926,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -1964,6 +2014,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -2051,6 +2103,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -2171,6 +2225,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -2262,6 +2318,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -2347,6 +2405,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -2425,6 +2485,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -2476,6 +2538,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -2571,6 +2635,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -2651,6 +2717,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -2719,6 +2787,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -2780,6 +2850,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -2943,6 +3015,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -3021,6 +3095,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -3089,6 +3165,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -3157,6 +3235,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -3218,6 +3298,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -3281,6 +3363,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -3358,6 +3442,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -3476,6 +3562,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -3547,6 +3635,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -3632,6 +3722,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -3700,6 +3792,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -3785,6 +3879,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -3848,6 +3944,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -3928,6 +4026,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -4023,6 +4123,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -4084,6 +4186,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -4216,6 +4320,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -4320,6 +4426,8 @@ } ], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -4466,6 +4574,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -4551,6 +4661,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -4612,6 +4724,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -4673,6 +4787,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -4733,6 +4849,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -4810,6 +4928,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -4895,6 +5015,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -4975,6 +5097,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -5035,6 +5159,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -5096,6 +5222,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -5147,6 +5275,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -5217,6 +5347,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -5352,6 +5484,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -5505,6 +5639,8 @@ } ], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -5568,6 +5704,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -5631,6 +5769,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -5703,6 +5843,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -5771,6 +5913,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -5832,6 +5976,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -6001,6 +6147,8 @@ } ], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -6094,6 +6242,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -6166,6 +6316,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -6267,6 +6419,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -6370,6 +6524,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -6438,6 +6594,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -6501,6 +6659,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -6613,6 +6773,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -6730,6 +6892,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -6809,6 +6973,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -6902,6 +7068,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -6979,6 +7147,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -7073,6 +7243,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -7136,6 +7308,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -7222,6 +7396,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -7275,6 +7451,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -7360,6 +7538,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -7430,6 +7610,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -7523,6 +7705,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -7632,6 +7816,8 @@ } ], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -7711,6 +7897,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -7774,6 +7962,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -7851,6 +8041,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -7914,6 +8106,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -7984,6 +8178,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -8035,6 +8231,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -8105,6 +8303,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -8158,6 +8358,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -8201,6 +8403,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -8302,6 +8506,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -8382,6 +8588,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -8452,6 +8660,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -8532,6 +8742,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -8602,6 +8814,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -8672,6 +8886,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -8742,6 +8958,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -8812,6 +9030,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -8899,6 +9119,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -8950,6 +9172,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -9051,6 +9275,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -9114,6 +9340,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -9184,6 +9412,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -9325,6 +9555,8 @@ } ], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -9429,6 +9661,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -9492,6 +9726,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -9562,6 +9798,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -9625,6 +9863,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -9688,6 +9928,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -9751,6 +9993,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -9804,6 +10048,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -9872,6 +10118,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -9935,6 +10183,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -9998,6 +10248,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -10060,6 +10312,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -10152,6 +10406,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -10222,6 +10478,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -10292,6 +10550,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -10377,6 +10637,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -10440,6 +10702,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -10510,6 +10774,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -10587,6 +10853,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -10674,6 +10942,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -10737,6 +11007,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -10800,6 +11072,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -10938,6 +11212,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -11047,6 +11323,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -11098,6 +11376,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -11209,6 +11489,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -11289,6 +11571,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -11369,6 +11653,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -11441,6 +11727,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -11504,6 +11792,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -11567,6 +11857,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -11630,6 +11922,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -11693,6 +11987,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -11765,6 +12061,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -11835,6 +12133,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -11886,6 +12186,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -11966,6 +12268,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -12029,6 +12333,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -12128,6 +12434,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -12179,6 +12487,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -12266,6 +12576,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -12353,6 +12665,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -12416,6 +12730,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -12488,6 +12804,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -12577,6 +12895,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -12640,6 +12960,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -12724,6 +13046,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -12802,6 +13126,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -12865,6 +13191,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -12960,6 +13288,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -13037,6 +13367,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -13088,6 +13420,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -13158,6 +13492,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -13261,6 +13597,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -13324,6 +13662,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -13411,6 +13751,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -13505,6 +13847,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -13558,6 +13902,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -13628,6 +13974,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -13698,6 +14046,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -13759,6 +14109,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -13899,6 +14251,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -13962,6 +14316,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -14041,6 +14397,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -14104,6 +14462,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -14183,6 +14543,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -14265,6 +14627,8 @@ } ], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -14359,6 +14723,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -14446,6 +14812,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -14516,6 +14884,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -14589,6 +14959,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -14662,6 +15034,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -14732,6 +15106,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -14800,6 +15176,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -14895,6 +15273,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -14989,6 +15369,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -15059,6 +15441,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -15120,6 +15504,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -15190,6 +15576,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -15260,6 +15648,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -15313,6 +15703,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -15376,6 +15768,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -15470,6 +15864,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -15540,6 +15936,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -15610,6 +16008,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -15680,6 +16080,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -15760,6 +16162,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -15839,6 +16243,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -15909,6 +16315,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -15991,6 +16399,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -16067,6 +16477,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -16161,6 +16573,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -16231,6 +16645,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -16282,6 +16698,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -16345,6 +16763,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -16436,6 +16856,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -16530,6 +16952,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -16612,6 +17036,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -16740,6 +17166,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -16819,6 +17247,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -16891,6 +17321,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -16951,6 +17383,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -17021,6 +17455,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -17091,6 +17527,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -17159,6 +17597,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -17219,6 +17659,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -17304,6 +17746,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -17367,6 +17811,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -17454,6 +17900,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -17522,6 +17970,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -17585,6 +18035,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -17653,6 +18105,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -17714,6 +18168,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -17793,6 +18249,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -17856,6 +18314,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -17941,6 +18401,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -18009,6 +18471,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -18070,6 +18534,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -18123,6 +18589,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -18193,6 +18661,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -18280,6 +18750,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -18371,6 +18843,8 @@ } ], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -18434,6 +18908,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -18485,6 +18961,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -18576,6 +19054,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -18654,6 +19134,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -18722,6 +19204,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -18833,6 +19317,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -18918,6 +19404,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -19011,6 +19499,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -19128,6 +19618,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -19233,6 +19725,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -19301,6 +19795,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -19371,6 +19867,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -19439,6 +19937,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -19507,6 +20007,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -19594,6 +20096,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -19664,6 +20168,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -19727,6 +20233,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -19790,6 +20298,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -19860,6 +20370,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -19963,6 +20475,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -20033,6 +20547,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -20096,6 +20612,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -20199,6 +20717,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -20328,6 +20848,8 @@ } ], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -20420,6 +20942,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -20480,6 +21004,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -20566,6 +21092,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -20634,6 +21162,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -20713,6 +21243,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -20764,6 +21296,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -20834,6 +21368,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -20945,6 +21481,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -21008,6 +21546,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -21069,6 +21609,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -21130,6 +21672,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -21193,6 +21737,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -21244,6 +21790,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -21353,6 +21901,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -21421,6 +21971,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -21541,6 +22093,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -21609,6 +22163,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -21670,6 +22226,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -21738,6 +22296,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -21801,6 +22361,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -21880,6 +22442,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -21950,6 +22514,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -22120,6 +22686,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -22206,6 +22774,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -22259,6 +22829,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -22322,6 +22894,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -22402,6 +22976,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -22463,6 +23039,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -22531,6 +23109,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -22609,6 +23189,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -22689,6 +23271,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -22774,6 +23358,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -22827,6 +23413,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -22895,6 +23483,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -22958,6 +23548,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -23036,6 +23628,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -23127,6 +23721,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -23214,6 +23810,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -23282,6 +23880,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -23369,6 +23969,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -23463,6 +24065,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -23528,6 +24132,8 @@ } ], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -23651,6 +24257,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -23702,6 +24310,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -23762,6 +24372,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -23832,6 +24444,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -23900,6 +24514,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -24042,6 +24658,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -24112,6 +24730,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -24204,6 +24824,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -24272,6 +24894,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -24352,6 +24976,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -24424,6 +25050,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -24511,6 +25139,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -24572,6 +25202,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -24625,6 +25257,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -24678,6 +25312,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -24748,6 +25384,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -24801,6 +25439,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -24864,6 +25504,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -24969,6 +25611,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -25051,6 +25695,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -25104,6 +25750,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -25165,6 +25813,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -25233,6 +25883,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -25319,6 +25971,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -25389,6 +26043,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -25476,6 +26132,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -25563,6 +26221,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -25702,6 +26362,8 @@ } ], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -25793,6 +26455,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -25856,6 +26520,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -25919,6 +26585,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -25972,6 +26640,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -26072,6 +26742,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -26135,6 +26807,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -26222,6 +26896,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -26285,6 +26961,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -26348,6 +27026,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -26410,6 +27090,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -26496,6 +27178,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -26566,6 +27250,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -26636,6 +27322,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -26713,6 +27401,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -26847,6 +27537,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -26898,6 +27590,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -26966,6 +27660,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -27027,6 +27723,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -27114,6 +27812,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -27194,6 +27894,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -27262,6 +27964,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -27315,6 +28019,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -27395,6 +28101,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -27488,6 +28196,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -27558,6 +28268,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -27621,6 +28333,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -27691,6 +28405,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -27771,6 +28487,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -27859,6 +28577,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -27946,6 +28666,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -28009,6 +28731,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -28094,6 +28818,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -28165,6 +28891,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -28228,6 +28956,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -28314,6 +29044,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -28367,6 +29099,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -28430,6 +29164,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -28525,6 +29261,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -28612,6 +29350,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -28696,6 +29436,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -28764,6 +29506,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -28887,6 +29631,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -28988,6 +29734,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -29039,6 +29787,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -29099,6 +29849,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -29169,6 +29921,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -29220,6 +29974,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -29273,6 +30029,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -29333,6 +30091,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -29403,6 +30163,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -29456,6 +30218,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -29526,6 +30290,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -29594,6 +30360,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -29687,6 +30455,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -29757,6 +30527,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -29809,6 +30581,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -29888,6 +30662,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -29939,6 +30715,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -29990,6 +30768,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -30041,6 +30821,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -30109,6 +30891,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -30261,6 +31045,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -30312,6 +31098,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -30363,6 +31151,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -30433,6 +31223,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -30486,6 +31278,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -30546,6 +31340,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -30621,6 +31417,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -30672,6 +31470,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -30740,6 +31540,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -30791,6 +31593,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -30859,6 +31663,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -30927,6 +31733,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -30978,6 +31786,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -31038,6 +31848,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -31089,6 +31901,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -31149,6 +31963,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -31209,6 +32025,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -31356,6 +32174,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -31448,6 +32268,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -31499,6 +32321,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -31567,6 +32391,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -31654,6 +32480,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -31722,6 +32550,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -31783,6 +32613,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -31844,6 +32676,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -31931,6 +32765,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -31994,6 +32830,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -32079,6 +32917,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -32199,6 +33039,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -32260,6 +33102,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -32401,6 +33245,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -32462,6 +33308,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -32554,6 +33402,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -32622,6 +33472,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -32700,6 +33552,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -32780,6 +33634,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -32848,6 +33704,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -32926,6 +33784,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -32987,6 +33847,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -33057,6 +33919,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -33125,6 +33989,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -33193,6 +34059,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -33261,6 +34129,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -33329,6 +34199,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -33406,6 +34278,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -33545,6 +34419,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -33630,6 +34506,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -33698,6 +34576,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -33771,6 +34651,8 @@ } ], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -33854,6 +34736,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -33922,6 +34806,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -33973,6 +34859,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -34041,6 +34929,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -34173,6 +35063,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -34264,6 +35156,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -34325,6 +35219,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -34393,6 +35289,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -34517,6 +35415,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -34611,6 +35511,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -34698,6 +35600,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -34759,6 +35663,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -34894,6 +35800,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -34957,6 +35865,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -35098,6 +36008,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -35195,6 +36107,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -35280,6 +36194,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -35350,6 +36266,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -35445,6 +36363,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -35496,6 +36416,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -35581,6 +36503,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -35649,6 +36573,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -35712,6 +36638,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -35773,6 +36701,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -35859,6 +36789,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -35936,6 +36868,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -36021,6 +36955,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -36089,6 +37025,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -36159,6 +37097,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -36231,6 +37171,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -36318,6 +37260,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -36411,6 +37355,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -36498,6 +37444,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -36566,6 +37514,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -36650,6 +37600,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -36730,6 +37682,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -36793,6 +37747,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -36856,6 +37812,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -36975,6 +37933,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -37054,6 +38014,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -37117,6 +38079,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -37187,6 +38151,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -37255,6 +38221,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -37319,6 +38287,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -37380,6 +38350,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -37441,6 +38413,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -37502,6 +38476,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -37582,6 +38558,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -37645,6 +38623,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -37722,6 +38702,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -37775,6 +38757,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -37878,6 +38862,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -37941,6 +38927,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -38031,6 +39019,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -38147,6 +39137,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -38219,6 +39211,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -38282,6 +39276,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -38352,6 +39348,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -38422,6 +39420,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -38483,6 +39483,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -38570,6 +39572,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -38717,6 +39721,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -38840,6 +39846,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -38908,6 +39916,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -38959,6 +39969,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -39010,6 +40022,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -39122,6 +40136,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -39317,6 +40333,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -39385,6 +40403,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -39472,6 +40492,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -39544,6 +40566,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -39631,6 +40655,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -39724,6 +40750,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -39786,6 +40814,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -39839,6 +40869,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -39947,6 +40979,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -40097,6 +41131,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -40167,6 +41203,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -40237,6 +41275,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -40300,6 +41340,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -40361,6 +41403,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -40424,6 +41468,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -40492,6 +41538,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -40585,6 +41633,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -40678,6 +41728,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -40746,6 +41798,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -40825,6 +41879,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -40911,6 +41967,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -41021,6 +42079,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -41081,6 +42141,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -41151,6 +42213,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -41276,6 +42340,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -41370,6 +42436,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -41443,6 +42511,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -41537,6 +42607,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -41621,6 +42693,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -41691,6 +42765,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -41785,6 +42861,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -41865,6 +42943,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -41928,6 +43008,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -41991,6 +43073,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -42051,6 +43135,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -42131,6 +43217,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -42194,6 +43282,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -42288,6 +43378,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -42416,6 +43508,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -42479,6 +43573,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -42558,6 +43654,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -42628,6 +43726,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -42698,6 +43798,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -42792,6 +43894,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -42855,6 +43959,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -42935,6 +44041,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -43015,6 +44123,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -43088,6 +44198,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -43151,6 +44263,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -43214,6 +44328,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -43301,6 +44417,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -43369,6 +44487,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -43451,6 +44571,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -43519,6 +44641,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -43612,6 +44736,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -43699,6 +44825,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -43779,6 +44907,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -43849,6 +44979,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -43919,6 +45051,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -43989,6 +45123,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -44059,6 +45195,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -44122,6 +45260,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -44190,6 +45330,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -44258,6 +45400,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -44345,6 +45489,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -44438,6 +45584,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -44501,6 +45649,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -44573,6 +45723,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -44686,6 +45838,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -44803,6 +45957,8 @@ } ], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -44894,6 +46050,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -44964,6 +46122,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -45027,6 +46187,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -45115,6 +46277,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -45217,6 +46381,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -45287,6 +46453,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -45350,6 +46518,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -45420,6 +46590,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -45497,6 +46669,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -45558,6 +46732,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -45621,6 +46797,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -45684,6 +46862,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -45744,6 +46924,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -45835,6 +47017,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -45913,6 +47097,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -45976,6 +47162,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -46100,6 +47288,8 @@ } ], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -46151,6 +47341,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -46271,6 +47463,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -46341,6 +47535,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -46404,6 +47600,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -46455,6 +47653,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -46525,6 +47725,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -46588,6 +47790,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -46680,6 +47884,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -46743,6 +47949,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -46794,6 +48002,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -46845,6 +48055,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -46915,6 +48127,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -46994,6 +48208,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -47097,6 +48313,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -47160,6 +48378,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -47230,6 +48450,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -47296,6 +48518,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -47376,6 +48600,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -47444,6 +48670,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -47567,6 +48795,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -47742,6 +48972,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -47828,6 +49060,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -47913,6 +49147,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -47976,6 +49212,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -48037,6 +49275,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -48090,6 +49330,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -48141,6 +49383,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -48202,6 +49446,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -48327,6 +49573,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -48406,6 +49654,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -48469,6 +49719,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -48566,6 +49818,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -48675,6 +49929,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -48738,6 +49994,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -48919,6 +50177,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -48987,6 +50247,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -49076,6 +50338,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -49160,6 +50424,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -49237,6 +50503,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -49331,6 +50599,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -49425,6 +50695,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -49497,6 +50769,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -49632,6 +50906,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -49692,6 +50968,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -49753,6 +51031,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -49821,6 +51101,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -49898,6 +51180,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -49977,6 +51261,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -50047,6 +51333,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -50117,6 +51405,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -50178,6 +51468,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -50241,6 +51533,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -50304,6 +51598,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -50376,6 +51672,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -50494,6 +51792,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -50571,6 +51871,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -50648,6 +51950,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -50718,6 +52022,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -50779,6 +52085,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -50840,6 +52148,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -50927,6 +52237,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -51006,6 +52318,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -51067,6 +52381,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -51138,6 +52454,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -51208,6 +52526,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -51278,6 +52598,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -51348,6 +52670,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -51458,6 +52782,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -51538,6 +52864,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -51618,6 +52946,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -51705,6 +53035,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -51792,6 +53124,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -51845,6 +53179,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -51915,6 +53251,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -51985,6 +53323,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -52036,6 +53376,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -52115,6 +53457,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -52195,6 +53539,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -52280,6 +53626,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -52348,6 +53696,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -52416,6 +53766,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -52501,6 +53853,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -52571,6 +53925,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -52648,6 +54004,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -52737,6 +54095,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -52822,6 +54182,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -52892,6 +54254,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -53022,6 +54386,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -53102,6 +54468,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -53182,6 +54550,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -53250,6 +54620,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -53313,6 +54685,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -53393,6 +54767,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -53456,6 +54832,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -53526,6 +54904,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -53612,6 +54992,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -53732,6 +55114,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -53785,6 +55169,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -53855,6 +55241,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -53918,6 +55306,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -53988,6 +55378,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -54058,6 +55450,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -54137,6 +55531,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -54188,6 +55584,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -54258,6 +55656,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -54326,6 +55726,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -54420,6 +55822,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -54500,6 +55904,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -54570,6 +55976,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -54633,6 +56041,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -54727,6 +56137,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -54807,6 +56219,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -54858,6 +56272,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -54919,6 +56335,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -54989,6 +56407,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -55059,6 +56479,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -55129,6 +56551,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -55199,6 +56623,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -55262,6 +56688,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -55341,6 +56769,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -55411,6 +56841,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -55474,6 +56906,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -55517,6 +56951,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -55647,6 +57083,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -55744,6 +57182,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -55814,6 +57254,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -55884,6 +57326,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -55954,6 +57398,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -56119,6 +57565,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -56198,6 +57646,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -56261,6 +57711,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -56331,6 +57783,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -56399,6 +57853,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -56462,6 +57918,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -56515,6 +57973,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -56585,6 +58045,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -56688,6 +58150,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -56758,6 +58222,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -56821,6 +58287,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -56891,6 +58359,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -56961,6 +58431,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -57024,6 +58496,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -57118,6 +58592,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -57181,6 +58657,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -57244,6 +58722,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -57345,6 +58825,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -57423,6 +58905,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -57517,6 +59001,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -57587,6 +59073,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -57681,6 +59169,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -57751,6 +59241,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -57838,6 +59330,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -57908,6 +59402,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -57978,6 +59474,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -58048,6 +59546,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -58118,6 +59618,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -58197,6 +59699,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -58260,6 +59764,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -58330,6 +59836,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -58443,6 +59951,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -58515,6 +60025,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -58585,6 +60097,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -58663,6 +60177,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -58741,6 +60257,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -58792,6 +60310,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -58867,6 +60387,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -58942,6 +60464,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -59010,6 +60534,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -59078,6 +60604,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -59225,6 +60753,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -59334,6 +60864,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -59503,6 +61035,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -59589,6 +61123,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -59671,6 +61207,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -59741,6 +61279,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -59863,6 +61403,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -59943,6 +61485,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -60013,6 +61557,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -60083,6 +61629,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -60146,6 +61694,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -60209,6 +61759,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -60329,6 +61881,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -60416,6 +61970,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -60503,6 +62059,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -60610,6 +62168,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -60690,6 +62250,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -60760,6 +62322,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -60852,6 +62416,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -60922,6 +62488,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -60985,6 +62553,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -61064,6 +62634,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -61134,6 +62706,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -61212,6 +62786,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -61275,6 +62851,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -61338,6 +62916,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -61400,6 +62980,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -61497,6 +63079,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -61610,6 +63194,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -61680,6 +63266,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -61800,6 +63388,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -61880,6 +63470,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -61950,6 +63542,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -62013,6 +63607,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -62093,6 +63689,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -62163,6 +63761,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -62257,6 +63857,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -62310,6 +63912,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -62423,6 +64027,8 @@ } ], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -62515,6 +64121,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -62633,6 +64241,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -62712,6 +64322,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -62782,6 +64394,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -62845,6 +64459,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -62915,6 +64531,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -63002,6 +64620,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -63065,6 +64685,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -63128,6 +64750,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -63198,6 +64822,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -63249,6 +64875,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -63312,6 +64940,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -63390,6 +65020,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -63484,6 +65116,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -63554,6 +65188,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -63617,6 +65253,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -63704,6 +65342,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -63783,6 +65423,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -63853,6 +65495,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -63950,6 +65594,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -64046,6 +65692,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -64126,6 +65774,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -64213,6 +65863,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -64283,6 +65935,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -64334,6 +65988,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -64711,6 +66367,8 @@ } ], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -64773,6 +66431,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -64841,6 +66501,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -64909,6 +66571,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -64993,6 +66657,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -65078,6 +66744,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -65139,6 +66807,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -65219,6 +66889,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -65289,6 +66961,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -65359,6 +67033,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -65422,6 +67098,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -65492,6 +67170,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -65562,6 +67242,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -65632,6 +67314,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -65702,6 +67386,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -65765,6 +67451,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -65826,6 +67514,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -65889,6 +67579,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -65985,6 +67677,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -66046,6 +67740,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -66109,6 +67805,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -66161,6 +67859,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -66229,6 +67929,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -66290,6 +67992,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -66378,6 +68082,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -66455,6 +68161,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -66515,6 +68223,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -66566,6 +68276,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -66627,6 +68339,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -66695,6 +68409,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -66842,6 +68558,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -66912,6 +68630,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -67046,6 +68766,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -67133,6 +68855,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -67266,6 +68990,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -67348,6 +69074,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -67418,6 +69146,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -67499,6 +69229,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -67550,6 +69282,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -67593,6 +69327,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -67710,6 +69446,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -67763,6 +69501,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -67840,6 +69580,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -67918,6 +69660,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -67979,6 +69723,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -68056,6 +69802,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -68126,6 +69874,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -68220,6 +69970,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -68290,6 +70042,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -68360,6 +70114,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -68485,6 +70241,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -68570,6 +70328,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -68621,6 +70381,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -68689,6 +70451,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -68757,6 +70521,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -68834,6 +70600,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -69010,6 +70778,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -69094,6 +70864,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -69188,6 +70960,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -69267,6 +71041,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -69335,6 +71111,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -69414,6 +71192,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -69508,6 +71288,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -69627,6 +71409,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -69700,6 +71484,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -69768,6 +71554,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -69838,6 +71626,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -69901,6 +71691,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -69986,6 +71778,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -70083,6 +71877,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -70162,6 +71958,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -70230,6 +72028,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -70300,6 +72100,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -70363,6 +72165,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -70433,6 +72237,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -70501,6 +72307,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -70588,6 +72396,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -70656,6 +72466,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -70726,6 +72538,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -70843,6 +72657,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -70995,6 +72811,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -71065,6 +72883,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -71144,6 +72964,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -71223,6 +73045,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -71293,6 +73117,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -71391,6 +73217,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -71461,6 +73289,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -71522,6 +73352,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -71583,6 +73415,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -71677,6 +73511,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -71740,6 +73576,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -71820,6 +73658,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -71890,6 +73730,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -71960,6 +73802,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -72030,6 +73874,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -72121,6 +73967,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -72191,6 +74039,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -72270,6 +74120,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -72349,6 +74201,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -72417,6 +74271,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -72520,6 +74376,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -72581,6 +74439,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -72644,6 +74504,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -72712,6 +74574,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -72784,6 +74648,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -72864,6 +74730,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -72927,6 +74795,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -72990,6 +74860,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -73060,6 +74932,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -73214,6 +75088,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -73282,6 +75158,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -73368,6 +75246,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -73438,6 +75318,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -73501,6 +75383,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -73571,6 +75455,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -73651,6 +75537,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -73713,6 +75601,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -73804,6 +75694,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -73865,6 +75757,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -73928,6 +75822,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -74018,6 +75914,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -74081,6 +75979,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -74144,6 +76044,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -74207,6 +76109,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -74277,6 +76181,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -74347,6 +76253,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -74417,6 +76325,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -74504,6 +76414,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -74594,6 +76506,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -74683,6 +76597,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -74746,6 +76662,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -74825,6 +76743,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -74895,6 +76815,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -75012,6 +76934,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -75092,6 +77016,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -75162,6 +77088,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -75232,6 +77160,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -75295,6 +77225,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -75365,6 +77297,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -75435,6 +77369,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -75498,6 +77434,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -75549,6 +77487,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -75634,6 +77574,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -75721,6 +77663,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -75808,6 +77752,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -75878,6 +77824,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -75939,6 +77887,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -76024,6 +77974,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -76094,6 +78046,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -76157,6 +78111,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -76227,6 +78183,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -76290,6 +78248,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -76360,6 +78320,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -76453,6 +78415,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -76516,6 +78480,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -76579,6 +78545,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -76656,6 +78624,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -76719,6 +78689,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -76782,6 +78754,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -76871,6 +78845,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -76939,6 +78915,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -77007,6 +78985,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -77077,6 +79057,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -77147,6 +79129,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -77210,6 +79194,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -77278,6 +79264,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -77348,6 +79336,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -77411,6 +79401,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -77479,6 +79471,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -77570,6 +79564,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -77633,6 +79629,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -77722,6 +79720,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -77775,6 +79775,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -77854,6 +79856,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -77945,6 +79949,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -78015,6 +80021,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -78068,6 +80076,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -78129,6 +80139,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -78220,6 +80232,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -78298,6 +80312,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -78395,6 +80411,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -78492,6 +80510,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -78578,6 +80598,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -78646,6 +80668,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -78732,6 +80756,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -78836,6 +80862,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -78925,6 +80953,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -78993,6 +81023,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -79063,6 +81095,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -79142,6 +81176,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -79212,6 +81248,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -79291,6 +81329,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -79359,6 +81399,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -79420,6 +81462,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -79488,6 +81532,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -79551,6 +81597,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -79619,6 +81667,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -79696,6 +81746,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -79764,6 +81816,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -79835,6 +81889,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -79903,6 +81959,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -79975,6 +82033,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -80036,6 +82096,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -80097,6 +82159,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -80165,6 +82229,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -80243,6 +82309,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -80328,6 +82396,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -80420,6 +82490,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -80481,6 +82553,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -80549,6 +82623,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -80617,6 +82693,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -80668,6 +82746,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -80729,6 +82809,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -80797,6 +82879,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -80868,6 +82952,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -80971,6 +83057,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -81041,6 +83129,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -81109,6 +83199,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -81186,6 +83278,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -81300,6 +83394,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -81370,6 +83466,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -81431,6 +83529,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -81499,6 +83599,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -81586,6 +83688,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -81656,6 +83760,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -81724,6 +83830,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -81792,6 +83900,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -81920,6 +84030,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -81991,6 +84103,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -82068,6 +84182,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -82153,6 +84269,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -82238,6 +84356,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -82318,6 +84438,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -82388,6 +84510,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -82466,6 +84590,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -82537,6 +84663,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -82672,6 +84800,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -82770,6 +84900,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -82831,6 +84963,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -82901,6 +85035,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -82969,6 +85105,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -83048,6 +85186,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -83101,6 +85241,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -83169,6 +85311,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -83230,6 +85374,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -83293,6 +85439,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -83356,6 +85504,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -83426,6 +85576,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -83575,6 +85727,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -83628,6 +85782,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -83715,6 +85871,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -83778,6 +85936,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -83848,6 +86008,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -83911,6 +86073,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -83981,6 +86145,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -84044,6 +86210,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -84114,6 +86282,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -84267,6 +86437,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -84337,6 +86509,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -84407,6 +86581,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -84500,6 +86676,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -84596,6 +86774,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -84666,6 +86846,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -84719,6 +86901,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -84789,6 +86973,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -84874,6 +87060,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -85062,6 +87250,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -85113,6 +87303,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -85215,6 +87407,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -85285,6 +87479,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -85376,6 +87572,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -85482,6 +87680,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -85552,6 +87752,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -85629,6 +87831,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -85729,6 +87933,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -85790,6 +87996,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -85843,6 +88051,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -85934,6 +88144,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -85985,6 +88197,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -86048,6 +88262,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -86116,6 +88332,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -86185,6 +88403,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -86248,6 +88468,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -86342,6 +88564,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -86433,6 +88657,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -86503,6 +88729,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -86573,6 +88801,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -86636,6 +88866,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -86706,6 +88938,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -86769,6 +89003,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -86903,6 +89139,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -86996,6 +89234,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -87089,6 +89329,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -87150,6 +89392,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -87218,6 +89462,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -87312,6 +89558,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -87380,6 +89628,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -87443,6 +89693,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -87511,6 +89763,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -87593,6 +89847,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -87644,6 +89900,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -87704,6 +89962,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -87780,6 +90040,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -87843,6 +90105,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -87913,6 +90177,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -87985,6 +90251,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -88055,6 +90323,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -88298,6 +90568,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -88382,6 +90654,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -88452,6 +90726,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -88520,6 +90796,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -88609,6 +90887,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -88679,6 +90959,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -88732,6 +91014,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -88811,6 +91095,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -88881,6 +91167,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -88951,6 +91239,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -89021,6 +91311,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -89091,6 +91383,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -89195,6 +91489,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -89258,6 +91554,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -89328,6 +91626,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -89398,6 +91698,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -89471,6 +91773,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -89589,6 +91893,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -89652,6 +91958,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -89722,6 +92030,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -89815,6 +92125,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -89885,6 +92197,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -89964,6 +92278,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -90034,6 +92350,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -90128,6 +92446,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -90198,6 +92518,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -90266,6 +92588,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -90346,6 +92670,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -90418,6 +92744,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -90481,6 +92809,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -90551,6 +92881,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -90614,6 +92946,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -90687,6 +93021,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -90774,6 +93110,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -90842,6 +93180,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -90946,6 +93286,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -91032,6 +93374,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -91095,6 +93439,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -91158,6 +93504,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -91228,6 +93576,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -91298,6 +93648,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -91378,6 +93730,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -91458,6 +93812,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -91528,6 +93884,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -91589,6 +93947,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -91712,6 +94072,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -91791,6 +94153,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -91938,6 +94302,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -91989,6 +94355,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -92066,6 +94434,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -92157,6 +94527,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -92244,6 +94616,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -92324,6 +94698,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -92392,6 +94768,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -92455,6 +94833,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -92508,6 +94888,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -92609,6 +94991,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -92755,6 +95139,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -92827,6 +95213,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -92907,6 +95295,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -92987,6 +95377,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -93074,6 +95466,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -93175,6 +95569,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -93245,6 +95641,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -93400,6 +95798,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -93480,6 +95880,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -93571,6 +95973,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -93641,6 +96045,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -93709,6 +96115,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -93772,6 +96180,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -93840,6 +96250,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -93908,6 +96320,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -93987,6 +96401,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -94081,6 +96497,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -94151,6 +96569,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -94221,6 +96641,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -94291,6 +96713,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -94361,6 +96785,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -94424,6 +96850,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -94487,6 +96915,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -94555,6 +96985,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -94625,6 +97057,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -94695,6 +97129,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -94788,6 +97224,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -94856,6 +97294,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -94917,6 +97357,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -94997,6 +97439,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -95050,6 +97494,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -95111,6 +97557,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -95195,6 +97643,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -95265,6 +97715,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -95335,6 +97787,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -95405,6 +97859,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -95475,6 +97931,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -95545,6 +98003,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -95617,6 +98077,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -95680,6 +98142,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -95752,6 +98216,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -95848,6 +98314,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -95911,6 +98379,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -96036,6 +98506,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -96097,6 +98569,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -96191,6 +98665,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -96252,6 +98728,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -96322,6 +98800,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -96401,6 +98881,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -96488,6 +98970,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -96556,6 +99040,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -96624,6 +99110,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -96675,6 +99163,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -96752,6 +99242,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -96815,6 +99307,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -96887,6 +99381,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -96937,6 +99433,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -97005,6 +99503,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -97098,6 +99598,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -97168,6 +99670,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -97231,6 +99735,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -97375,6 +99881,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -97469,6 +99977,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -97532,6 +100042,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -97595,6 +100107,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -97720,6 +100234,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -97806,6 +100322,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -97869,6 +100387,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -97955,6 +100475,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -98025,6 +100547,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -98095,6 +100619,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -98172,6 +100698,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -98242,6 +100770,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -98303,6 +100833,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -98373,6 +100905,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -98443,6 +100977,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -98513,6 +101049,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -98583,6 +101121,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -98636,6 +101176,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -98704,6 +101246,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -98774,6 +101318,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -98844,6 +101390,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -98912,6 +101460,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -98980,6 +101530,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -99043,6 +101595,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -99106,6 +101660,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -99176,6 +101732,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -99253,6 +101811,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -99504,6 +102064,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -99567,6 +102129,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -99760,6 +102324,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -99828,6 +102394,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -100009,6 +102577,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -100071,6 +102641,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -100134,6 +102706,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -100197,6 +102771,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -100250,6 +102826,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -100335,6 +102913,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -100411,6 +102991,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -100481,6 +103063,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -100544,6 +103128,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -100631,6 +103217,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -100701,6 +103289,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -100771,6 +103361,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -100868,6 +103460,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -100955,6 +103549,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -101023,6 +103619,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -101084,6 +103682,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -101156,6 +103756,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -101216,6 +103818,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -101303,6 +103907,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -101371,6 +103977,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -101422,6 +104030,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -101494,6 +104104,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -101574,6 +104186,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -101652,6 +104266,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -101720,6 +104336,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -101799,6 +104417,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -101862,6 +104482,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -101925,6 +104547,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -102028,6 +104652,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -102098,6 +104724,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -102161,6 +104789,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -102214,6 +104844,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -102331,6 +104963,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -102392,6 +105026,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -102460,6 +105096,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -102521,6 +105159,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -102608,6 +105248,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -102676,6 +105318,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -102737,6 +105381,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -102800,6 +105446,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -102860,6 +105508,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -102937,6 +105587,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -103029,6 +105681,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -103113,6 +105767,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -103164,6 +105820,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -103256,6 +105914,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -103319,6 +105979,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -103370,6 +106032,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -103422,6 +106086,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -103504,6 +106170,8 @@ } ], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -103605,6 +106273,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -103699,6 +106369,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -103762,6 +106434,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -103832,6 +106506,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -103912,6 +106588,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -103992,6 +106670,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -104045,6 +106725,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -104130,6 +106812,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -104183,6 +106867,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -104234,6 +106920,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -104350,6 +107038,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -104485,6 +107175,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -104553,6 +107245,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -104702,6 +107396,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -104765,6 +107461,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -104816,6 +107514,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -104901,6 +107601,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -104996,6 +107698,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -105057,6 +107761,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -105125,6 +107831,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -105188,6 +107896,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -105258,6 +107968,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -105394,6 +108106,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -105464,6 +108178,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -105534,6 +108250,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -105602,6 +108320,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -105681,6 +108401,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -105751,6 +108473,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -105821,6 +108545,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -105874,6 +108600,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -105946,6 +108674,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -106009,6 +108739,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -106081,6 +108813,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -106192,6 +108926,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -106360,6 +109096,8 @@ } ], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -106428,6 +109166,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -106551,6 +109291,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -106650,6 +109392,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -106701,6 +109445,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -106801,6 +109547,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -106890,6 +109638,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -106960,6 +109710,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -107030,6 +109782,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -107098,6 +109852,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -107166,6 +109922,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -107234,6 +109992,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -107347,6 +110107,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -107424,6 +110186,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -107508,6 +110272,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -107571,6 +110337,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -107639,6 +110407,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -107707,6 +110477,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -107785,6 +110557,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -107871,6 +110645,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -107922,6 +110698,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -108014,6 +110792,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -108065,6 +110845,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -108142,6 +110924,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -108202,6 +110986,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -108255,6 +111041,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -108318,6 +111106,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -108403,6 +111193,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -108454,6 +111246,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -108517,6 +111311,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -108594,6 +111390,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -108674,6 +111472,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -108760,6 +111560,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -108823,6 +111625,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -108891,6 +111695,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -108954,6 +111760,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -109005,6 +111813,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -109075,6 +111885,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -109162,6 +111974,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -109239,6 +112053,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -109290,6 +112106,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -109353,6 +112171,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -109421,6 +112241,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -109532,6 +112354,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -109633,6 +112457,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -109718,6 +112544,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -109803,6 +112631,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -109890,6 +112720,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -109960,6 +112792,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -110030,6 +112864,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -110100,6 +112936,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -110168,6 +113006,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -110231,6 +113071,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -110361,6 +113203,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -110429,6 +113273,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -110499,6 +113345,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -110596,6 +113444,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -110690,6 +113540,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -110741,6 +113593,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -110811,6 +113665,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -110890,6 +113746,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -110984,6 +113842,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -111035,6 +113895,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -111098,6 +113960,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -111159,6 +114023,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -111229,6 +114095,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -111309,6 +114177,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -111372,6 +114242,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -111489,6 +114361,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -111561,6 +114435,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -111696,6 +114572,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -111764,6 +114642,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -111834,6 +114714,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -111902,6 +114784,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -111970,6 +114854,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -112031,6 +114917,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -112082,6 +114970,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -112143,6 +115033,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -112223,6 +115115,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -112291,6 +115185,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -112342,6 +115238,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -112412,6 +115310,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -112480,6 +115380,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -112564,6 +115466,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -112627,6 +115531,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -112690,6 +115596,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -112753,6 +115661,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -112900,6 +115810,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -113031,6 +115943,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -113110,6 +116024,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -113173,6 +116089,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -113236,6 +116154,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -113306,6 +116226,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -113369,6 +116291,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -130490,5 +133414,6 @@ "Order": 2 } ] - } + }, + "VariantTypes": [] } \ No newline at end of file diff --git a/backend/FwLite/FwLiteProjectSync.Tests/UpdateDiffTests.cs b/backend/FwLite/FwLiteProjectSync.Tests/UpdateDiffTests.cs index 7daa8468a4..bbacc49119 100644 --- a/backend/FwLite/FwLiteProjectSync.Tests/UpdateDiffTests.cs +++ b/backend/FwLite/FwLiteProjectSync.Tests/UpdateDiffTests.cs @@ -25,6 +25,8 @@ public void EntryDiffShouldUpdateAllFields() .Excluding(x => x.Components) .Excluding(x => x.ComplexForms) .Excluding(x => x.ComplexFormTypes) + .Excluding(x => x.VariantOf) + .Excluding(x => x.Variants) .Excluding(x => x.PublishIn); }); } diff --git a/backend/FwLite/FwLiteProjectSync.Tests/VariantSyncTests.cs b/backend/FwLite/FwLiteProjectSync.Tests/VariantSyncTests.cs new file mode 100644 index 0000000000..931d28a54e --- /dev/null +++ b/backend/FwLite/FwLiteProjectSync.Tests/VariantSyncTests.cs @@ -0,0 +1,316 @@ +using FwLiteProjectSync.Tests.Fixtures; +using MiniLcm; +using MiniLcm.Models; + +namespace FwLiteProjectSync.Tests; + +public class VariantSyncTests : IClassFixture, IAsyncLifetime +{ + private readonly SyncFixture _fixture; + private readonly CrdtFwdataProjectSyncService _syncService; + + private readonly Guid _mainEntryId = Guid.NewGuid(); + private readonly Guid _variantEntryId = Guid.NewGuid(); + private Entry _mainEntry = null!; + private Entry _variantEntry = null!; + + public VariantSyncTests(SyncFixture fixture) + { + _fixture = fixture; + _syncService = _fixture.SyncService; + } + + public async Task InitializeAsync() + { + _fixture.DeleteSyncSnapshot(); + _mainEntry = await _fixture.FwDataApi.CreateEntry(new() + { + Id = _mainEntryId, + LexemeForm = { { "en", "color" } }, + Senses = + [ + new Sense { Gloss = { { "en", "colour sense" } } } + ] + }); + // sense-less on purpose — the FLEx "Insert Variant" shape + _variantEntry = await _fixture.FwDataApi.CreateEntry(new() + { + Id = _variantEntryId, + LexemeForm = { { "en", "colour" } } + }); + } + + public async Task DisposeAsync() + { + await foreach (var entry in _fixture.FwDataApi.GetAllEntries()) + { + await _fixture.FwDataApi.DeleteEntry(entry.Id); + } + foreach (var entry in await _fixture.CrdtApi.GetAllEntries().ToArrayAsync()) + { + await _fixture.CrdtApi.DeleteEntry(entry.Id); + } + _fixture.DeleteSyncSnapshot(); + } + + private async Task GetVariantType(IMiniLcmApi api, string name) + { + return (await api.GetVariantTypes().ToArrayAsync()).Single(t => t.Name["en"] == name); + } + + [Fact] + [Trait("Category", "Integration")] + public async Task VariantTypesSyncFwToCrdtAtProjectImport() + { + await _syncService.Import(_fixture.CrdtApi, _fixture.FwDataApi); + var fwdataVariantTypes = await _fixture.FwDataApi.GetVariantTypes().ToArrayAsync(); + var crdtVariantTypes = await _fixture.CrdtApi.GetVariantTypes().ToArrayAsync(); + fwdataVariantTypes.Should().NotBeEmpty(); + crdtVariantTypes.Should().BeEquivalentTo(fwdataVariantTypes); + } + + [Fact] + [Trait("Category", "Integration")] + public async Task CreatingVariantInFwDataSyncsWithoutIssue() + { + var crdtApi = _fixture.CrdtApi; + var fwdataApi = _fixture.FwDataApi; + await _syncService.Import(crdtApi, fwdataApi); + var projectSnapshot = await _fixture.RegenerateAndGetSnapshot(); + + var dialectal = await GetVariantType(fwdataApi, "Dialectal Variant"); + await fwdataApi.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with + { + Types = [dialectal], + HideMinorEntry = true, + Comment = new() { { "en", new RichString("british spelling") } }, + }); + + await _syncService.Sync(crdtApi, fwdataApi, projectSnapshot); + + SyncTests.AssertSnapshotsAreEquivalent(await fwdataApi.TakeProjectSnapshot(), await crdtApi.TakeProjectSnapshot()); + var crdtVariantEntry = await crdtApi.GetEntry(_variantEntryId); + crdtVariantEntry.Should().NotBeNull(); + crdtVariantEntry!.Senses.Should().BeEmpty(); + var link = crdtVariantEntry.VariantOf.Should().ContainSingle().Subject; + link.Types.Should().ContainSingle(t => t.Id == dialectal.Id); + link.HideMinorEntry.Should().BeTrue(); + + // Sync again, ensure no problems or changes + var secondSnapshot = await _fixture.RegenerateAndGetSnapshot(); + var secondSync = await _syncService.Sync(crdtApi, fwdataApi, secondSnapshot); + secondSync.CrdtChanges.Should().Be(0); + secondSync.FwdataChanges.Should().Be(0); + } + + [Fact] + [Trait("Category", "Integration")] + public async Task CreatingVariantInCrdtSyncsWithoutIssue() + { + var crdtApi = _fixture.CrdtApi; + var fwdataApi = _fixture.FwDataApi; + await _syncService.Import(crdtApi, fwdataApi); + var projectSnapshot = await _fixture.RegenerateAndGetSnapshot(); + + var spelling = await GetVariantType(crdtApi, "Spelling Variant"); + await crdtApi.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with { Types = [spelling] }); + + await _syncService.Sync(crdtApi, fwdataApi, projectSnapshot); + + SyncTests.AssertSnapshotsAreEquivalent(await fwdataApi.TakeProjectSnapshot(), await crdtApi.TakeProjectSnapshot()); + var fwVariantEntry = await fwdataApi.GetEntry(_variantEntryId); + fwVariantEntry.Should().NotBeNull(); + var link = fwVariantEntry!.VariantOf.Should().ContainSingle().Subject; + link.Types.Should().ContainSingle(t => t.Id == spelling.Id); + } + + [Fact] + [Trait("Category", "Integration")] + public async Task SenseTargetedVariantWithNewSenseSyncs() + { + var crdtApi = _fixture.CrdtApi; + var fwdataApi = _fixture.FwDataApi; + await _syncService.Import(crdtApi, fwdataApi); + var projectSnapshot = await _fixture.RegenerateAndGetSnapshot(); + + var newSense = await fwdataApi.CreateSense(_mainEntryId, new Sense { Gloss = { { "en", "new target sense" } } }); + await fwdataApi.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry, newSense.Id)); + + await _syncService.Sync(crdtApi, fwdataApi, projectSnapshot); + + SyncTests.AssertSnapshotsAreEquivalent(await fwdataApi.TakeProjectSnapshot(), await crdtApi.TakeProjectSnapshot()); + var crdtMainEntry = await crdtApi.GetEntry(_mainEntryId); + crdtMainEntry!.Variants.Should().ContainSingle(v => v.MainSenseId == newSense.Id); + } + + [Fact] + [Trait("Category", "Integration")] + public async Task VariantTypesSyncBothWays() + { + var crdtApi = _fixture.CrdtApi; + var fwdataApi = _fixture.FwDataApi; + await _syncService.Import(crdtApi, fwdataApi); + var projectSnapshot = await _fixture.RegenerateAndGetSnapshot(); + + var fwType = new VariantType() + { + Id = Guid.NewGuid(), + Name = new() { { "en", "fw custom type" } }, + }; + await fwdataApi.CreateVariantType(fwType); + + var crdtType = new VariantType() + { + Id = Guid.NewGuid(), + Name = new() { { "en", "crdt custom type" } }, + }; + await crdtApi.CreateVariantType(crdtType); + + await _syncService.Sync(crdtApi, fwdataApi, projectSnapshot); + + var crdtVariantTypes = await crdtApi.GetVariantTypes().ToArrayAsync(); + var fwdataVariantTypes = await fwdataApi.GetVariantTypes().ToArrayAsync(); + crdtVariantTypes.Should().ContainEquivalentOf(fwType); + crdtVariantTypes.Should().ContainEquivalentOf(crdtType); + fwdataVariantTypes.Should().ContainEquivalentOf(fwType); + fwdataVariantTypes.Should().ContainEquivalentOf(crdtType); + crdtVariantTypes.Should().BeEquivalentTo(fwdataVariantTypes); + } + + [Fact] + [Trait("Category", "Integration")] + public async Task VariantLinkEditsSyncBothWays() + { + var crdtApi = _fixture.CrdtApi; + var fwdataApi = _fixture.FwDataApi; + var free = await GetVariantType(fwdataApi, "Free Variant"); + var created = await fwdataApi.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with { Types = [free] }); + await _syncService.Import(crdtApi, fwdataApi); + var projectSnapshot = await _fixture.RegenerateAndGetSnapshot(); + + // edit the same link's own fields on each side (types in FwData, scalars in CRDT) + var dialectal = await GetVariantType(fwdataApi, "Dialectal Variant"); + var fwLink = (await fwdataApi.GetEntry(_variantEntryId))!.VariantOf.Single(); + await fwdataApi.AddVariantType(fwLink, dialectal.Id); + await fwdataApi.RemoveVariantType(fwLink, free.Id); + + var crdtLink = (await crdtApi.GetEntry(_variantEntryId))!.VariantOf.Single(); + var crdtAfter = crdtLink.Copy(); + crdtAfter.HideMinorEntry = true; + crdtAfter.Comment = new() { { "en", new RichString("prefer the main entry") } }; + await crdtApi.UpdateVariant(crdtLink, crdtAfter); + + await _syncService.Sync(crdtApi, fwdataApi, projectSnapshot); + + SyncTests.AssertSnapshotsAreEquivalent(await fwdataApi.TakeProjectSnapshot(), await crdtApi.TakeProjectSnapshot()); + var merged = (await crdtApi.GetEntry(_variantEntryId))!.VariantOf.Should().ContainSingle().Subject; + merged.Types.Should().ContainSingle(t => t.Id == dialectal.Id); + merged.HideMinorEntry.Should().BeTrue(); + merged.Comment["en"].GetPlainText().Should().Be("prefer the main entry"); + } + + [Fact] + [Trait("Category", "Integration")] + public async Task DeletingMainEntryInCrdtRemovesLinkOnSync() + { + var crdtApi = _fixture.CrdtApi; + var fwdataApi = _fixture.FwDataApi; + await fwdataApi.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry)); + await _syncService.Import(crdtApi, fwdataApi); + var projectSnapshot = await _fixture.RegenerateAndGetSnapshot(); + + await crdtApi.DeleteEntry(_mainEntryId); + + await _syncService.Sync(crdtApi, fwdataApi, projectSnapshot); + + (await fwdataApi.GetEntry(_mainEntryId)).Should().BeNull(); + var fwVariantEntry = await fwdataApi.GetEntry(_variantEntryId); + fwVariantEntry.Should().NotBeNull("only the link dies, not the variant entry"); + fwVariantEntry!.VariantOf.Should().BeEmpty(); + (await crdtApi.GetEntry(_variantEntryId))!.VariantOf.Should().BeEmpty(); + } + + [Fact] + [Trait("Category", "Integration")] + public async Task DeletingVariantEntryInFwDataRemovesLinkOnSync() + { + var crdtApi = _fixture.CrdtApi; + var fwdataApi = _fixture.FwDataApi; + await fwdataApi.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry)); + await _syncService.Import(crdtApi, fwdataApi); + var projectSnapshot = await _fixture.RegenerateAndGetSnapshot(); + + await fwdataApi.DeleteEntry(_variantEntryId); + + await _syncService.Sync(crdtApi, fwdataApi, projectSnapshot); + + (await crdtApi.GetEntry(_variantEntryId)).Should().BeNull(); + var crdtMainEntry = await crdtApi.GetEntry(_mainEntryId); + crdtMainEntry.Should().NotBeNull("only the link dies, not the main entry"); + crdtMainEntry!.Variants.Should().BeEmpty(); + (await fwdataApi.GetEntry(_mainEntryId))!.Variants.Should().BeEmpty(); + } + + [Fact] + [Trait("Category", "Integration")] + public async Task VariantAddedInFwDataWhileMainEntryDeletedInCrdt_SyncDoesNotThrow() + { + var crdtApi = _fixture.CrdtApi; + var fwdataApi = _fixture.FwDataApi; + await _syncService.Import(crdtApi, fwdataApi); + var projectSnapshot = await _fixture.RegenerateAndGetSnapshot(); + + await fwdataApi.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry)); + await crdtApi.DeleteEntry(_mainEntryId); + + await _syncService.Sync(crdtApi, fwdataApi, projectSnapshot); + + (await crdtApi.GetEntry(_mainEntryId)).Should().BeNull(); + (await fwdataApi.GetEntry(_mainEntryId)).Should().BeNull(); + var crdtVariantEntry = await crdtApi.GetEntry(_variantEntryId); + crdtVariantEntry.Should().NotBeNull(); + crdtVariantEntry!.VariantOf.Should().BeEmpty(); + } + + [Fact] + [Trait("Category", "Integration")] + public async Task LegacySnapshotWithoutVariantTypes_FirstSyncImportsVariantsIntoCrdt() + { + var crdtApi = _fixture.CrdtApi; + var fwdataApi = _fixture.FwDataApi; + await _syncService.Import(crdtApi, fwdataApi); + var projectSnapshot = await _fixture.RegenerateAndGetSnapshot(); + + // wipe the variants a CRDT imported before variant support would have missed; + // pre-variant snapshot json deserializes with an empty VariantTypes list + // (ProjectSnapshot normalizes the missing property) + foreach (var entry in await crdtApi.GetAllEntries().ToArrayAsync()) + { + foreach (var link in entry.VariantOf) + { + await crdtApi.DeleteVariant(link); + } + } + var legacySnapshot = projectSnapshot with + { + VariantTypes = [], + Entries = [..projectSnapshot.Entries.Select(e => StripVariants(e.Copy()))] + }; + + var fwdataVariant = await fwdataApi.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry)); + + await _syncService.Sync(crdtApi, fwdataApi, legacySnapshot); + + // FwData kept its link and the CRDT gained it + (await fwdataApi.GetEntry(_variantEntryId))!.VariantOf.Should().ContainSingle(); + (await crdtApi.GetEntry(_variantEntryId))!.VariantOf.Should().ContainSingle(v => v.MainEntryId == fwdataVariant.MainEntryId); + (await crdtApi.GetVariantTypes().ToArrayAsync()).Should().NotBeEmpty(); + + static Entry StripVariants(Entry entry) + { + entry.VariantOf = []; + entry.Variants = []; + return entry; + } + } +} diff --git a/backend/FwLite/FwLiteProjectSync.Tests/sena-3-live.verified.sqlite b/backend/FwLite/FwLiteProjectSync.Tests/sena-3-live.verified.sqlite index 55dcad0faa117e18b40dec7a63192de06b018aab..f83e3cace6a4e8f93b235fa3bbde97175a0c1dee 100644 GIT binary patch delta 41207 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 Dqq@y* delta 104164 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 SHosru_rdDHBj5S;9sfV5o@Lem diff --git a/backend/FwLite/FwLiteProjectSync.Tests/sena-3-live_snapshot.verified.txt b/backend/FwLite/FwLiteProjectSync.Tests/sena-3-live_snapshot.verified.txt index 035ac6ab5b..c3b469f4d4 100644 --- a/backend/FwLite/FwLiteProjectSync.Tests/sena-3-live_snapshot.verified.txt +++ b/backend/FwLite/FwLiteProjectSync.Tests/sena-3-live_snapshot.verified.txt @@ -98,6 +98,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -238,6 +240,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -313,6 +317,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -477,6 +483,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -528,6 +536,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -579,6 +589,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -662,6 +674,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -713,6 +727,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -764,6 +780,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -872,6 +890,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -915,6 +935,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -966,6 +988,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -1076,6 +1100,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -1163,6 +1189,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -1214,6 +1242,31 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [ + { + "Id": "3b4ca7e3-ad5a-4d5c-93cd-19ddb0aa5027", + "MaybeId": "3b4ca7e3-ad5a-4d5c-93cd-19ddb0aa5027", + "DeletedAt": null, + "VariantEntryId": "6485b811-120d-486b-bb97-425faa9008d9", + "VariantHeadword": "inde", + "MainEntryId": "425289f4-fbcd-4644-99d7-c9417e20fa66", + "MainSenseId": null, + "MainHeadword": "ande", + "Types": [ + { + "Id": "bbd4adb3-9af5-4542-94e8-b0932124108b", + "Name": { + "en": "Pronunciation Variant", + "pt": "Variac\u0327a\u0303o da Pronuncia" + }, + "DeletedAt": null + } + ], + "HideMinorEntry": false, + "Comment": {} + } + ], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -1265,6 +1318,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -1332,6 +1387,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -1383,6 +1440,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -1434,6 +1493,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -1485,6 +1546,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -1578,6 +1641,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -1658,6 +1723,8 @@ } ], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -1728,6 +1795,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -1815,6 +1884,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -1878,6 +1949,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -1964,6 +2037,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -2051,6 +2126,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -2171,6 +2248,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -2262,6 +2341,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -2347,6 +2428,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -2425,6 +2508,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -2476,6 +2561,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -2571,6 +2658,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -2651,6 +2740,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -2719,6 +2810,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -2780,6 +2873,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -2943,6 +3038,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -3021,6 +3118,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -3089,6 +3188,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -3157,6 +3258,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -3218,6 +3321,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -3281,6 +3386,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -3358,6 +3465,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -3476,6 +3585,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -3547,6 +3658,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -3632,6 +3745,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -3700,6 +3815,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -3785,6 +3902,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -3848,6 +3967,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -3928,6 +4049,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -4023,6 +4146,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -4084,6 +4209,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -4216,6 +4343,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -4320,6 +4449,8 @@ } ], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -4466,6 +4597,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -4551,6 +4684,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -4612,6 +4747,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -4673,6 +4810,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -4733,6 +4872,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -4810,6 +4951,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -4895,6 +5038,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -4975,6 +5120,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -5035,6 +5182,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -5096,6 +5245,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -5147,6 +5298,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -5217,6 +5370,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -5352,6 +5507,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -5505,6 +5662,8 @@ } ], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -5568,6 +5727,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -5631,6 +5792,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -5703,6 +5866,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -5771,6 +5936,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -5832,6 +5999,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -6001,6 +6170,8 @@ } ], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -6094,6 +6265,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -6166,6 +6339,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -6267,6 +6442,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -6370,6 +6547,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -6438,6 +6617,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -6501,6 +6682,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -6613,6 +6796,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -6730,6 +6915,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -6809,6 +6996,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -6902,6 +7091,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -6979,6 +7170,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -7073,6 +7266,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -7136,6 +7331,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -7222,6 +7419,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -7275,6 +7474,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -7360,6 +7561,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -7430,6 +7633,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -7523,6 +7728,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -7632,6 +7839,8 @@ } ], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -7711,6 +7920,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -7774,6 +7985,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -7851,6 +8064,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -7914,6 +8129,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -7984,6 +8201,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -8035,6 +8254,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -8105,6 +8326,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -8158,6 +8381,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -8201,6 +8426,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -8302,6 +8529,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -8382,6 +8611,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -8452,6 +8683,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -8532,6 +8765,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -8602,6 +8837,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -8672,6 +8909,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -8742,6 +8981,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -8812,6 +9053,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -8899,6 +9142,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -8950,6 +9195,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -9051,6 +9298,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -9114,6 +9363,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -9184,6 +9435,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -9325,6 +9578,8 @@ } ], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -9429,6 +9684,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -9492,6 +9749,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -9562,6 +9821,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -9625,6 +9886,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -9688,6 +9951,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -9751,6 +10016,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -9804,6 +10071,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -9872,6 +10141,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -9935,6 +10206,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -9998,6 +10271,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -10060,6 +10335,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -10152,6 +10429,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -10222,6 +10501,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -10292,6 +10573,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -10377,6 +10660,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -10440,6 +10725,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -10510,6 +10797,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -10587,6 +10876,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -10674,6 +10965,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -10737,6 +11030,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -10800,6 +11095,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -10938,6 +11235,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -11047,6 +11346,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -11098,6 +11399,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -11209,6 +11512,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -11289,6 +11594,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -11369,6 +11676,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -11441,6 +11750,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -11504,6 +11815,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -11567,6 +11880,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -11630,6 +11945,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -11693,6 +12010,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -11765,6 +12084,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -11835,6 +12156,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -11886,6 +12209,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -11966,6 +12291,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -12029,6 +12356,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -12128,6 +12457,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -12179,6 +12510,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -12266,6 +12599,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -12353,6 +12688,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -12416,6 +12753,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -12488,6 +12827,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -12577,6 +12918,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -12640,6 +12983,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -12724,6 +13069,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -12802,6 +13149,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -12865,6 +13214,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -12960,6 +13311,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -13037,6 +13390,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -13088,6 +13443,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -13158,6 +13515,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -13261,6 +13620,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -13324,6 +13685,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -13411,6 +13774,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -13505,6 +13870,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -13558,6 +13925,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -13628,6 +13997,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -13698,6 +14069,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -13759,6 +14132,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -13899,6 +14274,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -13962,6 +14339,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -14041,6 +14420,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -14104,6 +14485,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -14183,6 +14566,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -14265,6 +14650,8 @@ } ], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -14359,6 +14746,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -14446,6 +14835,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -14516,6 +14907,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -14589,6 +14982,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -14662,6 +15057,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -14732,6 +15129,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -14800,6 +15199,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -14895,6 +15296,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -14989,6 +15392,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -15059,6 +15464,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -15120,6 +15527,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -15190,6 +15599,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -15260,6 +15671,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -15313,6 +15726,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -15376,6 +15791,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -15470,6 +15887,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -15540,6 +15959,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -15610,6 +16031,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -15680,6 +16103,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -15760,6 +16185,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -15839,6 +16266,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -15909,6 +16338,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -15991,6 +16422,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -16067,6 +16500,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -16161,6 +16596,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -16231,6 +16668,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -16282,6 +16721,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -16345,6 +16786,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -16436,6 +16879,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -16530,6 +16975,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -16612,6 +17059,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -16740,6 +17189,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -16819,6 +17270,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -16891,6 +17344,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -16951,6 +17406,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -17021,6 +17478,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -17091,6 +17550,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -17159,6 +17620,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -17219,6 +17682,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -17304,6 +17769,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -17367,6 +17834,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -17454,6 +17923,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -17522,6 +17993,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -17585,6 +18058,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -17653,6 +18128,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -17714,6 +18191,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -17793,6 +18272,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -17856,6 +18337,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -17941,6 +18424,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -18009,6 +18494,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -18070,6 +18557,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -18123,6 +18612,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -18193,6 +18684,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -18280,6 +18773,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -18371,6 +18866,8 @@ } ], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -18434,6 +18931,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -18485,6 +18984,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -18576,6 +19077,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -18654,6 +19157,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -18722,6 +19227,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -18833,6 +19340,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -18918,6 +19427,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -19011,6 +19522,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -19128,6 +19641,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -19233,6 +19748,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -19301,6 +19818,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -19371,6 +19890,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -19439,6 +19960,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -19507,6 +20030,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -19594,6 +20119,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -19664,6 +20191,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -19727,6 +20256,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -19790,6 +20321,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -19860,6 +20393,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -19963,6 +20498,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -20033,6 +20570,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -20096,6 +20635,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -20199,6 +20740,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -20328,6 +20871,8 @@ } ], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -20420,6 +20965,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -20480,6 +21027,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -20566,6 +21115,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -20634,6 +21185,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -20713,6 +21266,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -20764,6 +21319,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -20834,6 +21391,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -20945,6 +21504,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -21008,6 +21569,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -21069,6 +21632,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -21130,6 +21695,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -21193,6 +21760,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -21244,6 +21813,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -21353,6 +21924,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -21421,6 +21994,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -21541,6 +22116,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -21609,6 +22186,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -21670,6 +22249,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -21738,6 +22319,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -21801,6 +22384,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -21880,6 +22465,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -21950,6 +22537,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -22120,6 +22709,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -22206,6 +22797,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -22259,6 +22852,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -22322,6 +22917,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -22402,6 +22999,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -22463,6 +23062,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -22531,6 +23132,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -22609,6 +23212,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -22689,6 +23294,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -22774,6 +23381,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -22827,6 +23436,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -22895,6 +23506,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -22958,6 +23571,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -23036,6 +23651,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -23127,6 +23744,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -23214,6 +23833,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -23282,6 +23903,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -23369,6 +23992,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -23463,6 +24088,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -23528,6 +24155,31 @@ } ], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [ + { + "Id": "dafa2dec-2fe6-4c6c-a07c-121de360d7b1", + "MaybeId": "dafa2dec-2fe6-4c6c-a07c-121de360d7b1", + "DeletedAt": null, + "VariantEntryId": "564fffa0-0aec-46ab-8d41-cbd30be82be1", + "VariantHeadword": "yenda", + "MainEntryId": "2bde7e2c-9ddc-4de0-b416-c24c0710c2fa", + "MainSenseId": null, + "MainHeadword": "enda", + "Types": [ + { + "Id": "bbd4adb3-9af5-4542-94e8-b0932124108b", + "Name": { + "en": "Pronunciation Variant", + "pt": "Variac\u0327a\u0303o da Pronuncia" + }, + "DeletedAt": null + } + ], + "HideMinorEntry": false, + "Comment": {} + } + ], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -23651,6 +24303,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -23702,6 +24356,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -23762,6 +24418,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -23832,6 +24490,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -23900,6 +24560,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -24042,6 +24704,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -24112,6 +24776,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -24204,6 +24870,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -24272,6 +24940,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -24352,6 +25022,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -24424,6 +25096,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -24511,6 +25185,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -24572,6 +25248,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -24625,6 +25303,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -24678,6 +25358,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -24748,6 +25430,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -24801,6 +25485,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -24864,6 +25550,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -24969,6 +25657,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -25051,6 +25741,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -25104,6 +25796,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -25165,6 +25859,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -25233,6 +25929,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -25319,6 +26017,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -25389,6 +26089,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -25476,6 +26178,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -25563,6 +26267,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -25702,6 +26408,8 @@ } ], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -25793,6 +26501,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -25856,6 +26566,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -25919,6 +26631,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -25972,6 +26686,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -26072,6 +26788,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -26135,6 +26853,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -26222,6 +26942,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -26285,6 +27007,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -26348,6 +27072,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -26410,6 +27136,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -26496,6 +27224,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -26566,6 +27296,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -26636,6 +27368,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -26713,6 +27447,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -26847,6 +27583,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -26898,6 +27636,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -26966,6 +27706,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -27027,6 +27769,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -27114,6 +27858,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -27194,6 +27940,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -27262,6 +28010,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -27315,6 +28065,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -27395,6 +28147,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -27488,6 +28242,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -27558,6 +28314,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -27621,6 +28379,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -27691,6 +28451,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -27771,6 +28533,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -27859,6 +28623,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -27946,6 +28712,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -28009,6 +28777,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -28094,6 +28864,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -28165,6 +28937,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -28228,6 +29002,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -28314,6 +29090,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -28367,6 +29145,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -28430,6 +29210,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -28525,6 +29307,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -28612,6 +29396,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -28696,6 +29482,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -28764,6 +29552,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -28887,6 +29677,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -28988,6 +29780,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -29039,6 +29833,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -29099,6 +29895,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -29169,6 +29967,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -29220,6 +30020,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -29273,6 +30075,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -29333,6 +30137,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -29403,6 +30209,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -29456,6 +30264,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -29526,6 +30336,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -29594,6 +30406,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -29687,6 +30501,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -29757,6 +30573,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -29809,6 +30627,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -29888,6 +30708,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -29939,6 +30761,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -29990,6 +30814,31 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [ + { + "Id": "3b4ca7e3-ad5a-4d5c-93cd-19ddb0aa5027", + "MaybeId": "3b4ca7e3-ad5a-4d5c-93cd-19ddb0aa5027", + "DeletedAt": null, + "VariantEntryId": "6485b811-120d-486b-bb97-425faa9008d9", + "VariantHeadword": "inde", + "MainEntryId": "425289f4-fbcd-4644-99d7-c9417e20fa66", + "MainSenseId": null, + "MainHeadword": "ande", + "Types": [ + { + "Id": "bbd4adb3-9af5-4542-94e8-b0932124108b", + "Name": { + "en": "Pronunciation Variant", + "pt": "Variac\u0327a\u0303o da Pronuncia" + }, + "DeletedAt": null + } + ], + "HideMinorEntry": false, + "Comment": {} + } + ], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -30041,6 +30890,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -30109,6 +30960,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -30261,6 +31114,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -30312,6 +31167,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -30363,6 +31220,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -30433,6 +31292,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -30486,6 +31347,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -30546,6 +31409,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -30621,6 +31486,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -30672,6 +31539,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -30740,6 +31609,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -30791,6 +31662,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -30859,6 +31732,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -30927,6 +31802,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -30978,6 +31855,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -31038,6 +31917,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -31089,6 +31970,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -31149,6 +32032,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -31209,6 +32094,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -31356,6 +32243,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -31448,6 +32337,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -31499,6 +32390,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -31567,6 +32460,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -31654,6 +32549,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -31722,6 +32619,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -31783,6 +32682,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -31844,6 +32745,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -31931,6 +32834,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -31994,6 +32899,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -32079,6 +32986,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -32199,6 +33108,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -32260,6 +33171,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -32401,6 +33314,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -32462,6 +33377,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -32554,6 +33471,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -32622,6 +33541,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -32700,6 +33621,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -32780,6 +33703,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -32848,6 +33773,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -32926,6 +33853,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -32987,6 +33916,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -33057,6 +33988,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -33125,6 +34058,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -33193,6 +34128,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -33261,6 +34198,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -33329,6 +34268,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -33406,6 +34347,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -33545,6 +34488,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -33630,6 +34575,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -33698,6 +34645,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -33771,6 +34720,8 @@ } ], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -33854,6 +34805,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -33922,6 +34875,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -33973,6 +34928,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -34041,6 +34998,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -34173,6 +35132,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -34264,6 +35225,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -34325,6 +35288,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -34393,6 +35358,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -34517,6 +35484,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -34611,6 +35580,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -34698,6 +35669,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -34759,6 +35732,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -34894,6 +35869,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -34957,6 +35934,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -35098,6 +36077,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -35195,6 +36176,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -35280,6 +36263,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -35350,6 +36335,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -35445,6 +36432,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -35496,6 +36485,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -35581,6 +36572,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -35649,6 +36642,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -35712,6 +36707,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -35773,6 +36770,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -35859,6 +36858,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -35936,6 +36937,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -36021,6 +37024,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -36089,6 +37094,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -36159,6 +37166,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -36231,6 +37240,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -36318,6 +37329,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -36411,6 +37424,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -36498,6 +37513,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -36566,6 +37583,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -36650,6 +37669,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -36730,6 +37751,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -36793,6 +37816,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -36856,6 +37881,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -36975,6 +38002,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -37054,6 +38083,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -37117,6 +38148,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -37187,6 +38220,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -37255,6 +38290,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -37319,6 +38356,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -37380,6 +38419,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -37441,6 +38482,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -37502,6 +38545,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -37582,6 +38627,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -37645,6 +38692,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -37722,6 +38771,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -37775,6 +38826,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -37878,6 +38931,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -37941,6 +38996,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -38031,6 +39088,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -38147,6 +39206,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -38219,6 +39280,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -38282,6 +39345,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -38352,6 +39417,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -38422,6 +39489,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -38483,6 +39552,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -38570,6 +39641,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -38717,6 +39790,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -38840,6 +39915,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -38908,6 +39985,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -38959,6 +40038,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -39010,6 +40091,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -39122,6 +40205,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -39317,6 +40402,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -39385,6 +40472,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -39472,6 +40561,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -39544,6 +40635,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -39631,6 +40724,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -39724,6 +40819,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -39786,6 +40883,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -39839,6 +40938,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -39947,6 +41048,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -40097,6 +41200,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -40167,6 +41272,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -40237,6 +41344,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -40300,6 +41409,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -40361,6 +41472,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -40424,6 +41537,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -40492,6 +41607,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -40585,6 +41702,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -40678,6 +41797,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -40746,6 +41867,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -40825,6 +41948,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -40911,6 +42036,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -41021,6 +42148,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -41081,6 +42210,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -41151,6 +42282,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -41276,6 +42409,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -41370,6 +42505,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -41443,6 +42580,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -41537,6 +42676,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -41621,6 +42762,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -41691,6 +42834,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -41785,6 +42930,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -41865,6 +43012,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -41928,6 +43077,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -41991,6 +43142,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -42051,6 +43204,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -42131,6 +43286,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -42194,6 +43351,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -42288,6 +43447,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -42416,6 +43577,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -42479,6 +43642,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -42558,6 +43723,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -42628,6 +43795,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -42698,6 +43867,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -42792,6 +43963,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -42855,6 +44028,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -42935,6 +44110,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -43015,6 +44192,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -43088,6 +44267,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -43151,6 +44332,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -43214,6 +44397,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -43301,6 +44486,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -43369,6 +44556,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -43451,6 +44640,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -43519,6 +44710,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -43612,6 +44805,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -43699,6 +44894,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -43779,6 +44976,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -43849,6 +45048,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -43919,6 +45120,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -43989,6 +45192,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -44059,6 +45264,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -44122,6 +45329,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -44190,6 +45399,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -44258,6 +45469,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -44345,6 +45558,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -44438,6 +45653,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -44501,6 +45718,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -44573,6 +45792,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -44686,6 +45907,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -44803,6 +46026,8 @@ } ], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -44894,6 +46119,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -44964,6 +46191,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -45027,6 +46256,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -45115,6 +46346,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -45217,6 +46450,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -45287,6 +46522,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -45350,6 +46587,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -45420,6 +46659,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -45497,6 +46738,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -45558,6 +46801,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -45621,6 +46866,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -45684,6 +46931,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -45744,6 +46993,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -45835,6 +47086,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -45913,6 +47166,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -45976,6 +47231,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -46100,6 +47357,8 @@ } ], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -46151,6 +47410,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -46271,6 +47532,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -46341,6 +47604,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -46404,6 +47669,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -46455,6 +47722,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -46525,6 +47794,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -46588,6 +47859,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -46680,6 +47953,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -46743,6 +48018,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -46794,6 +48071,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -46845,6 +48124,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -46915,6 +48196,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -46994,6 +48277,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -47097,6 +48382,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -47160,6 +48447,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -47230,6 +48519,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -47296,6 +48587,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -47376,6 +48669,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -47444,6 +48739,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -47567,6 +48864,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -47742,6 +49041,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -47828,6 +49129,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -47913,6 +49216,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -47976,6 +49281,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -48037,6 +49344,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -48090,6 +49399,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -48141,6 +49452,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -48202,6 +49515,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -48327,6 +49642,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -48406,6 +49723,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -48469,6 +49788,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -48566,6 +49887,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -48675,6 +49998,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -48738,6 +50063,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -48919,6 +50246,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -48987,6 +50316,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -49076,6 +50407,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -49160,6 +50493,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -49237,6 +50572,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -49331,6 +50668,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -49425,6 +50764,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -49497,6 +50838,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -49632,6 +50975,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -49692,6 +51037,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -49753,6 +51100,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -49821,6 +51170,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -49898,6 +51249,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -49977,6 +51330,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -50047,6 +51402,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -50117,6 +51474,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -50178,6 +51537,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -50241,6 +51602,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -50304,6 +51667,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -50376,6 +51741,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -50494,6 +51861,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -50571,6 +51940,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -50648,6 +52019,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -50718,6 +52091,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -50779,6 +52154,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -50840,6 +52217,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -50927,6 +52306,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -51006,6 +52387,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -51067,6 +52450,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -51138,6 +52523,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -51208,6 +52595,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -51278,6 +52667,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -51348,6 +52739,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -51458,6 +52851,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -51538,6 +52933,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -51618,6 +53015,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -51705,6 +53104,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -51792,6 +53193,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -51845,6 +53248,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -51915,6 +53320,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -51985,6 +53392,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -52036,6 +53445,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -52115,6 +53526,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -52195,6 +53608,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -52280,6 +53695,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -52348,6 +53765,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -52416,6 +53835,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -52501,6 +53922,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -52571,6 +53994,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -52648,6 +54073,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -52737,6 +54164,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -52822,6 +54251,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -52892,6 +54323,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -53022,6 +54455,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -53102,6 +54537,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -53182,6 +54619,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -53250,6 +54689,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -53313,6 +54754,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -53393,6 +54836,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -53456,6 +54901,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -53526,6 +54973,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -53612,6 +55061,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -53732,6 +55183,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -53785,6 +55238,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -53855,6 +55310,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -53918,6 +55375,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -53988,6 +55447,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -54058,6 +55519,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -54137,6 +55600,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -54188,6 +55653,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -54258,6 +55725,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -54326,6 +55795,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -54420,6 +55891,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -54500,6 +55973,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -54570,6 +56045,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -54633,6 +56110,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -54727,6 +56206,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -54807,6 +56288,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -54858,6 +56341,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -54919,6 +56404,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -54989,6 +56476,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -55059,6 +56548,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -55129,6 +56620,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -55199,6 +56692,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -55262,6 +56757,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -55341,6 +56838,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -55411,6 +56910,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -55474,6 +56975,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -55517,6 +57020,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -55647,6 +57152,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -55744,6 +57251,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -55814,6 +57323,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -55884,6 +57395,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -55954,6 +57467,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -56119,6 +57634,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -56198,6 +57715,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -56261,6 +57780,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -56331,6 +57852,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -56399,6 +57922,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -56462,6 +57987,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -56515,6 +58042,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -56585,6 +58114,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -56688,6 +58219,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -56758,6 +58291,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -56821,6 +58356,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -56891,6 +58428,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -56961,6 +58500,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -57024,6 +58565,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -57118,6 +58661,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -57181,6 +58726,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -57244,6 +58791,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -57345,6 +58894,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -57423,6 +58974,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -57517,6 +59070,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -57587,6 +59142,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -57681,6 +59238,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -57751,6 +59310,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -57838,6 +59399,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -57908,6 +59471,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -57978,6 +59543,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -58048,6 +59615,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -58118,6 +59687,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -58197,6 +59768,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -58260,6 +59833,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -58330,6 +59905,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -58443,6 +60020,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -58515,6 +60094,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -58585,6 +60166,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -58663,6 +60246,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -58741,6 +60326,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -58792,6 +60379,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -58867,6 +60456,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -58942,6 +60533,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -59010,6 +60603,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -59078,6 +60673,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -59225,6 +60822,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -59334,6 +60933,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -59503,6 +61104,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -59589,6 +61192,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -59671,6 +61276,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -59741,6 +61348,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -59863,6 +61472,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -59943,6 +61554,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -60013,6 +61626,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -60083,6 +61698,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -60146,6 +61763,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -60209,6 +61828,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -60329,6 +61950,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -60416,6 +62039,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -60503,6 +62128,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -60610,6 +62237,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -60690,6 +62319,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -60760,6 +62391,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -60852,6 +62485,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -60922,6 +62557,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -60985,6 +62622,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -61064,6 +62703,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -61134,6 +62775,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -61212,6 +62855,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -61275,6 +62920,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -61338,6 +62985,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -61400,6 +63049,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -61497,6 +63148,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -61610,6 +63263,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -61680,6 +63335,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -61800,6 +63457,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -61880,6 +63539,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -61950,6 +63611,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -62013,6 +63676,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -62093,6 +63758,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -62163,6 +63830,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -62257,6 +63926,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -62310,6 +63981,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -62423,6 +64096,8 @@ } ], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -62515,6 +64190,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -62633,6 +64310,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -62712,6 +64391,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -62782,6 +64463,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -62845,6 +64528,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -62915,6 +64600,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -63002,6 +64689,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -63065,6 +64754,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -63128,6 +64819,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -63198,6 +64891,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -63249,6 +64944,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -63312,6 +65009,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -63390,6 +65089,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -63484,6 +65185,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -63554,6 +65257,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -63617,6 +65322,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -63704,6 +65411,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -63783,6 +65492,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -63853,6 +65564,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -63950,6 +65663,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -64046,6 +65761,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -64126,6 +65843,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -64213,6 +65932,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -64283,6 +66004,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -64334,6 +66057,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -64711,6 +66436,8 @@ } ], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -64773,6 +66500,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -64841,6 +66570,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -64909,6 +66640,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -64993,6 +66726,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -65078,6 +66813,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -65139,6 +66876,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -65219,6 +66958,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -65289,6 +67030,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -65359,6 +67102,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -65422,6 +67167,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -65492,6 +67239,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -65562,6 +67311,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -65632,6 +67383,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -65702,6 +67455,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -65765,6 +67520,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -65826,6 +67583,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -65889,6 +67648,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -65985,6 +67746,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -66046,6 +67809,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -66109,6 +67874,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -66161,6 +67928,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -66229,6 +67998,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -66290,6 +68061,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -66378,6 +68151,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -66455,6 +68230,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -66515,6 +68292,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -66566,6 +68345,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -66627,6 +68408,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -66695,6 +68478,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -66842,6 +68627,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -66912,6 +68699,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -67046,6 +68835,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -67133,6 +68924,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -67266,6 +69059,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -67348,6 +69143,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -67418,6 +69215,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -67499,6 +69298,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -67550,6 +69351,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -67593,6 +69396,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -67710,6 +69515,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -67763,6 +69570,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -67840,6 +69649,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -67918,6 +69729,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -67979,6 +69792,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -68056,6 +69871,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -68126,6 +69943,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -68220,6 +70039,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -68290,6 +70111,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -68360,6 +70183,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -68485,6 +70310,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -68570,6 +70397,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -68621,6 +70450,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -68689,6 +70520,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -68757,6 +70590,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -68834,6 +70669,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -69010,6 +70847,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -69094,6 +70933,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -69188,6 +71029,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -69267,6 +71110,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -69335,6 +71180,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -69414,6 +71261,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -69508,6 +71357,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -69627,6 +71478,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -69700,6 +71553,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -69768,6 +71623,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -69838,6 +71695,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -69901,6 +71760,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -69986,6 +71847,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -70083,6 +71946,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -70162,6 +72027,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -70230,6 +72097,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -70300,6 +72169,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -70363,6 +72234,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -70433,6 +72306,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -70501,6 +72376,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -70588,6 +72465,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -70656,6 +72535,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -70726,6 +72607,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -70843,6 +72726,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -70995,6 +72880,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -71065,6 +72952,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -71144,6 +73033,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -71223,6 +73114,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -71293,6 +73186,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -71391,6 +73286,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -71461,6 +73358,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -71522,6 +73421,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -71583,6 +73484,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -71677,6 +73580,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -71740,6 +73645,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -71820,6 +73727,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -71890,6 +73799,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -71960,6 +73871,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -72030,6 +73943,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -72121,6 +74036,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -72191,6 +74108,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -72270,6 +74189,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -72349,6 +74270,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -72417,6 +74340,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -72520,6 +74445,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -72581,6 +74508,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -72644,6 +74573,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -72712,6 +74643,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -72784,6 +74717,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -72864,6 +74799,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -72927,6 +74864,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -72990,6 +74929,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -73060,6 +75001,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -73214,6 +75157,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -73282,6 +75227,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -73368,6 +75315,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -73438,6 +75387,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -73501,6 +75452,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -73571,6 +75524,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -73651,6 +75606,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -73713,6 +75670,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -73804,6 +75763,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -73865,6 +75826,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -73928,6 +75891,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -74018,6 +75983,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -74081,6 +76048,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -74144,6 +76113,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -74207,6 +76178,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -74277,6 +76250,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -74347,6 +76322,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -74417,6 +76394,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -74504,6 +76483,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -74594,6 +76575,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -74683,6 +76666,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -74746,6 +76731,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -74825,6 +76812,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -74895,6 +76884,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -75012,6 +77003,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -75092,6 +77085,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -75162,6 +77157,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -75232,6 +77229,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -75295,6 +77294,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -75365,6 +77366,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -75435,6 +77438,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -75498,6 +77503,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -75549,6 +77556,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -75634,6 +77643,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -75721,6 +77732,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -75808,6 +77821,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -75878,6 +77893,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -75939,6 +77956,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -76024,6 +78043,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -76094,6 +78115,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -76157,6 +78180,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -76227,6 +78252,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -76290,6 +78317,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -76360,6 +78389,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -76453,6 +78484,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -76516,6 +78549,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -76579,6 +78614,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -76656,6 +78693,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -76719,6 +78758,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -76782,6 +78823,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -76871,6 +78914,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -76939,6 +78984,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -77007,6 +79054,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -77077,6 +79126,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -77147,6 +79198,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -77210,6 +79263,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -77278,6 +79333,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -77348,6 +79405,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -77411,6 +79470,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -77479,6 +79540,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -77570,6 +79633,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -77633,6 +79698,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -77722,6 +79789,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -77775,6 +79844,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -77854,6 +79925,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -77945,6 +80018,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -78015,6 +80090,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -78068,6 +80145,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -78129,6 +80208,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -78220,6 +80301,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -78298,6 +80381,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -78395,6 +80480,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -78492,6 +80579,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -78578,6 +80667,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -78646,6 +80737,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -78732,6 +80825,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -78836,6 +80931,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -78925,6 +81022,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -78993,6 +81092,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -79063,6 +81164,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -79142,6 +81245,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -79212,6 +81317,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -79291,6 +81398,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -79359,6 +81468,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -79420,6 +81531,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -79488,6 +81601,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -79551,6 +81666,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -79619,6 +81736,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -79696,6 +81815,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -79764,6 +81885,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -79835,6 +81958,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -79903,6 +82028,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -79975,6 +82102,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -80036,6 +82165,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -80097,6 +82228,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -80165,6 +82298,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -80243,6 +82378,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -80328,6 +82465,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -80420,6 +82559,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -80481,6 +82622,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -80549,6 +82692,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -80617,6 +82762,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -80668,6 +82815,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -80729,6 +82878,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -80797,6 +82948,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -80868,6 +83021,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -80971,6 +83126,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -81041,6 +83198,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -81109,6 +83268,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -81186,6 +83347,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -81300,6 +83463,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -81370,6 +83535,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -81431,6 +83598,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -81499,6 +83668,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -81586,6 +83757,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -81656,6 +83829,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -81724,6 +83899,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -81792,6 +83969,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -81920,6 +84099,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -81991,6 +84172,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -82068,6 +84251,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -82153,6 +84338,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -82238,6 +84425,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -82318,6 +84507,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -82388,6 +84579,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -82466,6 +84659,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -82537,6 +84732,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -82672,6 +84869,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -82770,6 +84969,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -82831,6 +85032,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -82901,6 +85104,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -82969,6 +85174,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -83048,6 +85255,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -83101,6 +85310,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -83169,6 +85380,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -83230,6 +85443,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -83293,6 +85508,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -83356,6 +85573,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -83426,6 +85645,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -83575,6 +85796,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -83628,6 +85851,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -83715,6 +85940,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -83778,6 +86005,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -83848,6 +86077,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -83911,6 +86142,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -83981,6 +86214,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -84044,6 +86279,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -84114,6 +86351,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -84267,6 +86506,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -84337,6 +86578,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -84407,6 +86650,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -84500,6 +86745,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -84596,6 +86843,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -84666,6 +86915,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -84719,6 +86970,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -84789,6 +87042,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -84874,6 +87129,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -85062,6 +87319,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -85113,6 +87372,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -85215,6 +87476,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -85285,6 +87548,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -85376,6 +87641,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -85482,6 +87749,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -85552,6 +87821,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -85629,6 +87900,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -85729,6 +88002,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -85790,6 +88065,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -85843,6 +88120,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -85934,6 +88213,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -85985,6 +88266,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -86048,6 +88331,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -86116,6 +88401,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -86185,6 +88472,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -86248,6 +88537,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -86342,6 +88633,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -86433,6 +88726,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -86503,6 +88798,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -86573,6 +88870,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -86636,6 +88935,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -86706,6 +89007,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -86769,6 +89072,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -86903,6 +89208,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -86996,6 +89303,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -87089,6 +89398,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -87150,6 +89461,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -87218,6 +89531,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -87312,6 +89627,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -87380,6 +89697,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -87443,6 +89762,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -87511,6 +89832,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -87593,6 +89916,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -87644,6 +89969,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -87704,6 +90031,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -87780,6 +90109,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -87843,6 +90174,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -87913,6 +90246,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -87985,6 +90320,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -88055,6 +90392,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -88298,6 +90637,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -88382,6 +90723,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -88452,6 +90795,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -88520,6 +90865,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -88609,6 +90956,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -88679,6 +91028,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -88732,6 +91083,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -88811,6 +91164,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -88881,6 +91236,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -88951,6 +91308,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -89021,6 +91380,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -89091,6 +91452,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -89195,6 +91558,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -89258,6 +91623,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -89328,6 +91695,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -89398,6 +91767,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -89471,6 +91842,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -89589,6 +91962,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -89652,6 +92027,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -89722,6 +92099,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -89815,6 +92194,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -89885,6 +92266,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -89964,6 +92347,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -90034,6 +92419,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -90128,6 +92515,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -90198,6 +92587,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -90266,6 +92657,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -90346,6 +92739,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -90418,6 +92813,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -90481,6 +92878,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -90551,6 +92950,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -90614,6 +93015,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -90687,6 +93090,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -90774,6 +93179,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -90842,6 +93249,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -90946,6 +93355,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -91032,6 +93443,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -91095,6 +93508,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -91158,6 +93573,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -91228,6 +93645,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -91298,6 +93717,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -91378,6 +93799,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -91458,6 +93881,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -91528,6 +93953,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -91589,6 +94016,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -91712,6 +94141,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -91791,6 +94222,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -91938,6 +94371,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -91989,6 +94424,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -92066,6 +94503,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -92157,6 +94596,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -92244,6 +94685,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -92324,6 +94767,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -92392,6 +94837,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -92455,6 +94902,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -92508,6 +94957,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -92609,6 +95060,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -92755,6 +95208,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -92827,6 +95282,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -92907,6 +95364,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -92987,6 +95446,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -93074,6 +95535,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -93175,6 +95638,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -93245,6 +95710,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -93400,6 +95867,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -93480,6 +95949,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -93571,6 +96042,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -93641,6 +96114,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -93709,6 +96184,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -93772,6 +96249,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -93840,6 +96319,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -93908,6 +96389,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -93987,6 +96470,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -94081,6 +96566,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -94151,6 +96638,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -94221,6 +96710,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -94291,6 +96782,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -94361,6 +96854,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -94424,6 +96919,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -94487,6 +96984,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -94555,6 +97054,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -94625,6 +97126,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -94695,6 +97198,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -94788,6 +97293,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -94856,6 +97363,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -94917,6 +97426,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -94997,6 +97508,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -95050,6 +97563,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -95111,6 +97626,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -95195,6 +97712,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -95265,6 +97784,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -95335,6 +97856,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -95405,6 +97928,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -95475,6 +98000,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -95545,6 +98072,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -95617,6 +98146,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -95680,6 +98211,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -95752,6 +98285,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -95848,6 +98383,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -95911,6 +98448,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -96036,6 +98575,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -96097,6 +98638,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -96191,6 +98734,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -96252,6 +98797,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -96322,6 +98869,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -96401,6 +98950,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -96488,6 +99039,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -96556,6 +99109,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -96624,6 +99179,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -96675,6 +99232,31 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [ + { + "Id": "be2fc635-b543-4267-9dbc-b1fc96711f48", + "MaybeId": "be2fc635-b543-4267-9dbc-b1fc96711f48", + "DeletedAt": null, + "VariantEntryId": "d03f39d0-10ef-4d35-b13b-a965124a9230", + "VariantHeadword": "sia", + "MainEntryId": "05640c89-1b5b-463b-83e9-778928d23fc7", + "MainSenseId": null, + "MainHeadword": "siya", + "Types": [ + { + "Id": "0c4663b3-4d9a-47af-b9a1-c8565d8112ed", + "Name": { + "en": "Spelling Variant", + "pt": "Variac\u0327a\u0303o de Soletrac\u0327a\u0303o" + }, + "DeletedAt": null + } + ], + "HideMinorEntry": false, + "Comment": {} + } + ], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -96752,6 +99334,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -96815,6 +99399,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -96887,6 +99473,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -96937,6 +99525,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -97005,6 +99595,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -97098,6 +99690,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -97168,6 +99762,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -97231,6 +99827,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -97375,6 +99973,31 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [ + { + "Id": "be2fc635-b543-4267-9dbc-b1fc96711f48", + "MaybeId": "be2fc635-b543-4267-9dbc-b1fc96711f48", + "DeletedAt": null, + "VariantEntryId": "d03f39d0-10ef-4d35-b13b-a965124a9230", + "VariantHeadword": "sia", + "MainEntryId": "05640c89-1b5b-463b-83e9-778928d23fc7", + "MainSenseId": null, + "MainHeadword": "siya", + "Types": [ + { + "Id": "0c4663b3-4d9a-47af-b9a1-c8565d8112ed", + "Name": { + "en": "Spelling Variant", + "pt": "Variac\u0327a\u0303o de Soletrac\u0327a\u0303o" + }, + "DeletedAt": null + } + ], + "HideMinorEntry": false, + "Comment": {} + } + ], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -97469,6 +100092,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -97532,6 +100157,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -97595,6 +100222,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -97720,6 +100349,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -97806,6 +100437,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -97869,6 +100502,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -97955,6 +100590,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -98025,6 +100662,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -98095,6 +100734,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -98172,6 +100813,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -98242,6 +100885,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -98303,6 +100948,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -98373,6 +101020,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -98443,6 +101092,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -98513,6 +101164,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -98583,6 +101236,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -98636,6 +101291,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -98704,6 +101361,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -98774,6 +101433,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -98844,6 +101505,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -98912,6 +101575,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -98980,6 +101645,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -99043,6 +101710,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -99106,6 +101775,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -99176,6 +101847,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -99253,6 +101926,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -99504,6 +102179,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -99567,6 +102244,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -99760,6 +102439,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -99828,6 +102509,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -100009,6 +102692,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -100071,6 +102756,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -100134,6 +102821,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -100197,6 +102886,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -100250,6 +102941,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -100335,6 +103028,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -100411,6 +103106,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -100481,6 +103178,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -100544,6 +103243,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -100631,6 +103332,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -100701,6 +103404,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -100771,6 +103476,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -100868,6 +103575,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -100955,6 +103664,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -101023,6 +103734,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -101084,6 +103797,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -101156,6 +103871,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -101216,6 +103933,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -101303,6 +104022,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -101371,6 +104092,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -101422,6 +104145,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -101494,6 +104219,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -101574,6 +104301,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -101652,6 +104381,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -101720,6 +104451,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -101799,6 +104532,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -101862,6 +104597,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -101925,6 +104662,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -102028,6 +104767,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -102098,6 +104839,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -102161,6 +104904,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -102214,6 +104959,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -102331,6 +105078,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -102392,6 +105141,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -102460,6 +105211,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -102521,6 +105274,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -102608,6 +105363,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -102676,6 +105433,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -102737,6 +105496,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -102800,6 +105561,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -102860,6 +105623,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -102937,6 +105702,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -103029,6 +105796,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -103113,6 +105882,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -103164,6 +105935,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -103256,6 +106029,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -103319,6 +106094,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -103370,6 +106147,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -103422,6 +106201,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -103504,6 +106285,8 @@ } ], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -103605,6 +106388,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -103699,6 +106484,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -103762,6 +106549,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -103832,6 +106621,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -103912,6 +106703,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -103992,6 +106785,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -104045,6 +106840,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -104130,6 +106927,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -104183,6 +106982,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -104234,6 +107035,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -104350,6 +107153,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -104485,6 +107290,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -104553,6 +107360,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -104702,6 +107511,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -104765,6 +107576,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -104816,6 +107629,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -104901,6 +107716,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -104996,6 +107813,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -105057,6 +107876,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -105125,6 +107946,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -105188,6 +108011,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -105258,6 +108083,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -105394,6 +108221,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -105464,6 +108293,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -105534,6 +108365,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -105602,6 +108435,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -105681,6 +108516,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -105751,6 +108588,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -105821,6 +108660,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -105874,6 +108715,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -105946,6 +108789,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -106009,6 +108854,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -106081,6 +108928,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -106192,6 +109041,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -106360,6 +109211,8 @@ } ], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -106428,6 +109281,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -106551,6 +109406,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -106650,6 +109507,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -106701,6 +109560,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -106801,6 +109662,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -106890,6 +109753,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -106960,6 +109825,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -107030,6 +109897,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -107098,6 +109967,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -107166,6 +110037,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -107234,6 +110107,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -107347,6 +110222,8 @@ "DeletedAt": null } ], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -107424,6 +110301,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -107508,6 +110387,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -107571,6 +110452,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -107639,6 +110522,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -107707,6 +110592,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -107785,6 +110672,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -107871,6 +110760,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -107922,6 +110813,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -108014,6 +110907,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -108065,6 +110960,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -108142,6 +111039,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -108202,6 +111101,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -108255,6 +111156,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -108318,6 +111221,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -108403,6 +111308,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -108454,6 +111361,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -108517,6 +111426,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -108594,6 +111505,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -108674,6 +111587,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -108760,6 +111675,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -108823,6 +111740,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -108891,6 +111810,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -108954,6 +111875,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -109005,6 +111928,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -109075,6 +112000,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -109162,6 +112089,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -109239,6 +112168,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -109290,6 +112221,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -109353,6 +112286,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -109421,6 +112356,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -109532,6 +112469,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -109633,6 +112572,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -109718,6 +112659,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -109803,6 +112746,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -109890,6 +112835,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -109960,6 +112907,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -110030,6 +112979,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -110100,6 +113051,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -110168,6 +113121,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -110231,6 +113186,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -110361,6 +113318,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -110429,6 +113388,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -110499,6 +113460,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -110596,6 +113559,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -110690,6 +113655,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -110741,6 +113708,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -110811,6 +113780,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -110890,6 +113861,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -110984,6 +113957,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -111035,6 +114010,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -111098,6 +114075,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -111159,6 +114138,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -111229,6 +114210,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -111309,6 +114292,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -111372,6 +114357,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -111489,6 +114476,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -111561,6 +114550,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -111696,6 +114687,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -111764,6 +114757,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -111834,6 +114829,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -111902,6 +114899,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -111970,6 +114969,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -112031,6 +115032,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -112082,6 +115085,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -112143,6 +115148,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -112223,6 +115230,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -112291,6 +115300,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -112342,6 +115353,31 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [ + { + "Id": "dafa2dec-2fe6-4c6c-a07c-121de360d7b1", + "MaybeId": "dafa2dec-2fe6-4c6c-a07c-121de360d7b1", + "DeletedAt": null, + "VariantEntryId": "564fffa0-0aec-46ab-8d41-cbd30be82be1", + "VariantHeadword": "yenda", + "MainEntryId": "2bde7e2c-9ddc-4de0-b416-c24c0710c2fa", + "MainSenseId": null, + "MainHeadword": "enda", + "Types": [ + { + "Id": "bbd4adb3-9af5-4542-94e8-b0932124108b", + "Name": { + "en": "Pronunciation Variant", + "pt": "Variac\u0327a\u0303o da Pronuncia" + }, + "DeletedAt": null + } + ], + "HideMinorEntry": false, + "Comment": {} + } + ], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -112412,6 +115448,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -112480,6 +115518,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -112564,6 +115604,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -112627,6 +115669,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -112690,6 +115734,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -112753,6 +115799,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -112900,6 +115948,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -113031,6 +116081,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -113110,6 +116162,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -113173,6 +116227,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -113236,6 +116292,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -113306,6 +116364,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -113369,6 +116429,8 @@ "Components": [], "ComplexForms": [], "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], "PublishIn": [ { "Id": "70c0a758-5901-4884-b992-94ca31087607", @@ -130490,5 +133552,91 @@ "Order": 2 } ] - } + }, + "VariantTypes": [ + { + "Id": "024b62c9-93b3-41a0-ab19-587a0030219a", + "Name": { + "en": "Dialectal Variant", + "pt": "Variac\u0327a\u0303o Dialectal" + }, + "DeletedAt": null + }, + { + "Id": "86dd5eb3-b90a-4296-afd3-60c312b63a9a", + "Name": { + "en": "Semantic Dialect Variant", + "pt": "Variac\u0327a\u0303o Sema\u0302ntica" + }, + "DeletedAt": null + }, + { + "Id": "bbd4adb3-9af5-4542-94e8-b0932124108b", + "Name": { + "en": "Pronunciation Variant", + "pt": "Variac\u0327a\u0303o da Pronuncia" + }, + "DeletedAt": null + }, + { + "Id": "c7fe4c4a-abaf-4a0b-b633-d3e73f4057ee", + "Name": { + "en": "Lexical Dialect Variant", + "pt": "Variac\u0327a\u0303o Lexical" + }, + "DeletedAt": null + }, + { + "Id": "4343b1ef-b54f-4fa4-9998-271319a6d74c", + "Name": { + "en": "Free Variant", + "pt": "Variac\u0327a\u0303o livre" + }, + "DeletedAt": null + }, + { + "Id": "fcc61889-00e6-467b-9cf0-8c4f48b9a486", + "Name": { + "en": "Inflectional Variant", + "pt": "Variac\u0327a\u0303o Inflectional" + }, + "DeletedAt": null + }, + { + "Id": "0c4663b3-4d9a-47af-b9a1-c8565d8112ed", + "Name": { + "en": "Spelling Variant", + "pt": "Variac\u0327a\u0303o de Soletrac\u0327a\u0303o" + }, + "DeletedAt": null + }, + { + "Id": "01d4fbc1-3b0c-4f52-9163-7ab0d4f4711c", + "Name": { + "en": "Irregularly Inflected Form" + }, + "DeletedAt": null + }, + { + "Id": "a32f1d1c-4832-46a2-9732-c2276d6547e8", + "Name": { + "en": "Plural" + }, + "DeletedAt": null + }, + { + "Id": "837ebe72-8c1d-4864-95d9-fa313c499d78", + "Name": { + "en": "Past" + }, + "DeletedAt": null + }, + { + "Id": "3942addb-99fd-43e9-ab7d-99025ceb0d4e", + "Name": { + "en": "Unspecified Variant" + }, + "DeletedAt": null + } + ] } \ No newline at end of file diff --git a/backend/FwLite/FwLiteShared/Services/MiniLcmJsInvokable.cs b/backend/FwLite/FwLiteShared/Services/MiniLcmJsInvokable.cs index a56aa4817e..69e243ee0e 100644 --- a/backend/FwLite/FwLiteShared/Services/MiniLcmJsInvokable.cs +++ b/backend/FwLite/FwLiteShared/Services/MiniLcmJsInvokable.cs @@ -322,6 +322,48 @@ public async Task RemoveComplexFormType(Guid entryId, Guid complexFormTypeId) OnDataChanged(); } + [JSInvokable] + public ValueTask GetVariantTypes() + { + return _wrappedApi.GetVariantTypes().ToArrayAsync(); + } + + [JSInvokable] + [TsFunction(Type = "Promise")] + public Task GetVariantType(Guid id) + { + return _wrappedApi.GetVariantType(id); + } + + [JSInvokable] + public async Task CreateVariant(Variant variant) + { + var createdVariant = await _wrappedApi.CreateVariant(variant); + OnDataChanged(); + return createdVariant; + } + + [JSInvokable] + public async Task DeleteVariant(Variant variant) + { + await _wrappedApi.DeleteVariant(variant); + OnDataChanged(); + } + + [JSInvokable] + public async Task AddVariantType(Variant variant, Guid variantTypeId) + { + await _wrappedApi.AddVariantType(variant, variantTypeId); + OnDataChanged(); + } + + [JSInvokable] + public async Task RemoveVariantType(Variant variant, Guid variantTypeId) + { + await _wrappedApi.RemoveVariantType(variant, variantTypeId); + OnDataChanged(); + } + [JSInvokable] public async Task CreateSense(Guid entryId, Sense sense) { diff --git a/backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs b/backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs index 1a0c27f75b..ec9e216e58 100644 --- a/backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs +++ b/backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs @@ -644,6 +644,18 @@ private IEnumerable CreateEntryChanges(Entry entry, if (!createdEntryIds.Contains(complexForm.ComplexFormEntryId)) continue; yield return new AddEntryComponentChange(complexForm); } + foreach (var variantOf in entry.VariantOf) + { + //only add variant links if the main entry was created already, otherwise it will be added when the main entry is created + if (!createdEntryIds.Contains(variantOf.MainEntryId)) continue; + yield return new AddVariantChange(variantOf); + } + foreach (var variant in entry.Variants) + { + //only add variant links if the variant entry was created already, otherwise it will be added when the variant entry is created + if (!createdEntryIds.Contains(variant.VariantEntryId)) continue; + yield return new AddVariantChange(variant); + } foreach (var addComplexFormTypeChange in entry.ComplexFormTypes.Select(c => new AddComplexFormTypeChange(entry.Id, c))) { yield return addComplexFormTypeChange; diff --git a/backend/FwLite/LcmCrdt/QueryHelpers.cs b/backend/FwLite/LcmCrdt/QueryHelpers.cs index a20e94a758..3bac06af0e 100644 --- a/backend/FwLite/LcmCrdt/QueryHelpers.cs +++ b/backend/FwLite/LcmCrdt/QueryHelpers.cs @@ -9,8 +9,8 @@ public static void Finalize(this Entry entry, CompareInfo compareInfo) entry.Senses.ApplySortOrder(); entry.Components.ApplySortOrder(); entry.ComplexForms.Sort(compareInfo.AsComplexFormComparer()); - entry.VariantOf.Sort(compareInfo.AsVariantOfComparer()); - entry.Variants.Sort(compareInfo.AsVariantsComparer()); + entry.VariantOf.Sort(Variant.VariantOfOrder); + entry.Variants.Sort(Variant.VariantsOrder); foreach (var sense in entry.Senses) { sense.Finalize(); @@ -57,23 +57,4 @@ public static IComparer AsComplexFormComparer(this Compare }); } - public static IComparer AsVariantOfComparer(this CompareInfo compareInfo) - { - return Comparer.Create((a, b) => - { - var result = compareInfo.Compare(a.MainHeadword, b.MainHeadword, CompareOptions.IgnoreCase); - if (result != 0) return result; - return a.MainEntryId.CompareTo(b.MainEntryId); - }); - } - - public static IComparer AsVariantsComparer(this CompareInfo compareInfo) - { - return Comparer.Create((a, b) => - { - var result = compareInfo.Compare(a.VariantHeadword, b.VariantHeadword, CompareOptions.IgnoreCase); - if (result != 0) return result; - return a.VariantEntryId.CompareTo(b.VariantEntryId); - }); - } } diff --git a/backend/FwLite/MiniLcm/Models/Variant.cs b/backend/FwLite/MiniLcm/Models/Variant.cs index 7ba8d25996..d21854bb34 100644 --- a/backend/FwLite/MiniLcm/Models/Variant.cs +++ b/backend/FwLite/MiniLcm/Models/Variant.cs @@ -96,6 +96,23 @@ public Variant Copy() }; } + //variant lists have no user-meaningful order, so both IMiniLcmApi implementations sort them by + //their composite key — deterministic and culture-free, unlike headword sorting (which is why + //ComplexForms sort alphabetically: FieldWorks does; there's no such convention for variants) + public static readonly Comparer VariantOfOrder = Comparer.Create((a, b) => + { + var result = a.MainEntryId.CompareTo(b.MainEntryId); + if (result != 0) return result; + return (a.MainSenseId ?? Guid.Empty).CompareTo(b.MainSenseId ?? Guid.Empty); + }); + + public static readonly Comparer VariantsOrder = Comparer.Create((a, b) => + { + var result = a.VariantEntryId.CompareTo(b.VariantEntryId); + if (result != 0) return result; + return (a.MainSenseId ?? Guid.Empty).CompareTo(b.MainSenseId ?? Guid.Empty); + }); + public override string ToString() { return diff --git a/frontend/viewer/src/lib/dotnet-types/generated-types/FwLiteShared/Services/IMiniLcmJsInvokable.ts b/frontend/viewer/src/lib/dotnet-types/generated-types/FwLiteShared/Services/IMiniLcmJsInvokable.ts index 5fedeb1bfc..e3b406c812 100644 --- a/frontend/viewer/src/lib/dotnet-types/generated-types/FwLiteShared/Services/IMiniLcmJsInvokable.ts +++ b/frontend/viewer/src/lib/dotnet-types/generated-types/FwLiteShared/Services/IMiniLcmJsInvokable.ts @@ -19,6 +19,8 @@ import type {IWritingSystem} from '../../MiniLcm/Models/IWritingSystem'; import type {WritingSystemType} from '../../MiniLcm/Models/WritingSystemType'; import type {ICreateEntryOptions} from '../../MiniLcm/ICreateEntryOptions'; import type {IComplexFormComponent} from '../../MiniLcm/Models/IComplexFormComponent'; +import type {IVariantType} from '../../MiniLcm/Models/IVariantType'; +import type {IVariant} from '../../MiniLcm/Models/IVariant'; import type {ISense} from '../../MiniLcm/Models/ISense'; import type {IExampleSentence} from '../../MiniLcm/Models/IExampleSentence'; import type {IReadFileResponseJs} from './IReadFileResponseJs'; @@ -67,6 +69,12 @@ export interface IMiniLcmJsInvokable deleteComplexFormComponent(complexFormComponent: IComplexFormComponent) : Promise; addComplexFormType(entryId: string, complexFormTypeId: string) : Promise; removeComplexFormType(entryId: string, complexFormTypeId: string) : Promise; + getVariantTypes() : Promise; + getVariantType(id: string) : Promise; + createVariant(variant: IVariant) : Promise; + deleteVariant(variant: IVariant) : Promise; + addVariantType(variant: IVariant, variantTypeId: string) : Promise; + removeVariantType(variant: IVariant, variantTypeId: string) : Promise; createSense(entryId: string, sense: ISense) : Promise; updateSense(entryId: string, before: ISense, after: ISense) : Promise; deleteSense(entryId: string, senseId: string) : Promise; diff --git a/frontend/viewer/src/project/data/index.ts b/frontend/viewer/src/project/data/index.ts index e5735f3fa7..b8843ee062 100644 --- a/frontend/viewer/src/project/data/index.ts +++ b/frontend/viewer/src/project/data/index.ts @@ -3,5 +3,6 @@ export * from './custom-view-service.svelte'; export * from './publications.svelte'; export * from './parts-of-speech.svelte'; export * from './complex-form-types'; +export * from './variant-types'; export * from './project-stats'; export * from './semantic-domains'; diff --git a/frontend/viewer/src/project/data/variant-types.ts b/frontend/viewer/src/project/data/variant-types.ts new file mode 100644 index 0000000000..3e8d88b11c --- /dev/null +++ b/frontend/viewer/src/project/data/variant-types.ts @@ -0,0 +1,10 @@ +import {useProjectContext} from '$project/project-context.svelte'; + +const variantTypesSymbol = Symbol.for('fw-lite-variant-types'); +export function useVariantTypes() { + const projectContext = useProjectContext(); + return projectContext.getOrAddAsync(variantTypesSymbol, [], api => api.getVariantTypes()); +} + +/** Unspecified Variant — the type FLEx assigns when none is chosen (well-known guid) */ +export const UNSPECIFIED_VARIANT_TYPE_ID = '3942addb-99fd-43e9-ab7d-99025ceb0d4e'; From 1b38e9b24a43b14cf1ef6100a6b1cc2d4f3a7a3d Mon Sep 17 00:00:00 2001 From: Tim Haasdyk Date: Sat, 4 Jul 2026 15:11:50 +0200 Subject: [PATCH 06/21] Update VARIANTS.md status Co-Authored-By: Claude Fable 5 --- backend/FwLite/VARIANTS.md | 42 ++++++++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/backend/FwLite/VARIANTS.md b/backend/FwLite/VARIANTS.md index df4c93050b..b1f340d232 100644 --- a/backend/FwLite/VARIANTS.md +++ b/backend/FwLite/VARIANTS.md @@ -7,19 +7,39 @@ dev/agent can pick up the work mid-stream. Update the **Status** section as step - [x] Exploration (complex-forms blueprint, liblcm variant model, viewer UI) - [x] Design review with Tim (2026-07-03): per-link model confirmed, naming settled -- [~] Step 1 — model, changes, both APIs, sync orchestration, conformance tests - (in progress: conformance suites green both sides; chasing fallout in broader - LcmCrdt.Tests run) -- [ ] Step 2 — sync round-trip test suite, upgrade tests, Sena3 + verified regens -- [ ] Step 3 — Viewer UI (fields, picker, i18n, Playwright) - -Branches are stacked: `feat/variants-model` ← `feat/variants-sync` ← `feat/variants-ui`. - -**Boundary change vs the original plan**: the sync/import orchestration -(`VariantTypeSync` in `SyncInternal`, `ProjectSnapshot.VariantTypes`, `ProjectImporter` -variant-type loop, `ResumableImportApi` caching) moved INTO step 1 — the moment the FwData +- [x] Step 1+2 — model, changes, both APIs, sync orchestration + round-trip suite + (all backend suites green: MiniLcm.Tests, LcmCrdt.Tests, FwDataMiniLcmBridge.Tests, + FwLiteProjectSync.Tests incl. Sena3 live db regen; the WS-font failure on Windows is + the known local-only false-fail) +- [x] Step 3 — Viewer UI (fields, per-link type menu, demo seed, i18n, Playwright green) +- [ ] Review + PR prep + +**Boundary change vs the original plan**: steps 1 and 2 merged — the moment the FwData bridge reads variants, importing a variant-containing project crashes unless variant types are imported before entries, so a "model-only" PR can't be green against real projects. +Final split: one backend PR (model through sync) + one UI PR stacked on it. + +### Step 2/3 decision addenda + +- **Deterministic variant-list order on both sides** (`Variant.VariantOfOrder`/`VariantsOrder`, + composite-key based, culture-free). ComplexForms sort alphabetically because FieldWorks + does; variants have no such convention, and guid order keeps snapshot comparisons and + sync stable across cultures. UI can sort for display later if wanted. +- **`CrdtMiniLcmApi.BulkCreateEntries`** (import fast path) emits `AddVariantChange` with the + same only-if-other-endpoint-already-created trick as components. +- **Sena3 verified live db/snapshot regenerated**: sena-3 really contains variants + (*inde*→*ande*, *yenda*→*enda*, custom bilingual "Pronunciation Variant" type), which now + round-trip — the diff was inspected and is purely additive. +- **Blank-project template regenerated**: new CRDT projects seed the 7 standard FLEx variant + types (well-known guids). +- **UI**: `Variant of` (picker: entries-and-senses) and `Variants` (picker: only-entries) + fields, both shown by default in both views; per-link variant types via a "Variant type" + checkbox submenu on each link badge; new links default to *Unspecified Variant* (FLEx + behavior); all edits flow through `updateEntry` (before/after diff → EntrySync), so the + in-memory demo works without dedicated endpoints. `useVariantTypes()` is **eager** — + the type list must be loaded before the first pick applies the default. +- **helpIds**: `Variant_of_field.htm` verified to exist (fetched); there's no dedicated + FLEx topic for the Variants back-reference field, so it reuses the same topic. ## The LCM model (authority: liblcm) From b1bdea7ec99b8da743be347e3588852536c43c80 Mon Sep 17 00:00:00 2001 From: Tim Haasdyk Date: Sat, 4 Jul 2026 15:25:44 +0200 Subject: [PATCH 07/21] Review fixes: sense-move keeps variant links, hub exposes variant types A sense-targeted variant link is identified by its full composite key; the FwData bridge matched by sense guid alone, so a moved sense made the sync drop the link (new regression test covers both implementations). Co-Authored-By: Claude Fable 5 --- .../MiniLcmTests/VariantTests.cs | 10 +++++ .../Api/FwDataMiniLcmApi.cs | 15 +++++++- .../FwLiteProjectSync.Tests/EntrySyncTests.cs | 37 +++++++++++++++++++ .../FwLiteWeb/Hubs/MiniLcmApiHubBase.cs | 5 +++ .../SnapshotAtCommitServiceTests.cs | 2 +- backend/FwLite/VARIANTS.md | 11 +++--- 6 files changed, 72 insertions(+), 8 deletions(-) diff --git a/backend/FwLite/FwDataMiniLcmBridge.Tests/MiniLcmTests/VariantTests.cs b/backend/FwLite/FwDataMiniLcmBridge.Tests/MiniLcmTests/VariantTests.cs index 302805aeb6..3800852488 100644 --- a/backend/FwLite/FwDataMiniLcmBridge.Tests/MiniLcmTests/VariantTests.cs +++ b/backend/FwLite/FwDataMiniLcmBridge.Tests/MiniLcmTests/VariantTests.cs @@ -24,6 +24,16 @@ public async Task GetVariantTypes_IncludesIrregularlyInflectedFormSubtypes() types.Should().Contain(t => t.Id == LexEntryTypeTags.kguidLexTypPastVar); types.Should().Contain(t => t.Id == LexEntryTypeTags.kguidLexTypSpellingVar); } + + [Fact] + public async Task CreateVariantType_LandsAsATopLevelPossibility() + { + // the flattened read can surface children, but created types must be top-level + var created = await Api.CreateVariantType(new VariantType { Id = Guid.NewGuid(), Name = new() { { "en", "custom type" } } }); + var fwDataApi = (FwDataMiniLcmApi)BaseApi; + fwDataApi.Cache.LangProject.LexDbOA.VariantEntryTypesOA.PossibilitiesOS + .Should().Contain(p => p.Guid == created.Id); + } } /// diff --git a/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs b/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs index 670d205b5a..f54982efec 100644 --- a/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs +++ b/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs @@ -1500,6 +1500,9 @@ internal void RemoveVariant(ILexEntry lexVariantEntry, Variant variant) { //sense has been deleted, so this link is gone already if (!SenseRepository.TryGetObject(variant.MainSenseId.Value, out var sense)) return; + //links are identified by their full composite key; when the sense has moved to a + //different entry this link no longer exists (it became a link to the new entry) + if (sense.Entry.Guid != variant.MainEntryId) return; target = sense; } else @@ -1523,9 +1526,17 @@ internal void RemoveVariant(ILexEntry lexVariantEntry, Variant variant) internal ILexEntryRef? FindVariantRef(ILexEntry lexVariantEntry, Variant variant) { - var targetGuid = variant.MainSenseId ?? variant.MainEntryId; return lexVariantEntry.VariantEntryRefs - .FirstOrDefault(r => r.ComponentLexemesRS.Any(o => o.Guid == targetGuid)); + .FirstOrDefault(r => r.ComponentLexemesRS.Any(o => MatchesVariantTarget(o, variant))); + } + + //match the full composite key: a sense target only counts while the sense still belongs + //to the link's main entry (a moved sense means this is a different link) + private static bool MatchesVariantTarget(ICmObject o, Variant variant) + { + return variant.MainSenseId is not null + ? o is ILexSense sense && sense.Guid == variant.MainSenseId && sense.Entry.Guid == variant.MainEntryId + : o is ILexEntry entry && entry.Guid == variant.MainEntryId; } private IList MultiStringToTsStrings(MultiString? multiString) diff --git a/backend/FwLite/FwLiteProjectSync.Tests/EntrySyncTests.cs b/backend/FwLite/FwLiteProjectSync.Tests/EntrySyncTests.cs index 3435128a85..64a6b1abaf 100644 --- a/backend/FwLite/FwLiteProjectSync.Tests/EntrySyncTests.cs +++ b/backend/FwLite/FwLiteProjectSync.Tests/EntrySyncTests.cs @@ -961,6 +961,43 @@ public async Task CanSyncComponentWhenSenseMovesToDifferentEntry(string entryOrd actualNewComponentEntry.ComplexForms[0].ComplexFormEntryId.Should().Be(complexForm.Id); } + [Fact] + public async Task CanSyncVariantWhenTargetSenseMovesToDifferentEntry() + { + var senseId = Guid.NewGuid(); + var oldMainEntry = await Api.CreateEntry(new() { LexemeForm = { { "en", "old-main" } }, Senses = [new() { Id = senseId }] }); + var oldMainEntryAfter = oldMainEntry.Copy(); + oldMainEntryAfter.Senses.Clear(); // sense is moved from here + + var newMainEntry = await Api.CreateEntry(new() { Id = Guid.NewGuid(), LexemeForm = { { "en", "new-main" } } }); + var newMainEntryAfter = newMainEntry.Copy(); + newMainEntryAfter.Senses.Add(new Sense() { Id = senseId }); // sense is moved to here + + var variantEntry = new Entry + { + Id = Guid.NewGuid(), + LexemeForm = { { "en", "variant" } }, + }; + variantEntry.VariantOf.Add(Variant.FromEntries(variantEntry, oldMainEntry, senseId)); + variantEntry = await Api.CreateEntry(variantEntry); + + var variantEntryAfter = variantEntry.Copy(); + variantEntryAfter.VariantOf = [Variant.FromEntries(variantEntry, newMainEntry, senseId)]; + + await EntrySync.SyncFull( + [variantEntry, oldMainEntry, newMainEntry], + [variantEntryAfter, oldMainEntryAfter, newMainEntryAfter], + Api); + + var actualVariantEntry = await Api.GetEntry(variantEntry.Id); + actualVariantEntry.Should().NotBeNull(); + var link = actualVariantEntry!.VariantOf.Should().ContainSingle().Subject; + link.MainEntryId.Should().Be(newMainEntry.Id); + link.MainSenseId.Should().Be(senseId); + (await Api.GetEntry(oldMainEntry.Id))!.Variants.Should().BeEmpty(); + (await Api.GetEntry(newMainEntry.Id))!.Variants.Should().ContainSingle(); + } + [Fact] public async Task SyncComplexFormsAndComponents_MovesComponentsToCorrectPosition() { diff --git a/backend/FwLite/FwLiteWeb/Hubs/MiniLcmApiHubBase.cs b/backend/FwLite/FwLiteWeb/Hubs/MiniLcmApiHubBase.cs index 1d79927f9e..220def7307 100644 --- a/backend/FwLite/FwLiteWeb/Hubs/MiniLcmApiHubBase.cs +++ b/backend/FwLite/FwLiteWeb/Hubs/MiniLcmApiHubBase.cs @@ -48,6 +48,11 @@ public IAsyncEnumerable GetComplexFormTypes() return _miniLcmApi.GetComplexFormTypes(); } + public IAsyncEnumerable GetVariantTypes() + { + return _miniLcmApi.GetVariantTypes(); + } + public virtual async Task UpdateMorphType(Guid id, JsonPatchDocument update) { var updatedMorphType = await _miniLcmApi.UpdateMorphType(id, new UpdateObjectInput(update)); diff --git a/backend/FwLite/LcmCrdt.Tests/SnapshotAtCommitServiceTests.cs b/backend/FwLite/LcmCrdt.Tests/SnapshotAtCommitServiceTests.cs index 5031284225..1622f1e89c 100644 --- a/backend/FwLite/LcmCrdt.Tests/SnapshotAtCommitServiceTests.cs +++ b/backend/FwLite/LcmCrdt.Tests/SnapshotAtCommitServiceTests.cs @@ -26,7 +26,7 @@ private void AssertSnapshotsAreEquivalentEqual(ProjectSnapshot expected, Project .WithoutStrictOrderingFor(x => x.SemanticDomains) .WithoutStrictOrderingFor(x => x.ComplexFormTypes) .WithoutStrictOrderingFor(x => x.MorphTypes) - .WithoutStrictOrderingFor(x => x.VariantTypes) + .WithoutStrictOrderingFor(x => x.VariantTypes) ); } diff --git a/backend/FwLite/VARIANTS.md b/backend/FwLite/VARIANTS.md index b1f340d232..cca50861e3 100644 --- a/backend/FwLite/VARIANTS.md +++ b/backend/FwLite/VARIANTS.md @@ -143,6 +143,8 @@ public record Variant : IObjectWithId 8. **Deleted `VariantType` cleanup**: `Variant.GetReferences()` includes its `Types` ids, and `RemoveReference` removes the type from the list (only endpoint ids soft-delete the link). Better than the complex-forms quirk where deleted types linger in `Entry.ComplexFormTypes`. + Like `Entry.ComplexFormTypes`, `Variant.Types` stores denormalized copies (jsonb), so a + type *rename* reaches already-linked variants on the next sync/read, not instantly. 9. **Variant entries with no senses are first-class** and must be covered by tests both ways (headline behavioral difference; FLEx "Insert Variant" creates sense-less entries). 10. **A variant can target a sense** (`MainSenseId`); on the main side such links still @@ -185,14 +187,13 @@ Write: - Changes (register in `LcmCrdtKernel.ConfigureCrdt` **and** add instances to `UseChangesTests.GetAllChanges()` — kernel comment mandates it): `AddVariantChange` (create; carries types+scalars; dedupe/cycle/deleted-ref handling - mirroring `AddEntryComponentChange`), `SetVariantChange` (mirror - `SetComplexFormComponentChange`; needs a hand-written generator branch in - `ChangeSerializationTests.GeneratedChangesForType` — protected ctor), + mirroring `AddEntryComponentChange`), `AddVariantTypeChange`/`RemoveVariantTypeChange` (`EditChange`), `CreateVariantType`, `JsonPatchChange`, `JsonPatchChange`, `DeleteChange`, `DeleteChange`. - Check `ConfigRegistrationTests.AllChangesAreRegistered` exclusion list (it force-crosses - generic changes with all object types). + A `SetVariantChange` (mirror of `SetComplexFormComponentChange`) was considered and + dropped: that change turned out to be test/wire-legacy only for complex forms; variant + scalars go through `JsonPatchChange` and endpoint changes are delete+recreate. ### API surface (both implementations + wrappers) From a45f5f761f1a897187ab36267ba2cdc6108b5673 Mon Sep 17 00:00:00 2001 From: Tim Haasdyk Date: Sat, 4 Jul 2026 15:28:59 +0200 Subject: [PATCH 08/21] Demo api parity for the extended MiniLcm JS interface Co-Authored-By: Claude Fable 5 --- frontend/viewer/src/lib/dotnet-types/index.ts | 2 ++ .../src/project/demo/demo-entry-data.ts | 31 ++++++++++++++++++- .../src/project/demo/in-memory-demo-api.ts | 28 ++++++++++++++++- 3 files changed, 59 insertions(+), 2 deletions(-) diff --git a/frontend/viewer/src/lib/dotnet-types/index.ts b/frontend/viewer/src/lib/dotnet-types/index.ts index 811b6979d1..f2d50fdaaf 100644 --- a/frontend/viewer/src/lib/dotnet-types/index.ts +++ b/frontend/viewer/src/lib/dotnet-types/index.ts @@ -10,6 +10,8 @@ export * from './generated-types/FwLiteShared/Services/IMiniLcmFeatures'; export * from './generated-types/FwLiteShared/Services/IMiniLcmJsInvokable'; export * from './generated-types/MiniLcm/Models/IComplexFormComponent'; export * from './generated-types/MiniLcm/Models/IComplexFormType'; +export * from './generated-types/MiniLcm/Models/IVariant'; +export * from './generated-types/MiniLcm/Models/IVariantType'; export * from './generated-types/MiniLcm/Models/IEntry'; export * from './generated-types/MiniLcm/Models/IExampleSentence'; export * from './generated-types/MiniLcm/Models/ITranslation'; diff --git a/frontend/viewer/src/project/demo/demo-entry-data.ts b/frontend/viewer/src/project/demo/demo-entry-data.ts index 02af4eadc2..df73740b73 100644 --- a/frontend/viewer/src/project/demo/demo-entry-data.ts +++ b/frontend/viewer/src/project/demo/demo-entry-data.ts @@ -1,4 +1,4 @@ -import {type IEntry, type IMorphType, type IWritingSystems, MorphTypeKind, WritingSystemType} from '$lib/dotnet-types'; +import {type IEntry, type IMorphType, type IVariant, type IVariantType, type IWritingSystems, MorphTypeKind, WritingSystemType} from '$lib/dotnet-types'; export const projectName = 'Sena 3'; @@ -336,4 +336,33 @@ export const entries: IEntry[] = JSON.parse( // Keep the array the same length and don't shift entries down, // so that tests keep passing +// entries in the JSON blob predate variants +for (const entry of entries) { + entry.variantOf ??= []; + entry.variants ??= []; +} + entries.splice(0, 1, allWsEntry); + +// FLEx standard variant types (well-known guids) +export const variantTypes: IVariantType[] = [ + {id: '3942addb-99fd-43e9-ab7d-99025ceb0d4e', name: {en: 'Unspecified Variant'}}, + {id: '024b62c9-93b3-41a0-ab19-587a0030219a', name: {en: 'Dialectal Variant'}}, + {id: '0c4663b3-4d9a-47af-b9a1-c8565d8112ed', name: {en: 'Spelling Variant'}}, +]; + +// seed a variant pair so the demo project shows the feature +const demoVariantEntry = entries[2]; +const demoMainEntry = entries[3]; +const demoVariant: IVariant = { + id: 'b6d5be87-9958-0d55-8788-79e04c8cc001', + variantEntryId: demoVariantEntry.id, + variantHeadword: Object.values(demoVariantEntry.citationForm)[0] ?? Object.values(demoVariantEntry.lexemeForm)[0], + mainEntryId: demoMainEntry.id, + mainHeadword: Object.values(demoMainEntry.citationForm)[0] ?? Object.values(demoMainEntry.lexemeForm)[0], + types: [variantTypes[0]], + hideMinorEntry: false, + comment: {}, +}; +demoVariantEntry.variantOf = [demoVariant]; +demoMainEntry.variants = [demoVariant]; diff --git a/frontend/viewer/src/project/demo/in-memory-demo-api.ts b/frontend/viewer/src/project/demo/in-memory-demo-api.ts index ee4b297943..34256b2ef3 100644 --- a/frontend/viewer/src/project/demo/in-memory-demo-api.ts +++ b/frontend/viewer/src/project/demo/in-memory-demo-api.ts @@ -3,6 +3,8 @@ import { DotnetService, type IComplexFormComponent, + type IVariant, + type IVariantType, type IComplexFormType, type ICreateEntryOptions, type IEntry, @@ -26,7 +28,7 @@ import { ViewBase, MorphTypeKind, } from '$lib/dotnet-types'; -import {entries, morphTypes, partsOfSpeech, projectName, writingSystems} from './demo-entry-data'; +import {entries, morphTypes, partsOfSpeech, projectName, variantTypes, writingSystems} from './demo-entry-data'; import {WritingSystemService} from '../data/writing-system-service.svelte'; import {FwLitePlatform} from '$lib/dotnet-types/generated-types/FwLiteShared/FwLitePlatform'; @@ -467,6 +469,30 @@ export class InMemoryDemoApi implements IMiniLcmJsInvokable { return Promise.resolve(); } + getVariantTypes(): Promise { + return Promise.resolve(variantTypes); + } + + getVariantType(_id: string): Promise { + return Promise.resolve(variantTypes.find(vt => vt.id === _id) ?? null); + } + + createVariant(_variant: IVariant): Promise { + throw new Error('Method not implemented.'); + } + + deleteVariant(_variant: IVariant): Promise { + throw new Error('Method not implemented.'); + } + + addVariantType(_variant: IVariant, _variantTypeId: string): Promise { + throw new Error('Method not implemented.'); + } + + removeVariantType(_variant: IVariant, _variantTypeId: string): Promise { + throw new Error('Method not implemented.'); + } + createComplexFormComponent(_complexFormComponent: IComplexFormComponent): Promise { throw new Error('Method not implemented.'); } From 3f720abbef3535667e6e167c01532cf6ad559dba Mon Sep 17 00:00:00 2001 From: Tim Haasdyk Date: Sat, 4 Jul 2026 15:32:16 +0200 Subject: [PATCH 09/21] Note review outcome and PR links in VARIANTS.md Co-Authored-By: Claude Fable 5 --- backend/FwLite/VARIANTS.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/backend/FwLite/VARIANTS.md b/backend/FwLite/VARIANTS.md index cca50861e3..0ac7299cff 100644 --- a/backend/FwLite/VARIANTS.md +++ b/backend/FwLite/VARIANTS.md @@ -12,7 +12,10 @@ dev/agent can pick up the work mid-stream. Update the **Status** section as step FwLiteProjectSync.Tests incl. Sena3 live db regen; the WS-font failure on Windows is the known local-only false-fail) - [x] Step 3 — Viewer UI (fields, per-link type menu, demo seed, i18n, Playwright green) -- [ ] Review + PR prep +- [x] Review (8-agent pass; fixes: sense-move composite-key lookup in the FwData bridge, + type-toggle re-render, hub read parity) + draft PRs: + backend [#2408](https://github.com/sillsdev/languageforge-lexbox/pull/2408), + UI [#2409](https://github.com/sillsdev/languageforge-lexbox/pull/2409) (stacked) **Boundary change vs the original plan**: steps 1 and 2 merged — the moment the FwData bridge reads variants, importing a variant-containing project crashes unless variant types From be8a6c310185cce1efc5246b9a7344a7d9c972b1 Mon Sep 17 00:00:00 2001 From: Tim Haasdyk Date: Sat, 4 Jul 2026 16:05:34 +0200 Subject: [PATCH 10/21] CodeRabbit fixes: sense-ownership guard on variant create, require variant entry id Both implementations now reject a MainSenseId that belongs to a different entry (fail before mutation); EntryValidator requires VariantEntryId on Variants items. Also corrects the stale cycle-guard decision text in VARIANTS.md. Co-Authored-By: Claude Fable 5 --- .../FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs | 17 ++++++++++++++--- backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs | 11 +++++++++++ .../FwLite/MiniLcm.Tests/VariantTestsBase.cs | 13 +++++++++++++ .../FwLite/MiniLcm/Validators/EntryValidator.cs | 6 ++++++ backend/FwLite/VARIANTS.md | 17 ++++++++++------- 5 files changed, 54 insertions(+), 10 deletions(-) diff --git a/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs b/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs index f54982efec..d808dc4d57 100644 --- a/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs +++ b/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs @@ -1476,9 +1476,20 @@ public Task RemoveVariantType(Variant variant, Guid variantTypeId) internal void AddVariant(ILexEntry lexVariantEntry, Variant variant) { if (FindVariantRef(lexVariantEntry, variant) is not null) return; //idempotent, like the CRDT side - var target = variant.MainSenseId is not null - ? (ICmObject)SenseRepository.GetObject(variant.MainSenseId.Value) - : EntriesRepository.GetObject(variant.MainEntryId); + ICmObject target; + if (variant.MainSenseId is not null) + { + var sense = SenseRepository.GetObject(variant.MainSenseId.Value); + //fail before mutating: a mismatched pair would create a link whose derived + //MainEntryId is the sense's actual entry, not the requested one + if (sense.Entry.Guid != variant.MainEntryId) + throw new InvalidOperationException($"Sense {variant.MainSenseId} does not belong to entry {variant.MainEntryId}, it belongs to {sense.Entry.Guid}"); + target = sense; + } + else + { + target = EntriesRepository.GetObject(variant.MainEntryId); + } //one LexEntryRef per link — multiple variant refs on an entry are how FLEx represents //being a variant of multiple things with different types var entryRef = Cache.ServiceLocator.GetInstance().Create(); diff --git a/backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs b/backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs index ec9e216e58..efc2f0833c 100644 --- a/backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs +++ b/backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs @@ -463,6 +463,17 @@ public async Task SubmitCreateVariant(Variant variant) private static async Task CreateVariantChange(MiniLcmRepository repo, Variant variant) { + if (variant.MainSenseId is not null) + { + //a missing sense is tolerated (out-of-order sync; the change soft-deletes the link), + //but a sense that exists under a DIFFERENT entry is a bad request + var senseEntryId = await repo.Senses + .Where(s => s.Id == variant.MainSenseId.Value) + .Select(s => (Guid?)s.EntryId) + .FirstOrDefaultAsync(); + if (senseEntryId is not null && senseEntryId != variant.MainEntryId) + throw new InvalidOperationException($"Sense {variant.MainSenseId} does not belong to entry {variant.MainEntryId}, it belongs to {senseEntryId}"); + } var typeIds = variant.Types.Select(t => t.Id).ToArray(); var resolvedTypes = await repo.VariantTypes.Where(t => typeIds.Contains(t.Id)).ToArrayAsync(); var missing = typeIds.Except(resolvedTypes.Select(t => t.Id)).ToArray(); diff --git a/backend/FwLite/MiniLcm.Tests/VariantTestsBase.cs b/backend/FwLite/MiniLcm.Tests/VariantTestsBase.cs index 6f6f616e8c..11aa7141ec 100644 --- a/backend/FwLite/MiniLcm.Tests/VariantTestsBase.cs +++ b/backend/FwLite/MiniLcm.Tests/VariantTestsBase.cs @@ -220,6 +220,19 @@ public async Task CreateVariant_ThrowsOnSelfReference() await act.Should().ThrowAsync(); } + [Fact] + public async Task CreateVariant_ThrowsWhenSenseBelongsToADifferentEntry() + { + var otherEntry = await Api.CreateEntry(new() + { + Id = Guid.NewGuid(), + LexemeForm = { { "en", "other entry" } } + }); + //_mainSenseId1 belongs to _mainEntry, not otherEntry + var act = async () => await Api.CreateVariant(Variant.FromEntries(_variantEntry, otherEntry, _mainSenseId1)); + await act.Should().ThrowAsync(); + } + [Fact] public async Task CreateVariant_AllowsChains() { diff --git a/backend/FwLite/MiniLcm/Validators/EntryValidator.cs b/backend/FwLite/MiniLcm/Validators/EntryValidator.cs index e07d1de399..33a40fc5d3 100644 --- a/backend/FwLite/MiniLcm/Validators/EntryValidator.cs +++ b/backend/FwLite/MiniLcm/Validators/EntryValidator.cs @@ -25,6 +25,7 @@ public EntryValidator() RuleForEach(e => e.VariantOf).Must(NotBeEmptyMainEntryReference).WithMessage("Variant main-entry reference must not be empty."); RuleForEach(e => e.VariantOf).Must(NotBeVariantOfSelfReference).WithMessage("Variant main-entry reference must not be the same as the entry."); RuleForEach(e => e.VariantOf).Must(HaveCorrectVariantEntryReference).WithMessage("Variant entry reference must be correct."); + RuleForEach(e => e.Variants).Must(NotBeEmptyVariantEntryReference).WithMessage("Variant entry reference must not be empty."); RuleForEach(e => e.Variants).Must(NotBeVariantSelfReference).WithMessage("Variant entry reference must not be the same as the entry."); RuleForEach(e => e.Variants).Must(HaveCorrectMainEntryReference).WithMessage("Variant main-entry reference must be correct."); RuleForEach(e => e.VariantOf).SetValidator(new VariantValidator()); @@ -63,6 +64,11 @@ private bool NotBeEmptyMainEntryReference(Entry entry, Variant variant) return variant.MainEntryId != Guid.Empty; } + private bool NotBeEmptyVariantEntryReference(Entry entry, Variant variant) + { + return variant.VariantEntryId != Guid.Empty; + } + private bool NotBeVariantOfSelfReference(Entry entry, Variant variant) { return variant.MainEntryId != entry.Id; diff --git a/backend/FwLite/VARIANTS.md b/backend/FwLite/VARIANTS.md index 0ac7299cff..e7953ba1ea 100644 --- a/backend/FwLite/VARIANTS.md +++ b/backend/FwLite/VARIANTS.md @@ -136,13 +136,16 @@ public record Variant : IObjectWithId This is what makes concurrent type edits merge instead of last-writer-wins. 6. **No ordering.** Variant lists have no user-meaningful order in FLEx; both directions diff as sets. No `IOrderable`, no `SetOrderChange`, no Move API. -7. **Only self-reference and duplicates are rejected — NOT chains or cycles.** This - deliberately diverges from complex forms' BFS cycle guard: FLEx itself allows variant - chains and cycles (`MakeVariantOf` has no cycle check, unlike complex-form components), - and FwLite never traverses variant links recursively, so rejecting shapes FLEx data can - contain would make sync diverge permanently. The duplicate guard lives in - `AddVariantChange` (soft-delete, sync-tolerant); self-reference is rejected by - `VariantValidator` in the validation wrapper (consistent across both implementations). +7. **Self-references, duplicates AND cycles are rejected; chains are allowed.** (This + decision reversed mid-implementation: `MakeVariantOf` has no cycle check, but the FwData + conformance tests proved liblcm rejects circular refs at a lower level — + `LexEntryRef.ValidateAddObjectInternal` → `LexEntry.AllComponents`, which walks the + **combined** complex-form + variant component graph. Allowing in the CRDT what FLEx + rejects would wedge sync, so `AddVariantChange` mirrors the combined-graph walk.) + The duplicate/cycle guard lives in `AddVariantChange` (soft-delete, sync-tolerant); + self-reference is additionally rejected by `VariantValidator` in the validation wrapper + (consistent across both implementations). Chains (a variant of a variant) remain legal, + as in FLEx. 8. **Deleted `VariantType` cleanup**: `Variant.GetReferences()` includes its `Types` ids, and `RemoveReference` removes the type from the list (only endpoint ids soft-delete the link). Better than the complex-forms quirk where deleted types linger in `Entry.ComplexFormTypes`. From 9c9c270d7f01038deabc20bed4d41d05a034854c Mon Sep 17 00:00:00 2001 From: Tim Haasdyk Date: Sat, 4 Jul 2026 16:48:00 +0200 Subject: [PATCH 11/21] Cover entry-level variant reference validation rules Co-Authored-By: Claude Fable 5 --- .../Validators/EntryValidatorTests.cs | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/backend/FwLite/MiniLcm.Tests/Validators/EntryValidatorTests.cs b/backend/FwLite/MiniLcm.Tests/Validators/EntryValidatorTests.cs index edbde97653..7d80083480 100644 --- a/backend/FwLite/MiniLcm.Tests/Validators/EntryValidatorTests.cs +++ b/backend/FwLite/MiniLcm.Tests/Validators/EntryValidatorTests.cs @@ -135,6 +135,38 @@ public void Fails_WhenComponentsContainEmptyGuid() _validator.TestValidate(entry).ShouldHaveValidationErrorFor("Components[0]"); } + [Fact] + public void Fails_WhenVariantOfContainsEmptyMainEntryGuid() + { + var entryId = Guid.NewGuid(); + var entry = new Entry() { Id = entryId, LexemeForm = new MultiString(){{"en", "lexeme"}}, VariantOf = [new Variant(){ VariantEntryId = entryId, MainEntryId = Guid.Empty }] }; + _validator.TestValidate(entry).ShouldHaveValidationErrorFor("VariantOf[0]"); + } + + [Fact] + public void Succeeds_WhenVariantOfContainsEmptyVariantEntryGuid() + { + var entryId = Guid.NewGuid(); + var entry = new Entry() { Id = entryId, LexemeForm = new MultiString(){{"en", "lexeme"}}, VariantOf = [new Variant(){ VariantEntryId = Guid.Empty, MainEntryId = Guid.NewGuid() }] }; + _validator.TestValidate(entry).ShouldNotHaveAnyValidationErrors(); + } + + [Fact] + public void Fails_WhenVariantsContainEmptyVariantEntryGuid() + { + var entryId = Guid.NewGuid(); + var entry = new Entry() { Id = entryId, LexemeForm = new MultiString(){{"en", "lexeme"}}, Variants = [new Variant(){ VariantEntryId = Guid.Empty, MainEntryId = entryId }] }; + _validator.TestValidate(entry).ShouldHaveValidationErrorFor("Variants[0]"); + } + + [Fact] + public void Succeeds_WhenVariantsContainEmptyMainEntryGuid() + { + var entryId = Guid.NewGuid(); + var entry = new Entry() { Id = entryId, LexemeForm = new MultiString(){{"en", "lexeme"}}, Variants = [new Variant(){ VariantEntryId = Guid.NewGuid(), MainEntryId = Guid.Empty }] }; + _validator.TestValidate(entry).ShouldNotHaveAnyValidationErrors(); + } + private void SetProperty(Entry entry, string propName, string content) { var propInfo = typeof(Entry).GetProperty(propName); From 787934743c58d31027e5757302d5361a1cca4b7f Mon Sep 17 00:00:00 2001 From: Tim Haasdyk Date: Sat, 4 Jul 2026 17:03:23 +0200 Subject: [PATCH 12/21] Correct VARIANTS.md on type-rename propagation and Comment nullability Co-Authored-By: Claude Fable 5 --- backend/FwLite/VARIANTS.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/backend/FwLite/VARIANTS.md b/backend/FwLite/VARIANTS.md index e7953ba1ea..52b9e660ca 100644 --- a/backend/FwLite/VARIANTS.md +++ b/backend/FwLite/VARIANTS.md @@ -93,7 +93,7 @@ public record Variant : IObjectWithId string? MainHeadword; // derived cache List Types; // LexEntryRef.VariantEntryTypesRS bool HideMinorEntry; // LexEntryRef.HideMinorEntry != 0 (LCM polarity kept; UI shows "Show minor entry" inverted) - RichMultiString? Comment; // LexEntryRef.Summary (FLEx UI labels it "Comment") — check actual MultiString kind at impl time + RichMultiString Comment; // LexEntryRef.Summary (FLEx UI labels it "Comment") DateTimeOffset? DeletedAt; } ``` @@ -149,8 +149,11 @@ public record Variant : IObjectWithId 8. **Deleted `VariantType` cleanup**: `Variant.GetReferences()` includes its `Types` ids, and `RemoveReference` removes the type from the list (only endpoint ids soft-delete the link). Better than the complex-forms quirk where deleted types linger in `Entry.ComplexFormTypes`. - Like `Entry.ComplexFormTypes`, `Variant.Types` stores denormalized copies (jsonb), so a - type *rename* reaches already-linked variants on the next sync/read, not instantly. + Like `Entry.ComplexFormTypes`, `Variant.Types` stores denormalized copies (jsonb) that are + matched by id; a type *rename* updates only the canonical `VariantType` row (the embedded + `Name` copies go stale — the sync diff's `Replace` is deliberately a no-op, same as + `ComplexFormTypesDiffApi`). That never surfaces: the viewer and FwData writes resolve + names/refs via the canonical row, using the embedded copies only for their ids. 9. **Variant entries with no senses are first-class** and must be covered by tests both ways (headline behavioral difference; FLEx "Insert Variant" creates sense-less entries). 10. **A variant can target a sense** (`MainSenseId`); on the main side such links still From 6a18cb49a84d2f5786303fefd2d27e08a58b47ae Mon Sep 17 00:00:00 2001 From: Tim Haasdyk Date: Sat, 4 Jul 2026 18:17:35 +0200 Subject: [PATCH 13/21] Match liblcm variant/component semantics found in a deep review - Cycle checks now share one liblcm-faithful walk (ComponentGraph): sense-targeted links resolve to the owning entry without recursing (LexEntry.AllComponents), and AddEntryComponentChange walks the combined complex-form + variant graph like liblcm instead of complex forms only - Per-link edits split a shared (multi-component) variant ref before mutating so sibling links keep their own Types/HideMinorEntry/Comment - Variant reads skip non-entry/non-sense components instead of wedging the entry - HideMinorEntry only written when the bool view flips (LCM reserves a bitfield) Co-Authored-By: Claude Fable 5 --- .../MiniLcmTests/VariantTests.cs | 93 +++++++++++++++++++ .../Api/FwDataMiniLcmApi.cs | 43 +++++++-- .../Api/UpdateProxy/UpdateVariantProxy.cs | 8 +- .../Entries/AddEntryComponentChange.cs | 35 ++----- .../Changes/Entries/AddVariantChange.cs | 27 +----- .../LcmCrdt/Changes/Entries/ComponentGraph.cs | 49 ++++++++++ .../ComplexFormComponentTestsBase.cs | 16 ++++ .../FwLite/MiniLcm.Tests/VariantTestsBase.cs | 56 +++++++++++ backend/FwLite/MiniLcm/Models/Variant.cs | 12 ++- backend/FwLite/VARIANTS.md | 28 +++++- 10 files changed, 304 insertions(+), 63 deletions(-) create mode 100644 backend/FwLite/LcmCrdt/Changes/Entries/ComponentGraph.cs diff --git a/backend/FwLite/FwDataMiniLcmBridge.Tests/MiniLcmTests/VariantTests.cs b/backend/FwLite/FwDataMiniLcmBridge.Tests/MiniLcmTests/VariantTests.cs index 3800852488..e292a91f2f 100644 --- a/backend/FwLite/FwDataMiniLcmBridge.Tests/MiniLcmTests/VariantTests.cs +++ b/backend/FwLite/FwDataMiniLcmBridge.Tests/MiniLcmTests/VariantTests.cs @@ -130,3 +130,96 @@ await fwDataApi.Cache.DoUsingNewOrCurrentUOW("Add variant LexEntryRefs", }); } } + +/// +/// tests per-link edits when FLEx put multiple targets in ONE variant LexEntryRef: +/// Types/HideMinorEntry/Comment live on the ref, shared across all its targets +/// +[Collection(ProjectLoaderFixture.Name)] +public class VariantTestsSharedRef(ProjectLoaderFixture fixture) : MiniLcmTestBase +{ + private readonly Guid _variantEntryId = Guid.NewGuid(); + private readonly Guid _mainEntryId = Guid.NewGuid(); + private readonly Guid _otherMainEntryId = Guid.NewGuid(); + + protected override Task NewApi() + { + return Task.FromResult(fixture.NewProjectApi("variant-test-sharedRef", "en", "en")); + } + + public override async Task InitializeAsync() + { + await base.InitializeAsync(); + await Api.CreateEntry(new() + { + Id = _variantEntryId, + LexemeForm = { { "en", "variant form" } } + }); + await Api.CreateEntry(new() + { + Id = _mainEntryId, + LexemeForm = { { "en", "main entry" } } + }); + await Api.CreateEntry(new() + { + Id = _otherMainEntryId, + LexemeForm = { { "en", "other main" } } + }); + var fwDataApi = (FwDataMiniLcmApi)BaseApi; + var variantEntry = fwDataApi.EntriesRepository.GetObject(_variantEntryId); + await fwDataApi.Cache.DoUsingNewOrCurrentUOW("Add shared variant LexEntryRef", + "Remove shared variant LexEntryRef", + () => + { + var entryRef = fwDataApi.Cache.ServiceLocator.GetInstance().Create(); + variantEntry.EntryRefsOS.Add(entryRef); + entryRef.RefType = LexEntryRefTags.krtVariant; + entryRef.HideMinorEntry = 1; + entryRef.VariantEntryTypesRS.Add(fwDataApi.Cache.ServiceLocator + .GetInstance() + .GetObject(LexEntryTypeTags.kguidLexTypDialectalVar)); + entryRef.ComponentLexemesRS.Add(fwDataApi.EntriesRepository.GetObject(_mainEntryId)); + entryRef.ComponentLexemesRS.Add(fwDataApi.EntriesRepository.GetObject(_otherMainEntryId)); + return ValueTask.CompletedTask; + }); + } + + [Fact] + public async Task SharedRef_ReadsAsOneLinkPerTarget() + { + var entry = await Api.GetEntry(_variantEntryId); + entry!.VariantOf.Should().HaveCount(2); + entry.VariantOf.Should().OnlyContain(v => v.HideMinorEntry && v.Types.Count == 1); + } + + [Fact] + public async Task AddVariantType_OnASharedRefLink_DoesNotAffectTheSiblingLink() + { + var entry = await Api.GetEntry(_variantEntryId); + var link = entry!.VariantOf.Single(v => v.MainEntryId == _mainEntryId); + + await Api.AddVariantType(link, LexEntryTypeTags.kguidLexTypSpellingVar); + + entry = await Api.GetEntry(_variantEntryId); + var edited = entry!.VariantOf.Single(v => v.MainEntryId == _mainEntryId); + var sibling = entry.VariantOf.Single(v => v.MainEntryId == _otherMainEntryId); + edited.Types.Select(t => t.Id).Should() + .BeEquivalentTo([LexEntryTypeTags.kguidLexTypDialectalVar, LexEntryTypeTags.kguidLexTypSpellingVar]); + sibling.Types.Select(t => t.Id).Should().BeEquivalentTo([LexEntryTypeTags.kguidLexTypDialectalVar]); + sibling.HideMinorEntry.Should().BeTrue(); + } + + [Fact] + public async Task RemoveVariantType_OnASharedRefLink_DoesNotAffectTheSiblingLink() + { + var entry = await Api.GetEntry(_variantEntryId); + var link = entry!.VariantOf.Single(v => v.MainEntryId == _mainEntryId); + + await Api.RemoveVariantType(link, LexEntryTypeTags.kguidLexTypDialectalVar); + + entry = await Api.GetEntry(_variantEntryId); + entry!.VariantOf.Single(v => v.MainEntryId == _mainEntryId).Types.Should().BeEmpty(); + entry.VariantOf.Single(v => v.MainEntryId == _otherMainEntryId).Types + .Should().ContainSingle(t => t.Id == LexEntryTypeTags.kguidLexTypDialectalVar); + } +} diff --git a/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs b/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs index d808dc4d57..406ed24c58 100644 --- a/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs +++ b/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs @@ -787,13 +787,16 @@ private IEnumerable ToComplexFormComponents(ILexEntry entr private IEnumerable ToVariantOf(ILexEntry entry) { + //ComponentLexemesRS is only ICmObject; legacy/corrupt data may hold other types — + //skip them like liblcm's own back-ref reads do, or one bad ref wedges the whole entry return entry.VariantEntryRefs.SelectMany(r => r.ComponentLexemesRS, (r, o) => o switch { ILexEntry mainEntry => ToVariant(entry, r, mainEntry, null), ILexSense mainSense => ToVariant(entry, r, mainSense.Entry, mainSense), - _ => throw new NotSupportedException($"object type {o.ClassName} not supported") + _ => null }) + .OfType() .DistinctBy(v => (v.VariantEntryId, v.MainEntryId, v.MainSenseId)) .Order(Variant.VariantOfOrder); } @@ -1406,13 +1409,13 @@ public async Task UpdateVariant(Variant before, Variant after, IMiniLcm public Task SubmitUpdateVariant(Variant variant, UpdateObjectInput update) { var lexVariantEntry = EntriesRepository.GetObject(variant.VariantEntryId); - var entryRef = FindVariantRef(lexVariantEntry, variant) - ?? throw NotFoundException.ForType(variant.VariantEntryId); UndoableUnitOfWorkHelper.DoUsingNewOrCurrentUOW("Update Variant", "Revert Variant", Cache.ServiceLocator.ActionHandler, () => { + var entryRef = FindVariantRefForUpdate(lexVariantEntry, variant) + ?? throw NotFoundException.ForType(variant.VariantEntryId); var updateProxy = new UpdateVariantProxy(entryRef, this); update.Apply(updateProxy); }); @@ -1444,7 +1447,7 @@ public Task AddVariantType(Variant variant, Guid variantTypeId) { //link (or its entry) deleted already — match CRDT tolerance if (!EntriesRepository.TryGetObject(variant.VariantEntryId, out var lexVariantEntry)) return; - var entryRef = FindVariantRef(lexVariantEntry, variant); + var entryRef = FindVariantRefForUpdate(lexVariantEntry, variant); if (entryRef is null) return; var lexEntryType = VariantTypesFlattened.Single(t => t.Guid == variantTypeId); if (entryRef.VariantEntryTypesRS.Contains(lexEntryType)) return; @@ -1461,7 +1464,7 @@ public Task RemoveVariantType(Variant variant, Guid variantTypeId) () => { if (!EntriesRepository.TryGetObject(variant.VariantEntryId, out var lexVariantEntry)) return; - var entryRef = FindVariantRef(lexVariantEntry, variant); + var entryRef = FindVariantRefForUpdate(lexVariantEntry, variant); if (entryRef is null) return; var lexEntryType = entryRef.VariantEntryTypesRS.SingleOrDefault(t => t.Guid == variantTypeId); if (lexEntryType is null) return; @@ -1537,8 +1540,36 @@ internal void RemoveVariant(ILexEntry lexVariantEntry, Variant variant) internal ILexEntryRef? FindVariantRef(ILexEntry lexVariantEntry, Variant variant) { + //prefer a dedicated ref over a shared (multi-component) one, like FLEx's FindMatchingVariantEntryRef return lexVariantEntry.VariantEntryRefs - .FirstOrDefault(r => r.ComponentLexemesRS.Any(o => MatchesVariantTarget(o, variant))); + .Where(r => r.ComponentLexemesRS.Any(o => MatchesVariantTarget(o, variant))) + .OrderBy(r => r.ComponentLexemesRS.Count == 1 ? 0 : 1) + .FirstOrDefault(); + } + + /// + /// must be called as part of an lcm action. Returns the ref that exclusively represents + /// this link, first splitting the target out of a shared (multi-component) ref: per-link + /// fields (Types, HideMinorEntry, Summary) live on the ref, so mutating a shared one + /// would silently edit the sibling links too. + /// + internal ILexEntryRef? FindVariantRefForUpdate(ILexEntry lexVariantEntry, Variant variant) + { + var entryRef = FindVariantRef(lexVariantEntry, variant); + if (entryRef is null || entryRef.ComponentLexemesRS.Count == 1) return entryRef; + var target = entryRef.ComponentLexemesRS.First(o => MatchesVariantTarget(o, variant)); + var newRef = Cache.ServiceLocator.GetInstance().Create(); + lexVariantEntry.EntryRefsOS.Insert(lexVariantEntry.EntryRefsOS.IndexOf(entryRef) + 1, newRef); + newRef.RefType = LexEntryRefTags.krtVariant; + newRef.HideMinorEntry = entryRef.HideMinorEntry; + newRef.Summary.CopyAlternatives(entryRef.Summary); + foreach (var type in entryRef.VariantEntryTypesRS) + { + newRef.VariantEntryTypesRS.Add(type); + } + entryRef.ComponentLexemesRS.Remove(target); + newRef.ComponentLexemesRS.Add(target); + return newRef; } //match the full composite key: a sense target only counts while the sense still belongs diff --git a/backend/FwLite/FwDataMiniLcmBridge/Api/UpdateProxy/UpdateVariantProxy.cs b/backend/FwLite/FwDataMiniLcmBridge/Api/UpdateProxy/UpdateVariantProxy.cs index e19e327cdd..e296bd56b2 100644 --- a/backend/FwLite/FwDataMiniLcmBridge/Api/UpdateProxy/UpdateVariantProxy.cs +++ b/backend/FwLite/FwDataMiniLcmBridge/Api/UpdateProxy/UpdateVariantProxy.cs @@ -48,7 +48,13 @@ public override List Types public override bool HideMinorEntry { get => _lexEntryRef.HideMinorEntry != 0; - set => _lexEntryRef.HideMinorEntry = value ? 1 : 0; + //LCM reserves the int as a per-publication bitfield; only write when our bool view + //actually flips so a multi-bit value isn't collapsed to 1 + set + { + if (_lexEntryRef.HideMinorEntry != 0 != value) + _lexEntryRef.HideMinorEntry = value ? 1 : 0; + } } public override RichMultiString Comment diff --git a/backend/FwLite/LcmCrdt/Changes/Entries/AddEntryComponentChange.cs b/backend/FwLite/LcmCrdt/Changes/Entries/AddEntryComponentChange.cs index 4c29b8060c..a7ab787dc9 100644 --- a/backend/FwLite/LcmCrdt/Changes/Entries/AddEntryComponentChange.cs +++ b/backend/FwLite/LcmCrdt/Changes/Entries/AddEntryComponentChange.cs @@ -68,32 +68,17 @@ public override async ValueTask NewEntity(Commit commit, I private static async ValueTask CreatesReferenceCycleOrDuplicate(ComplexFormComponent parent, IChangeContext context) { if (parent.ComplexFormEntryId == parent.ComponentEntryId) return true; - //used to avoid checking the same ComplexFormComponent multiple times - HashSet visited = [parent.Id]; - Queue queue = new Queue(); - queue.Enqueue(parent); - while (queue.Count > 0) + await foreach (var o in context.GetObjectsReferencing(parent.ComplexFormEntryId)) { - var current = queue.Dequeue(); - if (current.ComplexFormEntryId == parent.ComponentEntryId) return true; - await foreach (var o in context.GetObjectsReferencing(current.ComplexFormEntryId)) - { - if (o is not ComplexFormComponent cfc) continue; - if (cfc.DeletedAt is not null) continue; - if (visited.Contains(cfc.Id)) continue; - if (current == parent) - { - var duplicate = cfc.ComplexFormEntryId == parent.ComplexFormEntryId && - cfc.ComponentEntryId == parent.ComponentEntryId && - cfc.ComponentSenseId == parent.ComponentSenseId; - if (duplicate) return true; - } - - if (cfc.ComplexFormEntryId == parent.ComponentEntryId) return true; - queue.Enqueue(cfc); - visited.Add(cfc.Id); - } + if (o is not ComplexFormComponent cfc) continue; + if (cfc.DeletedAt is not null) continue; + if (cfc.Id == parent.Id) continue; + var duplicate = cfc.ComplexFormEntryId == parent.ComplexFormEntryId && + cfc.ComponentEntryId == parent.ComponentEntryId && + cfc.ComponentSenseId == parent.ComponentSenseId; + if (duplicate) return true; } - return false; + + return await ComponentGraph.CanReach(parent.ComponentEntryId, parent.ComplexFormEntryId, context); } } diff --git a/backend/FwLite/LcmCrdt/Changes/Entries/AddVariantChange.cs b/backend/FwLite/LcmCrdt/Changes/Entries/AddVariantChange.cs index d3c283d28f..e381203256 100644 --- a/backend/FwLite/LcmCrdt/Changes/Entries/AddVariantChange.cs +++ b/backend/FwLite/LcmCrdt/Changes/Entries/AddVariantChange.cs @@ -95,31 +95,6 @@ private static async ValueTask CreatesReferenceCycleOrDuplicate(Variant pa if (duplicate) return true; } - //LCM enforces acyclicity over the COMBINED complex-form + variant component graph - //(LexEntryRef.ValidateAddObjectInternal → LexEntry.AllComponents), so mirror that: - //walk everything the main entry depends on through both link types; if the variant - //entry is reachable, this link would close a cycle FLEx rejects - HashSet visited = []; - Queue queue = new(); - queue.Enqueue(parent.MainEntryId); - while (queue.Count > 0) - { - var entryId = queue.Dequeue(); - if (entryId == parent.VariantEntryId) return true; - if (!visited.Add(entryId)) continue; - await foreach (var o in context.GetObjectsReferencing(entryId)) - { - switch (o) - { - case Variant v when v.DeletedAt is null && v.VariantEntryId == entryId: - queue.Enqueue(v.MainEntryId); - break; - case ComplexFormComponent cfc when cfc.DeletedAt is null && cfc.ComplexFormEntryId == entryId: - queue.Enqueue(cfc.ComponentEntryId); - break; - } - } - } - return false; + return await ComponentGraph.CanReach(parent.MainEntryId, parent.VariantEntryId, context); } } diff --git a/backend/FwLite/LcmCrdt/Changes/Entries/ComponentGraph.cs b/backend/FwLite/LcmCrdt/Changes/Entries/ComponentGraph.cs new file mode 100644 index 0000000000..368b3daa66 --- /dev/null +++ b/backend/FwLite/LcmCrdt/Changes/Entries/ComponentGraph.cs @@ -0,0 +1,49 @@ +using SIL.Harmony.Changes; +using SIL.Harmony.Core; + +namespace LcmCrdt.Changes.Entries; + +internal static class ComponentGraph +{ + /// + /// Mirrors LCM's acyclicity rule (LexEntryRef.ValidateAddObjectInternal → LexEntry.AllComponents): + /// walk everything depends on through BOTH link types + /// (variant → main, complex form → component); a proposed link is a cycle FLEx rejects + /// iff is reachable. AllComponents resolves a + /// sense-targeted component to its owning entry but does NOT recurse into it, so + /// sense-targeted links are compared against the target without being walked past. + /// + public static async ValueTask CanReach(Guid fromEntryId, Guid forbiddenEntryId, IChangeContext context) + { + HashSet visited = []; + Queue queue = new(); + if (fromEntryId == forbiddenEntryId) return true; + queue.Enqueue(fromEntryId); + while (queue.Count > 0) + { + var entryId = queue.Dequeue(); + if (!visited.Add(entryId)) continue; + await foreach (var o in context.GetObjectsReferencing(entryId)) + { + Guid targetEntryId; + bool targetIsSense; + switch (o) + { + case Variant v when v.DeletedAt is null && v.VariantEntryId == entryId: + targetEntryId = v.MainEntryId; + targetIsSense = v.MainSenseId is not null; + break; + case ComplexFormComponent cfc when cfc.DeletedAt is null && cfc.ComplexFormEntryId == entryId: + targetEntryId = cfc.ComponentEntryId; + targetIsSense = cfc.ComponentSenseId is not null; + break; + default: + continue; + } + if (targetEntryId == forbiddenEntryId) return true; + if (!targetIsSense) queue.Enqueue(targetEntryId); + } + } + return false; + } +} diff --git a/backend/FwLite/MiniLcm.Tests/ComplexFormComponentTestsBase.cs b/backend/FwLite/MiniLcm.Tests/ComplexFormComponentTestsBase.cs index 1357a91aaa..bff25f9067 100644 --- a/backend/FwLite/MiniLcm.Tests/ComplexFormComponentTestsBase.cs +++ b/backend/FwLite/MiniLcm.Tests/ComplexFormComponentTestsBase.cs @@ -277,6 +277,22 @@ public async Task CreateComplexFormComponent_ThrowsWhenMakingA3LayerReferenceCyc await act.Should().ThrowAsync(); } + [Fact] + public async Task CreateComplexFormComponent_AllowsClosingALoopThroughASenseTargetedComponent() + { + // LCM's AllComponents resolves a sense-targeted component to its owning entry but does + // NOT recurse into it, so this graph is legal in FLEx and must stay legal here + var entry3 = await Api.CreateEntry(new() + { + Id = Guid.NewGuid(), + LexemeForm = { { "en", "entry3" } } + }); + await Api.CreateComplexFormComponent(ComplexFormComponent.FromEntries(_complexFormEntry, _componentEntry, _componentSenseId1)); + await Api.CreateComplexFormComponent(ComplexFormComponent.FromEntries(_componentEntry, entry3)); + var act = async () => await Api.CreateComplexFormComponent(ComplexFormComponent.FromEntries(entry3, _complexFormEntry)); + await act.Should().NotThrowAsync(); + } + [Fact] public async Task CreateComplexFormComponent_WorksWhenAComponentWasDeletedWhichWouldCauseACycle() { diff --git a/backend/FwLite/MiniLcm.Tests/VariantTestsBase.cs b/backend/FwLite/MiniLcm.Tests/VariantTestsBase.cs index 11aa7141ec..55e53e7874 100644 --- a/backend/FwLite/MiniLcm.Tests/VariantTestsBase.cs +++ b/backend/FwLite/MiniLcm.Tests/VariantTestsBase.cs @@ -282,6 +282,62 @@ public async Task CreateVariant_ThrowsWhenClosingAMixedCycleThroughAComplexForm( await act.Should().ThrowAsync(); } + [Fact] + public async Task CreateVariant_AllowsClosingALoopThroughASenseTargetedLink() + { + // LCM's AllComponents resolves a sense-targeted component to its owning entry but does + // NOT recurse into it, so this graph is legal in FLEx and must stay legal here + var entry3 = await Api.CreateEntry(new() + { + Id = Guid.NewGuid(), + LexemeForm = { { "en", "entry3" } } + }); + await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry, _mainSenseId1)); + await Api.CreateVariant(Variant.FromEntries(_mainEntry, entry3)); + var act = async () => await Api.CreateVariant(Variant.FromEntries(entry3, _variantEntry)); + await act.Should().NotThrowAsync(); + var entry = await Api.GetEntry(_variantEntryId); + entry!.Variants.Should().ContainSingle(v => v.VariantEntryId == entry3.Id); + } + + [Fact] + public async Task CreateVariant_ThrowsWhenMakingA2LayerCycleThroughASenseTargetedLink() + { + // no recursion past a sense-targeted link, but its owning entry still counts directly + await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry, _mainSenseId1)); + var act = async () => await Api.CreateVariant(Variant.FromEntries(_mainEntry, _variantEntry)); + await act.Should().ThrowAsync(); + } + + [Fact] + public async Task CreateVariant_ThrowsWhenTargetingASenseOfADependentEntry() + { + // targeting a sense doesn't exempt the first hop: LCM resolves the added sense to its + // owning entry and walks that entry's full component closure + var entry3 = await Api.CreateEntry(new() + { + Id = Guid.NewGuid(), + LexemeForm = { { "en", "entry3" } } + }); + await Api.CreateVariant(Variant.FromEntries(_mainEntry, entry3)); + var act = async () => await Api.CreateVariant(Variant.FromEntries(entry3, _mainEntry, _mainSenseId1)); + await act.Should().ThrowAsync(); + } + + [Fact] + public async Task CreateComplexFormComponent_ThrowsWhenClosingAMixedCycleThroughAVariant() + { + var entry3 = await Api.CreateEntry(new() + { + Id = Guid.NewGuid(), + LexemeForm = { { "en", "entry3" } } + }); + await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry)); + await Api.CreateComplexFormComponent(ComplexFormComponent.FromEntries(_mainEntry, entry3)); + var act = async () => await Api.CreateComplexFormComponent(ComplexFormComponent.FromEntries(entry3, _variantEntry)); + await act.Should().ThrowAsync(); + } + [Fact] public async Task CreateVariant_WorksWhenALinkWasDeletedWhichWouldCauseACycle() { diff --git a/backend/FwLite/MiniLcm/Models/Variant.cs b/backend/FwLite/MiniLcm/Models/Variant.cs index d21854bb34..b37e520a66 100644 --- a/backend/FwLite/MiniLcm/Models/Variant.cs +++ b/backend/FwLite/MiniLcm/Models/Variant.cs @@ -5,10 +5,14 @@ namespace MiniLcm.Models; /// /// One variant relationship: a variant (minor) entry pointing at the main entry (or sense) -/// it is a variant of. Maps 1:1 to a FieldWorks LexEntryRef with RefType = Variant, so the -/// per-relationship fields (Types, HideMinorEntry, Comment) live here rather than on the -/// entry. Unlike there is no Order — variant lists have -/// no user-meaningful order in FieldWorks. +/// it is a variant of. Identified by the composite key (VariantEntryId, MainEntryId, +/// MainSenseId) — one link per (FieldWorks LexEntryRef with RefType = Variant, target) pair, +/// so the per-relationship fields (Types, HideMinorEntry, Comment) live here rather than on +/// the entry. FLEx can also share one ref between several targets (fields shared) or hold +/// duplicate refs for one target; both shapes collapse to this composite-key model on read, +/// and per-link edits split a shared ref first (see FwDataMiniLcmApi.FindVariantRefForUpdate). +/// Unlike there is no Order — variant lists have no +/// user-meaningful order in FieldWorks. /// public record Variant : IObjectWithId { diff --git a/backend/FwLite/VARIANTS.md b/backend/FwLite/VARIANTS.md index 52b9e660ca..d71021e0b5 100644 --- a/backend/FwLite/VARIANTS.md +++ b/backend/FwLite/VARIANTS.md @@ -145,7 +145,15 @@ public record Variant : IObjectWithId The duplicate/cycle guard lives in `AddVariantChange` (soft-delete, sync-tolerant); self-reference is additionally rejected by `VariantValidator` in the validation wrapper (consistent across both implementations). Chains (a variant of a variant) remain legal, - as in FLEx. + as in FLEx. Two liblcm subtleties both change classes mirror exactly (shared walk in + `ComponentGraph`): `AllComponents` resolves a **sense-targeted** component to its owning + entry but does **not recurse** into it (so some loops through sense targets are legal in + FLEx and must stay legal here), while the *added* component's entry is always walked in + full. `AddEntryComponentChange` was aligned to the same combined walk — its old + complex-form-only walk accepted mixed cycles that liblcm rejects at sync time (a wedge), + and recursed past sense targets (over-rejecting vs FLEx). That loosening only affects + the rare pre-existing sense-cycle shape; pre-variants data is otherwise unaffected + (no `Variant` rows to walk). 8. **Deleted `VariantType` cleanup**: `Variant.GetReferences()` includes its `Types` ids, and `RemoveReference` removes the type from the list (only endpoint ids soft-delete the link). Better than the complex-forms quirk where deleted types linger in `Entry.ComplexFormTypes`. @@ -161,6 +169,24 @@ public record Variant : IObjectWithId 11. **Minor-entry visibility in FWL UI** (step 3): users must be able to see at a glance that an entry is a variant, not a first-class entry (badge / "Variant of X" in the editor; list styling is a follow-up). +12. **FLEx ref shapes that don't fit the composite-key model** (one link per + (VariantEntryId, MainEntryId, MainSenseId)): + - *Shared refs* — one `LexEntryRef` with several targets shares Types/HideMinorEntry/ + Comment across them. Reads fan the ref out into one `Variant` per target; per-link + **edits split the target out into its own single-component ref first** + (`FindVariantRefForUpdate`, copying the shared fields) so the sibling links are never + silently edited. FLEx's own `FindMatchingVariantEntryRef` likewise refuses to reuse + multi-component refs. + - *Duplicate refs* — two refs from the same variant entry to the same target collapse to + one link on read (`DistinctBy` composite key); the extra ref stays in FwData untouched + (never entering the snapshot, it never diffs) and `DeleteVariant` removes the target + from all of them. + - `HideMinorEntry` is an LCM **int reserved as a per-publication bitfield**; we model the + current 0/non-0 semantics as a bool and only write when the bool flips, so a future + multi-bit value isn't collapsed to 1. + - Deleting *Irregularly Inflected Form* cascades to its owned children (Plural/Past) in + FwData but not in the flat CRDT type list; the next `VariantTypeSync` reconciles + (direction-dependent), so it self-heals without touching entry data. ### FwData bridge mapping From ebeb3842612978e34534cefaf17240bfc5878d14 Mon Sep 17 00:00:00 2001 From: Tim Haasdyk Date: Sat, 4 Jul 2026 20:01:48 +0200 Subject: [PATCH 14/21] Harden variant tests: LCM-oracle differential check, HideMinorEntry bitfield Mutation-tested the new cycle/shared-ref guards (3/3 mutants killed); the surviving would-be mutant exposed the missing HideMinorEntry bitfield test. Also docs: fleet-skew rollout note for AddEntryComponentChange, badge and type-seeding follow-ups, SubmitUpdateVariant asymmetry rationale. Co-Authored-By: Claude Fable 5 --- .../MiniLcmTests/VariantTests.cs | 24 ++++++ .../FwLite/MiniLcm.Tests/VariantTestsBase.cs | 76 +++++++++++++++++++ backend/FwLite/MiniLcm/IMiniLcmWriteApi.cs | 4 +- backend/FwLite/VARIANTS.md | 25 ++++-- 4 files changed, 123 insertions(+), 6 deletions(-) diff --git a/backend/FwLite/FwDataMiniLcmBridge.Tests/MiniLcmTests/VariantTests.cs b/backend/FwLite/FwDataMiniLcmBridge.Tests/MiniLcmTests/VariantTests.cs index e292a91f2f..c036e67bab 100644 --- a/backend/FwLite/FwDataMiniLcmBridge.Tests/MiniLcmTests/VariantTests.cs +++ b/backend/FwLite/FwDataMiniLcmBridge.Tests/MiniLcmTests/VariantTests.cs @@ -34,6 +34,30 @@ public async Task CreateVariantType_LandsAsATopLevelPossibility() fwDataApi.Cache.LangProject.LexDbOA.VariantEntryTypesOA.PossibilitiesOS .Should().Contain(p => p.Guid == created.Id); } + + [Fact] + public async Task UpdateVariant_PreservesAMultiBitHideMinorEntry() + { + // LCM reserves HideMinorEntry as a per-publication bitfield; a bool-level no-op + // write must not collapse a multi-bit value to 1 + var created = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with { HideMinorEntry = true }); + var fwDataApi = (FwDataMiniLcmApi)BaseApi; + var variantEntry = fwDataApi.EntriesRepository.GetObject(_variantEntryId); + await fwDataApi.Cache.DoUsingNewOrCurrentUOW("Set HideMinorEntry bits", + "Unset HideMinorEntry bits", + () => + { + variantEntry.VariantEntryRefs.Single().HideMinorEntry = 2; + return ValueTask.CompletedTask; + }); + + // before deliberately disagrees so the diff emits a HideMinorEntry patch op + await Api.UpdateVariant(created with { HideMinorEntry = false }, created with { HideMinorEntry = true }); + + variantEntry.VariantEntryRefs.Single().HideMinorEntry.Should().Be(2); + var entry = await Api.GetEntry(_variantEntryId); + entry!.VariantOf.Single().HideMinorEntry.Should().BeTrue(); + } } /// diff --git a/backend/FwLite/MiniLcm.Tests/VariantTestsBase.cs b/backend/FwLite/MiniLcm.Tests/VariantTestsBase.cs index 55e53e7874..c38215e9fb 100644 --- a/backend/FwLite/MiniLcm.Tests/VariantTestsBase.cs +++ b/backend/FwLite/MiniLcm.Tests/VariantTestsBase.cs @@ -338,6 +338,82 @@ public async Task CreateComplexFormComponent_ThrowsWhenClosingAMixedCycleThrough await act.Should().ThrowAsync(); } + [Fact] + public async Task CreateLinks_MatchTheLcmCycleRuleOnRandomGraphs() + { + // differential check against a direct port of LCM's oracle (LexEntry.AllComponents): + // random variant/complex-form link-adds must be accepted/rejected exactly as LCM + // would, on both implementations. Fixed seed keeps it deterministic. + var random = new Random(20260704); + const int entryCount = 6; + var entries = new List(); + var senseIds = new Dictionary(); + for (var i = 0; i < entryCount; i++) + { + var senseId = Guid.NewGuid(); + var entry = await Api.CreateEntry(new() + { + Id = Guid.NewGuid(), + LexemeForm = { { "en", $"graph entry {i}" } }, + Senses = [new Sense { Id = senseId, Gloss = { { "en", $"graph sense {i}" } } }] + }); + entries.Add(entry); + senseIds[entry.Id] = senseId; + } + + var links = new List<(Guid Owner, Guid TargetEntry, bool TargetIsSense)>(); + var attempted = new HashSet<(bool AsVariant, Guid Owner, Guid Target, Guid? Sense)>(); + int accepted = 0, rejected = 0; + for (var attempt = 0; attempt < 40; attempt++) + { + var owner = entries[random.Next(entryCount)]; + var target = entries[random.Next(entryCount)]; + var asVariant = random.Next(2) == 0; + Guid? targetSenseId = random.Next(3) == 0 ? senseIds[target.Id] : null; + //duplicate links have their own (non-cycle) rules; keep this test about cycles + if (!attempted.Add((asVariant, owner.Id, target.Id, targetSenseId))) continue; + + var act = asVariant + ? () => Api.CreateVariant(Variant.FromEntries(owner, target, targetSenseId)) + : (Func)(() => Api.CreateComplexFormComponent(ComplexFormComponent.FromEntries(owner, target, targetSenseId))); + if (OracleRejects(owner.Id, target.Id)) + { + await act.Should().ThrowAsync($"LCM rejects link {attempt} ({owner.Id} -> {target.Id}, sense: {targetSenseId is not null})"); + rejected++; + } + else + { + await act.Should().NotThrowAsync($"LCM accepts link {attempt} ({owner.Id} -> {target.Id}, sense: {targetSenseId is not null})"); + links.Add((owner.Id, target.Id, targetSenseId is not null)); + accepted++; + } + } + //seed sanity: both branches must genuinely be exercised + accepted.Should().BeGreaterThan(5); + rejected.Should().BeGreaterThan(5); + + bool OracleRejects(Guid ownerId, Guid targetEntryId) + { + //LexEntryRef.ValidateAddObjectInternal: reject iff owner ∈ AllComponents(target). + //AllComponents yields the entry itself, recurses into entry-targeted links, and + //yields (without recursing into) the owning entry of sense-targeted links + var all = new HashSet(); + var stack = new Stack(); + stack.Push(targetEntryId); + while (stack.Count > 0) + { + var current = stack.Pop(); + if (!all.Add(current)) continue; + foreach (var link in links.Where(l => l.Owner == current)) + { + if (link.TargetIsSense) all.Add(link.TargetEntry); + else stack.Push(link.TargetEntry); + } + } + return all.Contains(ownerId); + } + } + [Fact] public async Task CreateVariant_WorksWhenALinkWasDeletedWhichWouldCauseACycle() { diff --git a/backend/FwLite/MiniLcm/IMiniLcmWriteApi.cs b/backend/FwLite/MiniLcm/IMiniLcmWriteApi.cs index 8cecfdcca5..772009635a 100644 --- a/backend/FwLite/MiniLcm/IMiniLcmWriteApi.cs +++ b/backend/FwLite/MiniLcm/IMiniLcmWriteApi.cs @@ -163,7 +163,9 @@ Task UpdatePicture(Guid entryId, Task SubmitCreateVariant(Variant variant) => CreateVariant(variant); /// /// Patches a variant link's own fields (HideMinorEntry, Comment) — the link is located by - /// its composite key, not its Id, since FwData links have no stable Id. + /// its composite key, not its Id, since FwData links have no stable Id. Abstract (unlike + /// its Submit* siblings) because there is no id-based UpdateVariant(id, patch) twin to + /// forward to; the patch path only exists for sync. /// Task SubmitUpdateVariant(Variant variant, UpdateObjectInput update); Task SubmitCreateSense(Guid entryId, Sense sense, BetweenPosition? position = null) => CreateSense(entryId, sense, position); diff --git a/backend/FwLite/VARIANTS.md b/backend/FwLite/VARIANTS.md index d71021e0b5..a0a0504291 100644 --- a/backend/FwLite/VARIANTS.md +++ b/backend/FwLite/VARIANTS.md @@ -290,6 +290,17 @@ Fanout sites that must stay in lockstep: auto-update closes the window. No extra gating exists or is added (precedent). - FwHeadless consumes the same sync libraries; it must be deployed with/before a client release that writes variant changes. +- **`AddEntryComponentChange` replay semantics changed** (decision 7): this affects every + project with complex forms, not just variant users, on ANY deploy of this code. During + version skew, a historical add shaped like a sense-targeted cycle projects as soft-deleted + on old clients and live on new ones; the shape is rare (the old guard had to have rejected + it, so the link was never visible) and auto-update converges the fleet, same as the + new-change-type story above. +- **Pre-existing FwLite-only (CRDT-only) projects have no variant types**: the 7 standard + types are seeded via the blank-project template (new projects) or FwData sync (FLEx-backed + projects) only. On older CRDT-only projects the viewer's type submenu hides itself and new + links are created untyped — usable but diverging from the FLEx "Unspecified Variant" + default. A one-time seeding path for existing projects is a follow-up. ### Test plan @@ -328,10 +339,11 @@ Mirror the *named* complex-forms cases (test-auditor sweep), not just categories decide `show` defaults: mirror complexForms=true; variant-type picker inside the link rows), `VariantOf.svelte`/`Variants.svelte` (reuse `EntryOrSensePicker` + `EntryOrSenseItemList`, **both non-orderable**, `pt()` dual labels for FW-Classic view, - disable self/duplicates but allow cross-type overlap with components), variant badge for - minor entries (decision 11), demo data seeded with a variant pair + real (not stub) - `InMemoryDemoApi` support for the paths the UI uses, i18n extraction **with context - comments**, Playwright test. + disable self/duplicates but allow cross-type overlap with components), demo data seeded + with a variant pair + real (not stub) `InMemoryDemoApi` support for the paths the UI + uses, i18n extraction **with context comments**, Playwright test. The variant *badge* + for minor entries (decision 11) did NOT ship in this step — see follow-ups; in-editor + visibility is currently the always-shown "Variant of" field. ## Open questions / follow-ups (not blockers) @@ -339,7 +351,10 @@ Mirror the *named* complex-forms cases (test-auditor sweep), not just categories "variant of X" there is a follow-up. - `LexEntryInflType` extras (GlossPrepend/Append, InflFeats, Slots), type hierarchy round-trip — future work. -- Entry-list styling of minor entries (beyond the editor badge) — follow-up. +- Minor-entry badge in the editor (decision 11) and entry-list styling of minor entries — + follow-up; today only the "Variant of" field signals variant status. +- Seed the 7 standard variant types into pre-existing CRDT-only projects (see rollout + notes) — follow-up. - FLEx "Insert Variant" convenience (create variant entry + link in one step) in the new-entry dialog — follow-up UX; v1 links existing entries. - `HideMinorEntry` is modeled as bool; LCM docs hint the int may become per-publication bit From 7d44dd49dc76f4dd28284e021ccc6d9f712805c4 Mon Sep 17 00:00:00 2001 From: Tim Haasdyk Date: Sat, 4 Jul 2026 20:21:37 +0200 Subject: [PATCH 15/21] Bring VARIANTS.md status and review log up to date for handoff Co-Authored-By: Claude Fable 5 --- backend/FwLite/VARIANTS.md | 52 +++++++++++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 4 deletions(-) diff --git a/backend/FwLite/VARIANTS.md b/backend/FwLite/VARIANTS.md index a0a0504291..ff1c802719 100644 --- a/backend/FwLite/VARIANTS.md +++ b/backend/FwLite/VARIANTS.md @@ -12,10 +12,46 @@ dev/agent can pick up the work mid-stream. Update the **Status** section as step FwLiteProjectSync.Tests incl. Sena3 live db regen; the WS-font failure on Windows is the known local-only false-fail) - [x] Step 3 — Viewer UI (fields, per-link type menu, demo seed, i18n, Playwright green) -- [x] Review (8-agent pass; fixes: sense-move composite-key lookup in the FwData bridge, - type-toggle re-render, hub read parity) + draft PRs: - backend [#2408](https://github.com/sillsdev/languageforge-lexbox/pull/2408), - UI [#2409](https://github.com/sillsdev/languageforge-lexbox/pull/2409) (stacked) +- [x] Review iterations — see "Review & verification log" below; ALL automated review is + done and green +- [ ] **Next: human review of [#2410](https://github.com/sillsdev/languageforge-lexbox/pull/2410)** + (the only open PR; pay special attention to commit `0d03aed28` — it changes shipped + `AddEntryComponentChange` replay semantics, see decision 7 + rollout notes), then Tim's + merge sequence: reopen [#2408](https://github.com/sillsdev/languageforge-lexbox/pull/2408) + and merge the steps one by one. + +## Review & verification log + +The user-mandated workflow was: per step, polish → open a non-draft PR (so CodeRabbit +reviews) → handle all CodeRabbit feedback → make Devin + CI green → close the PR +(NOT merged) → next iteration opens a cumulative PR. PR closures are workflow, not +abandonment. + +- **Iteration 1 — backend, [#2408](https://github.com/sillsdev/languageforge-lexbox/pull/2408) + (now closed on purpose)**: /polish agent suite; CodeRabbit round (2 accepted: sense-ownership + guard on variant create + `NotBeEmptyVariantEntryReference`; 3 rejected with posted replies); + Devin clean; CI 27/27 at `55d4485cd`. [#2409](https://github.com/sillsdev/languageforge-lexbox/pull/2409) + (stacked UI draft) closed as superseded. +- **Iteration 2 — cumulative backend+UI, [#2410](https://github.com/sillsdev/languageforge-lexbox/pull/2410) + (OPEN, base develop)**: scoped /polish clean; CodeRabbit round (doc fixes accepted, picker + cycle-guard suggestion rejected as complex-form-picker precedent); Devin clean ×3; CI green. +- **liblcm deep review (4 parallel agents, every claim cited against `D:\code\liblcm` + source)** → commit `0d03aed28`, the highest-risk commit in the stack. Found and fixed: + (a) CRDT rejected sense-targeted variant graphs FLEx accepts → sync would delete legal + links (decision 7's `AllComponents` no-recurse rule); (b) `AddEntryComponentChange` missed + mixed cycles liblcm rejects → mid-sync wedge; (c) per-link edits on FLEx shared + multi-target refs silently edited sibling links → split-before-mutate; plus read + hardening + `HideMinorEntry` bitfield guard. +- **Merge-hardening (`aff08b562`)**: targeted mutation testing (3/3 mutants killed; the + surviving would-be mutant exposed the missing `HideMinorEntry` bitfield test, now added); + `CreateLinks_MatchTheLcmCycleRuleOnRandomGraphs` — a seeded random-graph differential test + in `VariantTestsBase` asserting both implementations accept/reject exactly per an inline + port of LCM's `AllComponents` oracle (the FwData side runs real liblcm, so this is + empirical conformance, not source-reading); maintainer-simulation review → truthful PR + framing, rollout-note completeness, this log. +- **Verification commands used** (all green at `aff08b562`): FwData + CRDT variant/component + suites filtered, `FwLiteProjectSync.Tests --filter Sena3` (16/16), viewer + check/lint/vitest/Playwright. **Boundary change vs the original plan**: steps 1 and 2 merged — the moment the FwData bridge reads variants, importing a variant-containing project crashes unless variant types @@ -324,6 +360,14 @@ Mirror the *named* complex-forms cases (test-auditor sweep), not just categories legacy-snapshot upgrade; flattened-type read + create-missing-type-lands-top-level (FwData bridge); Sena3 + verified files regen. - Playwright (step 3): add/remove a variant link + type via the demo project. +- Hardening additions (post-review, all in the shared bases unless noted): sense-targeted + cycle trio (loop-through-sense-link allowed / 2-layer sense cycle rejected / sense-of-a- + dependent-entry rejected); mixed cycle closed by a complex-form add rejected + (`VariantTestsBase`) and its pure-CFC sense-loop mirror (`ComplexFormComponentTestsBase`); + `VariantTestsSharedRef` (FwData-only: real 2-component ref — reads fan out, per-link type + edits split instead of touching the sibling); `UpdateVariant_PreservesAMultiBitHideMinorEntry` + (FwData-only); `CreateLinks_MatchTheLcmCycleRuleOnRandomGraphs` (seeded differential test + against the LCM `AllComponents` oracle, both implementations). ## Stacked PR plan From b2921561fae72088cec0d083257f36cd7c64ebff Mon Sep 17 00:00:00 2001 From: Tim Haasdyk Date: Mon, 6 Jul 2026 10:15:28 +0200 Subject: [PATCH 16/21] Review fixes: variant Submit validation gaps, patch guards, naming - BeaKona forwarders bypassed validation on SubmitCreateVariant and SubmitUpdateVariant; both now validate (same class of gap as #2362) - New VariantUpdateValidator rejects patches to Types (incl. by index, via new DoesNotChangePropertyOrChildren), endpoints, derived headwords, DeletedAt and Id - VariantType and ComplexFormType names now reject empty per-WS values - CreateEntryOptions.IncludeComplexFormsAndComponents renamed to IncludeEntryReferences (it gates variants too); generated TS updated - BoolDiff helper (mirrors IntegerDiff); ToVariants flattened to Concat; FluentAssert Id-exclusion no longer names one type''s members; ProjectSnapshot.VariantTypes legacy-null note sharpened Co-Authored-By: Claude Fable 5 --- .../Api/FwDataMiniLcmApi.cs | 12 +++------ .../FwLiteProjectSync/DryRunMiniLcmApi.cs | 2 +- .../FwLite/FwLiteWeb/Routes/MiniLcmRoutes.cs | 4 +-- backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs | 8 +++--- .../MiniLcm.Tests/FluentAssertGlobalConfig.cs | 3 ++- backend/FwLite/MiniLcm/CreateEntryOptions.cs | 10 +++---- backend/FwLite/MiniLcm/ProjectSnapshot.cs | 4 ++- .../FwLite/MiniLcm/SyncHelpers/BoolDiff.cs | 14 ++++++++++ .../FwLite/MiniLcm/SyncHelpers/EntrySync.cs | 4 +-- .../FwLite/MiniLcm/SyncHelpers/VariantSync.cs | 3 +-- .../Validators/ComplexFormTypeValidator.cs | 2 +- .../MiniLcm/Validators/JsonPatchValidator.cs | 18 +++++++++++++ .../Validators/MiniLcmApiValidationWrapper.cs | 14 ++++++++++ .../MiniLcm/Validators/MiniLcmValidators.cs | 9 ++++++- .../Validators/VariantTypeValidator.cs | 2 +- .../Validators/VariantUpdateValidator.cs | 26 +++++++++++++++++++ backend/FwLite/VARIANTS.md | 2 +- .../viewer/src/lib/create-entry-options.ts | 4 +-- .../MiniLcm/ICreateEntryOptions.ts | 2 +- frontend/viewer/tests/entry-api-helper.ts | 4 +-- 20 files changed, 112 insertions(+), 35 deletions(-) create mode 100644 backend/FwLite/MiniLcm/SyncHelpers/BoolDiff.cs create mode 100644 backend/FwLite/MiniLcm/Validators/VariantUpdateValidator.cs diff --git a/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs b/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs index 406ed24c58..0f5e01b7e3 100644 --- a/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs +++ b/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs @@ -803,13 +803,9 @@ private IEnumerable ToVariantOf(ILexEntry entry) private IEnumerable ToVariants(ILexEntry entry) { - return new[] - { - entry.VariantFormEntryBackRefs.Select(r => ToVariant(r.OwningEntry, r, entry, null)), - entry.AllSenses.SelectMany(sense => - sense.VariantFormEntryBackRefs.Select(r => ToVariant(r.OwningEntry, r, entry, sense))) - } - .SelectMany(v => v) + return entry.VariantFormEntryBackRefs.Select(r => ToVariant(r.OwningEntry, r, entry, null)) + .Concat(entry.AllSenses.SelectMany(sense => + sense.VariantFormEntryBackRefs.Select(r => ToVariant(r.OwningEntry, r, entry, sense)))) .DistinctBy(v => (v.VariantEntryId, v.MainEntryId, v.MainSenseId)) .Order(Variant.VariantsOrder); } @@ -1153,7 +1149,7 @@ public async Task CreateEntry(Entry entry, CreateEntryOptions? options = AddComplexFormType(lexEntry, complexFormType.Id); } - if (options.IncludeComplexFormsAndComponents) + if (options.IncludeEntryReferences) { foreach (var component in entry.Components) { diff --git a/backend/FwLite/FwLiteProjectSync/DryRunMiniLcmApi.cs b/backend/FwLite/FwLiteProjectSync/DryRunMiniLcmApi.cs index 057855673e..9b9d981573 100644 --- a/backend/FwLite/FwLiteProjectSync/DryRunMiniLcmApi.cs +++ b/backend/FwLite/FwLiteProjectSync/DryRunMiniLcmApi.cs @@ -174,7 +174,7 @@ public Task CreateEntry(Entry entry, CreateEntryOptions? options) options ??= new CreateEntryOptions(); DryRunRecords.Add(new DryRunRecord(nameof(CreateEntry), $"Create entry {entry.Headword()} ({options})")); // Only return what would have been persisted - if (options.IncludeComplexFormsAndComponents) + if (options.IncludeEntryReferences) return Task.FromResult(entry); else return Task.FromResult(entry with { Components = [], ComplexForms = [], VariantOf = [], Variants = [] }); diff --git a/backend/FwLite/FwLiteWeb/Routes/MiniLcmRoutes.cs b/backend/FwLite/FwLiteWeb/Routes/MiniLcmRoutes.cs index 1ac6ebe96c..4dd8d99613 100644 --- a/backend/FwLite/FwLiteWeb/Routes/MiniLcmRoutes.cs +++ b/backend/FwLite/FwLiteWeb/Routes/MiniLcmRoutes.cs @@ -193,10 +193,10 @@ private class CreateEntryOptionsParams [FromQuery] public bool? AutoAddMainPublication { get; set; } [FromQuery] - public bool? IncludeComplexFormsAndComponents { get; set; } + public bool? IncludeEntryReferences { get; set; } public CreateEntryOptions ToOptions(CreateEntryOptions defaults) => new( - IncludeComplexFormsAndComponents: IncludeComplexFormsAndComponents ?? defaults.IncludeComplexFormsAndComponents, + IncludeEntryReferences: IncludeEntryReferences ?? defaults.IncludeEntryReferences, AutoAddMainPublication: AutoAddMainPublication ?? defaults.AutoAddMainPublication); } diff --git a/backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs b/backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs index efc2f0833c..374071fe82 100644 --- a/backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs +++ b/backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs @@ -737,16 +737,16 @@ ..await entry.Senses.ToAsyncEnumerable() }) .ToArrayAsync(), ..await ToPublications(entry.PublishIn).ToArrayAsync(), - ..options.IncludeComplexFormsAndComponents ? + ..options.IncludeEntryReferences ? await ToComplexFormComponents(entry.Components).ToArrayAsync() : Enumerable.Empty(), - ..options.IncludeComplexFormsAndComponents ? + ..options.IncludeEntryReferences ? await ToComplexFormComponents(entry.ComplexForms).ToArrayAsync() : Enumerable.Empty(), - ..options.IncludeComplexFormsAndComponents ? + ..options.IncludeEntryReferences ? await ToVariants(entry.VariantOf).ToArrayAsync() : Enumerable.Empty(), - ..options.IncludeComplexFormsAndComponents ? + ..options.IncludeEntryReferences ? await ToVariants(entry.Variants).ToArrayAsync() : Enumerable.Empty(), ..await ToComplexFormTypes(entry.ComplexFormTypes).ToArrayAsync() diff --git a/backend/FwLite/MiniLcm.Tests/FluentAssertGlobalConfig.cs b/backend/FwLite/MiniLcm.Tests/FluentAssertGlobalConfig.cs index a71382a606..884f18805c 100644 --- a/backend/FwLite/MiniLcm.Tests/FluentAssertGlobalConfig.cs +++ b/backend/FwLite/MiniLcm.Tests/FluentAssertGlobalConfig.cs @@ -14,8 +14,9 @@ public static void Initialize() //however that will result in very poor error messages, so we override it .ComparingByMembers() .ComparingByMembers() + //Id/MaybeId are sync-irrelevant on every type that carries the unset-id pattern .Excluding(m => (m.DeclaringType == typeof(ComplexFormComponent) || m.DeclaringType == typeof(Variant) || m.DeclaringType == typeof(WritingSystem)) - && (m.Name == nameof(ComplexFormComponent.Id) || m.Name == nameof(ComplexFormComponent.MaybeId))) + && (m.Name == "Id" || m.Name == "MaybeId")) //Shadow query-rewrite targets — domain state lives on the underlying collection. .Excluding(m => (m.DeclaringType == typeof(Entry) && m.Name == nameof(Entry.PublishInRows)) || (m.DeclaringType == typeof(Sense) && m.Name == nameof(Sense.SemanticDomainRows))) diff --git a/backend/FwLite/MiniLcm/CreateEntryOptions.cs b/backend/FwLite/MiniLcm/CreateEntryOptions.cs index 5a2a81e446..995fb5f12e 100644 --- a/backend/FwLite/MiniLcm/CreateEntryOptions.cs +++ b/backend/FwLite/MiniLcm/CreateEntryOptions.cs @@ -2,10 +2,10 @@ namespace MiniLcm; public record CreateEntryOptions( /// - /// Also gates variant links. Can be excluded for the purpose of deferring - /// referencing entities that might not exist yet. + /// Gates all cross-entry links (complex forms, components and variants). Can be excluded + /// for the purpose of deferring referenced entities that might not exist yet. /// - bool IncludeComplexFormsAndComponents = true, + bool IncludeEntryReferences = true, bool AutoAddMainPublication = false ) { @@ -15,6 +15,6 @@ public record CreateEntryOptions( /// For interactive entry creation: auto-add the project's main publication. public static readonly CreateEntryOptions WithMainPublication = new(AutoAddMainPublication: true); - /// Defer complex forms and components to a later sync pass (they may reference entries that don't exist yet). - public static readonly CreateEntryOptions WithoutComplexFormsAndComponents = new(IncludeComplexFormsAndComponents: false); + /// Defer cross-entry links (complex forms, components, variants) to a later sync pass (they may reference entries that don't exist yet). + public static readonly CreateEntryOptions WithoutEntryReferences = new(IncludeEntryReferences: false); } diff --git a/backend/FwLite/MiniLcm/ProjectSnapshot.cs b/backend/FwLite/MiniLcm/ProjectSnapshot.cs index 95ae5f8920..85c962bea5 100644 --- a/backend/FwLite/MiniLcm/ProjectSnapshot.cs +++ b/backend/FwLite/MiniLcm/ProjectSnapshot.cs @@ -14,6 +14,8 @@ public record ProjectSnapshot( { public static ProjectSnapshot Empty { get; } = new([], [], [], [], [], [], [], new WritingSystems()); - //snapshots and templates serialized before variant support deserialize this as null + //Snapshots and templates serialized before variant support have no VariantTypes property, so + //System.Text.Json passes null for the constructor parameter; this init coalesces it back to + //empty (covered by the legacy SnapshotDeserializationRegressionData test). public VariantType[] VariantTypes { get; init; } = VariantTypes ?? []; } diff --git a/backend/FwLite/MiniLcm/SyncHelpers/BoolDiff.cs b/backend/FwLite/MiniLcm/SyncHelpers/BoolDiff.cs new file mode 100644 index 0000000000..76f985b10d --- /dev/null +++ b/backend/FwLite/MiniLcm/SyncHelpers/BoolDiff.cs @@ -0,0 +1,14 @@ +using SystemTextJsonPatch.Operations; + +namespace MiniLcm.SyncHelpers; + +public static class BoolDiff +{ + public static IEnumerable> GetBoolDiff(string path, + bool before, + bool after) where T : class + { + if (before == after) yield break; + yield return new Operation("replace", $"/{path}", null, after); + } +} diff --git a/backend/FwLite/MiniLcm/SyncHelpers/EntrySync.cs b/backend/FwLite/MiniLcm/SyncHelpers/EntrySync.cs index bb19a2e751..da92e63603 100644 --- a/backend/FwLite/MiniLcm/SyncHelpers/EntrySync.cs +++ b/backend/FwLite/MiniLcm/SyncHelpers/EntrySync.cs @@ -164,13 +164,13 @@ private class EntriesDiffApi(IMiniLcmApi api, Dictionary allBeforeS { // Api.CreateEntry() is optimized and assumes all senses are new rather than moved. // So, we use the "smarter" SensesSync for the senses, which can handle moved senses. - addedEntry = await api.CreateEntry(afterEntry with { Senses = [] }, CreateEntryOptions.WithoutComplexFormsAndComponents); + addedEntry = await api.CreateEntry(afterEntry with { Senses = [] }, CreateEntryOptions.WithoutEntryReferences); await SensesSync(addedEntry.Id, [], afterEntry.Senses, api, allBeforeSenses, allAfterSenses); addedEntry = addedEntry with { Senses = afterEntry.Senses }; } else { - addedEntry = await api.CreateEntry(afterEntry, CreateEntryOptions.WithoutComplexFormsAndComponents); + addedEntry = await api.CreateEntry(afterEntry, CreateEntryOptions.WithoutEntryReferences); } return (1, addedEntry); } diff --git a/backend/FwLite/MiniLcm/SyncHelpers/VariantSync.cs b/backend/FwLite/MiniLcm/SyncHelpers/VariantSync.cs index 0b17ec7782..d8d7fd27fc 100644 --- a/backend/FwLite/MiniLcm/SyncHelpers/VariantSync.cs +++ b/backend/FwLite/MiniLcm/SyncHelpers/VariantSync.cs @@ -27,8 +27,7 @@ public static async Task Sync(Variant before, Variant after, IMiniLcmApi ap public static UpdateObjectInput? VariantDiffToUpdate(Variant before, Variant after) { JsonPatchDocument patchDocument = new(); - if (before.HideMinorEntry != after.HideMinorEntry) - patchDocument.Operations.Add(new Operation("replace", $"/{nameof(Variant.HideMinorEntry)}", null, after.HideMinorEntry)); + patchDocument.Operations.AddRange(BoolDiff.GetBoolDiff(nameof(Variant.HideMinorEntry), before.HideMinorEntry, after.HideMinorEntry)); patchDocument.Operations.AddRange(MultiStringDiff.GetMultiStringDiff(nameof(Variant.Comment), before.Comment, after.Comment)); if (patchDocument.Operations.Count == 0) return null; return new UpdateObjectInput(patchDocument); diff --git a/backend/FwLite/MiniLcm/Validators/ComplexFormTypeValidator.cs b/backend/FwLite/MiniLcm/Validators/ComplexFormTypeValidator.cs index e4274afbb6..78b5de79ad 100644 --- a/backend/FwLite/MiniLcm/Validators/ComplexFormTypeValidator.cs +++ b/backend/FwLite/MiniLcm/Validators/ComplexFormTypeValidator.cs @@ -8,6 +8,6 @@ internal class ComplexFormTypeValidator : AbstractValidator public ComplexFormTypeValidator() { RuleFor(c => c.DeletedAt).Null(); - RuleFor(c => c.Name).Required(c => c.Id.ToString("D")); + RuleFor(c => c.Name).Required(c => c.Id.ToString("D")).NoEmptyValues(c => c.Id.ToString("D")); } } diff --git a/backend/FwLite/MiniLcm/Validators/JsonPatchValidator.cs b/backend/FwLite/MiniLcm/Validators/JsonPatchValidator.cs index aef0322f66..1fd8beec4c 100644 --- a/backend/FwLite/MiniLcm/Validators/JsonPatchValidator.cs +++ b/backend/FwLite/MiniLcm/Validators/JsonPatchValidator.cs @@ -20,6 +20,24 @@ string propertyName//todo handle this better }); } + /// + /// Unlike this also rejects operations on paths + /// under the property (e.g. "/Types/0"), for list properties that must not be patched by index. + /// + public static IRuleBuilderOptionsConditions, JsonPatchDocument> DoesNotChangePropertyOrChildren( + this IRuleBuilder, JsonPatchDocument> builder, + string propertyName + ) where T : class + { + return builder.Custom((document, context) => + { + if (document.Operations.Any(o => + string.Equals(o.Path, $"/{propertyName}", StringComparison.InvariantCultureIgnoreCase) + || (o.Path?.StartsWith($"/{propertyName}/", StringComparison.InvariantCultureIgnoreCase) ?? false))) + context.AddFailure(propertyName, "Not allowed to update " + propertyName); + }); + } + public static IRuleBuilderOptionsConditions, JsonPatchDocument> DoesNotChangePropertyTo( this IRuleBuilder, JsonPatchDocument> builder, string propertyName, diff --git a/backend/FwLite/MiniLcm/Validators/MiniLcmApiValidationWrapper.cs b/backend/FwLite/MiniLcm/Validators/MiniLcmApiValidationWrapper.cs index 3a696e1629..98ffb92f57 100644 --- a/backend/FwLite/MiniLcm/Validators/MiniLcmApiValidationWrapper.cs +++ b/backend/FwLite/MiniLcm/Validators/MiniLcmApiValidationWrapper.cs @@ -153,6 +153,20 @@ public async Task UpdateVariant(Variant before, Variant after, IMiniLcm return await _api.UpdateVariant(before, after, api ?? this); } + // Submit* must be overridden explicitly: BeaKona's generated forwarders bypass the + // interface default bodies and go straight to _api, silently skipping validation (#2362) + public async Task SubmitCreateVariant(Variant variant) + { + await validators.ValidateAndThrow(variant); + await _api.SubmitCreateVariant(variant); + } + + public async Task SubmitUpdateVariant(Variant variant, UpdateObjectInput update) + { + await validators.ValidateAndThrow(update); + await _api.SubmitUpdateVariant(variant, update); + } + public async Task UpdateMorphType(Guid id, UpdateObjectInput update) { await validators.ValidateAndThrow(update); diff --git a/backend/FwLite/MiniLcm/Validators/MiniLcmValidators.cs b/backend/FwLite/MiniLcm/Validators/MiniLcmValidators.cs index 566d87f043..7dce6846c7 100644 --- a/backend/FwLite/MiniLcm/Validators/MiniLcmValidators.cs +++ b/backend/FwLite/MiniLcm/Validators/MiniLcmValidators.cs @@ -20,7 +20,8 @@ public record MiniLcmValidators( IValidator PublicationValidator, IValidator> MorphTypeUpdateValidator, IValidator> WritingSystemUpdateValidator, - IValidator> PublicationUpdateValidator) + IValidator> PublicationUpdateValidator, + IValidator> VariantUpdateValidator) { public async Task ValidateAndThrow(ComplexFormType value) { @@ -91,6 +92,11 @@ public async Task ValidateAndThrow(UpdateObjectInput update) { await PublicationUpdateValidator.ValidateAndThrowAsync(update); } + + public async Task ValidateAndThrow(UpdateObjectInput update) + { + await VariantUpdateValidator.ValidateAndThrowAsync(update); + } } public static class MiniLcmValidatorsExtensions @@ -113,6 +119,7 @@ public static IServiceCollection AddMiniLcmValidators(this IServiceCollection se services.AddTransient>, MorphTypeUpdateValidator>(); services.AddTransient>, WritingSystemUpdateValidator>(); services.AddTransient>, PublicationUpdateValidator>(); + services.AddTransient>, VariantUpdateValidator>(); services.AddTransient(); services.AddTransient(); services.AddTransient(); diff --git a/backend/FwLite/MiniLcm/Validators/VariantTypeValidator.cs b/backend/FwLite/MiniLcm/Validators/VariantTypeValidator.cs index 0692ef36fc..c58d342b5b 100644 --- a/backend/FwLite/MiniLcm/Validators/VariantTypeValidator.cs +++ b/backend/FwLite/MiniLcm/Validators/VariantTypeValidator.cs @@ -8,6 +8,6 @@ internal class VariantTypeValidator : AbstractValidator public VariantTypeValidator() { RuleFor(c => c.DeletedAt).Null(); - RuleFor(c => c.Name).Required(c => c.Id.ToString("D")); + RuleFor(c => c.Name).Required(c => c.Id.ToString("D")).NoEmptyValues(c => c.Id.ToString("D")); } } diff --git a/backend/FwLite/MiniLcm/Validators/VariantUpdateValidator.cs b/backend/FwLite/MiniLcm/Validators/VariantUpdateValidator.cs new file mode 100644 index 0000000000..727ff38699 --- /dev/null +++ b/backend/FwLite/MiniLcm/Validators/VariantUpdateValidator.cs @@ -0,0 +1,26 @@ +using FluentValidation; +using MiniLcm.Models; + +namespace MiniLcm.Validators; + +/// +/// Patches may only touch a link's own scalar data (HideMinorEntry, Comment). Types has +/// dedicated changes (Add/RemoveVariantType) so concurrent edits merge; patching it by index +/// would silently target whatever happens to sit at that position. Endpoints are +/// delete-and-recreate, and headwords are derived caches. +/// +public class VariantUpdateValidator : AbstractValidator> +{ + public VariantUpdateValidator() + { + RuleFor(u => u.Patch).DoesNotChangePropertyOrChildren(nameof(Variant.Types)); + RuleFor(u => u.Patch).DoesNotChangeProperty(nameof(Variant.VariantEntryId)); + RuleFor(u => u.Patch).DoesNotChangeProperty(nameof(Variant.MainEntryId)); + RuleFor(u => u.Patch).DoesNotChangeProperty(nameof(Variant.MainSenseId)); + RuleFor(u => u.Patch).DoesNotChangeProperty(nameof(Variant.VariantHeadword)); + RuleFor(u => u.Patch).DoesNotChangeProperty(nameof(Variant.MainHeadword)); + RuleFor(u => u.Patch).DoesNotChangeProperty(nameof(Variant.DeletedAt)); + RuleFor(u => u.Patch).DoesNotChangeProperty(nameof(Variant.Id)); + RuleFor(u => u.Patch.Operations).NotEmpty(); + } +} diff --git a/backend/FwLite/VARIANTS.md b/backend/FwLite/VARIANTS.md index ff1c802719..f6a213664b 100644 --- a/backend/FwLite/VARIANTS.md +++ b/backend/FwLite/VARIANTS.md @@ -296,7 +296,7 @@ Fanout sites that must stay in lockstep: directions — a one-direction wiring won't reconcile deletes). Phase/option names stay as-is in these PRs (`…ComplexFormsAndComponents` now covers variants too; renaming is a separate no-behavior PR — reviewer advice, keeps the critical diff small). -- `CreateEntryOptions.IncludeComplexFormsAndComponents` also gates variant links (doc +- `CreateEntryOptions.IncludeEntryReferences` (renamed from `IncludeComplexFormsAndComponents` on review) gates variant links too (doc comment updated; entry-to-entry refs need both endpoints to exist). - `ProjectSnapshot` gains `VariantTypes` — update **`TakeProjectSnapshot()`** (`MiniLcmApiExtensions`) and `ProjectSnapshot.Empty`, or it compiles-but-snapshots-empty diff --git a/frontend/viewer/src/lib/create-entry-options.ts b/frontend/viewer/src/lib/create-entry-options.ts index 12e50d5c15..37c5a18c1c 100644 --- a/frontend/viewer/src/lib/create-entry-options.ts +++ b/frontend/viewer/src/lib/create-entry-options.ts @@ -2,6 +2,6 @@ import type {ICreateEntryOptions} from '$lib/dotnet-types'; // Mirrors the C# CreateEntryOptions presets (MiniLcm/CreateEntryOptions.cs). export const createEntryOptions: Record<'asIs' | 'withMainPublication', ICreateEntryOptions> = { - asIs: {includeComplexFormsAndComponents: true, autoAddMainPublication: false}, - withMainPublication: {includeComplexFormsAndComponents: true, autoAddMainPublication: true}, + asIs: {includeEntryReferences: true, autoAddMainPublication: false}, + withMainPublication: {includeEntryReferences: true, autoAddMainPublication: true}, }; diff --git a/frontend/viewer/src/lib/dotnet-types/generated-types/MiniLcm/ICreateEntryOptions.ts b/frontend/viewer/src/lib/dotnet-types/generated-types/MiniLcm/ICreateEntryOptions.ts index eb0cd5e689..e489e6b657 100644 --- a/frontend/viewer/src/lib/dotnet-types/generated-types/MiniLcm/ICreateEntryOptions.ts +++ b/frontend/viewer/src/lib/dotnet-types/generated-types/MiniLcm/ICreateEntryOptions.ts @@ -5,7 +5,7 @@ export interface ICreateEntryOptions { - includeComplexFormsAndComponents: boolean; + includeEntryReferences: boolean; autoAddMainPublication: boolean; } /* eslint-enable */ diff --git a/frontend/viewer/tests/entry-api-helper.ts b/frontend/viewer/tests/entry-api-helper.ts index 3d4917d01b..cbdbc8233e 100644 --- a/frontend/viewer/tests/entry-api-helper.ts +++ b/frontend/viewer/tests/entry-api-helper.ts @@ -84,7 +84,7 @@ export class EntryApiHelper { publishIn: [], homographNumber: 0, }; - const created = await api.createEntry(newEntry, {includeComplexFormsAndComponents: true, autoAddMainPublication: false}); + const created = await api.createEntry(newEntry, {includeEntryReferences: true, autoAddMainPublication: false}); return {id: created.id, headword: newHeadword}; }, {idx: targetIndex, order: DEFAULT_ORDER, morphType: MorphTypeKind.Unknown}); } @@ -108,7 +108,7 @@ export class EntryApiHelper { publishIn: [], homographNumber: 0, }; - const created = await api.createEntry(newEntry, {includeComplexFormsAndComponents: true, autoAddMainPublication: false}); + const created = await api.createEntry(newEntry, {includeEntryReferences: true, autoAddMainPublication: false}); return {id: created.id, headword: hw}; }, {hw: headword, morphType: MorphTypeKind.Unknown}); } From f2fcff4cb13e0874031dca53efa54ce6356bce35 Mon Sep 17 00:00:00 2001 From: Tim Haasdyk Date: Mon, 6 Jul 2026 10:37:27 +0200 Subject: [PATCH 17/21] Round-trip variant type order (review: types are user-ordered in FLEx) FLEx lets users reorder a ref''s VariantEntryTypesRS (right-click, move left/right); syncing types as a set silently lost that order. Adds SetVariantTypesOrder to IMiniLcmWriteApi (both implementations, dry-run, wrappers, notify) and SetVariantTypesOrderChange (unlisted types keep their relative order after listed ones, so concurrent type adds merge). VariantSync resets order after the add/remove diff whenever it cannot have landed in after-order. Variant link lists themselves stay unordered (decision 6, amended). Covered by shared conformance tests (both impls), a CRDT change test incl. the concurrent-add merge, and a full FwData<->CRDT sync round-trip; change-model/regression verified files regenerated. Co-Authored-By: Claude Fable 5 --- .../Api/FwDataMiniLcmApi.cs | 23 +++++++ .../VariantSyncTests.cs | 28 ++++++++ .../FwLiteProjectSync/DryRunMiniLcmApi.cs | 6 ++ .../Services/MiniLcmApiNotifyWrapper.cs | 6 ++ ...lizationRegressionData.latest.verified.txt | 8 +++ .../LcmCrdt.Tests/Changes/UseChangesTests.cs | 3 + .../Changes/VariantChangeTests.cs | 22 ++++++ ...pshotTests.VerifyChangeModels.verified.txt | 4 ++ .../Entries/SetVariantTypesOrderChange.cs | 27 ++++++++ backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs | 8 +++ backend/FwLite/LcmCrdt/LcmCrdtKernel.cs | 1 + .../VariantUpdateValidationTests.cs | 64 +++++++++++++++++ .../FwLite/MiniLcm.Tests/VariantTestsBase.cs | 68 +++++++++++++++++++ backend/FwLite/MiniLcm/IMiniLcmWriteApi.cs | 8 ++- backend/FwLite/MiniLcm/Models/Variant.cs | 5 +- .../MiniLcmApiWriteNormalizationWrapper.cs | 5 ++ .../FwLite/MiniLcm/SyncHelpers/VariantSync.cs | 20 ++++++ backend/FwLite/VARIANTS.md | 7 +- 18 files changed, 308 insertions(+), 5 deletions(-) create mode 100644 backend/FwLite/LcmCrdt/Changes/Entries/SetVariantTypesOrderChange.cs create mode 100644 backend/FwLite/MiniLcm.Tests/Validators/VariantUpdateValidationTests.cs diff --git a/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs b/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs index 0f5e01b7e3..b8b8e51cbd 100644 --- a/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs +++ b/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs @@ -1469,6 +1469,29 @@ public Task RemoveVariantType(Variant variant, Guid variantTypeId) return Task.CompletedTask; } + public Task SetVariantTypesOrder(Variant variant, IReadOnlyList orderedTypeIds) + { + UndoableUnitOfWorkHelper.DoUsingNewOrCurrentUOW("Reorder Variant Types", + "Revert Variant Types order", + Cache.ServiceLocator.ActionHandler, + () => + { + if (!EntriesRepository.TryGetObject(variant.VariantEntryId, out var lexVariantEntry)) return; + var entryRef = FindVariantRefForUpdate(lexVariantEntry, variant); + if (entryRef is null) return; + var orderIds = orderedTypeIds.ToList(); + var ordered = entryRef.VariantEntryTypesRS + .Select((type, index) => (type, index)) + .OrderBy(t => orderIds.IndexOf(t.type.Guid) is var i and >= 0 ? i : int.MaxValue) + .ThenBy(t => t.index) + .Select(t => t.type) + .ToArray(); + if (ordered.SequenceEqual(entryRef.VariantEntryTypesRS)) return; + entryRef.VariantEntryTypesRS.Replace(0, entryRef.VariantEntryTypesRS.Count, ordered); + }); + return Task.CompletedTask; + } + /// /// must be called as part of an lcm action /// diff --git a/backend/FwLite/FwLiteProjectSync.Tests/VariantSyncTests.cs b/backend/FwLite/FwLiteProjectSync.Tests/VariantSyncTests.cs index 931d28a54e..b9a78f659c 100644 --- a/backend/FwLite/FwLiteProjectSync.Tests/VariantSyncTests.cs +++ b/backend/FwLite/FwLiteProjectSync.Tests/VariantSyncTests.cs @@ -209,6 +209,34 @@ public async Task VariantLinkEditsSyncBothWays() merged.Comment["en"].GetPlainText().Should().Be("prefer the main entry"); } + [Fact] + [Trait("Category", "Integration")] + public async Task VariantTypeOrderSyncsBothWays() + { + var crdtApi = _fixture.CrdtApi; + var fwdataApi = _fixture.FwDataApi; + var free = await GetVariantType(fwdataApi, "Free Variant"); + var dialectal = await GetVariantType(fwdataApi, "Dialectal Variant"); + // deliberately not alphabetical and not creation order: order must come from the ref sequence + await fwdataApi.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with { Types = [free, dialectal] }); + await _syncService.Import(crdtApi, fwdataApi); + var projectSnapshot = await _fixture.RegenerateAndGetSnapshot(); + + var imported = (await crdtApi.GetEntry(_variantEntryId))!.VariantOf.Single(); + imported.Types.Select(t => t.Id).Should().Equal(free.Id, dialectal.Id); + + // reorder on the CRDT side, expect FwData to follow + var reordered = imported.Copy(); + reordered.Types = [.. reordered.Types.AsEnumerable().Reverse()]; + await crdtApi.UpdateVariant(imported, reordered); + + await _syncService.Sync(crdtApi, fwdataApi, projectSnapshot); + + SyncTests.AssertSnapshotsAreEquivalent(await fwdataApi.TakeProjectSnapshot(), await crdtApi.TakeProjectSnapshot()); + var fwLink = (await fwdataApi.GetEntry(_variantEntryId))!.VariantOf.Should().ContainSingle().Subject; + fwLink.Types.Select(t => t.Id).Should().Equal(dialectal.Id, free.Id); + } + [Fact] [Trait("Category", "Integration")] public async Task DeletingMainEntryInCrdtRemovesLinkOnSync() diff --git a/backend/FwLite/FwLiteProjectSync/DryRunMiniLcmApi.cs b/backend/FwLite/FwLiteProjectSync/DryRunMiniLcmApi.cs index 9b9d981573..a7de51b727 100644 --- a/backend/FwLite/FwLiteProjectSync/DryRunMiniLcmApi.cs +++ b/backend/FwLite/FwLiteProjectSync/DryRunMiniLcmApi.cs @@ -419,6 +419,12 @@ public Task RemoveVariantType(Variant variant, Guid variantTypeId) return Task.CompletedTask; } + public Task SetVariantTypesOrder(Variant variant, IReadOnlyList orderedTypeIds) + { + DryRunRecords.Add(new DryRunRecord(nameof(SetVariantTypesOrder), $"Reorder variant types to [{string.Join(", ", orderedTypeIds)}] on variant link {VariantName(variant)}")); + return Task.CompletedTask; + } + private static string VariantName(Variant variant) { return $"{variant.VariantHeadword ?? variant.VariantEntryId.ToString()} -> {variant.MainHeadword ?? variant.MainEntryId.ToString()}{(variant.MainSenseId is null ? "" : $" (sense {variant.MainSenseId})")}"; diff --git a/backend/FwLite/FwLiteShared/Services/MiniLcmApiNotifyWrapper.cs b/backend/FwLite/FwLiteShared/Services/MiniLcmApiNotifyWrapper.cs index d8642e6de5..d7281354e3 100644 --- a/backend/FwLite/FwLiteShared/Services/MiniLcmApiNotifyWrapper.cs +++ b/backend/FwLite/FwLiteShared/Services/MiniLcmApiNotifyWrapper.cs @@ -168,6 +168,12 @@ async Task IMiniLcmWriteApi.RemoveVariantType(Variant variant, Guid variantTypeI NotifyEntriesChanged(variant.VariantEntryId, variant.MainEntryId); } + async Task IMiniLcmWriteApi.SetVariantTypesOrder(Variant variant, IReadOnlyList orderedTypeIds) + { + await _api.SetVariantTypesOrder(variant, orderedTypeIds); + NotifyEntriesChanged(variant.VariantEntryId, variant.MainEntryId); + } + async Task IMiniLcmWriteApi.DeleteEntry(Guid id) { await _api.DeleteEntry(id); diff --git a/backend/FwLite/LcmCrdt.Tests/Changes/ChangeDeserializationRegressionData.latest.verified.txt b/backend/FwLite/LcmCrdt.Tests/Changes/ChangeDeserializationRegressionData.latest.verified.txt index ced3095eae..93ea9bb17c 100644 --- a/backend/FwLite/LcmCrdt.Tests/Changes/ChangeDeserializationRegressionData.latest.verified.txt +++ b/backend/FwLite/LcmCrdt.Tests/Changes/ChangeDeserializationRegressionData.latest.verified.txt @@ -1498,5 +1498,13 @@ "nab": "Overpass" }, "EntityId": "6a8e727c-2e47-90af-a1ec-42d94fc3e38e" + }, + { + "$type": "SetVariantTypesOrderChange", + "OrderedTypeIds": [ + "e767c058-6e6c-ed85-cb16-19506fa41aa8", + "ba0582e4-0f04-b78b-aecd-4eb72567556a" + ], + "EntityId": "6393c7c6-5baa-2966-15d7-b6cd0b7e60ed" } ] \ No newline at end of file diff --git a/backend/FwLite/LcmCrdt.Tests/Changes/UseChangesTests.cs b/backend/FwLite/LcmCrdt.Tests/Changes/UseChangesTests.cs index 7107c7b541..60e9889b25 100644 --- a/backend/FwLite/LcmCrdt.Tests/Changes/UseChangesTests.cs +++ b/backend/FwLite/LcmCrdt.Tests/Changes/UseChangesTests.cs @@ -257,6 +257,9 @@ private static IEnumerable GetAllChanges() var removeVariantTypeChange = new RemoveVariantTypeChange(variant.Id, variantType.Id); yield return new ChangeWithDependencies(removeVariantTypeChange, [addVariantTypeChange]); + var setVariantTypesOrderChange = new SetVariantTypesOrderChange(variant.Id, [variantType.Id]); + yield return new ChangeWithDependencies(setVariantTypesOrderChange, [addVariantChange]); + var setSenseOrderChange = new LcmCrdt.Changes.SetOrderChange(sense.Id, 10); yield return new ChangeWithDependencies(setSenseOrderChange, [createSenseChange]); diff --git a/backend/FwLite/LcmCrdt.Tests/Changes/VariantChangeTests.cs b/backend/FwLite/LcmCrdt.Tests/Changes/VariantChangeTests.cs index 1f34c53ad2..50da7cd580 100644 --- a/backend/FwLite/LcmCrdt.Tests/Changes/VariantChangeTests.cs +++ b/backend/FwLite/LcmCrdt.Tests/Changes/VariantChangeTests.cs @@ -138,6 +138,28 @@ public async Task RemoveVariantType() link.Types.Should().BeEmpty(); } + [Fact] + public async Task SetVariantTypesOrder_ReordersTypesAndMergesWithConcurrentAdd() + { + var (variantEntry, mainEntry) = await CreateEntryPair(); + var typeA = await fixture.Api.CreateVariantType(new VariantType { Id = Guid.NewGuid(), Name = new() { { "en", "a" } } }); + var typeB = await fixture.Api.CreateVariantType(new VariantType { Id = Guid.NewGuid(), Name = new() { { "en", "b" } } }); + var typeC = await fixture.Api.CreateVariantType(new VariantType { Id = Guid.NewGuid(), Name = new() { { "en", "c" } } }); + + await fixture.DataModel.AddChange(Guid.NewGuid(), new AddVariantChange(Variant.FromEntries(variantEntry, mainEntry) with { Types = [typeA, typeB] })); + var link = (await fixture.Api.GetEntry(variantEntry.Id))!.VariantOf.Single(); + + await fixture.DataModel.AddChange(Guid.NewGuid(), new SetVariantTypesOrderChange(link.Id, [typeB.Id, typeA.Id])); + link = (await fixture.Api.GetEntry(variantEntry.Id))!.VariantOf.Single(); + link.Types.Select(t => t.Id).Should().Equal(typeB.Id, typeA.Id); + + // a type the reorder never listed (e.g. added concurrently) lands after the listed ones + await fixture.DataModel.AddChange(Guid.NewGuid(), new AddVariantTypeChange(link.Id, typeC)); + await fixture.DataModel.AddChange(Guid.NewGuid(), new SetVariantTypesOrderChange(link.Id, [typeA.Id, typeB.Id])); + link = (await fixture.Api.GetEntry(variantEntry.Id))!.VariantOf.Single(); + link.Types.Select(t => t.Id).Should().Equal(typeA.Id, typeB.Id, typeC.Id); + } + [Fact] public async Task DeletingVariantTypeRemovesItFromLinks() { diff --git a/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.VerifyChangeModels.verified.txt b/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.VerifyChangeModels.verified.txt index 9b70a58db5..41b9ee389c 100644 --- a/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.VerifyChangeModels.verified.txt +++ b/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.VerifyChangeModels.verified.txt @@ -236,6 +236,10 @@ DerivedType: RemoveVariantTypeChange, TypeDiscriminator: RemoveVariantTypeChange }, + { + DerivedType: SetVariantTypesOrderChange, + TypeDiscriminator: SetVariantTypesOrderChange + }, { DerivedType: CreateVariantType, TypeDiscriminator: CreateVariantType diff --git a/backend/FwLite/LcmCrdt/Changes/Entries/SetVariantTypesOrderChange.cs b/backend/FwLite/LcmCrdt/Changes/Entries/SetVariantTypesOrderChange.cs new file mode 100644 index 0000000000..255992bbef --- /dev/null +++ b/backend/FwLite/LcmCrdt/Changes/Entries/SetVariantTypesOrderChange.cs @@ -0,0 +1,27 @@ +using SIL.Harmony.Changes; +using SIL.Harmony.Core; +using SIL.Harmony.Entities; + +namespace LcmCrdt.Changes.Entries; + +/// +/// Reorders a variant link's Types to the given id sequence (FLEx: right-click a type → +/// move left/right). Types not listed — e.g. added concurrently — keep their relative +/// order after the listed ones, so this merges with concurrent Add/RemoveVariantTypeChange +/// instead of clobbering them. +/// +public class SetVariantTypesOrderChange(Guid entityId, List orderedTypeIds) + : EditChange(entityId), ISelfNamedType +{ + public List OrderedTypeIds { get; } = orderedTypeIds; + + public override ValueTask ApplyChange(Variant entity, IChangeContext context) + { + entity.Types = [.. entity.Types + .Select((type, index) => (type, index)) + .OrderBy(t => OrderedTypeIds.IndexOf(t.type.Id) is var i and >= 0 ? i : int.MaxValue) + .ThenBy(t => t.index) + .Select(t => t.type)]; + return ValueTask.CompletedTask; + } +} diff --git a/backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs b/backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs index 374071fe82..dc9f054a55 100644 --- a/backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs +++ b/backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs @@ -533,6 +533,14 @@ public async Task RemoveVariantType(Variant variant, Guid variantTypeId) await AddChange(new RemoveVariantTypeChange(existing.Id, variantTypeId)); } + public async Task SetVariantTypesOrder(Variant variant, IReadOnlyList orderedTypeIds) + { + await using var repo = await repoFactory.CreateRepoAsync(); + var existing = await repo.FindVariant(variant); + if (existing is null) return; + await AddChange(new SetVariantTypesOrderChange(existing.Id, [.. orderedTypeIds])); + } + public async IAsyncEnumerable GetMorphTypes() { await using var repo = await repoFactory.CreateRepoAsync(); diff --git a/backend/FwLite/LcmCrdt/LcmCrdtKernel.cs b/backend/FwLite/LcmCrdt/LcmCrdtKernel.cs index 569b52bbc6..7ff4971c9a 100644 --- a/backend/FwLite/LcmCrdt/LcmCrdtKernel.cs +++ b/backend/FwLite/LcmCrdt/LcmCrdtKernel.cs @@ -413,6 +413,7 @@ public static void ConfigureCrdt(CrdtConfig config) .Add() .Add() .Add() + .Add() .Add() .Add() .Add() diff --git a/backend/FwLite/MiniLcm.Tests/Validators/VariantUpdateValidationTests.cs b/backend/FwLite/MiniLcm.Tests/Validators/VariantUpdateValidationTests.cs new file mode 100644 index 0000000000..c3b84fdaf2 --- /dev/null +++ b/backend/FwLite/MiniLcm.Tests/Validators/VariantUpdateValidationTests.cs @@ -0,0 +1,64 @@ +using FluentValidation.TestHelper; +using MiniLcm.Validators; +using SystemTextJsonPatch; + +namespace MiniLcm.Tests.Validators; + +public class VariantUpdateValidationTests +{ + private readonly VariantUpdateValidator _validator = new(); + + private static UpdateObjectInput Patch(Action> build) + { + var document = new JsonPatchDocument(); + build(document); + return new UpdateObjectInput(document); + } + + [Fact] + public void AllowsHideMinorEntryAndComment() + { + var update = Patch(doc => + { + doc.Replace(v => v.HideMinorEntry, true); + doc.Replace(v => v.Comment, new RichMultiString { { "en", new RichString("note") } }); + }); + _validator.TestValidate(update).ShouldNotHaveAnyValidationErrors(); + } + + [Fact] + public void RejectsEmptyPatch() + { + _validator.TestValidate(Patch(_ => { })).IsValid.Should().BeFalse(); + } + + [Fact] + public void RejectsTypesReplacement() + { + var update = Patch(doc => doc.Replace(v => v.Types, [])); + _validator.TestValidate(update).IsValid.Should().BeFalse(); + } + + [Fact] + public void RejectsTypesPatchByIndex() + { + var update = Patch(doc => doc.Operations.Add( + new SystemTextJsonPatch.Operations.Operation("remove", "/Types/0", null))); + _validator.TestValidate(update).IsValid.Should().BeFalse(); + } + + [Theory] + [InlineData(nameof(Variant.VariantEntryId))] + [InlineData(nameof(Variant.MainEntryId))] + [InlineData(nameof(Variant.MainSenseId))] + [InlineData(nameof(Variant.VariantHeadword))] + [InlineData(nameof(Variant.MainHeadword))] + [InlineData(nameof(Variant.DeletedAt))] + [InlineData(nameof(Variant.Id))] + public void RejectsProtectedProperties(string property) + { + var update = Patch(doc => doc.Operations.Add( + new SystemTextJsonPatch.Operations.Operation("replace", $"/{property}", null, Guid.NewGuid()))); + _validator.TestValidate(update).IsValid.Should().BeFalse(); + } +} diff --git a/backend/FwLite/MiniLcm.Tests/VariantTestsBase.cs b/backend/FwLite/MiniLcm.Tests/VariantTestsBase.cs index c38215e9fb..12bdd17e90 100644 --- a/backend/FwLite/MiniLcm.Tests/VariantTestsBase.cs +++ b/backend/FwLite/MiniLcm.Tests/VariantTestsBase.cs @@ -480,6 +480,74 @@ public async Task RemoveVariantType_WorksWhenTypeIsNotOnLink() await Api.RemoveVariantType(variant, Guid.NewGuid()); } + [Fact] + public async Task CreateVariant_PreservesTypesOrder() + { + var typeA = await CreateVariantType("type a"); + var typeB = await CreateVariantType("type b"); + await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with { Types = [typeB, typeA] }); + + var link = (await Api.GetEntry(_variantEntryId))!.VariantOf.Should().ContainSingle().Subject; + link.Types.Select(t => t.Id).Should().Equal(typeB.Id, typeA.Id); + } + + [Fact] + public async Task SetVariantTypesOrder_ReordersTypes() + { + var typeA = await CreateVariantType("type a"); + var typeB = await CreateVariantType("type b"); + var typeC = await CreateVariantType("type c"); + var variant = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with { Types = [typeA, typeB, typeC] }); + + await Api.SetVariantTypesOrder(variant, [typeC.Id, typeA.Id, typeB.Id]); + + var link = (await Api.GetEntry(_variantEntryId))!.VariantOf.Should().ContainSingle().Subject; + link.Types.Select(t => t.Id).Should().Equal(typeC.Id, typeA.Id, typeB.Id); + } + + [Fact] + public async Task SetVariantTypesOrder_IgnoresUnknownIdsAndKeepsUnlistedTypesAfterListedOnes() + { + var typeA = await CreateVariantType("type a"); + var typeB = await CreateVariantType("type b"); + var variant = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with { Types = [typeA, typeB] }); + + await Api.SetVariantTypesOrder(variant, [Guid.NewGuid(), typeB.Id]); + + var link = (await Api.GetEntry(_variantEntryId))!.VariantOf.Should().ContainSingle().Subject; + link.Types.Select(t => t.Id).Should().Equal(typeB.Id, typeA.Id); + } + + [Fact] + public async Task UpdateVariant_ReordersTypes() + { + var typeA = await CreateVariantType("type a"); + var typeB = await CreateVariantType("type b"); + var created = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with { Types = [typeA, typeB] }); + + var after = created.Copy(); + after.Types = [typeB, typeA]; + await Api.UpdateVariant(created, after); + + var link = (await Api.GetEntry(_variantEntryId))!.VariantOf.Should().ContainSingle().Subject; + link.Types.Select(t => t.Id).Should().Equal(typeB.Id, typeA.Id); + } + + [Fact] + public async Task UpdateVariant_AddsTypeAtTheRequestedPosition() + { + var typeA = await CreateVariantType("type a"); + var typeB = await CreateVariantType("type b"); + var created = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with { Types = [typeB] }); + + var after = created.Copy(); + after.Types = [typeA, typeB]; + await Api.UpdateVariant(created, after); + + var link = (await Api.GetEntry(_variantEntryId))!.VariantOf.Should().ContainSingle().Subject; + link.Types.Select(t => t.Id).Should().Equal(typeA.Id, typeB.Id); + } + [Fact] public async Task CreateVariantType_Works() { diff --git a/backend/FwLite/MiniLcm/IMiniLcmWriteApi.cs b/backend/FwLite/MiniLcm/IMiniLcmWriteApi.cs index 772009635a..604f368159 100644 --- a/backend/FwLite/MiniLcm/IMiniLcmWriteApi.cs +++ b/backend/FwLite/MiniLcm/IMiniLcmWriteApi.cs @@ -73,12 +73,18 @@ Task UpdateWritingSystem(WritingSystemId id, Task AddComplexFormType(Guid entryId, Guid complexFormTypeId); Task RemoveComplexFormType(Guid entryId, Guid complexFormTypeId); // Variant links are unordered (no position/move) and resolved by their composite key - // (VariantEntryId, MainEntryId, MainSenseId) — see VARIANTS.md + // (VariantEntryId, MainEntryId, MainSenseId) — see VARIANTS.md. A link's Types sequence + // IS ordered (FLEx lets users reorder it), hence SetVariantTypesOrder. Task CreateVariant(Variant variant); Task UpdateVariant(Variant before, Variant after, IMiniLcmApi? api = null); Task DeleteVariant(Variant variant); Task AddVariantType(Variant variant, Guid variantTypeId); Task RemoveVariantType(Variant variant, Guid variantTypeId); + /// + /// Reorders the link's Types to the given id sequence; types missing from the list keep + /// their relative order after the listed ones, unknown ids are ignored. + /// + Task SetVariantTypesOrder(Variant variant, IReadOnlyList orderedTypeIds); Task AddPublication(Guid entryId, Guid publicationId); Task RemovePublication(Guid entryId, Guid publicationId); #endregion diff --git a/backend/FwLite/MiniLcm/Models/Variant.cs b/backend/FwLite/MiniLcm/Models/Variant.cs index b37e520a66..96837d5c6d 100644 --- a/backend/FwLite/MiniLcm/Models/Variant.cs +++ b/backend/FwLite/MiniLcm/Models/Variant.cs @@ -11,8 +11,9 @@ namespace MiniLcm.Models; /// the entry. FLEx can also share one ref between several targets (fields shared) or hold /// duplicate refs for one target; both shapes collapse to this composite-key model on read, /// and per-link edits split a shared ref first (see FwDataMiniLcmApi.FindVariantRefForUpdate). -/// Unlike there is no Order — variant lists have no -/// user-meaningful order in FieldWorks. +/// Unlike there is no Order — variant *link* lists have +/// no user-meaningful order in FieldWorks. The sequence on a link IS +/// user-ordered (FLEx: right-click a type → move left/right) and must round-trip. /// public record Variant : IObjectWithId { diff --git a/backend/FwLite/MiniLcm/Normalization/MiniLcmApiWriteNormalizationWrapper.cs b/backend/FwLite/MiniLcm/Normalization/MiniLcmApiWriteNormalizationWrapper.cs index 0749e03776..c702aeda0a 100644 --- a/backend/FwLite/MiniLcm/Normalization/MiniLcmApiWriteNormalizationWrapper.cs +++ b/backend/FwLite/MiniLcm/Normalization/MiniLcmApiWriteNormalizationWrapper.cs @@ -349,6 +349,11 @@ public Task RemoveVariantType(Variant variant, Guid variantTypeId) return _api.RemoveVariantType(variant, variantTypeId); } + public Task SetVariantTypesOrder(Variant variant, IReadOnlyList orderedTypeIds) + { + return _api.SetVariantTypesOrder(variant, orderedTypeIds); + } + public Task AddPublication(Guid entryId, Guid publicationId) { return _api.AddPublication(entryId, publicationId); diff --git a/backend/FwLite/MiniLcm/SyncHelpers/VariantSync.cs b/backend/FwLite/MiniLcm/SyncHelpers/VariantSync.cs index d8d7fd27fc..2ef67c31eb 100644 --- a/backend/FwLite/MiniLcm/SyncHelpers/VariantSync.cs +++ b/backend/FwLite/MiniLcm/SyncHelpers/VariantSync.cs @@ -21,9 +21,29 @@ public static async Task Sync(Variant before, Variant after, IMiniLcmApi ap changes++; } changes += await DiffCollection.Diff(before.Types, after.Types, new VariantTypesDiffApi(api, after)); + if (TypesOrderNeedsReset(before.Types, after.Types)) + { + await api.SetVariantTypesOrder(after, [.. after.Types.Select(t => t.Id)]); + changes++; + } return changes; } + /// + /// Whether the Add/Remove diff above cannot be trusted to land the types in after-order: + /// either the surviving types changed relative order, or new types were added into a + /// multi-type list (adds append, so their position is only right by luck). + /// + public static bool TypesOrderNeedsReset(IReadOnlyList before, IReadOnlyList after) + { + if (after.Count <= 1) return false; + var beforeIds = before.Select(t => t.Id).ToList(); + var afterIds = after.Select(t => t.Id).ToList(); + if (afterIds.Any(id => !beforeIds.Contains(id))) return true; + var commonBefore = beforeIds.Where(afterIds.Contains); + return !commonBefore.SequenceEqual(afterIds); + } + public static UpdateObjectInput? VariantDiffToUpdate(Variant before, Variant after) { JsonPatchDocument patchDocument = new(); diff --git a/backend/FwLite/VARIANTS.md b/backend/FwLite/VARIANTS.md index f6a213664b..d920e1ef5c 100644 --- a/backend/FwLite/VARIANTS.md +++ b/backend/FwLite/VARIANTS.md @@ -170,8 +170,11 @@ public record Variant : IObjectWithId are dedicated CRDT changes on the link (`AddVariantTypeChange`/`RemoveVariantTypeChange`, `EditChange`); `HideMinorEntry`/`Comment` sync via `JsonPatchChange`. This is what makes concurrent type edits merge instead of last-writer-wins. -6. **No ordering.** Variant lists have no user-meaningful order in FLEx; both directions diff - as sets. No `IOrderable`, no `SetOrderChange`, no Move API. +6. **No link ordering; type order is real.** Variant *link* lists have no user-meaningful + order in FLEx; both directions diff as sets — no `IOrderable`, no `SetOrderChange`, no Move + API for links. A link's `Types` sequence IS user-ordered (FLEx: right-click → move + left/right), so it round-trips: `SetVariantTypesOrderChange` + `SetVariantTypesOrder` + normalize order after the type add/remove diff (added on review, hahn-kev). 7. **Self-references, duplicates AND cycles are rejected; chains are allowed.** (This decision reversed mid-implementation: `MakeVariantOf` has no cycle check, but the FwData conformance tests proved liblcm rejects circular refs at a lower level — From 197804694d8643ae6d819ba554cf0fdaee5ee515 Mon Sep 17 00:00:00 2001 From: Tim Haasdyk Date: Mon, 6 Jul 2026 15:14:35 +0200 Subject: [PATCH 18/21] Rework variant type ordering to per-item orders (review) The whole-list SetVariantTypesOrderChange clobbered concurrent reorders; per Tim''s review, type order now works like sense pictures: Variant.Types holds VariantTypeRef objects ({typeId, fractional Order}, which also removes the stale-embedded-Name wart from decision 8), AddVariantType takes a BetweenPosition, MoveVariantType replaces the list-order API, and ReorderVariantTypeChange merges per type under concurrency. VariantSync diffs types with DiffOrderable. Regenerated: change/snapshot regression data (old branch-era shapes auto-migrated to the legacy files; the never-shipped SetVariantTypesOrderChange entry removed), DbModel/ChangeModels snapshots, sena-3-live snapshot, TS types (IVariantTypeRef). (The field-editor adaptations live in the stacked editor-UI branch.) Co-Authored-By: Claude Fable 5 --- .../MiniLcmTests/VariantTests.cs | 4 +- .../Api/FwDataMiniLcmApi.cs | 41 +- .../Api/UpdateProxy/UpdateVariantProxy.cs | 2 +- .../FwLiteProjectSync.Tests/SyncTests.cs | 2 +- .../VariantSyncTests.cs | 8 +- .../sena-3-live_snapshot.verified.txt | 36 +- .../FwLiteProjectSync/DryRunMiniLcmApi.cs | 6 +- .../Services/MiniLcmApiNotifyWrapper.cs | 8 +- .../TypeGen/ReinforcedFwLiteTypingConfig.cs | 1 + ...lizationRegressionData.latest.verified.txt | 73 +- ...lizationRegressionData.legacy.verified.txt | 339 ++ .../LcmCrdt.Tests/Changes/UseChangesTests.cs | 6 +- .../Changes/VariantChangeTests.cs | 26 +- ...lizationRegressionData.latest.verified.txt | 2729 +++++++-- ...lizationRegressionData.legacy.verified.txt | 4852 +++++++++++++++++ ...pshotTests.VerifyChangeModels.verified.txt | 4 +- ...elSnapshotTests.VerifyDbModel.verified.txt | 2 +- .../Changes/Entries/AddVariantChange.cs | 12 +- .../Changes/Entries/AddVariantTypeChange.cs | 31 +- .../Entries/ReorderVariantTypeChange.cs | 22 + .../Entries/SetVariantTypesOrderChange.cs | 27 - backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs | 20 +- backend/FwLite/LcmCrdt/LcmCrdtKernel.cs | 4 +- .../AutoFakerHelpers/EntryFakerHelper.cs | 2 +- .../Validators/VariantValidationTests.cs | 4 +- .../FwLite/MiniLcm.Tests/VariantTestsBase.cs | 33 +- backend/FwLite/MiniLcm/IMiniLcmWriteApi.cs | 10 +- backend/FwLite/MiniLcm/Models/Variant.cs | 5 +- backend/FwLite/MiniLcm/Models/VariantType.cs | 6 + .../FwLite/MiniLcm/Models/VariantTypeRef.cs | 25 + .../MiniLcmApiWriteNormalizationWrapper.cs | 11 +- .../FwLite/MiniLcm/SyncHelpers/VariantSync.cs | 48 +- .../MiniLcm/Validators/VariantValidator.cs | 4 +- .../MiniLcm/Models/IVariant.ts | 4 +- .../MiniLcm/Models/IVariantTypeRef.ts | 11 + .../src/project/demo/demo-entry-data.ts | 2 +- 36 files changed, 7820 insertions(+), 600 deletions(-) create mode 100644 backend/FwLite/LcmCrdt/Changes/Entries/ReorderVariantTypeChange.cs delete mode 100644 backend/FwLite/LcmCrdt/Changes/Entries/SetVariantTypesOrderChange.cs create mode 100644 backend/FwLite/MiniLcm/Models/VariantTypeRef.cs create mode 100644 frontend/viewer/src/lib/dotnet-types/generated-types/MiniLcm/Models/IVariantTypeRef.ts diff --git a/backend/FwLite/FwDataMiniLcmBridge.Tests/MiniLcmTests/VariantTests.cs b/backend/FwLite/FwDataMiniLcmBridge.Tests/MiniLcmTests/VariantTests.cs index c036e67bab..6ebd4d9b45 100644 --- a/backend/FwLite/FwDataMiniLcmBridge.Tests/MiniLcmTests/VariantTests.cs +++ b/backend/FwLite/FwDataMiniLcmBridge.Tests/MiniLcmTests/VariantTests.cs @@ -102,8 +102,8 @@ public async Task VariantRefsWithDifferentTypes_ReadAsSeparateLinksWithOwnTypes( var typeA = await Api.CreateVariantType(new VariantType { Id = Guid.NewGuid(), Name = new() { { "en", "type a" } } }); var typeB = await Api.CreateVariantType(new VariantType { Id = Guid.NewGuid(), Name = new() { { "en", "type b" } } }); - await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with { Types = [typeA] }); - await Api.CreateVariant(Variant.FromEntries(_variantEntry, otherMainEntry) with { Types = [typeB] }); + await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with { Types = [typeA.ToRef()] }); + await Api.CreateVariant(Variant.FromEntries(_variantEntry, otherMainEntry) with { Types = [typeB.ToRef()] }); var entry = await Api.GetEntry(_variantEntryId); entry!.VariantOf.Should().HaveCount(2); diff --git a/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs b/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs index b8b8e51cbd..3fd6e9f9f2 100644 --- a/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs +++ b/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs @@ -819,7 +819,7 @@ private Variant ToVariant(ILexEntry variantEntry, ILexEntryRef variantRef, ILexE MainEntryId = mainEntry.Guid, MainSenseId = mainSense?.Guid, MainHeadword = mainEntry.LexEntryHeadwordOrUnknown(), - Types = [..variantRef.VariantEntryTypesRS.Select(ToVariantType)], + Types = [..variantRef.VariantEntryTypesRS.Select((t, i) => new VariantTypeRef { Id = t.Guid, Order = i + 1 })], // Order indexes from 1, like pictures HideMinorEntry = variantRef.HideMinorEntry != 0, Comment = FromLcmMultiString(variantRef.Summary), }; @@ -1434,7 +1434,7 @@ public Task DeleteVariant(Variant variant) return Task.CompletedTask; } - public Task AddVariantType(Variant variant, Guid variantTypeId) + public Task AddVariantType(Variant variant, Guid variantTypeId, BetweenPosition? position = null) { UndoableUnitOfWorkHelper.DoUsingNewOrCurrentUOW("Add Variant Type", "Remove Variant Type", @@ -1447,7 +1447,7 @@ public Task AddVariantType(Variant variant, Guid variantTypeId) if (entryRef is null) return; var lexEntryType = VariantTypesFlattened.Single(t => t.Guid == variantTypeId); if (entryRef.VariantEntryTypesRS.Contains(lexEntryType)) return; - entryRef.VariantEntryTypesRS.Add(lexEntryType); + entryRef.VariantEntryTypesRS.Insert(PickTypeInsertIndex(entryRef, position), lexEntryType); }); return Task.CompletedTask; } @@ -1469,29 +1469,40 @@ public Task RemoveVariantType(Variant variant, Guid variantTypeId) return Task.CompletedTask; } - public Task SetVariantTypesOrder(Variant variant, IReadOnlyList orderedTypeIds) + public Task MoveVariantType(Variant variant, Guid variantTypeId, BetweenPosition position) { - UndoableUnitOfWorkHelper.DoUsingNewOrCurrentUOW("Reorder Variant Types", - "Revert Variant Types order", + UndoableUnitOfWorkHelper.DoUsingNewOrCurrentUOW("Move Variant Type", + "Move Variant Type back", Cache.ServiceLocator.ActionHandler, () => { if (!EntriesRepository.TryGetObject(variant.VariantEntryId, out var lexVariantEntry)) return; var entryRef = FindVariantRefForUpdate(lexVariantEntry, variant); if (entryRef is null) return; - var orderIds = orderedTypeIds.ToList(); - var ordered = entryRef.VariantEntryTypesRS - .Select((type, index) => (type, index)) - .OrderBy(t => orderIds.IndexOf(t.type.Guid) is var i and >= 0 ? i : int.MaxValue) - .ThenBy(t => t.index) - .Select(t => t.type) - .ToArray(); - if (ordered.SequenceEqual(entryRef.VariantEntryTypesRS)) return; - entryRef.VariantEntryTypesRS.Replace(0, entryRef.VariantEntryTypesRS.Count, ordered); + var lexEntryType = entryRef.VariantEntryTypesRS.SingleOrDefault(t => t.Guid == variantTypeId); + if (lexEntryType is null) return; + entryRef.VariantEntryTypesRS.Remove(lexEntryType); + entryRef.VariantEntryTypesRS.Insert(PickTypeInsertIndex(entryRef, position), lexEntryType); }); return Task.CompletedTask; } + private static int PickTypeInsertIndex(ILexEntryRef entryRef, BetweenPosition? position) + { + var types = entryRef.VariantEntryTypesRS; + if (position?.Previous is { } previousId) + { + var previous = types.FirstOrDefault(t => t.Guid == previousId); + if (previous is not null) return types.IndexOf(previous) + 1; + } + if (position?.Next is { } nextId) + { + var next = types.FirstOrDefault(t => t.Guid == nextId); + if (next is not null) return types.IndexOf(next); + } + return types.Count; + } + /// /// must be called as part of an lcm action /// diff --git a/backend/FwLite/FwDataMiniLcmBridge/Api/UpdateProxy/UpdateVariantProxy.cs b/backend/FwLite/FwDataMiniLcmBridge/Api/UpdateProxy/UpdateVariantProxy.cs index e296bd56b2..aab9d4f79a 100644 --- a/backend/FwLite/FwDataMiniLcmBridge/Api/UpdateProxy/UpdateVariantProxy.cs +++ b/backend/FwLite/FwDataMiniLcmBridge/Api/UpdateProxy/UpdateVariantProxy.cs @@ -39,7 +39,7 @@ public override Guid? MainSenseId set => throw new NotImplementedException(); } - public override List Types + public override List Types { get => throw new NotImplementedException(); set => throw new NotImplementedException(); diff --git a/backend/FwLite/FwLiteProjectSync.Tests/SyncTests.cs b/backend/FwLite/FwLiteProjectSync.Tests/SyncTests.cs index 1abc4ba73c..f743930198 100644 --- a/backend/FwLite/FwLiteProjectSync.Tests/SyncTests.cs +++ b/backend/FwLite/FwLiteProjectSync.Tests/SyncTests.cs @@ -100,7 +100,7 @@ internal static EquivalencyOptions SyncExclusions(EquivalencyOptions diff --git a/backend/FwLite/FwLiteProjectSync.Tests/VariantSyncTests.cs b/backend/FwLite/FwLiteProjectSync.Tests/VariantSyncTests.cs index b9a78f659c..66ac45dde0 100644 --- a/backend/FwLite/FwLiteProjectSync.Tests/VariantSyncTests.cs +++ b/backend/FwLite/FwLiteProjectSync.Tests/VariantSyncTests.cs @@ -81,7 +81,7 @@ public async Task CreatingVariantInFwDataSyncsWithoutIssue() var dialectal = await GetVariantType(fwdataApi, "Dialectal Variant"); await fwdataApi.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with { - Types = [dialectal], + Types = [dialectal.ToRef()], HideMinorEntry = true, Comment = new() { { "en", new RichString("british spelling") } }, }); @@ -113,7 +113,7 @@ public async Task CreatingVariantInCrdtSyncsWithoutIssue() var projectSnapshot = await _fixture.RegenerateAndGetSnapshot(); var spelling = await GetVariantType(crdtApi, "Spelling Variant"); - await crdtApi.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with { Types = [spelling] }); + await crdtApi.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with { Types = [spelling.ToRef()] }); await _syncService.Sync(crdtApi, fwdataApi, projectSnapshot); @@ -184,7 +184,7 @@ public async Task VariantLinkEditsSyncBothWays() var crdtApi = _fixture.CrdtApi; var fwdataApi = _fixture.FwDataApi; var free = await GetVariantType(fwdataApi, "Free Variant"); - var created = await fwdataApi.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with { Types = [free] }); + var created = await fwdataApi.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with { Types = [free.ToRef()] }); await _syncService.Import(crdtApi, fwdataApi); var projectSnapshot = await _fixture.RegenerateAndGetSnapshot(); @@ -218,7 +218,7 @@ public async Task VariantTypeOrderSyncsBothWays() var free = await GetVariantType(fwdataApi, "Free Variant"); var dialectal = await GetVariantType(fwdataApi, "Dialectal Variant"); // deliberately not alphabetical and not creation order: order must come from the ref sequence - await fwdataApi.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with { Types = [free, dialectal] }); + await fwdataApi.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with { Types = [free.ToRef(), dialectal.ToRef()] }); await _syncService.Import(crdtApi, fwdataApi); var projectSnapshot = await _fixture.RegenerateAndGetSnapshot(); diff --git a/backend/FwLite/FwLiteProjectSync.Tests/sena-3-live_snapshot.verified.txt b/backend/FwLite/FwLiteProjectSync.Tests/sena-3-live_snapshot.verified.txt index c3b469f4d4..375788300c 100644 --- a/backend/FwLite/FwLiteProjectSync.Tests/sena-3-live_snapshot.verified.txt +++ b/backend/FwLite/FwLiteProjectSync.Tests/sena-3-live_snapshot.verified.txt @@ -1256,11 +1256,7 @@ "Types": [ { "Id": "bbd4adb3-9af5-4542-94e8-b0932124108b", - "Name": { - "en": "Pronunciation Variant", - "pt": "Variac\u0327a\u0303o da Pronuncia" - }, - "DeletedAt": null + "Order": 0 } ], "HideMinorEntry": false, @@ -24169,11 +24165,7 @@ "Types": [ { "Id": "bbd4adb3-9af5-4542-94e8-b0932124108b", - "Name": { - "en": "Pronunciation Variant", - "pt": "Variac\u0327a\u0303o da Pronuncia" - }, - "DeletedAt": null + "Order": 0 } ], "HideMinorEntry": false, @@ -30827,11 +30819,7 @@ "Types": [ { "Id": "bbd4adb3-9af5-4542-94e8-b0932124108b", - "Name": { - "en": "Pronunciation Variant", - "pt": "Variac\u0327a\u0303o da Pronuncia" - }, - "DeletedAt": null + "Order": 0 } ], "HideMinorEntry": false, @@ -99245,11 +99233,7 @@ "Types": [ { "Id": "0c4663b3-4d9a-47af-b9a1-c8565d8112ed", - "Name": { - "en": "Spelling Variant", - "pt": "Variac\u0327a\u0303o de Soletrac\u0327a\u0303o" - }, - "DeletedAt": null + "Order": 0 } ], "HideMinorEntry": false, @@ -99987,11 +99971,7 @@ "Types": [ { "Id": "0c4663b3-4d9a-47af-b9a1-c8565d8112ed", - "Name": { - "en": "Spelling Variant", - "pt": "Variac\u0327a\u0303o de Soletrac\u0327a\u0303o" - }, - "DeletedAt": null + "Order": 0 } ], "HideMinorEntry": false, @@ -115366,11 +115346,7 @@ "Types": [ { "Id": "bbd4adb3-9af5-4542-94e8-b0932124108b", - "Name": { - "en": "Pronunciation Variant", - "pt": "Variac\u0327a\u0303o da Pronuncia" - }, - "DeletedAt": null + "Order": 0 } ], "HideMinorEntry": false, diff --git a/backend/FwLite/FwLiteProjectSync/DryRunMiniLcmApi.cs b/backend/FwLite/FwLiteProjectSync/DryRunMiniLcmApi.cs index a7de51b727..3265987449 100644 --- a/backend/FwLite/FwLiteProjectSync/DryRunMiniLcmApi.cs +++ b/backend/FwLite/FwLiteProjectSync/DryRunMiniLcmApi.cs @@ -407,7 +407,7 @@ public Task DeleteVariant(Variant variant) return Task.CompletedTask; } - public Task AddVariantType(Variant variant, Guid variantTypeId) + public Task AddVariantType(Variant variant, Guid variantTypeId, BetweenPosition? position = null) { DryRunRecords.Add(new DryRunRecord(nameof(AddVariantType), $"Add variant type {variantTypeId} to variant link {VariantName(variant)}")); return Task.CompletedTask; @@ -419,9 +419,9 @@ public Task RemoveVariantType(Variant variant, Guid variantTypeId) return Task.CompletedTask; } - public Task SetVariantTypesOrder(Variant variant, IReadOnlyList orderedTypeIds) + public Task MoveVariantType(Variant variant, Guid variantTypeId, BetweenPosition position) { - DryRunRecords.Add(new DryRunRecord(nameof(SetVariantTypesOrder), $"Reorder variant types to [{string.Join(", ", orderedTypeIds)}] on variant link {VariantName(variant)}")); + DryRunRecords.Add(new DryRunRecord(nameof(MoveVariantType), $"Move variant type {variantTypeId} on variant link {VariantName(variant)}")); return Task.CompletedTask; } diff --git a/backend/FwLite/FwLiteShared/Services/MiniLcmApiNotifyWrapper.cs b/backend/FwLite/FwLiteShared/Services/MiniLcmApiNotifyWrapper.cs index d7281354e3..e0a6bee82d 100644 --- a/backend/FwLite/FwLiteShared/Services/MiniLcmApiNotifyWrapper.cs +++ b/backend/FwLite/FwLiteShared/Services/MiniLcmApiNotifyWrapper.cs @@ -156,9 +156,9 @@ async Task IMiniLcmWriteApi.DeleteVariant(Variant variant) NotifyEntriesChanged(variant.VariantEntryId, variant.MainEntryId); } - async Task IMiniLcmWriteApi.AddVariantType(Variant variant, Guid variantTypeId) + async Task IMiniLcmWriteApi.AddVariantType(Variant variant, Guid variantTypeId, BetweenPosition? position) { - await _api.AddVariantType(variant, variantTypeId); + await _api.AddVariantType(variant, variantTypeId, position); NotifyEntriesChanged(variant.VariantEntryId, variant.MainEntryId); } @@ -168,9 +168,9 @@ async Task IMiniLcmWriteApi.RemoveVariantType(Variant variant, Guid variantTypeI NotifyEntriesChanged(variant.VariantEntryId, variant.MainEntryId); } - async Task IMiniLcmWriteApi.SetVariantTypesOrder(Variant variant, IReadOnlyList orderedTypeIds) + async Task IMiniLcmWriteApi.MoveVariantType(Variant variant, Guid variantTypeId, BetweenPosition position) { - await _api.SetVariantTypesOrder(variant, orderedTypeIds); + await _api.MoveVariantType(variant, variantTypeId, position); NotifyEntriesChanged(variant.VariantEntryId, variant.MainEntryId); } diff --git a/backend/FwLite/FwLiteShared/TypeGen/ReinforcedFwLiteTypingConfig.cs b/backend/FwLite/FwLiteShared/TypeGen/ReinforcedFwLiteTypingConfig.cs index 7fbeef2a93..07369b053e 100644 --- a/backend/FwLite/FwLiteShared/TypeGen/ReinforcedFwLiteTypingConfig.cs +++ b/backend/FwLite/FwLiteShared/TypeGen/ReinforcedFwLiteTypingConfig.cs @@ -91,6 +91,7 @@ private static void ConfigureMiniLcmTypes(ConfigurationBuilder builder) typeof(Translation), typeof(Picture), + typeof(VariantTypeRef), typeof(MediaFile), typeof(LcmFileMetadata), typeof(ViewField), diff --git a/backend/FwLite/LcmCrdt.Tests/Changes/ChangeDeserializationRegressionData.latest.verified.txt b/backend/FwLite/LcmCrdt.Tests/Changes/ChangeDeserializationRegressionData.latest.verified.txt index 93ea9bb17c..58210a9f79 100644 --- a/backend/FwLite/LcmCrdt.Tests/Changes/ChangeDeserializationRegressionData.latest.verified.txt +++ b/backend/FwLite/LcmCrdt.Tests/Changes/ChangeDeserializationRegressionData.latest.verified.txt @@ -1320,18 +1320,11 @@ "Types": [ { "Id": "d0d4caf3-7fcf-3cca-9044-fd1c8874a40e", - "Name": { - "bge": "Tactics", - "lla": "teal" - }, - "DeletedAt": null + "Order": 0 }, { "Id": "eccfe67c-656e-b7a1-61f8-16fd6115f982", - "Name": { - "mrs": "ability" - }, - "DeletedAt": null + "Order": 0 } ], "HideMinorEntry": true, @@ -1475,16 +1468,56 @@ "EntityId": "696c660f-bc0e-75b2-3dc8-cd549fb77bc0" }, { - "$type": "AddVariantTypeChange", - "VariantType": { - "Id": "c1d3f294-1a67-25b2-5110-864e2debb6bc", - "Name": { - "ggt": "Viaduct" + "$type": "AddVariantChange", + "VariantEntryId": "9805fa15-9b21-ba44-fdfe-7f30340ec5ba", + "MainEntryId": "57e835b1-11dc-5a14-b879-146d94403d5e", + "MainSenseId": "51979c25-0ee3-2256-54c5-72c3d7bc84f8", + "Types": [ + { + "Id": "c58aceb8-ed91-9fd7-f847-25a9bdb2f0a9", + "Order": 0 }, - "DeletedAt": null + { + "Id": "8a7ad5ed-7894-3522-5e59-b05a8c4f5485", + "Order": 0 + } + ], + "HideMinorEntry": true, + "Comment": { + "imy": { + "Spans": [ + { + "Text": "Throughway", + "Ws": "cbc", + "Bold": "Off", + "FontSize": -859798393, + "ForeColor": "#00FFFF", + "Tags": [ + "c03da6a7-04ee-c7e8-648f-22692cd23b05" + ] + } + ] + } }, + "EntityId": "02adb2ec-3fdd-a1c6-6533-66df9a04e307" + }, + { + "$type": "AddVariantTypeChange", + "VariantTypeId": "00000000-0000-0000-0000-000000000000", + "Order": 0, + "Between": null, "EntityId": "0da6b6a5-5e7a-6f91-9610-a62c595dbdfb" }, + { + "$type": "AddVariantTypeChange", + "VariantTypeId": "f2ff124b-ba24-2093-4190-b5cc9cb79316", + "Order": 0.2819482232734233, + "Between": { + "Previous": "27898603-68c3-a90b-a745-0a51749d5d02", + "Next": "62ff5503-bfc8-db10-3c9a-65da49e62388" + }, + "EntityId": "937aef98-bfe8-94b4-eaa3-32f8ae3c92e6" + }, { "$type": "RemoveVariantTypeChange", "VariantTypeId": "33b6d5be-8799-580d-5587-8879e04c8cc9", @@ -1500,11 +1533,9 @@ "EntityId": "6a8e727c-2e47-90af-a1ec-42d94fc3e38e" }, { - "$type": "SetVariantTypesOrderChange", - "OrderedTypeIds": [ - "e767c058-6e6c-ed85-cb16-19506fa41aa8", - "ba0582e4-0f04-b78b-aecd-4eb72567556a" - ], - "EntityId": "6393c7c6-5baa-2966-15d7-b6cd0b7e60ed" + "$type": "ReorderVariantTypeChange", + "VariantTypeId": "9797f4ff-a732-d9da-105b-c4139e8d7dee", + "Order": 0.6680058129866647, + "EntityId": "d887a5b5-f7aa-09ee-5439-84d4090a6216" } ] \ No newline at end of file diff --git a/backend/FwLite/LcmCrdt.Tests/Changes/ChangeDeserializationRegressionData.legacy.verified.txt b/backend/FwLite/LcmCrdt.Tests/Changes/ChangeDeserializationRegressionData.legacy.verified.txt index 19edc4c876..54c82a62a7 100644 --- a/backend/FwLite/LcmCrdt.Tests/Changes/ChangeDeserializationRegressionData.legacy.verified.txt +++ b/backend/FwLite/LcmCrdt.Tests/Changes/ChangeDeserializationRegressionData.legacy.verified.txt @@ -625,5 +625,344 @@ ], "EntityId": "f27a032b-e0f6-f389-b466-959bdb17086d" } + }, + { + "Input": { + "$type": "AddVariantChange", + "VariantEntryId": "6d309276-3cdc-3d59-7564-174855c2a66d", + "MainEntryId": "4ee3936e-f7bb-7bff-43ba-57a83f6e9090", + "MainSenseId": "51be3bfc-8d80-10f3-04a0-2f1b6b02a54a", + "Types": [ + { + "Id": "d0d4caf3-7fcf-3cca-9044-fd1c8874a40e", + "Name": { + "bge": "Tactics", + "lla": "teal" + }, + "DeletedAt": null + }, + { + "Id": "eccfe67c-656e-b7a1-61f8-16fd6115f982", + "Name": { + "mrs": "ability" + }, + "DeletedAt": null + } + ], + "HideMinorEntry": true, + "Comment": { + "dzl": { + "Spans": [ + { + "Text": "Home Loan Account", + "Ws": "tdd", + "Bold": "Invert", + "FontSize": -635375918, + "ForeColor": "#FF0000", + "Tags": [ + "284e5f58-55ce-28ae-b48a-2c683cfb7cd9" + ] + }, + { + "Text": "calculate", + "Ws": "dzl", + "Tags": [ + "f58baf48-036d-457f-a52f-359d4b662ee4" + ] + }, + { + "Text": "XML", + "Ws": "dzl", + "Tags": [ + "6f8f8ed2-6ada-498e-8bbf-1516e1a38946" + ] + } + ] + }, + "poh": { + "Spans": [ + { + "Text": "navigating", + "Ws": "plv", + "Bold": "Invert", + "FontSize": -1766572977, + "ForeColor": "#FF0000", + "Tags": [ + "9a7525d3-a3a0-f5b6-75b8-dcc31842bd4b" + ] + }, + { + "Text": "Buckinghamshire", + "Ws": "poh", + "Tags": [ + "9733340e-a780-4915-9c6e-6a0a773bb624" + ] + }, + { + "Text": "Reactive", + "Ws": "khw", + "Bold": "On", + "FontSize": 217067649, + "ForeColor": "#FF0000", + "Tags": [ + "6590d40b-9c9e-6bf4-022e-cbef362e2539" + ] + }, + { + "Text": "bypassing", + "Ws": "bao", + "Bold": "On", + "FontSize": -1139203638, + "ForeColor": "#00FFFF", + "Tags": [ + "a158092c-95c6-ece7-40f0-245eef31b440" + ] + } + ] + }, + "mto": { + "Spans": [ + { + "Text": "Small Wooden Mouse", + "Ws": "mto", + "Tags": [ + "82ce54e3-899e-49f9-b68e-a32aac910447" + ] + }, + { + "Text": "invoice", + "Ws": "ggo", + "Bold": "Off", + "FontSize": 156095798, + "ForeColor": "#FF0000", + "Tags": [ + "8c03dece-11db-82ec-d8db-7f5b322993eb" + ] + }, + { + "Text": "Square", + "Ws": "mto", + "Tags": [ + "bb75edd3-cfcf-49f2-ac3a-a675fc34068d" + ] + }, + { + "Text": "Borders", + "Ws": "mof", + "Bold": "Off", + "FontSize": 1551749924, + "ForeColor": "#A52A2A", + "Tags": [ + "83245146-9102-463d-6702-9805ecddf9ed" + ] + } + ] + }, + "boj": { + "Spans": [ + { + "Text": "Customer", + "Ws": "boj", + "Tags": [ + "ab794f7a-1958-4c2f-82d8-dd80b331317f" + ] + }, + { + "Text": "Response", + "Ws": "aso", + "Bold": "On", + "FontSize": 745397328, + "ForeColor": "#ADFF2F", + "Tags": [ + "45286390-397e-4f46-c918-fc743707fe27" + ] + }, + { + "Text": "visionary", + "Ws": "boj", + "Tags": [ + "7f95818c-4e9f-4d43-85e4-91e2b1b7d7f6" + ] + } + ] + } + }, + "EntityId": "696c660f-bc0e-75b2-3dc8-cd549fb77bc0" + }, + "Output": { + "$type": "AddVariantChange", + "VariantEntryId": "6d309276-3cdc-3d59-7564-174855c2a66d", + "MainEntryId": "4ee3936e-f7bb-7bff-43ba-57a83f6e9090", + "MainSenseId": "51be3bfc-8d80-10f3-04a0-2f1b6b02a54a", + "Types": [ + { + "Id": "d0d4caf3-7fcf-3cca-9044-fd1c8874a40e", + "Order": 0 + }, + { + "Id": "eccfe67c-656e-b7a1-61f8-16fd6115f982", + "Order": 0 + } + ], + "HideMinorEntry": true, + "Comment": { + "dzl": { + "Spans": [ + { + "Text": "Home Loan Account", + "Ws": "tdd", + "Bold": "Invert", + "FontSize": -635375918, + "ForeColor": "#FF0000", + "Tags": [ + "284e5f58-55ce-28ae-b48a-2c683cfb7cd9" + ] + }, + { + "Text": "calculate", + "Ws": "dzl", + "Tags": [ + "f58baf48-036d-457f-a52f-359d4b662ee4" + ] + }, + { + "Text": "XML", + "Ws": "dzl", + "Tags": [ + "6f8f8ed2-6ada-498e-8bbf-1516e1a38946" + ] + } + ] + }, + "poh": { + "Spans": [ + { + "Text": "navigating", + "Ws": "plv", + "Bold": "Invert", + "FontSize": -1766572977, + "ForeColor": "#FF0000", + "Tags": [ + "9a7525d3-a3a0-f5b6-75b8-dcc31842bd4b" + ] + }, + { + "Text": "Buckinghamshire", + "Ws": "poh", + "Tags": [ + "9733340e-a780-4915-9c6e-6a0a773bb624" + ] + }, + { + "Text": "Reactive", + "Ws": "khw", + "Bold": "On", + "FontSize": 217067649, + "ForeColor": "#FF0000", + "Tags": [ + "6590d40b-9c9e-6bf4-022e-cbef362e2539" + ] + }, + { + "Text": "bypassing", + "Ws": "bao", + "Bold": "On", + "FontSize": -1139203638, + "ForeColor": "#00FFFF", + "Tags": [ + "a158092c-95c6-ece7-40f0-245eef31b440" + ] + } + ] + }, + "mto": { + "Spans": [ + { + "Text": "Small Wooden Mouse", + "Ws": "mto", + "Tags": [ + "82ce54e3-899e-49f9-b68e-a32aac910447" + ] + }, + { + "Text": "invoice", + "Ws": "ggo", + "Bold": "Off", + "FontSize": 156095798, + "ForeColor": "#FF0000", + "Tags": [ + "8c03dece-11db-82ec-d8db-7f5b322993eb" + ] + }, + { + "Text": "Square", + "Ws": "mto", + "Tags": [ + "bb75edd3-cfcf-49f2-ac3a-a675fc34068d" + ] + }, + { + "Text": "Borders", + "Ws": "mof", + "Bold": "Off", + "FontSize": 1551749924, + "ForeColor": "#A52A2A", + "Tags": [ + "83245146-9102-463d-6702-9805ecddf9ed" + ] + } + ] + }, + "boj": { + "Spans": [ + { + "Text": "Customer", + "Ws": "boj", + "Tags": [ + "ab794f7a-1958-4c2f-82d8-dd80b331317f" + ] + }, + { + "Text": "Response", + "Ws": "aso", + "Bold": "On", + "FontSize": 745397328, + "ForeColor": "#ADFF2F", + "Tags": [ + "45286390-397e-4f46-c918-fc743707fe27" + ] + }, + { + "Text": "visionary", + "Ws": "boj", + "Tags": [ + "7f95818c-4e9f-4d43-85e4-91e2b1b7d7f6" + ] + } + ] + } + }, + "EntityId": "696c660f-bc0e-75b2-3dc8-cd549fb77bc0" + } + }, + { + "Input": { + "$type": "AddVariantTypeChange", + "VariantType": { + "Id": "c1d3f294-1a67-25b2-5110-864e2debb6bc", + "Name": { + "ggt": "Viaduct" + }, + "DeletedAt": null + }, + "EntityId": "0da6b6a5-5e7a-6f91-9610-a62c595dbdfb" + }, + "Output": { + "$type": "AddVariantTypeChange", + "VariantTypeId": "00000000-0000-0000-0000-000000000000", + "Order": 0, + "Between": null, + "EntityId": "0da6b6a5-5e7a-6f91-9610-a62c595dbdfb" + } } ] \ No newline at end of file diff --git a/backend/FwLite/LcmCrdt.Tests/Changes/UseChangesTests.cs b/backend/FwLite/LcmCrdt.Tests/Changes/UseChangesTests.cs index 60e9889b25..eccea4a20a 100644 --- a/backend/FwLite/LcmCrdt.Tests/Changes/UseChangesTests.cs +++ b/backend/FwLite/LcmCrdt.Tests/Changes/UseChangesTests.cs @@ -251,14 +251,14 @@ private static IEnumerable GetAllChanges() var addVariantChange = new AddVariantChange(variant); yield return new ChangeWithDependencies(addVariantChange, [createVariantEntryChange, createEntryChange, createSenseChange]); - var addVariantTypeChange = new AddVariantTypeChange(variant.Id, variantType); + var addVariantTypeChange = new AddVariantTypeChange(variant.Id, variantType.ToRef()); yield return new ChangeWithDependencies(addVariantTypeChange, [createVariantType, addVariantChange]); var removeVariantTypeChange = new RemoveVariantTypeChange(variant.Id, variantType.Id); yield return new ChangeWithDependencies(removeVariantTypeChange, [addVariantTypeChange]); - var setVariantTypesOrderChange = new SetVariantTypesOrderChange(variant.Id, [variantType.Id]); - yield return new ChangeWithDependencies(setVariantTypesOrderChange, [addVariantChange]); + var reorderVariantTypeChange = new ReorderVariantTypeChange(variantType.Id, variant.Id, 1.5); + yield return new ChangeWithDependencies(reorderVariantTypeChange, [addVariantChange]); var setSenseOrderChange = new LcmCrdt.Changes.SetOrderChange(sense.Id, 10); yield return new ChangeWithDependencies(setSenseOrderChange, [createSenseChange]); diff --git a/backend/FwLite/LcmCrdt.Tests/Changes/VariantChangeTests.cs b/backend/FwLite/LcmCrdt.Tests/Changes/VariantChangeTests.cs index 50da7cd580..1d25fe829a 100644 --- a/backend/FwLite/LcmCrdt.Tests/Changes/VariantChangeTests.cs +++ b/backend/FwLite/LcmCrdt.Tests/Changes/VariantChangeTests.cs @@ -36,7 +36,7 @@ public async Task AddVariant_CarriesTypesAndScalars() var variant = Variant.FromEntries(variantEntry, mainEntry) with { - Types = [variantType], + Types = [variantType.ToRef()], HideMinorEntry = true, Comment = new() { { "en", new RichString("british spelling") } }, }; @@ -55,7 +55,7 @@ public async Task AddVariant_SkipsDeletedTypes() var variantType = await fixture.Api.CreateVariantType(new VariantType { Id = Guid.NewGuid(), Name = new() { { "en", "doomed" } } }); await fixture.Api.DeleteVariantType(variantType.Id); - var variant = Variant.FromEntries(variantEntry, mainEntry) with { Types = [variantType] }; + var variant = Variant.FromEntries(variantEntry, mainEntry) with { Types = [variantType.ToRef()] }; await fixture.DataModel.AddChange(Guid.NewGuid(), new AddVariantChange(variant)); var link = (await fixture.Api.GetEntry(variantEntry.Id))!.VariantOf.Should().ContainSingle().Subject; @@ -115,7 +115,7 @@ public async Task AddVariantType() await fixture.DataModel.AddChange(Guid.NewGuid(), new AddVariantChange(Variant.FromEntries(variantEntry, mainEntry))); var link = (await fixture.Api.GetEntry(variantEntry.Id))!.VariantOf.Single(); - var change = new AddVariantTypeChange(link.Id, variantType); + var change = new AddVariantTypeChange(link.Id, variantType.ToRef()); await fixture.DataModel.AddChange(Guid.NewGuid(), change); link = (await fixture.Api.GetEntry(variantEntry.Id))!.VariantOf.Single(); @@ -128,7 +128,7 @@ public async Task RemoveVariantType() var (variantEntry, mainEntry) = await CreateEntryPair(); var variantType = await fixture.Api.CreateVariantType(new VariantType { Id = Guid.NewGuid(), Name = new() { { "en", "test" } } }); - await fixture.DataModel.AddChange(Guid.NewGuid(), new AddVariantChange(Variant.FromEntries(variantEntry, mainEntry) with { Types = [variantType] })); + await fixture.DataModel.AddChange(Guid.NewGuid(), new AddVariantChange(Variant.FromEntries(variantEntry, mainEntry) with { Types = [variantType.ToRef()] })); var link = (await fixture.Api.GetEntry(variantEntry.Id))!.VariantOf.Single(); link.Types.Should().ContainSingle(); @@ -139,25 +139,27 @@ public async Task RemoveVariantType() } [Fact] - public async Task SetVariantTypesOrder_ReordersTypesAndMergesWithConcurrentAdd() + public async Task ReorderVariantType_AppliesPerTypeOrderAndSkipsRemovedTypes() { var (variantEntry, mainEntry) = await CreateEntryPair(); var typeA = await fixture.Api.CreateVariantType(new VariantType { Id = Guid.NewGuid(), Name = new() { { "en", "a" } } }); var typeB = await fixture.Api.CreateVariantType(new VariantType { Id = Guid.NewGuid(), Name = new() { { "en", "b" } } }); var typeC = await fixture.Api.CreateVariantType(new VariantType { Id = Guid.NewGuid(), Name = new() { { "en", "c" } } }); - await fixture.DataModel.AddChange(Guid.NewGuid(), new AddVariantChange(Variant.FromEntries(variantEntry, mainEntry) with { Types = [typeA, typeB] })); + await fixture.DataModel.AddChange(Guid.NewGuid(), new AddVariantChange(Variant.FromEntries(variantEntry, mainEntry) with { Types = [typeA.ToRef(), typeB.ToRef()] })); var link = (await fixture.Api.GetEntry(variantEntry.Id))!.VariantOf.Single(); - await fixture.DataModel.AddChange(Guid.NewGuid(), new SetVariantTypesOrderChange(link.Id, [typeB.Id, typeA.Id])); + // move B before A by giving it a smaller order (like ReorderSensePictureChange) + await fixture.DataModel.AddChange(Guid.NewGuid(), new ReorderVariantTypeChange(typeB.Id, link.Id, 0.5)); link = (await fixture.Api.GetEntry(variantEntry.Id))!.VariantOf.Single(); link.Types.Select(t => t.Id).Should().Equal(typeB.Id, typeA.Id); - // a type the reorder never listed (e.g. added concurrently) lands after the listed ones - await fixture.DataModel.AddChange(Guid.NewGuid(), new AddVariantTypeChange(link.Id, typeC)); - await fixture.DataModel.AddChange(Guid.NewGuid(), new SetVariantTypesOrderChange(link.Id, [typeA.Id, typeB.Id])); + // adds append after existing orders; reordering a type removed in the meantime is a no-op + await fixture.DataModel.AddChange(Guid.NewGuid(), new AddVariantTypeChange(link.Id, typeC.ToRef())); + await fixture.DataModel.AddChange(Guid.NewGuid(), new RemoveVariantTypeChange(link.Id, typeA.Id)); + await fixture.DataModel.AddChange(Guid.NewGuid(), new ReorderVariantTypeChange(typeA.Id, link.Id, 10)); link = (await fixture.Api.GetEntry(variantEntry.Id))!.VariantOf.Single(); - link.Types.Select(t => t.Id).Should().Equal(typeA.Id, typeB.Id, typeC.Id); + link.Types.Select(t => t.Id).Should().Equal(typeB.Id, typeC.Id); } [Fact] @@ -166,7 +168,7 @@ public async Task DeletingVariantTypeRemovesItFromLinks() var (variantEntry, mainEntry) = await CreateEntryPair(); var variantType = await fixture.Api.CreateVariantType(new VariantType { Id = Guid.NewGuid(), Name = new() { { "en", "test" } } }); - await fixture.DataModel.AddChange(Guid.NewGuid(), new AddVariantChange(Variant.FromEntries(variantEntry, mainEntry) with { Types = [variantType] })); + await fixture.DataModel.AddChange(Guid.NewGuid(), new AddVariantChange(Variant.FromEntries(variantEntry, mainEntry) with { Types = [variantType.ToRef()] })); await fixture.DataModel.AddChange(Guid.NewGuid(), new DeleteChange(variantType.Id)); var link = (await fixture.Api.GetEntry(variantEntry.Id))!.VariantOf.Should().ContainSingle().Subject; diff --git a/backend/FwLite/LcmCrdt.Tests/Data/SnapshotDeserializationRegressionData.latest.verified.txt b/backend/FwLite/LcmCrdt.Tests/Data/SnapshotDeserializationRegressionData.latest.verified.txt index a5a070732d..2ed5d1339d 100644 --- a/backend/FwLite/LcmCrdt.Tests/Data/SnapshotDeserializationRegressionData.latest.verified.txt +++ b/backend/FwLite/LcmCrdt.Tests/Data/SnapshotDeserializationRegressionData.latest.verified.txt @@ -235,13 +235,7 @@ "Types": [ { "Id": "99ab5593-63d1-ca4f-b979-d5e1af87d1ea", - "Name": { - "mok": "El Salvador", - "trx": "Coordinator", - "duc": "lime", - "xua": "cross-platform" - }, - "DeletedAt": null + "Order": 0 } ], "HideMinorEntry": true, @@ -319,10 +313,7 @@ "Types": [ { "Id": "66c9952f-5b85-39fd-e4f9-cdcc1c69273c", - "Name": { - "nlk": "copy" - }, - "DeletedAt": null + "Order": 0 } ], "HideMinorEntry": false, @@ -428,6 +419,249 @@ "Id": "2e6a7e6c-7abf-cd99-94b0-80c04d315d98", "DeletedAt": null }, + { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "bdd46067-b241-6ec0-af66-bd2d3c0c491d", + "DeletedAt": null, + "LexemeForm": { + "dai": "RAM" + }, + "CitationForm": { + "kxt": "New Jersey", + "gex": "Berkshire", + "cta": "Congolese Franc", + "bsm": "Industrial" + }, + "LiteralMeaning": { + "thk": { + "Spans": [ + { + "Text": "Lead", + "Ws": "thk", + "Tags": [ + "6e799439-0fb2-402c-b9d4-dfdfaa718316" + ] + }, + { + "Text": "Indonesia", + "Ws": "apj", + "Bold": "Off", + "FontSize": 1772223616, + "ForeColor": "#A52A2A", + "Tags": [ + "b5872d68-d3c5-cc16-acd8-690555c608de" + ] + } + ] + }, + "alc": { + "Spans": [ + { + "Text": "San Marino", + "Ws": "hmn", + "Bold": "Off", + "FontSize": -715159885, + "ForeColor": "#00000000", + "Tags": [ + "af4bec12-b0db-5f2f-531c-e8f865ee3ab5" + ] + }, + { + "Text": "virtual", + "Ws": "alc", + "Tags": [ + "e6c2dc70-fab2-4da6-9107-eb9e83e458fe" + ] + }, + { + "Text": "platforms", + "Ws": "alc", + "Tags": [ + "5d18c7d6-4005-4ce1-b8f5-8a68d5882494" + ] + } + ] + } + }, + "MorphType": "PrefixingInterfix", + "HomographNumber": 564558911, + "Senses": [], + "Note": { + "akf": { + "Spans": [ + { + "Text": "Anguilla", + "Ws": "akf", + "Tags": [ + "596554a1-2fb9-408f-b387-f7f60f335ed8" + ] + }, + { + "Text": "neural", + "Ws": "gdi", + "Bold": "Off", + "FontSize": -853779801, + "ForeColor": "#FF0000", + "Tags": [ + "22893e31-4589-4e39-0347-035cc365532f" + ] + } + ] + }, + "tlc": { + "Spans": [ + { + "Text": "Small Rubber Gloves", + "Ws": "tlc", + "Tags": [ + "8809c4ef-d708-49b1-bc9c-be1a416f71d6" + ] + } + ] + }, + "min": { + "Spans": [ + { + "Text": "Garden \u0026 Toys", + "Ws": "ruy", + "Bold": "On", + "FontSize": 33909136, + "ForeColor": "#0000FF", + "Tags": [ + "70f0dfef-a0b9-2e08-761d-e9d5947977a1" + ] + } + ] + } + }, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [ + { + "Id": "0c01b125-d408-1b53-fab0-e2674d0b666f", + "Name": { + "gyy": "PCI", + "tvn": "efficient", + "xgi": "Tactics" + }, + "DeletedAt": null + } + ], + "VariantOf": [ + { + "Id": "1cf86922-dfe1-9e8e-05ba-9c3488702098", + "MaybeId": "1cf86922-dfe1-9e8e-05ba-9c3488702098", + "DeletedAt": null, + "VariantEntryId": "4a72f38b-0006-64de-dcb5-65668f1e71c7", + "VariantHeadword": "Auto Loan Account", + "MainEntryId": "f5988b48-82c6-5e3d-67d1-ebf47cc4a4fb", + "MainSenseId": "7ec06de1-6bc3-d96a-3f39-b3563ff7c45c", + "MainHeadword": "leading-edge", + "Types": [ + { + "Id": "5c821e48-6c81-7f39-358d-dd9ddb539e43", + "Order": 0 + } + ], + "HideMinorEntry": true, + "Comment": { + "caj": { + "Spans": [ + { + "Text": "experiences", + "Ws": "gui", + "Bold": "Invert", + "FontSize": -1255195768, + "ForeColor": "#00000000", + "Tags": [ + "5b407bf1-4b65-cb74-4cac-51351267154f" + ] + }, + { + "Text": "Gorgeous", + "Ws": "apt", + "Bold": "Invert", + "FontSize": 1723188039, + "ForeColor": "#A52A2A", + "Tags": [ + "63738185-882f-5cf1-53da-cc6cf2fa65d8" + ] + }, + { + "Text": "Computers", + "Ws": "vkl", + "Bold": "Invert", + "FontSize": 703778788, + "ForeColor": "#0000FF", + "Tags": [ + "d61f9163-8c8e-49c7-44ec-d074d255bbca" + ] + }, + { + "Text": "navigate", + "Ws": "caj", + "Tags": [ + "34a78807-1870-4d13-ab5c-2ec086e9404f" + ] + } + ] + } + } + } + ], + "Variants": [ + { + "Id": "6d65f7c3-a519-d28b-8461-927c357d31e3", + "MaybeId": "6d65f7c3-a519-d28b-8461-927c357d31e3", + "DeletedAt": null, + "VariantEntryId": "c969a41e-4d51-958b-edca-c970dbf33cf7", + "VariantHeadword": "Plastic", + "MainEntryId": "63d0a6c4-18ff-b7e3-b504-581902f084b1", + "MainSenseId": "9635b92d-4ad0-2cf2-e56f-444504a17c24", + "MainHeadword": "parsing", + "Types": [ + { + "Id": "00103aa5-682b-bf81-2818-387ffb3206d4", + "Order": 0 + } + ], + "HideMinorEntry": false, + "Comment": { + "fom": { + "Spans": [ + { + "Text": "maximize", + "Ws": "gog", + "Bold": "Off", + "FontSize": 683280025, + "ForeColor": "#0000FF", + "Tags": [ + "a5d94ac7-a2fc-3d17-1ec4-9db8ace6119d" + ] + } + ] + } + } + } + ], + "PublishIn": [ + { + "Id": "d6294d44-d7d8-b7a9-8d0d-7ccfddd58723", + "DeletedAt": null, + "IsMain": false, + "Name": { + "ggo": "Nebraska", + "tgn": "Tools", + "pml": "payment" + } + } + ] + }, + "Id": "bdd46067-b241-6ec0-af66-bd2d3c0c491d", + "DeletedAt": null + }, { "$type": "MiniLcmCrdtAdapter", "Obj": { @@ -724,10 +958,7 @@ "Types": [ { "Id": "766ce347-e58e-c772-7e7c-ec5332c5b48b", - "Name": { - "bhh": "Avon" - }, - "DeletedAt": null + "Order": 0 } ], "HideMinorEntry": false, @@ -759,13 +990,7 @@ "Types": [ { "Id": "d5886872-d109-8e7c-21f0-aaac0e8efe15", - "Name": { - "ett": "Berkshire", - "gbn": "Rubber", - "suw": "payment", - "xtu": "paradigm" - }, - "DeletedAt": null + "Order": 0 } ], "HideMinorEntry": true, @@ -869,134 +1094,358 @@ "$type": "MiniLcmCrdtAdapter", "Obj": { "$type": "Entry", - "Id": "82cf7254-3a4f-497a-9e15-7d93fc830356", + "Id": "0132a321-000a-7b2f-73db-f1be33ed94fc", "DeletedAt": null, "LexemeForm": { - "en": "\uD83C\uDF4C", - "th": "\u0E01\u0E25\u0E49\u0E27\u0E22" + "vme": "Gorgeous Frozen Salad", + "gju": "Drives", + "den": "monitor" + }, + "CitationForm": { + "ayn": "back up", + "csa": "Islands", + "cdo": "XSS", + "xmb": "Borders" }, - "CitationForm": {}, "LiteralMeaning": { - "en": { + "bpc": { "Spans": [ { - "Text": "yellow fruit that comes in bunches.", - "Ws": "en" + "Text": "Metal", + "Ws": "bpc", + "Tags": [ + "cdbda8c3-c91d-4d30-be30-775a4cd16e14" + ] } ] } }, - "MorphType": "Stem", - "HomographNumber": 0, + "MorphType": "Root", + "HomographNumber": 981401430, "Senses": [], "Note": { - "en": { - "Spans": [ - { - "Text": "often used in cartoon gags for slipping", - "Ws": "en" - } - ] - } - }, - "Components": [], - "ComplexForms": [], - "ComplexFormTypes": [], - "VariantOf": [], - "Variants": [], - "PublishIn": [] - }, - "Id": "82cf7254-3a4f-497a-9e15-7d93fc830356", - "DeletedAt": null - }, - { - "$type": "MiniLcmCrdtAdapter", - "Obj": { - "$type": "Entry", - "Id": "3cdafca5-46e6-60ed-0b8a-e302d40f7ab8", - "DeletedAt": null, - "LexemeForm": { - "pkt": "reboot" - }, - "CitationForm": { - "bqw": "Auto Loan Account", - "myq": "1080p", - "ula": "Director", - "xwg": "Toys \u0026 Kids" - }, - "LiteralMeaning": { - "hav": { + "kgt": { "Spans": [ { - "Text": "system", - "Ws": "hav", - "Tags": [ - "1d22ad30-96dc-47c3-a7f8-761b3d830b25" - ] - }, - { - "Text": "front-end", - "Ws": "mnw", + "Text": "Buckinghamshire", + "Ws": "kfk", "Bold": "Off", - "FontSize": 1230763621, + "FontSize": 2086849097, "ForeColor": "#00000000", "Tags": [ - "fd1b73bd-ad1b-a20d-c981-905c8823e12c" + "296f9103-3bf5-dcbe-6219-d09d8f89b028" ] }, { - "Text": "Stream", - "Ws": "bve", + "Text": "conglomeration", + "Ws": "dbb", "Bold": "Off", - "FontSize": 621343644, - "ForeColor": "#ADFF2F", + "FontSize": -35226924, + "ForeColor": "#0000FF", "Tags": [ - "aaeeb616-fd0d-f67d-7738-b0d39c4c9512" + "0f1f8a21-720f-337f-9016-38073b61d0af" ] }, { - "Text": "Electronics", - "Ws": "aiy", + "Text": "ivory", + "Ws": "dam", "Bold": "Invert", - "FontSize": 39794053, + "FontSize": -2011323126, "ForeColor": "#A52A2A", "Tags": [ - "7e50c044-9786-1e39-a9ac-92d54342ac3e" - ] - } - ] - }, - "dyr": { - "Spans": [ - { - "Text": "extend", - "Ws": "kve", - "Bold": "Invert", - "FontSize": -422062800, - "ForeColor": "#00FFFF", - "Tags": [ - "b6172c2b-3580-8f98-81c5-4789bb11e455" + "ef6b73a6-b579-d7df-4ef2-3845b7a9890b" ] }, { - "Text": "synthesizing", - "Ws": "aja", + "Text": "systems", + "Ws": "nda", "Bold": "Invert", - "FontSize": 1174438189, - "ForeColor": "#00000000", - "Tags": [ - "41548c3d-3532-3798-84aa-9d40adf93824" - ] - } - ] - }, - "pea": { - "Spans": [ - { - "Text": "back-end", - "Ws": "pea", + "FontSize": 1533867330, + "ForeColor": "#A52A2A", "Tags": [ - "3cb309a7-8115-4482-bfdc-ac8f257eb4ad" + "53dcdb13-5ed6-73fa-91a1-bb390a7b52fd" + ] + } + ] + } + }, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [ + { + "Id": "54621f4d-1dbf-e2ec-e12b-5375ab673613", + "Name": { + "toj": "Director", + "cbh": "Industrial, Games \u0026 Grocery", + "wrx": "iterate", + "bm": "mobile" + }, + "DeletedAt": null + } + ], + "VariantOf": [ + { + "Id": "ea31add3-5c24-0105-d731-9e25b80662c7", + "MaybeId": "ea31add3-5c24-0105-d731-9e25b80662c7", + "DeletedAt": null, + "VariantEntryId": "906e7190-9389-0069-57f0-4f0e1035de79", + "VariantHeadword": "Virgin Islands, British", + "MainEntryId": "e8abc48e-58a5-9ef8-c075-3fdeb77a6d92", + "MainSenseId": "e1f4ed28-004e-10d9-7a57-508c92b775a9", + "MainHeadword": "deliverables", + "Types": [ + { + "Id": "025be8a5-9f9d-6fe8-90e4-22b79c8aa04e", + "Order": 0 + } + ], + "HideMinorEntry": true, + "Comment": { + "spu": { + "Spans": [ + { + "Text": "Product", + "Ws": "bgq", + "Bold": "Invert", + "FontSize": 542210747, + "ForeColor": "#ADFF2F", + "Tags": [ + "15715839-a93e-fa70-a851-3bc4e0da8f92" + ] + }, + { + "Text": "Group", + "Ws": "spu", + "Tags": [ + "395400dd-bd7f-4b70-815a-52143037606e" + ] + }, + { + "Text": "Generic Frozen Salad", + "Ws": "git", + "Bold": "Off", + "FontSize": -1418274581, + "ForeColor": "#ADFF2F", + "Tags": [ + "0c5aa0a3-88d4-aff3-ea13-855960d471e2" + ] + } + ] + } + } + } + ], + "Variants": [ + { + "Id": "8648bcea-fbf0-eef8-03da-33bb627966f4", + "MaybeId": "8648bcea-fbf0-eef8-03da-33bb627966f4", + "DeletedAt": null, + "VariantEntryId": "dda9bead-d072-661e-21fc-23021942b0c2", + "VariantHeadword": "Music", + "MainEntryId": "7a547539-914e-e153-5868-5bdfb22e7b8f", + "MainSenseId": "fbe45581-c050-7505-ea78-4a48625d5999", + "MainHeadword": "hacking", + "Types": [ + { + "Id": "cdafd868-c368-7850-8301-ebc5320f5afd", + "Order": 0 + } + ], + "HideMinorEntry": false, + "Comment": { + "asw": { + "Spans": [ + { + "Text": "infrastructure", + "Ws": "asw", + "Tags": [ + "51a2316f-bd62-4671-bed6-e377d7fb49a9" + ] + } + ] + }, + "tvx": { + "Spans": [ + { + "Text": "back up", + "Ws": "yrm", + "Bold": "On", + "FontSize": 111003924, + "ForeColor": "#00000000", + "Tags": [ + "d5095946-6a33-de66-ee26-7bdb66311865" + ] + }, + { + "Text": "Generic Steel Shirt", + "Ws": "tvx", + "Tags": [ + "a6af31f6-2073-4f64-97fc-70f1eccfa7e1" + ] + }, + { + "Text": "Generic", + "Ws": "spp", + "Bold": "Off", + "FontSize": 804282070, + "ForeColor": "#A52A2A", + "Tags": [ + "440adc8b-a81f-2168-79dc-99fccee190cd" + ] + } + ] + } + } + } + ], + "PublishIn": [ + { + "Id": "913120ec-f0d9-a8e7-b69c-42b22b331322", + "DeletedAt": null, + "IsMain": false, + "Name": { + "tkf": "payment", + "szw": "generating", + "luw": "pink" + } + } + ] + }, + "Id": "0132a321-000a-7b2f-73db-f1be33ed94fc", + "DeletedAt": null + }, + { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "82cf7254-3a4f-497a-9e15-7d93fc830356", + "DeletedAt": null, + "LexemeForm": { + "en": "\uD83C\uDF4C", + "th": "\u0E01\u0E25\u0E49\u0E27\u0E22" + }, + "CitationForm": {}, + "LiteralMeaning": { + "en": { + "Spans": [ + { + "Text": "yellow fruit that comes in bunches.", + "Ws": "en" + } + ] + } + }, + "MorphType": "Stem", + "HomographNumber": 0, + "Senses": [], + "Note": { + "en": { + "Spans": [ + { + "Text": "often used in cartoon gags for slipping", + "Ws": "en" + } + ] + } + }, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], + "PublishIn": [] + }, + "Id": "82cf7254-3a4f-497a-9e15-7d93fc830356", + "DeletedAt": null + }, + { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "3cdafca5-46e6-60ed-0b8a-e302d40f7ab8", + "DeletedAt": null, + "LexemeForm": { + "pkt": "reboot" + }, + "CitationForm": { + "bqw": "Auto Loan Account", + "myq": "1080p", + "ula": "Director", + "xwg": "Toys \u0026 Kids" + }, + "LiteralMeaning": { + "hav": { + "Spans": [ + { + "Text": "system", + "Ws": "hav", + "Tags": [ + "1d22ad30-96dc-47c3-a7f8-761b3d830b25" + ] + }, + { + "Text": "front-end", + "Ws": "mnw", + "Bold": "Off", + "FontSize": 1230763621, + "ForeColor": "#00000000", + "Tags": [ + "fd1b73bd-ad1b-a20d-c981-905c8823e12c" + ] + }, + { + "Text": "Stream", + "Ws": "bve", + "Bold": "Off", + "FontSize": 621343644, + "ForeColor": "#ADFF2F", + "Tags": [ + "aaeeb616-fd0d-f67d-7738-b0d39c4c9512" + ] + }, + { + "Text": "Electronics", + "Ws": "aiy", + "Bold": "Invert", + "FontSize": 39794053, + "ForeColor": "#A52A2A", + "Tags": [ + "7e50c044-9786-1e39-a9ac-92d54342ac3e" + ] + } + ] + }, + "dyr": { + "Spans": [ + { + "Text": "extend", + "Ws": "kve", + "Bold": "Invert", + "FontSize": -422062800, + "ForeColor": "#00FFFF", + "Tags": [ + "b6172c2b-3580-8f98-81c5-4789bb11e455" + ] + }, + { + "Text": "synthesizing", + "Ws": "aja", + "Bold": "Invert", + "FontSize": 1174438189, + "ForeColor": "#00000000", + "Tags": [ + "41548c3d-3532-3798-84aa-9d40adf93824" + ] + } + ] + }, + "pea": { + "Spans": [ + { + "Text": "back-end", + "Ws": "pea", + "Tags": [ + "3cb309a7-8115-4482-bfdc-ac8f257eb4ad" ] } ] @@ -1083,12 +1532,7 @@ "Types": [ { "Id": "54162871-9d18-ad79-b155-ce2f98f97265", - "Name": { - "bwh": "back up", - "xba": "reinvent", - "aza": "Mews" - }, - "DeletedAt": null + "Order": 0 } ], "HideMinorEntry": false, @@ -1193,11 +1637,7 @@ "Types": [ { "Id": "aa41d766-846e-2d53-cebd-50ca612bd6de", - "Name": { - "pxm": "magenta", - "lmi": "database" - }, - "DeletedAt": null + "Order": 0 } ], "HideMinorEntry": false, @@ -1295,55 +1735,413 @@ "$type": "MiniLcmCrdtAdapter", "Obj": { "$type": "Entry", - "Id": "8dbc0f41-998e-836a-97e1-f05d46d95c92", + "Id": "e936f386-9032-7e62-a3c8-dd40ef2a5cc3", "DeletedAt": null, "LexemeForm": { - "mqs": "maximized" + "prt": "disintermediate", + "osx": "overriding", + "pup": "District" }, "CitationForm": { - "nrz": "Portugal" + "nza": "Legacy", + "drr": "Road" }, "LiteralMeaning": { - "juy": { + "bjc": { "Spans": [ { - "Text": "Kyat", - "Ws": "juy", - "Tags": [ - "bc47798c-6e35-430e-a94a-2d1aa82d9119" - ] - }, - { - "Text": "synthesize", - "Ws": "juy", + "Text": "matrix", + "Ws": "bjc", "Tags": [ - "75fc659a-ae47-45ec-87a8-2475d5667496" + "dc481963-be8d-4997-9b23-06ab5a2b8425" ] } ] }, - "rer": { + "cma": { "Spans": [ { - "Text": "Licensed", - "Ws": "rer", + "Text": "Optimization", + "Ws": "cma", "Tags": [ - "adf734b1-3abb-4644-a5b7-e712c29a59e6" + "d30382c1-84fd-4bb3-9620-b5b885bb99f6" ] }, { - "Text": "architectures", - "Ws": "dos", - "Bold": "On", - "FontSize": -1392951304, - "ForeColor": "#ADFF2F", + "Text": "actuating", + "Ws": "vkl", + "Bold": "Off", + "FontSize": 151696247, + "ForeColor": "#00000000", "Tags": [ - "b316a4f4-208a-e75f-13f0-09a91a2b3506" + "c3646339-85df-85fb-2925-2fe71ee19c22" ] } ] - }, - "zpa": { + } + }, + "MorphType": "Circumfix", + "HomographNumber": 656572030, + "Senses": [], + "Note": { + "lhs": { + "Spans": [ + { + "Text": "killer", + "Ws": "umo", + "Bold": "On", + "FontSize": -579322462, + "ForeColor": "#A52A2A", + "Tags": [ + "074ea590-7453-827f-9fec-d00ea65c9d79" + ] + }, + { + "Text": "Plastic", + "Ws": "jda", + "Bold": "Invert", + "FontSize": 1385890849, + "ForeColor": "#00000000", + "Tags": [ + "8d43e07f-4aa7-8e9e-96f8-2dbfdde36fcb" + ] + }, + { + "Text": "visualize", + "Ws": "lhs", + "Tags": [ + "d956ec3a-6be7-471f-9b5e-7a22ba6ea556" + ] + }, + { + "Text": "Persevering", + "Ws": "lhs", + "Tags": [ + "5b8a01d6-e8d0-4134-9f4b-9bbff64cf5a9" + ] + } + ] + } + }, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [ + { + "Id": "d36df452-a20e-db63-4d84-996e24f44a0e", + "Name": { + "asu": "auxiliary", + "blj": "1080p" + }, + "DeletedAt": null + } + ], + "VariantOf": [ + { + "Id": "3e508283-d75b-657f-7be6-ae374ca3ef80", + "MaybeId": "3e508283-d75b-657f-7be6-ae374ca3ef80", + "DeletedAt": null, + "VariantEntryId": "3547d504-bb41-faa8-622f-4fede7139d70", + "VariantHeadword": "IB", + "MainEntryId": "7b0fd61d-16ce-73f0-738f-09882ec38e4c", + "MainSenseId": "d86fbe4b-ff5c-8b6c-493a-49b502c4c528", + "MainHeadword": "Response", + "Types": [ + { + "Id": "6ce64099-e9fa-d1f1-6b1e-d8568a885b5a", + "Order": 0 + } + ], + "HideMinorEntry": true, + "Comment": { + "cpa": { + "Spans": [ + { + "Text": "initiatives", + "Ws": "cpa", + "Tags": [ + "635436be-8efe-4910-acba-f1864184aef9" + ] + }, + { + "Text": "Investment Account", + "Ws": "cpa", + "Tags": [ + "0a00b46f-e8d7-45c8-804f-673ab22fbc0c" + ] + } + ] + }, + "tdv": { + "Spans": [ + { + "Text": "Romania", + "Ws": "tdv", + "Tags": [ + "4344e8c1-58d8-471f-8f42-37ee410a1daf" + ] + }, + { + "Text": "Ergonomic Cotton Shirt", + "Ws": "ktv", + "Bold": "Off", + "FontSize": 216910064, + "ForeColor": "#ADFF2F", + "Tags": [ + "a2b2547c-6bac-ef7a-d749-9a4b45f5c1f5" + ] + } + ] + }, + "pnv": { + "Spans": [ + { + "Text": "Accounts", + "Ws": "tun", + "Bold": "Invert", + "FontSize": -592436340, + "ForeColor": "#00FFFF", + "Tags": [ + "eadebf0b-fdd3-81fb-ba3b-d6ed3f9cbb8b" + ] + } + ] + } + } + } + ], + "Variants": [ + { + "Id": "1b1e4ab9-87e3-b752-8e57-145eeb835d68", + "MaybeId": "1b1e4ab9-87e3-b752-8e57-145eeb835d68", + "DeletedAt": null, + "VariantEntryId": "194e6f05-2c34-bed8-9b08-927e0292fc0b", + "VariantHeadword": "Vermont", + "MainEntryId": "a987b93c-0fac-21a7-a831-a5d5631a76f1", + "MainSenseId": "a55b5275-3ce2-5e15-22b8-d41377226248", + "MainHeadword": "invoice", + "Types": [ + { + "Id": "66c9a7f0-9705-c893-936d-5554e351d3e7", + "Order": 0 + } + ], + "HideMinorEntry": true, + "Comment": { + "wkw": { + "Spans": [ + { + "Text": "framework", + "Ws": "wkw", + "Tags": [ + "49b8946b-bded-414a-b7a6-0d664131c57a" + ] + }, + { + "Text": "User-friendly", + "Ws": "wkw", + "Tags": [ + "4e05f083-4c57-4979-ae07-14e33ac217b2" + ] + }, + { + "Text": "Tasty", + "Ws": "bfy", + "Bold": "On", + "FontSize": 1203788073, + "ForeColor": "#00FFFF", + "Tags": [ + "2b3706f2-a073-a478-2e96-fe90202fff76" + ] + }, + { + "Text": "Realigned", + "Ws": "wkw", + "Tags": [ + "b9ab855c-7334-4443-a262-2dc30aad625f" + ] + } + ] + }, + "wmm": { + "Spans": [ + { + "Text": "quantify", + "Ws": "wmm", + "Tags": [ + "f06eeed9-1d8f-4f20-ae2c-1dffc71a4dd6" + ] + }, + { + "Text": "alarm", + "Ws": "wmm", + "Tags": [ + "3c9d4436-b1e6-4890-b9d7-20062825a0c4" + ] + }, + { + "Text": "EXE", + "Ws": "gog", + "Bold": "Invert", + "FontSize": -2061218357, + "ForeColor": "#A52A2A", + "Tags": [ + "0be1a80d-9540-72b0-aa69-4f713cf72567" + ] + }, + { + "Text": "sexy", + "Ws": "wsu", + "Bold": "Off", + "FontSize": -1914047033, + "ForeColor": "#FF0000", + "Tags": [ + "34afe514-5f5d-2648-dc25-77716f6933d7" + ] + } + ] + }, + "atw": { + "Spans": [ + { + "Text": "Product", + "Ws": "nyg", + "Bold": "On", + "FontSize": 74944044, + "ForeColor": "#ADFF2F", + "Tags": [ + "ccb640fc-50cf-4d19-54fa-024d4340bb66" + ] + }, + { + "Text": "Square", + "Ws": "gae", + "Bold": "On", + "FontSize": -3467759, + "ForeColor": "#ADFF2F", + "Tags": [ + "4f4cf773-2b03-be7f-9551-61e3e6329b22" + ] + }, + { + "Text": "Switchable", + "Ws": "njo", + "Bold": "Invert", + "FontSize": -622583718, + "ForeColor": "#FF0000", + "Tags": [ + "283936e8-a1bb-e149-4af7-e13d105678bb" + ] + } + ] + }, + "oyy": { + "Spans": [ + { + "Text": "virtual", + "Ws": "bfh", + "Bold": "Off", + "FontSize": 62345529, + "ForeColor": "#ADFF2F", + "Tags": [ + "26af9b7b-0bb4-e1c3-cc24-3035ec8392cf" + ] + }, + { + "Text": "Investment Account", + "Ws": "oyy", + "Tags": [ + "7334e346-da5e-4638-9f03-d81ecfe0399e" + ] + }, + { + "Text": "Yemen", + "Ws": "buj", + "Bold": "Invert", + "FontSize": -872764607, + "ForeColor": "#0000FF", + "Tags": [ + "1dd969b0-96ee-b282-541d-3e678ae0f407" + ] + }, + { + "Text": "invoice", + "Ws": "oyy", + "Tags": [ + "a9a80e50-2411-463f-9ce5-6ccf07bbea1a" + ] + } + ] + } + } + } + ], + "PublishIn": [ + { + "Id": "190e8c3d-06ce-388d-3273-5a2d534e409a", + "DeletedAt": null, + "IsMain": false, + "Name": { + "nmv": "Implemented" + } + } + ] + }, + "Id": "e936f386-9032-7e62-a3c8-dd40ef2a5cc3", + "DeletedAt": null + }, + { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "8dbc0f41-998e-836a-97e1-f05d46d95c92", + "DeletedAt": null, + "LexemeForm": { + "mqs": "maximized" + }, + "CitationForm": { + "nrz": "Portugal" + }, + "LiteralMeaning": { + "juy": { + "Spans": [ + { + "Text": "Kyat", + "Ws": "juy", + "Tags": [ + "bc47798c-6e35-430e-a94a-2d1aa82d9119" + ] + }, + { + "Text": "synthesize", + "Ws": "juy", + "Tags": [ + "75fc659a-ae47-45ec-87a8-2475d5667496" + ] + } + ] + }, + "rer": { + "Spans": [ + { + "Text": "Licensed", + "Ws": "rer", + "Tags": [ + "adf734b1-3abb-4644-a5b7-e712c29a59e6" + ] + }, + { + "Text": "architectures", + "Ws": "dos", + "Bold": "On", + "FontSize": -1392951304, + "ForeColor": "#ADFF2F", + "Tags": [ + "b316a4f4-208a-e75f-13f0-09a91a2b3506" + ] + } + ] + }, + "zpa": { "Spans": [ { "Text": "Concrete", @@ -1718,11 +2516,7 @@ "Types": [ { "Id": "47b33565-0be3-32c4-e0ad-348f191b6763", - "Name": { - "tto": "Function-based", - "mln": "Toys \u0026 Health" - }, - "DeletedAt": null + "Order": 0 } ], "HideMinorEntry": false, @@ -1848,11 +2642,7 @@ "Types": [ { "Id": "0bc3123f-673b-215f-1f24-5fae892969ee", - "Name": { - "blb": "calculating", - "rga": "Awesome Metal Chicken" - }, - "DeletedAt": null + "Order": 0 } ], "HideMinorEntry": true, @@ -1940,7 +2730,343 @@ "$type": "MiniLcmCrdtAdapter", "Obj": { "$type": "Entry", - "Id": "84bb5f48-b2a9-d0c8-85ee-aec9203830ee", + "Id": "13fa1e11-0234-5bdb-28ab-a24129d77d4a", + "DeletedAt": null, + "LexemeForm": { + "zmw": "Optimization" + }, + "CitationForm": { + "gct": "redundant" + }, + "LiteralMeaning": { + "bkg": { + "Spans": [ + { + "Text": "invoice", + "Ws": "apm", + "Bold": "On", + "FontSize": -692528392, + "ForeColor": "#00FFFF", + "Tags": [ + "5d5eaaef-04ab-2beb-dcf0-58fda677de3e" + ] + } + ] + }, + "bpn": { + "Spans": [ + { + "Text": "Fresh", + "Ws": "bpn", + "Tags": [ + "7b1a3a68-3024-4cc0-99ea-2a8e7395a9bf" + ] + } + ] + } + }, + "MorphType": "InfixingInterfix", + "HomographNumber": 2100626761, + "Senses": [], + "Note": { + "kif": { + "Spans": [ + { + "Text": "facilitate", + "Ws": "thd", + "Bold": "Invert", + "FontSize": -1190179128, + "ForeColor": "#0000FF", + "Tags": [ + "f99d1c87-a4b9-2916-9188-d0621c3520f1" + ] + } + ] + }, + "pda": { + "Spans": [ + { + "Text": "Unbranded Wooden Fish", + "Ws": "pda", + "Tags": [ + "9229649a-fbcd-4fac-9bc9-fe8586c64b15" + ] + }, + { + "Text": "Devolved", + "Ws": "cuh", + "Bold": "Off", + "FontSize": 1018345024, + "ForeColor": "#00000000", + "Tags": [ + "ffc1984b-447c-f07e-f282-d85dbcfb4a99" + ] + }, + { + "Text": "next generation", + "Ws": "cur", + "Bold": "On", + "FontSize": -217767038, + "ForeColor": "#A52A2A", + "Tags": [ + "ff8d7538-1b11-4e48-bd46-91a32251fe19" + ] + } + ] + }, + "pei": { + "Spans": [ + { + "Text": "time-frame", + "Ws": "mtp", + "Bold": "Invert", + "FontSize": -868964605, + "ForeColor": "#FF0000", + "Tags": [ + "2f48d6d9-d1f7-3f96-0560-a79727b151d7" + ] + }, + { + "Text": "payment", + "Ws": "hol", + "Bold": "On", + "FontSize": -145528187, + "ForeColor": "#0000FF", + "Tags": [ + "d920206a-83c7-1484-3ae8-d746c0ba7fde" + ] + }, + { + "Text": "Principal", + "Ws": "nkn", + "Bold": "Off", + "FontSize": 1298260185, + "ForeColor": "#00FFFF", + "Tags": [ + "a4c160a8-1658-bfeb-982f-9fdb7f57eaf2" + ] + } + ] + }, + "alj": { + "Spans": [ + { + "Text": "Small Cotton Fish", + "Ws": "zmy", + "Bold": "On", + "FontSize": 135804688, + "ForeColor": "#00FFFF", + "Tags": [ + "c8c0f7c1-70f4-acf0-8b2e-11ce56b0231c" + ] + } + ] + } + }, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [ + { + "Id": "ae1651c6-8b06-3684-0050-757c236e99d7", + "Name": { + "tbb": "panel" + }, + "DeletedAt": null + } + ], + "VariantOf": [ + { + "Id": "18fc7471-6873-d897-a6d0-360f2cf23f9c", + "MaybeId": "18fc7471-6873-d897-a6d0-360f2cf23f9c", + "DeletedAt": null, + "VariantEntryId": "0a861b72-da42-074b-4873-93346ac3b1a6", + "VariantHeadword": "invoice", + "MainEntryId": "1463a246-6429-e143-80bb-de5e5770e30b", + "MainSenseId": "42f066a3-80c6-0481-5b8d-fdfcadbba20f", + "MainHeadword": "Right-sized", + "Types": [ + { + "Id": "c4ae58e9-d8d0-c1d1-8289-814fb2f52f49", + "Order": 0 + } + ], + "HideMinorEntry": false, + "Comment": { + "zkd": { + "Spans": [ + { + "Text": "Response", + "Ws": "shp", + "Bold": "Off", + "FontSize": 902619071, + "ForeColor": "#00000000", + "Tags": [ + "afc5d59e-a299-c9ad-6ec6-7e2cecb91767" + ] + }, + { + "Text": "Assistant", + "Ws": "bkc", + "Bold": "Invert", + "FontSize": 408398614, + "ForeColor": "#A52A2A", + "Tags": [ + "79659971-d711-b729-f390-faf6d8004cf1" + ] + } + ] + }, + "btj": { + "Spans": [ + { + "Text": "communities", + "Ws": "btj", + "Tags": [ + "3debdf60-0654-4d1c-9bc2-a7babf86960c" + ] + }, + { + "Text": "Fork", + "Ws": "btj", + "Tags": [ + "608c1aa6-f636-452e-b932-d7f740a08442" + ] + } + ] + }, + "kmu": { + "Spans": [ + { + "Text": "salmon", + "Ws": "brl", + "Bold": "Off", + "FontSize": 828195914, + "ForeColor": "#ADFF2F", + "Tags": [ + "f416cb0e-487b-6111-26e7-4781ff5d3b5e" + ] + }, + { + "Text": "transparent", + "Ws": "kmu", + "Tags": [ + "689d4955-9a38-4033-97dd-7eb30f700470" + ] + }, + { + "Text": "Plastic", + "Ws": "kmu", + "Tags": [ + "d7a6aa2f-1bd4-477c-8ed8-570d6818493a" + ] + } + ] + }, + "bna": { + "Spans": [ + { + "Text": "Dynamic", + "Ws": "bxn", + "Bold": "Invert", + "FontSize": 2016153015, + "ForeColor": "#00FFFF", + "Tags": [ + "d661beb5-cc5a-e234-831c-8711243d4c44" + ] + }, + { + "Text": "Plastic", + "Ws": "bna", + "Tags": [ + "3d0cf926-c131-4594-9cb6-7b7c45514316" + ] + }, + { + "Text": "Virtual", + "Ws": "ono", + "Bold": "On", + "FontSize": 1934268958, + "ForeColor": "#00000000", + "Tags": [ + "2d96c8b6-e787-03ff-ad6f-3941060af772" + ] + }, + { + "Text": "Fully-configurable", + "Ws": "bna", + "Tags": [ + "df052fd7-7e05-4385-91ce-90dfe288ac41" + ] + } + ] + } + } + } + ], + "Variants": [ + { + "Id": "0247e375-d622-c68b-86d8-f1348780b95c", + "MaybeId": "0247e375-d622-c68b-86d8-f1348780b95c", + "DeletedAt": null, + "VariantEntryId": "1a97fdd4-06eb-6e14-d5c6-db569a849461", + "VariantHeadword": "back-end", + "MainEntryId": "b3eb0290-6b68-1171-fd39-c4aa38ead658", + "MainSenseId": "01777940-7873-0f6c-72b7-d4a59dd0bef1", + "MainHeadword": "systems", + "Types": [ + { + "Id": "24cd113e-bd8d-ca63-db48-148c8248c0d4", + "Order": 0 + } + ], + "HideMinorEntry": false, + "Comment": { + "blt": { + "Spans": [ + { + "Text": "Incredible Steel Pants", + "Ws": "blt", + "Tags": [ + "b4435b98-a7ec-4030-a700-8985c3e04fec" + ] + }, + { + "Text": "Regional", + "Ws": "hwc", + "Bold": "Off", + "FontSize": 1430375783, + "ForeColor": "#A52A2A", + "Tags": [ + "ebd58352-287a-3359-0eca-2924cceb8a7b" + ] + } + ] + } + } + } + ], + "PublishIn": [ + { + "Id": "95b4fb55-b68c-8696-b8df-059b65912baf", + "DeletedAt": null, + "IsMain": false, + "Name": { + "mil": "Agent", + "huq": "Hryvnia", + "mkx": "input", + "gko": "Officer" + } + } + ] + }, + "Id": "13fa1e11-0234-5bdb-28ab-a24129d77d4a", + "DeletedAt": null + }, + { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "84bb5f48-b2a9-d0c8-85ee-aec9203830ee", "DeletedAt": null, "LexemeForm": { "dkk": "Product" @@ -2196,12 +3322,7 @@ "Types": [ { "Id": "9b171c50-74e6-0153-0532-9e150820fd84", - "Name": { - "daa": "next-generation", - "tzh": "Credit Card Account", - "soo": "Orchestrator" - }, - "DeletedAt": null + "Order": 0 } ], "HideMinorEntry": true, @@ -2326,12 +3447,7 @@ "Types": [ { "Id": "39b5de5d-fc3e-6516-2ac5-fbdde15e8d90", - "Name": { - "ygi": "Granite", - "ihp": "Small Granite Salad", - "bzx": "Avon" - }, - "DeletedAt": null + "Order": 0 } ], "HideMinorEntry": true, @@ -2438,165 +3554,861 @@ "$type": "MiniLcmCrdtAdapter", "Obj": { "$type": "Entry", - "Id": "249c38f3-fc0d-195f-7533-97e8c140d0d7", - "DeletedAt": null, - "LexemeForm": { - "kvj": "Florida" - }, - "CitationForm": null, - "LiteralMeaning": null, - "MorphType": "Prefix", - "HomographNumber": 4, - "Senses": [], - "Note": null, - "Components": [], - "ComplexForms": [], - "ComplexFormTypes": [], - "VariantOf": [], - "Variants": [], - "PublishIn": [] - }, - "Id": "249c38f3-fc0d-195f-7533-97e8c140d0d7", - "DeletedAt": null - }, - { - "$type": "MiniLcmCrdtAdapter", - "Obj": { - "$type": "Entry", - "Id": "c3c7439d-8508-897d-ec90-dfb8c6233f52", + "Id": "4e0f980f-0398-419e-9490-3b4575dc20bb", "DeletedAt": null, "LexemeForm": { - "sbf": "Triple-buffered", - "nuo": "clear-thinking", - "ewo": "modular" + "cub": "Investment Account", + "sls": "Music" }, "CitationForm": { - "mzp": "Rial Omani" + "aun": "Intelligent Frozen Sausages", + "vnm": "Soft", + "gsw": "Handcrafted" }, "LiteralMeaning": { - "mku": { + "asu": { "Spans": [ { - "Text": "holistic", - "Ws": "mku", + "Text": "Sleek", + "Ws": "szg", + "Bold": "Off", + "FontSize": 1306118831, + "ForeColor": "#ADFF2F", "Tags": [ - "9350e875-0918-4188-8b80-e94b87a852bf" + "f3f6a75e-9979-8348-499e-d5ec7c16426c" ] }, { - "Text": "Oklahoma", - "Ws": "bnx", - "Bold": "On", - "FontSize": 1103510228, - "ForeColor": "#FF0000", - "Tags": [ - "ed09f714-b175-6596-9983-16cdf0cf34d8" - ] - }, - { - "Text": "Handcrafted", - "Ws": "mku", + "Text": "turn-key", + "Ws": "asu", "Tags": [ - "182d16db-157e-4fbc-9d8d-fb3df1acc534" + "5db3b92a-b72b-4a18-be40-fa400dd977c5" ] } ] }, - "kdr": { + "nts": { "Spans": [ { - "Text": "Liaison", - "Ws": "kdr", + "Text": "users", + "Ws": "nts", "Tags": [ - "f526be31-e1dc-4710-b90d-0c747d57434f" + "f1b9b483-3137-4c93-9426-03321adb7fc7" + ] + }, + { + "Text": "Colorado", + "Ws": "nts", + "Tags": [ + "93cbaee7-2fa8-4ee6-981c-add7f07081f7" ] } ] } }, - "MorphType": "Prefix", - "HomographNumber": -1630247524, + "MorphType": "Circumfix", + "HomographNumber": 150082865, "Senses": [], "Note": { - "crv": { + "hav": { "Spans": [ { - "Text": "Isle of Man", - "Ws": "crv", + "Text": "Licensed Frozen Keyboard", + "Ws": "bui", + "Bold": "Invert", + "FontSize": -611899668, + "ForeColor": "#ADFF2F", "Tags": [ - "7bde6377-d4cb-49ae-9803-86cd678d56d7" + "14a588ea-5151-5033-4015-cba533ff0a58" ] }, { - "Text": "projection", - "Ws": "crv", + "Text": "Japan", + "Ws": "hav", "Tags": [ - "764ca726-5a42-499a-8965-0da244a52a6a" + "b64bdcc0-93be-453f-a794-38e6f4204fbd" ] }, { - "Text": "transmitting", - "Ws": "hnn", - "Bold": "Off", - "FontSize": -1687247291, - "ForeColor": "#ADFF2F", + "Text": "vortals", + "Ws": "hav", "Tags": [ - "54262fd2-0ed1-d0ec-59b2-c2ade27b2a03" + "3dc693f4-76b5-4944-a9be-816b3819f72e" ] } ] - }, - "gnw": { - "Spans": [ + } + }, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [ + { + "Id": "0fea6260-1737-b673-49cb-a5383cab8285", + "Name": { + "uro": "hack", + "mih": "Auto Loan Account", + "agr": "deposit" + }, + "DeletedAt": null + } + ], + "VariantOf": [ + { + "Id": "9e18a394-e0c2-e1e8-b7bd-fe96f83762a2", + "MaybeId": "9e18a394-e0c2-e1e8-b7bd-fe96f83762a2", + "DeletedAt": null, + "VariantEntryId": "2c6f6d89-aafd-0380-12d8-bfd34fb4bff0", + "VariantHeadword": "array", + "MainEntryId": "c4477899-b6d4-e53b-d9d7-61acbe8e8d90", + "MainSenseId": "ece48418-d000-3a6b-9b10-64d92eb5ff36", + "MainHeadword": "Producer", + "Types": [ { - "Text": "Neck", - "Ws": "bvo", - "Bold": "Off", - "FontSize": -990208762, + "Id": "6f234f8a-8130-1d6e-6f96-24c0c6430e39", + "Order": 0 + } + ], + "HideMinorEntry": false, + "Comment": { + "zeg": { + "Spans": [ + { + "Text": "Island", + "Ws": "gog", + "Bold": "On", + "FontSize": -1239030349, + "ForeColor": "#00000000", + "Tags": [ + "c8998f3d-0288-0434-858b-f6732e575232" + ] + } + ] + }, + "aa": { + "Spans": [ + { + "Text": "Fantastic Steel Mouse", + "Ws": "gmb", + "Bold": "On", + "FontSize": -1578336404, + "ForeColor": "#ADFF2F", + "Tags": [ + "4721f4df-20aa-96bc-37a8-0a09c19a19ad" + ] + }, + { + "Text": "robust", + "Ws": "myk", + "Bold": "On", + "FontSize": -532082043, + "ForeColor": "#00FFFF", + "Tags": [ + "29829000-fadb-f656-96be-79d206915891" + ] + }, + { + "Text": "Wooden", + "Ws": "aa", + "Tags": [ + "12f0410f-7be5-488b-9c46-5868117dfc49" + ] + }, + { + "Text": "Fresh", + "Ws": "aa", + "Tags": [ + "7fe3111b-b96d-4ca4-9b19-b0a66f98af49" + ] + } + ] + }, + "pib": { + "Spans": [ + { + "Text": "Rubber", + "Ws": "ncl", + "Bold": "Invert", + "FontSize": -1956993520, + "ForeColor": "#A52A2A", + "Tags": [ + "90af4d41-cdac-8a32-8e72-a3f2bdb69127" + ] + }, + { + "Text": "Intelligent", + "Ws": "pib", + "Tags": [ + "03259368-b3c6-4248-8fd4-4874870f7b44" + ] + }, + { + "Text": "Investor", + "Ws": "pib", + "Tags": [ + "ceffe1ac-68c7-4fa2-9e75-dba0ae42a558" + ] + }, + { + "Text": "Avon", + "Ws": "end", + "Bold": "Off", + "FontSize": 1376219199, + "ForeColor": "#FF0000", + "Tags": [ + "f0bd8d2f-87f6-7b30-ea52-38378d268979" + ] + } + ] + }, + "wlk": { + "Spans": [ + { + "Text": "Fantastic Frozen Hat", + "Ws": "xga", + "Bold": "Invert", + "FontSize": 1103054688, + "ForeColor": "#A52A2A", + "Tags": [ + "848cabf7-c3fe-2991-b5e4-f2a1e576af5f" + ] + }, + { + "Text": "mobile", + "Ws": "bdf", + "Bold": "Invert", + "FontSize": -1614846263, + "ForeColor": "#00000000", + "Tags": [ + "1ceb39d2-69ae-2678-c6e1-f13f5b43097e" + ] + } + ] + } + } + } + ], + "Variants": [ + { + "Id": "e3742581-1647-89a9-842e-af42deafdaf8", + "MaybeId": "e3742581-1647-89a9-842e-af42deafdaf8", + "DeletedAt": null, + "VariantEntryId": "533055cd-e129-3508-1e4f-bf9acda8f179", + "VariantHeadword": "Handmade Steel Shoes", + "MainEntryId": "0f9233cd-fcad-b837-e519-2ef630e2a851", + "MainSenseId": "e4c04361-58a2-28c2-d64e-1a2bddf96591", + "MainHeadword": "Investment Account", + "Types": [ + { + "Id": "a5642da2-ed11-5ddc-fbd3-a503043b14bd", + "Order": 0 + } + ], + "HideMinorEntry": true, + "Comment": { + "onk": { + "Spans": [ + { + "Text": "pricing structure", + "Ws": "onk", + "Tags": [ + "e8a203fb-c0ed-4e8e-878d-0286c1e2f241" + ] + } + ] + }, + "lkn": { + "Spans": [ + { + "Text": "Virtual", + "Ws": "lkn", + "Tags": [ + "f566e36c-fd3e-47f5-8636-9d4161535afd" + ] + }, + { + "Text": "Generic", + "Ws": "lkn", + "Tags": [ + "ec1f0ffc-5076-4d95-a465-51ea67d4a40e" + ] + }, + { + "Text": "Awesome", + "Ws": "uan", + "Bold": "On", + "FontSize": 1832230526, + "ForeColor": "#00FFFF", + "Tags": [ + "fcaf30a3-255a-dbf9-49c8-975262767c99" + ] + }, + { + "Text": "Fresh", + "Ws": "lkn", + "Tags": [ + "97b29fa4-82b9-4df4-8c94-8aad968e9d92" + ] + } + ] + }, + "ymp": { + "Spans": [ + { + "Text": "algorithm", + "Ws": "ymp", + "Tags": [ + "abf2871f-7e9d-4c9c-8fb8-81070fe1c1d5" + ] + }, + { + "Text": "Metrics", + "Ws": "ymp", + "Tags": [ + "895afebe-9b02-48b9-99f1-b461b4cf2dbe" + ] + }, + { + "Text": "Rustic", + "Ws": "ymp", + "Tags": [ + "570202f1-9faf-4d32-b8c3-0a452a64e5ab" + ] + }, + { + "Text": "Locks", + "Ws": "pat", + "Bold": "On", + "FontSize": 27389040, + "ForeColor": "#A52A2A", + "Tags": [ + "3b5013ac-2366-1250-3057-deb6c52a5c8f" + ] + } + ] + }, + "kkp": { + "Spans": [ + { + "Text": "deposit", + "Ws": "kkp", + "Tags": [ + "05e0df20-bc85-493b-bb67-f6c0d5aefc41" + ] + } + ] + } + } + } + ], + "PublishIn": [ + { + "Id": "acf54046-ec2a-462e-e562-9d616b2fcbbb", + "DeletedAt": null, + "IsMain": false, + "Name": { + "ktg": "Buckinghamshire", + "yll": "Licensed" + } + } + ] + }, + "Id": "4e0f980f-0398-419e-9490-3b4575dc20bb", + "DeletedAt": null + }, + { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "249c38f3-fc0d-195f-7533-97e8c140d0d7", + "DeletedAt": null, + "LexemeForm": { + "kvj": "Florida" + }, + "CitationForm": null, + "LiteralMeaning": null, + "MorphType": "Prefix", + "HomographNumber": 4, + "Senses": [], + "Note": null, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [], + "VariantOf": [], + "Variants": [], + "PublishIn": [] + }, + "Id": "249c38f3-fc0d-195f-7533-97e8c140d0d7", + "DeletedAt": null + }, + { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "c3c7439d-8508-897d-ec90-dfb8c6233f52", + "DeletedAt": null, + "LexemeForm": { + "sbf": "Triple-buffered", + "nuo": "clear-thinking", + "ewo": "modular" + }, + "CitationForm": { + "mzp": "Rial Omani" + }, + "LiteralMeaning": { + "mku": { + "Spans": [ + { + "Text": "holistic", + "Ws": "mku", + "Tags": [ + "9350e875-0918-4188-8b80-e94b87a852bf" + ] + }, + { + "Text": "Oklahoma", + "Ws": "bnx", + "Bold": "On", + "FontSize": 1103510228, + "ForeColor": "#FF0000", + "Tags": [ + "ed09f714-b175-6596-9983-16cdf0cf34d8" + ] + }, + { + "Text": "Handcrafted", + "Ws": "mku", + "Tags": [ + "182d16db-157e-4fbc-9d8d-fb3df1acc534" + ] + } + ] + }, + "kdr": { + "Spans": [ + { + "Text": "Liaison", + "Ws": "kdr", + "Tags": [ + "f526be31-e1dc-4710-b90d-0c747d57434f" + ] + } + ] + } + }, + "MorphType": "Prefix", + "HomographNumber": -1630247524, + "Senses": [], + "Note": { + "crv": { + "Spans": [ + { + "Text": "Isle of Man", + "Ws": "crv", + "Tags": [ + "7bde6377-d4cb-49ae-9803-86cd678d56d7" + ] + }, + { + "Text": "projection", + "Ws": "crv", + "Tags": [ + "764ca726-5a42-499a-8965-0da244a52a6a" + ] + }, + { + "Text": "transmitting", + "Ws": "hnn", + "Bold": "Off", + "FontSize": -1687247291, + "ForeColor": "#ADFF2F", + "Tags": [ + "54262fd2-0ed1-d0ec-59b2-c2ade27b2a03" + ] + } + ] + }, + "gnw": { + "Spans": [ + { + "Text": "Neck", + "Ws": "bvo", + "Bold": "Off", + "FontSize": -990208762, + "ForeColor": "#00FFFF", + "Tags": [ + "99ed537a-80b3-8de1-7650-6365d2e6083f" + ] + }, + { + "Text": "Data", + "Ws": "gnw", + "Tags": [ + "d241a639-233a-45c7-8935-7b9f3f06157a" + ] + }, + { + "Text": "withdrawal", + "Ws": "pmf", + "Bold": "Off", + "FontSize": -1959771791, + "ForeColor": "#0000FF", + "Tags": [ + "8fd780f0-42f6-34ec-0f95-356321691992" + ] + } + ] + }, + "ekm": { + "Spans": [ + { + "Text": "Developer", + "Ws": "hag", + "Bold": "Invert", + "FontSize": -858017395, + "ForeColor": "#0000FF", + "Tags": [ + "846f0198-2a38-de9c-5c83-d597ce88fecd" + ] + }, + { + "Text": "Handcrafted", + "Ws": "mix", + "Bold": "On", + "FontSize": -1819622732, + "ForeColor": "#FF0000", + "Tags": [ + "bce2d057-9660-de23-ad57-3783b9014de8" + ] + } + ] + } + }, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [ + { + "Id": "68f76f7d-5ec4-2006-ed56-236b8c0acdb3", + "Name": { + "mtn": "Libyan Dinar", + "kot": "white", + "sax": "Accounts", + "tlu": "invoice" + }, + "DeletedAt": null + } + ], + "VariantOf": [ + { + "Id": "30687039-cd15-839f-0f15-88239cea4ee7", + "MaybeId": "30687039-cd15-839f-0f15-88239cea4ee7", + "DeletedAt": null, + "VariantEntryId": "a7cea784-faa5-08b1-5a30-ea546c3e84a6", + "VariantHeadword": "methodologies", + "MainEntryId": "d38e046a-5051-8542-0ee0-a8816c4a38fc", + "MainSenseId": "20ae5516-4681-5b6f-9a37-441f37d30636", + "MainHeadword": "National", + "Types": [ + { + "Id": "4efbf4f2-7182-25a1-8279-18849ca5d1dc", + "Order": 0 + } + ], + "HideMinorEntry": false, + "Comment": { + "ug": { + "Spans": [ + { + "Text": "input", + "Ws": "ug", + "Tags": [ + "009c5014-9b97-498d-94d7-b49c2f60f7ce" + ] + }, + { + "Text": "high-level", + "Ws": "pub", + "Bold": "On", + "FontSize": 1878116492, + "ForeColor": "#0000FF", + "Tags": [ + "5a727ee0-4a4d-6d0f-5ff0-7225db4443b9" + ] + }, + { + "Text": "Liberian Dollar", + "Ws": "ug", + "Tags": [ + "9def2648-5fc8-473b-91a0-e4b870483323" + ] + }, + { + "Text": "teal", + "Ws": "dux", + "Bold": "On", + "FontSize": -447656843, + "ForeColor": "#00FFFF", + "Tags": [ + "3f01efa1-0307-9615-9c0a-abd13268297f" + ] + } + ] + }, + "tkx": { + "Spans": [ + { + "Text": "Handcrafted Plastic Gloves", + "Ws": "ktm", + "Bold": "Off", + "FontSize": 980860579, + "ForeColor": "#0000FF", + "Tags": [ + "3aa66e0d-0c3b-f1fe-000b-f2b073e8bbcf" + ] + }, + { + "Text": "teal", + "Ws": "tkx", + "Tags": [ + "ffc128c8-dd58-490e-bbb6-ff9c9dae2c21" + ] + } + ] + }, + "mvg": { + "Spans": [ + { + "Text": "Synchronised", + "Ws": "lof", + "Bold": "Off", + "FontSize": -448515709, + "ForeColor": "#A52A2A", + "Tags": [ + "cccf656b-6627-2403-6651-e9778e6784b3" + ] + }, + { + "Text": "pink", + "Ws": "mvg", + "Tags": [ + "227cf26e-397c-4d4c-9799-5bb7c880ffcd" + ] + }, + { + "Text": "Tasty Rubber Tuna", + "Ws": "jcs", + "Bold": "Invert", + "FontSize": -1218964834, + "ForeColor": "#FF0000", + "Tags": [ + "8d1b02a7-1a2b-3cad-ee5b-5d9d44e54785" + ] + }, + { + "Text": "Rue", + "Ws": "mvg", + "Tags": [ + "98ac4a79-c23c-47d3-af3b-6352a3905df4" + ] + } + ] + } + } + } + ], + "Variants": [ + { + "Id": "eb7771bf-50ec-05c5-f943-2f36625e25db", + "MaybeId": "eb7771bf-50ec-05c5-f943-2f36625e25db", + "DeletedAt": null, + "VariantEntryId": "dd84ea90-cfe1-a254-021d-efca8b022ddf", + "VariantHeadword": "Configuration", + "MainEntryId": "2bae2145-2f23-b490-102b-cf1d03c8f5bf", + "MainSenseId": "bb0e0056-9948-fd94-0c89-e89fd4ba8cce", + "MainHeadword": "withdrawal", + "Types": [ + { + "Id": "e2b0fab5-16ff-63da-ab2c-3137e2d8fcea", + "Order": 0 + } + ], + "HideMinorEntry": true, + "Comment": { + "afs": { + "Spans": [ + { + "Text": "Investment Account", + "Ws": "afs", + "Tags": [ + "222a259a-328a-41e6-8d2e-ad2e0a06cf21" + ] + }, + { + "Text": "Morocco", + "Ws": "afs", + "Tags": [ + "184ab8d1-b318-407d-8eaf-d60d2615e680" + ] + }, + { + "Text": "Kids \u0026 Kids", + "Ws": "afs", + "Tags": [ + "805122d3-96f3-4129-a887-edb34bd994c5" + ] + } + ] + } + } + } + ], + "PublishIn": [ + { + "Id": "5421adab-b84b-1d1c-5da9-ff96c4e76d6f", + "DeletedAt": null, + "IsMain": false, + "Name": { + "arn": "Money Market Account", + "myt": "withdrawal", + "bni": "Libyan Arab Jamahiriya", + "peh": "web-readiness" + } + } + ] + }, + "Id": "c3c7439d-8508-897d-ec90-dfb8c6233f52", + "DeletedAt": null + }, + { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "0ee796b1-0eed-d3f1-631c-913ff5f1a940", + "DeletedAt": null, + "LexemeForm": { + "na": "Washington" + }, + "CitationForm": { + "nqo": "Rustic Fresh Bacon", + "atk": "productize", + "toh": "olive" + }, + "LiteralMeaning": { + "jda": { + "Spans": [ + { + "Text": "Cambridgeshire", + "Ws": "tti", + "Bold": "Off", + "FontSize": 2028270086, + "ForeColor": "#A52A2A", + "Tags": [ + "fccdd226-dd3b-002a-c2a9-dba0d5ff3957" + ] + }, + { + "Text": "matrix", + "Ws": "jda", + "Tags": [ + "080c109c-5f24-40fb-8e2a-78680f1f25a0" + ] + } + ] + }, + "fom": { + "Spans": [ + { + "Text": "Visionary", + "Ws": "fom", + "Tags": [ + "a9b7da42-c2a1-4dab-a58d-381d7b596ff0" + ] + }, + { + "Text": "experiences", + "Ws": "zgr", + "Bold": "Invert", + "FontSize": 1679346359, + "ForeColor": "#A52A2A", + "Tags": [ + "a3123929-f6d5-161d-6ff7-09cecbef1db2" + ] + }, + { + "Text": "Triple-buffered", + "Ws": "fom", + "Tags": [ + "eb5e66c4-2019-4fe8-b0a2-3176a51acbdb" + ] + } + ] + } + }, + "MorphType": "DiscontiguousPhrase", + "HomographNumber": 569783013, + "Senses": [], + "Note": { + "njd": { + "Spans": [ + { + "Text": "SDD", + "Ws": "cna", + "Bold": "Off", + "FontSize": 2136278142, + "ForeColor": "#FF0000", + "Tags": [ + "92ad0540-0eea-e827-b4a8-83cba87756a1" + ] + }, + { + "Text": "integrated", + "Ws": "yig", + "Bold": "Invert", + "FontSize": -1353254452, "ForeColor": "#00FFFF", "Tags": [ - "99ed537a-80b3-8de1-7650-6365d2e6083f" + "b3725dde-d2ad-c3b5-836a-399a5f3a4730" ] }, { - "Text": "Data", - "Ws": "gnw", + "Text": "invoice", + "Ws": "njd", "Tags": [ - "d241a639-233a-45c7-8935-7b9f3f06157a" + "efd20ef0-0eb7-4ba1-9e96-1550a46dd866" ] }, { - "Text": "withdrawal", - "Ws": "pmf", - "Bold": "Off", - "FontSize": -1959771791, - "ForeColor": "#0000FF", + "Text": "Practical Steel Salad", + "Ws": "njd", "Tags": [ - "8fd780f0-42f6-34ec-0f95-356321691992" + "8188477f-bb14-4933-b22c-56a8de9390f8" ] } ] }, - "ekm": { + "njm": { "Spans": [ { - "Text": "Developer", - "Ws": "hag", - "Bold": "Invert", - "FontSize": -858017395, - "ForeColor": "#0000FF", + "Text": "real-time", + "Ws": "njm", "Tags": [ - "846f0198-2a38-de9c-5c83-d597ce88fecd" + "705d4eed-f262-4c9c-aa79-88b9bbecc192" ] }, { - "Text": "Handcrafted", - "Ws": "mix", - "Bold": "On", - "FontSize": -1819622732, - "ForeColor": "#FF0000", + "Text": "solid state", + "Ws": "fmp", + "Bold": "Off", + "FontSize": 2042337377, + "ForeColor": "#A52A2A", "Tags": [ - "bce2d057-9660-de23-ad57-3783b9014de8" + "fc83f75e-44b7-504f-aee8-2ba1753e6c64" + ] + }, + { + "Text": "Kuwait", + "Ws": "njm", + "Tags": [ + "aa64fa63-fbc9-4650-828b-1669dc3a6db1" ] } ] @@ -2606,130 +4418,113 @@ "ComplexForms": [], "ComplexFormTypes": [ { - "Id": "68f76f7d-5ec4-2006-ed56-236b8c0acdb3", + "Id": "db713211-c07c-0943-5708-e023318f207e", "Name": { - "mtn": "Libyan Dinar", - "kot": "white", - "sax": "Accounts", - "tlu": "invoice" + "lth": "SMS" }, "DeletedAt": null } ], "VariantOf": [ { - "Id": "30687039-cd15-839f-0f15-88239cea4ee7", - "MaybeId": "30687039-cd15-839f-0f15-88239cea4ee7", + "Id": "797f2159-7282-b4aa-abd9-6bdea0796efa", + "MaybeId": "797f2159-7282-b4aa-abd9-6bdea0796efa", "DeletedAt": null, - "VariantEntryId": "a7cea784-faa5-08b1-5a30-ea546c3e84a6", - "VariantHeadword": "methodologies", - "MainEntryId": "d38e046a-5051-8542-0ee0-a8816c4a38fc", - "MainSenseId": "20ae5516-4681-5b6f-9a37-441f37d30636", - "MainHeadword": "National", + "VariantEntryId": "f6953a92-9bd2-7149-d76e-e22f39bc2aa2", + "VariantHeadword": "Right-sized", + "MainEntryId": "837e8bcb-6051-a9ea-ef38-350f10144aba", + "MainSenseId": "460e4f55-90b5-f80b-302b-05e4e1a49c10", + "MainHeadword": "black", "Types": [ { - "Id": "4efbf4f2-7182-25a1-8279-18849ca5d1dc", - "Name": { - "xpu": "Intelligent Soft Shirt" - }, - "DeletedAt": null + "Id": "c4c5dc19-8a5d-f39d-eb0d-354507ac0d08", + "Order": 0 } ], "HideMinorEntry": false, "Comment": { - "ug": { + "rm": { "Spans": [ { - "Text": "input", - "Ws": "ug", - "Tags": [ - "009c5014-9b97-498d-94d7-b49c2f60f7ce" - ] - }, - { - "Text": "high-level", - "Ws": "pub", - "Bold": "On", - "FontSize": 1878116492, - "ForeColor": "#0000FF", - "Tags": [ - "5a727ee0-4a4d-6d0f-5ff0-7225db4443b9" - ] - }, - { - "Text": "Liberian Dollar", - "Ws": "ug", - "Tags": [ - "9def2648-5fc8-473b-91a0-e4b870483323" - ] - }, - { - "Text": "teal", - "Ws": "dux", + "Text": "turn-key", + "Ws": "swt", "Bold": "On", - "FontSize": -447656843, - "ForeColor": "#00FFFF", + "FontSize": 753733498, + "ForeColor": "#A52A2A", "Tags": [ - "3f01efa1-0307-9615-9c0a-abd13268297f" + "c9201219-982c-e82b-9dd1-793e6473e2df" ] } ] }, - "tkx": { + "dum": { "Spans": [ { - "Text": "Handcrafted Plastic Gloves", - "Ws": "ktm", + "Text": "leverage", + "Ws": "dum", + "Tags": [ + "0f50a19f-84d0-4eb5-b240-7644683fbdec" + ] + }, + { + "Text": "Senior", + "Ws": "ymq", "Bold": "Off", - "FontSize": 980860579, - "ForeColor": "#0000FF", + "FontSize": 1725985349, + "ForeColor": "#A52A2A", "Tags": [ - "3aa66e0d-0c3b-f1fe-000b-f2b073e8bbcf" + "01298219-7afb-f472-8466-e2915755c100" ] }, { - "Text": "teal", - "Ws": "tkx", + "Text": "Reverse-engineered", + "Ws": "dum", "Tags": [ - "ffc128c8-dd58-490e-bbb6-ff9c9dae2c21" + "066e661c-6010-4c9b-aa06-1c199461ff38" ] } ] }, - "mvg": { + "tcc": { "Spans": [ { - "Text": "Synchronised", - "Ws": "lof", - "Bold": "Off", - "FontSize": -448515709, - "ForeColor": "#A52A2A", + "Text": "Philippine Peso", + "Ws": "scf", + "Bold": "Invert", + "FontSize": 1098925027, + "ForeColor": "#00000000", "Tags": [ - "cccf656b-6627-2403-6651-e9778e6784b3" + "d90804b9-1aee-4762-d24d-9c7e58a59d4c" ] }, { - "Text": "pink", - "Ws": "mvg", + "Text": "content", + "Ws": "et", + "Bold": "On", + "FontSize": 854784662, + "ForeColor": "#FF0000", "Tags": [ - "227cf26e-397c-4d4c-9799-5bb7c880ffcd" + "c9f20b4f-e2bb-4757-3eb1-2d911a789b58" ] }, { - "Text": "Tasty Rubber Tuna", - "Ws": "jcs", - "Bold": "Invert", - "FontSize": -1218964834, - "ForeColor": "#FF0000", + "Text": "XSS", + "Ws": "pcp", + "Bold": "Off", + "FontSize": -874378024, + "ForeColor": "#ADFF2F", "Tags": [ - "8d1b02a7-1a2b-3cad-ee5b-5d9d44e54785" + "0c08386d-4f08-b863-3cbb-bc26a18974cf" ] }, { - "Text": "Rue", - "Ws": "mvg", + "Text": "Practical Steel Computer", + "Ws": "bfl", + "Bold": "Off", + "FontSize": -197714300, + "ForeColor": "#00000000", "Tags": [ - "98ac4a79-c23c-47d3-af3b-6352a3905df4" + "aae10a15-5e6e-4f95-b085-d78dcddeacc4" ] } ] @@ -2739,49 +4534,120 @@ ], "Variants": [ { - "Id": "eb7771bf-50ec-05c5-f943-2f36625e25db", - "MaybeId": "eb7771bf-50ec-05c5-f943-2f36625e25db", + "Id": "62a0fb8f-d702-b421-58e3-621f5f7aa9ce", + "MaybeId": "62a0fb8f-d702-b421-58e3-621f5f7aa9ce", "DeletedAt": null, - "VariantEntryId": "dd84ea90-cfe1-a254-021d-efca8b022ddf", - "VariantHeadword": "Configuration", - "MainEntryId": "2bae2145-2f23-b490-102b-cf1d03c8f5bf", - "MainSenseId": "bb0e0056-9948-fd94-0c89-e89fd4ba8cce", - "MainHeadword": "withdrawal", + "VariantEntryId": "8dfb86da-8ed1-ea6b-0fe3-511bf33a7d5e", + "VariantHeadword": "green", + "MainEntryId": "11c07bca-fa38-9d97-6861-ba020e4ce459", + "MainSenseId": "1faa63d9-9357-5e5f-6616-3ce18bff68a0", + "MainHeadword": "Factors", "Types": [ { - "Id": "e2b0fab5-16ff-63da-ab2c-3137e2d8fcea", - "Name": { - "nli": "Architect", - "dcc": "Decentralized", - "dgd": "leverage", - "pne": "Intelligent Steel Cheese" - }, - "DeletedAt": null + "Id": "48eb26f9-22e4-5d0b-41b7-3552f90c45d4", + "Order": 0 } ], "HideMinorEntry": true, "Comment": { - "afs": { + "nlq": { "Spans": [ { - "Text": "Investment Account", - "Ws": "afs", + "Text": "Industrial, Industrial \u0026 Industrial", + "Ws": "arj", + "Bold": "Off", + "FontSize": 731927050, + "ForeColor": "#00FFFF", "Tags": [ - "222a259a-328a-41e6-8d2e-ad2e0a06cf21" + "4797e7c5-f2e8-f34d-eb55-73459fab35c0" ] }, { - "Text": "Morocco", - "Ws": "afs", + "Text": "Tasty Steel Ball", + "Ws": "nlq", "Tags": [ - "184ab8d1-b318-407d-8eaf-d60d2615e680" + "3546771d-6f56-4567-bb16-ca1857e153b1" ] }, { - "Text": "Kids \u0026 Kids", - "Ws": "afs", + "Text": "Iowa", + "Ws": "nlq", "Tags": [ - "805122d3-96f3-4129-a887-edb34bd994c5" + "e0272ed8-f7b7-4ddd-8afb-f8e8339574bd" + ] + } + ] + }, + "xop": { + "Spans": [ + { + "Text": "empower", + "Ws": "xop", + "Tags": [ + "c1135d6f-454d-454c-bcc6-ea20548835f3" + ] + }, + { + "Text": "solution-oriented", + "Ws": "xop", + "Tags": [ + "d40951b4-37d4-412f-98ff-538350a666cd" + ] + }, + { + "Text": "Savings Account", + "Ws": "diz", + "Bold": "Off", + "FontSize": -361545401, + "ForeColor": "#00000000", + "Tags": [ + "e23e525b-6b9b-17cc-a71d-97d1531b9983" + ] + } + ] + }, + "kxo": { + "Spans": [ + { + "Text": "Refined Wooden Gloves", + "Ws": "kxo", + "Tags": [ + "d06c17b2-a3a6-4007-8970-66cc64403cb1" + ] + }, + { + "Text": "USB", + "Ws": "kxo", + "Tags": [ + "8af45123-ac9b-4eac-817f-12ae4b1427ec" + ] + } + ] + }, + "bet": { + "Spans": [ + { + "Text": "Granite", + "Ws": "pod", + "Bold": "Off", + "FontSize": -10087494, + "ForeColor": "#00000000", + "Tags": [ + "d98dfcba-1e4a-e7f6-5cf5-7d9b0357fb8b" + ] + }, + { + "Text": "Light", + "Ws": "bet", + "Tags": [ + "045fbeaa-d08d-4ab2-8e2e-e5c507947756" + ] + }, + { + "Text": "Tools", + "Ws": "bet", + "Tags": [ + "905040f5-93e3-41f5-b0dc-397bc7bc892b" ] } ] @@ -2791,19 +4657,16 @@ ], "PublishIn": [ { - "Id": "5421adab-b84b-1d1c-5da9-ff96c4e76d6f", + "Id": "49001875-879c-ba4e-076b-95a8afd85327", "DeletedAt": null, "IsMain": false, "Name": { - "arn": "Money Market Account", - "myt": "withdrawal", - "bni": "Libyan Arab Jamahiriya", - "peh": "web-readiness" + "xoo": "Pound Sterling" } } ] }, - "Id": "c3c7439d-8508-897d-ec90-dfb8c6233f52", + "Id": "0ee796b1-0eed-d3f1-631c-913ff5f1a940", "DeletedAt": null }, { @@ -6298,13 +8161,7 @@ "Types": [ { "Id": "bd29dadc-ed05-75a2-2dd2-1f4e7a8ed28c", - "Name": { - "qvs": "transition", - "bnj": "input", - "prx": "1080p", - "stw": "Cotton" - }, - "DeletedAt": null + "Order": 0 } ], "HideMinorEntry": true, @@ -6409,5 +8266,105 @@ }, "Id": "f3c8bd18-ddae-319c-7af9-aec8a1f24db9", "DeletedAt": null + }, + { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Variant", + "Id": "bf60bcd2-0649-d9ac-8d6e-3a252153cdba", + "MaybeId": "bf60bcd2-0649-d9ac-8d6e-3a252153cdba", + "DeletedAt": null, + "VariantEntryId": "bc08273c-b230-0fc0-dc9b-34b024bc1db7", + "VariantHeadword": "Berkshire", + "MainEntryId": "34cda42c-8d78-9bd5-3407-3ce72e6d37b2", + "MainSenseId": "5f7fe28a-7de9-2cb0-e409-348224db35c9", + "MainHeadword": "Nebraska", + "Types": [ + { + "Id": "e550eefb-7090-9864-5de6-636831587a4e", + "Order": 0 + } + ], + "HideMinorEntry": true, + "Comment": { + "jnj": { + "Spans": [ + { + "Text": "Kids \u0026 Baby", + "Ws": "jnj", + "Tags": [ + "ba502382-9998-4a78-8ef7-ebd389bdf72b" + ] + }, + { + "Text": "COM", + "Ws": "zh", + "Bold": "Invert", + "FontSize": 1392692186, + "ForeColor": "#00000000", + "Tags": [ + "80c21843-b97d-b589-1a53-ef00280b8d4e" + ] + }, + { + "Text": "Chilean Peso", + "Ws": "nkn", + "Bold": "Off", + "FontSize": -534623248, + "ForeColor": "#0000FF", + "Tags": [ + "ca8b5444-109f-853a-c174-91aa72f466b1" + ] + } + ] + }, + "khd": { + "Spans": [ + { + "Text": "Devolved", + "Ws": "ssy", + "Bold": "Off", + "FontSize": 69387999, + "ForeColor": "#00FFFF", + "Tags": [ + "ab63326c-0618-4406-bfda-d4b6456b975a" + ] + }, + { + "Text": "Principal", + "Ws": "mom", + "Bold": "Invert", + "FontSize": -1710396282, + "ForeColor": "#00000000", + "Tags": [ + "4e59922a-1afa-07e4-428e-0ab7a5e70145" + ] + }, + { + "Text": "Operations", + "Ws": "zrg", + "Bold": "Off", + "FontSize": 408355217, + "ForeColor": "#ADFF2F", + "Tags": [ + "27cbedb9-70e3-7fdf-11af-471f862edc8a" + ] + }, + { + "Text": "Sports \u0026 Beauty", + "Ws": "sid", + "Bold": "Off", + "FontSize": -1161178234, + "ForeColor": "#FF0000", + "Tags": [ + "13f8ceed-a752-3be7-6296-e9958b578c11" + ] + } + ] + } + } + }, + "Id": "bf60bcd2-0649-d9ac-8d6e-3a252153cdba", + "DeletedAt": null } ] \ No newline at end of file diff --git a/backend/FwLite/LcmCrdt.Tests/Data/SnapshotDeserializationRegressionData.legacy.verified.txt b/backend/FwLite/LcmCrdt.Tests/Data/SnapshotDeserializationRegressionData.legacy.verified.txt index 1dd30608e8..6a7151f3c6 100644 --- a/backend/FwLite/LcmCrdt.Tests/Data/SnapshotDeserializationRegressionData.legacy.verified.txt +++ b/backend/FwLite/LcmCrdt.Tests/Data/SnapshotDeserializationRegressionData.legacy.verified.txt @@ -4748,5 +4748,4857 @@ "Id": "249c38f3-fc0d-195f-7533-97e8c140d0d7", "DeletedAt": null } + }, + { + "Input": { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "2e6a7e6c-7abf-cd99-94b0-80c04d315d98", + "DeletedAt": null, + "LexemeForm": { + "xbn": "Direct", + "hla": "Soft" + }, + "CitationForm": { + "mxb": "Money Market Account", + "lkb": "payment" + }, + "LiteralMeaning": { + "ong": { + "Spans": [ + { + "Text": "reciprocal", + "Ws": "ong", + "Tags": [ + "ea0639e3-938a-40fa-b8dd-da4672d64210" + ] + } + ] + }, + "kxu": { + "Spans": [ + { + "Text": "invoice", + "Ws": "kxu", + "Tags": [ + "42b03468-0642-407f-a3d8-eea36bfc95a0" + ] + }, + { + "Text": "Outdoors \u0026 Shoes", + "Ws": "kxu", + "Tags": [ + "3ad34dad-b720-427c-9dd0-6090c5d6a5c6" + ] + }, + { + "Text": "feed", + "Ws": "kxu", + "Tags": [ + "b912d284-481e-48de-a9b4-870a5e285a08" + ] + }, + { + "Text": "SMTP", + "Ws": "kxu", + "Tags": [ + "0d3c4aa2-a3b3-4871-bf66-8406e5e8ec3c" + ] + } + ] + }, + "ihi": { + "Spans": [ + { + "Text": "generate", + "Ws": "wwb", + "Bold": "Off", + "FontSize": 1075171932, + "ForeColor": "#ADFF2F", + "Tags": [ + "422d0492-d48e-0c65-b609-1690caad3603" + ] + }, + { + "Text": "synergistic", + "Ws": "ihi", + "Tags": [ + "dacf7482-f6ec-4ac3-9a30-9c105833df66" + ] + }, + { + "Text": "Computers", + "Ws": "ihi", + "Tags": [ + "41ca560f-1ae7-41d1-a37d-c4faf18b0b58" + ] + } + ] + } + }, + "MorphType": "Simulfix", + "HomographNumber": -1674377933, + "Senses": [], + "Note": { + "xuo": { + "Spans": [ + { + "Text": "Security", + "Ws": "gin", + "Bold": "Off", + "FontSize": 1340465988, + "ForeColor": "#ADFF2F", + "Tags": [ + "5879c653-6e26-d703-ce85-9ca519ef0bcb" + ] + }, + { + "Text": "calculating", + "Ws": "xuo", + "Tags": [ + "072c66e5-b950-45f4-b7e7-b70e4e279ecf" + ] + } + ] + } + }, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [ + { + "Id": "3aca6492-07a4-3de2-e2c6-aba408f397bb", + "Name": { + "vmd": "reboot", + "duk": "invoice", + "ium": "Practical Plastic Towels", + "kxr": "withdrawal" + }, + "DeletedAt": null + } + ], + "VariantOf": [ + { + "Id": "4c619f87-442f-23b4-2983-41412a7ffe95", + "MaybeId": "4c619f87-442f-23b4-2983-41412a7ffe95", + "DeletedAt": null, + "VariantEntryId": "81176034-5b4d-85c1-2a47-04f8176759bd", + "VariantHeadword": "Wall", + "MainEntryId": "d93de12e-07f9-4f2f-8954-190e2abe06e9", + "MainSenseId": "96e31a4a-bbee-996b-759c-5187b29cfa7f", + "MainHeadword": "Tasty Soft Salad", + "Types": [ + { + "Id": "99ab5593-63d1-ca4f-b979-d5e1af87d1ea", + "Name": { + "mok": "El Salvador", + "trx": "Coordinator", + "duc": "lime", + "xua": "cross-platform" + }, + "DeletedAt": null + } + ], + "HideMinorEntry": true, + "Comment": { + "gew": { + "Spans": [ + { + "Text": "program", + "Ws": "gew", + "Tags": [ + "cc0c91a9-eea7-4948-8990-cc07a570056d" + ] + }, + { + "Text": "Denmark", + "Ws": "gew", + "Tags": [ + "dc29b510-b94d-4eb6-af91-0903deea2fc6" + ] + }, + { + "Text": "invoice", + "Ws": "gew", + "Tags": [ + "29a99076-1ccb-4b95-9beb-338ad843962f" + ] + } + ] + }, + "nik": { + "Spans": [ + { + "Text": "synthesize", + "Ws": "nik", + "Tags": [ + "6f54f2fd-e638-403d-9735-16257878b92a" + ] + }, + { + "Text": "Multi-lateral", + "Ws": "nik", + "Tags": [ + "4d67e4b7-1604-4262-afd4-af42580aa1b5" + ] + } + ] + }, + "aeq": { + "Spans": [ + { + "Text": "Rustic", + "Ws": "ojp", + "Bold": "Off", + "FontSize": -1057944399, + "ForeColor": "#A52A2A", + "Tags": [ + "e454379a-dbba-1d27-58b0-45d4b40b6742" + ] + } + ] + } + } + } + ], + "Variants": [ + { + "Id": "86a01a92-d1aa-d020-4806-f4f7472b56d3", + "MaybeId": "86a01a92-d1aa-d020-4806-f4f7472b56d3", + "DeletedAt": null, + "VariantEntryId": "0a076330-b823-c5f3-092f-7df61125a364", + "VariantHeadword": "Dynamic", + "MainEntryId": "5cc279a5-baa9-1049-c88c-f2bde24e2531", + "MainSenseId": "587131ac-caff-2f98-9279-8fb32b29fed6", + "MainHeadword": "Communications", + "Types": [ + { + "Id": "66c9952f-5b85-39fd-e4f9-cdcc1c69273c", + "Name": { + "nlk": "copy" + }, + "DeletedAt": null + } + ], + "HideMinorEntry": false, + "Comment": { + "mdp": { + "Spans": [ + { + "Text": "Jewelery", + "Ws": "eri", + "Bold": "On", + "FontSize": -1242542580, + "ForeColor": "#ADFF2F", + "Tags": [ + "89d044a5-c286-2b2b-1682-64d47fc7d4bf" + ] + }, + { + "Text": "methodologies", + "Ws": "aba", + "Bold": "On", + "FontSize": 110774510, + "ForeColor": "#A52A2A", + "Tags": [ + "d744100f-a080-0581-82db-f7d2344df273" + ] + } + ] + }, + "xkg": { + "Spans": [ + { + "Text": "Intelligent Rubber Pizza", + "Ws": "xkg", + "Tags": [ + "c648d2fd-77c1-4a80-90f7-67e4da636439" + ] + } + ] + }, + "cpg": { + "Spans": [ + { + "Text": "calculating", + "Ws": "cpg", + "Tags": [ + "31ebc98f-9179-4edc-9e89-7c4711220151" + ] + } + ] + }, + "ify": { + "Spans": [ + { + "Text": "olive", + "Ws": "ify", + "Tags": [ + "6b281f29-55b9-4f4c-bf31-945fc1f12407" + ] + }, + { + "Text": "Granite", + "Ws": "agz", + "Bold": "On", + "FontSize": -1607886368, + "ForeColor": "#A52A2A", + "Tags": [ + "674f1746-1295-ea46-3a8a-24375fc1dca7" + ] + }, + { + "Text": "Sleek Rubber Hat", + "Ws": "ify", + "Tags": [ + "2b5777aa-eb2a-4291-aef7-bd714ca05900" + ] + }, + { + "Text": "reboot", + "Ws": "nsw", + "Bold": "Invert", + "FontSize": -1160287576, + "ForeColor": "#00FFFF", + "Tags": [ + "e3ad9b6e-8b58-187e-d876-e40a78e36968" + ] + } + ] + } + } + } + ], + "PublishIn": [ + { + "Id": "ee0b6860-87ac-709a-aa8c-0f20b06efa0b", + "DeletedAt": null, + "IsMain": false, + "Name": { + "amf": "Refined" + } + } + ] + }, + "Id": "2e6a7e6c-7abf-cd99-94b0-80c04d315d98", + "DeletedAt": null + }, + "Output": { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "2e6a7e6c-7abf-cd99-94b0-80c04d315d98", + "DeletedAt": null, + "LexemeForm": { + "xbn": "Direct", + "hla": "Soft" + }, + "CitationForm": { + "mxb": "Money Market Account", + "lkb": "payment" + }, + "LiteralMeaning": { + "ong": { + "Spans": [ + { + "Text": "reciprocal", + "Ws": "ong", + "Tags": [ + "ea0639e3-938a-40fa-b8dd-da4672d64210" + ] + } + ] + }, + "kxu": { + "Spans": [ + { + "Text": "invoice", + "Ws": "kxu", + "Tags": [ + "42b03468-0642-407f-a3d8-eea36bfc95a0" + ] + }, + { + "Text": "Outdoors \u0026 Shoes", + "Ws": "kxu", + "Tags": [ + "3ad34dad-b720-427c-9dd0-6090c5d6a5c6" + ] + }, + { + "Text": "feed", + "Ws": "kxu", + "Tags": [ + "b912d284-481e-48de-a9b4-870a5e285a08" + ] + }, + { + "Text": "SMTP", + "Ws": "kxu", + "Tags": [ + "0d3c4aa2-a3b3-4871-bf66-8406e5e8ec3c" + ] + } + ] + }, + "ihi": { + "Spans": [ + { + "Text": "generate", + "Ws": "wwb", + "Bold": "Off", + "FontSize": 1075171932, + "ForeColor": "#ADFF2F", + "Tags": [ + "422d0492-d48e-0c65-b609-1690caad3603" + ] + }, + { + "Text": "synergistic", + "Ws": "ihi", + "Tags": [ + "dacf7482-f6ec-4ac3-9a30-9c105833df66" + ] + }, + { + "Text": "Computers", + "Ws": "ihi", + "Tags": [ + "41ca560f-1ae7-41d1-a37d-c4faf18b0b58" + ] + } + ] + } + }, + "MorphType": "Simulfix", + "HomographNumber": -1674377933, + "Senses": [], + "Note": { + "xuo": { + "Spans": [ + { + "Text": "Security", + "Ws": "gin", + "Bold": "Off", + "FontSize": 1340465988, + "ForeColor": "#ADFF2F", + "Tags": [ + "5879c653-6e26-d703-ce85-9ca519ef0bcb" + ] + }, + { + "Text": "calculating", + "Ws": "xuo", + "Tags": [ + "072c66e5-b950-45f4-b7e7-b70e4e279ecf" + ] + } + ] + } + }, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [ + { + "Id": "3aca6492-07a4-3de2-e2c6-aba408f397bb", + "Name": { + "vmd": "reboot", + "duk": "invoice", + "ium": "Practical Plastic Towels", + "kxr": "withdrawal" + }, + "DeletedAt": null + } + ], + "VariantOf": [ + { + "Id": "4c619f87-442f-23b4-2983-41412a7ffe95", + "MaybeId": "4c619f87-442f-23b4-2983-41412a7ffe95", + "DeletedAt": null, + "VariantEntryId": "81176034-5b4d-85c1-2a47-04f8176759bd", + "VariantHeadword": "Wall", + "MainEntryId": "d93de12e-07f9-4f2f-8954-190e2abe06e9", + "MainSenseId": "96e31a4a-bbee-996b-759c-5187b29cfa7f", + "MainHeadword": "Tasty Soft Salad", + "Types": [ + { + "Id": "99ab5593-63d1-ca4f-b979-d5e1af87d1ea", + "Order": 0 + } + ], + "HideMinorEntry": true, + "Comment": { + "gew": { + "Spans": [ + { + "Text": "program", + "Ws": "gew", + "Tags": [ + "cc0c91a9-eea7-4948-8990-cc07a570056d" + ] + }, + { + "Text": "Denmark", + "Ws": "gew", + "Tags": [ + "dc29b510-b94d-4eb6-af91-0903deea2fc6" + ] + }, + { + "Text": "invoice", + "Ws": "gew", + "Tags": [ + "29a99076-1ccb-4b95-9beb-338ad843962f" + ] + } + ] + }, + "nik": { + "Spans": [ + { + "Text": "synthesize", + "Ws": "nik", + "Tags": [ + "6f54f2fd-e638-403d-9735-16257878b92a" + ] + }, + { + "Text": "Multi-lateral", + "Ws": "nik", + "Tags": [ + "4d67e4b7-1604-4262-afd4-af42580aa1b5" + ] + } + ] + }, + "aeq": { + "Spans": [ + { + "Text": "Rustic", + "Ws": "ojp", + "Bold": "Off", + "FontSize": -1057944399, + "ForeColor": "#A52A2A", + "Tags": [ + "e454379a-dbba-1d27-58b0-45d4b40b6742" + ] + } + ] + } + } + } + ], + "Variants": [ + { + "Id": "86a01a92-d1aa-d020-4806-f4f7472b56d3", + "MaybeId": "86a01a92-d1aa-d020-4806-f4f7472b56d3", + "DeletedAt": null, + "VariantEntryId": "0a076330-b823-c5f3-092f-7df61125a364", + "VariantHeadword": "Dynamic", + "MainEntryId": "5cc279a5-baa9-1049-c88c-f2bde24e2531", + "MainSenseId": "587131ac-caff-2f98-9279-8fb32b29fed6", + "MainHeadword": "Communications", + "Types": [ + { + "Id": "66c9952f-5b85-39fd-e4f9-cdcc1c69273c", + "Order": 0 + } + ], + "HideMinorEntry": false, + "Comment": { + "mdp": { + "Spans": [ + { + "Text": "Jewelery", + "Ws": "eri", + "Bold": "On", + "FontSize": -1242542580, + "ForeColor": "#ADFF2F", + "Tags": [ + "89d044a5-c286-2b2b-1682-64d47fc7d4bf" + ] + }, + { + "Text": "methodologies", + "Ws": "aba", + "Bold": "On", + "FontSize": 110774510, + "ForeColor": "#A52A2A", + "Tags": [ + "d744100f-a080-0581-82db-f7d2344df273" + ] + } + ] + }, + "xkg": { + "Spans": [ + { + "Text": "Intelligent Rubber Pizza", + "Ws": "xkg", + "Tags": [ + "c648d2fd-77c1-4a80-90f7-67e4da636439" + ] + } + ] + }, + "cpg": { + "Spans": [ + { + "Text": "calculating", + "Ws": "cpg", + "Tags": [ + "31ebc98f-9179-4edc-9e89-7c4711220151" + ] + } + ] + }, + "ify": { + "Spans": [ + { + "Text": "olive", + "Ws": "ify", + "Tags": [ + "6b281f29-55b9-4f4c-bf31-945fc1f12407" + ] + }, + { + "Text": "Granite", + "Ws": "agz", + "Bold": "On", + "FontSize": -1607886368, + "ForeColor": "#A52A2A", + "Tags": [ + "674f1746-1295-ea46-3a8a-24375fc1dca7" + ] + }, + { + "Text": "Sleek Rubber Hat", + "Ws": "ify", + "Tags": [ + "2b5777aa-eb2a-4291-aef7-bd714ca05900" + ] + }, + { + "Text": "reboot", + "Ws": "nsw", + "Bold": "Invert", + "FontSize": -1160287576, + "ForeColor": "#00FFFF", + "Tags": [ + "e3ad9b6e-8b58-187e-d876-e40a78e36968" + ] + } + ] + } + } + } + ], + "PublishIn": [ + { + "Id": "ee0b6860-87ac-709a-aa8c-0f20b06efa0b", + "DeletedAt": null, + "IsMain": false, + "Name": { + "amf": "Refined" + } + } + ] + }, + "Id": "2e6a7e6c-7abf-cd99-94b0-80c04d315d98", + "DeletedAt": null + } + }, + { + "Input": { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "a9cd7853-c982-5959-3186-ec248d8d41de", + "DeletedAt": null, + "LexemeForm": { + "cnl": "hard drive", + "all": "Taiwan" + }, + "CitationForm": { + "pam": "District" + }, + "LiteralMeaning": { + "ama": { + "Spans": [ + { + "Text": "Sleek", + "Ws": "bbd", + "Bold": "Invert", + "FontSize": -85638709, + "ForeColor": "#ADFF2F", + "Tags": [ + "52197334-e928-b0cc-8914-ee3cca6d000e" + ] + }, + { + "Text": "Personal Loan Account", + "Ws": "ama", + "Tags": [ + "c6badbfd-0430-4245-b1f3-6dbfc3cf5ced" + ] + }, + { + "Text": "Wooden", + "Ws": "fgr", + "Bold": "Invert", + "FontSize": -1658278656, + "ForeColor": "#A52A2A", + "Tags": [ + "99c5aa5c-271c-d860-b815-a713850e4403" + ] + } + ] + }, + "jaj": { + "Spans": [ + { + "Text": "connect", + "Ws": "noi", + "Bold": "Off", + "FontSize": -1470543244, + "ForeColor": "#FF0000", + "Tags": [ + "87c38be9-027c-83c7-cb99-59210e09f3d8" + ] + }, + { + "Text": "streamline", + "Ws": "jaj", + "Tags": [ + "c49682bf-c285-4acf-9a3e-f6cb391b184b" + ] + }, + { + "Text": "Bedfordshire", + "Ws": "xcw", + "Bold": "Invert", + "FontSize": 1053195674, + "ForeColor": "#FF0000", + "Tags": [ + "f0ab79c7-ddff-63a0-1746-2825fd24206e" + ] + } + ] + } + }, + "MorphType": "Suffix", + "HomographNumber": 996368112, + "Senses": [], + "Note": { + "nrb": { + "Spans": [ + { + "Text": "blockchains", + "Ws": "nrb", + "Tags": [ + "b62b9429-69ad-4f80-a66b-b3678383663b" + ] + }, + { + "Text": "Ergonomic Soft Shoes", + "Ws": "jac", + "Bold": "On", + "FontSize": -1052383363, + "ForeColor": "#A52A2A", + "Tags": [ + "a9a9dec9-08cc-2c34-a5ca-cf78d1107839" + ] + }, + { + "Text": "Tasty", + "Ws": "nrb", + "Tags": [ + "462f2665-8c79-4f7f-be99-86a100958929" + ] + }, + { + "Text": "Shoes", + "Ws": "khr", + "Bold": "Invert", + "FontSize": 492536191, + "ForeColor": "#ADFF2F", + "Tags": [ + "27770394-7f08-6701-ac8a-e78f75048a9b" + ] + } + ] + }, + "cky": { + "Spans": [ + { + "Text": "Auto Loan Account", + "Ws": "cky", + "Tags": [ + "d864c261-66c8-4887-94ec-32d891358f72" + ] + }, + { + "Text": "Montana", + "Ws": "cky", + "Tags": [ + "4562dc77-f99d-4de1-b832-cd8473543713" + ] + }, + { + "Text": "optimal", + "Ws": "avt", + "Bold": "Invert", + "FontSize": 212594793, + "ForeColor": "#00FFFF", + "Tags": [ + "8bbd2e0e-13a5-b378-3193-a1a9498f4a1d" + ] + } + ] + }, + "aqp": { + "Spans": [ + { + "Text": "cross-platform", + "Ws": "wbq", + "Bold": "On", + "FontSize": -1898908819, + "ForeColor": "#ADFF2F", + "Tags": [ + "1a98d7cc-742b-9e51-64e8-4849f6811d32" + ] + } + ] + } + }, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [ + { + "Id": "bfea70b0-ebd5-86d8-ecfc-9ad4facfd9ca", + "Name": { + "aoe": "bypass" + }, + "DeletedAt": null + } + ], + "VariantOf": [ + { + "Id": "54c228d3-10b3-20c2-d7e6-38cbb280740c", + "MaybeId": "54c228d3-10b3-20c2-d7e6-38cbb280740c", + "DeletedAt": null, + "VariantEntryId": "d141258e-c100-a4fb-c1cd-63b059ddfb62", + "VariantHeadword": "Corporate", + "MainEntryId": "fc6512ab-e796-7a71-da3d-5c3edb7b3b10", + "MainSenseId": "43bf7d1b-292e-ba0c-9e10-56d4229036af", + "MainHeadword": "Chief", + "Types": [ + { + "Id": "766ce347-e58e-c772-7e7c-ec5332c5b48b", + "Name": { + "bhh": "Avon" + }, + "DeletedAt": null + } + ], + "HideMinorEntry": false, + "Comment": { + "iry": { + "Spans": [ + { + "Text": "Practical Cotton Pants", + "Ws": "iry", + "Tags": [ + "49a57a3f-8891-49be-8487-9bbd4f399f84" + ] + } + ] + } + } + } + ], + "Variants": [ + { + "Id": "5b9c87d1-f228-81fd-e6fc-463b4ed48bb6", + "MaybeId": "5b9c87d1-f228-81fd-e6fc-463b4ed48bb6", + "DeletedAt": null, + "VariantEntryId": "a50a0851-684a-795c-5f22-8275682b0caa", + "VariantHeadword": "Lead", + "MainEntryId": "b26c4da8-08fe-9bf7-5ceb-6538be2ad689", + "MainSenseId": "710bd056-4f07-0627-407d-e744ffb759c3", + "MainHeadword": "Fantastic Fresh Shirt", + "Types": [ + { + "Id": "d5886872-d109-8e7c-21f0-aaac0e8efe15", + "Name": { + "ett": "Berkshire", + "gbn": "Rubber", + "suw": "payment", + "xtu": "paradigm" + }, + "DeletedAt": null + } + ], + "HideMinorEntry": true, + "Comment": { + "mls": { + "Spans": [ + { + "Text": "architect", + "Ws": "chl", + "Bold": "Off", + "FontSize": 1325800089, + "ForeColor": "#A52A2A", + "Tags": [ + "3ca232e9-ef03-a7c3-d5b1-75f06befc75c" + ] + }, + { + "Text": "Executive", + "Ws": "mls", + "Tags": [ + "b0c2ea57-6dac-4d6e-8146-c5d383587416" + ] + }, + { + "Text": "Unbranded", + "Ws": "mls", + "Tags": [ + "442f2eb4-936b-415b-807b-f0556f2f7ec5" + ] + } + ] + }, + "ibm": { + "Spans": [ + { + "Text": "override", + "Ws": "ibm", + "Tags": [ + "f9d5659d-2e1e-48cf-bee6-0f1453705837" + ] + }, + { + "Text": "Virginia", + "Ws": "ibm", + "Tags": [ + "ef5e05cf-c1ed-4497-a243-ad1e3365c5d1" + ] + } + ] + }, + "wac": { + "Spans": [ + { + "Text": "Avon", + "Ws": "gwa", + "Bold": "Invert", + "FontSize": 279365784, + "ForeColor": "#A52A2A", + "Tags": [ + "770c6ac7-0a37-293a-fcdb-cbd7d402f71b" + ] + }, + { + "Text": "initiatives", + "Ws": "wac", + "Tags": [ + "a99c4e9b-95a0-490d-89c0-13200670d310" + ] + } + ] + }, + "tl": { + "Spans": [ + { + "Text": "back up", + "Ws": "tl", + "Tags": [ + "cad367a0-ba3c-412d-b5aa-19db5f5d7037" + ] + } + ] + } + } + } + ], + "PublishIn": [ + { + "Id": "dc1d47e6-1a02-204d-923f-c8cb761a7e36", + "DeletedAt": null, + "IsMain": false, + "Name": { + "gra": "Tennessee" + } + } + ] + }, + "Id": "a9cd7853-c982-5959-3186-ec248d8d41de", + "DeletedAt": null + }, + "Output": { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "a9cd7853-c982-5959-3186-ec248d8d41de", + "DeletedAt": null, + "LexemeForm": { + "cnl": "hard drive", + "all": "Taiwan" + }, + "CitationForm": { + "pam": "District" + }, + "LiteralMeaning": { + "ama": { + "Spans": [ + { + "Text": "Sleek", + "Ws": "bbd", + "Bold": "Invert", + "FontSize": -85638709, + "ForeColor": "#ADFF2F", + "Tags": [ + "52197334-e928-b0cc-8914-ee3cca6d000e" + ] + }, + { + "Text": "Personal Loan Account", + "Ws": "ama", + "Tags": [ + "c6badbfd-0430-4245-b1f3-6dbfc3cf5ced" + ] + }, + { + "Text": "Wooden", + "Ws": "fgr", + "Bold": "Invert", + "FontSize": -1658278656, + "ForeColor": "#A52A2A", + "Tags": [ + "99c5aa5c-271c-d860-b815-a713850e4403" + ] + } + ] + }, + "jaj": { + "Spans": [ + { + "Text": "connect", + "Ws": "noi", + "Bold": "Off", + "FontSize": -1470543244, + "ForeColor": "#FF0000", + "Tags": [ + "87c38be9-027c-83c7-cb99-59210e09f3d8" + ] + }, + { + "Text": "streamline", + "Ws": "jaj", + "Tags": [ + "c49682bf-c285-4acf-9a3e-f6cb391b184b" + ] + }, + { + "Text": "Bedfordshire", + "Ws": "xcw", + "Bold": "Invert", + "FontSize": 1053195674, + "ForeColor": "#FF0000", + "Tags": [ + "f0ab79c7-ddff-63a0-1746-2825fd24206e" + ] + } + ] + } + }, + "MorphType": "Suffix", + "HomographNumber": 996368112, + "Senses": [], + "Note": { + "nrb": { + "Spans": [ + { + "Text": "blockchains", + "Ws": "nrb", + "Tags": [ + "b62b9429-69ad-4f80-a66b-b3678383663b" + ] + }, + { + "Text": "Ergonomic Soft Shoes", + "Ws": "jac", + "Bold": "On", + "FontSize": -1052383363, + "ForeColor": "#A52A2A", + "Tags": [ + "a9a9dec9-08cc-2c34-a5ca-cf78d1107839" + ] + }, + { + "Text": "Tasty", + "Ws": "nrb", + "Tags": [ + "462f2665-8c79-4f7f-be99-86a100958929" + ] + }, + { + "Text": "Shoes", + "Ws": "khr", + "Bold": "Invert", + "FontSize": 492536191, + "ForeColor": "#ADFF2F", + "Tags": [ + "27770394-7f08-6701-ac8a-e78f75048a9b" + ] + } + ] + }, + "cky": { + "Spans": [ + { + "Text": "Auto Loan Account", + "Ws": "cky", + "Tags": [ + "d864c261-66c8-4887-94ec-32d891358f72" + ] + }, + { + "Text": "Montana", + "Ws": "cky", + "Tags": [ + "4562dc77-f99d-4de1-b832-cd8473543713" + ] + }, + { + "Text": "optimal", + "Ws": "avt", + "Bold": "Invert", + "FontSize": 212594793, + "ForeColor": "#00FFFF", + "Tags": [ + "8bbd2e0e-13a5-b378-3193-a1a9498f4a1d" + ] + } + ] + }, + "aqp": { + "Spans": [ + { + "Text": "cross-platform", + "Ws": "wbq", + "Bold": "On", + "FontSize": -1898908819, + "ForeColor": "#ADFF2F", + "Tags": [ + "1a98d7cc-742b-9e51-64e8-4849f6811d32" + ] + } + ] + } + }, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [ + { + "Id": "bfea70b0-ebd5-86d8-ecfc-9ad4facfd9ca", + "Name": { + "aoe": "bypass" + }, + "DeletedAt": null + } + ], + "VariantOf": [ + { + "Id": "54c228d3-10b3-20c2-d7e6-38cbb280740c", + "MaybeId": "54c228d3-10b3-20c2-d7e6-38cbb280740c", + "DeletedAt": null, + "VariantEntryId": "d141258e-c100-a4fb-c1cd-63b059ddfb62", + "VariantHeadword": "Corporate", + "MainEntryId": "fc6512ab-e796-7a71-da3d-5c3edb7b3b10", + "MainSenseId": "43bf7d1b-292e-ba0c-9e10-56d4229036af", + "MainHeadword": "Chief", + "Types": [ + { + "Id": "766ce347-e58e-c772-7e7c-ec5332c5b48b", + "Order": 0 + } + ], + "HideMinorEntry": false, + "Comment": { + "iry": { + "Spans": [ + { + "Text": "Practical Cotton Pants", + "Ws": "iry", + "Tags": [ + "49a57a3f-8891-49be-8487-9bbd4f399f84" + ] + } + ] + } + } + } + ], + "Variants": [ + { + "Id": "5b9c87d1-f228-81fd-e6fc-463b4ed48bb6", + "MaybeId": "5b9c87d1-f228-81fd-e6fc-463b4ed48bb6", + "DeletedAt": null, + "VariantEntryId": "a50a0851-684a-795c-5f22-8275682b0caa", + "VariantHeadword": "Lead", + "MainEntryId": "b26c4da8-08fe-9bf7-5ceb-6538be2ad689", + "MainSenseId": "710bd056-4f07-0627-407d-e744ffb759c3", + "MainHeadword": "Fantastic Fresh Shirt", + "Types": [ + { + "Id": "d5886872-d109-8e7c-21f0-aaac0e8efe15", + "Order": 0 + } + ], + "HideMinorEntry": true, + "Comment": { + "mls": { + "Spans": [ + { + "Text": "architect", + "Ws": "chl", + "Bold": "Off", + "FontSize": 1325800089, + "ForeColor": "#A52A2A", + "Tags": [ + "3ca232e9-ef03-a7c3-d5b1-75f06befc75c" + ] + }, + { + "Text": "Executive", + "Ws": "mls", + "Tags": [ + "b0c2ea57-6dac-4d6e-8146-c5d383587416" + ] + }, + { + "Text": "Unbranded", + "Ws": "mls", + "Tags": [ + "442f2eb4-936b-415b-807b-f0556f2f7ec5" + ] + } + ] + }, + "ibm": { + "Spans": [ + { + "Text": "override", + "Ws": "ibm", + "Tags": [ + "f9d5659d-2e1e-48cf-bee6-0f1453705837" + ] + }, + { + "Text": "Virginia", + "Ws": "ibm", + "Tags": [ + "ef5e05cf-c1ed-4497-a243-ad1e3365c5d1" + ] + } + ] + }, + "wac": { + "Spans": [ + { + "Text": "Avon", + "Ws": "gwa", + "Bold": "Invert", + "FontSize": 279365784, + "ForeColor": "#A52A2A", + "Tags": [ + "770c6ac7-0a37-293a-fcdb-cbd7d402f71b" + ] + }, + { + "Text": "initiatives", + "Ws": "wac", + "Tags": [ + "a99c4e9b-95a0-490d-89c0-13200670d310" + ] + } + ] + }, + "tl": { + "Spans": [ + { + "Text": "back up", + "Ws": "tl", + "Tags": [ + "cad367a0-ba3c-412d-b5aa-19db5f5d7037" + ] + } + ] + } + } + } + ], + "PublishIn": [ + { + "Id": "dc1d47e6-1a02-204d-923f-c8cb761a7e36", + "DeletedAt": null, + "IsMain": false, + "Name": { + "gra": "Tennessee" + } + } + ] + }, + "Id": "a9cd7853-c982-5959-3186-ec248d8d41de", + "DeletedAt": null + } + }, + { + "Input": { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "3cdafca5-46e6-60ed-0b8a-e302d40f7ab8", + "DeletedAt": null, + "LexemeForm": { + "pkt": "reboot" + }, + "CitationForm": { + "bqw": "Auto Loan Account", + "myq": "1080p", + "ula": "Director", + "xwg": "Toys \u0026 Kids" + }, + "LiteralMeaning": { + "hav": { + "Spans": [ + { + "Text": "system", + "Ws": "hav", + "Tags": [ + "1d22ad30-96dc-47c3-a7f8-761b3d830b25" + ] + }, + { + "Text": "front-end", + "Ws": "mnw", + "Bold": "Off", + "FontSize": 1230763621, + "ForeColor": "#00000000", + "Tags": [ + "fd1b73bd-ad1b-a20d-c981-905c8823e12c" + ] + }, + { + "Text": "Stream", + "Ws": "bve", + "Bold": "Off", + "FontSize": 621343644, + "ForeColor": "#ADFF2F", + "Tags": [ + "aaeeb616-fd0d-f67d-7738-b0d39c4c9512" + ] + }, + { + "Text": "Electronics", + "Ws": "aiy", + "Bold": "Invert", + "FontSize": 39794053, + "ForeColor": "#A52A2A", + "Tags": [ + "7e50c044-9786-1e39-a9ac-92d54342ac3e" + ] + } + ] + }, + "dyr": { + "Spans": [ + { + "Text": "extend", + "Ws": "kve", + "Bold": "Invert", + "FontSize": -422062800, + "ForeColor": "#00FFFF", + "Tags": [ + "b6172c2b-3580-8f98-81c5-4789bb11e455" + ] + }, + { + "Text": "synthesizing", + "Ws": "aja", + "Bold": "Invert", + "FontSize": 1174438189, + "ForeColor": "#00000000", + "Tags": [ + "41548c3d-3532-3798-84aa-9d40adf93824" + ] + } + ] + }, + "pea": { + "Spans": [ + { + "Text": "back-end", + "Ws": "pea", + "Tags": [ + "3cb309a7-8115-4482-bfdc-ac8f257eb4ad" + ] + } + ] + } + }, + "MorphType": "Particle", + "HomographNumber": -762509614, + "Senses": [], + "Note": { + "mda": { + "Spans": [ + { + "Text": "frictionless", + "Ws": "mda", + "Tags": [ + "2c0851ea-e5be-41d5-b49e-cf8fec10c89c" + ] + }, + { + "Text": "collaborative", + "Ws": "prb", + "Bold": "Off", + "FontSize": -1566428427, + "ForeColor": "#00FFFF", + "Tags": [ + "c1c64703-55b8-e014-a74d-a979ac3d8e02" + ] + }, + { + "Text": "Congo", + "Ws": "mda", + "Tags": [ + "e48be2ae-71b7-45d7-a57f-358267cfff47" + ] + } + ] + }, + "kyx": { + "Spans": [ + { + "Text": "web-enabled", + "Ws": "sgh", + "Bold": "Off", + "FontSize": 1542390070, + "ForeColor": "#00FFFF", + "Tags": [ + "b23f7a6a-1857-cb51-3aa5-6694483629fe" + ] + }, + { + "Text": "back-end", + "Ws": "npl", + "Bold": "On", + "FontSize": -1671856556, + "ForeColor": "#0000FF", + "Tags": [ + "4304b005-673b-15e7-1b73-a16c7e107d62" + ] + } + ] + } + }, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [ + { + "Id": "ccfdf2a2-ac60-433a-41ea-22b4ffff2d4b", + "Name": { + "gno": "Massachusetts" + }, + "DeletedAt": null + } + ], + "VariantOf": [ + { + "Id": "9db32aab-3ce1-a8e8-3ed9-cf3b240f6968", + "MaybeId": "9db32aab-3ce1-a8e8-3ed9-cf3b240f6968", + "DeletedAt": null, + "VariantEntryId": "6d4179be-9789-faa0-a60d-0124b5e6aedc", + "VariantHeadword": "purple", + "MainEntryId": "36b6909e-b5e9-397d-05d4-1dbae22ec50a", + "MainSenseId": "266fba93-8a74-c0b3-ca71-65164b008f52", + "MainHeadword": "convergence", + "Types": [ + { + "Id": "54162871-9d18-ad79-b155-ce2f98f97265", + "Name": { + "bwh": "back up", + "xba": "reinvent", + "aza": "Mews" + }, + "DeletedAt": null + } + ], + "HideMinorEntry": false, + "Comment": { + "niz": { + "Spans": [ + { + "Text": "alarm", + "Ws": "niz", + "Tags": [ + "8cf34d1a-b942-4794-a42d-568e56fb1249" + ] + }, + { + "Text": "Manager", + "Ws": "niz", + "Tags": [ + "749f132e-5b62-42b7-86ff-059a2a4fcd5e" + ] + }, + { + "Text": "Madagascar", + "Ws": "ktw", + "Bold": "Off", + "FontSize": -1245901176, + "ForeColor": "#00FFFF", + "Tags": [ + "f002ec10-2a72-7416-f135-278e82c48b14" + ] + }, + { + "Text": "Fresh", + "Ws": "niz", + "Tags": [ + "4257831c-6cf6-445c-bdfc-d2e10c6546fc" + ] + } + ] + }, + "pmz": { + "Spans": [ + { + "Text": "Realigned", + "Ws": "mzi", + "Bold": "Invert", + "FontSize": -208583590, + "ForeColor": "#00FFFF", + "Tags": [ + "946afd05-dfdd-48cf-6615-a55dbc30ce72" + ] + }, + { + "Text": "Optimized", + "Ws": "pmz", + "Tags": [ + "c14fd0d8-9f8f-4d81-b40e-0dc89703b261" + ] + } + ] + }, + "khr": { + "Spans": [ + { + "Text": "knowledge user", + "Ws": "mlc", + "Bold": "Off", + "FontSize": 81689857, + "ForeColor": "#ADFF2F", + "Tags": [ + "8a91586b-d2a7-c062-8089-300cf9e5b686" + ] + }, + { + "Text": "Trail", + "Ws": "khr", + "Tags": [ + "e75ec01a-e52c-4e30-b929-ad09a709fd7f" + ] + }, + { + "Text": "Metrics", + "Ws": "khr", + "Tags": [ + "f1c8ab11-3d04-484b-83aa-b473de8ce350" + ] + } + ] + } + } + } + ], + "Variants": [ + { + "Id": "9a6a68d5-58a6-81c0-ab95-e365558ee35a", + "MaybeId": "9a6a68d5-58a6-81c0-ab95-e365558ee35a", + "DeletedAt": null, + "VariantEntryId": "7618d904-0761-ab81-ba1c-853b9401d1d5", + "VariantHeadword": "interfaces", + "MainEntryId": "ccc647fd-fca5-9c93-d296-43f13c223506", + "MainSenseId": "90f4721d-d38c-497f-955b-955acb2499f4", + "MainHeadword": "Fresh", + "Types": [ + { + "Id": "aa41d766-846e-2d53-cebd-50ca612bd6de", + "Name": { + "pxm": "magenta", + "lmi": "database" + }, + "DeletedAt": null + } + ], + "HideMinorEntry": false, + "Comment": { + "gcl": { + "Spans": [ + { + "Text": "Refined Rubber Sausages", + "Ws": "cmt", + "Bold": "Off", + "FontSize": -430354912, + "ForeColor": "#00FFFF", + "Tags": [ + "19fbeff0-b9b2-dbc0-83c0-18af65ac176d" + ] + }, + { + "Text": "Bedfordshire", + "Ws": "ald", + "Bold": "On", + "FontSize": -605772228, + "ForeColor": "#0000FF", + "Tags": [ + "ea667bb7-8cd0-872e-aff4-6534377ff096" + ] + }, + { + "Text": "Director", + "Ws": "gcl", + "Tags": [ + "45b61b57-989d-41f8-9ffd-ff957f611934" + ] + }, + { + "Text": "Generic Rubber Chicken", + "Ws": "omp", + "Bold": "On", + "FontSize": 1234054480, + "ForeColor": "#ADFF2F", + "Tags": [ + "93241b11-508c-6711-2e9f-99d55ed4c489" + ] + } + ] + }, + "sdu": { + "Spans": [ + { + "Text": "e-services", + "Ws": "sdu", + "Tags": [ + "69d83464-b127-45a3-8e80-1f12c6414995" + ] + }, + { + "Text": "rich", + "Ws": "psy", + "Bold": "Invert", + "FontSize": 425981535, + "ForeColor": "#A52A2A", + "Tags": [ + "cb4eafe1-71dc-53cf-e8d1-87fee8792d65" + ] + }, + { + "Text": "Cote d\u0027Ivoire", + "Ws": "gyi", + "Bold": "Off", + "FontSize": -802216504, + "ForeColor": "#ADFF2F", + "Tags": [ + "3be90aaa-fb8b-21c8-f217-daa170c8d4f6" + ] + } + ] + } + } + } + ], + "PublishIn": [ + { + "Id": "d2892b2c-fc81-8c2f-5586-baa81b6d1530", + "DeletedAt": null, + "IsMain": false, + "Name": { + "mnj": "Plastic" + } + } + ] + }, + "Id": "3cdafca5-46e6-60ed-0b8a-e302d40f7ab8", + "DeletedAt": null + }, + "Output": { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "3cdafca5-46e6-60ed-0b8a-e302d40f7ab8", + "DeletedAt": null, + "LexemeForm": { + "pkt": "reboot" + }, + "CitationForm": { + "bqw": "Auto Loan Account", + "myq": "1080p", + "ula": "Director", + "xwg": "Toys \u0026 Kids" + }, + "LiteralMeaning": { + "hav": { + "Spans": [ + { + "Text": "system", + "Ws": "hav", + "Tags": [ + "1d22ad30-96dc-47c3-a7f8-761b3d830b25" + ] + }, + { + "Text": "front-end", + "Ws": "mnw", + "Bold": "Off", + "FontSize": 1230763621, + "ForeColor": "#00000000", + "Tags": [ + "fd1b73bd-ad1b-a20d-c981-905c8823e12c" + ] + }, + { + "Text": "Stream", + "Ws": "bve", + "Bold": "Off", + "FontSize": 621343644, + "ForeColor": "#ADFF2F", + "Tags": [ + "aaeeb616-fd0d-f67d-7738-b0d39c4c9512" + ] + }, + { + "Text": "Electronics", + "Ws": "aiy", + "Bold": "Invert", + "FontSize": 39794053, + "ForeColor": "#A52A2A", + "Tags": [ + "7e50c044-9786-1e39-a9ac-92d54342ac3e" + ] + } + ] + }, + "dyr": { + "Spans": [ + { + "Text": "extend", + "Ws": "kve", + "Bold": "Invert", + "FontSize": -422062800, + "ForeColor": "#00FFFF", + "Tags": [ + "b6172c2b-3580-8f98-81c5-4789bb11e455" + ] + }, + { + "Text": "synthesizing", + "Ws": "aja", + "Bold": "Invert", + "FontSize": 1174438189, + "ForeColor": "#00000000", + "Tags": [ + "41548c3d-3532-3798-84aa-9d40adf93824" + ] + } + ] + }, + "pea": { + "Spans": [ + { + "Text": "back-end", + "Ws": "pea", + "Tags": [ + "3cb309a7-8115-4482-bfdc-ac8f257eb4ad" + ] + } + ] + } + }, + "MorphType": "Particle", + "HomographNumber": -762509614, + "Senses": [], + "Note": { + "mda": { + "Spans": [ + { + "Text": "frictionless", + "Ws": "mda", + "Tags": [ + "2c0851ea-e5be-41d5-b49e-cf8fec10c89c" + ] + }, + { + "Text": "collaborative", + "Ws": "prb", + "Bold": "Off", + "FontSize": -1566428427, + "ForeColor": "#00FFFF", + "Tags": [ + "c1c64703-55b8-e014-a74d-a979ac3d8e02" + ] + }, + { + "Text": "Congo", + "Ws": "mda", + "Tags": [ + "e48be2ae-71b7-45d7-a57f-358267cfff47" + ] + } + ] + }, + "kyx": { + "Spans": [ + { + "Text": "web-enabled", + "Ws": "sgh", + "Bold": "Off", + "FontSize": 1542390070, + "ForeColor": "#00FFFF", + "Tags": [ + "b23f7a6a-1857-cb51-3aa5-6694483629fe" + ] + }, + { + "Text": "back-end", + "Ws": "npl", + "Bold": "On", + "FontSize": -1671856556, + "ForeColor": "#0000FF", + "Tags": [ + "4304b005-673b-15e7-1b73-a16c7e107d62" + ] + } + ] + } + }, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [ + { + "Id": "ccfdf2a2-ac60-433a-41ea-22b4ffff2d4b", + "Name": { + "gno": "Massachusetts" + }, + "DeletedAt": null + } + ], + "VariantOf": [ + { + "Id": "9db32aab-3ce1-a8e8-3ed9-cf3b240f6968", + "MaybeId": "9db32aab-3ce1-a8e8-3ed9-cf3b240f6968", + "DeletedAt": null, + "VariantEntryId": "6d4179be-9789-faa0-a60d-0124b5e6aedc", + "VariantHeadword": "purple", + "MainEntryId": "36b6909e-b5e9-397d-05d4-1dbae22ec50a", + "MainSenseId": "266fba93-8a74-c0b3-ca71-65164b008f52", + "MainHeadword": "convergence", + "Types": [ + { + "Id": "54162871-9d18-ad79-b155-ce2f98f97265", + "Order": 0 + } + ], + "HideMinorEntry": false, + "Comment": { + "niz": { + "Spans": [ + { + "Text": "alarm", + "Ws": "niz", + "Tags": [ + "8cf34d1a-b942-4794-a42d-568e56fb1249" + ] + }, + { + "Text": "Manager", + "Ws": "niz", + "Tags": [ + "749f132e-5b62-42b7-86ff-059a2a4fcd5e" + ] + }, + { + "Text": "Madagascar", + "Ws": "ktw", + "Bold": "Off", + "FontSize": -1245901176, + "ForeColor": "#00FFFF", + "Tags": [ + "f002ec10-2a72-7416-f135-278e82c48b14" + ] + }, + { + "Text": "Fresh", + "Ws": "niz", + "Tags": [ + "4257831c-6cf6-445c-bdfc-d2e10c6546fc" + ] + } + ] + }, + "pmz": { + "Spans": [ + { + "Text": "Realigned", + "Ws": "mzi", + "Bold": "Invert", + "FontSize": -208583590, + "ForeColor": "#00FFFF", + "Tags": [ + "946afd05-dfdd-48cf-6615-a55dbc30ce72" + ] + }, + { + "Text": "Optimized", + "Ws": "pmz", + "Tags": [ + "c14fd0d8-9f8f-4d81-b40e-0dc89703b261" + ] + } + ] + }, + "khr": { + "Spans": [ + { + "Text": "knowledge user", + "Ws": "mlc", + "Bold": "Off", + "FontSize": 81689857, + "ForeColor": "#ADFF2F", + "Tags": [ + "8a91586b-d2a7-c062-8089-300cf9e5b686" + ] + }, + { + "Text": "Trail", + "Ws": "khr", + "Tags": [ + "e75ec01a-e52c-4e30-b929-ad09a709fd7f" + ] + }, + { + "Text": "Metrics", + "Ws": "khr", + "Tags": [ + "f1c8ab11-3d04-484b-83aa-b473de8ce350" + ] + } + ] + } + } + } + ], + "Variants": [ + { + "Id": "9a6a68d5-58a6-81c0-ab95-e365558ee35a", + "MaybeId": "9a6a68d5-58a6-81c0-ab95-e365558ee35a", + "DeletedAt": null, + "VariantEntryId": "7618d904-0761-ab81-ba1c-853b9401d1d5", + "VariantHeadword": "interfaces", + "MainEntryId": "ccc647fd-fca5-9c93-d296-43f13c223506", + "MainSenseId": "90f4721d-d38c-497f-955b-955acb2499f4", + "MainHeadword": "Fresh", + "Types": [ + { + "Id": "aa41d766-846e-2d53-cebd-50ca612bd6de", + "Order": 0 + } + ], + "HideMinorEntry": false, + "Comment": { + "gcl": { + "Spans": [ + { + "Text": "Refined Rubber Sausages", + "Ws": "cmt", + "Bold": "Off", + "FontSize": -430354912, + "ForeColor": "#00FFFF", + "Tags": [ + "19fbeff0-b9b2-dbc0-83c0-18af65ac176d" + ] + }, + { + "Text": "Bedfordshire", + "Ws": "ald", + "Bold": "On", + "FontSize": -605772228, + "ForeColor": "#0000FF", + "Tags": [ + "ea667bb7-8cd0-872e-aff4-6534377ff096" + ] + }, + { + "Text": "Director", + "Ws": "gcl", + "Tags": [ + "45b61b57-989d-41f8-9ffd-ff957f611934" + ] + }, + { + "Text": "Generic Rubber Chicken", + "Ws": "omp", + "Bold": "On", + "FontSize": 1234054480, + "ForeColor": "#ADFF2F", + "Tags": [ + "93241b11-508c-6711-2e9f-99d55ed4c489" + ] + } + ] + }, + "sdu": { + "Spans": [ + { + "Text": "e-services", + "Ws": "sdu", + "Tags": [ + "69d83464-b127-45a3-8e80-1f12c6414995" + ] + }, + { + "Text": "rich", + "Ws": "psy", + "Bold": "Invert", + "FontSize": 425981535, + "ForeColor": "#A52A2A", + "Tags": [ + "cb4eafe1-71dc-53cf-e8d1-87fee8792d65" + ] + }, + { + "Text": "Cote d\u0027Ivoire", + "Ws": "gyi", + "Bold": "Off", + "FontSize": -802216504, + "ForeColor": "#ADFF2F", + "Tags": [ + "3be90aaa-fb8b-21c8-f217-daa170c8d4f6" + ] + } + ] + } + } + } + ], + "PublishIn": [ + { + "Id": "d2892b2c-fc81-8c2f-5586-baa81b6d1530", + "DeletedAt": null, + "IsMain": false, + "Name": { + "mnj": "Plastic" + } + } + ] + }, + "Id": "3cdafca5-46e6-60ed-0b8a-e302d40f7ab8", + "DeletedAt": null + } + }, + { + "Input": { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "21b941a4-fbb7-f706-0aab-529c84b402b5", + "DeletedAt": null, + "LexemeForm": { + "nar": "Tasty Rubber Chair", + "luh": "Brunei Dollar", + "mok": "navigate" + }, + "CitationForm": { + "mih": "hub", + "tiq": "New Zealand Dollar" + }, + "LiteralMeaning": { + "mtu": { + "Spans": [ + { + "Text": "Unbranded Rubber Sausages", + "Ws": "qvo", + "Bold": "Off", + "FontSize": 1178067194, + "ForeColor": "#A52A2A", + "Tags": [ + "d321668f-b5fb-4eea-8064-de2784319aa4" + ] + }, + { + "Text": "Soft", + "Ws": "jio", + "Bold": "On", + "FontSize": 897718303, + "ForeColor": "#A52A2A", + "Tags": [ + "9a5e7604-a21f-546d-3b49-d730a05bacb7" + ] + }, + { + "Text": "haptic", + "Ws": "mtu", + "Tags": [ + "ba19fe02-0e18-4e92-9fb4-73f7b4ff7e29" + ] + } + ] + }, + "tnc": { + "Spans": [ + { + "Text": "Practical", + "Ws": "wof", + "Bold": "Off", + "FontSize": -1535748655, + "ForeColor": "#00FFFF", + "Tags": [ + "bfb0c24e-3275-7312-a6af-171f2e77adea" + ] + }, + { + "Text": "quantifying", + "Ws": "awy", + "Bold": "Off", + "FontSize": -281573942, + "ForeColor": "#ADFF2F", + "Tags": [ + "e9bdeced-7404-3248-6b7d-3d73579133b4" + ] + }, + { + "Text": "Lebanese Pound", + "Ws": "tnc", + "Tags": [ + "d9b188e4-9a17-4636-a39b-ca4268035281" + ] + }, + { + "Text": "Officer", + "Ws": "kwy", + "Bold": "Off", + "FontSize": -907207124, + "ForeColor": "#ADFF2F", + "Tags": [ + "6f598667-4c76-a59f-6639-d85fa5caaee3" + ] + } + ] + }, + "met": { + "Spans": [ + { + "Text": "incremental", + "Ws": "kpl", + "Bold": "On", + "FontSize": 309135679, + "ForeColor": "#A52A2A", + "Tags": [ + "b76f0bac-9fe3-afb3-cc64-c01aa7c650cc" + ] + }, + { + "Text": "Awesome Steel Shirt", + "Ws": "met", + "Tags": [ + "421ee914-5d3a-4ccb-b71e-114b560efe88" + ] + }, + { + "Text": "XSS", + "Ws": "met", + "Tags": [ + "9cf1278d-37a5-4ba7-968d-0817a1280b1d" + ] + }, + { + "Text": "Wyoming", + "Ws": "lkh", + "Bold": "Off", + "FontSize": 2029647080, + "ForeColor": "#00FFFF", + "Tags": [ + "ccf7b25b-931a-7f85-62e9-5fe9b49d7aa0" + ] + } + ] + }, + "bmk": { + "Spans": [ + { + "Text": "incubate", + "Ws": "bmk", + "Tags": [ + "27ff80df-e700-49db-8a7b-517933050d07" + ] + }, + { + "Text": "Rubber", + "Ws": "ddi", + "Bold": "Off", + "FontSize": 1247133799, + "ForeColor": "#A52A2A", + "Tags": [ + "520317dc-2190-3cf0-bbba-bcd6ff830999" + ] + }, + { + "Text": "Buckinghamshire", + "Ws": "bmk", + "Tags": [ + "35e9e4c6-24fe-46aa-b3ea-788e4729a500" + ] + } + ] + } + }, + "MorphType": "Enclitic", + "HomographNumber": 288646034, + "Senses": [], + "Note": { + "obl": { + "Spans": [ + { + "Text": "Maryland", + "Ws": "yhd", + "Bold": "Off", + "FontSize": -49334912, + "ForeColor": "#00000000", + "Tags": [ + "2d8fec7c-5396-ea81-55e2-28e9ca2fb19a" + ] + } + ] + }, + "urn": { + "Spans": [ + { + "Text": "PCI", + "Ws": "apz", + "Bold": "Invert", + "FontSize": -101349684, + "ForeColor": "#ADFF2F", + "Tags": [ + "3f4fcdb6-49ae-0047-84a9-dd8c5387e0c6" + ] + } + ] + }, + "vmd": { + "Spans": [ + { + "Text": "whiteboard", + "Ws": "vmd", + "Tags": [ + "ac082b83-c17e-4dde-88e4-f5496c06da55" + ] + }, + { + "Text": "cutting-edge", + "Ws": "vmd", + "Tags": [ + "ebc22ab4-9861-469b-8eb3-24bd8ee77271" + ] + } + ] + }, + "lo": { + "Spans": [ + { + "Text": "Graphical User Interface", + "Ws": "sjc", + "Bold": "Invert", + "FontSize": 1010008301, + "ForeColor": "#FF0000", + "Tags": [ + "738f95ee-777f-bd8e-9c25-fdf853919571" + ] + }, + { + "Text": "Trace", + "Ws": "lo", + "Tags": [ + "cec5d529-8bef-40d1-9007-8284f9b62813" + ] + } + ] + } + }, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [ + { + "Id": "e011543b-218d-8dc9-cb5b-ef51b039e01b", + "Name": { + "hih": "transition" + }, + "DeletedAt": null + } + ], + "VariantOf": [ + { + "Id": "81e7a0f3-07ae-9501-c9fc-012c9f4d72f8", + "MaybeId": "81e7a0f3-07ae-9501-c9fc-012c9f4d72f8", + "DeletedAt": null, + "VariantEntryId": "0d7ecb9e-640e-0136-3177-5f3725e3ff9c", + "VariantHeadword": "copying", + "MainEntryId": "c28531d2-4de4-3de3-36c3-c4eda08de343", + "MainSenseId": "917b785c-8a5c-d651-e6bf-8ee95b975268", + "MainHeadword": "matrix", + "Types": [ + { + "Id": "47b33565-0be3-32c4-e0ad-348f191b6763", + "Name": { + "tto": "Function-based", + "mln": "Toys \u0026 Health" + }, + "DeletedAt": null + } + ], + "HideMinorEntry": false, + "Comment": { + "kdu": { + "Spans": [ + { + "Text": "Soft", + "Ws": "lbb", + "Bold": "Off", + "FontSize": 1504894779, + "ForeColor": "#ADFF2F", + "Tags": [ + "23000220-e88c-70d5-9add-4df3ce8fe113" + ] + }, + { + "Text": "Azerbaijanian Manat", + "Ws": "kdu", + "Tags": [ + "84781e74-2daf-4343-9163-07146adbf10d" + ] + }, + { + "Text": "Fantastic", + "Ws": "kdu", + "Tags": [ + "bf26f933-43e6-4836-8110-83a70c57ed9c" + ] + } + ] + }, + "kgu": { + "Spans": [ + { + "Text": "Savings Account", + "Ws": "hmi", + "Bold": "Invert", + "FontSize": -1415115979, + "ForeColor": "#A52A2A", + "Tags": [ + "eae2f706-1777-c843-9406-53c52fa6c245" + ] + }, + { + "Text": "index", + "Ws": "kgu", + "Tags": [ + "7a3a569c-2ed4-4fa2-8c32-79435d943ba6" + ] + } + ] + }, + "dlg": { + "Spans": [ + { + "Text": "Wooden", + "Ws": "dlg", + "Tags": [ + "fd4f43a8-1fa6-4269-aab0-4e6d4d4bcd92" + ] + }, + { + "Text": "website", + "Ws": "dlg", + "Tags": [ + "03d3f612-c192-428d-97f4-419ca77bed8e" + ] + }, + { + "Text": "Manager", + "Ws": "gvs", + "Bold": "On", + "FontSize": -1069962004, + "ForeColor": "#00FFFF", + "Tags": [ + "8dc4a280-da41-d085-2e52-9787f7db26ea" + ] + } + ] + }, + "mtf": { + "Spans": [ + { + "Text": "Licensed Plastic Sausages", + "Ws": "nra", + "Bold": "On", + "FontSize": -883851573, + "ForeColor": "#0000FF", + "Tags": [ + "4f6ea9d5-5680-42bb-93b4-ceb1d18b90a3" + ] + }, + { + "Text": "Progressive", + "Ws": "mtf", + "Tags": [ + "3a8e2fe9-679c-4a3d-a980-d82240464ed2" + ] + }, + { + "Text": "Borders", + "Ws": "mtf", + "Tags": [ + "0af175a1-59ef-42e2-886c-73b6a11ad0e1" + ] + } + ] + } + } + } + ], + "Variants": [ + { + "Id": "9bfecd7f-6382-5236-4f2f-0a762a72fb90", + "MaybeId": "9bfecd7f-6382-5236-4f2f-0a762a72fb90", + "DeletedAt": null, + "VariantEntryId": "43f0a46f-364f-eee0-a013-1812448b50e1", + "VariantHeadword": "olive", + "MainEntryId": "9441127f-18dd-b52f-d49e-629ca50611ac", + "MainSenseId": "519758f1-a6c0-7833-468e-8f326607cf0c", + "MainHeadword": "Orchestrator", + "Types": [ + { + "Id": "0bc3123f-673b-215f-1f24-5fae892969ee", + "Name": { + "blb": "calculating", + "rga": "Awesome Metal Chicken" + }, + "DeletedAt": null + } + ], + "HideMinorEntry": true, + "Comment": { + "sfe": { + "Spans": [ + { + "Text": "synthesize", + "Ws": "wmc", + "Bold": "On", + "FontSize": -410677030, + "ForeColor": "#00FFFF", + "Tags": [ + "793b16c8-e48a-7890-bb1a-7381255585b4" + ] + }, + { + "Text": "Planner", + "Ws": "smc", + "Bold": "On", + "FontSize": 190202871, + "ForeColor": "#A52A2A", + "Tags": [ + "6109cb4e-9d80-7172-070f-aaab5148e02b" + ] + } + ] + }, + "mkp": { + "Spans": [ + { + "Text": "Port", + "Ws": "yxu", + "Bold": "Invert", + "FontSize": 1607188846, + "ForeColor": "#00FFFF", + "Tags": [ + "58bc979b-7c64-d947-165b-c7f2ebe2f63b" + ] + } + ] + }, + "ckz": { + "Spans": [ + { + "Text": "Product", + "Ws": "ywn", + "Bold": "Invert", + "FontSize": -23641957, + "ForeColor": "#A52A2A", + "Tags": [ + "b0594316-051c-beca-3f4a-fd5a3500a18d" + ] + }, + { + "Text": "approach", + "Ws": "pbm", + "Bold": "Off", + "FontSize": 1715313845, + "ForeColor": "#A52A2A", + "Tags": [ + "0eb2ca90-dde1-95d6-9801-54c992c804b3" + ] + } + ] + } + } + } + ], + "PublishIn": [ + { + "Id": "cb689065-ea18-98a0-74a6-5cb471da3fbc", + "DeletedAt": null, + "IsMain": false, + "Name": { + "lnu": "Applications" + } + } + ] + }, + "Id": "21b941a4-fbb7-f706-0aab-529c84b402b5", + "DeletedAt": null + }, + "Output": { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "21b941a4-fbb7-f706-0aab-529c84b402b5", + "DeletedAt": null, + "LexemeForm": { + "nar": "Tasty Rubber Chair", + "luh": "Brunei Dollar", + "mok": "navigate" + }, + "CitationForm": { + "mih": "hub", + "tiq": "New Zealand Dollar" + }, + "LiteralMeaning": { + "mtu": { + "Spans": [ + { + "Text": "Unbranded Rubber Sausages", + "Ws": "qvo", + "Bold": "Off", + "FontSize": 1178067194, + "ForeColor": "#A52A2A", + "Tags": [ + "d321668f-b5fb-4eea-8064-de2784319aa4" + ] + }, + { + "Text": "Soft", + "Ws": "jio", + "Bold": "On", + "FontSize": 897718303, + "ForeColor": "#A52A2A", + "Tags": [ + "9a5e7604-a21f-546d-3b49-d730a05bacb7" + ] + }, + { + "Text": "haptic", + "Ws": "mtu", + "Tags": [ + "ba19fe02-0e18-4e92-9fb4-73f7b4ff7e29" + ] + } + ] + }, + "tnc": { + "Spans": [ + { + "Text": "Practical", + "Ws": "wof", + "Bold": "Off", + "FontSize": -1535748655, + "ForeColor": "#00FFFF", + "Tags": [ + "bfb0c24e-3275-7312-a6af-171f2e77adea" + ] + }, + { + "Text": "quantifying", + "Ws": "awy", + "Bold": "Off", + "FontSize": -281573942, + "ForeColor": "#ADFF2F", + "Tags": [ + "e9bdeced-7404-3248-6b7d-3d73579133b4" + ] + }, + { + "Text": "Lebanese Pound", + "Ws": "tnc", + "Tags": [ + "d9b188e4-9a17-4636-a39b-ca4268035281" + ] + }, + { + "Text": "Officer", + "Ws": "kwy", + "Bold": "Off", + "FontSize": -907207124, + "ForeColor": "#ADFF2F", + "Tags": [ + "6f598667-4c76-a59f-6639-d85fa5caaee3" + ] + } + ] + }, + "met": { + "Spans": [ + { + "Text": "incremental", + "Ws": "kpl", + "Bold": "On", + "FontSize": 309135679, + "ForeColor": "#A52A2A", + "Tags": [ + "b76f0bac-9fe3-afb3-cc64-c01aa7c650cc" + ] + }, + { + "Text": "Awesome Steel Shirt", + "Ws": "met", + "Tags": [ + "421ee914-5d3a-4ccb-b71e-114b560efe88" + ] + }, + { + "Text": "XSS", + "Ws": "met", + "Tags": [ + "9cf1278d-37a5-4ba7-968d-0817a1280b1d" + ] + }, + { + "Text": "Wyoming", + "Ws": "lkh", + "Bold": "Off", + "FontSize": 2029647080, + "ForeColor": "#00FFFF", + "Tags": [ + "ccf7b25b-931a-7f85-62e9-5fe9b49d7aa0" + ] + } + ] + }, + "bmk": { + "Spans": [ + { + "Text": "incubate", + "Ws": "bmk", + "Tags": [ + "27ff80df-e700-49db-8a7b-517933050d07" + ] + }, + { + "Text": "Rubber", + "Ws": "ddi", + "Bold": "Off", + "FontSize": 1247133799, + "ForeColor": "#A52A2A", + "Tags": [ + "520317dc-2190-3cf0-bbba-bcd6ff830999" + ] + }, + { + "Text": "Buckinghamshire", + "Ws": "bmk", + "Tags": [ + "35e9e4c6-24fe-46aa-b3ea-788e4729a500" + ] + } + ] + } + }, + "MorphType": "Enclitic", + "HomographNumber": 288646034, + "Senses": [], + "Note": { + "obl": { + "Spans": [ + { + "Text": "Maryland", + "Ws": "yhd", + "Bold": "Off", + "FontSize": -49334912, + "ForeColor": "#00000000", + "Tags": [ + "2d8fec7c-5396-ea81-55e2-28e9ca2fb19a" + ] + } + ] + }, + "urn": { + "Spans": [ + { + "Text": "PCI", + "Ws": "apz", + "Bold": "Invert", + "FontSize": -101349684, + "ForeColor": "#ADFF2F", + "Tags": [ + "3f4fcdb6-49ae-0047-84a9-dd8c5387e0c6" + ] + } + ] + }, + "vmd": { + "Spans": [ + { + "Text": "whiteboard", + "Ws": "vmd", + "Tags": [ + "ac082b83-c17e-4dde-88e4-f5496c06da55" + ] + }, + { + "Text": "cutting-edge", + "Ws": "vmd", + "Tags": [ + "ebc22ab4-9861-469b-8eb3-24bd8ee77271" + ] + } + ] + }, + "lo": { + "Spans": [ + { + "Text": "Graphical User Interface", + "Ws": "sjc", + "Bold": "Invert", + "FontSize": 1010008301, + "ForeColor": "#FF0000", + "Tags": [ + "738f95ee-777f-bd8e-9c25-fdf853919571" + ] + }, + { + "Text": "Trace", + "Ws": "lo", + "Tags": [ + "cec5d529-8bef-40d1-9007-8284f9b62813" + ] + } + ] + } + }, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [ + { + "Id": "e011543b-218d-8dc9-cb5b-ef51b039e01b", + "Name": { + "hih": "transition" + }, + "DeletedAt": null + } + ], + "VariantOf": [ + { + "Id": "81e7a0f3-07ae-9501-c9fc-012c9f4d72f8", + "MaybeId": "81e7a0f3-07ae-9501-c9fc-012c9f4d72f8", + "DeletedAt": null, + "VariantEntryId": "0d7ecb9e-640e-0136-3177-5f3725e3ff9c", + "VariantHeadword": "copying", + "MainEntryId": "c28531d2-4de4-3de3-36c3-c4eda08de343", + "MainSenseId": "917b785c-8a5c-d651-e6bf-8ee95b975268", + "MainHeadword": "matrix", + "Types": [ + { + "Id": "47b33565-0be3-32c4-e0ad-348f191b6763", + "Order": 0 + } + ], + "HideMinorEntry": false, + "Comment": { + "kdu": { + "Spans": [ + { + "Text": "Soft", + "Ws": "lbb", + "Bold": "Off", + "FontSize": 1504894779, + "ForeColor": "#ADFF2F", + "Tags": [ + "23000220-e88c-70d5-9add-4df3ce8fe113" + ] + }, + { + "Text": "Azerbaijanian Manat", + "Ws": "kdu", + "Tags": [ + "84781e74-2daf-4343-9163-07146adbf10d" + ] + }, + { + "Text": "Fantastic", + "Ws": "kdu", + "Tags": [ + "bf26f933-43e6-4836-8110-83a70c57ed9c" + ] + } + ] + }, + "kgu": { + "Spans": [ + { + "Text": "Savings Account", + "Ws": "hmi", + "Bold": "Invert", + "FontSize": -1415115979, + "ForeColor": "#A52A2A", + "Tags": [ + "eae2f706-1777-c843-9406-53c52fa6c245" + ] + }, + { + "Text": "index", + "Ws": "kgu", + "Tags": [ + "7a3a569c-2ed4-4fa2-8c32-79435d943ba6" + ] + } + ] + }, + "dlg": { + "Spans": [ + { + "Text": "Wooden", + "Ws": "dlg", + "Tags": [ + "fd4f43a8-1fa6-4269-aab0-4e6d4d4bcd92" + ] + }, + { + "Text": "website", + "Ws": "dlg", + "Tags": [ + "03d3f612-c192-428d-97f4-419ca77bed8e" + ] + }, + { + "Text": "Manager", + "Ws": "gvs", + "Bold": "On", + "FontSize": -1069962004, + "ForeColor": "#00FFFF", + "Tags": [ + "8dc4a280-da41-d085-2e52-9787f7db26ea" + ] + } + ] + }, + "mtf": { + "Spans": [ + { + "Text": "Licensed Plastic Sausages", + "Ws": "nra", + "Bold": "On", + "FontSize": -883851573, + "ForeColor": "#0000FF", + "Tags": [ + "4f6ea9d5-5680-42bb-93b4-ceb1d18b90a3" + ] + }, + { + "Text": "Progressive", + "Ws": "mtf", + "Tags": [ + "3a8e2fe9-679c-4a3d-a980-d82240464ed2" + ] + }, + { + "Text": "Borders", + "Ws": "mtf", + "Tags": [ + "0af175a1-59ef-42e2-886c-73b6a11ad0e1" + ] + } + ] + } + } + } + ], + "Variants": [ + { + "Id": "9bfecd7f-6382-5236-4f2f-0a762a72fb90", + "MaybeId": "9bfecd7f-6382-5236-4f2f-0a762a72fb90", + "DeletedAt": null, + "VariantEntryId": "43f0a46f-364f-eee0-a013-1812448b50e1", + "VariantHeadword": "olive", + "MainEntryId": "9441127f-18dd-b52f-d49e-629ca50611ac", + "MainSenseId": "519758f1-a6c0-7833-468e-8f326607cf0c", + "MainHeadword": "Orchestrator", + "Types": [ + { + "Id": "0bc3123f-673b-215f-1f24-5fae892969ee", + "Order": 0 + } + ], + "HideMinorEntry": true, + "Comment": { + "sfe": { + "Spans": [ + { + "Text": "synthesize", + "Ws": "wmc", + "Bold": "On", + "FontSize": -410677030, + "ForeColor": "#00FFFF", + "Tags": [ + "793b16c8-e48a-7890-bb1a-7381255585b4" + ] + }, + { + "Text": "Planner", + "Ws": "smc", + "Bold": "On", + "FontSize": 190202871, + "ForeColor": "#A52A2A", + "Tags": [ + "6109cb4e-9d80-7172-070f-aaab5148e02b" + ] + } + ] + }, + "mkp": { + "Spans": [ + { + "Text": "Port", + "Ws": "yxu", + "Bold": "Invert", + "FontSize": 1607188846, + "ForeColor": "#00FFFF", + "Tags": [ + "58bc979b-7c64-d947-165b-c7f2ebe2f63b" + ] + } + ] + }, + "ckz": { + "Spans": [ + { + "Text": "Product", + "Ws": "ywn", + "Bold": "Invert", + "FontSize": -23641957, + "ForeColor": "#A52A2A", + "Tags": [ + "b0594316-051c-beca-3f4a-fd5a3500a18d" + ] + }, + { + "Text": "approach", + "Ws": "pbm", + "Bold": "Off", + "FontSize": 1715313845, + "ForeColor": "#A52A2A", + "Tags": [ + "0eb2ca90-dde1-95d6-9801-54c992c804b3" + ] + } + ] + } + } + } + ], + "PublishIn": [ + { + "Id": "cb689065-ea18-98a0-74a6-5cb471da3fbc", + "DeletedAt": null, + "IsMain": false, + "Name": { + "lnu": "Applications" + } + } + ] + }, + "Id": "21b941a4-fbb7-f706-0aab-529c84b402b5", + "DeletedAt": null + } + }, + { + "Input": { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "7ccb582e-442b-9cde-6f59-7d2658224810", + "DeletedAt": null, + "LexemeForm": { + "alt": "redefine", + "mtg": "feed", + "cie": "haptic" + }, + "CitationForm": { + "nqo": "Investment Account", + "dkg": "Optimization" + }, + "LiteralMeaning": { + "gnr": { + "Spans": [ + { + "Text": "Springs", + "Ws": "gnr", + "Tags": [ + "18fbfdb3-2e2a-4291-8b21-00702f47a4c6" + ] + }, + { + "Text": "human-resource", + "Ws": "gnr", + "Tags": [ + "90ec01f7-a258-41c9-b9dd-b4eccd570f9c" + ] + } + ] + }, + "stt": { + "Spans": [ + { + "Text": "withdrawal", + "Ws": "tpi", + "Bold": "On", + "FontSize": -1350488265, + "ForeColor": "#FF0000", + "Tags": [ + "39acebc8-f34a-93c9-4c84-f7cc84c5985d" + ] + }, + { + "Text": "Intelligent Concrete Table", + "Ws": "guq", + "Bold": "On", + "FontSize": -25655285, + "ForeColor": "#ADFF2F", + "Tags": [ + "b72087c2-32d8-29af-97ca-53158f52e13b" + ] + }, + { + "Text": "Research", + "Ws": "ani", + "Bold": "Invert", + "FontSize": 611743561, + "ForeColor": "#00FFFF", + "Tags": [ + "7debebd6-974d-0fd4-c077-c55407f924ea" + ] + } + ] + }, + "czh": { + "Spans": [ + { + "Text": "Future", + "Ws": "ypo", + "Bold": "Off", + "FontSize": 1307816951, + "ForeColor": "#FF0000", + "Tags": [ + "86cf0663-8ac2-0d8e-b85b-007c44ee27d2" + ] + }, + { + "Text": "Square", + "Ws": "czh", + "Tags": [ + "ca6c94cc-2237-4dad-af21-1e4f048b7ab4" + ] + } + ] + } + }, + "MorphType": "Circumfix", + "HomographNumber": -1416309114, + "Senses": [], + "Note": { + "xsy": { + "Spans": [ + { + "Text": "backing up", + "Ws": "nsh", + "Bold": "Off", + "FontSize": -559106786, + "ForeColor": "#FF0000", + "Tags": [ + "9c63fff5-5626-197d-9952-cca19e542578" + ] + } + ] + }, + "rgn": { + "Spans": [ + { + "Text": "Streamlined", + "Ws": "rgn", + "Tags": [ + "9edca3e0-5249-4f77-bfbb-c900353ae5c1" + ] + }, + { + "Text": "Micronesia", + "Ws": "env", + "Bold": "Invert", + "FontSize": 87635850, + "ForeColor": "#00FFFF", + "Tags": [ + "041fd30c-a5e7-f92a-e0b3-a59400a752af" + ] + }, + { + "Text": "transform", + "Ws": "cnc", + "Bold": "On", + "FontSize": -1985104153, + "ForeColor": "#FF0000", + "Tags": [ + "5c74852f-f7e5-249f-31f5-6b1d45ed8630" + ] + }, + { + "Text": "Identity", + "Ws": "byf", + "Bold": "Off", + "FontSize": -1853399160, + "ForeColor": "#0000FF", + "Tags": [ + "b6a400e8-2427-45a3-5ab1-758a2e28a6d1" + ] + } + ] + }, + "zkt": { + "Spans": [ + { + "Text": "COM", + "Ws": "yle", + "Bold": "Off", + "FontSize": 229320307, + "ForeColor": "#A52A2A", + "Tags": [ + "38575d9b-1ae7-0daa-3572-b22dcde78f5d" + ] + } + ] + }, + "sav": { + "Spans": [ + { + "Text": "Generic Steel Shirt", + "Ws": "cho", + "Bold": "Invert", + "FontSize": 1060021924, + "ForeColor": "#A52A2A", + "Tags": [ + "754ec847-76fb-1ccb-a494-dd703a87a162" + ] + }, + { + "Text": "Rustic Fresh Sausages", + "Ws": "mmv", + "Bold": "Off", + "FontSize": 1033279533, + "ForeColor": "#00000000", + "Tags": [ + "e2a95409-ebd0-322b-c20d-a2f3b3c98397" + ] + }, + { + "Text": "Tasty Plastic Table", + "Ws": "sav", + "Tags": [ + "0ac2af44-1be6-4bd7-9899-117faf3089ec" + ] + }, + { + "Text": "New Zealand", + "Ws": "sav", + "Tags": [ + "46d65c88-2ff5-4966-8463-cb5feade8426" + ] + } + ] + } + }, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [ + { + "Id": "e4009891-0d12-f226-b1c8-aa5558128394", + "Name": { + "ril": "Human" + }, + "DeletedAt": null + } + ], + "VariantOf": [ + { + "Id": "d1ceb8e2-7b90-c398-3589-7509df51c011", + "MaybeId": "d1ceb8e2-7b90-c398-3589-7509df51c011", + "DeletedAt": null, + "VariantEntryId": "9970c40e-d0c0-d21a-b1b9-1da8bc1e03de", + "VariantHeadword": "Sleek Soft Bacon", + "MainEntryId": "6638f491-2bb0-d597-aac2-c7a3f7401ac1", + "MainSenseId": "f145e4a2-c26e-6e1a-b638-cfa8e7c76b22", + "MainHeadword": "Coordinator", + "Types": [ + { + "Id": "9b171c50-74e6-0153-0532-9e150820fd84", + "Name": { + "daa": "next-generation", + "tzh": "Credit Card Account", + "soo": "Orchestrator" + }, + "DeletedAt": null + } + ], + "HideMinorEntry": true, + "Comment": { + "put": { + "Spans": [ + { + "Text": "overriding", + "Ws": "put", + "Tags": [ + "73d43eb7-259e-46b6-b97e-e862bf483e93" + ] + }, + { + "Text": "Central", + "Ws": "jao", + "Bold": "On", + "FontSize": 583944008, + "ForeColor": "#00000000", + "Tags": [ + "67f97cd8-36bb-87d6-48c8-8032e5bc70f0" + ] + }, + { + "Text": "generate", + "Ws": "gbv", + "Bold": "On", + "FontSize": -1131714599, + "ForeColor": "#A52A2A", + "Tags": [ + "576874ce-c7a4-ca02-57f2-96707015cf7e" + ] + }, + { + "Text": "Baby \u0026 Grocery", + "Ws": "hur", + "Bold": "Off", + "FontSize": 105023831, + "ForeColor": "#0000FF", + "Tags": [ + "8ee1c6c3-4571-550f-aab0-c74250e744ae" + ] + } + ] + }, + "kdp": { + "Spans": [ + { + "Text": "EXE", + "Ws": "kdp", + "Tags": [ + "d81a9037-f01a-442e-945e-2da83fc59b72" + ] + }, + { + "Text": "Street", + "Ws": "bxb", + "Bold": "Off", + "FontSize": -1107158038, + "ForeColor": "#FF0000", + "Tags": [ + "86a630b1-0d04-0ce0-4e33-b4328f318e4f" + ] + }, + { + "Text": "Cross-group", + "Ws": "kdp", + "Tags": [ + "028304f1-6068-456c-9dd6-daf2e6318035" + ] + } + ] + }, + "slc": { + "Spans": [ + { + "Text": "fresh-thinking", + "Ws": "rn", + "Bold": "On", + "FontSize": -1290428814, + "ForeColor": "#00000000", + "Tags": [ + "c8622d2c-cfdd-f92c-85f3-0c594aee98e1" + ] + }, + { + "Text": "Executive", + "Ws": "slc", + "Tags": [ + "1024acaa-5a55-48f6-a801-6d033e58f225" + ] + }, + { + "Text": "Egyptian Pound", + "Ws": "slc", + "Tags": [ + "234f074f-8d0d-4629-884f-2441eea1ddfa" + ] + }, + { + "Text": "moderator", + "Ws": "slc", + "Tags": [ + "81b664ca-2179-43ec-a71c-025af7fe288d" + ] + } + ] + } + } + } + ], + "Variants": [ + { + "Id": "3f49ac95-a997-74af-e061-6159fc340fd2", + "MaybeId": "3f49ac95-a997-74af-e061-6159fc340fd2", + "DeletedAt": null, + "VariantEntryId": "36c20f18-c9ae-c828-7cea-7bf5f4ddee03", + "VariantHeadword": "Borders", + "MainEntryId": "cc77233c-a886-c6ee-703a-4e5a4443c087", + "MainSenseId": "18a2340e-56f8-94de-bf35-bef23f6a3d76", + "MainHeadword": "Concrete", + "Types": [ + { + "Id": "39b5de5d-fc3e-6516-2ac5-fbdde15e8d90", + "Name": { + "ygi": "Granite", + "ihp": "Small Granite Salad", + "bzx": "Avon" + }, + "DeletedAt": null + } + ], + "HideMinorEntry": true, + "Comment": { + "pna": { + "Spans": [ + { + "Text": "Guinea", + "Ws": "twq", + "Bold": "Off", + "FontSize": 548037479, + "ForeColor": "#00FFFF", + "Tags": [ + "b31e5ede-63ce-0ec0-f672-6801296e0617" + ] + }, + { + "Text": "Minnesota", + "Ws": "zor", + "Bold": "On", + "FontSize": -1619185103, + "ForeColor": "#00000000", + "Tags": [ + "6db14049-c1d8-4610-67b6-f080a67d198c" + ] + } + ] + }, + "nii": { + "Spans": [ + { + "Text": "Florida", + "Ws": "kqj", + "Bold": "On", + "FontSize": 1839918198, + "ForeColor": "#00FFFF", + "Tags": [ + "54a11218-ede8-4a66-e796-8fb5954a2866" + ] + } + ] + }, + "goh": { + "Spans": [ + { + "Text": "Re-engineered", + "Ws": "ppu", + "Bold": "On", + "FontSize": 121777806, + "ForeColor": "#FF0000", + "Tags": [ + "d7394e85-12ef-0453-59a4-f789ec8cd6b6" + ] + } + ] + }, + "mss": { + "Spans": [ + { + "Text": "Rustic", + "Ws": "sok", + "Bold": "On", + "FontSize": -232538291, + "ForeColor": "#FF0000", + "Tags": [ + "672e67c4-f22f-4f38-e5ef-fa8230ae0642" + ] + }, + { + "Text": "Fantastic", + "Ws": "mss", + "Tags": [ + "4b2371f2-69a7-4056-a1c5-f0b4151e85b8" + ] + }, + { + "Text": "Gibraltar Pound", + "Ws": "mss", + "Tags": [ + "0ef5a73e-8c43-42b3-8637-1bb90d0b2b62" + ] + } + ] + } + } + } + ], + "PublishIn": [ + { + "Id": "a27a7789-bcba-ee7a-57d3-fa256d3356c1", + "DeletedAt": null, + "IsMain": false, + "Name": { + "kkk": "Analyst", + "dkk": "Investment Account" + } + } + ] + }, + "Id": "7ccb582e-442b-9cde-6f59-7d2658224810", + "DeletedAt": null + }, + "Output": { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "7ccb582e-442b-9cde-6f59-7d2658224810", + "DeletedAt": null, + "LexemeForm": { + "alt": "redefine", + "mtg": "feed", + "cie": "haptic" + }, + "CitationForm": { + "nqo": "Investment Account", + "dkg": "Optimization" + }, + "LiteralMeaning": { + "gnr": { + "Spans": [ + { + "Text": "Springs", + "Ws": "gnr", + "Tags": [ + "18fbfdb3-2e2a-4291-8b21-00702f47a4c6" + ] + }, + { + "Text": "human-resource", + "Ws": "gnr", + "Tags": [ + "90ec01f7-a258-41c9-b9dd-b4eccd570f9c" + ] + } + ] + }, + "stt": { + "Spans": [ + { + "Text": "withdrawal", + "Ws": "tpi", + "Bold": "On", + "FontSize": -1350488265, + "ForeColor": "#FF0000", + "Tags": [ + "39acebc8-f34a-93c9-4c84-f7cc84c5985d" + ] + }, + { + "Text": "Intelligent Concrete Table", + "Ws": "guq", + "Bold": "On", + "FontSize": -25655285, + "ForeColor": "#ADFF2F", + "Tags": [ + "b72087c2-32d8-29af-97ca-53158f52e13b" + ] + }, + { + "Text": "Research", + "Ws": "ani", + "Bold": "Invert", + "FontSize": 611743561, + "ForeColor": "#00FFFF", + "Tags": [ + "7debebd6-974d-0fd4-c077-c55407f924ea" + ] + } + ] + }, + "czh": { + "Spans": [ + { + "Text": "Future", + "Ws": "ypo", + "Bold": "Off", + "FontSize": 1307816951, + "ForeColor": "#FF0000", + "Tags": [ + "86cf0663-8ac2-0d8e-b85b-007c44ee27d2" + ] + }, + { + "Text": "Square", + "Ws": "czh", + "Tags": [ + "ca6c94cc-2237-4dad-af21-1e4f048b7ab4" + ] + } + ] + } + }, + "MorphType": "Circumfix", + "HomographNumber": -1416309114, + "Senses": [], + "Note": { + "xsy": { + "Spans": [ + { + "Text": "backing up", + "Ws": "nsh", + "Bold": "Off", + "FontSize": -559106786, + "ForeColor": "#FF0000", + "Tags": [ + "9c63fff5-5626-197d-9952-cca19e542578" + ] + } + ] + }, + "rgn": { + "Spans": [ + { + "Text": "Streamlined", + "Ws": "rgn", + "Tags": [ + "9edca3e0-5249-4f77-bfbb-c900353ae5c1" + ] + }, + { + "Text": "Micronesia", + "Ws": "env", + "Bold": "Invert", + "FontSize": 87635850, + "ForeColor": "#00FFFF", + "Tags": [ + "041fd30c-a5e7-f92a-e0b3-a59400a752af" + ] + }, + { + "Text": "transform", + "Ws": "cnc", + "Bold": "On", + "FontSize": -1985104153, + "ForeColor": "#FF0000", + "Tags": [ + "5c74852f-f7e5-249f-31f5-6b1d45ed8630" + ] + }, + { + "Text": "Identity", + "Ws": "byf", + "Bold": "Off", + "FontSize": -1853399160, + "ForeColor": "#0000FF", + "Tags": [ + "b6a400e8-2427-45a3-5ab1-758a2e28a6d1" + ] + } + ] + }, + "zkt": { + "Spans": [ + { + "Text": "COM", + "Ws": "yle", + "Bold": "Off", + "FontSize": 229320307, + "ForeColor": "#A52A2A", + "Tags": [ + "38575d9b-1ae7-0daa-3572-b22dcde78f5d" + ] + } + ] + }, + "sav": { + "Spans": [ + { + "Text": "Generic Steel Shirt", + "Ws": "cho", + "Bold": "Invert", + "FontSize": 1060021924, + "ForeColor": "#A52A2A", + "Tags": [ + "754ec847-76fb-1ccb-a494-dd703a87a162" + ] + }, + { + "Text": "Rustic Fresh Sausages", + "Ws": "mmv", + "Bold": "Off", + "FontSize": 1033279533, + "ForeColor": "#00000000", + "Tags": [ + "e2a95409-ebd0-322b-c20d-a2f3b3c98397" + ] + }, + { + "Text": "Tasty Plastic Table", + "Ws": "sav", + "Tags": [ + "0ac2af44-1be6-4bd7-9899-117faf3089ec" + ] + }, + { + "Text": "New Zealand", + "Ws": "sav", + "Tags": [ + "46d65c88-2ff5-4966-8463-cb5feade8426" + ] + } + ] + } + }, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [ + { + "Id": "e4009891-0d12-f226-b1c8-aa5558128394", + "Name": { + "ril": "Human" + }, + "DeletedAt": null + } + ], + "VariantOf": [ + { + "Id": "d1ceb8e2-7b90-c398-3589-7509df51c011", + "MaybeId": "d1ceb8e2-7b90-c398-3589-7509df51c011", + "DeletedAt": null, + "VariantEntryId": "9970c40e-d0c0-d21a-b1b9-1da8bc1e03de", + "VariantHeadword": "Sleek Soft Bacon", + "MainEntryId": "6638f491-2bb0-d597-aac2-c7a3f7401ac1", + "MainSenseId": "f145e4a2-c26e-6e1a-b638-cfa8e7c76b22", + "MainHeadword": "Coordinator", + "Types": [ + { + "Id": "9b171c50-74e6-0153-0532-9e150820fd84", + "Order": 0 + } + ], + "HideMinorEntry": true, + "Comment": { + "put": { + "Spans": [ + { + "Text": "overriding", + "Ws": "put", + "Tags": [ + "73d43eb7-259e-46b6-b97e-e862bf483e93" + ] + }, + { + "Text": "Central", + "Ws": "jao", + "Bold": "On", + "FontSize": 583944008, + "ForeColor": "#00000000", + "Tags": [ + "67f97cd8-36bb-87d6-48c8-8032e5bc70f0" + ] + }, + { + "Text": "generate", + "Ws": "gbv", + "Bold": "On", + "FontSize": -1131714599, + "ForeColor": "#A52A2A", + "Tags": [ + "576874ce-c7a4-ca02-57f2-96707015cf7e" + ] + }, + { + "Text": "Baby \u0026 Grocery", + "Ws": "hur", + "Bold": "Off", + "FontSize": 105023831, + "ForeColor": "#0000FF", + "Tags": [ + "8ee1c6c3-4571-550f-aab0-c74250e744ae" + ] + } + ] + }, + "kdp": { + "Spans": [ + { + "Text": "EXE", + "Ws": "kdp", + "Tags": [ + "d81a9037-f01a-442e-945e-2da83fc59b72" + ] + }, + { + "Text": "Street", + "Ws": "bxb", + "Bold": "Off", + "FontSize": -1107158038, + "ForeColor": "#FF0000", + "Tags": [ + "86a630b1-0d04-0ce0-4e33-b4328f318e4f" + ] + }, + { + "Text": "Cross-group", + "Ws": "kdp", + "Tags": [ + "028304f1-6068-456c-9dd6-daf2e6318035" + ] + } + ] + }, + "slc": { + "Spans": [ + { + "Text": "fresh-thinking", + "Ws": "rn", + "Bold": "On", + "FontSize": -1290428814, + "ForeColor": "#00000000", + "Tags": [ + "c8622d2c-cfdd-f92c-85f3-0c594aee98e1" + ] + }, + { + "Text": "Executive", + "Ws": "slc", + "Tags": [ + "1024acaa-5a55-48f6-a801-6d033e58f225" + ] + }, + { + "Text": "Egyptian Pound", + "Ws": "slc", + "Tags": [ + "234f074f-8d0d-4629-884f-2441eea1ddfa" + ] + }, + { + "Text": "moderator", + "Ws": "slc", + "Tags": [ + "81b664ca-2179-43ec-a71c-025af7fe288d" + ] + } + ] + } + } + } + ], + "Variants": [ + { + "Id": "3f49ac95-a997-74af-e061-6159fc340fd2", + "MaybeId": "3f49ac95-a997-74af-e061-6159fc340fd2", + "DeletedAt": null, + "VariantEntryId": "36c20f18-c9ae-c828-7cea-7bf5f4ddee03", + "VariantHeadword": "Borders", + "MainEntryId": "cc77233c-a886-c6ee-703a-4e5a4443c087", + "MainSenseId": "18a2340e-56f8-94de-bf35-bef23f6a3d76", + "MainHeadword": "Concrete", + "Types": [ + { + "Id": "39b5de5d-fc3e-6516-2ac5-fbdde15e8d90", + "Order": 0 + } + ], + "HideMinorEntry": true, + "Comment": { + "pna": { + "Spans": [ + { + "Text": "Guinea", + "Ws": "twq", + "Bold": "Off", + "FontSize": 548037479, + "ForeColor": "#00FFFF", + "Tags": [ + "b31e5ede-63ce-0ec0-f672-6801296e0617" + ] + }, + { + "Text": "Minnesota", + "Ws": "zor", + "Bold": "On", + "FontSize": -1619185103, + "ForeColor": "#00000000", + "Tags": [ + "6db14049-c1d8-4610-67b6-f080a67d198c" + ] + } + ] + }, + "nii": { + "Spans": [ + { + "Text": "Florida", + "Ws": "kqj", + "Bold": "On", + "FontSize": 1839918198, + "ForeColor": "#00FFFF", + "Tags": [ + "54a11218-ede8-4a66-e796-8fb5954a2866" + ] + } + ] + }, + "goh": { + "Spans": [ + { + "Text": "Re-engineered", + "Ws": "ppu", + "Bold": "On", + "FontSize": 121777806, + "ForeColor": "#FF0000", + "Tags": [ + "d7394e85-12ef-0453-59a4-f789ec8cd6b6" + ] + } + ] + }, + "mss": { + "Spans": [ + { + "Text": "Rustic", + "Ws": "sok", + "Bold": "On", + "FontSize": -232538291, + "ForeColor": "#FF0000", + "Tags": [ + "672e67c4-f22f-4f38-e5ef-fa8230ae0642" + ] + }, + { + "Text": "Fantastic", + "Ws": "mss", + "Tags": [ + "4b2371f2-69a7-4056-a1c5-f0b4151e85b8" + ] + }, + { + "Text": "Gibraltar Pound", + "Ws": "mss", + "Tags": [ + "0ef5a73e-8c43-42b3-8637-1bb90d0b2b62" + ] + } + ] + } + } + } + ], + "PublishIn": [ + { + "Id": "a27a7789-bcba-ee7a-57d3-fa256d3356c1", + "DeletedAt": null, + "IsMain": false, + "Name": { + "kkk": "Analyst", + "dkk": "Investment Account" + } + } + ] + }, + "Id": "7ccb582e-442b-9cde-6f59-7d2658224810", + "DeletedAt": null + } + }, + { + "Input": { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "c3c7439d-8508-897d-ec90-dfb8c6233f52", + "DeletedAt": null, + "LexemeForm": { + "sbf": "Triple-buffered", + "nuo": "clear-thinking", + "ewo": "modular" + }, + "CitationForm": { + "mzp": "Rial Omani" + }, + "LiteralMeaning": { + "mku": { + "Spans": [ + { + "Text": "holistic", + "Ws": "mku", + "Tags": [ + "9350e875-0918-4188-8b80-e94b87a852bf" + ] + }, + { + "Text": "Oklahoma", + "Ws": "bnx", + "Bold": "On", + "FontSize": 1103510228, + "ForeColor": "#FF0000", + "Tags": [ + "ed09f714-b175-6596-9983-16cdf0cf34d8" + ] + }, + { + "Text": "Handcrafted", + "Ws": "mku", + "Tags": [ + "182d16db-157e-4fbc-9d8d-fb3df1acc534" + ] + } + ] + }, + "kdr": { + "Spans": [ + { + "Text": "Liaison", + "Ws": "kdr", + "Tags": [ + "f526be31-e1dc-4710-b90d-0c747d57434f" + ] + } + ] + } + }, + "MorphType": "Prefix", + "HomographNumber": -1630247524, + "Senses": [], + "Note": { + "crv": { + "Spans": [ + { + "Text": "Isle of Man", + "Ws": "crv", + "Tags": [ + "7bde6377-d4cb-49ae-9803-86cd678d56d7" + ] + }, + { + "Text": "projection", + "Ws": "crv", + "Tags": [ + "764ca726-5a42-499a-8965-0da244a52a6a" + ] + }, + { + "Text": "transmitting", + "Ws": "hnn", + "Bold": "Off", + "FontSize": -1687247291, + "ForeColor": "#ADFF2F", + "Tags": [ + "54262fd2-0ed1-d0ec-59b2-c2ade27b2a03" + ] + } + ] + }, + "gnw": { + "Spans": [ + { + "Text": "Neck", + "Ws": "bvo", + "Bold": "Off", + "FontSize": -990208762, + "ForeColor": "#00FFFF", + "Tags": [ + "99ed537a-80b3-8de1-7650-6365d2e6083f" + ] + }, + { + "Text": "Data", + "Ws": "gnw", + "Tags": [ + "d241a639-233a-45c7-8935-7b9f3f06157a" + ] + }, + { + "Text": "withdrawal", + "Ws": "pmf", + "Bold": "Off", + "FontSize": -1959771791, + "ForeColor": "#0000FF", + "Tags": [ + "8fd780f0-42f6-34ec-0f95-356321691992" + ] + } + ] + }, + "ekm": { + "Spans": [ + { + "Text": "Developer", + "Ws": "hag", + "Bold": "Invert", + "FontSize": -858017395, + "ForeColor": "#0000FF", + "Tags": [ + "846f0198-2a38-de9c-5c83-d597ce88fecd" + ] + }, + { + "Text": "Handcrafted", + "Ws": "mix", + "Bold": "On", + "FontSize": -1819622732, + "ForeColor": "#FF0000", + "Tags": [ + "bce2d057-9660-de23-ad57-3783b9014de8" + ] + } + ] + } + }, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [ + { + "Id": "68f76f7d-5ec4-2006-ed56-236b8c0acdb3", + "Name": { + "mtn": "Libyan Dinar", + "kot": "white", + "sax": "Accounts", + "tlu": "invoice" + }, + "DeletedAt": null + } + ], + "VariantOf": [ + { + "Id": "30687039-cd15-839f-0f15-88239cea4ee7", + "MaybeId": "30687039-cd15-839f-0f15-88239cea4ee7", + "DeletedAt": null, + "VariantEntryId": "a7cea784-faa5-08b1-5a30-ea546c3e84a6", + "VariantHeadword": "methodologies", + "MainEntryId": "d38e046a-5051-8542-0ee0-a8816c4a38fc", + "MainSenseId": "20ae5516-4681-5b6f-9a37-441f37d30636", + "MainHeadword": "National", + "Types": [ + { + "Id": "4efbf4f2-7182-25a1-8279-18849ca5d1dc", + "Name": { + "xpu": "Intelligent Soft Shirt" + }, + "DeletedAt": null + } + ], + "HideMinorEntry": false, + "Comment": { + "ug": { + "Spans": [ + { + "Text": "input", + "Ws": "ug", + "Tags": [ + "009c5014-9b97-498d-94d7-b49c2f60f7ce" + ] + }, + { + "Text": "high-level", + "Ws": "pub", + "Bold": "On", + "FontSize": 1878116492, + "ForeColor": "#0000FF", + "Tags": [ + "5a727ee0-4a4d-6d0f-5ff0-7225db4443b9" + ] + }, + { + "Text": "Liberian Dollar", + "Ws": "ug", + "Tags": [ + "9def2648-5fc8-473b-91a0-e4b870483323" + ] + }, + { + "Text": "teal", + "Ws": "dux", + "Bold": "On", + "FontSize": -447656843, + "ForeColor": "#00FFFF", + "Tags": [ + "3f01efa1-0307-9615-9c0a-abd13268297f" + ] + } + ] + }, + "tkx": { + "Spans": [ + { + "Text": "Handcrafted Plastic Gloves", + "Ws": "ktm", + "Bold": "Off", + "FontSize": 980860579, + "ForeColor": "#0000FF", + "Tags": [ + "3aa66e0d-0c3b-f1fe-000b-f2b073e8bbcf" + ] + }, + { + "Text": "teal", + "Ws": "tkx", + "Tags": [ + "ffc128c8-dd58-490e-bbb6-ff9c9dae2c21" + ] + } + ] + }, + "mvg": { + "Spans": [ + { + "Text": "Synchronised", + "Ws": "lof", + "Bold": "Off", + "FontSize": -448515709, + "ForeColor": "#A52A2A", + "Tags": [ + "cccf656b-6627-2403-6651-e9778e6784b3" + ] + }, + { + "Text": "pink", + "Ws": "mvg", + "Tags": [ + "227cf26e-397c-4d4c-9799-5bb7c880ffcd" + ] + }, + { + "Text": "Tasty Rubber Tuna", + "Ws": "jcs", + "Bold": "Invert", + "FontSize": -1218964834, + "ForeColor": "#FF0000", + "Tags": [ + "8d1b02a7-1a2b-3cad-ee5b-5d9d44e54785" + ] + }, + { + "Text": "Rue", + "Ws": "mvg", + "Tags": [ + "98ac4a79-c23c-47d3-af3b-6352a3905df4" + ] + } + ] + } + } + } + ], + "Variants": [ + { + "Id": "eb7771bf-50ec-05c5-f943-2f36625e25db", + "MaybeId": "eb7771bf-50ec-05c5-f943-2f36625e25db", + "DeletedAt": null, + "VariantEntryId": "dd84ea90-cfe1-a254-021d-efca8b022ddf", + "VariantHeadword": "Configuration", + "MainEntryId": "2bae2145-2f23-b490-102b-cf1d03c8f5bf", + "MainSenseId": "bb0e0056-9948-fd94-0c89-e89fd4ba8cce", + "MainHeadword": "withdrawal", + "Types": [ + { + "Id": "e2b0fab5-16ff-63da-ab2c-3137e2d8fcea", + "Name": { + "nli": "Architect", + "dcc": "Decentralized", + "dgd": "leverage", + "pne": "Intelligent Steel Cheese" + }, + "DeletedAt": null + } + ], + "HideMinorEntry": true, + "Comment": { + "afs": { + "Spans": [ + { + "Text": "Investment Account", + "Ws": "afs", + "Tags": [ + "222a259a-328a-41e6-8d2e-ad2e0a06cf21" + ] + }, + { + "Text": "Morocco", + "Ws": "afs", + "Tags": [ + "184ab8d1-b318-407d-8eaf-d60d2615e680" + ] + }, + { + "Text": "Kids \u0026 Kids", + "Ws": "afs", + "Tags": [ + "805122d3-96f3-4129-a887-edb34bd994c5" + ] + } + ] + } + } + } + ], + "PublishIn": [ + { + "Id": "5421adab-b84b-1d1c-5da9-ff96c4e76d6f", + "DeletedAt": null, + "IsMain": false, + "Name": { + "arn": "Money Market Account", + "myt": "withdrawal", + "bni": "Libyan Arab Jamahiriya", + "peh": "web-readiness" + } + } + ] + }, + "Id": "c3c7439d-8508-897d-ec90-dfb8c6233f52", + "DeletedAt": null + }, + "Output": { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Entry", + "Id": "c3c7439d-8508-897d-ec90-dfb8c6233f52", + "DeletedAt": null, + "LexemeForm": { + "sbf": "Triple-buffered", + "nuo": "clear-thinking", + "ewo": "modular" + }, + "CitationForm": { + "mzp": "Rial Omani" + }, + "LiteralMeaning": { + "mku": { + "Spans": [ + { + "Text": "holistic", + "Ws": "mku", + "Tags": [ + "9350e875-0918-4188-8b80-e94b87a852bf" + ] + }, + { + "Text": "Oklahoma", + "Ws": "bnx", + "Bold": "On", + "FontSize": 1103510228, + "ForeColor": "#FF0000", + "Tags": [ + "ed09f714-b175-6596-9983-16cdf0cf34d8" + ] + }, + { + "Text": "Handcrafted", + "Ws": "mku", + "Tags": [ + "182d16db-157e-4fbc-9d8d-fb3df1acc534" + ] + } + ] + }, + "kdr": { + "Spans": [ + { + "Text": "Liaison", + "Ws": "kdr", + "Tags": [ + "f526be31-e1dc-4710-b90d-0c747d57434f" + ] + } + ] + } + }, + "MorphType": "Prefix", + "HomographNumber": -1630247524, + "Senses": [], + "Note": { + "crv": { + "Spans": [ + { + "Text": "Isle of Man", + "Ws": "crv", + "Tags": [ + "7bde6377-d4cb-49ae-9803-86cd678d56d7" + ] + }, + { + "Text": "projection", + "Ws": "crv", + "Tags": [ + "764ca726-5a42-499a-8965-0da244a52a6a" + ] + }, + { + "Text": "transmitting", + "Ws": "hnn", + "Bold": "Off", + "FontSize": -1687247291, + "ForeColor": "#ADFF2F", + "Tags": [ + "54262fd2-0ed1-d0ec-59b2-c2ade27b2a03" + ] + } + ] + }, + "gnw": { + "Spans": [ + { + "Text": "Neck", + "Ws": "bvo", + "Bold": "Off", + "FontSize": -990208762, + "ForeColor": "#00FFFF", + "Tags": [ + "99ed537a-80b3-8de1-7650-6365d2e6083f" + ] + }, + { + "Text": "Data", + "Ws": "gnw", + "Tags": [ + "d241a639-233a-45c7-8935-7b9f3f06157a" + ] + }, + { + "Text": "withdrawal", + "Ws": "pmf", + "Bold": "Off", + "FontSize": -1959771791, + "ForeColor": "#0000FF", + "Tags": [ + "8fd780f0-42f6-34ec-0f95-356321691992" + ] + } + ] + }, + "ekm": { + "Spans": [ + { + "Text": "Developer", + "Ws": "hag", + "Bold": "Invert", + "FontSize": -858017395, + "ForeColor": "#0000FF", + "Tags": [ + "846f0198-2a38-de9c-5c83-d597ce88fecd" + ] + }, + { + "Text": "Handcrafted", + "Ws": "mix", + "Bold": "On", + "FontSize": -1819622732, + "ForeColor": "#FF0000", + "Tags": [ + "bce2d057-9660-de23-ad57-3783b9014de8" + ] + } + ] + } + }, + "Components": [], + "ComplexForms": [], + "ComplexFormTypes": [ + { + "Id": "68f76f7d-5ec4-2006-ed56-236b8c0acdb3", + "Name": { + "mtn": "Libyan Dinar", + "kot": "white", + "sax": "Accounts", + "tlu": "invoice" + }, + "DeletedAt": null + } + ], + "VariantOf": [ + { + "Id": "30687039-cd15-839f-0f15-88239cea4ee7", + "MaybeId": "30687039-cd15-839f-0f15-88239cea4ee7", + "DeletedAt": null, + "VariantEntryId": "a7cea784-faa5-08b1-5a30-ea546c3e84a6", + "VariantHeadword": "methodologies", + "MainEntryId": "d38e046a-5051-8542-0ee0-a8816c4a38fc", + "MainSenseId": "20ae5516-4681-5b6f-9a37-441f37d30636", + "MainHeadword": "National", + "Types": [ + { + "Id": "4efbf4f2-7182-25a1-8279-18849ca5d1dc", + "Order": 0 + } + ], + "HideMinorEntry": false, + "Comment": { + "ug": { + "Spans": [ + { + "Text": "input", + "Ws": "ug", + "Tags": [ + "009c5014-9b97-498d-94d7-b49c2f60f7ce" + ] + }, + { + "Text": "high-level", + "Ws": "pub", + "Bold": "On", + "FontSize": 1878116492, + "ForeColor": "#0000FF", + "Tags": [ + "5a727ee0-4a4d-6d0f-5ff0-7225db4443b9" + ] + }, + { + "Text": "Liberian Dollar", + "Ws": "ug", + "Tags": [ + "9def2648-5fc8-473b-91a0-e4b870483323" + ] + }, + { + "Text": "teal", + "Ws": "dux", + "Bold": "On", + "FontSize": -447656843, + "ForeColor": "#00FFFF", + "Tags": [ + "3f01efa1-0307-9615-9c0a-abd13268297f" + ] + } + ] + }, + "tkx": { + "Spans": [ + { + "Text": "Handcrafted Plastic Gloves", + "Ws": "ktm", + "Bold": "Off", + "FontSize": 980860579, + "ForeColor": "#0000FF", + "Tags": [ + "3aa66e0d-0c3b-f1fe-000b-f2b073e8bbcf" + ] + }, + { + "Text": "teal", + "Ws": "tkx", + "Tags": [ + "ffc128c8-dd58-490e-bbb6-ff9c9dae2c21" + ] + } + ] + }, + "mvg": { + "Spans": [ + { + "Text": "Synchronised", + "Ws": "lof", + "Bold": "Off", + "FontSize": -448515709, + "ForeColor": "#A52A2A", + "Tags": [ + "cccf656b-6627-2403-6651-e9778e6784b3" + ] + }, + { + "Text": "pink", + "Ws": "mvg", + "Tags": [ + "227cf26e-397c-4d4c-9799-5bb7c880ffcd" + ] + }, + { + "Text": "Tasty Rubber Tuna", + "Ws": "jcs", + "Bold": "Invert", + "FontSize": -1218964834, + "ForeColor": "#FF0000", + "Tags": [ + "8d1b02a7-1a2b-3cad-ee5b-5d9d44e54785" + ] + }, + { + "Text": "Rue", + "Ws": "mvg", + "Tags": [ + "98ac4a79-c23c-47d3-af3b-6352a3905df4" + ] + } + ] + } + } + } + ], + "Variants": [ + { + "Id": "eb7771bf-50ec-05c5-f943-2f36625e25db", + "MaybeId": "eb7771bf-50ec-05c5-f943-2f36625e25db", + "DeletedAt": null, + "VariantEntryId": "dd84ea90-cfe1-a254-021d-efca8b022ddf", + "VariantHeadword": "Configuration", + "MainEntryId": "2bae2145-2f23-b490-102b-cf1d03c8f5bf", + "MainSenseId": "bb0e0056-9948-fd94-0c89-e89fd4ba8cce", + "MainHeadword": "withdrawal", + "Types": [ + { + "Id": "e2b0fab5-16ff-63da-ab2c-3137e2d8fcea", + "Order": 0 + } + ], + "HideMinorEntry": true, + "Comment": { + "afs": { + "Spans": [ + { + "Text": "Investment Account", + "Ws": "afs", + "Tags": [ + "222a259a-328a-41e6-8d2e-ad2e0a06cf21" + ] + }, + { + "Text": "Morocco", + "Ws": "afs", + "Tags": [ + "184ab8d1-b318-407d-8eaf-d60d2615e680" + ] + }, + { + "Text": "Kids \u0026 Kids", + "Ws": "afs", + "Tags": [ + "805122d3-96f3-4129-a887-edb34bd994c5" + ] + } + ] + } + } + } + ], + "PublishIn": [ + { + "Id": "5421adab-b84b-1d1c-5da9-ff96c4e76d6f", + "DeletedAt": null, + "IsMain": false, + "Name": { + "arn": "Money Market Account", + "myt": "withdrawal", + "bni": "Libyan Arab Jamahiriya", + "peh": "web-readiness" + } + } + ] + }, + "Id": "c3c7439d-8508-897d-ec90-dfb8c6233f52", + "DeletedAt": null + } + }, + { + "Input": { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Variant", + "Id": "f3c8bd18-ddae-319c-7af9-aec8a1f24db9", + "MaybeId": "f3c8bd18-ddae-319c-7af9-aec8a1f24db9", + "DeletedAt": null, + "VariantEntryId": "8844401a-9b59-2dbb-d0a6-b8072698fdbe", + "VariantHeadword": "compressing", + "MainEntryId": "4c6734dd-5df2-ef98-f925-4bedccafffd6", + "MainSenseId": "5299433f-bed8-0440-f6b7-be7185a94c91", + "MainHeadword": "Future-proofed", + "Types": [ + { + "Id": "bd29dadc-ed05-75a2-2dd2-1f4e7a8ed28c", + "Name": { + "qvs": "transition", + "bnj": "input", + "prx": "1080p", + "stw": "Cotton" + }, + "DeletedAt": null + } + ], + "HideMinorEntry": true, + "Comment": { + "mkv": { + "Spans": [ + { + "Text": "FTP", + "Ws": "afg", + "Bold": "Off", + "FontSize": 786310720, + "ForeColor": "#FF0000", + "Tags": [ + "080df177-19fa-0182-fd6d-8bfe3c6899b8" + ] + } + ] + }, + "jup": { + "Spans": [ + { + "Text": "Configuration", + "Ws": "jkr", + "Bold": "Invert", + "FontSize": 901303494, + "ForeColor": "#00000000", + "Tags": [ + "4764d0bd-8463-ac55-13e6-5c97bf5e1eeb" + ] + }, + { + "Text": "Extended", + "Ws": "jup", + "Tags": [ + "cc3de0c0-de63-4f90-b243-ed8cffce4b43" + ] + }, + { + "Text": "Berkshire", + "Ws": "duq", + "Bold": "Invert", + "FontSize": -820321295, + "ForeColor": "#FF0000", + "Tags": [ + "89b096e2-d417-54cc-90ce-6b3d0d6beea9" + ] + }, + { + "Text": "Handmade", + "Ws": "jup", + "Tags": [ + "8b3d963a-e282-4efa-b1b3-72bd5cc0b97a" + ] + } + ] + }, + "knq": { + "Spans": [ + { + "Text": "back-end", + "Ws": "rga", + "Bold": "On", + "FontSize": -1164842275, + "ForeColor": "#0000FF", + "Tags": [ + "e16af6f0-6073-064a-be78-5476ae80129b" + ] + }, + { + "Text": "Fresh", + "Ws": "hrt", + "Bold": "Off", + "FontSize": -1676676744, + "ForeColor": "#00FFFF", + "Tags": [ + "04081eef-8df9-8078-2aff-8a1fc6f565d6" + ] + }, + { + "Text": "Bedfordshire", + "Ws": "xag", + "Bold": "Off", + "FontSize": 588490506, + "ForeColor": "#ADFF2F", + "Tags": [ + "d5d24888-6538-6447-e34b-90436626e505" + ] + }, + { + "Text": "neural", + "Ws": "kpw", + "Bold": "Off", + "FontSize": 1635502143, + "ForeColor": "#FF0000", + "Tags": [ + "3ff5314e-8007-7517-f840-e3a86ec6f913" + ] + } + ] + } + } + }, + "Id": "f3c8bd18-ddae-319c-7af9-aec8a1f24db9", + "DeletedAt": null + }, + "Output": { + "$type": "MiniLcmCrdtAdapter", + "Obj": { + "$type": "Variant", + "Id": "f3c8bd18-ddae-319c-7af9-aec8a1f24db9", + "MaybeId": "f3c8bd18-ddae-319c-7af9-aec8a1f24db9", + "DeletedAt": null, + "VariantEntryId": "8844401a-9b59-2dbb-d0a6-b8072698fdbe", + "VariantHeadword": "compressing", + "MainEntryId": "4c6734dd-5df2-ef98-f925-4bedccafffd6", + "MainSenseId": "5299433f-bed8-0440-f6b7-be7185a94c91", + "MainHeadword": "Future-proofed", + "Types": [ + { + "Id": "bd29dadc-ed05-75a2-2dd2-1f4e7a8ed28c", + "Order": 0 + } + ], + "HideMinorEntry": true, + "Comment": { + "mkv": { + "Spans": [ + { + "Text": "FTP", + "Ws": "afg", + "Bold": "Off", + "FontSize": 786310720, + "ForeColor": "#FF0000", + "Tags": [ + "080df177-19fa-0182-fd6d-8bfe3c6899b8" + ] + } + ] + }, + "jup": { + "Spans": [ + { + "Text": "Configuration", + "Ws": "jkr", + "Bold": "Invert", + "FontSize": 901303494, + "ForeColor": "#00000000", + "Tags": [ + "4764d0bd-8463-ac55-13e6-5c97bf5e1eeb" + ] + }, + { + "Text": "Extended", + "Ws": "jup", + "Tags": [ + "cc3de0c0-de63-4f90-b243-ed8cffce4b43" + ] + }, + { + "Text": "Berkshire", + "Ws": "duq", + "Bold": "Invert", + "FontSize": -820321295, + "ForeColor": "#FF0000", + "Tags": [ + "89b096e2-d417-54cc-90ce-6b3d0d6beea9" + ] + }, + { + "Text": "Handmade", + "Ws": "jup", + "Tags": [ + "8b3d963a-e282-4efa-b1b3-72bd5cc0b97a" + ] + } + ] + }, + "knq": { + "Spans": [ + { + "Text": "back-end", + "Ws": "rga", + "Bold": "On", + "FontSize": -1164842275, + "ForeColor": "#0000FF", + "Tags": [ + "e16af6f0-6073-064a-be78-5476ae80129b" + ] + }, + { + "Text": "Fresh", + "Ws": "hrt", + "Bold": "Off", + "FontSize": -1676676744, + "ForeColor": "#00FFFF", + "Tags": [ + "04081eef-8df9-8078-2aff-8a1fc6f565d6" + ] + }, + { + "Text": "Bedfordshire", + "Ws": "xag", + "Bold": "Off", + "FontSize": 588490506, + "ForeColor": "#ADFF2F", + "Tags": [ + "d5d24888-6538-6447-e34b-90436626e505" + ] + }, + { + "Text": "neural", + "Ws": "kpw", + "Bold": "Off", + "FontSize": 1635502143, + "ForeColor": "#FF0000", + "Tags": [ + "3ff5314e-8007-7517-f840-e3a86ec6f913" + ] + } + ] + } + } + }, + "Id": "f3c8bd18-ddae-319c-7af9-aec8a1f24db9", + "DeletedAt": null + } } ] \ No newline at end of file diff --git a/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.VerifyChangeModels.verified.txt b/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.VerifyChangeModels.verified.txt index 41b9ee389c..534f2b455d 100644 --- a/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.VerifyChangeModels.verified.txt +++ b/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.VerifyChangeModels.verified.txt @@ -237,8 +237,8 @@ TypeDiscriminator: RemoveVariantTypeChange }, { - DerivedType: SetVariantTypesOrderChange, - TypeDiscriminator: SetVariantTypesOrderChange + DerivedType: ReorderVariantTypeChange, + TypeDiscriminator: ReorderVariantTypeChange }, { DerivedType: CreateVariantType, diff --git a/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.VerifyDbModel.verified.txt b/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.VerifyDbModel.verified.txt index 23715abfaf..e4578ce9e5 100644 --- a/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.VerifyDbModel.verified.txt +++ b/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.VerifyDbModel.verified.txt @@ -360,7 +360,7 @@ Annotations: Relational:ColumnName: MainSenseId SnapshotId (no field, Guid?) Shadow FK Index - Types (List) Required + Types (List) Required Annotations: Relational:ColumnType: jsonb VariantEntryId (Guid) Required FK Index diff --git a/backend/FwLite/LcmCrdt/Changes/Entries/AddVariantChange.cs b/backend/FwLite/LcmCrdt/Changes/Entries/AddVariantChange.cs index e381203256..22ce195c22 100644 --- a/backend/FwLite/LcmCrdt/Changes/Entries/AddVariantChange.cs +++ b/backend/FwLite/LcmCrdt/Changes/Entries/AddVariantChange.cs @@ -11,7 +11,7 @@ public class AddVariantChange : CreateChange, ISelfNamedType Types { get; } + public List Types { get; } public bool HideMinorEntry { get; } public RichMultiString Comment { get; } @@ -20,7 +20,7 @@ public AddVariantChange(Guid entityId, Guid variantEntryId, Guid mainEntryId, Guid? mainSenseId = null, - List? types = null, + List? types = null, bool hideMinorEntry = false, RichMultiString? comment = null) : base(entityId) { @@ -52,12 +52,18 @@ public override async ValueTask NewEntity(Commit commit, IChangeContext var shouldBeDeleted = (variantEntry is null or {DeletedAt: not null } || mainEntry is null or { DeletedAt: not null } || (MainSenseId.HasValue && mainSense?.DeletedAt is not null)); - var types = new List(Types.Count); + var types = new List(Types.Count); foreach (var type in Types) { if (await context.IsObjectDeleted(type.Id)) continue; types.Add(type); } + // inputs that never picked orders (e.g. a link created whole with its types) keep list order + if (types.Count > 0 && types.All(t => t.Order == 0)) + { + for (var i = 0; i < types.Count; i++) types[i].Order = i + 1; + } + types.Sort(VariantTypeRef.CompareRefs); var variant = new Variant { Id = EntityId, diff --git a/backend/FwLite/LcmCrdt/Changes/Entries/AddVariantTypeChange.cs b/backend/FwLite/LcmCrdt/Changes/Entries/AddVariantTypeChange.cs index d6ea54bacb..969a5d574b 100644 --- a/backend/FwLite/LcmCrdt/Changes/Entries/AddVariantTypeChange.cs +++ b/backend/FwLite/LcmCrdt/Changes/Entries/AddVariantTypeChange.cs @@ -1,18 +1,37 @@ +using System.Text.Json.Serialization; +using MiniLcm.SyncHelpers; using SIL.Harmony.Changes; using SIL.Harmony.Core; using SIL.Harmony.Entities; namespace LcmCrdt.Changes.Entries; -public class AddVariantTypeChange(Guid entityId, VariantType variantType) - : EditChange(entityId), ISelfNamedType +public class AddVariantTypeChange : EditChange, ISelfNamedType { - public VariantType VariantType { get; } = variantType; + public AddVariantTypeChange(Guid entityId, VariantTypeRef variantTypeRef, BetweenPosition? between = null) + : base(entityId) + { + VariantTypeId = variantTypeRef.Id; + Order = variantTypeRef.Order; + Between = between; + } + + [JsonConstructor] + private AddVariantTypeChange(Guid entityId) : base(entityId) + { + } + + public Guid VariantTypeId { get; set; } + public double Order { get; set; } + public BetweenPosition? Between { get; set; } public override async ValueTask ApplyChange(Variant entity, IChangeContext context) { - if (entity.Types.Any(t => t.Id == VariantType.Id)) return; - if (await context.IsObjectDeleted(VariantType.Id)) return; - entity.Types.Add(VariantType); + // Skip adding if this is a duplicate change + if (entity.Types.Any(t => t.Id == VariantTypeId)) return; + if (await context.IsObjectDeleted(VariantTypeId)) return; + Order = OrderPicker.PickOrder(entity.Types, Between); + entity.Types.Add(new VariantTypeRef { Id = VariantTypeId, Order = Order }); + entity.Types.Sort(VariantTypeRef.CompareRefs); } } diff --git a/backend/FwLite/LcmCrdt/Changes/Entries/ReorderVariantTypeChange.cs b/backend/FwLite/LcmCrdt/Changes/Entries/ReorderVariantTypeChange.cs new file mode 100644 index 0000000000..b595693915 --- /dev/null +++ b/backend/FwLite/LcmCrdt/Changes/Entries/ReorderVariantTypeChange.cs @@ -0,0 +1,22 @@ +using SIL.Harmony.Changes; +using SIL.Harmony.Core; +using SIL.Harmony.Entities; + +namespace LcmCrdt.Changes.Entries; + +public class ReorderVariantTypeChange(Guid variantTypeId, Guid entityId, double order) + : EditChange(entityId), ISelfNamedType +{ + public Guid VariantTypeId { get; } = variantTypeId; + public double Order { get; } = order; + + public override ValueTask ApplyChange(Variant entity, IChangeContext context) + { + var typeRef = entity.Types.FirstOrDefault(t => t.Id == VariantTypeId); + // Not found? The type may have been removed by another change, making the reorder a no-op + if (typeRef is null) return ValueTask.CompletedTask; + typeRef.Order = Order; + entity.Types.Sort(VariantTypeRef.CompareRefs); + return ValueTask.CompletedTask; + } +} diff --git a/backend/FwLite/LcmCrdt/Changes/Entries/SetVariantTypesOrderChange.cs b/backend/FwLite/LcmCrdt/Changes/Entries/SetVariantTypesOrderChange.cs deleted file mode 100644 index 255992bbef..0000000000 --- a/backend/FwLite/LcmCrdt/Changes/Entries/SetVariantTypesOrderChange.cs +++ /dev/null @@ -1,27 +0,0 @@ -using SIL.Harmony.Changes; -using SIL.Harmony.Core; -using SIL.Harmony.Entities; - -namespace LcmCrdt.Changes.Entries; - -/// -/// Reorders a variant link's Types to the given id sequence (FLEx: right-click a type → -/// move left/right). Types not listed — e.g. added concurrently — keep their relative -/// order after the listed ones, so this merges with concurrent Add/RemoveVariantTypeChange -/// instead of clobbering them. -/// -public class SetVariantTypesOrderChange(Guid entityId, List orderedTypeIds) - : EditChange(entityId), ISelfNamedType -{ - public List OrderedTypeIds { get; } = orderedTypeIds; - - public override ValueTask ApplyChange(Variant entity, IChangeContext context) - { - entity.Types = [.. entity.Types - .Select((type, index) => (type, index)) - .OrderBy(t => OrderedTypeIds.IndexOf(t.type.Id) is var i and >= 0 ? i : int.MaxValue) - .ThenBy(t => t.index) - .Select(t => t.type)]; - return ValueTask.CompletedTask; - } -} diff --git a/backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs b/backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs index dc9f054a55..fd6389efa7 100644 --- a/backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs +++ b/backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs @@ -475,15 +475,11 @@ private static async Task CreateVariantChange(MiniLcmRepositor throw new InvalidOperationException($"Sense {variant.MainSenseId} does not belong to entry {variant.MainEntryId}, it belongs to {senseEntryId}"); } var typeIds = variant.Types.Select(t => t.Id).ToArray(); - var resolvedTypes = await repo.VariantTypes.Where(t => typeIds.Contains(t.Id)).ToArrayAsync(); - var missing = typeIds.Except(resolvedTypes.Select(t => t.Id)).ToArray(); + var knownTypeIds = await repo.VariantTypes.Where(t => typeIds.Contains(t.Id)).Select(t => t.Id).ToArrayAsync(); + var missing = typeIds.Except(knownTypeIds).ToArray(); if (missing.Length > 0) throw new InvalidOperationException($"Variant {variant} references variant types which do not exist: {string.Join(", ", missing)}"); - // use the repo's canonical type objects so embedded copies match CRDT state - return new AddVariantChange(variant with - { - Types = [..typeIds.Select(id => resolvedTypes.Single(t => t.Id == id))] - }); + return new AddVariantChange(variant); } public async Task CreateVariant(Variant variant) @@ -517,12 +513,13 @@ public async Task DeleteVariant(Variant variant) await AddChange(new DeleteChange(existing.Id)); } - public async Task AddVariantType(Variant variant, Guid variantTypeId) + public async Task AddVariantType(Variant variant, Guid variantTypeId, BetweenPosition? position = null) { await using var repo = await repoFactory.CreateRepoAsync(); var existing = await repo.FindVariant(variant); if (existing is null) return; - await AddChange(new AddVariantTypeChange(existing.Id, await repo.VariantTypes.SingleAsync(vt => vt.Id == variantTypeId))); + var variantType = await repo.VariantTypes.SingleAsync(vt => vt.Id == variantTypeId); + await AddChange(new AddVariantTypeChange(existing.Id, new VariantTypeRef { Id = variantType.Id }, position)); } public async Task RemoveVariantType(Variant variant, Guid variantTypeId) @@ -533,12 +530,13 @@ public async Task RemoveVariantType(Variant variant, Guid variantTypeId) await AddChange(new RemoveVariantTypeChange(existing.Id, variantTypeId)); } - public async Task SetVariantTypesOrder(Variant variant, IReadOnlyList orderedTypeIds) + public async Task MoveVariantType(Variant variant, Guid variantTypeId, BetweenPosition position) { await using var repo = await repoFactory.CreateRepoAsync(); var existing = await repo.FindVariant(variant); if (existing is null) return; - await AddChange(new SetVariantTypesOrderChange(existing.Id, [.. orderedTypeIds])); + var order = OrderPicker.PickOrder(existing.Types, position); + await AddChange(new ReorderVariantTypeChange(variantTypeId, existing.Id, order)); } public async IAsyncEnumerable GetMorphTypes() diff --git a/backend/FwLite/LcmCrdt/LcmCrdtKernel.cs b/backend/FwLite/LcmCrdt/LcmCrdtKernel.cs index 7ff4971c9a..c922f89204 100644 --- a/backend/FwLite/LcmCrdt/LcmCrdtKernel.cs +++ b/backend/FwLite/LcmCrdt/LcmCrdtKernel.cs @@ -336,7 +336,7 @@ public static void ConfigureCrdt(CrdtConfig config) .Property(v => v.Types) .HasColumnType("jsonb") .HasConversion(list => JsonSerializer.Serialize(list, (JsonSerializerOptions?)null), - json => JsonSerializer.Deserialize>(json, + json => JsonSerializer.Deserialize>(json, (JsonSerializerOptions?)null) ?? new()); //these indexes are used to ensure that we don't create duplicate variant links //we need the filter otherwise 2 links which are the same and have a null sense id can be created because 2 rows with the same null are not considered duplicates @@ -413,7 +413,7 @@ public static void ConfigureCrdt(CrdtConfig config) .Add() .Add() .Add() - .Add() + .Add() .Add() .Add() .Add() diff --git a/backend/FwLite/MiniLcm.Tests/AutoFakerHelpers/EntryFakerHelper.cs b/backend/FwLite/MiniLcm.Tests/AutoFakerHelpers/EntryFakerHelper.cs index 096dadb867..5e60026fee 100644 --- a/backend/FwLite/MiniLcm.Tests/AutoFakerHelpers/EntryFakerHelper.cs +++ b/backend/FwLite/MiniLcm.Tests/AutoFakerHelpers/EntryFakerHelper.cs @@ -165,7 +165,7 @@ private static async Task CreateVariantLinkEntry(Entry entry, foreach (var variantType in variant.Types) { if (await api.GetVariantType(variantType.Id) is null) - await api.CreateVariantType(variantType); + await api.CreateVariantType(new VariantType { Id = variantType.Id, Name = new() { { "en", $"generated type {variantType.Id}" } } }); } var name = $"test {(isVariantOf ? "main" : "variant")} entry {i}"; diff --git a/backend/FwLite/MiniLcm.Tests/Validators/VariantValidationTests.cs b/backend/FwLite/MiniLcm.Tests/Validators/VariantValidationTests.cs index 3e4830b672..48feeff462 100644 --- a/backend/FwLite/MiniLcm.Tests/Validators/VariantValidationTests.cs +++ b/backend/FwLite/MiniLcm.Tests/Validators/VariantValidationTests.cs @@ -55,10 +55,10 @@ public void FailsForCommentWithEmptyStringValue() } [Fact] - public void FailsForTypeWithEmptyName() + public void FailsForTypeRefWithoutId() { var variant = NewVariant(); - variant.Types = [new VariantType { Id = Guid.NewGuid(), Name = new MultiString() }]; + variant.Types = [new VariantTypeRef { Id = Guid.Empty }]; _validator.TestValidate(variant).IsValid.Should().BeFalse(); } } diff --git a/backend/FwLite/MiniLcm.Tests/VariantTestsBase.cs b/backend/FwLite/MiniLcm.Tests/VariantTestsBase.cs index 12bdd17e90..ca9c55928a 100644 --- a/backend/FwLite/MiniLcm.Tests/VariantTestsBase.cs +++ b/backend/FwLite/MiniLcm.Tests/VariantTestsBase.cs @@ -1,4 +1,5 @@ using MiniLcm.Models; +using MiniLcm.SyncHelpers; namespace MiniLcm.Tests; @@ -76,7 +77,7 @@ public async Task CreateVariant_WithTypesCommentAndHideMinorEntry_RoundTrips() var type = await CreateVariantType(); var input = Variant.FromEntries(_variantEntry, _mainEntry) with { - Types = [type], + Types = [type.ToRef()], HideMinorEntry = true, Comment = new() { { "en", new RichString("originally meant something else") } }, }; @@ -428,10 +429,10 @@ public async Task UpdateVariant_SyncsTypesAndScalars() { var typeA = await CreateVariantType("type a"); var typeB = await CreateVariantType("type b"); - var created = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with { Types = [typeA] }); + var created = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with { Types = [typeA.ToRef()] }); var after = created.Copy(); - after.Types = [typeB]; + after.Types = [typeB.ToRef()]; after.HideMinorEntry = true; after.Comment = new() { { "en", new RichString("now hidden") } }; await Api.UpdateVariant(created, after); @@ -467,7 +468,7 @@ public async Task AddVariantType_IsIdempotent() public async Task RemoveVariantType_Works() { var type = await CreateVariantType(); - var variant = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with { Types = [type] }); + var variant = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with { Types = [type.ToRef()] }); await Api.RemoveVariantType(variant, type.Id); var link = (await Api.GetEntry(_variantEntryId))!.VariantOf.Should().ContainSingle().Subject; link.Types.Should().BeEmpty(); @@ -485,37 +486,37 @@ public async Task CreateVariant_PreservesTypesOrder() { var typeA = await CreateVariantType("type a"); var typeB = await CreateVariantType("type b"); - await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with { Types = [typeB, typeA] }); + await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with { Types = [typeB.ToRef(), typeA.ToRef()] }); var link = (await Api.GetEntry(_variantEntryId))!.VariantOf.Should().ContainSingle().Subject; link.Types.Select(t => t.Id).Should().Equal(typeB.Id, typeA.Id); } [Fact] - public async Task SetVariantTypesOrder_ReordersTypes() + public async Task MoveVariantType_MovesToTheRequestedPosition() { var typeA = await CreateVariantType("type a"); var typeB = await CreateVariantType("type b"); var typeC = await CreateVariantType("type c"); - var variant = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with { Types = [typeA, typeB, typeC] }); + var variant = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with { Types = [typeA.ToRef(), typeB.ToRef(), typeC.ToRef()] }); - await Api.SetVariantTypesOrder(variant, [typeC.Id, typeA.Id, typeB.Id]); + await Api.MoveVariantType(variant, typeC.Id, new BetweenPosition(null, typeA.Id)); var link = (await Api.GetEntry(_variantEntryId))!.VariantOf.Should().ContainSingle().Subject; link.Types.Select(t => t.Id).Should().Equal(typeC.Id, typeA.Id, typeB.Id); } [Fact] - public async Task SetVariantTypesOrder_IgnoresUnknownIdsAndKeepsUnlistedTypesAfterListedOnes() + public async Task MoveVariantType_UnknownTypeIsANoOp() { var typeA = await CreateVariantType("type a"); var typeB = await CreateVariantType("type b"); - var variant = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with { Types = [typeA, typeB] }); + var variant = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with { Types = [typeA.ToRef(), typeB.ToRef()] }); - await Api.SetVariantTypesOrder(variant, [Guid.NewGuid(), typeB.Id]); + await Api.MoveVariantType(variant, Guid.NewGuid(), new BetweenPosition(null, typeA.Id)); var link = (await Api.GetEntry(_variantEntryId))!.VariantOf.Should().ContainSingle().Subject; - link.Types.Select(t => t.Id).Should().Equal(typeB.Id, typeA.Id); + link.Types.Select(t => t.Id).Should().Equal(typeA.Id, typeB.Id); } [Fact] @@ -523,10 +524,10 @@ public async Task UpdateVariant_ReordersTypes() { var typeA = await CreateVariantType("type a"); var typeB = await CreateVariantType("type b"); - var created = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with { Types = [typeA, typeB] }); + var created = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with { Types = [typeA.ToRef(), typeB.ToRef()] }); var after = created.Copy(); - after.Types = [typeB, typeA]; + after.Types = [typeB.ToRef(), typeA.ToRef()]; await Api.UpdateVariant(created, after); var link = (await Api.GetEntry(_variantEntryId))!.VariantOf.Should().ContainSingle().Subject; @@ -538,10 +539,10 @@ public async Task UpdateVariant_AddsTypeAtTheRequestedPosition() { var typeA = await CreateVariantType("type a"); var typeB = await CreateVariantType("type b"); - var created = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with { Types = [typeB] }); + var created = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with { Types = [typeB.ToRef()] }); var after = created.Copy(); - after.Types = [typeA, typeB]; + after.Types = [typeA.ToRef(), typeB.ToRef()]; await Api.UpdateVariant(created, after); var link = (await Api.GetEntry(_variantEntryId))!.VariantOf.Should().ContainSingle().Subject; diff --git a/backend/FwLite/MiniLcm/IMiniLcmWriteApi.cs b/backend/FwLite/MiniLcm/IMiniLcmWriteApi.cs index 604f368159..82882fcbde 100644 --- a/backend/FwLite/MiniLcm/IMiniLcmWriteApi.cs +++ b/backend/FwLite/MiniLcm/IMiniLcmWriteApi.cs @@ -74,17 +74,13 @@ Task UpdateWritingSystem(WritingSystemId id, Task RemoveComplexFormType(Guid entryId, Guid complexFormTypeId); // Variant links are unordered (no position/move) and resolved by their composite key // (VariantEntryId, MainEntryId, MainSenseId) — see VARIANTS.md. A link's Types sequence - // IS ordered (FLEx lets users reorder it), hence SetVariantTypesOrder. + // IS ordered (FLEx lets users reorder it), hence the picture-style position/move pair. Task CreateVariant(Variant variant); Task UpdateVariant(Variant before, Variant after, IMiniLcmApi? api = null); Task DeleteVariant(Variant variant); - Task AddVariantType(Variant variant, Guid variantTypeId); + Task AddVariantType(Variant variant, Guid variantTypeId, BetweenPosition? position = null); Task RemoveVariantType(Variant variant, Guid variantTypeId); - /// - /// Reorders the link's Types to the given id sequence; types missing from the list keep - /// their relative order after the listed ones, unknown ids are ignored. - /// - Task SetVariantTypesOrder(Variant variant, IReadOnlyList orderedTypeIds); + Task MoveVariantType(Variant variant, Guid variantTypeId, BetweenPosition position); Task AddPublication(Guid entryId, Guid publicationId); Task RemovePublication(Guid entryId, Guid publicationId); #endregion diff --git a/backend/FwLite/MiniLcm/Models/Variant.cs b/backend/FwLite/MiniLcm/Models/Variant.cs index 96837d5c6d..9cd51d48e4 100644 --- a/backend/FwLite/MiniLcm/Models/Variant.cs +++ b/backend/FwLite/MiniLcm/Models/Variant.cs @@ -13,7 +13,8 @@ namespace MiniLcm.Models; /// and per-link edits split a shared ref first (see FwDataMiniLcmApi.FindVariantRefForUpdate). /// Unlike there is no Order — variant *link* lists have /// no user-meaningful order in FieldWorks. The sequence on a link IS -/// user-ordered (FLEx: right-click a type → move left/right) and must round-trip. +/// user-ordered (FLEx: right-click a type → move left/right) and round-trips via +/// , like sense pictures. /// public record Variant : IObjectWithId { @@ -58,7 +59,7 @@ public Guid Id public virtual required Guid MainEntryId { get; set; } public virtual Guid? MainSenseId { get; set; } = null; public string? MainHeadword { get; set; } - public virtual List Types { get; set; } = []; + public virtual List Types { get; set; } = []; public virtual bool HideMinorEntry { get; set; } public virtual RichMultiString Comment { get; set; } = new(); diff --git a/backend/FwLite/MiniLcm/Models/VariantType.cs b/backend/FwLite/MiniLcm/Models/VariantType.cs index 6531b0b6e9..6533e4a73c 100644 --- a/backend/FwLite/MiniLcm/Models/VariantType.cs +++ b/backend/FwLite/MiniLcm/Models/VariantType.cs @@ -20,4 +20,10 @@ public VariantType Copy() { return new VariantType { Id = Id, Name = Name.Copy(), DeletedAt = DeletedAt }; } + + /// A per-link reference to this type (see ). + public VariantTypeRef ToRef() + { + return new VariantTypeRef { Id = Id }; + } } diff --git a/backend/FwLite/MiniLcm/Models/VariantTypeRef.cs b/backend/FwLite/MiniLcm/Models/VariantTypeRef.cs new file mode 100644 index 0000000000..d8b4543934 --- /dev/null +++ b/backend/FwLite/MiniLcm/Models/VariantTypeRef.cs @@ -0,0 +1,25 @@ +namespace MiniLcm.Models; + +/// +/// One variant type assigned to a variant link (). Id is the +/// 's id — names resolve via the canonical type list. Order makes the +/// per-link sequence round-trip (FLEx: right-click a type → move left/right); it works like +/// . +/// +public class VariantTypeRef : IOrderable +{ + public required virtual Guid Id { get; set; } + public double Order { get; set; } + + public VariantTypeRef Copy() + { + return new VariantTypeRef { Id = Id, Order = Order }; + } + + public static int CompareRefs(VariantTypeRef a, VariantTypeRef b) + { + return a.Order == b.Order ? + a.Id.CompareTo(b.Id) : + a.Order.CompareTo(b.Order); + } +} diff --git a/backend/FwLite/MiniLcm/Normalization/MiniLcmApiWriteNormalizationWrapper.cs b/backend/FwLite/MiniLcm/Normalization/MiniLcmApiWriteNormalizationWrapper.cs index c702aeda0a..b29cae193a 100644 --- a/backend/FwLite/MiniLcm/Normalization/MiniLcmApiWriteNormalizationWrapper.cs +++ b/backend/FwLite/MiniLcm/Normalization/MiniLcmApiWriteNormalizationWrapper.cs @@ -339,9 +339,9 @@ public Task DeleteVariant(Variant variant) return _api.DeleteVariant(variant); } - public Task AddVariantType(Variant variant, Guid variantTypeId) + public Task AddVariantType(Variant variant, Guid variantTypeId, BetweenPosition? position = null) { - return _api.AddVariantType(variant, variantTypeId); + return _api.AddVariantType(variant, variantTypeId, position); } public Task RemoveVariantType(Variant variant, Guid variantTypeId) @@ -349,9 +349,9 @@ public Task RemoveVariantType(Variant variant, Guid variantTypeId) return _api.RemoveVariantType(variant, variantTypeId); } - public Task SetVariantTypesOrder(Variant variant, IReadOnlyList orderedTypeIds) + public Task MoveVariantType(Variant variant, Guid variantTypeId, BetweenPosition position) { - return _api.SetVariantTypesOrder(variant, orderedTypeIds); + return _api.MoveVariantType(variant, variantTypeId, position); } public Task AddPublication(Guid entryId, Guid publicationId) @@ -396,7 +396,8 @@ private static Variant NormalizeVariant(Variant variant) VariantHeadword = StringNormalizer.Normalize(variant.VariantHeadword), MainHeadword = StringNormalizer.Normalize(variant.MainHeadword), Comment = StringNormalizer.Normalize(variant.Comment), - Types = [.. variant.Types.Select(NormalizeVariantType)] + // type refs carry no strings to normalize; copy to keep before/after lists independent + Types = [.. variant.Types.Select(t => t.Copy())] }; } diff --git a/backend/FwLite/MiniLcm/SyncHelpers/VariantSync.cs b/backend/FwLite/MiniLcm/SyncHelpers/VariantSync.cs index 2ef67c31eb..92bbf8177f 100644 --- a/backend/FwLite/MiniLcm/SyncHelpers/VariantSync.cs +++ b/backend/FwLite/MiniLcm/SyncHelpers/VariantSync.cs @@ -1,6 +1,5 @@ using MiniLcm.Models; using SystemTextJsonPatch; -using SystemTextJsonPatch.Operations; namespace MiniLcm.SyncHelpers; @@ -20,30 +19,10 @@ public static async Task Sync(Variant before, Variant after, IMiniLcmApi ap await api.SubmitUpdateVariant(after, updateObjectInput); changes++; } - changes += await DiffCollection.Diff(before.Types, after.Types, new VariantTypesDiffApi(api, after)); - if (TypesOrderNeedsReset(before.Types, after.Types)) - { - await api.SetVariantTypesOrder(after, [.. after.Types.Select(t => t.Id)]); - changes++; - } + changes += await DiffCollection.DiffOrderable(before.Types, after.Types, new VariantTypesDiffApi(api, after)); return changes; } - /// - /// Whether the Add/Remove diff above cannot be trusted to land the types in after-order: - /// either the surviving types changed relative order, or new types were added into a - /// multi-type list (adds append, so their position is only right by luck). - /// - public static bool TypesOrderNeedsReset(IReadOnlyList before, IReadOnlyList after) - { - if (after.Count <= 1) return false; - var beforeIds = before.Select(t => t.Id).ToList(); - var afterIds = after.Select(t => t.Id).ToList(); - if (afterIds.Any(id => !beforeIds.Contains(id))) return true; - var commonBefore = beforeIds.Where(afterIds.Contains); - return !commonBefore.SequenceEqual(afterIds); - } - public static UpdateObjectInput? VariantDiffToUpdate(Variant before, Variant after) { JsonPatchDocument patchDocument = new(); @@ -53,23 +32,34 @@ public static bool TypesOrderNeedsReset(IReadOnlyList before, IRead return new UpdateObjectInput(patchDocument); } - private class VariantTypesDiffApi(IMiniLcmApi api, Variant variant) : ObjectWithIdCollectionDiffApi + private class VariantTypesDiffApi(IMiniLcmApi api, Variant variant) : IOrderableCollectionDiffApi { - public override async Task Add(VariantType afterVariantType) + public Guid GetId(VariantTypeRef value) + { + return value.Id; + } + + public async Task Add(VariantTypeRef afterTypeRef, BetweenPosition between) + { + await api.AddVariantType(variant, afterTypeRef.Id, new BetweenPosition(between.Previous?.Id, between.Next?.Id)); + return 1; + } + + public async Task Move(VariantTypeRef typeRef, BetweenPosition between) { - await api.AddVariantType(variant, afterVariantType.Id); + await api.MoveVariantType(variant, typeRef.Id, new BetweenPosition(between.Previous?.Id, between.Next?.Id)); return 1; } - public override async Task Remove(VariantType beforeVariantType) + public async Task Remove(VariantTypeRef beforeTypeRef) { - await api.RemoveVariantType(variant, beforeVariantType.Id); + await api.RemoveVariantType(variant, beforeTypeRef.Id); return 1; } - public override Task Replace(VariantType before, VariantType after) + public Task Replace(VariantTypeRef before, VariantTypeRef after) { - // type renames sync via VariantTypeSync (top-level list), not through the link + // the ref carries nothing but id + order; order differences are handled as moves return Task.FromResult(0); } } diff --git a/backend/FwLite/MiniLcm/Validators/VariantValidator.cs b/backend/FwLite/MiniLcm/Validators/VariantValidator.cs index f03f2799e4..969fe05754 100644 --- a/backend/FwLite/MiniLcm/Validators/VariantValidator.cs +++ b/backend/FwLite/MiniLcm/Validators/VariantValidator.cs @@ -14,7 +14,9 @@ public VariantValidator() .Must(v => v.VariantEntryId == Guid.Empty || v.VariantEntryId != v.MainEntryId) .WithMessage(v => $"Variant {GetIdentifier(v)} must not be a variant of itself."); RuleFor(v => v.Comment).NoEmptyValues(GetIdentifier).NoDefaultWritingSystems(GetIdentifier); - RuleForEach(v => v.Types).SetValidator(new VariantTypeValidator()); + RuleForEach(v => v.Types) + .Must(t => t.Id != Guid.Empty) + .WithMessage(v => $"Variant {GetIdentifier(v)} has a type reference without an id."); } private string GetIdentifier(Variant variant) diff --git a/frontend/viewer/src/lib/dotnet-types/generated-types/MiniLcm/Models/IVariant.ts b/frontend/viewer/src/lib/dotnet-types/generated-types/MiniLcm/Models/IVariant.ts index ddbd970889..0773cdc2b3 100644 --- a/frontend/viewer/src/lib/dotnet-types/generated-types/MiniLcm/Models/IVariant.ts +++ b/frontend/viewer/src/lib/dotnet-types/generated-types/MiniLcm/Models/IVariant.ts @@ -4,7 +4,7 @@ // the code is regenerated. import type {IObjectWithId} from './IObjectWithId'; -import type {IVariantType} from './IVariantType'; +import type {IVariantTypeRef} from './IVariantTypeRef'; import type {IRichMultiString} from '$lib/dotnet-types/i-multi-string'; export interface IVariant extends IObjectWithId @@ -15,7 +15,7 @@ export interface IVariant extends IObjectWithId mainEntryId: string; mainSenseId?: string; mainHeadword?: string; - types: IVariantType[]; + types: IVariantTypeRef[]; hideMinorEntry: boolean; comment: IRichMultiString; } diff --git a/frontend/viewer/src/lib/dotnet-types/generated-types/MiniLcm/Models/IVariantTypeRef.ts b/frontend/viewer/src/lib/dotnet-types/generated-types/MiniLcm/Models/IVariantTypeRef.ts new file mode 100644 index 0000000000..a17cae208f --- /dev/null +++ b/frontend/viewer/src/lib/dotnet-types/generated-types/MiniLcm/Models/IVariantTypeRef.ts @@ -0,0 +1,11 @@ +/* eslint-disable */ +// This code was generated by a Reinforced.Typings tool. +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. + +export interface IVariantTypeRef +{ + id: string; + order: number; +} +/* eslint-enable */ diff --git a/frontend/viewer/src/project/demo/demo-entry-data.ts b/frontend/viewer/src/project/demo/demo-entry-data.ts index df73740b73..fe950b5c99 100644 --- a/frontend/viewer/src/project/demo/demo-entry-data.ts +++ b/frontend/viewer/src/project/demo/demo-entry-data.ts @@ -360,7 +360,7 @@ const demoVariant: IVariant = { variantHeadword: Object.values(demoVariantEntry.citationForm)[0] ?? Object.values(demoVariantEntry.lexemeForm)[0], mainEntryId: demoMainEntry.id, mainHeadword: Object.values(demoMainEntry.citationForm)[0] ?? Object.values(demoMainEntry.lexemeForm)[0], - types: [variantTypes[0]], + types: [{id: variantTypes[0].id, order: 1}], hideMinorEntry: false, comment: {}, }; From 054cf0d74c7481e4656db20027308d0bb835c123 Mon Sep 17 00:00:00 2001 From: Tim Haasdyk Date: Mon, 6 Jul 2026 15:26:20 +0200 Subject: [PATCH 19/21] Point VARIANTS.md status at the 3-PR stack Co-Authored-By: Claude Fable 5 --- backend/FwLite/VARIANTS.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/backend/FwLite/VARIANTS.md b/backend/FwLite/VARIANTS.md index d920e1ef5c..134dd367dc 100644 --- a/backend/FwLite/VARIANTS.md +++ b/backend/FwLite/VARIANTS.md @@ -14,11 +14,15 @@ dev/agent can pick up the work mid-stream. Update the **Status** section as step - [x] Step 3 — Viewer UI (fields, per-link type menu, demo seed, i18n, Playwright green) - [x] Review iterations — see "Review & verification log" below; ALL automated review is done and green -- [ ] **Next: human review of [#2410](https://github.com/sillsdev/languageforge-lexbox/pull/2410)** - (the only open PR; pay special attention to commit `0d03aed28` — it changes shipped - `AddEntryComponentChange` replay semantics, see decision 7 + rollout notes), then Tim's - merge sequence: reopen [#2408](https://github.com/sillsdev/languageforge-lexbox/pull/2408) - and merge the steps one by one. +- [x] Human review round on the cumulative PR (#2410): all of hahn-kev's findings + implemented (see the review-response commits), incl. reworking variant type order to + per-item orders (pictures pattern) +- [ ] **Next: review the 3-PR stack, merging in order** — + 1. `feat/variants-model-sync` (this PR: model through sync; pay special attention to + `Match liblcm variant/component semantics` — it changes shipped + `AddEntryComponentChange` replay semantics, see decision 7 + rollout notes) + 2. `feat/variants-editor` (viewer editing UI, stacked) + 3. `feat/variants-visibility` (variant badges/preview + custom-view coverage, stacked) ## Review & verification log From cf77661ee55c42181d6f5be5f15bc810dbb3426c Mon Sep 17 00:00:00 2001 From: Tim Haasdyk Date: Mon, 6 Jul 2026 17:05:49 +0200 Subject: [PATCH 20/21] Document Submit* purpose; complete variant Submit normalization Submit* are the sync's result-less fire-and-forget writes (delete-wins on a concurrently-deleted target). The write-normalization wrapper's un-overridden Submit* silently downgrade that to a throwing update via the interface default body, so add SubmitCreateVariant + SubmitUpdateVariantType overrides (forward to _api.Submit*), plus tests asserting normalization and Times.Never on the returning method. Documents the rule in FwLite AGENTS.md and the interface. Co-Authored-By: Claude Opus 4.8 --- backend/FwLite/AGENTS.md | 15 +++++ .../MiniLcm.Tests/Helpers/NfcTestData.cs | 23 +++++++ .../MiniLcm.Tests/WriteNormalizationTests.cs | 63 +++++++++++++++++++ backend/FwLite/MiniLcm/IMiniLcmWriteApi.cs | 20 ++++-- .../MiniLcmApiWriteNormalizationWrapper.cs | 13 ++++ 5 files changed, 130 insertions(+), 4 deletions(-) diff --git a/backend/FwLite/AGENTS.md b/backend/FwLite/AGENTS.md index 4b97232e8d..81733aa312 100644 --- a/backend/FwLite/AGENTS.md +++ b/backend/FwLite/AGENTS.md @@ -262,6 +262,21 @@ Imperative validation in `MiniLcmApiValidationWrapper` (rules that need an async --- +## `Submit*` write variants (sync fire-and-forget) + +`SubmitUpdateX`/`SubmitCreateX` on `IMiniLcmWriteApi` are the **result-less writes the sync's diff-apply uses** instead of the returning `Update`/`Create`. The CRDT submits the change without fetching, so a target concurrently deleted on the other replica is **delete-wins** (no-op) rather than a `NotFoundException` that wedges the whole project sync (see `sync_delete_vs_edit_notfound`). The returning methods fetch-after-write and throw. + +**When you need a new `Submit*` variant:** only where the sync diff writes to a target that could be concurrently deleted — every id-targeted update/move, plus child creates inside `EntrySync` whose parent entry may be gone. **Not** for a fresh top-level `Create` of a dependency type (a new GUID has no delete race — that's why there is no `SubmitCreateVariantType`/`ComplexFormType`). + +**Wrapper authoring (the trap):** `Submit*` have default interface bodies, so they are **not** compile-enforced like other write methods — a wrapper compiles without handling them, but its default behavior is wrong: + +- `MiniLcmApiValidationWrapper` (BeaKona `MemberMatch=Any`): un-overridden `Submit*` forward straight to `_api`, **skipping validation** (the #2362 gap). Override only where an invariant must hold on sync-supplied data (e.g. single-main publication, variant refs). +- `MiniLcmApiWriteNormalizationWrapper` (writes manual): un-overridden `Submit*` hit the default body, which re-routes to the wrapper's own returning `Update`/`Create` and **silently downgrades delete-wins into a throwing update**. Any `Submit*` reachable through this wrapper must be overridden to normalize the payload *and* forward to `_api.Submit*`. + +Also fan out to `CrdtMiniLcmApi`, `FwDataMiniLcmApi`, and `DryRunMiniLcmApi` (`SubmitUpdateVariant` is abstract — no id-based twin to forward to). The write-normalization wrapper's coverage is currently variant-complete but not exhaustive across all types; completing it is tracked separately. + +--- + ## Important Files Quick Reference | File | Purpose | Risk Level | diff --git a/backend/FwLite/MiniLcm.Tests/Helpers/NfcTestData.cs b/backend/FwLite/MiniLcm.Tests/Helpers/NfcTestData.cs index bd727c2293..7f7b0ed727 100644 --- a/backend/FwLite/MiniLcm.Tests/Helpers/NfcTestData.cs +++ b/backend/FwLite/MiniLcm.Tests/Helpers/NfcTestData.cs @@ -224,4 +224,27 @@ public static Entry CreateNfcEntryWithComponents() ComplexForms = [CreateNfcComplexFormComponent()] }; } + + public static VariantType CreateNfcVariantType() + { + return new() + { + Id = Guid.NewGuid(), + Name = CreateNfcMultiString() + }; + } + + public static Variant CreateNfcVariant() + { + return new() + { + Id = Guid.NewGuid(), + VariantEntryId = Guid.NewGuid(), + VariantHeadword = Nfc, + MainEntryId = Guid.NewGuid(), + MainHeadword = Nfc, + Comment = CreateNfcRichMultiString(), + Types = [new VariantTypeRef { Id = Guid.NewGuid() }] + }; + } } diff --git a/backend/FwLite/MiniLcm.Tests/WriteNormalizationTests.cs b/backend/FwLite/MiniLcm.Tests/WriteNormalizationTests.cs index 0b76444495..dc5cd8fe60 100644 --- a/backend/FwLite/MiniLcm.Tests/WriteNormalizationTests.cs +++ b/backend/FwLite/MiniLcm.Tests/WriteNormalizationTests.cs @@ -505,6 +505,69 @@ public async Task CreateComplexFormComponent_NormalizesToNfd() #endregion + #region Variant Tests + + // These cover the Submit* variant overrides. Each asserts two things: the payload is + // NFD-normalized, AND the call forwards to _api.Submit* rather than the returning + // Create/Update — proving the wrapper preserves the sync's delete-wins semantics + // instead of downgrading to a NotFound-throwing write (see AGENTS.md "Submit* write variants"). + + [Fact] + public async Task SubmitCreateVariant_NormalizesToNfd_AndKeepsSubmitSemantics() + { + var variant = NfcTestData.CreateNfcVariant(); + + Variant? captured = null; + Mock.Get(_mockApi) + .Setup(api => api.SubmitCreateVariant(It.IsAny())) + .Callback(v => captured = v) + .Returns(Task.CompletedTask); + + await _normalizingApi.SubmitCreateVariant(variant); + + AssertNormalizedToNfd(captured, variant); + Mock.Get(_mockApi).Verify(api => api.CreateVariant(It.IsAny()), Times.Never); + } + + [Fact] + public async Task SubmitUpdateVariant_JsonPatch_NormalizesToNfd() + { + var update = new UpdateObjectInput().Set(v => v.Comment, NfcTestData.CreateNfcRichMultiString()); + + UpdateObjectInput? captured = null; + Mock.Get(_mockApi) + .Setup(api => api.SubmitUpdateVariant(It.IsAny(), It.IsAny>())) + .Callback>((_, patch) => captured = patch) + .Returns(Task.CompletedTask); + + await _normalizingApi.SubmitUpdateVariant(NfcTestData.CreateNfcVariant(), update); + + captured.Should().NotBeNull(); + var byPath = captured.Patch.Operations.ToDictionary(o => o.Path!, o => o.Value); + AssertAllDecomposed(byPath["/Comment"].Should().BeOfType().Subject); + } + + [Fact] + public async Task SubmitUpdateVariantType_JsonPatch_NormalizesToNfd_AndKeepsSubmitSemantics() + { + var update = new UpdateObjectInput().Set(vt => vt.Name, NfcTestData.CreateNfcMultiString()); + + UpdateObjectInput? captured = null; + Mock.Get(_mockApi) + .Setup(api => api.SubmitUpdateVariantType(It.IsAny(), It.IsAny>())) + .Callback>((_, patch) => captured = patch) + .Returns(Task.CompletedTask); + + await _normalizingApi.SubmitUpdateVariantType(Guid.NewGuid(), update); + + captured.Should().NotBeNull(); + var byPath = captured.Patch.Operations.ToDictionary(o => o.Path!, o => o.Value); + AssertAllDecomposed(byPath["/Name"].Should().BeOfType().Subject); + Mock.Get(_mockApi).Verify(api => api.UpdateVariantType(It.IsAny(), It.IsAny>()), Times.Never); + } + + #endregion + #region Sense Tests [Fact] diff --git a/backend/FwLite/MiniLcm/IMiniLcmWriteApi.cs b/backend/FwLite/MiniLcm/IMiniLcmWriteApi.cs index a5a305502a..d33e494e0d 100644 --- a/backend/FwLite/MiniLcm/IMiniLcmWriteApi.cs +++ b/backend/FwLite/MiniLcm/IMiniLcmWriteApi.cs @@ -155,10 +155,22 @@ Task UpdatePicture(Guid entryId, #endregion #region Submit (fire-and-forget write variants for sync) - // Result-less write variants the sync uses instead of the returning Update/Create methods above. The CRDT - // overrides them to submit the change without fetching the result, so applying to an object the other side - // deleted leaves it deleted (delete wins) rather than throwing. The defaults forward to the returning - // method (correct for FwData, which still surfaces a genuinely-missing object). + // Result-less write variants the sync's diff-apply uses instead of the returning Update/Create methods above. + // The CRDT overrides them to submit the change without fetching the result, so applying to an object the other + // side deleted leaves it deleted (delete wins) rather than throwing NotFoundException — which would otherwise + // wedge the whole project sync. The defaults forward to the returning method (correct for FwData, which still + // surfaces a genuinely-missing object). + // + // A Submit variant is only needed where the sync diff writes to a target that could have been concurrently + // deleted on the opposite replica: every id-targeted Update/Move, plus the child Creates run inside EntrySync + // (SubmitCreateSense/ExampleSentence/ComplexFormComponent/Variant) whose parent entry may be gone. It is NOT + // needed for a fresh top-level Create of a dependency type — that mints a new object, so there is no + // concurrent-delete race (hence there is no SubmitCreateVariantType/ComplexFormType/etc.). + // + // Wrapper authors: these have default bodies, so they are NOT compile-enforced like the other write methods. + // A wrapper that forwards to a Submit method (or is meant to preserve its semantics) MUST override it + // explicitly — see the "Submit* write variants" rule in backend/FwLite/AGENTS.md for why each wrapper's + // default behavior is wrong here. Task SubmitUpdateEntry(Guid id, UpdateObjectInput update) => UpdateEntry(id, update); Task SubmitCreateComplexFormComponent(ComplexFormComponent complexFormComponent, BetweenPosition? position = null) => CreateComplexFormComponent(complexFormComponent, position); Task SubmitMoveComplexFormComponent(ComplexFormComponent complexFormComponent, BetweenPosition between) => MoveComplexFormComponent(complexFormComponent, between); diff --git a/backend/FwLite/MiniLcm/Normalization/MiniLcmApiWriteNormalizationWrapper.cs b/backend/FwLite/MiniLcm/Normalization/MiniLcmApiWriteNormalizationWrapper.cs index 2957f23cbc..f8964987ac 100644 --- a/backend/FwLite/MiniLcm/Normalization/MiniLcmApiWriteNormalizationWrapper.cs +++ b/backend/FwLite/MiniLcm/Normalization/MiniLcmApiWriteNormalizationWrapper.cs @@ -219,6 +219,13 @@ public Task UpdateVariantType(Guid id, UpdateObjectInput update) + { + return _api.SubmitUpdateVariantType(id, NormalizePatch(update)); + } + public async Task UpdateVariantType(VariantType before, VariantType after, IMiniLcmApi? api = null) { @@ -324,6 +331,12 @@ public async Task CreateVariant(Variant variant) return await _api.CreateVariant(NormalizeVariant(variant)); } + // See SubmitUpdateVariantType above: forward to _api.SubmitCreateVariant so delete-wins is preserved. + public Task SubmitCreateVariant(Variant variant) + { + return _api.SubmitCreateVariant(NormalizeVariant(variant)); + } + public async Task UpdateVariant(Variant before, Variant after, IMiniLcmApi? api = null) { return await _api.UpdateVariant(NormalizeVariant(before), NormalizeVariant(after), api); From 868dd5362d66b5d727f29dfe0457a6a0a466913e Mon Sep 17 00:00:00 2001 From: Tim Haasdyk Date: Tue, 7 Jul 2026 09:55:47 +0200 Subject: [PATCH 21/21] Tolerate concurrently-deleted variant types on the sync path MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adding a variant type during sync (VariantSync → AddVariantType, and SubmitCreateVariant for a whole link) threw when the type had been concurrently deleted on the other replica, wedging the entire project sync. Both IMiniLcmApi implementations now drop the missing type (delete wins), matching Remove/MoveVariantType and AddVariantChange.NewEntity, which already tolerated it. New conformance tests (both implementations) fail without the fix. Also: exclude Variant.Types[].Order from the CanSyncRandomEntries round-trip comparison — it was the only Order field not excluded, and the write path normalizes it like every other orderable, which was the red CI. And correct stale VARIANTS.md type-ordering docs + soften unverified FLEx-UI comments. Co-Authored-By: Claude Opus 4.8 --- .../Api/FwDataMiniLcmApi.cs | 8 +++-- .../FwLiteProjectSync.Tests/EntrySyncTests.cs | 6 +++- .../Changes/Entries/AddVariantTypeChange.cs | 3 ++ backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs | 14 +++++---- .../FwLite/MiniLcm.Tests/VariantTestsBase.cs | 30 +++++++++++++++++++ backend/FwLite/MiniLcm/Models/Variant.cs | 2 +- .../FwLite/MiniLcm/Models/VariantTypeRef.cs | 4 +-- backend/FwLite/VARIANTS.md | 12 ++++---- 8 files changed, 63 insertions(+), 16 deletions(-) diff --git a/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs b/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs index 3fd6e9f9f2..f52a6f928d 100644 --- a/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs +++ b/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs @@ -1445,7 +1445,9 @@ public Task AddVariantType(Variant variant, Guid variantTypeId, BetweenPosition? if (!EntriesRepository.TryGetObject(variant.VariantEntryId, out var lexVariantEntry)) return; var entryRef = FindVariantRefForUpdate(lexVariantEntry, variant); if (entryRef is null) return; - var lexEntryType = VariantTypesFlattened.Single(t => t.Guid == variantTypeId); + //type concurrently deleted on the other replica → drop the add (delete wins), matching Remove/MoveVariantType + var lexEntryType = VariantTypesFlattened.SingleOrDefault(t => t.Guid == variantTypeId); + if (lexEntryType is null) return; if (entryRef.VariantEntryTypesRS.Contains(lexEntryType)) return; entryRef.VariantEntryTypesRS.Insert(PickTypeInsertIndex(entryRef, position), lexEntryType); }); @@ -1532,7 +1534,9 @@ internal void AddVariant(ILexEntry lexVariantEntry, Variant variant) UpdateLcmMultiString(entryRef.Summary, variant.Comment); foreach (var type in variant.Types) { - entryRef.VariantEntryTypesRS.Add(VariantTypesFlattened.Single(t => t.Guid == type.Id)); + //skip a type concurrently deleted on the other replica (delete wins), like the CRDT create path + var lexEntryType = VariantTypesFlattened.SingleOrDefault(t => t.Guid == type.Id); + if (lexEntryType is not null) entryRef.VariantEntryTypesRS.Add(lexEntryType); } entryRef.ComponentLexemesRS.Add(target); } diff --git a/backend/FwLite/FwLiteProjectSync.Tests/EntrySyncTests.cs b/backend/FwLite/FwLiteProjectSync.Tests/EntrySyncTests.cs index 64a6b1abaf..7982da9bac 100644 --- a/backend/FwLite/FwLiteProjectSync.Tests/EntrySyncTests.cs +++ b/backend/FwLite/FwLiteProjectSync.Tests/EntrySyncTests.cs @@ -378,7 +378,11 @@ public async Task CanSyncRandomEntries(ApiType? roundTripApiType) .For(e => e.VariantOf).Exclude(v => v.VariantHeadword) .For(e => e.VariantOf).Exclude(v => v.MainHeadword) .For(e => e.Variants).Exclude(v => v.VariantHeadword) - .For(e => e.Variants).Exclude(v => v.MainHeadword); + .For(e => e.Variants).Exclude(v => v.MainHeadword) + // Type order is (re)assigned on write like every other Order above; the randomly-built + // values don't round-trip. Real order round-trip is asserted in VariantSyncTests. + .For(e => e.VariantOf).For(v => v.Types).Exclude(t => t.Order) + .For(e => e.Variants).For(v => v.Types).Exclude(t => t.Order); if (currentApiType == ApiType.FwData) { // does not support changing MorphType yet (see UpdateEntryProxy.MorphType) diff --git a/backend/FwLite/LcmCrdt/Changes/Entries/AddVariantTypeChange.cs b/backend/FwLite/LcmCrdt/Changes/Entries/AddVariantTypeChange.cs index 969a5d574b..21fbe78d8b 100644 --- a/backend/FwLite/LcmCrdt/Changes/Entries/AddVariantTypeChange.cs +++ b/backend/FwLite/LcmCrdt/Changes/Entries/AddVariantTypeChange.cs @@ -30,6 +30,9 @@ public override async ValueTask ApplyChange(Variant entity, IChangeContext conte // Skip adding if this is a duplicate change if (entity.Types.Any(t => t.Id == VariantTypeId)) return; if (await context.IsObjectDeleted(VariantTypeId)) return; + // Order is resolved from Between against live state at apply time (the ctor/serialized Order is not + // authoritative), so concurrent adds converge. ReorderVariantTypeChange deliberately differs — it + // stores a fixed Order — because a reorder targets a specific destination, an add just needs a slot. Order = OrderPicker.PickOrder(entity.Types, Between); entity.Types.Add(new VariantTypeRef { Id = VariantTypeId, Order = Order }); entity.Types.Sort(VariantTypeRef.CompareRefs); diff --git a/backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs b/backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs index 90b791882b..34c568114c 100644 --- a/backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs +++ b/backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs @@ -478,10 +478,12 @@ private static async Task CreateVariantChange(MiniLcmRepositor throw new InvalidOperationException($"Sense {variant.MainSenseId} does not belong to entry {variant.MainEntryId}, it belongs to {senseEntryId}"); } var typeIds = variant.Types.Select(t => t.Id).ToArray(); - var knownTypeIds = await repo.VariantTypes.Where(t => typeIds.Contains(t.Id)).Select(t => t.Id).ToArrayAsync(); - var missing = typeIds.Except(knownTypeIds).ToArray(); - if (missing.Length > 0) - throw new InvalidOperationException($"Variant {variant} references variant types which do not exist: {string.Join(", ", missing)}"); + var knownTypeIds = (await repo.VariantTypes.Where(t => typeIds.Contains(t.Id)).Select(t => t.Id).ToArrayAsync()).ToHashSet(); + // Drop type refs whose VariantType was concurrently deleted on the other replica (delete wins); + // this is the sync-reachable path (SubmitCreateVariant), and AddVariantChange.NewEntity applies + // the same tolerance at change-apply time. Throwing here would wedge the whole project sync. + if (variant.Types.Any(t => !knownTypeIds.Contains(t.Id))) + variant.Types = [.. variant.Types.Where(t => knownTypeIds.Contains(t.Id))]; return new AddVariantChange(variant); } @@ -521,7 +523,9 @@ public async Task AddVariantType(Variant variant, Guid variantTypeId, BetweenPos await using var repo = await repoFactory.CreateRepoAsync(); var existing = await repo.FindVariant(variant); if (existing is null) return; - var variantType = await repo.VariantTypes.SingleAsync(vt => vt.Id == variantTypeId); + // type concurrently deleted on the other replica → drop the add (delete wins), matching Remove/MoveVariantType + var variantType = await repo.VariantTypes.SingleOrDefaultAsync(vt => vt.Id == variantTypeId); + if (variantType is null) return; await AddChange(new AddVariantTypeChange(existing.Id, new VariantTypeRef { Id = variantType.Id }, position)); } diff --git a/backend/FwLite/MiniLcm.Tests/VariantTestsBase.cs b/backend/FwLite/MiniLcm.Tests/VariantTestsBase.cs index ca9c55928a..435d3f91df 100644 --- a/backend/FwLite/MiniLcm.Tests/VariantTestsBase.cs +++ b/backend/FwLite/MiniLcm.Tests/VariantTestsBase.cs @@ -464,6 +464,36 @@ public async Task AddVariantType_IsIdempotent() link.Types.Should().ContainSingle(t => t.Id == type.Id); } + [Fact] + public async Task AddVariantType_ToleratesAConcurrentlyDeletedType() + { + // Sync (VariantSync.Add -> AddVariantType) can add a type that was concurrently deleted on + // the other replica. Drop it (delete wins) instead of wedging the whole sync — matching + // Remove/MoveVariantType and AddVariantChange.NewEntity, which already tolerate this. + var type = await CreateVariantType(); + var variant = await Api.CreateVariant(Variant.FromEntries(_variantEntry, _mainEntry)); + await Api.DeleteVariantType(type.Id); + + await Api.AddVariantType(variant, type.Id); + + var link = (await Api.GetEntry(_variantEntryId))!.VariantOf.Should().ContainSingle().Subject; + link.Types.Should().NotContain(t => t.Id == type.Id); + } + + [Fact] + public async Task SubmitCreateVariant_DropsAConcurrentlyDeletedType() + { + // A whole link synced in (EntrySync -> SubmitCreateVariant) may carry a type that was + // concurrently deleted on this replica; drop the dangling type rather than wedging the sync. + var type = await CreateVariantType(); + await Api.DeleteVariantType(type.Id); + + await Api.SubmitCreateVariant(Variant.FromEntries(_variantEntry, _mainEntry) with { Types = [type.ToRef()] }); + + var link = (await Api.GetEntry(_variantEntryId))!.VariantOf.Should().ContainSingle().Subject; + link.Types.Should().BeEmpty(); + } + [Fact] public async Task RemoveVariantType_Works() { diff --git a/backend/FwLite/MiniLcm/Models/Variant.cs b/backend/FwLite/MiniLcm/Models/Variant.cs index 9cd51d48e4..436ed3a21e 100644 --- a/backend/FwLite/MiniLcm/Models/Variant.cs +++ b/backend/FwLite/MiniLcm/Models/Variant.cs @@ -13,7 +13,7 @@ namespace MiniLcm.Models; /// and per-link edits split a shared ref first (see FwDataMiniLcmApi.FindVariantRefForUpdate). /// Unlike there is no Order — variant *link* lists have /// no user-meaningful order in FieldWorks. The sequence on a link IS -/// user-ordered (FLEx: right-click a type → move left/right) and round-trips via +/// ordered (liblcm's VariantEntryTypes is a card="seq" reference sequence) and round-trips via /// , like sense pictures. /// public record Variant : IObjectWithId diff --git a/backend/FwLite/MiniLcm/Models/VariantTypeRef.cs b/backend/FwLite/MiniLcm/Models/VariantTypeRef.cs index d8b4543934..4da13ad045 100644 --- a/backend/FwLite/MiniLcm/Models/VariantTypeRef.cs +++ b/backend/FwLite/MiniLcm/Models/VariantTypeRef.cs @@ -3,8 +3,8 @@ namespace MiniLcm.Models; /// /// One variant type assigned to a variant link (). Id is the /// 's id — names resolve via the canonical type list. Order makes the -/// per-link sequence round-trip (FLEx: right-click a type → move left/right); it works like -/// . +/// per-link sequence round-trip (liblcm's VariantEntryTypes is an ordered card="seq" reference +/// sequence); it works like . /// public class VariantTypeRef : IOrderable { diff --git a/backend/FwLite/VARIANTS.md b/backend/FwLite/VARIANTS.md index 134dd367dc..2ed5fba1b1 100644 --- a/backend/FwLite/VARIANTS.md +++ b/backend/FwLite/VARIANTS.md @@ -37,7 +37,7 @@ abandonment. Devin clean; CI 27/27 at `55d4485cd`. [#2409](https://github.com/sillsdev/languageforge-lexbox/pull/2409) (stacked UI draft) closed as superseded. - **Iteration 2 — cumulative backend+UI, [#2410](https://github.com/sillsdev/languageforge-lexbox/pull/2410) - (OPEN, base develop)**: scoped /polish clean; CodeRabbit round (doc fixes accepted, picker + (now closed, base develop)**: scoped /polish clean; CodeRabbit round (doc fixes accepted, picker cycle-guard suggestion rejected as complex-form-picker precedent); Devin clean ×3; CI green. - **liblcm deep review (4 parallel agents, every claim cited against `D:\code\liblcm` source)** → commit `0d03aed28`, the highest-risk commit in the stack. Found and fixed: @@ -176,9 +176,11 @@ public record Variant : IObjectWithId This is what makes concurrent type edits merge instead of last-writer-wins. 6. **No link ordering; type order is real.** Variant *link* lists have no user-meaningful order in FLEx; both directions diff as sets — no `IOrderable`, no `SetOrderChange`, no Move - API for links. A link's `Types` sequence IS user-ordered (FLEx: right-click → move - left/right), so it round-trips: `SetVariantTypesOrderChange` + `SetVariantTypesOrder` - normalize order after the type add/remove diff (added on review, hahn-kev). + API for links. A link's `Types` sequence IS ordered (liblcm's `VariantEntryTypes` is a + `card="seq"` reference sequence), so it round-trips per-item like sense pictures: + `VariantTypeRef.Order` (fractional), `AddVariantType`/`MoveVariantType(…, BetweenPosition)`, + and `ReorderVariantTypeChange` (merges per type under concurrency). Reworked on review from + the earlier whole-list `SetVariantTypesOrderChange` design (197804694). 7. **Self-references, duplicates AND cycles are rejected; chains are allowed.** (This decision reversed mid-implementation: `MakeVariantOf` has no cycle check, but the FwData conformance tests proved liblcm rejects circular refs at a lower level — @@ -266,7 +268,7 @@ Write: `UseChangesTests.GetAllChanges()` — kernel comment mandates it): `AddVariantChange` (create; carries types+scalars; dedupe/cycle/deleted-ref handling mirroring `AddEntryComponentChange`), - `AddVariantTypeChange`/`RemoveVariantTypeChange` (`EditChange`), + `AddVariantTypeChange`/`RemoveVariantTypeChange`/`ReorderVariantTypeChange` (`EditChange`), `CreateVariantType`, `JsonPatchChange`, `JsonPatchChange`, `DeleteChange`, `DeleteChange`. A `SetVariantChange` (mirror of `SetComplexFormComponentChange`) was considered and