"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.modelAndRunConnectorsDocHandlingDiagram = exports.expectTextWithPagination = exports.modelDiagramFromFile = exports.findTextWithPagination = exports.modelAndRunConnectorsTimerEventDiagram = exports.assertPageTextWithRetry = exports.assertLocatorVisibleWithRetry = exports.assertLocatorVisibleWithPaginated = exports.modelRestConnector = exports.completeTaskWithRetry = exports.createAndRunProcess = exports.assignMappingToRole = exports.createUserAndAssignToRole = exports.runMultipleProcesses = exports.deleteAllUserGroups = void 0;
const sleep_1 = require("../../utils/sleep");
const test_1 = require("@playwright/test");
const ConnectorTemplatePage_1 = require("./ConnectorTemplatePage");
const fileUpload_1 = require("../../utils/fileUpload");
const findLocatorInPaginatedList_1 = require("../../utils/findLocatorInPaginatedList");
const KeycloakUtils_1 = require("../SM-8.8/KeycloakUtils");
const expectLocatorWithPagination_1 = require("../../utils/assertionHelpers/expectLocatorWithPagination");
const env_1 = require("../../utils/env");
// This step will be skipped until new Identity expected flow is confirmed
async function deleteAllUserGroups() {
    // await navigationPage.goToOCIdentity();
    // await identityPage.clickGroupsTab();
    // await identityPage.deleteAllGroups();
}
exports.deleteAllUserGroups = deleteAllUserGroups;
async function runMultipleProcesses(page, modelerHomePage, modelerCreatePage, numberOfProcesses, processName, processId = '') {
    for (let i = 1; i <= numberOfProcesses; i++) {
        await createAndRunProcess(page, modelerHomePage, modelerCreatePage, processName + i, processId.length > 0 ? processId + i : processId);
    }
}
exports.runMultipleProcesses = runMultipleProcesses;
async function createUserAndAssignToRole(page, navigationPage, managementIdentityPage, keycloakLoginPage, keycloakAdminPage, ocIdentityHomePage, identityMappingRulesPage, ocIdentityRolesPage, username, password, role = 'admin', testMappings) {
    const mappingRuleId = `${username}-user-mapping`;
    const claimName = 'preferred_username';
    await (0, KeycloakUtils_1.createUser)(navigationPage, managementIdentityPage, keycloakLoginPage, keycloakAdminPage, username, password);
    await navigationPage.goToOCIdentity();
    await ocIdentityHomePage.clickMappingRulesTab();
    await identityMappingRulesPage.createMappingRule(mappingRuleId, mappingRuleId, claimName, username);
    await (0, expectLocatorWithPagination_1.expectLocatorWithPagination)(page, identityMappingRulesPage.mappingRuleRow(mappingRuleId).first());
    if (testMappings && mappingRuleId.toLowerCase() != 'demo-user-mapping') {
        testMappings.mappingIds.push(mappingRuleId);
    }
    await assignMappingToRole(page, ocIdentityHomePage, ocIdentityRolesPage, role, mappingRuleId, testMappings);
    await (0, expectLocatorWithPagination_1.expectLocatorWithPagination)(page, identityMappingRulesPage
        .mappingRuleRow(mappingRuleId)
        .filter({
        hasText: `${mappingRuleId}${mappingRuleId}${claimName}${username}`,
    })
        .first());
}
exports.createUserAndAssignToRole = createUserAndAssignToRole;
async function assignMappingToRole(page, ocIdentityHomePage, ocIdentityRolesPage, role, mappingRuleId, testMappings) {
    await ocIdentityHomePage.clickRolesTab();
    try {
        await (0, test_1.expect)(page.getByText(role).first()).toBeVisible({
            timeout: 20000,
        });
    }
    catch (error) {
        await ocIdentityRolesPage.createRole({ id: role, name: role });
        if (testMappings && role.toLowerCase() != 'admin') {
            testMappings.roleIds.push(role);
        }
    }
    await ocIdentityRolesPage.assignMappingRuleToRole(role, mappingRuleId);
    await assertLocatorVisibleWithPaginated(page, ocIdentityRolesPage.mappingRuleRow(mappingRuleId).first(), `${mappingRuleId} Mapping Rule`);
}
exports.assignMappingToRole = assignMappingToRole;
async function createAndRunProcess(page, modelerHomePage, modelerCreatePage, processName, processId = '') {
    await modelerHomePage.clickDiagramTypeDropdown();
    await modelerHomePage.clickBpmnTemplateOption();
    await modelerCreatePage.modelCamundaUserTaskDiagram(processName, processId);
    await modelerCreatePage.runProcessInstance();
    await modelerHomePage.clickProjectBreadcrumb();
}
exports.createAndRunProcess = createAndRunProcess;
async function completeTaskWithRetry(page, taskPanelPage, taskDetailsPage, taskName, taskPriority) {
    // OpenSearch indexes slower than Elasticsearch, so allow more time
    const TOTAL_TIMEOUT_MS = env_1.isOpenSearch ? 5 * 60 * 1000 : 2 * 60 * 1000;
    const taskVisibilityTimeout = env_1.isOpenSearch ? 30000 : 10000;
    const startTime = Date.now();
    let attempt = 0;
    while (Date.now() - startTime < TOTAL_TIMEOUT_MS) {
        attempt++;
        try {
            await page.waitForLoadState('networkidle');
            await (0, sleep_1.sleep)(500);
            const taskLocator = taskPanelPage.availableTasks
                .getByText(taskName, { exact: true })
                .first();
            try {
                await taskLocator.waitFor({
                    state: 'visible',
                    timeout: taskVisibilityTimeout,
                });
            }
            catch {
                throw new Error(`Task ${taskName} not found in available tasks`);
            }
            await taskPanelPage.openTask(taskName, false);
            await (0, sleep_1.sleep)(500);
            await (0, test_1.expect)(taskDetailsPage.detailsPanel).toBeVisible({ timeout: 30000 });
            if (!(await taskDetailsPage.assignedToMeText.isVisible({ timeout: 5000 }))) {
                await taskDetailsPage.clickAssignToMeButton();
            }
            await (0, test_1.expect)(taskDetailsPage.detailsPanel.getByText(taskPriority)).toBeVisible({ timeout: 30000 });
            await taskDetailsPage.clickCompleteTaskButton();
            await (0, test_1.expect)(taskPanelPage.availableTasks.getByText(taskName, { exact: true }).first()).not.toBeVisible({ timeout: 60000 });
            console.log(`Successfully completed task: ${taskName}`);
            return;
        }
        catch (error) {
            console.warn(`Attempt ${attempt} failed for completing task ${taskName}:`, error instanceof Error ? error.message : error);
            await page.reload();
            await page.waitForLoadState('networkidle');
            await (0, sleep_1.sleep)(500);
        }
    }
    throw new Error(`Completion of task ${taskName} failed after ${attempt} attempts (${TOTAL_TIMEOUT_MS / 1000}s timeout)`);
}
exports.completeTaskWithRetry = completeTaskWithRetry;
async function modelRestConnector(modelerCreatePage, connectorSettingsPage, connectorMarketplacePage, processName, url, auth, resultExpression, { resultVariable = '', basicAuthCredentials = { username: '', password: '' }, page, modelerHomePage, recoverSession, } = {}) {
    await (0, test_1.expect)(modelerCreatePage.generalPanel).toBeVisible({
        timeout: 120000,
    });
    await modelerCreatePage.enterDiagramName(processName);
    await (0, sleep_1.sleep)(5000);
    await modelerCreatePage.clickCanvas();
    await modelerCreatePage.clickGeneralPropertiesPanel();
    await modelerCreatePage.clickIdInput();
    await modelerCreatePage.fillIdInput(processName);
    await modelerCreatePage.assertNameInput(processName);
    await (0, sleep_1.sleep)(5000);
    await modelerCreatePage.clickStartEventElement();
    try {
        await (0, test_1.expect)(modelerCreatePage.appendElementButton).toBeVisible({
            timeout: 1000,
        });
    }
    catch {
        await modelerCreatePage.clickStartEventElement();
    }
    await modelerCreatePage.clickAppendElementButton();
    await modelerCreatePage.clickAppendTaskButton();
    await modelerCreatePage.clickChangeTypeButton();
    try {
        await (0, test_1.expect)(modelerCreatePage.restConnectorOption).toBeVisible({
            timeout: 15000,
        });
    }
    catch (error) {
        await modelerCreatePage.clickMarketPlaceButton();
        await connectorMarketplacePage.clickSearchForConnectorTextbox();
        await connectorMarketplacePage.fillSearchForConnectorTextbox('REST Connector');
        await (0, sleep_1.sleep)(10000);
        await connectorMarketplacePage.downloadConnectorToProject();
        // After download the connector template must be published before it
        // appears in the change-type panel. Navigate to the downloaded template,
        // publish it, then return to the original diagram and reload so the
        // freshly-published connector is available.
        if (page && modelerHomePage) {
            try {
                const connectorTemplatePage = new ConnectorTemplatePage_1.ConnectorTemplatePage(page);
                await modelerHomePage.clickProjectBreadcrumb();
                await modelerHomePage.clickProcessDiagram('REST Outbound Connector');
                await connectorTemplatePage.publishConnector();
                await modelerHomePage.clickProjectBreadcrumb();
                await modelerHomePage.clickProcessDiagram(processName);
                await (0, sleep_1.sleep)(3000);
                await page.reload();
                await (0, sleep_1.sleep)(3000);
                // Re-select the task element and reopen the change-type panel so
                // clickRestConnectorOption() finds the connector immediately.
                await modelerCreatePage.secondElement.click({
                    force: true,
                    timeout: 60000,
                });
                await modelerCreatePage.clickChangeTypeButton();
            }
            catch (publishError) {
                console.error(`Connector publish flow failed: ${publishError}`);
                // clickRestConnectorOption() retries will recover via page.reload()
            }
        }
    }
    await modelerCreatePage.clickRestConnectorOption(recoverSession);
    await connectorSettingsPage.clickAuthenticationTab();
    await connectorSettingsPage.clickHTTPEndpointTab();
    if (auth == 'bearer') {
        await connectorSettingsPage.selectAuthenticationType('bearer');
        await (0, test_1.expect)(connectorSettingsPage.bearerTokenInput).toBeVisible({
            timeout: 60000,
        });
        await connectorSettingsPage.clickBearerTokenInput();
        await connectorSettingsPage.fillBearerTokenInput('thisisabearertoken');
        await (0, test_1.expect)(connectorSettingsPage.methodTypeDropdown).toBeVisible({
            timeout: 30000,
        });
        await connectorSettingsPage.selectMethodType('POST');
    }
    else if (auth == 'basic') {
        await connectorSettingsPage.selectAuthenticationType('basic');
        await (0, test_1.expect)(connectorSettingsPage.usernameInput).toBeVisible({
            timeout: 60000,
        });
        await connectorSettingsPage.clickUsernameInput();
        (0, test_1.expect)(basicAuthCredentials['username'].length).toBeGreaterThan(0);
        (0, test_1.expect)(basicAuthCredentials['password'].length).toBeGreaterThan(0);
        await connectorSettingsPage.fillUsernameInput(basicAuthCredentials['username']);
        await (0, sleep_1.sleep)(1000);
        await connectorSettingsPage.clickPasswordInput();
        await connectorSettingsPage.fillPasswordInput(basicAuthCredentials['password']);
        await (0, sleep_1.sleep)(1000);
        await connectorSettingsPage.selectMethodType('POST');
    }
    await connectorSettingsPage.clickUrlInput();
    await connectorSettingsPage.fillUrlInput(url);
    await (0, sleep_1.sleep)(1000);
    await connectorSettingsPage.clickOutputMappingTab();
    if (resultVariable.length > 0) {
        await connectorSettingsPage.clickResultVariableInput();
        await connectorSettingsPage.fillResultVariableInput('result');
        await (0, sleep_1.sleep)(5000);
    }
    await connectorSettingsPage.clickResultExpressionInput();
    await connectorSettingsPage.fillResultExpressionInput(resultExpression);
    await (0, sleep_1.sleep)(5000);
    await modelerCreatePage.clickAppendElementButton();
    await modelerCreatePage.clickAppendEndEventButton();
    await (0, sleep_1.sleep)(10000);
}
exports.modelRestConnector = modelRestConnector;
async function assertLocatorVisibleWithPaginated(page, locator, text) {
    const maxRetries = 6;
    for (let attempt = 0; attempt < maxRetries; attempt++) {
        try {
            await page.reload();
            await (0, sleep_1.sleep)(5000);
            if (attempt > 2) {
                await (0, findLocatorInPaginatedList_1.findLocatorInPaginatedList)(page, locator);
            }
            await (0, test_1.expect)(locator).toBeVisible();
            return;
        }
        catch (error) {
            if (attempt < maxRetries - 1) {
                console.warn(`Attempt ${attempt + 1} failed for asserting ${text}. Retrying...`);
            }
            else {
                throw new Error(`Assertion ${text} failed after ${maxRetries} attempts`);
            }
        }
    }
}
exports.assertLocatorVisibleWithPaginated = assertLocatorVisibleWithPaginated;
async function assertLocatorVisibleWithRetry(page, locator, text, timeout = 120000, notVisible, maxRetries = 3, clickLocator) {
    for (let attempt = 0; attempt < maxRetries; attempt++) {
        try {
            await page.reload();
            if (clickLocator) {
                await (0, test_1.expect)(clickLocator).toBeVisible({
                    timeout: 30000,
                });
                await clickLocator.click();
            }
            if (notVisible == true) {
                await (0, sleep_1.sleep)(10000);
                await (0, test_1.expect)(locator.first()).not.toBeVisible({
                    timeout: timeout,
                });
            }
            else {
                await (0, test_1.expect)(locator).toBeVisible({
                    timeout: timeout,
                });
            }
            return;
        }
        catch (error) {
            if (attempt < maxRetries - 1) {
                console.warn(`Attempt ${attempt + 1} failed for asserting ${text}. Retrying...`);
            }
            else {
                throw new Error(`Assertion failed after ${maxRetries} attempts`);
            }
        }
    }
}
exports.assertLocatorVisibleWithRetry = assertLocatorVisibleWithRetry;
async function assertPageTextWithRetry(page, text, notVisible, timeout = 120000, maxRetries = 3) {
    for (let attempt = 0; attempt < maxRetries; attempt++) {
        try {
            await page.reload();
            if (notVisible == true) {
                await (0, sleep_1.sleep)(10000);
                await (0, test_1.expect)(page.getByText(text, { exact: true }).first()).not.toBeVisible({
                    timeout: timeout,
                });
            }
            else {
                await (0, test_1.expect)(page.getByText(text, { exact: true }).first()).toBeVisible({
                    timeout: timeout,
                });
            }
            return;
        }
        catch (error) {
            if (attempt < maxRetries - 1) {
                console.warn(`Attempt ${attempt + 1} failed for asserting ${text}. Retrying...`);
            }
            else {
                throw new Error(`Assertion failed after ${maxRetries} attempts`);
            }
        }
    }
}
exports.assertPageTextWithRetry = assertPageTextWithRetry;
async function modelAndRunConnectorsTimerEventDiagram(modelerCreatePage, modelerHomePage, processName, page, connectorMarketplacePage, connectorTemplatePage) {
    await modelerHomePage.clickCrossComponentProjectFolder();
    await modelerHomePage.clickDiagramTypeDropdown();
    await modelerHomePage.clickUploadFilesButton();
    await (0, fileUpload_1.uploadFile)(page, 'Rest Connector Timer Event.bpmn');
    await modelerHomePage.clickProcessDiagram('Rest Connector Timer Event');
    await modelerCreatePage.clickDiagramBreadcrumb();
    await modelerCreatePage.clickEditDiagramNameButton();
    await modelerCreatePage.enterDiagramName(processName);
    await modelerCreatePage.clickStartEventElement();
    await modelerCreatePage.clickGeneralPropertiesPanel();
    await modelerCreatePage.clickIdInput();
    await modelerCreatePage.fillIdInput(processName);
    await (0, sleep_1.sleep)(2000);
    await page.reload();
    await modelerCreatePage.clickEighthPlacedElement();
    await modelerCreatePage.clickChangeTypeButton();
    await (0, test_1.expect)(modelerCreatePage.marketPlaceButton).toBeVisible({
        timeout: 120000,
    });
    await modelerCreatePage.clickMarketPlaceButton();
    await connectorMarketplacePage.clickSearchForConnectorTextbox();
    await connectorMarketplacePage.fillSearchForConnectorTextbox('REST Connector');
    await (0, sleep_1.sleep)(10000);
    await (0, test_1.expect)(page.getByText('REST ConnectorBy CamundaConnect, interact, and synchronize processes')).toBeVisible({
        timeout: 60000,
    });
    await connectorMarketplacePage.downloadConnectorToProject();
    await modelerHomePage.clickProjectBreadcrumb();
    await modelerHomePage.clickProcessDiagram('REST Outbound Connector');
    await connectorTemplatePage.publishConnector();
    await modelerHomePage.clickProjectBreadcrumb();
    await modelerHomePage.clickProcessDiagram(processName);
    await (0, sleep_1.sleep)(5000);
    await page.reload();
    await (0, sleep_1.sleep)(5000);
    await modelerCreatePage.runProcessInstance();
}
exports.modelAndRunConnectorsTimerEventDiagram = modelAndRunConnectorsTimerEventDiagram;
async function findTextWithPagination(page, text, timeout = 30000, action) {
    const maxPages = 10;
    const startTime = Date.now();
    for (let pageNum = 0; pageNum < maxPages; pageNum++) {
        if (Date.now() - startTime > timeout) {
            console.log(`Overall timeout of ${timeout}ms exceeded`);
            break;
        }
        const locator = page.getByText(text).last();
        const textExists = await locator
            .isVisible({ timeout: 2000 })
            .catch(() => false);
        if (textExists) {
            console.log(`Found text "${text}" on page ${pageNum + 1}`);
            if (action) {
                await action(locator);
            }
            return true;
        }
        const loadMoreButton = page
            .getByRole('button', { name: 'Load more', exact: true })
            .last();
        const isVisible = await loadMoreButton
            .isVisible({ timeout: 1000 })
            .catch(() => false);
        const isEnabled = isVisible
            ? await loadMoreButton.isEnabled().catch(() => false)
            : false;
        if (!isVisible || !isEnabled) {
            console.log(`No more pages available after page ${pageNum + 1} (visible: ${isVisible}, enabled: ${isEnabled})`);
            break;
        }
        console.log(`Text "${text}" not found on page ${pageNum + 1}, going to next page...`);
        await loadMoreButton.click();
        await page.waitForTimeout(1000);
    }
    return false;
}
exports.findTextWithPagination = findTextWithPagination;
async function modelDiagramFromFile(page, modelerHomePage, modelerCreatePage, processName, fileName = '', nrOfRenamedUserTasks = 0, taskName = '') {
    await modelerHomePage.clickDiagramTypeDropdown();
    await modelerHomePage.clickUploadFilesButton();
    await (0, fileUpload_1.uploadFile)(page, fileName + '.bpmn');
    await modelerHomePage.clickProcessDiagram(fileName);
    await modelerCreatePage.clickDiagramBreadcrumb();
    await modelerCreatePage.clickEditDiagramNameButton();
    await modelerCreatePage.enterDiagramName(processName);
    await (0, sleep_1.sleep)(1000);
    await modelerCreatePage.clickGeneralPropertiesPanel();
    await modelerCreatePage.clickNameInput();
    await modelerCreatePage.fillNameInput(processName);
    await modelerCreatePage.clickIdInput();
    await modelerCreatePage.fillIdInput(processName);
    if (nrOfRenamedUserTasks > 0) {
        for (let i = 1; i <= nrOfRenamedUserTasks; i++) {
            await modelerCreatePage.clickUserTask('process' + i);
            await modelerCreatePage.clickNameInput();
            await modelerCreatePage.fillNameInput(taskName + i);
            await modelerCreatePage.clickIdInput();
            await modelerCreatePage.fillIdInput(taskName + i);
            await modelerCreatePage.clickCanvas();
        }
    }
    await (0, sleep_1.sleep)(10000);
}
exports.modelDiagramFromFile = modelDiagramFromFile;
async function expectTextWithPagination(page, text, shouldExist = true, timeout = 30000) {
    const found = await findTextWithPagination(page, text, timeout);
    if (shouldExist && !found) {
        throw new Error(`Text "${text}" not found on any page within ${timeout}ms`);
    }
    if (!shouldExist && found) {
        throw new Error(`Text "${text}" should not exist but was found`);
    }
    if (shouldExist && found) {
        await (0, test_1.expect)(page.getByText(text).last()).toBeVisible({ timeout: 5000 });
    }
}
exports.expectTextWithPagination = expectTextWithPagination;
async function modelAndRunConnectorsDocHandlingDiagram(modelerCreatePage, modelerHomePage, processName, page, connectorMarketplacePage, zeebeUrl, zeebeClientId, zeebeClientSecret, endpoint) {
    await modelerHomePage.clickCrossComponentProjectFolder();
    await modelerHomePage.clickDiagramTypeDropdown();
    await modelerHomePage.clickUploadFilesButton();
    await (0, fileUpload_1.uploadFile)(page, 'SM_Document_Handling_Connectors_User_Flow.bpmn');
    await modelerHomePage.clickProcessDiagram('SM_Document_Handling_Connectors_User_Flow');
    await modelerCreatePage.clickDiagramBreadcrumb();
    await modelerCreatePage.clickEditDiagramNameButton();
    await modelerCreatePage.enterDiagramName(processName);
    await modelerCreatePage.clickGeneralPropertiesPanel();
    await modelerCreatePage.clickNameInput();
    await modelerCreatePage.fillNameInput(processName);
    await modelerCreatePage.clickIdInput();
    await modelerCreatePage.fillIdInput(processName);
    await (0, sleep_1.sleep)(10000);
    await modelerCreatePage.clickFirstPlaceRESTConnector();
    await modelerCreatePage.clickChangeTypeButton();
    try {
        // REST Outbound Connector is bundled in the modeler; apply it directly
        // from the change-type panel. The marketplace search for the bundled
        // connector no longer returns a match, so only fall back to it when the
        // bundled option is genuinely absent. Mirrors modelRestConnector above.
        //
        // The change-element popup virtualizes its list: connector templates
        // render below the built-in BPMN tasks and are not in the queryable DOM
        // slice until the list is filtered. Type into the popup search box (the
        // same `.djs-popup-search input` selector the bpmn-js/hub e2e tests use)
        // so the REST Outbound Connector entry is rendered before asserting on it.
        // Wait for the search input to render before filling: a bare isVisible()
        // check races the popup re-render and silently skips the fill, leaving the
        // list unfiltered so the off-screen connector entry never appears.
        await (0, test_1.expect)(modelerCreatePage.changeElementSearchInput).toBeVisible({
            timeout: 30000,
        });
        await modelerCreatePage.changeElementSearchInput.fill('REST Outbound');
        await (0, test_1.expect)(modelerCreatePage.restConnectorOption).toBeVisible({
            timeout: 15000,
        });
        await modelerCreatePage.restConnectorOption.scrollIntoViewIfNeeded();
        await modelerCreatePage.restConnectorOption.click({
            timeout: 60000,
            force: true,
        });
    }
    catch {
        await modelerCreatePage.clickMarketPlaceButton();
        await connectorMarketplacePage.clickSearchForConnectorTextbox();
        await connectorMarketplacePage.fillSearchForConnectorTextbox('REST Connector');
        await connectorMarketplacePage.downloadConnectorToProject();
    }
    await (0, sleep_1.sleep)(5000);
    await page.reload();
    await (0, sleep_1.sleep)(5000);
    await modelerCreatePage.fillStartEventVariablesForDocHandling(zeebeUrl, zeebeClientId, zeebeClientSecret);
    await modelerCreatePage.setOAuthTokenEndpoint(page.locator('.djs-hit').first(), endpoint);
    await (0, sleep_1.sleep)(2000);
    await modelerCreatePage.setOAuthTokenEndpoint(page.locator('g:nth-child(3) > .djs-element > .djs-hit'), endpoint);
    await (0, sleep_1.sleep)(2000);
    await modelerCreatePage.setOAuthTokenEndpoint(page.locator('g:nth-child(6) > .djs-element > .djs-hit'), endpoint);
    await (0, sleep_1.sleep)(2000);
    await modelerCreatePage.clickCloseDetailsPanel();
    await modelerCreatePage.setOAuthTokenEndpoint(page.locator('g:nth-child(7) > .djs-element > .djs-hit'), endpoint, { openPanel: true });
    await (0, sleep_1.sleep)(2000);
    await modelerCreatePage.clickCloseDetailsPanel();
    await modelerCreatePage.setOAuthTokenEndpoint(page.locator('g:nth-child(9) > .djs-element > .djs-hit'), endpoint, { openPanel: true });
    await modelerCreatePage.runProcessInstance();
}
exports.modelAndRunConnectorsDocHandlingDiagram = modelAndRunConnectorsDocHandlingDiagram;
