{"configuration":{},"description":"Description","documentation":{"images":[{"content":"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yCbDNPnKrQwAIHssWbIknD9/fvjll1+6mwAAEkN5RpRvDHUTEADIICuvvPI9ersDANQfs2bNKnvl45ZbbhmOHj3aGIXO8tRTT5ljDBs2zN3UYaZNmxaeccYZ4RNPPOFuCl9//XVz/M0228zdBAA5RnmG8o14/gEAGaVPnz6zXn31VbceAIA64J133jHJeu/evTVuOWxubjZ/a92VV17p7t4ub7/9djh06NDw2muvdTd1mEmTJpnPP+2009xNJXOx6aabupsAIMcoz1C+0TIDAYBM0qNHj4ULFixw6wEAqAOsudhwww1L60aNGlXqfXj00UdNIn/OOeeEv/vd78KRI0eafcaOHRuuv/76Zr+NNtoovPfee816vYd+8ODB4fnnn2+Wn3nmGbMsw7L55puHkydPLn2O/lYPxLe+9a1wjz32CB944AHTa6Hj6bjrrLNOeMUVV5T2F+2Zi3vuucds0zG32Wab8JJLLjHrZZq0XuZH6Lhavv76680QrmOOOSbs16+fkb73F198YYZ3aZ+///3vxnjp+wNAfaI8Q/lGiwQEADKLWwcAQJ3gmotFixbp3fFm3dFHH13qRbBSEq5eCbus5Nv+rZbD+LCoTz75pNQLIoNh95MBmTFjRml5k002Kf0tM6JhWfp7gw02CG+44YYW59uWudCPbNnP23nnnUt/6/OOOOII8/f48ePNvjIKWtbxZJj0t4yFPlN///nPfw7nzp1bOq/WPhMA6odirAJADnDjHwDqBGsuJLX227+lhx56qGQulHhrWdjk//777zfLp556qlk+/PDDW5iLyy67zPwts6LPOe6448yykvlTTjnF/G2HPp199tnhVlttZeZZVDssSvNH9Bk33nhj+MILL5heEe179913h1OmTDF/77TTTqZXQn9bQ7XaaquZ5Zdeeil86623Sqbk/fffL10L9XTIeAFA/VKMVwDIAW78A0CdEDcXSthlHNQ78eSTT5rtNtE/7LDDSmWsCVFPgXjkkUfM8o477tjCXJxwwgmlY8elXoH99tvP/G2HU8Wp1lx89dVXZviS+3kyF5qcLoNkP9MeX4bB3d/qxRdfNP/Gh4wBQP1SjF0AyAFu/ANAneAOi3Kxib6MgsXOiVBLv7j00kvNshL7uLnQG6fseiXqzz77rOn9ePPNN8Nzzz3XbLMTv/U5MjUawlStubjuuuvMtu22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","name":"img/user-hierarchy.png","type":"image/png"}],"sections":[{"content":"<script>\n  function resizeIframe(obj) {\n    obj.style.height = obj.contentWindow.document.documentElement.scrollHeight + 'px';\n  }\n</script>\n\n<style>\n      #figmaiframe {\n        width: 1024px;\n        margin: auto;\n        height: 100%;\n        display: flex;\n        align-items: center;\n      }\n</style>\n\n<br/>\n\n<div id=\"figmaiframe\">\n    <iframe style=\"border: 1px solid rgba(0, 0, 0, 0.1);\" width=\"100%\" height=\"576px\" src=\"https://www.figma.com/embed?embed_host=share&url=https%3A%2F%2Fwww.figma.com%2Fproto%2F25s3jykDh5Q5Oh8jhit5oX%2FMSI-Control-Tower%3Fpage-id%3D423%253A1853%26node-id%3D387-1973%26starting-point-node-id%3D387%253A1973%26t%3Dvxa4OaA2JB3lZRXx-1&scaling=scale-down-width&content-scaling=fixed\" allowfullscreen ></iframe>\n    \n</div>\n\n## High-Level Phased Development Plan\n\n### Scope\nThis document outlines the proposed high-level development plan for the MSI Control Tower application, an integrated data and analytics platform designed to empower construction success for owners. This plan focuses on delivering value iteratively while prioritising essential functionalities for early adoption.\n\nThe development is broken down into three distinct phases:\n\n### Phase 1: “David Hart MVP”\n**Objective:** Deliver rapid value by providing a centralised hub for accessing essential project information and third-party applications.\n\n**Key Deliverables:**\n- **Front-End Application:** A lightweight web application serving as the primary user interface.\n- **Authentication & Identity Provider (IdP):** Enable secure single sign-on (SSO) for both internal and external users.\n- **Third-Party Application Linking:** Seamlessly link to core third-party systems like P6, Northspyre, Touchplan, etc., using secure credential management.\n- **Wiki Integration:** Integrate with a dedicated Wiki platform for housing and managing the Comprehensive Implementation Plan (CIP), ensuring version control and access control.\n\n**Technology Considerations:**\n- The front-end application will likely be a single-page application built using a JavaScript framework that supports reactive components.\n- The IDP will be self-hosted and will utilise secure credential management techniques, potentially leveraging a cloud provider's secrets management service (e.g., Azure Key Vault, Google Secret Manager).\n- The Wiki platform selection will prioritise ease of integration, version control, robust search functionality, and access control.\n\n**Value Proposition:** Provides owners and project stakeholders with a central hub for accessing critical project information and applications, improving visibility and streamlining workflows. It allows for the continuous visibility and alignment of principles, guidelines and imperatives.\n\n<iframe id=\"myEmbeddedDiagram\" src=\"https://sol-arc.handymaninteractive.com/embed/1?diagram=System_Landscape&diagramSelector=false&iframe=myEmbeddedDiagram&perspective=Development+Phase+1\" width=\"100%\" marginwidth=\"0\" marginheight=\"0\" frameborder=\"0\" scrolling=\"no\" allowfullscreen=\"true\" ></iframe>\n\n\n### Phase 2: Data Platform - BI Integration\n**Objective:** Establish the core data platform and integrate with BI tools to provide early insights and analytical capabilities.\n\n**Key Deliverables:**\n- **Data Lake Implementation:** Deploy a robust data lake, likely using Databricks for data ingestion, processing, and storage. Leverage Snowflake as the cloud database for data persistence and scalability.\n- **Data Pipeline Development:** Build initial data pipelines for ingesting data from prioritised source applications, prioritising those essential for pre-defined BI dashboards.\n- **BI Integration:** Integrate with a BI tool (e.g., Databricks Dashboards, Power BI) to enable data visualisation and analysis. Embed selected visualisations and dashboards directly into the front-end application.\n\n**Technology Considerations:**\n- The data platform will primarily use Databricks for data processing and analytics.\n- Data ingestion will leverage both file-based and API-based integration mechanisms, depending on the capabilities of each source application.\n- The choice of BI tool will consider ease of integration, visualisation capabilities, and potential cost-effectiveness.\n\n**Value Proposition:** Empower owners and project stakeholders with early insights and data-driven decision-making capabilities through interactive dashboards and visualisations.\n\n<iframe id=\"myEmbeddedDiagram2\" src=\"https://sol-arc.handymaninteractive.com/embed/1?diagram=System_Landscape&diagramSelector=false&iframe=myEmbeddedDiagram2&perspective=Development+Phase+2\" width=\"100%\" marginwidth=\"0\" marginheight=\"0\" frameborder=\"0\" scrolling=\"no\" allowfullscreen=\"true\"  ></iframe>\n\n### Phase 3: Native Widgets & Advanced Analytics\n**Objective:** Enhance the platform with advanced analytics, custom widgets, and real-time alerting capabilities.\n\n**Key Deliverables:**\n- **Native Widget Development:** Design and implement a library of custom widgets to address specific analytical needs. This will require developing more complex data pipelines and transformation processes to support the unique data requirements of each widget.\n- **Real-Time Alerting System:** Implement a system for generating and delivering real-time alerts based on predefined rules and thresholds. Leverage real-time data ingestion capabilities and event-driven pipelines to power the alerting system.\n\n**Technology Considerations:**\n- Native widgets will likely utilise the chosen front-end framework and leverage APIs to access the data platform and application database.\n- Real-time alerting will require exploring and selecting appropriate technologies for event management, message queuing, and real-time communication (e.g., websockets).\n\n**Value Proposition:** Provide deeper insights, proactive risk management, and a more personalised user experience through bespoke analytics, custom visualisations, and real-time alerts.\n\n<iframe id=\"myEmbeddedDiagram3\" src=\"https://sol-arc.handymaninteractive.com/embed/1?diagram=System_Landscape&diagramSelector=false&iframe=myEmbeddedDiagram3&perspective=Development+Phase+3\" width=\"100%\" marginwidth=\"0\" marginheight=\"0\" frameborder=\"0\" scrolling=\"no\" allowfullscreen=\"true\"  ></iframe>\n\n### Key Considerations\n- **Prioritisation:** The development plan emphasises iterative value delivery, prioritising essential features for early adoption. Features and functionalities can be adjusted based on evolving needs and user feedback.\n- **Flexibility:** The decoupled architecture allows for flexibility in technology choices and potential integration with future applications and services.\n- **Scalability:** The data platform will be designed to accommodate growing data volumes and evolving analytical requirements.\n\nThis phased development plan represents a high-level roadmap for the MSI Control Tower application. As the project progresses, each phase will be further refined and detailed based on continuous evaluation, user feedback, and technological advancements.\n\n<script type=\"text/javascript\" src=\"https://sol-arc.handymaninteractive.com/static/js/structurizr-embed.js\"></script>","filename":"dev-plan.md","format":"Markdown","order":1,"title":""},{"content":"## Requirement Analysis\n\n### Scope and Purpose\n\nThis document presents the requirements collected during the gap analysis sessions and consolidated to provide a holistic view of the MSI Control Tower application’s features. It is the controlling document for the design and implementation of Control Tower.\n\n### Introduction\n\n#### Context\n\nMOCA Systems, Inc. (MSI) has been a leader in empowering construction success for owners. As a full-service Owner’s Representative firm, MSI provides innovative services and technologies for Owners, Designers, and Contractors to create execution plans, manage the construction process in real time, and ensure projects are on time, on budget and meeting the owners’ expectations from conception to completion. \n\nMSI's proprietary Continuous Alignment process (CA) has a track record of delivering large, complex, design and construction projects on time, on budget and meeting the owner's expectations more than 90% of the time when it is fully deployed from the start of a project. Control Tower (CT) is the next step in the elaboration of CA. It provides a comprehensive view of the design and construction data environment in a form that is optimized for the needs of the project's owner. CA and CT together constitute the Continuous Alignment System (CAS). It is important to recognize that CT is not intended as a standalone software offering but is, rather, technology enabling an advanced professional services offering. As such, CT requirements support (and, to some degree, imply) an overarching service delivery model. For example, any discussion of personae and user types should be understood in the context of the service delivery model.\n\nOur vision for MSI Control Tower, an integrated data and analytics platform, builds upon this legacy and was born from the understanding that fragmented data and software landscapes hinder informed decision-making. MSI Control Tower addresses these challenges by providing a centralized platform where data from multiple sources is integrated and transformed into actionable insights and enables enhanced visibility and control throughout the lifecycle of a construction project. \n\nThe central benefit of this platform is increased clarity for owners regarding the scope, timeline, and budget of their projects. This value is delivered by offering owners a cohesive, evidence-based perspective of their construction projects, from the initial stages through operations. Furthermore, the business provides descriptive, predictive and prescriptive analysis that enables ongoing improvement by all stakeholders across an owner's portfolio of construction projects and operating facilities.\n\n#### Product Overview & Summary\n\nAt the core of Control Tower is a robust data lake, which is designed to ingest and store vast amounts of data from source systems in either real-time or batch. This data lake serves as the central repository for all consolidated data, ensuring seamless integration and accessibility. The data will be integrated from various sources, including but not limited to:\n* Master scheduling software: Oracle Primavera P6, Microsoft Project\n* Project Management Information Systems (PMIS): Northspyre\n* Collaborative production planning tools: Touchplan\n* Building Information Modeling (BIM) software: Autodesk Revit\n* Architectural program management platforms: Nemetschek dRofus\n* Other applications: Control Tower is designed to also support various applications for ordering, supply chain and logistics, labor management, and other areas crucial to construction projects.\n\nIt is important to note that Control Tower is designed to be agnostic to source applications, allowing for easy integration of additional applications based on project requirements. These additional sources can be utilized by data scientists and analysts to generate insights that are presented dynamically in the End-User Application.\n\nThis comprehensive integration ensures that all relevant project data is accessible to the various users of the system in different ways:\n* MSI Data Scientists/Data Analysts: Have access to a wealth of consolidated data within the data lake for advanced analysis, model development, and the generation of valuable insights which must be abstracted statistically to be valuable to MSI’s customers and potentially for the construction industry as a whole.\n* Owner Users: Gain visibility into their entire construction portfolio via the Control Tower web UI interface, allowing them to monitor project progress, identify potential risks and delays, optimize resource allocation, and make data-driven decisions to ensure project success.\n* Operational Administrators: Can efficiently manage data flows, API integrations, and data ingestion processes, ensuring timely and accurate data availability for all stakeholders.\n* System Administrators: Gain a centralized platform to manage user access and permissions, ensuring data security and granular control over user privileges.\n* AEC Users: Architects, engineers, and construction professionals can collaborate more effectively, streamline workflows, and make informed decisions using real-time data and insights provided by Control Tower within a web UI interface.\n\n#### Source Applications\n\nControl Tower collects operational data from the construction ecosystem that is collected and maintained by other automated systems deployed in that ecosystem. There are many construction processes and activities available to support modern construction projects. For instance, the master schedule for a project is maintained in a master schedule management tool. In this document, we refer to those operational systems as “source” systems or applications as they are the sources of the data collected by Control Tower and stored in the Control Tower data lake.\n\n##### Initial Applications\n\nThe following source applications are planned for initial integration, though this list may change based on specific project requirements:\n**Master Scheduling Software** \n\n* **Oracle P6**\n\nOracle's Primavera P6 Enterprise Project Portfolio Management (Primavera P6 EPPM) dominates the market as a master scheduling product in the construction ecosystem,  providing a solution for prioritizing, planning, managing and evaluating projects, programs, and portfolios.\n\nIt has rest API data integration and file export capabilities.\n\nOracle Primavera P6 EPPM Web Services Programming Guide Version 21\n\n\n* **Microsoft Project**\n\nMicrosoft Project is project management software product, developed and sold by Microsoft. It is designed to assist a project manager in developing a schedule, assigning resources to tasks, tracking progress, managing the budget, and analyzing workloads. It is the second most popular master scheduling application.\n\nThis platform integrates data through REST APIs.\n\nProject REST Basic Operations - Code Samples | Microsoft Learn\n\n\n**Project Management Information System (PMIS) Software**\n\n* **Northspyre**\n\nNorthspyre is a purpose-built, software solution that uses automation to reduce manual data entry, increase productivity, and maximize returns from pre-development to project completion. Capabilities include budget tracking, financial operation management, invoicing and span management, decision support solution and visualization.\n\nData integration methods are not mentioned anywhere on the web.\n\nAn API allowing us to ingest data has been on the company’s roadmap for some time. In the absence of an API, screen scraping applications such as Mulesoft RPA may also be used.\n\n\n**Collaborative Production Planning Software**\n\n* **Touchplan**\n\nTouchplan is a cloud-based, real-time collaboration platform for general and specialty contractors created by MSI. Touchplan prevents schedule and budget slippage and ensures jobsite safety. It also provides owners with the instant insights they need to track progress and anticipate problems on projects.\n\n\nTouchplan has an API and uses Snowflake as its data-warehouse. The realtime database is Google Firebase.\n\n\n**Building Information Management (BIM) Software**\n\n* **Autodesk Revit**\n\nAutodesk Revit is the leading BIM software. It captures designs in 3D and 4D and integrates with a wide variety of design and engineering software tools. \n\nRevit has an API.\n\nRevit API 2024 (revitapidocs.com)\n\n\n**Architectural Program Management Software**\n\n* **Nemetschek dRofus**\n\ndRofus is a planning, data management and BIM collaboration tool that provides all stakeholders with extensive workflow support and access to building information throughout the building lifecycle. dRofus automates architectural programming and design quality tracking capturing design requirements and specifications.\n\ndRofus Has an API.\n\nAPI (drofus.com)\n\n\n**Other Categories of Applications**\n\nThere are various other applications that may optionally be considered, including those for ordering, supply chain visibility, logistics and labor management.\n\n\n##### Internal Supporting Technologies\n\nThe following platforms and tools will play a supporting role within MSI Control Tower, either due to existing usage within MSI or because licenses are readily available:\n\n* **Snowflake Cloud Database:** The MSI software division currently uses Snowflake is a widely adopted cloud database known for its ease of data integration and support for Python and JSON, making it suitable for processing semi-structured and unstructured data. Its powerful data processing capabilities make it particularly effective for ELT (Extract, Load, Transform) processes.\n\n* **Mulesoft Data Integration Tool:** MuleSoft, a Salesforce product, provides tools for building automations and integrations, including API integration and RPA (Robotic Process Automation) features for data ingestion and data crawling. MSI has a 3-year license agreement (with 2 years remaining) for Mulesoft and plans to use the cloud version for data ingestion purposes.\n\n### Functional & Non-Functional Scope\n\nFunctional requirements are features and functions directly available to business end users. There are several different classes (or personae) of business end users that the system will serve and each of these has distinct requirements.\n\nNon-functional requirements specify aspects of the performance and operation of the system that, while they have a profound effect on the user’s experience, are not aimed at direct interactions with the user.\n\n#### Functional Scope\n\nMSI aims to develop Control Tower as an integrated platform encompassing the following applications and functionalities:\n\n\n| Requirements                                           |\n|-------------------------------------------------------|\n| 1. An End-User Application for visual interaction     |\n| 2. A Back-End Application for integrating all related services |\n| 3. A Data Lake platform for consolidated data            |\n| 4. A Data Science platform for data scientists         |\n| 5. A BI Application for end users                      |\n\n#### Non-Functional Scope\n\nMSI requires Control Tower to fulfill the following non-functional requirements:\n\n\n| Requirements                                 |\n|----------------------------------------------|\n| 1. High Availability                           |\n| 2. Enterprise Grade Information Security with Role or Policy Based User Access |\n| 3. Performance and Scalability                  |\n| 4. Visibility and Monitoring                    |\n| 5. Release and Change Management                |\n| 6. System Recovery                             |\n\n## Detailed Requirements\n\n​This section outlines the specific functional and non-functional requirements for each component of the Control Tower platform including the normative language used to specify the degree to which any given requirement is essential for the success of Control Tower\n\n### Definition of Normative Language\n\nThis document uses the three normative levels below and they are written as bold within each sentence where they occur.\n\n\n* **Could** – the requirement is desirable and the system should not preclude meeting the requirement.\n* **Should** – the requirement is highly desirable and while the system may be delivered without it, it is strongly preferred that the requirement be met.\n* **Must** – the requirement is mandatory and the system may not be delivered without it.\n\n### Functional Requirements\n\nThe presentation of functional requirements below is organized according to the list provided in section 2.1, Functional Scope.\n\n#### End User Application for Visual Interaction\n\nThis is the application that users employed by the building’s owner and that MSI personnel engaged in delivering the CA service will use. This is the application that is presented in a partially interactive depiction.\n\n##### 3.2.1.1 OAuth Account Linking\n\nThe product depiction includes a requirement that an end user can, with a single click, move from operating in the Control Tower application to operating in one of the source applications.l\n\nThe End-User Application **must** support OAuth authentication or other methods of authentication to allow users to “link” accounts of third-party software systems. Any auth tokens generated during SSO or other processes **must** be secured/hashed fulfilling the security requirements defined in 3.3.2. Through the linking of their account, users will be able to quickly access and/or view those third-party systems.\n\n##### 3.2.1.2 User Management\n\nThe End-User Application **must** have an interface for managing users that will access the platform. The user management system **should** allow administrators to manage users’ privileges for each defined role. This includes managing permissions, monitoring usage, and providing authenticated access. System admins **must** have the option to grant/revoke privileges via UI to the defined user roles via an HTML based user interface\n\n##### 3.2.1.3 Visual Analysis/Reporting\n\nThe End-User Application **must** have tools and functionalities for visualizing and reporting on data insights within the system. It **must** provide interactive dashboards, charts, and graphs to visually represent data trends, patterns, and relationships. Additional requirements are mentioned below:\n\n* The system **must** provide a visual representation of available analyses and information to the end users.\n* The system **must** have a portfolio view and support a client hierarchy.\n* The system **must** integrate with a wiki (or similar document creation, maintenance and presentation technology) for accessing the Continuous Alignment Comprehensive Implementation Plan (CIP). The CIP is an early and key deliverable of the CA process.\n* Select widgets from other applications **could** be embeddable as iframes within the system's user interface.\n* The system **must** link to supported third party applications for ease of access.\n\n##### 3.2.1.4 Metadata Management\n\nThe End-User Application **must** support a metadata management process which gives meaning to and describes the information assets in the organization. This requires a metadata management database to collect and store the metadata from associated ingested data.\n\nThis database **must** be connected to the UI to fulfill data governance requirements for end users and **must** support the following functionalities:\n\n* **Metadata Reporting:** Generate comprehensive reports on metadata, providing insights into data lineage, quality, and usage patterns.\n* **Filtering, Searching, and Sorting:** Enable users to filter, search, and sort metadata based on various criteria, allowing them to quickly find the information they need.\n\n##### 3.2.1.5 Track and Report Provenance\n\nThe End-User Application **must** track the origin, changes, and history of data in the report. The metadata management database **must** meet these requirements by collecting necessary descriptive data from source applications and processes:\n\n* **Track Provenance:** Provide the capability to trace the source of each data object and identify any transformations that have been applied to it.\n* **Report Provenance:** Enable administrative users to review the data lineage through a dedicated UI, providing a clear and auditable trail of data origin and modifications.\n\n##### 3.2.1.6 Comprehensive Implementation Plan Wiki\n\nThe End-User Application **must** integrate with a dedicated Wiki (or similar technology) to serve as a knowledge base for users. This Wiki, which **could** be implemented using an existing third-party Wiki application, **must** provide a central repository for the Comprehensive Implementation Plan (CIP), including:\n\n* **Centralized Knowledge Base:** The Wiki **must** house all relevant documents and resources related to the CIP.\n* **Information Sharing and Collaboration:** The Wiki **must** facilitate information sharing and collaboration among users by allowing them to contribute, edit, and access information relevant to their roles and responsibilities.\n* **Version Control:** The Wiki **must** provide basic version control capabilities to track changes to documents, ensuring transparency and a clear history of revisions.\n* **Search and Navigation:** The Wiki **should** provide search and navigation functionalities to help users easily locate the information they need.\n* **Access Control:** The Wiki **must** implement role-based or policy-based access control to ensure that users can only access the information they are authorized to create, read, update and delete.\n\n#### Back-End Requirements\n\nWe use “back-end” to refer to computations performed in a central computing environment. Generally, these are necessary for the safe and effective operation of Control Tower as a whole. It is likely that some or all of the capabilities discussed below will provide some kind of graphical user interface as their presentation layer. In lieu of a GUI, back-end users will interact with the back-end via interactive consoles and batch scripts.\n\n##### 3.2.2.1 User and Activity Logging\n\nThe Back-end application **must** support the mechanisms to record and track user interactions and system activities for auditing, troubleshooting, and security purposes. It **must** capture detailed logs of user login/logout events, data accesses, modifications, and other relevant activities within the system. Further to user actions, system activities and data modifications **must** be recorded in a way that enables auditors to trace the origin of any data element, understand how it was processed, and identify any changes made to it over time. The application **must** provide:\n\n* **Comprehensive Audit Logs:** Audit logs **must** capture all relevant User and System events and changes, including user actions, data modifications, API calls, data ingestion processes, and system errors. Logs **should** be easily accessible and searchable, allowing auditors to efficiently query and retrieve the required information and it **must** be integrated with the system’s data governance process.\n* **Tools for Generating Audit Reports:** The application **should** provide tools to generate audit reports that summarize system activity and data changes within specific timeframes, allowing for a high-level overview of system operations.\n* **Features for Exporting Audit Logs:** The application **must** provide features for exporting audit logs in various formats (e.g., CSV, PDF) for further analysis and reporting.\n\n##### 3.2.2.2 System Status for End Users\n\nThe back-end application **must** provide a system status dashboard that displays all relevant information about the system's operational status and performance. This dashboard **could** be accessible to end users through the Control Tower UI, providing a clear and concise overview of the system's health. The system status dashboard **must** be populated with valid data and updated in real-time, including:\n\n* **System Status:** Real-time information regarding system uptime, API connectivity, and other relevant operational status details.\n* **Data Currency:** Information about the last time data was refreshed or updated in the system, providing users with an understanding of data freshness and potential delays in real-time data updates.\n\nThe system **could** also provide real-time alerts (e.g., pop-up notifications) to end users when data is refreshed on the system, ensuring that they are aware of the latest information.\n\n##### 3.2.2.3 Backup/Restore\n\nThe Back-end application **must** support backup and restore process for duplicating data, storing the data securely in case of loss or damage and then restoring that data to a location — the original location or a safe alternative. The system **could** implement multiple redundant backup destinations, ensuring data protection even if a single location is compromised or unavailable.\nThis feature **must** enable operational administrators to manage the application processes below:\n\n* Schedule regular backups of all datasets.\n* Perform on-demand backups as needed.\n* Readily access information about backup sets, including timestamps, content, size, and the number of datasets included.\n* Easily restore one or all datasets from a specific backup set, and data loss in case of unforeseen events providing a log of that action that **must** be readily available and easily inspected and queried. \n* Restoration of a dataset or datasets **must** adhere to all non-functional requirements (3.3).\n\n#### Data Lake Requirements\n\nThe data lake is the heart of Control Tower. It serves as the central repository for all data consolidated from various source applications. The data lake is designed to be flexible and scalable, capable of handling large volumes of data from diverse sources, including structured, unstructured, and semi-structured data. Crucially the data lake will not house a data model for the entire construction industry. Instead, it will store datasets. This approach emphasizes flexibility and allows for the integration of diverse data sources without imposing a rigid schema. Similarly, metadata, the descriptive information about each dataset, will be stored in a dedicated relational database, enabling efficient querying and manipulation of metadata. The database will allow the system to understand the context and relationships between different data elements, improving data governance and ensuring data quality.\n\n##### 3.2.3.1 Data Storage\n\nThe data lake **must** employ a robust and proprietary data storage technology for securing digital information, metadata and data assets. It **must** adhere to the following requirements:\n\n* **Storing Metadata and Datasets:** The ability to store both data and metadata coming from the sources into a relational database. Datasets **could** be stored in a relational store. Metadata **must** be stored in a relational store.\n* **Persistent Data Storage:** The ability to store data persistently and reliably, ensuring long-term data availability.\n* **Data Lifespan:** The data lake **should** support earliest and latest times, including a way to specify earliest as when the data are ingested and latest as forever.\n* **Access Controls:** The data lake **must** implement access controls in line with defined enterprise grade security standards and policies to ensure that data is only accessible to authorized users.\n* **Cloud-Based Platform:** The data lake **must** be deployed on a cloud-based platform.\n\n##### 3.2.3.2 File Storage\n\nThe data lake **must** have a connected file storage system for organizing and storing file-based data. Data can be kept in files, then can be arranged into a hierarchy of directories. It **must** adhere to the following requirements:\n\n* **Persistent File Storage:** The ability to store data as files persistently and reliably, ensuring long-term file availability.\n* **Directory Management:** The file storage system **must** offer directory management features, allowing for the organization of files into folders in a hierarchy.\n* **Access Controls:** The data lake **must** implement access controls in line with defined enterprise grade security standards and policies to ensure that data is only accessible to authorized users.\n* **Cloud-Based Platform:** The file storage system **must** be deployed on a cloud-based platform, providing flexibility, scalability, and cost-efficiency.\n\n##### 3.2.3.3 Data Ingestion (Structured/Unstructured/Semi)\n\nThe data lake **must** support the data ingestion process for acquisition and integration of structured, unstructured, and semi-structured data from multiple sources. This data will be ingested into a single, cloud-based storage system (the data lake) where it can be accessed and analyzed. Since there are different types of data in the construction industry, the proposed solution **must** cover all of them:\n* **Structured Data:** The system **must** be able to consume data organized into repeating rows of fixed columns in traditional table form, with traditional data types from relational databases, common data interchange formats (e.g., CSV), and text files. These objects may or may not comply with well-defined and accessible formal schemata.\n* **Unstructured Data:** The system **must** be able to consume binary objects that represent image and video data, specialized document formats, and other industry-specific media.\n* **Semi-Structured Data:** The system **must** be able to consume datasets consisting of a mix of structured and unstructured data, with and without schemata.\n* **File Integration:** The system **must** support the file-based integration process. Since the construction industry uses graphical representations of architectural designs and drawings, the system **must** have the option of integrating different types of files, including CSV, XLS, and image files.\n* **API Integration:** The system **must** support API integration for importing new datasets into the platform. As the majority of applications offer the option to extract data from their systems through an API, the system **must** have the ability to connect to those APIs for push or pull requests. \n* **Ingestion Mechanisms:** The data lake **must** support both file-based and API-based data ingestion processes, which can be initiated by the MSI application or third parties.\n* **Ingestion Management:** The selected data integration tool **must** provide operational administrators with the ability to manage these data ingestion processes, including scheduling, monitoring, and troubleshooting.\n* **Data Transformation:** The system **must** provide a simple mechanism for specifying the operations that are to be performed on ingested data by operational administrators. This mechanism **should** be declarative. Typical operations include normalizing, moving, filtering, transforming, and/or aggregating the data. While it is common for transformations to be implemented as part of the ingestion pipeline, it is also acceptable for the transformations to be performed in the data warehouse. That is, both ETL (Extract, Transform, Load) and ELT (Extract, Load, Transform) comply with this requirement.\n* **Operations Administration:** Operational administrators **must** be able to manage this process through the selected data integration tool, which **must** support file or API based data processes.\n\n##### 3.2.3.4 Real-time Data Integration\n\nThe data lake **must** support real-time data integration processes, enabling the seamless and immediate synchronization of data across various systems and applications. It **should** utilize efficient data integration tools and techniques to ensure timely and accurate information exchange. The following requirements **should** be met for real-time data integration:\n\n* **Data Ingestion Frequency:** Data ingestion **should** occur at least daily, with real-time and hourly ingestion as desirable options for time-sensitive data.\n* **Report and Dashboard Refresh:** The system status screen **should** display report and dashboard refresh dates and times to inform end users about data freshness.\n* **Real-Time Alerts:** Alerts (e.g., pop-up notifications) **should** be provided to end users when data is refreshed on the system, ensuring they are aware of the latest information.\n\n##### 3.2.3.5 Scheduled, On-Demand or Event Based Data Operations\n\nThe data lake **must** support scheduled, on-demand, or event-based data operations. It **must** define schedules for data extraction, transformation, loading, and other maintenance activities to ensure data integrity and consistency. The selected data integration tool **must** provide operational administrators with the ability to manage on-demand or event-based data operations, allowing for flexibility in data processing and maintenance tasks.\n\n#### Data Science Platform Requirements\n\nAfter data is ingested into Control Tower’s data lake and before it can be presented to users in the form of analytic output, those data must be transformed, aggregated and processed. The MSI personnel who perform data engineering, including all forms of statistical analysis and machine learning algorithm development, must have an operating environment that supports their timely and efficient work. This is referred to as the Data Science Platform.\n\n##### 3.2.4.1 Tools for Data Scientists\n\nThe Data Science Platform **must** facilitate interactive data analysis, visualization, and documentation. It **must** enable users to create, share, and execute code in a collaborative environment. Data scientists **must** be able to implement machine learning processes on data available in the data lake through a web based interactive development environment. Interactive notebooks, such as Jupyter, that can be embedded in a web-based user interface **could** be a key component of the data science tool chain and the platform operating environment.\n\n##### 3.2.4.2 Statistical Analysis\n\nThe Data Science Platform **must** support robust statistical analysis processes. This includes providing access to statistical tools and libraries that enable data scientists to find patterns, trends, and links within datasets, facilitating informed decision-making. The platform **should** support:\n\n* Data collection, description, and Exploratory Data Analysis (EDA) to gain initial insights into the data.\n* Inferential statistics and statistical modeling to test hypotheses and build predictive models.\n* Data visualization and interpretation to effectively communicate findings and insights to stakeholders.\n\n##### 3.2.4.3 ML Algorithm Implementation Support\n\nThe Data Science Platform **must** support tools and resources for the deployment of machine learning algorithms within the system architecture. It **must**:\n\n* Offer a variety of frameworks and machine learning (ML) libraries that facilitate the implementation of various machine learning models, ensuring compatibility with the data lake and other system components.\n* Ensure scalability and performance optimization for ML models, enabling them to handle large datasets and complex computations efficiently.\n* Support a distinction between training and inference.\n* Support rapid deployment of successful models.\n* Continuously evaluate models for specificity and sensitivity to facilitate retraining.\n\n##### 3.2.4.4 Support Data Science Functions\n\nThe Data Science Platform **must** facilitate the implementation and execution of various data science functions within the system. This includes providing:\n\n* Libraries, frameworks, and tools tailored for tasks such as data preprocessing, feature engineering, model training, evaluation, and deployment.\n* A seamless integration with the data lake, enabling data scientists to easily access and process data for their analyses and model development.\n\n#### BI Requirements\n\nThere are, one or two business analyst personae who **could** take the output from the data science tool chains and transform those data sets and algorithmic data products into business analytics. The first are MSI employees who compose dashboards and reports as standard or semi-standard outputs. Semi-standard outputs are standard outputs customized for the needs of a particular client. The second persona are client personnel who may have access to a standardized set of graphical components (“widgets”) that they can compose into their preferred dashboard and report presentations. The system **must** support MSI business analysts and **could** support client business analysts. \n\nThe platform **must** be compatible and integrate with Business Intelligence (BI) tools to empower users in analyzing and visualizing data for decision-making purposes. As there are various proprietary BI tools in the market, such as Power BI, Tableau, Looker, and others, the selected tool **could**:\n\n* Provide end users with the ability to interact with data via drag-and-drop reports, enabling a self-service BI initiative.\n* Offer a wide range of data visualization options, allowing users to create insightful dashboards and reports that effectively communicate key project metrics and trends.\n* Integrate seamlessly with the Control Tower platform, ensuring that data can be easily accessed and analyzed within the BI tool.\n\nWhile BI tool usage is not one of the leading requirements, as some features can be fulfilled on the frontend UI via reports and dashboards, tool selection will be carefully considered after the design phase to ensure it meets the specific needs of Control Tower users.\n\n### Non-Functional Requirements\n\nThe following sections outline the requirements for the non-functional requirements. They include availability and performance, information security, visibility and monitoring, access controls and data privacy, recovery points and release and change management.\n\n#### High Availability and Performance\n\nThe system **must** meet high availability standards to provide services to end users with minimal downtime, even in the event of hardware failures, software errors, or other disruptions. High-availability infrastructure **should** be configured to deliver quality performance and handle different loads and failures with minimal or zero downtime. The following requirements **must** be met to ensure high availability:\n* **Global Usage:** The system **must** be designed to support global usage, considering end users connecting from various countries and time zones.\n* **Performance and Scalability:** The system **must** maintain optimal performance, with appropriate response times: 2s at p95 as recorded at Layer 4 of the network (load balancer/reverse proxy). This performance target is subject to a workload limit.\n* **Resource Management:** The system **must** provide visibility of resource consumption and offer the option to provision additional resources if performance and availability expectations are not met or are at risk of not being met\n* **Uptime:** The system **must** maintain a target uptime (not including scheduled downtime) of 99.9%, minimizing downtime and ensuring consistent service availability for users. Uptime **must** accommodate the downtime probabilities for the underlying cloud platforms.\n\n#### Enterprise-grade Information Security\n\nThe system **must** adhere to enterprise-grade information security standards, employing various technologies, tactics, and processes to protect digital assets against unauthorized use, abuse, or infiltration by threat actors. Enterprise security **should** also include the protection of data as it flows across networks, including those connecting satellite offices and those that tie data into the general internet. The following requirements are essential for ensuring enterprise-grade information security:\n* **Robust Trust Model:** The system **must** support a robust trust model, incorporating strong authentication, authorization, and privacy measures.\n* **Personal Information (PII) Protection:** The system **must** comply with industry-standard practices for Personally Identifiable Information (PII) protection.\n* **GDPR Compliance:** The system **must** support GDPR compliance, ensuring that the processing of personal data is conducted in accordance with relevant regulations.\n* **ISO 27001 Compliance Support:** The system **should** support ISO 27001 standards, demonstrating a commitment to information security best practices. Note that technical features are only part of successful ISO27001 compliance. The system itself cannot assure ISO27001 certification as organizational policies and practices are key to the overall Information Security Management System required by the standard. However, the system should not be substantially deficient in and of itself.\n\n#### Role or Policy Based User Access\n\nThe system **must** implement role-based user access, where user permissions and access rights are assigned based on predefined roles and responsibilities within the organization. It **must** include different user roles (e.g., System Admin, Operational Administrator, Owner User, AEC User, Project Admin, MSI Data Scientist/Data Analyst) and associate each role with specific access privileges to system functionalities, data, and resources. This ensures that users can only access information and perform actions relevant to their roles.\n\nIt also **must** implement user policies allowing administrators to define a custom set of account properties and key privileges and then save them as a policy for reuse. When a user account is created, User Policy **could** be used to quickly apply settings to the new account.\n\nBelow is an outline of the user persona within the system. \n\n![User Hierarchy](img/user-hierarchy.png)\n\n**Technical Personas**\n\n\n* **System Admin:** These are the users managing new user creation and deletion as well as being able to administer users of different types. For a user of a particular type, they should be able to include them or exclude them from access policies.\n* **Operational Administrators:** These are the users having administrative rights to manage API integration, managing and scheduling data/file ingestion, metadata reporting, back-up/restore, event reporting etc.\n\n**Business Personas**\n\n\n* **Owner Users:** These are the users at the owner organization responsible for overseeing construction related capital spending, identifying the need to build and the requirements for construction projects, overseeing the projects and the project portfolio and for recognizing opportunities for organizational and process improvement and feeding those improvements back into the enterprise.\n* **Project Admin Users:** These are the users who are authorized to deliver services on a project basis. They will be responsible for managing an Owner’s project(s) - including project-level configuration and access - and therefore will have project permissions that support this function. Both MSI and Owner personnel can assume this persona.\n* **AEC Users:** These are the architects (A), Engineers (E) and Construction (C) users who interact routinely with the many operational systems deployed throughout the building life cycle. There are certainly other users who are not specifically in the architecture, engineering and construction professions and trades who are involved in the construction process and who interact with operational systems. These users, too, should be understood to be members of this user class.\n* **MSI Data Scientists/Data Analysts:** These are users who analyze the data collected in the MSI Data Lake in order to provide descriptive, predictive and prescriptive abstracts of the data. These abstracts are the key analytical products that enable data-based product value.\n\n#### Visibility and Monitoring\n\nThe system **must** keep operational administrators informed about what's happening within the system or interface. It **must** include using notifications like feedback, progress indicators, and error messages to keep operational administrators informed about what's happening in the interface. The following requirements **must** be met to ensure system visibility:\n\n* **Contextual Information:** The system **must** capture contextual information (system/applications) for troubleshooting issues, providing administrators with the information they need to quickly identify and resolve problems.\n* **Monitoring:** The system **must** provide an interface for analyzing application logs, stack traces, exceptions and warnings along with real time monitoring of performance, capacity and availability\n* **Notifications:** The system **must** provide notifications to operational administrators, informing them about issues, errors, or warnings, enabling them to take timely action. This ensures timely response to system events and minimizes the impact of potential issues.\n\n#### Release Management\n\nThe system **must** implement a robust release management process for managing, planning, scheduling, and controlling software builds through different stages and environments. This process **should** include testing and deploying software releases. The following requirements are essential for effective release management:\n\n* **Version Management:** A distinct version management system **must** be available, allowing for tracking of changes, rollbacks, and version comparisons.\n* **Tools and Platforms:** Tools like Git or Bitbucket/Confluence and Jira **should** be used for managing source code, documentation, and issue tracking.\n* **Data Pipeline Development:** The data pipeline development process **should** be covered in the release management process, ensuring that changes to data pipelines are properly managed and deployed.\n* **Dataset and Recovery Point Reviews:** The system **must** allow for System & Data Integrity Analysis to be conducted in terms of datasets and recovery points to ensure integrity and minimize the impact of releases or restores on data availability.\n\n#### Change Management\n\nThe system **must** implement a change management process designed to use standardized methods and procedures for handling all changes efficiently and promptly. Change management capability **could** be supported using software. The goal is to minimize the impact of change-related incidents on service quality, thereby improving the organization's day-to-day operations. A change management framework **could** be defined, and supportive request and approval flows **could** be in place using an application like Jira. \n\n\n#### Recovery Point Requirement\n\nThe system **must** have a Recovery Point Objective (RPO) defined as the maximum amount of data that can be lost after a recovery from a disaster, failure, or comparable event before data loss will exceed what is acceptable to an organization. It **should** include determining the maximum age of the data or files in backup storage needed to be able to meet the objective specified by the RPO, should a network or computer system failure occur. Backup and restore points **must** be defined for both applications and the data residing in the system, and this process **should** be managed by the operational administrators.\n\n### Appendix        \n\n#### Touch Plan Environment\n\nSome additional information is also shared below to provide an overview of platforms used in Touchplan which is also an MSI product.\n\n* Touchplan's backend and frontend services are hosted on Google Cloud.\n* Snowflake, which is a cloud platform, is used as the data warehouse. \n* Segment is used for user interface event logging.\n* Google Firebase is used as a document database and multicast data distribution service.\n* Google Looker is used as the BI tool \n* Datadog is used for operational monitoring (visibility).\n* Data replication is managed as primary-secondary whereas a snapshot of primary database objects and data is transferred to the secondary database.\n* Touchplan is committed to 99.9%  (30-60 minute weekly maximum downtime due to maintenance) availability excluding scheduled downtime.\n\nMSI Control Tower Requirement Analysis\n                Page  of \n________________\n[1] AEC Users are not a primary persona of MSI, nor their target customer. They are included here for completeness and represent a potential future class of users.\n[2] For the context of this requirement, a filesystem must support a directory hierarchy. This requirement would also be met by filesystems with virtual hierarchies.","filename":"req_doc.md","format":"Markdown","order":2,"title":""},{"content":"## Requirements List\n\n| Req. ID | Description | MoSCoW | Phase |\n|---|---|---|---|\n| 3.2.1.1 | Support OAuth or similar authentication for account linking with third-party systems. | Must | I |\n| 3.2.1.1.1 | Auth tokens generated during SSO or other processes must be secured/hashed; fulfilling security requirements defined in 3.3.1.2. | Must | I |\n| 3.2.1.2 | Have an interface for user management and privilege administration. | Must | I |\n| 3.2.1.2.1 | Administrators should be able to manage user privileges for each defined role. | Should | I |\n| 3.2.1.2.2 | System admins must have the option to grant/revoke privileges to defined user roles via an HTML-based UI. | Must | I |\n| 3.2.1.3 | Have tools for visualizing and reporting data insights. | Must | II |\n| 3.2.1.3.1 | Provide a visual representation of available analyses and information to end users. | Must | II |\n| 3.2.1.3.2 | Have a portfolio view. | Must | II |\n| 3.2.1.3.2 | Support a client hierarchy. | Must | I |\n| 3.2.1.3.3 | Integrate with a wiki (or similar) for accessing the CIP. | Must | I |\n| 3.2.1.3.4 | Select widgets from other applications could be embeddable as iframes. | Could | III |\n| 3.2.1.3.5 | Link to supported third-party applications for ease of access. | Must | I |\n| 3.2.1.4 | Support a metadata management process. | Must | III |\n| 3.2.1.4.1 | Metadata database must be connected to the UI to fulfill data governance requirements for end users. | Must | III |\n| 3.2.1.4.2 | Support metadata reporting; filtering; searching; and sorting. | Must | III |\n| 3.2.1.5 | Track and report data origin; changes; and history. | Must | II |\n| 3.2.1.5.1 | Track provenance of each data object. | Must | II |\n| 3.2.1.5.2 | Enable administrative users to review data lineage through a dedicated UI. | Must | II |\n| 3.2.1.6 | Integrate with a dedicated wiki (or similar) for the CIP. | Must | I |\n| 3.2.1.6.1 | House all relevant documents and resources related to the CIP. | Must | I |\n| 3.2.1.6.2 | Facilitate information sharing and collaboration among users by allowing them to contribute, edit, and access information relevant to their roles and responsibilities. | Must | I |\n| 3.2.1.6.3 | Provide basic version control capabilities. | Must | I |\n| 3.2.1.6.4 | Provide search and navigation functionalities. | Should | I |\n| 3.2.1.6.5 | Implement role-based or policy-based access control. | Must | I |\n| 3.2.2.1 | Support recording and tracking user interactions and system activities. | Must | II |\n| 3.2.2.1.1 | Capture detailed logs of user login/logout events; data accesses; modifications; and other relevant activities. | Must | I |\n| 3.2.2.1.2 | System activities and data modifications must be logged to enable auditing and tracing data origin. | Must | I |\n| 3.2.2.1.3 | Provide comprehensive audit logs capturing all relevant user and system events. | Must | I |\n| 3.2.2.1.4 | Provide tools for generating audit reports. | Should | I |\n| 3.2.2.1.5 | Provide features for exporting audit logs in various formats. | Must | II |\n| 3.2.2.1.6 | The front-end for viewing logs should amalgamate logs from all sources. | Must | III |\n| 3.2.2.2 | Provide a system status dashboard displaying real-time operational status and performance. | Must | I |\n| 3.2.2.2.1 | Be accessible to end users through the Control Tower UI. | Could | II |\n| 3.2.2.2.2 | Information about the last time data was refreshed or updated in the system. | Must | II |\n| 3.2.2.2.3 | Provide real-time alerts to end users when data is refreshed. | Should | III |\n| 3.2.2.3 | Support backup and restore processes. | Must | I |\n| 3.2.2.3.1 | Implement multiple redundant backup destinations. | Could | I |\n| 3.2.2.3.2 | Allow scheduling regular backups. | Must | I |\n| 3.2.2.3.3 | Allow performing on-demand backups. | Must | I |\n| 3.2.2.3.4 | Provide easily accessible information about backup sets. | Must | I |\n| 3.2.2.3.5 | Allow easy restoration of datasets from specific backup sets. | Must | I |\n| 3.2.2.3.6 | Provide logs of backup and restore actions that are readily available and queriable. | Must | I |\n| 3.2.2.3.7 | Restoration of datasets must adhere to all non-functional requirements (3.3). | Must | I |\n| 3.2.3.1 | Employ robust and proprietary data storage technology. | Must | II |\n| 3.2.3.1.1 | Store both data and metadata from source applications. | Must | II |\n| 3.2.3.1.2 | Provide persistent data storage. | Must | II |\n| 3.2.3.1.3 | Support data lifespan specification (earliest and latest times). | Should | II |\n| 3.2.3.1.4 | Implement access controls adhering to enterprise-grade security standards. | Must | II |\n| 3.2.3.1.5 | Be deployed on a cloud-based platform. | Must | II |\n| 3.2.3.2 | Have a connected file storage system. | Must | II |\n| 3.2.3.2.1 | Provide persistent file storage. | Must | II |\n| 3.2.3.2.2 | Offer directory management features. | Must | II |\n| 3.2.3.2.3 | Implement access controls adhering to enterprise-grade security standards. | Must | II |\n| 3.2.3.2.4 | Be deployed on a cloud-based platform. | Must | II |\n| 3.2.3.3 | Support ingestion of structured; unstructured; and semi-structured data. | Must | II |\n| 3.2.3.3.1 | Be able to consume structured data in various formats (relational databases; CSV; text files). | Must | II |\n| 3.2.3.3.2 | Be able to consume unstructured data (images; videos; specialized document formats). | Must | II |\n| 3.2.3.3.3 | Be able to consume semi-structured data (mix of structured and unstructured data). | Must | II |\n| 3.2.3.3.4 | Support file-based integration. | Must | II |\n| 3.2.3.3.5 | Support API integration. | Must | II |\n| 3.2.3.3.6 | Support both file-based and API-based ingestion mechanisms; initiated by MSI or third parties. | Must | II |\n| 3.2.3.3.7 | Selected data integration tool must provide ingestion management capabilities (scheduling; monitoring; troubleshooting). | Must | II |\n| 3.2.3.3.8 | Provide a simple declarative mechanism for data transformation (normalization; filtering; transformation; aggregation). | Must | II |\n| 3.2.3.3.9 | Operational administrators must be able to manage data ingestion processes through the selected data integration tool. | Must | II |\n| 3.2.3.4 | Support real-time data integration processes. | Must | III |\n| 3.2.3.4.1 | Data ingestion should occur at least daily; with real-time and hourly ingestion as desirable options. | Should | II |\n| 3.2.3.4.2 | System status screen should display report and dashboard refresh times. | Should | II |\n| 3.2.3.4.3 | Provide real-time alerts to end users when data is refreshed. | Should | III |\n| 3.2.3.5 | Support scheduled; on-demand; or event-based data operations. | Must | II |\n| 3.2.3.5.1 | Allow defining schedules for data operations (extraction; transformation; loading; maintenance). | Must | II |\n| 3.2.3.5.2 | Selected data integration tool must provide operational administrators with the ability to manage on-demand or event-based data operations. | Must | II |\n| 3.2.4.1 | Facilitate interactive data analysis; visualization; and documentation. | Must | II |\n| 3.2.4.1.1 | Enable code creation; sharing; and execution in a collaborative environment. | Must | II |\n| 3.2.4.1.2 | Data scientists must be able to implement machine learning processes on data in the data lake through a web-based interactive development environment. | Must | II |\n| 3.2.4.1.3 | Interactive notebooks (e.g.; Jupyter) could be a key component. | Could | II |\n| 3.2.4.2 | Support statistical analysis processes. | Must | II |\n| 3.2.4.2.1 | Support data collection; description; and Exploratory Data Analysis (EDA). | Must | II |\n| 3.2.4.2.2 | Support inferential statistics and statistical modeling. | Must | II |\n| 3.2.4.2.3 | Support data visualization and interpretation. | Must | II |\n| 3.2.4.2.4 | Provide access to statistical tools and libraries. | Must | II |\n| 3.2.4.3 | Support deployment of machine learning algorithms. | Must | III |\n| 3.2.4.3.1 | Offer frameworks and ML libraries compatible with the data lake and other system components. | Must | III |\n| 3.2.4.3.2 | Ensure scalability and performance optimization for ML models. | Must | III |\n| 3.2.4.3.3 | Support a distinction between and supports both training and inference. | Must | II |\n| 3.2.4.3.4 | Support rapid deployment of successful models. | Must | III |\n| 3.2.4.3.5 | Support continuous evaluation of models for retraining purposes. | Must | III |\n| 3.2.4.4 | Facilitate the implementation and execution of data science functions. | Must | II |\n| 3.2.4.4.1 | Provide libraries; frameworks; and tools for tasks like data preprocessing; feature engineering; model training; evaluation; and deployment. | Must | II |\n| 3.2.4.4.2 | Integrate seamlessly with the data lake for easy data access and processing. | Must | II |\n| 3.2.5.1 | The platform must be compatible and integrate with BI tools. | Must | II |\n| 3.2.5.2 | Could provide drag-and-drop reporting for end users. | Could | II |\n| 3.2.5.3 | Could offer a wide range of data visualization options. | Could | II |\n| 3.2.5.4 | Support client business analysts. | Could | III |\n| 3.2.5.4 | Could integrate seamlessly with the Control Tower platform. | Could | II |\n| 3.3.1 | The system must meet high availability standards. | Must | - |\n| 3.3.1.1 | Must be designed to support global usage. | Must | - |\n| 3.3.1.2 | Must maintain optimal performance with appropriate response times (2s at p95). | Must | - |\n| 3.3.1.3 | Must provide resource consumption visibility and allow provisioning additional resources. | Must | - |\n| 3.3.1.4 | Must maintain a target uptime of 99.9% (excluding scheduled downtime). | Must | - |\n| 3.3.2 | The system must adhere to enterprise-grade information security standards. | Must | - |\n| 3.3.2.1 | Must implement a robust trust model with strong authentication; authorization; and privacy measures. | Must | - |\n| 3.3.2.2 | Must comply with industry-standard practices for PII protection. | Must | - |\n| 3.3.2.3 | Must support GDPR compliance. | Must | - |\n| 3.3.2.4 | Should support ISO 27001 standards. | Should | - |\n| 3.3.3 | The system must implement role-based user access. | Must | - |\n| 3.3.3.1 | Must include different user roles (System Admin; Operational Administrator; Owner User; AEC User; Project Admin; MSI Data Scientist/Data Analyst) with specific access privileges. | Must | - |\n| 3.3.3.2 | Should implement user policies allowing administrators to define custom account properties and privileges. | Should | - |\n| 3.3.4 | The system must keep operational administrators informed about system operations. | Must | - |\n| 3.3.4.1 | Must capture contextual information for troubleshooting. | Must | - |\n| 3.3.4.2 | Must provide an interface for log analysis; real-time monitoring of performance; capacity; and availability. | Must | - |\n| 3.3.4.3 | Must provide notifications to operational administrators about issues; errors; or warnings. | Must | - |\n| 3.3.5 | The system must implement a robust release management process. | Must | - |\n| 3.3.5.1 | Must have a distinct version management system. | Must | - |\n| 3.3.5.2 | Should use tools like Git; Bitbucket/Confluence; and Jira. | Should | - |\n| 3.3.5.3 | Must cover data pipeline development in the release management process. | Must | - |\n| 3.3.5.4 | Must allow for dataset and recovery point reviews to ensure data integrity. | Must | - |\n| 3.3.6 | The system must implement a change management process. | Must | - |\n| 3.3.6.1 | Could be supported using software. | Could | - |\n| 3.3.6.2 | Could define a change management framework and implement request/approval flows using tools like Jira. | Could | - |\n| 3.3.7 | The system must define a Recovery Point Objective (RPO). | Must | - |\n| 3.3.7.1 | Must determine the maximum acceptable data loss after recovery from a disaster or failure. | Must | - |\n| 3.3.7.2 | Must define backup and restore points for both applications and data. | Must | - |\n","filename":"req_list.md","format":"Markdown","order":3,"title":""}]},"id":1,"lastModifiedAgent":"structurizr-cli/1.35.0","lastModifiedDate":"2024-08-07T11:23:46Z","lastModifiedUser":"root@ac28588f9922","model":{"people":[{"description":"Represents the owner of a construction project","id":"1","location":"Unspecified","name":"Owner User","perspectives":[{"description":"Development Phase 1","name":"Development Phase 1","value":"1"},{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"owneruser"},"relationships":[{"description":"Views insights and dashboards within the application","destinationId":"7","id":"55","perspectives":[{"description":"Development Phase 1","name":"Development Phase 1","value":"1"},{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"db758f86-94e4-4a63-a90f-2391c9585c06"},"sourceId":"1","tags":"Relationship"},{"description":"Views insights and dashboards within the application","destinationId":"6","id":"56","linkedRelationshipId":"55","sourceId":"1"}],"tags":"Element,Person,Customer User,P1"},{"description":"Manages project-level configuration and access","id":"2","location":"Unspecified","name":"Project Admin User","perspectives":[{"description":"Development Phase 1","name":"Development Phase 1","value":"1"},{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"projectadmin"},"relationships":[{"description":"Manages users and configures projects","destinationId":"7","id":"57","perspectives":[{"description":"Development Phase 1","name":"Development Phase 1","value":"1"},{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"32f6cdfa-aed4-4625-b8cc-94d125fadbd1"},"sourceId":"2","tags":"Relationship"},{"description":"Manages users and configures projects","destinationId":"6","id":"58","linkedRelationshipId":"57","sourceId":"2"}],"tags":"Element,Person,Internal or External User,P1"},{"description":"Analyzes data and develops models and generates actionable insights for the owner.","id":"3","location":"Unspecified","name":"MSI Data Scientist/Analyst","perspectives":[{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"datascientist"},"relationships":[{"description":"Uses for data analysis and modeling","destinationId":"38","id":"66","perspectives":[{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"e97f45e6-00fc-4fa6-91cd-644edf713597"},"sourceId":"3","tags":"Relationship"},{"description":"Uses for data analysis and modeling","destinationId":"24","id":"67","linkedRelationshipId":"66","sourceId":"3"}],"tags":"Element,Person,Internal User,P2"},{"description":"Manages data flows, integrations, and ensures data quality and integrity.","id":"4","location":"Unspecified","name":"Operational Administrator","perspectives":[{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"opadmin"},"relationships":[{"description":"Manages data pipelines and integrations","destinationId":"24","id":"63","perspectives":[{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"81e28bfe-3cf1-4165-91b5-45867115aeed"},"sourceId":"4","tags":"Relationship"},{"description":"Configures data ingestion","destinationId":"25","id":"64","perspectives":[{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"d353ad85-e01a-4c58-9ac5-76d499b8fd28"},"sourceId":"4","tags":"Relationship"}],"tags":"Element,Person,Internal User,P2"},{"description":"Manages system access, security, backups, and overall system health.","id":"5","location":"Unspecified","name":"System Administrator","perspectives":[{"description":"Development Phase 1","name":"Development Phase 1","value":"1"},{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"sysadmin"},"relationships":[{"description":"Initiates and monitors backups","destinationId":"20","id":"59","perspectives":[{"description":"Development Phase 1","name":"Development Phase 1","value":"1"},{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"2f1d0ba2-1323-4dbb-a14e-beaca75ad6d0"},"sourceId":"5","tags":"Relationship"},{"description":"Initiates and monitors backups","destinationId":"15","id":"60","linkedRelationshipId":"59","sourceId":"5"},{"description":"Initiates and monitors backups","destinationId":"6","id":"61","linkedRelationshipId":"59","sourceId":"5"},{"description":"Monitors system health and performance","destinationId":"19","id":"62","perspectives":[{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"ec97afbb-2f5b-46d8-a19c-42df88db391a"},"sourceId":"5","tags":"Relationship"},{"description":"Administers","destinationId":"24","id":"65","perspectives":[{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"0db86ea1-cdfa-4dda-8864-28070b1868df"},"sourceId":"5","tags":"Relationship"}],"tags":"Element,Person,Internal User,P1"}],"softwareSystems":[{"containers":[{"components":[{"description":"Displays interactive dashboards and visualizations","documentation":{},"id":"8","name":"Dashboard","properties":{"structurizr.dsl.identifier":"9aa28b32-dbe7-4127-b7df-0338a0f5c2e2"},"tags":"Element,Component"},{"description":"Generates reports on demand","documentation":{},"id":"9","name":"Reporting Engine","properties":{"structurizr.dsl.identifier":"cd2d0bfe-b0ef-47b8-b188-ea82442c1a4f"},"tags":"Element,Component"},{"description":"Displays real-time alerts and notifications","documentation":{},"id":"10","name":"Alerting System","properties":{"structurizr.dsl.identifier":"5658b80c-07e0-475f-9c69-2fb62d1fe2ba"},"tags":"Element,Component"},{"description":"Manages user accounts and permissions","documentation":{},"id":"11","name":"User Management","properties":{"structurizr.dsl.identifier":"0e4bd088-9dde-42b1-81c3-01ec7d1e9a5c"},"tags":"Element,Component"},{"description":"Provides access to and navigation of the CIP","documentation":{},"id":"12","name":"CIP Viewer","properties":{"structurizr.dsl.identifier":"a3bd60d8-8c8d-4ef2-9eef-3fcefc41775f"},"tags":"Element,Component"},{"description":"Enables integration and SSO to authorized third-party applications.","documentation":{},"id":"13","name":"Third-Party Linking","properties":{"structurizr.dsl.identifier":"4d969631-5129-430a-bf32-dabfbb3ebb38"},"tags":"Element,Component"}],"description":"Provides a web-based interface for owners to view insights and project admins to configure users and projects.","documentation":{},"id":"7","name":"End-User Application","perspectives":[{"description":"Development Phase 1","name":"Development Phase 1","value":"1"},{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"enduserapp"},"relationships":[{"description":"Fetches CIP content","destinationId":"23","id":"95","perspectives":[{"description":"Development Phase 1","name":"Development Phase 1","value":"1"},{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"4644ab69-8cd0-456b-a197-3dde9d202ffc"},"sourceId":"7","tags":"Relationship"},{"description":"Requests access to third-party applications","destinationId":"18","id":"97","perspectives":[{"description":"Development Phase 1","name":"Development Phase 1","value":"1"},{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"ef633eb0-07a2-420f-8e9d-fabf0592221a"},"sourceId":"7","tags":"Relationship"},{"description":"Requests access to third-party applications","destinationId":"15","id":"98","linkedRelationshipId":"97","sourceId":"7"},{"description":"Reads and writes data via HTTP requests to","destinationId":"15","id":"99","perspectives":[{"description":"Development Phase 1","name":"Development Phase 1","value":"1"},{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"dd474f39-e539-4d99-83e6-c2565cccf57c"},"sourceId":"7","tags":"Relationship"},{"description":"Authenticates users","destinationId":"17","id":"100","perspectives":[{"description":"Development Phase 1","name":"Development Phase 1","value":"1"},{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"63b27747-099d-43f7-b560-33e7777d8754"},"sourceId":"7","tags":"Relationship"},{"description":"Sends requests to","destinationId":"16","id":"102","perspectives":[{"description":"Development Phase 1","name":"Development Phase 1","value":"1"},{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"8cc495b1-7238-424c-8c4e-2e02950814cc"},"sourceId":"7","tags":"Relationship"},{"description":"Provides access to","destinationId":"54","id":"109","perspectives":[{"description":"Development Phase 1","name":"Development Phase 1","value":"1"},{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"cdbfe277-d45e-46d2-9a96-6811fefe049d"},"sourceId":"7","tags":"Relationship"}],"tags":"Element,Container,P1"},{"description":"Stores Control Tower application data, standardized analytics, and configuration data.","documentation":{},"id":"14","name":"Application Database","perspectives":[{"description":"Development Phase 1","name":"Development Phase 1","value":"1"},{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"appdb"},"tags":"Element,Container,Database,P1"},{"components":[{"description":"Provides RESTful API for the front-end End-User Application","documentation":{},"id":"16","name":"Service API","perspectives":[{"description":"Development Phase 1","name":"Development Phase 1","value":"1"},{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"serviceapi"},"relationships":[{"description":"Reads and writes data from","destinationId":"14","id":"103","perspectives":[{"description":"Development Phase 1","name":"Development Phase 1","value":"1"},{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"6e0fefcf-7f68-4e56-a98c-c3db35a2a681"},"sourceId":"16","tags":"Relationship"}],"tags":"Element,Component,P1"},{"description":"Manages user authentication and authorization","documentation":{},"id":"17","name":"Identity Provider","perspectives":[{"description":"Development Phase 1","name":"Development Phase 1","value":"1"},{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"idprovider"},"tags":"Element,Component,P1"},{"description":"Manages secure access to third-party applications","documentation":{},"id":"18","name":"Third-Party Application Proxy","perspectives":[{"description":"Development Phase 1","name":"Development Phase 1","value":"1"},{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"thirdpartyproxy"},"relationships":[{"description":"Retrieves credentials from","destinationId":"21","id":"101","perspectives":[{"description":"Development Phase 1","name":"Development Phase 1","value":"1"},{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"d6f922b6-7e63-44ba-813f-ec3ec68a4edf"},"sourceId":"18","tags":"Relationship"}],"tags":"Element,Component,P1"},{"description":"Monitors system health and performance","documentation":{},"id":"19","name":"System Monitoring Service","perspectives":[{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"sysmonitoring"},"tags":"Element,Component,P2"},{"description":"Manages backups and data restoration for databases and file systems","documentation":{},"id":"20","name":"Backup & Restore Service","perspectives":[{"description":"Development Phase 1","name":"Development Phase 1","value":"1"},{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"backuprestore"},"tags":"Element,Component,P1"},{"description":"Securely stores credentials for third-party applications","documentation":{},"id":"21","name":"Credential Store","perspectives":[{"description":"Development Phase 1","name":"Development Phase 1","value":"1"},{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"credentialstore"},"tags":"Element,Component,P1"},{"description":"Monitors the liveliness, readiness and performance of the back-end components","documentation":{},"id":"22","name":"Health Daemon","perspectives":[{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"2169b119-85a4-41ff-aea5-726f4766638f"},"tags":"Element,Component,Monitoring,Daemon,P2"}],"description":"Interfaces with the front-end, handles background tasks, integrations, security, and data management.","documentation":{},"id":"15","name":"Back-End Application","perspectives":[{"description":"Development Phase 1","name":"Development Phase 1","value":"1"},{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"backendapp"},"relationships":[{"description":"Reads application data and analytics from. Writes application data to.","destinationId":"14","id":"94","perspectives":[{"description":"Development Phase 1","name":"Development Phase 1","value":"1"},{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"610d7dba-4f84-4cd4-9948-67dae4481397"},"sourceId":"15","tags":"Relationship"}],"tags":"Element,Container,P1"},{"description":"Hosts and manages the Comprehensive Implementation Plan (CIP)","documentation":{},"id":"23","name":"Wiki Service","perspectives":[{"description":"Development Phase 1","name":"Development Phase 1","value":"1"},{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"wikiservice"},"relationships":[{"description":"Writes CIP content","destinationId":"14","id":"96","perspectives":[{"description":"Development Phase 1","name":"Development Phase 1","value":"1"},{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"a55064fc-da8d-4539-80d5-f02a692306ad"},"sourceId":"23","tags":"Relationship"}],"tags":"Element,Container,P1"}],"description":"Provides insights and analytics for Owners of construction projects as well as a management layer for Project Admins","documentation":{},"id":"6","location":"Unspecified","name":"MSI Control Tower Application","perspectives":[{"description":"Development Phase 1","name":"Development Phase 1","value":"1"},{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"softwaresystem"},"relationships":[{"description":"Provides access to","destinationId":"54","id":"110","linkedRelationshipId":"109","sourceId":"6"}],"tags":"Element,Software System,Internal System,P1"},{"containers":[{"components":[{"description":"Triggers the data ingestion process","documentation":{},"id":"26","name":"Data Ingest Trigger","properties":{"structurizr.dsl.identifier":"8dd0bb40-bb32-4e98-9f06-30e876081149"},"tags":"Element,Component"},{"description":"Connects to and extracts data from source application APIs","documentation":{},"id":"27","name":"API Connector","properties":{"structurizr.dsl.identifier":"7c7f9c46-4244-48d8-aab6-0ea4262d2339"},"tags":"Element,Component"},{"description":"Reads and processes data from source application files","documentation":{},"id":"28","name":"File Ingestor","properties":{"structurizr.dsl.identifier":"6ece768c-6768-4cd8-9f75-2b9ea053d4e1"},"tags":"Element,Component"},{"description":"Performs data validation and quality checks","documentation":{},"id":"29","name":"Data Validator","properties":{"structurizr.dsl.identifier":"885c4605-1a77-4b03-9dc9-3c0f7ceb598f"},"tags":"Element,Component"},{"description":"Cleans and standardizes ingested data","documentation":{},"id":"30","name":"Data Cleanser","properties":{"structurizr.dsl.identifier":"8d110e6b-18bf-499d-b973-9103886c346b"},"tags":"Element,Component"},{"description":"Monitors the liveliness, readiness and performance of the data ingestion process","documentation":{},"id":"31","name":"Health Daemon","perspectives":[{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"3268ba1c-9785-4ef6-9ef5-8d01369dfcd2"},"tags":"Element,Component,Monitoring,Daemon,P2"}],"description":"Ingests data from various construction applications and file systems","documentation":{},"id":"25","name":"Data Ingestion","perspectives":[{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"dataingestion"},"relationships":[{"description":"Loads raw data into","destinationId":"32","id":"68","perspectives":[{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"7d07c3b4-c468-4131-b430-8c5d8f443929"},"sourceId":"25","tags":"Relationship"}],"tags":"Element,Container,P2"},{"components":[{"description":"Stores ingested data in its original format","documentation":{},"id":"33","name":"Raw Data Storage","properties":{"structurizr.dsl.identifier":"c188687f-ba50-4645-8d9a-5718b015fc9c"},"tags":"Element,Component"},{"description":"Stores transformed and enriched data","documentation":{},"id":"34","name":"Processed Data Storage","properties":{"structurizr.dsl.identifier":"a95ac73e-d541-463d-8736-90b444eeab21"},"tags":"Element,Component"},{"description":"Monitors the liveliness, readiness and performance of the data lake","documentation":{},"id":"35","name":"Health Daemon","perspectives":[{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"95fdc748-325f-4a03-9595-fc269d7b9b81"},"tags":"Element,Component,Monitoring,Daemon,P2"}],"description":"Central repository for raw and processed construction data","documentation":{},"id":"32","name":"Data Lake","perspectives":[{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"datalake"},"tags":"Element,Container,Database,P2"},{"components":[{"description":"Monitors the liveliness, readiness and performance of the data science database","documentation":{},"id":"37","name":"Health Daemon","perspectives":[{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"c36b4063-8f4f-4032-92da-3000b65f2cdd"},"tags":"Element,Component,Monitoring,Daemon,P2"}],"description":"Stores processed data and model outputs from the Data Science Workbench and data processing/analysis jobs","documentation":{},"id":"36","name":"Data Science DB","perspectives":[{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"datasciencedb"},"tags":"Element,Container,Database,P2"},{"components":[{"description":"Provides interactive notebooks for data exploration and analysis","documentation":{},"id":"39","name":"Notebook Environment","properties":{"structurizr.dsl.identifier":"b7fc6fce-6e5f-4823-9466-def07e62d92d"},"tags":"Element,Component"},{"description":"Trains and evaluates machine learning models","documentation":{},"id":"40","name":"Model Training Engine","properties":{"structurizr.dsl.identifier":"ee84763d-1f12-409a-8099-791e6d6da3bb"},"tags":"Element,Component"},{"description":"Stores and manages trained machine learning models","documentation":{},"id":"41","name":"Model Registry","properties":{"structurizr.dsl.identifier":"1b6c761f-5078-4c54-abe8-a88db3b1fa7d"},"tags":"Element,Component"},{"description":"Provides tools and dashboards for visualizing data and model outputs","documentation":{},"id":"42","name":"Visualization Tools","properties":{"structurizr.dsl.identifier":"visualisationtools"},"tags":"Element,Component"},{"description":"Monitors the liveliness, readiness and performance of the data science workbench","documentation":{},"id":"43","name":"Health Daemon","perspectives":[{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"81a17cfd-6845-4897-86d0-2ef8293c6b53"},"tags":"Element,Component,Monitoring,Daemon,P2"}],"description":"Provides an environment for data scientists to analyze data and develop ML models","documentation":{},"id":"38","name":"Data Science Workbench","perspectives":[{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"datascienceworkbench"},"relationships":[{"description":"Reads data from","destinationId":"32","id":"69","perspectives":[{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"97a8c4ab-9247-49ed-808c-f347922d43a6"},"sourceId":"38","tags":"Relationship"},{"description":"Writes data to","destinationId":"36","id":"70","perspectives":[{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"d3d1b548-b9da-40b7-a0ab-2917d3265ce8"},"sourceId":"38","tags":"Relationship"},{"description":"Defines analyses, models and monitoring rules used in","destinationId":"44","id":"73","perspectives":[{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"56d2f304-fd8d-49c1-ae29-ae0f59e5932a"},"sourceId":"38","tags":"Relationship"},{"description":"Data Scientists define monitoring rules in","destinationId":"45","id":"74","perspectives":[{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"258efc41-7694-4110-9c1b-ff081ad224e3"},"sourceId":"38","tags":"Relationship"},{"description":"Data Scientists define analyses in","destinationId":"46","id":"75","perspectives":[{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"82f9b8cf-9d54-441a-bc27-873f1b412c00"},"sourceId":"38","tags":"Relationship"}],"tags":"Element,Container,P2"},{"components":[{"description":"Based on defined rules, runs monitoring analysis and triggers alerts","documentation":{},"id":"45","name":"Monitoring Analysis Job","perspectives":[{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"monitoringanalysisjob"},"relationships":[{"description":"Reads new data from","destinationId":"32","id":"76","perspectives":[{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"31010560-414b-42aa-9208-4c2340feb022"},"sourceId":"45","tags":"Relationship"},{"description":"Alerts are sent to","destinationId":"16","id":"78","perspectives":[{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"d533fa6b-12d7-4a67-842f-88c69a80f9c8"},"sourceId":"45","tags":"Relationship"},{"description":"Alerts are sent to","destinationId":"15","id":"79","linkedRelationshipId":"78","sourceId":"45"},{"description":"Alerts are sent to","destinationId":"6","id":"80","linkedRelationshipId":"78","sourceId":"45"}],"tags":"Element,Component,P3"},{"description":"Manages and processes data science jobs","documentation":{},"id":"46","name":"Data Science Job Processor","perspectives":[{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"datasciencejobqueue"},"relationships":[{"description":"Reads new data from","destinationId":"32","id":"89","perspectives":[{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"f9e64931-20b7-4114-84fc-36f8ec56658d"},"sourceId":"46","tags":"Relationship"},{"description":"Writes output to","destinationId":"36","id":"90","perspectives":[{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"01f46d38-714b-44d6-9ab3-08b06da48286"},"sourceId":"46","tags":"Relationship"},{"description":"Analysis Complete trigger","destinationId":"47","id":"92","perspectives":[{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"e7ac8696-3060-488c-89ad-4675fcac46f8"},"sourceId":"46","tags":"Relationship"}],"tags":"Element,Component,P3"},{"description":"Manages jobs for moving data between databases","documentation":{},"id":"47","name":"Data Movement Job Processor","perspectives":[{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"datamovementjobqueue"},"relationships":[{"description":"Copies analysis output data to","destinationId":"14","id":"85","perspectives":[{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"24e5845f-b5ce-4f62-bbba-d917000c835f"},"sourceId":"47","tags":"Relationship"},{"description":"Copies analysis output data to","destinationId":"6","id":"86","linkedRelationshipId":"85","sourceId":"47"},{"description":"Reads data from","destinationId":"36","id":"93","perspectives":[{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"015277e3-74ba-4fd8-b148-158dcd592bc0"},"sourceId":"47","tags":"Relationship"}],"tags":"Element,Component,P3"},{"description":"Monitors the liveliness, readiness and performance of the MLOps components","documentation":{},"id":"48","name":"Health Daemon","perspectives":[{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"cb64016c-a0f2-4f06-a639-46fa51ebb6c9"},"tags":"Element,Component,Monitoring,Daemon,P3"}],"description":"Processes newly ingested data, manages data pipelines and integrations, as well as monitoring and alerting capabilities","documentation":{},"id":"44","name":"MLOps/Data Pipelines","perspectives":[{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"mlops"},"relationships":[{"description":"Writes the latest analysis data and outputs to","destinationId":"6","id":"71","perspectives":[{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"e99ab722-479c-4b81-8d7b-bd2be2d9d8e6"},"sourceId":"44","tags":"Relationship"},{"description":"Reads new data from","destinationId":"32","id":"77","linkedRelationshipId":"76","sourceId":"44"},{"description":"Alerts are sent to","destinationId":"16","id":"81","linkedRelationshipId":"78","sourceId":"44"},{"description":"Alerts are sent to","destinationId":"15","id":"82","linkedRelationshipId":"78","sourceId":"44"},{"description":"Copies analysis output data to","destinationId":"14","id":"87","linkedRelationshipId":"85","sourceId":"44"},{"description":"Writes output to","destinationId":"36","id":"91","linkedRelationshipId":"90","sourceId":"44"}],"tags":"Element,Container,Pipeline,P3"},{"description":"Monitors the performance of the data platform and its components through Health Daemons","documentation":{},"id":"49","name":"Performance Monitor","perspectives":[{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"performancemonitor"},"relationships":[{"description":"Sends health and performance data to","destinationId":"19","id":"104","perspectives":[{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"00fb24ae-f0fe-4e77-bc88-f27f5a37f654"},"sourceId":"49","tags":"Relationship"},{"description":"Sends health and performance data to","destinationId":"15","id":"105","linkedRelationshipId":"104","sourceId":"49"},{"description":"Sends health and performance data to","destinationId":"6","id":"106","linkedRelationshipId":"104","sourceId":"49"}],"tags":"Element,Container,Monitoring,P2"}],"description":"Houses ingested construction project data and provides data processing and analysis tooling and capabilities","documentation":{},"id":"24","location":"Unspecified","name":"Data Platform","perspectives":[{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"dataplatform"},"relationships":[{"description":"Writes the latest analysis data and outputs to","destinationId":"6","id":"72","linkedRelationshipId":"71","sourceId":"24"},{"description":"Alerts are sent to","destinationId":"16","id":"83","linkedRelationshipId":"78","sourceId":"24"},{"description":"Alerts are sent to","destinationId":"15","id":"84","linkedRelationshipId":"78","sourceId":"24"},{"description":"Copies analysis output data to","destinationId":"14","id":"88","linkedRelationshipId":"85","sourceId":"24"},{"description":"Sends health and performance data to","destinationId":"19","id":"107","linkedRelationshipId":"104","sourceId":"24"}],"tags":"Element,Software System,Internal System,P2"},{"containers":[{"components":[{"description":"External APIs of source applications (e.g., P6, Northspyre, Touchplan, Revit, dRofus)","documentation":{},"id":"52","name":"Source Application APIs","properties":{"structurizr.dsl.identifier":"sourceapis"},"tags":"Element,Component"},{"description":"External file systems of source applications","documentation":{},"id":"53","name":"Source Application File Systems","properties":{"structurizr.dsl.identifier":"sourcefiles"},"tags":"Element,Component"}],"documentation":{},"id":"51","name":"Data Types","properties":{"structurizr.dsl.identifier":"datatypes"},"tags":"Element,Container"}],"documentation":{},"id":"50","location":"Unspecified","name":"External Data Sources","perspectives":[{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"datasources"},"relationships":[{"description":"Provides data to","destinationId":"24","id":"108","perspectives":[{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"51a7cf32-dc92-4c94-a9d7-367301e63176"},"sourceId":"50","tags":"Relationship"}],"tags":"Element,Software System,External System,P2"},{"description":"Applications that the Owner User may also have credentials for.","documentation":{},"id":"54","location":"Unspecified","name":"Third Party Apps","perspectives":[{"description":"Development Phase 1","name":"Development Phase 1","value":"1"},{"description":"Development Phase 2","name":"Development Phase 2","value":"2"},{"description":"Development Phase 3","name":"Development Phase 3","value":"3"}],"properties":{"structurizr.dsl.identifier":"externalapp"},"tags":"Element,Software System,External System,Multiple Apps,P1"}]},"name":"MSI Control Tower","properties":{"structurizr.dsl":"Ly8gU3RydWN0cml6ciBEU0wgZm9yIFNvbHV0aW9ucyBBcmNoaXRlY3R1cmUKCndvcmtzcGFjZSA9IHdvcmtzcGFjZSAiTVNJIENvbnRyb2wgVG93ZXIiIHsKIWRvY3MgZG9jcy9vbW5pYnVzCgptb2RlbCB7CiAgICBvd25lclVzZXIgPSBwZXJzb24gIk93bmVyIFVzZXIiICJSZXByZXNlbnRzIHRoZSBvd25lciBvZiBhIGNvbnN0cnVjdGlvbiBwcm9qZWN0IiB7CiAgICAgIHRhZ3MgIkN1c3RvbWVyIFVzZXIiLCAiUDEiCiAgICAgIHBlcnNwZWN0aXZlcyB7CiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDEiICJEZXZlbG9wbWVudCBQaGFzZSAxIiAxCiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDIiICJEZXZlbG9wbWVudCBQaGFzZSAyIiAyCiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDMiICJEZXZlbG9wbWVudCBQaGFzZSAzIiAzCiAgICAgIH0KICAgIH0KICAgIHByb2plY3RBZG1pbiA9IHBlcnNvbiAiUHJvamVjdCBBZG1pbiBVc2VyIiAiTWFuYWdlcyBwcm9qZWN0LWxldmVsIGNvbmZpZ3VyYXRpb24gYW5kIGFjY2VzcyIgewogICAgICB0YWdzICJJbnRlcm5hbCBvciBFeHRlcm5hbCBVc2VyIiwgIlAxIgogICAgICBwZXJzcGVjdGl2ZXMgewogICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAxIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMSIgMQogICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAyIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMiIgMgogICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAzIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgMwogICAgICB9CiAgICB9CiAgICBkYXRhU2NpZW50aXN0ID0gcGVyc29uICJNU0kgRGF0YSBTY2llbnRpc3QvQW5hbHlzdCIgIkFuYWx5emVzIGRhdGEgYW5kIGRldmVsb3BzIG1vZGVscyBhbmQgZ2VuZXJhdGVzIGFjdGlvbmFibGUgaW5zaWdodHMgZm9yIHRoZSBvd25lci4iIHsKICAgICAgdGFncyAiSW50ZXJuYWwgVXNlciIsICJQMiIKICAgICAgcGVyc3BlY3RpdmVzIHsKICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMiIgIkRldmVsb3BtZW50IFBoYXNlIDIiIDIKICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgIkRldmVsb3BtZW50IFBoYXNlIDMiIDMKICAgICAgfQogICAgfQogICAgb3BBZG1pbiA9IHBlcnNvbiAiT3BlcmF0aW9uYWwgQWRtaW5pc3RyYXRvciIgIk1hbmFnZXMgZGF0YSBmbG93cywgaW50ZWdyYXRpb25zLCBhbmQgZW5zdXJlcyBkYXRhIHF1YWxpdHkgYW5kIGludGVncml0eS4iIHsKICAgICAgdGFncyAiSW50ZXJuYWwgVXNlciIsICJQMiIKICAgICAgcGVyc3BlY3RpdmVzIHsKICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMiIgIkRldmVsb3BtZW50IFBoYXNlIDIiIDIKICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgIkRldmVsb3BtZW50IFBoYXNlIDMiIDMKICAgICAgfQogICAgfQogICAgc3lzQWRtaW4gPSBwZXJzb24gIlN5c3RlbSBBZG1pbmlzdHJhdG9yIiAiTWFuYWdlcyBzeXN0ZW0gYWNjZXNzLCBzZWN1cml0eSwgYmFja3VwcywgYW5kIG92ZXJhbGwgc3lzdGVtIGhlYWx0aC4iIHsKICAgICAgdGFncyAiSW50ZXJuYWwgVXNlciIsICJQMSIKICAgICAgcGVyc3BlY3RpdmVzIHsKICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMSIgIkRldmVsb3BtZW50IFBoYXNlIDEiIDEKICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMiIgIkRldmVsb3BtZW50IFBoYXNlIDIiIDIKICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgIkRldmVsb3BtZW50IFBoYXNlIDMiIDMKICAgICAgfQogICAgfQoKICAgIHNvZnR3YXJlU3lzdGVtID0gc29mdHdhcmVTeXN0ZW0gIk1TSSBDb250cm9sIFRvd2VyIEFwcGxpY2F0aW9uIiB7CiAgICAgIGRlc2NyaXB0aW9uICJQcm92aWRlcyBpbnNpZ2h0cyBhbmQgYW5hbHl0aWNzIGZvciBPd25lcnMgb2YgY29uc3RydWN0aW9uIHByb2plY3RzIGFzIHdlbGwgYXMgYSBtYW5hZ2VtZW50IGxheWVyIGZvciBQcm9qZWN0IEFkbWlucyIKICAgICAgdGFncyAiSW50ZXJuYWwgU3lzdGVtIiwgIlAxIgoKICAgICAgIyBUaGlzIHdvcmtzLCBidXQgY29tbWVudGVkIG91dCBmb3Igbm93LiBJdCB3aWxsIGltcG9ydCBhbGwgZG9jcyB3aXRoaW4gdGhlIGZvbGRlciBzcGVjaWZpZWQgYW5kIGRpc3BsYXkgdGhlbSBvbmUgYWZ0ZXIgdGhlIG90aGVyIGluIGFscGhhYmV0aWNhbCBvcmRlci4KICAgICAgIyFkb2NzIGRvY3Mvc29mdHdhcmVTeXN0ZW0tdGVzdAoKICAgICAgcGVyc3BlY3RpdmVzIHsKICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMSIgIkRldmVsb3BtZW50IFBoYXNlIDEiIDEKICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMiIgIkRldmVsb3BtZW50IFBoYXNlIDIiIDIKICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgIkRldmVsb3BtZW50IFBoYXNlIDMiIDMKICAgICAgfQoKICAgICAgZW5kVXNlckFwcCA9IGNvbnRhaW5lciAiRW5kLVVzZXIgQXBwbGljYXRpb24iIHsKICAgICAgdGFncyAiUDEiCiAgICAgIHBlcnNwZWN0aXZlcyB7CiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDEiICJEZXZlbG9wbWVudCBQaGFzZSAxIiAxCiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDIiICJEZXZlbG9wbWVudCBQaGFzZSAyIiAyCiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDMiICJEZXZlbG9wbWVudCBQaGFzZSAzIiAzCiAgICAgIH0KICAgICAgICAvLyBUaGVzZSBuZWVkIHdvcmsKICAgICAgICBkZXNjcmlwdGlvbiAiUHJvdmlkZXMgYSB3ZWItYmFzZWQgaW50ZXJmYWNlIGZvciBvd25lcnMgdG8gdmlldyBpbnNpZ2h0cyBhbmQgcHJvamVjdCBhZG1pbnMgdG8gY29uZmlndXJlIHVzZXJzIGFuZCBwcm9qZWN0cy4iCiAgICAgICAgY29tcG9uZW50ICJEYXNoYm9hcmQiICJEaXNwbGF5cyBpbnRlcmFjdGl2ZSBkYXNoYm9hcmRzIGFuZCB2aXN1YWxpemF0aW9ucyIKICAgICAgICBjb21wb25lbnQgIlJlcG9ydGluZyBFbmdpbmUiICJHZW5lcmF0ZXMgcmVwb3J0cyBvbiBkZW1hbmQiCiAgICAgICAgY29tcG9uZW50ICJBbGVydGluZyBTeXN0ZW0iICJEaXNwbGF5cyByZWFsLXRpbWUgYWxlcnRzIGFuZCBub3RpZmljYXRpb25zIgogICAgICAgIGNvbXBvbmVudCAiVXNlciBNYW5hZ2VtZW50IiAiTWFuYWdlcyB1c2VyIGFjY291bnRzIGFuZCBwZXJtaXNzaW9ucyIKICAgICAgICBjb21wb25lbnQgIkNJUCBWaWV3ZXIiICJQcm92aWRlcyBhY2Nlc3MgdG8gYW5kIG5hdmlnYXRpb24gb2YgdGhlIENJUCIgCiAgICAgICAgY29tcG9uZW50ICJUaGlyZC1QYXJ0eSBMaW5raW5nIiAiRW5hYmxlcyBpbnRlZ3JhdGlvbiBhbmQgU1NPIHRvIGF1dGhvcml6ZWQgdGhpcmQtcGFydHkgYXBwbGljYXRpb25zLiIgCiAgICAgIH0KCiAgICAgIGFwcERCID0gY29udGFpbmVyICJBcHBsaWNhdGlvbiBEYXRhYmFzZSIgewogICAgICAgIGRlc2NyaXB0aW9uICJTdG9yZXMgQ29udHJvbCBUb3dlciBhcHBsaWNhdGlvbiBkYXRhLCBzdGFuZGFyZGl6ZWQgYW5hbHl0aWNzLCBhbmQgY29uZmlndXJhdGlvbiBkYXRhLiIKICAgICAgICB0YWdzICJEYXRhYmFzZSIsICJQMSIKICAgICAgICBwZXJzcGVjdGl2ZXMgewogICAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDEiICJEZXZlbG9wbWVudCBQaGFzZSAxIiAxCiAgICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMiIgIkRldmVsb3BtZW50IFBoYXNlIDIiIDIKICAgICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAzIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgMwogICAgICAgIH0KICAgICAgfQoKICAgICAgYmFja0VuZEFwcCA9IGNvbnRhaW5lciAiQmFjay1FbmQgQXBwbGljYXRpb24iIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW50ZXJmYWNlcyB3aXRoIHRoZSBmcm9udC1lbmQsIGhhbmRsZXMgYmFja2dyb3VuZCB0YXNrcywgaW50ZWdyYXRpb25zLCBzZWN1cml0eSwgYW5kIGRhdGEgbWFuYWdlbWVudC4iCiAgICAgICAgdGFncyAiUDEiCiAgICAgICAgcGVyc3BlY3RpdmVzIHsKICAgICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAxIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMSIgMQogICAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDIiICJEZXZlbG9wbWVudCBQaGFzZSAyIiAyCiAgICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgIkRldmVsb3BtZW50IFBoYXNlIDMiIDMKICAgICAgICB9CgogICAgICAgIHNlcnZpY2VBcGkgPSBjb21wb25lbnQgIlNlcnZpY2UgQVBJIiB7CiAgICAgICAgICBkZXNjcmlwdGlvbiAiUHJvdmlkZXMgUkVTVGZ1bCBBUEkgZm9yIHRoZSBmcm9udC1lbmQgRW5kLVVzZXIgQXBwbGljYXRpb24iCiAgICAgICAgICB0YWdzICJQMSIKICAgICAgICAgIHBlcnNwZWN0aXZlcyB7CiAgICAgICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAxIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMSIgMQogICAgICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMiIgIkRldmVsb3BtZW50IFBoYXNlIDIiIDIKICAgICAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDMiICJEZXZlbG9wbWVudCBQaGFzZSAzIiAzCiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZFByb3ZpZGVyID0gY29tcG9uZW50ICJJZGVudGl0eSBQcm92aWRlciIgewogICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZXMgdXNlciBhdXRoZW50aWNhdGlvbiBhbmQgYXV0aG9yaXphdGlvbiIKICAgICAgICAgIHRhZ3MgIlAxIgogICAgICAgICAgcGVyc3BlY3RpdmVzIHsKICAgICAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDEiICJEZXZlbG9wbWVudCBQaGFzZSAxIiAxCiAgICAgICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAyIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMiIgMgogICAgICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgIkRldmVsb3BtZW50IFBoYXNlIDMiIDMKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHRoaXJkUGFydHlQcm94eSA9IGNvbXBvbmVudCAiVGhpcmQtUGFydHkgQXBwbGljYXRpb24gUHJveHkiIHsKICAgICAgICAgIGRlc2NyaXB0aW9uICJNYW5hZ2VzIHNlY3VyZSBhY2Nlc3MgdG8gdGhpcmQtcGFydHkgYXBwbGljYXRpb25zIgogICAgICAgICAgdGFncyAiUDEiCiAgICAgICAgICBwZXJzcGVjdGl2ZXMgewogICAgICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMSIgIkRldmVsb3BtZW50IFBoYXNlIDEiIDEKICAgICAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDIiICJEZXZlbG9wbWVudCBQaGFzZSAyIiAyCiAgICAgICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAzIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgMwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgc3lzTW9uaXRvcmluZyA9IGNvbXBvbmVudCAiU3lzdGVtIE1vbml0b3JpbmcgU2VydmljZSIgewogICAgICAgICAgZGVzY3JpcHRpb24gIk1vbml0b3JzIHN5c3RlbSBoZWFsdGggYW5kIHBlcmZvcm1hbmNlIgogICAgICAgICAgdGFncyAiUDIiCiAgICAgICAgICAgIHBlcnNwZWN0aXZlcyB7CiAgICAgICAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDMiICJEZXZlbG9wbWVudCBQaGFzZSAzIiAzCiAgICAgICAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDIiICJEZXZlbG9wbWVudCBQaGFzZSAyIiAyCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGJhY2t1cFJlc3RvcmUgPSBjb21wb25lbnQgIkJhY2t1cCAmIFJlc3RvcmUgU2VydmljZSIgewogICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZXMgYmFja3VwcyBhbmQgZGF0YSByZXN0b3JhdGlvbiBmb3IgZGF0YWJhc2VzIGFuZCBmaWxlIHN5c3RlbXMiCiAgICAgICAgICB0YWdzICJQMSIKICAgICAgICAgIHBlcnNwZWN0aXZlcyB7CiAgICAgICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAxIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMSIgMQogICAgICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMiIgIkRldmVsb3BtZW50IFBoYXNlIDIiIDIKICAgICAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDMiICJEZXZlbG9wbWVudCBQaGFzZSAzIiAzCiAgICAgICAgICB9CiAgICAgICAgfSAKCiAgICAgICAgY3JlZGVudGlhbFN0b3JlID0gY29tcG9uZW50ICJDcmVkZW50aWFsIFN0b3JlIiB7CiAgICAgICAgICBkZXNjcmlwdGlvbiAiU2VjdXJlbHkgc3RvcmVzIGNyZWRlbnRpYWxzIGZvciB0aGlyZC1wYXJ0eSBhcHBsaWNhdGlvbnMiCiAgICAgICAgICB0YWdzICJQMSIKICAgICAgICAgIHBlcnNwZWN0aXZlcyB7CiAgICAgICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAxIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMSIgMQogICAgICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMiIgIkRldmVsb3BtZW50IFBoYXNlIDIiIDIKICAgICAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDMiICJEZXZlbG9wbWVudCBQaGFzZSAzIiAzCiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBjb21wb25lbnQgIkhlYWx0aCBEYWVtb24iIHsKICAgICAgICAgIGRlc2NyaXB0aW9uICJNb25pdG9ycyB0aGUgbGl2ZWxpbmVzcywgcmVhZGluZXNzIGFuZCBwZXJmb3JtYW5jZSBvZiB0aGUgYmFjay1lbmQgY29tcG9uZW50cyIKICAgICAgICAgIHRhZ3MgIk1vbml0b3JpbmciLCAiRGFlbW9uIiwgIlAyIgogICAgICAgICAgcGVyc3BlY3RpdmVzIHsKICAgICAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDMiICJEZXZlbG9wbWVudCBQaGFzZSAzIiAzCiAgICAgICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAyIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMiIgMgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgd2lraVNlcnZpY2UgPSBjb250YWluZXIgIldpa2kgU2VydmljZSIgewogICAgICAgIHRhZ3MgIlAxIgogICAgICAgIGRlc2NyaXB0aW9uICJIb3N0cyBhbmQgbWFuYWdlcyB0aGUgQ29tcHJlaGVuc2l2ZSBJbXBsZW1lbnRhdGlvbiBQbGFuIChDSVApIgogICAgICAgIHBlcnNwZWN0aXZlcyB7CiAgICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMSIgIkRldmVsb3BtZW50IFBoYXNlIDEiIDEKICAgICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAyIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMiIgMgogICAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDMiICJEZXZlbG9wbWVudCBQaGFzZSAzIiAzCiAgICAgICAgfQogICAgICB9CgogICAgfSAKCiAgICBkYXRhUGxhdGZvcm0gPSBzb2Z0d2FyZVN5c3RlbSAiRGF0YSBQbGF0Zm9ybSIgewogICAgICB0YWdzICJJbnRlcm5hbCBTeXN0ZW0iLCAiUDIiCiAgICAgIHBlcnNwZWN0aXZlcyB7CiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDMiICJEZXZlbG9wbWVudCBQaGFzZSAzIiAzCiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDIiICJEZXZlbG9wbWVudCBQaGFzZSAyIiAyCiAgICAgIH0KICAgICAgZGVzY3JpcHRpb24gIkhvdXNlcyBpbmdlc3RlZCBjb25zdHJ1Y3Rpb24gcHJvamVjdCBkYXRhIGFuZCBwcm92aWRlcyBkYXRhIHByb2Nlc3NpbmcgYW5kIGFuYWx5c2lzIHRvb2xpbmcgYW5kIGNhcGFiaWxpdGllcyIKCiAgICAgIGRhdGFJbmdlc3Rpb24gPSBjb250YWluZXIgIkRhdGEgSW5nZXN0aW9uIiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluZ2VzdHMgZGF0YSBmcm9tIHZhcmlvdXMgY29uc3RydWN0aW9uIGFwcGxpY2F0aW9ucyBhbmQgZmlsZSBzeXN0ZW1zIgogICAgICAgIHRhZ3MgIlAyIgogICAgICAgIHBlcnNwZWN0aXZlcyB7CiAgICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgIkRldmVsb3BtZW50IFBoYXNlIDMiIDMKICAgICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAyIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMiIgMgogICAgICAgIH0KCiAgICAgICAgY29tcG9uZW50ICJEYXRhIEluZ2VzdCBUcmlnZ2VyIiAiVHJpZ2dlcnMgdGhlIGRhdGEgaW5nZXN0aW9uIHByb2Nlc3MiCiAgICAgICAgY29tcG9uZW50ICJBUEkgQ29ubmVjdG9yIiAiQ29ubmVjdHMgdG8gYW5kIGV4dHJhY3RzIGRhdGEgZnJvbSBzb3VyY2UgYXBwbGljYXRpb24gQVBJcyIKICAgICAgICBjb21wb25lbnQgIkZpbGUgSW5nZXN0b3IiICJSZWFkcyBhbmQgcHJvY2Vzc2VzIGRhdGEgZnJvbSBzb3VyY2UgYXBwbGljYXRpb24gZmlsZXMiCiAgICAgICAgY29tcG9uZW50ICJEYXRhIFZhbGlkYXRvciIgIlBlcmZvcm1zIGRhdGEgdmFsaWRhdGlvbiBhbmQgcXVhbGl0eSBjaGVja3MiCiAgICAgICAgY29tcG9uZW50ICJEYXRhIENsZWFuc2VyIiAiQ2xlYW5zIGFuZCBzdGFuZGFyZGl6ZXMgaW5nZXN0ZWQgZGF0YSIKICAgICAgICBjb21wb25lbnQgIkhlYWx0aCBEYWVtb24iIHsKICAgICAgICAgIGRlc2NyaXB0aW9uICJNb25pdG9ycyB0aGUgbGl2ZWxpbmVzcywgcmVhZGluZXNzIGFuZCBwZXJmb3JtYW5jZSBvZiB0aGUgZGF0YSBpbmdlc3Rpb24gcHJvY2VzcyIKICAgICAgICAgIHRhZ3MgIk1vbml0b3JpbmciLCAiRGFlbW9uIiwgIlAyIgogICAgICAgICAgcGVyc3BlY3RpdmVzIHsKICAgICAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDMiICJEZXZlbG9wbWVudCBQaGFzZSAzIiAzCiAgICAgICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAyIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMiIgMgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgZGF0YUxha2UgPSBjb250YWluZXIgIkRhdGEgTGFrZSIgewogICAgICAgIGRlc2NyaXB0aW9uICJDZW50cmFsIHJlcG9zaXRvcnkgZm9yIHJhdyBhbmQgcHJvY2Vzc2VkIGNvbnN0cnVjdGlvbiBkYXRhIgogICAgICAgIGNvbXBvbmVudCAiUmF3IERhdGEgU3RvcmFnZSIgIlN0b3JlcyBpbmdlc3RlZCBkYXRhIGluIGl0cyBvcmlnaW5hbCBmb3JtYXQiCiAgICAgICAgY29tcG9uZW50ICJQcm9jZXNzZWQgRGF0YSBTdG9yYWdlIiAiU3RvcmVzIHRyYW5zZm9ybWVkIGFuZCBlbnJpY2hlZCBkYXRhIgogICAgICAgIGNvbXBvbmVudCAiSGVhbHRoIERhZW1vbiIgewogICAgICAgICAgZGVzY3JpcHRpb24gIk1vbml0b3JzIHRoZSBsaXZlbGluZXNzLCByZWFkaW5lc3MgYW5kIHBlcmZvcm1hbmNlIG9mIHRoZSBkYXRhIGxha2UiCiAgICAgICAgICB0YWdzICJNb25pdG9yaW5nIiwgIkRhZW1vbiIsICJQMiIKICAgICAgICAgIHBlcnNwZWN0aXZlcyB7CiAgICAgICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAzIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgMwogICAgICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMiIgIkRldmVsb3BtZW50IFBoYXNlIDIiIDIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGFncyAiRGF0YWJhc2UiLCAiUDIiCiAgICAgICAgcGVyc3BlY3RpdmVzIHsKICAgICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAzIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgMwogICAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDIiICJEZXZlbG9wbWVudCBQaGFzZSAyIiAyCiAgICAgICAgfQogICAgICB9CgoKCiAgICAgIGRhdGFTY2llbmNlREIgPSBjb250YWluZXIgIkRhdGEgU2NpZW5jZSBEQiIgewogICAgICAgIGRlc2NyaXB0aW9uICJTdG9yZXMgcHJvY2Vzc2VkIGRhdGEgYW5kIG1vZGVsIG91dHB1dHMgZnJvbSB0aGUgRGF0YSBTY2llbmNlIFdvcmtiZW5jaCBhbmQgZGF0YSBwcm9jZXNzaW5nL2FuYWx5c2lzIGpvYnMiCiAgICAgICAgdGFncyAiRGF0YWJhc2UiLCAiUDIiCiAgICAgICAgcGVyc3BlY3RpdmVzIHsKICAgICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAzIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgMwogICAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDIiICJEZXZlbG9wbWVudCBQaGFzZSAyIiAyCiAgICAgICAgfQogICAgICAgIGNvbXBvbmVudCAiSGVhbHRoIERhZW1vbiIgewogICAgICAgICAgZGVzY3JpcHRpb24gIk1vbml0b3JzIHRoZSBsaXZlbGluZXNzLCByZWFkaW5lc3MgYW5kIHBlcmZvcm1hbmNlIG9mIHRoZSBkYXRhIHNjaWVuY2UgZGF0YWJhc2UiCiAgICAgICAgICB0YWdzICJNb25pdG9yaW5nIiwgIkRhZW1vbiIsICJQMiIKICAgICAgICAgIHBlcnNwZWN0aXZlcyB7CiAgICAgICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAzIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgMwogICAgICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMiIgIkRldmVsb3BtZW50IFBoYXNlIDIiIDIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCgoKICAgICAgZGF0YVNjaWVuY2VXb3JrYmVuY2ggPSBjb250YWluZXIgIkRhdGEgU2NpZW5jZSBXb3JrYmVuY2giIHsKICAgICAgICBkZXNjcmlwdGlvbiAiUHJvdmlkZXMgYW4gZW52aXJvbm1lbnQgZm9yIGRhdGEgc2NpZW50aXN0cyB0byBhbmFseXplIGRhdGEgYW5kIGRldmVsb3AgTUwgbW9kZWxzIgogICAgICAgIHRhZ3MgIlAyIgogICAgICAgIHBlcnNwZWN0aXZlcyB7CiAgICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgIkRldmVsb3BtZW50IFBoYXNlIDMiIDMKICAgICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAyIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMiIgMgogICAgICAgIH0KICAgICAgICBjb21wb25lbnQgIk5vdGVib29rIEVudmlyb25tZW50IiAiUHJvdmlkZXMgaW50ZXJhY3RpdmUgbm90ZWJvb2tzIGZvciBkYXRhIGV4cGxvcmF0aW9uIGFuZCBhbmFseXNpcyIKICAgICAgICBjb21wb25lbnQgIk1vZGVsIFRyYWluaW5nIEVuZ2luZSIgIlRyYWlucyBhbmQgZXZhbHVhdGVzIG1hY2hpbmUgbGVhcm5pbmcgbW9kZWxzIgogICAgICAgIGNvbXBvbmVudCAiTW9kZWwgUmVnaXN0cnkiICJTdG9yZXMgYW5kIG1hbmFnZXMgdHJhaW5lZCBtYWNoaW5lIGxlYXJuaW5nIG1vZGVscyIKICAgICAgICB2aXN1YWxpc2F0aW9uVG9vbHMgPSBjb21wb25lbnQgIlZpc3VhbGl6YXRpb24gVG9vbHMiICJQcm92aWRlcyB0b29scyBhbmQgZGFzaGJvYXJkcyBmb3IgdmlzdWFsaXppbmcgZGF0YSBhbmQgbW9kZWwgb3V0cHV0cyIKICAgICAgICBjb21wb25lbnQgIkhlYWx0aCBEYWVtb24iIHsKICAgICAgICAgIGRlc2NyaXB0aW9uICJNb25pdG9ycyB0aGUgbGl2ZWxpbmVzcywgcmVhZGluZXNzIGFuZCBwZXJmb3JtYW5jZSBvZiB0aGUgZGF0YSBzY2llbmNlIHdvcmtiZW5jaCIKICAgICAgICAgIHRhZ3MgIk1vbml0b3JpbmciLCAiRGFlbW9uIiwgIlAyIgogICAgICAgICAgcGVyc3BlY3RpdmVzIHsKICAgICAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDMiICJEZXZlbG9wbWVudCBQaGFzZSAzIiAzCiAgICAgICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAyIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMiIgMgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgIyBkYXRhVHJhbnNmb3JtYXRpb25QaXBlbGluZSA9IGNvbnRhaW5lciAiRGF0YSBUcmFuc2Zvcm1hdGlvbiBQaXBlbGluZSIgeyAKICAgICAgIyAgIGRlc2NyaXB0aW9uICJUcmFuc2Zvcm1zIGFuZCBlbnJpY2hlcyByYXcgZGF0YSBmcm9tIHRoZSBEYXRhIExha2UgYW5kIGRlbGl2ZXJzIGl0IHRvIHRoZSBDb250cm9sIFRvd2VyIEFwcGxpY2F0aW9uIgogICAgICAjICAgY29tcG9uZW50ICJEYXRhIEV4dHJhY3RvciIgIkV4dHJhY3RzIGRhdGEgZnJvbSB0aGUgRGF0YSBMYWtlIiAKICAgICAgIyAgIGNvbXBvbmVudCAiRGF0YSBUcmFuc2Zvcm1lciIgIkFwcGxpZXMgdHJhbnNmb3JtYXRpb25zIGFuZCBidXNpbmVzcyBydWxlcyIgCiAgICAgICMgICBjb21wb25lbnQgIkRhdGEgTG9hZGVyIiAiTG9hZHMgdHJhbnNmb3JtZWQgZGF0YSBpbnRvIHRoZSBBcHBsaWNhdGlvbiBEYXRhYmFzZSIKICAgICAgIyB9CiAgICAgIAogICAgICBtbG9wcyA9IGNvbnRhaW5lciAiTUxPcHMvRGF0YSBQaXBlbGluZXMiIHsKICAgICAgICB0YWdzICJQaXBlbGluZSIsICJQMyIKICAgICAgICBwZXJzcGVjdGl2ZXMgewogICAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDMiICJEZXZlbG9wbWVudCBQaGFzZSAzIiAzCiAgICAgICAgfQoKICAgICAgICBkZXNjcmlwdGlvbiAiUHJvY2Vzc2VzIG5ld2x5IGluZ2VzdGVkIGRhdGEsIG1hbmFnZXMgZGF0YSBwaXBlbGluZXMgYW5kIGludGVncmF0aW9ucywgYXMgd2VsbCBhcyBtb25pdG9yaW5nIGFuZCBhbGVydGluZyBjYXBhYmlsaXRpZXMiCiAgICAgICAgCiAgICAgICAgbW9uaXRvcmluZ0FuYWx5c2lzSm9iID0gY29tcG9uZW50ICJNb25pdG9yaW5nIEFuYWx5c2lzIEpvYiIgewogICAgICAgICAgZGVzY3JpcHRpb24gIkJhc2VkIG9uIGRlZmluZWQgcnVsZXMsIHJ1bnMgbW9uaXRvcmluZyBhbmFseXNpcyBhbmQgdHJpZ2dlcnMgYWxlcnRzIgogICAgICAgICAgdGFncyAiUDMiCiAgICAgICAgICBwZXJzcGVjdGl2ZXMgewogICAgICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgIkRldmVsb3BtZW50IFBoYXNlIDMiIDMKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGRhdGFTY2llbmNlSm9iUXVldWUgPSBjb21wb25lbnQgIkRhdGEgU2NpZW5jZSBKb2IgUHJvY2Vzc29yIiB7CiAgICAgICAgICBkZXNjcmlwdGlvbiAiTWFuYWdlcyBhbmQgcHJvY2Vzc2VzIGRhdGEgc2NpZW5jZSBqb2JzIgogICAgICAgICAgdGFncyAiUDMiCiAgICAgICAgICBwZXJzcGVjdGl2ZXMgewogICAgICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgIkRldmVsb3BtZW50IFBoYXNlIDMiIDMKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGRhdGFNb3ZlbWVudEpvYlF1ZXVlID0gY29tcG9uZW50ICJEYXRhIE1vdmVtZW50IEpvYiBQcm9jZXNzb3IiIHsKICAgICAgICAgIGRlc2NyaXB0aW9uICJNYW5hZ2VzIGpvYnMgZm9yIG1vdmluZyBkYXRhIGJldHdlZW4gZGF0YWJhc2VzIgogICAgICAgICAgdGFncyAiUDMiCiAgICAgICAgICBwZXJzcGVjdGl2ZXMgewogICAgICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgIkRldmVsb3BtZW50IFBoYXNlIDMiIDMKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGNvbXBvbmVudCAiSGVhbHRoIERhZW1vbiIgewogICAgICAgICAgZGVzY3JpcHRpb24gIk1vbml0b3JzIHRoZSBsaXZlbGluZXNzLCByZWFkaW5lc3MgYW5kIHBlcmZvcm1hbmNlIG9mIHRoZSBNTE9wcyBjb21wb25lbnRzIgogICAgICAgICAgdGFncyAiTW9uaXRvcmluZyIsICJEYWVtb24iLCAiUDMiCiAgICAgICAgICBwZXJzcGVjdGl2ZXMgewogICAgICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgIkRldmVsb3BtZW50IFBoYXNlIDMiIDMKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHBlcmZvcm1hbmNlTW9uaXRvciA9IGNvbnRhaW5lciAiUGVyZm9ybWFuY2UgTW9uaXRvciIgewogICAgICAgIGRlc2NyaXB0aW9uICJNb25pdG9ycyB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGRhdGEgcGxhdGZvcm0gYW5kIGl0cyBjb21wb25lbnRzIHRocm91Z2ggSGVhbHRoIERhZW1vbnMiCiAgICAgICAgdGFncyAiTW9uaXRvcmluZyIsICJQMiIKICAgICAgICBwZXJzcGVjdGl2ZXMgewogICAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDMiICJEZXZlbG9wbWVudCBQaGFzZSAzIiAzCiAgICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMiIgIkRldmVsb3BtZW50IFBoYXNlIDIiIDIKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBkYXRhU291cmNlcyA9IHNvZnR3YXJlU3lzdGVtICJFeHRlcm5hbCBEYXRhIFNvdXJjZXMiIHsKICAgICAgdGFncyAiRXh0ZXJuYWwgU3lzdGVtIiwgIlAyIgogICAgICBwZXJzcGVjdGl2ZXMgewogICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAzIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgMwogICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAyIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMiIgMgogICAgICB9CiAgICAgIGRhdGFUeXBlcyA9IGNvbnRhaW5lciAiRGF0YSBUeXBlcyIgewogICAgICAgIHNvdXJjZUFQSXMgPSBjb21wb25lbnQgIlNvdXJjZSBBcHBsaWNhdGlvbiBBUElzIiB7CiAgICAgICAgICBkZXNjcmlwdGlvbiAiRXh0ZXJuYWwgQVBJcyBvZiBzb3VyY2UgYXBwbGljYXRpb25zIChlLmcuLCBQNiwgTm9ydGhzcHlyZSwgVG91Y2hwbGFuLCBSZXZpdCwgZFJvZnVzKSIKICAgICAgICB9CgogICAgICAgIHNvdXJjZUZpbGVzID0gY29tcG9uZW50ICJTb3VyY2UgQXBwbGljYXRpb24gRmlsZSBTeXN0ZW1zIiB7CiAgICAgICAgICBkZXNjcmlwdGlvbiAiRXh0ZXJuYWwgZmlsZSBzeXN0ZW1zIG9mIHNvdXJjZSBhcHBsaWNhdGlvbnMiCiAgICAgICAgfQogICAgICB9CiAgICB9CgogIGV4dGVybmFsQXBwID0gc29mdHdhcmVTeXN0ZW0gIlRoaXJkIFBhcnR5IEFwcHMiICJBcHBsaWNhdGlvbnMgdGhhdCB0aGUgT3duZXIgVXNlciBtYXkgYWxzbyBoYXZlIGNyZWRlbnRpYWxzIGZvci4iIHsKICAgICAgdGFncyAiRXh0ZXJuYWwgU3lzdGVtIiwgIk11bHRpcGxlIEFwcHMiLCAiUDEiCiAgICAgIHBlcnNwZWN0aXZlcyB7CiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDEiICJEZXZlbG9wbWVudCBQaGFzZSAxIiAxCiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDIiICJEZXZlbG9wbWVudCBQaGFzZSAyIiAyCiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDMiICJEZXZlbG9wbWVudCBQaGFzZSAzIiAzCiAgICAgIH0KICAgIH0KCiAgICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIC8vICoqKioqKioqKioqKioqKiBSZWxhdGlvbnNoaXBzIGJldHdlZW4gUGVvcGxlIGFuZCBDb250YWluZXJzCiAgICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIG93bmVyVXNlciAtPiBlbmRVc2VyQXBwICJWaWV3cyBpbnNpZ2h0cyBhbmQgZGFzaGJvYXJkcyB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uIiB7CiAgICAgIHBlcnNwZWN0aXZlcyB7CiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDEiICJEZXZlbG9wbWVudCBQaGFzZSAxIiAxCiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDIiICJEZXZlbG9wbWVudCBQaGFzZSAyIiAyCiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDMiICJEZXZlbG9wbWVudCBQaGFzZSAzIiAzCiAgICAgIH0KICAgIH0KICAgIHByb2plY3RBZG1pbiAtPiBlbmRVc2VyQXBwICJNYW5hZ2VzIHVzZXJzIGFuZCBjb25maWd1cmVzIHByb2plY3RzIiB7CiAgICAgIHBlcnNwZWN0aXZlcyB7CiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDEiICJEZXZlbG9wbWVudCBQaGFzZSAxIiAxCiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDIiICJEZXZlbG9wbWVudCBQaGFzZSAyIiAyCiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDMiICJEZXZlbG9wbWVudCBQaGFzZSAzIiAzCiAgICAgIH0KICAgIH0KICAgIHN5c0FkbWluIC0+IGJhY2t1cFJlc3RvcmUgIkluaXRpYXRlcyBhbmQgbW9uaXRvcnMgYmFja3VwcyIgewogICAgICBwZXJzcGVjdGl2ZXMgewogICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAxIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMSIgMQogICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAyIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMiIgMgogICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAzIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgMwogICAgICB9CiAgICB9CiAgICBzeXNBZG1pbiAtPiBzeXNNb25pdG9yaW5nICJNb25pdG9ycyBzeXN0ZW0gaGVhbHRoIGFuZCBwZXJmb3JtYW5jZSIgewogICAgICBwZXJzcGVjdGl2ZXMgewogICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAyIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMiIgMgogICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAzIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgMwogICAgICB9CiAgICB9CiAgICBvcEFkbWluIC0+IGRhdGFQbGF0Zm9ybSAiTWFuYWdlcyBkYXRhIHBpcGVsaW5lcyBhbmQgaW50ZWdyYXRpb25zIiB7CiAgICAgIHBlcnNwZWN0aXZlcyB7CiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDIiICJEZXZlbG9wbWVudCBQaGFzZSAyIiAyCiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDMiICJEZXZlbG9wbWVudCBQaGFzZSAzIiAzCiAgICAgIH0KICAgIH0KICAgIG9wQWRtaW4gLT4gZGF0YUluZ2VzdGlvbiAiQ29uZmlndXJlcyBkYXRhIGluZ2VzdGlvbiIgewogICAgICBwZXJzcGVjdGl2ZXMgewogICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAyIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMiIgMgogICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAzIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgMwogICAgICB9CiAgICB9CiAgICBzeXNBZG1pbiAtPiBkYXRhUGxhdGZvcm0gIkFkbWluaXN0ZXJzIiB7CiAgICAgIHBlcnNwZWN0aXZlcyB7CiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDIiICJEZXZlbG9wbWVudCBQaGFzZSAyIiAyCiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDMiICJEZXZlbG9wbWVudCBQaGFzZSAzIiAzCiAgICAgIH0KICAgIH0KICAgIGRhdGFTY2llbnRpc3QgLT4gZGF0YVNjaWVuY2VXb3JrYmVuY2ggIlVzZXMgZm9yIGRhdGEgYW5hbHlzaXMgYW5kIG1vZGVsaW5nIiB7CiAgICAgIHBlcnNwZWN0aXZlcyB7CiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDIiICJEZXZlbG9wbWVudCBQaGFzZSAyIiAyCiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDMiICJEZXZlbG9wbWVudCBQaGFzZSAzIiAzCiAgICAgIH0KICAgIH0KCiAgICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIC8vICoqKioqKioqKioqKioqKiBSZWxhdGlvbnNoaXBzIHdpdGhpbiBEYXRhIFBsYXRmb3JtCiAgICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIGRhdGFJbmdlc3Rpb24gLT4gZGF0YUxha2UgIkxvYWRzIHJhdyBkYXRhIGludG8iIHsKICAgICAgcGVyc3BlY3RpdmVzIHsKICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMiIgIkRldmVsb3BtZW50IFBoYXNlIDIiIDIKICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgIkRldmVsb3BtZW50IFBoYXNlIDMiIDMKICAgICAgfQogICAgfQogICAgIyBkYXRhU2NpZW5jZURCIC0+IG1sb3BzICJEYXRhIGNvcGllZCBmcm9tIERhdGEgU2NpZW5jZSBEQiBpcyBhbmFseXplZCBhZ2FpbnN0IG1vbml0b3JpbmcgcnVsZXMiCiAgICBkYXRhU2NpZW5jZVdvcmtiZW5jaCAtPiBkYXRhTGFrZSAiUmVhZHMgZGF0YSBmcm9tIiB7CiAgICAgIHBlcnNwZWN0aXZlcyB7CiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDIiICJEZXZlbG9wbWVudCBQaGFzZSAyIiAyCiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDMiICJEZXZlbG9wbWVudCBQaGFzZSAzIiAzCiAgICAgIH0KICAgIH0KICAgIGRhdGFTY2llbmNlV29ya2JlbmNoIC0+IGRhdGFTY2llbmNlREIgIldyaXRlcyBkYXRhIHRvIiB7CiAgICAgIHBlcnNwZWN0aXZlcyB7CiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDIiICJEZXZlbG9wbWVudCBQaGFzZSAyIiAyCiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDMiICJEZXZlbG9wbWVudCBQaGFzZSAzIiAzCiAgICAgIH0KICAgIH0KICAgICMgZGF0YUxha2UgLT4gZGF0YVRyYW5zZm9ybWF0aW9uUGlwZWxpbmUgIlByb3ZpZGVzIHJhdyBkYXRhIHRvIgogICAgIyBkYXRhVHJhbnNmb3JtYXRpb25QaXBlbGluZSAtPiBzb2Z0d2FyZVN5c3RlbSAiRGVsaXZlcnMgdHJhbnNmb3JtZWQgZGF0YSB0byIKICAgICMgIkRhdGEgRXh0cmFjdG9yIiAtPiAiRGF0YSBUcmFuc2Zvcm1hdGlvbiBTZXJ2aWNlIiAiU2VuZHMgZXh0cmFjdGVkIGRhdGEgdG8iCiAgICAjICJEYXRhIFRyYW5zZm9ybWF0aW9uIFNlcnZpY2UiIC0+ICJEYXRhIExvYWRlciIgIlNlbmRzIHRyYW5zZm9ybWVkIGRhdGEgdG8iCiAgICBtbG9wcyAtPiBzb2Z0d2FyZVN5c3RlbSAiV3JpdGVzIHRoZSBsYXRlc3QgYW5hbHlzaXMgZGF0YSBhbmQgb3V0cHV0cyB0byIgewogICAgICBwZXJzcGVjdGl2ZXMgewogICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAzIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgMwogICAgICB9CiAgICB9CiAgICBkYXRhU2NpZW5jZVdvcmtiZW5jaCAtPiBtbG9wcyAiRGVmaW5lcyBhbmFseXNlcywgbW9kZWxzIGFuZCBtb25pdG9yaW5nIHJ1bGVzIHVzZWQgaW4iIHsKICAgICAgcGVyc3BlY3RpdmVzIHsKICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgIkRldmVsb3BtZW50IFBoYXNlIDMiIDMKICAgICAgfQogICAgfQoKICAgIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgLy8gKioqKioqKioqKioqKioqIE1MIE9wcyBSZWxhdGlvbnNoaXBzCiAgICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIAogICAgZGF0YVNjaWVuY2VXb3JrYmVuY2ggLT4gbW9uaXRvcmluZ0FuYWx5c2lzSm9iICJEYXRhIFNjaWVudGlzdHMgZGVmaW5lIG1vbml0b3JpbmcgcnVsZXMgaW4iIHsKICAgICAgcGVyc3BlY3RpdmVzIHsKICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgIkRldmVsb3BtZW50IFBoYXNlIDMiIDMKICAgICAgfQogICAgfQogICAgZGF0YVNjaWVuY2VXb3JrYmVuY2ggLT4gZGF0YVNjaWVuY2VKb2JRdWV1ZSAiRGF0YSBTY2llbnRpc3RzIGRlZmluZSBhbmFseXNlcyBpbiIgewogICAgICBwZXJzcGVjdGl2ZXMgewogICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAzIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgMwogICAgICB9CiAgICB9CiAgICAjIG1vbml0b3JpbmdSdWxlcyAtPiBtb25pdG9yaW5nQW5hbHlzaXNKb2IgIlRyaWdnZXJzIGFsZXJ0cyBiYXNlZCBvbiBkZWZpbmVkIHJ1bGVzIgogICAgbW9uaXRvcmluZ0FuYWx5c2lzSm9iIC0+IGRhdGFMYWtlICJSZWFkcyBuZXcgZGF0YSBmcm9tIiB7CiAgICAgIHBlcnNwZWN0aXZlcyB7CiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDMiICJEZXZlbG9wbWVudCBQaGFzZSAzIiAzCiAgICAgIH0KICAgIH0KICAgIG1vbml0b3JpbmdBbmFseXNpc0pvYiAtPiBzZXJ2aWNlQXBpICJBbGVydHMgYXJlIHNlbnQgdG8iIHsKICAgICAgcGVyc3BlY3RpdmVzIHsKICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgIkRldmVsb3BtZW50IFBoYXNlIDMiIDMKICAgICAgfQogICAgfQogICAgZGF0YU1vdmVtZW50Sm9iUXVldWUgLT4gYXBwREIgIkNvcGllcyBhbmFseXNpcyBvdXRwdXQgZGF0YSB0byIgewogICAgICBwZXJzcGVjdGl2ZXMgewogICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAzIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgMwogICAgICB9CiAgICB9CgogICAgZGF0YVNjaWVuY2VKb2JRdWV1ZSAtPiBkYXRhTGFrZSAiUmVhZHMgbmV3IGRhdGEgZnJvbSIgewogICAgICBwZXJzcGVjdGl2ZXMgewogICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAzIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgMwogICAgICB9CiAgICB9CiAgICBkYXRhU2NpZW5jZUpvYlF1ZXVlIC0+IGRhdGFTY2llbmNlREIgIldyaXRlcyBvdXRwdXQgdG8iIHsKICAgICAgcGVyc3BlY3RpdmVzIHsKICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgIkRldmVsb3BtZW50IFBoYXNlIDMiIDMKICAgICAgfQogICAgfQogICAgZGF0YVNjaWVuY2VKb2JRdWV1ZSAtPiBkYXRhTW92ZW1lbnRKb2JRdWV1ZSAiQW5hbHlzaXMgQ29tcGxldGUgdHJpZ2dlciIgewogICAgICBwZXJzcGVjdGl2ZXMgewogICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAzIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgMwogICAgICB9CiAgICB9CiAgICBkYXRhTW92ZW1lbnRKb2JRdWV1ZSAtPiBkYXRhU2NpZW5jZURCICJSZWFkcyBkYXRhIGZyb20iIHsKICAgICAgcGVyc3BlY3RpdmVzIHsKICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgIkRldmVsb3BtZW50IFBoYXNlIDMiIDMKICAgICAgfQogICAgfQoKICAgIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgLy8gKioqKioqKioqKioqKioqIFJlbGF0aW9uc2hpcHMgd2l0aGluIE1TSSBDb250cm9sIFRvd2VyIEFwcGxpY2F0aW9uCiAgICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIGJhY2tFbmRBcHAgLT4gYXBwREIgIlJlYWRzIGFwcGxpY2F0aW9uIGRhdGEgYW5kIGFuYWx5dGljcyBmcm9tLiBXcml0ZXMgYXBwbGljYXRpb24gZGF0YSB0by4iIHsKICAgICAgcGVyc3BlY3RpdmVzIHsKICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMSIgIkRldmVsb3BtZW50IFBoYXNlIDEiIDEKICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMiIgIkRldmVsb3BtZW50IFBoYXNlIDIiIDIKICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgIkRldmVsb3BtZW50IFBoYXNlIDMiIDMKICAgICAgfQogICAgfQogICAgZW5kVXNlckFwcCAtPiB3aWtpU2VydmljZSAiRmV0Y2hlcyBDSVAgY29udGVudCIgewogICAgICBwZXJzcGVjdGl2ZXMgewogICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAxIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMSIgMQogICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAyIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMiIgMgogICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAzIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgMwogICAgICB9CiAgICB9CiAgICB3aWtpU2VydmljZSAtPiBhcHBEQiAiV3JpdGVzIENJUCBjb250ZW50IiB7CiAgICAgIHBlcnNwZWN0aXZlcyB7CiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDEiICJEZXZlbG9wbWVudCBQaGFzZSAxIiAxCiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDIiICJEZXZlbG9wbWVudCBQaGFzZSAyIiAyCiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDMiICJEZXZlbG9wbWVudCBQaGFzZSAzIiAzCiAgICAgIH0KICAgIH0KICAgIGVuZFVzZXJBcHAgLT4gdGhpcmRQYXJ0eVByb3h5ICJSZXF1ZXN0cyBhY2Nlc3MgdG8gdGhpcmQtcGFydHkgYXBwbGljYXRpb25zIiB7CiAgICAgIHBlcnNwZWN0aXZlcyB7CiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDEiICJEZXZlbG9wbWVudCBQaGFzZSAxIiAxCiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDIiICJEZXZlbG9wbWVudCBQaGFzZSAyIiAyCiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDMiICJEZXZlbG9wbWVudCBQaGFzZSAzIiAzCiAgICAgIH0KICAgIH0KICAgIGVuZFVzZXJBcHAgLT4gYmFja0VuZEFwcCAiUmVhZHMgYW5kIHdyaXRlcyBkYXRhIHZpYSBIVFRQIHJlcXVlc3RzIHRvIiB7CiAgICAgIHBlcnNwZWN0aXZlcyB7CiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDEiICJEZXZlbG9wbWVudCBQaGFzZSAxIiAxCiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDIiICJEZXZlbG9wbWVudCBQaGFzZSAyIiAyCiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDMiICJEZXZlbG9wbWVudCBQaGFzZSAzIiAzCiAgICAgIH0KICAgIH0KICAgIGVuZFVzZXJBcHAgLT4gaWRQcm92aWRlciAiQXV0aGVudGljYXRlcyB1c2VycyIgewogICAgICBwZXJzcGVjdGl2ZXMgewogICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAxIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMSIgMQogICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAyIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMiIgMgogICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAzIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgMwogICAgICB9CiAgICB9CiAgICB0aGlyZFBhcnR5UHJveHkgLT4gY3JlZGVudGlhbFN0b3JlICJSZXRyaWV2ZXMgY3JlZGVudGlhbHMgZnJvbSIgIHsKICAgICAgcGVyc3BlY3RpdmVzIHsKICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMSIgIkRldmVsb3BtZW50IFBoYXNlIDEiIDEKICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMiIgIkRldmVsb3BtZW50IFBoYXNlIDIiIDIKICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgIkRldmVsb3BtZW50IFBoYXNlIDMiIDMKICAgICAgfQogICAgfQogICAgZW5kVXNlckFwcCAtPiBzZXJ2aWNlQXBpICJTZW5kcyByZXF1ZXN0cyB0byIgewogICAgICBwZXJzcGVjdGl2ZXMgewogICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAxIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMSIgMQogICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAyIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMiIgMgogICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAzIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgMwogICAgICB9CiAgICB9CiAgICBzZXJ2aWNlQXBpIC0+IGFwcERCICJSZWFkcyBhbmQgd3JpdGVzIGRhdGEgZnJvbSIgewogICAgICBwZXJzcGVjdGl2ZXMgewogICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAxIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMSIgMQogICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAyIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMiIgMgogICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAzIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgMwogICAgICB9CiAgICB9CiAgICBwZXJmb3JtYW5jZU1vbml0b3IgLT4gc3lzTW9uaXRvcmluZyAiU2VuZHMgaGVhbHRoIGFuZCBwZXJmb3JtYW5jZSBkYXRhIHRvIiB7CiAgICAgIHBlcnNwZWN0aXZlcyB7CiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDIiICJEZXZlbG9wbWVudCBQaGFzZSAyIiAyCiAgICAgICAgIkRldmVsb3BtZW50IFBoYXNlIDMiICJEZXZlbG9wbWVudCBQaGFzZSAzIiAzCiAgICAgIH0KICAgIH0KCiAgICAvLyBSZWxhdGlvbnNoaXBzIGJldHdlZW4gRGF0YSBTb3VyY2VzIGFuZCBEYXRhIFBsYXRmb3JtCiAgICBkYXRhU291cmNlcyAtPiBkYXRhUGxhdGZvcm0gIlByb3ZpZGVzIGRhdGEgdG8iIHsKICAgICAgcGVyc3BlY3RpdmVzIHsKICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMiIgIkRldmVsb3BtZW50IFBoYXNlIDIiIDIKICAgICAgICAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgIkRldmVsb3BtZW50IFBoYXNlIDMiIDMKICAgICAgfQogICAgfQogICAgCiAgICAvLyBSZWxhdGlvbnNoaXBzIGZvciB0aGlyZC1wYXJ0eSBzeXN0ZW0gbGlua2luZyAKICAgIGVuZFVzZXJBcHAgLT4gZXh0ZXJuYWxBcHAgIlByb3ZpZGVzIGFjY2VzcyB0byIgewogICAgICBwZXJzcGVjdGl2ZXMgewogICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAxIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMSIgMQogICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAyIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMiIgMgogICAgICAgICJEZXZlbG9wbWVudCBQaGFzZSAzIiAiRGV2ZWxvcG1lbnQgUGhhc2UgMyIgMwogICAgICB9CiAgICB9CiAgfSAKICAKICB2aWV3cyB7CiAgICBzeXN0ZW1MYW5kc2NhcGUgIlN5c3RlbV9MYW5kc2NhcGUiIHsKICAgICAgaW5jbHVkZSAqCiAgICAgIGF1dG9sYXlvdXQKICAgIH0KICAgIAogICAgY29udGFpbmVyIHNvZnR3YXJlU3lzdGVtICJDb250cm9sX1Rvd2VyX0NvbnRhaW5lcnMiIHsKICAgICAgaW5jbHVkZSAqCiAgICAgIGF1dG9sYXlvdXQKICAgIH0KICAgIAogICAgY29udGFpbmVyIGRhdGFQbGF0Zm9ybSAiRGF0YV9QbGF0Zm9ybV9Db250YWluZXJzIiB7CiAgICAgIGluY2x1ZGUgKgogICAgICBhdXRvbGF5b3V0CiAgICB9CgogICAgY29tcG9uZW50IGJhY2tFbmRBcHAgIkJhY2tfRW5kX0NvbXBvbmVudHMiIHsKICAgICAgaW5jbHVkZSAqCiAgICAgIGF1dG9sYXlvdXQKICAgIH0KCiAgICBjb21wb25lbnQgbWxvcHMgIk1MT3BzX0NvbXBvbmVudHMiIHsKICAgICAgICBpbmNsdWRlICoKICAgICAgICBhdXRvbGF5b3V0CiAgICB9CgogICAgIyBzeXN0ZW1MYW5kc2NhcGUgIlN5c3RlbV9MYW5kc2NhcGVfUGhhc2VfMSIgewogICAgIyAgIGluY2x1ZGUgImVsZW1lbnQudGFnPT1QMSIKICAgICMgICBhdXRvbGF5b3V0CiAgICAjIH0KCiAgICAjIGNvbnRhaW5lciBzb2Z0d2FyZVN5c3RlbSAiQ29udHJvbF9Ub3dlcl9Db250YWluZXJzX1BoYXNlXzEiIHsKICAgICMgICBpbmNsdWRlICJlbGVtZW50LnRhZz09UDEiCiAgICAjICAgYXV0b2xheW91dAogICAgIyB9CiAgIAogICAgIyBjb21wb25lbnQgYmFja0VuZEFwcCAiQmFja19FbmRfQ29tcG9uZW50c19QaGFzZV8xIiB7CiAgICAjICAgaW5jbHVkZSAiZWxlbWVudC50YWc9PVAxIgogICAgIyAgIGF1dG9sYXlvdXQKICAgICMgfQoKICAgICMgZmlsdGVyZWQgU3lzdGVtX0xhbmRzY2FwZSBpbmNsdWRlICJFbGVtZW50LCBSZWxhdGlvbnNoaXAiICJTeXN0ZW1fTGFuZHNjYXBlX1dob2xlIiAKICAgICMgZmlsdGVyZWQgU3lzdGVtX0xhbmRzY2FwZSBpbmNsdWRlICJQMSIgIlN5c3RlbV9MYW5kc2NhcGVfUGhhc2VfMSIgCiAgICAKICAgIHN0eWxlcyB7CgogICAgICBlbGVtZW50ICJTb2Z0d2FyZSBTeXN0ZW0iIHsKICAgICAgICBiYWNrZ3JvdW5kICIjOTBDQUY5IgogICAgICAgIGNvbG9yICNmZmZmZmYKICAgICAgICBzaGFwZSBSb3VuZGVkQm94CiAgICAgIH0KCiAgICAgIGVsZW1lbnQgIkNvbnRhaW5lciIgewogICAgICAgIGJhY2tncm91bmQgIzExNjhiZAogICAgICAgIGNvbG9yICNmZmZmZmYKICAgICAgICBzaGFwZSBSb3VuZGVkQm94CiAgICAgIH0KICAgICAgZWxlbWVudCAiQ29tcG9uZW50IiB7CiAgICAgICAgYmFja2dyb3VuZCBkYXJrYmx1ZQogICAgICAgIGNvbG9yICNmZmZmZmYKICAgICAgICBzaGFwZSBSb3VuZGVkQm94CiAgICAgIH0KICAgICAgCiAgICAgIGVsZW1lbnQgIlBlcnNvbiIgewogICAgICAgIHNoYXBlIFBlcnNvbgogICAgICB9CgogICAgICBlbGVtZW50ICJEYXRhYmFzZSIgewogICAgICAgIGJhY2tncm91bmQgIzExNjhiZAogICAgICAgIGNvbG9yICNmZmZmZmYKICAgICAgICBzaGFwZSBjeWxpbmRlcgogICAgICB9CiAgICAgICMgZWxlbWVudCAiSW50ZXJuYWwgU3lzdGVtIiB7CgogICAgICAjIH0KICAgICAgZWxlbWVudCAiRXh0ZXJuYWwgU3lzdGVtIiB7CiAgICAgICAgYmFja2dyb3VuZCBncmV5CiAgICAgICAgY29sb3IgIiNmZmZmZmYiCiAgICAgIH0KICAgICAgZWxlbWVudCAiSW50ZXJuYWwgVXNlciIgewogICAgICAgIGJhY2tncm91bmQgIiM0Q0FGNTAiIAogICAgICAgIGNvbG9yICIjZmZmZmZmIgogICAgICB9CiAgICAgIGVsZW1lbnQgIkN1c3RvbWVyIFVzZXIiIHsKICAgICAgICBiYWNrZ3JvdW5kICIjRkZDMTA3IgogICAgICAgIGNvbG9yICIjMDAwMDAwIgogICAgICB9CiAgICAgIGVsZW1lbnQgIkludGVybmFsIG9yIEV4dGVybmFsIFVzZXIiIHsKICAgICAgICBiYWNrZ3JvdW5kIHB1cnBsZQogICAgICAgIGNvbG9yICIjZmZmZmZmIgogICAgICB9CiAgICAgICMgZWxlbWVudCAiTXVsdGlwbGUgQXBwcyIgewogICAgICAgICAgCiAgICAgICMgfQogICAgICBlbGVtZW50ICJQaXBlbGluZSIgewogICAgICAgc2hhcGUgcGlwZSAgIAogICAgICB9CgogICAgICBlbGVtZW50ICJEYWVtb24iIHsKICAgICAgICBzaGFwZSBib3gKICAgICAgICBiYWNrZ3JvdW5kIHdoaXRlCiAgICAgICAgc3Ryb2tlIGJsYWNrCiAgICAgICAgY29sb3IgYmxhY2sKICAgICAgfQogICAgfQoKICAgIGJyYW5kaW5nIHsKICAgICAgbG9nbyBpbWcvYnJhbmRpbmcvbG9nby5wbmcKICAgIH0KICB9Cgp9Cg=="},"revision":41,"views":{"componentViews":[{"automaticLayout":{"applied":false,"edgeSeparation":0,"implementation":"Graphviz","nodeSeparation":300,"rankDirection":"TopBottom","rankSeparation":300,"vertices":false},"containerId":"15","elements":[{"id":"5","x":0,"y":0},{"id":"7","x":0,"y":0},{"id":"14","x":0,"y":0},{"id":"16","x":0,"y":0},{"id":"17","x":0,"y":0},{"id":"18","x":0,"y":0},{"id":"19","x":0,"y":0},{"id":"20","x":0,"y":0},{"id":"21","x":0,"y":0},{"id":"22","x":0,"y":0},{"id":"24","x":0,"y":0}],"externalContainerBoundariesVisible":true,"key":"Back_End_Components","order":4,"relationships":[{"id":"100"},{"id":"101"},{"id":"102"},{"id":"103"},{"id":"107"},{"id":"59"},{"id":"62"},{"id":"65"},{"id":"83"},{"id":"88"},{"id":"97"}]},{"automaticLayout":{"applied":false,"edgeSeparation":0,"implementation":"Graphviz","nodeSeparation":300,"rankDirection":"TopBottom","rankSeparation":300,"vertices":false},"containerId":"44","elements":[{"id":"6","x":0,"y":0},{"id":"32","x":0,"y":0},{"id":"36","x":0,"y":0},{"id":"38","x":0,"y":0},{"id":"45","x":0,"y":0},{"id":"46","x":0,"y":0},{"id":"47","x":0,"y":0},{"id":"48","x":0,"y":0}],"externalContainerBoundariesVisible":true,"key":"MLOps_Components","order":5,"relationships":[{"id":"69"},{"id":"70"},{"id":"74"},{"id":"75"},{"id":"76"},{"id":"80"},{"id":"86"},{"id":"89"},{"id":"90"},{"id":"92"},{"id":"93"}]}],"configuration":{"branding":{"logo":"data:image/png;base64,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eh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cIeh5BpwWCPj5BJ1cI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"},"styles":{"elements":[{"background":"#90caf9","color":"#ffffff","shape":"RoundedBox","tag":"Software System"},{"background":"#1168bd","color":"#ffffff","shape":"RoundedBox","tag":"Container"},{"background":"#00008b","color":"#ffffff","shape":"RoundedBox","tag":"Component"},{"shape":"Person","tag":"Person"},{"background":"#1168bd","color":"#ffffff","shape":"Cylinder","tag":"Database"},{"background":"#808080","color":"#ffffff","tag":"External System"},{"background":"#4caf50","color":"#ffffff","tag":"Internal User"},{"background":"#ffc107","color":"#000000","tag":"Customer User"},{"background":"#800080","color":"#ffffff","tag":"Internal or External User"},{"shape":"Pipe","tag":"Pipeline"},{"background":"#ffffff","color":"#000000","shape":"Box","stroke":"#000000","tag":"Daemon"}]},"terminology":{}},"containerViews":[{"automaticLayout":{"applied":false,"edgeSeparation":0,"implementation":"Graphviz","nodeSeparation":300,"rankDirection":"TopBottom","rankSeparation":300,"vertices":false},"elements":[{"id":"1","x":0,"y":0},{"id":"2","x":0,"y":0},{"id":"5","x":0,"y":0},{"id":"7","x":0,"y":0},{"id":"14","x":0,"y":0},{"id":"15","x":0,"y":0},{"id":"23","x":0,"y":0},{"id":"24","x":0,"y":0},{"id":"54","x":0,"y":0}],"externalSoftwareSystemBoundariesVisible":true,"key":"Control_Tower_Containers","order":2,"relationships":[{"id":"109"},{"id":"55"},{"id":"57"},{"id":"60"},{"id":"65"},{"id":"84"},{"id":"88"},{"id":"94"},{"id":"95"},{"id":"96"},{"id":"98"},{"id":"99"}],"softwareSystemId":"6"},{"automaticLayout":{"applied":false,"edgeSeparation":0,"implementation":"Graphviz","nodeSeparation":300,"rankDirection":"TopBottom","rankSeparation":300,"vertices":false},"elements":[{"id":"3","x":0,"y":0},{"id":"4","x":0,"y":0},{"id":"6","x":0,"y":0},{"id":"25","x":0,"y":0},{"id":"32","x":0,"y":0},{"id":"36","x":0,"y":0},{"id":"38","x":0,"y":0},{"id":"44","x":0,"y":0},{"id":"49","x":0,"y":0}],"externalSoftwareSystemBoundariesVisible":true,"key":"Data_Platform_Containers","order":3,"relationships":[{"id":"106"},{"id":"64"},{"id":"66"},{"id":"68"},{"id":"69"},{"id":"70"},{"id":"71"},{"id":"73"},{"id":"77"},{"id":"91"}],"softwareSystemId":"24"}],"systemLandscapeViews":[{"automaticLayout":{"applied":false,"edgeSeparation":0,"implementation":"Graphviz","nodeSeparation":300,"rankDirection":"TopBottom","rankSeparation":300,"vertices":false},"elements":[{"id":"1","x":0,"y":0},{"id":"2","x":0,"y":0},{"id":"3","x":0,"y":0},{"id":"4","x":0,"y":0},{"id":"5","x":0,"y":0},{"id":"6","x":0,"y":0},{"id":"24","x":0,"y":0},{"id":"50","x":0,"y":0},{"id":"54","x":0,"y":0}],"enterpriseBoundaryVisible":true,"key":"System_Landscape","order":1,"relationships":[{"id":"108"},{"id":"110"},{"id":"56"},{"id":"58"},{"id":"61"},{"id":"63"},{"id":"65"},{"id":"67"},{"id":"72"}]}]}}