diff --git a/dochub.yaml b/dochub.yaml index b1fde0f..ab60e30 100644 --- a/dochub.yaml +++ b/dochub.yaml @@ -8,7 +8,7 @@ $package: # Описание description: Sber Enterprise Architect Framework # Версия - version: 1.2.7 + version: 1.2.8 # Зависимости от других пакетов dependencies: dochub: ">=3.9.0" @@ -16,4 +16,4 @@ $package: imports: - functions/root.yaml - entities/root.yaml - - docs/root.yaml \ No newline at end of file + - docs/root.yaml diff --git a/docs/app/overview.md b/docs/app/overview.md index 12c169c..f459cd8 100644 --- a/docs/app/overview.md +++ b/docs/app/overview.md @@ -2,4 +2,16 @@ Слой прикладной архитектуры базируется на сущностях метамодели [DocHub](https://dochub.info/). +Сущность **contexts** получила расширение в пакете seaf-core. В пакете добавлен дополнительный тип представления (параметр presentation) со значением _integration_. +В представление контекста с типом _integration_ на схеме отображаются связи между компонентами из объектов _seaf.app.integration_. +**Пример описания контекста** +```yaml + flix_integrations: + title: Прикладные сервисы Участника Фликс (интеграции) + location: Прикладные сервисы/Фликс (интеграции) + presentation: integration + components: + - flix + - flix.** +``` diff --git a/docs/ba/archive/ba_function.md b/docs/ba/archive/ba_function.md deleted file mode 100644 index 9b74fbd..0000000 --- a/docs/ba/archive/ba_function.md +++ /dev/null @@ -1,47 +0,0 @@ -###### :orange_book: (ba_function.md) - ---- - -# Бизнес-архитектура (БА) - -БА -- это система социально-экономических отношений, при установлении которых между между Субъектами, может осуществляться передача Ресурсов (прав на Ресурсы). - -Субъект -- экономически активное лицо (юридическое, физическое, группа лиц), устанавливая социально-экономические отношения с другими Субъектами, формирует *"свою"* бизнес-архитектуру и является непосредственным интересантом в управлении данной БА. - -## БА и БА-функция - -Управление БА подразумевает в общем случае планирование отношений, их установление, эксплуатацию, продление, изменение, прекращение и т.д. Может сложиться ложное ощущение, что это очень простая концепция и для управления БА не требуется "архитектурная функция". В некоторых случаях это действительно может быть так, но если принять во внимание следующие возможные аспекты отношений, то БА представляется уже не столь простой системой: -* Отношение подразумевают обязательство совершить определенные действия, хотябы с одной стороны, а значит данная сторона должна иметь средства и возможность их совершить. Это в свою очередь порождает потребность в установлении других отношений с другими Субъектами -- иными словами необходимость встраивания себя в цепочки ценности. -* Отношение подразумевает, как минимум, одну вторую сторону, которая имеет свои намерения и может не установить, прекратить или изменить отношение. БА -- это крайне изменчивая система. -* Осознанное построение БА подразумевает наличие цели, которая достигается с помощью БА в той или иной степени, а значит БА должна оцениваться и совершенствоваться исходя из целей и текущего контекста. -* Субъект может представлять из себя сложную организацию многих Субъектов, а значит сталкиваться с необходимостью обеспечения коммуникации и синхронизации "внутренних" Субъектов, для каждого из которых настоящие положения в свою очередь также могут быть релевантны. - -Субъекты, достигающие определенного уровня развития своей БА, неизбежно начинают явно или неявно осуществлять архитектурную функцию как часть управленческих процессов. В общем случае, БА-функция решает следующие задачи: - -* Определение существующих и потенциальных социально-экономических отношений для лучшего достижения целей Субъекта с учетом уровня развития Субъекта (жизненного цикла). -* Определение взаимного влияния отношений Субъекта, зависимостей отношений от различных элементов общей корпоративной архитектуры и приоритезация изменений. - -В зависимости от интегрированности БА-функции в процессы управления (уровня зрелости), под "определением" отношений и зависимостей может подразумеваться как простая фиксация реестровой информации, так и выработка детальных качественных/количественных требований к элементам общей корпоративной архитектуры. Ниже приведены примеры управленческих процессов с разбивкой по условным уровням управления, которые в той или иной степени используют БА-функцию: -* Стратегический менеджмент: - * каскадирование стратегии (цели, изменения) на элементы КА - * "trace back" реализации стратегии c операционного уровня -* Операционный менеджмент: - * распределение зон ответственности - * "привязка" к стратегии - * горизонтальная интеграция -* Мидл-менеджмент: - * изменения "снизу вверх" - * управление ресурсами -* ИТ-менеджмент: - * "привязка" к "бизнесу" - * управление требованиями к ИТ - -## Описание БА - -Описание БА является неотъемлемым видом деятельности в рамках БА-функции. Качество процесса и результата описания БА напрямую влияют на возможности анализа отношений между элементами и, как следствие, на согласование и принятие управленческих бизнес-решений. Для обеспечения требуемого уровня качества выделяются два аспекта: -* методология описания -* инструментарий для описания - -![](@document/seaf.ba.method) -![](@document/seaf.ba.realization) - diff --git a/docs/ba/archive/ba_method.md b/docs/ba/archive/ba_method.md deleted file mode 100644 index 7bafd3f..0000000 --- a/docs/ba/archive/ba_method.md +++ /dev/null @@ -1,19 +0,0 @@ -### Методология - -Описание БА относится к одному из 4-х слоев, определенных в [SEAF 1.0](../../../../README.md). Взаимосвязь метамодели БА с метамоделями слоев Прикладной и Информационной архитектуры схематично отображена на рисунке ниже: - -![](ba-ea_links.png) - -Метамодель БА сконфигурирована таким образом, чтобы описание отражало информацию: -* о социально-экономических отношениях между организациями и группами -* о целях и способах участия в таких отношениях -* о механизмах, ресурсах и условиях, необходимых для участия в таких отношениях -* о порядке действий для осуществления таких отношений. - - -Методология описания БА и способы описания БА в DocHub изложены в документах (перечень дополняется): -* [Экосистема](/docs/seaf.ba.seaf.ba.method) -- материал об Экосистеме как глобальном контексте при управлении БА -* [Пошаговое руководство](/docs/seaf.ba.tutorial) по быстрому созданию минимального описания БА компании от Продуктов до Прикладных сервисов -* [Методология БА one-page](/docs/seaf.ba.main) -- верхнеуровневый документ, кратко покрывающий все аспекты БА в DocHub и содержащий ссылки на все подробные материалы: - - diff --git a/docs/ba/archive/ba_method_one_page.md b/docs/ba/archive/ba_method_one_page.md deleted file mode 100644 index c8cde16..0000000 --- a/docs/ba/archive/ba_method_one_page.md +++ /dev/null @@ -1,54 +0,0 @@ -###### SEAF Business Architecture (readme.md) - ---- -**Зависимости:** - - -### Краткая аннотация (драфт) - -##### Бизнес-архитектура (БА) экосистемы - -В данном контексте Экосистема -- это совокупность Участников (Parties) социально-экономических отношений, действующих в своих интересах для удовлетворения потребностей и достижения целей. - -Для того, чтобы преуспевать в экосистеме, Участники вступают в отношения, подразумевающие обмен Ресурсами (товарами, услугами, деньгами, вниманием, возможностями и пр.). Поскольку Ресурсы (как отдаваемые, так и получаемые) обладают некоторой субъективной ценностью с точки зрения каждого Участника, то и возможности обмена ценностью становятся тем обширнее, чем больше Участников образуют экосистему. - -*Метамодель для описания мотиваций Участников появится в будущих релизах.* - -В текущей альфа-версии описание экосистемы начинается с описания Участников и Продуктов. Продукт - это способ, механизм, и/или порядок в рамках которого два или более Участника взаимодействуют, чтобы произвести обмен ценностью. - -[В данном примере](/entities/hexV/view?id=ecosystem) показано взаимодействие нескольких Участников. - -С точки зрения Продукта, как правило существуют сторона (или несколько), которые организуют, поддерживают, фасилитируют механизм обмена, и сторона, которая "пользуется" механизмом (обычно это т.н. Потребитель), компенсируя Владельцу его затраты в виде дополнительной передаваемой ценности. - -В современном мире, кажется уже не осталось моно-продуктов, и для того, чтобы ограничить объем описания экосистемы, предлагается придерживаться детализации на уровне "предмет контракта/договора - целевая аудитория". В некоторых случаях может быть важным описать не только целевые аудитории Участников, но и Конкретных Участников-партнеров, от продуктов которых имеется зависимость в "нашем" Продукте. - -#### Процессы и Ресурсы - -Взаимодействие Участников в рамках Продуктов есть ни что иное как согласованная последовательность действий, в результате которых происходит передача ценных ресурсов от одной стороны к другой и в обратном направлении -- то есть Процесс (Процессы). - -Границы одних и тех же Продуктов и Процессов с точки различных Участников могут проходить по-разному. Рекомендуется следующий подход: -* Действия потребителей и действия со стороны Владельца, непосредственно связянные с действиями Потребителя, будем считать объемом "внешней" спецификацией Продукта, которую целесообразно предоставлять вниманию других Участников экосистемы для целей интеграции. Вероятно, во многих случаях, внешняя спецификация будет представлять из себя т.н. Клиентский Путь (Customer Journey). -* Все остальные действия, осуществляемые Владельцем, необходимые для поддержания "внешнего" Процесса, как правило скрытые от внешнего наблюдателя. -* Внешняя спецификация и скрытые действия (из 2-го пункта) образуют полную внутреннюю спецификацию. - -В зависимости от практики управления, сложившейся в той или иной организации, в архитектуре могут быть выделены внутренние Продукты (не путать c внутренней спецификацией). Обратите внимание на Продукт "Медиа-платформа" в [примере](/entities/hexV/view?id=process_map&mode=Процессы%20по%20Продуктам). В данной компании, скорее всего,существует явный Владелец такого Продукта и его внутренние и внешние Потребители. - -*В данном релизе не используются объекты "событие", необходимые для описания связных процессов. Данный вид объектов появится в будущих релизах вместе с функциональностью по работе с BPMN.* - -Как упоминалось выше, обмен ценностью связан с переходом Ресурсов между Участниками. Ресурсы (носители ценности) трансформируются, обрабатываются, меняют статус, расходуются, используются и т.д. в ходе выполнения Процессов. В ISO 15504 расходование ресурсов является свидетельством наличия Процесса. - -В рамках текущей метамодели не сделано никаких сутевых отличий между способами потребления Ресурсов. Ресурс либо потребляется, либо производится в ходе совершения действий Процесса. Однако, в конкретной организации, как правило, такие отличия имеют весомое значение, поэтому, не нарушая простоты метамодели, предлагается использовать дополнительную (индивидуальную, специфическую) классификацию как [типов ресурсов](/entities/hexV/view?id=resource_registry), так и [способов потребления ресурсов](/entities/hexV/view?id=process_map&mode=Использование%20ресурсов), как показано в примерах. - - -###### Capabilities (Способности) -Способность -- это фактическая готовность выполнить действие в определенный момент времени, на определенных условиях. Ресурсы аллоцированы и находятся в ожидании сигнала. Чем тогда Способность отличается от Процесса/Продукта? Дискуссия на эту тему может быть долгой и не привести к четкому определению разницы. В рамках Сообщества предлагается принять следующую рабочую гипотезу: -* Процесс направлен на достижение повторяемого результата (воспроизведение ценного ресурса) -* Продукт направлен на создание благоприятных условий для взаимовыгодного обмена ресурсами -* Способность направлена на обеспечение непрерывности наличия потребляемых ресурсов (оптимизацию потребления и/или использования ресурсов, предотвращение сбоев в процессе, предвидение изменений в Продуктовой среде). - -Иными словами, эти три сущности отличаются видом управленческих задач, решаемых Участником для удовлетворения своих Потребностей. - -Исходя из предложенного нарратива, Способности будем соотносить с зонами ответственности за использование Ресурсов сходных по применению (компетенциям), разделяемых между различными Участниками. - -Сравнивая [пример с разбивкой Процессов по Продуктам](/entities/hexV/view?id=process_map&mode=Процессы%20по%20Продуктам) и [аналогичный пример со Способностями](/entities/hexV/view?id=capability_map&mode=Процессы%20по%20способностям) можно отметить, что Продуктовая классификация тяготеет к образу действий потребителя, а вторая -- к комплиментарным технологическим решениям. - diff --git a/docs/ba/archive/ba_realization.md b/docs/ba/archive/ba_realization.md deleted file mode 100644 index d2b0e78..0000000 --- a/docs/ba/archive/ba_realization.md +++ /dev/null @@ -1,7 +0,0 @@ -### Реализация БА в DocHub ---- -:warning: В SEAF 1.0 слой Бизнес-архитектуры реализован в DocHub с помощью аддона [Hexagon (alfa)](/docs/hex_main) -- расширение для создания метамоделей без использования JSONata. - -Для ознакомления с примерами и использования метамодели БА необходимо дополнительно подключить манифест /\_metamodel\_/hexagon/dochub.yaml, если он не подключен (см. корневой dochub.yaml поставки). - ---- diff --git a/docs/ba/archive/ecosystem.md b/docs/ba/archive/ecosystem.md deleted file mode 100644 index 74d4f49..0000000 --- a/docs/ba/archive/ecosystem.md +++ /dev/null @@ -1,27 +0,0 @@ -###### :orange_book: ecosystem.md (draft) - ---- - -### Экосистема - -Традиционно, термин "экосистема" употребляется в отношении природных систем, которые *могут* образовываться и развиваться без вмешательства человека. Человек, при этом, являясь частью природной экосистемы, обладает отличительными способностями познавать, ставить цели и создавать, что делает человечество хорошо различимой подсистемой. - -Далее под термином **Экосистема** будет подразумеваться именно социально-экономическая подсистема -- вся совокупность существующих отношений между индивидуумами, группами и организациями (далее -- Участники Экосистемы или просто Участники), реализуемых ими с намерением преуспеть в достижении своих целей путем взаимного обмена Ресурсами. - -### Что такое Экосистема Сбер, Amazon, Apple и т.д. ? - -В повседневной жизни часто встречаются речевые обороты "Экосистема <название компании>", "строить Экосистему" и другие похожие, несущие в себе смысл "созданные искусственно", то есть Человеком. На первый взгляд, определение Экосистемы, приведенное выше, противоречит общепринятым смыслам. - -Как упоминалось в [статье "Бизнес-архитектура"](/docs/seaf.ba.entry), Участники управляют своими социально-экономическими отношениями. Изменение таких отношений неизбежно меняет Экосистему. Масштаб может быть микроскопическим или более заметным в рамках Экосистемы в зависимости от силы произведенного Участником действия и текущего состояния Экосистемы. Но важнее то, что Участник при планировании своих действий может учитывать сравнительно бОльшую часть Экосистемы вокруг себя (то есть не только свои прямые связи, но отношения между другими Участниками). Исходя из этого, сформулируем несколько утверждений-гипотез: - -* любой Участник (даже индивидуум) имеет влияние на Экосистему -* каждый Участник является "Центром своей **э**косистемы" -- имеет точку зрения на **Э**косистему -* некоторые Участники в своих действиях учитывают бОльший радиус отношений в Экосистеме, чем другие -* бОльший радиус внимания -- больше возможностей для полезного распространения своего влияния -* действие в бОльшем радиусе увеличивает влияние на Экосистему -* большее влияние Участника сильнее меняет Экосистему в пользу Участника - -Таким образом, "**э**косистема Участника" -- есть часть **Э**косистемы в которой он приобрел заметное влияние. "Построение **э**косистемы" -- есть расширение своего влияния на Экосистему. Противоречие разрешено. - - - diff --git a/docs/ba/archive/ecosystem_ba.md b/docs/ba/archive/ecosystem_ba.md deleted file mode 100644 index 8625740..0000000 --- a/docs/ba/archive/ecosystem_ba.md +++ /dev/null @@ -1,14 +0,0 @@ -# Экосистемный подход - -Осознание Участником себя частью Экосистемы, стремление к расширению знания об Экосистеме и использование такого знания при разработке и реализации стратегии будем называть **экосистемным подходом**. - -Принятие экосистемного подхода означает, что Участник: -* рассматривает себя в контексте не только прямых отношений со своими контрагентами, но и отношений контрагент-контрагент -* влияет на отношения между контрагентами, создает контрагентов при необходимости -* культивирует экосистемный подход к развитию бизнеса среди контрагентов - -TBD: иллюстрации и примеры к каждому пункту - -Принятие экосистемного подхода влечет за собой необходимость усиления (выделения) архитектурной функции, в том числе в части БА, вследствие: -* возрастающей сложности "картины мира" и вариативности стратегии развития -* необходимостью вовлекать в архитектурную функцию контрагентов, т.е. Участников и обеспечивать федеративное управление экосистемной архитектурой. diff --git a/docs/ba/ba_main.md b/docs/ba/ba_main.md deleted file mode 100644 index 93535cb..0000000 --- a/docs/ba/ba_main.md +++ /dev/null @@ -1,63 +0,0 @@ -###### :orange_book: ba_main.md - ---- -# Бизнес-архитектура (БА) - -### Участники - -БА -- это система социально-экономических отношений между экономически-активными Участниками. - -Участники -- юридические, государственные, физические, неформальные объединения и аналитические группы лиц, участвующие в обмене ресурсами с намерением преуспеть в достижении своих Целей путем взаимного обмена Ресурсами (товарами, услугами, деньгами, информацией, вниманием, возможностями и пр.). - -Мотивация к обмену Ресурсами возникает в силу того, что каждый ресурс обладает субъективной Ценностью с точки зрения каждого конкретного Участника и его Целей. По этой же причине каждый Участник управляет БА вокруг себя исходя из собственной "системы ценностей". - -Управление БА в общем случае -- это: -* установление, поддержание и прекращение отношений с другими Участниками -- своим внешним окружением, контрагентами -* организация собственных ресурсов и способностей -- внутреннего устройства для реализации отношений во внешнем окружении. - -Т.о. каждый Участник имеет **свою** точку зрения на БА, и поэтому, описание БА начинается с определения Участников [подробнее...](/docs/seaf.ba.root_domain) - -### Владение - -Для того чтобы участвовать в обмене с другими Участниками, необходимо чем-то **владеть** (to own). - -Владение (ownership) -- это право определять каким будет объект владения, способность изменять объект владения, возможность использовать объект владения по своему усмотрению. - -Метамодель БА в объеме SEAF-CORE, кроме Участников, содержит Продукты и Процессы. Соответственно, Продукты и Процессы могут быть объектами владения. Участники владеют Продуктами и Процессами. - -Владение строго иерархично [подробнее](/docs/seaf.ba.ownership) - -### Продукты - -Участники вступают в отношения обмена. Для того, чтобы обмен состоялся, необходим способ или механизм, с помощью которого два или более Участников могут произвести обмен. - -В общем случае, всегда есть Участник, который **предоставляет** Продукт -- это Владелец Продукта. Выставляя Продукт во внешнее окружение, Владелец предлагает другим Участникам **пользоваться** Продуктом. - -Как правило, Владелец также является и одним из Пользователей, ведь он создал и поддерживает Продукт, для получения дохода -- денег в обмен на Ресурс, например Пиццу. - -Т.о., Продукт может иметь два вида отношений с Участниками: -* быть предметом интереса со стороны одного или нескольких Участников, которые не владеют им, но могли бы его использовать -* быть во владении у одного Участника, что неявно подразумевает, в том числе, и использование Продукта. - -В реальной архитектуре моно-продукты встречаются редко, поэтому возникает необходимость описывать также использование каналов, составные, комплиментарные, внутренние и пр. Продукты [подробнее...](/docs/seaf.ba.products_usage) - -### Процессы - -Процессы отвечают на вопрос "какие действия и в каком порядке должны быть произведены, чтобы Ресурсы переходили от Участнгика к Участнику?". - -В зависимости от уровня детализации Процесс может рассматриваться как: -* цельное действие (транзакция) -* последовательность транзакций -* набор несвязанных транзакций или их последовательностей (сценариев) - -Процесс может быть отнесен к Продукту или нескольким для того, чтобы описать взаимодействие Пользователей при обмене Ресурсами [подробнее...](/docs/seaf.ba.processes_rels) - -#### Отношения с другими слоями корпоративной архитектуры - -Связь БА с прикладным слоем архитектуры, а также вертикалями информационной архитектуры и архитектуры изменений осуществляется через Процессы: - -* Процесс предъявляет требования -* В Процессе используются бизнес-объекты (данных) -* Прикладной сервис поддерживает Процессы - -[Подробнее](/docs/seaf.ba.biz_ea) diff --git a/docs/ba/biz_ea.md b/docs/ba/biz_ea.md index 1d797dc..48a1374 100644 --- a/docs/ba/biz_ea.md +++ b/docs/ba/biz_ea.md @@ -2,7 +2,7 @@ --- -#Отношения с другими слоями корпоративной архитектуры (в объеме SEAF-CORE) +# Отношения с другими слоями корпоративной архитектуры (в объеме SEAF-CORE) ###### Процесс поддерживается прикладными сервисами (`components`) @@ -10,14 +10,14 @@ seaf.ba.processes: party_a.process_5_7_1: - title: Процесс 5.7.1 - -components: - party_a.some_it_component: - title: ИТ компонент - type: service - processes: - - party_a.process_5_7_1 + title: Процесс 5.7.1 + supported: + - party_a.some_it_component + + components: + party_a.some_it_component: + title: ИТ компонент + type: service ``` ###### Процесс использует бизнес-объекты (`seaf.ia.business_objects`) @@ -28,11 +28,11 @@ seaf.ba.processes: party_a.process_5_7_1: title: Процесс 5.7.1 -seaf.ba.business_objects: - party_a.some_biz_obj: - title: Бизнес-объект(данных) - processes: - - party_a.process_5_7_1 + seaf.ba.business_objects: + party_a.some_biz_obj: + title: Бизнес-объект(данных) + processes: + - party_a.process_5_7_1 ``` ###### Процесс предъявляет требования (`seaf.change.requirements`) @@ -45,7 +45,7 @@ seaf.ba.processes: requirements: - party_a.req_9_43 -seaf.change.requirements: - party_a.req_9_43: - title: Требование 9ю43 + seaf.change.requirements: + party_a.req_9_43: + title: Требование 9ю43 ``` diff --git a/docs/ba/docs.yaml b/docs/ba/docs.yaml new file mode 100644 index 0000000..ecd8391 --- /dev/null +++ b/docs/ba/docs.yaml @@ -0,0 +1,40 @@ +docs: + + seaf.ba.main: + location: SEAF/Архитектура Бизнеса/Intro + description: SEAF-CORE BA explained + type: markdown + source: intro/ba_main.md + order: 500 + + seaf.ba.products_usage: + location: SEAF/Архитектура Бизнеса/Продукты + description: > + how-to: Описание Продуктов и их использования + type: markdown + source: products_usage.md + order: 510 + + seaf.ba.processes_rels: + location: SEAF/Архитектура Бизнеса/Процессы + description: > + how-to: Мэппинги процессов + type: markdown + source: processes_rels.md + order: 520 + + seaf.ba.biz_ea: + location: SEAF/Архитектура Бизнеса/Связи с объектами EA + description: > + how-to: + type: markdown + source: biz_ea.md + + + + seaf.ba.tutorial: + location: SEAF/Архитектура Бизнеса/Руководство "Минимальная БА" + description: BA minimal tutorial + type: markdown + source: tutorial/ba_tutorial.md + order: 700 diff --git a/docs/ba/intro/ba_archs_eco.svg b/docs/ba/intro/ba_archs_eco.svg new file mode 100644 index 0000000..e7adedb --- /dev/null +++ b/docs/ba/intro/ba_archs_eco.svg @@ -0,0 +1,21 @@ + + + + + + + + Участник АУчастник БотношениеобменаУчастник ВУчастник ГотношениеобменаотношениеобменаУчастник АУчастник БотношениеобменаУчастник ВУчастник ГотношениеобменаотношениеобменаУчастник АУчастник БотношениеобменаУчастник ВУчастник ГотношениеобменаотношениеобменаУчастник АУчастник БотношениеобменаУчастник ВУчастник ГотношениеобменаотношениеобменаБА Участника АБА Участника ББА Участника ВУчастник АУчастник БотношениеобменаУчастник ВУчастник ГотношениеобменаотношениеобменаБА Участника ГБА Экосистемы Участников А, Б, В, Г ??? \ No newline at end of file diff --git a/docs/ba/intro/ba_main.md b/docs/ba/intro/ba_main.md new file mode 100644 index 0000000..41e86ed --- /dev/null +++ b/docs/ba/intro/ba_main.md @@ -0,0 +1,65 @@ +###### :orange_book: ba_main.md + +--- +# Архитектура Бизнеса (БА) + +### Участники и Продукты + +Человек, в отличие от любых других элементов природной экосистемы, обладает амбициями -- стремлением к лучшему и большему. + +Для удовлетворения своих амбиций Человек использует креативные способности при: +* трансформации ресурсов (создании искусственного) +* обмене ресурсами (с намерением получить выгоду) + +Физические, юридические, государственные, неформальные объединения и аналитические группы лиц, участвующие в обмене ресурсами (товарами, услугами, деньгами, информацией, вниманием, возможностями и пр.) с намерением преуспеть в удовлетворении своих амбиций -- **Участники** обмена. + +Обмен ресурсами сопряжен с установлением отношений с другими Участниками. Каждый Участник находится в центре системы, образованной его социально-экономическими отношениями. Такую систему будем называть **БА** Участника. + +![](ba_archs_eco.svg) + +Обмен между Участниками происходит, если разница в ценности между ресурсами отдаваемыми и ресурсами получаемыми -- **субъективно** положительна с точки зрения каждого из Участников обмена. Иными словами, каждый Участник управляет своей БА (устанавливает, поддерживает, прекращает отношения) исходя из собствееной мотивации. Мотивация -- это комплекс факторов, воздействующих на Участника, и воспринимаемых им через свою "систему ценностей". Мотивация применительно к организациям имеет форму Стратегии и Трансформации [TBD](https://github.com/altershaman/StrategyTransformation.git) + +![](value_diff.svg) + +Трансформация ресурсов сопряжена с необходимостью наличия у Участников производственных возможностей (способностей), которые, в свою очередь, также были получены в результате обмена. + +Весь спектр трансформаций-обменов от изъятия природных ресурсов до конечного потребления товаров и услуг образует глобальную социально-экономическую систему. Область этой системы, на которую оказывает влияние Участник, и, которая оказывает влияние на Участника, есть "зона интереса" Участника. Участник управляет своей зоной интереса путем планирования, реализации, поддержания и прекращения отношений обмена с другими Участниками. Т.о., управление БА в общем случае -- это: + +* установление, поддержание и прекращение отношений с другими Участниками -- своим внешним окружением, контрагентами + +* организация собственных ресурсов и способностей -- внутреннего устройства для реализации отношений во внешнем окружении. + +Т.о. каждый Участник имеет **свою** точку зрения на БА, и поэтому, описание БА начинается с определения Участников [(см. "Минимальная БА", раздел "Окружение компании)](/docs/seaf.ba.tutorial). + +Для того, чтобы обмен состоялся, необходим способ или механизм, с помощью которого два или более Участников могут произвести обмен. + +В общем случае, всегда есть Участник, который **предоставляет** Продукт -- это Владелец Продукта. Выставляя Продукт во внешнее окружение, Владелец предлагает другим Участникам **пользоваться** Продуктом. + +Т.о., Продукт может иметь два вида отношений с Участниками: +* быть предметом интереса со стороны одного или нескольких Участников, которые не владеют им, но могли бы его использовать +* быть во владении у одного Участника, что неявно подразумевает, в том числе, и использование Продукта. + +![](product_relations.jpg) + +В реальной архитектуре моно-продукты встречаются редко, поэтому возникает необходимость описывать также использование каналов, составные, комплиментарные, внутренние Продукты (см. ["Минимальная БА", разделы 4-6](/docs/seaf.ba.tutorial), и [пример в коде](/docs/seaf.ba.products_usage)) + +### Процессы + +Процессы отвечают на вопрос "какие действия и в каком порядке должны быть произведены, чтобы Ресурсы переходили от Участнгика к Участнику?". + +В зависимости от уровня детализации Процесс может рассматриваться как: +* цельное действие (транзакция) +* последовательность транзакций +* набор несвязанных транзакций или их последовательностей (сценариев) + +Процесс может быть отнесен к Продукту или нескольким для того, чтобы описать взаимодействие Пользователей при обмене Ресурсами [подробнее...](/docs/seaf.ba.processes_rels) + +#### Отношения с другими слоями корпоративной архитектуры + +Связь БА с прикладным слоем архитектуры, а также вертикалями информационной архитектуры и архитектуры изменений осуществляется через Процессы: + +* Процесс предъявляет требования +* В Процессе используются бизнес-объекты (данных) +* Прикладной сервис поддерживает Процессы + +[Подробнее](/docs/seaf.ba.biz_ea) diff --git a/docs/ba/intro/product_relations.jpg b/docs/ba/intro/product_relations.jpg new file mode 100644 index 0000000..50c7493 Binary files /dev/null and b/docs/ba/intro/product_relations.jpg differ diff --git a/docs/ba/intro/value_diff.svg b/docs/ba/intro/value_diff.svg new file mode 100644 index 0000000..2a93747 --- /dev/null +++ b/docs/ba/intro/value_diff.svg @@ -0,0 +1,21 @@ + + + + + + + + УчастникУчастникРесурсАРесурсBЦенность ресурса АЦенность ресурса АЦенность ресурса BЦенность ресурса Bбольше чембольше чемМотивацияМотивация \ No newline at end of file diff --git a/docs/ba/notes.md b/docs/ba/notes.md deleted file mode 100644 index 0d74d9b..0000000 --- a/docs/ba/notes.md +++ /dev/null @@ -1,140 +0,0 @@ - - -В рамках использования продукта, Участники должны произвести ряд действий в определенном порядке (последовательности). Последовательность действий -- это Процесс. - -В идеальном описании БА любые внутренние и внешние взаимодействия должны быть рассмотрены как Продукты, однако - - -Субъекты, достигающие определенного уровня развития своей БА, неизбежно начинают явно или неявно осуществлять архитектурную функцию как часть управленческих процессов. В общем случае, БА-функция решает следующие задачи: - -* Определение существующих и потенциальных социально-экономических отношений для лучшего достижения целей Субъекта с учетом уровня развития Субъекта (жизненного цикла). -* Определение взаимного влияния отношений Субъекта, зависимостей отношений от различных элементов общей корпоративной архитектуры и приоритезация изменений. - -В зависимости от интегрированности БА-функции в процессы управления (уровня зрелости), под "определением" отношений и зависимостей может подразумеваться как простая фиксация реестровой информации, так и выработка детальных качественных/количественных требований к элементам общей корпоративной архитектуры. Ниже приведены примеры управленческих процессов с разбивкой по условным уровням управления, которые в той или иной степени используют БА-функцию: -* Стратегический менеджмент: - * каскадирование стратегии (цели, изменения) на элементы КА - * "trace back" реализации стратегии c операционного уровня -* Операционный менеджмент: - * распределение зон ответственности - * "привязка" к стратегии - * горизонтальная интеграция -* Мидл-менеджмент: - * изменения "снизу вверх" - * управление ресурсами -* ИТ-менеджмент: - * "привязка" к "бизнесу" - * управление требованиями к ИТ - -## Описание БА - -Описание БА является неотъемлемым видом деятельности в рамках БА-функции. Качество процесса и результата описания БА напрямую влияют на возможности анализа отношений между элементами и, как следствие, на согласование и принятие управленческих бизнес-решений. Для обеспечения требуемого уровня качества выделяются два аспекта: -* методология описания -* инструментарий для описания - -![](@document/seaf.ba.method) -![](@document/seaf.ba.realization) - - -Осознание Участником себя частью Экосистемы, стремление к расширению знания об Экосистеме и использование такого знания при разработке и реализации стратегии будем называть **экосистемным подходом**. - -Принятие экосистемного подхода означает, что Участник: -* рассматривает себя в контексте не только прямых отношений со своими контрагентами, но и отношений контрагент-контрагент -* влияет на отношения между контрагентами, создает контрагентов при необходимости -* культивирует экосистемный подход к развитию бизнеса среди контрагентов - -TBD: иллюстрации и примеры к каждому пункту - -Принятие экосистемного подхода влечет за собой необходимость усиления (выделения) архитектурной функции, в том числе в части БА, вследствие: -* возрастающей сложности "картины мира" и вариативности стратегии развития -* необходимостью вовлекать в архитектурную функцию контрагентов, т.е. Участников и обеспечивать федеративное управление экосистемной архитектурой. - -Как упоминалось в [статье "Бизнес-архитектура"](/docs/seaf.ba.entry), Участники управляют своими социально-экономическими отношениями. Изменение таких отношений неизбежно меняет Экосистему. Масштаб может быть микроскопическим или более заметным в рамках Экосистемы в зависимости от силы произведенного Участником действия и текущего состояния Экосистемы. Но важнее то, что Участник при планировании своих действий может учитывать сравнительно бОльшую часть Экосистемы вокруг себя (то есть не только свои прямые связи, но отношения между другими Участниками). Исходя из этого, сформулируем несколько утверждений-гипотез: - -* любой Участник (даже индивидуум) имеет влияние на Экосистему -* каждый Участник является "Центром своей **э**косистемы" -- имеет точку зрения на **Э**косистему -* некоторые Участники в своих действиях учитывают бОльший радиус отношений в Экосистеме, чем другие -* бОльший радиус внимания -- больше возможностей для полезного распространения своего влияния -* действие в бОльшем радиусе увеличивает влияние на Экосистему -* большее влияние Участника сильнее меняет Экосистему в пользу Участника - -Таким образом, "**э**косистема Участника" -- есть часть **Э**косистемы в которой он приобрел заметное влияние. "Построение **э**косистемы" -- есть расширение своего влияния на Экосистему. Противоречие разрешено. - - -# Федеративное управление архитектурой - -# Федеративные домены - -Для того, чтобы преуспевать в экосистеме, Участники вступают в отношения, подразумевающие обмен Ресурсами (товарами, услугами, деньгами, вниманием, возможностями и пр.). Поскольку Ресурсы (как отдаваемые, так и получаемые) обладают некоторой субъективной ценностью с точки зрения каждого Участника, то и возможности обмена ценностью становятся тем обширнее, чем больше Участников образуют экосистему. - -Когда вы (управляете какой-либо Системой) приступаете к описанию архитектуры какой-либо Системы (компании, группы компаний, департамента, предметной области, автоматизированной системы и пр.) вы занимаете конкретную точку зрения, а именно точку зрения данной Системы. Относительно **вашей** точки зрения вы проводите границу между внутренним содержанием и внешним окружением Системы. - -Если "ваша" Система достаточно сложна, велика и еще и развивается в нескольких направлениях, то вы сталкиваетесь с неоднородностью: -* подходов к управлению -* понятийного аппарата -* темпов изменений -* мотивации заинтересованных сторон - -**Причем здесь архитектура?** - -Ссылки на статьи - - -"Федерация" - - -Но в "федерации" много заинтересованных сторон, в том числе архитекторов, каждый из которых описывает и смотрит на "федерацию" со своих точек зрения. Это __приводит__ к тому, что один и тот же объект реального мира может иметь разные описания, разное значение для различных стейкхолдеров. Также это означает, что вы должны позаботиться о том ЧТО из вашей архитектуры видно с других точек зрения и изолировать свое представление. - -Также всегда есть потребность взглянуть на федерацию в целом с высоты птичьего полета, не занимая какую-то частную точку зрения "что есть данная федерация". - -Для обеспечения непротиворечивости различных точек зрения каждый, кто приступает к описанию должен определить идентификатор своего домена и описывать архитектуру в его рамках. - -Идентификатор домена означает: -* точку зрения -* изолирует часть федерации от остальной федерации -* является доменом верхнего уроня, видимым "сверху" -* позволяет другим членам федерации посмотреть с вашей точки зрения - -Идентификатор это согласие с остальными членами Федерации и декларация отдельного члена федерации. - - - -Предмет договоренности в рамках федеративного управления архитектурой - - -Федеративное управление архитектурой - -Федерация это совокупность доменов с автономным управлением, связанная в систему контрактами. - -Для разделения на домены управления требуется определить критерии. Для каждого случая они могут быть уникальными. Например: - -Организационная единица (департамент, управление, команда и т.д); - -Продуктовая единица (цифровой продукт, вертикаль и т.д.); - -Сервисная единица (сервис авторизации, сервис оплаты и т.д.). - -При выделении домена необходимо стремиться к однородности процесса управления архитектурой в нем. Признаками однородности могут стать единые стандарты для домена, технологический стек, единый релизный цикл и т.д. - -Взаимодействие доменов в федерации осуществляется через контракты. Контракт подразумевает доступ домена к информации об архитектуре федерации в обмен на обязательства предоставлять информацию о себе. - -Структура и состав информации поступающей из федерации и из домена декларируется специальный метамоделью. Таким образом поддерживается необходимое качество и актуальность информации на уровне федерации. - -После определения рамок домена управления и контрактов с ним, управление архитектурой передается в домен. Контролируется функционирование домена исключительно по выполнению контракта. - -Внутри себя домен волен создавать собственную федерацию на иных принципах деления на домены, с локальными контрактами. - - - - -# Архив - -## Check Hexagon -[](/entities/seaf.self/is_hexed) - -## Сложность управления - - -Управление БА подразумевает в общем случае планирование отношений, их установление, эксплуатацию, продление, изменение, прекращение и т.д. Может сложиться ложное ощущение, что это очень простая концепция и для управления БА не требуется "архитектурная функция". В некоторых случаях это действительно может быть так, но если принять во внимание следующие возможные аспекты отношений, то БА представляется уже не столь простой системой: -* Отношение подразумевают обязательство совершить определенные действия, хотябы с одной стороны, а значит данная сторона должна иметь средства и возможность их совершить. Это в свою очередь порождает потребность в установлении других отношений с другими Субъектами -- иными словами необходимость встраивания себя в цепочки ценности. -* Отношение подразумевает, как минимум, одну вторую сторону, которая имеет свои намерения и может не установить, прекратить или изменить отношение. БА -- это крайне изменчивая система. -* Осознанное построение БА подразумевает наличие цели, которая достигается с помощью БА в той или иной степени, а значит БА должна оцениваться и совершенствоваться исходя из целей и текущего контекста. -* Субъект может представлять из себя сложную организацию многих Субъектов, а значит сталкиваться с необходимостью обеспечения коммуникации и синхронизации "внутренних" Субъектов, для каждого из которых настоящие положения в свою очередь также могут быть релевантны. diff --git a/docs/ba/ownership.md b/docs/ba/ownership.md deleted file mode 100644 index 53ab76d..0000000 --- a/docs/ba/ownership.md +++ /dev/null @@ -1,56 +0,0 @@ -###### :green_book: ownership.md - ---- - -# Владение - -Владелец указывается в атрибуте `owner` соответствующего объекта владения: - -```yaml -seaf.ba.parties: # Участники - - party_a: - title: Участник А - - party_a.deps.sales: - title: Департамент продаж - - party_b: - title: Участник В - -seaf.ba.products: # Продукты - - party_a.head_product: - title: Флагманский продукт - owner: party_a # Владелец Флагманского продукта - Участник А - - party_b.vip_service: - title: VIP услуга - owner: party_b # Владелец VIP услуги -- Участник В - -seaf.ba.processes: # Процессы - - party_a.l2c: - title: Leads to clients - owner: party_a.deps.sales # Владелец процесса L2C -- Департамент продаж -``` -Владельцем может быть только Участник. - -Владелец может быть указан только один. Но при этом сам по себе институт владения представляет из себя строгую иерархическую структуру. - -Если бы могли сказать, что "Депратамент продаж является частью Участника А", то из владения Департамента продаж Флагманским продуктом следовало бы, что и "Участник А владеет Флагманским продуктом, но внутри себя делегировал владение Департаменту Продаж". - -Как сказано в [статье о корневых доменах](/docs/seaf.ba.root_domain) `party_a` в идентификаторе `party_a.deps.sales`означает, что некий Департамент продаж находится в зоне внимания Участника А. Но мы не знаем является ли этот департамент частью внутреннего устройства или внешнего окружения. Для явного отнесения Участника ко внутреннему устройству другого Участника добавим отношение "является частью" в декларацию Департамента продаж: -```yaml -seaf.ba.parties: - - party_a.deps.sales: # Департамент продаж - is_part_of: party_a # является частью Участника А (и только Участника А) - # отношение n:1 -- нельзя быть частью нескольких участников -``` - - Получить перечень Участников, частью которых является заданный Участник: - `$seaf_is_part($party_id, $$)` - - Получить перечень Участников, которые являются частью заданного Участника: - `$seaf_has_parts($party_id, $$)` \ No newline at end of file diff --git a/docs/ba/root.yaml b/docs/ba/root.yaml index 3459b35..b544d46 100644 --- a/docs/ba/root.yaml +++ b/docs/ba/root.yaml @@ -1,50 +1,3 @@ -docs: +imports: - seaf.ba.main: - location: SEAF/Бизнес-архитектура/Intro - description: SEAF-CORE BA explained - type: markdown - source: ba_main.md - - seaf.ba.root_domain: - location: SEAF/Бизнес-архитектура/Декларация корневого домена - description: > - how-to: Первичная декларация корневого домена - type: markdown - source: root_domain.md - - seaf.ba.ownership: - location: SEAF/Бизнес-архитектура/Владение - description: > - how-to: Описание владения Продуктами и Процессами - type: markdown - source: ownership.md - - seaf.ba.products_usage: - location: SEAF/Бизнес-архитектура/Продукты - description: > - how-to: Описание Продуктов и их использования - type: markdown - source: products_usage.md - - seaf.ba.processes_rels: - location: SEAF/Бизнес-архитектура/Процессы - description: > - how-to: Мэппинги процессов - type: markdown - source: processes_rels.md - - seaf.ba.biz_ea: - location: SEAF/Бизнес-архитектура/Связи с объектами EA - description: > - how-to: - type: markdown - source: biz_ea.md - - - - seaf.ba.tutorial: - #location: /Архитектура/Бизнес-архитектура/Руководство "Минимальная БА" - description: BA minimal tutorial - type: markdown - source: ba_tutorial.md + - docs.yaml \ No newline at end of file diff --git a/docs/ba/root_domain.md b/docs/ba/root_domain.md deleted file mode 100644 index 647bb61..0000000 --- a/docs/ba/root_domain.md +++ /dev/null @@ -1,74 +0,0 @@ -###### :green_book: root_domain.md - ---- -# Как начать описание БА в SEAF - -Бизнес-архитектура (БА) -- это система социально-экономических отношений между Участниками, осуществляющими обмен Ресурсами для достижения своих Целей с помощью создания и использования Продуктов. [Подробнее во вводной статье](/docs/seaf.ba.main) - -БА с точки зрения каждого Учстника делится на две большие части: -* внешнее окружение -* внутреннее устройство - -Поэтому описание БА следует начинать с декларации "себя" и "своей" точки зрения. - -```yaml -seaf.ba.parties: # Раздел манифеста с декларациями объектов-Участников - - party_id: # Идентификатор Участника - title: Наименование Участника # Обязательный атрибут объекта-Участника -``` -`party_id` представляет из себя: -* идентификатор архитектурного объекта, соответствующего Участнику -* "точку зрения", отделяющую внутреннее и внешнее -* домен -- область интереса (влияния) Участника на социально-экономическую систему, то есть "его БА" - -**ВСЕ** объекты архитектуры Участника с **ЕГО** точки зрения объявляются внутри этого домена. Примеры: -* `party_id.sales` -- департамент продаж Участника -* `party_id.sales.retail` -- отдел розницы в департаменте продаж Участника -* `party_id.project_team` -- команда проекта Участника -* `party_id.head_product` -- основной продукт Участника -* `party_id.production` -- производственный процесс Участника -* `party_id.clients` -- клиенты Участника -* `party_id.clients.segment` -- клиентский сегмент Участника -* `party_id.partners` -- партнеры Участника -* `party_id.partners.partner_id` -- конкретный партнер Участника - -SEAF-CORE автоматически анализирует доменные идентификаторы объектов сущности `seaf.ba.parties` из всех подключенных манифестов и определяет корневые домены. В нашем примере -- это будет `party_id`, поскольку нет других идентификаторов, которые бы стояли перед `party_id` и `party_id` является идентификатором объекта-Участника. - -Корневой домен не обязательно должен представлять из себя идентификатор первого уровня. - -Корневой домен автоматически выводится в меню Архитектура/Бизнес-архитектура/<Наименование Участника> - -### Несколько корневых доменов - -Если в манифестах найдется более одного корневого домена, то они все будут выведены в меню. Это будет означать, что вы можете рассмотреть БА с нескольких **разных** точек зрения. - -Когда вы работаете с более чем одной точкой зрения, вам придется иметь дело с описанием таких реальных объектов, которые находятся в поле зрения нескольких Участников. Предположим, что у нас имеются две архитектуры -- Участника `party_a` и Участника `party_b`. Тогда: -* `party_a.clients.corp.vostok` -- Корпорация "Восток" с т.з. Участника А -* `party_b.pao_vostok` -- Корпорация "Восток" с т.з. Участника А -* `party_a.partners.party_b` -- Участник В с т.з. Участника А -* `party_b.party_a` -- Учаятник А с т.з. Участника В - -То есть правильным подходом к описанию является постоянное нахождение в определенной точке зрения. Один и тот же реальный объект **должен** иметь различные описания с различных точек зрения. - -Это позволяет сохранить целостность описания в пределах одной точки зрения, а значит свободно работать с несколькими точками зрения. Также следует понимать, что Корпорация "Восток" может играть разные роли в архитектурах Участников А и В. - -:warning: Связь между объектами различных корневых доменов в случае необходимости, например при разработке интеграционного проекта Участникоа А и В, должна осуществляться через механизм "синонимов" (aliases) и "фасадов" (facades) -- TBD - -### Субдомены как точка зрения - -Если ваша архитектура обширна, то в управлении ею, скорее всего, существует более чем одна заинтересованная сторона. То есть при описании внутренней архитектуры Участника А может возникнуть потребность в определении дополнительных субдоменов и точек зрения, например, Департамента рисков. Поскольку Департамент рисков не является корневым доменом, то **его** точку зрения необходимо объявить вручную: -```yaml -seaf.ba.parties: # Департамент рисков -- тоже - party_a.deps.risk_mng: - title: Департамент рисков - - -seaf.self: # Раздел манифеста для декларации self-контекста - - party_a.deps.risk_mng # Идентификатор Участника со "своей" точкой зрения -``` -После объявления дополнительной точки зрения, она появится в меню. - -### Внутреннее и внешнее - -Для отделения того, что Участник относит ко внешнему окружению, а что ко внутреннуму устройству используется атрибут `is_part_of` [подробнее...](/docs/seaf.ba.ownership) diff --git a/docs/ba/seaf_ba_core.excalidraw b/docs/ba/seaf_ba_core.excalidraw index 2fd9a62..440a290 100644 --- a/docs/ba/seaf_ba_core.excalidraw +++ b/docs/ba/seaf_ba_core.excalidraw @@ -5,8 +5,86 @@ "elements": [ { "type": "rectangle", - "version": 910, - "versionNonce": 810774164, + "version": 547, + "versionNonce": 1170002399, + "isDeleted": false, + "id": "FTrXhk-JXRPhfCLXr-BBC", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 135.37318489061101, + "y": -400.3455508535001, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 265.31734212239576, + "height": 264.8001022338867, + "seed": 26588935, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "pAFmSjz6sVOZBOw5ysIG7" + }, + { + "id": "qtEoRf2ynfY3vStY1fUun", + "type": "arrow" + }, + { + "id": "HznRj8yWEZ2ln8yCXoou7", + "type": "arrow" + } + ], + "updated": 1716911537215, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 569, + "versionNonce": 513343377, + "isDeleted": false, + "id": "pAFmSjz6sVOZBOw5ysIG7", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 226.06190050747296, + "y": -395.3455508535001, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 83.93991088867188, + "height": 25, + "seed": 536296999, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537215, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Участник", + "textAlign": "center", + "verticalAlign": "top", + "containerId": "FTrXhk-JXRPhfCLXr-BBC", + "originalText": "Участник", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "rectangle", + "version": 918, + "versionNonce": 1931820543, "isDeleted": false, "id": "3u0EkdI9Zkfyl90CgVeq3", "fillStyle": "solid", @@ -33,14 +111,14 @@ "id": "FOmNeRofSo_F8xSQJsUE4" } ], - "updated": 1709161259545, + "updated": 1716911537215, "link": null, "locked": false }, { "type": "text", - "version": 1102, - "versionNonce": 1137669292, + "version": 1108, + "versionNonce": 726984049, "isDeleted": false, "id": "FOmNeRofSo_F8xSQJsUE4", "fillStyle": "solid", @@ -60,7 +138,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1709161259545, + "updated": 1716911537215, "link": null, "locked": false, "fontSize": 20, @@ -75,8 +153,8 @@ }, { "type": "rectangle", - "version": 580, - "versionNonce": 982547476, + "version": 592, + "versionNonce": 216737311, "isDeleted": false, "id": "_vcxi3vYplZXZVtRvuTFu", "fillStyle": "solid", @@ -115,11 +193,19 @@ "type": "arrow" }, { - "id": "_2ihLbbBs9mG0VwXANkMT", + "id": "xZYxAwmIab4C8nEuKF1kr", "type": "arrow" }, { - "id": "xZYxAwmIab4C8nEuKF1kr", + "id": "-RplXGYKOIukT0NRNN73m", + "type": "arrow" + }, + { + "id": "gA9xVxK-Cj1N0Y3h8k81r", + "type": "arrow" + }, + { + "id": "_2ihLbbBs9mG0VwXANkMT", "type": "arrow" }, { @@ -127,22 +213,22 @@ "type": "arrow" }, { - "id": "-RplXGYKOIukT0NRNN73m", + "id": "jYX0oCUIG_l0M6whfCx_O", "type": "arrow" }, { - "id": "gA9xVxK-Cj1N0Y3h8k81r", + "id": "UOmakKLK2vvFCeR_DXTnf", "type": "arrow" } ], - "updated": 1709161259545, + "updated": 1716911537215, "link": null, "locked": false }, { "type": "text", - "version": 603, - "versionNonce": 1372847916, + "version": 609, + "versionNonce": 1733889873, "isDeleted": false, "id": "I-u3j3c0MEI_2C0VGwEPk", "fillStyle": "solid", @@ -162,7 +248,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1709161259545, + "updated": 1716911537215, "link": null, "locked": false, "fontSize": 20, @@ -177,8 +263,8 @@ }, { "type": "rectangle", - "version": 680, - "versionNonce": 1691343252, + "version": 722, + "versionNonce": 1556323743, "isDeleted": false, "id": "SbIDKRvJX6lsbyww-W-Ns", "fillStyle": "solid", @@ -187,7 +273,7 @@ "roughness": 0, "opacity": 100, "angle": 0, - "x": 142.66593279157365, + "x": 178.66593279157365, "y": 582.1159057617188, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", @@ -209,14 +295,14 @@ "type": "arrow" } ], - "updated": 1709161259545, + "updated": 1716911601363, "link": null, "locked": false }, { "type": "text", - "version": 874, - "versionNonce": 1944271276, + "version": 916, + "versionNonce": 1128558079, "isDeleted": false, "id": "agUHOHIyZNOvl8nvY_GYk", "fillStyle": "solid", @@ -225,7 +311,7 @@ "roughness": 1, "opacity": 100, "angle": 0, - "x": 163.79341997419084, + "x": 199.79341997419084, "y": 598.6159057617188, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", @@ -236,7 +322,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1709161259545, + "updated": 1716911601364, "link": null, "locked": false, "fontSize": 20, @@ -251,8 +337,8 @@ }, { "type": "arrow", - "version": 820, - "versionNonce": 440895252, + "version": 965, + "versionNonce": 2030720671, "isDeleted": false, "id": "1m7n0urUcqxBpkqMnEwgR", "fillStyle": "solid", @@ -261,12 +347,12 @@ "roughness": 0, "opacity": 100, "angle": 0, - "x": 260.7855077492977, - "y": 368.64780752999445, + "x": 275.2341368863055, + "y": 368.3430589948382, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", - "width": 2.845311296897819, - "height": 210.9633374895368, + "width": 6.26028035195435, + "height": 208.83006722586492, "seed": 1109540142, "groupIds": [], "frameId": null, @@ -274,18 +360,18 @@ "type": 2 }, "boundElements": [], - "updated": 1709161259545, + "updated": 1716911615582, "link": null, "locked": false, "startBinding": { "elementId": "_vcxi3vYplZXZVtRvuTFu", - "focus": 0.6319293605791507, - "gap": 4.04757254464289 + "focus": 0.4782395429200449, + "gap": 3.7428240094866396 }, "endBinding": { "elementId": "SbIDKRvJX6lsbyww-W-Ns", - "focus": -0.11087188839307378, - "gap": 2.5047607421875 + "focus": -0.2362802900121779, + "gap": 4.942779541015625 }, "lastCommittedPoint": null, "startArrowhead": null, @@ -296,15 +382,15 @@ 0 ], [ - 2.845311296897819, - 210.9633374895368 + 6.26028035195435, + 208.83006722586492 ] ] }, { "type": "rectangle", - "version": 686, - "versionNonce": 891757612, + "version": 692, + "versionNonce": 262680337, "isDeleted": false, "id": "HPcF9mEixONH6TF0vPgsD", "fillStyle": "solid", @@ -335,14 +421,14 @@ "type": "arrow" } ], - "updated": 1709161259545, + "updated": 1716911537215, "link": null, "locked": false }, { "type": "text", - "version": 958, - "versionNonce": 1869448340, + "version": 964, + "versionNonce": 1099089535, "isDeleted": false, "id": "kkvaVu49_-G3K3BYip9DS", "fillStyle": "solid", @@ -362,7 +448,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1709161259545, + "updated": 1716911537215, "link": null, "locked": false, "fontSize": 20, @@ -377,8 +463,8 @@ }, { "type": "rectangle", - "version": 732, - "versionNonce": 730447532, + "version": 808, + "versionNonce": 567420145, "isDeleted": false, "id": "SdomzG4lO16KJ8qkbdzno", "fillStyle": "solid", @@ -387,8 +473,8 @@ "roughness": 0, "opacity": 100, "angle": 0, - "x": 665.2239074707031, - "y": 513.7049255371094, + "x": -29.0238037109375, + "y": 487.4953918457031, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", "width": 238.43798828125006, @@ -405,18 +491,22 @@ "id": "ySd4sh7aRlgw2uFcSpWWQ" }, { - "id": "3WvlTibAbMJesriN35UHj", + "id": "jYX0oCUIG_l0M6whfCx_O", + "type": "arrow" + }, + { + "id": "UOmakKLK2vvFCeR_DXTnf", "type": "arrow" } ], - "updated": 1709161259545, + "updated": 1716911537215, "link": null, "locked": false }, { "type": "text", - "version": 898, - "versionNonce": 2046284308, + "version": 999, + "versionNonce": 859463615, "isDeleted": false, "id": "ySd4sh7aRlgw2uFcSpWWQ", "fillStyle": "solid", @@ -425,39 +515,39 @@ "roughness": 1, "opacity": 100, "angle": 0, - "x": 672.7095031738281, - "y": 530.2049255371094, + "x": 10.707885742187528, + "y": 503.9953918457031, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", - "width": 223.466796875, + "width": 158.974609375, "height": 46, "seed": 304804978, "groupIds": [], "frameId": null, "roundness": null, "boundElements": [], - "updated": 1709161259545, + "updated": 1716911574667, "link": null, "locked": false, "fontSize": 20, "fontFamily": 2, - "text": "Бизнес-объекты\n seaf.ia.business_objects", + "text": "Ресурсы\nseaf.ba.resources", "textAlign": "center", "verticalAlign": "middle", "containerId": "SdomzG4lO16KJ8qkbdzno", - "originalText": "Бизнес-объекты\n seaf.ia.business_objects", + "originalText": "Ресурсы\nseaf.ba.resources", "lineHeight": 1.15, "baseline": 41 }, { "type": "arrow", - "version": 1230, - "versionNonce": 1943578905, + "version": 1359, + "versionNonce": 721575633, "isDeleted": false, "id": "gA9xVxK-Cj1N0Y3h8k81r", "fillStyle": "solid", "strokeWidth": 2, - "strokeStyle": "dotted", + "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0, @@ -465,25 +555,25 @@ "y": 450.12779177592444, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", - "width": 303.6573089780911, - "height": 81.82402708352771, + "width": 275.2096161069974, + "height": 85.17638304055896, "seed": 1256495342, "groupIds": [], "frameId": null, "roundness": null, "boundElements": [], - "updated": 1709541286182, + "updated": 1716911537215, "link": null, "locked": false, "startBinding": { "elementId": "HPcF9mEixONH6TF0vPgsD", - "focus": -0.046661787304073825, + "focus": -0.05028372811390693, "gap": 1.89483642578125 }, "endBinding": { "elementId": "_vcxi3vYplZXZVtRvuTFu", - "focus": -0.4228250604296693, - "gap": 3.7035297070451634 + "focus": -0.736221664908743, + "gap": 1 }, "lastCommittedPoint": null, "startArrowhead": null, @@ -494,19 +584,19 @@ 0 ], [ - -302.1940362112862, - -0.4571220022771172 + -274.3558404105049, + -0.7618705374333672 ], [ - -303.6573089780911, - -81.82402708352771 + -275.2096161069974, + -85.17638304055896 ] ] }, { "type": "arrow", - "version": 1483, - "versionNonce": 685535124, + "version": 1799, + "versionNonce": 1140093631, "isDeleted": false, "id": "3WvlTibAbMJesriN35UHj", "fillStyle": "solid", @@ -515,29 +605,25 @@ "roughness": 0, "opacity": 100, "angle": 0, - "x": 662.8427747720523, - "y": 549.1492958342558, + "x": 208.95733509122906, + "y": 529.181107458036, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", - "width": 345.90236285037565, - "height": 180.17452055385047, + "width": 30.287377738360902, + "height": 162.94909951161503, "seed": 1621478450, "groupIds": [], "frameId": null, "roundness": null, "boundElements": [], - "updated": 1709161259545, + "updated": 1716911537216, "link": null, "locked": false, - "startBinding": { - "elementId": "SdomzG4lO16KJ8qkbdzno", - "focus": 0.09081505046677288, - "gap": 2.3811326986508448 - }, + "startBinding": null, "endBinding": { "elementId": "_vcxi3vYplZXZVtRvuTFu", - "focus": 0.022299552618489597, - "gap": 4.374540295053748 + "focus": 0.8751360488140011, + "gap": 1.6317729610693732 }, "lastCommittedPoint": null, "startArrowhead": null, @@ -548,19 +634,19 @@ 0 ], [ - -343.36005535066545, - -1.214570536055021 + 30.287377738360902, + -0.44627229655395695 ], [ - -345.90236285037565, - -180.17452055385047 + 29.364119310916323, + -162.94909951161503 ] ] }, { "type": "arrow", - "version": 1378, - "versionNonce": 890438572, + "version": 1384, + "versionNonce": 2043698353, "isDeleted": false, "id": "gjRU0aKvQtyoMVe9dianJ", "fillStyle": "solid", @@ -582,7 +668,7 @@ "type": 2 }, "boundElements": [], - "updated": 1709161259545, + "updated": 1716911537216, "link": null, "locked": false, "startBinding": { @@ -607,8 +693,8 @@ }, { "type": "arrow", - "version": 683, - "versionNonce": 475094292, + "version": 689, + "versionNonce": 259375839, "isDeleted": false, "id": "qTyoPVMwaQIg4VEPIJ1fM", "fillStyle": "solid", @@ -630,7 +716,7 @@ "type": 2 }, "boundElements": [], - "updated": 1709161259545, + "updated": 1716911537216, "link": null, "locked": false, "startBinding": { @@ -659,8 +745,8 @@ }, { "type": "arrow", - "version": 1325, - "versionNonce": 298692140, + "version": 1331, + "versionNonce": 501456529, "isDeleted": false, "id": "Sy_FisNS4-VQ-VEvQ5HMm", "fillStyle": "solid", @@ -680,7 +766,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1709161259545, + "updated": 1716911537216, "link": null, "locked": false, "startBinding": { @@ -713,8 +799,8 @@ }, { "type": "arrow", - "version": 1062, - "versionNonce": 2110560916, + "version": 1068, + "versionNonce": 1519914751, "isDeleted": false, "id": "W2yrJ-moLQ1UFtHs7Q9yY", "fillStyle": "solid", @@ -736,7 +822,7 @@ "type": 2 }, "boundElements": [], - "updated": 1709161259545, + "updated": 1716911537216, "link": null, "locked": false, "startBinding": { @@ -765,8 +851,8 @@ }, { "type": "rectangle", - "version": 132, - "versionNonce": 935400236, + "version": 147, + "versionNonce": 1173595249, "isDeleted": false, "id": "wUpqJTAeFnYjRt_2_x3dA", "fillStyle": "solid", @@ -777,7 +863,7 @@ "angle": 0, "x": 300.3309709821433, "y": 1136.6490467616486, - "strokeColor": "#e03131", + "strokeColor": "#2f9e44", "backgroundColor": "transparent", "width": 114.7811279296875, "height": 77.10482788085938, @@ -801,30 +887,34 @@ "type": "arrow" }, { - "id": "4yIdYVi3-5y1oqIuZDea1", + "id": "wJo6Mn69LRL_3cZC5sPpo", "type": "arrow" }, { - "id": "wJo6Mn69LRL_3cZC5sPpo", + "id": "WmyN1DPJQs1Z2CtceyQvT", "type": "arrow" }, { - "id": "zjiB3MPNyWbDEcFiYe_g8", + "id": "4yIdYVi3-5y1oqIuZDea1", "type": "arrow" }, { - "id": "WmyN1DPJQs1Z2CtceyQvT", + "id": "8REfjIE_R6Ub0KLh_jwWS", + "type": "arrow" + }, + { + "id": "W_LTJqWEYoOR-BBoNaij7", "type": "arrow" } ], - "updated": 1709161259545, + "updated": 1716911537216, "link": null, "locked": false }, { "type": "text", - "version": 122, - "versionNonce": 1861092756, + "version": 130, + "versionNonce": 2145113887, "isDeleted": false, "id": "UPeZcQ-L4ZLLpi7RgDvGj", "fillStyle": "solid", @@ -835,7 +925,7 @@ "angle": 0, "x": 322.9015733991355, "y": 1162.7014607020783, - "strokeColor": "#e03131", + "strokeColor": "#2f9e44", "backgroundColor": "transparent", "width": 69.63992309570312, "height": 25, @@ -844,7 +934,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1709161259545, + "updated": 1716911537216, "link": null, "locked": false, "fontSize": 20, @@ -859,8 +949,8 @@ }, { "type": "rectangle", - "version": 146, - "versionNonce": 1124978092, + "version": 260, + "versionNonce": 1573383761, "isDeleted": false, "id": "nixorYnEQmSGdMW8MLfsJ", "fillStyle": "solid", @@ -869,9 +959,9 @@ "roughness": 1, "opacity": 100, "angle": 0, - "x": 519.8738176618308, - "y": 1019.8490284511018, - "strokeColor": "#e03131", + "x": 601.950050571987, + "y": 971.3919056483675, + "strokeColor": "#868e96", "backgroundColor": "transparent", "width": 114.7811279296875, "height": 77.10482788085938, @@ -889,16 +979,32 @@ { "id": "yEd0-RRmSxbuIj5-v8PXq", "type": "arrow" + }, + { + "id": "MzxfLh_R1huaBjDnLpGdS", + "type": "arrow" + }, + { + "id": "3haXc3JkGBCGuzPhcl5SN", + "type": "arrow" + }, + { + "id": "Pt7D_kEwZgpQ1EG_g-kTy", + "type": "arrow" + }, + { + "id": "JIhodVaqR4q1US0sd_Myd", + "type": "arrow" } ], - "updated": 1709161259545, + "updated": 1716911537216, "link": null, "locked": false }, { "type": "text", - "version": 157, - "versionNonce": 398471956, + "version": 267, + "versionNonce": 900832063, "isDeleted": false, "id": "uR1eztgfNV4hqbKA9uEt_", "fillStyle": "solid", @@ -907,9 +1013,9 @@ "roughness": 1, "opacity": 100, "angle": 0, - "x": 527.3844377790183, - "y": 1033.4014423915314, - "strokeColor": "#e03131", + "x": 609.4606706891745, + "y": 984.944319588797, + "strokeColor": "#868e96", "backgroundColor": "transparent", "width": 99.7598876953125, "height": 50, @@ -918,7 +1024,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1709161259545, + "updated": 1716911537216, "link": null, "locked": false, "fontSize": 20, @@ -933,8 +1039,8 @@ }, { "type": "arrow", - "version": 231, - "versionNonce": 1776236588, + "version": 277, + "versionNonce": 1815608369, "isDeleted": false, "id": "3haXc3JkGBCGuzPhcl5SN", "fillStyle": "solid", @@ -945,10 +1051,10 @@ "angle": 0, "x": 417.3595354352683, "y": 1141.5252369471955, - "strokeColor": "#e03131", + "strokeColor": "#2f9e44", "backgroundColor": "transparent", - "width": 103.2001953125, - "height": 55.161865234375, + "width": 183.44793701171875, + "height": 95.08566284179688, "seed": 1853522908, "groupIds": [], "frameId": null, @@ -956,15 +1062,19 @@ "type": 2 }, "boundElements": [], - "updated": 1709161259546, + "updated": 1716911537216, "link": null, "locked": false, "startBinding": { "elementId": "wUpqJTAeFnYjRt_2_x3dA", - "focus": -0.0259853669488016, + "focus": -0.04047406512618253, "gap": 2.2474365234375 }, - "endBinding": null, + "endBinding": { + "elementId": "nixorYnEQmSGdMW8MLfsJ", + "focus": -0.09013346886363152, + "gap": 1.142578125 + }, "lastCommittedPoint": null, "startArrowhead": null, "endArrowhead": "arrow", @@ -974,15 +1084,15 @@ 0 ], [ - 103.2001953125, - -55.161865234375 + 183.44793701171875, + -95.08566284179688 ] ] }, { "type": "rectangle", - "version": 155, - "versionNonce": 284209300, + "version": 189, + "versionNonce": 276421471, "isDeleted": false, "id": "6UY32O5c-CLIRXuQQ-9B3", "fillStyle": "solid", @@ -991,9 +1101,9 @@ "roughness": 1, "opacity": 100, "angle": 0, - "x": 728.4165422712058, - "y": 970.4490040370393, - "strokeColor": "#e03131", + "x": 768.4358293805808, + "y": 941.4966419764925, + "strokeColor": "#ced4da", "backgroundColor": "transparent", "width": 114.7811279296875, "height": 77.10482788085938, @@ -1011,16 +1121,20 @@ { "id": "WmyN1DPJQs1Z2CtceyQvT", "type": "arrow" + }, + { + "id": "yEd0-RRmSxbuIj5-v8PXq", + "type": "arrow" } ], - "updated": 1709161259546, + "updated": 1716911537216, "link": null, "locked": false }, { "type": "text", - "version": 182, - "versionNonce": 941576876, + "version": 216, + "versionNonce": 824921617, "isDeleted": false, "id": "sRjIU23aj_XKphLV-oywY", "fillStyle": "solid", @@ -1029,9 +1143,9 @@ "roughness": 1, "opacity": 100, "angle": 0, - "x": 750.08712790353, - "y": 996.501417977469, - "strokeColor": "#e03131", + "x": 790.106415012905, + "y": 967.5490559169222, + "strokeColor": "#ced4da", "backgroundColor": "transparent", "width": 71.43995666503906, "height": 25, @@ -1040,7 +1154,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1709161259546, + "updated": 1716911537216, "link": null, "locked": false, "fontSize": 20, @@ -1055,8 +1169,8 @@ }, { "type": "arrow", - "version": 228, - "versionNonce": 1513455124, + "version": 494, + "versionNonce": 1149572991, "isDeleted": false, "id": "yEd0-RRmSxbuIj5-v8PXq", "fillStyle": "solid", @@ -1065,12 +1179,12 @@ "roughness": 1, "opacity": 100, "angle": 0, - "x": 637.3977434430808, - "y": 1062.8966663905549, - "strokeColor": "#e03131", + "x": 719.473976353237, + "y": 1013.5212917489744, + "strokeColor": "#ced4da", "backgroundColor": "transparent", - "width": 92.22869873046875, - "height": 47.84761047363281, + "width": 47.733642578125, + "height": 30.47753461734851, "seed": 696372444, "groupIds": [], "frameId": null, @@ -1078,15 +1192,19 @@ "type": 2 }, "boundElements": [], - "updated": 1709161259546, + "updated": 1716911537216, "link": null, "locked": false, "startBinding": { "elementId": "nixorYnEQmSGdMW8MLfsJ", - "focus": 0.5223761061220172, + "focus": 0.5634694053714382, "gap": 2.7427978515625 }, - "endBinding": null, + "endBinding": { + "elementId": "6UY32O5c-CLIRXuQQ-9B3", + "focus": 0.45790980235183854, + "gap": 1.22821044921875 + }, "lastCommittedPoint": null, "startArrowhead": null, "endArrowhead": "arrow", @@ -1096,15 +1214,15 @@ 0 ], [ - 92.22869873046875, - -47.84761047363281 + 47.733642578125, + -30.47753461734851 ] ] }, { "type": "rectangle", - "version": 127, - "versionNonce": 746069292, + "version": 185, + "versionNonce": 60384241, "isDeleted": false, "id": "ihi-96832qcqjQ3ztrAc4", "fillStyle": "solid", @@ -1113,9 +1231,9 @@ "roughness": 1, "opacity": 100, "angle": 0, - "x": 86.38816092354955, - "y": 1054.9728382655549, - "strokeColor": "#e03131", + "x": -183.44030739920436, + "y": 1045.8300007411408, + "strokeColor": "#fab005", "backgroundColor": "transparent", "width": 111.1239013671875, "height": 77.71432495117188, @@ -1133,16 +1251,24 @@ { "id": "LrQC48EL7Jzw5PJLgrDLz", "type": "arrow" + }, + { + "id": "aIjPn9GrY1wZO-6HWmjPu", + "type": "arrow" + }, + { + "id": "flU1jIh8Xdzb1aohycypw", + "type": "arrow" } ], - "updated": 1709161259546, + "updated": 1716911537216, "link": null, "locked": false }, { "type": "text", - "version": 122, - "versionNonce": 210017172, + "version": 176, + "versionNonce": 672386975, "isDeleted": false, "id": "luaTSRh7pFnLqqyzWfT20", "fillStyle": "solid", @@ -1151,9 +1277,9 @@ "roughness": 1, "opacity": 100, "angle": 0, - "x": 104.15015433175267, - "y": 1068.8300007411408, - "strokeColor": "#e03131", + "x": -165.67831399100123, + "y": 1059.6871632167267, + "strokeColor": "#fab005", "backgroundColor": "transparent", "width": 75.59991455078125, "height": 50, @@ -1162,7 +1288,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1709161259546, + "updated": 1716911537216, "link": null, "locked": false, "fontSize": 20, @@ -1177,8 +1303,8 @@ }, { "type": "arrow", - "version": 340, - "versionNonce": 1616091052, + "version": 445, + "versionNonce": 1871298001, "isDeleted": false, "id": "LrQC48EL7Jzw5PJLgrDLz", "fillStyle": "solid", @@ -1187,12 +1313,12 @@ "roughness": 1, "opacity": 100, "angle": 0, - "x": 299.7214739118308, - "y": 1168.3442982264924, - "strokeColor": "#e03131", + "x": 299.3309709821433, + "y": 1181.169063661718, + "strokeColor": "#fab005", "backgroundColor": "transparent", - "width": 100.99038696289062, - "height": 64.914306640625, + "width": 370.42835235595703, + "height": 100.52701745401214, "seed": 1963481180, "groupIds": [], "frameId": null, @@ -1200,7 +1326,7 @@ "type": 2 }, "boundElements": [], - "updated": 1709161259546, + "updated": 1716911537216, "link": null, "locked": false, "startBinding": { @@ -1222,15 +1348,15 @@ 0 ], [ - -100.99038696289062, - -64.914306640625 + -370.42835235595703, + -100.52701745401214 ] ] }, { "type": "rectangle", - "version": 142, - "versionNonce": 840173844, + "version": 389, + "versionNonce": 1968604095, "isDeleted": false, "id": "UaKL8QX7aGEXTup0TwFTU", "fillStyle": "solid", @@ -1239,9 +1365,9 @@ "roughness": 1, "opacity": 100, "angle": 0, - "x": 262.6262285505027, - "y": 955.2871082850862, - "strokeColor": "#e03131", + "x": 262.7980119977683, + "y": 826.3728931971956, + "strokeColor": "#868e96", "backgroundColor": "transparent", "width": 111.1239013671875, "height": 85, @@ -1255,16 +1381,32 @@ { "type": "text", "id": "kK9O5UQEzls6EmyrQpelO" + }, + { + "id": "4yIdYVi3-5y1oqIuZDea1", + "type": "arrow" + }, + { + "id": "MzxfLh_R1huaBjDnLpGdS", + "type": "arrow" + }, + { + "id": "HquzclIowOiwnwtHymtpx", + "type": "arrow" + }, + { + "id": "zaaQu5TszKOtGCQP2C0xz", + "type": "arrow" } ], - "updated": 1709161259546, + "updated": 1716911537216, "link": null, "locked": false }, { "type": "text", - "version": 159, - "versionNonce": 802931244, + "version": 402, + "versionNonce": 336845745, "isDeleted": false, "id": "kK9O5UQEzls6EmyrQpelO", "fillStyle": "solid", @@ -1273,9 +1415,9 @@ "roughness": 1, "opacity": 100, "angle": 0, - "x": 269.66823599679174, - "y": 960.2871082850862, - "strokeColor": "#e03131", + "x": 269.84001944405736, + "y": 831.3728931971956, + "strokeColor": "#868e96", "backgroundColor": "transparent", "width": 97.03988647460938, "height": 75, @@ -1284,7 +1426,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1709161259546, + "updated": 1716911537216, "link": null, "locked": false, "fontSize": 20, @@ -1299,8 +1441,8 @@ }, { "type": "arrow", - "version": 237, - "versionNonce": 509200020, + "version": 871, + "versionNonce": 1282257887, "isDeleted": false, "id": "4yIdYVi3-5y1oqIuZDea1", "fillStyle": "solid", @@ -1309,12 +1451,12 @@ "roughness": 1, "opacity": 100, "angle": 0, - "x": 354.57859061104955, - "y": 1132.3823841639924, - "strokeColor": "#e03131", + "x": 387.5249545075228, + "y": 1132.3824757167267, + "strokeColor": "#ced4da", "backgroundColor": "transparent", - "width": 24.79986572265625, - "height": 93.5618896484375, + "width": 49.89889275301391, + "height": 220.00958251953114, "seed": 519855196, "groupIds": [], "frameId": null, @@ -1322,15 +1464,19 @@ "type": 2 }, "boundElements": [], - "updated": 1709161259546, + "updated": 1716911537216, "link": null, "locked": false, "startBinding": { "elementId": "wUpqJTAeFnYjRt_2_x3dA", - "focus": 0.12138607121384778, - "gap": 4.26666259765625 + "focus": 0.5974941756446212, + "gap": 4.266571044921875 + }, + "endBinding": { + "elementId": "UaKL8QX7aGEXTup0TwFTU", + "focus": -0.14417177498042322, + "gap": 1 }, - "endBinding": null, "lastCommittedPoint": null, "startArrowhead": null, "endArrowhead": "arrow", @@ -1340,15 +1486,15 @@ 0 ], [ - -24.79986572265625, - -93.5618896484375 + -49.89889275301391, + -220.00958251953114 ] ] }, { "type": "rectangle", - "version": 120, - "versionNonce": 1643814060, + "version": 326, + "versionNonce": 1096760721, "isDeleted": false, "id": "tu9RIfmWMkcDUEVC8b9st", "fillStyle": "solid", @@ -1357,8 +1503,8 @@ "roughness": 1, "opacity": 100, "angle": 0, - "x": 555.1120378766745, - "y": 1215.2776173182892, + "x": -49.76393868582545, + "y": 1176.8777149745392, "strokeColor": "#e03131", "backgroundColor": "transparent", "width": 147.69525146484375, @@ -1377,16 +1523,20 @@ { "id": "wJo6Mn69LRL_3cZC5sPpo", "type": "arrow" + }, + { + "id": "LQ4-dVElB3gnBElLmsrfZ", + "type": "arrow" } ], - "updated": 1709161259546, + "updated": 1716911537216, "link": null, "locked": false }, { "type": "text", - "version": 128, - "versionNonce": 1175180308, + "version": 333, + "versionNonce": 1969872895, "isDeleted": false, "id": "4hxmfZ9jOknmEdLeBF9Xm", "fillStyle": "solid", @@ -1395,8 +1545,8 @@ "roughness": 1, "opacity": 100, "angle": 0, - "x": 561.2097475324363, - "y": 1242.5443256923127, + "x": -43.66622903006373, + "y": 1204.1444233485627, "strokeColor": "#e03131", "backgroundColor": "transparent", "width": 135.4998321533203, @@ -1406,7 +1556,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1709161259546, + "updated": 1716911537216, "link": null, "locked": false, "fontSize": 20, @@ -1421,8 +1571,8 @@ }, { "type": "arrow", - "version": 338, - "versionNonce": 1348085548, + "version": 762, + "versionNonce": 1453548401, "isDeleted": false, "id": "wJo6Mn69LRL_3cZC5sPpo", "fillStyle": "solid", @@ -1431,12 +1581,12 @@ "roughness": 1, "opacity": 100, "angle": 0, - "x": 417.96909354073705, - "y": 1195.7728565761017, + "x": 297.47397635323705, + "y": 1185.8207881029582, "strokeColor": "#e03131", "backgroundColor": "transparent", - "width": 136.1142578125, - "height": 64.30484008789062, + "width": 198.51397705078125, + "height": 17.76886219830567, "seed": 596474588, "groupIds": [], "frameId": null, @@ -1444,7 +1594,7 @@ "type": 2 }, "boundElements": [], - "updated": 1709161259546, + "updated": 1716911537216, "link": null, "locked": false, "startBinding": { @@ -1466,147 +1616,29 @@ 0 ], [ - 136.1142578125, - 64.30484008789062 - ] - ] - }, - { - "type": "rectangle", - "version": 157, - "versionNonce": 387985812, - "isDeleted": false, - "id": "dd-ubE-J_1JmiKTE4wIQe", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 91.96909354073705, - "y": 1308.8062580653595, - "strokeColor": "#e03131", - "backgroundColor": "transparent", - "width": 111.1239013671875, - "height": 85, - "seed": 1966370396, - "groupIds": [], - "frameId": null, - "roundness": { - "type": 3 - }, - "boundElements": [ - { - "type": "text", - "id": "_JFvheDTxVcv2d0avD-TK" - } - ], - "updated": 1709161259546, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 179, - "versionNonce": 258236844, - "isDeleted": false, - "id": "_JFvheDTxVcv2d0avD-TK", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 123.99105856759252, - "y": 1338.8062580653595, - "strokeColor": "#e03131", - "backgroundColor": "transparent", - "width": 47.07997131347656, - "height": 25, - "seed": 1506689756, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1709161259546, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 1, - "text": "IIAS", - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "dd-ubE-J_1JmiKTE4wIQe", - "originalText": "IIAS", - "lineHeight": 1.25, - "baseline": 18 - }, - { - "type": "arrow", - "version": 228, - "versionNonce": 1355603732, - "isDeleted": false, - "id": "zjiB3MPNyWbDEcFiYe_g8", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 318.0072405133933, - "y": 1218.3252247401642, - "strokeColor": "#e03131", - "backgroundColor": "transparent", - "width": 122.32376098632812, - "height": 100.87628173828125, - "seed": 1351543524, - "groupIds": [], - "frameId": null, - "roundness": { - "type": 2 - }, - "boundElements": [], - "updated": 1709161259546, - "link": null, - "locked": false, - "startBinding": { - "elementId": "wUpqJTAeFnYjRt_2_x3dA", - "focus": -0.12078093483390479, - "gap": 4.57135009765625 - }, - "endBinding": null, - "lastCommittedPoint": null, - "startArrowhead": null, - "endArrowhead": "arrow", - "points": [ - [ - 0, - 0 - ], - [ - -122.32376098632812, - 100.87628173828125 + -198.51397705078125, + 17.76886219830567 ] ] }, { "type": "arrow", - "version": 354, - "versionNonce": 373509164, + "version": 390, + "versionNonce": 1649117215, "isDeleted": false, "id": "WmyN1DPJQs1Z2CtceyQvT", "fillStyle": "solid", "strokeWidth": 2, - "strokeStyle": "solid", + "strokeStyle": "dotted", "roughness": 1, "opacity": 100, "angle": 0, "x": 420.4072649274558, "y": 1176.2680958339142, - "strokeColor": "#e03131", + "strokeColor": "#b2f2bb", "backgroundColor": "transparent", - "width": 370.17144775390625, - "height": 119.77140808105469, + "width": 410.4749587361739, + "height": 148.72377014160134, "seed": 1521048932, "groupIds": [], "frameId": null, @@ -1614,7 +1646,7 @@ "type": 2 }, "boundElements": [], - "updated": 1709161259546, + "updated": 1716911537216, "link": null, "locked": false, "startBinding": { @@ -1640,15 +1672,15 @@ -11.88568115234375 ], [ - 370.17144775390625, - -119.77140808105469 + 410.4749587361739, + -148.72377014160134 ] ] }, { "type": "rectangle", - "version": 426, - "versionNonce": 1681966996, + "version": 432, + "versionNonce": 1613221201, "isDeleted": false, "id": "EJGPcg6VVARniReKnTSxP", "fillStyle": "solid", @@ -1697,14 +1729,14 @@ "type": "arrow" } ], - "updated": 1709161259546, + "updated": 1716911537216, "link": null, "locked": false }, { "type": "text", - "version": 418, - "versionNonce": 314583980, + "version": 424, + "versionNonce": 1896033343, "isDeleted": false, "id": "cZQKIEqiVeJpPL9NIm7TE", "fillStyle": "solid", @@ -1726,7 +1758,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1709161259546, + "updated": 1716911537216, "link": null, "locked": false, "fontSize": 20, @@ -1741,8 +1773,8 @@ }, { "type": "arrow", - "version": 809, - "versionNonce": 426423572, + "version": 815, + "versionNonce": 1967389489, "isDeleted": false, "id": "rKTssBu0z1uLoLF3Kw5es", "fillStyle": "solid", @@ -1767,7 +1799,7 @@ "type": 2 }, "boundElements": [], - "updated": 1709161259546, + "updated": 1716911537216, "link": null, "locked": false, "startBinding": { @@ -1800,8 +1832,8 @@ }, { "type": "text", - "version": 343, - "versionNonce": 1356996569, + "version": 349, + "versionNonce": 1836141663, "isDeleted": false, "id": "4H8ZMoc5SSN1JHUZKkUcg", "fillStyle": "solid", @@ -1824,7 +1856,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1709541266518, + "updated": 1716911537216, "link": null, "locked": false, "fontSize": 16, @@ -1839,8 +1871,8 @@ }, { "type": "text", - "version": 392, - "versionNonce": 1039856276, + "version": 398, + "versionNonce": 1449094417, "isDeleted": false, "id": "z8OUglz4u7rOQ9A5zFW9c", "fillStyle": "solid", @@ -1862,7 +1894,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1709161259546, + "updated": 1716911537216, "link": null, "locked": false, "fontSize": 16, @@ -1877,8 +1909,8 @@ }, { "type": "rectangle", - "version": 427, - "versionNonce": 1766994092, + "version": 433, + "versionNonce": 1399220351, "isDeleted": false, "id": "LHMw1iUkpjHZfVT7ytzG3", "fillStyle": "solid", @@ -1919,14 +1951,14 @@ "type": "arrow" } ], - "updated": 1709161259546, + "updated": 1716911537216, "link": null, "locked": false }, { "type": "text", - "version": 437, - "versionNonce": 816283668, + "version": 443, + "versionNonce": 1257349873, "isDeleted": false, "id": "Mp9F_rbXbIkbQXGjjgWg8", "fillStyle": "solid", @@ -1948,7 +1980,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1709161259546, + "updated": 1716911537216, "link": null, "locked": false, "fontSize": 20, @@ -1963,8 +1995,8 @@ }, { "type": "arrow", - "version": 869, - "versionNonce": 798964524, + "version": 875, + "versionNonce": 1352859807, "isDeleted": false, "id": "XM-CqFMXT4D31UuDWZp8L", "fillStyle": "solid", @@ -1990,7 +2022,7 @@ "type": 2 }, "boundElements": [], - "updated": 1709161259546, + "updated": 1716911537216, "link": null, "locked": false, "startBinding": { @@ -2023,8 +2055,8 @@ }, { "type": "text", - "version": 409, - "versionNonce": 157703572, + "version": 415, + "versionNonce": 1065491665, "isDeleted": false, "id": "4mo3GBw2tkQQRio4qvCAE", "fillStyle": "solid", @@ -2048,7 +2080,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1709161259546, + "updated": 1716911537216, "link": null, "locked": false, "fontSize": 16, @@ -2063,8 +2095,8 @@ }, { "type": "text", - "version": 434, - "versionNonce": 1827075500, + "version": 440, + "versionNonce": 114791615, "isDeleted": false, "id": "gsMeJxktjwXmc6BTybHqv", "fillStyle": "solid", @@ -2086,7 +2118,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1709161259546, + "updated": 1716911537216, "link": null, "locked": false, "fontSize": 16, @@ -2101,8 +2133,8 @@ }, { "type": "text", - "version": 596, - "versionNonce": 1903004436, + "version": 602, + "versionNonce": 598235825, "isDeleted": false, "id": "EfiXXxxdhtgbNCwD8nRpB", "fillStyle": "solid", @@ -2124,7 +2156,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1709161259546, + "updated": 1716911537216, "link": null, "locked": false, "fontSize": 16, @@ -2139,8 +2171,8 @@ }, { "type": "arrow", - "version": 1594, - "versionNonce": 970648409, + "version": 1600, + "versionNonce": 228893919, "isDeleted": false, "id": "-RplXGYKOIukT0NRNN73m", "fillStyle": "solid", @@ -2165,7 +2197,7 @@ "type": 2 }, "boundElements": [], - "updated": 1709541279836, + "updated": 1716911537216, "link": null, "locked": false, "startBinding": { @@ -2198,8 +2230,8 @@ }, { "type": "text", - "version": 650, - "versionNonce": 371118775, + "version": 656, + "versionNonce": 134995089, "isDeleted": false, "id": "NP6WIFYKAfuy77hUb7QGg", "fillStyle": "solid", @@ -2227,7 +2259,7 @@ "type": "arrow" } ], - "updated": 1709541279836, + "updated": 1716911537216, "link": null, "locked": false, "fontSize": 16, @@ -2242,8 +2274,8 @@ }, { "type": "arrow", - "version": 1026, - "versionNonce": 1080706167, + "version": 1233, + "versionNonce": 941840977, "isDeleted": false, "id": "_2ihLbbBs9mG0VwXANkMT", "fillStyle": "solid", @@ -2251,9 +2283,9 @@ "strokeStyle": "solid", "roughness": 0, "opacity": 100, - "angle": 4.68564597383776, - "x": 199.46637902586122, - "y": 349.0872686449829, + "angle": 3.1499915121145428, + "x": 311.6759737524237, + "y": 387.201556975061, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", "width": 33.05133598938784, @@ -2265,18 +2297,18 @@ "type": 2 }, "boundElements": [], - "updated": 1709541276473, + "updated": 1716911547433, "link": null, "locked": false, "startBinding": { "elementId": "_vcxi3vYplZXZVtRvuTFu", - "focus": -0.9122102467140761, - "gap": 3.007170919044853 + "focus": -0.39843953066594034, + "gap": 7.930354554650648 }, "endBinding": { "elementId": "_vcxi3vYplZXZVtRvuTFu", - "focus": 0.9000965548076789, - "gap": 1 + "focus": 0.7392624554177534, + "gap": 13.755323634822389 }, "lastCommittedPoint": null, "startArrowhead": null, @@ -2298,8 +2330,8 @@ }, { "type": "text", - "version": 478, - "versionNonce": 2053953044, + "version": 627, + "versionNonce": 1753368831, "isDeleted": false, "id": "MBCG3URCQJoIK6vKnh2Ak", "fillStyle": "solid", @@ -2308,8 +2340,8 @@ "roughness": 0, "opacity": 100, "angle": 6.271456869772386, - "x": 106.61835550993172, - "y": 341.08284960714764, + "x": 279.85669779508794, + "y": 387.5497075173039, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", "width": 87.5390625, @@ -2324,7 +2356,7 @@ "type": "arrow" } ], - "updated": 1709161259546, + "updated": 1716911554878, "link": null, "locked": false, "fontSize": 16, @@ -2339,8 +2371,8 @@ }, { "type": "text", - "version": 656, - "versionNonce": 1342326060, + "version": 662, + "versionNonce": 87701791, "isDeleted": false, "id": "7IBDyCqtuC_XEWxjwRX3r", "fillStyle": "solid", @@ -2362,7 +2394,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1709161259546, + "updated": 1716911537216, "link": null, "locked": false, "fontSize": 16, @@ -2377,8 +2409,8 @@ }, { "type": "text", - "version": 546, - "versionNonce": 1544614804, + "version": 552, + "versionNonce": 762883153, "isDeleted": false, "id": "8b9pgwxmVnnmMTUTn-0pw", "fillStyle": "solid", @@ -2400,7 +2432,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1709161259546, + "updated": 1716911537216, "link": null, "locked": false, "fontSize": 16, @@ -2415,8 +2447,8 @@ }, { "type": "arrow", - "version": 2049, - "versionNonce": 1479643698, + "version": 2055, + "versionNonce": 83082559, "isDeleted": false, "id": "xZYxAwmIab4C8nEuKF1kr", "fillStyle": "solid", @@ -2438,7 +2470,7 @@ "type": 2 }, "boundElements": [], - "updated": 1709209399045, + "updated": 1716911537216, "link": null, "locked": false, "startBinding": { @@ -2467,8 +2499,8 @@ }, { "type": "text", - "version": 1030, - "versionNonce": 2119524628, + "version": 1036, + "versionNonce": 1126234673, "isDeleted": false, "id": "-iZWNEg9zPZY3GqRZgOGL", "fillStyle": "solid", @@ -2493,7 +2525,7 @@ "type": "arrow" } ], - "updated": 1709161259546, + "updated": 1716911537216, "link": null, "locked": false, "fontSize": 16, @@ -2508,8 +2540,8 @@ }, { "type": "text", - "version": 764, - "versionNonce": 1157360172, + "version": 782, + "versionNonce": 925351263, "isDeleted": false, "id": "FDyYm6OTuaxDdxr4wEvG3", "fillStyle": "solid", @@ -2518,11 +2550,11 @@ "roughness": 0, "opacity": 100, "angle": 6.277729862471947, - "x": 497.15427134210455, - "y": 522.7489224963991, + "x": 497.1543136596685, + "y": 522.764436340333, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", - "width": 111.921875, + "width": 106.234375, "height": 18.4, "seed": 1982411645, "groupIds": [ @@ -2531,23 +2563,23 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1709161259546, + "updated": 1716911537216, "link": null, "locked": false, "fontSize": 16, "fontFamily": 2, - "text": "используется в", + "text": "поддерживает", "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "используется в", + "originalText": "поддерживает", "lineHeight": 1.15, "baseline": 15 }, { "type": "text", - "version": 473, - "versionNonce": 145759892, + "version": 538, + "versionNonce": 2118421521, "isDeleted": false, "id": "_FnpAefvB97AZ4SWyUelz", "fillStyle": "solid", @@ -2555,9 +2587,9 @@ "strokeStyle": "solid", "roughness": 0, "opacity": 100, - "angle": 4.673174358676221, - "x": 215.71731718896902, - "y": 467.55178539840944, + "angle": 4.710794287179997, + "x": 242.33639677881277, + "y": 470.29470532028444, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", "width": 57.2734375, @@ -2569,7 +2601,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1709161259546, + "updated": 1716911537216, "link": null, "locked": false, "fontSize": 16, @@ -2584,8 +2616,8 @@ }, { "type": "arrow", - "version": 1422, - "versionNonce": 55500153, + "version": 1466, + "versionNonce": 1635177951, "isDeleted": false, "id": "RzxgCJJQx4R8qlDtyfoh6", "fillStyle": "solid", @@ -2594,8 +2626,8 @@ "roughness": 0, "opacity": 100, "angle": 0, - "x": 886.2124801726396, - "y": 672.1432314983074, + "x": 888.4507614226396, + "y": 597.4765139690105, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", "width": 333.7334808530911, @@ -2610,7 +2642,7 @@ "id": "5NFJ7uqQytCQr3ok_zd0k" } ], - "updated": 1709541366074, + "updated": 1716911622937, "link": null, "locked": false, "startBinding": null, @@ -2630,45 +2662,45 @@ ] }, { - "id": "5NFJ7uqQytCQr3ok_zd0k", "type": "text", - "x": 631.9082397460941, - "y": 663.3264144897466, - "width": 174.875, - "height": 18.4, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", + "version": 34, + "versionNonce": 383443441, + "isDeleted": false, + "id": "5NFJ7uqQytCQr3ok_zd0k", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "dotted", "roughness": 1, "opacity": 100, + "angle": 0, + "x": 631.9082397460941, + "y": 663.3264144897466, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 174.875, + "height": 18.4, + "seed": 432545271, "groupIds": [], "frameId": null, "roundness": null, - "seed": 432545271, - "version": 28, - "versionNonce": 2070529049, - "isDeleted": false, - "boundElements": null, - "updated": 1709541371341, + "boundElements": [], + "updated": 1716911537217, "link": null, "locked": false, - "text": "в процессе реализации", "fontSize": 16, "fontFamily": 2, + "text": "в процессе реализации", "textAlign": "center", "verticalAlign": "middle", - "baseline": 15, "containerId": "RzxgCJJQx4R8qlDtyfoh6", "originalText": "в процессе реализации", - "lineHeight": 1.15 + "lineHeight": 1.15, + "baseline": 15 }, { "type": "arrow", - "version": 1464, - "versionNonce": 191996279, + "version": 1508, + "versionNonce": 285131263, "isDeleted": false, "id": "PVtTZhM7AZFbhfarM5zlV", "fillStyle": "solid", @@ -2677,8 +2709,8 @@ "roughness": 0, "opacity": 100, "angle": 0, - "x": 886.4882370085771, - "y": 706.952694999284, + "x": 888.7265182585771, + "y": 632.2859774699871, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", "width": 333.7334808530911, @@ -2693,7 +2725,7 @@ "id": "ZweMamLL91OhZyNq0_MKE" } ], - "updated": 1709541393766, + "updated": 1716911622937, "link": null, "locked": false, "startBinding": null, @@ -2714,8 +2746,8 @@ }, { "type": "text", - "version": 43, - "versionNonce": 1528590265, + "version": 49, + "versionNonce": 1508604881, "isDeleted": false, "id": "ZweMamLL91OhZyNq0_MKE", "fillStyle": "solid", @@ -2735,7 +2767,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1709541392345, + "updated": 1716911537217, "link": null, "locked": false, "fontSize": 16, @@ -2747,6 +2779,7246 @@ "originalText": "реализовано", "lineHeight": 1.15, "baseline": 15 + }, + { + "type": "rectangle", + "version": 348, + "versionNonce": 695707071, + "isDeleted": false, + "id": "TfRjw2Rj2qyEXD4toxv-g", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 517.8478390247257, + "y": 1134.1819874460607, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "width": 114.7811279296875, + "height": 77.10482788085938, + "seed": 274406879, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "MYVwHXqqqM2Ze_f7O_6cP" + }, + { + "id": "8REfjIE_R6Ub0KLh_jwWS", + "type": "arrow" + }, + { + "id": "JIhodVaqR4q1US0sd_Myd", + "type": "arrow" + } + ], + "updated": 1716911537217, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 366, + "versionNonce": 126736817, + "isDeleted": false, + "id": "MYVwHXqqqM2Ze_f7O_6cP", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 524.7284618884952, + "y": 1160.2344013864904, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "width": 101.01988220214844, + "height": 25, + "seed": 1813645823, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537217, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "federation", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "TfRjw2Rj2qyEXD4toxv-g", + "originalText": "federation", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "arrow", + "version": 380, + "versionNonce": 1679463903, + "isDeleted": false, + "id": "8REfjIE_R6Ub0KLh_jwWS", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 416.569713036989, + "y": 1167.575611333991, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "width": 100.27812598773664, + "height": 5.395470836344657, + "seed": 1136937841, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1716911537217, + "link": null, + "locked": false, + "startBinding": { + "elementId": "wUpqJTAeFnYjRt_2_x3dA", + "focus": -0.2586794077038555, + "gap": 1.4576141251582158 + }, + "endBinding": { + "elementId": "TfRjw2Rj2qyEXD4toxv-g", + "focus": -0.08113263743816693, + "gap": 1 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 100.27812598773664, + 5.395470836344657 + ] + ] + }, + { + "type": "arrow", + "version": 365, + "versionNonce": 1894349713, + "isDeleted": false, + "id": "JIhodVaqR4q1US0sd_Myd", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 591.8497644331575, + "y": 1131.8868519480138, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "width": 31.9649583475466, + "height": 81.83087562152559, + "seed": 701799921, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1716911537217, + "link": null, + "locked": false, + "startBinding": { + "elementId": "TfRjw2Rj2qyEXD4toxv-g", + "focus": 0.00910817163000219, + "gap": 2.295135498046875 + }, + "endBinding": { + "elementId": "nixorYnEQmSGdMW8MLfsJ", + "focus": 0.27408404568089406, + "gap": 1.5592427972613905 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 31.9649583475466, + -81.83087562152559 + ] + ] + }, + { + "type": "rectangle", + "version": 630, + "versionNonce": 153780735, + "isDeleted": false, + "id": "tdBkfHEscwyzkv2OFX0yj", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -204.54228243523528, + "y": 1398.1059986765295, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "width": 1115.200622558594, + "height": 77.10482788085938, + "seed": 1573368369, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "gVCl8nHhuaqdP6sQ7C3aW" + } + ], + "updated": 1716911537217, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 651, + "versionNonce": 1446371697, + "isDeleted": false, + "id": "gVCl8nHhuaqdP6sQ7C3aW", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 315.13806882208905, + "y": 1424.1584126169591, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "width": 75.83992004394531, + "height": 25, + "seed": 55854097, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537217, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "hexagon", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "tdBkfHEscwyzkv2OFX0yj", + "originalText": "hexagon", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "rectangle", + "version": 290, + "versionNonce": 967305759, + "isDeleted": false, + "id": "ZISPCVYo2Djyy926Fya1b", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 641.5050045520694, + "y": 1236.343898456803, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "width": 114.7811279296875, + "height": 77.10482788085938, + "seed": 730015327, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "LuwymVQP3GPNzowHQRUwb" + }, + { + "id": "Pt7D_kEwZgpQ1EG_g-kTy", + "type": "arrow" + }, + { + "id": "W_LTJqWEYoOR-BBoNaij7", + "type": "arrow" + } + ], + "updated": 1716911537217, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 286, + "versionNonce": 79334225, + "isDeleted": false, + "id": "LuwymVQP3GPNzowHQRUwb", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 648.1056210071475, + "y": 1249.8963123972326, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "width": 101.57989501953125, + "height": 50, + "seed": 1714225791, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537217, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "timeMachin\ne", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "ZISPCVYo2Djyy926Fya1b", + "originalText": "timeMachine", + "lineHeight": 1.25, + "baseline": 43 + }, + { + "type": "arrow", + "version": 187, + "versionNonce": 579030591, + "isDeleted": false, + "id": "W_LTJqWEYoOR-BBoNaij7", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 416.31439175910066, + "y": 1192.4868122751623, + "strokeColor": "#fab005", + "backgroundColor": "transparent", + "width": 222.26681518554688, + "height": 84.41903686523438, + "seed": 1937680223, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1716911537217, + "link": null, + "locked": false, + "startBinding": { + "elementId": "wUpqJTAeFnYjRt_2_x3dA", + "focus": -0.08233269276354199, + "gap": 1.2022928472698595 + }, + "endBinding": { + "elementId": "ZISPCVYo2Djyy926Fya1b", + "focus": -0.4128839377020561, + "gap": 2.923797607421875 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 222.26681518554688, + 84.41903686523438 + ] + ] + }, + { + "type": "arrow", + "version": 228, + "versionNonce": 885979441, + "isDeleted": false, + "id": "Pt7D_kEwZgpQ1EG_g-kTy", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 665.791267497068, + "y": 1233.153468769303, + "strokeColor": "#fab005", + "backgroundColor": "transparent", + "width": 12.945821775766035, + "height": 183.65673524007616, + "seed": 555829631, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1716911537217, + "link": null, + "locked": false, + "startBinding": { + "elementId": "ZISPCVYo2Djyy926Fya1b", + "focus": -0.5018248370295116, + "gap": 3.1904296875 + }, + "endBinding": { + "elementId": "nixorYnEQmSGdMW8MLfsJ", + "focus": 0.15444156346979787, + "gap": 1 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -12.945821775766035, + -183.65673524007616 + ] + ] + }, + { + "type": "arrow", + "version": 502, + "versionNonce": 2124230239, + "isDeleted": false, + "id": "MzxfLh_R1huaBjDnLpGdS", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 374.9219133649558, + "y": 862.3138325804055, + "strokeColor": "#868e96", + "backgroundColor": "transparent", + "width": 262.7719583695251, + "height": 105.96346431389725, + "seed": 1556304529, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1716911537217, + "link": null, + "locked": false, + "startBinding": { + "elementId": "UaKL8QX7aGEXTup0TwFTU", + "focus": -0.4526472850787994, + "gap": 1 + }, + "endBinding": { + "elementId": "nixorYnEQmSGdMW8MLfsJ", + "focus": 0.5338804621550965, + "gap": 3.1146087540647045 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 262.7719583695251, + 105.96346431389725 + ] + ] + }, + { + "type": "rectangle", + "version": 554, + "versionNonce": 668642065, + "isDeleted": false, + "id": "c8IEHhLGcBlcUXDGSaxra", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 245.66728787726476, + "y": 701.5724537546544, + "strokeColor": "#ced4da", + "backgroundColor": "transparent", + "width": 114.7811279296875, + "height": 77.10482788085938, + "seed": 906415185, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "9_3TOpwopDzyhZusACi2D" + }, + { + "id": "zaaQu5TszKOtGCQP2C0xz", + "type": "arrow" + } + ], + "updated": 1716911537217, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 580, + "versionNonce": 1489373823, + "isDeleted": false, + "id": "9_3TOpwopDzyhZusACi2D", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 275.00788693732335, + "y": 727.624867695084, + "strokeColor": "#ced4da", + "backgroundColor": "transparent", + "width": 56.09992980957031, + "height": 25, + "seed": 1424693809, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537217, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "tasks", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "c8IEHhLGcBlcUXDGSaxra", + "originalText": "tasks", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "rectangle", + "version": 420, + "versionNonce": 106242289, + "isDeleted": false, + "id": "q4f-aLb5cu1iQu8vZ99h7", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -68.49530672722744, + "y": 829.7723744089515, + "strokeColor": "#e9ecef", + "backgroundColor": "transparent", + "width": 114.7811279296875, + "height": 77.10482788085938, + "seed": 742375071, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "vDax4cGG_H9KirjUcdpjq" + }, + { + "id": "aIjPn9GrY1wZO-6HWmjPu", + "type": "arrow" + }, + { + "id": "HquzclIowOiwnwtHymtpx", + "type": "arrow" + } + ], + "updated": 1716911537217, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 453, + "versionNonce": 230580895, + "isDeleted": false, + "id": "vDax4cGG_H9KirjUcdpjq", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -31.54472994500088, + "y": 855.8247883493812, + "strokeColor": "#e9ecef", + "backgroundColor": "transparent", + "width": 40.879974365234375, + "height": 25, + "seed": 204247743, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537217, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "CJM", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "q4f-aLb5cu1iQu8vZ99h7", + "originalText": "CJM", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "arrow", + "version": 40, + "versionNonce": 2110118609, + "isDeleted": false, + "id": "aIjPn9GrY1wZO-6HWmjPu", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -135.19046663933682, + "y": 1042.4676411325843, + "strokeColor": "#ced4da", + "backgroundColor": "transparent", + "width": 91.21914672851562, + "height": 135.00949096679688, + "seed": 150926545, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1716911537217, + "link": null, + "locked": false, + "startBinding": { + "elementId": "ihi-96832qcqjQ3ztrAc4", + "focus": -0.4380294557231565, + "gap": 3.362359608556517 + }, + "endBinding": { + "elementId": "q4f-aLb5cu1iQu8vZ99h7", + "focus": 0.07701631728349481, + "gap": 1 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 91.21914672851562, + -135.00949096679688 + ] + ] + }, + { + "type": "arrow", + "version": 223, + "versionNonce": 238466751, + "isDeleted": false, + "id": "HquzclIowOiwnwtHymtpx", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 50.10485196417882, + "y": 863.8047226638674, + "strokeColor": "#ced4da", + "backgroundColor": "transparent", + "width": 210.26678466796875, + "height": 9.624163826499966, + "seed": 2044596447, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1716911537217, + "link": null, + "locked": false, + "startBinding": { + "elementId": "q4f-aLb5cu1iQu8vZ99h7", + "focus": -0.04580686481060989, + "gap": 3.81903076171875 + }, + "endBinding": { + "elementId": "UaKL8QX7aGEXTup0TwFTU", + "focus": 0.38510927209495227, + "gap": 2.426375365620757 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 210.26678466796875, + -9.624163826499966 + ] + ] + }, + { + "type": "arrow", + "version": 637, + "versionNonce": 516184241, + "isDeleted": false, + "id": "zaaQu5TszKOtGCQP2C0xz", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 306.6337328708216, + "y": 779.3538807460238, + "strokeColor": "#ced4da", + "backgroundColor": "transparent", + "width": 31.32244622067134, + "height": 42.38056031331803, + "seed": 130632593, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1716911537217, + "link": null, + "locked": false, + "startBinding": { + "elementId": "c8IEHhLGcBlcUXDGSaxra", + "focus": 0.2959505356610796, + "gap": 1 + }, + "endBinding": { + "elementId": "UaKL8QX7aGEXTup0TwFTU", + "focus": 0.6258874669927509, + "gap": 4.638452137853733 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 31.32244622067134, + 42.38056031331803 + ] + ] + }, + { + "type": "rectangle", + "version": 320, + "versionNonce": 1624213215, + "isDeleted": false, + "id": "92hNaewl9LBaRz14bxFXh", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 66.16192593878827, + "y": 998.2294514353198, + "strokeColor": "#868e96", + "backgroundColor": "transparent", + "width": 111.1239013671875, + "height": 77.71432495117188, + "seed": 700108063, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "yMj-nFNEhJqqY6dAHdGtc" + }, + { + "id": "flU1jIh8Xdzb1aohycypw", + "type": "arrow" + }, + { + "id": "eWdnHV0Hg_RNm6rpK872y", + "type": "arrow" + } + ], + "updated": 1716911537217, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 327, + "versionNonce": 2063080081, + "isDeleted": false, + "id": "yMj-nFNEhJqqY6dAHdGtc", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 72.60393491095624, + "y": 1012.0866139109057, + "strokeColor": "#868e96", + "backgroundColor": "transparent", + "width": 98.23988342285156, + "height": 50, + "seed": 1950470463, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537217, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Resources\n& VS", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "92hNaewl9LBaRz14bxFXh", + "originalText": "Resources & VS", + "lineHeight": 1.25, + "baseline": 43 + }, + { + "type": "arrow", + "version": 44, + "versionNonce": 1679381247, + "isDeleted": false, + "id": "flU1jIh8Xdzb1aohycypw", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -70.31422152214924, + "y": 1073.839040058367, + "strokeColor": "#868e96", + "backgroundColor": "transparent", + "width": 130.83816528320312, + "height": 33.82861328125, + "seed": 764593247, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1716911537217, + "link": null, + "locked": false, + "startBinding": { + "elementId": "ihi-96832qcqjQ3ztrAc4", + "focus": 0.07581819486430194, + "gap": 2.002184509867618 + }, + "endBinding": { + "elementId": "92hNaewl9LBaRz14bxFXh", + "focus": 0.24236982710521784, + "gap": 5.6379821777343935 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 130.83816528320312, + -33.82861328125 + ] + ] + }, + { + "type": "arrow", + "version": 37, + "versionNonce": 51945585, + "isDeleted": false, + "id": "LQ4-dVElB3gnBElLmsrfZ", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 28.80955167121033, + "y": 1174.1628346140296, + "strokeColor": "#868e96", + "backgroundColor": "transparent", + "width": 88.1715087890625, + "height": 100.87617492675781, + "seed": 194369841, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1716911537217, + "link": null, + "locked": false, + "startBinding": { + "elementId": "tu9RIfmWMkcDUEVC8b9st", + "focus": -0.36250775749555625, + "gap": 2.7148803605095964 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 88.1715087890625, + -100.87617492675781 + ] + ] + }, + { + "type": "arrow", + "version": 42, + "versionNonce": 1351916319, + "isDeleted": false, + "id": "eWdnHV0Hg_RNm6rpK872y", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 174.4857906848822, + "y": 996.7533039743807, + "strokeColor": "#868e96", + "backgroundColor": "transparent", + "width": 88.78097534179688, + "height": 92.95234680175781, + "seed": 579340049, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1716911537217, + "link": null, + "locked": false, + "startBinding": { + "elementId": "92hNaewl9LBaRz14bxFXh", + "focus": 0.15363978915089732, + "gap": 1.4761474609390461 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 88.78097534179688, + -92.95234680175781 + ] + ] + }, + { + "type": "rectangle", + "version": 632, + "versionNonce": 619539025, + "isDeleted": false, + "id": "W68ow8dgWozVUYeHA3PDq", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 686.5477047473818, + "y": -398.2704478566736, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 266.0489501953125, + "height": 259.3143310546875, + "seed": 1420458889, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "WkafqLlzUsNO_Q9sKKIe9" + }, + { + "id": "qtEoRf2ynfY3vStY1fUun", + "type": "arrow" + }, + { + "id": "HznRj8yWEZ2ln8yCXoou7", + "type": "arrow" + } + ], + "updated": 1716911537217, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 685, + "versionNonce": 2058477375, + "isDeleted": false, + "id": "WkafqLlzUsNO_Q9sKKIe9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 777.6022244007021, + "y": -393.2704478566736, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 83.93991088867188, + "height": 25, + "seed": 1120150121, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537217, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Участник", + "textAlign": "center", + "verticalAlign": "top", + "containerId": "W68ow8dgWozVUYeHA3PDq", + "originalText": "Участник", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "arrow", + "version": 402, + "versionNonce": 692975665, + "isDeleted": false, + "id": "qtEoRf2ynfY3vStY1fUun", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 351.4432125598818, + "y": -345.1964361435266, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 375.2000274658203, + "height": 54.74963754009366, + "seed": 278794695, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1716911537217, + "link": null, + "locked": false, + "startBinding": { + "elementId": "V01v9F1wzTyQAmY8nTRxF", + "focus": 0.20650478295040306, + "gap": 2.300262451171875 + }, + "endBinding": { + "elementId": "mcPRyCvDuRqGfosP3smYs", + "focus": -0.0631330016022671, + "gap": 6.83306884765625 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 181.995361328125, + -52.150183588147 + ], + [ + 375.2000274658203, + 2.599453951946657 + ] + ] + }, + { + "type": "rectangle", + "version": 99, + "versionNonce": 1423023967, + "isDeleted": false, + "id": "S1gEKzWvuKjN8aB2D5ZdI", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 487.990636876288, + "y": -424.77523911643925, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "width": 76.53356933593753, + "height": 64.30479431152344, + "seed": 533487143, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "2U52jioxstf6Lpw599TGX" + } + ], + "updated": 1716911537217, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 60, + "versionNonce": 1377946129, + "isDeleted": false, + "id": "2U52jioxstf6Lpw599TGX", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 494.107450535956, + "y": -417.62284196067753, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 64.29994201660156, + "height": 50, + "seed": 1259286951, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537217, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Ресурс\nА", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "S1gEKzWvuKjN8aB2D5ZdI", + "originalText": "Ресурс\nА", + "lineHeight": 1.25, + "baseline": 43 + }, + { + "type": "arrow", + "version": 363, + "versionNonce": 826563455, + "isDeleted": false, + "id": "HznRj8yWEZ2ln8yCXoou7", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 733.4716091663271, + "y": -203.9554884914478, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "width": 370.71538619995084, + "height": 47.19481701083171, + "seed": 1413319081, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1716911537217, + "link": null, + "locked": false, + "startBinding": { + "elementId": "ofYTfbZPU3MdXHf5bIcW3", + "focus": 0.4149722603426244, + "gap": 4.442626953125 + }, + "endBinding": { + "elementId": "yhd2RPkUNpSeJ-BFITGQy", + "focus": -0.2323241367176787, + "gap": 8.022864532471033 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -194.7188262939453, + 41.58031956543823 + ], + [ + -370.71538619995084, + -5.614497445393482 + ] + ] + }, + { + "type": "rectangle", + "version": 162, + "versionNonce": 945840113, + "isDeleted": false, + "id": "p6-Ovftvp9yqIWMKrlFbG", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 504.8479366809755, + "y": -196.04184830833378, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "width": 76.53356933593753, + "height": 64.30479431152344, + "seed": 346051689, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "frPDqZzax3ZKelRe1KCDh" + } + ], + "updated": 1716911537217, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 125, + "versionNonce": 1145738143, + "isDeleted": false, + "id": "frPDqZzax3ZKelRe1KCDh", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 510.9647503406435, + "y": -188.88945115257206, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 64.29994201660156, + "height": 50, + "seed": 1011605321, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537217, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Ресурс\nB", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "p6-Ovftvp9yqIWMKrlFbG", + "originalText": "Ресурс\nB", + "lineHeight": 1.25, + "baseline": 43 + }, + { + "type": "rectangle", + "version": 196, + "versionNonce": 1779513809, + "isDeleted": false, + "id": "V01v9F1wzTyQAmY8nTRxF", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 253.88565640753802, + "y": -363.87043107200566, + "strokeColor": "#e03131", + "backgroundColor": "#fff5f5", + "width": 95.25729370117189, + "height": 50, + "seed": 2090398025, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "dRVf1tfN9qxrIM5KKWXkE" + }, + { + "id": "qtEoRf2ynfY3vStY1fUun", + "type": "arrow" + }, + { + "id": "87a56bkudqaGyMGsEfI8C", + "type": "arrow" + }, + { + "id": "sqz6WhBSkiJ-PZD5QW6dy", + "type": "arrow" + } + ], + "updated": 1716911537217, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 193, + "versionNonce": 1712637887, + "isDeleted": false, + "id": "dRVf1tfN9qxrIM5KKWXkE", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 262.2262249500185, + "y": -358.87043107200566, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "width": 78.57615661621094, + "height": 40, + "seed": 1490935849, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537217, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "Ценность \nресурса А", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "V01v9F1wzTyQAmY8nTRxF", + "originalText": "Ценность ресурса А", + "lineHeight": 1.25, + "baseline": 35 + }, + { + "type": "rectangle", + "version": 268, + "versionNonce": 1212929969, + "isDeleted": false, + "id": "mcPRyCvDuRqGfosP3smYs", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 733.4763088733583, + "y": -354.5942393605799, + "strokeColor": "#2f9e44", + "backgroundColor": "#ebfbee", + "width": 95.25729370117189, + "height": 50, + "seed": 89571367, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "4BB-br9d6uVSOswOiUVWQ" + }, + { + "id": "qtEoRf2ynfY3vStY1fUun", + "type": "arrow" + }, + { + "id": "piQha-evKJvK_rFxSK5RY", + "type": "arrow" + }, + { + "id": "rx8xHcCkyuEnra9AHu2p7", + "type": "arrow" + } + ], + "updated": 1716911537217, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 266, + "versionNonce": 348354527, + "isDeleted": false, + "id": "4BB-br9d6uVSOswOiUVWQ", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 741.8168774158388, + "y": -349.5942393605799, + "strokeColor": "#2f9e44", + "backgroundColor": "transparent", + "width": 78.57615661621094, + "height": 40, + "seed": 1425679175, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537217, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "Ценность \nресурса А", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "mcPRyCvDuRqGfosP3smYs", + "originalText": "Ценность ресурса А", + "lineHeight": 1.25, + "baseline": 35 + }, + { + "type": "rectangle", + "version": 243, + "versionNonce": 624408977, + "isDeleted": false, + "id": "yhd2RPkUNpSeJ-BFITGQy", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 259.47606473273333, + "y": -240.71801865745488, + "strokeColor": "#2f9e44", + "backgroundColor": "#ebfbee", + "width": 95.25729370117189, + "height": 50, + "seed": 1891339945, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "Bryy01BKU6hgz9mOjT3yJ" + }, + { + "id": "HznRj8yWEZ2ln8yCXoou7", + "type": "arrow" + }, + { + "id": "87a56bkudqaGyMGsEfI8C", + "type": "arrow" + }, + { + "id": "4l4MZbqwtCfweXz8rZKTj", + "type": "arrow" + } + ], + "updated": 1716911537217, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 243, + "versionNonce": 912729087, + "isDeleted": false, + "id": "Bryy01BKU6hgz9mOjT3yJ", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 267.2486324817568, + "y": -235.71801865745488, + "strokeColor": "#2f9e44", + "backgroundColor": "transparent", + "width": 79.712158203125, + "height": 40, + "seed": 1569051017, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537217, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "Ценность \nресурса B", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "yhd2RPkUNpSeJ-BFITGQy", + "originalText": "Ценность ресурса B", + "lineHeight": 1.25, + "baseline": 35 + }, + { + "type": "rectangle", + "version": 310, + "versionNonce": 571236209, + "isDeleted": false, + "id": "ofYTfbZPU3MdXHf5bIcW3", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 737.9142361194521, + "y": -225.47996628929081, + "strokeColor": "#e03131", + "backgroundColor": "#fff5f5", + "width": 95.25729370117189, + "height": 50, + "seed": 90709447, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "izFIZMcm2GUyOX0AuDCMQ" + }, + { + "id": "HznRj8yWEZ2ln8yCXoou7", + "type": "arrow" + }, + { + "id": "piQha-evKJvK_rFxSK5RY", + "type": "arrow" + }, + { + "id": "9aRF23GT46cfJC0hilvFd", + "type": "arrow" + } + ], + "updated": 1716911537217, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 312, + "versionNonce": 453004319, + "isDeleted": false, + "id": "izFIZMcm2GUyOX0AuDCMQ", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 745.6868038684755, + "y": -220.47996628929081, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "width": 79.712158203125, + "height": 40, + "seed": 844025063, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537217, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "Ценность \nресурса B", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "ofYTfbZPU3MdXHf5bIcW3", + "originalText": "Ценность ресурса B", + "lineHeight": 1.25, + "baseline": 35 + }, + { + "type": "arrow", + "version": 53, + "versionNonce": 1292978513, + "isDeleted": false, + "id": "87a56bkudqaGyMGsEfI8C", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 304.7905331165224, + "y": -243.74662888694706, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "width": 0.438018798828125, + "height": 69.18095397949219, + "seed": 391145991, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "type": "text", + "id": "LxJPA5WiJxLoVjsHRfn8h" + } + ], + "updated": 1716911537217, + "link": null, + "locked": false, + "startBinding": { + "elementId": "yhd2RPkUNpSeJ-BFITGQy", + "focus": -0.044713382924582275, + "gap": 3.0286102294921875 + }, + "endBinding": { + "elementId": "V01v9F1wzTyQAmY8nTRxF", + "focus": -0.05595575684121037, + "gap": 1 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "triangle", + "points": [ + [ + 0, + 0 + ], + [ + -0.438018798828125, + -69.18095397949219 + ] + ] + }, + { + "type": "text", + "version": 39, + "versionNonce": 1048539199, + "isDeleted": false, + "id": "LxJPA5WiJxLoVjsHRfn8h", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 259.67308621710833, + "y": -287.53710587669315, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "width": 89.796875, + "height": 18.4, + "seed": 2103123975, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537217, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 2, + "text": "больше чем", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "87a56bkudqaGyMGsEfI8C", + "originalText": "больше чем", + "lineHeight": 1.15, + "baseline": 15 + }, + { + "type": "arrow", + "version": 151, + "versionNonce": 2141058865, + "isDeleted": false, + "id": "piQha-evKJvK_rFxSK5RY", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 781.8107057672697, + "y": -302.4058245294184, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "width": 1.7924119456671406, + "height": 74.66664123535156, + "seed": 634329735, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "type": "text", + "id": "0FbvfySWVifqZvcLwrQjz" + } + ], + "updated": 1716911537217, + "link": null, + "locked": false, + "startBinding": { + "elementId": "mcPRyCvDuRqGfosP3smYs", + "focus": 0.003946878389036887, + "gap": 2.188414831161481 + }, + "endBinding": { + "elementId": "ofYTfbZPU3MdXHf5bIcW3", + "focus": -0.026651997016435145, + "gap": 2.259217004776019 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "triangle", + "points": [ + [ + 0, + 0 + ], + [ + 1.7924119456671406, + 74.66664123535156 + ] + ] + }, + { + "type": "text", + "version": 42, + "versionNonce": 1254428767, + "isDeleted": false, + "id": "0FbvfySWVifqZvcLwrQjz", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 257.2634640247255, + "y": -293.16778284240667, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "width": 89.796875, + "height": 18.4, + "seed": 1312305575, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537217, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 2, + "text": "больше чем", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "piQha-evKJvK_rFxSK5RY", + "originalText": "больше чем", + "lineHeight": 1.15, + "baseline": 15 + }, + { + "type": "rectangle", + "version": 106, + "versionNonce": 2082072849, + "isDeleted": false, + "id": "N2VL9VWr1RJVJWletSecp", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 176.838213780585, + "y": -625.9942210500329, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 153.9715576171875, + "height": 55.16192626953125, + "seed": 1112263101, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "3RHkP1C3vGUtjVxEUuF2M" + }, + { + "id": "2jzty2-Y1IOu3UqDjZYFl", + "type": "arrow" + } + ], + "updated": 1716911537217, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 79, + "versionNonce": 1503767679, + "isDeleted": false, + "id": "3RHkP1C3vGUtjVxEUuF2M", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 225.90402493781156, + "y": -610.9132579152673, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 55.839935302734375, + "height": 25, + "seed": 2123614557, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537217, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Party", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "N2VL9VWr1RJVJWletSecp", + "originalText": "Party", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "rectangle", + "version": 129, + "versionNonce": 1274846961, + "isDeleted": false, + "id": "G4mGvFSa0KV1_716lo3KC", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 694.9287594348818, + "y": -627.5275767629236, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 153.9715576171875, + "height": 55.16192626953125, + "seed": 143599901, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "aA_jwcquAzPx9smFHAecB" + }, + { + "id": "2jzty2-Y1IOu3UqDjZYFl", + "type": "arrow" + } + ], + "updated": 1716911537217, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 102, + "versionNonce": 1993720991, + "isDeleted": false, + "id": "aA_jwcquAzPx9smFHAecB", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 743.9945705921084, + "y": -612.4466136281579, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 55.839935302734375, + "height": 25, + "seed": 442891645, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537217, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Party", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "G4mGvFSa0KV1_716lo3KC", + "originalText": "Party", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "arrow", + "version": 245, + "versionNonce": 1573755089, + "isDeleted": false, + "id": "2jzty2-Y1IOu3UqDjZYFl", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 334.09538541144434, + "y": -600.7919132222376, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 357.31451416015625, + "height": 0.17523091083705822, + "seed": 1128951965, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "type": "text", + "id": "WMmVcXH9Y9F-5d0MIGwtc" + } + ], + "updated": 1716911537217, + "link": null, + "locked": false, + "startBinding": { + "elementId": "N2VL9VWr1RJVJWletSecp", + "focus": -0.0875500914285862, + "gap": 3.285614013671889 + }, + "endBinding": { + "elementId": "G4mGvFSa0KV1_716lo3KC", + "focus": 0.022831919297932268, + "gap": 3.51885986328125 + }, + "lastCommittedPoint": null, + "startArrowhead": "dot", + "endArrowhead": "dot", + "points": [ + [ + 0, + 0 + ], + [ + 357.31451416015625, + 0.17523091083705822 + ] + ] + }, + { + "type": "text", + "version": 120, + "versionNonce": 1645336767, + "isDeleted": false, + "id": "WMmVcXH9Y9F-5d0MIGwtc", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 416.98456845587793, + "y": -659.8466227834314, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 249.35971069335938, + "height": 100, + "seed": 753483283, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537218, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "mechanism enable to gear\nprocess of interchange \nresources in case of \nvalue diff", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "2jzty2-Y1IOu3UqDjZYFl", + "originalText": "mechanism enable to gear\nprocess of interchange resources in case of value diff", + "lineHeight": 1.25, + "baseline": 93 + }, + { + "type": "rectangle", + "version": 190, + "versionNonce": 1663325873, + "isDeleted": false, + "id": "FNw5Mqyy9Cb-Jy_HfOVuj", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 208.27116157518083, + "y": -2022.5578919077798, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "width": 153.9715576171875, + "height": 55.16192626953125, + "seed": 336622746, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "ITUqUYVRzICkZZJ5QZ-ua" + }, + { + "id": "rWEi4w9zAbqwO5iV-QE0X", + "type": "arrow" + }, + { + "id": "8T6CmbSKpxlGt-aJuIfio", + "type": "arrow" + } + ], + "updated": 1716911537218, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 169, + "versionNonce": 284584159, + "isDeleted": false, + "id": "ITUqUYVRzICkZZJ5QZ-ua", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 231.72699501023942, + "y": -2007.4769287730142, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "width": 107.05989074707031, + "height": 25, + "seed": 772460890, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537218, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Участник А", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "FNw5Mqyy9Cb-Jy_HfOVuj", + "originalText": "Участник А", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "rectangle", + "version": 236, + "versionNonce": 1856526481, + "isDeleted": false, + "id": "IYtZNBK3Ksk7G-wKyOep_", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 575.3458787789571, + "y": -2022.5578919077798, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "width": 153.9715576171875, + "height": 55.16192626953125, + "seed": 2048628250, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "4GImNkYQtKY7R6iL_i6QS" + }, + { + "id": "rWEi4w9zAbqwO5iV-QE0X", + "type": "arrow" + }, + { + "id": "e6hh35w7ILE651g4hhCnw", + "type": "arrow" + } + ], + "updated": 1716911537218, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 217, + "versionNonce": 1897133311, + "isDeleted": false, + "id": "4GImNkYQtKY7R6iL_i6QS", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 600.0517122140157, + "y": -2007.4769287730142, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "width": 104.55989074707031, + "height": 25, + "seed": 959824602, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537218, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Участник Б", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "IYtZNBK3Ksk7G-wKyOep_", + "originalText": "Участник Б", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "arrow", + "version": 564, + "versionNonce": 1376853617, + "isDeleted": false, + "id": "rWEi4w9zAbqwO5iV-QE0X", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 365.5283332060402, + "y": -1993.4610060978093, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "width": 206.2986857096355, + "height": 1.5528904222516076, + "seed": 367810458, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "type": "text", + "id": "nobV_VWu1Nh4VEtatf-v3" + } + ], + "updated": 1716911537218, + "link": null, + "locked": false, + "startBinding": { + "elementId": "FNw5Mqyy9Cb-Jy_HfOVuj", + "focus": 0.07528841085738458, + "gap": 3.285614013671875 + }, + "endBinding": { + "elementId": "IYtZNBK3Ksk7G-wKyOep_", + "focus": 0.022831919297924025, + "gap": 3.5188598632813637 + }, + "lastCommittedPoint": null, + "startArrowhead": "dot", + "endArrowhead": "dot", + "points": [ + [ + 0, + 0 + ], + [ + 206.2986857096355, + -1.5528904222516076 + ] + ] + }, + { + "type": "text", + "version": 148, + "versionNonce": 1777007903, + "isDeleted": false, + "id": "nobV_VWu1Nh4VEtatf-v3", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 582.8516923775898, + "y": -1003.8456511196835, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "width": 95.99990844726562, + "height": 50, + "seed": 1886540890, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537218, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "отношение\nобмена", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "rWEi4w9zAbqwO5iV-QE0X", + "originalText": "отношение\nобмена", + "lineHeight": 1.25, + "baseline": 43 + }, + { + "type": "rectangle", + "version": 348, + "versionNonce": 1009133649, + "isDeleted": false, + "id": "PXWNebyQMbJj664mf861C", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 208.27116157518083, + "y": -1842.521336935449, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "width": 153.9715576171875, + "height": 55.16192626953125, + "seed": 1704056262, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "uu85wxlsOCaXMBtpq9zjE" + }, + { + "id": "8T6CmbSKpxlGt-aJuIfio", + "type": "arrow" + } + ], + "updated": 1716911537218, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 340, + "versionNonce": 518783295, + "isDeleted": false, + "id": "uu85wxlsOCaXMBtpq9zjE", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 231.01699592576676, + "y": -1827.4403738006833, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "width": 108.47988891601562, + "height": 25, + "seed": 1235168518, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537218, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Участник В", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "PXWNebyQMbJj664mf861C", + "originalText": "Участник В", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "rectangle", + "version": 480, + "versionNonce": 381613617, + "isDeleted": false, + "id": "eN02jM7EwOMM6MjsHETeC", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 575.3458787789571, + "y": -1842.521336935449, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 153.9715576171875, + "height": 55.16192626953125, + "seed": 768495706, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "_13YjIlPLA9l0yQuQATzd" + }, + { + "id": "e6hh35w7ILE651g4hhCnw", + "type": "arrow" + } + ], + "updated": 1716911537218, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 474, + "versionNonce": 1903657311, + "isDeleted": false, + "id": "_13YjIlPLA9l0yQuQATzd", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 599.8717119088399, + "y": -1827.4403738006833, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 104.91989135742188, + "height": 25, + "seed": 1394029850, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537218, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Участник Г", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "eN02jM7EwOMM6MjsHETeC", + "originalText": "Участник Г", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "arrow", + "version": 660, + "versionNonce": 616761361, + "isDeleted": false, + "id": "8T6CmbSKpxlGt-aJuIfio", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 290.3214432864542, + "y": -1957.111133441896, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "width": 1.8216398252296813, + "height": 107.05025899181078, + "seed": 564393798, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "type": "text", + "id": "C_awkQgVCHBJar6w6Xutm" + } + ], + "updated": 1716911537218, + "link": null, + "locked": false, + "startBinding": { + "elementId": "FNw5Mqyy9Cb-Jy_HfOVuj", + "focus": -0.05706728125249492, + "gap": 10.284832196352454 + }, + "endBinding": { + "elementId": "PXWNebyQMbJj664mf861C", + "focus": 0.09662082320974051, + "gap": 7.539537514636322 + }, + "lastCommittedPoint": null, + "startArrowhead": "dot", + "endArrowhead": "dot", + "points": [ + [ + 0, + 0 + ], + [ + 1.8216398252296813, + 107.05025899181078 + ] + ] + }, + { + "type": "text", + "version": 151, + "versionNonce": 1121844607, + "isDeleted": false, + "id": "C_awkQgVCHBJar6w6Xutm", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 521.5307597900415, + "y": -1010.6972049144156, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "width": 95.99990844726562, + "height": 50, + "seed": 1374756486, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537218, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "отношение\nобмена", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "8T6CmbSKpxlGt-aJuIfio", + "originalText": "отношение\nобмена", + "lineHeight": 1.25, + "baseline": 43 + }, + { + "type": "arrow", + "version": 845, + "versionNonce": 1613356529, + "isDeleted": false, + "id": "e6hh35w7ILE651g4hhCnw", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 650.578289902891, + "y": -1963.6159989329308, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 5.341870471255902, + "height": 113.42796481323683, + "seed": 1939369882, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "type": "text", + "id": "HddUv93OCkgk-KnjRG2H3" + } + ], + "updated": 1716911537218, + "link": null, + "locked": false, + "startBinding": { + "elementId": "IYtZNBK3Ksk7G-wKyOep_", + "focus": 0.04126355846283088, + "gap": 3.7799667053177473 + }, + "endBinding": { + "elementId": "eN02jM7EwOMM6MjsHETeC", + "focus": 0.0670435642237471, + "gap": 7.6666971842448675 + }, + "lastCommittedPoint": null, + "startArrowhead": "dot", + "endArrowhead": "dot", + "points": [ + [ + 0, + 0 + ], + [ + 5.341870471255902, + 113.42796481323683 + ] + ] + }, + { + "type": "text", + "version": 153, + "versionNonce": 1986000287, + "isDeleted": false, + "id": "HddUv93OCkgk-KnjRG2H3", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 432.08771224261636, + "y": -802.3923780226381, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 95.99990844726562, + "height": 50, + "seed": 1893428314, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537218, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "отношение\nобмена", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "e6hh35w7ILE651g4hhCnw", + "originalText": "отношение\nобмена", + "lineHeight": 1.25, + "baseline": 43 + }, + { + "type": "rectangle", + "version": 204, + "versionNonce": 402323409, + "isDeleted": false, + "id": "-2h2OmZADNoJNoZbtItha", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1007.5887885283055, + "y": -2021.096311764351, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 153.9715576171875, + "height": 55.16192626953125, + "seed": 910300314, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "Z3myfU96pdRrhy0xK4Pqh" + }, + { + "id": "-_DxBwhIPvn1n5w3BjHLC", + "type": "arrow" + }, + { + "id": "lypuGW_xQ53aJ5qv7cKau", + "type": "arrow" + } + ], + "updated": 1716911537218, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 183, + "versionNonce": 858646975, + "isDeleted": false, + "id": "Z3myfU96pdRrhy0xK4Pqh", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1031.044621963364, + "y": -2006.0153486295853, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 107.05989074707031, + "height": 25, + "seed": 1493725530, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537218, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Участник А", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "-2h2OmZADNoJNoZbtItha", + "originalText": "Участник А", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "rectangle", + "version": 250, + "versionNonce": 1313723825, + "isDeleted": false, + "id": "aWX2TTqtxgdOrv6guCFRN", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1374.6635057320814, + "y": -2021.096311764351, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 153.9715576171875, + "height": 55.16192626953125, + "seed": 879048218, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "h5fbekpd1nBcvFZ7v8wQN" + }, + { + "id": "-_DxBwhIPvn1n5w3BjHLC", + "type": "arrow" + }, + { + "id": "DsR199mhwuXiwriz8tXsC", + "type": "arrow" + } + ], + "updated": 1716911537218, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 231, + "versionNonce": 1718114783, + "isDeleted": false, + "id": "h5fbekpd1nBcvFZ7v8wQN", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1399.36933916714, + "y": -2006.0153486295853, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 104.55989074707031, + "height": 25, + "seed": 961241818, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537218, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Участник Б", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "aWX2TTqtxgdOrv6guCFRN", + "originalText": "Участник Б", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "arrow", + "version": 614, + "versionNonce": 1447688081, + "isDeleted": false, + "id": "-_DxBwhIPvn1n5w3BjHLC", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1164.8459601591649, + "y": -1991.9994259543805, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 206.2986857096355, + "height": 1.5528904222516076, + "seed": 1112405914, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "type": "text", + "id": "mg6nwWWzlausuL4YaJSu7" + } + ], + "updated": 1716911537218, + "link": null, + "locked": false, + "startBinding": { + "elementId": "-2h2OmZADNoJNoZbtItha", + "focus": 0.07528841085738458, + "gap": 3.285614013671875 + }, + "endBinding": { + "elementId": "aWX2TTqtxgdOrv6guCFRN", + "focus": 0.022831919297923935, + "gap": 3.5188598632810226 + }, + "lastCommittedPoint": null, + "startArrowhead": "dot", + "endArrowhead": "dot", + "points": [ + [ + 0, + 0 + ], + [ + 206.2986857096355, + -1.5528904222516076 + ] + ] + }, + { + "type": "text", + "version": 151, + "versionNonce": 85968383, + "isDeleted": false, + "id": "mg6nwWWzlausuL4YaJSu7", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1367.613553542954, + "y": -1007.9980645655721, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 95.99990844726562, + "height": 50, + "seed": 1604318298, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537218, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "отношение\nобмена", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "-_DxBwhIPvn1n5w3BjHLC", + "originalText": "отношение\nобмена", + "lineHeight": 1.25, + "baseline": 43 + }, + { + "type": "rectangle", + "version": 361, + "versionNonce": 841407857, + "isDeleted": false, + "id": "2MutPHG7bS1YRnyneRJrE", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1007.5887885283055, + "y": -1841.0597567920204, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 153.9715576171875, + "height": 55.16192626953125, + "seed": 588536090, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "oBxju98Cg8yo0ob5DSmOd" + }, + { + "id": "lypuGW_xQ53aJ5qv7cKau", + "type": "arrow" + } + ], + "updated": 1716911537218, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 353, + "versionNonce": 240430623, + "isDeleted": false, + "id": "oBxju98Cg8yo0ob5DSmOd", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1030.3346228788914, + "y": -1825.9787936572548, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 108.47988891601562, + "height": 25, + "seed": 1813915098, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537218, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Участник В", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "2MutPHG7bS1YRnyneRJrE", + "originalText": "Участник В", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "rectangle", + "version": 495, + "versionNonce": 824969041, + "isDeleted": false, + "id": "Q7xMWp9xn6XGvCMS940B1", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1374.6635057320814, + "y": -1841.0597567920204, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 153.9715576171875, + "height": 55.16192626953125, + "seed": 869292698, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "nSeko5iOz7B_2taUKsQP1" + }, + { + "id": "DsR199mhwuXiwriz8tXsC", + "type": "arrow" + } + ], + "updated": 1716911537218, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 489, + "versionNonce": 1291293247, + "isDeleted": false, + "id": "nSeko5iOz7B_2taUKsQP1", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1399.1893388619642, + "y": -1825.9787936572548, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 104.91989135742188, + "height": 25, + "seed": 1490941786, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537218, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Участник Г", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "Q7xMWp9xn6XGvCMS940B1", + "originalText": "Участник Г", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "arrow", + "version": 709, + "versionNonce": 1303442737, + "isDeleted": false, + "id": "lypuGW_xQ53aJ5qv7cKau", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1089.6390702395788, + "y": -1955.6495532984673, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 1.8216398252296813, + "height": 107.05025899181078, + "seed": 1805253658, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "type": "text", + "id": "8KYtz8Run97dIATzqPBem" + } + ], + "updated": 1716911537218, + "link": null, + "locked": false, + "startBinding": { + "elementId": "-2h2OmZADNoJNoZbtItha", + "focus": -0.05706728125249365, + "gap": 10.284832196352454 + }, + "endBinding": { + "elementId": "2MutPHG7bS1YRnyneRJrE", + "focus": 0.09662082320974164, + "gap": 7.539537514636095 + }, + "lastCommittedPoint": null, + "startArrowhead": "dot", + "endArrowhead": "dot", + "points": [ + [ + 0, + 0 + ], + [ + 1.8216398252296813, + 107.05025899181078 + ] + ] + }, + { + "type": "text", + "version": 153, + "versionNonce": 1508438623, + "isDeleted": false, + "id": "8KYtz8Run97dIATzqPBem", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1190.168140681165, + "y": -917.3466172026277, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 95.99990844726562, + "height": 50, + "seed": 2046257370, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537218, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "отношение\nобмена", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "lypuGW_xQ53aJ5qv7cKau", + "originalText": "отношение\nобмена", + "lineHeight": 1.25, + "baseline": 43 + }, + { + "type": "arrow", + "version": 896, + "versionNonce": 1260201745, + "isDeleted": false, + "id": "DsR199mhwuXiwriz8tXsC", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1449.8959168560154, + "y": -1962.1544187895022, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 5.341870471255902, + "height": 113.42796481323683, + "seed": 1535720858, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "type": "text", + "id": "Va2LrgNv3BV5U8Scde4M_" + } + ], + "updated": 1716911537218, + "link": null, + "locked": false, + "startBinding": { + "elementId": "aWX2TTqtxgdOrv6guCFRN", + "focus": 0.041263558462828934, + "gap": 3.77996670531752 + }, + "endBinding": { + "elementId": "Q7xMWp9xn6XGvCMS940B1", + "focus": 0.06704356422374688, + "gap": 7.666697184245095 + }, + "lastCommittedPoint": null, + "startArrowhead": "dot", + "endArrowhead": "dot", + "points": [ + [ + 0, + 0 + ], + [ + 5.341870471255902, + 113.42796481323683 + ] + ] + }, + { + "type": "text", + "version": 157, + "versionNonce": 1576619647, + "isDeleted": false, + "id": "Va2LrgNv3BV5U8Scde4M_", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1552.1851026206145, + "y": -920.6626297829496, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 95.99990844726562, + "height": 50, + "seed": 2105703002, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537218, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "отношение\nобмена", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "DsR199mhwuXiwriz8tXsC", + "originalText": "отношение\nобмена", + "lineHeight": 1.25, + "baseline": 43 + }, + { + "type": "rectangle", + "version": 208, + "versionNonce": 333978865, + "isDeleted": false, + "id": "AlAUDeFTlyC-b_WCgMP8T", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 224.1595282743997, + "y": -1583.7947014534786, + "strokeColor": "#c2255c", + "backgroundColor": "transparent", + "width": 153.9715576171875, + "height": 55.16192626953125, + "seed": 286623322, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "Bg5Qq-O1iJTH0kpwGOKQg" + }, + { + "id": "vGOiwvIaBJ3GptQCD_ooO", + "type": "arrow" + }, + { + "id": "RCFLLXEW0HydbCaVRsXuw", + "type": "arrow" + } + ], + "updated": 1716911537218, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 187, + "versionNonce": 334046879, + "isDeleted": false, + "id": "Bg5Qq-O1iJTH0kpwGOKQg", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 247.61536170945828, + "y": -1568.713738318713, + "strokeColor": "#c2255c", + "backgroundColor": "transparent", + "width": 107.05989074707031, + "height": 25, + "seed": 1946659610, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537218, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Участник А", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "AlAUDeFTlyC-b_WCgMP8T", + "originalText": "Участник А", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "rectangle", + "version": 253, + "versionNonce": 1469667025, + "isDeleted": false, + "id": "ooJFYbb-ah58IKWNd2wun", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 591.234245478176, + "y": -1583.7947014534786, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 153.9715576171875, + "height": 55.16192626953125, + "seed": 651638746, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "-MK9BEvvaLcQ32R3s_FCD" + }, + { + "id": "vGOiwvIaBJ3GptQCD_ooO", + "type": "arrow" + }, + { + "id": "6tkjQpp0DrhvE6773WDkH", + "type": "arrow" + } + ], + "updated": 1716911537218, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 234, + "versionNonce": 174652095, + "isDeleted": false, + "id": "-MK9BEvvaLcQ32R3s_FCD", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 615.9400789132346, + "y": -1568.713738318713, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 104.55989074707031, + "height": 25, + "seed": 429337754, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537218, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Участник Б", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "ooJFYbb-ah58IKWNd2wun", + "originalText": "Участник Б", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "arrow", + "version": 629, + "versionNonce": 1757959345, + "isDeleted": false, + "id": "vGOiwvIaBJ3GptQCD_ooO", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 381.41669990525907, + "y": -1554.6978156435082, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 206.2986857096355, + "height": 1.5528904222516076, + "seed": 1106938202, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "type": "text", + "id": "qSr1IsZkqI9NygKySrY2q" + } + ], + "updated": 1716911537218, + "link": null, + "locked": false, + "startBinding": { + "elementId": "AlAUDeFTlyC-b_WCgMP8T", + "focus": 0.0752884108573875, + "gap": 3.285614013671875 + }, + "endBinding": { + "elementId": "ooJFYbb-ah58IKWNd2wun", + "focus": 0.022831919297935207, + "gap": 3.5188598632814774 + }, + "lastCommittedPoint": null, + "startArrowhead": "dot", + "endArrowhead": "dot", + "points": [ + [ + 0, + 0 + ], + [ + 206.2986857096355, + -1.5528904222516076 + ] + ] + }, + { + "type": "text", + "version": 150, + "versionNonce": 639191775, + "isDeleted": false, + "id": "qSr1IsZkqI9NygKySrY2q", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2040.946886876287, + "y": -1037.9980645655721, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 95.99990844726562, + "height": 50, + "seed": 1733578266, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537218, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "отношение\nобмена", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "vGOiwvIaBJ3GptQCD_ooO", + "originalText": "отношение\nобмена", + "lineHeight": 1.25, + "baseline": 43 + }, + { + "type": "rectangle", + "version": 366, + "versionNonce": 1528600209, + "isDeleted": false, + "id": "t_pQAiEJhlGYUN7gNKlxQ", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 224.1595282743997, + "y": -1403.758146481148, + "strokeColor": "#c2255c", + "backgroundColor": "transparent", + "width": 153.9715576171875, + "height": 55.16192626953125, + "seed": 1855421146, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "gEtYTeVRFk5ZDV0cDXESD" + }, + { + "id": "RCFLLXEW0HydbCaVRsXuw", + "type": "arrow" + } + ], + "updated": 1716911537218, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 358, + "versionNonce": 1670027007, + "isDeleted": false, + "id": "gEtYTeVRFk5ZDV0cDXESD", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 246.90536262498563, + "y": -1388.6771833463824, + "strokeColor": "#c2255c", + "backgroundColor": "transparent", + "width": 108.47988891601562, + "height": 25, + "seed": 643239834, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537218, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Участник В", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "t_pQAiEJhlGYUN7gNKlxQ", + "originalText": "Участник В", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "rectangle", + "version": 498, + "versionNonce": 1632476273, + "isDeleted": false, + "id": "q2UjTqlExmFdIOW8D3oK1", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 591.234245478176, + "y": -1403.758146481148, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 153.9715576171875, + "height": 55.16192626953125, + "seed": 314969178, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "bAfrAEmjC4uT8rRlNvy6F" + }, + { + "id": "6tkjQpp0DrhvE6773WDkH", + "type": "arrow" + } + ], + "updated": 1716911537218, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 492, + "versionNonce": 1497194271, + "isDeleted": false, + "id": "bAfrAEmjC4uT8rRlNvy6F", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 615.7600786080588, + "y": -1388.6771833463824, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 104.91989135742188, + "height": 25, + "seed": 968323354, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537218, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Участник Г", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "q2UjTqlExmFdIOW8D3oK1", + "originalText": "Участник Г", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "arrow", + "version": 726, + "versionNonce": 1797449297, + "isDeleted": false, + "id": "RCFLLXEW0HydbCaVRsXuw", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 306.209809985673, + "y": -1518.347942987595, + "strokeColor": "#c2255c", + "backgroundColor": "transparent", + "width": 1.8216398252296813, + "height": 107.05025899181078, + "seed": 1855864282, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "type": "text", + "id": "lOZ8MGjNGwS2ywiLnYmv7" + } + ], + "updated": 1716911537218, + "link": null, + "locked": false, + "startBinding": { + "elementId": "AlAUDeFTlyC-b_WCgMP8T", + "focus": -0.0570672812524942, + "gap": 10.284832196352454 + }, + "endBinding": { + "elementId": "t_pQAiEJhlGYUN7gNKlxQ", + "focus": 0.09662082320973972, + "gap": 7.539537514636095 + }, + "lastCommittedPoint": null, + "startArrowhead": "dot", + "endArrowhead": "dot", + "points": [ + [ + 0, + 0 + ], + [ + 1.8216398252296813, + 107.05025899181078 + ] + ] + }, + { + "type": "text", + "version": 154, + "versionNonce": 2040668991, + "isDeleted": false, + "id": "lOZ8MGjNGwS2ywiLnYmv7", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1863.501474014498, + "y": -947.3466172026277, + "strokeColor": "#c2255c", + "backgroundColor": "transparent", + "width": 95.99990844726562, + "height": 50, + "seed": 512586394, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537218, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "отношение\nобмена", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "RCFLLXEW0HydbCaVRsXuw", + "originalText": "отношение\nобмена", + "lineHeight": 1.25, + "baseline": 43 + }, + { + "type": "arrow", + "version": 911, + "versionNonce": 57930801, + "isDeleted": false, + "id": "6tkjQpp0DrhvE6773WDkH", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 666.4666566021101, + "y": -1524.8528084786299, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 5.341870471255902, + "height": 113.42796481323683, + "seed": 473435994, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "type": "text", + "id": "sKlXtUIWqdgaWZmRB8S9r" + } + ], + "updated": 1716911537218, + "link": null, + "locked": false, + "startBinding": { + "elementId": "ooJFYbb-ah58IKWNd2wun", + "focus": 0.04126355846282929, + "gap": 3.77996670531752 + }, + "endBinding": { + "elementId": "q2UjTqlExmFdIOW8D3oK1", + "focus": 0.06704356422374856, + "gap": 7.6666971842448675 + }, + "lastCommittedPoint": null, + "startArrowhead": "dot", + "endArrowhead": "dot", + "points": [ + [ + 0, + 0 + ], + [ + 5.341870471255902, + 113.42796481323683 + ] + ] + }, + { + "type": "text", + "version": 156, + "versionNonce": 353985375, + "isDeleted": false, + "id": "sKlXtUIWqdgaWZmRB8S9r", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2225.518435953948, + "y": -950.6626297829496, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 95.99990844726562, + "height": 50, + "seed": 1810961434, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537218, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "отношение\nобмена", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "6tkjQpp0DrhvE6773WDkH", + "originalText": "отношение\nобмена", + "lineHeight": 1.25, + "baseline": 43 + }, + { + "type": "rectangle", + "version": 224, + "versionNonce": 1848133137, + "isDeleted": false, + "id": "YQRMpIaa4cPLrHQ79qxEg", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1027.429893671534, + "y": -1586.8104993864217, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 153.9715576171875, + "height": 55.16192626953125, + "seed": 1647878170, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "6Ugm5vcCHtuNlQsDWgz2f" + }, + { + "id": "2KvUAfAbJz_7UdAmaz9Hz", + "type": "arrow" + }, + { + "id": "vyiSI2xoIyKiXPC4q-S2M", + "type": "arrow" + } + ], + "updated": 1716911537218, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 203, + "versionNonce": 468950911, + "isDeleted": false, + "id": "6Ugm5vcCHtuNlQsDWgz2f", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1050.8857271065926, + "y": -1571.729536251656, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 107.05989074707031, + "height": 25, + "seed": 1830915290, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537218, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Участник А", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "YQRMpIaa4cPLrHQ79qxEg", + "originalText": "Участник А", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "rectangle", + "version": 271, + "versionNonce": 104291313, + "isDeleted": false, + "id": "o_OMqcLjdQhA_3Ochsquz", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1394.5046108753104, + "y": -1586.8104993864217, + "strokeColor": "#6741d9", + "backgroundColor": "transparent", + "width": 153.9715576171875, + "height": 55.16192626953125, + "seed": 768532890, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "ozECwttQKqsRFPtkU97g5" + }, + { + "id": "2KvUAfAbJz_7UdAmaz9Hz", + "type": "arrow" + }, + { + "id": "ysRRiM16izdL09INAfgjl", + "type": "arrow" + } + ], + "updated": 1716911537218, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 252, + "versionNonce": 544298911, + "isDeleted": false, + "id": "ozECwttQKqsRFPtkU97g5", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1419.210444310369, + "y": -1571.729536251656, + "strokeColor": "#6741d9", + "backgroundColor": "transparent", + "width": 104.55989074707031, + "height": 25, + "seed": 1064541786, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537218, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Участник Б", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "o_OMqcLjdQhA_3Ochsquz", + "originalText": "Участник Б", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "arrow", + "version": 688, + "versionNonce": 1537783249, + "isDeleted": false, + "id": "2KvUAfAbJz_7UdAmaz9Hz", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1184.6870653023934, + "y": -1557.7136135764513, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 206.2986857096355, + "height": 1.5528904222516076, + "seed": 1591919386, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "type": "text", + "id": "P_gjKt3XuPZ1yA9F94CDU" + } + ], + "updated": 1716911537218, + "link": null, + "locked": false, + "startBinding": { + "elementId": "YQRMpIaa4cPLrHQ79qxEg", + "focus": 0.07528841085738458, + "gap": 3.285614013671875 + }, + "endBinding": { + "elementId": "o_OMqcLjdQhA_3Ochsquz", + "focus": 0.022831919297924056, + "gap": 3.5188598632814774 + }, + "lastCommittedPoint": null, + "startArrowhead": "dot", + "endArrowhead": "dot", + "points": [ + [ + 0, + 0 + ], + [ + 206.2986857096355, + -1.5528904222516076 + ] + ] + }, + { + "type": "text", + "version": 150, + "versionNonce": 415435711, + "isDeleted": false, + "id": "P_gjKt3XuPZ1yA9F94CDU", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2677.613553542953, + "y": -1061.3313978989056, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 95.99990844726562, + "height": 50, + "seed": 915361754, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537218, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "отношение\nобмена", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "2KvUAfAbJz_7UdAmaz9Hz", + "originalText": "отношение\nобмена", + "lineHeight": 1.25, + "baseline": 43 + }, + { + "type": "rectangle", + "version": 382, + "versionNonce": 294900657, + "isDeleted": false, + "id": "TMIEXSZFEhT6HQXnthnTm", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1027.429893671534, + "y": -1406.773944414091, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 153.9715576171875, + "height": 55.16192626953125, + "seed": 713835674, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "GldPi_dchNihCnnml7Zu3" + }, + { + "id": "vyiSI2xoIyKiXPC4q-S2M", + "type": "arrow" + } + ], + "updated": 1716911537218, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 374, + "versionNonce": 1627995103, + "isDeleted": false, + "id": "GldPi_dchNihCnnml7Zu3", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1050.17572802212, + "y": -1391.6929812793253, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 108.47988891601562, + "height": 25, + "seed": 613196122, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537218, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Участник В", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "TMIEXSZFEhT6HQXnthnTm", + "originalText": "Участник В", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "rectangle", + "version": 516, + "versionNonce": 2082485649, + "isDeleted": false, + "id": "sB9MsQ8xWDlxwf0J7oPWo", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1394.5046108753104, + "y": -1406.773944414091, + "strokeColor": "#6741d9", + "backgroundColor": "transparent", + "width": 153.9715576171875, + "height": 55.16192626953125, + "seed": 1608738330, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "jgvzUmNQJsItWcJAHomvQ" + }, + { + "id": "ysRRiM16izdL09INAfgjl", + "type": "arrow" + } + ], + "updated": 1716911537219, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 510, + "versionNonce": 2102683647, + "isDeleted": false, + "id": "jgvzUmNQJsItWcJAHomvQ", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1419.0304440051932, + "y": -1391.6929812793253, + "strokeColor": "#6741d9", + "backgroundColor": "transparent", + "width": 104.91989135742188, + "height": 25, + "seed": 897815258, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537219, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Участник Г", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "sB9MsQ8xWDlxwf0J7oPWo", + "originalText": "Участник Г", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "arrow", + "version": 784, + "versionNonce": 2122668913, + "isDeleted": false, + "id": "vyiSI2xoIyKiXPC4q-S2M", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1109.4801753828074, + "y": -1521.363740920538, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 1.8216398252296813, + "height": 107.05025899181078, + "seed": 1744840602, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "type": "text", + "id": "y1WJIeeAMsZfPiRjg-FfF" + } + ], + "updated": 1716911537219, + "link": null, + "locked": false, + "startBinding": { + "elementId": "YQRMpIaa4cPLrHQ79qxEg", + "focus": -0.05706728125249365, + "gap": 10.284832196352454 + }, + "endBinding": { + "elementId": "TMIEXSZFEhT6HQXnthnTm", + "focus": 0.09662082320974168, + "gap": 7.539537514636322 + }, + "lastCommittedPoint": null, + "startArrowhead": "dot", + "endArrowhead": "dot", + "points": [ + [ + 0, + 0 + ], + [ + 1.8216398252296813, + 107.05025899181078 + ] + ] + }, + { + "type": "text", + "version": 153, + "versionNonce": 463802399, + "isDeleted": false, + "id": "y1WJIeeAMsZfPiRjg-FfF", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2500.168140681164, + "y": -970.6799505359612, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 95.99990844726562, + "height": 50, + "seed": 1871455322, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537219, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "отношение\nобмена", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "vyiSI2xoIyKiXPC4q-S2M", + "originalText": "отношение\nобмена", + "lineHeight": 1.25, + "baseline": 43 + }, + { + "type": "arrow", + "version": 971, + "versionNonce": 688571729, + "isDeleted": false, + "id": "ysRRiM16izdL09INAfgjl", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1469.7370219992445, + "y": -1527.8686064115727, + "strokeColor": "#6741d9", + "backgroundColor": "transparent", + "width": 5.341870471255902, + "height": 113.42796481323683, + "seed": 1174047002, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "type": "text", + "id": "sgrEmh0TNePva6wTW4dKV" + } + ], + "updated": 1716911537219, + "link": null, + "locked": false, + "startBinding": { + "elementId": "o_OMqcLjdQhA_3Ochsquz", + "focus": 0.04126355846282904, + "gap": 3.7799667053177473 + }, + "endBinding": { + "elementId": "sB9MsQ8xWDlxwf0J7oPWo", + "focus": 0.06704356422374669, + "gap": 7.6666971842448675 + }, + "lastCommittedPoint": null, + "startArrowhead": "dot", + "endArrowhead": "dot", + "points": [ + [ + 0, + 0 + ], + [ + 5.341870471255902, + 113.42796481323683 + ] + ] + }, + { + "type": "text", + "version": 157, + "versionNonce": 1441510463, + "isDeleted": false, + "id": "sgrEmh0TNePva6wTW4dKV", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2862.185102620614, + "y": -973.9959631162828, + "strokeColor": "#6741d9", + "backgroundColor": "transparent", + "width": 95.99990844726562, + "height": 50, + "seed": 851334618, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537219, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "отношение\nобмена", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "ysRRiM16izdL09INAfgjl", + "originalText": "отношение\nобмена", + "lineHeight": 1.25, + "baseline": 43 + }, + { + "type": "text", + "version": 106, + "versionNonce": 386396977, + "isDeleted": false, + "id": "4FmgmZBODUnetW-YID4Fu", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 333.0960567981623, + "y": -2118.4006500864903, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "width": 277.45208740234375, + "height": 45, + "seed": 630677594, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537219, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": "БА Участника А", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "БА Участника А", + "lineHeight": 1.25, + "baseline": 30 + }, + { + "type": "text", + "version": 167, + "versionNonce": 872993887, + "isDeleted": false, + "id": "aDNJ8JRu9hp69YyWRx9cN", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1146.338905512355, + "y": -2119.88492336123, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 272.95208740234375, + "height": 45, + "seed": 1733357830, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537219, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": "БА Участника Б", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "БА Участника Б", + "lineHeight": 1.25, + "baseline": 30 + }, + { + "type": "text", + "version": 206, + "versionNonce": 216294673, + "isDeleted": false, + "id": "KsreOCFoNlh8Qda-nXTxB", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 374.3017961373555, + "y": -1677.6943461721028, + "strokeColor": "#c2255c", + "backgroundColor": "transparent", + "width": 280.00811767578125, + "height": 45, + "seed": 1814827334, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537219, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": "БА Участника В", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "БА Участника В", + "lineHeight": 1.25, + "baseline": 30 + }, + { + "type": "rectangle", + "version": 240, + "versionNonce": 1842147455, + "isDeleted": false, + "id": "84GP9YruCVauYBsxdvq9U", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 643.0481798043475, + "y": -1161.4287898366542, + "strokeColor": "#868e96", + "backgroundColor": "transparent", + "width": 153.9715576171875, + "height": 55.16192626953125, + "seed": 208286790, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "Jorm5WR8TrtwgwC6pc7Ql" + }, + { + "id": "tEmMBLuZeHo_0STO2p9ir", + "type": "arrow" + }, + { + "id": "rn6hiq-FHi7PxDKhxY6fr", + "type": "arrow" + } + ], + "updated": 1716911537219, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 219, + "versionNonce": 1444387569, + "isDeleted": false, + "id": "Jorm5WR8TrtwgwC6pc7Ql", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 666.504013239406, + "y": -1146.3478267018886, + "strokeColor": "#868e96", + "backgroundColor": "transparent", + "width": 107.05989074707031, + "height": 25, + "seed": 1659353990, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537219, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Участник А", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "84GP9YruCVauYBsxdvq9U", + "originalText": "Участник А", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "rectangle", + "version": 286, + "versionNonce": 1828227231, + "isDeleted": false, + "id": "hntyCuCNeJ-bl31MlRYj7", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1010.1228970081229, + "y": -1161.4287898366542, + "strokeColor": "#868e96", + "backgroundColor": "transparent", + "width": 153.9715576171875, + "height": 55.16192626953125, + "seed": 1991400134, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "FL97V08uOJWKLvwGwbeG0" + }, + { + "id": "tEmMBLuZeHo_0STO2p9ir", + "type": "arrow" + }, + { + "id": "iA6uGzoTSkebRQUy4vzQr", + "type": "arrow" + } + ], + "updated": 1716911537219, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 267, + "versionNonce": 1663636689, + "isDeleted": false, + "id": "FL97V08uOJWKLvwGwbeG0", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1034.8287304431815, + "y": -1146.3478267018886, + "strokeColor": "#868e96", + "backgroundColor": "transparent", + "width": 104.55989074707031, + "height": 25, + "seed": 1315377670, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537219, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Участник Б", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "hntyCuCNeJ-bl31MlRYj7", + "originalText": "Участник Б", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "arrow", + "version": 720, + "versionNonce": 255597759, + "isDeleted": false, + "id": "tEmMBLuZeHo_0STO2p9ir", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 800.3053514352068, + "y": -1132.3319040266838, + "strokeColor": "#868e96", + "backgroundColor": "transparent", + "width": 206.2986857096355, + "height": 1.5528904222516076, + "seed": 352510278, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "type": "text", + "id": "Z-A0aBOGlaFKrtHwDqGyc" + } + ], + "updated": 1716911537219, + "link": null, + "locked": false, + "startBinding": { + "elementId": "84GP9YruCVauYBsxdvq9U", + "focus": 0.07528841085738458, + "gap": 3.285614013671875 + }, + "endBinding": { + "elementId": "hntyCuCNeJ-bl31MlRYj7", + "focus": 0.02283191929792381, + "gap": 3.518859863280568 + }, + "lastCommittedPoint": null, + "startArrowhead": "dot", + "endArrowhead": "dot", + "points": [ + [ + 0, + 0 + ], + [ + 206.2986857096355, + -1.5528904222516076 + ] + ] + }, + { + "type": "text", + "version": 157, + "versionNonce": 665866929, + "isDeleted": false, + "id": "Z-A0aBOGlaFKrtHwDqGyc", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3214.28022020962, + "y": -858.4255794624189, + "strokeColor": "#868e96", + "backgroundColor": "transparent", + "width": 95.99990844726562, + "height": 50, + "seed": 232966278, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537219, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "отношение\nобмена", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "tEmMBLuZeHo_0STO2p9ir", + "originalText": "отношение\nобмена", + "lineHeight": 1.25, + "baseline": 43 + }, + { + "type": "rectangle", + "version": 398, + "versionNonce": 674770143, + "isDeleted": false, + "id": "R-qd-gqdwy9D_zZAYVb0S", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 643.0481798043475, + "y": -981.3922348643234, + "strokeColor": "#868e96", + "backgroundColor": "transparent", + "width": 153.9715576171875, + "height": 55.16192626953125, + "seed": 147048390, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "-pnB2abzx142AbGuziCsh" + }, + { + "id": "rn6hiq-FHi7PxDKhxY6fr", + "type": "arrow" + } + ], + "updated": 1716911537219, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 390, + "versionNonce": 945083537, + "isDeleted": false, + "id": "-pnB2abzx142AbGuziCsh", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 665.7940141549334, + "y": -966.3112717295578, + "strokeColor": "#868e96", + "backgroundColor": "transparent", + "width": 108.47988891601562, + "height": 25, + "seed": 1438834438, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537219, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Участник В", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "R-qd-gqdwy9D_zZAYVb0S", + "originalText": "Участник В", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "rectangle", + "version": 531, + "versionNonce": 1132280063, + "isDeleted": false, + "id": "aKd71RSjQ3BVE51aCzfMO", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1010.1228970081229, + "y": -981.3922348643234, + "strokeColor": "#868e96", + "backgroundColor": "transparent", + "width": 153.9715576171875, + "height": 55.16192626953125, + "seed": 962399814, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "b-NNIBnoLilrLXxNZo3o1" + }, + { + "id": "iA6uGzoTSkebRQUy4vzQr", + "type": "arrow" + } + ], + "updated": 1716911537219, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 525, + "versionNonce": 684595825, + "isDeleted": false, + "id": "b-NNIBnoLilrLXxNZo3o1", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1034.6487301380057, + "y": -966.3112717295578, + "strokeColor": "#868e96", + "backgroundColor": "transparent", + "width": 104.91989135742188, + "height": 25, + "seed": 1617909126, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537219, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Участник Г", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "aKd71RSjQ3BVE51aCzfMO", + "originalText": "Участник Г", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "arrow", + "version": 816, + "versionNonce": 646693151, + "isDeleted": false, + "id": "rn6hiq-FHi7PxDKhxY6fr", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 725.0984615156203, + "y": -1095.9820313707705, + "strokeColor": "#868e96", + "backgroundColor": "transparent", + "width": 1.8216398252296813, + "height": 107.05025899181078, + "seed": 1412871366, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "type": "text", + "id": "8z2NJvbw94zsaFdQbTwFI" + } + ], + "updated": 1716911537219, + "link": null, + "locked": false, + "startBinding": { + "elementId": "84GP9YruCVauYBsxdvq9U", + "focus": -0.05706728125248831, + "gap": 10.284832196352454 + }, + "endBinding": { + "elementId": "R-qd-gqdwy9D_zZAYVb0S", + "focus": 0.09662082320973389, + "gap": 7.539537514636322 + }, + "lastCommittedPoint": null, + "startArrowhead": "dot", + "endArrowhead": "dot", + "points": [ + [ + 0, + 0 + ], + [ + 1.8216398252296813, + 107.05025899181078 + ] + ] + }, + { + "type": "text", + "version": 160, + "versionNonce": 702784593, + "isDeleted": false, + "id": "8z2NJvbw94zsaFdQbTwFI", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3036.8348073478305, + "y": -767.7741320994745, + "strokeColor": "#868e96", + "backgroundColor": "transparent", + "width": 95.99990844726562, + "height": 50, + "seed": 1850747910, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537219, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "отношение\nобмена", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "rn6hiq-FHi7PxDKhxY6fr", + "originalText": "отношение\nобмена", + "lineHeight": 1.25, + "baseline": 43 + }, + { + "type": "arrow", + "version": 1002, + "versionNonce": 315901247, + "isDeleted": false, + "id": "iA6uGzoTSkebRQUy4vzQr", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1085.355308132057, + "y": -1102.4868968618052, + "strokeColor": "#868e96", + "backgroundColor": "transparent", + "width": 5.341870471255902, + "height": 113.42796481323683, + "seed": 1287174982, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "type": "text", + "id": "3VcfpSoxmul3kBoNP-d97" + } + ], + "updated": 1716911537219, + "link": null, + "locked": false, + "startBinding": { + "elementId": "hntyCuCNeJ-bl31MlRYj7", + "focus": 0.04126355846282905, + "gap": 3.7799667053177473 + }, + "endBinding": { + "elementId": "aKd71RSjQ3BVE51aCzfMO", + "focus": 0.06704356422374678, + "gap": 7.666697184244981 + }, + "lastCommittedPoint": null, + "startArrowhead": "dot", + "endArrowhead": "dot", + "points": [ + [ + 0, + 0 + ], + [ + 5.341870471255902, + 113.42796481323683 + ] + ] + }, + { + "type": "text", + "version": 163, + "versionNonce": 1735193137, + "isDeleted": false, + "id": "3VcfpSoxmul3kBoNP-d97", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3398.85176928728, + "y": -771.0901446797961, + "strokeColor": "#868e96", + "backgroundColor": "transparent", + "width": 95.99990844726562, + "height": 50, + "seed": 1171088006, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537219, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "отношение\nобмена", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "iA6uGzoTSkebRQUy4vzQr", + "originalText": "отношение\nобмена", + "lineHeight": 1.25, + "baseline": 43 + }, + { + "type": "text", + "version": 239, + "versionNonce": 1203193183, + "isDeleted": false, + "id": "zI5BCz4iDWknbCUsbFiqm", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1139.6948828886566, + "y": -1682.9324341441077, + "strokeColor": "#6741d9", + "backgroundColor": "transparent", + "width": 273.60009765625, + "height": 45, + "seed": 1485201626, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537219, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": "БА Участника Г", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "БА Участника Г", + "lineHeight": 1.25, + "baseline": 30 + }, + { + "type": "text", + "version": 360, + "versionNonce": 642876433, + "isDeleted": false, + "id": "4UzPOlK8Td1hmAFXaFUcI", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 541.1523719023288, + "y": -1249.7260946258793, + "strokeColor": "#868e96", + "backgroundColor": "transparent", + "width": 726.984130859375, + "height": 45, + "seed": 218221190, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537219, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": "БА Экосистемы Участников А, Б, В, Г ???", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "БА Экосистемы Участников А, Б, В, Г ???", + "lineHeight": 1.25, + "baseline": 30 + }, + { + "type": "rectangle", + "version": 234, + "versionNonce": 1149583743, + "isDeleted": false, + "id": "YvkcJtSy5uXmCOnCA_SQN", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 869.3157426705579, + "y": -293.9178060516607, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "width": 153.9715576171875, + "height": 55.16192626953125, + "seed": 337776346, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "e0NWDQY6stD86tJbc3xcA" + }, + { + "id": "rx8xHcCkyuEnra9AHu2p7", + "type": "arrow" + }, + { + "id": "9aRF23GT46cfJC0hilvFd", + "type": "arrow" + } + ], + "updated": 1716911537219, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 214, + "versionNonce": 579394033, + "isDeleted": false, + "id": "e0NWDQY6stD86tJbc3xcA", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 892.9315873971204, + "y": -278.8368429168951, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 106.7398681640625, + "height": 25, + "seed": 1701782426, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537219, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Мотивация", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "YvkcJtSy5uXmCOnCA_SQN", + "originalText": "Мотивация", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "rectangle", + "version": 185, + "versionNonce": 1249819039, + "isDeleted": false, + "id": "DWvoerb7G5H5w52-nidzw", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 53.33210009243325, + "y": -306.77517706403023, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "width": 153.9715576171875, + "height": 55.16192626953125, + "seed": 26849946, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "R05MiXf9j4RSNC0Mt1MK_" + }, + { + "id": "sqz6WhBSkiJ-PZD5QW6dy", + "type": "arrow" + }, + { + "id": "4l4MZbqwtCfweXz8rZKTj", + "type": "arrow" + } + ], + "updated": 1716911537219, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 164, + "versionNonce": 756708305, + "isDeleted": false, + "id": "R05MiXf9j4RSNC0Mt1MK_", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 76.94794481899575, + "y": -291.6942139292646, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 106.7398681640625, + "height": 25, + "seed": 1404850010, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537219, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Мотивация", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "DWvoerb7G5H5w52-nidzw", + "originalText": "Мотивация", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "arrow", + "version": 30, + "versionNonce": 517221823, + "isDeleted": false, + "id": "sqz6WhBSkiJ-PZD5QW6dy", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 212.04766609178353, + "y": -298.8958435679367, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "width": 39.428619384765625, + "height": 37.79034423828125, + "seed": 1149257562, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1716911537219, + "link": null, + "locked": false, + "startBinding": { + "elementId": "DWvoerb7G5H5w52-nidzw", + "focus": 0.5784101463691173, + "gap": 4.744008382162775 + }, + "endBinding": { + "elementId": "V01v9F1wzTyQAmY8nTRxF", + "focus": 0.6479107804682676, + "gap": 2.409370930988871 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 39.428619384765625, + -37.79034423828125 + ] + ] + }, + { + "type": "arrow", + "version": 19, + "versionNonce": 169726385, + "isDeleted": false, + "id": "4l4MZbqwtCfweXz8rZKTj", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 209.6095252226429, + "y": -263.54348761090546, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "width": 49.58099365234375, + "height": 37.1810302734375, + "seed": 251249306, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1716911537219, + "link": null, + "locked": false, + "startBinding": { + "elementId": "DWvoerb7G5H5w52-nidzw", + "focus": -0.5135264299254149, + "gap": 2.30586751302215 + }, + "endBinding": { + "elementId": "yhd2RPkUNpSeJ-BFITGQy", + "focus": -0.41646767439200094, + "gap": 1 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 49.58099365234375, + 37.1810302734375 + ] + ] + }, + { + "type": "arrow", + "version": 19, + "versionNonce": 212213215, + "isDeleted": false, + "id": "rx8xHcCkyuEnra9AHu2p7", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 866.6761756132678, + "y": -273.2958679819992, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "width": 35.7520751953125, + "height": 48.15234375, + "seed": 848065990, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1716911537219, + "link": null, + "locked": false, + "startBinding": { + "elementId": "YvkcJtSy5uXmCOnCA_SQN", + "focus": -0.7639578021306948, + "gap": 2.639567057290151 + }, + "endBinding": { + "elementId": "mcPRyCvDuRqGfosP3smYs", + "focus": -0.6612855991238473, + "gap": 2.190497843425078 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -35.7520751953125, + -48.15234375 + ] + ] + }, + { + "type": "arrow", + "version": 12, + "versionNonce": 247100305, + "isDeleted": false, + "id": "9aRF23GT46cfJC0hilvFd", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 869.1144080351428, + "y": -250.1340027476242, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "width": 30.8760986328125, + "height": 35.9619140625, + "seed": 1915595738, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1716911537219, + "link": null, + "locked": false, + "startBinding": { + "elementId": "YvkcJtSy5uXmCOnCA_SQN", + "focus": 0.628569753258736, + "gap": 1 + }, + "endBinding": { + "elementId": "ofYTfbZPU3MdXHf5bIcW3", + "focus": 0.5925292230438644, + "gap": 5.066779581706328 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -30.8760986328125, + 35.9619140625 + ] + ] + }, + { + "type": "rectangle", + "version": 509, + "versionNonce": 654641663, + "isDeleted": false, + "id": "CvVVptNr5a5nCrMv1bRIP", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1916.1242536673294, + "y": -1501.402334741575, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 183.381103515625, + "height": 60, + "seed": 1716567956, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "QUx9zBsruvJQ-eIyMcFJH" + }, + { + "id": "oJM_GzxUL-SqPBQpVHdY_", + "type": "arrow" + }, + { + "id": "ZF5DwZsLoasFRlPBTFqoz", + "type": "arrow" + }, + { + "id": "85_GItXURUiTa_apW0-R-", + "type": "arrow" + }, + { + "id": "1M02y1rfhsyJyJtibxi28", + "type": "arrow" + } + ], + "updated": 1716911537219, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 530, + "versionNonce": 2133318001, + "isDeleted": false, + "id": "QUx9zBsruvJQ-eIyMcFJH", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1906.137803472017, + "y": -1494.402334741575, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 163.408203125, + "height": 46, + "seed": 1186704660, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537219, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "Data \ntransformation A.1", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "CvVVptNr5a5nCrMv1bRIP", + "originalText": "Data transformation A.1", + "lineHeight": 1.15, + "baseline": 41 + }, + { + "type": "rectangle", + "version": 542, + "versionNonce": 1257337375, + "isDeleted": false, + "id": "CNmHAUsabhcfCG2nMaF1N", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1252.600236333345, + "y": -1503.2402558841532, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 183.381103515625, + "height": 60, + "seed": 107801236, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "j6u75UfjCtSe7y1WRCf5T" + }, + { + "id": "Gjd7JUGe9ZfqOMStQqA-R", + "type": "arrow" + }, + { + "id": "zLSLU819QTRf5sLUyDK0y", + "type": "arrow" + }, + { + "id": "TW771BB8edrx5Z0qdqmOU", + "type": "arrow" + } + ], + "updated": 1716911537219, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 544, + "versionNonce": 749568849, + "isDeleted": false, + "id": "j6u75UfjCtSe7y1WRCf5T", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1214.8208173880325, + "y": -1484.7402558841532, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 107.822265625, + "height": 23, + "seed": 135952404, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537219, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "Process A.2", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "CNmHAUsabhcfCG2nMaF1N", + "originalText": "Process A.2", + "lineHeight": 1.15, + "baseline": 18 + }, + { + "type": "rectangle", + "version": 565, + "versionNonce": 1633408575, + "isDeleted": false, + "id": "lbpIapeI89-nJOZZBociK", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1580.6667341360794, + "y": -1507.5556481876197, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 183.381103515625, + "height": 60, + "seed": 1740264852, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "-rUbyYr0sT108POnhDyu1" + }, + { + "id": "ZF5DwZsLoasFRlPBTFqoz", + "type": "arrow" + }, + { + "id": "Gjd7JUGe9ZfqOMStQqA-R", + "type": "arrow" + } + ], + "updated": 1716911537219, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 579, + "versionNonce": 1403187505, + "isDeleted": false, + "id": "-rUbyYr0sT108POnhDyu1", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1559.010362065767, + "y": -1489.0556481876197, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 140.068359375, + "height": 23, + "seed": 1384284948, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537219, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "trasformed data", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "lbpIapeI89-nJOZZBociK", + "originalText": "trasformed data", + "lineHeight": 1.15, + "baseline": 18 + }, + { + "type": "rectangle", + "version": 539, + "versionNonce": 1629795935, + "isDeleted": false, + "id": "F7TLf1S1K7P1yznFdz6e5", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -2292.3910078177205, + "y": -1513.3462060489478, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 183.381103515625, + "height": 60, + "seed": 1592328340, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "ugUK7NCqj91rJIHeA3KFY" + }, + { + "id": "oJM_GzxUL-SqPBQpVHdY_", + "type": "arrow" + } + ], + "updated": 1716911537219, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 549, + "versionNonce": 963617553, + "isDeleted": false, + "id": "ugUK7NCqj91rJIHeA3KFY", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2239.054948247408, + "y": -1506.3462060489478, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 76.708984375, + "height": 46, + "seed": 1688456724, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537219, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "raw data\n", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "F7TLf1S1K7P1yznFdz6e5", + "originalText": "raw data\n", + "lineHeight": 1.15, + "baseline": 41 + }, + { + "type": "rectangle", + "version": 535, + "versionNonce": 287085183, + "isDeleted": false, + "id": "4a07Snk0nEivJb7NhfPsU", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1212.4122446612532, + "y": -1292.7323975230147, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 81.79058837890625, + "height": 60, + "seed": 1420356500, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "Y-IPS0t8TAYQes5snXk02" + }, + { + "id": "zLSLU819QTRf5sLUyDK0y", + "type": "arrow" + }, + { + "id": "F75vZ31YJvXP2tsM5XCrN", + "type": "arrow" + } + ], + "updated": 1716911537219, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 539, + "versionNonce": 176888049, + "isDeleted": false, + "id": "Y-IPS0t8TAYQes5snXk02", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1194.8714426593, + "y": -1274.2323975230147, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 46.708984375, + "height": 23, + "seed": 288250132, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537219, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "App2", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "4a07Snk0nEivJb7NhfPsU", + "originalText": "App2", + "lineHeight": 1.15, + "baseline": 18 + }, + { + "type": "rectangle", + "version": 512, + "versionNonce": 168028831, + "isDeleted": false, + "id": "a76fgGoCYhwToQdlcaPu9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1837.9835337237532, + "y": -1290.5990357066084, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 78.74288940429688, + "height": 60, + "seed": 1168774804, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "uBQWO5JNoJspngL7QQ9cB" + }, + { + "id": "1M02y1rfhsyJyJtibxi28", + "type": "arrow" + }, + { + "id": "F75vZ31YJvXP2tsM5XCrN", + "type": "arrow" + }, + { + "id": "_JOVJ6N530wyNBc_ixxwV", + "type": "arrow" + } + ], + "updated": 1716911537219, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 518, + "versionNonce": 2021446353, + "isDeleted": false, + "id": "uBQWO5JNoJspngL7QQ9cB", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1824.7449015216048, + "y": -1272.0990357066084, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 52.265625, + "height": 23, + "seed": 1053959188, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537219, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "App 1", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "a76fgGoCYhwToQdlcaPu9", + "originalText": "App 1", + "lineHeight": 1.15, + "baseline": 18 + }, + { + "type": "arrow", + "version": 244, + "versionNonce": 2022391487, + "isDeleted": false, + "id": "oJM_GzxUL-SqPBQpVHdY_", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2108.009904302095, + "y": -1475.6477549672768, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 188.83330078125005, + "height": 1.1342684615611347, + "seed": 1117553044, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "type": "text", + "id": "nJD3R_eeMM7ge5gvZwkOf" + } + ], + "updated": 1716911537219, + "link": null, + "locked": false, + "startBinding": { + "elementId": "F7TLf1S1K7P1yznFdz6e5", + "focus": 0.23376456747171903, + "gap": 1.0000000000004547 + }, + "endBinding": { + "elementId": "CvVVptNr5a5nCrMv1bRIP", + "focus": 0.083207680934996, + "gap": 3.0523498535155795 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 188.83330078125005, + 1.1342684615611347 + ] + ] + }, + { + "type": "text", + "version": 13, + "versionNonce": 400314545, + "isDeleted": false, + "id": "nJD3R_eeMM7ge5gvZwkOf", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -3573.1385419974054, + "y": -1228.533074349778, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 87.659912109375, + "height": 25, + "seed": 1748971284, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537219, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "consumed", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "oJM_GzxUL-SqPBQpVHdY_", + "originalText": "consumed", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "arrow", + "version": 269, + "versionNonce": 525536991, + "isDeleted": false, + "id": "ZF5DwZsLoasFRlPBTFqoz", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1731.7431501517044, + "y": -1471.182786566687, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 148.6241333007813, + "height": 1.8381605546450714, + "seed": 1882205332, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "type": "text", + "id": "zhKtN4a4WW7eHns1RBK3P" + } + ], + "updated": 1716911537220, + "link": null, + "locked": false, + "startBinding": { + "elementId": "CvVVptNr5a5nCrMv1bRIP", + "focus": 0.04387261835310513, + "gap": 1 + }, + "endBinding": { + "elementId": "lbpIapeI89-nJOZZBociK", + "focus": -0.108253205208154, + "gap": 2.4522827148437045 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 148.6241333007813, + -1.8381605546450714 + ] + ] + }, + { + "type": "text", + "version": 15, + "versionNonce": 2119242385, + "isDeleted": false, + "id": "zhKtN4a4WW7eHns1RBK3P", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -3215.206367314788, + "y": -1225.5543204572912, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 84.11990356445312, + "height": 25, + "seed": 472218132, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537220, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "produces", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "ZF5DwZsLoasFRlPBTFqoz", + "originalText": "produces", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "arrow", + "version": 270, + "versionNonce": 418110207, + "isDeleted": false, + "id": "Gjd7JUGe9ZfqOMStQqA-R", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1393.3571149954546, + "y": -1473.5053227932976, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 139.58062744140625, + "height": 3.9999034204113855, + "seed": 118822804, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "type": "text", + "id": "tKY-EZbomOJV60EI_R88-" + } + ], + "updated": 1716911537220, + "link": null, + "locked": false, + "startBinding": { + "elementId": "lbpIapeI89-nJOZZBociK", + "focus": 0.04015656812685143, + "gap": 3.928515624999818 + }, + "endBinding": { + "elementId": "CNmHAUsabhcfCG2nMaF1N", + "focus": -0.19603322672840168, + "gap": 1.176251220703307 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 139.58062744140625, + 3.9999034204113855 + ] + ] + }, + { + "type": "text", + "version": 13, + "versionNonce": 546478193, + "isDeleted": false, + "id": "tKY-EZbomOJV60EI_R88-", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2883.1120893606867, + "y": -1224.9578246963738, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 87.659912109375, + "height": 25, + "seed": 2100626708, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537220, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "consumed", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "Gjd7JUGe9ZfqOMStQqA-R", + "originalText": "consumed", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "arrow", + "version": 230, + "versionNonce": 1507205919, + "isDeleted": false, + "id": "zLSLU819QTRf5sLUyDK0y", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1169.8276980116489, + "y": -1296.9610657359053, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 4.083768531576084, + "height": 143.2041252983941, + "seed": 1408975508, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "type": "text", + "id": "unD-XEDDXzn0brI1xKUvC" + } + ], + "updated": 1716911537220, + "link": null, + "locked": false, + "startBinding": { + "elementId": "4a07Snk0nEivJb7NhfPsU", + "focus": 0.017081096807915776, + "gap": 4.228668212890625 + }, + "endBinding": { + "elementId": "CNmHAUsabhcfCG2nMaF1N", + "focus": 0.042044353399359906, + "gap": 3.0750648498537885 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 4.083768531576084, + -143.2041252983941 + ] + ] + }, + { + "type": "text", + "version": 13, + "versionNonce": 1885889105, + "isDeleted": false, + "id": "unD-XEDDXzn0brI1xKUvC", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2725.3910917609956, + "y": -1122.015581998384, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 83.77989196777344, + "height": 25, + "seed": 1109250068, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537220, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "supports", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "zLSLU819QTRf5sLUyDK0y", + "originalText": "supports", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "arrow", + "version": 139, + "versionNonce": 1921148735, + "isDeleted": false, + "id": "1M02y1rfhsyJyJtibxi28", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1800.8960553433735, + "y": -1293.6086182261397, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 1.8614434953970544, + "height": 146.65824042426215, + "seed": 932359572, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "type": "text", + "id": "6E44k0pVDRrO-FiPchnxb" + } + ], + "updated": 1716911537220, + "link": null, + "locked": false, + "startBinding": { + "elementId": "a76fgGoCYhwToQdlcaPu9", + "focus": -0.04691551858798184, + "gap": 3.00958251953125 + }, + "endBinding": { + "elementId": "CvVVptNr5a5nCrMv1bRIP", + "focus": -0.231136239701806, + "gap": 1.1354760911731319 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1.8614434953970544, + -146.65824042426215 + ] + ] + }, + { + "type": "text", + "version": 43, + "versionNonce": 984215601, + "isDeleted": false, + "id": "6E44k0pVDRrO-FiPchnxb", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -3359.4320551062065, + "y": -1120.3901920515525, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 83.77989196777344, + "height": 25, + "seed": 898620180, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537220, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "supports", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "1M02y1rfhsyJyJtibxi28", + "originalText": "supports", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "arrow", + "version": 104, + "versionNonce": 290531167, + "isDeleted": false, + "id": "F75vZ31YJvXP2tsM5XCrN", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1754.5026499346905, + "y": -1257.0372681284834, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 540.8572998046875, + "height": 0.8417138250034526, + "seed": 646666388, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "type": "text", + "id": "C7btd_0eWvNuByjLGN3Eh" + } + ], + "updated": 1716911537220, + "link": null, + "locked": false, + "startBinding": { + "elementId": "a76fgGoCYhwToQdlcaPu9", + "focus": 0.11620006853902402, + "gap": 4.737994384765898 + }, + "endBinding": { + "elementId": "4a07Snk0nEivJb7NhfPsU", + "focus": -0.21961429492714823, + "gap": 1.2331054687497272 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 540.8572998046875, + 0.8417138250034526 + ] + ] + }, + { + "type": "text", + "version": 37, + "versionNonce": 1161740817, + "isDeleted": false, + "id": "C7btd_0eWvNuByjLGN3Eh", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -3156.93914285461, + "y": -1010.0688648292632, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 314.29962158203125, + "height": 25, + "seed": 909846036, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537220, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "integration App1App2 tls bla bla", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "F75vZ31YJvXP2tsM5XCrN", + "originalText": "integration App1App2 tls bla bla", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "rectangle", + "version": 559, + "versionNonce": 1150477183, + "isDeleted": false, + "id": "qCQVg3i4XKUyFbAketBoj", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -1591.3360849932842, + "y": -1634.8754028941084, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 183.381103515625, + "height": 60, + "seed": 697648020, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "9xtstO3V4A7SWy_5o63MS" + }, + { + "id": "TW771BB8edrx5Z0qdqmOU", + "type": "arrow" + }, + { + "id": "85_GItXURUiTa_apW0-R-", + "type": "arrow" + }, + { + "id": "kbZjrJLV_e58QGyixit1W", + "type": "arrow" + }, + { + "id": "_JOVJ6N530wyNBc_ixxwV", + "type": "arrow" + } + ], + "updated": 1716911537220, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 580, + "versionNonce": 756963313, + "isDeleted": false, + "id": "9xtstO3V4A7SWy_5o63MS", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1545.2168222979717, + "y": -1616.3754028941084, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 91.142578125, + "height": 23, + "seed": 919580948, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537220, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "Process A", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "qCQVg3i4XKUyFbAketBoj", + "originalText": "Process A", + "lineHeight": 1.15, + "baseline": 18 + }, + { + "type": "arrow", + "version": 200, + "versionNonce": 2089294751, + "isDeleted": false, + "id": "85_GItXURUiTa_apW0-R-", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1781.2160285709506, + "y": -1502.6224053897681, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 186.00860568704135, + "height": 90.339993728573, + "seed": 1566600852, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "type": "text", + "id": "Jp5V7K81njFsiPTANzK1Y" + } + ], + "updated": 1716911537220, + "link": null, + "locked": false, + "startBinding": { + "elementId": "CvVVptNr5a5nCrMv1bRIP", + "focus": -0.13726015878664696, + "gap": 1.2200706481930865 + }, + "endBinding": { + "elementId": "qCQVg3i4XKUyFbAketBoj", + "focus": 0.46287743459814196, + "gap": 3.871337890625 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "triangle", + "points": [ + [ + 0, + 0 + ], + [ + 186.00860568704135, + -90.339993728573 + ] + ] + }, + { + "type": "text", + "version": 24, + "versionNonce": 72364497, + "isDeleted": false, + "id": "Jp5V7K81njFsiPTANzK1Y", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -3296.736948505748, + "y": -1301.2448558673364, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 185.61978149414062, + "height": 25, + "seed": 1040022548, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537220, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "is part of or DDD", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "85_GItXURUiTa_apW0-R-", + "originalText": "is part of or DDD", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "arrow", + "version": 264, + "versionNonce": 1298223039, + "isDeleted": false, + "id": "TW771BB8edrx5Z0qdqmOU", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1150.3149735187426, + "y": -1506.1178535437698, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 251.79250429680746, + "height": 94.76163546130886, + "seed": 1922881940, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "type": "text", + "id": "KlKEIgZJtC4daxAq6FheJ" + } + ], + "updated": 1716911537220, + "link": null, + "locked": false, + "startBinding": { + "elementId": "CNmHAUsabhcfCG2nMaF1N", + "focus": 0.5714817519410076, + "gap": 2.87759765961664 + }, + "endBinding": { + "elementId": "qCQVg3i4XKUyFbAketBoj", + "focus": -0.507108723815083, + "gap": 5.847503662109148 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "triangle", + "points": [ + [ + 0, + 0 + ], + [ + -251.79250429680746, + -94.76163546130886 + ] + ] + }, + { + "type": "text", + "version": 26, + "versionNonce": 803983281, + "isDeleted": false, + "id": "KlKEIgZJtC4daxAq6FheJ", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2884.7364484454647, + "y": -1306.9511248877059, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 185.61978149414062, + "height": 25, + "seed": 1718912788, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537220, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "is part of or DDD", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "TW771BB8edrx5Z0qdqmOU", + "originalText": "is part of or DDD", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "arrow", + "version": 148, + "versionNonce": 1899954143, + "isDeleted": false, + "id": "kbZjrJLV_e58QGyixit1W", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1211.8391900477582, + "y": -1288.2485681951694, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 245.68079175779127, + "height": 279.46673583984375, + "seed": 771392660, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "type": "text", + "id": "yHR2Dk2VwLy6lcwIqCb_C" + } + ], + "updated": 1716911537220, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "qCQVg3i4XKUyFbAketBoj", + "focus": -0.08010841703213083, + "gap": 7.160098859095342 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -245.68079175779127, + -279.46673583984375 + ] + ] + }, + { + "type": "text", + "version": 16, + "versionNonce": 102281617, + "isDeleted": false, + "id": "yHR2Dk2VwLy6lcwIqCb_C", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2892.284863941788, + "y": -1181.434389728373, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 83.77989196777344, + "height": 25, + "seed": 1592054292, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537220, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "supports", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "kbZjrJLV_e58QGyixit1W", + "originalText": "supports", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "arrow", + "version": 228, + "versionNonce": 171027455, + "isDeleted": false, + "id": "_JOVJ6N530wyNBc_ixxwV", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1756.2556333965404, + "y": -1269.9514913986018, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 205.97637376955248, + "height": 299.5809783935547, + "seed": 1747546004, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "type": "text", + "id": "1d9Spx6hUbvbBMbKwPYxk" + } + ], + "updated": 1716911537220, + "link": null, + "locked": false, + "startBinding": { + "elementId": "a76fgGoCYhwToQdlcaPu9", + "focus": 0.598790892409167, + "gap": 2.98501092291599 + }, + "endBinding": { + "elementId": "qCQVg3i4XKUyFbAketBoj", + "focus": 0.23445921168551853, + "gap": 5.342933101951985 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 205.97637376955248, + -299.5809783935547 + ] + ] + }, + { + "type": "text", + "version": 19, + "versionNonce": 739137393, + "isDeleted": false, + "id": "1d9Spx6hUbvbBMbKwPYxk", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -3210.8727245268983, + "y": -1173.1944342086608, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 83.77989196777344, + "height": 25, + "seed": 1778277652, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537220, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "supports", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "_JOVJ6N530wyNBc_ixxwV", + "originalText": "supports", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "arrow", + "version": 2025, + "versionNonce": 607769631, + "isDeleted": false, + "id": "jYX0oCUIG_l0M6whfCx_O", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 67.64093197520563, + "y": 481.5614271351367, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 156.1449725824007, + "height": 155.2654251285852, + "seed": 1705597425, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537220, + "link": null, + "locked": false, + "startBinding": { + "elementId": "SdomzG4lO16KJ8qkbdzno", + "focus": -0.19086338683979612, + "gap": 5.933964710566443 + }, + "endBinding": { + "elementId": "_vcxi3vYplZXZVtRvuTFu", + "focus": 0.3524190966071041, + "gap": 3.0575707841905455 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "triangle", + "points": [ + [ + 0, + 0 + ], + [ + 0.8206113809390274, + -155.2654251285852 + ], + [ + 156.1449725824007, + -155.02533242177128 + ] + ] + }, + { + "type": "arrow", + "version": 2483, + "versionNonce": 873742673, + "isDeleted": false, + "id": "UOmakKLK2vvFCeR_DXTnf", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 4.718362362004914, + "x": 227.09160299845115, + "y": 475.34726740199, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 133.56770838228005, + "height": 122.19200220060263, + "seed": 636414687, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537220, + "link": null, + "locked": false, + "startBinding": { + "elementId": "_vcxi3vYplZXZVtRvuTFu", + "focus": -0.4123055150521577, + "gap": 5.041892348153283 + }, + "endBinding": { + "elementId": "SdomzG4lO16KJ8qkbdzno", + "focus": 0.07219332564442155, + "gap": 6.825180060377988 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "triangle", + "points": [ + [ + 0, + 0 + ], + [ + -0.08452676094898948, + -122.19200220060263 + ], + [ + -133.56770838228005, + -121.98603461838171 + ] + ] + }, + { + "type": "text", + "version": 625, + "versionNonce": 2001205311, + "isDeleted": false, + "id": "BjLFSXIS9iwCowzNugs8s", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 4.710794287179997, + "x": 2.5305758045700735, + "y": 418.523410166873, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 100.78125, + "height": 18.4, + "seed": 1153762847, + "groupIds": [ + "CleJDgdYq6Ww7uYJlV3aj" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537220, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 2, + "text": "потребляется", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "потребляется", + "lineHeight": 1.15, + "baseline": 15 + }, + { + "type": "text", + "version": 643, + "versionNonce": 2072112945, + "isDeleted": false, + "id": "DrzMt0gQa6r_b5hhHwmdN", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 4.710794287179997, + "x": 71.74782325416102, + "y": 410.99966044410735, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 85.203125, + "height": 18.4, + "seed": 2122299583, + "groupIds": [ + "qFcWa7YheUhnh-lsosMho" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1716911537220, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 2, + "text": "производит", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "производит", + "lineHeight": 1.15, + "baseline": 15 } ], "appState": { diff --git a/docs/ba/seaf_ba_core_mm.svg b/docs/ba/seaf_ba_core_mm.svg index 55e007b..45225de 100644 --- a/docs/ba/seaf_ba_core_mm.svg +++ b/docs/ba/seaf_ba_core_mm.svg @@ -1,21 +1,21 @@ - + - Бизнес-архитектураПроцессы seaf.ba.processesТребованияseaf.change.requirementsПрикладной сервисcomponents: type: serviceБизнес-объекты seaf.ia.business_objectsУчастники seaf.ba.partiesявляется частьювладелецПродукты seaf.ba.productsпотребляется всоставевладелецзаинтересованявляетсячастьюпоток работподдерживаетподдерживаетвыполняет рольиспользуется втребуетв процессе реализацииреализовано \ No newline at end of file + Бизнес-архитектураПроцессы seaf.ba.processesТребованияseaf.change.requirementsПрикладной сервисcomponents: type: serviceРесурсыseaf.ba.resourcesУчастники seaf.ba.partiesявляется частьювладелецПродукты seaf.ba.productsпотребляется всоставевладелецзаинтересованявляетсячастьюпоток работподдерживаетподдерживаетвыполняет рольподдерживаеттребуетв процессе реализацииреализованопотребляетсяпроизводит \ No newline at end of file diff --git a/docs/ba/ba_tutorial.excalidraw b/docs/ba/tutorial/ba_tutorial.excalidraw similarity index 100% rename from docs/ba/ba_tutorial.excalidraw rename to docs/ba/tutorial/ba_tutorial.excalidraw diff --git a/docs/ba/ba_tutorial.md b/docs/ba/tutorial/ba_tutorial.md similarity index 100% rename from docs/ba/ba_tutorial.md rename to docs/ba/tutorial/ba_tutorial.md diff --git a/docs/ba/ba_tutorial_1.png b/docs/ba/tutorial/ba_tutorial_1.png similarity index 100% rename from docs/ba/ba_tutorial_1.png rename to docs/ba/tutorial/ba_tutorial_1.png diff --git a/docs/ba/ba_tutorial_2.png b/docs/ba/tutorial/ba_tutorial_2.png similarity index 100% rename from docs/ba/ba_tutorial_2.png rename to docs/ba/tutorial/ba_tutorial_2.png diff --git a/docs/ba/ba_tutorial_3ac.png b/docs/ba/tutorial/ba_tutorial_3ac.png similarity index 100% rename from docs/ba/ba_tutorial_3ac.png rename to docs/ba/tutorial/ba_tutorial_3ac.png diff --git a/docs/ba/ba_tutorial_3de.png b/docs/ba/tutorial/ba_tutorial_3de.png similarity index 100% rename from docs/ba/ba_tutorial_3de.png rename to docs/ba/tutorial/ba_tutorial_3de.png diff --git a/docs/ba/ba_tutorial_4.png b/docs/ba/tutorial/ba_tutorial_4.png similarity index 100% rename from docs/ba/ba_tutorial_4.png rename to docs/ba/tutorial/ba_tutorial_4.png diff --git a/docs/ba/ba_tutorial_5.png b/docs/ba/tutorial/ba_tutorial_5.png similarity index 100% rename from docs/ba/ba_tutorial_5.png rename to docs/ba/tutorial/ba_tutorial_5.png diff --git a/entities/app/components.yaml b/entities/app/components/components.yaml similarity index 100% rename from entities/app/components.yaml rename to entities/app/components/components.yaml diff --git a/entities/app/components/contexts.yaml b/entities/app/components/contexts.yaml new file mode 100644 index 0000000..7448c98 --- /dev/null +++ b/entities/app/components/contexts.yaml @@ -0,0 +1,31 @@ +entities: + components: + presentations: + contexts: + # Переопределяем source запрос для построения контекстов компонента SEAF + # Переопределение учитывает дополнительных тип представления контекста (presentation) + source: > + ( + $component_id := $params.component; + $append( + [ + { + "title": "SELF (зависимости)", + "src": "@entity/contexts/plantuml?dh-context-id=SELF&componentId=" & $component_id & "&dh-focus-id=" & $component_id + }, + { + "title": "SELF (интеграции)", + "src": "@entity/contexts/integration?dh-context-id=SELF&componentId=" & $component_id & "&dh-focus-id=" & $component_id + } + ], + [$distinct([contexts.$spread().( + $CONTEXT := $; + $ID := $keys()[0]; + $PRESENTATION := $exists($.*.presentation) ? $.*.presentation : $$.entities.contexts.config.defaultPresentation; + *.components[$wcard($component_id, $)].{ + "src": "@entity/contexts/" & $PRESENTATION & "?dh-context-id=" & $ID & "&dh-focus-id=" & $component_id, + "title": $CONTEXT.*.title ? $CONTEXT.*.title : $ID + } + )])]^(title) + ) + ) \ No newline at end of file diff --git a/entities/app/components/root.yaml b/entities/app/components/root.yaml new file mode 100644 index 0000000..de40a30 --- /dev/null +++ b/entities/app/components/root.yaml @@ -0,0 +1,3 @@ +imports: + - components.yaml + - contexts.yaml \ No newline at end of file diff --git a/entities/app/contexts.yaml b/entities/app/contexts.yaml deleted file mode 100644 index 24ee6bc..0000000 --- a/entities/app/contexts.yaml +++ /dev/null @@ -1,7 +0,0 @@ -# Контексты представлений прикладных компонентов SEAF -# Переиспользуется матамодель DocHub -entities: - contexts: - title: Контексты - description: > - Представляет указанные архитектурные компоненты в виде диаграмм. diff --git a/entities/app/contexts/contexts.yaml b/entities/app/contexts/contexts.yaml new file mode 100644 index 0000000..2afb48c --- /dev/null +++ b/entities/app/contexts/contexts.yaml @@ -0,0 +1,90 @@ +# Контексты представлений прикладных компонентов SEAF +# Переиспользуется матамодель DocHub +entities: + contexts: + title: Контексты + description: > + Представляет указанные архитектурные компоненты в виде диаграмм. + schema: + type: object + patternProperties: + "^[0-9a-zA-Z][a-zA-Z0-9_-]*(\\.[a-zA-Z][a-zA-Z0-9_-]*)*$": + type: object + properties: + presentation: + title: Принудительно определяет презентацию + type: string + enum: + - plantuml + - smartants + - integration + api: + # Возвращает компоненты входящие в контекст + # Входящие параметры: + # manifest - данные архитектуры + # contextId - идентификатор контекста + # extra-links - признак необходимости отразить окружение + # componentId - идентификатор компонента для контекста SELF + fetchComponentsExtraIntegrations: > + ( + /* Обрабатываем параметры */ + $params := $; + $manifest := $params.manifest; + /* Признак SELF контекста */ + $isSelf := $params.componentId ? true : false; + /* Получаем объект контекста */ + $context := $lookup($params.manifest.contexts, contextId); + + /* Определяем необходимость показывать ближайшие связи */ + $isExtraLinks := $params.componentId ? true : $params."extra-links"; + + /* Определяем, какие компоненты покажем в контексте */ + $showComponents := $params.componentId + /* Если контекст под определенный компонент, ограничиваемся им. */ + ? [$params.componentId] + /* Если нет берем все компоненты указанные в контексте */ + : $context.components; + + /* Если в контексте переопределена функция получения компонентов, используем ее*/ + $context.api.fetchComponents ? ( + $eval($context.api.fetchComponents, $params) + ) : ( + /* Получаем все компоненты входящие в контекст */ + $components := $merge($showComponents.( + $mask := $; + $manifest.components.$spread().( + $componentId := $keys()[0]; + $result := $wcard($componentId, $mask) ? $ + ) + )); + + + /* Добавляем окружение, если это нужно */ + $merge([$components, $isExtraLinks ? + ( + $tmp := $distinct($manifest."seaf.app.integrations".$spread()[*.to in $components.$keys() or *.from in $components.$keys()].[$.*.to, $.*.from]); + $extra_components := $tmp[$not($ in $components.$keys())]; + $extra_components.( + { + $ : $lookup($manifest.components, $) + } + ); + ) : {}]); + ) + ) + # Генерирует список отображаемых связей + # Входящие параметры: + # components - список компонентов в формате fetchComponents + # integrations - список интеграций + fetchIntegrations: > + ( + /* Обрабатываем параметры */ + $integrations := integrations; + $components := components; + $integrations.$spread()[*.to in $components.$keys() and *.from in $components.$keys()].{ + "from": $.*.from, + "to": $.*.to, + "title": $.*.title, + "direction": "-->" + } + ) \ No newline at end of file diff --git a/entities/app/contexts/integration.yaml b/entities/app/contexts/integration.yaml new file mode 100644 index 0000000..e680d5f --- /dev/null +++ b/entities/app/contexts/integration.yaml @@ -0,0 +1,122 @@ +entities: + contexts: + presentations: + integration: + title: Представление (интеграций) в PlantUML + params: + title: Требуемые параметры для презентации + type: object + properties: + "dh-context-id": + title: Идентификатор контекста + type: string + pattern: ^[0-9a-zA-Z][a-zA-Z0-9_-]*(\.[a-zA-Z][a-zA-Z0-9_-]*)*$ + "dh-focus-id": + title: Идентификатор требующий подсветку + type: string + pattern: ^[0-9a-zA-Z][a-zA-Z0-9_-]*(\.[a-zA-Z0-9][a-zA-Z0-9_-]*)*$ + required: + - dh-context-id + type: plantuml + $constructor: > # Переносим необходимую информацию из контекста в презентацию + ( + $id := $params."dh-context-id"; + $context := $lookup(contexts, $id); + $prototype := entities.contexts.presentations.integration; + + /* Преобразует относительные пути к файлам в прямые*/ + $toDirectRes := function($value) { + $substring($value, 0, 4) = "res:" ? $value : "res://contexts/" & $id & "#" & $value + }; + + /* Если явно указан puml файл, просто рендерим его */ + ($type($context.uml) = "string") and ($substring($context.uml, -5) = ".puml") ? ( + { + "type": "plantuml", + "source": $toDirectRes($context.uml) + } + ) : ( + $result := $context.source ? ($merge([$prototype, { + "origin": { "_source": $context.source, "_origin": "($)" } + }])) : $prototype; + + /* Если в контексте переопределен шаблон, используем его по прямой ссылке */ + $result := $context.template + ? $merge([$result, { "template": $toDirectRes($context.template) }]) + : $result; + ) + ) + template: templates/template.puml + source: > + ( + $id := $params."dh-context-id"; + $focusId := $params."dh-focus-id"; + /* Получаем доступ к оригинальным данным */ + $manifest := _origin ? _origin : $; + /* Получаем контекст */ + $context := $lookup($manifest.contexts, $id); + /* Если в контексте задан источник, берем его за основу */ + $manifest := _source ? _source : $; + + $isExtraLinks := $not($string($context."extra-links") = "false"); + + /* Получаем коллекцию дефолтных вспомогательных функций */ + $defFunctions := $manifest.entities.contexts.api; + + /* Получаем коллекцию дефолтных параметров */ + $defConfig := $manifest.entities.contexts.config; + + /* Получаем параметры из контекста */ + $customConfig := $context.config; + + /* Формируем итоговый конфиг */ + $config := $mergedeep([$defConfig,$customConfig]); + + /* Определяем движок рендеринга */ + $renderCore := $lookup({ + "elk": "!pragma layout elk", + "smetana": "!pragma layout smetana" + }, $config.renderCore); + + /* Формируем заголовок */ + $header := "$Header(\"" & ($context.title ? $context.title : $id ) & "\", \"" & $context.uml."$autor" & "\", \"" & $context.uml."$version" & "\" , \"" & $context.uml."$moment" & "\")\n"; + + /* Получаем все компоненты входящие в контекст */ + $components := $eval($defFunctions.fetchComponentsExtraIntegrations, $merge([$params, { + "manifest": $manifest, + "contextId": $id, + "extra-links": $isExtraLinks, + "componentId": $params.componentId + }])); + + /* Генерируем области */ + $areas := $eval($defFunctions.fetchAreas, { + "components": $components + }); + + /* Генерируем PlantUML диаграмму компонентов */ + $elements := $eval($defFunctions.makePumlComponentDiagram, { + "manifest": $manifest, + "areas": $areas, + "components": $components, + "focusId": $focusId + }); + + /* Получаем список связей */ + $links := $eval($defFunctions.fetchIntegrations, { + "components": $components, + "integrations": $manifest."seaf.app.integrations" + }); + + /* Генерируем код связей */ + $linksCode := $eval($defFunctions.makePumlComponentsLinks, { + "links": $links + }); + + /* Готовим данные для передачи в шаблон */ + { + "renderCore": $renderCore, + "presentation": $defConfig.defaultPresentation, + "code": $header & $elements & $linksCode + } + ) \ No newline at end of file diff --git a/entities/app/contexts/root.yaml b/entities/app/contexts/root.yaml new file mode 100644 index 0000000..16984b1 --- /dev/null +++ b/entities/app/contexts/root.yaml @@ -0,0 +1,3 @@ +imports: + - contexts.yaml + - integration.yaml \ No newline at end of file diff --git a/entities/app/contexts/templates/template.puml b/entities/app/contexts/templates/template.puml new file mode 100644 index 0000000..87c24f2 --- /dev/null +++ b/entities/app/contexts/templates/template.puml @@ -0,0 +1,183 @@ +@startuml +skinparam useBetaStyle true +allow_mixing +{{renderCore}} +skinparam { + HyperLinkColor #000 + wrapWidth 200 + maxMessageSize 200 + 'hide stereotype + defaultfontname Roboto, sans-serif + roundCorner 10 + 'linetype ortho + 'linetype polyline + nodesep 70 + ranksep 70 + shadowing false + padding 2 +} + + + +!unquoted procedure $Region($alias, $label, $type) + !if ($type) + rectangle "$label" <<$type>> as $alias + !else + rectangle "$label" as $alias + !endif +!endprocedure + +!unquoted procedure $Header($Title="Header", $Authors="Name", $Version="0.1", $Date="01.01.1999") + header + !if ($Authors) + Authors: $Authors + !endif + !if ($Version) + Version: $Version + !endif + !if ($Date) + Date: $Date + !endif + + endheader + + hide empty members + + title $Title +!endprocedure + + +'Стили Person +skinparam component<> { + backgroundColor Transparent + borderColor Transparent + shadowing false + hide stereotype + borderthickness 1 + FontSize 14 + FontStyle Bold +} + +!unquoted procedure $join_start() + %set_variable_value("$join_append", 0) +!endprocedure + +!unquoted function $join_append() + !$val = %get_variable_value("$join_append") + !if $val == 0 + %set_variable_value("$join_append", 1) + !endif + !return $val +!endfunction + +!unquoted procedure $join_end() + %set_variable_value("$join_append", 0) +!endprocedure + +!unquoted procedure $Entity($entity, $ACName, $id, $ACType, $color="") + $join_start() + !if ($entity == component) + component $id $color[ + $ACName + ==== + !elseif ($entity == system) + component $id $color[ + $ACName + ==== + !elseif ($entity == actor || $entity == person) + actor $id $color[ + ..===$ACName.. + ] + !else + $entity $id $color[ + $ACName + ==== + !endif +!endprocedure + +!unquoted procedure $EntityEnd($entity) + !if ($entity == component) + ] + !elseif ($entity == system) + ] + !elseif ($entity == actor || $entity == person) +'nothing + !else + ] + !endif + $join_end() +!endprocedure + +!unquoted procedure $EntityAspect($entity, $prop) + !if ($entity == component) + !$val = $join_append() + !if ($val != 0) + --- + !endif + $prop + !elseif ($entity == system) + $prop + !elseif ($entity == actor || $entity == person) +'nothing + !else + $prop + !endif +!endprocedure + +!unquoted procedure $EntityExpand($entity, $ID) + !if ($entity == component || $entity == system || $entity == collections) + --- + [[/entities/contexts/{{presentation}}?dh-context-id=$ID ≫≫]] + !else +'nothing + !endif +!endprocedure + +left to right direction + +{{&code}} + +@enduml diff --git a/entities/app/root.yaml b/entities/app/root.yaml index 94d859c..09368ce 100644 --- a/entities/app/root.yaml +++ b/entities/app/root.yaml @@ -1,6 +1,6 @@ imports: - - components.yaml - - contexts.yaml + - components/root.yaml + - contexts/root.yaml - aspects.yaml - integrations/root.yaml - specifications/root.yaml \ No newline at end of file diff --git a/entities/ba/README.md b/entities/ba/README.md index 2b78af4..c2fe60a 100644 --- a/entities/ba/README.md +++ b/entities/ba/README.md @@ -1,17 +1,14 @@ -###### :green_book: README.md - ---- - -# Бизнес-архитектура в SEAF-core - -БА в объеме SEAF-core содержит: +# Архитектура Бизнеса в SEAF-CORE +Синонимы, сокращения: + * АБ + * Business Architecture, BA, ba ##### Метамодель ![](/docs/ba/seaf_ba_core_mm.svg) -Изучение методологии рекомендуем начать с меню Документы/SEAF/Бизнес-архитектура/Intro () +Изучение методологии рекомендуем начать с меню Документы/SEAF/Архитектура Бизнеса/Intro -# Сообщество БА +##### Сообщество БА Приходите в телеграм-группу! Нас пока мало, но нам есть, что обсудить) @@ -19,3 +16,40 @@ ![alt text](/docs/ba/qr_tg_ba_group.png) + + +##### Состав +АБ в объеме SEAF-CORE содержит: +* Метамодель АБ `/entities/ba/` + * Настоящий `README.md` + * Конфигурация меню `menu.yaml` + * Корневой манифест `root.yaml` + * импорты сущностей + * Папки сущностей: + * `base`: + * базовая сущность `seaf.ba.base` -- общая функциональность для представлений БА + * подключение набора иконок для SmartAnts тестовых данных(по умолчанию отключено) + * сборщик меню (из конфигурации меню `../menu.yaml`) + * функции: + * сборка символов для SmartAnts + * `parties`: + * Мета-сущность `seaf.ba.parties` -- Участники + * презентации: + * Структура Участников: Все Участники и отношения между ними + * `products`: + * Мета-сущность `seaf.ba.products` -- Продукты + * презентации: + * Продуктовый ландшафт: Продукты, их Владельцы и другие заинтересованные Участники (Пользователи) + * `processes`: + * Мета-сущность `seaf.ba.processes` -- Процессы + * презентации: + * Карта процессов: Иерархия Процессов по DDD и отношениям "является частью" + * Сеть процессов: Последовательноти Процессов + Участники-Владельцы Процессов + * Распределение Процессов по Продуктам + * `resources`: + * Мета-сущность `seaf.ba.resiurces` (объединяет в себе ряд объектов not-ba) + * презентации: + * Использование Ресурсов -- Сеть процессов + ресурсы и тербования +* Методологические материалы `/docs/ba/` + + diff --git a/entities/ba/base/base.yaml b/entities/ba/base/base.yaml new file mode 100644 index 0000000..0e124eb --- /dev/null +++ b/entities/ba/base/base.yaml @@ -0,0 +1,76 @@ +imports: + - icons.yaml + +entities: + + seaf.ba.base: + title: Метамодель БА + description: Сущность для представлений БА + + schema: # Сущность seaf.ba.base содержит только меню и общие презентации для БА и не предполагает, что для нее будут объявлены объекты + + menu: > + ( + $treePaths:= function($nested, $items, $i, $path) {( + $path:= $path!="" and $nested[$i] ? $path & "/" & $nested[$i].title : $path="" and $nested[$i] ? $nested[$i].title; + $items:= $nested[$i].link ? $append($items, {"location": $path, "link": $nested[$i].link, "order": $nested[$i].order? $nested[$i].order}): $items; + $items:= $count($nested[$i].includes) > 0 ? + $append($items, $treePaths($nested[$i].includes, [], 0, $path)): + $items; + $i<$count($nested)-1 ? $treePaths($nested, $items, $i+1, $substringBefore($path, "/" & $nested[$i].title)) : $items + )}; + + $menu:= $reduce($map($$."seaf.nav", function($v) {( + $distinct($treePaths($v, [], 0, "")) + )}), $append); + ) + + +functions: + + getSymbol: + title: Сформировать svg-символы для SmartAnts + params: + - type: string + title: Main title + alias: title + required: true + - type: string + title: Entity id + alias: entity_id + required: true + - type: number + title: Symbol width in pixels + alias: symbol_width + required: true + - type: object + title: Шаблоны иконок + alias: seaf_icons + required: true + code: > + ( + $title:= title; $entity_id:= entity_id; $symbol_width:= symbol_width; $seaf_icons:= seaf_icons; + + $symbol_title:= $split($entity_id, ".")[-1]; + $symbol_obj:= $eval("$seaf_icons." & $symbol_title); + $symbol_gliph:= $symbol_obj.gliph; + $symbol_template:= $symbol_gliph ? + $match($symbol_gliph, /^(]+>/, 1).match & + '' & + '{{title}}' & + $match($symbol_gliph, /(]+>/, 1).match & + '' + ; + $symbol_template:= $symbol_template + ? $symbol_template + : $seaf_icons.no_icon; + $symbol_svg:= $replace($symbol_template, /\{\{title\}\}/, $title); + $symbol_svg:= $replace($symbol_svg, /\{\{fore_color\}\}/, $symbol_obj.fore_color); + $symbol_svg:= $replace($symbol_svg, /\{\{back_color\}\}/, $symbol_obj.back_color); + $symbol_svg:= $replace($symbol_svg, /\{\{absWidth\}\}/, $string($symbol_width)); + $symbol_svg:= $replace($symbol_svg, /\{\{vbWidth\}\}/, $string(4000*$symbol_width/100)); + + {"title": $symbol_title & "_" & $title, "svg": $symbol_svg} + ) + result: + type: object \ No newline at end of file diff --git a/entities/ba/base/icons.yaml b/entities/ba/base/icons.yaml new file mode 100644 index 0000000..fa3a086 --- /dev/null +++ b/entities/ba/base/icons.yaml @@ -0,0 +1,68 @@ +seaf.icons: + + components: + gliph: ' + + ' + back_color: darkkhaki + fore_color: dimgrey + + processes: + gliph: ' + + ' + back_color: seagreen + fore_color: lightgrey + + resources: + gliph: ' + + ' + back_color: brown + fore_color: lightgrey + + products: + gliph: ' + + ' + back_color: cornflowerblue + fore_color: lightgrey + + parties: + gliph: ' + + ' + back_color: gold + fore_color: grey + + requirements: + gliph: ' + + ' + back_color: darkorange + fore_color: dimgrey + + business_objects: + gliph: ' + + ' + back_color: turquoise + fore_color: dimgrey + + + + + + + no_icon: ' + + {{title}} + + ' + + + +dochub.essentials.config: + - key: icons + list: + - seaf.icons \ No newline at end of file diff --git a/entities/ba/menu.yaml b/entities/ba/menu.yaml new file mode 100644 index 0000000..0e8ba5e --- /dev/null +++ b/entities/ba/menu.yaml @@ -0,0 +1,38 @@ +# Default Menu +seaf.nav: + - title: Архитектура/Архитектура Бизнеса + includes: + - title: Базовые представления SEAF-CORE + includes: + - title: Участники + link: "/entities/seaf.ba.parties/org_str_wrapper" + order: 200 + # includes: + # - title: Фликс + # link: "/entities/seaf.ba.parties/org_str_wrapper?domain=flix" + # order: 200 + - title: Продуктовый ландшафт + link: "/entities/seaf.ba.products/landscape_wrapper" + order: 210 + # includes: + # - title: Фликс + # link: "/entities/seaf.ba.products/landscape_wrapper?domain=flix" + # order: 210 + + - title: Карта процессов + link: "/entities/seaf.ba.processes/process_map_wrapper" + order: 220 + - title: Распределение Процессов + link: "/entities/seaf.ba.processes/process_distribution_wrapper" + order: 221 + - title: Сеть процессов + link: "/entities/seaf.ba.processes/process_network_wrapper" + order: 230 + - title: Использование ресурсов + link: "/entities/seaf.ba.resources/resources_usage_wrapper" + order: 300 + # includes: + # - title: Фликс + # link: "/entities/seaf.ba.resources/resources_usage_wrapper?domain=flix" + # order: 300 + diff --git a/entities/ba/parties/parties.yaml b/entities/ba/parties/parties.yaml index f9371f7..dffb507 100644 --- a/entities/ba/parties/parties.yaml +++ b/entities/ba/parties/parties.yaml @@ -2,6 +2,7 @@ entities: seaf.ba.parties: title: Участники + schema: type: object @@ -25,11 +26,23 @@ entities: $ref: "#/$rels/seaf.ba.products.product" required: - id + accepts: + title: для + description: отношение Ресурс - для кого? -> для Участника + type: array + items: + $ref: "#/properties/seaf.ba.resources/$resources" + feeds: + title: передает + description: отношение Участникк -передает или отчуждает что? -> Ресурс + type: array + items: + $ref: "#/properties/seaf.ba.resources/$resources" is_part_of: title: Является частью description: Отношение n к 1 для описания строгих иерархических связей $ref: "#/$rels/seaf.ba.parties.party" - relates: + relates_to: title: Агрегирующая сущность description: Отношение n к m для описания множественных категорий (фасетных признаков) type: array @@ -45,71 +58,132 @@ entities: presentations: - party_summary: + org_str_wrapper: + title: Оргструктура type: markdown - template: templates/party_summary.md + template: templates/org_str_wrapper.md source: > ( $domain:= $params.domain; + {"count": $count($."seaf.ba.parties".$keys()), + "domain": $domain + } + ) + + org_str_graph: + title: Оргструктура (граф) + type: smartants + source: > + ( + $icons:= $."seaf.icons"; + $ctx:= $params.domain; + + + $parties:= $ctx and $_essentials._jsonata_function + ? $context_content_refined($ctx, $).observable[($.$keys() = "membersOrd" or $.$keys() = "membersCtx") and $.*.body.entity_id = "seaf.ba.parties"].*.[{$.id: $.body}] + + /*? $context_content_refined($ctx, $).observable.*[$.body.entity_id = "seaf.ba.parties"].[{$.id: $.body}]*/ + : $spread($."seaf.ba.parties").[$~>|$.*|{"entity_id": "parties"}|]; + + $icons:= $."seaf.icons"; + $pre_nodes:= $parties.$map($, function($v) {( + $title:= $v.*.title ? $v.*.title : "untitled"; + $size:= $length($title); + $symbol_width:= 25 + ($size > 7 ? $size*14 : $size*16 ); + $symbol:= $_essentials._jsonata_function + ? $getSymbol_t1($title, $v.*.entity_id, $symbol_width, $icons) + : $getSymbol($title, $v.*.entity_id, $symbol_width, $icons); + $node_id:= $split($v.$keys(), ".")[-1] + ? $split($v.$keys(), ".")[-1] + : $v.$keys(); + + { "nodes": { + $node_id: { + "title": $title, + "symbol": $symbol.title + } + }, - $party:= $spread($."seaf.ba.parties")[$keys($) = $domain]; + "links": $append( + $v.*.is_part_of + ? [ + { "from": $node_id, + "to": ($split($v.*.is_part_of, ".")[-1] + ? $split($v.*.is_part_of, ".")[-1] + : $v.*.is_part_of), + "title": "является частью", + "style": "->" + } + ] + : [], + + $map($v.*.relates_to, function($vv) { + $vv ? + { "from": ($split($v.$keys(), ".")[-1] ? $split($v.$keys(), ".")[-1] : $v.$keys()), + "to": ($split($vv, ".")[-1] ? $split($vv, ".")[-1] : $vv), + "title": "относится к", + "style": "-[#green]->" + } + }) + ), + + "symbols": { + $symbol.title: $symbol.svg} + }; + )}); + + $nodes:= $merge($pre_nodes.nodes); - $counterparts:= [$spread($."seaf.ba.parties")[ - $contains($keys($), $domain) and - $substringBefore($keys($), $domain) = "" and - $substringAfter($keys($), $domain) != "" and - $count([$.*.is_part_of[$contains($, $domain)]])=0 - ] - .{ "domain": $keys($), - "title": $.*.title, - "description": $.*.description - } - ]; - - $members:= [$spread($."seaf.ba.parties")[$domain in $.*.is_part_of].{"domain": $keys($), "title": $.*.title, "description": $.*.description}]; - - $managedBy:= [$party.*.is_part_of.{"domain": $, "title": $lookup($$."seaf.ba.parties", $).title, "description": $lookup($$."seaf.ba.parties", $).description}]; - - $owned_products:= $spread($."seaf.ba.products")[$.*.owner = $domain]; - $owned_products:= $map($owned_products, function($v) { - {"id": $keys($v), - "body": $v.* - } - }); - - $consumed_products_id:= $party.*.has_interest; - $consumed_products:= $map($consumed_products_id, function($v) { - {"id": $v, - "body": $lookup($$."seaf.ba.products",$v) - } - }); - - $processes_owned:= $spread($."seaf.ba.processes")[$.*.owner = $domain]; - $processes_owned:= $map($processes_owned, function($v) { - {"id": $keys($v), - "body": $v.*, - "alias": [$map($v.*.alias, function($vv) { - {"alias_id": $vv, - "alias_body": $lookup($$."seaf.ba.processes", $vv)} - })] - } - }); - - $party:= {"id": $keys($party), - "body": $party.*, - "products_num": $count($owned_products) + $count($consumed_products), - "counterparts_num": $count($counterparts), - "counterparts": $counterparts, - "members_num": $count($members), - "members": $members, - "managedBy_num": $count($managedBy), - "managedBy": $managedBy, - "owner_num": $count($owned_products), - "owner": $owned_products, - "consumes_num": $count($consumed_products), - "consumes": $consumed_products, - "processes_owned_num": $count($processes_owned), - "processes_owned": $processes_owned - } + {"config": { + "distance": 10, + "trackWidth": 24, + "hideLeafTitles": true + }, + "symbols": $merge($pre_nodes.symbols), + "nodes": $nodes, + "links": [$pre_nodes.links][$.from in $nodes.$keys() and $.to in $nodes.$keys()] + } ) + +functions: + + seaf_parties_contexts: + title: Авто-контексты + description: Возвращает перечень авто-контекстов (Участники с доменными именами верхнего уровня) и пути в меню + params: + - type: object + title: Область поиска контекстов (глобальный Контекст -- $$) + alias: ctx + required: true + code: > + ( + $ctx:= ctx; + + $parties:= $ctx."seaf.ba.parties"; + $top_domains:= $parties + ? $seaf_ddd_top($parties); /*auto top domains discovery goes through parties (main arch entity)*/ + $contexts_id:= $distinct($top_domains); + + $contexts:= $map($contexts_id, function($v){( + $full_paths:= $seaf_ddd_tree($v).paths; + + $menu_path:= function($arr, $i, $path){( + $obj:= $arch_objects($ctx)[$.object_id = $arr[$i] and $.entity_id = "seaf.ba.parties"]; + $not($i > 0) + ? $path:= $obj.object_title + : $path:= $path & "/" & $obj.object_title; + + $i < $count($arr)-1 + ? $menu_path($arr, $i+1, $path) + : {"context": $v, "menu_path": $path, "entity_id": $obj.entity_id, "entity_title": $obj.entity_title} + )}; $menu_path([$full_paths], 0, ""); + + )}); + [$contexts]; + ) + result: + type: array + description: массив объектов {location, link(presentation)} + + diff --git a/entities/ba/parties/templates/org_str_wrapper.md b/entities/ba/parties/templates/org_str_wrapper.md new file mode 100644 index 0000000..2b743d3 --- /dev/null +++ b/entities/ba/parties/templates/org_str_wrapper.md @@ -0,0 +1,17 @@ +{{#count}} +# Структура Участников + +![](@entity/seaf.ba.parties/org_str_graph?domain={{domain}}) +{{/count}} + +{{^count}} +:warning: Участники не опредены + +--- +Создайте минимальное определение хотя бы одного Участника +```yaml +seaf.ba.parties: # Раздел манифеста для объявления Участников + party_id: + title: Наименование Участника +``` +{{/count}} \ No newline at end of file diff --git a/entities/ba/parties/templates/party_summary.md b/entities/ba/parties/templates/party_summary.md deleted file mode 100644 index 0bb74b2..0000000 --- a/entities/ba/parties/templates/party_summary.md +++ /dev/null @@ -1,73 +0,0 @@ -###### Сводная информация по Участнику :id: {{id}} - ---- -# Участник: "{{body.title}}" - -{{body.description}} - -{{#products_num}}#### Продукты{{/products_num}} -{{#owner_num}}###### предоставляемые{{/owner_num}} -{{#owner}} -* ["{{body.title}}" :id: {{id}}](/entities/seaf.ba.products/product_summary?id={{id}}) {{#description}}-- {{.}}{{/description}} -{{#alias}} -{{#alias_body}} - * ["{{alias_body.title}}" :id: {{alias_id}}](/entities/seaf.ba.products/product_summary?id={{alias_id}}) {{#alias_body.description}}-- {{.}}{{/alias_body.description}} -{{/alias_body}} -{{^alias_body}} - * :warning: Справочное значение отсутствует :id: {{id}} -{{/alias_body}} -{{/alias}} -{{/owner}} - -{{#processes_owned_num}}#### Владение процессами{{/processes_owned_num}} -{{#processes_owned}} -* ["{{body.title}}" :id: {{id}}](/entities/seaf.ba.processes/process_summary?id={{id}}) {{#description}}-- {{.}}{{/description}} -{{#alias}} -{{#alias_body}} - * ["{{alias_body.title}}" :id: {{alias_id}}](/entities/seaf.ba.processes/process_summary?id={{alias_id}}) {{#alias_body.description}}-- {{.}}{{/alias_body.description}} -{{/alias_body}} -{{^alias_body}} - * :warning: Справочное значение отсутствует :id: {{id}} -{{/alias_body}} -{{/alias}} -{{/processes_owned}} - - -{{#consumes_num}}###### потребляемые{{/consumes_num}} -{{#consumes}} -* ["{{body.title}}" :id: {{id}}](/entities/seaf.ba.products/product_summary?id={{id}}) {{#description}}-- {{.}}{{/description}} -{{#alias}} -{{#alias_body}} - * ["{{alias_body.title}}" :id: {{alias_id}}](/entities/seaf.ba.products/product_summary?id={{alias_id}}) {{#alias_body.description}}-- {{.}}{{/alias_body.description}} -{{/alias_body}} -{{^alias_body}} - * :warning: Справочное значение отсутствует :id: {{id}} -{{/alias_body}} -{{/alias}} -{{/consumes}} - - -{{#counterparts_num}}#### Контрагенты:{{/counterparts_num}} -{{#counterparts}} -* ["{{title}}" :id: {{domain}}](/entities/seaf.ba.parties/party_summary?domain={{domain}}) {{#description}}-- {{.}}{{/description}} -{{#alias}} -{{#body_com}} - * ["{{body_com.title}}" :id: {{id}}](/entities/seaf.ba.parties/party_summary?domain={{id}}) {{#body_com.description}}-- {{.}}{{/body_com.description}} -{{/body_com}} -{{^body_com}} - * :warning: Справочное значение отсутствует :id: {{id}} -{{/body_com}} -{{/alias}} -{{/counterparts}} - - -{{#managedBy_num}}#### Входит в состав:{{/managedBy_num}} -{{#managedBy}} -* ["{{title}}" :id: {{domain}}](/entities/seaf.ba.parties/party_summary?domain={{domain}}) {{#description}}-- {{.}}{{/description}} -{{/managedBy}} - -{{#members_num}}#### Внутренняя структура:{{/members_num}} -{{#members}} -* ["{{title}}" :id: {{domain}}](/entities/seaf.ba.parties/party_summary?domain={{domain}}) {{#description}}-- {{.}}{{/description}} -{{/members}} - diff --git a/entities/ba/processes/processes.yaml b/entities/ba/processes/processes.yaml index a067a4c..942ebb6 100644 --- a/entities/ba/processes/processes.yaml +++ b/entities/ba/processes/processes.yaml @@ -1,6 +1,6 @@ entities: seaf.ba.processes: - title: Бизнес-процессы + title: Процессы schema: type: object patternProperties: @@ -17,21 +17,44 @@ entities: title: Владелец type: string $ref: "#/$rels/seaf.ba.parties.party" - is_part_of: #todo changed from "relates" -- check hex - title: композитная сущность (процесс более высокого уровня) - type: string - $ref: "#/$rels/seaf.ba.processes.process" next_processes: title: следующий процесс в последовательности type: array items: $ref: "#/$rels/seaf.ba.processes.process" + supported: + title: поддерживает + description: Ресурсы - используются, но не трансформируются, реализуют выполнение чего?-> Процесса + type: array + items: + $ref: "#/properties/seaf.ba.resources/$resources" + consumes: + title: потребляется + description: Ресурсы - потребляются, расходуются при выполнении чего?-> Процесса + type: array + items: + $ref: "#/properties/seaf.ba.resources/$resources" + produces: + title: производит + description: отношение Процесс - имеет на выход что? -> Ресурсы + type: array + items: + $ref: "#/properties/seaf.ba.resources/$resources" requirements: title: Требования процесса type: array items: $ref: "#/$rels/seaf.change.requirements.requirement" - products: #todo not converted to hex + is_part_of: + title: композитная сущность (процесс более высокого уровня) + type: string + $ref: "#/$rels/seaf.ba.processes.process" + products: + title: Отнесение к Продукту + type: array + items: + $ref: "#/$rels/seaf.ba.products.product" + relates_to: #todo not converted to hex title: Связь с продуктами type: array items: @@ -47,79 +70,268 @@ entities: presentations: - process_summary: + process_map_wrapper: + title: Карта процессов type: markdown - template: templates/process_summary.md + template: templates/process_map_wrapper.md source: > ( - $id:= $params.id; - - $process:= $spread($$."seaf.ba.processes")[$keys($) = $id]; - - $owner:= $spread($$."seaf.ba.parties")[$keys($) = $process.*.owner]; - $owner:= $owner ? { - "id": $keys($owner), - "body": $owner.* - }; - $products:= $spread($$."seaf.products")[$keys($) in $process.*.products]; - $products:= $map($products, function($v) { - { - "id": $keys($v), - "body": $v.* - } - }); - - $reqs:= $spread($$."seaf.change.requirements")[$keys($) in $process.*.requirements]; - $reqs:= $map($reqs, function($v) { - { - "id": $keys($v), - "body": $v.*, - "alias": $map($process.*.alias, function($vv) { - {"alias_id": $vv, - "alias_body": $lookup($$."seaf.ba.requirements", $vv)} - }) - } - }); - - $systems:= $spread($$.components)[$id in $.*.processes]; - $systems:= $map($systems, function($v) { - { - "id": $keys($v), - "body": $v.*, - "alias": $map($process.*.alias, function($vv) { - {"alias_id": $vv, - "alias_body": $lookup($$.components, $vv)} - }) - } - }); - - $biz_obj:= $spread($$."seaf.ia.business_objects")[$id in $.*.processes]; - $biz_obj:= $map($biz_obj, function($v) { - { - "id": $keys($v), - "body": $v.*, - "alias": $map($process.*.alias, function($vv) { - {"alias_id": $vv, - "alias_body": $lookup($$."seaf.ia.business_objects", $vv)} - }) - } - }); + $domain:= $params.domain; + + {"count": $count($."seaf.ba.products".$keys()), + "domain": $domain + } + ) + process_network_wrapper: + title: Сеть процессов + type: markdown + template: templates/process_network_wrapper.md + source: > + ( + $domain:= $params.domain; + + {"count": $count($."seaf.ba.products".$keys()), + "domain": $domain + } + ) - { - "id": $id, - "body": $process.*, - "owner_num": $count($owner), - "owner": $owner, - "requirements_num": $count($reqs), - "requirements": $reqs, - "products_num": $count($products), - "products": $products, - "systems_num": $count($systems), - "systems": $systems, - "biz_obj_num": $count($biz_obj), - "biz_obj": $biz_obj + process_distribution_wrapper: + title: Распределение Процессов по Продуктам + type: markdown + template: templates/process_distribution_wrapper.md + source: > + ( + $domain:= $params.domain; + + {"count": $count($."seaf.ba.products".$keys()), + "domain": $domain } + + ) + + process_network_graph: + title: Сеть процессов (граф) + type: smartants + source: > + ( + $ctx:= $params.domain; + + $processes:= $ctx and $_essentials._jsonata_function + ? $context_content_refined($ctx, $).observable[($.$keys() = "membersOrd" or $.$keys() = "membersCtx") and $.*.body.entity_id = "seaf.ba.processes"].*.[{$.id: $.body}] + : $spread($."seaf.ba.processes").[$~>|$.*|{"entity_id": "processes"}|]; + + /*$processes:= $spread($."seaf.ba.processes").[$~>|$.*|{"entity_id": "processes"}|];*/ + + $parties:= $ctx and $_essentials._jsonata_function + ? $context_content_refined($ctx, $).observable[($.$keys() = "membersOrd" or $.$keys() = "membersCtx") and $.*.body.entity_id = "seaf.ba.parties"].*[$.$keys() in $processes.*.*.owner].[{$.id: $.body}] + : $spread($."seaf.ba.parties")[$.$keys() in $processes.*.*.owner].[$~>|$.*|{"entity_id": "parties"}|]; + + /*$parties:= $spread($."seaf.ba.parties")[$.$keys() in $processes.*.*.owner].[$~>|$.*|{"entity_id": "parties"}|];*/ + + $requirements:= $ctx and $_essentials._jsonata_function + ? $context_content_refined($ctx, $).observable[($.$keys() = "membersOrd" or $.$keys() = "membersCtx") and $.*.body.entity_id = "seaf.change.requirements"].*[$.$keys() in $processes.*.*.requirements].[{$.id: $.body}] + : $spread($."seaf.change.requirements")[$.$keys() in $processes.*.*.owner].[$~>|$.*|{"entity_id": "requirements"}|]; + + /*$requirements:= $spread($."seaf.change.requirements")[$.$keys() in $processes.*.*.requirements].[$~>|$.*|{"entity_id": "requirements"}|];*/ + + $processes_parties:= $append($processes, $parties); + $processes_parties_requirements:= $append($processes_parties, $requirements); + + $icons:= $."seaf.icons"; + $pre_nodes:= $processes_parties_requirements.$map($, function($v) {( + $title:= $v.*.title ? $v.*.title : "untitled"; + $size:= $length($title); + $symbol_width:= 25 + ($size > 7 ? $size*14 : $size*16 ); + $symbol:= $_essentials._jsonata_function + ? $getSymbol_t1($title, $v.*.entity_id, $symbol_width, $icons) + : $getSymbol($title, $v.*.entity_id, $symbol_width, $icons); + { "nodes": { + ($split($v.$keys(), ".")[-1] ? $split($v.$keys(), ".")[-1] : $v.$keys()): { + "title": $title, + "symbol": $symbol.title} + }, + "links": $append($append( + $v.*.owner ? + [ + { "from": ($split($v.$keys(), ".")[-1] ? $split($v.$keys(), ".")[-1] : $v.$keys()), + "to": ($split($v.*.owner, ".")[-1] ? $split($v.*.owner, ".")[-1] : $v.*.owner), + "title": "владелец", + "style": "->" + } + + ] : [], + + $map($v.*.next_processes, function($vv) { + $count($vv)>0 ? + { "from": ($split($v.$keys(), ".")[-1] ? $split($v.$keys(), ".")[-1] : $v.$keys()), + "to": ($split($vv, ".")[-1] ? $split($vv, ".")[-1] : $vv), + "title": "next", + "style": "-[#green]->" + + } + }) + ), + $map($v.*.requirements, function($vv) { + $count($vv)>0 ? + { "from": ($split($v.$keys(), ".")[-1] ? $split($v.$keys(), ".")[-1] : $v.$keys()), + "to": ($split($vv, ".")[-1] ? $split($vv, ".")[-1] : $vv), + "title": "предъявляет", + "style": "-[#orange]->" + + } + }) + ), + + "symbols": { + $symbol.title: $symbol.svg} + }; + )}); + $nodes:= $merge($pre_nodes.nodes); + + {"config": { + "distance": 10, + "trackWidth": 24, + "hideLeafTitles": true + }, + "symbols": $merge($pre_nodes.symbols), + "nodes": $nodes, + "links": [$pre_nodes.links][$.from in $nodes.$keys() and $.to in $nodes.$keys()] + } + ) + + process_map_graph: + title: Сеть процессов (граф) + type: smartants + source: > + ( + $ctx:= $params.domain; + + $processes:= $ctx and $_essentials._jsonata_function + ? $context_content_refined($ctx, $).observable[($.$keys() = "membersOrd" or $.$keys() = "membersCtx") and $.*.body.entity_id = "seaf.ba.processes"].*.[{$.id: $.body}] + : $spread($."seaf.ba.processes").[$~>|$.*|{"entity_id": "processes"}|]; + + /*$processes:= $spread($."seaf.ba.processes").[$~>|$.*|{"entity_id": "processes"}|];*/ + + $processes_parties:= $append($processes, $parties); + $processes_parties_requirements:= $append($processes_parties, $requirements); + + $icons:= $."seaf.icons"; + $pre_nodes:= $processes.$map($, function($v) {( + $title:= $v.*.title ? $v.*.title : "untitled"; + $size:= $length($title); + $symbol_width:= 25 + ($size > 7 ? $size*14 : $size*16 ); + $symbol:= $_essentials._jsonata_function + ? $getSymbol_t1($title, $v.*.entity_id, $symbol_width, $icons) + : $getSymbol($title, $v.*.entity_id, $symbol_width, $icons); + { "nodes": { + $v.$keys(): { + "title": $title, + "symbol": $symbol.title} + }, + "links": $v.*.is_part_of ? + [ + { "from": $v.$keys(), + "to": $v.*.is_part_of, + "title": "является частью", + "style": "->" + } + + ] : [], + + "symbols": { + $symbol.title: $symbol.svg} + }; + )}); + + $nodes:= $merge($pre_nodes.nodes); + + {"config": { + "distance": 10, + "trackWidth": 24, + "hideLeafTitles": true + }, + "symbols": $merge($pre_nodes.symbols), + "nodes": $nodes, + "links": [$pre_nodes.links] + } + ) + + process_distribution_graph: + title: Распределение Процессов по Продуктам (граф) + type: smartants + source: > + ( + $ctx:= $params.domain; + + $processes:= $ctx and $_essentials._jsonata_function + ? $context_content_refined($ctx, $).observable[($.$keys() = "membersOrd" or $.$keys() = "membersCtx") and $.*.body.entity_id = "seaf.ba.processes"].*.[{$.id: $.body}] + : $spread($."seaf.ba.processes").[$~>|$.*|{"entity_id": "processes"}|]; + + + $parties:= $ctx and $_essentials._jsonata_function + ? $context_content_refined($ctx, $).observable[($.$keys() = "membersOrd" or $.$keys() = "membersCtx") and $.*.body.entity_id = "seaf.ba.parties"].*[$.$keys() in $processes.*.*.owner].[{$.id: $.body}] + : $spread($."seaf.ba.parties")[$.$keys() in $processes.*.*.owner].[$~>|$.*|{"entity_id": "parties"}|]; + + $products:= $ctx and $_essentials._jsonata_function + ? $context_content_refined($ctx, $).observable[($.$keys() = "membersOrd" or $.$keys() = "membersCtx") and $.*.body.entity_id = "seaf.ba.products"].*.[{$.id: $.body}] + : $spread($."seaf.ba.products").[$~>|$.*|{"entity_id": "products"}|]; + + $processes_parties:= $append($processes, $parties); + $processes_parties_products:= $append($processes_parties, $products); + + $icons:= $."seaf.icons"; + $pre_nodes:= $processes_parties_products.$map($, function($v) {( + $title:= $v.*.title ? $v.*.title : "untitled"; + $size:= $length($title); + $symbol_width:= 25 + ($size > 7 ? $size*14 : $size*16 ); + $symbol:= $_essentials._jsonata_function + ? $getSymbol_t1($title, $v.*.entity_id, $symbol_width, $icons) + : $getSymbol($title, $v.*.entity_id, $symbol_width, $icons); + { "nodes": { + ($split($v.$keys(), ".")[-1] ? $split($v.$keys(), ".")[-1] : $v.$keys()): { + "title": $title, + "symbol": $symbol.title} + }, + "links": $append( + $v.*.owner ? + [ + { "from": ($split($v.$keys(), ".")[-1] ? $split($v.$keys(), ".")[-1] : $v.$keys()), + "to": ($split($v.*.owner, ".")[-1] ? $split($v.*.owner, ".")[-1] : $v.*.owner), + "title": "владелец", + "style": "->" + } + + ] : [], + + $map($v.*.products, function($vv) { + $count($vv)>0 ? + { "from": ($split($v.$keys(), ".")[-1] ? $split($v.$keys(), ".")[-1] : $v.$keys()), + "to": ($split($vv, ".")[-1] ? $split($vv, ".")[-1] : $vv), + "title": "относится к", + "style": "-[#green]->" + + } + }) + ), + + "symbols": { + $symbol.title: $symbol.svg} + }; + )}); + + $nodes:= $merge($pre_nodes.nodes); + + {"config": { + "distance": 10, + "trackWidth": 24, + "hideLeafTitles": true + }, + "symbols": $merge($pre_nodes.symbols), + "nodes": $nodes, + "links": [$pre_nodes.links][$.from in $nodes.$keys() and $.to in $nodes.$keys()] + } ) + diff --git a/entities/ba/processes/templates/process_distribution_wrapper.md b/entities/ba/processes/templates/process_distribution_wrapper.md new file mode 100644 index 0000000..4a62c35 --- /dev/null +++ b/entities/ba/processes/templates/process_distribution_wrapper.md @@ -0,0 +1,16 @@ +{{#count}} +# Распределение Процессов по продуктам + +![](@entity/seaf.ba.processes/process_distribution_graph?domain={{domain}}) +{{/count}} +{{^count}} +:warning: Процессы не опредены + +--- +Создайте минимальное определение хотя бы одного Процесса +```yaml +seaf.ba.processes: # Раздел манифеста для объявления Процессов + process_id: + title: Наименование Процесса +``` +{{/count}} \ No newline at end of file diff --git a/entities/ba/processes/templates/process_map_wrapper.md b/entities/ba/processes/templates/process_map_wrapper.md new file mode 100644 index 0000000..024be78 --- /dev/null +++ b/entities/ba/processes/templates/process_map_wrapper.md @@ -0,0 +1,16 @@ +{{#count}} +# Карта процессов + +![](@entity/seaf.ba.processes/process_map_graph?domain={{domain}}) +{{/count}} +{{^count}} +:warning: Процессы не опредены + +--- +Создайте минимальное определение хотя бы одного Процесса +```yaml +seaf.ba.processes: # Раздел манифеста для объявления Процессов + process_id: + title: Наименование Процесса +``` +{{/count}} \ No newline at end of file diff --git a/entities/ba/processes/templates/process_network_wrapper.md b/entities/ba/processes/templates/process_network_wrapper.md new file mode 100644 index 0000000..d0a03c7 --- /dev/null +++ b/entities/ba/processes/templates/process_network_wrapper.md @@ -0,0 +1,15 @@ +{{#count}} +# Сеть процессов +![](@entity/seaf.ba.processes/process_network_graph?domain={{domain}}) +{{/count}} +{{^count}} +:warning: Процессы не опредены + +--- +Создайте минимальное определение хотя бы одного Процесса +```yaml +seaf.ba.processes: # Раздел манифеста для объявления Процессов + process_id: + title: Наименование Процесса +``` +{{/count}} \ No newline at end of file diff --git a/entities/ba/processes/templates/process_summary.md b/entities/ba/processes/templates/process_summary.md deleted file mode 100644 index ca77ad2..0000000 --- a/entities/ba/processes/templates/process_summary.md +++ /dev/null @@ -1,81 +0,0 @@ -###### Сводная информация по Процессу :id: {{id}} - ---- -# Процесс: "{{body.title}}" - -{{body.description}} - -{{#owner_num}} -{{#owner}} -### Владелец -["{{body.title}}" :id: {{id}}](/entities/seaf.ba.parties/party_summary?domain={{id}}) {{#body.description}}-- {{.}}{{/body.description}} -{{#alias}} -{{#alias_body}} -* ["{{alias.body.title}}" :id: {{alias.id}}](/entities/seaf.ba.parties/party_summary?domain={{alias.id}}) {{#alias_body.description}}-- {{.}}{{/alias_body.description}} -{{/alias_body}} -{{^alias_body}} -* :warning: Справочное значение отсутствует :id: {{id}} -{{/alias_body}} -{{/alias}} -{{/owner}} -{{/owner_num}} -{{^owner_num}} -:warning: Владелец не указан -{{/owner_num}} - - -{{#products_num}}#### Поддерживает Продукты:{{/products_num}} -{{#products}} -* ["{{body.title}}" :id: {{id}}](/entities/seaf.ba.products/product_summary?id={{id}}) {{#description}}-- {{.}}{{/description}} -{{#alias}} -{{#alias_body}} - * ["{{alias_body.title}}" :id: {{alias_id}}](/entities/seaf.ba.products/product_summary?id={{alias_id}}) {{#alias_body.description}}-- {{.}}{{/alias_body.description}} -{{/alias_body}} -{{^alias_body}} - * :warning: Справочное значение отсутствует :id: {{id}} -{{/alias_body}} -{{/alias}} -{{/products}} - -{{#requirements_num}}#### Требования:{{/requirements_num}} -{{#requirements}} -* ["{{body.title}}" :id: {{id}}](/entities/seaf.change.requirements/blank?seaf-req-id={{id}}) {{#description}}-- {{.}}{{/description}} -{{#alias}} -{{#alias_body}} - * ["{{alias_body.title}}" :id: {{alias_id}}](/entities/seaf.change.requirements/blank?seaf-req-id={{alias_id}}) {{#alias_body.description}}-- {{.}}{{/alias_body.description}} -{{/alias_body}} -{{^alias_body}} - * :warning: Справочное значение отсутствует :id: {{id}} -{{/alias_body}} -{{/alias}} -{{/requirements}} - - -{{#biz_obj_num}}###### Бизнес-объекты{{/biz_obj_num}} -{{#biz_obj}} -* ["{{body.title}}" :id: {{id}}](/entities/seaf.ia.business_objects/card?id={{id}}) {{#description}}-- {{.}}{{/description}} -{{#alias}} -{{#alias_body}} - * ["{{alias_body.title}}" :id: {{alias_id}}](/entities/seaf.ia.business_objects/card?id={{alias_id}}) {{#alias_body.description}}-- {{.}}{{/alias_body.description}} -{{/alias_body}} -{{^alias_body}} - * :warning: Справочное значение отсутствует :id: {{id}} -{{/alias_body}} -{{/alias}} -{{/biz_obj}} - - -{{#systems_num}}#### Автоматизация:{{/systems_num}} -{{#systems}} -* ["{{title}}" :id: {{domain}}](/entities/component/summary?component={{id}}) {{#description}}-- {{.}}{{/description}} -{{#alias}} -{{#body_com}} - * ["{{body_com.title}}" :id: {{id}}](/entities/component/summary?component={{id}}) {{#body_com.description}}-- {{.}}{{/body_com.description}} -{{/body_com}} -{{^body_com}} - * :warning: Справочное значение отсутствует :id: {{id}} -{{/body_com}} -{{/alias}} -{{/systems}} - - diff --git a/entities/ba/products/products.yaml b/entities/ba/products/products.yaml index 0174114..0a8be58 100644 --- a/entities/ba/products/products.yaml +++ b/entities/ba/products/products.yaml @@ -1,6 +1,6 @@ entities: seaf.ba.products: - title: Продукты или услуги + title: Продукты schema: type: object patternProperties: @@ -17,11 +17,24 @@ entities: title: Владелец продукта type: string $ref: "#/$rels/seaf.ba.parties.party" + receives: + title: поступает на вход + description: Ресурс - идет на вход чему? -> Продукту + type: array + items: + $ref: "#/properties/seaf.ba.resources/$resources" + delivers: + title: предоставляет + description: отношение Продукт - предоставляет что? -> Ресурс + type: array + items: + $ref: "#/properties/seaf.ba.resources/$resources" used_in: title: используется в type: array items: $ref: "#/$rels/seaf.ba.products.product" + required: - title - owner @@ -33,81 +46,90 @@ entities: presentations: - product_summary: + landscape_wrapper: + title: Продуктовый ландшафт type: markdown - template: templates/product_summary.md + template: templates/landscape_wrapper.md + source: > + ( + $domain:= $params.domain; + + {"count": $count($."seaf.ba.products".$keys()), + "domain": $domain + } + + + ) + + landscape_graph: + title: Продуктовый ландшафт (граф) + type: smartants source: > ( - $id:= $params.id; - $product:= $spread($$."seaf.ba.products")[$keys($) = $id]; + $ctx:= $params.domain; - $owner:= $spread($$."seaf.ba.parties")[$keys($) = $spread($$."seaf.ba.products")[$keys($) = $id].*.owner]; - $owner:= $owner ? { - "id": $keys($owner), - "body": $owner.*, - "alias": $map($owner.*.alias, function($vv) { - {"alias_id": $vv, - "alias_body": $lookup($$."seaf.ba.parties", $vv)} + $parties:= $ctx and $_essentials._jsonata_function + ? $context_content_refined($ctx, $).observable[($.$keys() = "membersOrd" or $.$keys() = "membersCtx") and $.*.body.entity_id = "seaf.ba.parties"].*.[{$.id: $.body}] + : $spread($."seaf.ba.parties").[$~>|$.*|{"entity_id": "parties"}|]; + + $products:= $ctx and $_essentials._jsonata_function + ? $context_content_refined($ctx, $).observable[($.$keys() = "membersOrd" or $.$keys() = "membersCtx") and $.*.body.entity_id = "seaf.ba.products"].*.[{$.id: $.body}] + : $spread($."seaf.ba.products").[$~>|$.*|{"entity_id": "products"}|]; + + $parties_products:= $append($parties, $products); + + $icons:= $."seaf.icons"; + $pre_nodes:= $parties_products.$map($, function($v) {( + $title:= $v.*.title ? $v.*.title : "untitled"; + $size:= $length($title); + $symbol_width:= 25 + ($size > 7 ? $size*14 : $size*16 ); + $symbol:= $_essentials._jsonata_function + ? $getSymbol_t1($title, $v.*.entity_id, $symbol_width, $icons) + : $getSymbol($title, $v.*.entity_id, $symbol_width, $icons); + { "nodes": { + ($split($v.$keys(), ".")[-1] ? $split($v.$keys(), ".")[-1] : $v.$keys()): { + "title": $title, + "symbol": $symbol.title} + }, + "links": $append( + $v.*.owner ? + [ + { "from": ($split($v.$keys(), ".")[-1] ? $split($v.$keys(), ".")[-1] : $v.$keys()), + "to": ($split($v.*.owner, ".")[-1] ? $split($v.*.owner, ".")[-1] : $v.*.owner), + "title": "владелец", + "style": "->" + } + + ] : [], + + $map($v.*.has_interest, function($vv) { + $count($vv)>0 ? + { "from": ($split($v.$keys(), ".")[-1] ? $split($v.$keys(), ".")[-1] : $v.$keys()), + "to": ($split($vv.id, ".")[-1] ? $split($vv.id, ".")[-1] : $vv.id), + "title": "заинтересован", + "style": "-[#green]->" + + } }) - }; - - $consumers:= $spread($$."seaf.ba.parties")[$id in $.*.has_interest]; - $consumers:= $map($consumers, function($v) { - {"id": $keys($v), - "body": $v.*, - "alias": [$map($v.*.alias, function($vv) { - {"alias_id": $vv, - "alias_body": $lookup($$."seaf.ba.parties", $vv)} - })] - } - }); - - $wrappers_id:= $product.*.used_in; - $wrappers:= $map($wrappers_id, function($v) { - {"id": $v, - "body": $lookup($$."seaf.ba.products", $v), - "alias": [$map($lookup($$."seaf.ba.products", $v).alias, function($vv) { - {"alias_id": $vv, - "alias_body": $lookup($$."seaf.ba.products", $vv)} - })] - } - }); - - $wraps:= $spread($$."seaf.ba.products")[$id in $.*.used_in]; - $wraps:= $map($wraps, function($v) { - {"id": $keys($v), - "body": $v.*, - "alias": [$map($v.*.alias, function($vv) { - {"alias_id": $vv, - "alias_body": $lookup($$."seaf.ba.products", $vv)} - })] - } - }); - $processes:= $spread($."seaf.ba.processes")[$id in $.*.products]; - $processes:= $map($processes, function($v) { - {"id": $keys($v), - "body": $v.*, - "alias": [$map($v.*.alias, function($vv) { - {"alias_id": $vv, - "alias_body": $lookup($$."seaf.ba.processes", $vv)} - })] - } - }); - - - - { - "id": $id, - "body": $product.*, - "owner": $owner, - "consumers_num": $count($consumers), - "consumers": $consumers, - "wrappers_num": $count($wrappers), - "wrappers": $wrappers, - "wraps_num": $count($wraps), - "wraps": $wraps, - "processes_num": $count($processes), - "processes": $processes - } + ), + + "symbols": { + $symbol.title: $symbol.svg} + }; + )}); + + $nodes:= $merge($pre_nodes.nodes); + + {"config": { + "distance": 10, + "trackWidth": 24, + "hideLeafTitles": true + }, + "symbols": $merge($pre_nodes.symbols), + "nodes": $nodes, + "links": [$pre_nodes.links][$.from in $nodes.$keys() and $.to in $nodes.$keys()] + } ) + + diff --git a/entities/ba/products/templates/landscape_wrapper.md b/entities/ba/products/templates/landscape_wrapper.md new file mode 100644 index 0000000..9a861ca --- /dev/null +++ b/entities/ba/products/templates/landscape_wrapper.md @@ -0,0 +1,16 @@ +{{#count}} +# Продуктовый ландшафт + +![](@entity/seaf.ba.products/landscape_graph?domain={{domain}}) +{{/count}} +{{^count}} +:warning: Продукты не опредены + +--- +Создайте минимальное определение хотя бы одного Продукта +```yaml +seaf.ba.products: # Раздел манифеста для объявления Продуктов + product_id: + title: Наименование Продукта +``` +{{/count}} \ No newline at end of file diff --git a/entities/ba/products/templates/product_summary.md b/entities/ba/products/templates/product_summary.md deleted file mode 100644 index 2810533..0000000 --- a/entities/ba/products/templates/product_summary.md +++ /dev/null @@ -1,73 +0,0 @@ -###### Сводная информация по Продукту :id: {{id}} - ---- -# Продукт: "{{body.title}}" - -{{body.description}} - -{{#wrappers_num}}###### Потребляется как часть продуктов:{{/wrappers_num}} -{{#wrappers}} -* ["{{body.title}}" :id: {{id}}](/entities/seaf.ba.products/product_summary?id={{id}}) {{#body.description}}-- {{.}}{{/body.description}} -{{#alias}} -{{#alias_body}} - * ["{{alias_body.title}}" :id: {{alias_id}}](/entities/seaf.ba.products/product_summary?id={{alias_id}}) {{#alias_body.description}}-- {{.}}{{/alias_body.description}} -{{/alias_body}} -{{^alias_body}} - * :warning: Справочное значение отсутствует :id: {{alias_id}} -{{/alias_body}} -{{/alias}} -{{/wrappers}} - -{{#wraps_num}}###### Имеет в составе выделенные подпродукты:{{/wraps_num}} -{{#wraps}} -* ["{{body.title}}" :id: {{id}}](/entities/seaf.ba.products/product_summary?id={{id}}) {{#body.description}}-- {{.}}{{/body.description}} -{{#alias}} -{{#alias_body}} - * ["{{alias_body.title}}" :id: {{alias_id}}](/entities/seaf.ba.products/product_summary?id={{alias_id}}) {{#alias_body.description}}-- {{.}}{{/alias_body.description}} -{{/alias_body}} -{{^alias_body}} - * :warning: Справочное значение отсутствует :id: {{alias_id}} -{{/alias_body}} -{{/alias}} -{{/wraps}} - -{{#processes_num}}###### Поддерживается процессами:{{/processes_num}} -{{#processes}} -* ["{{body.title}}" :id: {{id}}](/entities/seaf.ba.processes/process_summary?id={{id}}) {{#body.description}}-- {{.}}{{/body.description}} -{{#alias}} -{{#alias_body}} - * ["{{alias_body.title}}" :id: {{alias_id}}](/entities/seaf.ba.processes/process_summary?id={{alias_id}}) {{#alias_body.description}}-- {{.}}{{/alias_body.description}} -{{/alias_body}} -{{^alias_body}} - * :warning: Справочное значение отсутствует :id: {{alias_id}} -{{/alias_body}} -{{/alias}} -{{/processes}} - - -### Владелец -{{#owner}} -["{{body.title}}" :id: {{id}}](/entities/seaf.ba.parties/party_summary?domain={{id}}) {{#body.description}}-- {{.}}{{/body.description}} -{{#alias}} -{{#alias_body}} -* ["{{alias.body.title}}" :id: {{alias.id}}](/entities/seaf.ba.parties/party_summary?domain={{alias.id}}) {{#alias_body.description}}-- {{.}}{{/alias_body.description}} -{{/alias_body}} -{{^alias_body}} -* :warning: Справочное значение отсутствует :id: {{id}} -{{/alias_body}} -{{/alias}} -{{/owner}} - -{{#consumers_num}}#### Потребители:{{/consumers_num}} -{{#consumers}} -* ["{{body.title}}" :id: {{id}}](/entities/seaf.ba.parties/party_summary?domain={{id}}) {{#body.description}}-- {{.}}{{/body.description}} -{{#alias}} -{{#alias_body}} - * ["{{alias_body.title}}" :id: {{alias_id}}](/entities/seaf.ba.parties/party_summary?domain={{alias_id}}) {{#alias_body.description}}-- {{.}}{{/alias_body.description}} -{{/alias_body}} -{{^alias_body}} - * :warning: Справочное значение отсутствует :id: {{alias_id}} -{{/alias_body}} -{{/alias}} -{{/consumers}} - diff --git a/entities/ba/resources/resources.yaml b/entities/ba/resources/resources.yaml new file mode 100644 index 0000000..71f4455 --- /dev/null +++ b/entities/ba/resources/resources.yaml @@ -0,0 +1,322 @@ +entities: + + seaf.ba.resources: + title: Ресурсы + description: > + Любые объекты, которые используются или трансформируются в Процессах, + принимаются или отчуждаются Участниками, непосредственно или при использовании Продуктов + + objects: # DO NOT code objects of resources -- they are almost any non-ba object (see schema) + resources: + route: "/" + title: Ресурсы + symbol: "resources" + + schema: + $resources: # Used to be included into other ba entities relations attributes + + anyOf: # edit in case: + ### new resource entity added into core -- add $ref accordingly + ### new resource entity imported within extension -- add $ref accordingly + ### resource entity becames/stops to be considerable as resource -- add/remove $ref accordingly + - $ref: "#/$rels/components.component" + - $ref: "#/$rels/seaf.app.integrations.integrations" + - $ref: "#/$rels/seaf.ia.business_objects.business_objects" + - $ref: "#/$rels/seaf.ia.data_objects.data_objects" + - $ref: "#/$rels/seaf.ta.components.server.server" + - $ref: "#/$rels/seaf.ta.components.hw_storage.hw_storage" + - $ref: "#/$rels/seaf.ta.components.network.network" + - $ref: "#/$rels/seaf.ta.components.user_device.user_device" + - $ref: "#/$rels/seaf.ta.services.dc_region.dc_region" + - $ref: "#/$rels/seaf.ta.services.dc_az.dc_az" + - $ref: "#/$rels/seaf.ta.services.dc.dc" + - $ref: "#/$rels/seaf.ta.services.office.office" + - $ref: "#/$rels/seaf.ta.services.cluster.cluster" + - $ref: "#/$rels/seaf.ta.services.compute_service.compute_service" + - $ref: "#/$rels/seaf.ta.services.storage.storage" + - $ref: "#/$rels/seaf.ta.services.cluster_virtualizationn.cluster_virtualization" + - $ref: "#/$rels/seaf.ta.services.k8s.k8s" + - $ref: "#/$rels/seaf.ta.services.network.network" + - $ref: "#/$rels/seaf.ta.services.network_links.network_links" + - $ref: "#/$rels/seaf.ta.services.backup.backup" + - $ref: "#/$rels/seaf.ta.services.monitoring.monitoring" + - $ref: "#/$rels/seaf.ta.services.software.software" + + presentations: + + resources_usage_wrapper: + title: Использование ресурсов + type: markdown + template: templates/resources_usage_wrapper.md + source: > + ( + $domain:= $params.domain; + + {"count": $count($."seaf.ba.parties".$keys()), + "domain": $domain + } + ) + + resources_usage_graph: + title: Использование ресурсов (граф) + type: smartants + source: > + ( + $ctx:= $params.domain; + + $processes:= $ctx and $_essentials._jsonata_function + ? $context_content_refined($ctx, $).observable[($.$keys() = "membersOrd" or $.$keys() = "membersCtx") and $.*.body.entity_id = "seaf.ba.processes"].*.[{$.id: $.body}] + : $spread($."seaf.ba.processes").[$~>|$.*|{"entity_id": "processes"}|]; + + /*Получаем перечень сущностей, которые являются Ресурсом*/ + $resource_types:= $.entities."seaf.ba.resources".schema.**."$ref".$substringAfter($, "#/$rels/").$replace($, "."&$split($ , ".")[-1], "", 1); + + /*Получаем перечень объектов-Ресурсов*/ + $resources:= $reduce($map($resource_types, function($v) { + $spread($eval("$." & "\"" & $v & "\"")).($~>|$.*|{"entity_id": $split($v, ".")[-1]}|) + }), $append); + + $resources:= $resources[$.$keys() in $processes.*.*.consumes or $.$keys() in $processes.*.*.produces or $.$keys() in $processes.*.*.supported]; + + $resources:= $ctx and $_essentials._jsonata_function + ? $context_content_refined($ctx, $).observable[($.$keys() = "membersOrd" or $.$keys() = "membersCtx") and $.*.id in $resources.$keys()].[{$.*.id: $.*.body}] + : $resources; + + $parties:= $ctx and $_essentials._jsonata_function + ? $context_content_refined($ctx, $).observable[($.$keys() = "membersOrd" or $.$keys() = "membersCtx") and $.*.body.entity_id = "seaf.ba.parties"].*[$.$keys() in $processes.*.*.owner].[{$.id: $.body}] + : $spread($."seaf.ba.parties")[$.$keys() in $processes.*.*.owner].[$~>|$.*|{"entity_id": "parties"}|]; + + /*$parties:= $spread($."seaf.ba.parties")[$.$keys() in $processes.*.*.owner].[$~>|$.*|{"entity_id": "parties"}|];*/ + + $requirements:= $ctx and $_essentials._jsonata_function + ? $context_content_refined($ctx, $).observable[($.$keys() = "membersOrd" or $.$keys() = "membersCtx") and $.*.body.entity_id = "seaf.change.requirements"].*[$.$keys() in $processes.*.*.requirements].[{$.id: $.body}] + : $spread($."seaf.change.requirements")[$.$keys() in $processes.*.*.requirements].[$~>|$.*|{"entity_id": "requirements"}|]; + + /*$requirements:= $spread($."seaf.change.requirements")[$.$keys() in $processes.*.*.requirements].[$~>|$.*|{"entity_id": "requirements"}|];*/ + + $processes_parties:= $append($processes, $parties); + $processes_parties_requirements:= $append($processes_parties, $requirements); + $processes_parties_requirements_resources:= $append($processes_parties_requirements, $resources); + + $icons:= $."seaf.icons"; + $pre_nodes:= $processes_parties_requirements_resources.$map($, function($v) {( + $title:= $v.*.title ? $v.*.title : "untitled"; + $size:= $length($title); + $symbol_width:= 25 + ($size > 7 ? $size*14 : $size*16 ); + $symbol:= $_essentials._jsonata_function + ? $getSymbol_t1($title, $v.*.entity_id, $symbol_width, $icons) + : $getSymbol($title, $v.*.entity_id, $symbol_width, $icons); + { "nodes": { + ($split($v.$keys(), ".")[-1] ? $split($v.$keys(), ".")[-1] : $v.$keys()): { + "title": $title, + "symbol": $symbol.title} + }, + "links": + $append( + $append( + $append( + $v.*.owner ? + [ + { "from": ($split($v.$keys(), ".")[-1] ? $split($v.$keys(), ".")[-1] : $v.$keys()), + "to": ($split($v.*.owner, ".")[-1] ? $split($v.*.owner, ".")[-1] : $v.*.owner), + "title": "владелец", + "style": "->" + } + ] : [], + + $map($v.*.next_processes, function($vv) { + $count($vv)>0 ? + { "from": ($split($v.$keys(), ".")[-1] ? $split($v.$keys(), ".")[-1] : $v.$keys()), + "to": ($split($vv, ".")[-1] ? $split($vv, ".")[-1] : $vv), + "title": "next", + "style": "-[#green]->" + } + }) + ), + $map($v.*.requirements, function($vv) { + $count($vv)>0 ? + { "from": ($split($v.$keys(), ".")[-1] ? $split($v.$keys(), ".")[-1] : $v.$keys()), + "to": ($split($vv, ".")[-1] ? $split($vv, ".")[-1] : $vv), + "title": "предъявляет", + "style": "-[#orange]->" + } + }) + ), + + $append( + $append( + $map($v.*.supported, function($vv) { + $count($vv)>0 ? + { "to": ($split($v.$keys(), ".")[-1] ? $split($v.$keys(), ".")[-1] : $v.$keys()), + "from": ($split($vv, ".")[-1] ? $split($vv, ".")[-1] : $vv), + "title": "поддерживает", + "style": "-[#orange]->" + } + }), + + $map($v.*.consumes, function($vv) { + $count($vv)>0 ? + { "to": ($split($v.$keys(), ".")[-1] ? $split($v.$keys(), ".")[-1] : $v.$keys()), + "from": ($split($vv, ".")[-1] ? $split($vv, ".")[-1] : $vv), + "title": "потребляется", + "style": "-[#orange]->" + } + }) + ), + + $map($v.*.produces, function($vv) { + $count($vv)>0 ? + { "from": ($split($v.$keys(), ".")[-1] ? $split($v.$keys(), ".")[-1] : $v.$keys()), + "to": ($split($vv, ".")[-1] ? $split($vv, ".")[-1] : $vv), + "title": "производит", + "style": "-[#orange]->" + } + }) + ) + + + ), + + "symbols": { + $symbol.title: $symbol.svg} + }; + )}); + + $nodes:= $merge($pre_nodes.nodes); + + {"config": { + "distance": 10, + "trackWidth": 24, + "hideLeafTitles": true + }, + "symbols": $merge($pre_nodes.symbols), + "nodes": $nodes, + "links": [$pre_nodes.links][$.from in $nodes.$keys() and $.to in $nodes.$keys()] + } + ) + + + # resources_usage_graph_deprecated: + # title: Использование ресурсов (граф) + # type: smartants + # source: > + # ( + # $processes:= $spread($."seaf.ba.processes").($~>|$.*|{"entity_id": "processes"}|); + + # /*Нестим Процессы в Продукты: Продукт.Процесс*/ + # $nested_processes:= $reduce($map($processes, function($v){( + # $map($v.*.products, function($vv) { + # {$split($vv,".")[-1] & "." & $split($v.$keys(),".")[-1]: $v.*} + + # }) + # )}), $append);$log($processes);$log($nested_processes); + + # /*Получаем перечень сущностей, которые являются Ресурсом*/ + # $resource_types:= $.entities."seaf.ba.resources".schema.**."$ref".$substringAfter($, "#/$rels/").$replace($, "."&$split($ , ".")[-1], "", 1); + + # /*Получаем перечень объектов-Ресурсов*/ + # $resources:= $reduce($map($resource_types, function($v) { + # $spread($eval("$." & "\"" & $v & "\"")).($~>|$.*|{"entity_id": $split($v, ".")[-1]}|) + # }), $append); + + # /*Отфильтровываем Ресурсы, которые не связаны с Процессами*/ + # $resources:= $resources[$.$keys() in $processes.*.consumes or $.$keys() in $processes.*.produces or $.$keys() in $processes.*.supported]; + + + # $products:= $spread($."seaf.ba.products")[$.$keys() in $processes.*.products].($~>|$.*|{"entity_id": "products"}|); + + + # $parties:= $spread($."seaf.ba.parties")[$.$keys() in $processes.*.owner or $.$keys() in $products.*.owner].($~>|$.*|{"entity_id": "parties"}|); + + + # $no_process:= $append($append($parties, $products), $resources); + + # $icons:= $."seaf.icons"; + + # /*Готовим ноды не Процессы*/ + # $no_process:= $no_process.$map($, function($v) {( + # $title:= $v.*.title; + # $size:= $length($title); + # $symbol_width:= 25 + ($size > 7 ? $size*14 : $size*16 ); + # $symbol:= $getSymbol($title, $v.*.entity_id, $symbol_width, $icons); + # { + # ($split($v.$keys(), ".")[-1] ? $split($v.$keys(), ".")[-1] : $v.$keys()): $v.* + # } + # )}); + + # /*Все ноды, включая процессы*/ + # $objects:= $append($nested_processes, $no_process); + + # /*Зная метамодель, готовим SA structure*/ + # $pre_nodes:= $objects.$map($, function($v) {( + # $title:= $v.*.title; + # $size:= $length($title); + # $symbol_width:= 25 + ($size > 7 ? $size*14 : $size*16 ); + # $symbol:= $getSymbol($title, $v.*.entity_id, $symbol_width, $icons); + # { "nodes": { + # ($v.$keys()): { + # "title": $title, + # "symbol": $symbol.title} + # }, + + # "links": $append($append($append( + + # $v.*.owner + # ? [ + # { "from": $v.$keys(), + # "to": ($split($v.*.owner, ".")[-1] ? $split($v.*.owner, ".")[-1] : $v.*.owner), + # "title": "владелец", + # "style": "->" + # } + # ] + # : [], + + # $map($v.*.supported, function($vv) { + # $count($vv)>0 ? + # { "to": $v.$keys(), + # "from": ($split($vv, ".")[-1] ? $split($vv, ".")[-1] : $vv), + # "title": "поддерживает", + # "style": "-[#green]->" + # } + # }) + # ), + + # $map($v.*.consumes, function($vv) { + # $count($vv)>0 ? + # { "to": $v.$keys(), + # "from": ($split($vv, ".")[-1] ? $split($vv, ".")[-1] : $vv), + # "title": "потребляется", + # "style": "-[#orange]->" + # } + # }) + # ), + + # $map($v.*.produces, function($vv) { + # $count($vv)>0 ? + # { "from": $v.$keys(), + # "to": ($split($vv, ".")[-1] ? $split($vv, ".")[-1] : $vv), + # "title": "проииводит", + # "style": "-[#orange]->" + # } + # }) + # ), + + # "symbols": { + # $symbol.title: $symbol.svg} + # }; + # )}); + + + # {"config": { + # "distance": 10, + # "trackWidth": 24, + # "hideLeafTitles": true + # }, + # "symbols": $merge($pre_nodes.symbols), + # "nodes": $merge($pre_nodes.nodes), + # "links": [$pre_nodes.links] + # } + # ) + + + diff --git a/entities/ba/resources/templates/resources_usage_wrapper.md b/entities/ba/resources/templates/resources_usage_wrapper.md new file mode 100644 index 0000000..b5eeb62 --- /dev/null +++ b/entities/ba/resources/templates/resources_usage_wrapper.md @@ -0,0 +1,3 @@ +# Использование ресурсов + +![](@entity/seaf.ba.resources/resources_usage_graph?domain={{domain}}) diff --git a/entities/ba/root.yaml b/entities/ba/root.yaml index 7e14d94..2f516d0 100644 --- a/entities/ba/root.yaml +++ b/entities/ba/root.yaml @@ -1,7 +1,10 @@ imports: - - self/self.yaml - - parties/parties.yaml - - products/products.yaml - - processes/processes.yaml + - base/base.yaml # Иконки, меню, тесты + - menu.yaml # Конфигурация меню + + - parties/parties.yaml # Мета-сущность seaf.ba.parties + - products/products.yaml # Мета-сущность seaf.ba.products + - processes/processes.yaml # Мета-сущность seaf.ba.processes + - resources/resources.yaml # Мета-сущность seaf.ba.resources diff --git a/entities/ba/self/self.yaml b/entities/ba/self/self.yaml deleted file mode 100644 index 0adfa93..0000000 --- a/entities/ba/self/self.yaml +++ /dev/null @@ -1,37 +0,0 @@ -entities: - - seaf.self: - title: Дополнительные архитектуры-субдомены - description: > - Перечень некорневых идентификаторов Участников, чьи архитектуры рассматриваются - - schema: - type: array - items: - $ref: "#/$rels/seaf.ba.parties.party" - - presentations: - - no_archs: - type: markdown - template: templates/no_archs.md - - menu: > - ( - $top_domains:= $seaf_ddd_top($$."seaf.ba.parties"); - $user_defined:= $$."seaf.self" != null ? $$."seaf.self"[$lookup($$."seaf.ba.parties", $)]; - $arch_parties_id:= $distinct($append($top_domains, $user_defined )); - - - $type($arch_parties_id) = "array" - ? $map($arch_parties_id, function($v) { - { - "location": "Архитектура/Бизнес-архитектура/" & $lookup($."seaf.ba.parties", $v).title, - "link": "/entities/seaf.ba.parties/party_summary?domain=" & $v - } - }) - : { - "location": "Архитектура/Бизнес-архитектура/архитектура не определена", - "link": "/entities/seaf.self/no_archs" - }; - ) diff --git a/entities/ba/self/templates/no_archs.md b/entities/ba/self/templates/no_archs.md deleted file mode 100644 index b00b008..0000000 --- a/entities/ba/self/templates/no_archs.md +++ /dev/null @@ -1,15 +0,0 @@ -### :warning: не определено ни одной архитектуры - ---- - -Необходимо определить хотя бы одного Участника. - -Пример: - -```yaml -seaf.ba.parties: - party_id: - title: Наименование Участника -``` - -[Подробнее (root_domain.md)](/docs/seaf.ba.root_domain) \ No newline at end of file diff --git a/entities/ta/README.md b/entities/ta/README.md index 9ba93f9..070ebaf 100644 --- a/entities/ta/README.md +++ b/entities/ta/README.md @@ -9,32 +9,29 @@ ### Технические компоненты Это простейшие сущности технической архитектуры из которых состоит технический сервис. К техничесим компонентам относятся такие простейшие вещи как: -* Клиентское устройство -* Аппаратный сервер -* Виртуальный сервер -* Аппаратная СХД -* Сетевое устройство +* Клиентское устройство (seaf.ta.components.user_device) +* Аппаратный сервер и Виртуальный сервер (seaf.ta.components.server) +* Аппаратная СХД (seaf.ta.components.hw_storage) +* Сетевое устройство (seaf.ta.components.network) ### Технические сервисы Это сущность, которая предоставляет слою прикладной архитектуры вычислительные сервисы. Только технический сервис может иметь связанность со слоем прикладной архитектуры и связанность с требованиями. К техничесим сервисам относятся: -* Регион - пример региона - Россия, Урал, Москва в зависимости от величины инфраструктуры компании -* Зона доступности - часть региона включающая несколько ЦОД объёдинённых высокоскоростным сетевым подключением, но изолированны в питании и физическом расположении -* Центр обработки данных - физическое местоположение в которых размещены вычичслительные ресурсы -* Вычислительный сервис - используется для связи технических компонентов и прикладного слоя в случае если другие технические сервисы не подходят по смыслу использования -* Кластер - используется для описания любых кластеров -* Виртуализация -* Программная СХД -* Объектная СХД -* Контейнеризация - описание оркестрации контейнеров в т.ч. Kubernetes и Open Shift -* Сеть WAN -* Сеть LAN -* Канал передачи данных -* Сервис мониторинга -* Сервер резервного копирования -* Программное обеспечение и лицензии -* Офис +* Регион (seaf.ta.services.dc_region) - пример региона - Россия, Урал, Москва в зависимости от величины инфраструктуры компании +* Зона доступности (seaf.ta.services.dc_az) - часть региона включающая несколько ЦОД объёдинённых высокоскоростным сетевым подключением, но изолированны в питании и физическом расположении +* Центр обработки данных (seaf.ta.services.dc) - физическое местоположение в которых размещены вычичслительные ресурсы +* Вычислительный сервис (seaf.ta.services.compute_service) - используется для связи технических компонентов и прикладного слоя в случае если другие технические сервисы не подходят по смыслу использования +* Кластер (seaf.ta.services.cluster) - используется для описания любых кластеров +* Виртуализация (seaf.ta.services.cluster_virtualization) +* Программная СХД и Объектная СХД (seaf.ta.services.storage) +* Контейнеризация (seaf.ta.services.k8s) - описание платформы контейнерной оркестрации в т.ч. Kubernetes +* Сеть WAN и Сеть LAN (seaf.ta.services.network) +* Канал передачи данных (seaf.ta.services.network_links) - описание выделенных каналов связи +* Сервис мониторинга (seaf.ta.services.monitoring) +* Сервер резервного копирования (seaf.ta.services.backup) +* Программное обеспечение и лицензии (seaf.ta.services.software) +* Офис (seaf.ta.services.office) ## Структура каталогов технической архитектуры -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- @@ -44,12 +41,10 @@ | | | |- ta - Описание метамодели технической архитектуры | | | | |- services.yaml - Описание сущности технических сервисов | | | | |- components.yaml - Описание сущности технических компонентов - | | | | |- menu - Навигация по меню документов | | | | |- presentation - Описание представления объектов ТА | | | | | |- temlates - Шаблоны визуализации документов |- architecture - Архитектурные объекты поставляемые с пакетом | |- ta - Техническая архитектура - | | |- reverse - Архитектура описанная с помощью технологии реверса ## Использование слоя технической архитектуры Рекоменудемый порядок описания архитектуры инфраструктуры: diff --git a/entities/ta/components.yaml b/entities/ta/components.yaml index 1b45687..45d8e60 100644 --- a/entities/ta/components.yaml +++ b/entities/ta/components.yaml @@ -90,7 +90,7 @@ entities: title: Количество NIC type: integer availabilityzone_id: - title: В какие зоны доступности входит DC + title: В какие зоны доступности входит type: array items: $ref: "#/$rels/seaf.ta.services.dc_az.dc_az" diff --git a/entities/ta/functions/functions.yaml b/entities/ta/functions/functions.yaml index d559d20..5df87cb 100644 --- a/entities/ta/functions/functions.yaml +++ b/entities/ta/functions/functions.yaml @@ -1,39 +1,87 @@ functions: - seaf.ta: - get_refs: > - ( - $component := $.c; - $context := $lookup($.entities,$component).**."properties"; - $context.**."$ref".%; - $context.$spread().{ - $keys()[0] : ($split($string($.**."$ref".%."$ref"),"/")[2])~>$replace(/^(.*)(\.\w+)$/,"$1") - }~>$merge(); - ) - get_titles: > - ( - $component := $.c; - $prop := ($lookup($.entities, $component).schema.**."$ref"~>$map( - function($v){ - $contains($v, "def")?( - $v:= $v~>$replace(/.*\/(.*)/, "$1"); - $v = $component?( - $lookup($.entities, $component).schema.**.properties~>$merge() - ):$lookup($.entities.**, $v).properties - ) - }))~>$merge(); - $titles := $merge($prop.$spread().{ - $keys()[0] : $.*.title ? $.*.title : $keys()[0] - }); - $titles := $merge([$titles, {"type":"Тип", "server_id":"Сервер ID"}]); - ) - get_link: > - ( - $href := $.hr; - $v:=$.val; - $type($v) = 'string'? - $link := '/entities/' & $href & '/list?ta-component-id=' & $v: - $type($v) = 'array'? - $count($v) >1?($link:=$v;$log("-+-> " & $link,["MTG"]);):$link := $map($v, function($val){'/entities/' & $href & '/list?ta-component-id=' & $val}): - $link := $v; - /*$log("-*-> "& $link,["MTG"]);*/ - ) + seaf.ta: + get_refs: > + ( + $component := $.c; + $context := $lookup($.entities,$component).**."properties"; + $context.**."$ref".%; + $context.$spread().{ + $keys()[0] : ($split($string($.**."$ref".%."$ref"),"/")[2])~>$replace(/^(.*)(\.\w+)$/,"$1") + }~>$merge(); + ) + get_titles: > + ( + $component := $.c; + $prop := ($append($lookup($.entities, $component).schema.**."$ref",["#/$defs/"&$component])~>$distinct()~>$map( + function($v){ + $contains($v, "defs")?( + $v:= $v~>$replace(/.*\/(.*)/, "$1"); + $v = $component?( + $lookup($.entities, $component).**.properties~>$merge() + ):$lookup($.entities.**, $v).properties + ) + }))~>$merge(); + $titles := $merge($prop.$spread().{ + $keys()[0] : $.*.title ? $.*.title : $keys()[0] + }); + $titles := $merge([$titles, {"type":"Тип", "server_id":"Сервер ID"}]); + ) + get_link: > + ( + $href := $.hr; + $v:=$.val; + $type($v) = 'string'? + $link := '/entities/' & $href & '/list?ta-component-id=' & $v: + $type($v) = 'array'? + $count($v) >1?($link:=$v;$log("-+-> " & $link,["MTG"]);):$link := $map($v, function($val){'/entities/' & $href & '/list?ta-component-id=' & $val}): + $link := $v; + /*$log("-*-> "& $link,["MTG"]);*/ + ) + get_item: > + ( + $object := $.o; + $item := $.i; + ($lookup($.**, $object)~>$lookup($item)); + ) + get_parent: > + ( + /* o - объект, r - root поиска */ + $obj := $.o; + $root := $.r?$.r:$.**; + $keys($root)~> $single(function ($key) { + $lookup($root, $key)~>$keys()~>$single(function($v) { $v = $obj }) + }); + ) + # Функция получения всех атрибутов ссылающихся на внешние объекты + # $.o - объект для разбора + get_refs_all: > + ( + $component := $.o?$.o:"seaf.ta.services.storage"; + $lookup($.entities,$component).**."properties"~>$map( + function($v){ $v.$sift(function($v, $k) {$lookup($v.**, "$ref")}) + })~>$merge()~>$each(function($v, $k) { {$k : $lookup($v.**, "$ref") }})~>$merge(); + ) + + # Поиск максимального уровня критичности объекта по дероеву АС seaf.ta.app_tree (dataset) + find_criticality : > + ( + $value := $.v; + $context:= $.c; + + /* типы уровней критичности АС */ + $b := ["Mission Critical Plus","Mission Critical", "Business Critical", "Business Operational", "Office Productivity"]; + /* Поиск объекта в дереве АС (seaf.ta.app_tree) */ + $contain := $each($context, function($val, $key){ + + $each($val, function($v, $k){ + $type($v) = "array"? + $filter($v, function($i){ + $contains($i, $value) + }): + + $contains($v, $value) + })?{$key:$val}})~>$merge(); + + /* Получение наибольшей критичности */ + $b[($each($contain,function($v){ $map($b, function($val, $i) { $val = $v.'criticality' ? $i})[0] })~>$sort())[0]]; + ) \ No newline at end of file diff --git a/entities/ta/plant.uml b/entities/ta/plant.uml new file mode 100644 index 0000000..15fee26 --- /dev/null +++ b/entities/ta/plant.uml @@ -0,0 +1,178 @@ +@startuml + + class "seaf.ta.components.server" as server_id #lightblue { + *Title: Server + *1: availabilityzone_id + *2: virtualization_id + *3: storage_id + *4: dc_id + } + + + class "seaf.ta.components.hw_storage" as hw_storage_id #lightblue { + *Title: Hardware Storage + *1: dc_id + *2: office_id + *3: network_connection + } + + class "seaf.ta.components.network" as network_appliance_id #lightblue { + *Title: Network Appliance + *1: dc_id + *2: office_id + } + + class "seaf.ta.components.user_device" as user_device_id #lightblue { + *Title: User Device + *1: network_connection + *2: office_id + } + + struct "seaf.ta.services.dc_az" as availabilityzone_id #lightgreen { + *Type: TS + *Title: Availability Zone + * 1: region_id + } + + struct " seaf.ta.services.dc_region" as region_id #lightgreen { + *Title: Region + } + + + struct " seaf.ta.services.dc" as dc_id #lightgreen { + *Title: Datacenter + *1: availabilityzone_id + } + + struct "seaf.ta.services.office" as office_id #lightgreen { + *Title: Office + *1: network_connection + } + + struct "seaf.ta.services.cluster" as cluster_id #lightgreen { + *Title: Cluster + *1: availabilityzone_id + *2: network_connection + *3: server_id + } + + struct "seaf.ta.services.compute_service" as compute_id #lightgreen { + *Title: Compute + *1: availabilityzone_id + *2: server_id + *3: network_connection + } + + struct "seaf.ta.services.storage" as storage_id #lightgreen { + *Title: Storage + *1: availabilityzone_id + *2: server_id + *3: network_connection + } + + struct "seaf.ta.services.cluster_virtualization" as virtualization_id #lightgreen { + *Title: Описание кластера виртуализации + *1: server_id + *2: availabilityzone_id + *3: network_connection + } + + struct "seaf.ta.services.k8s" as kubernetes_id #lightgreen { + *Title: Compute + *1: availabilityzone_id + *2: server_id + *3: network_connection + } + + struct "seaf.ta.services.network" as network_id #lightgreen { + *Title: Network + *1: dc_id + *2: office_id + *3: availabilityzone_id + *4: network_appliance_id + } + + struct "seaf.ta.services.network_links" as networklinks_id #lightgreen { + *Title: Network Links + *1: network_appliance_id (OneOff) + *2: network_appliance_id (OneOff) + + } + + struct "seaf.ta.services.backup" as backup_id #lightgreen { + *Title: Backup Service + *1: availabilityzone_id + *2: server_id + } + + + struct "seaf.ta.services.monitoring" as monitoring_id #lightgreen { + *Title: Monitoring Service + *1: availabilityzone_id + *2: server_id + } + + struct "seaf.ta.services.software" as software_id #lightgreen{ + *Title: Licenses and support + *2: server_id + } + + server_id --> availabilityzone_id:[1] + server_id --> virtualization_id:[2 virtual server only ] + server_id --> hw_storage_id:[3 hw server only] + server_id --> dc_id:[4 hw server only] + + + hw_storage_id -->dc_id:[1] + hw_storage_id -->office_id:[2] + hw_storage_id -->network_id:[3] + + network_appliance_id -->dc_id:[1] + network_appliance_id -->office_id:[2] + + user_device_id --> network_id:[1] + user_device_id --> office_id:[2] + + availabilityzone_id --> region_id:[1] + + dc_id --> availabilityzone_id:[1] + + office_id --> network_id:[1] + + cluster_id --> availabilityzone_id:[1] + cluster_id --> network_id:[2] + cluster_id --> server_id:[3] + + compute_id --> availabilityzone_id:[1] + compute_id --> server_id:[2] + compute_id --> network_id:[3] + + storage_id --> availabilityzone_id:[1] + storage_id -->server_id:[2] + storage_id -->network_id:[3] + + virtualization_id --> availabilityzone_id:[1] + virtualization_id --> server_id:[2] + virtualization_id --> network_id:[3] + + kubernetes_id --> availabilityzone_id:[1] + kubernetes_id --> server_id:[2] + kubernetes_id --> network_id:[3] + + network_id --> dc_id:[1] + network_id --> office_id:[2] + network_id --> availabilityzone_id:[3] + network_id --> network_appliance_id:[4] + + networklinks_id --> network_id:[1] + networklinks_id --> user_device_id:[2] + + backup_id --> availabilityzone_id:[1] + backup_id --> server_id:[2] + + monitoring_id --> availabilityzone_id:[1] + monitoring_id --> server_id:[2] +/' + software_id --> server_id:[1] +'/ +@enduml \ No newline at end of file diff --git a/entities/ta/presentation/components.yaml b/entities/ta/presentation/components.yaml index b64a976..8f24a42 100644 --- a/entities/ta/presentation/components.yaml +++ b/entities/ta/presentation/components.yaml @@ -39,7 +39,8 @@ entities: source: > ( - $refs := $eval($.functions."seaf.ta".get_refs, [{"c":"seaf.ta.components.server"}, $]); + $refs := $eval($.functions."seaf.ta".get_refs, [{"c":"seaf.ta.components.server"}, $]); + $get_link := $.functions."seaf.ta".get_link; [[$."seaf.ta.components.server".$spread().( $COMPONENT_ID := $keys()[0]; $.*.{ @@ -50,7 +51,7 @@ entities: "office": office, "fqdn_name": fqdn_name, "link": '/entities/seaf.ta.components.server/list?ta-component-id=' & $COMPONENT_ID, - "dc_link" : "/entities/"& $refs."dc_id" &"/list?ta-component-id=" & dc_id + "dc_link" : $eval($get_link,{"hr":$refs."dc_id","val":dc_id}) } )]^(title)] ) @@ -105,6 +106,7 @@ entities: source: > ( $refs := $eval($.functions."seaf.ta".get_refs, [{"c":"seaf.ta.components.hw_storage"}, $]); + $get_link := $.functions."seaf.ta".get_link; [[$."seaf.ta.components.hw_storage".$spread().( $COMPONENT_ID := $keys()[0]; $.*.{ @@ -113,7 +115,7 @@ entities: "dc_id": dc_id, "office": office, "link": '/entities/seaf.ta.components.hw_storage/list?ta-component-id=' & $COMPONENT_ID, - "dc_link" : "/entities/"& $refs."dc_id" &"/list?ta-component-id=" & dc_id + "dc_link" : $eval($get_link,{"hr":$refs."dc_id","val":dc_id}) } )]^(title)] ) @@ -175,6 +177,7 @@ entities: source: > ( $refs := $eval($.functions."seaf.ta".get_refs, [{"c":"seaf.ta.components.network"}, $]); + $get_link := $.functions."seaf.ta".get_link; [[$."seaf.ta.components.network".$spread().( $COMPONENT_ID := $keys()[0]; $.*.{ @@ -185,7 +188,7 @@ entities: "office": office, "model": model, "link": '/entities/seaf.ta.components.network/list?ta-component-id=' & $COMPONENT_ID, - "dc_link" : "/entities/"& $refs."dc_id" &"/list?ta-component-id=" & dc_id + "dc_link" : $eval($get_link,{"hr":$refs."dc_id","val":dc_id}) } )]^(title)] ) @@ -205,6 +208,59 @@ entities: template: templates/list.md source: > ( {'title': $self.title, 'id':$params."ta-component-id", "base-name":$split($self."$base", "/")[2]};) + + seaf.ta.components.user_device: + presentations: + table: + type: table + headers: + - value: title + text: Наименование + sortable: true + align: left + width: 20% + link: link + + - value: description + text: Описание + sortable: true + align: left + width: 20% + + - value: device_type + text: Тип устройства относительно среды использования + sortable: true + align: left + width: 20% + + + source: > + ( + [[$."seaf.ta.components.user_device".$spread().( + $COMPONENT_ID := $keys()[0]; + $.*.{ + "title": title, + "description": description, + "device_type": device_type, + "link": '/entities/seaf.ta.components.user_device/list?ta-component-id=' & $COMPONENT_ID + } + )]^(name)] + ) + list: + title: Карточка спецификации пользовательского устройства + params: + type: object + properties: + seaf-ta-component-id: + title: Идентификатор спецификации + type: string + required: + - ta-component-id + type: markdown + template: templates/list.md + source: > + ( {'title': $self.title, 'id':$params."ta-component-id", "base-name":$split($self."$base", "/")[2]};) + seaf.ta.components.k8s_deployment: presentations: table: @@ -240,6 +296,7 @@ entities: source: > ( $refs := $eval($.functions."seaf.ta".get_refs, [{"c":"seaf.ta.components.k8s_deployment"}, $]); + $get_link := $.functions."seaf.ta".get_link; [[$."seaf.ta.components.k8s_deployment".$spread().( $COMPONENT_ID := $keys()[0]; $.*.{ @@ -248,8 +305,8 @@ entities: "kubernetes_id": kubernetes_id, "availabilityzone_id": availabilityzone_id, "link": '/entities/seaf.ta.components.k8s_deployment/list?ta-component-id=' & $COMPONENT_ID, - "avail_link" : "/entities/"& $refs."availabilityzone_id" &"/list?ta-component-id=" & availabilityzone_id, - "k_link" : "/entities/"& $refs."kubernetes_id" &"/list?ta-component-id=" & kubernetes_id + "avail_link" : $eval($get_link,{"hr":$refs."availabilityzone_id","val":availabilityzone_id}), + "k_link" : $eval($get_link,{"hr":$refs."kubernetes_id","val":kubernetes_id}) } )]^(title)] ) @@ -269,6 +326,7 @@ entities: template: templates/list.md source: > ( {'title': $self.title, 'id':$params."ta-component-id", "base-name":$split($self."$base", "/")[2]};) + seaf.ta.components.k8s_statefulset: presentations: table: @@ -286,22 +344,25 @@ entities: sortable: true align: left width: 20% - link: link - value: availabilityzone_id text: Availability Zone ID sortable: true align: left width: 20% + link: avail_link - value: kubernetes_id text: Kubernetes cluster ID sortable: true align: left width: 20% + link: k_link source: > ( + $refs := $eval($.functions."seaf.ta".get_refs, [{"c":"seaf.ta.components.k8s_statefulset"}, $]); + $get_link := $.functions."seaf.ta".get_link; [[$."seaf.ta.components.k8s_statefulset".$spread().( $COMPONENT_ID := $keys()[0]; $.*.{ @@ -309,11 +370,13 @@ entities: "description": description, "kubernetes_id": kubernetes_id, "availabilityzone_id": availabilityzone_id, - "link": '/entities/seaf.ta.components.k8s_deployment/list?ta-component-id=' & $COMPONENT_ID + "link": '/entities/seaf.ta.components.k8s_statefulset/list?ta-component-id=' & $COMPONENT_ID, + "avail_link" : $eval($get_link,{"hr":$refs."availabilityzone_id","val":availabilityzone_id}), + "k_link" : $eval($get_link,{"hr":$refs."kubernetes_id","val":kubernetes_id}) } )]^(title)] ) - + list: title: Карточка спецификации @@ -329,6 +392,7 @@ entities: template: templates/list.md source: > ( {'title': $self.title, 'id':$params."ta-component-id", "base-name":$split($self."$base", "/")[2]};) + seaf.ta.components.k8s_pod: presentations: table: @@ -347,8 +411,8 @@ entities: align: left width: 20% - - value: kubernetes_id - text: Kubernetes cluster ID + - value: container_id + text: Какие контейнеры включает sortable: true align: left width: 20% @@ -357,16 +421,17 @@ entities: source: > ( $refs := $eval($.functions."seaf.ta".get_refs, [{"c":"seaf.ta.components.k8s_pod"}, $]); + $get_link := $.functions."seaf.ta".get_link; [[$."seaf.ta.components.k8s_pod".$spread().( $COMPONENT_ID := $keys()[0]; $.*.{ "title": title, "description": description, - "kubernetes_id": kubernetes_id, + "container_id": container_id, "link": '/entities/seaf.ta.components.k8s_pod/list?ta-component-id=' & $COMPONENT_ID, - "k_link" : "/entities/"& $refs."kubernetes_id" &"/list?ta-component-id=" & kubernetes_id + "k_link" : $eval($get_link,{"hr":$refs."container_id","val":container_id }) } - )]^(name)] + )]^(title)] ) @@ -384,6 +449,8 @@ entities: template: templates/list.md source: > ({'title': $self.title, 'id':$params."ta-component-id", "base-name":$split($self."$base", "/")[2] }; ) + + seaf.ta.components.k8s_container: presentations: table: @@ -404,6 +471,7 @@ entities: source: > ( + [[$."seaf.ta.components.k8s_container".$spread().( $COMPONENT_ID := $keys()[0]; $.*.{ @@ -411,7 +479,7 @@ entities: "description": description, "link": '/entities/seaf.ta.components.k8s_container/list?ta-component-id=' & $COMPONENT_ID } - )]^(name)] + )]^(title)] ) list: @@ -428,6 +496,7 @@ entities: template: templates/list.md source: > ( {'title': $self.title, 'id':$params."ta-component-id", "base-name":$split($self."$base", "/")[2]};) + seaf.ta.components.k8s_image: presentations: table: @@ -455,7 +524,7 @@ entities: "description": description, "link": '/entities/seaf.ta.components.k8s_image/list?ta-component-id=' & $COMPONENT_ID } - )]^(name)] + )]^(title)] ) @@ -473,55 +542,3 @@ entities: template: templates/list.md source: > ( {'title': $self.title, 'id':$params."ta-component-id", "base-name":$split($self."$base", "/")[2]};) - seaf.ta.components.user_device: - presentations: - table: - type: table - headers: - - value: title - text: Наименование - sortable: true - align: left - width: 20% - link: link - - - value: description - text: Описание - sortable: true - align: left - width: 20% - link: link - - - value: device_type - text: Тип устройства относительно среды использования - sortable: true - align: left - width: 20% - - - source: > - ( - [[$."seaf.ta.components.user_device".$spread().( - $COMPONENT_ID := $keys()[0]; - $.*.{ - "title": title, - "description": description, - "device_type": device_type, - "link": '/entities/seaf.ta.components.user_device/list?ta-component-id=' & $COMPONENT_ID - } - )]^(name)] - ) - list: - title: Карточка спецификации пользовательского устройства - params: - type: object - properties: - seaf-ta-component-id: - title: Идентификатор спецификации - type: string - required: - - ta-component-id - type: markdown - template: templates/list.md - source: > - ( {'title': $self.title, 'id':$params."ta-component-id", "base-name":$split($self."$base", "/")[2]};) \ No newline at end of file diff --git a/entities/ta/presentation/services.yaml b/entities/ta/presentation/services.yaml index e17ffb2..e9a5026 100644 --- a/entities/ta/presentation/services.yaml +++ b/entities/ta/presentation/services.yaml @@ -27,7 +27,7 @@ entities: "description": description, "link": '/entities/seaf.ta.services.dc_region/list?ta-component-id=' & $COMPONENT_ID } - )]^(region_name)] + )]^(title)] ) list: @@ -87,7 +87,7 @@ entities: "link": '/entities/seaf.ta.services.dc_az/list?ta-component-id=' & $COMPONENT_ID, "r_link" : "/entities/"& $refs."region_id" &"/list?ta-component-id=" & region_id } - )]^(az_name)] + )]^(title)] ) list: @@ -148,7 +148,7 @@ entities: "link": '/entities/seaf.ta.services.dc/list?ta-component-id=' & $COMPONENT_ID, "avail_link" : "/entities/"& $refs."availabilityzone_id" &"/list?ta-component-id=" & availabilityzone_id } - )]^(dc_name)] + )]^(title)] ) list: @@ -205,7 +205,7 @@ entities: "address": address, "link": '/entities/seaf.ta.services.office/list?ta-component-id=' & $COMPONENT_ID } - )]^(name)] + )]^(title)] ) list: @@ -228,6 +228,13 @@ entities: table: type: table headers: + - value: title + text: Наименование + sortable: true + align: left + width: 20% + link: link + - value: cluster_fqdn text: FQDN имя кластера sortable: true @@ -255,6 +262,7 @@ entities: [[$."seaf.ta.services.cluster".$spread().( $COMPONENT_ID := $keys()[0]; $.*.{ + "title": title, "description": description, "availabilityzone_id": availabilityzone_id, "cluster_fqdn": cluster_fqdn, @@ -262,7 +270,7 @@ entities: "avail_link" : $eval($get_link,{"hr":$refs."availabilityzone_id","val":availabilityzone_id}) } - )]^(cluster_fqdn)]; + )]^(title)]; ) list: @@ -325,7 +333,7 @@ entities: "link": '/entities/seaf.ta.services.storage/list?ta-component-id=' & $COMPONENT_ID, "avail_link" : $eval($get_link,{"hr":$refs."availabilityzone_id","val":availabilityzone_id}) } - )]^(storage_id)] + )]^(title)] ) list: @@ -381,7 +389,7 @@ entities: "link": '/entities/seaf.ta.services.cluster_virtualization/list?ta-component-id=' & $COMPONENT_ID } - )]^(virtualization_id)] + )]^(title)] ) list: @@ -438,7 +446,7 @@ entities: "avail_link" : $eval($get_link,{"hr":$refs."availabilityzone_id","val":availabilityzone_id}), "link": '/entities/seaf.ta.services.k8s/list?ta-component-id=' & $COMPONENT_ID } - )]^(cluster_fqdn)] + )]^(title)] ) list: title: Кластер k8s @@ -517,7 +525,7 @@ entities: "o_link" : $eval($get_link,{"hr":$refs."office_id","val":office_id}), "avail_link" : $eval($get_link,{"hr":$refs."availabilityzone_id","val":availabilityzone_id}) } - )]^(type)] + )]^(title)] ) list: @@ -623,7 +631,7 @@ entities: "avail_link" : $eval($get_link,{"hr":$refs."availabilityzone_id","val":availabilityzone_id}), "link": '/entities/seaf.ta.services.backup/list?ta-component-id=' & $COMPONENT_ID } - )]^(name)] + )]^(title)] ) list: diff --git a/entities/ta/services.yaml b/entities/ta/services.yaml index d3d267b..89d6d89 100644 --- a/entities/ta/services.yaml +++ b/entities/ta/services.yaml @@ -168,7 +168,7 @@ entities: title: Cluster ID type: string availabilityzone_id: - title: В какие зоны доступности входит DC + title: В какие зоны доступности входит type: array items: $ref: "#/$rels/seaf.ta.services.dc_az.dc_az" @@ -209,10 +209,10 @@ entities: $ref: "#/$defs/seaf.ta.services.base.entity" properties: compute_id: - title: Compute Service IDВчера + title: Compute Service ID type: string availabilityzone_id: - title: В какие зоны доступности входит DC + title: В какие зоны доступности входит type: array items: $ref: "#/$rels/seaf.ta.services.dc_az.dc_az" @@ -276,12 +276,12 @@ entities: items: $ref: "#/$rels/seaf.ta.components.server.server" availabilityzone_id: - title: В какие зоны доступности входит DC + title: В какие зоны доступности входит type: array items: $ref: "#/$rels/seaf.ta.services.dc_az.dc_az" hw_storage_connected: - title: В какие зоны доступности входит DC + title: Какие СХД подключены type: array items: $ref: "#/$rels/seaf.ta.components.hw_storage.hw_storage" @@ -306,7 +306,7 @@ entities: type: string enum: [Simple Storage Service] availabilityzone_id: - title: В какие зоны доступности входит DC + title: В какие зоны доступности входит type: array items: $ref: "#/$rels/seaf.ta.services.dc_az.dc_az" @@ -327,7 +327,7 @@ entities: items: $ref: "#/$rels/seaf.ta.services.network.network" hw_storage_connected: - title: В какие зоны доступности входит DC + title: Какие СХД подключены type: array items: $ref: "#/$rels/seaf.ta.components.hw_storage.hw_storage" @@ -374,7 +374,7 @@ entities: items: $ref: "#/$rels/seaf.ta.components.server.server" availabilityzone_id: - title: В какие зоны доступности входит DC + title: В какие зоны доступности входит type: array items: $ref: "#/$rels/seaf.ta.services.dc_az.dc_az" @@ -402,13 +402,10 @@ entities: title: Kubernetes cluster ID type: string availabilityzone_id: - title: В какие зоны доступности входит DC + title: В какие зоны доступности входит type: array items: $ref: "#/$rels/seaf.ta.services.dc_az.dc_az" - cluster_fqdn: - title: Имя кластера Kubernetes - type: string is_own: title: Кластер куплен как услуга type: boolean @@ -435,9 +432,6 @@ entities: cluster_autoscaler: title: Работа автомасштабирования воркер нод кластера type: boolean - hpa: - title: HPA\VPA для деплойментов - type: boolean keys: title: Хранилище секретов кластера type: string @@ -455,7 +449,6 @@ entities: required: - kubernetes_id - availabilityzone_id - - cluster_fqdn - software - master_qty - worker_qty @@ -495,7 +488,7 @@ entities: title: Офис $ref: "#/$rels/seaf.ta.services.office.office" availabilityzone_id: - title: В какие зоны доступности входит DC + title: В какие зоны доступности входит type: array items: $ref: "#/$rels/seaf.ta.services.dc_az.dc_az" @@ -544,7 +537,7 @@ entities: title: Офис $ref: "#/$rels/seaf.ta.services.office.office" availabilityzone_id: - title: В какие зоны доступности входит DC + title: В какие зоны доступности входит type: array items: $ref: "#/$rels/seaf.ta.services.dc_az.dc_az" @@ -650,16 +643,13 @@ entities: title: Backup System ID type: string availabilityzone_id: - title: В какие зоны доступности входит DC + title: В какие зоны доступности входит type: array items: $ref: "#/$rels/seaf.ta.services.dc_az.dc_az" path: title: Место хранения РК type: string - schedule: - title: Частота резервного копирования - type: string replication: title: Репликация в другой ЦОД type: boolean @@ -672,7 +662,6 @@ entities: - backup_id - availabilityzone_id - path - - schedule seaf.ta.services.monitoring: title: Monitoring Service @@ -689,7 +678,7 @@ entities: title: Monitoring System ID type: string availabilityzone_id: - title: В какие зоны доступности входит DC + title: В какие зоны доступности входит type: array items: $ref: "#/$rels/seaf.ta.services.dc_az.dc_az" @@ -698,8 +687,9 @@ entities: type: string role: title: Роль - type: string - enum: [Инфраструктурный, Прикладной, Журналирование, Трейсинг] + type: array + items: + enum: [Инфраструктурный, Прикладной, Журналирование, Трейсинг] ha: title: Высокая доступность системы мониторинга type: boolean diff --git a/functions/ba.yaml b/functions/ba.yaml deleted file mode 100644 index 12bc24b..0000000 --- a/functions/ba.yaml +++ /dev/null @@ -1,152 +0,0 @@ -functions: - seaf_ddd_tree: - title: Получение дерева DDD из идентификатора объекта - params: - - type: string - title: Идентификатор объекта - alias: obj_id - required: true - code: > - ( - $obj_id:= obj_id; - - $getDDDWrappers:= function($obj_id){( - $domains:= $split($obj_id, "."); - $domains:= $count($domains) > 0 - ? $domains - : []; - $getPaths:= function($domains, $i, $paths){( - $paths:= $i=0 - ? $domains[0] - : $append($paths, $paths[$i-1] & "." & $domains[$i]); - $i < $count($domains)-1 - ? $getPaths($domains, $i+1, $paths) - : $paths - )}; - $paths:= $getPaths($domains, 0, []); - - { - "domains": [$domains], /*includes $obj_id tail*/ - "paths": [$paths] /*includes $obj_id itself*/ - } - )}; - - $getDDDWrappers($obj_id); - ) - result: - type: object - description: > - domains -- массив идентификаторов доменов (d1, d2, ...), - paths -- массив "путей" (d1, d1.d2, ...) - - seaf_ddd_top: - title: Получение DDD верхнего уровня - params: - - type: object - title: Объекты сущности - alias: objects - code: > - ( - $objects:= objects.$spread(); - $tops:= $map($objects, function($v) {( - $paths:= $seaf_ddd_tree($v.$keys()).paths; - - $getTop:= function($paths, $i){( - $paths[$i] in $objects.$keys() - ? $paths[$i] - : $getTop($paths, $i+1) - )}; - - $top:= $getTop($paths, 0); - )}); - - $distinct($tops) - ) - result: - description: Верхние DDD домены - - seaf_has_parts: - title: Из каких частей состоит объект - params: - - type: string - title: Идентификатор объекта - alias: obj_id - required: true - - type: object - title: Глобальный Контекст -- $$ - alias: ctx - required: true - code: > - ( - $ctx:= ctx; - $obj_id:= obj_id; - - $getParts:= function($obj_id, $i, $parts_id){( - $parts:= $ctx.*.$spread()[$obj_id = $.*.is_part_of].$keys(); - $count($parts) > 0 - ? ( - $parts:= $map($parts, function($v){( - {$string($obj_id): $v} - )}); - $parts_id:=$append($parts_id, $parts); - $deeper:= $map($parts, function($v) {( - $getParts($v.*, $i+1, $parts_id) - )}); - $parts_id:= $reduce($append($parts_id, $deeper), $append) - ) - : $parts_id - )}; - $parts:= $getParts($obj_id, 0, []); - $count($parts) > 0 - ? [$distinct($parts)] - : [] - ) - result: - type: array - description: > - Перечень идентификаторов сверху вниз - - seaf_is_part: - title: Часть чего является объект - params: - - type: string - title: Идентификатор объекта - alias: obj_id - required: true - - type: object - title: Глобальный Контекст -- $$ - alias: ctx - required: true - code: > - ( - $ctx:= ctx; - $obj_id:= obj_id; - - $getWrappers:= function($obj_id, $wrappers_id){( - $obj:= $ctx.*.$spread()[$.$keys() = $obj_id]; - $wrapper:= $obj.*.is_part_of; - $res:= $wrapper - ? ($wrappers_id:= $append($wrappers_id, $obj.*.is_part_of); - $getWrappers($wrapper, $wrappers_id)) - : $wrappers_id - )}; - $wrappers:= $getWrappers($obj_id, [])^(<$length($)); - $count($wrappers) > 0 - ?[$wrappers] - : [] - ) - result: - type: array - description: > - Перечень идентификаторов сверху вниз, не включая сам объект - - - # # Is Hexagon imported check - # #todo make it function - # is_hexed: - # type: markdown - # template: templates/is_hexed.md - # source: > - # ( - # {"hexed": $.imports[$contains($, "hexagon/dochub.yaml")].$count($) > 0}; - # ) diff --git a/functions/root.yaml b/functions/root.yaml index d22b6b9..6c0b723 100644 --- a/functions/root.yaml +++ b/functions/root.yaml @@ -1,3 +1,2 @@ imports: - - menu.yaml - - ba.yaml \ No newline at end of file + - menu.yaml \ No newline at end of file