@budibase/server 0.0.32 → 0.0.999-alpha.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.dockerignore +6 -0
- package/.yarnrc +1 -0
- package/Dockerfile +41 -0
- package/LICENSE +391 -377
- package/__mocks__/@elastic/elasticsearch.ts +24 -0
- package/__mocks__/@google-cloud/firestore.ts +36 -0
- package/__mocks__/@sendgrid/mail.ts +22 -0
- package/__mocks__/airtable.ts +8 -0
- package/__mocks__/arangojs.ts +24 -0
- package/__mocks__/aws-sdk.ts +80 -0
- package/__mocks__/mongodb.ts +39 -0
- package/__mocks__/mssql.ts +24 -0
- package/__mocks__/mysql2/promise.ts +17 -0
- package/__mocks__/mysql2.ts +14 -0
- package/__mocks__/node-fetch.ts +201 -0
- package/__mocks__/oracledb.ts +31 -0
- package/__mocks__/pg.ts +30 -0
- package/babel.config.js +3 -0
- package/build/entitlements.mac.plist +14 -0
- package/build/icon.icns +0 -0
- package/build/icon.png +0 -0
- package/build/icons/512x512.png +0 -0
- package/build/pouchdb.js +9 -0
- package/builder/assets/auth0-logo.6fa5973f.png +0 -0
- package/builder/assets/backups-default.8c011f1b.png +0 -0
- package/builder/assets/bb-emblem.05f7ae7a.svg +80 -0
- package/builder/assets/bb-space-man.5be51a45.svg +290 -0
- package/builder/assets/bb-spaceship.8f6e81e1.svg +227 -0
- package/builder/assets/bg.29e85dd5.png +0 -0
- package/builder/assets/blankScreenPreview.72634dd1.png +0 -0
- package/builder/assets/bulgaria.bd68393d.png +0 -0
- package/builder/assets/covanta.72c46c1e.png +0 -0
- package/builder/assets/discord.c14881e9.svg +10 -0
- package/builder/assets/google-logo.c16467b8.png +0 -0
- package/builder/assets/index.c0265b74.css +6 -0
- package/builder/assets/index.c977bf31.js +1776 -0
- package/builder/assets/integromat.42212f11.png +0 -0
- package/builder/assets/listScreenPreview.599c0aae.png +0 -0
- package/builder/assets/microsoft-logo.07033b2a.png +0 -0
- package/builder/assets/oidc-logo.cb2fff74.png +0 -0
- package/builder/assets/okta-logo.61437d3d.png +0 -0
- package/builder/assets/onelogin-logo.181cc193.png +0 -0
- package/builder/assets/oracle.66592424.png +0 -0
- package/builder/assets/remixicon.0ac8bc3c.ttf +0 -0
- package/builder/assets/remixicon.64bb3a0f.eot +0 -0
- package/builder/assets/remixicon.a10268fe.svg +6835 -0
- package/builder/assets/remixicon.c2dacfbc.woff +0 -0
- package/builder/assets/remixicon.e61f0d10.woff2 +0 -0
- package/builder/assets/schnellecke.cf1837a8.png +0 -0
- package/builder/assets/slack.1e1f7cfb.svg +33 -0
- package/builder/assets/zapier.3fbd8f5c.png +0 -0
- package/builder/index.html +10 -13
- package/dist/api/controllers/analytics.js +46 -0
- package/dist/api/controllers/apikeys.js +72 -0
- package/dist/api/controllers/application.js +575 -0
- package/dist/api/controllers/auth.js +80 -0
- package/dist/api/controllers/automation.js +303 -0
- package/dist/api/controllers/backup.js +37 -0
- package/dist/api/controllers/cloud.js +130 -0
- package/dist/api/controllers/component.js +59 -0
- package/dist/api/controllers/datasource.js +306 -0
- package/dist/api/controllers/deploy/Deployment.js +53 -0
- package/dist/api/controllers/deploy/index.js +198 -0
- package/dist/api/controllers/dev.js +146 -0
- package/dist/api/controllers/integration.js +28 -0
- package/dist/api/controllers/layout.js +49 -0
- package/dist/api/controllers/metadata.js +63 -0
- package/dist/api/controllers/migrations.js +29 -0
- package/dist/api/controllers/ops.js +40 -0
- package/dist/api/controllers/permission.js +162 -0
- package/dist/api/controllers/plugin/file.js +24 -0
- package/dist/api/controllers/plugin/github.js +69 -0
- package/dist/api/controllers/plugin/index.js +112 -0
- package/dist/api/controllers/plugin/npm.js +58 -0
- package/dist/api/controllers/plugin/uploaders.js +11 -0
- package/dist/api/controllers/plugin/url.js +24 -0
- package/dist/api/controllers/plugin/utils.js +27 -0
- package/dist/api/controllers/public/applications.js +146 -0
- package/dist/api/controllers/public/mapping/applications.js +29 -0
- package/dist/api/controllers/public/mapping/index.js +11 -0
- package/dist/api/controllers/public/mapping/queries.js +36 -0
- package/dist/api/controllers/public/mapping/rows.js +24 -0
- package/dist/api/controllers/public/mapping/tables.js +23 -0
- package/dist/api/controllers/public/mapping/types.js +2 -0
- package/dist/api/controllers/public/mapping/users.js +29 -0
- package/dist/api/controllers/public/metrics.js +113 -0
- package/dist/api/controllers/public/queries.js +58 -0
- package/dist/api/controllers/public/rows.js +120 -0
- package/dist/api/controllers/public/tables.js +95 -0
- package/dist/api/controllers/public/users.js +93 -0
- package/dist/api/controllers/public/utils.js +56 -0
- package/dist/api/controllers/query/import/index.js +87 -0
- package/dist/api/controllers/query/import/sources/base/index.js +75 -0
- package/dist/api/controllers/query/import/sources/base/openapi.js +42 -0
- package/dist/api/controllers/query/import/sources/curl.js +99 -0
- package/dist/api/controllers/query/import/sources/openapi2.js +145 -0
- package/dist/api/controllers/query/import/sources/openapi3.js +177 -0
- package/dist/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.json +253 -0
- package/dist/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.json +1054 -0
- package/dist/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.json +253 -0
- package/dist/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.json +1225 -0
- package/dist/api/controllers/query/index.js +299 -0
- package/dist/api/controllers/query/validation.js +53 -0
- package/dist/api/controllers/role.js +109 -0
- package/dist/api/controllers/routing.js +105 -0
- package/dist/api/controllers/row/ExternalRequest.js +676 -0
- package/dist/api/controllers/row/external.js +339 -0
- package/dist/api/controllers/row/index.js +203 -0
- package/dist/api/controllers/row/internal.js +502 -0
- package/dist/api/controllers/row/internalSearch.js +28 -0
- package/dist/api/controllers/row/staticFormula.js +165 -0
- package/dist/api/controllers/row/utils.js +183 -0
- package/dist/api/controllers/screen.js +110 -0
- package/dist/api/controllers/script.js +30 -0
- package/dist/api/controllers/static/index.js +268 -0
- package/dist/api/controllers/static/templates/BudibaseApp.svelte +135 -0
- package/dist/api/controllers/static/templates/app.hbs +13 -0
- package/dist/api/controllers/static/templates/preview.hbs +117 -0
- package/dist/api/controllers/table/bulkFormula.js +173 -0
- package/dist/api/controllers/table/external.js +279 -0
- package/dist/api/controllers/table/index.js +179 -0
- package/dist/api/controllers/table/internal.js +194 -0
- package/dist/api/controllers/table/utils.js +374 -0
- package/dist/api/controllers/templates.js +56 -0
- package/dist/api/controllers/user.js +124 -0
- package/dist/api/controllers/view/exporters.js +44 -0
- package/dist/api/controllers/view/index.js +193 -0
- package/dist/api/controllers/view/utils.js +177 -0
- package/dist/api/controllers/view/viewBuilder.js +158 -0
- package/dist/api/controllers/webhook.js +134 -0
- package/dist/api/index.js +56 -0
- package/dist/api/routes/analytics.js +34 -0
- package/dist/api/routes/apikeys.js +37 -0
- package/dist/api/routes/application.js +48 -0
- package/dist/api/routes/auth.js +33 -0
- package/dist/api/routes/automation.js +50 -0
- package/dist/api/routes/backup.js +35 -0
- package/dist/api/routes/cloud.js +39 -0
- package/dist/api/routes/component.js +35 -0
- package/dist/api/routes/datasource.js +43 -0
- package/dist/api/routes/deploy.js +37 -0
- package/dist/api/routes/dev.js +49 -0
- package/dist/api/routes/index.js +77 -0
- package/dist/api/routes/integration.js +37 -0
- package/dist/api/routes/layout.js +37 -0
- package/dist/api/routes/metadata.js +40 -0
- package/dist/api/routes/migrations.js +36 -0
- package/dist/api/routes/ops.js +52 -0
- package/dist/api/routes/permission.js +44 -0
- package/dist/api/routes/plugin.js +39 -0
- package/dist/api/routes/public/applications.js +174 -0
- package/dist/api/routes/public/index.js +131 -0
- package/dist/api/routes/public/metrics.js +30 -0
- package/dist/api/routes/public/middleware/mapper.js +97 -0
- package/dist/api/routes/public/queries.js +72 -0
- package/dist/api/routes/public/rows.js +158 -0
- package/dist/api/routes/public/tables.js +152 -0
- package/dist/api/routes/public/users.js +135 -0
- package/dist/api/routes/public/utils/Endpoint.js +36 -0
- package/dist/api/routes/query.js +47 -0
- package/dist/api/routes/role.js +40 -0
- package/dist/api/routes/routing.js +39 -0
- package/dist/api/routes/row.js +239 -0
- package/dist/api/routes/screen.js +39 -0
- package/dist/api/routes/script.js +35 -0
- package/dist/api/routes/static.js +80 -0
- package/dist/api/routes/table.js +163 -0
- package/dist/api/routes/templates.js +37 -0
- package/dist/api/routes/user.js +43 -0
- package/dist/api/routes/utils/validators.js +238 -0
- package/dist/api/routes/view.js +42 -0
- package/dist/api/routes/webhook.js +43 -0
- package/dist/app.js +132 -0
- package/dist/automations/actions.js +137 -0
- package/dist/automations/automationUtils.js +173 -0
- package/dist/automations/bullboard.js +71 -0
- package/dist/automations/index.js +43 -0
- package/dist/automations/logging/index.js +53 -0
- package/dist/automations/steps/bash.js +111 -0
- package/dist/automations/steps/createRow.js +108 -0
- package/dist/automations/steps/delay.js +53 -0
- package/dist/automations/steps/deleteRow.js +96 -0
- package/dist/automations/steps/discord.js +116 -0
- package/dist/automations/steps/executeQuery.js +134 -0
- package/dist/automations/steps/executeScript.js +106 -0
- package/dist/automations/steps/filter.js +112 -0
- package/dist/automations/steps/integromat.js +119 -0
- package/dist/automations/steps/loop.js +54 -0
- package/dist/automations/steps/outgoingWebhook.js +166 -0
- package/dist/automations/steps/queryRows.js +216 -0
- package/dist/automations/steps/sendSmtpEmail.js +115 -0
- package/dist/automations/steps/serverLog.js +65 -0
- package/dist/automations/steps/slack.js +98 -0
- package/dist/automations/steps/updateRow.js +144 -0
- package/dist/automations/steps/utils.js +56 -0
- package/dist/automations/steps/zapier.js +117 -0
- package/dist/automations/triggerInfo/app.js +36 -0
- package/dist/automations/triggerInfo/cron.js +35 -0
- package/dist/automations/triggerInfo/index.js +40 -0
- package/dist/automations/triggerInfo/rowDeleted.js +36 -0
- package/dist/automations/triggerInfo/rowSaved.js +44 -0
- package/dist/automations/triggerInfo/rowUpdated.js +44 -0
- package/dist/automations/triggerInfo/webhook.js +40 -0
- package/dist/automations/triggers.js +180 -0
- package/dist/automations/utils.js +264 -0
- package/dist/constants/definitions.js +2 -0
- package/dist/constants/index.js +181 -0
- package/dist/constants/layouts.js +148 -0
- package/dist/constants/screens.js +51 -0
- package/dist/db/defaultData/datasource_bb_default.js +574 -0
- package/dist/db/defaultData/employeeImport.js +155 -0
- package/dist/db/defaultData/expensesImport.js +117 -0
- package/dist/db/defaultData/inventoryImport.js +109 -0
- package/dist/db/defaultData/jobsImport.js +152 -0
- package/dist/db/dynamoClient.js +124 -0
- package/dist/db/inMemoryView.js +62 -0
- package/dist/db/index.js +43 -0
- package/dist/db/linkedRows/LinkController.js +392 -0
- package/dist/db/linkedRows/LinkDocument.js +33 -0
- package/dist/db/linkedRows/index.js +206 -0
- package/dist/db/linkedRows/linkUtils.js +131 -0
- package/dist/db/newid.js +7 -0
- package/dist/db/utils.js +247 -0
- package/dist/db/views/staticViews.js +144 -0
- package/dist/ddApm.js +11 -0
- package/dist/definitions/automations.js +8 -0
- package/dist/definitions/common.js +2 -0
- package/dist/definitions/datasource.js +7 -0
- package/dist/definitions/openapi.js +6 -0
- package/dist/environment.js +113 -0
- package/dist/events/AutomationEmitter.js +53 -0
- package/dist/events/BudibaseEmitter.js +25 -0
- package/dist/events/docUpdates/index.js +17 -0
- package/dist/events/docUpdates/processors.js +18 -0
- package/dist/events/docUpdates/syncUsers.js +49 -0
- package/dist/events/index.js +11 -0
- package/dist/events/utils.js +43 -0
- package/dist/index.js +16 -0
- package/dist/integrations/airtable.js +147 -0
- package/dist/integrations/arangodb.js +103 -0
- package/dist/integrations/base/query.js +32 -0
- package/dist/integrations/base/sql.js +600 -0
- package/dist/integrations/base/sqlTable.js +160 -0
- package/dist/integrations/base/types.js +2 -0
- package/dist/integrations/couchdb.js +125 -0
- package/dist/integrations/dynamodb.js +194 -0
- package/dist/integrations/elasticsearch.js +186 -0
- package/dist/integrations/firebase.js +174 -0
- package/dist/integrations/googlesheets.js +455 -0
- package/dist/integrations/index.js +135 -0
- package/dist/integrations/microsoftSqlServer.js +273 -0
- package/dist/integrations/mongodb.js +614 -0
- package/dist/integrations/mysql.js +256 -0
- package/dist/integrations/oracle.js +375 -0
- package/dist/integrations/postgres.js +300 -0
- package/dist/integrations/queries/sql.js +84 -0
- package/dist/integrations/redis.js +168 -0
- package/dist/integrations/rest.js +400 -0
- package/dist/integrations/s3.js +237 -0
- package/dist/integrations/snowflake.js +99 -0
- package/dist/integrations/utils.js +295 -0
- package/dist/middleware/appInfo.js +22 -0
- package/dist/middleware/authorized.js +112 -0
- package/dist/middleware/builder.js +93 -0
- package/dist/middleware/currentapp.js +103 -0
- package/dist/middleware/joi-validator.js +43 -0
- package/dist/middleware/publicApi.js +25 -0
- package/dist/middleware/resourceId.js +59 -0
- package/dist/middleware/selfhost.js +24 -0
- package/dist/middleware/utils.js +8 -0
- package/dist/migrations/functions/appUrls.js +42 -0
- package/dist/migrations/functions/backfill/app/automations.js +31 -0
- package/dist/migrations/functions/backfill/app/datasources.js +28 -0
- package/dist/migrations/functions/backfill/app/layouts.js +33 -0
- package/dist/migrations/functions/backfill/app/queries.js +50 -0
- package/dist/migrations/functions/backfill/app/roles.js +28 -0
- package/dist/migrations/functions/backfill/app/screens.js +28 -0
- package/dist/migrations/functions/backfill/app/tables.js +37 -0
- package/dist/migrations/functions/backfill/app.js +176 -0
- package/dist/migrations/functions/backfill/global/configs.js +67 -0
- package/dist/migrations/functions/backfill/global/quotas.js +60 -0
- package/dist/migrations/functions/backfill/global/users.js +50 -0
- package/dist/migrations/functions/backfill/global.js +205 -0
- package/dist/migrations/functions/backfill/index.js +32 -0
- package/dist/migrations/functions/backfill/installation.js +80 -0
- package/dist/migrations/functions/syncQuotas.js +50 -0
- package/dist/migrations/functions/tableSettings.js +130 -0
- package/dist/migrations/functions/usageQuotas/index.js +16 -0
- package/dist/migrations/functions/usageQuotas/syncApps.js +25 -0
- package/dist/migrations/functions/usageQuotas/syncPlugins.js +23 -0
- package/dist/migrations/functions/usageQuotas/syncRows.js +33 -0
- package/dist/migrations/functions/userEmailViewCasing.js +24 -0
- package/dist/migrations/index.js +111 -0
- package/dist/migrations/tests/helpers.js +72 -0
- package/dist/migrations/tests/structures.js +37 -0
- package/dist/package.json +180 -0
- package/dist/sdk/app/applications/index.js +28 -0
- package/dist/sdk/app/applications/sync.js +164 -0
- package/dist/sdk/app/applications/utils.js +21 -0
- package/dist/sdk/app/automations/index.js +29 -0
- package/dist/sdk/app/automations/webhook.js +54 -0
- package/dist/sdk/app/backups/constants.js +6 -0
- package/dist/sdk/app/backups/exports.js +184 -0
- package/dist/sdk/app/backups/imports.js +170 -0
- package/dist/sdk/app/backups/index.js +29 -0
- package/dist/sdk/app/backups/statistics.js +73 -0
- package/dist/sdk/app/datasources/datasources.js +166 -0
- package/dist/sdk/app/datasources/index.js +27 -0
- package/dist/sdk/app/queries/index.js +27 -0
- package/dist/sdk/app/queries/queries.js +60 -0
- package/dist/sdk/app/rows/attachments.js +61 -0
- package/dist/sdk/app/rows/index.js +28 -0
- package/dist/sdk/app/rows/rows.js +30 -0
- package/dist/sdk/app/tables/index.js +65 -0
- package/dist/sdk/index.js +27 -0
- package/dist/sdk/plugins/index.js +27 -0
- package/dist/sdk/plugins/plugins.js +53 -0
- package/dist/sdk/users/index.js +27 -0
- package/dist/sdk/users/utils.js +87 -0
- package/dist/sdk/utils/index.js +29 -0
- package/dist/startup.js +158 -0
- package/dist/threads/automation.js +449 -0
- package/dist/threads/definitions.js +2 -0
- package/dist/threads/index.js +137 -0
- package/dist/threads/query.js +265 -0
- package/dist/threads/utils.js +122 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/dist/utilities/appDirectoryTemplate/package.json +10 -0
- package/dist/utilities/budibaseDir.js +5 -0
- package/dist/utilities/centralPath.js +27 -0
- package/dist/utilities/fileSystem/app.js +88 -0
- package/dist/utilities/fileSystem/clientLibrary.js +138 -0
- package/dist/utilities/fileSystem/filesystem.js +180 -0
- package/dist/utilities/fileSystem/index.js +21 -0
- package/dist/utilities/fileSystem/plugin.js +76 -0
- package/dist/utilities/fileSystem/processor.js +34 -0
- package/dist/utilities/fileSystem/template.js +47 -0
- package/dist/utilities/global.js +149 -0
- package/dist/utilities/index.js +143 -0
- package/dist/utilities/redis.js +117 -0
- package/dist/utilities/retry.js +30 -0
- package/dist/utilities/routing/index.js +39 -0
- package/dist/utilities/rowProcessor/index.js +284 -0
- package/dist/utilities/rowProcessor/map.js +99 -0
- package/dist/utilities/rowProcessor/utils.js +88 -0
- package/dist/utilities/schema.js +108 -0
- package/dist/utilities/scriptRunner.js +26 -0
- package/dist/utilities/security.js +57 -0
- package/dist/utilities/statusCodes.js +9 -0
- package/dist/utilities/usageQuota/rows.js +88 -0
- package/dist/utilities/usageQuota/usageQuoteReset.js +16 -0
- package/dist/utilities/users.js +57 -0
- package/dist/utilities/workerRequests.js +171 -0
- package/dist/watch.js +53 -0
- package/dist/websockets/client.js +14 -0
- package/dist/websockets/grid.js +60 -0
- package/dist/websockets/index.js +17 -0
- package/dist/websockets/websocket.js +78 -0
- package/docker_run.sh +7 -0
- package/jest-testcontainers-config.js +8 -0
- package/jest.config.ts +52 -0
- package/nodemon.json +10 -0
- package/package.json +166 -31
- package/pm2.config.js +9 -0
- package/scripts/account.js +8 -0
- package/scripts/dev/manage.js +119 -0
- package/scripts/docs/README.md +31 -0
- package/scripts/docs/generate.js +74 -0
- package/scripts/docs/toSwagger.js +320 -0
- package/scripts/exportAppTemplate.js +64 -0
- package/scripts/integrations/customer-categories/docker-compose.yml +28 -0
- package/scripts/integrations/customer-categories/init.sql +41 -0
- package/scripts/integrations/customer-categories/reset.sh +3 -0
- package/scripts/integrations/mssql/data/Dockerfile +9 -0
- package/scripts/integrations/mssql/data/entrypoint.sh +25 -0
- package/scripts/integrations/mssql/data/setup.sql +80 -0
- package/scripts/integrations/mssql/docker-compose.yaml +12 -0
- package/scripts/integrations/mssql/reset.sh +3 -0
- package/scripts/integrations/mysql/docker-compose.yaml +21 -0
- package/scripts/integrations/mysql/init.sql +32 -0
- package/scripts/integrations/mysql/reset.sh +3 -0
- package/scripts/integrations/oracle/docker-compose.yml +19 -0
- package/scripts/integrations/oracle/instantclient/linux/arm64/basiclite-19.10.zip +0 -0
- package/scripts/integrations/oracle/instantclient/linux/arm64/install.sh +23 -0
- package/scripts/integrations/oracle/instantclient/linux/install.sh +10 -0
- package/scripts/integrations/oracle/instantclient/linux/x86-64/basiclite-21.4.zip +0 -0
- package/scripts/integrations/oracle/instantclient/linux/x86-64/install.sh +23 -0
- package/scripts/integrations/oracle/oracle.md +90 -0
- package/scripts/integrations/pg-json/docker-compose.yml +28 -0
- package/scripts/integrations/pg-json/init.sql +22 -0
- package/scripts/integrations/pg-json/reset.sh +3 -0
- package/scripts/integrations/postgres/docker-compose.yml +28 -0
- package/scripts/integrations/postgres/emp-skill.sql +46 -0
- package/scripts/integrations/postgres/emp-territory.sql +32 -0
- package/scripts/integrations/postgres/init.sql +57 -0
- package/scripts/integrations/postgres/reset.sh +3 -0
- package/scripts/integrations/service-vehicles/docker-compose.yml +28 -0
- package/scripts/integrations/service-vehicles/init.sql +52 -0
- package/scripts/integrations/service-vehicles/reset.sh +3 -0
- package/scripts/load/create-many-apps.js +24 -0
- package/scripts/load/create-many-rows.js +30 -0
- package/scripts/load/utils.js +66 -0
- package/scripts/localdomain.js +52 -0
- package/scripts/multiTenancy.js +8 -0
- package/scripts/selfhost.js +8 -0
- package/scripts/test.sh +14 -0
- package/scripts/watchtower-hooks/post-check.sh +1 -0
- package/scripts/watchtower-hooks/post-update.sh +1 -0
- package/scripts/watchtower-hooks/pre-check.sh +1 -0
- package/scripts/watchtower-hooks/pre-update.sh +1 -0
- package/specs/generate.ts +92 -0
- package/specs/openapi.json +2782 -0
- package/specs/openapi.yaml +2111 -0
- package/specs/parameters.ts +59 -0
- package/specs/resources/application.ts +137 -0
- package/specs/resources/index.ts +26 -0
- package/specs/resources/metrics.ts +81 -0
- package/specs/resources/misc.ts +128 -0
- package/specs/resources/query.ts +217 -0
- package/specs/resources/row.ts +124 -0
- package/specs/resources/table.ts +197 -0
- package/specs/resources/user.ts +132 -0
- package/specs/resources/utils/Resource.ts +39 -0
- package/specs/resources/utils/index.ts +11 -0
- package/specs/security.ts +7 -0
- package/src/api/controllers/analytics.ts +35 -0
- package/src/api/controllers/apikeys.ts +54 -0
- package/src/api/controllers/application.ts +633 -0
- package/src/api/controllers/auth.ts +72 -0
- package/src/api/controllers/automation.ts +302 -0
- package/src/api/controllers/backup.ts +21 -0
- package/src/api/controllers/cloud.ts +119 -0
- package/src/api/controllers/component.ts +58 -0
- package/src/api/controllers/datasource.ts +351 -0
- package/src/api/controllers/deploy/Deployment.ts +59 -0
- package/src/api/controllers/deploy/index.ts +203 -0
- package/src/api/controllers/dev.ts +129 -0
- package/src/api/controllers/integration.ts +13 -0
- package/src/api/controllers/layout.ts +47 -0
- package/src/api/controllers/metadata.ts +42 -0
- package/src/api/controllers/migrations.ts +14 -0
- package/src/api/controllers/ops.ts +32 -0
- package/src/api/controllers/permission.ts +178 -0
- package/src/api/controllers/plugin/file.ts +15 -0
- package/src/api/controllers/plugin/github.ts +75 -0
- package/src/api/controllers/plugin/index.ts +101 -0
- package/src/api/controllers/plugin/npm.ts +56 -0
- package/src/api/controllers/plugin/uploaders.ts +4 -0
- package/src/api/controllers/plugin/url.ts +12 -0
- package/src/api/controllers/plugin/utils.ts +17 -0
- package/src/api/controllers/public/applications.ts +100 -0
- package/src/api/controllers/public/mapping/applications.ts +32 -0
- package/src/api/controllers/public/mapping/index.ts +13 -0
- package/src/api/controllers/public/mapping/queries.ts +39 -0
- package/src/api/controllers/public/mapping/rows.ts +31 -0
- package/src/api/controllers/public/mapping/tables.ts +26 -0
- package/src/api/controllers/public/mapping/types.ts +21 -0
- package/src/api/controllers/public/mapping/users.ts +32 -0
- package/src/api/controllers/public/metrics.ts +251 -0
- package/src/api/controllers/public/queries.ts +20 -0
- package/src/api/controllers/public/rows.ts +81 -0
- package/src/api/controllers/public/tables.ts +56 -0
- package/src/api/controllers/public/users.ts +80 -0
- package/src/api/controllers/public/utils.ts +45 -0
- package/src/api/controllers/query/import/index.ts +96 -0
- package/src/api/controllers/query/import/sources/base/index.ts +98 -0
- package/src/api/controllers/query/import/sources/base/openapi.ts +24 -0
- package/src/api/controllers/query/import/sources/curl.ts +106 -0
- package/src/api/controllers/query/import/sources/openapi2.ts +167 -0
- package/src/api/controllers/query/import/sources/openapi3.ts +209 -0
- package/src/api/controllers/query/import/sources/tests/curl/curl.spec.js +103 -0
- package/src/api/controllers/query/import/sources/tests/curl/data/delete.txt +1 -0
- package/src/api/controllers/query/import/sources/tests/curl/data/empty-body.txt +2 -0
- package/src/api/controllers/query/import/sources/tests/curl/data/get.txt +1 -0
- package/src/api/controllers/query/import/sources/tests/curl/data/headers.txt +3 -0
- package/src/api/controllers/query/import/sources/tests/curl/data/patch.txt +2 -0
- package/src/api/controllers/query/import/sources/tests/curl/data/path.txt +1 -0
- package/src/api/controllers/query/import/sources/tests/curl/data/post.txt +2 -0
- package/src/api/controllers/query/import/sources/tests/curl/data/put.txt +2 -0
- package/src/api/controllers/query/import/sources/tests/curl/data/query.txt +1 -0
- package/src/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.json +253 -0
- package/src/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.yaml +160 -0
- package/src/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.json +1054 -0
- package/src/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.yaml +711 -0
- package/src/api/controllers/query/import/sources/tests/openapi2/openapi2.spec.js +238 -0
- package/src/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.json +253 -0
- package/src/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.yaml +153 -0
- package/src/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.json +1225 -0
- package/src/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.yaml +804 -0
- package/src/api/controllers/query/import/sources/tests/openapi3/openapi3.spec.js +240 -0
- package/src/api/controllers/query/import/tests/index.spec.js +162 -0
- package/src/api/controllers/query/index.ts +307 -0
- package/src/api/controllers/query/validation.ts +50 -0
- package/src/api/controllers/role.ts +104 -0
- package/src/api/controllers/routing.ts +95 -0
- package/src/api/controllers/row/ExternalRequest.ts +821 -0
- package/src/api/controllers/row/external.ts +304 -0
- package/src/api/controllers/row/index.ts +162 -0
- package/src/api/controllers/row/internal.ts +500 -0
- package/src/api/controllers/row/internalSearch.ts +18 -0
- package/src/api/controllers/row/staticFormula.ts +170 -0
- package/src/api/controllers/row/utils.ts +156 -0
- package/src/api/controllers/screen.ts +126 -0
- package/src/api/controllers/script.ts +12 -0
- package/src/api/controllers/static/index.ts +241 -0
- package/src/api/controllers/static/templates/BudibaseApp.svelte +135 -0
- package/src/api/controllers/static/templates/app.hbs +13 -0
- package/src/api/controllers/static/templates/preview.hbs +117 -0
- package/src/api/controllers/table/bulkFormula.ts +188 -0
- package/src/api/controllers/table/external.ts +364 -0
- package/src/api/controllers/table/index.ts +143 -0
- package/src/api/controllers/table/internal.ts +191 -0
- package/src/api/controllers/table/tests/utils.spec.ts +97 -0
- package/src/api/controllers/table/utils.ts +422 -0
- package/src/api/controllers/templates.ts +43 -0
- package/src/api/controllers/user.ts +97 -0
- package/src/api/controllers/view/exporters.ts +43 -0
- package/src/api/controllers/view/index.ts +192 -0
- package/src/api/controllers/view/tests/__snapshots__/viewBuilder.spec.js.snap +147 -0
- package/src/api/controllers/view/tests/viewBuilder.spec.js +65 -0
- package/src/api/controllers/view/utils.ts +165 -0
- package/src/api/controllers/view/viewBuilder.ts +203 -0
- package/src/api/controllers/webhook.ts +100 -0
- package/src/api/index.ts +63 -0
- package/src/api/routes/analytics.ts +9 -0
- package/src/api/routes/apikeys.ts +12 -0
- package/src/api/routes/application.ts +57 -0
- package/src/api/routes/auth.ts +8 -0
- package/src/api/routes/automation.ts +87 -0
- package/src/api/routes/backup.ts +14 -0
- package/src/api/routes/cloud.ts +18 -0
- package/src/api/routes/component.ts +14 -0
- package/src/api/routes/datasource.ts +60 -0
- package/src/api/routes/deploy.ts +20 -0
- package/src/api/routes/dev.ts +38 -0
- package/src/api/routes/index.ts +73 -0
- package/src/api/routes/integration.ts +16 -0
- package/src/api/routes/layout.ts +16 -0
- package/src/api/routes/metadata.ts +38 -0
- package/src/api/routes/migrations.ts +14 -0
- package/src/api/routes/ops.ts +30 -0
- package/src/api/routes/permission.ts +41 -0
- package/src/api/routes/plugin.ts +22 -0
- package/src/api/routes/public/applications.ts +195 -0
- package/src/api/routes/public/index.ts +145 -0
- package/src/api/routes/public/metrics.ts +28 -0
- package/src/api/routes/public/middleware/mapper.ts +85 -0
- package/src/api/routes/public/queries.ts +76 -0
- package/src/api/routes/public/rows.ts +171 -0
- package/src/api/routes/public/tables.ts +167 -0
- package/src/api/routes/public/tests/compare.spec.ts +185 -0
- package/src/api/routes/public/tests/metrics.spec.js +34 -0
- package/src/api/routes/public/tests/users.spec.js +38 -0
- package/src/api/routes/public/tests/utils.ts +45 -0
- package/src/api/routes/public/users.ts +142 -0
- package/src/api/routes/public/utils/Endpoint.ts +51 -0
- package/src/api/routes/query.ts +61 -0
- package/src/api/routes/role.ts +24 -0
- package/src/api/routes/routing.ts +14 -0
- package/src/api/routes/row.ts +266 -0
- package/src/api/routes/screen.ts +23 -0
- package/src/api/routes/script.ts +10 -0
- package/src/api/routes/static.ts +65 -0
- package/src/api/routes/table.ts +170 -0
- package/src/api/routes/templates.ts +16 -0
- package/src/api/routes/tests/__snapshots__/datasource.spec.ts.snap +93 -0
- package/src/api/routes/tests/__snapshots__/view.spec.js.snap +38 -0
- package/src/api/routes/tests/analytics.spec.js +62 -0
- package/src/api/routes/tests/apikeys.spec.js +59 -0
- package/src/api/routes/tests/appSync.spec.ts +31 -0
- package/src/api/routes/tests/application.spec.ts +327 -0
- package/src/api/routes/tests/auth.spec.js +24 -0
- package/src/api/routes/tests/automation.spec.js +349 -0
- package/src/api/routes/tests/backup.spec.ts +45 -0
- package/src/api/routes/tests/cloud.spec.ts +54 -0
- package/src/api/routes/tests/component.spec.js +32 -0
- package/src/api/routes/tests/data/budibase-component-1.0.1.tgz +0 -0
- package/src/api/routes/tests/data/comment-box-1.0.2.tar.gz +0 -0
- package/src/api/routes/tests/data/export-test.tar.gz +0 -0
- package/src/api/routes/tests/data/export.txt +1 -0
- package/src/api/routes/tests/data/old-app.txt +3 -0
- package/src/api/routes/tests/datasource.spec.ts +238 -0
- package/src/api/routes/tests/dev.spec.js +40 -0
- package/src/api/routes/tests/environmentVariables.spec.ts +144 -0
- package/src/api/routes/tests/integration.spec.js +52 -0
- package/src/api/routes/tests/internalSearch.spec.js +197 -0
- package/src/api/routes/tests/layout.spec.js +59 -0
- package/src/api/routes/tests/metadata.spec.js +65 -0
- package/src/api/routes/tests/misc.spec.js +91 -0
- package/src/api/routes/tests/permissions.spec.js +133 -0
- package/src/api/routes/tests/plugin.spec.ts +179 -0
- package/src/api/routes/tests/query.seq.spec.js +538 -0
- package/src/api/routes/tests/role.spec.js +131 -0
- package/src/api/routes/tests/routing.spec.js +116 -0
- package/src/api/routes/tests/row.spec.js +573 -0
- package/src/api/routes/tests/screen.spec.js +103 -0
- package/src/api/routes/tests/static.spec.js +140 -0
- package/src/api/routes/tests/table.spec.js +302 -0
- package/src/api/routes/tests/templates.spec.js +24 -0
- package/src/api/routes/tests/user.spec.js +208 -0
- package/src/api/routes/tests/utilities/TestFunctions.ts +177 -0
- package/src/api/routes/tests/utilities/index.ts +96 -0
- package/src/api/routes/tests/view.spec.js +419 -0
- package/src/api/routes/tests/webhook.spec.js +134 -0
- package/src/api/routes/user.ts +46 -0
- package/src/api/routes/utils/validators.ts +240 -0
- package/src/api/routes/view.ts +34 -0
- package/src/api/routes/webhook.ts +27 -0
- package/src/app.ts +114 -0
- package/src/automations/actions.ts +109 -0
- package/src/automations/automationUtils.ts +163 -0
- package/src/automations/bullboard.ts +38 -0
- package/src/automations/index.ts +26 -0
- package/src/automations/logging/index.ts +38 -0
- package/src/automations/steps/bash.ts +81 -0
- package/src/automations/steps/createRow.ts +102 -0
- package/src/automations/steps/delay.ts +46 -0
- package/src/automations/steps/deleteRow.ts +91 -0
- package/src/automations/steps/discord.ts +106 -0
- package/src/automations/steps/executeQuery.ts +98 -0
- package/src/automations/steps/executeScript.ts +83 -0
- package/src/automations/steps/filter.ts +105 -0
- package/src/automations/steps/integromat.ts +110 -0
- package/src/automations/steps/loop.ts +58 -0
- package/src/automations/steps/outgoingWebhook.ts +141 -0
- package/src/automations/steps/queryRows.ts +196 -0
- package/src/automations/steps/sendSmtpEmail.ts +92 -0
- package/src/automations/steps/serverLog.ts +59 -0
- package/src/automations/steps/slack.ts +87 -0
- package/src/automations/steps/updateRow.ts +121 -0
- package/src/automations/steps/utils.ts +46 -0
- package/src/automations/steps/zapier.ts +108 -0
- package/src/automations/tests/automation.spec.ts +99 -0
- package/src/automations/tests/bash.spec.js +34 -0
- package/src/automations/tests/createRow.spec.ts +46 -0
- package/src/automations/tests/delay.spec.js +16 -0
- package/src/automations/tests/deleteRow.spec.ts +55 -0
- package/src/automations/tests/discord.spec.js +27 -0
- package/src/automations/tests/executeQuery.spec.js +48 -0
- package/src/automations/tests/executeScript.spec.js +48 -0
- package/src/automations/tests/filter.spec.js +49 -0
- package/src/automations/tests/loop.spec.ts +45 -0
- package/src/automations/tests/outgoingWebhook.spec.js +39 -0
- package/src/automations/tests/queryRows.spec.js +117 -0
- package/src/automations/tests/sendSmtpEmail.spec.js +71 -0
- package/src/automations/tests/serverLog.spec.js +22 -0
- package/src/automations/tests/updateRow.spec.js +44 -0
- package/src/automations/tests/utilities/index.ts +60 -0
- package/src/automations/tests/zapier.spec.js +27 -0
- package/src/automations/triggerInfo/app.ts +40 -0
- package/src/automations/triggerInfo/cron.ts +39 -0
- package/src/automations/triggerInfo/index.ts +15 -0
- package/src/automations/triggerInfo/rowDeleted.ts +40 -0
- package/src/automations/triggerInfo/rowSaved.ts +48 -0
- package/src/automations/triggerInfo/rowUpdated.ts +48 -0
- package/src/automations/triggerInfo/webhook.ts +44 -0
- package/src/automations/triggers.ts +156 -0
- package/src/automations/unitTests/automationUtils.spec.ts +133 -0
- package/src/automations/utils.ts +267 -0
- package/src/constants/definitions.ts +42 -0
- package/src/constants/index.ts +183 -0
- package/src/constants/layouts.ts +147 -0
- package/src/constants/screens.ts +48 -0
- package/src/db/defaultData/datasource_bb_default.ts +654 -0
- package/src/db/defaultData/employeeImport.ts +152 -0
- package/src/db/defaultData/expensesImport.ts +114 -0
- package/src/db/defaultData/inventoryImport.ts +106 -0
- package/src/db/defaultData/jobsImport.ts +158 -0
- package/src/db/dynamoClient.ts +147 -0
- package/src/db/inMemoryView.ts +55 -0
- package/src/db/index.ts +16 -0
- package/src/db/linkedRows/LinkController.ts +445 -0
- package/src/db/linkedRows/LinkDocument.ts +60 -0
- package/src/db/linkedRows/index.ts +217 -0
- package/src/db/linkedRows/linkUtils.ts +125 -0
- package/src/db/newid.ts +5 -0
- package/src/db/tests/linkController.spec.js +236 -0
- package/src/db/tests/linkTests.spec.js +65 -0
- package/src/db/utils.ts +272 -0
- package/src/db/views/staticViews.ts +132 -0
- package/src/ddApm.ts +7 -0
- package/src/definitions/automations.ts +33 -0
- package/src/definitions/common.ts +54 -0
- package/src/definitions/datasource.ts +9 -0
- package/src/definitions/openapi.ts +1233 -0
- package/src/environment.ts +125 -0
- package/src/events/AutomationEmitter.ts +58 -0
- package/src/events/BudibaseEmitter.ts +29 -0
- package/src/events/docUpdates/index.ts +1 -0
- package/src/events/docUpdates/processors.ts +14 -0
- package/src/events/docUpdates/syncUsers.ts +35 -0
- package/src/events/index.ts +6 -0
- package/src/events/utils.ts +78 -0
- package/src/index.ts +16 -0
- package/src/integration-test/postgres.spec.ts +1026 -0
- package/src/integrations/airtable.ts +148 -0
- package/src/integrations/arangodb.ts +110 -0
- package/src/integrations/base/query.ts +18 -0
- package/src/integrations/base/sql.ts +651 -0
- package/src/integrations/base/sqlTable.ts +202 -0
- package/src/integrations/base/types.ts +134 -0
- package/src/integrations/couchdb.ts +133 -0
- package/src/integrations/dynamodb.ts +220 -0
- package/src/integrations/elasticsearch.ts +187 -0
- package/src/integrations/firebase.ts +187 -0
- package/src/integrations/googlesheets.ts +511 -0
- package/src/integrations/index.ts +125 -0
- package/src/integrations/microsoftSqlServer.ts +312 -0
- package/src/integrations/mongodb.ts +638 -0
- package/src/integrations/mysql.ts +300 -0
- package/src/integrations/oracle.ts +435 -0
- package/src/integrations/postgres.ts +336 -0
- package/src/integrations/queries/sql.ts +81 -0
- package/src/integrations/redis.ts +163 -0
- package/src/integrations/rest.ts +436 -0
- package/src/integrations/s3.ts +260 -0
- package/src/integrations/snowflake.ts +97 -0
- package/src/integrations/tests/TestConfiguration.js +0 -0
- package/src/integrations/tests/airtable.spec.ts +75 -0
- package/src/integrations/tests/arangodb.spec.ts +38 -0
- package/src/integrations/tests/couchdb.spec.ts +86 -0
- package/src/integrations/tests/dynamodb.spec.ts +155 -0
- package/src/integrations/tests/elasticsearch.spec.ts +82 -0
- package/src/integrations/tests/firebase.spec.ts +97 -0
- package/src/integrations/tests/googlesheets.spec.ts +126 -0
- package/src/integrations/tests/microsoftSqlServer.spec.ts +56 -0
- package/src/integrations/tests/mongo.spec.ts +334 -0
- package/src/integrations/tests/mysql.spec.ts +133 -0
- package/src/integrations/tests/oracle.spec.ts +96 -0
- package/src/integrations/tests/postgres.spec.ts +81 -0
- package/src/integrations/tests/redis.spec.ts +88 -0
- package/src/integrations/tests/rest.spec.ts +595 -0
- package/src/integrations/tests/s3.spec.ts +112 -0
- package/src/integrations/tests/sql.spec.ts +639 -0
- package/src/integrations/utils.ts +330 -0
- package/src/middleware/appInfo.ts +20 -0
- package/src/middleware/authorized.ts +131 -0
- package/src/middleware/builder.ts +97 -0
- package/src/middleware/currentapp.ts +112 -0
- package/src/middleware/joi-validator.ts +40 -0
- package/src/middleware/publicApi.ts +21 -0
- package/src/middleware/resourceId.ts +66 -0
- package/src/middleware/selfhost.ts +12 -0
- package/src/middleware/tests/authorized.spec.js +163 -0
- package/src/middleware/tests/currentapp.spec.js +207 -0
- package/src/middleware/tests/resourceId.spec.js +105 -0
- package/src/middleware/tests/selfhost.spec.js +43 -0
- package/src/middleware/utils.ts +9 -0
- package/src/migrations/functions/appUrls.ts +27 -0
- package/src/migrations/functions/backfill/app/automations.ts +26 -0
- package/src/migrations/functions/backfill/app/datasources.ts +22 -0
- package/src/migrations/functions/backfill/app/layouts.ts +29 -0
- package/src/migrations/functions/backfill/app/queries.ts +47 -0
- package/src/migrations/functions/backfill/app/roles.ts +22 -0
- package/src/migrations/functions/backfill/app/screens.ts +22 -0
- package/src/migrations/functions/backfill/app/tables.ts +27 -0
- package/src/migrations/functions/backfill/app.ts +149 -0
- package/src/migrations/functions/backfill/global/configs.ts +73 -0
- package/src/migrations/functions/backfill/global/quotas.ts +60 -0
- package/src/migrations/functions/backfill/global/users.ts +49 -0
- package/src/migrations/functions/backfill/global.ts +213 -0
- package/src/migrations/functions/backfill/index.ts +7 -0
- package/src/migrations/functions/backfill/installation.ts +50 -0
- package/src/migrations/functions/syncQuotas.ts +15 -0
- package/src/migrations/functions/tableSettings.ts +145 -0
- package/src/migrations/functions/tests/appUrls.spec.js +26 -0
- package/src/migrations/functions/tests/syncQuotas.spec.js +26 -0
- package/src/migrations/functions/tests/tableSettings.spec.ts +144 -0
- package/src/migrations/functions/tests/userEmailViewCasing.spec.js +34 -0
- package/src/migrations/functions/usageQuotas/index.ts +3 -0
- package/src/migrations/functions/usageQuotas/syncApps.ts +14 -0
- package/src/migrations/functions/usageQuotas/syncPlugins.ts +10 -0
- package/src/migrations/functions/usageQuotas/syncRows.ts +27 -0
- package/src/migrations/functions/usageQuotas/tests/syncApps.spec.ts +35 -0
- package/src/migrations/functions/usageQuotas/tests/syncRows.spec.ts +53 -0
- package/src/migrations/functions/userEmailViewCasing.ts +13 -0
- package/src/migrations/index.ts +115 -0
- package/src/migrations/tests/helpers.ts +40 -0
- package/src/migrations/tests/index.spec.ts +142 -0
- package/src/migrations/tests/structures.ts +67 -0
- package/src/sdk/app/applications/index.ts +7 -0
- package/src/sdk/app/applications/sync.ts +168 -0
- package/src/sdk/app/applications/tests/sync.spec.ts +137 -0
- package/src/sdk/app/applications/utils.ts +17 -0
- package/src/sdk/app/automations/index.ts +5 -0
- package/src/sdk/app/automations/webhook.ts +43 -0
- package/src/sdk/app/backups/constants.ts +3 -0
- package/src/sdk/app/backups/exports.ts +195 -0
- package/src/sdk/app/backups/imports.ts +185 -0
- package/src/sdk/app/backups/index.ts +9 -0
- package/src/sdk/app/backups/statistics.ts +69 -0
- package/src/sdk/app/datasources/datasources.ts +162 -0
- package/src/sdk/app/datasources/index.ts +5 -0
- package/src/sdk/app/queries/index.ts +5 -0
- package/src/sdk/app/queries/queries.ts +50 -0
- package/src/sdk/app/rows/attachments.ts +60 -0
- package/src/sdk/app/rows/index.ts +7 -0
- package/src/sdk/app/rows/rows.ts +18 -0
- package/src/sdk/app/tables/index.ts +63 -0
- package/src/sdk/index.ts +24 -0
- package/src/sdk/plugins/index.ts +5 -0
- package/src/sdk/plugins/plugins.ts +41 -0
- package/src/sdk/tests/attachments.spec.ts +76 -0
- package/src/sdk/users/index.ts +5 -0
- package/src/sdk/users/tests/utils.spec.ts +128 -0
- package/src/sdk/users/utils.ts +93 -0
- package/src/sdk/utils/index.ts +16 -0
- package/src/startup.ts +138 -0
- package/src/tests/jestEnv.ts +11 -0
- package/src/tests/jestSetup.ts +22 -0
- package/src/tests/utilities/TestConfiguration.ts +768 -0
- package/src/tests/utilities/controllers.ts +14 -0
- package/src/tests/utilities/index.ts +11 -0
- package/src/tests/utilities/structures.ts +289 -0
- package/src/threads/automation.ts +502 -0
- package/src/threads/definitions.ts +21 -0
- package/src/threads/index.ts +111 -0
- package/src/threads/query.ts +305 -0
- package/src/threads/utils.ts +96 -0
- package/src/utilities/appDirectoryTemplate/package.json +10 -0
- package/src/utilities/budibaseDir.ts +3 -0
- package/src/utilities/centralPath.ts +22 -0
- package/src/utilities/fileSystem/app.ts +79 -0
- package/src/utilities/fileSystem/clientLibrary.ts +154 -0
- package/src/utilities/fileSystem/filesystem.ts +168 -0
- package/src/utilities/fileSystem/index.ts +5 -0
- package/src/utilities/fileSystem/plugin.ts +73 -0
- package/src/utilities/fileSystem/processor.ts +19 -0
- package/src/utilities/fileSystem/template.ts +36 -0
- package/src/utilities/global.ts +153 -0
- package/src/utilities/index.ts +134 -0
- package/src/utilities/redis.ts +88 -0
- package/src/utilities/retry.ts +18 -0
- package/src/utilities/routing/index.ts +32 -0
- package/src/utilities/rowProcessor/index.ts +279 -0
- package/src/utilities/rowProcessor/map.ts +96 -0
- package/src/utilities/rowProcessor/tests/utils.spec.ts +57 -0
- package/src/utilities/rowProcessor/utils.ts +96 -0
- package/src/utilities/schema.ts +141 -0
- package/src/utilities/scriptRunner.ts +28 -0
- package/src/utilities/security.ts +65 -0
- package/{utilities/statusCodes.js → src/utilities/statusCodes.ts} +1 -1
- package/src/utilities/tests/test.csv +4 -0
- package/src/utilities/usageQuota/rows.ts +80 -0
- package/src/utilities/usageQuota/usageQuoteReset.ts +18 -0
- package/src/utilities/users.ts +49 -0
- package/src/utilities/workerRequests.ts +188 -0
- package/src/watch.ts +37 -0
- package/src/websockets/client.ts +11 -0
- package/src/websockets/grid.ts +55 -0
- package/src/websockets/index.ts +14 -0
- package/src/websockets/websocket.ts +83 -0
- package/tsconfig.build.json +28 -0
- package/tsconfig.json +22 -0
- package/app.js +0 -20
- package/appPackages/_master/access_levels.json +0 -175
- package/appPackages/_master/appDefinition.json +0 -527
- package/appPackages/_master/main.js +0 -125
- package/appPackages/_master/node_modules/.yarn-integrity +0 -20
- package/appPackages/_master/node_modules/@budibase/materialdesign-components/README.md +0 -33
- package/appPackages/_master/node_modules/@budibase/materialdesign-components/components.json +0 -249
- package/appPackages/_master/node_modules/@budibase/materialdesign-components/dist/index.js +0 -11282
- package/appPackages/_master/node_modules/@budibase/materialdesign-components/dist/index.js.map +0 -1
- package/appPackages/_master/node_modules/@budibase/materialdesign-components/package.json +0 -50
- package/appPackages/_master/node_modules/@budibase/standard-components/README.md +0 -33
- package/appPackages/_master/node_modules/@budibase/standard-components/components.json +0 -239
- package/appPackages/_master/node_modules/@budibase/standard-components/dist/generators.js +0 -198
- package/appPackages/_master/node_modules/@budibase/standard-components/dist/index.js +0 -3460
- package/appPackages/_master/node_modules/@budibase/standard-components/dist/index.js.map +0 -1
- package/appPackages/_master/node_modules/@budibase/standard-components/package.json +0 -38
- package/appPackages/_master/package-lock.json +0 -247
- package/appPackages/_master/package.json +0 -14
- package/appPackages/_master/pages/main/page.json +0 -199
- package/appPackages/_master/pages/main/screens/Apps List.json +0 -131
- package/appPackages/_master/pages/main/screens/Manage App.json +0 -292
- package/appPackages/_master/pages/main/screens/New App.json +0 -410
- package/appPackages/_master/pages/main/screens/New Instance.json +0 -227
- package/appPackages/_master/pages/unauthenticated/page.json +0 -83
- package/appPackages/_master/plugins.js +0 -3
- package/appPackages/_master/public/_shared/budibase-logo.png +0 -0
- package/appPackages/_master/public/main/budibase-client.js +0 -25115
- package/appPackages/_master/public/main/budibase-client.js.map +0 -1
- package/appPackages/_master/public/main/index.html +0 -48
- package/appPackages/_master/public/main/index.js +0 -3397
- package/appPackages/_master/public/main/index.js.map +0 -1
- package/appPackages/_master/public/unauthenticated/budibase-client.js +0 -25115
- package/appPackages/_master/public/unauthenticated/budibase-client.js.map +0 -1
- package/appPackages/_master/public/unauthenticated/index.html +0 -40
- package/appPackages/_master/public/unauthenticated/index.js +0 -3397
- package/appPackages/_master/public/unauthenticated/index.js.map +0 -1
- package/appPackages/_master/yarn.lock +0 -13
- package/builder/__app.html +0 -22
- package/builder/assets/budibase-emblem-white.svg +0 -29
- package/builder/assets/budibase-logo-only.png +0 -0
- package/builder/assets/budibase-logo-white.png +0 -0
- package/builder/assets/budibase-logo.png +0 -0
- package/builder/assets/javascript-logo.svg +0 -1
- package/builder/assets/roboto-v20-latin-ext_latin-300.woff +0 -0
- package/builder/assets/roboto-v20-latin-ext_latin-300.woff2 +0 -0
- package/builder/assets/roboto-v20-latin-ext_latin-500.woff +0 -0
- package/builder/assets/roboto-v20-latin-ext_latin-500.woff2 +0 -0
- package/builder/assets/roboto-v20-latin-ext_latin-700.woff +0 -0
- package/builder/assets/roboto-v20-latin-ext_latin-700.woff2 +0 -0
- package/builder/assets/roboto-v20-latin-ext_latin-900.woff +0 -0
- package/builder/assets/roboto-v20-latin-ext_latin-900.woff2 +0 -0
- package/builder/assets/roboto-v20-latin-ext_latin-regular.woff +0 -0
- package/builder/assets/roboto-v20-latin-ext_latin-regular.woff2 +0 -0
- package/builder/budibase-client.esm.mjs +0 -24948
- package/builder/budibase.css +0 -120
- package/builder/bundle.css +0 -70
- package/builder/bundle.css.map +0 -146
- package/builder/bundle.js +0 -99294
- package/builder/bundle.js.map +0 -1
- package/builder/codemirror.css +0 -349
- package/builder/favicon.png +0 -0
- package/builder/flatpickr.css +0 -784
- package/builder/fonts.css +0 -47
- package/builder/global.css +0 -111
- package/builder/monokai.css +0 -41
- package/builder/uikit.min.css +0 -1
- package/config.contributors.js +0 -13
- package/config.dev.js +0 -13
- package/config.sample.js +0 -33
- package/index.js +0 -24
- package/initialise/buildAppContext.js +0 -11
- package/initialise/createInstanceDb.js +0 -37
- package/initialise/createMasterDb.js +0 -34
- package/initialise/initialiseBudibase.js +0 -1
- package/initialise/initialiseRuntimePackages.js +0 -42
- package/middleware/routeHandlers/aggregatesPost.js +0 -12
- package/middleware/routeHandlers/appDefault.js +0 -21
- package/middleware/routeHandlers/authenticate.js +0 -15
- package/middleware/routeHandlers/changeMyPassword.js +0 -9
- package/middleware/routeHandlers/createTemporaryAccess.js +0 -17
- package/middleware/routeHandlers/createUser.js +0 -10
- package/middleware/routeHandlers/deleteRecord.js +0 -9
- package/middleware/routeHandlers/disableUser.js +0 -11
- package/middleware/routeHandlers/enableUser.js +0 -6
- package/middleware/routeHandlers/executeAction.js +0 -9
- package/middleware/routeHandlers/getAccessLevels.js +0 -6
- package/middleware/routeHandlers/getRecord.js +0 -15
- package/middleware/routeHandlers/getUsers.js +0 -6
- package/middleware/routeHandlers/helpers.js +0 -15
- package/middleware/routeHandlers/index.js +0 -45
- package/middleware/routeHandlers/listRecordsGet.js +0 -8
- package/middleware/routeHandlers/listRecordsPost.js +0 -12
- package/middleware/routeHandlers/lookupField.js +0 -14
- package/middleware/routeHandlers/postFiles.js +0 -13
- package/middleware/routeHandlers/saveAppHierarchy.js +0 -6
- package/middleware/routeHandlers/saveRecord.js +0 -6
- package/middleware/routeHandlers/setPasswordFromTemporaryCode.js +0 -20
- package/middleware/routeHandlers/upgradeData.js +0 -11
- package/middleware/routers.js +0 -330
- package/middleware/session.js +0 -24
- package/utilities/budibaseApi.js +0 -84
- package/utilities/builder/buildPage.js +0 -164
- package/utilities/builder/componentLibraryInfo.js +0 -77
- package/utilities/builder/convertCssToFiles.js +0 -43
- package/utilities/builder/deleteCodeMeta.js +0 -9
- package/utilities/builder/getPages.js +0 -20
- package/utilities/builder/index.js +0 -165
- package/utilities/builder/index.template.html +0 -44
- package/utilities/builder/listScreens.js +0 -48
- package/utilities/builder/publicPath.js +0 -3
- package/utilities/builder/saveBackend.js +0 -28
- package/utilities/constructHierarchy.js +0 -8
- package/utilities/createAppPackage.js +0 -101
- package/utilities/databaseManager.js +0 -4
- package/utilities/datastore.js +0 -2
- package/utilities/exceptions.js +0 -16
- package/utilities/injectedPlugins/createUser.js +0 -19
- package/utilities/injectedPlugins/disableUser.js +0 -3
- package/utilities/injectedPlugins/enableUser.js +0 -3
- package/utilities/injectedPlugins/index.js +0 -76
- package/utilities/masterAppInternal.js +0 -384
- package/utilities/runtimePackages.js +0 -34
- package/utilities/targzAppPackage.js +0 -119
|
@@ -1,3397 +0,0 @@
|
|
|
1
|
-
function noop() {}
|
|
2
|
-
function assign(tar, src) {
|
|
3
|
-
// @ts-ignore
|
|
4
|
-
for (const k in src) tar[k] = src[k]
|
|
5
|
-
return tar
|
|
6
|
-
}
|
|
7
|
-
function run(fn) {
|
|
8
|
-
return fn()
|
|
9
|
-
}
|
|
10
|
-
function blank_object() {
|
|
11
|
-
return Object.create(null)
|
|
12
|
-
}
|
|
13
|
-
function run_all(fns) {
|
|
14
|
-
fns.forEach(run)
|
|
15
|
-
}
|
|
16
|
-
function is_function(thing) {
|
|
17
|
-
return typeof thing === "function"
|
|
18
|
-
}
|
|
19
|
-
function safe_not_equal(a, b) {
|
|
20
|
-
return a != a
|
|
21
|
-
? b == b
|
|
22
|
-
: a !== b || (a && typeof a === "object") || typeof a === "function"
|
|
23
|
-
}
|
|
24
|
-
function create_slot(definition, ctx, fn) {
|
|
25
|
-
if (definition) {
|
|
26
|
-
const slot_ctx = get_slot_context(definition, ctx, fn)
|
|
27
|
-
return definition[0](slot_ctx)
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
function get_slot_context(definition, ctx, fn) {
|
|
31
|
-
return definition[1]
|
|
32
|
-
? assign({}, assign(ctx.$$scope.ctx, definition[1](fn ? fn(ctx) : {})))
|
|
33
|
-
: ctx.$$scope.ctx
|
|
34
|
-
}
|
|
35
|
-
function get_slot_changes(definition, ctx, changed, fn) {
|
|
36
|
-
return definition[1]
|
|
37
|
-
? assign(
|
|
38
|
-
{},
|
|
39
|
-
assign(ctx.$$scope.changed || {}, definition[1](fn ? fn(changed) : {}))
|
|
40
|
-
)
|
|
41
|
-
: ctx.$$scope.changed || {}
|
|
42
|
-
}
|
|
43
|
-
function null_to_empty(value) {
|
|
44
|
-
return value == null ? "" : value
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
function append(target, node) {
|
|
48
|
-
target.appendChild(node)
|
|
49
|
-
}
|
|
50
|
-
function insert(target, node, anchor) {
|
|
51
|
-
target.insertBefore(node, anchor || null)
|
|
52
|
-
}
|
|
53
|
-
function detach(node) {
|
|
54
|
-
node.parentNode.removeChild(node)
|
|
55
|
-
}
|
|
56
|
-
function destroy_each(iterations, detaching) {
|
|
57
|
-
for (let i = 0; i < iterations.length; i += 1) {
|
|
58
|
-
if (iterations[i]) iterations[i].d(detaching)
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
function element(name) {
|
|
62
|
-
return document.createElement(name)
|
|
63
|
-
}
|
|
64
|
-
function svg_element(name) {
|
|
65
|
-
return document.createElementNS("http://www.w3.org/2000/svg", name)
|
|
66
|
-
}
|
|
67
|
-
function text(data) {
|
|
68
|
-
return document.createTextNode(data)
|
|
69
|
-
}
|
|
70
|
-
function space() {
|
|
71
|
-
return text(" ")
|
|
72
|
-
}
|
|
73
|
-
function empty() {
|
|
74
|
-
return text("")
|
|
75
|
-
}
|
|
76
|
-
function listen(node, event, handler, options) {
|
|
77
|
-
node.addEventListener(event, handler, options)
|
|
78
|
-
return () => node.removeEventListener(event, handler, options)
|
|
79
|
-
}
|
|
80
|
-
function attr(node, attribute, value) {
|
|
81
|
-
if (value == null) node.removeAttribute(attribute)
|
|
82
|
-
else node.setAttribute(attribute, value)
|
|
83
|
-
}
|
|
84
|
-
function children(element) {
|
|
85
|
-
return Array.from(element.childNodes)
|
|
86
|
-
}
|
|
87
|
-
function claim_element(nodes, name, attributes, svg) {
|
|
88
|
-
for (let i = 0; i < nodes.length; i += 1) {
|
|
89
|
-
const node = nodes[i]
|
|
90
|
-
if (node.nodeName === name) {
|
|
91
|
-
for (let j = 0; j < node.attributes.length; j += 1) {
|
|
92
|
-
const attribute = node.attributes[j]
|
|
93
|
-
if (!attributes[attribute.name]) node.removeAttribute(attribute.name)
|
|
94
|
-
}
|
|
95
|
-
return nodes.splice(i, 1)[0] // TODO strip unwanted attributes
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
return svg ? svg_element(name) : element(name)
|
|
99
|
-
}
|
|
100
|
-
function claim_text(nodes, data) {
|
|
101
|
-
for (let i = 0; i < nodes.length; i += 1) {
|
|
102
|
-
const node = nodes[i]
|
|
103
|
-
if (node.nodeType === 3) {
|
|
104
|
-
node.data = "" + data
|
|
105
|
-
return nodes.splice(i, 1)[0]
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
return text(data)
|
|
109
|
-
}
|
|
110
|
-
function claim_space(nodes) {
|
|
111
|
-
return claim_text(nodes, " ")
|
|
112
|
-
}
|
|
113
|
-
function set_data(text, data) {
|
|
114
|
-
data = "" + data
|
|
115
|
-
if (text.data !== data) text.data = data
|
|
116
|
-
}
|
|
117
|
-
function set_input_value(input, value) {
|
|
118
|
-
if (value != null || input.value) {
|
|
119
|
-
input.value = value
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
function set_style(node, key, value, important) {
|
|
123
|
-
node.style.setProperty(key, value, important ? "important" : "")
|
|
124
|
-
}
|
|
125
|
-
function toggle_class(element, name, toggle) {
|
|
126
|
-
element.classList[toggle ? "add" : "remove"](name)
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
let current_component
|
|
130
|
-
function set_current_component(component) {
|
|
131
|
-
current_component = component
|
|
132
|
-
}
|
|
133
|
-
// TODO figure out if we still want to support
|
|
134
|
-
// shorthand events, or if we want to implement
|
|
135
|
-
// a real bubbling mechanism
|
|
136
|
-
function bubble(component, event) {
|
|
137
|
-
const callbacks = component.$$.callbacks[event.type]
|
|
138
|
-
if (callbacks) {
|
|
139
|
-
callbacks.slice().forEach(fn => fn(event))
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
const dirty_components = []
|
|
144
|
-
const binding_callbacks = []
|
|
145
|
-
const render_callbacks = []
|
|
146
|
-
const flush_callbacks = []
|
|
147
|
-
const resolved_promise = Promise.resolve()
|
|
148
|
-
let update_scheduled = false
|
|
149
|
-
function schedule_update() {
|
|
150
|
-
if (!update_scheduled) {
|
|
151
|
-
update_scheduled = true
|
|
152
|
-
resolved_promise.then(flush)
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
function add_render_callback(fn) {
|
|
156
|
-
render_callbacks.push(fn)
|
|
157
|
-
}
|
|
158
|
-
function flush() {
|
|
159
|
-
const seen_callbacks = new Set()
|
|
160
|
-
do {
|
|
161
|
-
// first, call beforeUpdate functions
|
|
162
|
-
// and update components
|
|
163
|
-
while (dirty_components.length) {
|
|
164
|
-
const component = dirty_components.shift()
|
|
165
|
-
set_current_component(component)
|
|
166
|
-
update(component.$$)
|
|
167
|
-
}
|
|
168
|
-
while (binding_callbacks.length) binding_callbacks.pop()()
|
|
169
|
-
// then, once components are updated, call
|
|
170
|
-
// afterUpdate functions. This may cause
|
|
171
|
-
// subsequent updates...
|
|
172
|
-
for (let i = 0; i < render_callbacks.length; i += 1) {
|
|
173
|
-
const callback = render_callbacks[i]
|
|
174
|
-
if (!seen_callbacks.has(callback)) {
|
|
175
|
-
callback()
|
|
176
|
-
// ...so guard against infinite loops
|
|
177
|
-
seen_callbacks.add(callback)
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
render_callbacks.length = 0
|
|
181
|
-
} while (dirty_components.length)
|
|
182
|
-
while (flush_callbacks.length) {
|
|
183
|
-
flush_callbacks.pop()()
|
|
184
|
-
}
|
|
185
|
-
update_scheduled = false
|
|
186
|
-
}
|
|
187
|
-
function update($$) {
|
|
188
|
-
if ($$.fragment) {
|
|
189
|
-
$$.update($$.dirty)
|
|
190
|
-
run_all($$.before_update)
|
|
191
|
-
$$.fragment.p($$.dirty, $$.ctx)
|
|
192
|
-
$$.dirty = null
|
|
193
|
-
$$.after_update.forEach(add_render_callback)
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
const outroing = new Set()
|
|
197
|
-
let outros
|
|
198
|
-
function group_outros() {
|
|
199
|
-
outros = {
|
|
200
|
-
r: 0,
|
|
201
|
-
c: [],
|
|
202
|
-
p: outros, // parent group
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
function check_outros() {
|
|
206
|
-
if (!outros.r) {
|
|
207
|
-
run_all(outros.c)
|
|
208
|
-
}
|
|
209
|
-
outros = outros.p
|
|
210
|
-
}
|
|
211
|
-
function transition_in(block, local) {
|
|
212
|
-
if (block && block.i) {
|
|
213
|
-
outroing.delete(block)
|
|
214
|
-
block.i(local)
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
function transition_out(block, local, detach, callback) {
|
|
218
|
-
if (block && block.o) {
|
|
219
|
-
if (outroing.has(block)) return
|
|
220
|
-
outroing.add(block)
|
|
221
|
-
outros.c.push(() => {
|
|
222
|
-
outroing.delete(block)
|
|
223
|
-
if (callback) {
|
|
224
|
-
if (detach) block.d(1)
|
|
225
|
-
callback()
|
|
226
|
-
}
|
|
227
|
-
})
|
|
228
|
-
block.o(local)
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
const globals = typeof window !== "undefined" ? window : global
|
|
233
|
-
function mount_component(component, target, anchor) {
|
|
234
|
-
const { fragment, on_mount, on_destroy, after_update } = component.$$
|
|
235
|
-
fragment.m(target, anchor)
|
|
236
|
-
// onMount happens before the initial afterUpdate
|
|
237
|
-
add_render_callback(() => {
|
|
238
|
-
const new_on_destroy = on_mount.map(run).filter(is_function)
|
|
239
|
-
if (on_destroy) {
|
|
240
|
-
on_destroy.push(...new_on_destroy)
|
|
241
|
-
} else {
|
|
242
|
-
// Edge case - component was destroyed immediately,
|
|
243
|
-
// most likely as a result of a binding initialising
|
|
244
|
-
run_all(new_on_destroy)
|
|
245
|
-
}
|
|
246
|
-
component.$$.on_mount = []
|
|
247
|
-
})
|
|
248
|
-
after_update.forEach(add_render_callback)
|
|
249
|
-
}
|
|
250
|
-
function destroy_component(component, detaching) {
|
|
251
|
-
if (component.$$.fragment) {
|
|
252
|
-
run_all(component.$$.on_destroy)
|
|
253
|
-
component.$$.fragment.d(detaching)
|
|
254
|
-
// TODO null out other refs, including component.$$ (but need to
|
|
255
|
-
// preserve final state?)
|
|
256
|
-
component.$$.on_destroy = component.$$.fragment = null
|
|
257
|
-
component.$$.ctx = {}
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
function make_dirty(component, key) {
|
|
261
|
-
if (!component.$$.dirty) {
|
|
262
|
-
dirty_components.push(component)
|
|
263
|
-
schedule_update()
|
|
264
|
-
component.$$.dirty = blank_object()
|
|
265
|
-
}
|
|
266
|
-
component.$$.dirty[key] = true
|
|
267
|
-
}
|
|
268
|
-
function init(
|
|
269
|
-
component,
|
|
270
|
-
options,
|
|
271
|
-
instance,
|
|
272
|
-
create_fragment,
|
|
273
|
-
not_equal,
|
|
274
|
-
prop_names
|
|
275
|
-
) {
|
|
276
|
-
const parent_component = current_component
|
|
277
|
-
set_current_component(component)
|
|
278
|
-
const props = options.props || {}
|
|
279
|
-
const $$ = (component.$$ = {
|
|
280
|
-
fragment: null,
|
|
281
|
-
ctx: null,
|
|
282
|
-
// state
|
|
283
|
-
props: prop_names,
|
|
284
|
-
update: noop,
|
|
285
|
-
not_equal,
|
|
286
|
-
bound: blank_object(),
|
|
287
|
-
// lifecycle
|
|
288
|
-
on_mount: [],
|
|
289
|
-
on_destroy: [],
|
|
290
|
-
before_update: [],
|
|
291
|
-
after_update: [],
|
|
292
|
-
context: new Map(parent_component ? parent_component.$$.context : []),
|
|
293
|
-
// everything else
|
|
294
|
-
callbacks: blank_object(),
|
|
295
|
-
dirty: null,
|
|
296
|
-
})
|
|
297
|
-
let ready = false
|
|
298
|
-
$$.ctx = instance
|
|
299
|
-
? instance(component, props, (key, ret, value = ret) => {
|
|
300
|
-
if ($$.ctx && not_equal($$.ctx[key], ($$.ctx[key] = value))) {
|
|
301
|
-
if ($$.bound[key]) $$.bound[key](value)
|
|
302
|
-
if (ready) make_dirty(component, key)
|
|
303
|
-
}
|
|
304
|
-
return ret
|
|
305
|
-
})
|
|
306
|
-
: props
|
|
307
|
-
$$.update()
|
|
308
|
-
ready = true
|
|
309
|
-
run_all($$.before_update)
|
|
310
|
-
$$.fragment = create_fragment($$.ctx)
|
|
311
|
-
if (options.target) {
|
|
312
|
-
if (options.hydrate) {
|
|
313
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
314
|
-
$$.fragment.l(children(options.target))
|
|
315
|
-
} else {
|
|
316
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
317
|
-
$$.fragment.c()
|
|
318
|
-
}
|
|
319
|
-
if (options.intro) transition_in(component.$$.fragment)
|
|
320
|
-
mount_component(component, options.target, options.anchor)
|
|
321
|
-
flush()
|
|
322
|
-
}
|
|
323
|
-
set_current_component(parent_component)
|
|
324
|
-
}
|
|
325
|
-
let SvelteElement
|
|
326
|
-
if (typeof HTMLElement !== "undefined") {
|
|
327
|
-
SvelteElement = class extends HTMLElement {
|
|
328
|
-
constructor() {
|
|
329
|
-
super()
|
|
330
|
-
this.attachShadow({ mode: "open" })
|
|
331
|
-
}
|
|
332
|
-
connectedCallback() {
|
|
333
|
-
// @ts-ignore todo: improve typings
|
|
334
|
-
for (const key in this.$$.slotted) {
|
|
335
|
-
// @ts-ignore todo: improve typings
|
|
336
|
-
this.appendChild(this.$$.slotted[key])
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
attributeChangedCallback(attr, _oldValue, newValue) {
|
|
340
|
-
this[attr] = newValue
|
|
341
|
-
}
|
|
342
|
-
$destroy() {
|
|
343
|
-
destroy_component(this, 1)
|
|
344
|
-
this.$destroy = noop
|
|
345
|
-
}
|
|
346
|
-
$on(type, callback) {
|
|
347
|
-
// TODO should this delegate to addEventListener?
|
|
348
|
-
const callbacks =
|
|
349
|
-
this.$$.callbacks[type] || (this.$$.callbacks[type] = [])
|
|
350
|
-
callbacks.push(callback)
|
|
351
|
-
return () => {
|
|
352
|
-
const index = callbacks.indexOf(callback)
|
|
353
|
-
if (index !== -1) callbacks.splice(index, 1)
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
$set() {
|
|
357
|
-
// overridden by instance, if it has props
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
class SvelteComponent {
|
|
362
|
-
$destroy() {
|
|
363
|
-
destroy_component(this, 1)
|
|
364
|
-
this.$destroy = noop
|
|
365
|
-
}
|
|
366
|
-
$on(type, callback) {
|
|
367
|
-
const callbacks = this.$$.callbacks[type] || (this.$$.callbacks[type] = [])
|
|
368
|
-
callbacks.push(callback)
|
|
369
|
-
return () => {
|
|
370
|
-
const index = callbacks.indexOf(callback)
|
|
371
|
-
if (index !== -1) callbacks.splice(index, 1)
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
$set() {
|
|
375
|
-
// overridden by instance, if it has props
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
/* src\Button.svelte generated by Svelte v3.12.1 */
|
|
380
|
-
|
|
381
|
-
function add_css() {
|
|
382
|
-
var style = element("style")
|
|
383
|
-
style.id = "svelte-1q8lga0-style"
|
|
384
|
-
style.textContent =
|
|
385
|
-
".default.svelte-1q8lga0{font-family:inherit;font-size:inherit;padding:0.4em;margin:0 0 0.5em 0;box-sizing:border-box;border:1px solid #ccc;border-radius:2px;color:#333;background-color:#f4f4f4;outline:none}.default.svelte-1q8lga0:active{background-color:#ddd}.default.svelte-1q8lga0:focus{border-color:#666}"
|
|
386
|
-
append(document.head, style)
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
// (30:4) {:else}
|
|
390
|
-
function create_else_block(ctx) {
|
|
391
|
-
var current
|
|
392
|
-
|
|
393
|
-
const default_slot_template = ctx.$$slots.default
|
|
394
|
-
const default_slot = create_slot(default_slot_template, ctx, null)
|
|
395
|
-
|
|
396
|
-
return {
|
|
397
|
-
c() {
|
|
398
|
-
if (default_slot) default_slot.c()
|
|
399
|
-
},
|
|
400
|
-
|
|
401
|
-
l(nodes) {
|
|
402
|
-
if (default_slot) default_slot.l(nodes)
|
|
403
|
-
},
|
|
404
|
-
|
|
405
|
-
m(target, anchor) {
|
|
406
|
-
if (default_slot) {
|
|
407
|
-
default_slot.m(target, anchor)
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
current = true
|
|
411
|
-
},
|
|
412
|
-
|
|
413
|
-
p(changed, ctx) {
|
|
414
|
-
if (default_slot && default_slot.p && changed.$$scope) {
|
|
415
|
-
default_slot.p(
|
|
416
|
-
get_slot_changes(default_slot_template, ctx, changed, null),
|
|
417
|
-
get_slot_context(default_slot_template, ctx, null)
|
|
418
|
-
)
|
|
419
|
-
}
|
|
420
|
-
},
|
|
421
|
-
|
|
422
|
-
i(local) {
|
|
423
|
-
if (current) return
|
|
424
|
-
transition_in(default_slot, local)
|
|
425
|
-
current = true
|
|
426
|
-
},
|
|
427
|
-
|
|
428
|
-
o(local) {
|
|
429
|
-
transition_out(default_slot, local)
|
|
430
|
-
current = false
|
|
431
|
-
},
|
|
432
|
-
|
|
433
|
-
d(detaching) {
|
|
434
|
-
if (default_slot) default_slot.d(detaching)
|
|
435
|
-
},
|
|
436
|
-
}
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
// (28:26)
|
|
440
|
-
function create_if_block_1(ctx) {
|
|
441
|
-
var t
|
|
442
|
-
|
|
443
|
-
return {
|
|
444
|
-
c() {
|
|
445
|
-
t = text(ctx.contentText)
|
|
446
|
-
},
|
|
447
|
-
|
|
448
|
-
l(nodes) {
|
|
449
|
-
t = claim_text(nodes, ctx.contentText)
|
|
450
|
-
},
|
|
451
|
-
|
|
452
|
-
m(target, anchor) {
|
|
453
|
-
insert(target, t, anchor)
|
|
454
|
-
},
|
|
455
|
-
|
|
456
|
-
p(changed, ctx) {
|
|
457
|
-
if (changed.contentText) {
|
|
458
|
-
set_data(t, ctx.contentText)
|
|
459
|
-
}
|
|
460
|
-
},
|
|
461
|
-
|
|
462
|
-
i: noop,
|
|
463
|
-
o: noop,
|
|
464
|
-
|
|
465
|
-
d(detaching) {
|
|
466
|
-
if (detaching) {
|
|
467
|
-
detach(t)
|
|
468
|
-
}
|
|
469
|
-
},
|
|
470
|
-
}
|
|
471
|
-
}
|
|
472
|
-
|
|
473
|
-
// (25:4) {#if contentComponent && contentComponent._component}
|
|
474
|
-
function create_if_block(ctx) {
|
|
475
|
-
var div
|
|
476
|
-
|
|
477
|
-
return {
|
|
478
|
-
c() {
|
|
479
|
-
div = element("div")
|
|
480
|
-
},
|
|
481
|
-
|
|
482
|
-
l(nodes) {
|
|
483
|
-
div = claim_element(nodes, "DIV", {}, false)
|
|
484
|
-
var div_nodes = children(div)
|
|
485
|
-
|
|
486
|
-
div_nodes.forEach(detach)
|
|
487
|
-
},
|
|
488
|
-
|
|
489
|
-
m(target, anchor) {
|
|
490
|
-
insert(target, div, anchor)
|
|
491
|
-
ctx.div_binding(div)
|
|
492
|
-
},
|
|
493
|
-
|
|
494
|
-
p: noop,
|
|
495
|
-
i: noop,
|
|
496
|
-
o: noop,
|
|
497
|
-
|
|
498
|
-
d(detaching) {
|
|
499
|
-
if (detaching) {
|
|
500
|
-
detach(div)
|
|
501
|
-
}
|
|
502
|
-
|
|
503
|
-
ctx.div_binding(null)
|
|
504
|
-
},
|
|
505
|
-
}
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
function create_fragment(ctx) {
|
|
509
|
-
var button,
|
|
510
|
-
current_block_type_index,
|
|
511
|
-
if_block,
|
|
512
|
-
button_class_value,
|
|
513
|
-
current,
|
|
514
|
-
dispose
|
|
515
|
-
|
|
516
|
-
var if_block_creators = [
|
|
517
|
-
create_if_block,
|
|
518
|
-
create_if_block_1,
|
|
519
|
-
create_else_block,
|
|
520
|
-
]
|
|
521
|
-
|
|
522
|
-
var if_blocks = []
|
|
523
|
-
|
|
524
|
-
function select_block_type(changed, ctx) {
|
|
525
|
-
if (ctx.contentComponent && ctx.contentComponent._component) return 0
|
|
526
|
-
if (ctx.contentText) return 1
|
|
527
|
-
return 2
|
|
528
|
-
}
|
|
529
|
-
|
|
530
|
-
current_block_type_index = select_block_type(null, ctx)
|
|
531
|
-
if_block = if_blocks[current_block_type_index] = if_block_creators[
|
|
532
|
-
current_block_type_index
|
|
533
|
-
](ctx)
|
|
534
|
-
|
|
535
|
-
return {
|
|
536
|
-
c() {
|
|
537
|
-
button = element("button")
|
|
538
|
-
if_block.c()
|
|
539
|
-
this.h()
|
|
540
|
-
},
|
|
541
|
-
|
|
542
|
-
l(nodes) {
|
|
543
|
-
button = claim_element(
|
|
544
|
-
nodes,
|
|
545
|
-
"BUTTON",
|
|
546
|
-
{ class: true, disabled: true },
|
|
547
|
-
false
|
|
548
|
-
)
|
|
549
|
-
var button_nodes = children(button)
|
|
550
|
-
|
|
551
|
-
if_block.l(button_nodes)
|
|
552
|
-
button_nodes.forEach(detach)
|
|
553
|
-
this.h()
|
|
554
|
-
},
|
|
555
|
-
|
|
556
|
-
h() {
|
|
557
|
-
attr(
|
|
558
|
-
button,
|
|
559
|
-
"class",
|
|
560
|
-
(button_class_value =
|
|
561
|
-
"" + null_to_empty(ctx.className) + " svelte-1q8lga0")
|
|
562
|
-
)
|
|
563
|
-
button.disabled = ctx.disabled
|
|
564
|
-
dispose = listen(button, "click", ctx.clickHandler)
|
|
565
|
-
},
|
|
566
|
-
|
|
567
|
-
m(target, anchor) {
|
|
568
|
-
insert(target, button, anchor)
|
|
569
|
-
if_blocks[current_block_type_index].m(button, null)
|
|
570
|
-
current = true
|
|
571
|
-
},
|
|
572
|
-
|
|
573
|
-
p(changed, ctx) {
|
|
574
|
-
var previous_block_index = current_block_type_index
|
|
575
|
-
current_block_type_index = select_block_type(changed, ctx)
|
|
576
|
-
if (current_block_type_index === previous_block_index) {
|
|
577
|
-
if_blocks[current_block_type_index].p(changed, ctx)
|
|
578
|
-
} else {
|
|
579
|
-
group_outros()
|
|
580
|
-
transition_out(if_blocks[previous_block_index], 1, 1, () => {
|
|
581
|
-
if_blocks[previous_block_index] = null
|
|
582
|
-
})
|
|
583
|
-
check_outros()
|
|
584
|
-
|
|
585
|
-
if_block = if_blocks[current_block_type_index]
|
|
586
|
-
if (!if_block) {
|
|
587
|
-
if_block = if_blocks[current_block_type_index] = if_block_creators[
|
|
588
|
-
current_block_type_index
|
|
589
|
-
](ctx)
|
|
590
|
-
if_block.c()
|
|
591
|
-
}
|
|
592
|
-
transition_in(if_block, 1)
|
|
593
|
-
if_block.m(button, null)
|
|
594
|
-
}
|
|
595
|
-
|
|
596
|
-
if (
|
|
597
|
-
(!current || changed.className) &&
|
|
598
|
-
button_class_value !==
|
|
599
|
-
(button_class_value =
|
|
600
|
-
"" + null_to_empty(ctx.className) + " svelte-1q8lga0")
|
|
601
|
-
) {
|
|
602
|
-
attr(button, "class", button_class_value)
|
|
603
|
-
}
|
|
604
|
-
|
|
605
|
-
if (!current || changed.disabled) {
|
|
606
|
-
button.disabled = ctx.disabled
|
|
607
|
-
}
|
|
608
|
-
},
|
|
609
|
-
|
|
610
|
-
i(local) {
|
|
611
|
-
if (current) return
|
|
612
|
-
transition_in(if_block)
|
|
613
|
-
current = true
|
|
614
|
-
},
|
|
615
|
-
|
|
616
|
-
o(local) {
|
|
617
|
-
transition_out(if_block)
|
|
618
|
-
current = false
|
|
619
|
-
},
|
|
620
|
-
|
|
621
|
-
d(detaching) {
|
|
622
|
-
if (detaching) {
|
|
623
|
-
detach(button)
|
|
624
|
-
}
|
|
625
|
-
|
|
626
|
-
if_blocks[current_block_type_index].d()
|
|
627
|
-
dispose()
|
|
628
|
-
},
|
|
629
|
-
}
|
|
630
|
-
}
|
|
631
|
-
|
|
632
|
-
function instance($$self, $$props, $$invalidate) {
|
|
633
|
-
let {
|
|
634
|
-
className = "default",
|
|
635
|
-
disabled = false,
|
|
636
|
-
contentText,
|
|
637
|
-
contentComponent,
|
|
638
|
-
onClick = () => {},
|
|
639
|
-
} = $$props
|
|
640
|
-
|
|
641
|
-
let { _bb } = $$props
|
|
642
|
-
let contentComponentContainer
|
|
643
|
-
|
|
644
|
-
const clickHandler = () => {
|
|
645
|
-
if (onClick) onClick()
|
|
646
|
-
}
|
|
647
|
-
|
|
648
|
-
let { $$slots = {}, $$scope } = $$props
|
|
649
|
-
|
|
650
|
-
function div_binding($$value) {
|
|
651
|
-
binding_callbacks[$$value ? "unshift" : "push"](() => {
|
|
652
|
-
$$invalidate(
|
|
653
|
-
"contentComponentContainer",
|
|
654
|
-
(contentComponentContainer = $$value)
|
|
655
|
-
)
|
|
656
|
-
})
|
|
657
|
-
}
|
|
658
|
-
|
|
659
|
-
$$self.$set = $$props => {
|
|
660
|
-
if ("className" in $$props)
|
|
661
|
-
$$invalidate("className", (className = $$props.className))
|
|
662
|
-
if ("disabled" in $$props)
|
|
663
|
-
$$invalidate("disabled", (disabled = $$props.disabled))
|
|
664
|
-
if ("contentText" in $$props)
|
|
665
|
-
$$invalidate("contentText", (contentText = $$props.contentText))
|
|
666
|
-
if ("contentComponent" in $$props)
|
|
667
|
-
$$invalidate(
|
|
668
|
-
"contentComponent",
|
|
669
|
-
(contentComponent = $$props.contentComponent)
|
|
670
|
-
)
|
|
671
|
-
if ("onClick" in $$props)
|
|
672
|
-
$$invalidate("onClick", (onClick = $$props.onClick))
|
|
673
|
-
if ("_bb" in $$props) $$invalidate("_bb", (_bb = $$props._bb))
|
|
674
|
-
if ("$$scope" in $$props)
|
|
675
|
-
$$invalidate("$$scope", ($$scope = $$props.$$scope))
|
|
676
|
-
}
|
|
677
|
-
|
|
678
|
-
$$self.$$.update = (
|
|
679
|
-
$$dirty = { _bb: 1, contentComponentContainer: 1, contentComponent: 1 }
|
|
680
|
-
) => {
|
|
681
|
-
if (
|
|
682
|
-
$$dirty._bb ||
|
|
683
|
-
$$dirty.contentComponentContainer ||
|
|
684
|
-
$$dirty.contentComponent
|
|
685
|
-
) {
|
|
686
|
-
{
|
|
687
|
-
if (_bb && contentComponentContainer && contentComponent._component)
|
|
688
|
-
_bb.hydrateComponent(contentComponent, contentComponentContainer)
|
|
689
|
-
}
|
|
690
|
-
}
|
|
691
|
-
}
|
|
692
|
-
|
|
693
|
-
return {
|
|
694
|
-
className,
|
|
695
|
-
disabled,
|
|
696
|
-
contentText,
|
|
697
|
-
contentComponent,
|
|
698
|
-
onClick,
|
|
699
|
-
_bb,
|
|
700
|
-
contentComponentContainer,
|
|
701
|
-
clickHandler,
|
|
702
|
-
div_binding,
|
|
703
|
-
$$slots,
|
|
704
|
-
$$scope,
|
|
705
|
-
}
|
|
706
|
-
}
|
|
707
|
-
|
|
708
|
-
class Button extends SvelteComponent {
|
|
709
|
-
constructor(options) {
|
|
710
|
-
super()
|
|
711
|
-
if (!document.getElementById("svelte-1q8lga0-style")) add_css()
|
|
712
|
-
init(this, options, instance, create_fragment, safe_not_equal, [
|
|
713
|
-
"className",
|
|
714
|
-
"disabled",
|
|
715
|
-
"contentText",
|
|
716
|
-
"contentComponent",
|
|
717
|
-
"onClick",
|
|
718
|
-
"_bb",
|
|
719
|
-
])
|
|
720
|
-
}
|
|
721
|
-
}
|
|
722
|
-
|
|
723
|
-
/* src\Textbox.svelte generated by Svelte v3.12.1 */
|
|
724
|
-
|
|
725
|
-
function add_css$1() {
|
|
726
|
-
var style = element("style")
|
|
727
|
-
style.id = "svelte-1ec4wqj-style"
|
|
728
|
-
style.textContent =
|
|
729
|
-
".default.svelte-1ec4wqj{width:100%;font-family:inherit;font-size:inherit;padding:0.4em;margin:0 0 0.5em 0;box-sizing:border-box;border:1px solid #ccc;border-radius:2px;width:100%}.default.svelte-1ec4wqj:disabled{color:#ccc}"
|
|
730
|
-
append(document.head, style)
|
|
731
|
-
}
|
|
732
|
-
|
|
733
|
-
// (32:0) {:else}
|
|
734
|
-
function create_else_block$1(ctx) {
|
|
735
|
-
var input, input_class_value
|
|
736
|
-
|
|
737
|
-
return {
|
|
738
|
-
c() {
|
|
739
|
-
input = element("input")
|
|
740
|
-
this.h()
|
|
741
|
-
},
|
|
742
|
-
|
|
743
|
-
l(nodes) {
|
|
744
|
-
input = claim_element(
|
|
745
|
-
nodes,
|
|
746
|
-
"INPUT",
|
|
747
|
-
{ class: true, type: true, value: true },
|
|
748
|
-
false
|
|
749
|
-
)
|
|
750
|
-
var input_nodes = children(input)
|
|
751
|
-
|
|
752
|
-
input_nodes.forEach(detach)
|
|
753
|
-
this.h()
|
|
754
|
-
},
|
|
755
|
-
|
|
756
|
-
h() {
|
|
757
|
-
attr(
|
|
758
|
-
input,
|
|
759
|
-
"class",
|
|
760
|
-
(input_class_value =
|
|
761
|
-
"" + null_to_empty(ctx.className) + " svelte-1ec4wqj")
|
|
762
|
-
)
|
|
763
|
-
attr(input, "type", "text")
|
|
764
|
-
input.value = ctx.actualValue
|
|
765
|
-
},
|
|
766
|
-
|
|
767
|
-
m(target, anchor) {
|
|
768
|
-
insert(target, input, anchor)
|
|
769
|
-
},
|
|
770
|
-
|
|
771
|
-
p(changed, ctx) {
|
|
772
|
-
if (
|
|
773
|
-
changed.className &&
|
|
774
|
-
input_class_value !==
|
|
775
|
-
(input_class_value =
|
|
776
|
-
"" + null_to_empty(ctx.className) + " svelte-1ec4wqj")
|
|
777
|
-
) {
|
|
778
|
-
attr(input, "class", input_class_value)
|
|
779
|
-
}
|
|
780
|
-
|
|
781
|
-
if (changed.actualValue) {
|
|
782
|
-
input.value = ctx.actualValue
|
|
783
|
-
}
|
|
784
|
-
},
|
|
785
|
-
|
|
786
|
-
d(detaching) {
|
|
787
|
-
if (detaching) {
|
|
788
|
-
detach(input)
|
|
789
|
-
}
|
|
790
|
-
},
|
|
791
|
-
}
|
|
792
|
-
}
|
|
793
|
-
|
|
794
|
-
// (28:0) {#if hideValue}
|
|
795
|
-
function create_if_block$1(ctx) {
|
|
796
|
-
var input, input_class_value, dispose
|
|
797
|
-
|
|
798
|
-
return {
|
|
799
|
-
c() {
|
|
800
|
-
input = element("input")
|
|
801
|
-
this.h()
|
|
802
|
-
},
|
|
803
|
-
|
|
804
|
-
l(nodes) {
|
|
805
|
-
input = claim_element(
|
|
806
|
-
nodes,
|
|
807
|
-
"INPUT",
|
|
808
|
-
{ class: true, type: true, value: true },
|
|
809
|
-
false
|
|
810
|
-
)
|
|
811
|
-
var input_nodes = children(input)
|
|
812
|
-
|
|
813
|
-
input_nodes.forEach(detach)
|
|
814
|
-
this.h()
|
|
815
|
-
},
|
|
816
|
-
|
|
817
|
-
h() {
|
|
818
|
-
attr(
|
|
819
|
-
input,
|
|
820
|
-
"class",
|
|
821
|
-
(input_class_value =
|
|
822
|
-
"" + null_to_empty(ctx.className) + " svelte-1ec4wqj")
|
|
823
|
-
)
|
|
824
|
-
attr(input, "type", "password")
|
|
825
|
-
input.value = ctx.actualValue
|
|
826
|
-
dispose = listen(input, "change", ctx.change_handler)
|
|
827
|
-
},
|
|
828
|
-
|
|
829
|
-
m(target, anchor) {
|
|
830
|
-
insert(target, input, anchor)
|
|
831
|
-
},
|
|
832
|
-
|
|
833
|
-
p(changed, ctx) {
|
|
834
|
-
if (
|
|
835
|
-
changed.className &&
|
|
836
|
-
input_class_value !==
|
|
837
|
-
(input_class_value =
|
|
838
|
-
"" + null_to_empty(ctx.className) + " svelte-1ec4wqj")
|
|
839
|
-
) {
|
|
840
|
-
attr(input, "class", input_class_value)
|
|
841
|
-
}
|
|
842
|
-
|
|
843
|
-
if (changed.actualValue) {
|
|
844
|
-
input.value = ctx.actualValue
|
|
845
|
-
}
|
|
846
|
-
},
|
|
847
|
-
|
|
848
|
-
d(detaching) {
|
|
849
|
-
if (detaching) {
|
|
850
|
-
detach(input)
|
|
851
|
-
}
|
|
852
|
-
|
|
853
|
-
dispose()
|
|
854
|
-
},
|
|
855
|
-
}
|
|
856
|
-
}
|
|
857
|
-
|
|
858
|
-
function create_fragment$1(ctx) {
|
|
859
|
-
var if_block_anchor
|
|
860
|
-
|
|
861
|
-
function select_block_type(changed, ctx) {
|
|
862
|
-
if (ctx.hideValue) return create_if_block$1
|
|
863
|
-
return create_else_block$1
|
|
864
|
-
}
|
|
865
|
-
|
|
866
|
-
var current_block_type = select_block_type(null, ctx)
|
|
867
|
-
var if_block = current_block_type(ctx)
|
|
868
|
-
|
|
869
|
-
return {
|
|
870
|
-
c() {
|
|
871
|
-
if_block.c()
|
|
872
|
-
if_block_anchor = empty()
|
|
873
|
-
},
|
|
874
|
-
|
|
875
|
-
l(nodes) {
|
|
876
|
-
if_block.l(nodes)
|
|
877
|
-
if_block_anchor = empty()
|
|
878
|
-
},
|
|
879
|
-
|
|
880
|
-
m(target, anchor) {
|
|
881
|
-
if_block.m(target, anchor)
|
|
882
|
-
insert(target, if_block_anchor, anchor)
|
|
883
|
-
},
|
|
884
|
-
|
|
885
|
-
p(changed, ctx) {
|
|
886
|
-
if (
|
|
887
|
-
current_block_type ===
|
|
888
|
-
(current_block_type = select_block_type(changed, ctx)) &&
|
|
889
|
-
if_block
|
|
890
|
-
) {
|
|
891
|
-
if_block.p(changed, ctx)
|
|
892
|
-
} else {
|
|
893
|
-
if_block.d(1)
|
|
894
|
-
if_block = current_block_type(ctx)
|
|
895
|
-
if (if_block) {
|
|
896
|
-
if_block.c()
|
|
897
|
-
if_block.m(if_block_anchor.parentNode, if_block_anchor)
|
|
898
|
-
}
|
|
899
|
-
}
|
|
900
|
-
},
|
|
901
|
-
|
|
902
|
-
i: noop,
|
|
903
|
-
o: noop,
|
|
904
|
-
|
|
905
|
-
d(detaching) {
|
|
906
|
-
if_block.d(detaching)
|
|
907
|
-
|
|
908
|
-
if (detaching) {
|
|
909
|
-
detach(if_block_anchor)
|
|
910
|
-
}
|
|
911
|
-
},
|
|
912
|
-
}
|
|
913
|
-
}
|
|
914
|
-
|
|
915
|
-
function instance$1($$self, $$props, $$invalidate) {
|
|
916
|
-
let { value = "", hideValue = false, className = "default", _bb } = $$props
|
|
917
|
-
|
|
918
|
-
let actualValue = ""
|
|
919
|
-
|
|
920
|
-
function change_handler(event) {
|
|
921
|
-
bubble($$self, event)
|
|
922
|
-
}
|
|
923
|
-
|
|
924
|
-
$$self.$set = $$props => {
|
|
925
|
-
if ("value" in $$props) $$invalidate("value", (value = $$props.value))
|
|
926
|
-
if ("hideValue" in $$props)
|
|
927
|
-
$$invalidate("hideValue", (hideValue = $$props.hideValue))
|
|
928
|
-
if ("className" in $$props)
|
|
929
|
-
$$invalidate("className", (className = $$props.className))
|
|
930
|
-
if ("_bb" in $$props) $$invalidate("_bb", (_bb = $$props._bb))
|
|
931
|
-
}
|
|
932
|
-
|
|
933
|
-
$$self.$$.update = ($$dirty = { _bb: 1, value: 1 }) => {
|
|
934
|
-
if ($$dirty._bb || $$dirty.value) {
|
|
935
|
-
{
|
|
936
|
-
if (_bb && value._isstate) {
|
|
937
|
-
_bb.store.subscribe(s => {
|
|
938
|
-
$$invalidate(
|
|
939
|
-
"actualValue",
|
|
940
|
-
(actualValue = _bb.store.getValue(s, value))
|
|
941
|
-
)
|
|
942
|
-
})
|
|
943
|
-
}
|
|
944
|
-
}
|
|
945
|
-
}
|
|
946
|
-
}
|
|
947
|
-
|
|
948
|
-
return {
|
|
949
|
-
value,
|
|
950
|
-
hideValue,
|
|
951
|
-
className,
|
|
952
|
-
_bb,
|
|
953
|
-
actualValue,
|
|
954
|
-
change_handler,
|
|
955
|
-
}
|
|
956
|
-
}
|
|
957
|
-
|
|
958
|
-
class Textbox extends SvelteComponent {
|
|
959
|
-
constructor(options) {
|
|
960
|
-
super()
|
|
961
|
-
if (!document.getElementById("svelte-1ec4wqj-style")) add_css$1()
|
|
962
|
-
init(this, options, instance$1, create_fragment$1, safe_not_equal, [
|
|
963
|
-
"value",
|
|
964
|
-
"hideValue",
|
|
965
|
-
"className",
|
|
966
|
-
"_bb",
|
|
967
|
-
])
|
|
968
|
-
}
|
|
969
|
-
}
|
|
970
|
-
|
|
971
|
-
/* src\Form.svelte generated by Svelte v3.12.1 */
|
|
972
|
-
|
|
973
|
-
function add_css$2() {
|
|
974
|
-
var style = element("style")
|
|
975
|
-
style.id = "svelte-m9d6ue-style"
|
|
976
|
-
style.textContent =
|
|
977
|
-
".form-root.svelte-m9d6ue{display:grid;grid-template-columns:[label] auto [control] 1fr}.label.svelte-m9d6ue{grid-column-start:label;padding:5px 10px;vertical-align:middle}.control.svelte-m9d6ue{grid-column-start:control;padding:5px 10px}.overflow.svelte-m9d6ue{grid-column-start:overflow}.full-width.svelte-m9d6ue{width:100%}"
|
|
978
|
-
append(document.head, style)
|
|
979
|
-
}
|
|
980
|
-
|
|
981
|
-
function get_each_context(ctx, list, i) {
|
|
982
|
-
const child_ctx = Object.create(ctx)
|
|
983
|
-
child_ctx.child = list[i]
|
|
984
|
-
child_ctx.index = i
|
|
985
|
-
return child_ctx
|
|
986
|
-
}
|
|
987
|
-
|
|
988
|
-
// (30:4) {#each formControls as child, index}
|
|
989
|
-
function create_each_block(ctx) {
|
|
990
|
-
var div0,
|
|
991
|
-
t0_value = ctx.labels[ctx.index] + "",
|
|
992
|
-
t0,
|
|
993
|
-
t1,
|
|
994
|
-
div1,
|
|
995
|
-
index = ctx.index
|
|
996
|
-
|
|
997
|
-
const assign_div1 = () => ctx.div1_binding(div1, index)
|
|
998
|
-
const unassign_div1 = () => ctx.div1_binding(null, index)
|
|
999
|
-
|
|
1000
|
-
return {
|
|
1001
|
-
c() {
|
|
1002
|
-
div0 = element("div")
|
|
1003
|
-
t0 = text(t0_value)
|
|
1004
|
-
t1 = space()
|
|
1005
|
-
div1 = element("div")
|
|
1006
|
-
this.h()
|
|
1007
|
-
},
|
|
1008
|
-
|
|
1009
|
-
l(nodes) {
|
|
1010
|
-
div0 = claim_element(nodes, "DIV", { class: true }, false)
|
|
1011
|
-
var div0_nodes = children(div0)
|
|
1012
|
-
|
|
1013
|
-
t0 = claim_text(div0_nodes, t0_value)
|
|
1014
|
-
div0_nodes.forEach(detach)
|
|
1015
|
-
t1 = claim_space(nodes)
|
|
1016
|
-
|
|
1017
|
-
div1 = claim_element(nodes, "DIV", { class: true }, false)
|
|
1018
|
-
var div1_nodes = children(div1)
|
|
1019
|
-
|
|
1020
|
-
div1_nodes.forEach(detach)
|
|
1021
|
-
this.h()
|
|
1022
|
-
},
|
|
1023
|
-
|
|
1024
|
-
h() {
|
|
1025
|
-
attr(div0, "class", "label svelte-m9d6ue")
|
|
1026
|
-
attr(div1, "class", "control svelte-m9d6ue")
|
|
1027
|
-
},
|
|
1028
|
-
|
|
1029
|
-
m(target, anchor) {
|
|
1030
|
-
insert(target, div0, anchor)
|
|
1031
|
-
append(div0, t0)
|
|
1032
|
-
insert(target, t1, anchor)
|
|
1033
|
-
insert(target, div1, anchor)
|
|
1034
|
-
assign_div1()
|
|
1035
|
-
},
|
|
1036
|
-
|
|
1037
|
-
p(changed, new_ctx) {
|
|
1038
|
-
ctx = new_ctx
|
|
1039
|
-
if (
|
|
1040
|
-
changed.labels &&
|
|
1041
|
-
t0_value !== (t0_value = ctx.labels[ctx.index] + "")
|
|
1042
|
-
) {
|
|
1043
|
-
set_data(t0, t0_value)
|
|
1044
|
-
}
|
|
1045
|
-
|
|
1046
|
-
if (index !== ctx.index) {
|
|
1047
|
-
unassign_div1()
|
|
1048
|
-
index = ctx.index
|
|
1049
|
-
assign_div1()
|
|
1050
|
-
}
|
|
1051
|
-
},
|
|
1052
|
-
|
|
1053
|
-
d(detaching) {
|
|
1054
|
-
if (detaching) {
|
|
1055
|
-
detach(div0)
|
|
1056
|
-
detach(t1)
|
|
1057
|
-
detach(div1)
|
|
1058
|
-
}
|
|
1059
|
-
|
|
1060
|
-
unassign_div1()
|
|
1061
|
-
},
|
|
1062
|
-
}
|
|
1063
|
-
}
|
|
1064
|
-
|
|
1065
|
-
function create_fragment$2(ctx) {
|
|
1066
|
-
var div, div_class_value
|
|
1067
|
-
|
|
1068
|
-
let each_value = ctx.formControls
|
|
1069
|
-
|
|
1070
|
-
let each_blocks = []
|
|
1071
|
-
|
|
1072
|
-
for (let i = 0; i < each_value.length; i += 1) {
|
|
1073
|
-
each_blocks[i] = create_each_block(get_each_context(ctx, each_value, i))
|
|
1074
|
-
}
|
|
1075
|
-
|
|
1076
|
-
return {
|
|
1077
|
-
c() {
|
|
1078
|
-
div = element("div")
|
|
1079
|
-
|
|
1080
|
-
for (let i = 0; i < each_blocks.length; i += 1) {
|
|
1081
|
-
each_blocks[i].c()
|
|
1082
|
-
}
|
|
1083
|
-
this.h()
|
|
1084
|
-
},
|
|
1085
|
-
|
|
1086
|
-
l(nodes) {
|
|
1087
|
-
div = claim_element(nodes, "DIV", { class: true }, false)
|
|
1088
|
-
var div_nodes = children(div)
|
|
1089
|
-
|
|
1090
|
-
for (let i = 0; i < each_blocks.length; i += 1) {
|
|
1091
|
-
each_blocks[i].l(div_nodes)
|
|
1092
|
-
}
|
|
1093
|
-
|
|
1094
|
-
div_nodes.forEach(detach)
|
|
1095
|
-
this.h()
|
|
1096
|
-
},
|
|
1097
|
-
|
|
1098
|
-
h() {
|
|
1099
|
-
attr(
|
|
1100
|
-
div,
|
|
1101
|
-
"class",
|
|
1102
|
-
(div_class_value = "form-root " + ctx.containerClass + " svelte-m9d6ue")
|
|
1103
|
-
)
|
|
1104
|
-
},
|
|
1105
|
-
|
|
1106
|
-
m(target, anchor) {
|
|
1107
|
-
insert(target, div, anchor)
|
|
1108
|
-
|
|
1109
|
-
for (let i = 0; i < each_blocks.length; i += 1) {
|
|
1110
|
-
each_blocks[i].m(div, null)
|
|
1111
|
-
}
|
|
1112
|
-
},
|
|
1113
|
-
|
|
1114
|
-
p(changed, ctx) {
|
|
1115
|
-
if (changed.htmlElements || changed.labels || changed.formControls) {
|
|
1116
|
-
each_value = ctx.formControls
|
|
1117
|
-
|
|
1118
|
-
let i
|
|
1119
|
-
for (i = 0; i < each_value.length; i += 1) {
|
|
1120
|
-
const child_ctx = get_each_context(ctx, each_value, i)
|
|
1121
|
-
|
|
1122
|
-
if (each_blocks[i]) {
|
|
1123
|
-
each_blocks[i].p(changed, child_ctx)
|
|
1124
|
-
} else {
|
|
1125
|
-
each_blocks[i] = create_each_block(child_ctx)
|
|
1126
|
-
each_blocks[i].c()
|
|
1127
|
-
each_blocks[i].m(div, null)
|
|
1128
|
-
}
|
|
1129
|
-
}
|
|
1130
|
-
|
|
1131
|
-
for (; i < each_blocks.length; i += 1) {
|
|
1132
|
-
each_blocks[i].d(1)
|
|
1133
|
-
}
|
|
1134
|
-
each_blocks.length = each_value.length
|
|
1135
|
-
}
|
|
1136
|
-
|
|
1137
|
-
if (
|
|
1138
|
-
changed.containerClass &&
|
|
1139
|
-
div_class_value !==
|
|
1140
|
-
(div_class_value =
|
|
1141
|
-
"form-root " + ctx.containerClass + " svelte-m9d6ue")
|
|
1142
|
-
) {
|
|
1143
|
-
attr(div, "class", div_class_value)
|
|
1144
|
-
}
|
|
1145
|
-
},
|
|
1146
|
-
|
|
1147
|
-
i: noop,
|
|
1148
|
-
o: noop,
|
|
1149
|
-
|
|
1150
|
-
d(detaching) {
|
|
1151
|
-
if (detaching) {
|
|
1152
|
-
detach(div)
|
|
1153
|
-
}
|
|
1154
|
-
|
|
1155
|
-
destroy_each(each_blocks, detaching)
|
|
1156
|
-
},
|
|
1157
|
-
}
|
|
1158
|
-
}
|
|
1159
|
-
|
|
1160
|
-
function instance$2($$self, $$props, $$invalidate) {
|
|
1161
|
-
let { containerClass = "", formControls = [], _bb } = $$props
|
|
1162
|
-
|
|
1163
|
-
let htmlElements = {}
|
|
1164
|
-
let labels = {}
|
|
1165
|
-
|
|
1166
|
-
function div1_binding($$value, index) {
|
|
1167
|
-
if (htmlElements[index] === $$value) return
|
|
1168
|
-
binding_callbacks[$$value ? "unshift" : "push"](() => {
|
|
1169
|
-
htmlElements[index] = $$value
|
|
1170
|
-
$$invalidate("htmlElements", htmlElements)
|
|
1171
|
-
})
|
|
1172
|
-
}
|
|
1173
|
-
|
|
1174
|
-
$$self.$set = $$props => {
|
|
1175
|
-
if ("containerClass" in $$props)
|
|
1176
|
-
$$invalidate("containerClass", (containerClass = $$props.containerClass))
|
|
1177
|
-
if ("formControls" in $$props)
|
|
1178
|
-
$$invalidate("formControls", (formControls = $$props.formControls))
|
|
1179
|
-
if ("_bb" in $$props) $$invalidate("_bb", (_bb = $$props._bb))
|
|
1180
|
-
}
|
|
1181
|
-
|
|
1182
|
-
$$self.$$.update = (
|
|
1183
|
-
$$dirty = { formControls: 1, _bb: 1, htmlElements: 1 }
|
|
1184
|
-
) => {
|
|
1185
|
-
if ($$dirty.formControls || $$dirty._bb || $$dirty.htmlElements) {
|
|
1186
|
-
{
|
|
1187
|
-
let cIndex = 0
|
|
1188
|
-
for (let c of formControls) {
|
|
1189
|
-
$$invalidate("labels", (labels[cIndex] = c.label), labels)
|
|
1190
|
-
cIndex++
|
|
1191
|
-
}
|
|
1192
|
-
|
|
1193
|
-
if (_bb && htmlElements) {
|
|
1194
|
-
for (let el in htmlElements) {
|
|
1195
|
-
_bb.hydrateComponent(formControls[el].control, htmlElements[el])
|
|
1196
|
-
}
|
|
1197
|
-
}
|
|
1198
|
-
}
|
|
1199
|
-
}
|
|
1200
|
-
}
|
|
1201
|
-
|
|
1202
|
-
return {
|
|
1203
|
-
containerClass,
|
|
1204
|
-
formControls,
|
|
1205
|
-
_bb,
|
|
1206
|
-
htmlElements,
|
|
1207
|
-
labels,
|
|
1208
|
-
div1_binding,
|
|
1209
|
-
}
|
|
1210
|
-
}
|
|
1211
|
-
|
|
1212
|
-
class Form extends SvelteComponent {
|
|
1213
|
-
constructor(options) {
|
|
1214
|
-
super()
|
|
1215
|
-
if (!document.getElementById("svelte-m9d6ue-style")) add_css$2()
|
|
1216
|
-
init(this, options, instance$2, create_fragment$2, safe_not_equal, [
|
|
1217
|
-
"containerClass",
|
|
1218
|
-
"formControls",
|
|
1219
|
-
"_bb",
|
|
1220
|
-
])
|
|
1221
|
-
}
|
|
1222
|
-
}
|
|
1223
|
-
|
|
1224
|
-
/* src\Login.svelte generated by Svelte v3.12.1 */
|
|
1225
|
-
|
|
1226
|
-
function add_css$3() {
|
|
1227
|
-
var style = element("style")
|
|
1228
|
-
style.id = "svelte-crnq0a-style"
|
|
1229
|
-
style.textContent =
|
|
1230
|
-
".root.svelte-crnq0a{height:100%;display:grid;grid-template-columns:[left] 1fr [middle] auto [right] 1fr;grid-template-rows:[top] 1fr [center] auto [bottom] 1fr}.content.svelte-crnq0a{grid-column-start:middle;grid-row-start:center;width:400px}.logo-container.svelte-crnq0a{margin-bottom:20px\n}.logo-container.svelte-crnq0a>img.svelte-crnq0a{max-width:100%}.login-button-container.svelte-crnq0a{text-align:right;margin-top:20px}.incorrect-details-panel.svelte-crnq0a{margin-top:30px;padding:10px;border-style:solid;border-width:1px;border-color:maroon;border-radius:1px;text-align:center;color:maroon;background-color:mistyrose}.form-root.svelte-crnq0a{display:grid;grid-template-columns:[label] auto [control] 1fr}.label.svelte-crnq0a{grid-column-start:label;padding:5px 10px;vertical-align:middle}.control.svelte-crnq0a{grid-column-start:control;padding:5px 10px}.default-input.svelte-crnq0a{font-family:inherit;font-size:inherit;padding:0.4em;margin:0 0 0.5em 0;box-sizing:border-box;border:1px solid #ccc;border-radius:2px;width:100%}.default-button.svelte-crnq0a{font-family:inherit;font-size:inherit;padding:0.4em;margin:0 0 0.5em 0;box-sizing:border-box;border:1px solid #ccc;border-radius:2px;color:#333;background-color:#f4f4f4;outline:none}.default-button.svelte-crnq0a:active{background-color:#ddd}.default-button.svelte-crnq0a:focus{border-color:#666}"
|
|
1231
|
-
append(document.head, style)
|
|
1232
|
-
}
|
|
1233
|
-
|
|
1234
|
-
// (57:8) {#if _logo}
|
|
1235
|
-
function create_if_block_1$1(ctx) {
|
|
1236
|
-
var div, img
|
|
1237
|
-
|
|
1238
|
-
return {
|
|
1239
|
-
c() {
|
|
1240
|
-
div = element("div")
|
|
1241
|
-
img = element("img")
|
|
1242
|
-
this.h()
|
|
1243
|
-
},
|
|
1244
|
-
|
|
1245
|
-
l(nodes) {
|
|
1246
|
-
div = claim_element(nodes, "DIV", { class: true }, false)
|
|
1247
|
-
var div_nodes = children(div)
|
|
1248
|
-
|
|
1249
|
-
img = claim_element(
|
|
1250
|
-
div_nodes,
|
|
1251
|
-
"IMG",
|
|
1252
|
-
{ src: true, alt: true, class: true },
|
|
1253
|
-
false
|
|
1254
|
-
)
|
|
1255
|
-
var img_nodes = children(img)
|
|
1256
|
-
|
|
1257
|
-
img_nodes.forEach(detach)
|
|
1258
|
-
div_nodes.forEach(detach)
|
|
1259
|
-
this.h()
|
|
1260
|
-
},
|
|
1261
|
-
|
|
1262
|
-
h() {
|
|
1263
|
-
attr(img, "src", ctx._logo)
|
|
1264
|
-
attr(img, "alt", "logo")
|
|
1265
|
-
attr(img, "class", "svelte-crnq0a")
|
|
1266
|
-
attr(div, "class", "logo-container svelte-crnq0a")
|
|
1267
|
-
},
|
|
1268
|
-
|
|
1269
|
-
m(target, anchor) {
|
|
1270
|
-
insert(target, div, anchor)
|
|
1271
|
-
append(div, img)
|
|
1272
|
-
},
|
|
1273
|
-
|
|
1274
|
-
p(changed, ctx) {
|
|
1275
|
-
if (changed._logo) {
|
|
1276
|
-
attr(img, "src", ctx._logo)
|
|
1277
|
-
}
|
|
1278
|
-
},
|
|
1279
|
-
|
|
1280
|
-
d(detaching) {
|
|
1281
|
-
if (detaching) {
|
|
1282
|
-
detach(div)
|
|
1283
|
-
}
|
|
1284
|
-
},
|
|
1285
|
-
}
|
|
1286
|
-
}
|
|
1287
|
-
|
|
1288
|
-
// (86:8) {#if incorrect}
|
|
1289
|
-
function create_if_block$2(ctx) {
|
|
1290
|
-
var div, t
|
|
1291
|
-
|
|
1292
|
-
return {
|
|
1293
|
-
c() {
|
|
1294
|
-
div = element("div")
|
|
1295
|
-
t = text("Incorrect username or password")
|
|
1296
|
-
this.h()
|
|
1297
|
-
},
|
|
1298
|
-
|
|
1299
|
-
l(nodes) {
|
|
1300
|
-
div = claim_element(nodes, "DIV", { class: true }, false)
|
|
1301
|
-
var div_nodes = children(div)
|
|
1302
|
-
|
|
1303
|
-
t = claim_text(div_nodes, "Incorrect username or password")
|
|
1304
|
-
div_nodes.forEach(detach)
|
|
1305
|
-
this.h()
|
|
1306
|
-
},
|
|
1307
|
-
|
|
1308
|
-
h() {
|
|
1309
|
-
attr(div, "class", "incorrect-details-panel svelte-crnq0a")
|
|
1310
|
-
},
|
|
1311
|
-
|
|
1312
|
-
m(target, anchor) {
|
|
1313
|
-
insert(target, div, anchor)
|
|
1314
|
-
append(div, t)
|
|
1315
|
-
},
|
|
1316
|
-
|
|
1317
|
-
d(detaching) {
|
|
1318
|
-
if (detaching) {
|
|
1319
|
-
detach(div)
|
|
1320
|
-
}
|
|
1321
|
-
},
|
|
1322
|
-
}
|
|
1323
|
-
}
|
|
1324
|
-
|
|
1325
|
-
function create_fragment$3(ctx) {
|
|
1326
|
-
var div7,
|
|
1327
|
-
div6,
|
|
1328
|
-
t0,
|
|
1329
|
-
div4,
|
|
1330
|
-
div0,
|
|
1331
|
-
t1,
|
|
1332
|
-
t2,
|
|
1333
|
-
div1,
|
|
1334
|
-
input0,
|
|
1335
|
-
input0_class_value,
|
|
1336
|
-
t3,
|
|
1337
|
-
div2,
|
|
1338
|
-
t4,
|
|
1339
|
-
t5,
|
|
1340
|
-
div3,
|
|
1341
|
-
input1,
|
|
1342
|
-
input1_class_value,
|
|
1343
|
-
t6,
|
|
1344
|
-
div5,
|
|
1345
|
-
button,
|
|
1346
|
-
t7,
|
|
1347
|
-
button_class_value,
|
|
1348
|
-
t8,
|
|
1349
|
-
dispose
|
|
1350
|
-
|
|
1351
|
-
var if_block0 = ctx._logo && create_if_block_1$1(ctx)
|
|
1352
|
-
|
|
1353
|
-
var if_block1 = ctx.incorrect && create_if_block$2()
|
|
1354
|
-
|
|
1355
|
-
return {
|
|
1356
|
-
c() {
|
|
1357
|
-
div7 = element("div")
|
|
1358
|
-
div6 = element("div")
|
|
1359
|
-
if (if_block0) if_block0.c()
|
|
1360
|
-
t0 = space()
|
|
1361
|
-
div4 = element("div")
|
|
1362
|
-
div0 = element("div")
|
|
1363
|
-
t1 = text(ctx.usernameLabel)
|
|
1364
|
-
t2 = space()
|
|
1365
|
-
div1 = element("div")
|
|
1366
|
-
input0 = element("input")
|
|
1367
|
-
t3 = space()
|
|
1368
|
-
div2 = element("div")
|
|
1369
|
-
t4 = text(ctx.passwordLabel)
|
|
1370
|
-
t5 = space()
|
|
1371
|
-
div3 = element("div")
|
|
1372
|
-
input1 = element("input")
|
|
1373
|
-
t6 = space()
|
|
1374
|
-
div5 = element("div")
|
|
1375
|
-
button = element("button")
|
|
1376
|
-
t7 = text(ctx.loginButtonLabel)
|
|
1377
|
-
t8 = space()
|
|
1378
|
-
if (if_block1) if_block1.c()
|
|
1379
|
-
this.h()
|
|
1380
|
-
},
|
|
1381
|
-
|
|
1382
|
-
l(nodes) {
|
|
1383
|
-
div7 = claim_element(nodes, "DIV", { class: true }, false)
|
|
1384
|
-
var div7_nodes = children(div7)
|
|
1385
|
-
|
|
1386
|
-
div6 = claim_element(div7_nodes, "DIV", { class: true }, false)
|
|
1387
|
-
var div6_nodes = children(div6)
|
|
1388
|
-
|
|
1389
|
-
if (if_block0) if_block0.l(div6_nodes)
|
|
1390
|
-
t0 = claim_space(div6_nodes)
|
|
1391
|
-
|
|
1392
|
-
div4 = claim_element(div6_nodes, "DIV", { class: true }, false)
|
|
1393
|
-
var div4_nodes = children(div4)
|
|
1394
|
-
|
|
1395
|
-
div0 = claim_element(div4_nodes, "DIV", { class: true }, false)
|
|
1396
|
-
var div0_nodes = children(div0)
|
|
1397
|
-
|
|
1398
|
-
t1 = claim_text(div0_nodes, ctx.usernameLabel)
|
|
1399
|
-
div0_nodes.forEach(detach)
|
|
1400
|
-
t2 = claim_space(div4_nodes)
|
|
1401
|
-
|
|
1402
|
-
div1 = claim_element(div4_nodes, "DIV", { class: true }, false)
|
|
1403
|
-
var div1_nodes = children(div1)
|
|
1404
|
-
|
|
1405
|
-
input0 = claim_element(
|
|
1406
|
-
div1_nodes,
|
|
1407
|
-
"INPUT",
|
|
1408
|
-
{ type: true, class: true },
|
|
1409
|
-
false
|
|
1410
|
-
)
|
|
1411
|
-
var input0_nodes = children(input0)
|
|
1412
|
-
|
|
1413
|
-
input0_nodes.forEach(detach)
|
|
1414
|
-
div1_nodes.forEach(detach)
|
|
1415
|
-
t3 = claim_space(div4_nodes)
|
|
1416
|
-
|
|
1417
|
-
div2 = claim_element(div4_nodes, "DIV", { class: true }, false)
|
|
1418
|
-
var div2_nodes = children(div2)
|
|
1419
|
-
|
|
1420
|
-
t4 = claim_text(div2_nodes, ctx.passwordLabel)
|
|
1421
|
-
div2_nodes.forEach(detach)
|
|
1422
|
-
t5 = claim_space(div4_nodes)
|
|
1423
|
-
|
|
1424
|
-
div3 = claim_element(div4_nodes, "DIV", { class: true }, false)
|
|
1425
|
-
var div3_nodes = children(div3)
|
|
1426
|
-
|
|
1427
|
-
input1 = claim_element(
|
|
1428
|
-
div3_nodes,
|
|
1429
|
-
"INPUT",
|
|
1430
|
-
{ type: true, class: true },
|
|
1431
|
-
false
|
|
1432
|
-
)
|
|
1433
|
-
var input1_nodes = children(input1)
|
|
1434
|
-
|
|
1435
|
-
input1_nodes.forEach(detach)
|
|
1436
|
-
div3_nodes.forEach(detach)
|
|
1437
|
-
div4_nodes.forEach(detach)
|
|
1438
|
-
t6 = claim_space(div6_nodes)
|
|
1439
|
-
|
|
1440
|
-
div5 = claim_element(div6_nodes, "DIV", { class: true }, false)
|
|
1441
|
-
var div5_nodes = children(div5)
|
|
1442
|
-
|
|
1443
|
-
button = claim_element(
|
|
1444
|
-
div5_nodes,
|
|
1445
|
-
"BUTTON",
|
|
1446
|
-
{ disabled: true, class: true },
|
|
1447
|
-
false
|
|
1448
|
-
)
|
|
1449
|
-
var button_nodes = children(button)
|
|
1450
|
-
|
|
1451
|
-
t7 = claim_text(button_nodes, ctx.loginButtonLabel)
|
|
1452
|
-
button_nodes.forEach(detach)
|
|
1453
|
-
div5_nodes.forEach(detach)
|
|
1454
|
-
t8 = claim_space(div6_nodes)
|
|
1455
|
-
if (if_block1) if_block1.l(div6_nodes)
|
|
1456
|
-
div6_nodes.forEach(detach)
|
|
1457
|
-
div7_nodes.forEach(detach)
|
|
1458
|
-
this.h()
|
|
1459
|
-
},
|
|
1460
|
-
|
|
1461
|
-
h() {
|
|
1462
|
-
attr(div0, "class", "label svelte-crnq0a")
|
|
1463
|
-
attr(input0, "type", "text")
|
|
1464
|
-
attr(
|
|
1465
|
-
input0,
|
|
1466
|
-
"class",
|
|
1467
|
-
(input0_class_value =
|
|
1468
|
-
"" + null_to_empty(ctx._inputClass) + " svelte-crnq0a")
|
|
1469
|
-
)
|
|
1470
|
-
attr(div1, "class", "control svelte-crnq0a")
|
|
1471
|
-
attr(div2, "class", "label svelte-crnq0a")
|
|
1472
|
-
attr(input1, "type", "password")
|
|
1473
|
-
attr(
|
|
1474
|
-
input1,
|
|
1475
|
-
"class",
|
|
1476
|
-
(input1_class_value =
|
|
1477
|
-
"" + null_to_empty(ctx._inputClass) + " svelte-crnq0a")
|
|
1478
|
-
)
|
|
1479
|
-
attr(div3, "class", "control svelte-crnq0a")
|
|
1480
|
-
attr(div4, "class", "form-root svelte-crnq0a")
|
|
1481
|
-
button.disabled = ctx.busy
|
|
1482
|
-
attr(
|
|
1483
|
-
button,
|
|
1484
|
-
"class",
|
|
1485
|
-
(button_class_value =
|
|
1486
|
-
"" + null_to_empty(ctx._buttonClass) + " svelte-crnq0a")
|
|
1487
|
-
)
|
|
1488
|
-
attr(div5, "class", "login-button-container svelte-crnq0a")
|
|
1489
|
-
attr(div6, "class", "content svelte-crnq0a")
|
|
1490
|
-
attr(div7, "class", "root svelte-crnq0a")
|
|
1491
|
-
|
|
1492
|
-
dispose = [
|
|
1493
|
-
listen(input0, "input", ctx.input0_input_handler),
|
|
1494
|
-
listen(input1, "input", ctx.input1_input_handler),
|
|
1495
|
-
listen(button, "click", ctx.login),
|
|
1496
|
-
]
|
|
1497
|
-
},
|
|
1498
|
-
|
|
1499
|
-
m(target, anchor) {
|
|
1500
|
-
insert(target, div7, anchor)
|
|
1501
|
-
append(div7, div6)
|
|
1502
|
-
if (if_block0) if_block0.m(div6, null)
|
|
1503
|
-
append(div6, t0)
|
|
1504
|
-
append(div6, div4)
|
|
1505
|
-
append(div4, div0)
|
|
1506
|
-
append(div0, t1)
|
|
1507
|
-
append(div4, t2)
|
|
1508
|
-
append(div4, div1)
|
|
1509
|
-
append(div1, input0)
|
|
1510
|
-
|
|
1511
|
-
set_input_value(input0, ctx.username)
|
|
1512
|
-
|
|
1513
|
-
append(div4, t3)
|
|
1514
|
-
append(div4, div2)
|
|
1515
|
-
append(div2, t4)
|
|
1516
|
-
append(div4, t5)
|
|
1517
|
-
append(div4, div3)
|
|
1518
|
-
append(div3, input1)
|
|
1519
|
-
|
|
1520
|
-
set_input_value(input1, ctx.password)
|
|
1521
|
-
|
|
1522
|
-
append(div6, t6)
|
|
1523
|
-
append(div6, div5)
|
|
1524
|
-
append(div5, button)
|
|
1525
|
-
append(button, t7)
|
|
1526
|
-
append(div6, t8)
|
|
1527
|
-
if (if_block1) if_block1.m(div6, null)
|
|
1528
|
-
},
|
|
1529
|
-
|
|
1530
|
-
p(changed, ctx) {
|
|
1531
|
-
if (ctx._logo) {
|
|
1532
|
-
if (if_block0) {
|
|
1533
|
-
if_block0.p(changed, ctx)
|
|
1534
|
-
} else {
|
|
1535
|
-
if_block0 = create_if_block_1$1(ctx)
|
|
1536
|
-
if_block0.c()
|
|
1537
|
-
if_block0.m(div6, t0)
|
|
1538
|
-
}
|
|
1539
|
-
} else if (if_block0) {
|
|
1540
|
-
if_block0.d(1)
|
|
1541
|
-
if_block0 = null
|
|
1542
|
-
}
|
|
1543
|
-
|
|
1544
|
-
if (changed.usernameLabel) {
|
|
1545
|
-
set_data(t1, ctx.usernameLabel)
|
|
1546
|
-
}
|
|
1547
|
-
|
|
1548
|
-
if (changed.username && input0.value !== ctx.username)
|
|
1549
|
-
set_input_value(input0, ctx.username)
|
|
1550
|
-
|
|
1551
|
-
if (
|
|
1552
|
-
changed._inputClass &&
|
|
1553
|
-
input0_class_value !==
|
|
1554
|
-
(input0_class_value =
|
|
1555
|
-
"" + null_to_empty(ctx._inputClass) + " svelte-crnq0a")
|
|
1556
|
-
) {
|
|
1557
|
-
attr(input0, "class", input0_class_value)
|
|
1558
|
-
}
|
|
1559
|
-
|
|
1560
|
-
if (changed.passwordLabel) {
|
|
1561
|
-
set_data(t4, ctx.passwordLabel)
|
|
1562
|
-
}
|
|
1563
|
-
|
|
1564
|
-
if (changed.password && input1.value !== ctx.password)
|
|
1565
|
-
set_input_value(input1, ctx.password)
|
|
1566
|
-
|
|
1567
|
-
if (
|
|
1568
|
-
changed._inputClass &&
|
|
1569
|
-
input1_class_value !==
|
|
1570
|
-
(input1_class_value =
|
|
1571
|
-
"" + null_to_empty(ctx._inputClass) + " svelte-crnq0a")
|
|
1572
|
-
) {
|
|
1573
|
-
attr(input1, "class", input1_class_value)
|
|
1574
|
-
}
|
|
1575
|
-
|
|
1576
|
-
if (changed.loginButtonLabel) {
|
|
1577
|
-
set_data(t7, ctx.loginButtonLabel)
|
|
1578
|
-
}
|
|
1579
|
-
|
|
1580
|
-
if (changed.busy) {
|
|
1581
|
-
button.disabled = ctx.busy
|
|
1582
|
-
}
|
|
1583
|
-
|
|
1584
|
-
if (
|
|
1585
|
-
changed._buttonClass &&
|
|
1586
|
-
button_class_value !==
|
|
1587
|
-
(button_class_value =
|
|
1588
|
-
"" + null_to_empty(ctx._buttonClass) + " svelte-crnq0a")
|
|
1589
|
-
) {
|
|
1590
|
-
attr(button, "class", button_class_value)
|
|
1591
|
-
}
|
|
1592
|
-
|
|
1593
|
-
if (ctx.incorrect) {
|
|
1594
|
-
if (!if_block1) {
|
|
1595
|
-
if_block1 = create_if_block$2()
|
|
1596
|
-
if_block1.c()
|
|
1597
|
-
if_block1.m(div6, null)
|
|
1598
|
-
}
|
|
1599
|
-
} else if (if_block1) {
|
|
1600
|
-
if_block1.d(1)
|
|
1601
|
-
if_block1 = null
|
|
1602
|
-
}
|
|
1603
|
-
},
|
|
1604
|
-
|
|
1605
|
-
i: noop,
|
|
1606
|
-
o: noop,
|
|
1607
|
-
|
|
1608
|
-
d(detaching) {
|
|
1609
|
-
if (detaching) {
|
|
1610
|
-
detach(div7)
|
|
1611
|
-
}
|
|
1612
|
-
|
|
1613
|
-
if (if_block0) if_block0.d()
|
|
1614
|
-
if (if_block1) if_block1.d()
|
|
1615
|
-
run_all(dispose)
|
|
1616
|
-
},
|
|
1617
|
-
}
|
|
1618
|
-
}
|
|
1619
|
-
|
|
1620
|
-
function instance$3($$self, $$props, $$invalidate) {
|
|
1621
|
-
let {
|
|
1622
|
-
usernameLabel = "Username",
|
|
1623
|
-
passwordLabel = "Password",
|
|
1624
|
-
loginButtonLabel = "Login",
|
|
1625
|
-
loginRedirect = "",
|
|
1626
|
-
logo = "",
|
|
1627
|
-
buttonClass = "",
|
|
1628
|
-
inputClass = "",
|
|
1629
|
-
_bb,
|
|
1630
|
-
} = $$props
|
|
1631
|
-
|
|
1632
|
-
let username = ""
|
|
1633
|
-
let password = ""
|
|
1634
|
-
let busy = false
|
|
1635
|
-
let incorrect = false
|
|
1636
|
-
let _logo = ""
|
|
1637
|
-
let _buttonClass = ""
|
|
1638
|
-
let _inputClass = ""
|
|
1639
|
-
|
|
1640
|
-
const login = () => {
|
|
1641
|
-
$$invalidate("busy", (busy = true))
|
|
1642
|
-
_bb.api
|
|
1643
|
-
.post("/api/authenticate", { username, password })
|
|
1644
|
-
.then(r => {
|
|
1645
|
-
$$invalidate("busy", (busy = false))
|
|
1646
|
-
if (r.status === 200) {
|
|
1647
|
-
return r.json()
|
|
1648
|
-
} else {
|
|
1649
|
-
$$invalidate("incorrect", (incorrect = true))
|
|
1650
|
-
return
|
|
1651
|
-
}
|
|
1652
|
-
})
|
|
1653
|
-
.then(user => {
|
|
1654
|
-
if (user) {
|
|
1655
|
-
localStorage.setItem("budibase:user", user)
|
|
1656
|
-
location.reload()
|
|
1657
|
-
}
|
|
1658
|
-
})
|
|
1659
|
-
}
|
|
1660
|
-
|
|
1661
|
-
function input0_input_handler() {
|
|
1662
|
-
username = this.value
|
|
1663
|
-
$$invalidate("username", username)
|
|
1664
|
-
}
|
|
1665
|
-
|
|
1666
|
-
function input1_input_handler() {
|
|
1667
|
-
password = this.value
|
|
1668
|
-
$$invalidate("password", password)
|
|
1669
|
-
}
|
|
1670
|
-
|
|
1671
|
-
$$self.$set = $$props => {
|
|
1672
|
-
if ("usernameLabel" in $$props)
|
|
1673
|
-
$$invalidate("usernameLabel", (usernameLabel = $$props.usernameLabel))
|
|
1674
|
-
if ("passwordLabel" in $$props)
|
|
1675
|
-
$$invalidate("passwordLabel", (passwordLabel = $$props.passwordLabel))
|
|
1676
|
-
if ("loginButtonLabel" in $$props)
|
|
1677
|
-
$$invalidate(
|
|
1678
|
-
"loginButtonLabel",
|
|
1679
|
-
(loginButtonLabel = $$props.loginButtonLabel)
|
|
1680
|
-
)
|
|
1681
|
-
if ("loginRedirect" in $$props)
|
|
1682
|
-
$$invalidate("loginRedirect", (loginRedirect = $$props.loginRedirect))
|
|
1683
|
-
if ("logo" in $$props) $$invalidate("logo", (logo = $$props.logo))
|
|
1684
|
-
if ("buttonClass" in $$props)
|
|
1685
|
-
$$invalidate("buttonClass", (buttonClass = $$props.buttonClass))
|
|
1686
|
-
if ("inputClass" in $$props)
|
|
1687
|
-
$$invalidate("inputClass", (inputClass = $$props.inputClass))
|
|
1688
|
-
if ("_bb" in $$props) $$invalidate("_bb", (_bb = $$props._bb))
|
|
1689
|
-
}
|
|
1690
|
-
|
|
1691
|
-
$$self.$$.update = (
|
|
1692
|
-
$$dirty = { _bb: 1, logo: 1, buttonClass: 1, inputClass: 1 }
|
|
1693
|
-
) => {
|
|
1694
|
-
if (
|
|
1695
|
-
$$dirty._bb ||
|
|
1696
|
-
$$dirty.logo ||
|
|
1697
|
-
$$dirty.buttonClass ||
|
|
1698
|
-
$$dirty.inputClass
|
|
1699
|
-
) {
|
|
1700
|
-
{
|
|
1701
|
-
$$invalidate("_logo", (_logo = _bb.relativeUrl(logo)))
|
|
1702
|
-
$$invalidate(
|
|
1703
|
-
"_buttonClass",
|
|
1704
|
-
(_buttonClass = buttonClass || "default-button")
|
|
1705
|
-
)
|
|
1706
|
-
$$invalidate(
|
|
1707
|
-
"_inputClass",
|
|
1708
|
-
(_inputClass = inputClass || "default-input")
|
|
1709
|
-
)
|
|
1710
|
-
}
|
|
1711
|
-
}
|
|
1712
|
-
}
|
|
1713
|
-
|
|
1714
|
-
return {
|
|
1715
|
-
usernameLabel,
|
|
1716
|
-
passwordLabel,
|
|
1717
|
-
loginButtonLabel,
|
|
1718
|
-
loginRedirect,
|
|
1719
|
-
logo,
|
|
1720
|
-
buttonClass,
|
|
1721
|
-
inputClass,
|
|
1722
|
-
_bb,
|
|
1723
|
-
username,
|
|
1724
|
-
password,
|
|
1725
|
-
busy,
|
|
1726
|
-
incorrect,
|
|
1727
|
-
_logo,
|
|
1728
|
-
_buttonClass,
|
|
1729
|
-
_inputClass,
|
|
1730
|
-
login,
|
|
1731
|
-
input0_input_handler,
|
|
1732
|
-
input1_input_handler,
|
|
1733
|
-
}
|
|
1734
|
-
}
|
|
1735
|
-
|
|
1736
|
-
class Login extends SvelteComponent {
|
|
1737
|
-
constructor(options) {
|
|
1738
|
-
super()
|
|
1739
|
-
if (!document.getElementById("svelte-crnq0a-style")) add_css$3()
|
|
1740
|
-
init(this, options, instance$3, create_fragment$3, safe_not_equal, [
|
|
1741
|
-
"usernameLabel",
|
|
1742
|
-
"passwordLabel",
|
|
1743
|
-
"loginButtonLabel",
|
|
1744
|
-
"loginRedirect",
|
|
1745
|
-
"logo",
|
|
1746
|
-
"buttonClass",
|
|
1747
|
-
"inputClass",
|
|
1748
|
-
"_bb",
|
|
1749
|
-
])
|
|
1750
|
-
}
|
|
1751
|
-
}
|
|
1752
|
-
|
|
1753
|
-
const buildStyle = styles => {
|
|
1754
|
-
let str = ""
|
|
1755
|
-
for (let s in styles) {
|
|
1756
|
-
if (styles[s]) {
|
|
1757
|
-
str += `${s}: ${styles[s]}; `
|
|
1758
|
-
}
|
|
1759
|
-
}
|
|
1760
|
-
return str
|
|
1761
|
-
}
|
|
1762
|
-
|
|
1763
|
-
/* src\Grid.svelte generated by Svelte v3.12.1 */
|
|
1764
|
-
|
|
1765
|
-
function add_css$4() {
|
|
1766
|
-
var style = element("style")
|
|
1767
|
-
style.id = "svelte-10kw8to-style"
|
|
1768
|
-
style.textContent = ".root.svelte-10kw8to{display:grid}"
|
|
1769
|
-
append(document.head, style)
|
|
1770
|
-
}
|
|
1771
|
-
|
|
1772
|
-
function get_each_context$1(ctx, list, i) {
|
|
1773
|
-
const child_ctx = Object.create(ctx)
|
|
1774
|
-
child_ctx.child = list[i]
|
|
1775
|
-
child_ctx.index = i
|
|
1776
|
-
return child_ctx
|
|
1777
|
-
}
|
|
1778
|
-
|
|
1779
|
-
// (49:4) {#each children as child, index}
|
|
1780
|
-
function create_each_block$1(ctx) {
|
|
1781
|
-
var div,
|
|
1782
|
-
index = ctx.index,
|
|
1783
|
-
div_class_value,
|
|
1784
|
-
div_style_value
|
|
1785
|
-
|
|
1786
|
-
const assign_div = () => ctx.div_binding(div, index)
|
|
1787
|
-
const unassign_div = () => ctx.div_binding(null, index)
|
|
1788
|
-
|
|
1789
|
-
return {
|
|
1790
|
-
c() {
|
|
1791
|
-
div = element("div")
|
|
1792
|
-
this.h()
|
|
1793
|
-
},
|
|
1794
|
-
|
|
1795
|
-
l(nodes) {
|
|
1796
|
-
div = claim_element(nodes, "DIV", { class: true, style: true }, false)
|
|
1797
|
-
var div_nodes = children(div)
|
|
1798
|
-
|
|
1799
|
-
div_nodes.forEach(detach)
|
|
1800
|
-
this.h()
|
|
1801
|
-
},
|
|
1802
|
-
|
|
1803
|
-
h() {
|
|
1804
|
-
attr(
|
|
1805
|
-
div,
|
|
1806
|
-
"class",
|
|
1807
|
-
(div_class_value =
|
|
1808
|
-
"" + null_to_empty(ctx.itemContainerClass) + " svelte-10kw8to")
|
|
1809
|
-
)
|
|
1810
|
-
attr(div, "style", (div_style_value = ctx.childStyle(ctx.child)))
|
|
1811
|
-
},
|
|
1812
|
-
|
|
1813
|
-
m(target, anchor) {
|
|
1814
|
-
insert(target, div, anchor)
|
|
1815
|
-
assign_div()
|
|
1816
|
-
},
|
|
1817
|
-
|
|
1818
|
-
p(changed, new_ctx) {
|
|
1819
|
-
ctx = new_ctx
|
|
1820
|
-
if (index !== ctx.index) {
|
|
1821
|
-
unassign_div()
|
|
1822
|
-
index = ctx.index
|
|
1823
|
-
assign_div()
|
|
1824
|
-
}
|
|
1825
|
-
|
|
1826
|
-
if (
|
|
1827
|
-
changed.itemContainerClass &&
|
|
1828
|
-
div_class_value !==
|
|
1829
|
-
(div_class_value =
|
|
1830
|
-
"" + null_to_empty(ctx.itemContainerClass) + " svelte-10kw8to")
|
|
1831
|
-
) {
|
|
1832
|
-
attr(div, "class", div_class_value)
|
|
1833
|
-
}
|
|
1834
|
-
|
|
1835
|
-
if (
|
|
1836
|
-
changed.children &&
|
|
1837
|
-
div_style_value !== (div_style_value = ctx.childStyle(ctx.child))
|
|
1838
|
-
) {
|
|
1839
|
-
attr(div, "style", div_style_value)
|
|
1840
|
-
}
|
|
1841
|
-
},
|
|
1842
|
-
|
|
1843
|
-
d(detaching) {
|
|
1844
|
-
if (detaching) {
|
|
1845
|
-
detach(div)
|
|
1846
|
-
}
|
|
1847
|
-
|
|
1848
|
-
unassign_div()
|
|
1849
|
-
},
|
|
1850
|
-
}
|
|
1851
|
-
}
|
|
1852
|
-
|
|
1853
|
-
function create_fragment$4(ctx) {
|
|
1854
|
-
var div, div_class_value
|
|
1855
|
-
|
|
1856
|
-
let each_value = ctx.children
|
|
1857
|
-
|
|
1858
|
-
let each_blocks = []
|
|
1859
|
-
|
|
1860
|
-
for (let i = 0; i < each_value.length; i += 1) {
|
|
1861
|
-
each_blocks[i] = create_each_block$1(get_each_context$1(ctx, each_value, i))
|
|
1862
|
-
}
|
|
1863
|
-
|
|
1864
|
-
return {
|
|
1865
|
-
c() {
|
|
1866
|
-
div = element("div")
|
|
1867
|
-
|
|
1868
|
-
for (let i = 0; i < each_blocks.length; i += 1) {
|
|
1869
|
-
each_blocks[i].c()
|
|
1870
|
-
}
|
|
1871
|
-
this.h()
|
|
1872
|
-
},
|
|
1873
|
-
|
|
1874
|
-
l(nodes) {
|
|
1875
|
-
div = claim_element(nodes, "DIV", { class: true, style: true }, false)
|
|
1876
|
-
var div_nodes = children(div)
|
|
1877
|
-
|
|
1878
|
-
for (let i = 0; i < each_blocks.length; i += 1) {
|
|
1879
|
-
each_blocks[i].l(div_nodes)
|
|
1880
|
-
}
|
|
1881
|
-
|
|
1882
|
-
div_nodes.forEach(detach)
|
|
1883
|
-
this.h()
|
|
1884
|
-
},
|
|
1885
|
-
|
|
1886
|
-
h() {
|
|
1887
|
-
attr(
|
|
1888
|
-
div,
|
|
1889
|
-
"class",
|
|
1890
|
-
(div_class_value = "root " + ctx.containerClass + " svelte-10kw8to")
|
|
1891
|
-
)
|
|
1892
|
-
set_style(div, "width", ctx.width)
|
|
1893
|
-
set_style(div, "height", ctx.height)
|
|
1894
|
-
set_style(div, "grid-template-columns", ctx.gridTemplateColumns)
|
|
1895
|
-
set_style(div, "grid-template-rows", ctx.gridTemplateRows)
|
|
1896
|
-
},
|
|
1897
|
-
|
|
1898
|
-
m(target, anchor) {
|
|
1899
|
-
insert(target, div, anchor)
|
|
1900
|
-
|
|
1901
|
-
for (let i = 0; i < each_blocks.length; i += 1) {
|
|
1902
|
-
each_blocks[i].m(div, null)
|
|
1903
|
-
}
|
|
1904
|
-
},
|
|
1905
|
-
|
|
1906
|
-
p(changed, ctx) {
|
|
1907
|
-
if (
|
|
1908
|
-
changed.itemContainerClass ||
|
|
1909
|
-
changed.childStyle ||
|
|
1910
|
-
changed.children ||
|
|
1911
|
-
changed.htmlElements
|
|
1912
|
-
) {
|
|
1913
|
-
each_value = ctx.children
|
|
1914
|
-
|
|
1915
|
-
let i
|
|
1916
|
-
for (i = 0; i < each_value.length; i += 1) {
|
|
1917
|
-
const child_ctx = get_each_context$1(ctx, each_value, i)
|
|
1918
|
-
|
|
1919
|
-
if (each_blocks[i]) {
|
|
1920
|
-
each_blocks[i].p(changed, child_ctx)
|
|
1921
|
-
} else {
|
|
1922
|
-
each_blocks[i] = create_each_block$1(child_ctx)
|
|
1923
|
-
each_blocks[i].c()
|
|
1924
|
-
each_blocks[i].m(div, null)
|
|
1925
|
-
}
|
|
1926
|
-
}
|
|
1927
|
-
|
|
1928
|
-
for (; i < each_blocks.length; i += 1) {
|
|
1929
|
-
each_blocks[i].d(1)
|
|
1930
|
-
}
|
|
1931
|
-
each_blocks.length = each_value.length
|
|
1932
|
-
}
|
|
1933
|
-
|
|
1934
|
-
if (
|
|
1935
|
-
changed.containerClass &&
|
|
1936
|
-
div_class_value !==
|
|
1937
|
-
(div_class_value = "root " + ctx.containerClass + " svelte-10kw8to")
|
|
1938
|
-
) {
|
|
1939
|
-
attr(div, "class", div_class_value)
|
|
1940
|
-
}
|
|
1941
|
-
|
|
1942
|
-
if (changed.width) {
|
|
1943
|
-
set_style(div, "width", ctx.width)
|
|
1944
|
-
}
|
|
1945
|
-
|
|
1946
|
-
if (changed.height) {
|
|
1947
|
-
set_style(div, "height", ctx.height)
|
|
1948
|
-
}
|
|
1949
|
-
|
|
1950
|
-
if (changed.gridTemplateColumns) {
|
|
1951
|
-
set_style(div, "grid-template-columns", ctx.gridTemplateColumns)
|
|
1952
|
-
}
|
|
1953
|
-
|
|
1954
|
-
if (changed.gridTemplateRows) {
|
|
1955
|
-
set_style(div, "grid-template-rows", ctx.gridTemplateRows)
|
|
1956
|
-
}
|
|
1957
|
-
},
|
|
1958
|
-
|
|
1959
|
-
i: noop,
|
|
1960
|
-
o: noop,
|
|
1961
|
-
|
|
1962
|
-
d(detaching) {
|
|
1963
|
-
if (detaching) {
|
|
1964
|
-
detach(div)
|
|
1965
|
-
}
|
|
1966
|
-
|
|
1967
|
-
destroy_each(each_blocks, detaching)
|
|
1968
|
-
},
|
|
1969
|
-
}
|
|
1970
|
-
}
|
|
1971
|
-
|
|
1972
|
-
function instance$4($$self, $$props, $$invalidate) {
|
|
1973
|
-
let {
|
|
1974
|
-
gridTemplateRows = "",
|
|
1975
|
-
gridTemplateColumns = "",
|
|
1976
|
-
children = [],
|
|
1977
|
-
width = "auto",
|
|
1978
|
-
height = "auto",
|
|
1979
|
-
containerClass = "",
|
|
1980
|
-
itemContainerClass = "",
|
|
1981
|
-
_bb,
|
|
1982
|
-
} = $$props
|
|
1983
|
-
let htmlElements = {}
|
|
1984
|
-
|
|
1985
|
-
const childStyle = child =>
|
|
1986
|
-
buildStyle({
|
|
1987
|
-
"grid-column-start": child.gridColumnStart,
|
|
1988
|
-
"grid-column-end": child.gridColumnEnd,
|
|
1989
|
-
"grid-column": child.gridColumn,
|
|
1990
|
-
"grid-row-start": child.gridRowStart,
|
|
1991
|
-
"grid-row-end": child.gridRowStart,
|
|
1992
|
-
"grid-row": child.gridRow,
|
|
1993
|
-
})
|
|
1994
|
-
|
|
1995
|
-
function div_binding($$value, index) {
|
|
1996
|
-
if (htmlElements[index] === $$value) return
|
|
1997
|
-
binding_callbacks[$$value ? "unshift" : "push"](() => {
|
|
1998
|
-
htmlElements[index] = $$value
|
|
1999
|
-
$$invalidate("htmlElements", htmlElements)
|
|
2000
|
-
})
|
|
2001
|
-
}
|
|
2002
|
-
|
|
2003
|
-
$$self.$set = $$props => {
|
|
2004
|
-
if ("gridTemplateRows" in $$props)
|
|
2005
|
-
$$invalidate(
|
|
2006
|
-
"gridTemplateRows",
|
|
2007
|
-
(gridTemplateRows = $$props.gridTemplateRows)
|
|
2008
|
-
)
|
|
2009
|
-
if ("gridTemplateColumns" in $$props)
|
|
2010
|
-
$$invalidate(
|
|
2011
|
-
"gridTemplateColumns",
|
|
2012
|
-
(gridTemplateColumns = $$props.gridTemplateColumns)
|
|
2013
|
-
)
|
|
2014
|
-
if ("children" in $$props)
|
|
2015
|
-
$$invalidate("children", (children = $$props.children))
|
|
2016
|
-
if ("width" in $$props) $$invalidate("width", (width = $$props.width))
|
|
2017
|
-
if ("height" in $$props) $$invalidate("height", (height = $$props.height))
|
|
2018
|
-
if ("containerClass" in $$props)
|
|
2019
|
-
$$invalidate("containerClass", (containerClass = $$props.containerClass))
|
|
2020
|
-
if ("itemContainerClass" in $$props)
|
|
2021
|
-
$$invalidate(
|
|
2022
|
-
"itemContainerClass",
|
|
2023
|
-
(itemContainerClass = $$props.itemContainerClass)
|
|
2024
|
-
)
|
|
2025
|
-
if ("_bb" in $$props) $$invalidate("_bb", (_bb = $$props._bb))
|
|
2026
|
-
}
|
|
2027
|
-
|
|
2028
|
-
$$self.$$.update = ($$dirty = { _bb: 1, htmlElements: 1, children: 1 }) => {
|
|
2029
|
-
if ($$dirty._bb || $$dirty.htmlElements || $$dirty.children) {
|
|
2030
|
-
{
|
|
2031
|
-
if (_bb && htmlElements) {
|
|
2032
|
-
for (let el in htmlElements) {
|
|
2033
|
-
_bb.hydrateComponent(children[el].control, htmlElements[el])
|
|
2034
|
-
}
|
|
2035
|
-
}
|
|
2036
|
-
}
|
|
2037
|
-
}
|
|
2038
|
-
}
|
|
2039
|
-
|
|
2040
|
-
return {
|
|
2041
|
-
gridTemplateRows,
|
|
2042
|
-
gridTemplateColumns,
|
|
2043
|
-
children,
|
|
2044
|
-
width,
|
|
2045
|
-
height,
|
|
2046
|
-
containerClass,
|
|
2047
|
-
itemContainerClass,
|
|
2048
|
-
_bb,
|
|
2049
|
-
htmlElements,
|
|
2050
|
-
childStyle,
|
|
2051
|
-
div_binding,
|
|
2052
|
-
}
|
|
2053
|
-
}
|
|
2054
|
-
|
|
2055
|
-
class Grid extends SvelteComponent {
|
|
2056
|
-
constructor(options) {
|
|
2057
|
-
super()
|
|
2058
|
-
if (!document.getElementById("svelte-10kw8to-style")) add_css$4()
|
|
2059
|
-
init(this, options, instance$4, create_fragment$4, safe_not_equal, [
|
|
2060
|
-
"gridTemplateRows",
|
|
2061
|
-
"gridTemplateColumns",
|
|
2062
|
-
"children",
|
|
2063
|
-
"width",
|
|
2064
|
-
"height",
|
|
2065
|
-
"containerClass",
|
|
2066
|
-
"itemContainerClass",
|
|
2067
|
-
"_bb",
|
|
2068
|
-
])
|
|
2069
|
-
}
|
|
2070
|
-
}
|
|
2071
|
-
|
|
2072
|
-
/* src\StackPanel.svelte generated by Svelte v3.12.1 */
|
|
2073
|
-
const { Object: Object_1 } = globals
|
|
2074
|
-
|
|
2075
|
-
function add_css$5() {
|
|
2076
|
-
var style = element("style")
|
|
2077
|
-
style.id = "svelte-osi0db-style"
|
|
2078
|
-
style.textContent =
|
|
2079
|
-
".horizontal.svelte-osi0db{display:inline-block}.vertical.svelte-osi0db{display:block}"
|
|
2080
|
-
append(document.head, style)
|
|
2081
|
-
}
|
|
2082
|
-
|
|
2083
|
-
function get_each_context$2(ctx, list, i) {
|
|
2084
|
-
const child_ctx = Object_1.create(ctx)
|
|
2085
|
-
child_ctx.child = list[i]
|
|
2086
|
-
child_ctx.index = i
|
|
2087
|
-
return child_ctx
|
|
2088
|
-
}
|
|
2089
|
-
|
|
2090
|
-
function get_each_context_1(ctx, list, i) {
|
|
2091
|
-
const child_ctx = Object_1.create(ctx)
|
|
2092
|
-
child_ctx.child = list[i]
|
|
2093
|
-
child_ctx.index = i
|
|
2094
|
-
return child_ctx
|
|
2095
|
-
}
|
|
2096
|
-
|
|
2097
|
-
// (76:4) {#each children as child, index}
|
|
2098
|
-
function create_each_block_1(ctx) {
|
|
2099
|
-
var div1,
|
|
2100
|
-
div0,
|
|
2101
|
-
index = ctx.index,
|
|
2102
|
-
div0_class_value,
|
|
2103
|
-
div1_class_value
|
|
2104
|
-
|
|
2105
|
-
const assign_div0 = () => ctx.div0_binding(div0, index)
|
|
2106
|
-
const unassign_div0 = () => ctx.div0_binding(null, index)
|
|
2107
|
-
|
|
2108
|
-
return {
|
|
2109
|
-
c() {
|
|
2110
|
-
div1 = element("div")
|
|
2111
|
-
div0 = element("div")
|
|
2112
|
-
this.h()
|
|
2113
|
-
},
|
|
2114
|
-
|
|
2115
|
-
l(nodes) {
|
|
2116
|
-
div1 = claim_element(nodes, "DIV", { class: true }, false)
|
|
2117
|
-
var div1_nodes = children(div1)
|
|
2118
|
-
|
|
2119
|
-
div0 = claim_element(div1_nodes, "DIV", { class: true }, false)
|
|
2120
|
-
var div0_nodes = children(div0)
|
|
2121
|
-
|
|
2122
|
-
div0_nodes.forEach(detach)
|
|
2123
|
-
div1_nodes.forEach(detach)
|
|
2124
|
-
this.h()
|
|
2125
|
-
},
|
|
2126
|
-
|
|
2127
|
-
h() {
|
|
2128
|
-
attr(
|
|
2129
|
-
div0,
|
|
2130
|
-
"class",
|
|
2131
|
-
(div0_class_value =
|
|
2132
|
-
"" + null_to_empty(ctx.itemContainerClass) + " svelte-osi0db")
|
|
2133
|
-
)
|
|
2134
|
-
attr(
|
|
2135
|
-
div1,
|
|
2136
|
-
"class",
|
|
2137
|
-
(div1_class_value =
|
|
2138
|
-
"" + null_to_empty(ctx.direction) + " svelte-osi0db")
|
|
2139
|
-
)
|
|
2140
|
-
},
|
|
2141
|
-
|
|
2142
|
-
m(target, anchor) {
|
|
2143
|
-
insert(target, div1, anchor)
|
|
2144
|
-
append(div1, div0)
|
|
2145
|
-
assign_div0()
|
|
2146
|
-
},
|
|
2147
|
-
|
|
2148
|
-
p(changed, new_ctx) {
|
|
2149
|
-
ctx = new_ctx
|
|
2150
|
-
if (index !== ctx.index) {
|
|
2151
|
-
unassign_div0()
|
|
2152
|
-
index = ctx.index
|
|
2153
|
-
assign_div0()
|
|
2154
|
-
}
|
|
2155
|
-
|
|
2156
|
-
if (
|
|
2157
|
-
changed.itemContainerClass &&
|
|
2158
|
-
div0_class_value !==
|
|
2159
|
-
(div0_class_value =
|
|
2160
|
-
"" + null_to_empty(ctx.itemContainerClass) + " svelte-osi0db")
|
|
2161
|
-
) {
|
|
2162
|
-
attr(div0, "class", div0_class_value)
|
|
2163
|
-
}
|
|
2164
|
-
|
|
2165
|
-
if (
|
|
2166
|
-
changed.direction &&
|
|
2167
|
-
div1_class_value !==
|
|
2168
|
-
(div1_class_value =
|
|
2169
|
-
"" + null_to_empty(ctx.direction) + " svelte-osi0db")
|
|
2170
|
-
) {
|
|
2171
|
-
attr(div1, "class", div1_class_value)
|
|
2172
|
-
}
|
|
2173
|
-
},
|
|
2174
|
-
|
|
2175
|
-
d(detaching) {
|
|
2176
|
-
if (detaching) {
|
|
2177
|
-
detach(div1)
|
|
2178
|
-
}
|
|
2179
|
-
|
|
2180
|
-
unassign_div0()
|
|
2181
|
-
},
|
|
2182
|
-
}
|
|
2183
|
-
}
|
|
2184
|
-
|
|
2185
|
-
// (83:4) {#each data as child, index}
|
|
2186
|
-
function create_each_block$2(ctx) {
|
|
2187
|
-
var div1,
|
|
2188
|
-
div0,
|
|
2189
|
-
index = ctx.index,
|
|
2190
|
-
div0_class_value,
|
|
2191
|
-
t,
|
|
2192
|
-
div1_class_value
|
|
2193
|
-
|
|
2194
|
-
const assign_div0 = () => ctx.div0_binding_1(div0, index)
|
|
2195
|
-
const unassign_div0 = () => ctx.div0_binding_1(null, index)
|
|
2196
|
-
|
|
2197
|
-
return {
|
|
2198
|
-
c() {
|
|
2199
|
-
div1 = element("div")
|
|
2200
|
-
div0 = element("div")
|
|
2201
|
-
t = space()
|
|
2202
|
-
this.h()
|
|
2203
|
-
},
|
|
2204
|
-
|
|
2205
|
-
l(nodes) {
|
|
2206
|
-
div1 = claim_element(nodes, "DIV", { class: true }, false)
|
|
2207
|
-
var div1_nodes = children(div1)
|
|
2208
|
-
|
|
2209
|
-
div0 = claim_element(div1_nodes, "DIV", { class: true }, false)
|
|
2210
|
-
var div0_nodes = children(div0)
|
|
2211
|
-
|
|
2212
|
-
div0_nodes.forEach(detach)
|
|
2213
|
-
t = claim_space(div1_nodes)
|
|
2214
|
-
div1_nodes.forEach(detach)
|
|
2215
|
-
this.h()
|
|
2216
|
-
},
|
|
2217
|
-
|
|
2218
|
-
h() {
|
|
2219
|
-
attr(
|
|
2220
|
-
div0,
|
|
2221
|
-
"class",
|
|
2222
|
-
(div0_class_value =
|
|
2223
|
-
"" + null_to_empty(ctx.itemContainerClass) + " svelte-osi0db")
|
|
2224
|
-
)
|
|
2225
|
-
attr(
|
|
2226
|
-
div1,
|
|
2227
|
-
"class",
|
|
2228
|
-
(div1_class_value =
|
|
2229
|
-
"" + null_to_empty(ctx.direction) + " svelte-osi0db")
|
|
2230
|
-
)
|
|
2231
|
-
},
|
|
2232
|
-
|
|
2233
|
-
m(target, anchor) {
|
|
2234
|
-
insert(target, div1, anchor)
|
|
2235
|
-
append(div1, div0)
|
|
2236
|
-
assign_div0()
|
|
2237
|
-
append(div1, t)
|
|
2238
|
-
},
|
|
2239
|
-
|
|
2240
|
-
p(changed, new_ctx) {
|
|
2241
|
-
ctx = new_ctx
|
|
2242
|
-
if (index !== ctx.index) {
|
|
2243
|
-
unassign_div0()
|
|
2244
|
-
index = ctx.index
|
|
2245
|
-
assign_div0()
|
|
2246
|
-
}
|
|
2247
|
-
|
|
2248
|
-
if (
|
|
2249
|
-
changed.itemContainerClass &&
|
|
2250
|
-
div0_class_value !==
|
|
2251
|
-
(div0_class_value =
|
|
2252
|
-
"" + null_to_empty(ctx.itemContainerClass) + " svelte-osi0db")
|
|
2253
|
-
) {
|
|
2254
|
-
attr(div0, "class", div0_class_value)
|
|
2255
|
-
}
|
|
2256
|
-
|
|
2257
|
-
if (
|
|
2258
|
-
changed.direction &&
|
|
2259
|
-
div1_class_value !==
|
|
2260
|
-
(div1_class_value =
|
|
2261
|
-
"" + null_to_empty(ctx.direction) + " svelte-osi0db")
|
|
2262
|
-
) {
|
|
2263
|
-
attr(div1, "class", div1_class_value)
|
|
2264
|
-
}
|
|
2265
|
-
},
|
|
2266
|
-
|
|
2267
|
-
d(detaching) {
|
|
2268
|
-
if (detaching) {
|
|
2269
|
-
detach(div1)
|
|
2270
|
-
}
|
|
2271
|
-
|
|
2272
|
-
unassign_div0()
|
|
2273
|
-
},
|
|
2274
|
-
}
|
|
2275
|
-
}
|
|
2276
|
-
|
|
2277
|
-
function create_fragment$5(ctx) {
|
|
2278
|
-
var div, t, div_class_value
|
|
2279
|
-
|
|
2280
|
-
let each_value_1 = ctx.children
|
|
2281
|
-
|
|
2282
|
-
let each_blocks_1 = []
|
|
2283
|
-
|
|
2284
|
-
for (let i = 0; i < each_value_1.length; i += 1) {
|
|
2285
|
-
each_blocks_1[i] = create_each_block_1(
|
|
2286
|
-
get_each_context_1(ctx, each_value_1, i)
|
|
2287
|
-
)
|
|
2288
|
-
}
|
|
2289
|
-
|
|
2290
|
-
let each_value = ctx.data
|
|
2291
|
-
|
|
2292
|
-
let each_blocks = []
|
|
2293
|
-
|
|
2294
|
-
for (let i = 0; i < each_value.length; i += 1) {
|
|
2295
|
-
each_blocks[i] = create_each_block$2(get_each_context$2(ctx, each_value, i))
|
|
2296
|
-
}
|
|
2297
|
-
|
|
2298
|
-
return {
|
|
2299
|
-
c() {
|
|
2300
|
-
div = element("div")
|
|
2301
|
-
|
|
2302
|
-
for (let i = 0; i < each_blocks_1.length; i += 1) {
|
|
2303
|
-
each_blocks_1[i].c()
|
|
2304
|
-
}
|
|
2305
|
-
|
|
2306
|
-
t = space()
|
|
2307
|
-
|
|
2308
|
-
for (let i = 0; i < each_blocks.length; i += 1) {
|
|
2309
|
-
each_blocks[i].c()
|
|
2310
|
-
}
|
|
2311
|
-
this.h()
|
|
2312
|
-
},
|
|
2313
|
-
|
|
2314
|
-
l(nodes) {
|
|
2315
|
-
div = claim_element(nodes, "DIV", { class: true, style: true }, false)
|
|
2316
|
-
var div_nodes = children(div)
|
|
2317
|
-
|
|
2318
|
-
for (let i = 0; i < each_blocks_1.length; i += 1) {
|
|
2319
|
-
each_blocks_1[i].l(div_nodes)
|
|
2320
|
-
}
|
|
2321
|
-
|
|
2322
|
-
t = claim_space(div_nodes)
|
|
2323
|
-
|
|
2324
|
-
for (let i = 0; i < each_blocks.length; i += 1) {
|
|
2325
|
-
each_blocks[i].l(div_nodes)
|
|
2326
|
-
}
|
|
2327
|
-
|
|
2328
|
-
div_nodes.forEach(detach)
|
|
2329
|
-
this.h()
|
|
2330
|
-
},
|
|
2331
|
-
|
|
2332
|
-
h() {
|
|
2333
|
-
attr(
|
|
2334
|
-
div,
|
|
2335
|
-
"class",
|
|
2336
|
-
(div_class_value = "root " + ctx.containerClass + " svelte-osi0db")
|
|
2337
|
-
)
|
|
2338
|
-
set_style(div, "width", ctx.width)
|
|
2339
|
-
set_style(div, "height", ctx.height)
|
|
2340
|
-
},
|
|
2341
|
-
|
|
2342
|
-
m(target, anchor) {
|
|
2343
|
-
insert(target, div, anchor)
|
|
2344
|
-
|
|
2345
|
-
for (let i = 0; i < each_blocks_1.length; i += 1) {
|
|
2346
|
-
each_blocks_1[i].m(div, null)
|
|
2347
|
-
}
|
|
2348
|
-
|
|
2349
|
-
append(div, t)
|
|
2350
|
-
|
|
2351
|
-
for (let i = 0; i < each_blocks.length; i += 1) {
|
|
2352
|
-
each_blocks[i].m(div, null)
|
|
2353
|
-
}
|
|
2354
|
-
},
|
|
2355
|
-
|
|
2356
|
-
p(changed, ctx) {
|
|
2357
|
-
if (
|
|
2358
|
-
changed.direction ||
|
|
2359
|
-
changed.itemContainerClass ||
|
|
2360
|
-
changed.staticHtmlElements ||
|
|
2361
|
-
changed.children
|
|
2362
|
-
) {
|
|
2363
|
-
each_value_1 = ctx.children
|
|
2364
|
-
|
|
2365
|
-
let i
|
|
2366
|
-
for (i = 0; i < each_value_1.length; i += 1) {
|
|
2367
|
-
const child_ctx = get_each_context_1(ctx, each_value_1, i)
|
|
2368
|
-
|
|
2369
|
-
if (each_blocks_1[i]) {
|
|
2370
|
-
each_blocks_1[i].p(changed, child_ctx)
|
|
2371
|
-
} else {
|
|
2372
|
-
each_blocks_1[i] = create_each_block_1(child_ctx)
|
|
2373
|
-
each_blocks_1[i].c()
|
|
2374
|
-
each_blocks_1[i].m(div, t)
|
|
2375
|
-
}
|
|
2376
|
-
}
|
|
2377
|
-
|
|
2378
|
-
for (; i < each_blocks_1.length; i += 1) {
|
|
2379
|
-
each_blocks_1[i].d(1)
|
|
2380
|
-
}
|
|
2381
|
-
each_blocks_1.length = each_value_1.length
|
|
2382
|
-
}
|
|
2383
|
-
|
|
2384
|
-
if (
|
|
2385
|
-
changed.direction ||
|
|
2386
|
-
changed.itemContainerClass ||
|
|
2387
|
-
changed.dataBoundElements ||
|
|
2388
|
-
changed.data
|
|
2389
|
-
) {
|
|
2390
|
-
each_value = ctx.data
|
|
2391
|
-
|
|
2392
|
-
let i
|
|
2393
|
-
for (i = 0; i < each_value.length; i += 1) {
|
|
2394
|
-
const child_ctx = get_each_context$2(ctx, each_value, i)
|
|
2395
|
-
|
|
2396
|
-
if (each_blocks[i]) {
|
|
2397
|
-
each_blocks[i].p(changed, child_ctx)
|
|
2398
|
-
} else {
|
|
2399
|
-
each_blocks[i] = create_each_block$2(child_ctx)
|
|
2400
|
-
each_blocks[i].c()
|
|
2401
|
-
each_blocks[i].m(div, null)
|
|
2402
|
-
}
|
|
2403
|
-
}
|
|
2404
|
-
|
|
2405
|
-
for (; i < each_blocks.length; i += 1) {
|
|
2406
|
-
each_blocks[i].d(1)
|
|
2407
|
-
}
|
|
2408
|
-
each_blocks.length = each_value.length
|
|
2409
|
-
}
|
|
2410
|
-
|
|
2411
|
-
if (
|
|
2412
|
-
changed.containerClass &&
|
|
2413
|
-
div_class_value !==
|
|
2414
|
-
(div_class_value = "root " + ctx.containerClass + " svelte-osi0db")
|
|
2415
|
-
) {
|
|
2416
|
-
attr(div, "class", div_class_value)
|
|
2417
|
-
}
|
|
2418
|
-
|
|
2419
|
-
if (changed.width) {
|
|
2420
|
-
set_style(div, "width", ctx.width)
|
|
2421
|
-
}
|
|
2422
|
-
|
|
2423
|
-
if (changed.height) {
|
|
2424
|
-
set_style(div, "height", ctx.height)
|
|
2425
|
-
}
|
|
2426
|
-
},
|
|
2427
|
-
|
|
2428
|
-
i: noop,
|
|
2429
|
-
o: noop,
|
|
2430
|
-
|
|
2431
|
-
d(detaching) {
|
|
2432
|
-
if (detaching) {
|
|
2433
|
-
detach(div)
|
|
2434
|
-
}
|
|
2435
|
-
|
|
2436
|
-
destroy_each(each_blocks_1, detaching)
|
|
2437
|
-
|
|
2438
|
-
destroy_each(each_blocks, detaching)
|
|
2439
|
-
},
|
|
2440
|
-
}
|
|
2441
|
-
}
|
|
2442
|
-
|
|
2443
|
-
function instance$5($$self, $$props, $$invalidate) {
|
|
2444
|
-
let {
|
|
2445
|
-
direction = "horizontal",
|
|
2446
|
-
children = [],
|
|
2447
|
-
width = "auto",
|
|
2448
|
-
height = "auto",
|
|
2449
|
-
containerClass = "",
|
|
2450
|
-
itemContainerClass = "",
|
|
2451
|
-
onLoad,
|
|
2452
|
-
data = [],
|
|
2453
|
-
dataItemComponent,
|
|
2454
|
-
_bb,
|
|
2455
|
-
} = $$props
|
|
2456
|
-
|
|
2457
|
-
let staticHtmlElements = {}
|
|
2458
|
-
let staticComponents = {}
|
|
2459
|
-
let dataBoundElements = {}
|
|
2460
|
-
let dataBoundComponents = {}
|
|
2461
|
-
|
|
2462
|
-
const hasDataBoundComponents = () =>
|
|
2463
|
-
Object.getOwnPropertyNames(dataBoundComponents).length === 0
|
|
2464
|
-
|
|
2465
|
-
const hasData = () => Array.isArray(data) && data.length > 0
|
|
2466
|
-
|
|
2467
|
-
const hasStaticComponents = () => {
|
|
2468
|
-
return Object.getOwnPropertyNames(staticComponents).length === 0
|
|
2469
|
-
}
|
|
2470
|
-
|
|
2471
|
-
function div0_binding($$value, index) {
|
|
2472
|
-
if (staticHtmlElements[index] === $$value) return
|
|
2473
|
-
binding_callbacks[$$value ? "unshift" : "push"](() => {
|
|
2474
|
-
staticHtmlElements[index] = $$value
|
|
2475
|
-
$$invalidate("staticHtmlElements", staticHtmlElements)
|
|
2476
|
-
})
|
|
2477
|
-
}
|
|
2478
|
-
|
|
2479
|
-
function div0_binding_1($$value, index) {
|
|
2480
|
-
if (dataBoundElements[index] === $$value) return
|
|
2481
|
-
binding_callbacks[$$value ? "unshift" : "push"](() => {
|
|
2482
|
-
dataBoundElements[index] = $$value
|
|
2483
|
-
$$invalidate("dataBoundElements", dataBoundElements)
|
|
2484
|
-
})
|
|
2485
|
-
}
|
|
2486
|
-
|
|
2487
|
-
$$self.$set = $$props => {
|
|
2488
|
-
if ("direction" in $$props)
|
|
2489
|
-
$$invalidate("direction", (direction = $$props.direction))
|
|
2490
|
-
if ("children" in $$props)
|
|
2491
|
-
$$invalidate("children", (children = $$props.children))
|
|
2492
|
-
if ("width" in $$props) $$invalidate("width", (width = $$props.width))
|
|
2493
|
-
if ("height" in $$props) $$invalidate("height", (height = $$props.height))
|
|
2494
|
-
if ("containerClass" in $$props)
|
|
2495
|
-
$$invalidate("containerClass", (containerClass = $$props.containerClass))
|
|
2496
|
-
if ("itemContainerClass" in $$props)
|
|
2497
|
-
$$invalidate(
|
|
2498
|
-
"itemContainerClass",
|
|
2499
|
-
(itemContainerClass = $$props.itemContainerClass)
|
|
2500
|
-
)
|
|
2501
|
-
if ("onLoad" in $$props) $$invalidate("onLoad", (onLoad = $$props.onLoad))
|
|
2502
|
-
if ("data" in $$props) $$invalidate("data", (data = $$props.data))
|
|
2503
|
-
if ("dataItemComponent" in $$props)
|
|
2504
|
-
$$invalidate(
|
|
2505
|
-
"dataItemComponent",
|
|
2506
|
-
(dataItemComponent = $$props.dataItemComponent)
|
|
2507
|
-
)
|
|
2508
|
-
if ("_bb" in $$props) $$invalidate("_bb", (_bb = $$props._bb))
|
|
2509
|
-
}
|
|
2510
|
-
|
|
2511
|
-
$$self.$$.update = (
|
|
2512
|
-
$$dirty = {
|
|
2513
|
-
staticHtmlElements: 1,
|
|
2514
|
-
staticComponents: 1,
|
|
2515
|
-
_bb: 1,
|
|
2516
|
-
children: 1,
|
|
2517
|
-
dataBoundComponents: 1,
|
|
2518
|
-
dataBoundElements: 1,
|
|
2519
|
-
dataItemComponent: 1,
|
|
2520
|
-
data: 1,
|
|
2521
|
-
}
|
|
2522
|
-
) => {
|
|
2523
|
-
if (
|
|
2524
|
-
$$dirty.staticHtmlElements ||
|
|
2525
|
-
$$dirty.staticComponents ||
|
|
2526
|
-
$$dirty._bb ||
|
|
2527
|
-
$$dirty.children ||
|
|
2528
|
-
$$dirty.dataBoundComponents ||
|
|
2529
|
-
$$dirty.dataBoundElements ||
|
|
2530
|
-
$$dirty.dataItemComponent ||
|
|
2531
|
-
$$dirty.data
|
|
2532
|
-
) {
|
|
2533
|
-
{
|
|
2534
|
-
if (staticHtmlElements) {
|
|
2535
|
-
if (hasStaticComponents()) {
|
|
2536
|
-
for (let c in staticComponents) {
|
|
2537
|
-
staticComponents[c].$destroy()
|
|
2538
|
-
}
|
|
2539
|
-
$$invalidate("staticComponents", (staticComponents = {}))
|
|
2540
|
-
}
|
|
2541
|
-
|
|
2542
|
-
for (let el in staticHtmlElements) {
|
|
2543
|
-
$$invalidate(
|
|
2544
|
-
"staticComponents",
|
|
2545
|
-
(staticComponents[el] = _bb.hydrateComponent(
|
|
2546
|
-
children[el].control,
|
|
2547
|
-
staticHtmlElements[el]
|
|
2548
|
-
)),
|
|
2549
|
-
staticComponents
|
|
2550
|
-
)
|
|
2551
|
-
}
|
|
2552
|
-
}
|
|
2553
|
-
|
|
2554
|
-
if (hasDataBoundComponents()) {
|
|
2555
|
-
for (let c in dataBoundComponents) {
|
|
2556
|
-
dataBoundComponents[c].$destroy()
|
|
2557
|
-
}
|
|
2558
|
-
$$invalidate("dataBoundComponents", (dataBoundComponents = {}))
|
|
2559
|
-
}
|
|
2560
|
-
|
|
2561
|
-
if (hasData()) {
|
|
2562
|
-
for (let d in dataBoundElements) {
|
|
2563
|
-
_bb.hydrateComponent(
|
|
2564
|
-
dataItemComponent,
|
|
2565
|
-
dataBoundElements[d],
|
|
2566
|
-
data[parseInt(d)]
|
|
2567
|
-
)
|
|
2568
|
-
}
|
|
2569
|
-
}
|
|
2570
|
-
}
|
|
2571
|
-
}
|
|
2572
|
-
}
|
|
2573
|
-
|
|
2574
|
-
return {
|
|
2575
|
-
direction,
|
|
2576
|
-
children,
|
|
2577
|
-
width,
|
|
2578
|
-
height,
|
|
2579
|
-
containerClass,
|
|
2580
|
-
itemContainerClass,
|
|
2581
|
-
onLoad,
|
|
2582
|
-
data,
|
|
2583
|
-
dataItemComponent,
|
|
2584
|
-
_bb,
|
|
2585
|
-
staticHtmlElements,
|
|
2586
|
-
dataBoundElements,
|
|
2587
|
-
div0_binding,
|
|
2588
|
-
div0_binding_1,
|
|
2589
|
-
}
|
|
2590
|
-
}
|
|
2591
|
-
|
|
2592
|
-
class StackPanel extends SvelteComponent {
|
|
2593
|
-
constructor(options) {
|
|
2594
|
-
super()
|
|
2595
|
-
if (!document.getElementById("svelte-osi0db-style")) add_css$5()
|
|
2596
|
-
init(this, options, instance$5, create_fragment$5, safe_not_equal, [
|
|
2597
|
-
"direction",
|
|
2598
|
-
"children",
|
|
2599
|
-
"width",
|
|
2600
|
-
"height",
|
|
2601
|
-
"containerClass",
|
|
2602
|
-
"itemContainerClass",
|
|
2603
|
-
"onLoad",
|
|
2604
|
-
"data",
|
|
2605
|
-
"dataItemComponent",
|
|
2606
|
-
"_bb",
|
|
2607
|
-
])
|
|
2608
|
-
}
|
|
2609
|
-
}
|
|
2610
|
-
|
|
2611
|
-
// https://github.com/kaisermann/svelte-css-vars
|
|
2612
|
-
|
|
2613
|
-
var cssVars = (node, props) => {
|
|
2614
|
-
Object.entries(props).forEach(([key, value]) => {
|
|
2615
|
-
node.style.setProperty(`--${key}`, value)
|
|
2616
|
-
})
|
|
2617
|
-
|
|
2618
|
-
return {
|
|
2619
|
-
update(new_props) {
|
|
2620
|
-
Object.entries(new_props).forEach(([key, value]) => {
|
|
2621
|
-
node.style.setProperty(`--${key}`, value)
|
|
2622
|
-
delete props[key]
|
|
2623
|
-
})
|
|
2624
|
-
|
|
2625
|
-
Object.keys(props).forEach(name => node.style.removeProperty(`--${name}`))
|
|
2626
|
-
props = new_props
|
|
2627
|
-
},
|
|
2628
|
-
}
|
|
2629
|
-
}
|
|
2630
|
-
|
|
2631
|
-
/* src\Nav.svelte generated by Svelte v3.12.1 */
|
|
2632
|
-
|
|
2633
|
-
function add_css$6() {
|
|
2634
|
-
var style = element("style")
|
|
2635
|
-
style.id = "svelte-aihwli-style"
|
|
2636
|
-
style.textContent =
|
|
2637
|
-
".root.svelte-aihwli{height:100%;width:100%;grid-template-columns:[navbar] auto [content] 1fr;display:grid}.navbar.svelte-aihwli{grid-column:navbar;background:var(--navBarBackground);border:var(--navBarBorder);color:var(--navBarColor)}.navitem.svelte-aihwli{padding:10px 17px;cursor:pointer}.navitem.svelte-aihwli:hover{background:var(--itemHoverBackground);color:var(--itemHoverColor)}.navitem.selected.svelte-aihwli{background:var(--selectedItemBackground);border:var(--selectedItemBorder);color:var(--selectedItemColor)}.content.svelte-aihwli{grid-column:content}"
|
|
2638
|
-
append(document.head, style)
|
|
2639
|
-
}
|
|
2640
|
-
|
|
2641
|
-
function get_each_context$3(ctx, list, i) {
|
|
2642
|
-
const child_ctx = Object.create(ctx)
|
|
2643
|
-
child_ctx.navItem = list[i]
|
|
2644
|
-
child_ctx.index = i
|
|
2645
|
-
return child_ctx
|
|
2646
|
-
}
|
|
2647
|
-
|
|
2648
|
-
// (36:8) {#each items as navItem, index}
|
|
2649
|
-
function create_each_block$3(ctx) {
|
|
2650
|
-
var div,
|
|
2651
|
-
t0_value = ctx.navItem.title + "",
|
|
2652
|
-
t0,
|
|
2653
|
-
t1,
|
|
2654
|
-
dispose
|
|
2655
|
-
|
|
2656
|
-
return {
|
|
2657
|
-
c() {
|
|
2658
|
-
div = element("div")
|
|
2659
|
-
t0 = text(t0_value)
|
|
2660
|
-
t1 = space()
|
|
2661
|
-
this.h()
|
|
2662
|
-
},
|
|
2663
|
-
|
|
2664
|
-
l(nodes) {
|
|
2665
|
-
div = claim_element(nodes, "DIV", { class: true }, false)
|
|
2666
|
-
var div_nodes = children(div)
|
|
2667
|
-
|
|
2668
|
-
t0 = claim_text(div_nodes, t0_value)
|
|
2669
|
-
t1 = claim_space(div_nodes)
|
|
2670
|
-
div_nodes.forEach(detach)
|
|
2671
|
-
this.h()
|
|
2672
|
-
},
|
|
2673
|
-
|
|
2674
|
-
h() {
|
|
2675
|
-
attr(div, "class", "navitem svelte-aihwli")
|
|
2676
|
-
toggle_class(div, "selected", ctx.selectedIndex === ctx.index)
|
|
2677
|
-
dispose = listen(div, "click", ctx.onSelectItem(ctx.index))
|
|
2678
|
-
},
|
|
2679
|
-
|
|
2680
|
-
m(target, anchor) {
|
|
2681
|
-
insert(target, div, anchor)
|
|
2682
|
-
append(div, t0)
|
|
2683
|
-
append(div, t1)
|
|
2684
|
-
},
|
|
2685
|
-
|
|
2686
|
-
p(changed, new_ctx) {
|
|
2687
|
-
ctx = new_ctx
|
|
2688
|
-
if (changed.items && t0_value !== (t0_value = ctx.navItem.title + "")) {
|
|
2689
|
-
set_data(t0, t0_value)
|
|
2690
|
-
}
|
|
2691
|
-
|
|
2692
|
-
if (changed.selectedIndex) {
|
|
2693
|
-
toggle_class(div, "selected", ctx.selectedIndex === ctx.index)
|
|
2694
|
-
}
|
|
2695
|
-
},
|
|
2696
|
-
|
|
2697
|
-
d(detaching) {
|
|
2698
|
-
if (detaching) {
|
|
2699
|
-
detach(div)
|
|
2700
|
-
}
|
|
2701
|
-
|
|
2702
|
-
dispose()
|
|
2703
|
-
},
|
|
2704
|
-
}
|
|
2705
|
-
}
|
|
2706
|
-
|
|
2707
|
-
function create_fragment$6(ctx) {
|
|
2708
|
-
var div2, div0, t, div1, cssVars_action
|
|
2709
|
-
|
|
2710
|
-
let each_value = ctx.items
|
|
2711
|
-
|
|
2712
|
-
let each_blocks = []
|
|
2713
|
-
|
|
2714
|
-
for (let i = 0; i < each_value.length; i += 1) {
|
|
2715
|
-
each_blocks[i] = create_each_block$3(get_each_context$3(ctx, each_value, i))
|
|
2716
|
-
}
|
|
2717
|
-
|
|
2718
|
-
return {
|
|
2719
|
-
c() {
|
|
2720
|
-
div2 = element("div")
|
|
2721
|
-
div0 = element("div")
|
|
2722
|
-
|
|
2723
|
-
for (let i = 0; i < each_blocks.length; i += 1) {
|
|
2724
|
-
each_blocks[i].c()
|
|
2725
|
-
}
|
|
2726
|
-
|
|
2727
|
-
t = space()
|
|
2728
|
-
div1 = element("div")
|
|
2729
|
-
this.h()
|
|
2730
|
-
},
|
|
2731
|
-
|
|
2732
|
-
l(nodes) {
|
|
2733
|
-
div2 = claim_element(nodes, "DIV", { class: true }, false)
|
|
2734
|
-
var div2_nodes = children(div2)
|
|
2735
|
-
|
|
2736
|
-
div0 = claim_element(div2_nodes, "DIV", { class: true }, false)
|
|
2737
|
-
var div0_nodes = children(div0)
|
|
2738
|
-
|
|
2739
|
-
for (let i = 0; i < each_blocks.length; i += 1) {
|
|
2740
|
-
each_blocks[i].l(div0_nodes)
|
|
2741
|
-
}
|
|
2742
|
-
|
|
2743
|
-
div0_nodes.forEach(detach)
|
|
2744
|
-
t = claim_space(div2_nodes)
|
|
2745
|
-
|
|
2746
|
-
div1 = claim_element(div2_nodes, "DIV", { class: true }, false)
|
|
2747
|
-
var div1_nodes = children(div1)
|
|
2748
|
-
|
|
2749
|
-
div1_nodes.forEach(detach)
|
|
2750
|
-
div2_nodes.forEach(detach)
|
|
2751
|
-
this.h()
|
|
2752
|
-
},
|
|
2753
|
-
|
|
2754
|
-
h() {
|
|
2755
|
-
attr(div0, "class", "navbar svelte-aihwli")
|
|
2756
|
-
attr(div1, "class", "content svelte-aihwli")
|
|
2757
|
-
attr(div2, "class", "root svelte-aihwli")
|
|
2758
|
-
},
|
|
2759
|
-
|
|
2760
|
-
m(target, anchor) {
|
|
2761
|
-
insert(target, div2, anchor)
|
|
2762
|
-
append(div2, div0)
|
|
2763
|
-
|
|
2764
|
-
for (let i = 0; i < each_blocks.length; i += 1) {
|
|
2765
|
-
each_blocks[i].m(div0, null)
|
|
2766
|
-
}
|
|
2767
|
-
|
|
2768
|
-
append(div2, t)
|
|
2769
|
-
append(div2, div1)
|
|
2770
|
-
ctx.div1_binding(div1)
|
|
2771
|
-
cssVars_action = cssVars.call(null, div2, ctx.styleVars) || {}
|
|
2772
|
-
},
|
|
2773
|
-
|
|
2774
|
-
p(changed, ctx) {
|
|
2775
|
-
if (changed.selectedIndex || changed.items) {
|
|
2776
|
-
each_value = ctx.items
|
|
2777
|
-
|
|
2778
|
-
let i
|
|
2779
|
-
for (i = 0; i < each_value.length; i += 1) {
|
|
2780
|
-
const child_ctx = get_each_context$3(ctx, each_value, i)
|
|
2781
|
-
|
|
2782
|
-
if (each_blocks[i]) {
|
|
2783
|
-
each_blocks[i].p(changed, child_ctx)
|
|
2784
|
-
} else {
|
|
2785
|
-
each_blocks[i] = create_each_block$3(child_ctx)
|
|
2786
|
-
each_blocks[i].c()
|
|
2787
|
-
each_blocks[i].m(div0, null)
|
|
2788
|
-
}
|
|
2789
|
-
}
|
|
2790
|
-
|
|
2791
|
-
for (; i < each_blocks.length; i += 1) {
|
|
2792
|
-
each_blocks[i].d(1)
|
|
2793
|
-
}
|
|
2794
|
-
each_blocks.length = each_value.length
|
|
2795
|
-
}
|
|
2796
|
-
|
|
2797
|
-
if (typeof cssVars_action.update === "function" && changed.styleVars) {
|
|
2798
|
-
cssVars_action.update.call(null, ctx.styleVars)
|
|
2799
|
-
}
|
|
2800
|
-
},
|
|
2801
|
-
|
|
2802
|
-
i: noop,
|
|
2803
|
-
o: noop,
|
|
2804
|
-
|
|
2805
|
-
d(detaching) {
|
|
2806
|
-
if (detaching) {
|
|
2807
|
-
detach(div2)
|
|
2808
|
-
}
|
|
2809
|
-
|
|
2810
|
-
destroy_each(each_blocks, detaching)
|
|
2811
|
-
|
|
2812
|
-
ctx.div1_binding(null)
|
|
2813
|
-
if (cssVars_action && typeof cssVars_action.destroy === "function")
|
|
2814
|
-
cssVars_action.destroy()
|
|
2815
|
-
},
|
|
2816
|
-
}
|
|
2817
|
-
}
|
|
2818
|
-
|
|
2819
|
-
function instance$6($$self, $$props, $$invalidate) {
|
|
2820
|
-
let {
|
|
2821
|
-
navBarBackground = "",
|
|
2822
|
-
navBarBorder = "",
|
|
2823
|
-
navBarColor = "",
|
|
2824
|
-
selectedItemBackground = "",
|
|
2825
|
-
selectedItemColor = "",
|
|
2826
|
-
selectedItemBorder = "",
|
|
2827
|
-
itemHoverBackground = "",
|
|
2828
|
-
itemHoverColor = "",
|
|
2829
|
-
items = [],
|
|
2830
|
-
_bb,
|
|
2831
|
-
} = $$props
|
|
2832
|
-
|
|
2833
|
-
let selectedIndex
|
|
2834
|
-
let contentElement
|
|
2835
|
-
|
|
2836
|
-
const onSelectItem = index => () => {
|
|
2837
|
-
$$invalidate("selectedIndex", (selectedIndex = index))
|
|
2838
|
-
_bb.hydrateComponent(items[index].component, contentElement)
|
|
2839
|
-
}
|
|
2840
|
-
|
|
2841
|
-
function div1_binding($$value) {
|
|
2842
|
-
binding_callbacks[$$value ? "unshift" : "push"](() => {
|
|
2843
|
-
$$invalidate("contentElement", (contentElement = $$value))
|
|
2844
|
-
})
|
|
2845
|
-
}
|
|
2846
|
-
|
|
2847
|
-
$$self.$set = $$props => {
|
|
2848
|
-
if ("navBarBackground" in $$props)
|
|
2849
|
-
$$invalidate(
|
|
2850
|
-
"navBarBackground",
|
|
2851
|
-
(navBarBackground = $$props.navBarBackground)
|
|
2852
|
-
)
|
|
2853
|
-
if ("navBarBorder" in $$props)
|
|
2854
|
-
$$invalidate("navBarBorder", (navBarBorder = $$props.navBarBorder))
|
|
2855
|
-
if ("navBarColor" in $$props)
|
|
2856
|
-
$$invalidate("navBarColor", (navBarColor = $$props.navBarColor))
|
|
2857
|
-
if ("selectedItemBackground" in $$props)
|
|
2858
|
-
$$invalidate(
|
|
2859
|
-
"selectedItemBackground",
|
|
2860
|
-
(selectedItemBackground = $$props.selectedItemBackground)
|
|
2861
|
-
)
|
|
2862
|
-
if ("selectedItemColor" in $$props)
|
|
2863
|
-
$$invalidate(
|
|
2864
|
-
"selectedItemColor",
|
|
2865
|
-
(selectedItemColor = $$props.selectedItemColor)
|
|
2866
|
-
)
|
|
2867
|
-
if ("selectedItemBorder" in $$props)
|
|
2868
|
-
$$invalidate(
|
|
2869
|
-
"selectedItemBorder",
|
|
2870
|
-
(selectedItemBorder = $$props.selectedItemBorder)
|
|
2871
|
-
)
|
|
2872
|
-
if ("itemHoverBackground" in $$props)
|
|
2873
|
-
$$invalidate(
|
|
2874
|
-
"itemHoverBackground",
|
|
2875
|
-
(itemHoverBackground = $$props.itemHoverBackground)
|
|
2876
|
-
)
|
|
2877
|
-
if ("itemHoverColor" in $$props)
|
|
2878
|
-
$$invalidate("itemHoverColor", (itemHoverColor = $$props.itemHoverColor))
|
|
2879
|
-
if ("items" in $$props) $$invalidate("items", (items = $$props.items))
|
|
2880
|
-
if ("_bb" in $$props) $$invalidate("_bb", (_bb = $$props._bb))
|
|
2881
|
-
}
|
|
2882
|
-
|
|
2883
|
-
let styleVars
|
|
2884
|
-
|
|
2885
|
-
$$self.$$.update = (
|
|
2886
|
-
$$dirty = {
|
|
2887
|
-
navBarBackground: 1,
|
|
2888
|
-
navBarBorder: 1,
|
|
2889
|
-
navBarColor: 1,
|
|
2890
|
-
selectedItemBackground: 1,
|
|
2891
|
-
selectedItemColor: 1,
|
|
2892
|
-
selectedItemBorder: 1,
|
|
2893
|
-
itemHoverBackground: 1,
|
|
2894
|
-
itemHoverColor: 1,
|
|
2895
|
-
}
|
|
2896
|
-
) => {
|
|
2897
|
-
if (
|
|
2898
|
-
$$dirty.navBarBackground ||
|
|
2899
|
-
$$dirty.navBarBorder ||
|
|
2900
|
-
$$dirty.navBarColor ||
|
|
2901
|
-
$$dirty.selectedItemBackground ||
|
|
2902
|
-
$$dirty.selectedItemColor ||
|
|
2903
|
-
$$dirty.selectedItemBorder ||
|
|
2904
|
-
$$dirty.itemHoverBackground ||
|
|
2905
|
-
$$dirty.itemHoverColor
|
|
2906
|
-
) {
|
|
2907
|
-
$$invalidate(
|
|
2908
|
-
"styleVars",
|
|
2909
|
-
(styleVars = {
|
|
2910
|
-
navBarBackground,
|
|
2911
|
-
navBarBorder,
|
|
2912
|
-
navBarColor,
|
|
2913
|
-
selectedItemBackground,
|
|
2914
|
-
selectedItemColor,
|
|
2915
|
-
selectedItemBorder,
|
|
2916
|
-
itemHoverBackground,
|
|
2917
|
-
itemHoverColor,
|
|
2918
|
-
})
|
|
2919
|
-
)
|
|
2920
|
-
}
|
|
2921
|
-
}
|
|
2922
|
-
|
|
2923
|
-
return {
|
|
2924
|
-
navBarBackground,
|
|
2925
|
-
navBarBorder,
|
|
2926
|
-
navBarColor,
|
|
2927
|
-
selectedItemBackground,
|
|
2928
|
-
selectedItemColor,
|
|
2929
|
-
selectedItemBorder,
|
|
2930
|
-
itemHoverBackground,
|
|
2931
|
-
itemHoverColor,
|
|
2932
|
-
items,
|
|
2933
|
-
_bb,
|
|
2934
|
-
selectedIndex,
|
|
2935
|
-
contentElement,
|
|
2936
|
-
onSelectItem,
|
|
2937
|
-
styleVars,
|
|
2938
|
-
div1_binding,
|
|
2939
|
-
}
|
|
2940
|
-
}
|
|
2941
|
-
|
|
2942
|
-
class Nav extends SvelteComponent {
|
|
2943
|
-
constructor(options) {
|
|
2944
|
-
super()
|
|
2945
|
-
if (!document.getElementById("svelte-aihwli-style")) add_css$6()
|
|
2946
|
-
init(this, options, instance$6, create_fragment$6, safe_not_equal, [
|
|
2947
|
-
"navBarBackground",
|
|
2948
|
-
"navBarBorder",
|
|
2949
|
-
"navBarColor",
|
|
2950
|
-
"selectedItemBackground",
|
|
2951
|
-
"selectedItemColor",
|
|
2952
|
-
"selectedItemBorder",
|
|
2953
|
-
"itemHoverBackground",
|
|
2954
|
-
"itemHoverColor",
|
|
2955
|
-
"items",
|
|
2956
|
-
"_bb",
|
|
2957
|
-
])
|
|
2958
|
-
}
|
|
2959
|
-
}
|
|
2960
|
-
|
|
2961
|
-
/* src\Panel.svelte generated by Svelte v3.12.1 */
|
|
2962
|
-
|
|
2963
|
-
function add_css$7() {
|
|
2964
|
-
var style = element("style")
|
|
2965
|
-
style.id = "svelte-b2rjlq-style"
|
|
2966
|
-
style.textContent =
|
|
2967
|
-
".panel.svelte-b2rjlq:hover{background:var(--hoverBackground);color:var(--hoverColor)}"
|
|
2968
|
-
append(document.head, style)
|
|
2969
|
-
}
|
|
2970
|
-
|
|
2971
|
-
function create_fragment$7(ctx) {
|
|
2972
|
-
var div,
|
|
2973
|
-
t_value = ctx.component ? "" : ctx.text + "",
|
|
2974
|
-
t,
|
|
2975
|
-
div_class_value,
|
|
2976
|
-
cssVars_action,
|
|
2977
|
-
dispose
|
|
2978
|
-
|
|
2979
|
-
return {
|
|
2980
|
-
c() {
|
|
2981
|
-
div = element("div")
|
|
2982
|
-
t = text(t_value)
|
|
2983
|
-
this.h()
|
|
2984
|
-
},
|
|
2985
|
-
|
|
2986
|
-
l(nodes) {
|
|
2987
|
-
div = claim_element(
|
|
2988
|
-
nodes,
|
|
2989
|
-
"DIV",
|
|
2990
|
-
{ class: true, style: true, "this:bind": true },
|
|
2991
|
-
false
|
|
2992
|
-
)
|
|
2993
|
-
var div_nodes = children(div)
|
|
2994
|
-
|
|
2995
|
-
t = claim_text(div_nodes, t_value)
|
|
2996
|
-
div_nodes.forEach(detach)
|
|
2997
|
-
this.h()
|
|
2998
|
-
},
|
|
2999
|
-
|
|
3000
|
-
h() {
|
|
3001
|
-
attr(
|
|
3002
|
-
div,
|
|
3003
|
-
"class",
|
|
3004
|
-
(div_class_value =
|
|
3005
|
-
"" + ctx.containerClass + " panel" + " svelte-b2rjlq")
|
|
3006
|
-
)
|
|
3007
|
-
attr(div, "style", ctx.style)
|
|
3008
|
-
attr(div, "this:bind", ctx.componentElement)
|
|
3009
|
-
dispose = listen(div, "click", ctx.click_handler)
|
|
3010
|
-
},
|
|
3011
|
-
|
|
3012
|
-
m(target, anchor) {
|
|
3013
|
-
insert(target, div, anchor)
|
|
3014
|
-
append(div, t)
|
|
3015
|
-
cssVars_action = cssVars.call(null, div, ctx.styleVars) || {}
|
|
3016
|
-
},
|
|
3017
|
-
|
|
3018
|
-
p(changed, ctx) {
|
|
3019
|
-
if (
|
|
3020
|
-
(changed.component || changed.text) &&
|
|
3021
|
-
t_value !== (t_value = ctx.component ? "" : ctx.text + "")
|
|
3022
|
-
) {
|
|
3023
|
-
set_data(t, t_value)
|
|
3024
|
-
}
|
|
3025
|
-
|
|
3026
|
-
if (
|
|
3027
|
-
changed.containerClass &&
|
|
3028
|
-
div_class_value !==
|
|
3029
|
-
(div_class_value =
|
|
3030
|
-
"" + ctx.containerClass + " panel" + " svelte-b2rjlq")
|
|
3031
|
-
) {
|
|
3032
|
-
attr(div, "class", div_class_value)
|
|
3033
|
-
}
|
|
3034
|
-
|
|
3035
|
-
if (changed.style) {
|
|
3036
|
-
attr(div, "style", ctx.style)
|
|
3037
|
-
}
|
|
3038
|
-
|
|
3039
|
-
if (typeof cssVars_action.update === "function" && changed.styleVars) {
|
|
3040
|
-
cssVars_action.update.call(null, ctx.styleVars)
|
|
3041
|
-
}
|
|
3042
|
-
},
|
|
3043
|
-
|
|
3044
|
-
i: noop,
|
|
3045
|
-
o: noop,
|
|
3046
|
-
|
|
3047
|
-
d(detaching) {
|
|
3048
|
-
if (detaching) {
|
|
3049
|
-
detach(div)
|
|
3050
|
-
}
|
|
3051
|
-
|
|
3052
|
-
if (cssVars_action && typeof cssVars_action.destroy === "function")
|
|
3053
|
-
cssVars_action.destroy()
|
|
3054
|
-
dispose()
|
|
3055
|
-
},
|
|
3056
|
-
}
|
|
3057
|
-
}
|
|
3058
|
-
|
|
3059
|
-
function instance$7($$self, $$props, $$invalidate) {
|
|
3060
|
-
let {
|
|
3061
|
-
component = "",
|
|
3062
|
-
text = "",
|
|
3063
|
-
containerClass = "",
|
|
3064
|
-
background = "",
|
|
3065
|
-
border = "",
|
|
3066
|
-
borderRadius = "",
|
|
3067
|
-
font = "",
|
|
3068
|
-
display = "",
|
|
3069
|
-
textAlign = "",
|
|
3070
|
-
color = "",
|
|
3071
|
-
padding = "",
|
|
3072
|
-
margin = "",
|
|
3073
|
-
hoverBackground = "",
|
|
3074
|
-
hoverColor = "",
|
|
3075
|
-
onClick,
|
|
3076
|
-
height,
|
|
3077
|
-
width,
|
|
3078
|
-
_bb,
|
|
3079
|
-
} = $$props
|
|
3080
|
-
|
|
3081
|
-
let styleVars
|
|
3082
|
-
let style = ""
|
|
3083
|
-
let componentElement
|
|
3084
|
-
|
|
3085
|
-
const click_handler = () => (onClick ? onClick() : undefined)
|
|
3086
|
-
|
|
3087
|
-
$$self.$set = $$props => {
|
|
3088
|
-
if ("component" in $$props)
|
|
3089
|
-
$$invalidate("component", (component = $$props.component))
|
|
3090
|
-
if ("text" in $$props) $$invalidate("text", (text = $$props.text))
|
|
3091
|
-
if ("containerClass" in $$props)
|
|
3092
|
-
$$invalidate("containerClass", (containerClass = $$props.containerClass))
|
|
3093
|
-
if ("background" in $$props)
|
|
3094
|
-
$$invalidate("background", (background = $$props.background))
|
|
3095
|
-
if ("border" in $$props) $$invalidate("border", (border = $$props.border))
|
|
3096
|
-
if ("borderRadius" in $$props)
|
|
3097
|
-
$$invalidate("borderRadius", (borderRadius = $$props.borderRadius))
|
|
3098
|
-
if ("font" in $$props) $$invalidate("font", (font = $$props.font))
|
|
3099
|
-
if ("display" in $$props)
|
|
3100
|
-
$$invalidate("display", (display = $$props.display))
|
|
3101
|
-
if ("textAlign" in $$props)
|
|
3102
|
-
$$invalidate("textAlign", (textAlign = $$props.textAlign))
|
|
3103
|
-
if ("color" in $$props) $$invalidate("color", (color = $$props.color))
|
|
3104
|
-
if ("padding" in $$props)
|
|
3105
|
-
$$invalidate("padding", (padding = $$props.padding))
|
|
3106
|
-
if ("margin" in $$props) $$invalidate("margin", (margin = $$props.margin))
|
|
3107
|
-
if ("hoverBackground" in $$props)
|
|
3108
|
-
$$invalidate(
|
|
3109
|
-
"hoverBackground",
|
|
3110
|
-
(hoverBackground = $$props.hoverBackground)
|
|
3111
|
-
)
|
|
3112
|
-
if ("hoverColor" in $$props)
|
|
3113
|
-
$$invalidate("hoverColor", (hoverColor = $$props.hoverColor))
|
|
3114
|
-
if ("onClick" in $$props)
|
|
3115
|
-
$$invalidate("onClick", (onClick = $$props.onClick))
|
|
3116
|
-
if ("height" in $$props) $$invalidate("height", (height = $$props.height))
|
|
3117
|
-
if ("width" in $$props) $$invalidate("width", (width = $$props.width))
|
|
3118
|
-
if ("_bb" in $$props) $$invalidate("_bb", (_bb = $$props._bb))
|
|
3119
|
-
}
|
|
3120
|
-
|
|
3121
|
-
$$self.$$.update = (
|
|
3122
|
-
$$dirty = {
|
|
3123
|
-
border: 1,
|
|
3124
|
-
background: 1,
|
|
3125
|
-
font: 1,
|
|
3126
|
-
margin: 1,
|
|
3127
|
-
padding: 1,
|
|
3128
|
-
display: 1,
|
|
3129
|
-
color: 1,
|
|
3130
|
-
height: 1,
|
|
3131
|
-
width: 1,
|
|
3132
|
-
textAlign: 1,
|
|
3133
|
-
borderRadius: 1,
|
|
3134
|
-
_bb: 1,
|
|
3135
|
-
component: 1,
|
|
3136
|
-
componentElement: 1,
|
|
3137
|
-
hoverBackground: 1,
|
|
3138
|
-
hoverColor: 1,
|
|
3139
|
-
onClick: 1,
|
|
3140
|
-
}
|
|
3141
|
-
) => {
|
|
3142
|
-
if (
|
|
3143
|
-
$$dirty.border ||
|
|
3144
|
-
$$dirty.background ||
|
|
3145
|
-
$$dirty.font ||
|
|
3146
|
-
$$dirty.margin ||
|
|
3147
|
-
$$dirty.padding ||
|
|
3148
|
-
$$dirty.display ||
|
|
3149
|
-
$$dirty.color ||
|
|
3150
|
-
$$dirty.height ||
|
|
3151
|
-
$$dirty.width ||
|
|
3152
|
-
$$dirty.textAlign ||
|
|
3153
|
-
$$dirty.borderRadius ||
|
|
3154
|
-
$$dirty._bb ||
|
|
3155
|
-
$$dirty.component ||
|
|
3156
|
-
$$dirty.componentElement ||
|
|
3157
|
-
$$dirty.hoverBackground ||
|
|
3158
|
-
$$dirty.hoverColor ||
|
|
3159
|
-
$$dirty.onClick
|
|
3160
|
-
) {
|
|
3161
|
-
{
|
|
3162
|
-
$$invalidate(
|
|
3163
|
-
"style",
|
|
3164
|
-
(style = buildStyle({
|
|
3165
|
-
border,
|
|
3166
|
-
background,
|
|
3167
|
-
font,
|
|
3168
|
-
margin,
|
|
3169
|
-
padding,
|
|
3170
|
-
display,
|
|
3171
|
-
color,
|
|
3172
|
-
height,
|
|
3173
|
-
width,
|
|
3174
|
-
"text-align": textAlign,
|
|
3175
|
-
"border-radius": borderRadius,
|
|
3176
|
-
}))
|
|
3177
|
-
)
|
|
3178
|
-
|
|
3179
|
-
if (_bb && component) {
|
|
3180
|
-
_bb.hydrateComponent(component, componentElement)
|
|
3181
|
-
}
|
|
3182
|
-
|
|
3183
|
-
$$invalidate(
|
|
3184
|
-
"styleVars",
|
|
3185
|
-
(styleVars = {
|
|
3186
|
-
hoverBackground: hoverBackground || background,
|
|
3187
|
-
hoverColor: hoverColor || color,
|
|
3188
|
-
pointer: onClick ? "cursor" : "none",
|
|
3189
|
-
})
|
|
3190
|
-
)
|
|
3191
|
-
}
|
|
3192
|
-
}
|
|
3193
|
-
}
|
|
3194
|
-
|
|
3195
|
-
return {
|
|
3196
|
-
component,
|
|
3197
|
-
text,
|
|
3198
|
-
containerClass,
|
|
3199
|
-
background,
|
|
3200
|
-
border,
|
|
3201
|
-
borderRadius,
|
|
3202
|
-
font,
|
|
3203
|
-
display,
|
|
3204
|
-
textAlign,
|
|
3205
|
-
color,
|
|
3206
|
-
padding,
|
|
3207
|
-
margin,
|
|
3208
|
-
hoverBackground,
|
|
3209
|
-
hoverColor,
|
|
3210
|
-
onClick,
|
|
3211
|
-
height,
|
|
3212
|
-
width,
|
|
3213
|
-
_bb,
|
|
3214
|
-
styleVars,
|
|
3215
|
-
style,
|
|
3216
|
-
componentElement,
|
|
3217
|
-
click_handler,
|
|
3218
|
-
}
|
|
3219
|
-
}
|
|
3220
|
-
|
|
3221
|
-
class Panel extends SvelteComponent {
|
|
3222
|
-
constructor(options) {
|
|
3223
|
-
super()
|
|
3224
|
-
if (!document.getElementById("svelte-b2rjlq-style")) add_css$7()
|
|
3225
|
-
init(this, options, instance$7, create_fragment$7, safe_not_equal, [
|
|
3226
|
-
"component",
|
|
3227
|
-
"text",
|
|
3228
|
-
"containerClass",
|
|
3229
|
-
"background",
|
|
3230
|
-
"border",
|
|
3231
|
-
"borderRadius",
|
|
3232
|
-
"font",
|
|
3233
|
-
"display",
|
|
3234
|
-
"textAlign",
|
|
3235
|
-
"color",
|
|
3236
|
-
"padding",
|
|
3237
|
-
"margin",
|
|
3238
|
-
"hoverBackground",
|
|
3239
|
-
"hoverColor",
|
|
3240
|
-
"onClick",
|
|
3241
|
-
"height",
|
|
3242
|
-
"width",
|
|
3243
|
-
"_bb",
|
|
3244
|
-
])
|
|
3245
|
-
}
|
|
3246
|
-
}
|
|
3247
|
-
|
|
3248
|
-
/* src\Text.svelte generated by Svelte v3.12.1 */
|
|
3249
|
-
|
|
3250
|
-
function create_fragment$8(ctx) {
|
|
3251
|
-
var div, t
|
|
3252
|
-
|
|
3253
|
-
return {
|
|
3254
|
-
c() {
|
|
3255
|
-
div = element("div")
|
|
3256
|
-
t = text(ctx.value)
|
|
3257
|
-
this.h()
|
|
3258
|
-
},
|
|
3259
|
-
|
|
3260
|
-
l(nodes) {
|
|
3261
|
-
div = claim_element(nodes, "DIV", { class: true, style: true }, false)
|
|
3262
|
-
var div_nodes = children(div)
|
|
3263
|
-
|
|
3264
|
-
t = claim_text(div_nodes, ctx.value)
|
|
3265
|
-
div_nodes.forEach(detach)
|
|
3266
|
-
this.h()
|
|
3267
|
-
},
|
|
3268
|
-
|
|
3269
|
-
h() {
|
|
3270
|
-
attr(div, "class", ctx.containerClass)
|
|
3271
|
-
attr(div, "style", ctx.style)
|
|
3272
|
-
},
|
|
3273
|
-
|
|
3274
|
-
m(target, anchor) {
|
|
3275
|
-
insert(target, div, anchor)
|
|
3276
|
-
append(div, t)
|
|
3277
|
-
},
|
|
3278
|
-
|
|
3279
|
-
p(changed, ctx) {
|
|
3280
|
-
if (changed.value) {
|
|
3281
|
-
set_data(t, ctx.value)
|
|
3282
|
-
}
|
|
3283
|
-
|
|
3284
|
-
if (changed.containerClass) {
|
|
3285
|
-
attr(div, "class", ctx.containerClass)
|
|
3286
|
-
}
|
|
3287
|
-
|
|
3288
|
-
if (changed.style) {
|
|
3289
|
-
attr(div, "style", ctx.style)
|
|
3290
|
-
}
|
|
3291
|
-
},
|
|
3292
|
-
|
|
3293
|
-
i: noop,
|
|
3294
|
-
o: noop,
|
|
3295
|
-
|
|
3296
|
-
d(detaching) {
|
|
3297
|
-
if (detaching) {
|
|
3298
|
-
detach(div)
|
|
3299
|
-
}
|
|
3300
|
-
},
|
|
3301
|
-
}
|
|
3302
|
-
}
|
|
3303
|
-
|
|
3304
|
-
function instance$8($$self, $$props, $$invalidate) {
|
|
3305
|
-
let {
|
|
3306
|
-
value = "",
|
|
3307
|
-
containerClass = "",
|
|
3308
|
-
font = "",
|
|
3309
|
-
textAlign = "",
|
|
3310
|
-
verticalAlign = "",
|
|
3311
|
-
color = "",
|
|
3312
|
-
display = "",
|
|
3313
|
-
_bb,
|
|
3314
|
-
} = $$props
|
|
3315
|
-
|
|
3316
|
-
let style = ""
|
|
3317
|
-
|
|
3318
|
-
$$self.$set = $$props => {
|
|
3319
|
-
if ("value" in $$props) $$invalidate("value", (value = $$props.value))
|
|
3320
|
-
if ("containerClass" in $$props)
|
|
3321
|
-
$$invalidate("containerClass", (containerClass = $$props.containerClass))
|
|
3322
|
-
if ("font" in $$props) $$invalidate("font", (font = $$props.font))
|
|
3323
|
-
if ("textAlign" in $$props)
|
|
3324
|
-
$$invalidate("textAlign", (textAlign = $$props.textAlign))
|
|
3325
|
-
if ("verticalAlign" in $$props)
|
|
3326
|
-
$$invalidate("verticalAlign", (verticalAlign = $$props.verticalAlign))
|
|
3327
|
-
if ("color" in $$props) $$invalidate("color", (color = $$props.color))
|
|
3328
|
-
if ("display" in $$props)
|
|
3329
|
-
$$invalidate("display", (display = $$props.display))
|
|
3330
|
-
if ("_bb" in $$props) $$invalidate("_bb", (_bb = $$props._bb))
|
|
3331
|
-
}
|
|
3332
|
-
|
|
3333
|
-
$$self.$$.update = (
|
|
3334
|
-
$$dirty = { font: 1, verticalAlign: 1, color: 1, textAlign: 1 }
|
|
3335
|
-
) => {
|
|
3336
|
-
if (
|
|
3337
|
-
$$dirty.font ||
|
|
3338
|
-
$$dirty.verticalAlign ||
|
|
3339
|
-
$$dirty.color ||
|
|
3340
|
-
$$dirty.textAlign
|
|
3341
|
-
) {
|
|
3342
|
-
{
|
|
3343
|
-
$$invalidate(
|
|
3344
|
-
"style",
|
|
3345
|
-
(style = buildStyle({
|
|
3346
|
-
font,
|
|
3347
|
-
verticalAlign,
|
|
3348
|
-
color,
|
|
3349
|
-
"text-align": textAlign,
|
|
3350
|
-
"vertical-align": verticalAlign,
|
|
3351
|
-
}))
|
|
3352
|
-
)
|
|
3353
|
-
}
|
|
3354
|
-
}
|
|
3355
|
-
}
|
|
3356
|
-
|
|
3357
|
-
return {
|
|
3358
|
-
value,
|
|
3359
|
-
containerClass,
|
|
3360
|
-
font,
|
|
3361
|
-
textAlign,
|
|
3362
|
-
verticalAlign,
|
|
3363
|
-
color,
|
|
3364
|
-
display,
|
|
3365
|
-
_bb,
|
|
3366
|
-
style,
|
|
3367
|
-
}
|
|
3368
|
-
}
|
|
3369
|
-
|
|
3370
|
-
class Text extends SvelteComponent {
|
|
3371
|
-
constructor(options) {
|
|
3372
|
-
super()
|
|
3373
|
-
init(this, options, instance$8, create_fragment$8, safe_not_equal, [
|
|
3374
|
-
"value",
|
|
3375
|
-
"containerClass",
|
|
3376
|
-
"font",
|
|
3377
|
-
"textAlign",
|
|
3378
|
-
"verticalAlign",
|
|
3379
|
-
"color",
|
|
3380
|
-
"display",
|
|
3381
|
-
"_bb",
|
|
3382
|
-
])
|
|
3383
|
-
}
|
|
3384
|
-
}
|
|
3385
|
-
|
|
3386
|
-
export {
|
|
3387
|
-
Button as button,
|
|
3388
|
-
Form as form,
|
|
3389
|
-
Grid as grid,
|
|
3390
|
-
Login as login,
|
|
3391
|
-
Nav as nav,
|
|
3392
|
-
Panel as panel,
|
|
3393
|
-
StackPanel as stackpanel,
|
|
3394
|
-
Text as text,
|
|
3395
|
-
Textbox as textbox,
|
|
3396
|
-
}
|
|
3397
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy9zdmVsdGUvaW50ZXJuYWwvaW5kZXgubWpzIiwiLi4vc3JjL0J1dHRvbi5zdmVsdGUiLCIuLi9zcmMvVGV4dGJveC5zdmVsdGUiLCIuLi9zcmMvRm9ybS5zdmVsdGUiLCIuLi9zcmMvTG9naW4uc3ZlbHRlIiwiLi4vc3JjL2J1aWxkU3R5bGUuanMiLCIuLi9zcmMvR3JpZC5zdmVsdGUiLCIuLi9zcmMvU3RhY2tQYW5lbC5zdmVsdGUiLCIuLi9zcmMvY3NzVmFycy5qcyIsIi4uL3NyYy9OYXYuc3ZlbHRlIiwiLi4vc3JjL1BhbmVsLnN2ZWx0ZSIsIi4uL3NyYy9UZXh0LnN2ZWx0ZSJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBub29wKCkgeyB9XG5jb25zdCBpZGVudGl0eSA9IHggPT4geDtcbmZ1bmN0aW9uIGFzc2lnbih0YXIsIHNyYykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBmb3IgKGNvbnN0IGsgaW4gc3JjKVxuICAgICAgICB0YXJba10gPSBzcmNba107XG4gICAgcmV0dXJuIHRhcjtcbn1cbmZ1bmN0aW9uIGlzX3Byb21pc2UodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJztcbn1cbmZ1bmN0aW9uIGFkZF9sb2NhdGlvbihlbGVtZW50LCBmaWxlLCBsaW5lLCBjb2x1bW4sIGNoYXIpIHtcbiAgICBlbGVtZW50Ll9fc3ZlbHRlX21ldGEgPSB7XG4gICAgICAgIGxvYzogeyBmaWxlLCBsaW5lLCBjb2x1bW4sIGNoYXIgfVxuICAgIH07XG59XG5mdW5jdGlvbiBydW4oZm4pIHtcbiAgICByZXR1cm4gZm4oKTtcbn1cbmZ1bmN0aW9uIGJsYW5rX29iamVjdCgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShudWxsKTtcbn1cbmZ1bmN0aW9uIHJ1bl9hbGwoZm5zKSB7XG4gICAgZm5zLmZvckVhY2gocnVuKTtcbn1cbmZ1bmN0aW9uIGlzX2Z1bmN0aW9uKHRoaW5nKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGluZyA9PT0gJ2Z1bmN0aW9uJztcbn1cbmZ1bmN0aW9uIHNhZmVfbm90X2VxdWFsKGEsIGIpIHtcbiAgICByZXR1cm4gYSAhPSBhID8gYiA9PSBiIDogYSAhPT0gYiB8fCAoKGEgJiYgdHlwZW9mIGEgPT09ICdvYmplY3QnKSB8fCB0eXBlb2YgYSA9PT0gJ2Z1bmN0aW9uJyk7XG59XG5mdW5jdGlvbiBub3RfZXF1YWwoYSwgYikge1xuICAgIHJldHVybiBhICE9IGEgPyBiID09IGIgOiBhICE9PSBiO1xufVxuZnVuY3Rpb24gdmFsaWRhdGVfc3RvcmUoc3RvcmUsIG5hbWUpIHtcbiAgICBpZiAoIXN0b3JlIHx8IHR5cGVvZiBzdG9yZS5zdWJzY3JpYmUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtuYW1lfScgaXMgbm90IGEgc3RvcmUgd2l0aCBhICdzdWJzY3JpYmUnIG1ldGhvZGApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHN1YnNjcmliZShzdG9yZSwgY2FsbGJhY2spIHtcbiAgICBjb25zdCB1bnN1YiA9IHN0b3JlLnN1YnNjcmliZShjYWxsYmFjayk7XG4gICAgcmV0dXJuIHVuc3ViLnVuc3Vic2NyaWJlID8gKCkgPT4gdW5zdWIudW5zdWJzY3JpYmUoKSA6IHVuc3ViO1xufVxuZnVuY3Rpb24gZ2V0X3N0b3JlX3ZhbHVlKHN0b3JlKSB7XG4gICAgbGV0IHZhbHVlO1xuICAgIHN1YnNjcmliZShzdG9yZSwgXyA9PiB2YWx1ZSA9IF8pKCk7XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gY29tcG9uZW50X3N1YnNjcmliZShjb21wb25lbnQsIHN0b3JlLCBjYWxsYmFjaykge1xuICAgIGNvbXBvbmVudC4kJC5vbl9kZXN0cm95LnB1c2goc3Vic2NyaWJlKHN0b3JlLCBjYWxsYmFjaykpO1xufVxuZnVuY3Rpb24gY3JlYXRlX3Nsb3QoZGVmaW5pdGlvbiwgY3R4LCBmbikge1xuICAgIGlmIChkZWZpbml0aW9uKSB7XG4gICAgICAgIGNvbnN0IHNsb3RfY3R4ID0gZ2V0X3Nsb3RfY29udGV4dChkZWZpbml0aW9uLCBjdHgsIGZuKTtcbiAgICAgICAgcmV0dXJuIGRlZmluaXRpb25bMF0oc2xvdF9jdHgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldF9zbG90X2NvbnRleHQoZGVmaW5pdGlvbiwgY3R4LCBmbikge1xuICAgIHJldHVybiBkZWZpbml0aW9uWzFdXG4gICAgICAgID8gYXNzaWduKHt9LCBhc3NpZ24oY3R4LiQkc2NvcGUuY3R4LCBkZWZpbml0aW9uWzFdKGZuID8gZm4oY3R4KSA6IHt9KSkpXG4gICAgICAgIDogY3R4LiQkc2NvcGUuY3R4O1xufVxuZnVuY3Rpb24gZ2V0X3Nsb3RfY2hhbmdlcyhkZWZpbml0aW9uLCBjdHgsIGNoYW5nZWQsIGZuKSB7XG4gICAgcmV0dXJuIGRlZmluaXRpb25bMV1cbiAgICAgICAgPyBhc3NpZ24oe30sIGFzc2lnbihjdHguJCRzY29wZS5jaGFuZ2VkIHx8IHt9LCBkZWZpbml0aW9uWzFdKGZuID8gZm4oY2hhbmdlZCkgOiB7fSkpKVxuICAgICAgICA6IGN0eC4kJHNjb3BlLmNoYW5nZWQgfHwge307XG59XG5mdW5jdGlvbiBleGNsdWRlX2ludGVybmFsX3Byb3BzKHByb3BzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBrIGluIHByb3BzKVxuICAgICAgICBpZiAoa1swXSAhPT0gJyQnKVxuICAgICAgICAgICAgcmVzdWx0W2tdID0gcHJvcHNba107XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG9uY2UoZm4pIHtcbiAgICBsZXQgcmFuID0gZmFsc2U7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgIGlmIChyYW4pXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHJhbiA9IHRydWU7XG4gICAgICAgIGZuLmNhbGwodGhpcywgLi4uYXJncyk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIG51bGxfdG9fZW1wdHkodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICcnIDogdmFsdWU7XG59XG5mdW5jdGlvbiBzZXRfc3RvcmVfdmFsdWUoc3RvcmUsIHJldCwgdmFsdWUgPSByZXQpIHtcbiAgICBzdG9yZS5zZXQodmFsdWUpO1xuICAgIHJldHVybiByZXQ7XG59XG5cbmNvbnN0IGlzX2NsaWVudCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnO1xubGV0IG5vdyA9IGlzX2NsaWVudFxuICAgID8gKCkgPT4gd2luZG93LnBlcmZvcm1hbmNlLm5vdygpXG4gICAgOiAoKSA9PiBEYXRlLm5vdygpO1xubGV0IHJhZiA9IGlzX2NsaWVudCA/IGNiID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZShjYikgOiBub29wO1xuLy8gdXNlZCBpbnRlcm5hbGx5IGZvciB0ZXN0aW5nXG5mdW5jdGlvbiBzZXRfbm93KGZuKSB7XG4gICAgbm93ID0gZm47XG59XG5mdW5jdGlvbiBzZXRfcmFmKGZuKSB7XG4gICAgcmFmID0gZm47XG59XG5cbmNvbnN0IHRhc2tzID0gbmV3IFNldCgpO1xubGV0IHJ1bm5pbmcgPSBmYWxzZTtcbmZ1bmN0aW9uIHJ1bl90YXNrcygpIHtcbiAgICB0YXNrcy5mb3JFYWNoKHRhc2sgPT4ge1xuICAgICAgICBpZiAoIXRhc2tbMF0obm93KCkpKSB7XG4gICAgICAgICAgICB0YXNrcy5kZWxldGUodGFzayk7XG4gICAgICAgICAgICB0YXNrWzFdKCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBydW5uaW5nID0gdGFza3Muc2l6ZSA+IDA7XG4gICAgaWYgKHJ1bm5pbmcpXG4gICAgICAgIHJhZihydW5fdGFza3MpO1xufVxuZnVuY3Rpb24gY2xlYXJfbG9vcHMoKSB7XG4gICAgLy8gZm9yIHRlc3RpbmcuLi5cbiAgICB0YXNrcy5mb3JFYWNoKHRhc2sgPT4gdGFza3MuZGVsZXRlKHRhc2spKTtcbiAgICBydW5uaW5nID0gZmFsc2U7XG59XG5mdW5jdGlvbiBsb29wKGZuKSB7XG4gICAgbGV0IHRhc2s7XG4gICAgaWYgKCFydW5uaW5nKSB7XG4gICAgICAgIHJ1bm5pbmcgPSB0cnVlO1xuICAgICAgICByYWYocnVuX3Rhc2tzKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcHJvbWlzZTogbmV3IFByb21pc2UoZnVsZmlsID0+IHtcbiAgICAgICAgICAgIHRhc2tzLmFkZCh0YXNrID0gW2ZuLCBmdWxmaWxdKTtcbiAgICAgICAgfSksXG4gICAgICAgIGFib3J0KCkge1xuICAgICAgICAgICAgdGFza3MuZGVsZXRlKHRhc2spO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kKHRhcmdldCwgbm9kZSkge1xuICAgIHRhcmdldC5hcHBlbmRDaGlsZChub2RlKTtcbn1cbmZ1bmN0aW9uIGluc2VydCh0YXJnZXQsIG5vZGUsIGFuY2hvcikge1xuICAgIHRhcmdldC5pbnNlcnRCZWZvcmUobm9kZSwgYW5jaG9yIHx8IG51bGwpO1xufVxuZnVuY3Rpb24gZGV0YWNoKG5vZGUpIHtcbiAgICBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7XG59XG5mdW5jdGlvbiBkZXN0cm95X2VhY2goaXRlcmF0aW9ucywgZGV0YWNoaW5nKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVyYXRpb25zLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGlmIChpdGVyYXRpb25zW2ldKVxuICAgICAgICAgICAgaXRlcmF0aW9uc1tpXS5kKGRldGFjaGluZyk7XG4gICAgfVxufVxuZnVuY3Rpb24gZWxlbWVudChuYW1lKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSk7XG59XG5mdW5jdGlvbiBlbGVtZW50X2lzKG5hbWUsIGlzKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSwgeyBpcyB9KTtcbn1cbmZ1bmN0aW9uIG9iamVjdF93aXRob3V0X3Byb3BlcnRpZXMob2JqLCBleGNsdWRlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1vYmplY3QtbGl0ZXJhbC10eXBlLWFzc2VydGlvblxuICAgIGNvbnN0IHRhcmdldCA9IHt9O1xuICAgIGZvciAoY29uc3QgayBpbiBvYmopIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGspXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAmJiBleGNsdWRlLmluZGV4T2YoaykgPT09IC0xKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB0YXJnZXRba10gPSBvYmpba107XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbmZ1bmN0aW9uIHN2Z19lbGVtZW50KG5hbWUpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsIG5hbWUpO1xufVxuZnVuY3Rpb24gdGV4dChkYXRhKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRhdGEpO1xufVxuZnVuY3Rpb24gc3BhY2UoKSB7XG4gICAgcmV0dXJuIHRleHQoJyAnKTtcbn1cbmZ1bmN0aW9uIGVtcHR5KCkge1xuICAgIHJldHVybiB0ZXh0KCcnKTtcbn1cbmZ1bmN0aW9uIGxpc3Rlbihub2RlLCBldmVudCwgaGFuZGxlciwgb3B0aW9ucykge1xuICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgb3B0aW9ucyk7XG4gICAgcmV0dXJuICgpID0+IG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgb3B0aW9ucyk7XG59XG5mdW5jdGlvbiBwcmV2ZW50X2RlZmF1bHQoZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIGZuLmNhbGwodGhpcywgZXZlbnQpO1xuICAgIH07XG59XG5mdW5jdGlvbiBzdG9wX3Byb3BhZ2F0aW9uKGZuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCBldmVudCk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHNlbGYoZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcylcbiAgICAgICAgICAgIGZuLmNhbGwodGhpcywgZXZlbnQpO1xuICAgIH07XG59XG5mdW5jdGlvbiBhdHRyKG5vZGUsIGF0dHJpYnV0ZSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbClcbiAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICBlbHNlXG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWUpO1xufVxuZnVuY3Rpb24gc2V0X2F0dHJpYnV0ZXMobm9kZSwgYXR0cmlidXRlcykge1xuICAgIGZvciAoY29uc3Qga2V5IGluIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gJ3N0eWxlJykge1xuICAgICAgICAgICAgbm9kZS5zdHlsZS5jc3NUZXh0ID0gYXR0cmlidXRlc1trZXldO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGtleSBpbiBub2RlKSB7XG4gICAgICAgICAgICBub2RlW2tleV0gPSBhdHRyaWJ1dGVzW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhdHRyKG5vZGUsIGtleSwgYXR0cmlidXRlc1trZXldKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHNldF9zdmdfYXR0cmlidXRlcyhub2RlLCBhdHRyaWJ1dGVzKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gYXR0cmlidXRlcykge1xuICAgICAgICBhdHRyKG5vZGUsIGtleSwgYXR0cmlidXRlc1trZXldKTtcbiAgICB9XG59XG5mdW5jdGlvbiBzZXRfY3VzdG9tX2VsZW1lbnRfZGF0YShub2RlLCBwcm9wLCB2YWx1ZSkge1xuICAgIGlmIChwcm9wIGluIG5vZGUpIHtcbiAgICAgICAgbm9kZVtwcm9wXSA9IHZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYXR0cihub2RlLCBwcm9wLCB2YWx1ZSk7XG4gICAgfVxufVxuZnVuY3Rpb24geGxpbmtfYXR0cihub2RlLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gICAgbm9kZS5zZXRBdHRyaWJ1dGVOUygnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycsIGF0dHJpYnV0ZSwgdmFsdWUpO1xufVxuZnVuY3Rpb24gZ2V0X2JpbmRpbmdfZ3JvdXBfdmFsdWUoZ3JvdXApIHtcbiAgICBjb25zdCB2YWx1ZSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ3JvdXAubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgaWYgKGdyb3VwW2ldLmNoZWNrZWQpXG4gICAgICAgICAgICB2YWx1ZS5wdXNoKGdyb3VwW2ldLl9fdmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiB0b19udW1iZXIodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09ICcnID8gdW5kZWZpbmVkIDogK3ZhbHVlO1xufVxuZnVuY3Rpb24gdGltZV9yYW5nZXNfdG9fYXJyYXkocmFuZ2VzKSB7XG4gICAgY29uc3QgYXJyYXkgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBhcnJheS5wdXNoKHsgc3RhcnQ6IHJhbmdlcy5zdGFydChpKSwgZW5kOiByYW5nZXMuZW5kKGkpIH0pO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG59XG5mdW5jdGlvbiBjaGlsZHJlbihlbGVtZW50KSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oZWxlbWVudC5jaGlsZE5vZGVzKTtcbn1cbmZ1bmN0aW9uIGNsYWltX2VsZW1lbnQobm9kZXMsIG5hbWUsIGF0dHJpYnV0ZXMsIHN2Zykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICBpZiAobm9kZS5ub2RlTmFtZSA9PT0gbmFtZSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBub2RlLmF0dHJpYnV0ZXMubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBub2RlLmF0dHJpYnV0ZXNbal07XG4gICAgICAgICAgICAgICAgaWYgKCFhdHRyaWJ1dGVzW2F0dHJpYnV0ZS5uYW1lXSlcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlLm5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5vZGVzLnNwbGljZShpLCAxKVswXTsgLy8gVE9ETyBzdHJpcCB1bndhbnRlZCBhdHRyaWJ1dGVzXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN2ZyA/IHN2Z19lbGVtZW50KG5hbWUpIDogZWxlbWVudChuYW1lKTtcbn1cbmZ1bmN0aW9uIGNsYWltX3RleHQobm9kZXMsIGRhdGEpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgICAgICAgIG5vZGUuZGF0YSA9ICcnICsgZGF0YTtcbiAgICAgICAgICAgIHJldHVybiBub2Rlcy5zcGxpY2UoaSwgMSlbMF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRleHQoZGF0YSk7XG59XG5mdW5jdGlvbiBjbGFpbV9zcGFjZShub2Rlcykge1xuICAgIHJldHVybiBjbGFpbV90ZXh0KG5vZGVzLCAnICcpO1xufVxuZnVuY3Rpb24gc2V0X2RhdGEodGV4dCwgZGF0YSkge1xuICAgIGRhdGEgPSAnJyArIGRhdGE7XG4gICAgaWYgKHRleHQuZGF0YSAhPT0gZGF0YSlcbiAgICAgICAgdGV4dC5kYXRhID0gZGF0YTtcbn1cbmZ1bmN0aW9uIHNldF9pbnB1dF92YWx1ZShpbnB1dCwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgIT0gbnVsbCB8fCBpbnB1dC52YWx1ZSkge1xuICAgICAgICBpbnB1dC52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNldF9pbnB1dF90eXBlKGlucHV0LCB0eXBlKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaW5wdXQudHlwZSA9IHR5cGU7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG59XG5mdW5jdGlvbiBzZXRfc3R5bGUobm9kZSwga2V5LCB2YWx1ZSwgaW1wb3J0YW50KSB7XG4gICAgbm9kZS5zdHlsZS5zZXRQcm9wZXJ0eShrZXksIHZhbHVlLCBpbXBvcnRhbnQgPyAnaW1wb3J0YW50JyA6ICcnKTtcbn1cbmZ1bmN0aW9uIHNlbGVjdF9vcHRpb24oc2VsZWN0LCB2YWx1ZSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0Lm9wdGlvbnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gc2VsZWN0Lm9wdGlvbnNbaV07XG4gICAgICAgIGlmIChvcHRpb24uX192YWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBzZWxlY3Rfb3B0aW9ucyhzZWxlY3QsIHZhbHVlKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Qub3B0aW9ucy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBvcHRpb24gPSBzZWxlY3Qub3B0aW9uc1tpXTtcbiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gfnZhbHVlLmluZGV4T2Yob3B0aW9uLl9fdmFsdWUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNlbGVjdF92YWx1ZShzZWxlY3QpIHtcbiAgICBjb25zdCBzZWxlY3RlZF9vcHRpb24gPSBzZWxlY3QucXVlcnlTZWxlY3RvcignOmNoZWNrZWQnKSB8fCBzZWxlY3Qub3B0aW9uc1swXTtcbiAgICByZXR1cm4gc2VsZWN0ZWRfb3B0aW9uICYmIHNlbGVjdGVkX29wdGlvbi5fX3ZhbHVlO1xufVxuZnVuY3Rpb24gc2VsZWN0X211bHRpcGxlX3ZhbHVlKHNlbGVjdCkge1xuICAgIHJldHVybiBbXS5tYXAuY2FsbChzZWxlY3QucXVlcnlTZWxlY3RvckFsbCgnOmNoZWNrZWQnKSwgb3B0aW9uID0+IG9wdGlvbi5fX3ZhbHVlKTtcbn1cbmZ1bmN0aW9uIGFkZF9yZXNpemVfbGlzdGVuZXIoZWxlbWVudCwgZm4pIHtcbiAgICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5wb3NpdGlvbiA9PT0gJ3N0YXRpYycpIHtcbiAgICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gICAgfVxuICAgIGNvbnN0IG9iamVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29iamVjdCcpO1xuICAgIG9iamVjdC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2Rpc3BsYXk6IGJsb2NrOyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMDsgbGVmdDogMDsgaGVpZ2h0OiAxMDAlOyB3aWR0aDogMTAwJTsgb3ZlcmZsb3c6IGhpZGRlbjsgcG9pbnRlci1ldmVudHM6IG5vbmU7IHotaW5kZXg6IC0xOycpO1xuICAgIG9iamVjdC50eXBlID0gJ3RleHQvaHRtbCc7XG4gICAgb2JqZWN0LnRhYkluZGV4ID0gLTE7XG4gICAgbGV0IHdpbjtcbiAgICBvYmplY3Qub25sb2FkID0gKCkgPT4ge1xuICAgICAgICB3aW4gPSBvYmplY3QuY29udGVudERvY3VtZW50LmRlZmF1bHRWaWV3O1xuICAgICAgICB3aW4uYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgZm4pO1xuICAgIH07XG4gICAgaWYgKC9UcmlkZW50Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSB7XG4gICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQob2JqZWN0KTtcbiAgICAgICAgb2JqZWN0LmRhdGEgPSAnYWJvdXQ6YmxhbmsnO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgb2JqZWN0LmRhdGEgPSAnYWJvdXQ6YmxhbmsnO1xuICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKG9iamVjdCk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGNhbmNlbDogKCkgPT4ge1xuICAgICAgICAgICAgd2luICYmIHdpbi5yZW1vdmVFdmVudExpc3RlbmVyICYmIHdpbi5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBmbik7XG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUNoaWxkKG9iamVjdCk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZnVuY3Rpb24gdG9nZ2xlX2NsYXNzKGVsZW1lbnQsIG5hbWUsIHRvZ2dsZSkge1xuICAgIGVsZW1lbnQuY2xhc3NMaXN0W3RvZ2dsZSA/ICdhZGQnIDogJ3JlbW92ZSddKG5hbWUpO1xufVxuZnVuY3Rpb24gY3VzdG9tX2V2ZW50KHR5cGUsIGRldGFpbCkge1xuICAgIGNvbnN0IGUgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtcbiAgICBlLmluaXRDdXN0b21FdmVudCh0eXBlLCBmYWxzZSwgZmFsc2UsIGRldGFpbCk7XG4gICAgcmV0dXJuIGU7XG59XG5jbGFzcyBIdG1sVGFnIHtcbiAgICBjb25zdHJ1Y3RvcihodG1sLCBhbmNob3IgPSBudWxsKSB7XG4gICAgICAgIHRoaXMuZSA9IGVsZW1lbnQoJ2RpdicpO1xuICAgICAgICB0aGlzLmEgPSBhbmNob3I7XG4gICAgICAgIHRoaXMudShodG1sKTtcbiAgICB9XG4gICAgbSh0YXJnZXQsIGFuY2hvciA9IG51bGwpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm4ubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGluc2VydCh0YXJnZXQsIHRoaXMubltpXSwgYW5jaG9yKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnQgPSB0YXJnZXQ7XG4gICAgfVxuICAgIHUoaHRtbCkge1xuICAgICAgICB0aGlzLmUuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgICAgdGhpcy5uID0gQXJyYXkuZnJvbSh0aGlzLmUuY2hpbGROb2Rlcyk7XG4gICAgfVxuICAgIHAoaHRtbCkge1xuICAgICAgICB0aGlzLmQoKTtcbiAgICAgICAgdGhpcy51KGh0bWwpO1xuICAgICAgICB0aGlzLm0odGhpcy50LCB0aGlzLmEpO1xuICAgIH1cbiAgICBkKCkge1xuICAgICAgICB0aGlzLm4uZm9yRWFjaChkZXRhY2gpO1xuICAgIH1cbn1cblxubGV0IHN0eWxlc2hlZXQ7XG5sZXQgYWN0aXZlID0gMDtcbmxldCBjdXJyZW50X3J1bGVzID0ge307XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZGFya3NreWFwcC9zdHJpbmctaGFzaC9ibG9iL21hc3Rlci9pbmRleC5qc1xuZnVuY3Rpb24gaGFzaChzdHIpIHtcbiAgICBsZXQgaGFzaCA9IDUzODE7XG4gICAgbGV0IGkgPSBzdHIubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pXG4gICAgICAgIGhhc2ggPSAoKGhhc2ggPDwgNSkgLSBoYXNoKSBeIHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIHJldHVybiBoYXNoID4+PiAwO1xufVxuZnVuY3Rpb24gY3JlYXRlX3J1bGUobm9kZSwgYSwgYiwgZHVyYXRpb24sIGRlbGF5LCBlYXNlLCBmbiwgdWlkID0gMCkge1xuICAgIGNvbnN0IHN0ZXAgPSAxNi42NjYgLyBkdXJhdGlvbjtcbiAgICBsZXQga2V5ZnJhbWVzID0gJ3tcXG4nO1xuICAgIGZvciAobGV0IHAgPSAwOyBwIDw9IDE7IHAgKz0gc3RlcCkge1xuICAgICAgICBjb25zdCB0ID0gYSArIChiIC0gYSkgKiBlYXNlKHApO1xuICAgICAgICBrZXlmcmFtZXMgKz0gcCAqIDEwMCArIGAleyR7Zm4odCwgMSAtIHQpfX1cXG5gO1xuICAgIH1cbiAgICBjb25zdCBydWxlID0ga2V5ZnJhbWVzICsgYDEwMCUgeyR7Zm4oYiwgMSAtIGIpfX1cXG59YDtcbiAgICBjb25zdCBuYW1lID0gYF9fc3ZlbHRlXyR7aGFzaChydWxlKX1fJHt1aWR9YDtcbiAgICBpZiAoIWN1cnJlbnRfcnVsZXNbbmFtZV0pIHtcbiAgICAgICAgaWYgKCFzdHlsZXNoZWV0KSB7XG4gICAgICAgICAgICBjb25zdCBzdHlsZSA9IGVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICAgICAgICAgIHN0eWxlc2hlZXQgPSBzdHlsZS5zaGVldDtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50X3J1bGVzW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgc3R5bGVzaGVldC5pbnNlcnRSdWxlKGBAa2V5ZnJhbWVzICR7bmFtZX0gJHtydWxlfWAsIHN0eWxlc2hlZXQuY3NzUnVsZXMubGVuZ3RoKTtcbiAgICB9XG4gICAgY29uc3QgYW5pbWF0aW9uID0gbm9kZS5zdHlsZS5hbmltYXRpb24gfHwgJyc7XG4gICAgbm9kZS5zdHlsZS5hbmltYXRpb24gPSBgJHthbmltYXRpb24gPyBgJHthbmltYXRpb259LCBgIDogYGB9JHtuYW1lfSAke2R1cmF0aW9ufW1zIGxpbmVhciAke2RlbGF5fW1zIDEgYm90aGA7XG4gICAgYWN0aXZlICs9IDE7XG4gICAgcmV0dXJuIG5hbWU7XG59XG5mdW5jdGlvbiBkZWxldGVfcnVsZShub2RlLCBuYW1lKSB7XG4gICAgbm9kZS5zdHlsZS5hbmltYXRpb24gPSAobm9kZS5zdHlsZS5hbmltYXRpb24gfHwgJycpXG4gICAgICAgIC5zcGxpdCgnLCAnKVxuICAgICAgICAuZmlsdGVyKG5hbWVcbiAgICAgICAgPyBhbmltID0+IGFuaW0uaW5kZXhPZihuYW1lKSA8IDAgLy8gcmVtb3ZlIHNwZWNpZmljIGFuaW1hdGlvblxuICAgICAgICA6IGFuaW0gPT4gYW5pbS5pbmRleE9mKCdfX3N2ZWx0ZScpID09PSAtMSAvLyByZW1vdmUgYWxsIFN2ZWx0ZSBhbmltYXRpb25zXG4gICAgKVxuICAgICAgICAuam9pbignLCAnKTtcbiAgICBpZiAobmFtZSAmJiAhLS1hY3RpdmUpXG4gICAgICAgIGNsZWFyX3J1bGVzKCk7XG59XG5mdW5jdGlvbiBjbGVhcl9ydWxlcygpIHtcbiAgICByYWYoKCkgPT4ge1xuICAgICAgICBpZiAoYWN0aXZlKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgaSA9IHN0eWxlc2hlZXQuY3NzUnVsZXMubGVuZ3RoO1xuICAgICAgICB3aGlsZSAoaS0tKVxuICAgICAgICAgICAgc3R5bGVzaGVldC5kZWxldGVSdWxlKGkpO1xuICAgICAgICBjdXJyZW50X3J1bGVzID0ge307XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZV9hbmltYXRpb24obm9kZSwgZnJvbSwgZm4sIHBhcmFtcykge1xuICAgIGlmICghZnJvbSlcbiAgICAgICAgcmV0dXJuIG5vb3A7XG4gICAgY29uc3QgdG8gPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGlmIChmcm9tLmxlZnQgPT09IHRvLmxlZnQgJiYgZnJvbS5yaWdodCA9PT0gdG8ucmlnaHQgJiYgZnJvbS50b3AgPT09IHRvLnRvcCAmJiBmcm9tLmJvdHRvbSA9PT0gdG8uYm90dG9tKVxuICAgICAgICByZXR1cm4gbm9vcDtcbiAgICBjb25zdCB7IGRlbGF5ID0gMCwgZHVyYXRpb24gPSAzMDAsIGVhc2luZyA9IGlkZW50aXR5LCBcbiAgICAvLyBAdHMtaWdub3JlIHRvZG86IHNob3VsZCB0aGlzIGJlIHNlcGFyYXRlZCBmcm9tIGRlc3RydWN0dXJpbmc/IE9yIHN0YXJ0L2VuZCBhZGRlZCB0byBwdWJsaWMgYXBpIGFuZCBkb2N1bWVudGF0aW9uP1xuICAgIHN0YXJ0OiBzdGFydF90aW1lID0gbm93KCkgKyBkZWxheSwgXG4gICAgLy8gQHRzLWlnbm9yZSB0b2RvOlxuICAgIGVuZCA9IHN0YXJ0X3RpbWUgKyBkdXJhdGlvbiwgdGljayA9IG5vb3AsIGNzcyB9ID0gZm4obm9kZSwgeyBmcm9tLCB0byB9LCBwYXJhbXMpO1xuICAgIGxldCBydW5uaW5nID0gdHJ1ZTtcbiAgICBsZXQgc3RhcnRlZCA9IGZhbHNlO1xuICAgIGxldCBuYW1lO1xuICAgIGZ1bmN0aW9uIHN0YXJ0KCkge1xuICAgICAgICBpZiAoY3NzKSB7XG4gICAgICAgICAgICBuYW1lID0gY3JlYXRlX3J1bGUobm9kZSwgMCwgMSwgZHVyYXRpb24sIGRlbGF5LCBlYXNpbmcsIGNzcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkZWxheSkge1xuICAgICAgICAgICAgc3RhcnRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gc3RvcCgpIHtcbiAgICAgICAgaWYgKGNzcylcbiAgICAgICAgICAgIGRlbGV0ZV9ydWxlKG5vZGUsIG5hbWUpO1xuICAgICAgICBydW5uaW5nID0gZmFsc2U7XG4gICAgfVxuICAgIGxvb3Aobm93ID0+IHtcbiAgICAgICAgaWYgKCFzdGFydGVkICYmIG5vdyA+PSBzdGFydF90aW1lKSB7XG4gICAgICAgICAgICBzdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhcnRlZCAmJiBub3cgPj0gZW5kKSB7XG4gICAgICAgICAgICB0aWNrKDEsIDApO1xuICAgICAgICAgICAgc3RvcCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcnVubmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydGVkKSB7XG4gICAgICAgICAgICBjb25zdCBwID0gbm93IC0gc3RhcnRfdGltZTtcbiAgICAgICAgICAgIGNvbnN0IHQgPSAwICsgMSAqIGVhc2luZyhwIC8gZHVyYXRpb24pO1xuICAgICAgICAgICAgdGljayh0LCAxIC0gdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gICAgc3RhcnQoKTtcbiAgICB0aWNrKDAsIDEpO1xuICAgIHJldHVybiBzdG9wO1xufVxuZnVuY3Rpb24gZml4X3Bvc2l0aW9uKG5vZGUpIHtcbiAgICBjb25zdCBzdHlsZSA9IGdldENvbXB1dGVkU3R5bGUobm9kZSk7XG4gICAgaWYgKHN0eWxlLnBvc2l0aW9uICE9PSAnYWJzb2x1dGUnICYmIHN0eWxlLnBvc2l0aW9uICE9PSAnZml4ZWQnKSB7XG4gICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gc3R5bGU7XG4gICAgICAgIGNvbnN0IGEgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBub2RlLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgbm9kZS5zdHlsZS53aWR0aCA9IHdpZHRoO1xuICAgICAgICBub2RlLnN0eWxlLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgYWRkX3RyYW5zZm9ybShub2RlLCBhKTtcbiAgICB9XG59XG5mdW5jdGlvbiBhZGRfdHJhbnNmb3JtKG5vZGUsIGEpIHtcbiAgICBjb25zdCBiID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBpZiAoYS5sZWZ0ICE9PSBiLmxlZnQgfHwgYS50b3AgIT09IGIudG9wKSB7XG4gICAgICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gc3R5bGUudHJhbnNmb3JtID09PSAnbm9uZScgPyAnJyA6IHN0eWxlLnRyYW5zZm9ybTtcbiAgICAgICAgbm9kZS5zdHlsZS50cmFuc2Zvcm0gPSBgJHt0cmFuc2Zvcm19IHRyYW5zbGF0ZSgke2EubGVmdCAtIGIubGVmdH1weCwgJHthLnRvcCAtIGIudG9wfXB4KWA7XG4gICAgfVxufVxuXG5sZXQgY3VycmVudF9jb21wb25lbnQ7XG5mdW5jdGlvbiBzZXRfY3VycmVudF9jb21wb25lbnQoY29tcG9uZW50KSB7XG4gICAgY3VycmVudF9jb21wb25lbnQgPSBjb21wb25lbnQ7XG59XG5mdW5jdGlvbiBnZXRfY3VycmVudF9jb21wb25lbnQoKSB7XG4gICAgaWYgKCFjdXJyZW50X2NvbXBvbmVudClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGdW5jdGlvbiBjYWxsZWQgb3V0c2lkZSBjb21wb25lbnQgaW5pdGlhbGl6YXRpb25gKTtcbiAgICByZXR1cm4gY3VycmVudF9jb21wb25lbnQ7XG59XG5mdW5jdGlvbiBiZWZvcmVVcGRhdGUoZm4pIHtcbiAgICBnZXRfY3VycmVudF9jb21wb25lbnQoKS4kJC5iZWZvcmVfdXBkYXRlLnB1c2goZm4pO1xufVxuZnVuY3Rpb24gb25Nb3VudChmbikge1xuICAgIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLm9uX21vdW50LnB1c2goZm4pO1xufVxuZnVuY3Rpb24gYWZ0ZXJVcGRhdGUoZm4pIHtcbiAgICBnZXRfY3VycmVudF9jb21wb25lbnQoKS4kJC5hZnRlcl91cGRhdGUucHVzaChmbik7XG59XG5mdW5jdGlvbiBvbkRlc3Ryb3koZm4pIHtcbiAgICBnZXRfY3VycmVudF9jb21wb25lbnQoKS4kJC5vbl9kZXN0cm95LnB1c2goZm4pO1xufVxuZnVuY3Rpb24gY3JlYXRlRXZlbnREaXNwYXRjaGVyKCkge1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IGN1cnJlbnRfY29tcG9uZW50O1xuICAgIHJldHVybiAodHlwZSwgZGV0YWlsKSA9PiB7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IGNvbXBvbmVudC4kJC5jYWxsYmFja3NbdHlwZV07XG4gICAgICAgIGlmIChjYWxsYmFja3MpIHtcbiAgICAgICAgICAgIC8vIFRPRE8gYXJlIHRoZXJlIHNpdHVhdGlvbnMgd2hlcmUgZXZlbnRzIGNvdWxkIGJlIGRpc3BhdGNoZWRcbiAgICAgICAgICAgIC8vIGluIGEgc2VydmVyIChub24tRE9NKSBlbnZpcm9ubWVudD9cbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gY3VzdG9tX2V2ZW50KHR5cGUsIGRldGFpbCk7XG4gICAgICAgICAgICBjYWxsYmFja3Muc2xpY2UoKS5mb3JFYWNoKGZuID0+IHtcbiAgICAgICAgICAgICAgICBmbi5jYWxsKGNvbXBvbmVudCwgZXZlbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZnVuY3Rpb24gc2V0Q29udGV4dChrZXksIGNvbnRleHQpIHtcbiAgICBnZXRfY3VycmVudF9jb21wb25lbnQoKS4kJC5jb250ZXh0LnNldChrZXksIGNvbnRleHQpO1xufVxuZnVuY3Rpb24gZ2V0Q29udGV4dChrZXkpIHtcbiAgICByZXR1cm4gZ2V0X2N1cnJlbnRfY29tcG9uZW50KCkuJCQuY29udGV4dC5nZXQoa2V5KTtcbn1cbi8vIFRPRE8gZmlndXJlIG91dCBpZiB3ZSBzdGlsbCB3YW50IHRvIHN1cHBvcnRcbi8vIHNob3J0aGFuZCBldmVudHMsIG9yIGlmIHdlIHdhbnQgdG8gaW1wbGVtZW50XG4vLyBhIHJlYWwgYnViYmxpbmcgbWVjaGFuaXNtXG5mdW5jdGlvbiBidWJibGUoY29tcG9uZW50LCBldmVudCkge1xuICAgIGNvbnN0IGNhbGxiYWNrcyA9IGNvbXBvbmVudC4kJC5jYWxsYmFja3NbZXZlbnQudHlwZV07XG4gICAgaWYgKGNhbGxiYWNrcykge1xuICAgICAgICBjYWxsYmFja3Muc2xpY2UoKS5mb3JFYWNoKGZuID0+IGZuKGV2ZW50KSk7XG4gICAgfVxufVxuXG5jb25zdCBkaXJ0eV9jb21wb25lbnRzID0gW107XG5jb25zdCBpbnRyb3MgPSB7IGVuYWJsZWQ6IGZhbHNlIH07XG5jb25zdCBiaW5kaW5nX2NhbGxiYWNrcyA9IFtdO1xuY29uc3QgcmVuZGVyX2NhbGxiYWNrcyA9IFtdO1xuY29uc3QgZmx1c2hfY2FsbGJhY2tzID0gW107XG5jb25zdCByZXNvbHZlZF9wcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5sZXQgdXBkYXRlX3NjaGVkdWxlZCA9IGZhbHNlO1xuZnVuY3Rpb24gc2NoZWR1bGVfdXBkYXRlKCkge1xuICAgIGlmICghdXBkYXRlX3NjaGVkdWxlZCkge1xuICAgICAgICB1cGRhdGVfc2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgICAgcmVzb2x2ZWRfcHJvbWlzZS50aGVuKGZsdXNoKTtcbiAgICB9XG59XG5mdW5jdGlvbiB0aWNrKCkge1xuICAgIHNjaGVkdWxlX3VwZGF0ZSgpO1xuICAgIHJldHVybiByZXNvbHZlZF9wcm9taXNlO1xufVxuZnVuY3Rpb24gYWRkX3JlbmRlcl9jYWxsYmFjayhmbikge1xuICAgIHJlbmRlcl9jYWxsYmFja3MucHVzaChmbik7XG59XG5mdW5jdGlvbiBhZGRfZmx1c2hfY2FsbGJhY2soZm4pIHtcbiAgICBmbHVzaF9jYWxsYmFja3MucHVzaChmbik7XG59XG5mdW5jdGlvbiBmbHVzaCgpIHtcbiAgICBjb25zdCBzZWVuX2NhbGxiYWNrcyA9IG5ldyBTZXQoKTtcbiAgICBkbyB7XG4gICAgICAgIC8vIGZpcnN0LCBjYWxsIGJlZm9yZVVwZGF0ZSBmdW5jdGlvbnNcbiAgICAgICAgLy8gYW5kIHVwZGF0ZSBjb21wb25lbnRzXG4gICAgICAgIHdoaWxlIChkaXJ0eV9jb21wb25lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gZGlydHlfY29tcG9uZW50cy5zaGlmdCgpO1xuICAgICAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KGNvbXBvbmVudCk7XG4gICAgICAgICAgICB1cGRhdGUoY29tcG9uZW50LiQkKTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoYmluZGluZ19jYWxsYmFja3MubGVuZ3RoKVxuICAgICAgICAgICAgYmluZGluZ19jYWxsYmFja3MucG9wKCkoKTtcbiAgICAgICAgLy8gdGhlbiwgb25jZSBjb21wb25lbnRzIGFyZSB1cGRhdGVkLCBjYWxsXG4gICAgICAgIC8vIGFmdGVyVXBkYXRlIGZ1bmN0aW9ucy4gVGhpcyBtYXkgY2F1c2VcbiAgICAgICAgLy8gc3Vic2VxdWVudCB1cGRhdGVzLi4uXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVuZGVyX2NhbGxiYWNrcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSByZW5kZXJfY2FsbGJhY2tzW2ldO1xuICAgICAgICAgICAgaWYgKCFzZWVuX2NhbGxiYWNrcy5oYXMoY2FsbGJhY2spKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICAvLyAuLi5zbyBndWFyZCBhZ2FpbnN0IGluZmluaXRlIGxvb3BzXG4gICAgICAgICAgICAgICAgc2Vlbl9jYWxsYmFja3MuYWRkKGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZW5kZXJfY2FsbGJhY2tzLmxlbmd0aCA9IDA7XG4gICAgfSB3aGlsZSAoZGlydHlfY29tcG9uZW50cy5sZW5ndGgpO1xuICAgIHdoaWxlIChmbHVzaF9jYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICAgIGZsdXNoX2NhbGxiYWNrcy5wb3AoKSgpO1xuICAgIH1cbiAgICB1cGRhdGVfc2NoZWR1bGVkID0gZmFsc2U7XG59XG5mdW5jdGlvbiB1cGRhdGUoJCQpIHtcbiAgICBpZiAoJCQuZnJhZ21lbnQpIHtcbiAgICAgICAgJCQudXBkYXRlKCQkLmRpcnR5KTtcbiAgICAgICAgcnVuX2FsbCgkJC5iZWZvcmVfdXBkYXRlKTtcbiAgICAgICAgJCQuZnJhZ21lbnQucCgkJC5kaXJ0eSwgJCQuY3R4KTtcbiAgICAgICAgJCQuZGlydHkgPSBudWxsO1xuICAgICAgICAkJC5hZnRlcl91cGRhdGUuZm9yRWFjaChhZGRfcmVuZGVyX2NhbGxiYWNrKTtcbiAgICB9XG59XG5cbmxldCBwcm9taXNlO1xuZnVuY3Rpb24gd2FpdCgpIHtcbiAgICBpZiAoIXByb21pc2UpIHtcbiAgICAgICAgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICBwcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgcHJvbWlzZSA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcHJvbWlzZTtcbn1cbmZ1bmN0aW9uIGRpc3BhdGNoKG5vZGUsIGRpcmVjdGlvbiwga2luZCkge1xuICAgIG5vZGUuZGlzcGF0Y2hFdmVudChjdXN0b21fZXZlbnQoYCR7ZGlyZWN0aW9uID8gJ2ludHJvJyA6ICdvdXRybyd9JHtraW5kfWApKTtcbn1cbmNvbnN0IG91dHJvaW5nID0gbmV3IFNldCgpO1xubGV0IG91dHJvcztcbmZ1bmN0aW9uIGdyb3VwX291dHJvcygpIHtcbiAgICBvdXRyb3MgPSB7XG4gICAgICAgIHI6IDAsXG4gICAgICAgIGM6IFtdLFxuICAgICAgICBwOiBvdXRyb3MgLy8gcGFyZW50IGdyb3VwXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNoZWNrX291dHJvcygpIHtcbiAgICBpZiAoIW91dHJvcy5yKSB7XG4gICAgICAgIHJ1bl9hbGwob3V0cm9zLmMpO1xuICAgIH1cbiAgICBvdXRyb3MgPSBvdXRyb3MucDtcbn1cbmZ1bmN0aW9uIHRyYW5zaXRpb25faW4oYmxvY2ssIGxvY2FsKSB7XG4gICAgaWYgKGJsb2NrICYmIGJsb2NrLmkpIHtcbiAgICAgICAgb3V0cm9pbmcuZGVsZXRlKGJsb2NrKTtcbiAgICAgICAgYmxvY2suaShsb2NhbCk7XG4gICAgfVxufVxuZnVuY3Rpb24gdHJhbnNpdGlvbl9vdXQoYmxvY2ssIGxvY2FsLCBkZXRhY2gsIGNhbGxiYWNrKSB7XG4gICAgaWYgKGJsb2NrICYmIGJsb2NrLm8pIHtcbiAgICAgICAgaWYgKG91dHJvaW5nLmhhcyhibG9jaykpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIG91dHJvaW5nLmFkZChibG9jayk7XG4gICAgICAgIG91dHJvcy5jLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgb3V0cm9pbmcuZGVsZXRlKGJsb2NrKTtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGlmIChkZXRhY2gpXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrLmQoMSk7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGJsb2NrLm8obG9jYWwpO1xuICAgIH1cbn1cbmNvbnN0IG51bGxfdHJhbnNpdGlvbiA9IHsgZHVyYXRpb246IDAgfTtcbmZ1bmN0aW9uIGNyZWF0ZV9pbl90cmFuc2l0aW9uKG5vZGUsIGZuLCBwYXJhbXMpIHtcbiAgICBsZXQgY29uZmlnID0gZm4obm9kZSwgcGFyYW1zKTtcbiAgICBsZXQgcnVubmluZyA9IGZhbHNlO1xuICAgIGxldCBhbmltYXRpb25fbmFtZTtcbiAgICBsZXQgdGFzaztcbiAgICBsZXQgdWlkID0gMDtcbiAgICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgICAgICBpZiAoYW5pbWF0aW9uX25hbWUpXG4gICAgICAgICAgICBkZWxldGVfcnVsZShub2RlLCBhbmltYXRpb25fbmFtZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdvKCkge1xuICAgICAgICBjb25zdCB7IGRlbGF5ID0gMCwgZHVyYXRpb24gPSAzMDAsIGVhc2luZyA9IGlkZW50aXR5LCB0aWNrID0gbm9vcCwgY3NzIH0gPSBjb25maWcgfHwgbnVsbF90cmFuc2l0aW9uO1xuICAgICAgICBpZiAoY3NzKVxuICAgICAgICAgICAgYW5pbWF0aW9uX25hbWUgPSBjcmVhdGVfcnVsZShub2RlLCAwLCAxLCBkdXJhdGlvbiwgZGVsYXksIGVhc2luZywgY3NzLCB1aWQrKyk7XG4gICAgICAgIHRpY2soMCwgMSk7XG4gICAgICAgIGNvbnN0IHN0YXJ0X3RpbWUgPSBub3coKSArIGRlbGF5O1xuICAgICAgICBjb25zdCBlbmRfdGltZSA9IHN0YXJ0X3RpbWUgKyBkdXJhdGlvbjtcbiAgICAgICAgaWYgKHRhc2spXG4gICAgICAgICAgICB0YXNrLmFib3J0KCk7XG4gICAgICAgIHJ1bm5pbmcgPSB0cnVlO1xuICAgICAgICBhZGRfcmVuZGVyX2NhbGxiYWNrKCgpID0+IGRpc3BhdGNoKG5vZGUsIHRydWUsICdzdGFydCcpKTtcbiAgICAgICAgdGFzayA9IGxvb3Aobm93ID0+IHtcbiAgICAgICAgICAgIGlmIChydW5uaW5nKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vdyA+PSBlbmRfdGltZSkge1xuICAgICAgICAgICAgICAgICAgICB0aWNrKDEsIDApO1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChub2RlLCB0cnVlLCAnZW5kJyk7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5vdyA+PSBzdGFydF90aW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBlYXNpbmcoKG5vdyAtIHN0YXJ0X3RpbWUpIC8gZHVyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICB0aWNrKHQsIDEgLSB0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcnVubmluZztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGxldCBzdGFydGVkID0gZmFsc2U7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQoKSB7XG4gICAgICAgICAgICBpZiAoc3RhcnRlZClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBkZWxldGVfcnVsZShub2RlKTtcbiAgICAgICAgICAgIGlmIChpc19mdW5jdGlvbihjb25maWcpKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnID0gY29uZmlnKCk7XG4gICAgICAgICAgICAgICAgd2FpdCgpLnRoZW4oZ28pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZ28oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgaW52YWxpZGF0ZSgpIHtcbiAgICAgICAgICAgIHN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgfSxcbiAgICAgICAgZW5kKCkge1xuICAgICAgICAgICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgICAgICAgcnVubmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZV9vdXRfdHJhbnNpdGlvbihub2RlLCBmbiwgcGFyYW1zKSB7XG4gICAgbGV0IGNvbmZpZyA9IGZuKG5vZGUsIHBhcmFtcyk7XG4gICAgbGV0IHJ1bm5pbmcgPSB0cnVlO1xuICAgIGxldCBhbmltYXRpb25fbmFtZTtcbiAgICBjb25zdCBncm91cCA9IG91dHJvcztcbiAgICBncm91cC5yICs9IDE7XG4gICAgZnVuY3Rpb24gZ28oKSB7XG4gICAgICAgIGNvbnN0IHsgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDMwMCwgZWFzaW5nID0gaWRlbnRpdHksIHRpY2sgPSBub29wLCBjc3MgfSA9IGNvbmZpZyB8fCBudWxsX3RyYW5zaXRpb247XG4gICAgICAgIGlmIChjc3MpXG4gICAgICAgICAgICBhbmltYXRpb25fbmFtZSA9IGNyZWF0ZV9ydWxlKG5vZGUsIDEsIDAsIGR1cmF0aW9uLCBkZWxheSwgZWFzaW5nLCBjc3MpO1xuICAgICAgICBjb25zdCBzdGFydF90aW1lID0gbm93KCkgKyBkZWxheTtcbiAgICAgICAgY29uc3QgZW5kX3RpbWUgPSBzdGFydF90aW1lICsgZHVyYXRpb247XG4gICAgICAgIGFkZF9yZW5kZXJfY2FsbGJhY2soKCkgPT4gZGlzcGF0Y2gobm9kZSwgZmFsc2UsICdzdGFydCcpKTtcbiAgICAgICAgbG9vcChub3cgPT4ge1xuICAgICAgICAgICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgICAgICAgICBpZiAobm93ID49IGVuZF90aW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRpY2soMCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKG5vZGUsIGZhbHNlLCAnZW5kJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghLS1ncm91cC5yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHdpbGwgcmVzdWx0IGluIGBlbmQoKWAgYmVpbmcgY2FsbGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gd2UgZG9uJ3QgbmVlZCB0byBjbGVhbiB1cCBoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICBydW5fYWxsKGdyb3VwLmMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5vdyA+PSBzdGFydF90aW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBlYXNpbmcoKG5vdyAtIHN0YXJ0X3RpbWUpIC8gZHVyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICB0aWNrKDEgLSB0LCB0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcnVubmluZztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChpc19mdW5jdGlvbihjb25maWcpKSB7XG4gICAgICAgIHdhaXQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbmZpZyA9IGNvbmZpZygpO1xuICAgICAgICAgICAgZ28oKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBnbygpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBlbmQocmVzZXQpIHtcbiAgICAgICAgICAgIGlmIChyZXNldCAmJiBjb25maWcudGljaykge1xuICAgICAgICAgICAgICAgIGNvbmZpZy50aWNrKDEsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgICAgICAgICBpZiAoYW5pbWF0aW9uX25hbWUpXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZV9ydWxlKG5vZGUsIGFuaW1hdGlvbl9uYW1lKTtcbiAgICAgICAgICAgICAgICBydW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlX2JpZGlyZWN0aW9uYWxfdHJhbnNpdGlvbihub2RlLCBmbiwgcGFyYW1zLCBpbnRybykge1xuICAgIGxldCBjb25maWcgPSBmbihub2RlLCBwYXJhbXMpO1xuICAgIGxldCB0ID0gaW50cm8gPyAwIDogMTtcbiAgICBsZXQgcnVubmluZ19wcm9ncmFtID0gbnVsbDtcbiAgICBsZXQgcGVuZGluZ19wcm9ncmFtID0gbnVsbDtcbiAgICBsZXQgYW5pbWF0aW9uX25hbWUgPSBudWxsO1xuICAgIGZ1bmN0aW9uIGNsZWFyX2FuaW1hdGlvbigpIHtcbiAgICAgICAgaWYgKGFuaW1hdGlvbl9uYW1lKVxuICAgICAgICAgICAgZGVsZXRlX3J1bGUobm9kZSwgYW5pbWF0aW9uX25hbWUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpbml0KHByb2dyYW0sIGR1cmF0aW9uKSB7XG4gICAgICAgIGNvbnN0IGQgPSBwcm9ncmFtLmIgLSB0O1xuICAgICAgICBkdXJhdGlvbiAqPSBNYXRoLmFicyhkKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGE6IHQsXG4gICAgICAgICAgICBiOiBwcm9ncmFtLmIsXG4gICAgICAgICAgICBkLFxuICAgICAgICAgICAgZHVyYXRpb24sXG4gICAgICAgICAgICBzdGFydDogcHJvZ3JhbS5zdGFydCxcbiAgICAgICAgICAgIGVuZDogcHJvZ3JhbS5zdGFydCArIGR1cmF0aW9uLFxuICAgICAgICAgICAgZ3JvdXA6IHByb2dyYW0uZ3JvdXBcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ28oYikge1xuICAgICAgICBjb25zdCB7IGRlbGF5ID0gMCwgZHVyYXRpb24gPSAzMDAsIGVhc2luZyA9IGlkZW50aXR5LCB0aWNrID0gbm9vcCwgY3NzIH0gPSBjb25maWcgfHwgbnVsbF90cmFuc2l0aW9uO1xuICAgICAgICBjb25zdCBwcm9ncmFtID0ge1xuICAgICAgICAgICAgc3RhcnQ6IG5vdygpICsgZGVsYXksXG4gICAgICAgICAgICBiXG4gICAgICAgIH07XG4gICAgICAgIGlmICghYikge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSB0b2RvOiBpbXByb3ZlIHR5cGluZ3NcbiAgICAgICAgICAgIHByb2dyYW0uZ3JvdXAgPSBvdXRyb3M7XG4gICAgICAgICAgICBvdXRyb3MuciArPSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmIChydW5uaW5nX3Byb2dyYW0pIHtcbiAgICAgICAgICAgIHBlbmRpbmdfcHJvZ3JhbSA9IHByb2dyYW07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGFuIGludHJvLCBhbmQgdGhlcmUncyBhIGRlbGF5LCB3ZSBuZWVkIHRvIGRvXG4gICAgICAgICAgICAvLyBhbiBpbml0aWFsIHRpY2sgYW5kL29yIGFwcGx5IENTUyBhbmltYXRpb24gaW1tZWRpYXRlbHlcbiAgICAgICAgICAgIGlmIChjc3MpIHtcbiAgICAgICAgICAgICAgICBjbGVhcl9hbmltYXRpb24oKTtcbiAgICAgICAgICAgICAgICBhbmltYXRpb25fbmFtZSA9IGNyZWF0ZV9ydWxlKG5vZGUsIHQsIGIsIGR1cmF0aW9uLCBkZWxheSwgZWFzaW5nLCBjc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGIpXG4gICAgICAgICAgICAgICAgdGljaygwLCAxKTtcbiAgICAgICAgICAgIHJ1bm5pbmdfcHJvZ3JhbSA9IGluaXQocHJvZ3JhbSwgZHVyYXRpb24pO1xuICAgICAgICAgICAgYWRkX3JlbmRlcl9jYWxsYmFjaygoKSA9PiBkaXNwYXRjaChub2RlLCBiLCAnc3RhcnQnKSk7XG4gICAgICAgICAgICBsb29wKG5vdyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdfcHJvZ3JhbSAmJiBub3cgPiBwZW5kaW5nX3Byb2dyYW0uc3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcnVubmluZ19wcm9ncmFtID0gaW5pdChwZW5kaW5nX3Byb2dyYW0sIGR1cmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgcGVuZGluZ19wcm9ncmFtID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2gobm9kZSwgcnVubmluZ19wcm9ncmFtLmIsICdzdGFydCcpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3NzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhcl9hbmltYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbl9uYW1lID0gY3JlYXRlX3J1bGUobm9kZSwgdCwgcnVubmluZ19wcm9ncmFtLmIsIHJ1bm5pbmdfcHJvZ3JhbS5kdXJhdGlvbiwgMCwgZWFzaW5nLCBjb25maWcuY3NzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocnVubmluZ19wcm9ncmFtKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub3cgPj0gcnVubmluZ19wcm9ncmFtLmVuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGljayh0ID0gcnVubmluZ19wcm9ncmFtLmIsIDEgLSB0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKG5vZGUsIHJ1bm5pbmdfcHJvZ3JhbS5iLCAnZW5kJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBlbmRpbmdfcHJvZ3JhbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlJ3JlIGRvbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVubmluZ19wcm9ncmFtLmIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50cm8g4oCUIHdlIGNhbiB0aWR5IHVwIGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyX2FuaW1hdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0cm8g4oCUIG5lZWRzIHRvIGJlIGNvb3JkaW5hdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghLS1ydW5uaW5nX3Byb2dyYW0uZ3JvdXAucilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9hbGwocnVubmluZ19wcm9ncmFtLmdyb3VwLmMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bm5pbmdfcHJvZ3JhbSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobm93ID49IHJ1bm5pbmdfcHJvZ3JhbS5zdGFydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IG5vdyAtIHJ1bm5pbmdfcHJvZ3JhbS5zdGFydDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBydW5uaW5nX3Byb2dyYW0uYSArIHJ1bm5pbmdfcHJvZ3JhbS5kICogZWFzaW5nKHAgLyBydW5uaW5nX3Byb2dyYW0uZHVyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGljayh0LCAxIC0gdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuICEhKHJ1bm5pbmdfcHJvZ3JhbSB8fCBwZW5kaW5nX3Byb2dyYW0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcnVuKGIpIHtcbiAgICAgICAgICAgIGlmIChpc19mdW5jdGlvbihjb25maWcpKSB7XG4gICAgICAgICAgICAgICAgd2FpdCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IGNvbmZpZygpO1xuICAgICAgICAgICAgICAgICAgICBnbyhiKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGdvKGIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlbmQoKSB7XG4gICAgICAgICAgICBjbGVhcl9hbmltYXRpb24oKTtcbiAgICAgICAgICAgIHJ1bm5pbmdfcHJvZ3JhbSA9IHBlbmRpbmdfcHJvZ3JhbSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5mdW5jdGlvbiBoYW5kbGVfcHJvbWlzZShwcm9taXNlLCBpbmZvKSB7XG4gICAgY29uc3QgdG9rZW4gPSBpbmZvLnRva2VuID0ge307XG4gICAgZnVuY3Rpb24gdXBkYXRlKHR5cGUsIGluZGV4LCBrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmIChpbmZvLnRva2VuICE9PSB0b2tlbilcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaW5mby5yZXNvbHZlZCA9IGtleSAmJiB7IFtrZXldOiB2YWx1ZSB9O1xuICAgICAgICBjb25zdCBjaGlsZF9jdHggPSBhc3NpZ24oYXNzaWduKHt9LCBpbmZvLmN0eCksIGluZm8ucmVzb2x2ZWQpO1xuICAgICAgICBjb25zdCBibG9jayA9IHR5cGUgJiYgKGluZm8uY3VycmVudCA9IHR5cGUpKGNoaWxkX2N0eCk7XG4gICAgICAgIGlmIChpbmZvLmJsb2NrKSB7XG4gICAgICAgICAgICBpZiAoaW5mby5ibG9ja3MpIHtcbiAgICAgICAgICAgICAgICBpbmZvLmJsb2Nrcy5mb3JFYWNoKChibG9jaywgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPT0gaW5kZXggJiYgYmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwX291dHJvcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbl9vdXQoYmxvY2ssIDEsIDEsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmJsb2Nrc1tpXSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX291dHJvcygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbmZvLmJsb2NrLmQoMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBibG9jay5jKCk7XG4gICAgICAgICAgICB0cmFuc2l0aW9uX2luKGJsb2NrLCAxKTtcbiAgICAgICAgICAgIGJsb2NrLm0oaW5mby5tb3VudCgpLCBpbmZvLmFuY2hvcik7XG4gICAgICAgICAgICBmbHVzaCgpO1xuICAgICAgICB9XG4gICAgICAgIGluZm8uYmxvY2sgPSBibG9jaztcbiAgICAgICAgaWYgKGluZm8uYmxvY2tzKVxuICAgICAgICAgICAgaW5mby5ibG9ja3NbaW5kZXhdID0gYmxvY2s7XG4gICAgfVxuICAgIGlmIChpc19wcm9taXNlKHByb21pc2UpKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRfY29tcG9uZW50ID0gZ2V0X2N1cnJlbnRfY29tcG9uZW50KCk7XG4gICAgICAgIHByb21pc2UudGhlbih2YWx1ZSA9PiB7XG4gICAgICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQoY3VycmVudF9jb21wb25lbnQpO1xuICAgICAgICAgICAgdXBkYXRlKGluZm8udGhlbiwgMSwgaW5mby52YWx1ZSwgdmFsdWUpO1xuICAgICAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KG51bGwpO1xuICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQoY3VycmVudF9jb21wb25lbnQpO1xuICAgICAgICAgICAgdXBkYXRlKGluZm8uY2F0Y2gsIDIsIGluZm8uZXJyb3IsIGVycm9yKTtcbiAgICAgICAgICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChudWxsKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGlmIHdlIHByZXZpb3VzbHkgaGFkIGEgdGhlbi9jYXRjaCBibG9jaywgZGVzdHJveSBpdFxuICAgICAgICBpZiAoaW5mby5jdXJyZW50ICE9PSBpbmZvLnBlbmRpbmcpIHtcbiAgICAgICAgICAgIHVwZGF0ZShpbmZvLnBlbmRpbmcsIDApO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChpbmZvLmN1cnJlbnQgIT09IGluZm8udGhlbikge1xuICAgICAgICAgICAgdXBkYXRlKGluZm8udGhlbiwgMSwgaW5mby52YWx1ZSwgcHJvbWlzZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpbmZvLnJlc29sdmVkID0geyBbaW5mby52YWx1ZV06IHByb21pc2UgfTtcbiAgICB9XG59XG5cbmNvbnN0IGdsb2JhbHMgPSAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiBnbG9iYWwpO1xuXG5mdW5jdGlvbiBkZXN0cm95X2Jsb2NrKGJsb2NrLCBsb29rdXApIHtcbiAgICBibG9jay5kKDEpO1xuICAgIGxvb2t1cC5kZWxldGUoYmxvY2sua2V5KTtcbn1cbmZ1bmN0aW9uIG91dHJvX2FuZF9kZXN0cm95X2Jsb2NrKGJsb2NrLCBsb29rdXApIHtcbiAgICB0cmFuc2l0aW9uX291dChibG9jaywgMSwgMSwgKCkgPT4ge1xuICAgICAgICBsb29rdXAuZGVsZXRlKGJsb2NrLmtleSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBmaXhfYW5kX2Rlc3Ryb3lfYmxvY2soYmxvY2ssIGxvb2t1cCkge1xuICAgIGJsb2NrLmYoKTtcbiAgICBkZXN0cm95X2Jsb2NrKGJsb2NrLCBsb29rdXApO1xufVxuZnVuY3Rpb24gZml4X2FuZF9vdXRyb19hbmRfZGVzdHJveV9ibG9jayhibG9jaywgbG9va3VwKSB7XG4gICAgYmxvY2suZigpO1xuICAgIG91dHJvX2FuZF9kZXN0cm95X2Jsb2NrKGJsb2NrLCBsb29rdXApO1xufVxuZnVuY3Rpb24gdXBkYXRlX2tleWVkX2VhY2gob2xkX2Jsb2NrcywgY2hhbmdlZCwgZ2V0X2tleSwgZHluYW1pYywgY3R4LCBsaXN0LCBsb29rdXAsIG5vZGUsIGRlc3Ryb3ksIGNyZWF0ZV9lYWNoX2Jsb2NrLCBuZXh0LCBnZXRfY29udGV4dCkge1xuICAgIGxldCBvID0gb2xkX2Jsb2Nrcy5sZW5ndGg7XG4gICAgbGV0IG4gPSBsaXN0Lmxlbmd0aDtcbiAgICBsZXQgaSA9IG87XG4gICAgY29uc3Qgb2xkX2luZGV4ZXMgPSB7fTtcbiAgICB3aGlsZSAoaS0tKVxuICAgICAgICBvbGRfaW5kZXhlc1tvbGRfYmxvY2tzW2ldLmtleV0gPSBpO1xuICAgIGNvbnN0IG5ld19ibG9ja3MgPSBbXTtcbiAgICBjb25zdCBuZXdfbG9va3VwID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IGRlbHRhcyA9IG5ldyBNYXAoKTtcbiAgICBpID0gbjtcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkX2N0eCA9IGdldF9jb250ZXh0KGN0eCwgbGlzdCwgaSk7XG4gICAgICAgIGNvbnN0IGtleSA9IGdldF9rZXkoY2hpbGRfY3R4KTtcbiAgICAgICAgbGV0IGJsb2NrID0gbG9va3VwLmdldChrZXkpO1xuICAgICAgICBpZiAoIWJsb2NrKSB7XG4gICAgICAgICAgICBibG9jayA9IGNyZWF0ZV9lYWNoX2Jsb2NrKGtleSwgY2hpbGRfY3R4KTtcbiAgICAgICAgICAgIGJsb2NrLmMoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkeW5hbWljKSB7XG4gICAgICAgICAgICBibG9jay5wKGNoYW5nZWQsIGNoaWxkX2N0eCk7XG4gICAgICAgIH1cbiAgICAgICAgbmV3X2xvb2t1cC5zZXQoa2V5LCBuZXdfYmxvY2tzW2ldID0gYmxvY2spO1xuICAgICAgICBpZiAoa2V5IGluIG9sZF9pbmRleGVzKVxuICAgICAgICAgICAgZGVsdGFzLnNldChrZXksIE1hdGguYWJzKGkgLSBvbGRfaW5kZXhlc1trZXldKSk7XG4gICAgfVxuICAgIGNvbnN0IHdpbGxfbW92ZSA9IG5ldyBTZXQoKTtcbiAgICBjb25zdCBkaWRfbW92ZSA9IG5ldyBTZXQoKTtcbiAgICBmdW5jdGlvbiBpbnNlcnQoYmxvY2spIHtcbiAgICAgICAgdHJhbnNpdGlvbl9pbihibG9jaywgMSk7XG4gICAgICAgIGJsb2NrLm0obm9kZSwgbmV4dCk7XG4gICAgICAgIGxvb2t1cC5zZXQoYmxvY2sua2V5LCBibG9jayk7XG4gICAgICAgIG5leHQgPSBibG9jay5maXJzdDtcbiAgICAgICAgbi0tO1xuICAgIH1cbiAgICB3aGlsZSAobyAmJiBuKSB7XG4gICAgICAgIGNvbnN0IG5ld19ibG9jayA9IG5ld19ibG9ja3NbbiAtIDFdO1xuICAgICAgICBjb25zdCBvbGRfYmxvY2sgPSBvbGRfYmxvY2tzW28gLSAxXTtcbiAgICAgICAgY29uc3QgbmV3X2tleSA9IG5ld19ibG9jay5rZXk7XG4gICAgICAgIGNvbnN0IG9sZF9rZXkgPSBvbGRfYmxvY2sua2V5O1xuICAgICAgICBpZiAobmV3X2Jsb2NrID09PSBvbGRfYmxvY2spIHtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgICAgIG5leHQgPSBuZXdfYmxvY2suZmlyc3Q7XG4gICAgICAgICAgICBvLS07XG4gICAgICAgICAgICBuLS07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIW5ld19sb29rdXAuaGFzKG9sZF9rZXkpKSB7XG4gICAgICAgICAgICAvLyByZW1vdmUgb2xkIGJsb2NrXG4gICAgICAgICAgICBkZXN0cm95KG9sZF9ibG9jaywgbG9va3VwKTtcbiAgICAgICAgICAgIG8tLTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghbG9va3VwLmhhcyhuZXdfa2V5KSB8fCB3aWxsX21vdmUuaGFzKG5ld19rZXkpKSB7XG4gICAgICAgICAgICBpbnNlcnQobmV3X2Jsb2NrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkaWRfbW92ZS5oYXMob2xkX2tleSkpIHtcbiAgICAgICAgICAgIG8tLTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkZWx0YXMuZ2V0KG5ld19rZXkpID4gZGVsdGFzLmdldChvbGRfa2V5KSkge1xuICAgICAgICAgICAgZGlkX21vdmUuYWRkKG5ld19rZXkpO1xuICAgICAgICAgICAgaW5zZXJ0KG5ld19ibG9jayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3aWxsX21vdmUuYWRkKG9sZF9rZXkpO1xuICAgICAgICAgICAgby0tO1xuICAgICAgICB9XG4gICAgfVxuICAgIHdoaWxlIChvLS0pIHtcbiAgICAgICAgY29uc3Qgb2xkX2Jsb2NrID0gb2xkX2Jsb2Nrc1tvXTtcbiAgICAgICAgaWYgKCFuZXdfbG9va3VwLmhhcyhvbGRfYmxvY2sua2V5KSlcbiAgICAgICAgICAgIGRlc3Ryb3kob2xkX2Jsb2NrLCBsb29rdXApO1xuICAgIH1cbiAgICB3aGlsZSAobilcbiAgICAgICAgaW5zZXJ0KG5ld19ibG9ja3NbbiAtIDFdKTtcbiAgICByZXR1cm4gbmV3X2Jsb2Nrcztcbn1cbmZ1bmN0aW9uIG1lYXN1cmUoYmxvY2tzKSB7XG4gICAgY29uc3QgcmVjdHMgPSB7fTtcbiAgICBsZXQgaSA9IGJsb2Nrcy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSlcbiAgICAgICAgcmVjdHNbYmxvY2tzW2ldLmtleV0gPSBibG9ja3NbaV0ubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4gcmVjdHM7XG59XG5cbmZ1bmN0aW9uIGdldF9zcHJlYWRfdXBkYXRlKGxldmVscywgdXBkYXRlcykge1xuICAgIGNvbnN0IHVwZGF0ZSA9IHt9O1xuICAgIGNvbnN0IHRvX251bGxfb3V0ID0ge307XG4gICAgY29uc3QgYWNjb3VudGVkX2ZvciA9IHsgJCRzY29wZTogMSB9O1xuICAgIGxldCBpID0gbGV2ZWxzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIGNvbnN0IG8gPSBsZXZlbHNbaV07XG4gICAgICAgIGNvbnN0IG4gPSB1cGRhdGVzW2ldO1xuICAgICAgICBpZiAobikge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbykge1xuICAgICAgICAgICAgICAgIGlmICghKGtleSBpbiBuKSlcbiAgICAgICAgICAgICAgICAgICAgdG9fbnVsbF9vdXRba2V5XSA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBuKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFhY2NvdW50ZWRfZm9yW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlW2tleV0gPSBuW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRlZF9mb3Jba2V5XSA9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV2ZWxzW2ldID0gbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG8pIHtcbiAgICAgICAgICAgICAgICBhY2NvdW50ZWRfZm9yW2tleV0gPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIHRvX251bGxfb3V0KSB7XG4gICAgICAgIGlmICghKGtleSBpbiB1cGRhdGUpKVxuICAgICAgICAgICAgdXBkYXRlW2tleV0gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB1cGRhdGU7XG59XG5mdW5jdGlvbiBnZXRfc3ByZWFkX29iamVjdChzcHJlYWRfcHJvcHMpIHtcbiAgICByZXR1cm4gdHlwZW9mIHNwcmVhZF9wcm9wcyA9PT0gJ29iamVjdCcgJiYgc3ByZWFkX3Byb3BzICE9PSBudWxsID8gc3ByZWFkX3Byb3BzIDoge307XG59XG5cbmNvbnN0IGludmFsaWRfYXR0cmlidXRlX25hbWVfY2hhcmFjdGVyID0gL1tcXHMnXCI+Lz1cXHV7RkREMH0tXFx1e0ZERUZ9XFx1e0ZGRkV9XFx1e0ZGRkZ9XFx1ezFGRkZFfVxcdXsxRkZGRn1cXHV7MkZGRkV9XFx1ezJGRkZGfVxcdXszRkZGRX1cXHV7M0ZGRkZ9XFx1ezRGRkZFfVxcdXs0RkZGRn1cXHV7NUZGRkV9XFx1ezVGRkZGfVxcdXs2RkZGRX1cXHV7NkZGRkZ9XFx1ezdGRkZFfVxcdXs3RkZGRn1cXHV7OEZGRkV9XFx1ezhGRkZGfVxcdXs5RkZGRX1cXHV7OUZGRkZ9XFx1e0FGRkZFfVxcdXtBRkZGRn1cXHV7QkZGRkV9XFx1e0JGRkZGfVxcdXtDRkZGRX1cXHV7Q0ZGRkZ9XFx1e0RGRkZFfVxcdXtERkZGRn1cXHV7RUZGRkV9XFx1e0VGRkZGfVxcdXtGRkZGRX1cXHV7RkZGRkZ9XFx1ezEwRkZGRX1cXHV7MTBGRkZGfV0vdTtcbi8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2F0dHJpYnV0ZXMtMlxuLy8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI25vbmNoYXJhY3RlclxuZnVuY3Rpb24gc3ByZWFkKGFyZ3MpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gT2JqZWN0LmFzc2lnbih7fSwgLi4uYXJncyk7XG4gICAgbGV0IHN0ciA9ICcnO1xuICAgIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2gobmFtZSA9PiB7XG4gICAgICAgIGlmIChpbnZhbGlkX2F0dHJpYnV0ZV9uYW1lX2NoYXJhY3Rlci50ZXN0KG5hbWUpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF0dHJpYnV0ZXNbbmFtZV07XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAodmFsdWUgPT09IHRydWUpXG4gICAgICAgICAgICBzdHIgKz0gXCIgXCIgKyBuYW1lO1xuICAgICAgICBjb25zdCBlc2NhcGVkID0gU3RyaW5nKHZhbHVlKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1wiL2csICcmIzM0OycpXG4gICAgICAgICAgICAucmVwbGFjZSgvJy9nLCAnJiMzOTsnKTtcbiAgICAgICAgc3RyICs9IFwiIFwiICsgbmFtZSArIFwiPVwiICsgSlNPTi5zdHJpbmdpZnkoZXNjYXBlZCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHN0cjtcbn1cbmNvbnN0IGVzY2FwZWQgPSB7XG4gICAgJ1wiJzogJyZxdW90OycsXG4gICAgXCInXCI6ICcmIzM5OycsXG4gICAgJyYnOiAnJmFtcDsnLFxuICAgICc8JzogJyZsdDsnLFxuICAgICc+JzogJyZndDsnXG59O1xuZnVuY3Rpb24gZXNjYXBlKGh0bWwpIHtcbiAgICByZXR1cm4gU3RyaW5nKGh0bWwpLnJlcGxhY2UoL1tcIicmPD5dL2csIG1hdGNoID0+IGVzY2FwZWRbbWF0Y2hdKTtcbn1cbmZ1bmN0aW9uIGVhY2goaXRlbXMsIGZuKSB7XG4gICAgbGV0IHN0ciA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgc3RyICs9IGZuKGl0ZW1zW2ldLCBpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn1cbmNvbnN0IG1pc3NpbmdfY29tcG9uZW50ID0ge1xuICAgICQkcmVuZGVyOiAoKSA9PiAnJ1xufTtcbmZ1bmN0aW9uIHZhbGlkYXRlX2NvbXBvbmVudChjb21wb25lbnQsIG5hbWUpIHtcbiAgICBpZiAoIWNvbXBvbmVudCB8fCAhY29tcG9uZW50LiQkcmVuZGVyKSB7XG4gICAgICAgIGlmIChuYW1lID09PSAnc3ZlbHRlOmNvbXBvbmVudCcpXG4gICAgICAgICAgICBuYW1lICs9ICcgdGhpcz17Li4ufSc7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgPCR7bmFtZX0+IGlzIG5vdCBhIHZhbGlkIFNTUiBjb21wb25lbnQuIFlvdSBtYXkgbmVlZCB0byByZXZpZXcgeW91ciBidWlsZCBjb25maWcgdG8gZW5zdXJlIHRoYXQgZGVwZW5kZW5jaWVzIGFyZSBjb21waWxlZCwgcmF0aGVyIHRoYW4gaW1wb3J0ZWQgYXMgcHJlLWNvbXBpbGVkIG1vZHVsZXNgKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbn1cbmZ1bmN0aW9uIGRlYnVnKGZpbGUsIGxpbmUsIGNvbHVtbiwgdmFsdWVzKSB7XG4gICAgY29uc29sZS5sb2coYHtAZGVidWd9ICR7ZmlsZSA/IGZpbGUgKyAnICcgOiAnJ30oJHtsaW5lfToke2NvbHVtbn0pYCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUubG9nKHZhbHVlcyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuICAgIHJldHVybiAnJztcbn1cbmxldCBvbl9kZXN0cm95O1xuZnVuY3Rpb24gY3JlYXRlX3Nzcl9jb21wb25lbnQoZm4pIHtcbiAgICBmdW5jdGlvbiAkJHJlbmRlcihyZXN1bHQsIHByb3BzLCBiaW5kaW5ncywgc2xvdHMpIHtcbiAgICAgICAgY29uc3QgcGFyZW50X2NvbXBvbmVudCA9IGN1cnJlbnRfY29tcG9uZW50O1xuICAgICAgICBjb25zdCAkJCA9IHtcbiAgICAgICAgICAgIG9uX2Rlc3Ryb3ksXG4gICAgICAgICAgICBjb250ZXh0OiBuZXcgTWFwKHBhcmVudF9jb21wb25lbnQgPyBwYXJlbnRfY29tcG9uZW50LiQkLmNvbnRleHQgOiBbXSksXG4gICAgICAgICAgICAvLyB0aGVzZSB3aWxsIGJlIGltbWVkaWF0ZWx5IGRpc2NhcmRlZFxuICAgICAgICAgICAgb25fbW91bnQ6IFtdLFxuICAgICAgICAgICAgYmVmb3JlX3VwZGF0ZTogW10sXG4gICAgICAgICAgICBhZnRlcl91cGRhdGU6IFtdLFxuICAgICAgICAgICAgY2FsbGJhY2tzOiBibGFua19vYmplY3QoKVxuICAgICAgICB9O1xuICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQoeyAkJCB9KTtcbiAgICAgICAgY29uc3QgaHRtbCA9IGZuKHJlc3VsdCwgcHJvcHMsIGJpbmRpbmdzLCBzbG90cyk7XG4gICAgICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChwYXJlbnRfY29tcG9uZW50KTtcbiAgICAgICAgcmV0dXJuIGh0bWw7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHJlbmRlcjogKHByb3BzID0ge30sIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgICAgICAgICAgb25fZGVzdHJveSA9IFtdO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geyBoZWFkOiAnJywgY3NzOiBuZXcgU2V0KCkgfTtcbiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSAkJHJlbmRlcihyZXN1bHQsIHByb3BzLCB7fSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBydW5fYWxsKG9uX2Rlc3Ryb3kpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBodG1sLFxuICAgICAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBBcnJheS5mcm9tKHJlc3VsdC5jc3MpLm1hcChjc3MgPT4gY3NzLmNvZGUpLmpvaW4oJ1xcbicpLFxuICAgICAgICAgICAgICAgICAgICBtYXA6IG51bGwgLy8gVE9ET1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaGVhZDogcmVzdWx0LmhlYWRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgICQkcmVuZGVyXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGFkZF9hdHRyaWJ1dGUobmFtZSwgdmFsdWUsIGJvb2xlYW4pIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCAoYm9vbGVhbiAmJiAhdmFsdWUpKVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgcmV0dXJuIGAgJHtuYW1lfSR7dmFsdWUgPT09IHRydWUgPyAnJyA6IGA9JHt0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gSlNPTi5zdHJpbmdpZnkoZXNjYXBlKHZhbHVlKSkgOiBgXCIke3ZhbHVlfVwiYH1gfWA7XG59XG5mdW5jdGlvbiBhZGRfY2xhc3NlcyhjbGFzc2VzKSB7XG4gICAgcmV0dXJuIGNsYXNzZXMgPyBgIGNsYXNzPVwiJHtjbGFzc2VzfVwiYCA6IGBgO1xufVxuXG5mdW5jdGlvbiBiaW5kKGNvbXBvbmVudCwgbmFtZSwgY2FsbGJhY2spIHtcbiAgICBpZiAoY29tcG9uZW50LiQkLnByb3BzLmluZGV4T2YobmFtZSkgPT09IC0xKVxuICAgICAgICByZXR1cm47XG4gICAgY29tcG9uZW50LiQkLmJvdW5kW25hbWVdID0gY2FsbGJhY2s7XG4gICAgY2FsbGJhY2soY29tcG9uZW50LiQkLmN0eFtuYW1lXSk7XG59XG5mdW5jdGlvbiBtb3VudF9jb21wb25lbnQoY29tcG9uZW50LCB0YXJnZXQsIGFuY2hvcikge1xuICAgIGNvbnN0IHsgZnJhZ21lbnQsIG9uX21vdW50LCBvbl9kZXN0cm95LCBhZnRlcl91cGRhdGUgfSA9IGNvbXBvbmVudC4kJDtcbiAgICBmcmFnbWVudC5tKHRhcmdldCwgYW5jaG9yKTtcbiAgICAvLyBvbk1vdW50IGhhcHBlbnMgYmVmb3JlIHRoZSBpbml0aWFsIGFmdGVyVXBkYXRlXG4gICAgYWRkX3JlbmRlcl9jYWxsYmFjaygoKSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld19vbl9kZXN0cm95ID0gb25fbW91bnQubWFwKHJ1bikuZmlsdGVyKGlzX2Z1bmN0aW9uKTtcbiAgICAgICAgaWYgKG9uX2Rlc3Ryb3kpIHtcbiAgICAgICAgICAgIG9uX2Rlc3Ryb3kucHVzaCguLi5uZXdfb25fZGVzdHJveSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBFZGdlIGNhc2UgLSBjb21wb25lbnQgd2FzIGRlc3Ryb3llZCBpbW1lZGlhdGVseSxcbiAgICAgICAgICAgIC8vIG1vc3QgbGlrZWx5IGFzIGEgcmVzdWx0IG9mIGEgYmluZGluZyBpbml0aWFsaXNpbmdcbiAgICAgICAgICAgIHJ1bl9hbGwobmV3X29uX2Rlc3Ryb3kpO1xuICAgICAgICB9XG4gICAgICAgIGNvbXBvbmVudC4kJC5vbl9tb3VudCA9IFtdO1xuICAgIH0pO1xuICAgIGFmdGVyX3VwZGF0ZS5mb3JFYWNoKGFkZF9yZW5kZXJfY2FsbGJhY2spO1xufVxuZnVuY3Rpb24gZGVzdHJveV9jb21wb25lbnQoY29tcG9uZW50LCBkZXRhY2hpbmcpIHtcbiAgICBpZiAoY29tcG9uZW50LiQkLmZyYWdtZW50KSB7XG4gICAgICAgIHJ1bl9hbGwoY29tcG9uZW50LiQkLm9uX2Rlc3Ryb3kpO1xuICAgICAgICBjb21wb25lbnQuJCQuZnJhZ21lbnQuZChkZXRhY2hpbmcpO1xuICAgICAgICAvLyBUT0RPIG51bGwgb3V0IG90aGVyIHJlZnMsIGluY2x1ZGluZyBjb21wb25lbnQuJCQgKGJ1dCBuZWVkIHRvXG4gICAgICAgIC8vIHByZXNlcnZlIGZpbmFsIHN0YXRlPylcbiAgICAgICAgY29tcG9uZW50LiQkLm9uX2Rlc3Ryb3kgPSBjb21wb25lbnQuJCQuZnJhZ21lbnQgPSBudWxsO1xuICAgICAgICBjb21wb25lbnQuJCQuY3R4ID0ge307XG4gICAgfVxufVxuZnVuY3Rpb24gbWFrZV9kaXJ0eShjb21wb25lbnQsIGtleSkge1xuICAgIGlmICghY29tcG9uZW50LiQkLmRpcnR5KSB7XG4gICAgICAgIGRpcnR5X2NvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuICAgICAgICBzY2hlZHVsZV91cGRhdGUoKTtcbiAgICAgICAgY29tcG9uZW50LiQkLmRpcnR5ID0gYmxhbmtfb2JqZWN0KCk7XG4gICAgfVxuICAgIGNvbXBvbmVudC4kJC5kaXJ0eVtrZXldID0gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGluaXQoY29tcG9uZW50LCBvcHRpb25zLCBpbnN0YW5jZSwgY3JlYXRlX2ZyYWdtZW50LCBub3RfZXF1YWwsIHByb3BfbmFtZXMpIHtcbiAgICBjb25zdCBwYXJlbnRfY29tcG9uZW50ID0gY3VycmVudF9jb21wb25lbnQ7XG4gICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KGNvbXBvbmVudCk7XG4gICAgY29uc3QgcHJvcHMgPSBvcHRpb25zLnByb3BzIHx8IHt9O1xuICAgIGNvbnN0ICQkID0gY29tcG9uZW50LiQkID0ge1xuICAgICAgICBmcmFnbWVudDogbnVsbCxcbiAgICAgICAgY3R4OiBudWxsLFxuICAgICAgICAvLyBzdGF0ZVxuICAgICAgICBwcm9wczogcHJvcF9uYW1lcyxcbiAgICAgICAgdXBkYXRlOiBub29wLFxuICAgICAgICBub3RfZXF1YWwsXG4gICAgICAgIGJvdW5kOiBibGFua19vYmplY3QoKSxcbiAgICAgICAgLy8gbGlmZWN5Y2xlXG4gICAgICAgIG9uX21vdW50OiBbXSxcbiAgICAgICAgb25fZGVzdHJveTogW10sXG4gICAgICAgIGJlZm9yZV91cGRhdGU6IFtdLFxuICAgICAgICBhZnRlcl91cGRhdGU6IFtdLFxuICAgICAgICBjb250ZXh0OiBuZXcgTWFwKHBhcmVudF9jb21wb25lbnQgPyBwYXJlbnRfY29tcG9uZW50LiQkLmNvbnRleHQgOiBbXSksXG4gICAgICAgIC8vIGV2ZXJ5dGhpbmcgZWxzZVxuICAgICAgICBjYWxsYmFja3M6IGJsYW5rX29iamVjdCgpLFxuICAgICAgICBkaXJ0eTogbnVsbFxuICAgIH07XG4gICAgbGV0IHJlYWR5ID0gZmFsc2U7XG4gICAgJCQuY3R4ID0gaW5zdGFuY2VcbiAgICAgICAgPyBpbnN0YW5jZShjb21wb25lbnQsIHByb3BzLCAoa2V5LCByZXQsIHZhbHVlID0gcmV0KSA9PiB7XG4gICAgICAgICAgICBpZiAoJCQuY3R4ICYmIG5vdF9lcXVhbCgkJC5jdHhba2V5XSwgJCQuY3R4W2tleV0gPSB2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoJCQuYm91bmRba2V5XSlcbiAgICAgICAgICAgICAgICAgICAgJCQuYm91bmRba2V5XSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlYWR5KVxuICAgICAgICAgICAgICAgICAgICBtYWtlX2RpcnR5KGNvbXBvbmVudCwga2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH0pXG4gICAgICAgIDogcHJvcHM7XG4gICAgJCQudXBkYXRlKCk7XG4gICAgcmVhZHkgPSB0cnVlO1xuICAgIHJ1bl9hbGwoJCQuYmVmb3JlX3VwZGF0ZSk7XG4gICAgJCQuZnJhZ21lbnQgPSBjcmVhdGVfZnJhZ21lbnQoJCQuY3R4KTtcbiAgICBpZiAob3B0aW9ucy50YXJnZXQpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuaHlkcmF0ZSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgICAgICQkLmZyYWdtZW50LmwoY2hpbGRyZW4ob3B0aW9ucy50YXJnZXQpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICAgICAgICAkJC5mcmFnbWVudC5jKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuaW50cm8pXG4gICAgICAgICAgICB0cmFuc2l0aW9uX2luKGNvbXBvbmVudC4kJC5mcmFnbWVudCk7XG4gICAgICAgIG1vdW50X2NvbXBvbmVudChjb21wb25lbnQsIG9wdGlvbnMudGFyZ2V0LCBvcHRpb25zLmFuY2hvcik7XG4gICAgICAgIGZsdXNoKCk7XG4gICAgfVxuICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChwYXJlbnRfY29tcG9uZW50KTtcbn1cbmxldCBTdmVsdGVFbGVtZW50O1xuaWYgKHR5cGVvZiBIVE1MRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBTdmVsdGVFbGVtZW50ID0gY2xhc3MgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgICAgIHRoaXMuYXR0YWNoU2hhZG93KHsgbW9kZTogJ29wZW4nIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSB0b2RvOiBpbXByb3ZlIHR5cGluZ3NcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuJCQuc2xvdHRlZCkge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgdG9kbzogaW1wcm92ZSB0eXBpbmdzXG4gICAgICAgICAgICAgICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLiQkLnNsb3R0ZWRba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKGF0dHIsIF9vbGRWYWx1ZSwgbmV3VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXNbYXR0cl0gPSBuZXdWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICAkZGVzdHJveSgpIHtcbiAgICAgICAgICAgIGRlc3Ryb3lfY29tcG9uZW50KHRoaXMsIDEpO1xuICAgICAgICAgICAgdGhpcy4kZGVzdHJveSA9IG5vb3A7XG4gICAgICAgIH1cbiAgICAgICAgJG9uKHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAvLyBUT0RPIHNob3VsZCB0aGlzIGRlbGVnYXRlIHRvIGFkZEV2ZW50TGlzdGVuZXI/XG4gICAgICAgICAgICBjb25zdCBjYWxsYmFja3MgPSAodGhpcy4kJC5jYWxsYmFja3NbdHlwZV0gfHwgKHRoaXMuJCQuY2FsbGJhY2tzW3R5cGVdID0gW10pKTtcbiAgICAgICAgICAgIGNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBjYWxsYmFja3MuaW5kZXhPZihjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgICRzZXQoKSB7XG4gICAgICAgICAgICAvLyBvdmVycmlkZGVuIGJ5IGluc3RhbmNlLCBpZiBpdCBoYXMgcHJvcHNcbiAgICAgICAgfVxuICAgIH07XG59XG5jbGFzcyBTdmVsdGVDb21wb25lbnQge1xuICAgICRkZXN0cm95KCkge1xuICAgICAgICBkZXN0cm95X2NvbXBvbmVudCh0aGlzLCAxKTtcbiAgICAgICAgdGhpcy4kZGVzdHJveSA9IG5vb3A7XG4gICAgfVxuICAgICRvbih0eXBlLCBjYWxsYmFjaykge1xuICAgICAgICBjb25zdCBjYWxsYmFja3MgPSAodGhpcy4kJC5jYWxsYmFja3NbdHlwZV0gfHwgKHRoaXMuJCQuY2FsbGJhY2tzW3R5cGVdID0gW10pKTtcbiAgICAgICAgY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBjYWxsYmFja3MuaW5kZXhPZihjYWxsYmFjayk7XG4gICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKVxuICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICAkc2V0KCkge1xuICAgICAgICAvLyBvdmVycmlkZGVuIGJ5IGluc3RhbmNlLCBpZiBpdCBoYXMgcHJvcHNcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoX2Rldih0eXBlLCBkZXRhaWwpIHtcbiAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbV9ldmVudCh0eXBlLCBkZXRhaWwpKTtcbn1cbmZ1bmN0aW9uIGFwcGVuZF9kZXYodGFyZ2V0LCBub2RlKSB7XG4gICAgZGlzcGF0Y2hfZGV2KFwiU3ZlbHRlRE9NSW5zZXJ0XCIsIHsgdGFyZ2V0LCBub2RlIH0pO1xuICAgIGFwcGVuZCh0YXJnZXQsIG5vZGUpO1xufVxuZnVuY3Rpb24gaW5zZXJ0X2Rldih0YXJnZXQsIG5vZGUsIGFuY2hvcikge1xuICAgIGRpc3BhdGNoX2RldihcIlN2ZWx0ZURPTUluc2VydFwiLCB7IHRhcmdldCwgbm9kZSwgYW5jaG9yIH0pO1xuICAgIGluc2VydCh0YXJnZXQsIG5vZGUsIGFuY2hvcik7XG59XG5mdW5jdGlvbiBkZXRhY2hfZGV2KG5vZGUpIHtcbiAgICBkaXNwYXRjaF9kZXYoXCJTdmVsdGVET01SZW1vdmVcIiwgeyBub2RlIH0pO1xuICAgIGRldGFjaChub2RlKTtcbn1cbmZ1bmN0aW9uIGRldGFjaF9iZXR3ZWVuX2RldihiZWZvcmUsIGFmdGVyKSB7XG4gICAgd2hpbGUgKGJlZm9yZS5uZXh0U2libGluZyAmJiBiZWZvcmUubmV4dFNpYmxpbmcgIT09IGFmdGVyKSB7XG4gICAgICAgIGRldGFjaF9kZXYoYmVmb3JlLm5leHRTaWJsaW5nKTtcbiAgICB9XG59XG5mdW5jdGlvbiBkZXRhY2hfYmVmb3JlX2RldihhZnRlcikge1xuICAgIHdoaWxlIChhZnRlci5wcmV2aW91c1NpYmxpbmcpIHtcbiAgICAgICAgZGV0YWNoX2RldihhZnRlci5wcmV2aW91c1NpYmxpbmcpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRldGFjaF9hZnRlcl9kZXYoYmVmb3JlKSB7XG4gICAgd2hpbGUgKGJlZm9yZS5uZXh0U2libGluZykge1xuICAgICAgICBkZXRhY2hfZGV2KGJlZm9yZS5uZXh0U2libGluZyk7XG4gICAgfVxufVxuZnVuY3Rpb24gbGlzdGVuX2Rldihub2RlLCBldmVudCwgaGFuZGxlciwgb3B0aW9ucywgaGFzX3ByZXZlbnRfZGVmYXVsdCwgaGFzX3N0b3BfcHJvcGFnYXRpb24pIHtcbiAgICBjb25zdCBtb2RpZmllcnMgPSBvcHRpb25zID09PSB0cnVlID8gW1wiY2FwdHVyZVwiXSA6IG9wdGlvbnMgPyBBcnJheS5mcm9tKE9iamVjdC5rZXlzKG9wdGlvbnMpKSA6IFtdO1xuICAgIGlmIChoYXNfcHJldmVudF9kZWZhdWx0KVxuICAgICAgICBtb2RpZmllcnMucHVzaCgncHJldmVudERlZmF1bHQnKTtcbiAgICBpZiAoaGFzX3N0b3BfcHJvcGFnYXRpb24pXG4gICAgICAgIG1vZGlmaWVycy5wdXNoKCdzdG9wUHJvcGFnYXRpb24nKTtcbiAgICBkaXNwYXRjaF9kZXYoXCJTdmVsdGVET01BZGRFdmVudExpc3RlbmVyXCIsIHsgbm9kZSwgZXZlbnQsIGhhbmRsZXIsIG1vZGlmaWVycyB9KTtcbiAgICBjb25zdCBkaXNwb3NlID0gbGlzdGVuKG5vZGUsIGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBkaXNwYXRjaF9kZXYoXCJTdmVsdGVET01SZW1vdmVFdmVudExpc3RlbmVyXCIsIHsgbm9kZSwgZXZlbnQsIGhhbmRsZXIsIG1vZGlmaWVycyB9KTtcbiAgICAgICAgZGlzcG9zZSgpO1xuICAgIH07XG59XG5mdW5jdGlvbiBhdHRyX2Rldihub2RlLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gICAgYXR0cihub2RlLCBhdHRyaWJ1dGUsIHZhbHVlKTtcbiAgICBpZiAodmFsdWUgPT0gbnVsbClcbiAgICAgICAgZGlzcGF0Y2hfZGV2KFwiU3ZlbHRlRE9NUmVtb3ZlQXR0cmlidXRlXCIsIHsgbm9kZSwgYXR0cmlidXRlIH0pO1xuICAgIGVsc2VcbiAgICAgICAgZGlzcGF0Y2hfZGV2KFwiU3ZlbHRlRE9NU2V0QXR0cmlidXRlXCIsIHsgbm9kZSwgYXR0cmlidXRlLCB2YWx1ZSB9KTtcbn1cbmZ1bmN0aW9uIHByb3BfZGV2KG5vZGUsIHByb3BlcnR5LCB2YWx1ZSkge1xuICAgIG5vZGVbcHJvcGVydHldID0gdmFsdWU7XG4gICAgZGlzcGF0Y2hfZGV2KFwiU3ZlbHRlRE9NU2V0UHJvcGVydHlcIiwgeyBub2RlLCBwcm9wZXJ0eSwgdmFsdWUgfSk7XG59XG5mdW5jdGlvbiBkYXRhc2V0X2Rldihub2RlLCBwcm9wZXJ0eSwgdmFsdWUpIHtcbiAgICBub2RlLmRhdGFzZXRbcHJvcGVydHldID0gdmFsdWU7XG4gICAgZGlzcGF0Y2hfZGV2KFwiU3ZlbHRlRE9NU2V0RGF0YXNldFwiLCB7IG5vZGUsIHByb3BlcnR5LCB2YWx1ZSB9KTtcbn1cbmZ1bmN0aW9uIHNldF9kYXRhX2Rldih0ZXh0LCBkYXRhKSB7XG4gICAgZGF0YSA9ICcnICsgZGF0YTtcbiAgICBpZiAodGV4dC5kYXRhID09PSBkYXRhKVxuICAgICAgICByZXR1cm47XG4gICAgZGlzcGF0Y2hfZGV2KFwiU3ZlbHRlRE9NU2V0RGF0YVwiLCB7IG5vZGU6IHRleHQsIGRhdGEgfSk7XG4gICAgdGV4dC5kYXRhID0gZGF0YTtcbn1cbmNsYXNzIFN2ZWx0ZUNvbXBvbmVudERldiBleHRlbmRzIFN2ZWx0ZUNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICBpZiAoIW9wdGlvbnMgfHwgKCFvcHRpb25zLnRhcmdldCAmJiAhb3B0aW9ucy4kJGlubGluZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJ3RhcmdldCcgaXMgYSByZXF1aXJlZCBvcHRpb25gKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlcigpO1xuICAgIH1cbiAgICAkZGVzdHJveSgpIHtcbiAgICAgICAgc3VwZXIuJGRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy4kZGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgQ29tcG9uZW50IHdhcyBhbHJlYWR5IGRlc3Ryb3llZGApOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IEh0bWxUYWcsIFN2ZWx0ZUNvbXBvbmVudCwgU3ZlbHRlQ29tcG9uZW50RGV2LCBTdmVsdGVFbGVtZW50LCBhZGRfYXR0cmlidXRlLCBhZGRfY2xhc3NlcywgYWRkX2ZsdXNoX2NhbGxiYWNrLCBhZGRfbG9jYXRpb24sIGFkZF9yZW5kZXJfY2FsbGJhY2ssIGFkZF9yZXNpemVfbGlzdGVuZXIsIGFkZF90cmFuc2Zvcm0sIGFmdGVyVXBkYXRlLCBhcHBlbmQsIGFwcGVuZF9kZXYsIGFzc2lnbiwgYXR0ciwgYXR0cl9kZXYsIGJlZm9yZVVwZGF0ZSwgYmluZCwgYmluZGluZ19jYWxsYmFja3MsIGJsYW5rX29iamVjdCwgYnViYmxlLCBjaGVja19vdXRyb3MsIGNoaWxkcmVuLCBjbGFpbV9lbGVtZW50LCBjbGFpbV9zcGFjZSwgY2xhaW1fdGV4dCwgY2xlYXJfbG9vcHMsIGNvbXBvbmVudF9zdWJzY3JpYmUsIGNyZWF0ZUV2ZW50RGlzcGF0Y2hlciwgY3JlYXRlX2FuaW1hdGlvbiwgY3JlYXRlX2JpZGlyZWN0aW9uYWxfdHJhbnNpdGlvbiwgY3JlYXRlX2luX3RyYW5zaXRpb24sIGNyZWF0ZV9vdXRfdHJhbnNpdGlvbiwgY3JlYXRlX3Nsb3QsIGNyZWF0ZV9zc3JfY29tcG9uZW50LCBjdXJyZW50X2NvbXBvbmVudCwgY3VzdG9tX2V2ZW50LCBkYXRhc2V0X2RldiwgZGVidWcsIGRlc3Ryb3lfYmxvY2ssIGRlc3Ryb3lfY29tcG9uZW50LCBkZXN0cm95X2VhY2gsIGRldGFjaCwgZGV0YWNoX2FmdGVyX2RldiwgZGV0YWNoX2JlZm9yZV9kZXYsIGRldGFjaF9iZXR3ZWVuX2RldiwgZGV0YWNoX2RldiwgZGlydHlfY29tcG9uZW50cywgZGlzcGF0Y2hfZGV2LCBlYWNoLCBlbGVtZW50LCBlbGVtZW50X2lzLCBlbXB0eSwgZXNjYXBlLCBlc2NhcGVkLCBleGNsdWRlX2ludGVybmFsX3Byb3BzLCBmaXhfYW5kX2Rlc3Ryb3lfYmxvY2ssIGZpeF9hbmRfb3V0cm9fYW5kX2Rlc3Ryb3lfYmxvY2ssIGZpeF9wb3NpdGlvbiwgZmx1c2gsIGdldENvbnRleHQsIGdldF9iaW5kaW5nX2dyb3VwX3ZhbHVlLCBnZXRfY3VycmVudF9jb21wb25lbnQsIGdldF9zbG90X2NoYW5nZXMsIGdldF9zbG90X2NvbnRleHQsIGdldF9zcHJlYWRfb2JqZWN0LCBnZXRfc3ByZWFkX3VwZGF0ZSwgZ2V0X3N0b3JlX3ZhbHVlLCBnbG9iYWxzLCBncm91cF9vdXRyb3MsIGhhbmRsZV9wcm9taXNlLCBpZGVudGl0eSwgaW5pdCwgaW5zZXJ0LCBpbnNlcnRfZGV2LCBpbnRyb3MsIGludmFsaWRfYXR0cmlidXRlX25hbWVfY2hhcmFjdGVyLCBpc19jbGllbnQsIGlzX2Z1bmN0aW9uLCBpc19wcm9taXNlLCBsaXN0ZW4sIGxpc3Rlbl9kZXYsIGxvb3AsIG1lYXN1cmUsIG1pc3NpbmdfY29tcG9uZW50LCBtb3VudF9jb21wb25lbnQsIG5vb3AsIG5vdF9lcXVhbCwgbm93LCBudWxsX3RvX2VtcHR5LCBvYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzLCBvbkRlc3Ryb3ksIG9uTW91bnQsIG9uY2UsIG91dHJvX2FuZF9kZXN0cm95X2Jsb2NrLCBwcmV2ZW50X2RlZmF1bHQsIHByb3BfZGV2LCByYWYsIHJ1biwgcnVuX2FsbCwgc2FmZV9ub3RfZXF1YWwsIHNjaGVkdWxlX3VwZGF0ZSwgc2VsZWN0X211bHRpcGxlX3ZhbHVlLCBzZWxlY3Rfb3B0aW9uLCBzZWxlY3Rfb3B0aW9ucywgc2VsZWN0X3ZhbHVlLCBzZWxmLCBzZXRDb250ZXh0LCBzZXRfYXR0cmlidXRlcywgc2V0X2N1cnJlbnRfY29tcG9uZW50LCBzZXRfY3VzdG9tX2VsZW1lbnRfZGF0YSwgc2V0X2RhdGEsIHNldF9kYXRhX2Rldiwgc2V0X2lucHV0X3R5cGUsIHNldF9pbnB1dF92YWx1ZSwgc2V0X25vdywgc2V0X3JhZiwgc2V0X3N0b3JlX3ZhbHVlLCBzZXRfc3R5bGUsIHNldF9zdmdfYXR0cmlidXRlcywgc3BhY2UsIHNwcmVhZCwgc3RvcF9wcm9wYWdhdGlvbiwgc3Vic2NyaWJlLCBzdmdfZWxlbWVudCwgdGV4dCwgdGljaywgdGltZV9yYW5nZXNfdG9fYXJyYXksIHRvX251bWJlciwgdG9nZ2xlX2NsYXNzLCB0cmFuc2l0aW9uX2luLCB0cmFuc2l0aW9uX291dCwgdXBkYXRlX2tleWVkX2VhY2gsIHZhbGlkYXRlX2NvbXBvbmVudCwgdmFsaWRhdGVfc3RvcmUsIHhsaW5rX2F0dHIgfTtcbiIsIjxzY3JpcHQ+XG5leHBvcnQgbGV0IGNsYXNzTmFtZSA9IFwiZGVmYXVsdFwiO1xuZXhwb3J0IGxldCBkaXNhYmxlZCA9IGZhbHNlO1xuZXhwb3J0IGxldCBjb250ZW50VGV4dDtcbmV4cG9ydCBsZXQgY29udGVudENvbXBvbmVudDtcbmV4cG9ydCBsZXQgb25DbGljayA9ICgpID0+IHt9O1xuXG5leHBvcnQgbGV0IF9iYjtcbmxldCBjb250ZW50Q29tcG9uZW50Q29udGFpbmVyO1xuXG4kOntcblx0aWYoX2JiICYmIGNvbnRlbnRDb21wb25lbnRDb250YWluZXIgJiYgY29udGVudENvbXBvbmVudC5fY29tcG9uZW50KVxuXHRcdF9iYi5pbml0aWFsaXNlQ29tcG9uZW50KGNvbnRlbnRDb21wb25lbnQsIGNvbnRlbnRDb21wb25lbnRDb250YWluZXIpO1xufVxuXG5cbmNvbnN0IGNsaWNrSGFuZGxlciA9ICgpID0+IHtcblx0aWYob25DbGljaykgb25DbGljaygpO1xufVxuXG48L3NjcmlwdD5cblxuXG48YnV0dG9uIGNsYXNzPXtjbGFzc05hbWV9IHtkaXNhYmxlZH0gb246Y2xpY2s9e2NsaWNrSGFuZGxlcn0+XG4gICAgeyNpZiBjb250ZW50Q29tcG9uZW50ICYmIGNvbnRlbnRDb21wb25lbnQuX2NvbXBvbmVudH1cblx0PGRpdiBiaW5kOnRoaXM9e2NvbnRlbnRDb21wb25lbnRDb250YWluZXJ9PlxuXHQ8L2Rpdj5cbiAgICB7OmVsc2UgaWYgY29udGVudFRleHR9XG4gICAge2NvbnRlbnRUZXh0fVxuICAgIHs6ZWxzZX1cbiAgICA8c2xvdCAvPlxuICAgIHsvaWZ9XG48L2J1dHRvbj5cblxuXG48c3R5bGU+XG5cbi5kZWZhdWx0IHtcblx0Zm9udC1mYW1pbHk6IGluaGVyaXQ7XG5cdGZvbnQtc2l6ZTogaW5oZXJpdDtcblx0cGFkZGluZzogMC40ZW07XG5cdG1hcmdpbjogMCAwIDAuNWVtIDA7XG5cdGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5cdGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XG5cdGJvcmRlci1yYWRpdXM6IDJweDtcblx0Y29sb3I6ICMzMzM7XG5cdGJhY2tncm91bmQtY29sb3I6ICNmNGY0ZjQ7XG5cdG91dGxpbmU6IG5vbmU7XG59XG5cbi5kZWZhdWx0OmFjdGl2ZSB7XG5cdGJhY2tncm91bmQtY29sb3I6ICNkZGQ7XG59XG5cbi5kZWZhdWx0OmZvY3VzIHtcblx0Ym9yZGVyLWNvbG9yOiAjNjY2O1xufVxuXG48L3N0eWxlPiIsIjxzY3JpcHQ+XG5cbmV4cG9ydCBsZXQgdmFsdWU9XCJcIjtcbmV4cG9ydCBsZXQgaGlkZVZhbHVlID0gZmFsc2U7XG5leHBvcnQgbGV0IGNsYXNzTmFtZSA9IFwiZGVmYXVsdFwiO1xuXG5leHBvcnQgbGV0IF9iYjtcblxubGV0IGFjdHVhbFZhbHVlID0gXCJcIjtcbiQ6IHtcblx0aWYoX2JiICYmIHZhbHVlLl9pc3N0YXRlKSB7XG5cdFx0X2JiLnN0b3JlLnN1YnNjcmliZShzID0+IHtcblx0XHRcdGFjdHVhbFZhbHVlID0gX2JiLnN0b3JlLmdldFZhbHVlKHMsIHZhbHVlKTtcblx0XHR9KTtcblx0fVxufVxuXG5jb25zdCBvbmNoYW5nZSA9IChldikgPT4ge1xuXHRpZihfYmIgJiYgdmFsdWUuX2lzc3RhdGUpIHtcblx0XHRfYmIuc3RvcmUuc2V0VmFsdWUodmFsdWUsIGV2LnRhcmdldC52YWx1ZSk7XG5cdH0gZWxzZSBpZighdmFsdWUuX2lzc3RhdGUpIHtcblx0XHRhY3R1YWxWYWx1ZSA9IGV2LnRhcmdldC52YWx1ZTtcblx0fVxufVxuXG48L3NjcmlwdD5cblxueyNpZiBoaWRlVmFsdWV9XG48aW5wdXQgY2xhc3M9e2NsYXNzTmFtZX0gXG5cdCAgIHR5cGU9XCJwYXNzd29yZFwiIFxuXHQgICB2YWx1ZT17YWN0dWFsVmFsdWV9IG9uOmNoYW5nZS8+XG57OmVsc2V9XG48aW5wdXQgY2xhc3M9e2NsYXNzTmFtZX0gdHlwZT1cInRleHRcIiB2YWx1ZT17YWN0dWFsVmFsdWV9Lz5cbnsvaWZ9XG5cbjxzdHlsZT5cbi5kZWZhdWx0IHtcbiAgICB3aWR0aDogMTAwJTtcblx0Zm9udC1mYW1pbHk6IGluaGVyaXQ7XG5cdGZvbnQtc2l6ZTogaW5oZXJpdDtcblx0cGFkZGluZzogMC40ZW07XG5cdG1hcmdpbjogMCAwIDAuNWVtIDA7XG5cdGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5cdGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgIHdpZHRoOiAxMDAlO1xufVxuXG4uZGVmYXVsdDpkaXNhYmxlZCB7XG5cdGNvbG9yOiAjY2NjO1xufVxuXG48L3N0eWxlPiIsIjxzY3JpcHQ+XG5leHBvcnQgbGV0IGNvbnRhaW5lckNsYXNzID0gXCJcIjtcbmV4cG9ydCBsZXQgZm9ybUNvbnRyb2xzID0gW107XG5cbmV4cG9ydCBsZXQgX2JiO1xuXG5sZXQgaHRtbEVsZW1lbnRzID0ge307XG5sZXQgbGFiZWxzID0ge307XG5cbiQgOiB7XG4gICAgbGV0IGNJbmRleCA9IDA7XG4gICAgZm9yKGxldCBjIG9mIGZvcm1Db250cm9scykge1xuICAgICAgICBsYWJlbHNbY0luZGV4XSA9IGMubGFiZWw7XG4gICAgICAgIGNJbmRleCsrO1xuICAgIH1cblxuICAgIGlmKF9iYiAmJiBodG1sRWxlbWVudHMpIHtcbiAgICAgICAgZm9yKGxldCBlbCBpbiBodG1sRWxlbWVudHMpIHtcbiAgICAgICAgICAgIF9iYi5pbml0aWFsaXNlQ29tcG9uZW50KFxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sc1tlbF0uY29udHJvbCxcbiAgICAgICAgICAgICAgICBodG1sRWxlbWVudHNbZWxdXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxufVxuXG48L3NjcmlwdD5cblxuPGRpdiBjbGFzcz1cImZvcm0tcm9vdCB7Y29udGFpbmVyQ2xhc3N9XCI+XG4gICAgeyNlYWNoIGZvcm1Db250cm9scyBhcyBjaGlsZCwgaW5kZXh9XG4gICAgPGRpdiBjbGFzcz1cImxhYmVsXCI+e2xhYmVsc1tpbmRleF19PC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIlxuICAgICAgICBiaW5kOnRoaXM9e2h0bWxFbGVtZW50c1tpbmRleF19PlxuICAgIDwvZGl2PlxuICAgIHsvZWFjaH1cbjwvZGl2PlxuXG48c3R5bGU+XG4uZm9ybS1yb290IHtcbiAgICBkaXNwbGF5OiBncmlkO1xuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogW2xhYmVsXSBhdXRvIFtjb250cm9sXSAxZnI7IC8qIFtvdmVyZmxvd10gYXV0bzsqL1xufVxuXG4ubGFiZWwge1xuICAgIGdyaWQtY29sdW1uLXN0YXJ0OiBsYWJlbDtcbiAgICBwYWRkaW5nOiA1cHggMTBweDtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xufVxuLmNvbnRyb2wge1xuICAgIGdyaWQtY29sdW1uLXN0YXJ0OiBjb250cm9sO1xuICAgIHBhZGRpbmc6IDVweCAxMHB4O1xufVxuLm92ZXJmbG93IHtcbiAgICBncmlkLWNvbHVtbi1zdGFydDogb3ZlcmZsb3c7XG59XG4uZnVsbC13aWR0aCB7XG4gICAgd2lkdGg6IDEwMCU7XG59XG48L3N0eWxlPiIsIjxzY3JpcHQ+XG5cbmltcG9ydCBUZXh0Ym94IGZyb20gXCIuL1RleHRib3guc3ZlbHRlXCI7XG5pbXBvcnQgRm9ybSBmcm9tIFwiLi9Gb3JtLnN2ZWx0ZVwiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwiLi9CdXR0b24uc3ZlbHRlXCI7XG5cbmV4cG9ydCBsZXQgdXNlcm5hbWVMYWJlbCA9IFwiVXNlcm5hbWVcIjtcbmV4cG9ydCBsZXQgcGFzc3dvcmRMYWJlbCA9IFwiUGFzc3dvcmRcIjtcbmV4cG9ydCBsZXQgbG9naW5CdXR0b25MYWJlbCA9IFwiTG9naW5cIjtcbmV4cG9ydCBsZXQgbG9naW5SZWRpcmVjdCA9IFwiXCI7XG5leHBvcnQgbGV0IGxvZ28gPSBcIlwiO1xuZXhwb3J0IGxldCBidXR0b25DbGFzcyA9IFwiXCI7XG5leHBvcnQgbGV0IGlucHV0Q2xhc3M9XCJcIlxuXG5leHBvcnQgbGV0IF9iYjtcblxubGV0IHVzZXJuYW1lID0gXCJcIjtcbmxldCBwYXNzd29yZCA9IFwiXCI7XG5sZXQgYnVzeSA9IGZhbHNlO1xubGV0IGluY29ycmVjdCA9IGZhbHNlO1xubGV0IF9sb2dvID0gXCJcIjtcbmxldCBfYnV0dG9uQ2xhc3MgPSBcIlwiO1xubGV0IF9pbnB1dENsYXNzID0gXCJcIjtcblxuJDoge1xuICAgIF9sb2dvID0gX2JiLnJlbGF0aXZlVXJsKGxvZ28pO1xuICAgIF9idXR0b25DbGFzcyA9IGJ1dHRvbkNsYXNzIHx8IFwiZGVmYXVsdC1idXR0b25cIjtcbiAgICBfaW5wdXRDbGFzcyA9IGlucHV0Q2xhc3MgfHwgXCJkZWZhdWx0LWlucHV0XCI7XG59XG5cbmNvbnN0IGxvZ2luID0gKCkgPT4ge1xuICAgIGJ1c3kgPSB0cnVlO1xuICAgIF9iYi5hcGkucG9zdChcIi9hcGkvYXV0aGVudGljYXRlXCIsIHt1c2VybmFtZSwgcGFzc3dvcmR9KVxuICAgIC50aGVuKHIgPT4ge1xuICAgICAgICBidXN5ID0gZmFsc2U7XG4gICAgICAgIGlmKHIuc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiByLmpzb24oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGluY29ycmVjdCA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9KVxuICAgIC50aGVuKHVzZXIgPT4ge1xuICAgICAgICBpZih1c2VyKSB7XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImJ1ZGliYXNlOnVzZXJcIiwgdXNlcik7XG4gICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgICAgfVxuICAgIH0pXG59XG5cbjwvc2NyaXB0PlxuXG48ZGl2IGNsYXNzPVwicm9vdFwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImNvbnRlbnRcIj5cblxuICAgICAgICB7I2lmIF9sb2dvfVxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9nby1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxpbWcgc3JjPXtfbG9nb30gYWx0PVwibG9nb1wiLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIHsvaWZ9XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tcm9vdFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsXCI+XG4gICAgICAgICAgICAgICAge3VzZXJuYW1lTGFiZWx9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IGJpbmQ6dmFsdWU9e3VzZXJuYW1lfSB0eXBlPVwidGV4dFwiIGNsYXNzPXtfaW5wdXRDbGFzc30vPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWxcIj5cbiAgICAgICAgICAgICAgICB7cGFzc3dvcmRMYWJlbH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgYmluZDp2YWx1ZT17cGFzc3dvcmR9IHR5cGU9XCJwYXNzd29yZFwiIGNsYXNzPXtfaW5wdXRDbGFzc30vPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJsb2dpbi1idXR0b24tY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGRpc2FibGVkPXtidXN5fSBcbiAgICAgICAgICAgICAgICAgICAgb246Y2xpY2s9e2xvZ2lufVxuICAgICAgICAgICAgICAgICAgICBjbGFzcz17X2J1dHRvbkNsYXNzfT5cbiAgICAgICAgICAgICAgICAgICAge2xvZ2luQnV0dG9uTGFiZWx9XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgeyNpZiBpbmNvcnJlY3R9XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbmNvcnJlY3QtZGV0YWlscy1wYW5lbFwiPlxuICAgICAgICAgICAgSW5jb3JyZWN0IHVzZXJuYW1lIG9yIHBhc3N3b3JkXG4gICAgICAgIDwvZGl2PlxuICAgICAgICB7L2lmfVxuXG4gICAgPC9kaXY+XG5cbjwvZGl2PlxuXG48c3R5bGU+XG5cbi5yb290IHtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgZGlzcGxheTpncmlkO1xuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogW2xlZnRdIDFmciBbbWlkZGxlXSBhdXRvIFtyaWdodF0gMWZyO1xuICAgIGdyaWQtdGVtcGxhdGUtcm93czogW3RvcF0gMWZyIFtjZW50ZXJdIGF1dG8gW2JvdHRvbV0gMWZyO1xufVxuXG4uY29udGVudCB7XG4gICAgZ3JpZC1jb2x1bW4tc3RhcnQ6IG1pZGRsZTtcbiAgICBncmlkLXJvdy1zdGFydDogY2VudGVyO1xuICAgIHdpZHRoOiA0MDBweDtcbn1cblxuLmxvZ28tY29udGFpbmVyIHtcbiAgICBtYXJnaW4tYm90dG9tOiAyMHB4XG59XG5cbi5sb2dvLWNvbnRhaW5lciA+IGltZyB7XG4gICAgbWF4LXdpZHRoOiAxMDAlO1xufVxuXG4ubG9naW4tYnV0dG9uLWNvbnRhaW5lciB7XG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgbWFyZ2luLXRvcDogMjBweDtcbn1cblxuLmluY29ycmVjdC1kZXRhaWxzLXBhbmVsIHtcbiAgICBtYXJnaW4tdG9wOiAzMHB4O1xuICAgIHBhZGRpbmc6IDEwcHg7XG4gICAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcbiAgICBib3JkZXItd2lkdGg6IDFweDtcbiAgICBib3JkZXItY29sb3I6IG1hcm9vbjtcbiAgICBib3JkZXItcmFkaXVzOiAxcHg7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGNvbG9yOiBtYXJvb247XG4gICAgYmFja2dyb3VuZC1jb2xvcjogbWlzdHlyb3NlO1xufVxuXG4uZm9ybS1yb290IHtcbiAgICBkaXNwbGF5OiBncmlkO1xuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogW2xhYmVsXSBhdXRvIFtjb250cm9sXSAxZnI7IC8qIFtvdmVyZmxvd10gYXV0bzsqL1xufVxuXG4ubGFiZWwge1xuICAgIGdyaWQtY29sdW1uLXN0YXJ0OiBsYWJlbDtcbiAgICBwYWRkaW5nOiA1cHggMTBweDtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xufVxuLmNvbnRyb2wge1xuICAgIGdyaWQtY29sdW1uLXN0YXJ0OiBjb250cm9sO1xuICAgIHBhZGRpbmc6IDVweCAxMHB4O1xufVxuXG4uZGVmYXVsdC1pbnB1dCB7XG5cdGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuXHRmb250LXNpemU6IGluaGVyaXQ7XG5cdHBhZGRpbmc6IDAuNGVtO1xuXHRtYXJnaW46IDAgMCAwLjVlbSAwO1xuXHRib3gtc2l6aW5nOiBib3JkZXItYm94O1xuXHRib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgICB3aWR0aDogMTAwJTtcbn1cblxuLmRlZmF1bHQtYnV0dG9uIHtcblx0Zm9udC1mYW1pbHk6IGluaGVyaXQ7XG5cdGZvbnQtc2l6ZTogaW5oZXJpdDtcblx0cGFkZGluZzogMC40ZW07XG5cdG1hcmdpbjogMCAwIDAuNWVtIDA7XG5cdGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5cdGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XG5cdGJvcmRlci1yYWRpdXM6IDJweDtcblx0Y29sb3I6ICMzMzM7XG5cdGJhY2tncm91bmQtY29sb3I6ICNmNGY0ZjQ7XG5cdG91dGxpbmU6IG5vbmU7XG59XG5cbi5kZWZhdWx0LWJ1dHRvbjphY3RpdmUge1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkO1xufVxuXG4uZGVmYXVsdC1idXR0b246Zm9jdXMge1xuXHRib3JkZXItY29sb3I6ICM2NjY7XG59XG5cbjwvc3R5bGU+IiwiZXhwb3J0IGNvbnN0IGJ1aWxkU3R5bGUgPSAoc3R5bGVzKSA9PiB7XHJcbiAgICBsZXQgc3RyID0gXCJcIjtcclxuICAgIGZvcihsZXQgcyBpbiBzdHlsZXMpIHtcclxuICAgICAgICBpZihzdHlsZXNbc10pIHtcclxuICAgICAgICAgICAgc3RyICs9IGAke3N9OiAke3N0eWxlc1tzXX07IGBcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3RyO1xyXG59IiwiPHNjcmlwdD5cclxuaW1wb3J0IHsgb25Nb3VudCB9IGZyb20gJ3N2ZWx0ZSdcclxuaW1wb3J0IHtidWlsZFN0eWxlfSBmcm9tIFwiLi9idWlsZFN0eWxlXCI7XHJcblxyXG5leHBvcnQgbGV0IGdyaWRUZW1wbGF0ZVJvd3MgPVwiXCI7XHJcbmV4cG9ydCBsZXQgZ3JpZFRlbXBsYXRlQ29sdW1ucyA9XCJcIjtcclxuZXhwb3J0IGxldCBjaGlsZHJlbiA9IFtdO1xyXG5leHBvcnQgbGV0IHdpZHRoID0gXCJhdXRvXCI7XHJcbmV4cG9ydCBsZXQgaGVpZ2h0ID0gXCJhdXRvXCI7XHJcbmV4cG9ydCBsZXQgY29udGFpbmVyQ2xhc3M9XCJcIjtcclxuZXhwb3J0IGxldCBpdGVtQ29udGFpbmVyQ2xhc3M9XCJcIjtcclxuXHJcbi8qXCJncmlkQ29sdW1uU3RhcnRcIjpcInN0cmluZ1wiLFxyXG5cImdyaWRDb2x1bW5FbmRcIjpcInN0cmluZ1wiLFxyXG5cImdyaWRSb3dTdGFydFwiOlwic3RyaW5nXCIsXHJcblwiZ3JpZFJvd0VuZFwiOlwic3RyaW5nXCIqL1xyXG5cclxuXHJcbmV4cG9ydCBsZXQgX2JiO1xyXG5cclxubGV0IHN0eWxlPVwiXCI7XHJcbmxldCBodG1sRWxlbWVudHMgPSB7fTtcclxuXHJcbiQgOiB7XHJcbiAgICBpZihfYmIgJiYgaHRtbEVsZW1lbnRzKSB7XHJcbiAgICAgICAgZm9yKGxldCBlbCBpbiBodG1sRWxlbWVudHMpIHtcclxuICAgICAgICAgICAgX2JiLmluaXRpYWxpc2VDb21wb25lbnQoXHJcbiAgICAgICAgICAgICAgICBjaGlsZHJlbltlbF0uY29udHJvbCxcclxuICAgICAgICAgICAgICAgIGh0bWxFbGVtZW50c1tlbF1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IGNoaWxkU3R5bGUgPSBjaGlsZCA9PiBcclxuICAgIGJ1aWxkU3R5bGUoe1xyXG4gICAgICAgIFwiZ3JpZC1jb2x1bW4tc3RhcnRcIjogY2hpbGQuZ3JpZENvbHVtblN0YXJ0LFxyXG4gICAgICAgIFwiZ3JpZC1jb2x1bW4tZW5kXCI6IGNoaWxkLmdyaWRDb2x1bW5FbmQsXHJcbiAgICAgICAgXCJncmlkLWNvbHVtblwiOiBjaGlsZC5ncmlkQ29sdW1uLFxyXG4gICAgICAgIFwiZ3JpZC1yb3ctc3RhcnRcIjogY2hpbGQuZ3JpZFJvd1N0YXJ0LFxyXG4gICAgICAgIFwiZ3JpZC1yb3ctZW5kXCI6IGNoaWxkLmdyaWRSb3dTdGFydCxcclxuICAgICAgICBcImdyaWQtcm93XCI6IGNoaWxkLmdyaWRSb3csXHJcbiAgICB9KTtcclxuXHJcbjwvc2NyaXB0PlxyXG5cclxuPGRpdiBjbGFzcz1cInJvb3Qge2NvbnRhaW5lckNsYXNzfVwiXHJcbiAgICAgc3R5bGU9XCJ3aWR0aDoge3dpZHRofTsgaGVpZ2h0OiB7aGVpZ2h0fTsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiB7Z3JpZFRlbXBsYXRlQ29sdW1uc307IGdyaWQtdGVtcGxhdGUtcm93czoge2dyaWRUZW1wbGF0ZVJvd3N9O1wiPlxyXG4gICAgeyNlYWNoIGNoaWxkcmVuIGFzIGNoaWxkLCBpbmRleH1cclxuICAgIDxkaXYgY2xhc3M9XCJ7aXRlbUNvbnRhaW5lckNsYXNzfVwiXHJcbiAgICAgICAgc3R5bGU9e2NoaWxkU3R5bGUoY2hpbGQpfVxyXG4gICAgICAgIGJpbmQ6dGhpcz17aHRtbEVsZW1lbnRzW2luZGV4XX0+XHJcbiAgICA8L2Rpdj5cclxuICAgIHsvZWFjaH1cclxuPC9kaXY+XHJcblxyXG48c3R5bGU+XHJcblxyXG4ucm9vdCB7XHJcbiAgICBkaXNwbGF5OiBncmlkO1xyXG59XHJcblxyXG48L3N0eWxlPiIsIjxzY3JpcHQ+XG5pbXBvcnQgeyBvbk1vdW50IH0gZnJvbSAnc3ZlbHRlJ1xuaW1wb3J0IHsgZW1wdHlQcm9wcyB9IGZyb20gXCIuL2VtcHR5UHJvcHNcIjtcblxuZXhwb3J0IGxldCBkaXJlY3Rpb24gPSBcImhvcml6b250YWxcIjtcbmV4cG9ydCBsZXQgY2hpbGRyZW4gPSBbXTtcbmV4cG9ydCBsZXQgd2lkdGggPSBcImF1dG9cIjtcbmV4cG9ydCBsZXQgaGVpZ2h0ID0gXCJhdXRvXCI7XG5leHBvcnQgbGV0IGNvbnRhaW5lckNsYXNzPVwiXCI7XG5leHBvcnQgbGV0IGl0ZW1Db250YWluZXJDbGFzcz1cIlwiO1xuZXhwb3J0IGxldCBvbkxvYWQ7XG5cbmV4cG9ydCBsZXQgZGF0YT1bXTtcbmV4cG9ydCBsZXQgZGF0YUl0ZW1Db21wb25lbnQ7XG5cbmV4cG9ydCBsZXQgX2JiO1xuXG5sZXQgc3RhdGljSHRtbEVsZW1lbnRzID0ge307XG5sZXQgc3RhdGljQ29tcG9uZW50cyA9IHt9O1xubGV0IGRhdGFCb3VuZEVsZW1lbnRzID0ge307XG5sZXQgZGF0YUJvdW5kQ29tcG9uZW50cyA9IHt9O1xuXG5jb25zdCBoYXNEYXRhQm91bmRDb21wb25lbnRzID0gKCkgPT4gXG4gICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZGF0YUJvdW5kQ29tcG9uZW50cykubGVuZ3RoID09PSAwO1xuXG5jb25zdCBoYXNEYXRhID0gKCkgPT4gXG4gICAgQXJyYXkuaXNBcnJheShkYXRhKSAmJiBkYXRhLmxlbmd0aCA+IDA7XG5cbmNvbnN0IGhhc1N0YXRpY0NvbXBvbmVudHMgPSAoKSA9PiB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHN0YXRpY0NvbXBvbmVudHMpLmxlbmd0aCA9PT0gMDtcbn1cblxuJDoge1xuXG4gICAgaWYoc3RhdGljSHRtbEVsZW1lbnRzKSB7XG4gICAgICAgIGlmKGhhc1N0YXRpY0NvbXBvbmVudHMoKSkge1xuICAgICAgICAgICAgZm9yKGxldCBjIGluIHN0YXRpY0NvbXBvbmVudHMpIHtcbiAgICAgICAgICAgICAgICBzdGF0aWNDb21wb25lbnRzW2NdLiRkZXN0cm95KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGF0aWNDb21wb25lbnRzID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBmb3IobGV0IGVsIGluIHN0YXRpY0h0bWxFbGVtZW50cykge1xuICAgICAgICAgICAgc3RhdGljQ29tcG9uZW50c1tlbF0gPSBfYmIuaW5pdGlhbGlzZUNvbXBvbmVudChcbiAgICAgICAgICAgICAgICBjaGlsZHJlbltlbF0uY29udHJvbCxcbiAgICAgICAgICAgICAgICBzdGF0aWNIdG1sRWxlbWVudHNbZWxdXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuXG4gICAgaWYoaGFzRGF0YUJvdW5kQ29tcG9uZW50cygpKSB7XG4gICAgICAgIGZvcihsZXQgYyBpbiBkYXRhQm91bmRDb21wb25lbnRzKSB7XG4gICAgICAgICAgICBkYXRhQm91bmRDb21wb25lbnRzW2NdLiRkZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YUJvdW5kQ29tcG9uZW50cyA9IHt9O1xuICAgIH1cblxuICAgIGlmKGhhc0RhdGEoKSkge1xuICAgICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgICBmb3IobGV0IGQgaW4gZGF0YUJvdW5kRWxlbWVudHMpIHtcbiAgICAgICAgICAgIF9iYi5pbml0aWFsaXNlQ29tcG9uZW50KFxuICAgICAgICAgICAgICAgIGRhdGFJdGVtQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgIGRhdGFCb3VuZEVsZW1lbnRzW2RdLFxuICAgICAgICAgICAgICAgIGRhdGFbcGFyc2VJbnQoZCldXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cbjwvc2NyaXB0PlxuXG48ZGl2IGNsYXNzPVwicm9vdCB7Y29udGFpbmVyQ2xhc3N9XCJcbiAgICAgc3R5bGU9XCJ3aWR0aDoge3dpZHRofTsgaGVpZ2h0OiB7aGVpZ2h0fVwiPlxuICAgIHsjZWFjaCBjaGlsZHJlbiBhcyBjaGlsZCwgaW5kZXh9XG4gICAgPGRpdiBjbGFzcz17ZGlyZWN0aW9ufT5cbiAgICAgICAgPGRpdiBjbGFzcz1cIntpdGVtQ29udGFpbmVyQ2xhc3N9XCJcbiAgICAgICAgICAgIGJpbmQ6dGhpcz17c3RhdGljSHRtbEVsZW1lbnRzW2luZGV4XX0+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIHsvZWFjaH1cbiAgICB7I2VhY2ggZGF0YSBhcyBjaGlsZCwgaW5kZXh9XG4gICAgPGRpdiBjbGFzcz17ZGlyZWN0aW9ufT5cbiAgICAgICAgPGRpdiBjbGFzcz1cIntpdGVtQ29udGFpbmVyQ2xhc3N9XCJcbiAgICAgICAgICAgIGJpbmQ6dGhpcz17ZGF0YUJvdW5kRWxlbWVudHNbaW5kZXhdfT5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgey9lYWNofVxuPC9kaXY+XG5cbjxzdHlsZT5cblxuLmhvcml6b250YWwge1xuICAgIGRpc3BsYXk6aW5saW5lLWJsb2NrO1xufVxuXG4udmVydGljYWwge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG48L3N0eWxlPiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9rYWlzZXJtYW5uL3N2ZWx0ZS1jc3MtdmFyc1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgKG5vZGUsIHByb3BzKSA9PiB7XHJcbiAgICBPYmplY3QuZW50cmllcyhwcm9wcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XHJcbiAgICAgIG5vZGUuc3R5bGUuc2V0UHJvcGVydHkoYC0tJHtrZXl9YCwgdmFsdWUpO1xyXG4gICAgfSk7XHJcbiAgXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB1cGRhdGUobmV3X3Byb3BzKSB7XHJcbiAgICAgICAgT2JqZWN0LmVudHJpZXMobmV3X3Byb3BzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcclxuICAgICAgICAgIG5vZGUuc3R5bGUuc2V0UHJvcGVydHkoYC0tJHtrZXl9YCwgdmFsdWUpO1xyXG4gICAgICAgICAgZGVsZXRlIHByb3BzW2tleV07XHJcbiAgICAgICAgfSk7XHJcbiAgXHJcbiAgICAgICAgT2JqZWN0LmtleXMocHJvcHMpLmZvckVhY2gobmFtZSA9PlxyXG4gICAgICAgICAgbm9kZS5zdHlsZS5yZW1vdmVQcm9wZXJ0eShgLS0ke25hbWV9YCksXHJcbiAgICAgICAgKTtcclxuICAgICAgICBwcm9wcyA9IG5ld19wcm9wcztcclxuICAgICAgfSxcclxuICAgIH07XHJcbiAgfTsiLCI8c2NyaXB0PlxyXG5pbXBvcnQgY3NzVmFycyBmcm9tIFwiLi9jc3NWYXJzXCI7XHJcblxyXG5leHBvcnQgbGV0IG5hdkJhckJhY2tncm91bmQgPSBcIlwiO1xyXG5leHBvcnQgbGV0IG5hdkJhckJvcmRlcj1cIlwiO1xyXG5leHBvcnQgbGV0IG5hdkJhckNvbG9yPVwiXCI7XHJcbmV4cG9ydCBsZXQgc2VsZWN0ZWRJdGVtQmFja2dyb3VuZD1cIlwiO1xyXG5leHBvcnQgbGV0IHNlbGVjdGVkSXRlbUNvbG9yPVwiXCI7XHJcbmV4cG9ydCBsZXQgc2VsZWN0ZWRJdGVtQm9yZGVyPVwiXCI7XHJcbmV4cG9ydCBsZXQgaXRlbUhvdmVyQmFja2dyb3VuZD1cIlwiO1xyXG5leHBvcnQgbGV0IGl0ZW1Ib3ZlckNvbG9yPVwiXCI7XHJcbmV4cG9ydCBsZXQgaXRlbXMgPSBbXVxyXG5cclxuZXhwb3J0IGxldCBfYmI7XHJcblxyXG5sZXQgc2VsZWN0ZWRJbmRleDtcclxubGV0IGNvbnRlbnRFbGVtZW50O1xyXG5cclxuJDogc3R5bGVWYXJzID0ge1xyXG4gICAgbmF2QmFyQmFja2dyb3VuZCwgbmF2QmFyQm9yZGVyLFxyXG4gICAgbmF2QmFyQ29sb3IsIHNlbGVjdGVkSXRlbUJhY2tncm91bmQsXHJcbiAgICBzZWxlY3RlZEl0ZW1Db2xvciwgc2VsZWN0ZWRJdGVtQm9yZGVyLFxyXG4gICAgaXRlbUhvdmVyQmFja2dyb3VuZCwgaXRlbUhvdmVyQ29sb3JcclxufVxyXG5cclxuY29uc3Qgb25TZWxlY3RJdGVtID0gKGluZGV4KSA9PiAoKSA9PiB7XHJcbiAgICBzZWxlY3RlZEluZGV4ID0gaW5kZXg7XHJcbiAgICBfYmIuaW5pdGlhbGlzZUNvbXBvbmVudChpdGVtc1tpbmRleF0uY29tcG9uZW50LCBjb250ZW50RWxlbWVudCk7XHJcbn1cclxuXHJcblxyXG48L3NjcmlwdD5cclxuXHJcbjxkaXYgY2xhc3M9XCJyb290XCIgdXNlOmNzc1ZhcnM9e3N0eWxlVmFyc30+XHJcbiAgICA8ZGl2IGNsYXNzPVwibmF2YmFyXCI+XHJcbiAgICAgICAgeyNlYWNoIGl0ZW1zIGFzIG5hdkl0ZW0sIGluZGV4fVxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJuYXZpdGVtXCJcclxuICAgICAgICAgICAgIG9uOmNsaWNrPXtvblNlbGVjdEl0ZW0oaW5kZXgpfVxyXG4gICAgICAgICAgICAgY2xhc3M6c2VsZWN0ZWQ9e3NlbGVjdGVkSW5kZXggPT09IGluZGV4fT5cclxuICAgICAgICAgICAge25hdkl0ZW0udGl0bGV9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgey9lYWNofVxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29udGVudFwiXHJcbiAgICAgICAgIGJpbmQ6dGhpcz17Y29udGVudEVsZW1lbnR9PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPHN0eWxlPlxyXG5cclxuLnJvb3Qge1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgd2lkdGg6MTAwJTtcclxuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogW25hdmJhcl0gYXV0byBbY29udGVudF0gMWZyO1xyXG4gICAgZGlzcGxheTogZ3JpZDtcclxufVxyXG5cclxuLm5hdmJhciB7XHJcbiAgICBncmlkLWNvbHVtbjogbmF2YmFyO1xyXG4gICAgYmFja2dyb3VuZDogdmFyKC0tbmF2QmFyQmFja2dyb3VuZCk7XHJcbiAgICBib3JkZXI6IHZhcigtLW5hdkJhckJvcmRlcik7XHJcbiAgICBjb2xvcjogdmFyKC0tbmF2QmFyQ29sb3IpO1xyXG59XHJcblxyXG4ubmF2aXRlbSB7XHJcbiAgICBwYWRkaW5nOiAxMHB4IDE3cHg7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbn1cclxuXHJcbi5uYXZpdGVtOmhvdmVyIHtcclxuICAgIGJhY2tncm91bmQ6IHZhcigtLWl0ZW1Ib3ZlckJhY2tncm91bmQpO1xyXG4gICAgY29sb3I6IHZhcigtLWl0ZW1Ib3ZlckNvbG9yKTtcclxufVxyXG5cclxuLm5hdml0ZW0uc2VsZWN0ZWQge1xyXG4gICAgYmFja2dyb3VuZDogdmFyKC0tc2VsZWN0ZWRJdGVtQmFja2dyb3VuZCk7XHJcbiAgICBib3JkZXI6IHZhcigtLXNlbGVjdGVkSXRlbUJvcmRlcik7XHJcbiAgICBjb2xvcjogdmFyKC0tc2VsZWN0ZWRJdGVtQ29sb3IpO1xyXG59XHJcblxyXG4uY29udGVudCB7XHJcbiAgICBncmlkLWNvbHVtbjogY29udGVudDtcclxufVxyXG5cclxuPC9zdHlsZT5cclxuXHJcbiIsIjxzY3JpcHQ+XHJcbmltcG9ydCB7YnVpbGRTdHlsZX0gZnJvbSBcIi4vYnVpbGRTdHlsZVwiO1xyXG5pbXBvcnQgY3NzVmFycyBmcm9tIFwiLi9jc3NWYXJzXCI7XHJcblxyXG5leHBvcnQgbGV0IGNvbXBvbmVudD1cIlwiO1xyXG5leHBvcnQgbGV0IHRleHQ9XCJcIjtcclxuZXhwb3J0IGxldCBjb250YWluZXJDbGFzcz1cIlwiO1xyXG5leHBvcnQgbGV0IGJhY2tncm91bmQ9XCJcIjtcclxuZXhwb3J0IGxldCBib3JkZXI9XCJcIjtcclxuZXhwb3J0IGxldCBib3JkZXJSYWRpdXM9XCJcIjtcclxuZXhwb3J0IGxldCBmb250PVwiXCI7XHJcbmV4cG9ydCBsZXQgZGlzcGxheT1cIlwiO1xyXG5leHBvcnQgbGV0IHRleHRBbGlnbj1cIlwiO1xyXG5leHBvcnQgbGV0IGNvbG9yPVwiXCI7XHJcbmV4cG9ydCBsZXQgcGFkZGluZz1cIlwiO1xyXG5leHBvcnQgbGV0IG1hcmdpbj1cIlwiO1xyXG5leHBvcnQgbGV0IGhvdmVyQmFja2dyb3VuZD1cIlwiO1xyXG5leHBvcnQgbGV0IGhvdmVyQ29sb3I9XCJcIjtcclxuZXhwb3J0IGxldCBvbkNsaWNrO1xyXG5leHBvcnQgbGV0IGhlaWdodDtcclxuZXhwb3J0IGxldCB3aWR0aDtcclxuXHJcbmV4cG9ydCBsZXQgX2JiO1xyXG5cclxubGV0IHN0eWxlVmFycztcclxubGV0IHN0eWxlPVwiXCI7XHJcbmxldCBjb21wb25lbnRFbGVtZW50O1xyXG5cclxuJDoge1xyXG4gICAgc3R5bGU9YnVpbGRTdHlsZSh7XHJcbiAgICAgICAgYm9yZGVyLCBiYWNrZ3JvdW5kLCBmb250LCBtYXJnaW4sXHJcbiAgICAgICAgcGFkZGluZywgZGlzcGxheSwgY29sb3IsIGhlaWdodCwgd2lkdGgsXHJcbiAgICAgICAgXCJ0ZXh0LWFsaWduXCI6IHRleHRBbGlnbixcclxuICAgICAgICBcImJvcmRlci1yYWRpdXNcIjpib3JkZXJSYWRpdXNcclxuICAgIH0pO1xyXG5cclxuICAgIGlmKF9iYiAmJiBjb21wb25lbnQpIHtcclxuICAgICAgICBfYmIuaW5pdGlhbGlzZUNvbXBvbmVudChjb21wb25lbnQsIGNvbXBvbmVudEVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0eWxlVmFycyA9IHtcclxuICAgICAgICBob3ZlckJhY2tncm91bmQ6aG92ZXJCYWNrZ3JvdW5kIHx8IGJhY2tncm91bmQsIFxyXG4gICAgICAgIGhvdmVyQ29sb3I6aG92ZXJDb2xvciB8fCBjb2xvcixcclxuICAgICAgICBwb2ludGVyOiBvbkNsaWNrID8gXCJjdXJzb3JcIiA6IFwibm9uZVwiXHJcbiAgICB9XHJcbn1cclxuXHJcbjwvc2NyaXB0PlxyXG5cclxuPGRpdiBjbGFzcz1cIntjb250YWluZXJDbGFzc30gcGFuZWxcIiBcclxuICAgICBzdHlsZT17c3R5bGV9XHJcbiAgICAgdXNlOmNzc1ZhcnM9e3N0eWxlVmFyc31cclxuICAgICB0aGlzOmJpbmQ9e2NvbXBvbmVudEVsZW1lbnR9XHJcbiAgICAgb246Y2xpY2s9eygpID0+IG9uQ2xpY2sgPyBvbkNsaWNrKCkgOiB1bmRlZmluZWR9PlxyXG4gICAge2NvbXBvbmVudCA/IFwiXCIgOiB0ZXh0fVxyXG48L2Rpdj5cclxuXHJcbjxzdHlsZT5cclxuXHJcbi5wYW5lbDpob3ZlciB7XHJcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ob3ZlckJhY2tncm91bmQpO1xyXG4gICAgY29sb3I6IHZhcigtLWhvdmVyQ29sb3IpO1xyXG59XHJcblxyXG48L3N0eWxlPlxyXG4iLCI8c2NyaXB0PlxyXG5pbXBvcnQge2J1aWxkU3R5bGV9IGZyb20gXCIuL2J1aWxkU3R5bGVcIjtcclxuXHJcbmV4cG9ydCBsZXQgdmFsdWU9XCJcIjtcclxuZXhwb3J0IGxldCBjb250YWluZXJDbGFzcz1cIlwiO1xyXG5cclxuZXhwb3J0IGxldCBmb250PVwiXCI7XHJcbmV4cG9ydCBsZXQgdGV4dEFsaWduPVwiXCI7XHJcbmV4cG9ydCBsZXQgdmVydGljYWxBbGlnbj1cIlwiXHJcbmV4cG9ydCBsZXQgY29sb3I9XCJcIjtcclxuZXhwb3J0IGxldCBkaXNwbGF5PVwiXCI7XHJcblxyXG5leHBvcnQgbGV0IF9iYjtcclxuXHJcbmxldCBzdHlsZT1cIlwiO1xyXG5cclxuXHJcbiQ6IHtcclxuICAgIHN0eWxlPWJ1aWxkU3R5bGUoe1xyXG4gICAgICAgIGZvbnQsICB2ZXJ0aWNhbEFsaWduLCBjb2xvciwgXHJcbiAgICAgICAgXCJ0ZXh0LWFsaWduXCI6IHRleHRBbGlnbixcclxuICAgICAgICBcInZlcnRpY2FsLWFsaWduXCI6IHZlcnRpY2FsQWxpZ25cclxuICAgIH0pO1xyXG59XHJcblxyXG48L3NjcmlwdD5cclxuXHJcbjxkaXYgY2xhc3M9e2NvbnRhaW5lckNsYXNzfVxyXG4gICAgIHN0eWxlPXtzdHlsZX0+XHJcbiAgICB7dmFsdWV9XHJcbjwvZGl2PlxyXG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsU0FBUyxJQUFJLEdBQUcsR0FBRztBQUNuQixBQUNBLFNBQVMsTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUU7O0lBRXRCLEtBQUssTUFBTSxDQUFDLElBQUksR0FBRztRQUNmLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEIsT0FBTyxHQUFHLENBQUM7Q0FDZDtBQUNELEFBUUEsU0FBUyxHQUFHLENBQUMsRUFBRSxFQUFFO0lBQ2IsT0FBTyxFQUFFLEVBQUUsQ0FBQztDQUNmO0FBQ0QsU0FBUyxZQUFZLEdBQUc7SUFDcEIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0NB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
|